1 #ifndef ERF_SURFACELAYER_H
2 #define ERF_SURFACELAYER_H
8 #include "AMReX_Geometry.H"
9 #include "AMReX_ParmParse.H"
10 #include "AMReX_FArrayBox.H"
11 #include "AMReX_MultiFab.H"
12 #include "AMReX_iMultiFab.H"
13 #include "AMReX_MFInterpolater.H"
38 bool has_custom_roughness)
40 return terrain_type != TerrainType::EB ||
41 !(use_sst || use_tsk || use_coupled_sst || has_lsm_tsurf ||
42 has_lsm_fluxes || has_custom_roughness);
85 const amrex::Vector<amrex::Geometry>& geom,
86 bool& use_rot_surface_flux,
87 std::string a_pp_prefix,
88 amrex::Vector<std::unique_ptr<amrex::MultiFab>>& Qv_prim,
89 amrex::Vector<std::unique_ptr<amrex::MultiFab>>& z_phys_nd,
90 const amrex::Vector<amrex::Vector<amrex::Real>>& zlevels_stag,
91 const MeshType& a_mesh_type,
92 const TerrainType& a_terrain_type,
95 double start_low_time,
96 double final_low_time,
97 double low_time_interval = 0.0,
98 const amrex::Vector<const eb_*>& eb_vec = {},
100 bool a_has_immersed_buildings =
false)
112 m_ma(face, geom, (z_phys_nd[0] !=
nullptr), a_pp_prefix, a_mesh_type, a_terrain_type,
113 zlevels_stag, eb_vec),
125 amrex::ParmParse
pp(a_pp_prefix);
130 if (use_rot_surface_flux) {
133 std::string flux_string_in;
134 std::string flux_string{
"moeng"};
135 auto read_flux =
pp.queryAdd(
"surface_layer.flux_type", flux_string_in);
137 flux_string = amrex::toLower(flux_string_in);
139 if (flux_string ==
"moeng") {
141 }
else if (flux_string ==
"rico") {
143 }
else if (flux_string ==
"bulk_coeff") {
145 }
else if (flux_string ==
"custom") {
148 amrex::Abort(
"Undefined MOST flux type!");
157 "BULK_COEFF, CUSTOM, and RICO surface-layer fluxes are supported only on the z-low face.");
163 std::string pblh_string_in;
164 std::string pblh_string{
"none"};
165 auto read_pblh =
pp.queryAdd(
"most.pblh_calc", pblh_string_in);
167 pblh_string = amrex::toLower(pblh_string_in);
169 if (pblh_string ==
"none") {
171 }
else if (pblh_string ==
"mynn25") {
173 }
else if (pblh_string ==
"mynnedmf") {
175 }
else if (pblh_string ==
"ysu") {
177 }
else if (pblh_string ==
"mrf") {
180 amrex::Abort(
"Undefined PBLH calc type!");
186 "MOST PBL-height calculation and wstar correction are supported only on the z-low face.");
194 amrex::Abort(
"erf.most.include_wstar requires a PBL height: set "
195 "erf.most.pblh_calc (MYNN25 is the only scheme implemented)");
200 amrex::Print() <<
" Using fluxes from surface model!" << std::endl;
215 const bool has_pot =
pp.query(
"most.pot_surf_temp", pot_st);
216 const bool has_abs =
pp.query(
"most.abs_surf_temp", abs_st);
217 const bool has_old =
pp.query(
"most.surf_temp", old_st);
218 if (
int(has_pot) +
int(has_abs) +
int(has_old) > 1) {
219 amrex::Abort(
"Specify only one of most.pot_surf_temp, most.abs_surf_temp "
220 "and the deprecated most.surf_temp");
225 amrex::Abort(
"most.pot_surf_temp, most.abs_surf_temp and most.surf_temp "
226 "must be positive temperatures [K]");
229 amrex::Print() <<
"WARNING: most.surf_temp is deprecated and is read as a surface "
230 <<
"potential temperature; use most.pot_surf_temp (potential) or "
231 <<
"most.abs_surf_temp (absolute) instead" << std::endl;
249 "most.abs_surf_temp is supported only on the z-low face without EB terrain");
253 "most.abs_surf_temp is not supported with custom, rico or bulk_coeff fluxes; "
254 "use most.pot_surf_temp");
276 "Specified custom MOST qv flux without moisture model!");
278 amrex::Print() <<
"Using specified ustar, tstar, qstar for MOST = "
288 "bulk_coeff fluxes need most.pot_surf_temp");
291 amrex::Print() <<
"Using specified Cd, Ch, Cq for MOST = "
293 <<
m_Cq << std::endl;
305 amrex::Abort(
"Can only specify one of surf_temp_flux or surf_heating_rate");
311 amrex::Abort(
"Can only specify one of surf_temp_flux or surf_heating_rate");
339 "HEAT_FLUX and ADIABATIC surface-layer fluxes are supported only on the z-low face.");
349 std::string bogus_input;
350 if (
pp.queryAdd(
"most.roughness_type", bogus_input) > 0) {
351 amrex::Abort(
"most.roughness_type is deprecated; use "
352 "most.roughness_type_land and/or most.roughness_type_sea");
356 std::string rough_land_string_in;
357 std::string rough_land_string{
"constant"};
358 auto read_rough_land =
359 pp.queryAdd(
"most.roughness_type_land", rough_land_string_in);
360 if (read_rough_land) {
361 rough_land_string = amrex::toLower(rough_land_string_in);
363 if (rough_land_string ==
"constant") {
366 amrex::Abort(
"Undefined MOST roughness type for land!");
371 amrex::Print() <<
"The smooth-flow limit will be included for variable roughness models over sea: " <<
smooth_flow_visc <<
"\n";
374 std::string rough_sea_string_in;
375 std::string rough_sea_string{
"charnock"};
376 auto read_rough_sea =
pp.queryAdd(
"most.roughness_type_sea", rough_sea_string_in);
377 if (read_rough_sea) {
378 rough_sea_string = amrex::toLower(rough_sea_string_in);
380 if (rough_sea_string ==
"charnock") {
382 pp.queryAdd(
"most.charnock_constant",
cnk_a);
384 amrex::Print() <<
"If there is water, Charnock relation with C_a="
385 <<
cnk_a <<
" will be used" << std::endl;
387 amrex::Print() <<
"If there is water, Charnock relation with variable "
388 "Charnock parameter (COARE3.0) will be used" << std::endl;
390 }
else if (rough_sea_string ==
"coare3.0") {
392 amrex::Print() <<
"If there is water, Charnock relation with variable "
393 "Charnock parameter (COARE3.0) will be used" << std::endl;
395 }
else if (rough_sea_string ==
"donelan") {
397 }
else if (rough_sea_string ==
"modified_charnock") {
399 pp.queryAdd(
"most.modified_charnock_depth",
depth);
401 amrex::Print() <<
"Specified depth of " <<
depth
402 <<
" is outside the valid range of [10 100], resetting to bounds now."
407 }
else if (rough_sea_string ==
"wave_coupled") {
409 }
else if (rough_sea_string ==
"constant") {
412 amrex::Abort(
"Undefined MOST roughness type for sea!");
429 "RANS surface-layer k updates are supported only on the z-low face.");
461 const amrex::Vector<amrex::MultiFab*>& mfv,
462 std::unique_ptr<amrex::MultiFab>& Theta_prim,
463 std::unique_ptr<amrex::MultiFab>& Qv_prim,
464 std::unique_ptr<amrex::MultiFab>& Qr_prim,
465 std::unique_ptr<amrex::MultiFab>& z_phys_nd,
466 amrex::MultiFab* Hwave,
467 amrex::MultiFab* Lwave,
468 amrex::MultiFab* eddyDiffs,
469 amrex::Vector<amrex::MultiFab*> lsm_data,
470 amrex::Vector<std::string> lsm_data_name,
471 amrex::Vector<amrex::MultiFab*> lsm_flux,
472 amrex::Vector<std::string> lsm_flux_name,
473 amrex::Vector<std::unique_ptr<amrex::MultiFab>>& sst_lev,
474 amrex::Vector<std::unique_ptr<amrex::MultiFab>>& tsk_lev,
475 amrex::Vector<std::unique_ptr<amrex::iMultiFab>>& lmask_lev)
479 Theta_prim, Qv_prim, Qr_prim,
483 amrex::MultiFab& mf = *(mfv[0]);
489 const int nghost = 0;
491 amrex::ParallelDescriptor::ReduceIntMin(lmask_min);
497 "Variable sea roughness surface-layer fluxes are supported only on the z-low face.");
499 std::string rough_sea_string{
"charnock"};
500 pp.queryAdd(
"most.roughness_type_sea", rough_sea_string);
501 amrex::Print() <<
"Variable sea roughness (type " << rough_sea_string
536 int nt_tot_sst = sst_lev.size();
538 for (
int nt(0); nt < nt_tot_sst; ++nt) {
541 int nt_tot_tsk =
static_cast<int>(tsk_lev.size());
543 for (
int nt(0); nt < nt_tot_tsk; ++nt) {
546 int nt_tot_lmask =
static_cast<int>(lmask_lev.size());
548 for (
int nt(0); nt < nt_tot_lmask; ++nt) {
563 amrex::Abort(
"Only one of most.use_sfc_fluxes and most.use_sfc_sst may be enabled");
574 pp.query(
"most.rhosurf", rhosurf_in);
576 "most.rhosurf cannot be combined with most.use_sfc_fluxes");
579 amrex::Abort(
"Text-file surface forcing is not supported with EB terrain");
583 "most.use_sfc_fluxes and most.use_sfc_sst are supported only on the z-low face.");
586 std::string sfc_file =
"";
587 pp.queryAdd(
"most.sfc_file", sfc_file);
588 if (sfc_file.empty()) {
589 amrex::Abort(
"most.sfc_file must be set when using text-file surface forcing");
596 if (
static_cast<int>(
sfc.size()) < min_cols) {
597 amrex::Abort(
"Surface forcing file does not contain the required number of columns");
602 for (
int i = 0; i < static_cast<int>(
sfc[0].size()); ++i) {
603 sfc[0][i] = 86400.0 * (
sfc[0][i] - start_day);
608 amrex::Abort(
"most.use_sfc_sst cannot be combined with prescribed heat flux or surf_heating_rate");
611 amrex::Abort(
"most.use_sfc_sst cannot be combined with prescribed moisture flux");
614 amrex::Print() <<
"Using MOST with prescribed SST from most.sfc_file '" << sfc_file <<
"' over sea" << std::endl;
619 amrex::Print() <<
"Using MOST with prescribed time-varying surface fluxes from '" << sfc_file <<
"'" << std::endl;
629 "most.abs_surf_temp cannot be combined with most.use_sfc_fluxes");
632 "most.abs_surf_temp cannot be combined with SST/TSK or sfc-file SST input");
642 int ndata =
static_cast<int>(lsm_data.size());
643 int nflux =
static_cast<int>(lsm_flux.size());
648 for (
int n(0); n < ndata; ++n) {
651 const std::string lc_name = amrex::toLower(lsm_data_name[n]);
657 lc_name ==
"theta" || lc_name ==
"t_surf") {
664 amrex::Abort(
"most.use_sfc_sst cannot be combined with an ocean LSM t_surf input");
666 int n_valid_lsm_flux = 0;
667 bool has_soil_t_flux =
false;
668 for (
int n(0); n < nflux; ++n) {
673 has_soil_t_flux =
true;
677 (n_valid_lsm_flux==1 && has_soil_t_flux)));
685 bool read_z0 =
false;
688 int count =
pp.countval(
"most.roughness_file_name");
691 pp.query(
"most.roughness_file_name", fname, lev);
693 }
else if (count == 1) {
695 pp.queryAdd(
"most.roughness_file_name", fname);
707 "Custom MOST roughness is supported only on the z-low face.");
717 "EB SurfaceLayer does not support planar SST/TSK, coupled SST, LSM surface "
718 "temperature or fluxes, or custom/file-driven roughness; no mapping exists "
719 "from those planar inputs to arbitrary EB cut cells.");
725 const int dir =
m_face.coordDir();
728 sm_index =
m_geom[lev].Domain().smallEnd(dir);
730 sm_index =
m_geom[lev].Domain().bigEnd(dir);
733 amrex::BoxArray ba = mf.boxArray();
734 amrex::BoxArray ba_flux;
735 amrex::IntVect
ng{1,1,0};
742 const int dom_lo_z =
m_geom[lev].Domain().smallEnd(2);
743 const int dom_hi_z =
m_geom[lev].Domain().bigEnd(2);
744 for (
int ibox = 0; ibox < ba.size(); ++ibox) {
746 ba[ibox].smallEnd(2) == dom_lo_z && ba[ibox].bigEnd(2) == dom_hi_z,
747 "Surface layer boundaries on x/y faces require Cartesian grids that "
748 "span the full level z domain; partial-height refined grids and grids "
749 "decomposed in z are not supported. Set erf.max_grid_size_z accordingly.");
756 ng = amrex::IntVect{1,1,1};
759 amrex::BoxList bl2d = ba.boxList();
760 for (
auto& b : bl2d) {
761 b.setRange(dir,sm_index);
763 ba_flux = amrex::BoxArray(std::move(bl2d));
768 ng = amrex::IntVect{1,1,0};
775 const amrex::DistributionMapping& dm = mf.DistributionMap();
782 const int ksurface =
m_face.isLow()
783 ?
m_geom[lev].Domain().smallEnd(2)
784 :
m_geom[lev].Domain().bigEnd(2);
790 z_0[lev].define(ba_flux, dm, ncomp,
ng);
798 u_star[lev] = std::make_unique<amrex::MultiFab>(ba_flux, dm, ncomp,
ng);
801 w_star[lev] = std::make_unique<amrex::MultiFab>(ba_flux, dm, ncomp,
ng);
804 t_star[lev] = std::make_unique<amrex::MultiFab>(ba_flux, dm, ncomp,
ng);
807 q_star[lev] = std::make_unique<amrex::MultiFab>(ba_flux, dm, ncomp,
ng);
810 olen[lev] = std::make_unique<amrex::MultiFab>(ba_flux, dm, ncomp,
ng);
813 pblh[lev] = std::make_unique<amrex::MultiFab>(ba_flux, dm, ncomp,
ng);
816 t_surf[lev] = std::make_unique<amrex::MultiFab>(ba_flux, dm, ncomp,
ng);
819 q_surf[lev] = std::make_unique<amrex::MultiFab>(ba_flux, dm, ncomp,
ng);
822 const amrex::iMultiFab& surface_mask = *
m_lmask_lev[lev][0];
824 surface_mask.boxArray().size() == mf.boxArray().size(),
825 "Surface-layer mask and state must have the same number of boxes.");
827 surface_mask.DistributionMap() == mf.DistributionMap(),
828 "Surface-layer mask and state must have identical ownership.");
830 surface_mask.boxArray().size() ==
u_star[lev]->boxArray().size(),
831 "Surface-layer mask and parameters must have the same number of boxes.");
833 surface_mask.DistributionMap() ==
u_star[lev]->DistributionMap(),
834 "Surface-layer mask and parameters must have identical ownership.");
851 amrex::Print() <<
"Using MOST with specified surface temperature ";
854 }
else if (!use_sst && !use_tsk) {
855 amrex::Print() <<
"(land: T0, sea: none)";
862 amrex::Print() <<
"(land: TSK, ";
864 amrex::Print() <<
"(land: T0, ";
866 if (use_tsk && !use_sst) {
867 amrex::Print() <<
"sea: TSK)";
869 amrex::Print() <<
"sea: SST)";
877 amrex::Print() <<
" + coupled ocean SST where covered";
879 amrex::Print() << std::endl;
905 const double& elapsed_time,
906 const double& elapsed_time_since_start_low,
907 amrex::MultiFab& cons_in,
908 const std::unique_ptr<amrex::MultiFab>& z_phys_nd,
909 const std::unique_ptr<amrex::MultiFab>& walldist,
910 int max_iters = 100);
921 template <
typename FluxIter>
923 const int& max_iters,
924 amrex::MultiFab& cons_in,
925 const FluxIter& most_flux,
938 amrex::MultiFab&
cons,
939 const std::unique_ptr<amrex::MultiFab>& z_phys_nd,
983 amrex::Vector<const amrex::MultiFab*> mfs,
984 amrex::Vector<std::unique_ptr<amrex::MultiFab>>& Tau_lev,
985 amrex::MultiFab* xheat_flux,
986 amrex::MultiFab* yheat_flux,
987 amrex::MultiFab* zheat_flux,
988 amrex::MultiFab* xqv_flux,
989 amrex::MultiFab* yqv_flux,
990 amrex::MultiFab* zqv_flux,
991 const amrex::MultiFab* z_phys,
992 amrex::MultiFab* mf_surface_fluxes=
nullptr);
1008 amrex::Vector<const amrex::MultiFab*> mfs,
1009 amrex::Vector<amrex::Vector<std::unique_ptr<amrex::MultiFab>>>& Tau_lev,
1010 amrex::MultiFab* xheat_flux,
1011 amrex::MultiFab* yheat_flux,
1012 amrex::MultiFab* zheat_flux,
1013 amrex::MultiFab* xqv_flux,
1014 amrex::MultiFab* yqv_flux,
1015 amrex::MultiFab* zqv_flux);
1032 template <
typename FluxCalc>
1034 amrex::Vector<const amrex::MultiFab*> mfs,
1035 amrex::Vector<std::unique_ptr<amrex::MultiFab>>& Tau_lev,
1036 amrex::MultiFab* xheat_flux,
1037 amrex::MultiFab* yheat_flux,
1038 amrex::MultiFab* zheat_flux,
1039 amrex::MultiFab* xqv_flux,
1040 amrex::MultiFab* yqv_flux,
1041 amrex::MultiFab* zqv_flux,
1042 const amrex::MultiFab* z_phys,
1043 const FluxCalc& flux_comp,
1044 amrex::MultiFab* mf_surface_fluxes=
nullptr);
1060 template <
typename FluxCalc>
1062 amrex::Vector<const amrex::MultiFab*> mfs,
1063 amrex::Vector<amrex::Vector<std::unique_ptr<amrex::MultiFab>>>& Tau_lev,
1064 amrex::MultiFab* xheat_flux,
1065 amrex::MultiFab* yheat_flux,
1066 amrex::MultiFab* zheat_flux,
1067 amrex::MultiFab* xqv_flux,
1068 amrex::MultiFab* yqv_flux,
1069 amrex::MultiFab* zqv_flux,
1070 const FluxCalc& flux_comp);
1079 amrex::MultiFab& cons_in);
1091 const amrex::MultiFab& cons_in,
1103 const double& time);
1113 const amrex::MultiFab& cons_in,
1114 const std::unique_ptr<amrex::MultiFab>& z_phys_nd);
1127 const amrex::MultiFab& cons_in,
1128 const std::unique_ptr<amrex::MultiFab>& z_phys_nd);
1144 const amrex::MultiFab& cons_in,
1145 const std::unique_ptr<amrex::MultiFab>& z_phys_nd);
1160 const amrex::MultiFab& cons_in,
1161 const std::unique_ptr<amrex::MultiFab>& z_phys_nd);
1179 const amrex::MultiFab& cons_in,
1180 const std::unique_ptr<amrex::MultiFab>& z_phys_nd);
1190 const amrex::MultiFab& cons_in,
1191 const std::unique_ptr<amrex::MultiFab>& z_phys_nd);
1193 void set_pblh (
const int& lev,
const amrex::MultiFab& pblh_in);
1221 const amrex::MultiFab& cons_in,
1222 const std::unique_ptr<amrex::MultiFab>& z_phys_nd);
1233 amrex::Vector<amrex::Vector<amrex::MultiFab>>& vars,
1234 amrex::MultiFab* z_phys_cc,
1264 template <
typename PBLHeightEstimator>
1266 amrex::Vector<amrex::Vector<amrex::MultiFab>>& vars,
1267 amrex::MultiFab* z_phys_cc,
1268 const PBLHeightEstimator& est,
1278 const std::string& fname);
1297 int nlevs =
static_cast<int>(
t_surf.size());
1298 for (
int lev = 0; lev < nlevs; lev++) {
1299 if (!
t_surf[lev]) {
continue; }
1301 amrex::Print() <<
"Surface temp at t=" << time <<
": "
1317 amrex::Vector<amrex::Vector<amrex::MultiFab>>& vars_old,
1318 amrex::Vector<std::unique_ptr<amrex::MultiFab>>& Theta_prim,
1319 amrex::Vector<std::unique_ptr<amrex::MultiFab>>& Qv_prim,
1320 amrex::Vector<std::unique_ptr<amrex::MultiFab>>& Qr_prim)
1473 return "the surface layer is on EB terrain";
1478 return "erf.use_rotate_surface_flux is set";
1481 return "the surface layer does not compute its heat flux from a surface "
1482 "temperature (set erf.most.pot_surf_temp or erf.most.abs_surf_temp, not a "
1483 "flux or custom/bulk fluxes)";
1486 return "erf.most.surf_heating_rate is set";
1489 return "a land-surface or surface model supplies the surface temperature";
1532 if (!temperature.empty()) {
return temperature; }
1534 return "the run has no moisture model";
1537 return "the surface layer does not compute its moisture flux from a surface "
1538 "mixing ratio (set erf.most.surf_moist, not a flux)";
1559 pp.remove(
"most.z0");
1627 amrex::MultiFab*
get_z0 (
const int& lev) {
return &
z_0[lev]; }
1650 int lmask_min = amrex::ReduceMin(lmask, nghost, [=] AMREX_GPU_HOST_DEVICE(
1651 amrex::Box
const& bx, amrex::Array4<int const>
const& lm_arr) ->
int
1653 int locmin = std::numeric_limits<int>::max();
1654 const auto lo = lbound(bx);
1655 const auto hi = ubound(bx);
1656 for (
int j =
lo.y; j <=
hi.y; ++j) {
1657 for (
int i =
lo.x; i <=
hi.x; ++i) {
1658 locmin = std::min(locmin, lm_arr(i, j, 0));
1704 amrex::MultiFab* sst_ptr,
1705 amrex::iMultiFab* valid_ptr) {
1740 static amrex::Vector<amrex::Vector<amrex::Real>>
1741 read_cols (
const std::string& fname,
const int skip_nlines = 1);
1753 amrex::MultiFab* selected_field =
nullptr);
1831 amrex::Vector<amrex::MultiFab>
z_0;
1848 amrex::Vector<amrex::Vector<amrex::Real>>
sfc;
1871 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
u_star;
1872 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
w_star;
1873 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
t_star;
1874 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
q_star;
1875 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
olen;
1876 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
pblh;
1877 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
t_surf;
1878 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
q_surf;
1893 amrex::DistributionMapping
dm;
1904 const amrex::BoxArray& ba,
1905 const amrex::DistributionMapping& dm);
constexpr amrex::Real bogus_large_value
Definition: ERF_Constants.H:19
constexpr amrex::Real RdoCp
Definition: ERF_Constants.H:57
Defines EB Monin-Obukhov surface-layer flux functors.
Declares the embedded-boundary factory manager used by ERF levels.
pp_for_pert_vels get("prob_type", prob_type)
Real z0
Definition: ERF_InitCustomPertVels_ScalarAdvDiff.H:12
AMREX_ALWAYS_ASSERT_WITH_MESSAGE(axis >=0 &&axis< AMREX_SPACEDIM, "prob.axis must be 0, 1 or 2")
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
constexpr amrex::Real one
Definition: ERF_NumericalConstants.H:37
constexpr amrex::Real zero
Definition: ERF_NumericalConstants.H:36
amrex::Real Real
Definition: ERF_ShocInterface.H:19
AMREX_ASSERT_WITH_MESSAGE(wbar_cutoff_min > wbar_cutoff_max, "ERROR: wbar_cutoff_min < wbar_cutoff_max")
Definition: ERF_MOSTAverage.H:16
bool set_plane_average(const int &lev, const amrex::Vector< amrex::Real > &pavg)
Definition: ERF_MOSTAverage.H:315
amrex::Vector< amrex::Real > get_plane_average(const int &lev) const
Definition: ERF_MOSTAverage.H:301
bool do_time_averaging() const
Definition: ERF_MOSTAverage.H:265
amrex::MultiFab * get_zref(const int &lev) const
Definition: ERF_MOSTAverage.H:329
void set_time_avg_initialized(const int &lev)
Definition: ERF_MOSTAverage.H:289
int get_navg() const
Definition: ERF_MOSTAverage.H:270
const amrex::MultiFab * get_average(const int &lev, const int &comp) const
Definition: ERF_MOSTAverage.H:251
void update_field_ptrs(const int &lev, amrex::Vector< amrex::Vector< amrex::MultiFab >> &vars_old, amrex::Vector< std::unique_ptr< amrex::MultiFab >> &Theta_prim, amrex::Vector< std::unique_ptr< amrex::MultiFab >> &Qv_prim, amrex::Vector< std::unique_ptr< amrex::MultiFab >> &Qr_prim)
Definition: ERF_MOSTAverage.cpp:442
void make_MOSTAverage_at_level(const int &lev, const amrex::Vector< amrex::MultiFab * > &vars_old, std::unique_ptr< amrex::MultiFab > &Theta_prim, std::unique_ptr< amrex::MultiFab > &Qv_prim, std::unique_ptr< amrex::MultiFab > &Qr_prim, std::unique_ptr< amrex::MultiFab > &z_phys_nd)
Definition: ERF_MOSTAverage.cpp:172
bool time_avg_is_initialized(const int &lev) const
Definition: ERF_MOSTAverage.H:278
Definition: ERF_SurfaceLayer.H:60
bool m_has_immersed_buildings
Definition: ERF_SurfaceLayer.H:1865
ThetaCalcType theta_type
Definition: ERF_SurfaceLayer.H:1786
int lmask_min_reduce(amrex::iMultiFab &lmask, const int &nghost)
Definition: ERF_SurfaceLayer.H:1647
amrex::Vector< std::string > m_lsm_data_name
Definition: ERF_SurfaceLayer.H:1933
bool m_include_wstar
Definition: ERF_SurfaceLayer.H:1803
amrex::Real interpolate_sfc_column(const amrex::Real &time, int col) const
Definition: ERF_SurfaceLayer.cpp:536
bool specified_rho_surf
Definition: ERF_SurfaceLayer.H:1827
void set_q_surf(const int &lev, const amrex::Real qsurf)
Definition: ERF_SurfaceLayer.H:1599
void update_fluxes(const int &lev, const double &elapsed_time, const double &elapsed_time_since_start_low, amrex::MultiFab &cons_in, const std::unique_ptr< amrex::MultiFab > &z_phys_nd, const std::unique_ptr< amrex::MultiFab > &walldist, int max_iters=100)
Definition: ERF_SurfaceLayer.cpp:86
bool m_rotate
Definition: ERF_SurfaceLayer.H:1797
amrex::Real sfc_tflux
Definition: ERF_SurfaceLayer.H:1850
PBLHeightCalcType pblh_type
Definition: ERF_SurfaceLayer.H:1790
amrex::Vector< amrex::Vector< amrex::iMultiFab * > > m_lmask_lev
Definition: ERF_SurfaceLayer.H:1913
double m_final_low_time
Definition: ERF_SurfaceLayer.H:1800
amrex::Vector< PlanarBoundary > m_planar_bndry
Definition: ERF_SurfaceLayer.H:1883
amrex::iMultiFab * get_lmask(const int &lev)
Definition: ERF_SurfaceLayer.H:1639
bool use_moisture
Definition: ERF_SurfaceLayer.H:1837
amrex::Vector< PBLHColumns > m_pblh_columns
Definition: ERF_SurfaceLayer.H:1902
amrex::MultiFab * get_q_surf(const int &lev)
Definition: ERF_SurfaceLayer.H:1591
bool m_has_lsm_tsurf
Definition: ERF_SurfaceLayer.H:1839
amrex::MultiFab * get_w_star(const int &lev)
Definition: ERF_SurfaceLayer.H:1337
amrex::Real m_Cq
Definition: ERF_SurfaceLayer.H:1860
amrex::Vector< const eb_ * > m_eb_vec
Definition: ERF_SurfaceLayer.H:1863
RoughCalcType rough_type_land
Definition: ERF_SurfaceLayer.H:1788
void update_pblh(const int &lev, amrex::Vector< amrex::Vector< amrex::MultiFab >> &vars, amrex::MultiFab *z_phys_cc, const MoistureComponentIndices &moisture_indices)
Definition: ERF_SurfaceLayer.cpp:3013
void fill_pblh_from_coarser(const int &lev)
Definition: ERF_SurfaceLayer.cpp:3334
SurfaceModel * m_surf_model
Definition: ERF_SurfaceLayer.H:1868
amrex::Real sfc_qflux
Definition: ERF_SurfaceLayer.H:1849
amrex::Vector< std::unique_ptr< amrex::MultiFab > > t_surf
Definition: ERF_SurfaceLayer.H:1877
bool m_use_sfc_fluxes
Definition: ERF_SurfaceLayer.H:1845
amrex::Real z0_const
Definition: ERF_SurfaceLayer.H:1804
bool use_sfc_fluxes() const
Definition: ERF_SurfaceLayer.H:1570
amrex::Vector< std::unique_ptr< amrex::MultiFab > > surface_diagnostic_source
Definition: ERF_SurfaceLayer.H:1909
amrex::Real cnk_a
Definition: ERF_SurfaceLayer.H:1828
amrex::Real m_Ch
Definition: ERF_SurfaceLayer.H:1859
amrex::Real surf_temp
Definition: ERF_SurfaceLayer.H:1814
void update_mac_ptrs(const int &lev, amrex::Vector< amrex::Vector< amrex::MultiFab >> &vars_old, amrex::Vector< std::unique_ptr< amrex::MultiFab >> &Theta_prim, amrex::Vector< std::unique_ptr< amrex::MultiFab >> &Qv_prim, amrex::Vector< std::unique_ptr< amrex::MultiFab >> &Qr_prim)
Definition: ERF_SurfaceLayer.H:1316
bool m_lsm_tsurf_is_theta
Definition: ERF_SurfaceLayer.H:1841
void set_sfc_params_from_file_fluxes(const int &lev, const amrex::MultiFab &cons_in, const amrex::Real &tflux_in, const amrex::Real &qflux_in, const amrex::Real &sfc_tau)
Definition: ERF_SurfaceLayer.cpp:1779
void compute_pblh(const int &lev, amrex::Vector< amrex::Vector< amrex::MultiFab >> &vars, amrex::MultiFab *z_phys_cc, const PBLHeightEstimator &est, const MoistureComponentIndices &moisture_indice)
amrex::Vector< int > m_skin_moisture_resistances_lev
Definition: ERF_SurfaceLayer.H:1929
amrex::Vector< std::unique_ptr< amrex::MultiFab > > q_star
Definition: ERF_SurfaceLayer.H:1874
int m_lsm_tsurf_indx
Definition: ERF_SurfaceLayer.H:1840
double m_start_low_time
Definition: ERF_SurfaceLayer.H:1799
void impose_SurfaceLayer_bcs(const int &lev, amrex::Vector< const amrex::MultiFab * > mfs, amrex::Vector< std::unique_ptr< amrex::MultiFab >> &Tau_lev, amrex::MultiFab *xheat_flux, amrex::MultiFab *yheat_flux, amrex::MultiFab *zheat_flux, amrex::MultiFab *xqv_flux, amrex::MultiFab *yqv_flux, amrex::MultiFab *zqv_flux, const amrex::MultiFab *z_phys, amrex::MultiFab *mf_surface_fluxes=nullptr)
Definition: ERF_SurfaceLayer.cpp:864
bool mac_avg_is_initialized(const int &lev) const
Definition: ERF_SurfaceLayer.H:1405
bool mac_avg_is_time_averaged() const
Definition: ERF_SurfaceLayer.H:1393
amrex::Real rico_qsat_z0
Definition: ERF_SurfaceLayer.H:1835
bool m_has_lsm_fluxes
Definition: ERF_SurfaceLayer.H:1838
bool surf_temp_is_absolute
Definition: ERF_SurfaceLayer.H:1817
bool m_update_k_rans
Definition: ERF_SurfaceLayer.H:1939
amrex::Vector< amrex::MultiFab * > m_Lwave_lev
Definition: ERF_SurfaceLayer.H:1936
void fill_qsurf_with_qsat(const int &lev, const amrex::MultiFab &cons_in, const std::unique_ptr< amrex::MultiFab > &z_phys_nd)
Definition: ERF_SurfaceLayer.cpp:2163
amrex::MultiFab * get_olen(const int &lev)
Definition: ERF_SurfaceLayer.H:1370
bool computes_w_star() const
Definition: ERF_SurfaceLayer.H:1343
amrex::Vector< amrex::MultiFab > z_0
Definition: ERF_SurfaceLayer.H:1831
void fill_tsurf_with_coupled_sst(const int &lev, const amrex::MultiFab &cons_in, const std::unique_ptr< amrex::MultiFab > &z_phys_nd)
Definition: ERF_SurfaceLayer.cpp:2515
amrex::Real surf_moist_flux
Definition: ERF_SurfaceLayer.H:1822
bool smooth_flow_visc
Definition: ERF_SurfaceLayer.H:1829
void get_lsm_tsurf(const int &lev, const amrex::MultiFab &cons_in, const std::unique_ptr< amrex::MultiFab > &z_phys_nd)
Definition: ERF_SurfaceLayer.cpp:2337
amrex::Vector< const amrex::MultiFab * > m_skin_moisture_lev
Definition: ERF_SurfaceLayer.H:1928
RoughCalcType rough_type_sea
Definition: ERF_SurfaceLayer.H:1789
void update_coupled_sst_ptr(const int lev, amrex::MultiFab *sst_ptr, amrex::iMultiFab *valid_ptr)
Definition: ERF_SurfaceLayer.H:1703
std::string skin_temperature_conflict() const
Definition: ERF_SurfaceLayer.H:1470
void init_tke_from_ustar(const int &lev, amrex::MultiFab &cons, const std::unique_ptr< amrex::MultiFab > &z_phys_nd, const amrex::Real tkefac=one, const amrex::Real zscale=amrex::Real(700.0))
Definition: ERF_SurfaceLayer.cpp:3408
std::string m_pp_prefix
Definition: ERF_SurfaceLayer.H:1795
amrex::Real surface_sum(const int &lev, const amrex::MultiFab &mf, int comp=0) const
Definition: ERF_SurfaceLayer.cpp:499
amrex::Real surf_moist
Definition: ERF_SurfaceLayer.H:1821
amrex::Vector< std::unique_ptr< amrex::MultiFab > > w_star
Definition: ERF_SurfaceLayer.H:1872
bool m_ignore_sst
Definition: ERF_SurfaceLayer.H:1861
int get_num_mac_avg() const
Definition: ERF_SurfaceLayer.H:1398
amrex::Real roughness() const
Definition: ERF_SurfaceLayer.H:1565
amrex::Vector< amrex::Vector< amrex::Real > > sfc
Definition: ERF_SurfaceLayer.H:1848
std::string skin_moisture_conflict() const
Definition: ERF_SurfaceLayer.H:1529
amrex::MultiFab * get_u_star(const int &lev)
Definition: ERF_SurfaceLayer.H:1330
double m_low_time_interval
Definition: ERF_SurfaceLayer.H:1801
bool m_use_lsm_skin_temperature
Definition: ERF_SurfaceLayer.H:1842
amrex::GpuArray< int, AMREX_SPACEDIM *2 > m_surface_layer_faces
Definition: ERF_SurfaceLayer.H:1798
void compute_fluxes(const int &lev, const int &max_iters, amrex::MultiFab &cons_in, const FluxIter &most_flux, bool is_land)
bool set_mac_plane_avg(const int &lev, const amrex::Vector< amrex::Real > &pavg)
Definition: ERF_SurfaceLayer.H:1437
amrex::Vector< amrex::Vector< amrex::MultiFab * > > m_lsm_data_lev
Definition: ERF_SurfaceLayer.H:1931
void set_t_surf(const int &lev, const amrex::Real tsurf)
Definition: ERF_SurfaceLayer.H:1584
amrex::Real custom_qstar
Definition: ERF_SurfaceLayer.H:1825
amrex::Vector< std::unique_ptr< amrex::MultiFab > > u_star
Definition: ERF_SurfaceLayer.H:1871
void update_tsk_ptr(const int lev, const int itime, amrex::MultiFab *tsk_ptr)
Definition: ERF_SurfaceLayer.H:1686
bool surf_model_fluxes
Definition: ERF_SurfaceLayer.H:1870
amrex::Real custom_rhosurf
Definition: ERF_SurfaceLayer.H:1826
amrex::Vector< std::unique_ptr< amrex::MultiFab > > q_surf
Definition: ERF_SurfaceLayer.H:1878
amrex::Vector< amrex::Vector< amrex::MultiFab * > > m_sst_lev
Definition: ERF_SurfaceLayer.H:1911
FluxCalcType
Definition: ERF_SurfaceLayer.H:1755
@ MOENG
Moeng functional form.
@ BULK_COEFF
Bulk transfer coefficient functional form.
@ CUSTOM
Custom constant flux functional form.
@ ROTATE
Terrain rotation flux functional form.
amrex::Real m_rdOcp
Definition: ERF_SurfaceLayer.H:1866
MoistCalcType
Definition: ERF_SurfaceLayer.H:1769
@ SURFACE_MOISTURE
Surface Qv specified.
@ MOISTURE_FLUX
Qv-flux specified.
amrex::Real depth
Definition: ERF_SurfaceLayer.H:1830
amrex::Vector< amrex::MultiFab * > m_coupled_sst_lev
Definition: ERF_SurfaceLayer.H:1921
amrex::MultiFab * get_zref(const int &lev)
Definition: ERF_SurfaceLayer.H:1613
void fill_lateral_surface_parameter_ghosts(const int &lev, amrex::MultiFab *selected_field=nullptr)
Definition: ERF_SurfaceLayer.cpp:745
amrex::Vector< const amrex::MultiFab * > m_skin_tsurf_lev
Definition: ERF_SurfaceLayer.H:1925
amrex::Vector< amrex::MultiFab * > m_Hwave_lev
Definition: ERF_SurfaceLayer.H:1935
amrex::Real default_land_surf_moist
Definition: ERF_SurfaceLayer.H:1820
void update_sfc_time_index(const amrex::Real &time)
Definition: ERF_SurfaceLayer.cpp:519
bool m_var_z0
Definition: ERF_SurfaceLayer.H:1832
amrex::Vector< amrex::iMultiFab * > m_coupled_sst_valid_lev
Definition: ERF_SurfaceLayer.H:1922
amrex::MultiFab * get_surface_diagnostic_source(const int &lev)
Definition: ERF_SurfaceLayer.H:1606
amrex::MultiFab * get_t_star(const int &lev)
Definition: ERF_SurfaceLayer.H:1356
bool rotates_surface_fluxes() const
Definition: ERF_SurfaceLayer.H:1576
bool have_variable_sea_roughness()
Definition: ERF_SurfaceLayer.H:1632
void impose_SurfaceLayer_bcs_EB(const int &lev, amrex::Vector< const amrex::MultiFab * > mfs, amrex::Vector< amrex::Vector< std::unique_ptr< amrex::MultiFab >>> &Tau_lev, amrex::MultiFab *xheat_flux, amrex::MultiFab *yheat_flux, amrex::MultiFab *zheat_flux, amrex::MultiFab *xqv_flux, amrex::MultiFab *yqv_flux, amrex::MultiFab *zqv_flux)
Definition: ERF_SurfaceLayer.cpp:928
amrex::MultiFab * get_q_star(const int &lev)
Definition: ERF_SurfaceLayer.H:1363
amrex::Vector< amrex::Vector< amrex::MultiFab * > > m_lsm_flux_lev
Definition: ERF_SurfaceLayer.H:1932
amrex::Vector< amrex::Real > m_skin_moisture_hs_lev
Definition: ERF_SurfaceLayer.H:1930
void fill_tsurf_with_skin_temperature(const int &lev, const amrex::MultiFab &cons_in, const std::unique_ptr< amrex::MultiFab > &z_phys_nd)
Definition: ERF_SurfaceLayer.cpp:2765
amrex::MultiFab * get_mac_avg_ptr(const int &lev, int comp)
Definition: ERF_SurfaceLayer.H:1420
amrex::Vector< amrex::Real > get_mac_plane_avg(const int &lev) const
Definition: ERF_SurfaceLayer.H:1428
void set_pblh(const int &lev, const amrex::MultiFab &pblh_in)
Definition: ERF_SurfaceLayer.cpp:3045
void fill_planar_boundary(const int &lev, amrex::MultiFab &mf)
Definition: ERF_SurfaceLayer.cpp:483
PBLHeightCalcType
Definition: ERF_SurfaceLayer.H:1783
bool m_z0_given
Definition: ERF_SurfaceLayer.H:1806
amrex::MultiFab * get_pblh(const int &lev)
Definition: ERF_SurfaceLayer.H:1377
bool use_surface_model
Definition: ERF_SurfaceLayer.H:1869
void compute_SurfaceLayer_bcs_EB(const int &lev, amrex::Vector< const amrex::MultiFab * > mfs, amrex::Vector< amrex::Vector< std::unique_ptr< amrex::MultiFab >>> &Tau_lev, amrex::MultiFab *xheat_flux, amrex::MultiFab *yheat_flux, amrex::MultiFab *zheat_flux, amrex::MultiFab *xqv_flux, amrex::MultiFab *yqv_flux, amrex::MultiFab *zqv_flux, const FluxCalc &flux_comp)
amrex::Real rico_theta_z0
Definition: ERF_SurfaceLayer.H:1834
amrex::Real sfc_ustar
Definition: ERF_SurfaceLayer.H:1851
amrex::Real surf_temp_flux
Definition: ERF_SurfaceLayer.H:1819
amrex::Vector< amrex::Geometry > m_geom
Definition: ERF_SurfaceLayer.H:1796
amrex::Vector< std::unique_ptr< amrex::MultiFab > > t_star
Definition: ERF_SurfaceLayer.H:1873
int sfc_time_ind
Definition: ERF_SurfaceLayer.H:1847
void set_immersed_surface_params(const int &lev)
Definition: ERF_SurfaceLayer.cpp:38
void compute_SurfaceLayer_bcs(const int &lev, amrex::Vector< const amrex::MultiFab * > mfs, amrex::Vector< std::unique_ptr< amrex::MultiFab >> &Tau_lev, amrex::MultiFab *xheat_flux, amrex::MultiFab *yheat_flux, amrex::MultiFab *zheat_flux, amrex::MultiFab *xqv_flux, amrex::MultiFab *yqv_flux, amrex::MultiFab *zqv_flux, const amrex::MultiFab *z_phys, const FluxCalc &flux_comp, amrex::MultiFab *mf_surface_fluxes=nullptr)
bool computes_pblh() const
Definition: ERF_SurfaceLayer.H:1349
amrex::Real theta_ref
Definition: ERF_SurfaceLayer.H:1941
void set_skin_moisture(const int &lev, const amrex::MultiFab *moisture, bool use_resistances=false, amrex::Real hs=amrex::Real(0))
Definition: ERF_SurfaceLayer.H:1510
amrex::MultiFab * get_z0(const int &lev)
Definition: ERF_SurfaceLayer.H:1627
amrex::Vector< amrex::Vector< amrex::MultiFab * > > m_tsk_lev
Definition: ERF_SurfaceLayer.H:1912
void set_surface_layer_faces(const amrex::GpuArray< int, AMREX_SPACEDIM *2 > &active_faces)
Definition: ERF_SurfaceLayer.H:1728
void update_surf_temp(const double &time)
Definition: ERF_SurfaceLayer.H:1285
void set_coupled_sst_active(const bool active)
Definition: ERF_SurfaceLayer.H:1718
void fill_tsurf_with_sst_and_tsk(const int &lev, const double &time)
Definition: ERF_SurfaceLayer.cpp:1951
amrex::Real custom_tstar
Definition: ERF_SurfaceLayer.H:1824
SurfaceLayer(amrex::Orientation face, const amrex::Vector< amrex::Geometry > &geom, bool &use_rot_surface_flux, std::string a_pp_prefix, amrex::Vector< std::unique_ptr< amrex::MultiFab >> &Qv_prim, amrex::Vector< std::unique_ptr< amrex::MultiFab >> &z_phys_nd, const amrex::Vector< amrex::Vector< amrex::Real >> &zlevels_stag, const MeshType &a_mesh_type, const TerrainType &a_terrain_type, const TurbChoice &a_turb_choice, amrex::Real a_rdOcp, double start_low_time, double final_low_time, double low_time_interval=0.0, const amrex::Vector< const eb_ * > &eb_vec={}, SurfaceModel *surf_model=nullptr, bool a_has_immersed_buildings=false)
Definition: ERF_SurfaceLayer.H:84
void inject_pblh_from_coarser(const int &lev, amrex::MultiFab &fine) const
Definition: ERF_SurfaceLayer.cpp:3349
static amrex::Vector< amrex::Vector< amrex::Real > > read_cols(const std::string &fname, const int skip_nlines=1)
Definition: ERF_SurfaceLayer.cpp:3639
amrex::Real surf_heating_rate
Definition: ERF_SurfaceLayer.H:1818
void make_SurfaceLayer_at_level(const int &lev, int nlevs, const amrex::Vector< amrex::MultiFab * > &mfv, std::unique_ptr< amrex::MultiFab > &Theta_prim, std::unique_ptr< amrex::MultiFab > &Qv_prim, std::unique_ptr< amrex::MultiFab > &Qr_prim, std::unique_ptr< amrex::MultiFab > &z_phys_nd, amrex::MultiFab *Hwave, amrex::MultiFab *Lwave, amrex::MultiFab *eddyDiffs, amrex::Vector< amrex::MultiFab * > lsm_data, amrex::Vector< std::string > lsm_data_name, amrex::Vector< amrex::MultiFab * > lsm_flux, amrex::Vector< std::string > lsm_flux_name, amrex::Vector< std::unique_ptr< amrex::MultiFab >> &sst_lev, amrex::Vector< std::unique_ptr< amrex::MultiFab >> &tsk_lev, amrex::Vector< std::unique_ptr< amrex::iMultiFab >> &lmask_lev)
Definition: ERF_SurfaceLayer.H:459
RoughCalcType
Definition: ERF_SurfaceLayer.H:1775
FluxCalcType flux_type
Definition: ERF_SurfaceLayer.H:1785
MoistCalcType moist_type
Definition: ERF_SurfaceLayer.H:1787
bool m_use_sfc_sst
Definition: ERF_SurfaceLayer.H:1846
void compute_sfc_params_from_lsm_fluxes(const int &lev, amrex::MultiFab &cons_in)
Definition: ERF_SurfaceLayer.cpp:1824
amrex::Real inv_Cmu2
Definition: ERF_SurfaceLayer.H:1940
amrex::Vector< amrex::MultiFab * > m_eddyDiffs_lev
Definition: ERF_SurfaceLayer.H:1937
amrex::Real get_zref_min(const int &lev)
Definition: ERF_SurfaceLayer.H:1620
const amrex::MultiFab * get_mac_avg(const int &lev, int comp)
Definition: ERF_SurfaceLayer.H:1385
void set_skin_temperature(const int &lev, const amrex::MultiFab *t_skin)
Definition: ERF_SurfaceLayer.H:1455
void fill_qsurf_with_skin_moisture(const int &lev, const amrex::MultiFab &cons_in, const std::unique_ptr< amrex::MultiFab > &z_phys_nd)
Definition: ERF_SurfaceLayer.cpp:2863
void update_sst_ptr(const int lev, const int itime, amrex::MultiFab *sst_ptr)
Definition: ERF_SurfaceLayer.H:1674
amrex::Real custom_ustar
Definition: ERF_SurfaceLayer.H:1823
amrex::Vector< std::unique_ptr< amrex::MultiFab > > olen
Definition: ERF_SurfaceLayer.H:1875
bool m_use_coupled_sst
Definition: ERF_SurfaceLayer.H:1856
void fill_tsurf_with_sfc_sst(const int &lev, const double &time, const amrex::MultiFab &cons_in, const std::unique_ptr< amrex::MultiFab > &z_phys_nd)
Definition: ERF_SurfaceLayer.cpp:2045
amrex::Orientation m_face
Definition: ERF_SurfaceLayer.H:1794
void fill_tsurf_with_abs_surf_temp(const int &lev, const double &time, const amrex::MultiFab &cons_in, const std::unique_ptr< amrex::MultiFab > &z_phys_nd)
Definition: ERF_SurfaceLayer.cpp:2657
amrex::MultiFab * get_t_surf(const int &lev)
Definition: ERF_SurfaceLayer.H:1444
amrex::Real m_Cd
Definition: ERF_SurfaceLayer.H:1858
void set_mac_avg_initialized(const int &lev)
Definition: ERF_SurfaceLayer.H:1412
amrex::Vector< std::unique_ptr< amrex::MultiFab > > pblh
Definition: ERF_SurfaceLayer.H:1876
amrex::Real default_land_surf_temp
Definition: ERF_SurfaceLayer.H:1807
bool set_default_roughness(amrex::Real z0)
Definition: ERF_SurfaceLayer.H:1554
ThetaCalcType
Definition: ERF_SurfaceLayer.H:1763
@ SURFACE_TEMPERATURE
Surface temperature specified.
@ HEAT_FLUX
Heat-flux specified.
void define_pblh_columns(const int &lev, const amrex::BoxArray &ba, const amrex::DistributionMapping &dm)
Definition: ERF_SurfaceLayer.cpp:3265
void read_custom_roughness(const int &lev, const std::string &fname)
Definition: ERF_SurfaceLayer.cpp:3491
TerrainType m_terrain_type
Definition: ERF_SurfaceLayer.H:1864
amrex::Vector< std::string > m_lsm_flux_name
Definition: ERF_SurfaceLayer.H:1934
MOSTAverage m_ma
Definition: ERF_SurfaceLayer.H:1867
Interface between ERF and land-surface and urban models.
Definition: ERF_SurfaceModel.H:47
bool are_fluxes()
Returns whether the interface exports fluxes rather than MOST variables.
Definition: ERF_SurfaceModel.H:432
@ tsurf
Definition: ERF_SLM.H:27
@ ng
Definition: ERF_Morrison.H:51
@ cons
Definition: ERF_IndexDefines.H:254
Definition: ERF_SurfaceLayer.H:29
bool planar_sources_supported_for_terrain(TerrainType terrain_type, bool use_sst, bool use_tsk, bool use_coupled_sst, bool has_lsm_tsurf, bool has_lsm_fluxes, bool has_custom_roughness)
Definition: ERF_SurfaceLayer.H:32
real(c_double), parameter epsilon
Definition: ERF_module_model_constants.F90:12
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real to_plot_value(SurfaceDiagnosticSource source) noexcept
Definition: ERF_SurfaceDiagnosticSource.H:45
The moisture data carried by the active microphysics scheme.
Definition: ERF_DataStruct.H:251
Definition: ERF_SurfaceLayer.H:1891
bool needed
Definition: ERF_SurfaceLayer.H:1894
amrex::BoxArray ba
Definition: ERF_SurfaceLayer.H:1892
amrex::BoxArray ba_col2d
Definition: ERF_SurfaceLayer.H:1897
amrex::MultiFab hold_col2d
Definition: ERF_SurfaceLayer.H:1900
bool full_height
Definition: ERF_SurfaceLayer.H:1895
amrex::MultiFab hold_col
Definition: ERF_SurfaceLayer.H:1899
amrex::DistributionMapping dm_col
Definition: ERF_SurfaceLayer.H:1898
amrex::DistributionMapping dm
Definition: ERF_SurfaceLayer.H:1893
amrex::BoxArray ba_col
Definition: ERF_SurfaceLayer.H:1896
Definition: ERF_TurbStruct.H:119
RANSType rans_type
Selected RANS closure.
Definition: ERF_TurbStruct.H:877
amrex::Real theta_ref
Reference potential temperature for stable stratification.
Definition: ERF_TurbStruct.H:864
bool dirichlet_k
Whether TKE uses Dirichlet boundary treatment.
Definition: ERF_TurbStruct.H:879
amrex::Real Cmu0
One-equation RANS Cmu0 coefficient.
Definition: ERF_TurbStruct.H:853