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"
59 bool& use_rot_surface_flux,
60 std::string a_pp_prefix,
61 amrex::Vector<std::unique_ptr<amrex::MultiFab>>& Qv_prim,
62 amrex::Vector<std::unique_ptr<amrex::MultiFab>>& z_phys_nd,
63 const MeshType& a_mesh_type,
64 const TerrainType& a_terrain_type,
66 double start_low_time,
67 double final_low_time,
68 double low_time_interval = 0.0,
69 const amrex::Vector<const eb_*>& eb_vec = {})
77 m_ma(geom, (z_phys_nd[0] !=
nullptr), a_pp_prefix, a_mesh_type, a_terrain_type, eb_vec)
83 amrex::ParmParse
pp(
"erf");
87 if (use_rot_surface_flux) {
90 std::string flux_string_in;
91 std::string flux_string{
"moeng"};
92 auto read_flux =
pp.queryAdd(
"surface_layer.flux_type", flux_string_in);
94 flux_string = amrex::toLower(flux_string_in);
96 if (flux_string ==
"donelan") {
98 }
else if (flux_string ==
"moeng") {
100 }
else if (flux_string ==
"rico") {
102 }
else if (flux_string ==
"bulk_coeff") {
104 }
else if (flux_string ==
"custom") {
107 amrex::Abort(
"Undefined MOST flux type!");
114 std::string pblh_string_in;
115 std::string pblh_string{
"none"};
116 auto read_pblh =
pp.queryAdd(
"most.pblh_calc", pblh_string_in);
118 pblh_string = amrex::toLower(pblh_string_in);
120 if (pblh_string ==
"none") {
122 }
else if (pblh_string ==
"mynn25") {
124 }
else if (pblh_string ==
"mynnedmf") {
126 }
else if (pblh_string ==
"ysu") {
128 }
else if (pblh_string ==
"mrf") {
131 amrex::Abort(
"Undefined PBLH calc type!");
139 amrex::Abort(
"erf.most.include_wstar requires a PBL height: set "
140 "erf.most.pblh_calc (MYNN25 is the only scheme implemented)");
172 "Specified custom MOST qv flux without moisture model!");
174 amrex::Print() <<
"Using specified ustar, tstar, qstar for MOST = "
185 amrex::Print() <<
"Using specified Cd, Ch, Cq for MOST = "
187 <<
m_Cq << std::endl;
199 amrex::Abort(
"Can only specify one of surf_temp_flux or surf_heating_rate");
205 amrex::Abort(
"Can only specify one of surf_temp_flux or surf_heating_rate");
235 std::string bogus_input;
236 if (
pp.queryAdd(
"most.roughness_type", bogus_input) > 0) {
237 amrex::Abort(
"most.roughness_type is deprecated; use "
238 "most.roughness_type_land and/or most.roughness_type_sea");
242 std::string rough_land_string_in;
243 std::string rough_land_string{
"constant"};
244 auto read_rough_land =
245 pp.queryAdd(
"most.roughness_type_land", rough_land_string_in);
246 if (read_rough_land) {
247 rough_land_string = amrex::toLower(rough_land_string_in);
249 if (rough_land_string ==
"constant") {
252 amrex::Abort(
"Undefined MOST roughness type for land!");
256 std::string rough_sea_string_in;
257 std::string rough_sea_string{
"charnock"};
258 auto read_rough_sea =
pp.queryAdd(
"most.roughness_type_sea", rough_sea_string_in);
259 if (read_rough_sea) {
260 rough_sea_string = amrex::toLower(rough_sea_string_in);
262 if (rough_sea_string ==
"charnock") {
264 pp.queryAdd(
"most.charnock_constant",
cnk_a);
265 pp.queryAdd(
"most.charnock_viscosity",
cnk_visc);
267 amrex::Print() <<
"If there is water, Charnock relation with C_a="
269 <<
" will be used" << std::endl;
271 amrex::Print() <<
"If there is water, Charnock relation with variable "
272 "Charnock parameter (COARE3.0)"
273 << (
cnk_visc ?
" and viscosity" :
"") <<
" will be used"
276 }
else if (rough_sea_string ==
"coare3.0") {
278 amrex::Print() <<
"If there is water, Charnock relation with variable "
279 "Charnock parameter (COARE3.0)"
280 << (
cnk_visc ?
" and viscosity" :
"") <<
" will be used"
283 }
else if (rough_sea_string ==
"donelan") {
285 }
else if (rough_sea_string ==
"modified_charnock") {
287 pp.queryAdd(
"most.modified_charnock_depth",
depth);
288 }
else if (rough_sea_string ==
"wave_coupled") {
290 }
else if (rough_sea_string ==
"constant") {
293 amrex::Abort(
"Undefined MOST roughness type for sea!");
336 const amrex::Vector<amrex::MultiFab*>& mfv,
337 std::unique_ptr<amrex::MultiFab>& Theta_prim,
338 std::unique_ptr<amrex::MultiFab>& Qv_prim,
339 std::unique_ptr<amrex::MultiFab>& Qr_prim,
340 std::unique_ptr<amrex::MultiFab>& z_phys_nd,
341 amrex::MultiFab* Hwave,
342 amrex::MultiFab* Lwave,
343 amrex::MultiFab* eddyDiffs,
344 amrex::Vector<amrex::MultiFab*> lsm_data,
345 amrex::Vector<std::string> lsm_data_name,
346 amrex::Vector<amrex::MultiFab*> lsm_flux,
347 amrex::Vector<std::string> lsm_flux_name,
348 amrex::Vector<std::unique_ptr<amrex::MultiFab>>& sst_lev,
349 amrex::Vector<std::unique_ptr<amrex::MultiFab>>& tsk_lev,
350 amrex::Vector<std::unique_ptr<amrex::iMultiFab>>& lmask_lev)
354 Theta_prim, Qv_prim, Qr_prim,
358 amrex::MultiFab& mf = *(mfv[0]);
360 amrex::ParmParse
pp(
"erf");
364 const int nghost = 0;
366 amrex::ParallelDescriptor::ReduceIntMin(lmask_min);
370 std::string rough_sea_string{
"charnock"};
371 pp.queryAdd(
"most.roughness_type_sea", rough_sea_string);
372 amrex::Print() <<
"Variable sea roughness (type " << rough_sea_string
406 int nt_tot_sst = sst_lev.size();
408 for (
int nt(0); nt < nt_tot_sst; ++nt) {
411 int nt_tot_tsk =
static_cast<int>(tsk_lev.size());
413 for (
int nt(0); nt < nt_tot_tsk; ++nt) {
416 int nt_tot_lmask =
static_cast<int>(lmask_lev.size());
418 for (
int nt(0); nt < nt_tot_lmask; ++nt) {
432 amrex::Abort(
"Only one of most.use_sfc_fluxes and most.use_sfc_sst may be enabled");
436 amrex::Abort(
"Text-file surface forcing is not supported with EB terrain");
440 std::string sfc_file =
"";
441 pp.queryAdd(
"most.sfc_file", sfc_file);
442 if (sfc_file.empty()) {
443 amrex::Abort(
"most.sfc_file must be set when using text-file surface forcing");
450 if (
static_cast<int>(
sfc.size()) < min_cols) {
451 amrex::Abort(
"Surface forcing file does not contain the required number of columns");
456 for (
int i = 0; i < static_cast<int>(
sfc[0].size()); ++i) {
457 sfc[0][i] = 86400.0 * (
sfc[0][i] - start_day);
462 amrex::Abort(
"most.use_sfc_sst cannot be combined with prescribed heat flux or surf_heating_rate");
465 amrex::Abort(
"most.use_sfc_sst cannot be combined with prescribed moisture flux");
468 amrex::Print() <<
"Using MOST with prescribed SST from most.sfc_file '" << sfc_file <<
"' over sea" << std::endl;
473 amrex::Print() <<
"Using MOST with prescribed time-varying surface fluxes from '" << sfc_file <<
"'" << std::endl;
478 int ndata =
static_cast<int>(lsm_data.size());
479 int nflux =
static_cast<int>(lsm_flux.size());
484 for (
int n(0); n < ndata; ++n) {
487 const std::string lc_name = amrex::toLower(lsm_data_name[n]);
488 if (lc_name ==
"theta" || lc_name ==
"t_surf") {
494 amrex::Abort(
"most.use_sfc_sst cannot be combined with an ocean LSM t_surf input");
496 int n_valid_lsm_flux = 0;
497 bool has_soil_t_flux =
false;
498 for (
int n(0); n < nflux; ++n) {
503 has_soil_t_flux =
true;
507 (n_valid_lsm_flux==1 && has_soil_t_flux)));
512 bool read_z0 =
false;
515 int count =
pp.countval(
"most.roughness_file_name");
518 pp.query(
"most.roughness_file_name", fname, lev);
520 }
else if (count == 1) {
522 pp.queryAdd(
"most.roughness_file_name", fname);
535 amrex::BoxArray ba = mf.boxArray();
536 amrex::BoxArray ba_flux;
537 amrex::IntVect
ng{1,1,0};
542 ng = amrex::IntVect{1,1,1};
545 amrex::BoxList bl2d = ba.boxList();
546 for (
auto& b : bl2d) { b.setRange(2,0); }
547 ba_flux = amrex::BoxArray(std::move(bl2d));
550 const amrex::DistributionMapping& dm = mf.DistributionMap();
555 z_0[lev].define(ba_flux, dm, ncomp,
ng);
563 u_star[lev] = std::make_unique<amrex::MultiFab>(ba_flux, dm, ncomp,
ng);
566 w_star[lev] = std::make_unique<amrex::MultiFab>(ba_flux, dm, ncomp,
ng);
569 t_star[lev] = std::make_unique<amrex::MultiFab>(ba_flux, dm, ncomp,
ng);
572 q_star[lev] = std::make_unique<amrex::MultiFab>(ba_flux, dm, ncomp,
ng);
575 olen[lev] = std::make_unique<amrex::MultiFab>(ba_flux, dm, ncomp,
ng);
578 pblh[lev] = std::make_unique<amrex::MultiFab>(ba_flux, dm, ncomp,
ng);
581 t_surf[lev] = std::make_unique<amrex::MultiFab>(ba_flux, dm, ncomp,
ng);
584 q_surf[lev] = std::make_unique<amrex::MultiFab>(ba_flux, dm, ncomp,
ng);
602 amrex::Print() <<
"Using MOST with specified surface temperature ";
605 }
else if (!use_sst && !use_tsk) {
606 amrex::Print() <<
"(land: T0, sea: none)";
613 amrex::Print() <<
"(land: TSK, ";
615 amrex::Print() <<
"(land: T0, ";
617 if (use_tsk && !use_sst) {
618 amrex::Print() <<
"sea: TSK)";
620 amrex::Print() <<
"sea: SST)";
628 amrex::Print() <<
" + coupled ocean SST where covered";
630 amrex::Print() << std::endl;
647 const double& elapsed_time,
648 const double& elapsed_time_since_start_low,
649 amrex::MultiFab& cons_in,
650 const std::unique_ptr<amrex::MultiFab>& z_phys_nd,
651 const std::unique_ptr<amrex::MultiFab>& walldist,
652 int max_iters = 100);
663 template <
typename FluxIter>
665 const int& max_iters,
666 amrex::MultiFab& cons_in,
667 const FluxIter& most_flux,
680 amrex::MultiFab&
cons,
681 const std::unique_ptr<amrex::MultiFab>& z_phys_nd,
700 amrex::Vector<const amrex::MultiFab*> mfs,
701 amrex::Vector<std::unique_ptr<amrex::MultiFab>>& Tau_lev,
702 amrex::MultiFab* xheat_flux,
703 amrex::MultiFab* yheat_flux,
704 amrex::MultiFab* zheat_flux,
705 amrex::MultiFab* xqv_flux,
706 amrex::MultiFab* yqv_flux,
707 amrex::MultiFab* zqv_flux,
708 const amrex::MultiFab* z_phys);
724 amrex::Vector<const amrex::MultiFab*> mfs,
725 amrex::Vector<amrex::Vector<std::unique_ptr<amrex::MultiFab>>>& Tau_lev,
726 amrex::MultiFab* xheat_flux,
727 amrex::MultiFab* yheat_flux,
728 amrex::MultiFab* zheat_flux,
729 amrex::MultiFab* xqv_flux,
730 amrex::MultiFab* yqv_flux,
731 amrex::MultiFab* zqv_flux);
748 template <
typename FluxCalc>
750 amrex::Vector<const amrex::MultiFab*> mfs,
751 amrex::Vector<std::unique_ptr<amrex::MultiFab>>& Tau_lev,
752 amrex::MultiFab* xheat_flux,
753 amrex::MultiFab* yheat_flux,
754 amrex::MultiFab* zheat_flux,
755 amrex::MultiFab* xqv_flux,
756 amrex::MultiFab* yqv_flux,
757 amrex::MultiFab* zqv_flux,
758 const amrex::MultiFab* z_phys,
759 const FluxCalc& flux_comp);
775 template <
typename FluxCalc>
777 amrex::Vector<const amrex::MultiFab*> mfs,
778 amrex::Vector<amrex::Vector<std::unique_ptr<amrex::MultiFab>>>& Tau_lev,
779 amrex::MultiFab* xheat_flux,
780 amrex::MultiFab* yheat_flux,
781 amrex::MultiFab* zheat_flux,
782 amrex::MultiFab* xqv_flux,
783 amrex::MultiFab* yqv_flux,
784 amrex::MultiFab* zqv_flux,
785 const FluxCalc& flux_comp);
794 amrex::MultiFab& cons_in);
834 const amrex::MultiFab& cons_in,
835 const std::unique_ptr<amrex::MultiFab>& z_phys_nd);
869 amrex::Vector<amrex::Vector<amrex::MultiFab>>& vars,
870 amrex::MultiFab* z_phys_cc,
882 template <
typename PBLHeightEstimator>
884 amrex::Vector<amrex::Vector<amrex::MultiFab>>& vars,
885 amrex::MultiFab* z_phys_cc,
886 const PBLHeightEstimator& est,
896 const std::string& fname);
913 int nlevs =
static_cast<int>(
t_surf.size());
914 for (
int lev = 0; lev < nlevs; lev++) {
915 if (!
t_surf[lev]) {
continue; }
917 amrex::Print() <<
"Surface temp at t=" << time <<
": "
933 amrex::Vector<amrex::Vector<amrex::MultiFab>>& vars_old,
934 amrex::Vector<std::unique_ptr<amrex::MultiFab>>& Theta_prim,
935 amrex::Vector<std::unique_ptr<amrex::MultiFab>>& Qv_prim,
936 amrex::Vector<std::unique_ptr<amrex::MultiFab>>& Qr_prim)
1104 amrex::MultiFab*
get_z0 (
const int& lev) {
return &
z_0[lev]; }
1127 int lmask_min = amrex::ReduceMin(lmask, nghost, [=] AMREX_GPU_HOST_DEVICE(
1128 amrex::Box
const& bx, amrex::Array4<int const>
const& lm_arr) ->
int
1130 int locmin = std::numeric_limits<int>::max();
1131 const auto lo = lbound(bx);
1132 const auto hi = ubound(bx);
1133 for (
int j = lo.y; j <= hi.y; ++j) {
1134 for (
int i = lo.x; i <= hi.x; ++i) {
1135 locmin = std::min(locmin, lm_arr(i, j, 0));
1179 amrex::MultiFab* sst_ptr,
1180 amrex::iMultiFab* valid_ptr) {
1202 static amrex::Vector<amrex::Vector<amrex::Real>>
1203 read_cols(
const std::string& fname,
const int skip_nlines = 1);
1273 amrex::Vector<amrex::MultiFab>
z_0;
1288 amrex::Vector<amrex::Vector<amrex::Real>>
sfc;
1307 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
u_star;
1308 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
w_star;
1309 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
t_star;
1310 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
q_star;
1311 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
olen;
1312 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
pblh;
1313 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
t_surf;
1314 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
q_surf;
constexpr amrex::Real bogus_large_value
Definition: ERF_Constants.H:26
constexpr amrex::Real one
Definition: ERF_Constants.H:9
constexpr amrex::Real zero
Definition: ERF_Constants.H:8
Defines EB Monin-Obukhov surface-layer flux functors.
Declares the embedded-boundary factory manager used by ERF levels.
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
pp get("wavelength", wavelength)
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:15
bool set_plane_average(const int &lev, const amrex::Vector< amrex::Real > &pavg)
Definition: ERF_MOSTAverage.H:299
amrex::Vector< amrex::Real > get_plane_average(const int &lev) const
Definition: ERF_MOSTAverage.H:285
bool do_time_averaging() const
Definition: ERF_MOSTAverage.H:249
amrex::MultiFab * get_zref(const int &lev) const
Definition: ERF_MOSTAverage.H:313
void set_time_avg_initialized(const int &lev)
Definition: ERF_MOSTAverage.H:273
int get_navg() const
Definition: ERF_MOSTAverage.H:254
const amrex::MultiFab * get_average(const int &lev, const int &comp) const
Definition: ERF_MOSTAverage.H:235
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:308
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:111
bool time_avg_is_initialized(const int &lev) const
Definition: ERF_MOSTAverage.H:262
Definition: ERF_SurfaceLayer.H:39
ThetaCalcType theta_type
Definition: ERF_SurfaceLayer.H:1237
int lmask_min_reduce(amrex::iMultiFab &lmask, const int &nghost)
Definition: ERF_SurfaceLayer.H:1124
amrex::Vector< std::string > m_lsm_data_name
Definition: ERF_SurfaceLayer.H:1334
bool m_include_wstar
Definition: ERF_SurfaceLayer.H:1251
amrex::Real interpolate_sfc_column(const amrex::Real &time, int col) const
Definition: ERF_SurfaceLayer.cpp:324
bool specified_rho_surf
Definition: ERF_SurfaceLayer.H:1269
void set_q_surf(const int &lev, const amrex::Real qsurf)
Definition: ERF_SurfaceLayer.H:1083
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:18
bool m_rotate
Definition: ERF_SurfaceLayer.H:1246
amrex::Real sfc_tflux
Definition: ERF_SurfaceLayer.H:1290
PBLHeightCalcType pblh_type
Definition: ERF_SurfaceLayer.H:1241
amrex::Vector< amrex::Vector< amrex::iMultiFab * > > m_lmask_lev
Definition: ERF_SurfaceLayer.H:1322
double m_final_low_time
Definition: ERF_SurfaceLayer.H:1248
void fill_tsurf_with_sfc_sst(const int &lev, const double &time)
Definition: ERF_SurfaceLayer.cpp:1302
amrex::iMultiFab * get_lmask(const int &lev)
Definition: ERF_SurfaceLayer.H:1116
bool use_moisture
Definition: ERF_SurfaceLayer.H:1279
amrex::MultiFab * get_q_surf(const int &lev)
Definition: ERF_SurfaceLayer.H:1075
bool m_has_lsm_tsurf
Definition: ERF_SurfaceLayer.H:1281
amrex::MultiFab * get_w_star(const int &lev)
Definition: ERF_SurfaceLayer.H:953
amrex::Real m_Cq
Definition: ERF_SurfaceLayer.H:1300
amrex::Vector< const eb_ * > m_eb_vec
Definition: ERF_SurfaceLayer.H:1304
RoughCalcType rough_type_land
Definition: ERF_SurfaceLayer.H:1239
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:1495
amrex::Real sfc_qflux
Definition: ERF_SurfaceLayer.H:1289
amrex::Vector< std::unique_ptr< amrex::MultiFab > > t_surf
Definition: ERF_SurfaceLayer.H:1313
bool m_use_sfc_fluxes
Definition: ERF_SurfaceLayer.H:1285
amrex::Real z0_const
Definition: ERF_SurfaceLayer.H:1252
amrex::Vector< std::unique_ptr< amrex::MultiFab > > surface_diagnostic_source
Definition: ERF_SurfaceLayer.H:1318
amrex::Real cnk_a
Definition: ERF_SurfaceLayer.H:1270
amrex::Real m_Ch
Definition: ERF_SurfaceLayer.H:1299
amrex::Real surf_temp
Definition: ERF_SurfaceLayer.H:1259
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:932
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< std::unique_ptr< amrex::MultiFab > > q_star
Definition: ERF_SurfaceLayer.H:1310
int m_lsm_tsurf_indx
Definition: ERF_SurfaceLayer.H:1282
double m_start_low_time
Definition: ERF_SurfaceLayer.H:1247
bool mac_avg_is_initialized(const int &lev) const
Definition: ERF_SurfaceLayer.H:1021
bool mac_avg_is_time_averaged() const
Definition: ERF_SurfaceLayer.H:1009
amrex::Real rico_qsat_z0
Definition: ERF_SurfaceLayer.H:1277
bool m_has_lsm_fluxes
Definition: ERF_SurfaceLayer.H:1280
bool m_update_k_rans
Definition: ERF_SurfaceLayer.H:1340
amrex::Vector< amrex::MultiFab * > m_Lwave_lev
Definition: ERF_SurfaceLayer.H:1337
void get_lsm_tsurf(const int &lev)
Definition: ERF_SurfaceLayer.cpp:1387
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:1339
amrex::Real get_zref(const int &lev)
Definition: ERF_SurfaceLayer.H:1097
amrex::MultiFab * get_olen(const int &lev)
Definition: ERF_SurfaceLayer.H:986
bool computes_w_star() const
Definition: ERF_SurfaceLayer.H:959
amrex::Vector< amrex::MultiFab > z_0
Definition: ERF_SurfaceLayer.H:1273
amrex::Real surf_moist_flux
Definition: ERF_SurfaceLayer.H:1264
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)
RoughCalcType rough_type_sea
Definition: ERF_SurfaceLayer.H:1240
void update_coupled_sst_ptr(const int lev, amrex::MultiFab *sst_ptr, amrex::iMultiFab *valid_ptr)
Definition: ERF_SurfaceLayer.H:1178
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:1540
amrex::Real surf_moist
Definition: ERF_SurfaceLayer.H:1263
amrex::Vector< std::unique_ptr< amrex::MultiFab > > w_star
Definition: ERF_SurfaceLayer.H:1308
bool m_ignore_sst
Definition: ERF_SurfaceLayer.H:1302
int get_num_mac_avg() const
Definition: ERF_SurfaceLayer.H:1014
amrex::Vector< amrex::Vector< amrex::Real > > sfc
Definition: ERF_SurfaceLayer.H:1288
amrex::MultiFab * get_u_star(const int &lev)
Definition: ERF_SurfaceLayer.H:946
double m_low_time_interval
Definition: ERF_SurfaceLayer.H:1249
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:1053
amrex::Vector< amrex::Vector< amrex::MultiFab * > > m_lsm_data_lev
Definition: ERF_SurfaceLayer.H:1332
void set_t_surf(const int &lev, const amrex::Real tsurf)
Definition: ERF_SurfaceLayer.H:1068
amrex::Real custom_qstar
Definition: ERF_SurfaceLayer.H:1267
amrex::Vector< std::unique_ptr< amrex::MultiFab > > u_star
Definition: ERF_SurfaceLayer.H:1307
void update_tsk_ptr(const int lev, const int itime, amrex::MultiFab *tsk_ptr)
Definition: ERF_SurfaceLayer.H:1162
amrex::Real custom_rhosurf
Definition: ERF_SurfaceLayer.H:1268
amrex::Vector< std::unique_ptr< amrex::MultiFab > > q_surf
Definition: ERF_SurfaceLayer.H:1314
amrex::Vector< amrex::Vector< amrex::MultiFab * > > m_sst_lev
Definition: ERF_SurfaceLayer.H:1320
FluxCalcType
Definition: ERF_SurfaceLayer.H:1205
@ MOENG
Moeng functional form.
@ BULK_COEFF
Bulk transfer coefficient functional form.
@ CUSTOM
Custom constant flux functional form.
@ ROTATE
Terrain rotation flux functional form.
@ DONELAN
Donelan functional form.
MoistCalcType
Definition: ERF_SurfaceLayer.H:1220
@ SURFACE_MOISTURE
Surface Qv specified.
@ MOISTURE_FLUX
Qv-flux specified.
amrex::Real depth
Definition: ERF_SurfaceLayer.H:1272
amrex::Vector< amrex::MultiFab * > m_coupled_sst_lev
Definition: ERF_SurfaceLayer.H:1330
amrex::Vector< amrex::MultiFab * > m_Hwave_lev
Definition: ERF_SurfaceLayer.H:1336
amrex::Real default_land_surf_moist
Definition: ERF_SurfaceLayer.H:1262
void update_sfc_time_index(const amrex::Real &time)
Definition: ERF_SurfaceLayer.cpp:307
bool m_var_z0
Definition: ERF_SurfaceLayer.H:1274
amrex::Vector< amrex::iMultiFab * > m_coupled_sst_valid_lev
Definition: ERF_SurfaceLayer.H:1331
amrex::MultiFab * get_surface_diagnostic_source(const int &lev)
Definition: ERF_SurfaceLayer.H:1090
amrex::MultiFab * get_t_star(const int &lev)
Definition: ERF_SurfaceLayer.H:972
bool have_variable_sea_roughness()
Definition: ERF_SurfaceLayer.H:1109
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:547
amrex::MultiFab * get_q_star(const int &lev)
Definition: ERF_SurfaceLayer.H:979
amrex::Vector< amrex::Vector< amrex::MultiFab * > > m_lsm_flux_lev
Definition: ERF_SurfaceLayer.H:1333
amrex::MultiFab * get_mac_avg_ptr(const int &lev, int comp)
Definition: ERF_SurfaceLayer.H:1036
amrex::Vector< amrex::Real > get_mac_plane_avg(const int &lev) const
Definition: ERF_SurfaceLayer.H:1044
PBLHeightCalcType
Definition: ERF_SurfaceLayer.H:1234
amrex::MultiFab * get_pblh(const int &lev)
Definition: ERF_SurfaceLayer.H:993
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:1276
amrex::Real sfc_ustar
Definition: ERF_SurfaceLayer.H:1291
amrex::Real surf_temp_flux
Definition: ERF_SurfaceLayer.H:1261
amrex::Vector< amrex::Geometry > m_geom
Definition: ERF_SurfaceLayer.H:1245
amrex::Vector< std::unique_ptr< amrex::MultiFab > > t_star
Definition: ERF_SurfaceLayer.H:1309
int sfc_time_ind
Definition: ERF_SurfaceLayer.H:1287
bool computes_pblh() const
Definition: ERF_SurfaceLayer.H:965
amrex::Real theta_ref
Definition: ERF_SurfaceLayer.H:1342
amrex::MultiFab * get_z0(const int &lev)
Definition: ERF_SurfaceLayer.H:1104
amrex::Vector< amrex::Vector< amrex::MultiFab * > > m_tsk_lev
Definition: ERF_SurfaceLayer.H:1321
void update_surf_temp(const double &time)
Definition: ERF_SurfaceLayer.H:903
void set_coupled_sst_active(const bool active)
Definition: ERF_SurfaceLayer.H:1193
void fill_tsurf_with_sst_and_tsk(const int &lev, const double &time)
Definition: ERF_SurfaceLayer.cpp:1215
amrex::Real custom_tstar
Definition: ERF_SurfaceLayer.H:1266
static amrex::Vector< amrex::Vector< amrex::Real > > read_cols(const std::string &fname, const int skip_nlines=1)
Definition: ERF_SurfaceLayer.cpp:1743
bool cnk_visc
Definition: ERF_SurfaceLayer.H:1271
amrex::Real surf_heating_rate
Definition: ERF_SurfaceLayer.H:1260
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:334
RoughCalcType
Definition: ERF_SurfaceLayer.H:1226
FluxCalcType flux_type
Definition: ERF_SurfaceLayer.H:1236
MoistCalcType moist_type
Definition: ERF_SurfaceLayer.H:1238
void fill_tsurf_with_coupled_sst(const int &lev)
Definition: ERF_SurfaceLayer.cpp:1427
bool m_use_sfc_sst
Definition: ERF_SurfaceLayer.H:1286
void compute_sfc_params_from_lsm_fluxes(const int &lev, amrex::MultiFab &cons_in)
Definition: ERF_SurfaceLayer.cpp:1142
SurfaceLayer(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 MeshType &a_mesh_type, const TerrainType &a_terrain_type, const TurbChoice &a_turb_choice, double start_low_time, double final_low_time, double low_time_interval=0.0, const amrex::Vector< const eb_ * > &eb_vec={})
Definition: ERF_SurfaceLayer.H:58
amrex::Real inv_Cmu2
Definition: ERF_SurfaceLayer.H:1341
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)
Definition: ERF_SurfaceLayer.cpp:480
amrex::Vector< amrex::MultiFab * > m_eddyDiffs_lev
Definition: ERF_SurfaceLayer.H:1338
const amrex::MultiFab * get_mac_avg(const int &lev, int comp)
Definition: ERF_SurfaceLayer.H:1001
void update_sst_ptr(const int lev, const int itime, amrex::MultiFab *sst_ptr)
Definition: ERF_SurfaceLayer.H:1151
amrex::Real custom_ustar
Definition: ERF_SurfaceLayer.H:1265
amrex::Vector< std::unique_ptr< amrex::MultiFab > > olen
Definition: ERF_SurfaceLayer.H:1311
bool m_use_coupled_sst
Definition: ERF_SurfaceLayer.H:1296
amrex::MultiFab * get_t_surf(const int &lev)
Definition: ERF_SurfaceLayer.H:1060
amrex::Real m_Cd
Definition: ERF_SurfaceLayer.H:1298
void set_mac_avg_initialized(const int &lev)
Definition: ERF_SurfaceLayer.H:1028
amrex::Vector< std::unique_ptr< amrex::MultiFab > > pblh
Definition: ERF_SurfaceLayer.H:1312
amrex::Real default_land_surf_temp
Definition: ERF_SurfaceLayer.H:1253
ThetaCalcType
Definition: ERF_SurfaceLayer.H:1214
@ SURFACE_TEMPERATURE
Surface temperature specified.
@ HEAT_FLUX
Heat-flux specified.
void read_custom_roughness(const int &lev, const std::string &fname)
Definition: ERF_SurfaceLayer.cpp:1615
TerrainType m_terrain_type
Definition: ERF_SurfaceLayer.H:1305
amrex::Vector< std::string > m_lsm_flux_name
Definition: ERF_SurfaceLayer.H:1335
MOSTAverage m_ma
Definition: ERF_SurfaceLayer.H:1306
@ ng
Definition: ERF_Morrison.H:49
@ cons
Definition: ERF_IndexDefines.H:214
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:195
Definition: ERF_TurbStruct.H:114
RANSType rans_type
Selected RANS closure.
Definition: ERF_TurbStruct.H:604
amrex::Real theta_ref
Reference potential temperature for stable stratification.
Definition: ERF_TurbStruct.H:593
bool dirichlet_k
Whether TKE uses Dirichlet boundary treatment.
Definition: ERF_TurbStruct.H:606
amrex::Real Cmu0
One-equation RANS Cmu0 coefficient.
Definition: ERF_TurbStruct.H:582