1 #ifndef ERF_SURFACELAYER_H
2 #define ERF_SURFACELAYER_H
4 #include "AMReX_Geometry.H"
5 #include "AMReX_ParmParse.H"
6 #include "AMReX_FArrayBox.H"
7 #include "AMReX_MultiFab.H"
8 #include "AMReX_iMultiFab.H"
9 #include "AMReX_MFInterpolater.H"
39 bool& use_rot_surface_flux,
40 std::string a_pp_prefix,
41 amrex::Vector<std::unique_ptr<amrex::MultiFab>>& Qv_prim,
42 amrex::Vector<std::unique_ptr<amrex::MultiFab>>& z_phys_nd,
43 const MeshType& a_mesh_type,
44 const TerrainType& a_terrain_type,
49 const amrex::Vector<const eb_*>& eb_vec = {})
57 m_ma(geom, (z_phys_nd[0] !=
nullptr), a_pp_prefix, a_mesh_type, a_terrain_type, eb_vec)
63 amrex::ParmParse
pp(
"erf");
67 if (use_rot_surface_flux) {
70 std::string flux_string_in;
71 std::string flux_string{
"moeng"};
72 auto read_flux =
pp.query(
"surface_layer.flux_type", flux_string_in);
74 flux_string = amrex::toLower(flux_string_in);
76 if (flux_string ==
"donelan") {
78 }
else if (flux_string ==
"moeng") {
80 }
else if (flux_string ==
"rico") {
82 }
else if (flux_string ==
"bulk_coeff") {
84 }
else if (flux_string ==
"custom") {
87 amrex::Abort(
"Undefined MOST flux type!");
94 std::string pblh_string_in;
95 std::string pblh_string{
"none"};
96 auto read_pblh =
pp.query(
"most.pblh_calc", pblh_string_in);
98 pblh_string = amrex::toLower(pblh_string_in);
100 if (pblh_string ==
"none") {
102 }
else if (pblh_string ==
"mynn25") {
104 }
else if (pblh_string ==
"mynnedmf") {
106 }
else if (pblh_string ==
"ysu") {
108 }
else if (pblh_string ==
"mrf") {
111 amrex::Abort(
"Undefined PBLH calc type!");
115 auto erf_st =
pp.query(
"most.surf_temp",
surf_temp);
134 "Specified custom MOST qv flux without moisture model!");
136 amrex::Print() <<
"Using specified ustar, tstar, qstar for MOST = "
147 amrex::Print() <<
"Using specified Cd, Ch, Cq for MOST = "
149 <<
m_Cq << std::endl;
161 amrex::Abort(
"Can only specify one of surf_temp_flux or surf_heating_rate");
167 amrex::Abort(
"Can only specify one of surf_temp_flux or surf_heating_rate");
197 std::string bogus_input;
198 if (
pp.query(
"most.roughness_type", bogus_input) > 0) {
199 amrex::Abort(
"most.roughness_type is deprecated; use "
200 "most.roughness_type_land and/or most.roughness_type_sea");
204 std::string rough_land_string_in;
205 std::string rough_land_string{
"constant"};
206 auto read_rough_land =
207 pp.query(
"most.roughness_type_land", rough_land_string_in);
208 if (read_rough_land) {
209 rough_land_string = amrex::toLower(rough_land_string_in);
211 if (rough_land_string ==
"constant") {
214 amrex::Abort(
"Undefined MOST roughness type for land!");
218 std::string rough_sea_string_in;
219 std::string rough_sea_string{
"charnock"};
220 auto read_rough_sea =
pp.query(
"most.roughness_type_sea", rough_sea_string_in);
221 if (read_rough_sea) {
222 rough_sea_string = amrex::toLower(rough_sea_string_in);
224 if (rough_sea_string ==
"charnock") {
226 pp.query(
"most.charnock_constant",
cnk_a);
227 pp.query(
"most.charnock_viscosity",
cnk_visc);
229 amrex::Print() <<
"If there is water, Charnock relation with C_a="
231 <<
" will be used" << std::endl;
233 amrex::Print() <<
"If there is water, Charnock relation with variable "
234 "Charnock parameter (COARE3.0)"
235 << (
cnk_visc ?
" and viscosity" :
"") <<
" will be used"
238 }
else if (rough_sea_string ==
"coare3.0") {
240 amrex::Print() <<
"If there is water, Charnock relation with variable "
241 "Charnock parameter (COARE3.0)"
242 << (
cnk_visc ?
" and viscosity" :
"") <<
" will be used"
245 }
else if (rough_sea_string ==
"donelan") {
247 }
else if (rough_sea_string ==
"modified_charnock") {
249 pp.query(
"most.modified_charnock_depth",
depth);
250 }
else if (rough_sea_string ==
"wave_coupled") {
252 }
else if (rough_sea_string ==
"constant") {
255 amrex::Abort(
"Undefined MOST roughness type for sea!");
277 const amrex::Vector<amrex::MultiFab*>& mfv,
278 std::unique_ptr<amrex::MultiFab>& Theta_prim,
279 std::unique_ptr<amrex::MultiFab>& Qv_prim,
280 std::unique_ptr<amrex::MultiFab>& Qr_prim,
281 std::unique_ptr<amrex::MultiFab>& z_phys_nd,
282 amrex::MultiFab* Hwave,
283 amrex::MultiFab* Lwave,
284 amrex::MultiFab* eddyDiffs,
285 amrex::Vector<amrex::MultiFab*> lsm_data,
286 amrex::Vector<std::string> lsm_data_name,
287 amrex::Vector<amrex::MultiFab*> lsm_flux,
288 amrex::Vector<std::string> lsm_flux_name,
289 amrex::Vector<std::unique_ptr<amrex::MultiFab>>& sst_lev,
290 amrex::Vector<std::unique_ptr<amrex::MultiFab>>& tsk_lev,
291 amrex::Vector<std::unique_ptr<amrex::iMultiFab>>& lmask_lev)
295 Theta_prim, Qv_prim, Qr_prim,
299 amrex::MultiFab& mf = *(mfv[0]);
301 amrex::ParmParse
pp(
"erf");
305 const int nghost = 0;
307 amrex::ParallelDescriptor::ReduceIntMin(lmask_min);
311 std::string rough_sea_string{
"charnock"};
312 pp.query(
"most.roughness_type_sea", rough_sea_string);
313 amrex::Print() <<
"Variable sea roughness (type " << rough_sea_string
344 int nt_tot_sst = sst_lev.size();
346 for (
int nt(0); nt < nt_tot_sst; ++nt) {
349 int nt_tot_tsk =
static_cast<int>(tsk_lev.size());
351 for (
int nt(0); nt < nt_tot_tsk; ++nt) {
354 int nt_tot_lmask =
static_cast<int>(lmask_lev.size());
356 for (
int nt(0); nt < nt_tot_lmask; ++nt) {
366 int ndata =
static_cast<int>(lsm_data.size());
367 int nflux =
static_cast<int>(lsm_flux.size());
372 for (
int n(0); n < ndata; ++n) {
375 const std::string lc_name = amrex::toLower(lsm_data_name[n]);
376 if (lc_name ==
"theta" || lc_name ==
"t_surf") {
382 int n_valid_lsm_flux = 0;
383 for (
int n(0); n < nflux; ++n) {
393 bool read_z0 =
false;
396 int count =
pp.countval(
"most.roughness_file_name");
399 pp.query(
"most.roughness_file_name", fname, lev);
401 }
else if (count == 1) {
403 pp.query(
"most.roughness_file_name", fname);
416 amrex::BoxArray ba = mf.boxArray();
417 amrex::BoxArray ba_flux;
418 amrex::IntVect
ng{1,1,0};
423 ng = amrex::IntVect{1,1,1};
426 amrex::BoxList bl2d = ba.boxList();
427 for (
auto& b : bl2d) { b.setRange(2,0); }
428 ba_flux = amrex::BoxArray(std::move(bl2d));
431 const amrex::DistributionMapping& dm = mf.DistributionMap();
436 z_0[lev].define(ba_flux, dm, ncomp,
ng);
444 u_star[lev] = std::make_unique<amrex::MultiFab>(ba_flux, dm, ncomp,
ng);
447 w_star[lev] = std::make_unique<amrex::MultiFab>(ba_flux, dm, ncomp,
ng);
450 t_star[lev] = std::make_unique<amrex::MultiFab>(ba_flux, dm, ncomp,
ng);
453 q_star[lev] = std::make_unique<amrex::MultiFab>(ba_flux, dm, ncomp,
ng);
456 olen[lev] = std::make_unique<amrex::MultiFab>(ba_flux, dm, ncomp,
ng);
459 pblh[lev] = std::make_unique<amrex::MultiFab>(ba_flux, dm, ncomp,
ng);
462 t_surf[lev] = std::make_unique<amrex::MultiFab>(ba_flux, dm, ncomp,
ng);
465 q_surf[lev] = std::make_unique<amrex::MultiFab>(ba_flux, dm, ncomp,
ng);
483 amrex::Print() <<
"Using MOST with specified surface temperature ";
485 amrex::Print() <<
"(OceanSurf: t_surf)" << std::endl;
492 amrex::Print() <<
"(land: TSK, ";
494 amrex::Print() <<
"(land: T0, ";
496 if (use_tsk && !use_sst) {
497 amrex::Print() <<
"sea: TSK)" << std::endl;
499 amrex::Print() <<
"sea: SST)" << std::endl;
510 amrex::MultiFab& cons_in,
511 const std::unique_ptr<amrex::MultiFab>& z_phys_nd,
512 const std::unique_ptr<amrex::MultiFab>& walldist,
513 int max_iters = 100);
515 template <
typename FluxIter>
517 const int& max_iters,
518 amrex::MultiFab& cons_in,
519 const FluxIter& most_flux,
523 amrex::MultiFab&
cons,
524 const std::unique_ptr<amrex::MultiFab>& z_phys_nd,
529 amrex::Vector<const amrex::MultiFab*> mfs,
530 amrex::Vector<std::unique_ptr<amrex::MultiFab>>& Tau_lev,
531 amrex::MultiFab* xheat_flux,
532 amrex::MultiFab* yheat_flux,
533 amrex::MultiFab* zheat_flux,
534 amrex::MultiFab* xqv_flux,
535 amrex::MultiFab* yqv_flux,
536 amrex::MultiFab* zqv_flux,
537 const amrex::MultiFab* z_phys);
540 amrex::Vector<const amrex::MultiFab*> mfs,
541 amrex::Vector<amrex::Vector<std::unique_ptr<amrex::MultiFab>>>& Tau_lev,
542 amrex::MultiFab* xheat_flux,
543 amrex::MultiFab* yheat_flux,
544 amrex::MultiFab* zheat_flux,
545 amrex::MultiFab* xqv_flux,
546 amrex::MultiFab* yqv_flux,
547 amrex::MultiFab* zqv_flux);
548 template <
typename FluxCalc>
550 amrex::Vector<const amrex::MultiFab*> mfs,
551 amrex::Vector<std::unique_ptr<amrex::MultiFab>>& Tau_lev,
552 amrex::MultiFab* xheat_flux,
553 amrex::MultiFab* yheat_flux,
554 amrex::MultiFab* zheat_flux,
555 amrex::MultiFab* xqv_flux,
556 amrex::MultiFab* yqv_flux,
557 amrex::MultiFab* zqv_flux,
558 const amrex::MultiFab* z_phys,
559 const FluxCalc& flux_comp);
561 template <
typename FluxCalc>
563 amrex::Vector<const amrex::MultiFab*> mfs,
564 amrex::Vector<amrex::Vector<std::unique_ptr<amrex::MultiFab>>>& Tau_lev,
565 amrex::MultiFab* xheat_flux,
566 amrex::MultiFab* yheat_flux,
567 amrex::MultiFab* zheat_flux,
568 amrex::MultiFab* xqv_flux,
569 amrex::MultiFab* yqv_flux,
570 amrex::MultiFab* zqv_flux,
571 const FluxCalc& flux_comp);
574 amrex::MultiFab& cons_in);
580 const amrex::MultiFab& cons_in,
581 const std::unique_ptr<amrex::MultiFab>& z_phys_nd);
587 amrex::Vector<amrex::Vector<amrex::MultiFab>>& vars,
588 amrex::MultiFab* z_phys_cc,
591 template <
typename PBLHeightEstimator>
593 amrex::Vector<amrex::Vector<amrex::MultiFab>>& vars,
594 amrex::MultiFab* z_phys_cc,
595 const PBLHeightEstimator& est,
599 const std::string& fname);
607 int nlevs =
static_cast<int>(
m_geom.size());
608 for (
int lev = 0; lev < nlevs; lev++) {
610 amrex::Print() <<
"Surface temp at t=" << time <<
": "
617 amrex::Vector<amrex::Vector<amrex::MultiFab>>& vars_old,
618 amrex::Vector<std::unique_ptr<amrex::MultiFab>>& Theta_prim,
619 amrex::Vector<std::unique_ptr<amrex::MultiFab>>& Qv_prim,
620 amrex::Vector<std::unique_ptr<amrex::MultiFab>>& Qr_prim)
652 amrex::MultiFab*
get_z0 (
const int& lev) {
return &
z_0[lev]; }
661 int lmask_min = amrex::ReduceMin(lmask, nghost, [=] AMREX_GPU_HOST_DEVICE(
662 amrex::Box
const& bx, amrex::Array4<int const>
const& lm_arr) ->
int
664 int locmin = std::numeric_limits<int>::max();
665 const auto lo = lbound(bx);
666 const auto hi = ubound(bx);
667 for (
int j = lo.y; j <= hi.y; ++j) {
668 for (
int i = lo.x; i <= hi.x; ++i) {
669 locmin = std::min(locmin, lm_arr(i, j, 0));
749 amrex::Vector<amrex::MultiFab>
z_0;
770 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
u_star;
771 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
w_star;
772 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
t_star;
773 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
q_star;
774 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
olen;
775 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
pblh;
776 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
t_surf;
777 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
q_surf;
783 amrex::Vector<amrex::Vector<amrex::MultiFab*>>
m_sst_lev;
784 amrex::Vector<amrex::Vector<amrex::MultiFab*>>
m_tsk_lev;
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
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
amrex::MultiFab * get_zref(const int &lev) const
Definition: ERF_MOSTAverage.H:116
const amrex::MultiFab * get_average(const int &lev, const int &comp) const
Definition: ERF_MOSTAverage.H:113
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:279
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:90
Definition: ERF_SurfaceLayer.H:34
ThetaCalcType theta_type
Definition: ERF_SurfaceLayer.H:718
int lmask_min_reduce(amrex::iMultiFab &lmask, const int &nghost)
Definition: ERF_SurfaceLayer.H:658
amrex::Vector< std::string > m_lsm_data_name
Definition: ERF_SurfaceLayer.H:788
bool m_include_wstar
Definition: ERF_SurfaceLayer.H:732
bool specified_rho_surf
Definition: ERF_SurfaceLayer.H:745
void set_q_surf(const int &lev, const amrex::Real qsurf)
Definition: ERF_SurfaceLayer.H:646
bool m_rotate
Definition: ERF_SurfaceLayer.H:727
PBLHeightCalcType pblh_type
Definition: ERF_SurfaceLayer.H:722
amrex::Vector< amrex::Vector< amrex::iMultiFab * > > m_lmask_lev
Definition: ERF_SurfaceLayer.H:785
amrex::iMultiFab * get_lmask(const int &lev)
Definition: ERF_SurfaceLayer.H:656
bool use_moisture
Definition: ERF_SurfaceLayer.H:755
amrex::MultiFab * get_q_surf(const int &lev)
Definition: ERF_SurfaceLayer.H:645
bool m_has_lsm_tsurf
Definition: ERF_SurfaceLayer.H:757
amrex::MultiFab * get_w_star(const int &lev)
Definition: ERF_SurfaceLayer.H:627
void update_surf_temp(const amrex::Real &time)
Definition: ERF_SurfaceLayer.H:601
amrex::Real m_Cq
Definition: ERF_SurfaceLayer.H:763
amrex::Vector< const eb_ * > m_eb_vec
Definition: ERF_SurfaceLayer.H:767
RoughCalcType rough_type_land
Definition: ERF_SurfaceLayer.H:720
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:1177
amrex::Vector< std::unique_ptr< amrex::MultiFab > > t_surf
Definition: ERF_SurfaceLayer.H:776
amrex::Real z0_const
Definition: ERF_SurfaceLayer.H:733
amrex::Vector< std::unique_ptr< amrex::MultiFab > > surface_diagnostic_source
Definition: ERF_SurfaceLayer.H:781
amrex::Real cnk_a
Definition: ERF_SurfaceLayer.H:746
amrex::Real m_Ch
Definition: ERF_SurfaceLayer.H:762
amrex::Real m_start_low_time
Definition: ERF_SurfaceLayer.H:728
amrex::Real surf_temp
Definition: ERF_SurfaceLayer.H:735
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:616
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:773
int m_lsm_tsurf_indx
Definition: ERF_SurfaceLayer.H:759
amrex::Real rico_qsat_z0
Definition: ERF_SurfaceLayer.H:753
bool m_has_lsm_fluxes
Definition: ERF_SurfaceLayer.H:756
bool m_update_k_rans
Definition: ERF_SurfaceLayer.H:794
amrex::Vector< amrex::MultiFab * > m_Lwave_lev
Definition: ERF_SurfaceLayer.H:791
void update_fluxes(const int &lev, const amrex::Real &elapsed_time, const amrex::Real &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:12
void get_lsm_tsurf(const int &lev)
Definition: ERF_SurfaceLayer.cpp:1139
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:1096
amrex::Real get_zref(const int &lev)
Definition: ERF_SurfaceLayer.H:650
amrex::MultiFab * get_olen(const int &lev)
Definition: ERF_SurfaceLayer.H:633
amrex::Vector< amrex::MultiFab > z_0
Definition: ERF_SurfaceLayer.H:749
amrex::Real surf_moist_flux
Definition: ERF_SurfaceLayer.H:740
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:721
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:1204
amrex::Real surf_moist
Definition: ERF_SurfaceLayer.H:739
amrex::Vector< std::unique_ptr< amrex::MultiFab > > w_star
Definition: ERF_SurfaceLayer.H:771
bool m_ignore_sst
Definition: ERF_SurfaceLayer.H:765
amrex::MultiFab * get_u_star(const int &lev)
Definition: ERF_SurfaceLayer.H:625
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, amrex::Real start_low_time, amrex::Real final_low_time, amrex::Real low_time_interval=zero, const amrex::Vector< const eb_ * > &eb_vec={})
Definition: ERF_SurfaceLayer.H:38
void compute_fluxes(const int &lev, const int &max_iters, amrex::MultiFab &cons_in, const FluxIter &most_flux, bool is_land)
amrex::Vector< amrex::Vector< amrex::MultiFab * > > m_lsm_data_lev
Definition: ERF_SurfaceLayer.H:786
void set_t_surf(const int &lev, const amrex::Real tsurf)
Definition: ERF_SurfaceLayer.H:643
amrex::Real custom_qstar
Definition: ERF_SurfaceLayer.H:743
amrex::Vector< std::unique_ptr< amrex::MultiFab > > u_star
Definition: ERF_SurfaceLayer.H:770
void update_tsk_ptr(const int lev, const int itime, amrex::MultiFab *tsk_ptr)
Definition: ERF_SurfaceLayer.H:682
amrex::Real custom_rhosurf
Definition: ERF_SurfaceLayer.H:744
amrex::Vector< std::unique_ptr< amrex::MultiFab > > q_surf
Definition: ERF_SurfaceLayer.H:777
amrex::Vector< amrex::Vector< amrex::MultiFab * > > m_sst_lev
Definition: ERF_SurfaceLayer.H:783
FluxCalcType
Definition: ERF_SurfaceLayer.H:686
@ 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:701
@ SURFACE_MOISTURE
Surface Qv specified.
@ MOISTURE_FLUX
Qv-flux specified.
amrex::Real depth
Definition: ERF_SurfaceLayer.H:748
amrex::Vector< amrex::MultiFab * > m_Hwave_lev
Definition: ERF_SurfaceLayer.H:790
amrex::Real default_land_surf_moist
Definition: ERF_SurfaceLayer.H:738
bool m_var_z0
Definition: ERF_SurfaceLayer.H:750
amrex::MultiFab * get_surface_diagnostic_source(const int &lev)
Definition: ERF_SurfaceLayer.H:648
amrex::MultiFab * get_t_star(const int &lev)
Definition: ERF_SurfaceLayer.H:629
bool have_variable_sea_roughness()
Definition: ERF_SurfaceLayer.H:654
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:447
amrex::MultiFab * get_q_star(const int &lev)
Definition: ERF_SurfaceLayer.H:631
amrex::Vector< amrex::Vector< amrex::MultiFab * > > m_lsm_flux_lev
Definition: ERF_SurfaceLayer.H:787
PBLHeightCalcType
Definition: ERF_SurfaceLayer.H:715
amrex::MultiFab * get_pblh(const int &lev)
Definition: ERF_SurfaceLayer.H:635
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:752
void fill_tsurf_with_sst_and_tsk(const int &lev, const amrex::Real &time)
Definition: ERF_SurfaceLayer.cpp:1009
amrex::Real surf_temp_flux
Definition: ERF_SurfaceLayer.H:737
amrex::Vector< amrex::Geometry > m_geom
Definition: ERF_SurfaceLayer.H:726
amrex::Vector< std::unique_ptr< amrex::MultiFab > > t_star
Definition: ERF_SurfaceLayer.H:772
amrex::Real theta_ref
Definition: ERF_SurfaceLayer.H:796
amrex::MultiFab * get_z0(const int &lev)
Definition: ERF_SurfaceLayer.H:652
amrex::Vector< amrex::Vector< amrex::MultiFab * > > m_tsk_lev
Definition: ERF_SurfaceLayer.H:784
amrex::Real custom_tstar
Definition: ERF_SurfaceLayer.H:742
amrex::Real m_final_low_time
Definition: ERF_SurfaceLayer.H:729
bool cnk_visc
Definition: ERF_SurfaceLayer.H:747
amrex::Real surf_heating_rate
Definition: ERF_SurfaceLayer.H:736
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:275
bool m_has_ocean_lsm_tsurf
Definition: ERF_SurfaceLayer.H:758
RoughCalcType
Definition: ERF_SurfaceLayer.H:707
FluxCalcType flux_type
Definition: ERF_SurfaceLayer.H:717
MoistCalcType moist_type
Definition: ERF_SurfaceLayer.H:719
void compute_sfc_params_from_lsm_fluxes(const int &lev, amrex::MultiFab &cons_in)
Definition: ERF_SurfaceLayer.cpp:940
amrex::Real inv_Cmu2
Definition: ERF_SurfaceLayer.H:795
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:387
amrex::Vector< amrex::MultiFab * > m_eddyDiffs_lev
Definition: ERF_SurfaceLayer.H:792
const amrex::MultiFab * get_mac_avg(const int &lev, int comp)
Definition: ERF_SurfaceLayer.H:637
void update_sst_ptr(const int lev, const int itime, amrex::MultiFab *sst_ptr)
Definition: ERF_SurfaceLayer.H:678
amrex::Real custom_ustar
Definition: ERF_SurfaceLayer.H:741
amrex::Vector< std::unique_ptr< amrex::MultiFab > > olen
Definition: ERF_SurfaceLayer.H:774
amrex::MultiFab * get_t_surf(const int &lev)
Definition: ERF_SurfaceLayer.H:642
amrex::Real m_Cd
Definition: ERF_SurfaceLayer.H:761
amrex::Vector< std::unique_ptr< amrex::MultiFab > > pblh
Definition: ERF_SurfaceLayer.H:775
amrex::Real default_land_surf_temp
Definition: ERF_SurfaceLayer.H:734
ThetaCalcType
Definition: ERF_SurfaceLayer.H:695
@ 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:1273
TerrainType m_terrain_type
Definition: ERF_SurfaceLayer.H:768
amrex::Vector< std::string > m_lsm_flux_name
Definition: ERF_SurfaceLayer.H:789
amrex::Real m_low_time_interval
Definition: ERF_SurfaceLayer.H:730
MOSTAverage m_ma
Definition: ERF_SurfaceLayer.H:769
@ ng
Definition: ERF_Morrison.H:48
@ cons
Definition: ERF_IndexDefines.H:174
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:35
Definition: ERF_DataStruct.H:106
Definition: ERF_TurbStruct.H:82
RANSType rans_type
Definition: ERF_TurbStruct.H:473
bool dirichlet_k
Definition: ERF_TurbStruct.H:475
amrex::Real Cmu0
Definition: ERF_TurbStruct.H:451
amrex::Real theta_ref
Definition: ERF_TurbStruct.H:462