ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_SLM.H
Go to the documentation of this file.
1 #ifndef ERF_SLM_H
2 #define ERF_SLM_H
3 
4 #include <string>
5 #include <vector>
6 #include <memory>
7 #include <ctime>
8 
9 #include <AMReX_FArrayBox.H>
10 #include <AMReX_Geometry.H>
11 #include <AMReX_MultiFabUtil.H>
12 #include <AMReX_iMultiFab.H>
13 #include <AMReX_TableData.H>
14 #include <AMReX_ParmParse.H>
15 
16 #include <ERF_NullSurf.H>
17 #include <ERF_IndexDefines.H>
18 #include <ERF_DataStruct.H>
19 #include <ERF_TerrainMetrics.H>
20 #include <ERF_LSM_Types.H>
21 
22 #include <ERF_NCInterface.H>
23 
24 namespace LsmVar_SLM {
25  enum {
26  // independent variables
27  tsurf = 0, // surface temperature
28  ustar, // ustar for MOST
29  tstar, // tstar for MOST
30  qstar, // qstar for MOST
31  // inputs from ERF
32  tref, // temperature at reference level
33  qref, // specific humidity at ref
34  pref, // pressure at reference level
35  dref, // density at reference level
36  uref, // zonal wind speed at ref
37  vref, // meridional wind speed at ref
38  precipref, // precipitation rate at ref
39  swdsvisxyref, // downwelling SW radiation, direct visible flux
40  swdsnirxyref, // downwelling SW radiation, direct near-IR flux
41  swdsvisdxyref, // downwelling SW radiation, diffuse visible flux
42  swdsnirdxyref, // downwelling SW radiation, diffuse near-IR flux
43  lwref, // downwelling LW radiation
44  coszrsxy, // zenith angle
45  // model variables
46  tv, // vegetation temperature
47  mv, // vegetation moisture storage
48  soilt, // soil temperature
49  soilw, // soil wetness
50  // soil parameters
51  sand, // sand percentage
52  clay, // clay percentage
53  s_depth, // thickness of each soil layer in meters
54  node_z, // depth of the center of each soil layer
55  interface_z, // depth of the soil layer interface
56  soilw_nudge, // nudging of soilw
57  soilt_nudge, // nudging of soilt
58  sw_over_sat, // soilw over saturation
59  soil_relax_hgt, // depth dependent soil relaxation function
62  // vegetation
63  soil_transp_frac,// normalized fraction of transpiration extracted from each soil layer
64  w_s_FC, // wetness at field capacity
65  w_s_WP, // wetness at wilting point
66  // soil parameters calculated from sand/clay
67  sst_capa, // heat capacity for soil solids
68  sst_cond, // heat conductivity of soil solids
69  poro_soil, // saturation moisture content, porosity
70  theta_FC, // volumetric moisture content at field capacity
71  theta_WP, // volumetric moisture content at wilting point
72  m_pot_sat, // moisture potential at saturation
73  Bconst, // B constant
74  ks, // hydraulic conductivity at saturation [m/s]
75  // 2D inputs populated from WRFInput
76  lai, // leaf area index (2D)
77  vegtype, // vegetation type (2D)
78  soiltype, // soil type (2D)
79  veg_frac, // vegetation fraction
80  veg_frac_min, // yearly min vegetation fraction
81  veg_frac_max, // yearly max vegetation fraction
82  // model outputs
83  flbu, // surface u-momentum
84  flbv, // surface v-momentum
85  flbq, // surface vapor flux (latent heat flux)
86  flbt, // surface heat flux
87  prsfc, // precipitation rate reaching soil
88  emis_sfc, // IR emissivity of surface (veg+soil)
89  alb_nir_sfc, // NIR albedo of surface (veg+soil)
90  alb_vis_sfc, // VIS albedo of surface (veg+soil)
91  alb_nir_sfc_diff,// NIR albedo of surface (veg+soil), diffuse beam
92  alb_vis_sfc_diff,// VIS albedo of surface (veg+soil), diffuse beam
93  NumVars
94  };
95 }
96 
97 namespace LsmFlux_SLM {
98  enum {
99  // 2D SurfaceLayer flux vars
100  t_flux = 0,
104  olen, // Obukhov length for MOST/PBL
105  NumVars
106  };
107 }
108 
109 namespace SLM_NetRad {
110  enum {
127  NumVars
128  };
129 }
130 
131 namespace SLM_Diag {
132  enum {
133  precip = 0,
135  precip_sfc, // saved in prsfc too, but 3D
141  NumVars
142  };
143 }
144 
145 // refers to device variables used in soil temperature and moisture update
146 namespace SLM_DST {
147  enum {
153  NumVars
154  };
155 }
156 namespace SLM_DSW {
157  enum {
164  NumVars
165  };
166 }
167 
168 using SLMParameterTable = std::unordered_map<std::string, amrex::Vector<std::pair<std::string, amrex::Vector<amrex::Real>>>>;
169 
170 /**
171  * The Simplified Land-surface Model (SLM) supplies lower-boundary
172  * sensible-heat, latent-heat, and momentum fluxes for land cells.
173  *
174  * The original formulation and evaluation of SLM are documented in Lee and
175  * Khairoutdinov (2015), "A Simplified Land Model (SLM) for use in
176  * cloud-resolving models: Formulation and evaluation," Journal of Advances
177  * in Modeling Earth Systems, 7, 1368--1392,
178  * https://doi.org/10.1002/2014MS000419.
179  *
180  * SLM includes selected formulations adapted from NoahMP, updates inherited
181  * from gSAM-SLM, and SLM-specific corrections to the surface energy and water
182  * budgets. It remains a simplified land model and is not a complete
183  * implementation of NoahMP.
184  */
185 class SLM : public NullSurf {
186 
187  using FabPtr = std::shared_ptr<amrex::MultiFab>;
188 
189 public:
190  using NullSurf::Init;
191 
192  // Constructor
193  SLM () {}
194 
195  // Destructor
196  virtual ~SLM () = default;
197 
198  // Set thermo and grid properties
199  void
200  Define (SolverChoice& sc) override
201  {
202  // SLM exchanges water vapor with the atmosphere unconditionally: Copy_State_to_Lsm
203  // reads RhoQ1_comp out of the state and Copy_Lsm_to_State writes it back. Without a
204  // moisture model that component is not part of the state, so those accesses run off
205  // the end of the conserved-variable FAB.
208  "The SLM land surface model requires a moisture model: it exchanges water vapor "
209  "with the atmospheric state, which has no RhoQ1 component when "
210  "erf.moisture_model = None. Set erf.moisture_model, "
211  "or choose a different erf.land_surface_model.");
212 
214 
215  // Where the initial data come from, which can supply the soil layers (see Init)
216  m_init_type = sc.init_type;
217 
218  // Check if initializing from WRFInput, or from metgrid files, for which ERF builds
219  // the same fields real.exe writes to wrfinput (ERF::init_lsm_from_metgrid)
220  if (sc.init_type == InitType::WRFInput || sc.init_type == InitType::Metgrid) {
221  amrex::Print() << " SLM is initializing from "
222  << ((sc.init_type == InitType::WRFInput) ? "WRFInput" : "metgrid")
223  << " data!" << std::endl;
224  use_wrfinput = true;
225  } else {
226  use_wrfinput = false;
227  }
228  }
229 
230  // Initialize data structures
231  void
232  Init (const int& /*lev*/,
233  const amrex::MultiFab& cons_in,
234  const amrex::MultiFab& u_in,
235  const amrex::MultiFab& v_in,
236  const amrex::Geometry& geom,
237  const amrex::Geometry& geom0,
238  amrex::Vector<amrex::BCRec>& domain_bcs_type,
239  amrex::IntVect& refRatio,
240  const amrex::Real& dt,
241  std::unique_ptr<amrex::MultiFab>& z_phys_nd_in,
242  amrex::Vector<amrex::Vector<std::string>>& nc_init_file) override;
243 
244  /**
245  * Rebuilds SLM arrays on a remade atmospheric grid and transfers state.
246  */
247  void
248  Lsm_Regrid_Level (const int& lev,
249  const amrex::MultiFab& cons_in,
250  const amrex::MultiFab& u_in,
251  const amrex::MultiFab& v_in,
252  const amrex::Geometry& geom,
253  const amrex::Geometry& geom0,
254  amrex::Vector<amrex::BCRec>& domain_bcs_type,
255  amrex::IntVect& refRatio,
256  const amrex::Real& dt,
257  std::unique_ptr<amrex::MultiFab>& z_phys_nd_in,
258  amrex::Vector<amrex::Vector<std::string>>& nc_init_file,
259  const amrex::Geometry& source_geom,
260  const amrex::Geometry& source_lsm_geom,
261  const amrex::IntVect& source_ref_ratio,
262  const bool has_source) override;
263 
264  // Wrapper to do all the updating
265  void
266  Advance (const double& dt) override
267  {
268  Advance(static_cast<amrex::Real>(dt), time + static_cast<amrex::Real>(dt), start_time);
269  }
270 
271  void
272  Advance (const amrex::Real& dt,
273  const amrex::Real& t_new,
274  const amrex::Real& t_start) override
275  {
276  m_updated = false;
277  m_dt = dt;
278  time = t_new;
279  start_time = t_start;
280 
281  if (first_step)
282  {
283  first_step = false;
284 
286  this->init_wrfinput_vars();
287  }
288 
290  }
291 
292  this->AdvanceSLM();
293  m_updated = true;
294 
295  }
296 
297  // Advance the lsm state vars
298  void
299  AdvanceSLM ();
300 
301  // Get state vars from lsm class
302  amrex::MultiFab*
303  Lsm_Data_Ptr (const int& varIdx) override
304  {
305  AMREX_ALWAYS_ASSERT(varIdx < SLM::m_lsm_data_size && varIdx >= 0);
306  int lsmIdx = LsmDataMap[varIdx];
307  AMREX_ALWAYS_ASSERT(lsmIdx < LsmVar_SLM::NumVars && lsmIdx>=0);
308  return lsm_fab_vars[lsmIdx].get();
309  }
310 
311  // Get flux vars from lsm class
312  amrex::MultiFab*
313  Lsm_Flux_Ptr (const int& varIdx) override
314  {
315  AMREX_ALWAYS_ASSERT(varIdx < SLM::m_lsm_flux_size && varIdx >= 0);
316  int lsmIdx = LsmFluxMap[varIdx];
317  AMREX_ALWAYS_ASSERT(lsmIdx < LsmFlux_SLM::NumVars && lsmIdx>=0);
318  return lsm_fab_flux[lsmIdx].get();
319  }
320 
321  // Get lsm geometry
322  amrex::Geometry
323  Lsm_Geom ( ) override { return m_lsm_geom; }
324 
325  /**
326  * Returns the atmospheric geometry used by SLM coupling fields.
327  */
328  amrex::Geometry
329  Lsm_Atmos_Geom () override { return m_geom; }
330 
331  /**
332  * Registers an exposed source data field.
333  */
334  void
335  Lsm_Set_Source_Data_Ptr (const int& varIdx,
336  amrex::MultiFab* source_data_ptr) override
337  {
338  AMREX_ALWAYS_ASSERT(varIdx >= 0 && varIdx < m_lsm_data_size);
339  if (static_cast<int>(source_data.size()) != m_lsm_data_size) {
340  source_data.resize(m_lsm_data_size, nullptr);
341  }
342  source_data[varIdx] = source_data_ptr;
343  }
344 
345  /**
346  * Registers an exposed source flux field.
347  */
348  void
349  Lsm_Set_Source_Flux_Ptr (const int& varIdx,
350  amrex::MultiFab* source_flux_ptr) override
351  {
352  AMREX_ALWAYS_ASSERT(varIdx >= 0 && varIdx < m_lsm_flux_size);
353  if (static_cast<int>(source_flux.size()) != m_lsm_flux_size) {
354  source_flux.resize(m_lsm_flux_size, nullptr);
355  }
356  source_flux[varIdx] = source_flux_ptr;
357  }
358 
359  /**
360  * Returns the number of private SLM state fields.
361  */
362  int
363  Lsm_Unmapped_Size () override { return static_cast<int>(unmapped_fields.size()); }
364 
365  /**
366  * Returns a private SLM state field.
367  */
368  amrex::MultiFab*
369  Lsm_Unmapped_Ptr (const int& varIdx) override
370  {
371  AMREX_ALWAYS_ASSERT(varIdx >= 0 && varIdx < static_cast<int>(unmapped_fields.size()));
372  return lsm_fab_vars[unmapped_fields[varIdx]].get();
373  }
374 
375  /**
376  * Registers a private source SLM state field.
377  */
378  void
379  Lsm_Set_Source_Unmapped_Ptr (const int& varIdx,
380  amrex::MultiFab* source_data_ptr) override
381  {
382  AMREX_ALWAYS_ASSERT(varIdx >= 0 && varIdx < static_cast<int>(unmapped_fields.size()));
383  if (source_unmapped.size() != unmapped_fields.size()) {
384  source_unmapped.resize(unmapped_fields.size(), nullptr);
385  }
386  source_unmapped[varIdx] = source_data_ptr;
387  }
388 
389  /**
390  * Returns whether Copy_State_to_Lsm has filled tref, qref and pref.
391  */
392  bool
393  Lsm_Has_Atmos_State () override { return has_atmos_state; }
394 
395  /**
396  * Registers whether the source level's tref, qref and pref have been filled.
397  */
398  void
399  Lsm_Set_Source_Has_Atmos_State (bool source_has_atmos) override
400  {
401  source_has_atmos_state = source_has_atmos;
402  }
403 
404  /**
405  * Transfers exposed state from a source AMR level.
406  */
407  void
408  Lsm_Interpolate_From_Source (const amrex::Geometry& source_geom,
409  const amrex::Geometry& source_lsm_geom,
410  const amrex::IntVect& ref_ratio,
411  LSMTransferMode mode) override;
412 
413  // Get number of vars lsm class contains
414  int
415  Lsm_Data_Size () override { return SLM::m_lsm_data_size; }
416 
417  // Get number of vars lsm class contains
418  int
419  Lsm_Flux_Size () override { return SLM::m_lsm_flux_size; }
420 
421  // Get variable names
422  std::string
423  Lsm_DataName (const int& varIdx) override
424  {
425  AMREX_ALWAYS_ASSERT(varIdx < SLM::m_lsm_data_size && varIdx >= 0);
426  return LsmDataName[varIdx];
427  }
428 
429  int
430  Lsm_DataIndex (const std::string &varname) override
431  {
432  int varIdx = -1;
433  std::string lc_varname = amrex::toLower(varname);
434  for (int idx(0); idx<SLM::m_lsm_data_size; ++idx) {
435  if (lc_varname == amrex::toLower(Lsm_DataName(idx))) {
436  varIdx = idx;
437  }
438  }
439  AMREX_ASSERT(varIdx != -1); // no name found
440  return varIdx;
441  }
442 
443  // Get flux variable names
444  std::string
445  Lsm_FluxName (const int& varIdx) override
446  {
447  AMREX_ALWAYS_ASSERT(varIdx < SLM::m_lsm_flux_size && varIdx >= 0);
448  return LsmFluxName[varIdx];
449  }
450 
451  int
452  Lsm_FluxIndex (const std::string &varname) override
453  {
454  int varIdx = -1;
455  std::string lc_varname = amrex::toLower(varname);
456  for (int idx(0); idx<SLM::m_lsm_flux_size; ++idx) {
457  if (lc_varname == amrex::toLower(Lsm_FluxName(idx))) {
458  varIdx = idx;
459  }
460  }
461  AMREX_ALWAYS_ASSERT(varIdx != -1); // no name found
462  return varIdx;
463  }
464 
465  std::unordered_map<std::string, std::string>&
466  Lsm_WRFInputNames () override {
467  return SLM::wrfinput_map;
468  }
469 
470  void
471  Copy_State_to_Lsm (const amrex::MultiFab& cons_in, const amrex::MultiFab& u_in, const amrex::MultiFab& v_in) override;
472 
473  void
474  Copy_Lsm_to_State (amrex::MultiFab& cons_in) override;
475 
476  void
477  Update_Lsm_Vars (amrex::MultiFab& cons_in, amrex::MultiFab& u_in, amrex::MultiFab& v_in) override
478  {
479  this->Copy_State_to_Lsm(cons_in, u_in, v_in);
480  if (first_step) {
482  this->init_wrfinput_vars();
483  } else if (!use_wrfinput) {
484  this->init_slm_vars();
485  }
486  } else if (init_from_atmos_pending) {
487  // This level was made from a source level whose reference-level fields
488  // had not been filled yet, so t_canop, t_cas and q_cas were set from
489  // zeros; set them again now that tref, qref and pref hold the state.
490  this->init_slm_vars();
491  }
492  init_from_atmos_pending = false;
493  }
494 
495  bool Get_Update_Status () override { return m_updated; }
496 
497  void
498  Update_State_Vars (amrex::MultiFab& cons_in) override
499  {
500  this->Copy_Lsm_to_State(cons_in);
501  }
502 
503  void
504  set_precip_input (const amrex::MultiFab* precip_in) override;
505 
506  void
507  set_terrain_inputs (const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& sst_in,
508  const amrex::Vector<std::unique_ptr<amrex::iMultiFab>>& lmask_in) override;
509 
510  int Lsm_Type () override
511  {
512  return LSM_Type::SLM;
513  }
514 
515  void writeSLM_Data (const PlotFileType plotfile_type, const amrex::Real cur_time, const std::string plot_prefix, const int level_step, const int lev, const int finest_lev, amrex::MultiFab &fab, amrex::Geometry &geom, amrex::Vector<std::string> &varnames);
516 
517  void init_from_inputs ();
518 
519  void slm_init ();
520 
521  void init_layer_depths ();
522 
523  void init_soil_vars ();
524 
525  void init_landtype ();
526 
527  void init_soil_tw ();
528 
529  void init_slm_vars ();
530 
531  /**
532  * Initializes local SLM fields from WRFInput data.
533  */
534  void init_wrfinput_vars ();
535 
536  /**
537  * Initializes diagnostics and radiation coupling fields from the SLM state.
538  */
540 
541  /**
542  * Rebuilds restart fields that can be derived from the checkpoint state.
543  */
544  void rebuild_restart_fields ();
545 
546  SLMParameterTable ReadParameterFile (const std::string &filename, amrex::Vector<std::string> &veg_categories, amrex::Vector<std::string> &soil_categories);
547 
548  /**
549  * Validates the selected Noah-MP parameter blocks before copying them to the device.
550  */
552 
553  void init_from_params ();
554 
555  /**
556  * Loads built-in Noah-MP radiation lookup values for idealized SLM cases.
557  */
559 
560  void UpdateLAI (const amrex::MFIter &mfi);
561 
562  void UpdateLAIParameters (const amrex::MFIter &mfi);
563 
564  // NOAHMP radiation functions
565  void radiation_noahmp (const amrex::MFIter &mfi);
566 
567  void albedo_noahmp (const amrex::MFIter &mfi, int i, int j,
568  amrex::Real dt, amrex::Real cosz, amrex::Real snowh, amrex::Real fsno,
569  amrex::Real fwet, amrex::Real sneqvo, amrex::Real sneqv, amrex::Real qsnow,
571  const amrex::Real* smc, int nsoil, amrex::Real fveg,
572  amrex::Real& albold, amrex::Real& tauss,
573  amrex::Real* albgrd, amrex::Real* albgri, amrex::Real* albd, amrex::Real* albi,
574  amrex::Real* fabd, amrex::Real* fabi, amrex::Real* ftdd, amrex::Real* ftid, amrex::Real* ftii,
575  amrex::Real& fsun, amrex::Real* frevd, amrex::Real* frevi,
576  amrex::Real* fregd, amrex::Real* fregi, amrex::Real& bgap, amrex::Real& wgap,
577  amrex::Real* albsnd, amrex::Real* albsni);
578 
579  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
580  static void surrad_noahmp (amrex::Real mpe, amrex::Real fsun, amrex::Real fsha, amrex::Real elai, amrex::Real vai,
581  amrex::Real laisun, amrex::Real laisha, const amrex::Real* solad, const amrex::Real* solai,
582  const amrex::Real* fabd, const amrex::Real* fabi, const amrex::Real* ftdd,
583  const amrex::Real* ftid, const amrex::Real* ftii, const amrex::Real* albgrd,
584  const amrex::Real* albgri, const amrex::Real* albd, const amrex::Real* albi,
585  const amrex::Real* frevd, const amrex::Real* frevi, const amrex::Real* fregd, const amrex::Real* fregi,
586  amrex::Real& parsun, amrex::Real& parsha, amrex::Real& sav, amrex::Real& sag,
587  amrex::Real& fsa, amrex::Real& fsr, amrex::Real& fsrv, amrex::Real& fsrg);
588 
589  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
590  static void snow_age_noahmp (amrex::Real dt, amrex::Real tg, amrex::Real sneqvo, amrex::Real sneqv,
591  amrex::Real tau0, amrex::Real grain_growth, amrex::Real extra_growth,
592  amrex::Real dirt_soot, amrex::Real swemx,
593  amrex::Real& tauss, amrex::Real& fage);
594 
595  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
596  static void snowalb_bats_noahmp (int nband, amrex::Real fsno, amrex::Real cosz, amrex::Real fage,
597  amrex::Real bats_cosz, amrex::Real bats_vis_new, amrex::Real bats_nir_new,
598  amrex::Real bats_vis_age, amrex::Real bats_nir_age,
599  amrex::Real bats_vis_dir, amrex::Real bats_nir_dir,
600  amrex::Real* albsnd, amrex::Real* albsni);
601 
602  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
603  static void groundalb_noahmp (int nsoil, int nband, int ice, int ist, amrex::Real fsno,
604  const amrex::Real* smc, const amrex::Real* albsnd, const amrex::Real* albsni,
605  amrex::Real cosz, amrex::Real tg,
606  const amrex::Real* albsat, const amrex::Real* albdry, const amrex::Real* alblak,
607  amrex::Real* albgrd, amrex::Real* albgri);
608 
609  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
610  static void twostream_noahmp (int ib, int ic, int vegtyp, amrex::Real cosz, amrex::Real vai,
611  amrex::Real fwet, amrex::Real t, const amrex::Real* albgrd, const amrex::Real* albgri,
612  const amrex::Real* rho, const amrex::Real* tau, amrex::Real fveg, int ist,
613  amrex::Real xl, amrex::Real omegas_param, amrex::Real betads, amrex::Real betais,
615  amrex::Real* fab, amrex::Real* fre, amrex::Real* ftd, amrex::Real* fti,
616  amrex::Real& gdir, amrex::Real* frev, amrex::Real* freg,
617  amrex::Real& bgap, amrex::Real& wgap,
618  amrex::Real& xl_out, amrex::Real& chil_out, amrex::Real& phi1_out, amrex::Real& phi2_out);
619 
620  void transfer_coeff (const amrex::MFIter &mfi);
621 
622  void resistances (const amrex::MFIter &mfi);
623 
624  void fluxes_canopy (const amrex::MFIter &mfi);
625 
626  void solve_ground_skin_temperature (const amrex::MFIter &mfi);
627 
628  void soil_water (const amrex::MFIter &mfi);
629 
630  void soil_temperature (const amrex::MFIter &mfi);
631 
632  void soil_nudging (const amrex::MFIter &mfi3d);
633 
634  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
635  static amrex::Real fh_calc (const amrex::Real &t, const amrex::Real &mps,
636  const amrex::Real &sw, const amrex::Real &B);
637 
638  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
639  static amrex::Real linear_interp (const amrex::Real t0, const amrex::Real t1,
640  const amrex::Real t, const amrex::Real x,
641  const amrex::Real y);
642 
643 #ifdef ERF_USE_NETCDF
644  void writeSLM_NetCDF (const amrex::MultiFab& mf, const amrex::Vector<std::string>& varnames,
645  const amrex::Real cur_time, const std::string plot_prefix, const int level_step);
646 
647  void writeNCHeader (ncutils::NCFile &nc_file, const amrex::Geometry &geom);
648 
649  void writeMFtoNC (ncutils::NCFile &nc_file, const amrex::MultiFab* mf,
650  const std::string name, amrex::Real cur_time, bool write_ghost = false);
651 
652  void writeMFVecToNC (ncutils::NCFile &nc_file,
653  const amrex::Vector<const amrex::MultiFab*> &mf_vec,
654  const amrex::Vector<std::string> &mf_names,
655  const amrex::Geometry& geom) const;
656 #endif
657 
658  void set_dt (const amrex::Real &dt) {
659  m_dt = dt;
660  }
661 
662  const amrex::Vector<const amrex::MultiFab*> &export_to_RRTMGP ()
663  {
664  return slm_to_rad_vars;
665  }
666 
667  std::unordered_map<std::string, std::string>& get_rad_output_map ()
668  {
669  return rad_output_map;
670  }
671 
672  const std::vector<amrex::Real>& get_soil_dz () const { return m_dz_lsm; }
673 
674  // utility to skip to next line in Header
675  // -- taken from ERF_Checkpoint
676  static void GotoNextLine (std::istream& is);
677 
678  void WriteCheckpoint (const int &lev, const std::string &checkpointname) const override;
679 
680  void ReadCheckpoint (const int &lev, const std::string &checkpointname) override;
681 
682  /**
683  * Initializes the canopy-adjusted reference height on the current grid.
684  */
685  void initialize_zrefxy ();
686 
687  /**
688  * Rebuilds SLM-local fields after transferring an evolved state.
689  */
690  void initialize_processed_state (const bool preserve_checkpoint_fields = false);
691 
692 private:
693  // number of lsm variables (theta)
694  int m_lsm_data_size = 44;
695 
696  // number of flux variables (qflux, tflux, uflux, vflux)
698 
699  // LsmVar map (state indices -> LsmVar enum)
700  amrex::Vector<int> LsmDataMap;
701  amrex::Vector<int> LsmFluxMap;
702 
703  // Lsm varnames
704  amrex::Vector<std::string> LsmDataName;
705  amrex::Vector<std::string> LsmFluxName;
706 
707  // geometry for atmosphere
708  amrex::Geometry m_geom;
709 
710  // geometry for atmospheric level 0
711  amrex::Geometry m_geom0;
712 
713  // geometry for lsm
714  amrex::Geometry m_lsm_geom;
715 
716  // geometry for the level-0 soil grid
717  amrex::Geometry m_lsm_geom0;
718 
719  // domain boundary conditions used by interpolation
720  amrex::Vector<amrex::BCRec> m_domain_bcs_type;
721 
722  amrex::BoxArray ba_lsm_2d;
723 
724  // timestep
726 
727  // domain klo-1 or lsm khi
728  int khi_lsm;
729 
730  int klo_lsm;
731 
732  // independent variables
733  amrex::Array<FabPtr, LsmVar_SLM::NumVars> lsm_fab_vars;
734 
735  // flux array for conjugate transfer
736  amrex::Array<FabPtr, LsmFlux_SLM::NumVars> lsm_fab_flux;
737 
738  // Source fields used to transfer SLM state between AMR levels.
739  amrex::Vector<amrex::MultiFab*> source_data;
740  amrex::Vector<amrex::MultiFab*> source_flux;
741  amrex::Vector<amrex::MultiFab*> source_unmapped;
742 
743  // Number of grid points in z
744  int m_nz_lsm = 7;
745 
746  // Size of grid spacing in z
747  std::vector<amrex::Real> m_dz_lsm;
748  std::string rad_input_file;
749 
750  // Input variables
751  int landtype0 = 16; // landtype over whole domain
752 
753  amrex::Real LAI0 = zero; // default leaf area index
754  amrex::Vector<amrex::Real> clay0; // uniform clay content (%)
755  amrex::Vector<amrex::Real> sand0; // uniform sand content (%)
756  amrex::Vector<amrex::Real> sw0; // uniform soil wetness (fraction)
757  amrex::Vector<amrex::Real> st0; // uniform soil temperature (K)
758  amrex::Vector<amrex::Real> relax_hgt; // depth dependent soil relaxation function
759 
760  amrex::Real tabs_s = zero; // surface temperature (K)
761  amrex::Real t00 = 300.0; // constant offset for sstxy
762  static constexpr amrex::Real t_canop_max = 343.; // maximum plant temperature
763 
764  bool use_terrain = false;
765 
766  bool dosoilwnudging = false;
767  bool dosoiltnudging = false;
768  amrex::Real tausoil = 86400.0;
769 
770  amrex::Real z0_soil = 0.01; // baresoil roughness length (m)
771  static constexpr amrex::Real tfriz = 273.15;
772  amrex::Real mws_mx0 = 50.0; // maximum puddle water storage (mm)
773 
774  static constexpr amrex::Real epsv = 0.61;
775 
776  static constexpr amrex::Real cp = 1004.0; // specific heat of air [J/kg/K]
777  static constexpr amrex::Real cp_water = 4.1796e6; // heat capacity of water [J/m^3K]
778 
779  static constexpr amrex::Real sigma = 5.67e-8; // Stefen-Boltzmann constant [W/m^2/K^4]
780 
781  // parameters for stomatal resistance
782  amrex::Real Rc_max = 5000.0; // maximum stomatal resistance
783  amrex::Real T_opt = 298.0; // optimum temperature for transpiration
784  amrex::Real zref = myhalf; // height of reference level (m), used in transfer coef
785  amrex::MultiFab zrefxy;
786 
787  static constexpr amrex::Real IR_emis_urban = 0.9;
788 
789  // Model variables
790  // NOTE: these MultiFabs are defined over the grid only in X and Y (no Z component)
791  amrex::MultiFab t_canop; // canopy leaf temperature
792  amrex::MultiFab mw; // water storage on leaves, kg/m^2 = mm of water
793  amrex::MultiFab mws; // water storage in puddle, kg/m^2 = mm of water
794  amrex::MultiFab t_skin; // skin temperature, surface level viewed from atmosphere
795  amrex::MultiFab t_ground_skin; // massless ground-atmosphere interface temperature
796  amrex::MultiFab t_sfc; // 'surface' level temperature. for vegetated, t_sfc = t_cas, for non-vegetated = t_sfc=top soil t
797  amrex::MultiFab q_sfc; // 'surface' level specific humidity, for vegetated, q_sfc = q_cas, for non-vegetated = top soil specific humidity
798  amrex::MultiFab t_cas; // canopy air space temperature
799  amrex::MultiFab q_cas; // canopy air space specific humidity
800 
801  amrex::MultiFab q_gr; // soil pore space specific humidity
802  amrex::MultiFab sdew; // soil dew condition
803 
804  // TODO: placeholder landmask array - should probably use the one defined by ERF
805  amrex::iMultiFab landmask;
806  amrex::iMultiFab landtype; // IGBP landtype (1 to 16)
807  amrex::iMultiFab nroot; // number of rooted soil layers used by the Noah BTR=1 stress factor
808  amrex::MultiFab LAI; // leaf area index
809  amrex::MultiFab SAI; // stem area index
810  amrex::MultiFab sstxy;
811 
812  // Vegetation parameter lists
813  amrex::iMultiFab vegetype; // vegetation type (0 - baresoil, non-zero for vegetated)
814  amrex::MultiFab vege_YES; // 0-baresoil, 1-vegetated
815  amrex::MultiFab cp_vege; // dry heat capacity of vegetation [J/m2/K]
816  amrex::MultiFab cbiom; // NoahMP canopy biomass heat capacity parameter [m]
817  amrex::MultiFab dleaf; // NoahMP characteristic leaf dimension [m]
818  amrex::MultiFab z0_sfc; // surface level roughness: for vegetated z0_sfc=z0_vege, for non-vegetated, z0_sfc=z0_soil
819  amrex::MultiFab Khai_L; // leaf distribution factor (called XL in NOAHMP radiation)
820  amrex::MultiFab phi_1;
821  amrex::MultiFab phi_2;
822  amrex::MultiFab IR_emis_vege; // vegetation emissivity for infrared radiation
823  amrex::MultiFab IR_emis_soil; // soil emissivity for infrared radiation
824  amrex::MultiFab IR_emis_grnd; // ground emissivity for infrared radiation
825  amrex::MultiFab ztop; // height of vegetation (called HVT in NOAHMP radiation)
826  amrex::MultiFab disp_hgt; // displacement height
827  amrex::MultiFab Rgl; // parameter for stomatal resistance
828  amrex::MultiFab Rc_min; // minimum stomatal resistance
829  amrex::MultiFab hs_rc; // parameter for stomatal resistance
830  amrex::MultiFab precip_extinc; // precipitation extinction coef
831  amrex::MultiFab precip_sfc; // precipitation reaching to soil top through canopy
832  amrex::MultiFab mw_mx; // max of mw
833  amrex::MultiFab mws_mx; // max of mws
834  amrex::MultiFab BAI; // Basal area index, sq.feet/acre
835  amrex::MultiFab IMPERV;
836 
837  // Packed MF containing 1D arrays of variables used in soil temperature and soil water
838  // soilt: st_cond, st_capa, st_eff_cond, alpha, beta
839  // soilw: st_wgt, sh_eff_cond, sh_eff_vel, alpha, beta, sdepth_mm
840  amrex::MultiFab soilt_vars;
841  amrex::MultiFab soilw_vars;
842 
843  amrex::MultiFab mw_inc;
844 
845  // Soil hydrology variables
846  amrex::MultiFab evapo_dry;
847  amrex::MultiFab evapo_wet;
848 
849  // Sensible heat fluxes
850  amrex::MultiFab shf_canop; // flux transfer between canopy and air space [W/m^2]
851  amrex::MultiFab shf_soil; // flux transfer between soil surface and air space [W/m^2]
852  amrex::MultiFab shf_air; // flux transfer between air space and the reference level [W/m^2]
853 
854  // Latent heat fluxes
855  amrex::MultiFab lhf_canop;
856  amrex::MultiFab lhf_soil;
857  amrex::MultiFab lhf_air;
858  amrex::MultiFab evp_canop;
859  amrex::MultiFab evp_soil;
860  amrex::MultiFab evp_air;
861 
862  // Albedos
863  amrex::MultiFab albedovis_v, albedonir_v; // visible and NIR albedos for vegetation
864  amrex::MultiFab albedovis_s, albedonir_s; // visible and NIR albedos for soil
865 
866 
867  // Resistances
868  amrex::MultiFab r_a; // aerodynamic resistance between surface and ref level
869  amrex::MultiFab r_b; // leaf boundary layer resistance
870  amrex::MultiFab r_c; // leaf-level stomatal resistance
871  amrex::MultiFab r_d; // undercanopy aerodynamic resistance
872  amrex::MultiFab r_soil;
873  static constexpr amrex::Real r_litter = zero; // litter resistance [s/m]
874 
875 
876  amrex::MultiFab net_rad;
877  amrex::MultiFab wet_canop; // wetted portion of canopy
878 
880 
882  bool first_step = true;
883  bool m_updated = false;
884 
885  std::string parameter_file = "NoahmpTable.TBL";
886  std::string veg_dataset = "modis"; // modis or usgs
887  std::string soil_dataset = "stas"; // stas or stas_ruc
888  int num_landtypes = -1; // Number of land types in sai/lai, parameter tables
889  int num_veg_params = -1;
890  int num_soil_params = -1;
891 
893  amrex::Vector<std::string> param_veg_categories;
894  amrex::Vector<std::string> param_soil_categories;
895 
896  std::unordered_map<std::string, std::unique_ptr<amrex::Gpu::DeviceVector<amrex::Real>>> d_soil_params;
897  std::unordered_map<std::string, std::unique_ptr<amrex::Gpu::DeviceVector<amrex::Real>>> d_veg_params;
898  std::unordered_map<std::string, std::unique_ptr<amrex::Gpu::DeviceVector<amrex::Real>>> d_rad_params;
899 
900  std::vector<std::vector<amrex::Real>> sai_table; // table containing monthly SAI values for each land type
901  std::vector<std::vector<amrex::Real>> lai_table; // table containing monthly LAI values for each land type
902 
903  amrex::Gpu::DeviceVector<amrex::Real> d_lai_curr; // GPU LAI values for current month only
904  amrex::Gpu::DeviceVector<amrex::Real> d_lai_next; // GPU LAI values for next month
905  amrex::Gpu::DeviceVector<amrex::Real> d_sai_curr; // GPU SAI values for current month only
906  amrex::Gpu::DeviceVector<amrex::Real> d_sai_next; // GPU SAI values for next month
907 
908  bool use_param_file = false; // whether to initialize using parameters from file
909  bool interpolate_lai = false; // whether to interpolate LAI+SAI between monthly values for each landtype (Noah-MP style, dynamic veg=4)
910  bool use_wrf_lai = false; // whether to use WRF-Noah style LAI (interpolate between min and max lai)
911  bool params_updated = false; // whether soil/vegetation parameters have been updated from file to recompute
912 
913  // NOAHMP radiation parameters
914  int opt_rad = 1; // Radiation option: 1=modified two-stream (default), 2=two-stream, 3=gap=f(veg)
915  int opt_alb = 1; // Snow albedo option: 1=BATS, 2=CLASS
916 
917  // NOAHMP radiation parameters from NoahmpTable.TBL
918  // ALBSAT_VIS: saturated soil albedos VIS (20 soil color classes)
919  // ALBSAT_NIR: saturated soil albedos NIR (20 soil color classes)
920  // ALBDRY_VIS: dry soil albedos VIS (20 soil color classes)
921  // ALBDRY_NIR: dry soil albedos NIR (20 soil color classes)
922  // ALBLAK: albedo frozen lakes: 1=vis, 2=nir
923  // OMEGAS: two-stream parameter omega for snow: 1=vis, 2=nir
924  amrex::Real betads_rad = myhalf; // two-stream parameter betad for snow
925  amrex::Real betais_rad = myhalf; // two-stream parameter betai for snow
926 
927  // Snow albedo parameters (from &noahmp_global_parameters)
928  amrex::Real tau0_rad = 1.0e6; // tau0 from yang97 eqn. 10a
929  amrex::Real grain_growth_rad = 5000.; // growth from vapor diffusion yang97 eqn. 10b
930  amrex::Real extra_growth_rad = 10.; // extra growth near freezing yang97 eqn. 10c
931  amrex::Real dirt_soot_rad = 0.3; // dirt and soot term yang97 eqn. 10d
932  amrex::Real rsurf_exp = 5.0; // NoahMP option-1 soil resistance exponent
933  amrex::Real bats_cosz_rad = two; // zenith angle snow albedo adjustment; b in yang97 eqn. 15
934  amrex::Real bats_vis_new_rad = 0.95; // new snow visible albedo
935  amrex::Real bats_nir_new_rad = 0.65; // new snow nir albedo
936  amrex::Real bats_vis_age_rad = 0.2; // age factor for diffuse visible snow albedo yang97 eqn. 17
937  amrex::Real bats_nir_age_rad = myhalf; // age factor for diffuse nir snow albedo yang97 eqn. 18
938  amrex::Real bats_vis_dir_rad = 0.4; // cosz factor for direct visible snow albedo yang97 eqn. 15
939  amrex::Real bats_nir_dir_rad = 0.4; // cosz factor for direct nir snow albedo yang97 eqn. 16
940  amrex::Real swemx_rad = one; // new snow mass to fully cover old snow (mm)
941 
942  // NOAHMP emissivity parameters for longwave radiation from NoahmpTable.TBL
943  amrex::Real snow_emis_rad = 0.95; // snow emissivity
944  amrex::Real eg_soil_rad = 0.97; // ground emissivity for soil (IST=1)
945  amrex::Real eg_lake_rad = 0.98; // ground emissivity for lake (IST=2)
946 
947  // NOAHMP vegetation radiation parameters are stored in d_veg_params:
948  // RHOL_VIS: leaf reflectance: visible
949  // RHOL_NIR: leaf reflectance: NIR
950  // RHOS_VIS: stem reflectance: visible
951  // RHOS_NIR: stem reflectance: NIR
952  // TAUL_VIS: leaf transmittance: visible
953  // TAUL_NIR: leaf transmittance: NIR
954  // TAUS_VIS: stem transmittance: visible
955  // TAUS_NIR: stem transmittance: NIR
956  // RC: crown radius (m)
957  // HVB: bottom of canopy (m) - NOAHMP name: HVB
958  // DEN: tree density (no. of trunks per m2) - NOAHMP name: DEN
959  // CWPVT: canopy wind extinction parameter - NOAHMP name: CWPVT
960  // NOTE: NOAHMP parameter "xl" (leaf/stem orientation index) uses existing Khai_L from init_landtype()
961  // NOTE: NOAHMP parameter "hvt" (top of canopy height) uses existing ztop from init_landtype()
962 
963  // MultiFabs to store NOAHMP radiation state variables
964  amrex::MultiFab albold_noahmp; // snow albedo at last time step (for CLASS option)
965  amrex::MultiFab tauss_noahmp; // non-dimensional snow age
966 
967  std::vector<std::vector<amrex::Real>> param_table;
968  amrex::TableData<amrex::Real, 2> d_param_table;
969 
971  int m_orbital_year = -1;
972  int m_orbital_mon = -1;
973  int m_orbital_day = -1;
974  int m_orbital_sec = -1;
975 
976  amrex::MultiFab *z_phys_nd; // input z_phys_nd from ERF
977 
978  // Extra MFs for output:
979  amrex::MultiFab slm_diag;
980 
981  amrex::Vector<const amrex::MultiFab*> slm_to_rad_vars;
982 
983  // Defines the WRFInput names and corresponding SLM name used to
984  // fill variables at initialization
985  inline static std::unordered_map<std::string, std::string> wrfinput_map = {
986  {"DZS", "soil_thickness"},
987  {"ZS", "node_z"},
988  {"TSLB", "tsoil"},
989  {"SMOIS", "wsoil"},
990  {"LAI", "lai"},
991  {"IVGTYP", "vegtype"},
992  {"ISLTYP", "soiltype"},
993  {"TSK", "tsurf"},
994  {"VEGFRA", "veg_frac"},
995  {"SHDMIN", "veg_frac_min"},
996  {"SHDMAX", "veg_frac_max"},
997  //{"TMN", "soilt_obs"}
998  };
999 
1000  // map RRTMGP names to SLM names for radiation data
1001  inline static std::unordered_map<std::string, std::string> rad_output_map = {
1002  {"cos_zenith_angle", "cos_zenith"},
1003  {"sw_flux_dn", ""},
1004  {"sw_flux_dn_dir_vis", "SW_dw_dir_vis"},
1005  {"sw_flux_dn_dir_nir", "SW_dw_dir_nir"},
1006  {"sw_flux_dn_dif_vis", "SW_dw_dif_vis"},
1007  {"sw_flux_dn_dif_nir", "SW_dw_dif_nir"},
1008  {"lw_flux_dn", "LW_dw"}
1009  };
1010 
1011  // whether to initialize SLM from inputs file or from wrfinput
1012  bool use_wrfinput = false;
1014  bool wrfinput_initialized = false;
1015 
1016  // whether Copy_State_to_Lsm has filled tref, qref and pref on this level
1017  // (or on the level its state was interpolated from), and the same for the
1018  // source level registered by Set_Source_Ptrs
1019  bool has_atmos_state = false;
1021 
1022  // set when this level was made from a source level without the atmospheric
1023  // state: the next Update_Lsm_Vars then calls init_slm_vars again
1025 
1026  // list of extra MFs in lsm_fab_vars that are not checkpointed by ERF
1027  amrex::Vector<int> unmapped_fields;
1028 
1029  // List of 2D output variables that are declared as 3D
1030  // These will only be saved at k = 0 (surface level) to save space
1031  // TODO: these variables should be redefined to be 2D
1032  inline static const std::unordered_set<int> surf_vars = {
1068  };
1069 
1070  static constexpr const char* LsmVarName_Full[] = {
1071  "tsurf", "ustar", "tstar", "qstar", "ref_t", "ref_q", "ref_p", "ref_d", "ref_u", "ref_v", "ref_precip",
1072  "SW_dw_dir_vis", "SW_dw_dir_nir", "SW_dw_dif_vis", "SW_dw_dif_nir", "LW_dw", "zenith",
1073  "tveg", "mv", "tsoil", "wsoil", "sand", "clay", "soil_thickness", "node_z", "interface_z",
1074  "soilw_nudge", "soilt_nudge", "sw_over_sat", "soil_relax_hgt", "soilt_obs", "soilw_obs", "soil_transp_frac", "w_s_FC", "w_s_WP",
1075  "sst_capa", "sst_cond", "poro_soil", "theta_FC", "theta_WP", "m_pot_sat", "Bconst", "ks","lai","vegtype","soiltype",
1076  "veg_frac", "veg_frac_min", "veg_frac_max", "surface_u", "surface_v", "surface_vapor", "surface_heat", "precip_soil", "emis_sfc", "alb_nir_sfc", "alb_vis_sfc", "alb_nir_sfc_diff", "alb_vis_sfc_diff"
1077  };
1078 
1079  static_assert(sizeof(LsmVarName_Full)/sizeof(*LsmVarName_Full) == LsmVar_SLM::NumVars);
1080 
1081  inline static const std::vector<std::string> diag_names = {
1082  "precip",
1083  "precip_in",
1084  "precip_sfc",
1085  "runoff_sfc",
1086  "drain",
1087  "drain_flux",
1088  "evapo_wet",
1089  "grflux"
1090  };
1091 
1092 #ifdef ERF_USE_NETCDF
1093  // List of output variables that are constant in time
1094  inline static const std::unordered_set<int> const_vars = {
1114  };
1115 
1116  inline static const std::vector<std::string> soilt_var_names = {
1117  "st_cond",
1118  "st_capa",
1119  "st_eff_cond",
1120  "st_alpha",
1121  "st_beta"
1122  };
1123 
1124  inline static const std::vector<std::string> soilw_var_names = {
1125  "sw_wgt",
1126  "sw_sh_eff_cond",
1127  "sw_sh_eff_vel",
1128  "sw_alpha",
1129  "sw_beta",
1130  "sw_sdepth_mm"
1131  };
1132 
1133  amrex::MultiFab rad_input_data;
1134  int num_rad_times = 0;
1135  amrex::Vector<amrex::Real> rad_times;
1136  inline static const std::vector<std::string> rad_names = {
1137  "S_SWVIS", "S_SWNIR", "S_SWVISD", "S_SWNIRD", "S_COSZRS", "S_LWDS"};
1138 
1139 #endif
1140 };
1141 #endif
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)
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int idx(int i, int j, int k, int nx, int ny)
Definition: ERF_InitForEnsemble.cpp:404
LSMTransferMode
Definition: ERF_NullSurf.H:10
constexpr amrex::Real two
Definition: ERF_NumericalConstants.H:38
constexpr amrex::Real one
Definition: ERF_NumericalConstants.H:37
constexpr amrex::Real zero
Definition: ERF_NumericalConstants.H:36
constexpr amrex::Real myhalf
Definition: ERF_NumericalConstants.H:41
std::string name
Definition: ERF_Plotfile2DCatalog.cpp:116
std::unordered_map< std::string, amrex::Vector< std::pair< std::string, amrex::Vector< amrex::Real > >> > SLMParameterTable
Definition: ERF_SLM.H:168
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_NullSurf.H:15
virtual void Init(const int &, const amrex::MultiFab &, const amrex::Geometry &, const amrex::Geometry &, amrex::Vector< amrex::BCRec > &, amrex::IntVect &, const amrex::Real &, amrex::Vector< amrex::Vector< std::string >> &)
Definition: ERF_NullSurf.H:27
Definition: ERF_SLM.H:185
amrex::MultiFab z0_sfc
Definition: ERF_SLM.H:818
amrex::MultiFab mw
Definition: ERF_SLM.H:792
amrex::Vector< amrex::Real > sand0
Definition: ERF_SLM.H:755
amrex::MultiFab t_canop
Definition: ERF_SLM.H:791
void writeSLM_Data(const PlotFileType plotfile_type, const amrex::Real cur_time, const std::string plot_prefix, const int level_step, const int lev, const int finest_lev, amrex::MultiFab &fab, amrex::Geometry &geom, amrex::Vector< std::string > &varnames)
Definition: ERF_SLM.cpp:5091
amrex::Real start_time
Definition: ERF_SLM.H:881
void Define(SolverChoice &sc) override
Definition: ERF_SLM.H:200
amrex::MultiFab evp_air
Definition: ERF_SLM.H:860
void Lsm_Interpolate_From_Source(const amrex::Geometry &source_geom, const amrex::Geometry &source_lsm_geom, const amrex::IntVect &ref_ratio, LSMTransferMode mode) override
Definition: ERF_SLM.cpp:1280
amrex::Real snow_emis_rad
Definition: ERF_SLM.H:943
amrex::Geometry m_geom0
Definition: ERF_SLM.H:711
amrex::MultiFab * Lsm_Flux_Ptr(const int &varIdx) override
Definition: ERF_SLM.H:313
SLM()
Definition: ERF_SLM.H:193
amrex::MultiFab q_gr
Definition: ERF_SLM.H:801
amrex::Real bats_cosz_rad
Definition: ERF_SLM.H:933
amrex::Gpu::DeviceVector< amrex::Real > d_sai_next
Definition: ERF_SLM.H:906
static const std::unordered_set< int > surf_vars
Definition: ERF_SLM.H:1032
void load_builtin_radiation_parameters()
Definition: ERF_SLM.cpp:902
void init_slm_vars()
Definition: ERF_SLM.cpp:2093
std::unordered_map< std::string, std::string > & Lsm_WRFInputNames() override
Definition: ERF_SLM.H:466
amrex::Real bats_vis_dir_rad
Definition: ERF_SLM.H:938
std::unordered_map< std::string, std::unique_ptr< amrex::Gpu::DeviceVector< amrex::Real > > > d_veg_params
Definition: ERF_SLM.H:897
amrex::iMultiFab landmask
Definition: ERF_SLM.H:805
amrex::MultiFab mw_mx
Definition: ERF_SLM.H:832
amrex::Vector< std::string > param_soil_categories
Definition: ERF_SLM.H:894
static constexpr amrex::Real epsv
Definition: ERF_SLM.H:774
bool use_terrain
Definition: ERF_SLM.H:764
virtual void Init(const int &, const amrex::MultiFab &, const amrex::Geometry &, const amrex::Geometry &, amrex::Vector< amrex::BCRec > &, amrex::IntVect &, const amrex::Real &, amrex::Vector< amrex::Vector< std::string >> &)
Definition: ERF_NullSurf.H:27
void initialize_processed_state(const bool preserve_checkpoint_fields=false)
Definition: ERF_SLM.cpp:1397
int Lsm_DataIndex(const std::string &varname) override
Definition: ERF_SLM.H:430
amrex::MultiFab shf_air
Definition: ERF_SLM.H:852
amrex::Real tabs_s
Definition: ERF_SLM.H:760
int khi_lsm
Definition: ERF_SLM.H:728
amrex::MultiFab net_rad
Definition: ERF_SLM.H:876
void init_soil_vars()
Definition: ERF_SLM.cpp:2021
bool use_param_file
Definition: ERF_SLM.H:908
amrex::Real tau0_rad
Definition: ERF_SLM.H:928
amrex::Vector< amrex::BCRec > m_domain_bcs_type
Definition: ERF_SLM.H:720
const amrex::Vector< const amrex::MultiFab * > & export_to_RRTMGP()
Definition: ERF_SLM.H:662
amrex::MultiFab evp_canop
Definition: ERF_SLM.H:858
int m_lsm_flux_size
Definition: ERF_SLM.H:697
amrex::MultiFab shf_soil
Definition: ERF_SLM.H:851
void radiation_noahmp(const amrex::MFIter &mfi)
Definition: ERF_SLM.cpp:5786
int Lsm_Unmapped_Size() override
Definition: ERF_SLM.H:363
amrex::Vector< amrex::MultiFab * > source_data
Definition: ERF_SLM.H:739
void init_from_inputs()
Definition: ERF_SLM.cpp:515
amrex::MultiFab mw_inc
Definition: ERF_SLM.H:843
virtual ~SLM()=default
bool Lsm_Has_Atmos_State() override
Definition: ERF_SLM.H:393
void set_terrain_inputs(const amrex::Vector< std::unique_ptr< amrex::MultiFab >> &sst_in, const amrex::Vector< std::unique_ptr< amrex::iMultiFab >> &lmask_in) override
Definition: ERF_SLM.cpp:5005
void initialize_surface_outputs()
Definition: ERF_SLM.cpp:2163
amrex::Vector< amrex::Real > sw0
Definition: ERF_SLM.H:756
amrex::MultiFab cbiom
Definition: ERF_SLM.H:816
void init_from_params()
Definition: ERF_SLM.cpp:2674
amrex::Real bats_vis_age_rad
Definition: ERF_SLM.H:936
amrex::Real T_opt
Definition: ERF_SLM.H:783
amrex::MultiFab Khai_L
Definition: ERF_SLM.H:819
int landtype0
Definition: ERF_SLM.H:751
bool dosoiltnudging
Definition: ERF_SLM.H:767
amrex::Geometry m_lsm_geom0
Definition: ERF_SLM.H:717
amrex::MultiFab phi_2
Definition: ERF_SLM.H:821
amrex::Real mws_mx0
Definition: ERF_SLM.H:772
amrex::MultiFab evp_soil
Definition: ERF_SLM.H:859
void init_soil_tw()
Definition: ERF_SLM.cpp:1802
void soil_temperature(const amrex::MFIter &mfi)
Definition: ERF_SLM.cpp:4605
amrex::MultiFab LAI
Definition: ERF_SLM.H:808
const std::vector< amrex::Real > & get_soil_dz() const
Definition: ERF_SLM.H:672
amrex::Real bats_vis_new_rad
Definition: ERF_SLM.H:934
amrex::MultiFab wet_canop
Definition: ERF_SLM.H:877
amrex::Vector< std::string > LsmFluxName
Definition: ERF_SLM.H:705
static constexpr amrex::Real cp_water
Definition: ERF_SLM.H:777
amrex::Real m_dt
Definition: ERF_SLM.H:725
amrex::Real tausoil
Definition: ERF_SLM.H:768
static void GotoNextLine(std::istream &is)
Definition: ERF_SLM_IO.cpp:382
amrex::MultiFab IR_emis_grnd
Definition: ERF_SLM.H:824
static std::unordered_map< std::string, std::string > wrfinput_map
Definition: ERF_SLM.H:985
void WriteCheckpoint(const int &lev, const std::string &checkpointname) const override
Definition: ERF_SLM_IO.cpp:388
std::vector< amrex::Real > m_dz_lsm
Definition: ERF_SLM.H:747
amrex::iMultiFab nroot
Definition: ERF_SLM.H:807
AMREX_GPU_HOST_DEVICE static AMREX_FORCE_INLINE void twostream_noahmp(int ib, int ic, int vegtyp, amrex::Real cosz, amrex::Real vai, amrex::Real fwet, amrex::Real t, const amrex::Real *albgrd, const amrex::Real *albgri, const amrex::Real *rho, const amrex::Real *tau, amrex::Real fveg, int ist, amrex::Real xl, amrex::Real omegas_param, amrex::Real betads, amrex::Real betais, int opt_rad, amrex::Real rc, amrex::Real hvt, amrex::Real hvb, amrex::Real den, amrex::Real *fab, amrex::Real *fre, amrex::Real *ftd, amrex::Real *fti, amrex::Real &gdir, amrex::Real *frev, amrex::Real *freg, amrex::Real &bgap, amrex::Real &wgap, amrex::Real &xl_out, amrex::Real &chil_out, amrex::Real &phi1_out, amrex::Real &phi2_out)
Definition: ERF_SLM.cpp:5429
bool use_wrf_lai
Definition: ERF_SLM.H:910
InitType m_init_type
Definition: ERF_SLM.H:1013
static constexpr amrex::Real t_canop_max
Definition: ERF_SLM.H:762
amrex::MultiFab q_sfc
Definition: ERF_SLM.H:797
std::string rad_input_file
Definition: ERF_SLM.H:748
amrex::MultiFab t_sfc
Definition: ERF_SLM.H:796
amrex::Real betads_rad
Definition: ERF_SLM.H:924
amrex::MultiFab t_cas
Definition: ERF_SLM.H:798
void soil_nudging(const amrex::MFIter &mfi3d)
Definition: ERF_SLM.cpp:4768
bool wrfinput_initialized
Definition: ERF_SLM.H:1014
amrex::MultiFab ztop
Definition: ERF_SLM.H:825
amrex::MultiFab albedovis_s
Definition: ERF_SLM.H:864
void Advance(const amrex::Real &dt, const amrex::Real &t_new, const amrex::Real &t_start) override
Definition: ERF_SLM.H:272
SLMParameterTable ReadParameterFile(const std::string &filename, amrex::Vector< std::string > &veg_categories, amrex::Vector< std::string > &soil_categories)
Definition: ERF_SLM.cpp:2360
int klo_lsm
Definition: ERF_SLM.H:730
amrex::Gpu::DeviceVector< amrex::Real > d_lai_next
Definition: ERF_SLM.H:904
amrex::MultiFab vege_YES
Definition: ERF_SLM.H:814
int m_orbital_mon
Definition: ERF_SLM.H:972
void Advance(const double &dt) override
Definition: ERF_SLM.H:266
amrex::MultiFab shf_canop
Definition: ERF_SLM.H:850
void fluxes_canopy(const amrex::MFIter &mfi)
Definition: ERF_SLM.cpp:3885
std::string veg_dataset
Definition: ERF_SLM.H:886
static constexpr amrex::Real IR_emis_urban
Definition: ERF_SLM.H:787
void validate_parameter_tables()
Definition: ERF_SLM.cpp:2461
amrex::Real dirt_soot_rad
Definition: ERF_SLM.H:931
amrex::Real swemx_rad
Definition: ERF_SLM.H:940
static const std::vector< std::string > diag_names
Definition: ERF_SLM.H:1081
amrex::MultiFab slm_diag
Definition: ERF_SLM.H:979
amrex::Array< FabPtr, LsmVar_SLM::NumVars > lsm_fab_vars
Definition: ERF_SLM.H:733
static constexpr amrex::Real cp
Definition: ERF_SLM.H:776
SLMParameterTable full_params
Definition: ERF_SLM.H:892
amrex::MultiFab precip_extinc
Definition: ERF_SLM.H:830
amrex::Real bats_nir_new_rad
Definition: ERF_SLM.H:935
void Copy_State_to_Lsm(const amrex::MultiFab &cons_in, const amrex::MultiFab &u_in, const amrex::MultiFab &v_in) override
Definition: ERF_SLM.cpp:4837
void Lsm_Set_Source_Unmapped_Ptr(const int &varIdx, amrex::MultiFab *source_data_ptr) override
Definition: ERF_SLM.H:379
amrex::MultiFab precip_sfc
Definition: ERF_SLM.H:831
static constexpr const char * LsmVarName_Full[]
Definition: ERF_SLM.H:1070
static constexpr amrex::Real tfriz
Definition: ERF_SLM.H:771
AMREX_GPU_HOST_DEVICE static AMREX_FORCE_INLINE void surrad_noahmp(amrex::Real mpe, amrex::Real fsun, amrex::Real fsha, amrex::Real elai, amrex::Real vai, amrex::Real laisun, amrex::Real laisha, const amrex::Real *solad, const amrex::Real *solai, const amrex::Real *fabd, const amrex::Real *fabi, const amrex::Real *ftdd, const amrex::Real *ftid, const amrex::Real *ftii, const amrex::Real *albgrd, const amrex::Real *albgri, const amrex::Real *albd, const amrex::Real *albi, const amrex::Real *frevd, const amrex::Real *frevi, const amrex::Real *fregd, const amrex::Real *fregi, amrex::Real &parsun, amrex::Real &parsha, amrex::Real &sav, amrex::Real &sag, amrex::Real &fsa, amrex::Real &fsr, amrex::Real &fsrv, amrex::Real &fsrg)
Definition: ERF_SLM.cpp:5666
amrex::MultiFab t_skin
Definition: ERF_SLM.H:794
amrex::Vector< std::string > param_veg_categories
Definition: ERF_SLM.H:893
int opt_rad
Definition: ERF_SLM.H:914
void resistances(const amrex::MFIter &mfi)
Definition: ERF_SLM.cpp:3595
amrex::Vector< amrex::Real > clay0
Definition: ERF_SLM.H:754
amrex::MultiFab albedonir_s
Definition: ERF_SLM.H:864
bool init_from_atmos_pending
Definition: ERF_SLM.H:1024
int Lsm_FluxIndex(const std::string &varname) override
Definition: ERF_SLM.H:452
amrex::Geometry m_geom
Definition: ERF_SLM.H:708
AMREX_GPU_HOST_DEVICE static AMREX_FORCE_INLINE void snow_age_noahmp(amrex::Real dt, amrex::Real tg, amrex::Real sneqvo, amrex::Real sneqv, amrex::Real tau0, amrex::Real grain_growth, amrex::Real extra_growth, amrex::Real dirt_soot, amrex::Real swemx, amrex::Real &tauss, amrex::Real &fage)
Definition: ERF_SLM.cpp:5259
amrex::Real bats_nir_dir_rad
Definition: ERF_SLM.H:939
amrex::MultiFab albold_noahmp
Definition: ERF_SLM.H:964
int num_soil_params
Definition: ERF_SLM.H:890
void slm_init()
Definition: ERF_SLM.cpp:939
int Lsm_Flux_Size() override
Definition: ERF_SLM.H:419
amrex::Real Rc_max
Definition: ERF_SLM.H:782
amrex::Geometry Lsm_Geom() override
Definition: ERF_SLM.H:323
amrex::Vector< amrex::MultiFab * > source_flux
Definition: ERF_SLM.H:740
amrex::MultiFab * Lsm_Data_Ptr(const int &varIdx) override
Definition: ERF_SLM.H:303
amrex::Real m_calday
Definition: ERF_SLM.H:970
AMREX_GPU_HOST_DEVICE static AMREX_FORCE_INLINE amrex::Real linear_interp(const amrex::Real t0, const amrex::Real t1, const amrex::Real t, const amrex::Real x, const amrex::Real y)
Definition: ERF_SLM.cpp:4825
std::string parameter_file
Definition: ERF_SLM.H:885
amrex::MultiFab mws
Definition: ERF_SLM.H:793
amrex::MultiFab Rgl
Definition: ERF_SLM.H:827
amrex::MultiFab IR_emis_vege
Definition: ERF_SLM.H:822
bool dosoilwnudging
Definition: ERF_SLM.H:766
amrex::Real time
Definition: ERF_SLM.H:879
amrex::MultiFab sstxy
Definition: ERF_SLM.H:810
bool interpolate_lai
Definition: ERF_SLM.H:909
amrex::MultiFab IMPERV
Definition: ERF_SLM.H:835
amrex::MultiFab r_d
Definition: ERF_SLM.H:871
int m_lsm_data_size
Definition: ERF_SLM.H:694
void init_layer_depths()
Definition: ERF_SLM.cpp:1976
void ReadCheckpoint(const int &lev, const std::string &checkpointname) override
Definition: ERF_SLM_IO.cpp:690
amrex::iMultiFab landtype
Definition: ERF_SLM.H:806
amrex::MultiFab r_c
Definition: ERF_SLM.H:870
void Lsm_Set_Source_Flux_Ptr(const int &varIdx, amrex::MultiFab *source_flux_ptr) override
Definition: ERF_SLM.H:349
int Lsm_Type() override
Definition: ERF_SLM.H:510
AMREX_GPU_HOST_DEVICE static AMREX_FORCE_INLINE amrex::Real fh_calc(const amrex::Real &t, const amrex::Real &mps, const amrex::Real &sw, const amrex::Real &B)
Definition: ERF_SLM.cpp:4817
std::string Lsm_DataName(const int &varIdx) override
Definition: ERF_SLM.H:423
std::vector< std::vector< amrex::Real > > sai_table
Definition: ERF_SLM.H:900
void transfer_coeff(const amrex::MFIter &mfi)
Definition: ERF_SLM.cpp:3362
amrex::Vector< amrex::Real > st0
Definition: ERF_SLM.H:757
static constexpr amrex::Real r_litter
Definition: ERF_SLM.H:873
amrex::Vector< amrex::MultiFab * > source_unmapped
Definition: ERF_SLM.H:741
void soil_water(const amrex::MFIter &mfi)
Definition: ERF_SLM.cpp:4329
void set_precip_input(const amrex::MultiFab *precip_in) override
Definition: ERF_SLM.cpp:4976
void Update_Lsm_Vars(amrex::MultiFab &cons_in, amrex::MultiFab &u_in, amrex::MultiFab &v_in) override
Definition: ERF_SLM.H:477
amrex::TableData< amrex::Real, 2 > d_param_table
Definition: ERF_SLM.H:968
void solve_ground_skin_temperature(const amrex::MFIter &mfi)
Definition: ERF_SLM.cpp:4042
amrex::Real extra_growth_rad
Definition: ERF_SLM.H:930
amrex::Vector< std::string > LsmDataName
Definition: ERF_SLM.H:704
void init_wrfinput_vars()
Definition: ERF_SLM.cpp:1061
void set_dt(const amrex::Real &dt)
Definition: ERF_SLM.H:658
amrex::BoxArray ba_lsm_2d
Definition: ERF_SLM.H:722
amrex::MultiFab evapo_dry
Definition: ERF_SLM.H:846
amrex::MultiFab r_a
Definition: ERF_SLM.H:868
std::shared_ptr< amrex::MultiFab > FabPtr
Definition: ERF_SLM.H:187
amrex::MultiFab t_ground_skin
Definition: ERF_SLM.H:795
bool first_step
Definition: ERF_SLM.H:882
bool has_atmos_state
Definition: ERF_SLM.H:1019
amrex::Gpu::DeviceVector< amrex::Real > d_sai_curr
Definition: ERF_SLM.H:905
void AdvanceSLM()
Definition: ERF_SLM.cpp:3043
void albedo_noahmp(const amrex::MFIter &mfi, int i, int j, amrex::Real dt, amrex::Real cosz, amrex::Real snowh, amrex::Real fsno, amrex::Real fwet, amrex::Real sneqvo, amrex::Real sneqv, amrex::Real qsnow, amrex::Real tg, amrex::Real tv, amrex::Real elai, amrex::Real esai, const amrex::Real *smc, int nsoil, amrex::Real fveg, amrex::Real &albold, amrex::Real &tauss, amrex::Real *albgrd, amrex::Real *albgri, amrex::Real *albd, amrex::Real *albi, amrex::Real *fabd, amrex::Real *fabi, amrex::Real *ftdd, amrex::Real *ftid, amrex::Real *ftii, amrex::Real &fsun, amrex::Real *frevd, amrex::Real *frevi, amrex::Real *fregd, amrex::Real *fregi, amrex::Real &bgap, amrex::Real &wgap, amrex::Real *albsnd, amrex::Real *albsni)
amrex::MultiFab r_b
Definition: ERF_SLM.H:869
std::string Lsm_FluxName(const int &varIdx) override
Definition: ERF_SLM.H:445
amrex::Geometry m_lsm_geom
Definition: ERF_SLM.H:714
void Lsm_Set_Source_Data_Ptr(const int &varIdx, amrex::MultiFab *source_data_ptr) override
Definition: ERF_SLM.H:335
void Lsm_Regrid_Level(const int &lev, const amrex::MultiFab &cons_in, const amrex::MultiFab &u_in, const amrex::MultiFab &v_in, const amrex::Geometry &geom, const amrex::Geometry &geom0, amrex::Vector< amrex::BCRec > &domain_bcs_type, amrex::IntVect &refRatio, const amrex::Real &dt, std::unique_ptr< amrex::MultiFab > &z_phys_nd_in, amrex::Vector< amrex::Vector< std::string >> &nc_init_file, const amrex::Geometry &source_geom, const amrex::Geometry &source_lsm_geom, const amrex::IntVect &source_ref_ratio, const bool has_source) override
Definition: ERF_SLM.cpp:1197
int m_nz_lsm
Definition: ERF_SLM.H:744
int m_orbital_sec
Definition: ERF_SLM.H:974
amrex::MultiFab * Lsm_Unmapped_Ptr(const int &varIdx) override
Definition: ERF_SLM.H:369
amrex::MultiFab BAI
Definition: ERF_SLM.H:834
int m_orbital_year
Definition: ERF_SLM.H:971
void Lsm_Set_Source_Has_Atmos_State(bool source_has_atmos) override
Definition: ERF_SLM.H:399
amrex::Real zref
Definition: ERF_SLM.H:784
amrex::MultiFab lhf_soil
Definition: ERF_SLM.H:856
amrex::Real grain_growth_rad
Definition: ERF_SLM.H:929
int Lsm_Data_Size() override
Definition: ERF_SLM.H:415
amrex::Gpu::DeviceVector< amrex::Real > d_lai_curr
Definition: ERF_SLM.H:903
int num_landtypes
Definition: ERF_SLM.H:888
void Copy_Lsm_to_State(amrex::MultiFab &cons_in) override
Definition: ERF_SLM.cpp:5069
std::vector< std::vector< amrex::Real > > lai_table
Definition: ERF_SLM.H:901
amrex::MultiFab * z_phys_nd
Definition: ERF_SLM.H:976
bool Get_Update_Status() override
Definition: ERF_SLM.H:495
void init_landtype()
Definition: ERF_SLM.cpp:1483
void UpdateLAI(const amrex::MFIter &mfi)
Definition: ERF_SLM.cpp:2858
amrex::MultiFab phi_1
Definition: ERF_SLM.H:820
amrex::MultiFab q_cas
Definition: ERF_SLM.H:799
amrex::Real eg_lake_rad
Definition: ERF_SLM.H:945
amrex::Vector< int > LsmDataMap
Definition: ERF_SLM.H:700
amrex::Real bats_nir_age_rad
Definition: ERF_SLM.H:937
bool params_updated
Definition: ERF_SLM.H:911
amrex::MultiFab sdew
Definition: ERF_SLM.H:802
amrex::Real betais_rad
Definition: ERF_SLM.H:925
amrex::MultiFab albedonir_v
Definition: ERF_SLM.H:863
amrex::MultiFab dleaf
Definition: ERF_SLM.H:817
AMREX_GPU_HOST_DEVICE static AMREX_FORCE_INLINE void snowalb_bats_noahmp(int nband, amrex::Real fsno, amrex::Real cosz, amrex::Real fage, amrex::Real bats_cosz, amrex::Real bats_vis_new, amrex::Real bats_nir_new, amrex::Real bats_vis_age, amrex::Real bats_nir_age, amrex::Real bats_vis_dir, amrex::Real bats_nir_dir, amrex::Real *albsnd, amrex::Real *albsni)
Definition: ERF_SLM.cpp:5312
amrex::Geometry Lsm_Atmos_Geom() override
Definition: ERF_SLM.H:329
amrex::Vector< int > unmapped_fields
Definition: ERF_SLM.H:1027
amrex::MultiFab cp_vege
Definition: ERF_SLM.H:815
amrex::Vector< amrex::Real > relax_hgt
Definition: ERF_SLM.H:758
std::unordered_map< std::string, std::unique_ptr< amrex::Gpu::DeviceVector< amrex::Real > > > d_rad_params
Definition: ERF_SLM.H:898
std::unordered_map< std::string, std::string > & get_rad_output_map()
Definition: ERF_SLM.H:667
void Update_State_Vars(amrex::MultiFab &cons_in) override
Definition: ERF_SLM.H:498
amrex::MultiFab lhf_air
Definition: ERF_SLM.H:857
amrex::Vector< const amrex::MultiFab * > slm_to_rad_vars
Definition: ERF_SLM.H:981
amrex::MultiFab lhf_canop
Definition: ERF_SLM.H:855
void initialize_zrefxy()
Definition: ERF_SLM.cpp:1369
bool use_wrfinput
Definition: ERF_SLM.H:1012
amrex::Real eg_soil_rad
Definition: ERF_SLM.H:944
amrex::MultiFab mws_mx
Definition: ERF_SLM.H:833
AMREX_GPU_HOST_DEVICE static AMREX_FORCE_INLINE void groundalb_noahmp(int nsoil, int nband, int ice, int ist, amrex::Real fsno, const amrex::Real *smc, const amrex::Real *albsnd, const amrex::Real *albsni, amrex::Real cosz, amrex::Real tg, const amrex::Real *albsat, const amrex::Real *albdry, const amrex::Real *alblak, amrex::Real *albgrd, amrex::Real *albgri)
Definition: ERF_SLM.cpp:5367
amrex::Real z0_soil
Definition: ERF_SLM.H:770
amrex::MultiFab disp_hgt
Definition: ERF_SLM.H:826
amrex::MultiFab albedovis_v
Definition: ERF_SLM.H:863
int opt_alb
Definition: ERF_SLM.H:915
amrex::MultiFab tauss_noahmp
Definition: ERF_SLM.H:965
amrex::MultiFab r_soil
Definition: ERF_SLM.H:872
std::vector< std::vector< amrex::Real > > param_table
Definition: ERF_SLM.H:967
amrex::Real rsurf_exp
Definition: ERF_SLM.H:932
amrex::MultiFab soilt_vars
Definition: ERF_SLM.H:840
int m_orbital_day
Definition: ERF_SLM.H:973
amrex::MultiFab hs_rc
Definition: ERF_SLM.H:829
amrex::Real t00
Definition: ERF_SLM.H:761
amrex::MultiFab soilw_vars
Definition: ERF_SLM.H:841
amrex::Real LAI0
Definition: ERF_SLM.H:753
amrex::MultiFab Rc_min
Definition: ERF_SLM.H:828
amrex::iMultiFab vegetype
Definition: ERF_SLM.H:813
amrex::Vector< int > LsmFluxMap
Definition: ERF_SLM.H:701
amrex::MultiFab evapo_wet
Definition: ERF_SLM.H:847
std::string soil_dataset
Definition: ERF_SLM.H:887
bool m_updated
Definition: ERF_SLM.H:883
std::unordered_map< std::string, std::unique_ptr< amrex::Gpu::DeviceVector< amrex::Real > > > d_soil_params
Definition: ERF_SLM.H:896
amrex::MultiFab zrefxy
Definition: ERF_SLM.H:785
static std::unordered_map< std::string, std::string > rad_output_map
Definition: ERF_SLM.H:1001
bool source_has_atmos_state
Definition: ERF_SLM.H:1020
amrex::Array< FabPtr, LsmFlux_SLM::NumVars > lsm_fab_flux
Definition: ERF_SLM.H:736
amrex::MultiFab SAI
Definition: ERF_SLM.H:809
void UpdateLAIParameters(const amrex::MFIter &mfi)
Definition: ERF_SLM.cpp:3005
static constexpr amrex::Real sigma
Definition: ERF_SLM.H:779
int num_veg_params
Definition: ERF_SLM.H:889
void rebuild_restart_fields()
Definition: ERF_SLM.cpp:2257
amrex::MultiFab IR_emis_soil
Definition: ERF_SLM.H:823
Definition: ERF_NCInterface.H:351
@ SLM
Definition: ERF_LSM_Types.H:8
@ None
Definition: ERF_LSM_Types.H:6
Definition: ERF_SLM.H:97
@ NumVars
Definition: ERF_SLM.H:105
@ t_flux
Definition: ERF_SLM.H:100
@ tau23
Definition: ERF_SLM.H:103
@ tau13
Definition: ERF_SLM.H:102
@ q_flux
Definition: ERF_SLM.H:101
@ olen
Definition: ERF_SLM.H:104
Definition: ERF_SLM.H:24
@ mv
Definition: ERF_SLM.H:47
@ theta_FC
Definition: ERF_SLM.H:70
@ pref
Definition: ERF_SLM.H:34
@ uref
Definition: ERF_SLM.H:36
@ swdsvisxyref
Definition: ERF_SLM.H:39
@ ustar
Definition: ERF_SLM.H:28
@ alb_nir_sfc_diff
Definition: ERF_SLM.H:91
@ ks
Definition: ERF_SLM.H:74
@ sst_cond
Definition: ERF_SLM.H:68
@ flbu
Definition: ERF_SLM.H:83
@ vref
Definition: ERF_SLM.H:37
@ soilt_obs
Definition: ERF_SLM.H:60
@ emis_sfc
Definition: ERF_SLM.H:88
@ NumVars
Definition: ERF_SLM.H:93
@ theta_WP
Definition: ERF_SLM.H:71
@ flbv
Definition: ERF_SLM.H:84
@ qref
Definition: ERF_SLM.H:33
@ soilw
Definition: ERF_SLM.H:49
@ clay
Definition: ERF_SLM.H:52
@ sw_over_sat
Definition: ERF_SLM.H:58
@ swdsnirxyref
Definition: ERF_SLM.H:40
@ vegtype
Definition: ERF_SLM.H:77
@ soiltype
Definition: ERF_SLM.H:78
@ soilw_nudge
Definition: ERF_SLM.H:56
@ m_pot_sat
Definition: ERF_SLM.H:72
@ interface_z
Definition: ERF_SLM.H:55
@ soilt_nudge
Definition: ERF_SLM.H:57
@ poro_soil
Definition: ERF_SLM.H:69
@ tref
Definition: ERF_SLM.H:32
@ s_depth
Definition: ERF_SLM.H:53
@ w_s_WP
Definition: ERF_SLM.H:65
@ sst_capa
Definition: ERF_SLM.H:67
@ flbq
Definition: ERF_SLM.H:85
@ alb_vis_sfc_diff
Definition: ERF_SLM.H:92
@ swdsvisdxyref
Definition: ERF_SLM.H:41
@ Bconst
Definition: ERF_SLM.H:73
@ node_z
Definition: ERF_SLM.H:54
@ coszrsxy
Definition: ERF_SLM.H:44
@ flbt
Definition: ERF_SLM.H:86
@ veg_frac
Definition: ERF_SLM.H:79
@ dref
Definition: ERF_SLM.H:35
@ veg_frac_max
Definition: ERF_SLM.H:81
@ alb_vis_sfc
Definition: ERF_SLM.H:90
@ soil_relax_hgt
Definition: ERF_SLM.H:59
@ tv
Definition: ERF_SLM.H:46
@ qstar
Definition: ERF_SLM.H:30
@ tsurf
Definition: ERF_SLM.H:27
@ swdsnirdxyref
Definition: ERF_SLM.H:42
@ prsfc
Definition: ERF_SLM.H:87
@ veg_frac_min
Definition: ERF_SLM.H:80
@ lai
Definition: ERF_SLM.H:76
@ alb_nir_sfc
Definition: ERF_SLM.H:89
@ soilt
Definition: ERF_SLM.H:48
@ soilw_obs
Definition: ERF_SLM.H:61
@ sand
Definition: ERF_SLM.H:51
@ soil_transp_frac
Definition: ERF_SLM.H:63
@ lwref
Definition: ERF_SLM.H:43
@ precipref
Definition: ERF_SLM.H:38
@ w_s_FC
Definition: ERF_SLM.H:64
@ tstar
Definition: ERF_SLM.H:29
@ rho
Definition: ERF_Kessler.H:25
constexpr std::array< amrex::Real, num_veg_params > den
Definition: ERF_SLM_DefaultParams.H:16
constexpr std::array< amrex::Real, num_veg_params > rc
Definition: ERF_SLM_DefaultParams.H:22
constexpr std::array< amrex::Real, num_veg_params > hvb
Definition: ERF_SLM_DefaultParams.H:19
constexpr std::array< amrex::Real, 2 > alblak
Definition: ERF_SLM_DefaultParams.H:58
Definition: ERF_SLM.H:146
@ st_eff_cond
Definition: ERF_SLM.H:150
@ beta
Definition: ERF_SLM.H:152
@ alpha
Definition: ERF_SLM.H:151
@ NumVars
Definition: ERF_SLM.H:153
@ st_capa
Definition: ERF_SLM.H:149
@ st_cond
Definition: ERF_SLM.H:148
Definition: ERF_SLM.H:156
@ sw_wgt
Definition: ERF_SLM.H:158
@ sh_eff_cond
Definition: ERF_SLM.H:159
@ NumVars
Definition: ERF_SLM.H:164
@ beta
Definition: ERF_SLM.H:162
@ alpha
Definition: ERF_SLM.H:161
@ sh_eff_vel
Definition: ERF_SLM.H:160
@ sdepth_mm
Definition: ERF_SLM.H:163
Definition: ERF_SLM.H:131
@ evapo_wet
Definition: ERF_SLM.H:139
@ precip_sfc
Definition: ERF_SLM.H:135
@ grflux
Definition: ERF_SLM.H:140
@ NumVars
Definition: ERF_SLM.H:141
@ drain
Definition: ERF_SLM.H:137
@ precip_in
Definition: ERF_SLM.H:134
@ precip
Definition: ERF_SLM.H:133
@ drain_flux
Definition: ERF_SLM.H:138
@ run_off_sfc
Definition: ERF_SLM.H:136
Definition: ERF_SLM.H:109
@ net_lwdn1
Definition: ERF_SLM.H:121
@ net_swdn1
Definition: ERF_SLM.H:113
@ NumVars
Definition: ERF_SLM.H:127
@ net_sw1
Definition: ERF_SLM.H:115
@ net_lw2
Definition: ERF_SLM.H:124
@ net_rad2
Definition: ERF_SLM.H:126
@ net_swdn2
Definition: ERF_SLM.H:114
@ tir2
Definition: ERF_SLM.H:118
@ net_sw2
Definition: ERF_SLM.H:116
@ net_lwdn2
Definition: ERF_SLM.H:122
@ net_lwup1
Definition: ERF_SLM.H:119
@ net_lw1
Definition: ERF_SLM.H:123
@ net_swup1
Definition: ERF_SLM.H:111
@ tir1
Definition: ERF_SLM.H:117
@ net_swup2
Definition: ERF_SLM.H:112
@ net_rad1
Definition: ERF_SLM.H:125
@ net_lwup2
Definition: ERF_SLM.H:120
@ xl
Definition: ERF_WSM6.H:345
@ t
Definition: ERF_WSM6.H:293
real(c_double), parameter t0
Definition: ERF_module_model_constants.F90:39
Definition: ERF_DataStruct.H:715
static InitType init_type
Initial-condition source selected for the run.
Definition: ERF_DataStruct.H:2583
MoistureType moisture_type
Moisture or microphysics model.
Definition: ERF_DataStruct.H:2942
static TerrainType terrain_type
Terrain or immersed-boundary representation.
Definition: ERF_DataStruct.H:2589