ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_NOAHMP.H
Go to the documentation of this file.
1 #ifndef NOAHMP_H
2 #define NOAHMP_H
3 
4 #include <string>
5 #include <vector>
6 #include <memory>
7 #include <limits>
8 #include <functional>
9 
10 #include <AMReX_ParmParse.H>
11 #include <AMReX_Interpolater.H>
12 #include <AMReX_FillPatchUtil.H>
13 #include <AMReX_FArrayBox.H>
14 #include <AMReX_Geometry.H>
15 #include <AMReX_MultiFabUtil.H>
16 #include <AMReX_Vector.H>
17 #include <AMReX_MFIter.H>
18 #include <AMReX_VisMF.H>
19 #include <AMReX_Utility.H>
20 
21 #include <ERF_NullSurf.H>
22 #include <ERF_Constants.H>
23 #include <ERF_IndexDefines.H>
24 #include <ERF_DataStruct.H>
26 
27 #include <NoahmpIO.H>
28 #include <ERF_NOAHMP_Fields.H>
29 
30 // Small POD helpers used by the Advance_With_State
31 namespace erf_noahmp {
32  // Typed precip accumulator views collected once per Advance: per slot, the
33  // borrowed native accumulator, its native->kg/m^2 factor, and whether it is filled.
34  struct PrecipSlots {
35  const amrex::MultiFab* accum [NoahmpPrecipSlot::NumSlots] = {};
38  bool have_any = false;
39  };
40 
41  // Cells the precip guard clamped this call (per rank); reported after the box loop.
42  struct ClampedPrecipCell { int i; int j; amrex::Real raw_mm; };
43 
44  // Cells where frozen components violated MP_SNOW+MP_GRAUP <= MP_RAINNC and were
45  // rescaled (per rank); reported after the loop.
47 
48  // Per-surface-box handles co-indexed by idb: the NoahmpIO block plus its
49  // pinned input/output staging buffers.
51  NoahmpIO_type* io; // &noahmpio_vect[idb]
52  amrex::Array4<amrex::Real> input; // noahmp_input_tmp[idb]->array()
53  amrex::Array4<amrex::Real> output; // noahmp_output_tmp[idb]->array()
54  };
55 }
56 
57 class NOAHMP : public NullSurf {
58 
59  using FabPtr = std::shared_ptr<amrex::MultiFab>;
60 
61 public:
62  // Constructor
63  NOAHMP () {}
64 
65  // Destructor
66  virtual ~NOAHMP () = default;
67 
68  // Set thermo and grid properties
69  void
70  Define (SolverChoice& /*sc*/) override
71  {
72  // Parse solver constants from sc here if needed.
73  }
74 
75  // Initialize data structures
76  void
77  Init (const int& lev,
78  const amrex::MultiFab& cons_in,
79  const amrex::Geometry& geom,
80  const amrex::Geometry& geom0,
81  amrex::Vector<amrex::BCRec>& domain_bcs_type,
82  amrex::IntVect& refRatio,
83  const amrex::Real& dt,
84  amrex::Vector<amrex::Vector<std::string>>& nc_init_file) override;
85 
86  // Wrapper to do all the updating
87  void
88  Advance_With_State (const int& lev,
89  amrex::MultiFab& cons_in,
90  amrex::MultiFab& xvel_in,
91  amrex::MultiFab& yvel_in,
92  amrex::MultiFab* hfx3_out,
93  amrex::MultiFab* qfx3_out,
94  const SurfacePrecipAccumulationSources& precip_sources,
95  const amrex::Real& elapsed_time,
96  const amrex::Real& dt,
97  const int& nstep,
98  const bool updated_lev0) override;
99 
100  void
101  Plot_Landfile (const int& nstep) override;
102 
103  // Get state vars from lsm class
104  amrex::MultiFab*
105  Lsm_Data_Ptr (const int& varIdx) override
106  {
107  int lsmIdx = LsmDataMap[varIdx];
108  AMREX_ALWAYS_ASSERT(lsmIdx < NOAHMP::m_lsm_data_size && lsmIdx>=0);
109  return lsm_fab_data[lsmIdx].get();
110  }
111 
112  // Get flux vars from lsm class
113  amrex::MultiFab*
114  Lsm_Flux_Ptr (const int& varIdx) override
115  {
116  int lsmIdx = LsmFluxMap[varIdx];
117  AMREX_ALWAYS_ASSERT(lsmIdx < NOAHMP::m_lsm_flux_size && lsmIdx>=0);
118  return lsm_fab_flux[lsmIdx].get();
119  }
120 
121  // Get lsm geometry
122  amrex::Geometry
123  Lsm_Geom ( ) override { return m_lsm_geom; }
124 
125  // Get number of vars. Parent queries this before Init (to size lsm_data), so
126  // resolve the soil-layer count here on first use rather than relying on Init.
127  int
129 
130  // Get number of fluxes lsm class contains
131  int
132  Lsm_Flux_Size () override { return NOAHMP::m_lsm_flux_size; }
133 
134  // Get variable names
135  std::string
136  Lsm_DataName (const int& varIdx) override
137  {
138  int lsmIdx = LsmDataMap[varIdx];
139  AMREX_ALWAYS_ASSERT(lsmIdx < NOAHMP::m_lsm_data_size && lsmIdx>=0);
140  return LsmDataName[lsmIdx];
141  }
142 
143  // Get variable index from name
144  int
145  Lsm_DataIndex (std::string varname) override
146  {
147  int varIdx = -1;
148  std::string lc_varname = amrex::toLower(varname);
149  for (int idx(0); idx<m_lsm_data_size; ++idx) {
150  if (lc_varname == amrex::toLower(LsmDataName[idx])) {
151  varIdx = idx;
152  }
153  }
154  return varIdx;
155  }
156 
157  // Get flux variable names
158  std::string
159  Lsm_FluxName (const int& varIdx) override
160  {
161  int lsmIdx = LsmFluxMap[varIdx];
162  AMREX_ALWAYS_ASSERT(lsmIdx < NOAHMP::m_lsm_flux_size && lsmIdx>=0);
163  return LsmFluxName[lsmIdx];
164  }
165 
166  // Get flux variable index from name
167  int
168  Lsm_FluxIndex (std::string varname) override
169  {
170  int varIdx = -1;
171  std::string lc_varname = amrex::toLower(varname);
172  for (int idx(0); idx<LsmFlux_NOAHMP::NumVars; ++idx) {
173  if (lc_varname == amrex::toLower(LsmFluxName[idx])) {
174  varIdx = idx;
175  }
176  }
177  return varIdx;
178  }
179 
180  void
181  Lsm_Set_Lev0_Data_Ptr (const int& varIdx,
182  amrex::MultiFab* lev0_data_ptr) override
183  {
184  AMREX_ALWAYS_ASSERT(varIdx >= 0 && varIdx < m_lsm_data_size);
185  lsm_lev0_data[varIdx] = lev0_data_ptr;
186  }
187 
188  void
189  Lsm_Set_Lev0_Flux_Ptr (const int& varIdx,
190  amrex::MultiFab* lev0_flux_ptr) override
191  {
192  AMREX_ALWAYS_ASSERT(varIdx >= 0 && varIdx < int(LsmFlux_NOAHMP::NumVars));
193  lsm_lev0_flux[varIdx] = lev0_flux_ptr;
194  }
195 
196  bool
197  Get_Update_Status () override { return m_updated; }
198 
199  // Checkpoint/restore the NoahMP substep counter via m_itimestep (valid on every
200  // rank, unlike noahmpio_vect[0] which is absent on land-free ranks).
201  int
202  Get_LSM_Step () const override
203  {
204  return m_itimestep;
205  }
206 
207  void
208  Set_LSM_Step (int step) override
209  {
210  m_itimestep = step;
211  for (auto& noahmpio : noahmpio_vect) {
212  noahmpio.itimestep = step;
213  }
214  }
215 
216  // Write/read the full NoahMP prognostic state to/from a NetCDF restart dir so a
217  // restart reproduces a cold-start trajectory bitwise (#3255). ERF_NOAHMP_IO.cpp.
218  void
219  Write_Lsm_Restart (const std::string& dir) const override;
220 
221  void
222  Read_Lsm_Restart (const std::string& dir) override;
223 
224  // --- Advance_With_State pipeline helpers (ERF_NOAHMP_Advance.cpp) ---------
225 
226  // Fine-level (lev>0) coupling data/flux fill by interpolation from level 0,
227  // taken when there is no per-level NetCDF land file. Sets m_updated.
228  void
229  interp_from_lev0 (const int& lev,
230  amrex::MultiFab& cons_in,
231  const int& nstep);
232 
233  // Subcycling gate: true if the model fires this ERF step (advances the lockstep
234  // counter + sets m_updated). Identical on every rank.
235  bool
236  time_to_fire (const amrex::Real& elapsed_time);
237 
238  // Per surface box: stage ERF forcing into the pinned input buffer and copy into
239  // the NoahmpIO arrays (steps 1-3). blk bundles the block + its staging buffers.
240  void
241  stage_forcing (const amrex::MFIter& mfi,
242  const erf_noahmp::NoahmpBlockViews& blk,
243  const amrex::Box& bx,
244  const int& klo,
245  const int& lev,
246  const bool is_moist,
247  amrex::MultiFab& cons_in,
248  amrex::MultiFab& xvel_in,
249  amrex::MultiFab& yvel_in,
250  const erf_noahmp::PrecipSlots& precip,
251  amrex::Vector<erf_noahmp::ClampedPrecipCell>& clamped_cells,
252  amrex::Vector<erf_noahmp::InvariantPrecipCell>& invariant_cells);
253 
254  // Per surface box: read NoahmpIO results into the pinned output buffer and scatter
255  // them into the ERF coupling fields (steps 5-6), applying the -9999 fill guard.
256  void
257  read_results (const amrex::MFIter& mfi,
258  const erf_noahmp::NoahmpBlockViews& blk,
259  const amrex::Box& bx,
260  const amrex::Box& gbx,
261  amrex::MultiFab& cons_in);
262 
263  // --- Precip bookkeeping (ERF_NOAHMP_Precip.cpp) --------------------------
264 
265  // Collect the typed precip accumulator views for this Advance.
268 
269  // Lazily allocate + seed the per-level "previous cumulative accum" snapshots
270  // (cold start seeds from current; restart consumes m_precip_accum_restored).
271  void
272  prepare_precip_snapshots (const int& lev,
273  const erf_noahmp::PrecipSlots& precip);
274 
275  // Advance the snapshots to the current accumulation after the land call.
276  void
277  advance_precip_snapshots (const int& lev,
278  const erf_noahmp::PrecipSlots& precip);
279 
280  // Report (per rank, never silent) any cells clamped or rescaled by the guard.
281  void
282  report_precip_diagnostics (const int& lev,
283  const amrex::Vector<erf_noahmp::ClampedPrecipCell>& clamped_cells,
284  const amrex::Vector<erf_noahmp::InvariantPrecipCell>& invariant_cells);
285 
286  // 3 soil variable groups: smois, sh2o, tslb. All 3*nsoil buffer-size occurrences use this.
287  static constexpr int m_num_soil_groups = 3;
288 
289  // Index of soil field (g in {0:smois,1:sh2o,2:tslb}, k in [0,nsoil)) within
290  // lsm_fab_data. Output-buffer index is NoahmpOutputComp::NumComps + g*m_nsoil + k.
291  int soil_data_idx (int g, int k) const {
292  return LsmData_NOAHMP::NumVars + g*m_nsoil + k;
293  }
294 
295  // Resolve the soil-layer count and total LSM data size exactly once, before Init
296  // (the parent queries Lsm_Data_Size() first). Init later asserts vs namelist NSOIL.
297  bool m_nsoil_resolved = false;
299  if (m_nsoil_resolved) { return; }
300  amrex::ParmParse pp_nsoil("erf");
301  pp_nsoil.query("lsm_nsoil", m_nsoil);
302  AMREX_ALWAYS_ASSERT_WITH_MESSAGE(m_nsoil >= 1, "erf.lsm_nsoil must be >= 1");
304  m_nsoil_resolved = true;
305  }
306 
307  // VisMF file prefix for the level-l, slot-s previous-accumulation snapshot.
308  static std::string
309  m_precip_snapshot_name (const std::string& dir, int l, int s) {
310  return dir + "/precip_accum_prev_Level_" + std::to_string(l)
311  + "_slot_" + std::to_string(s);
312  }
313 
314 private:
315 
316  // Runs fn(noahmpio) per local block on a land-owning MPI subcommunicator, so a
317  // rank with zero local boxes doesn't join the collective nf90_create in
318  // WriteLand/WriteRestart/ReadRestart. ERF_NOAHMP_IO.cpp.
319  void with_land_comm (const std::function<void(NoahmpIO_type&)>& fn) const;
320 
321  // lsm data var count = fixed 2D fields + runtime soil profile (3 x m_nsoil).
322  // Finalized once m_nsoil is known; the fixed-field count is a safe lower bound.
324 
325  // number of lsm flux variables
327 
328  // LsmData map (state indices -> LsmVar enum)
329  amrex::Vector<int> LsmDataMap;
330 
331  // LsmFlux map (state indices -> LsmFlux enum)
332  amrex::Vector<int> LsmFluxMap;
333 
334  // Lsm data names
335  amrex::Vector<std::string> LsmDataName;
336 
337  // Lsm flux names
338  amrex::Vector<std::string> LsmFluxName;
339 
340  // geometry for atmosphere
341  amrex::Geometry m_geom;
342 
343  // geometry for atmosphere at lev==0
344  amrex::Geometry m_geom0;
345 
346  // geometry for lsm
347  amrex::Geometry m_lsm_geom;
348 
349  // refinement ratio
350  amrex::IntVect m_refRatio;
351 
352  // domain bc types
353  amrex::Vector<amrex::BCRec> m_domain_bcs_type;
354 
355  // timestep
357 
358  // Authoritative NoahMP substep counter, kept on the class so the firing decision
359  // is identical on every rank (including land-free ranks with empty noahmpio_vect).
360  int m_itimestep = 0;
361 
362  // NoahMP timestep (DTBL), broadcast to all ranks in Init so the firing
363  // decision is well-defined on land-free ranks too.
364  amrex::Real m_dtbl = std::numeric_limits<amrex::Real>::max();
365 
366  // Default -1; not written at runtime (single-slab LSM has no z extent to track).
367  int khi_lsm = -1;
368 
369  // Number of grid points in z
370  int m_nz_lsm = 1;
371 
372  // Size of grid spacing in z
374 
375  // LSM data variables, sized at runtime to NumVars + 3*m_nsoil (fixed 2D fields +
376  // the SMOIS/SH2O/TSLB soil profile). Vector, since m_nsoil is only known in Init.
377  amrex::Vector<FabPtr> lsm_fab_data;
378 
379  // LSM flux variables
380  amrex::Array<FabPtr, LsmFlux_NOAHMP::NumVars> lsm_fab_flux;
381 
382  // LSM data variables at level 0 (runtime-sized, see lsm_fab_data)
383  amrex::Vector<amrex::MultiFab*> lsm_lev0_data;
384 
385  // LSM flux variables at level 0
386  amrex::Array<amrex::MultiFab*, LsmFlux_NOAHMP::NumVars> lsm_lev0_flux {};
387 
388  // Number of Noah-MP soil layers, set from erf.lsm_nsoil (identical on every rank,
389  // so no broadcast needed for the collective writes). Asserted vs namelist NSOIL.
390  int m_nsoil = 4;
391 
392  // Vector to store NoahmpIO objects at a level
393  NoahmpIO_vector noahmpio_vect;
394 
395  // Pinned memory buffers for host/device coupling to Noah-MP
396  amrex::Vector<std::unique_ptr<amrex::FArrayBox>> noahmp_input_tmp;
397  amrex::Vector<std::unique_ptr<amrex::FArrayBox>> noahmp_output_tmp;
398 
399  // Previous cumulative precip accumulator (native units) per slot per level;
400  // interval precip is (current - this) * native_to_kg_m2. Only provided slots exist.
401  amrex::Vector<amrex::Array<std::unique_ptr<amrex::MultiFab>, NoahmpPrecipSlot::NumSlots>>
403 
404  // Checkpointed previous-accumulation snapshots staged by Read_Lsm_Restart, consumed
405  // (reset) by the first Advance. Empty on a cold start or legacy checkpoint.
406  amrex::Array<std::unique_ptr<amrex::MultiFab>, NoahmpPrecipSlot::NumSlots> m_precip_accum_restored;
407 
408  // This instance's AMR level (set in Init); keys the per-level snapshot filenames.
409  int m_lev = 0;
410 
411  // Update status
412  bool m_updated = false;
413 
414  // Do we have a nc init file?
415  bool m_has_nc_file = false;
416 };
417 #endif
constexpr amrex::Real one
Definition: ERF_Constants.H:9
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
AMREX_ALWAYS_ASSERT_WITH_MESSAGE(m_cloud_chamber_config.active, "Cloud Chamber: initializer reached without a parsed configuration")
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int idx(int i, int j, int k, int nx, int ny)
Definition: ERF_InitForEnsemble.cpp:365
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_NOAHMP.H:57
int Lsm_DataIndex(std::string varname) override
Definition: ERF_NOAHMP.H:145
std::string Lsm_DataName(const int &varIdx) override
Definition: ERF_NOAHMP.H:136
int khi_lsm
Definition: ERF_NOAHMP.H:367
bool m_nsoil_resolved
Definition: ERF_NOAHMP.H:297
NOAHMP()
Definition: ERF_NOAHMP.H:63
void Define(SolverChoice &) override
Definition: ERF_NOAHMP.H:70
std::string Lsm_FluxName(const int &varIdx) override
Definition: ERF_NOAHMP.H:159
amrex::Vector< amrex::BCRec > m_domain_bcs_type
Definition: ERF_NOAHMP.H:353
void Plot_Landfile(const int &nstep) override
Definition: ERF_NOAHMP_IO.cpp:46
static std::string m_precip_snapshot_name(const std::string &dir, int l, int s)
Definition: ERF_NOAHMP.H:309
void Advance_With_State(const int &lev, amrex::MultiFab &cons_in, amrex::MultiFab &xvel_in, amrex::MultiFab &yvel_in, amrex::MultiFab *hfx3_out, amrex::MultiFab *qfx3_out, const SurfacePrecipAccumulationSources &precip_sources, const amrex::Real &elapsed_time, const amrex::Real &dt, const int &nstep, const bool updated_lev0) override
Definition: ERF_NOAHMP_Advance.cpp:342
int Lsm_FluxIndex(std::string varname) override
Definition: ERF_NOAHMP.H:168
amrex::Array< amrex::MultiFab *, LsmFlux_NOAHMP::NumVars > lsm_lev0_flux
Definition: ERF_NOAHMP.H:386
amrex::Array< FabPtr, LsmFlux_NOAHMP::NumVars > lsm_fab_flux
Definition: ERF_NOAHMP.H:380
bool m_updated
Definition: ERF_NOAHMP.H:412
int Get_LSM_Step() const override
Definition: ERF_NOAHMP.H:202
void Write_Lsm_Restart(const std::string &dir) const override
Definition: ERF_NOAHMP_IO.cpp:54
amrex::Vector< std::string > LsmDataName
Definition: ERF_NOAHMP.H:335
std::shared_ptr< amrex::MultiFab > FabPtr
Definition: ERF_NOAHMP.H:59
amrex::Vector< int > LsmDataMap
Definition: ERF_NOAHMP.H:329
void read_results(const amrex::MFIter &mfi, const erf_noahmp::NoahmpBlockViews &blk, const amrex::Box &bx, const amrex::Box &gbx, amrex::MultiFab &cons_in)
Definition: ERF_NOAHMP_Advance.cpp:207
void Init(const int &lev, const amrex::MultiFab &cons_in, const amrex::Geometry &geom, const amrex::Geometry &geom0, amrex::Vector< amrex::BCRec > &domain_bcs_type, amrex::IntVect &refRatio, const amrex::Real &dt, amrex::Vector< amrex::Vector< std::string >> &nc_init_file) override
Definition: ERF_NOAHMP_Init.cpp:22
amrex::Vector< std::unique_ptr< amrex::FArrayBox > > noahmp_output_tmp
Definition: ERF_NOAHMP.H:397
int soil_data_idx(int g, int k) const
Definition: ERF_NOAHMP.H:291
amrex::Vector< std::unique_ptr< amrex::FArrayBox > > noahmp_input_tmp
Definition: ERF_NOAHMP.H:396
int m_nsoil
Definition: ERF_NOAHMP.H:390
int Lsm_Flux_Size() override
Definition: ERF_NOAHMP.H:132
bool Get_Update_Status() override
Definition: ERF_NOAHMP.H:197
int Lsm_Data_Size() override
Definition: ERF_NOAHMP.H:128
amrex::Geometry Lsm_Geom() override
Definition: ERF_NOAHMP.H:123
amrex::IntVect m_refRatio
Definition: ERF_NOAHMP.H:350
void Read_Lsm_Restart(const std::string &dir) override
Definition: ERF_NOAHMP_IO.cpp:73
amrex::Vector< FabPtr > lsm_fab_data
Definition: ERF_NOAHMP.H:377
NoahmpIO_vector noahmpio_vect
Definition: ERF_NOAHMP.H:393
int m_lsm_data_size
Definition: ERF_NOAHMP.H:323
erf_noahmp::PrecipSlots collect_precip_sources(const SurfacePrecipAccumulationSources &precip_sources)
Definition: ERF_NOAHMP_Precip.cpp:20
void with_land_comm(const std::function< void(NoahmpIO_type &)> &fn) const
Definition: ERF_NOAHMP_IO.cpp:19
void report_precip_diagnostics(const int &lev, const amrex::Vector< erf_noahmp::ClampedPrecipCell > &clamped_cells, const amrex::Vector< erf_noahmp::InvariantPrecipCell > &invariant_cells)
Definition: ERF_NOAHMP_Precip.cpp:80
virtual ~NOAHMP()=default
int m_lev
Definition: ERF_NOAHMP.H:409
amrex::Geometry m_lsm_geom
Definition: ERF_NOAHMP.H:347
int m_itimestep
Definition: ERF_NOAHMP.H:360
amrex::Geometry m_geom0
Definition: ERF_NOAHMP.H:344
void stage_forcing(const amrex::MFIter &mfi, const erf_noahmp::NoahmpBlockViews &blk, const amrex::Box &bx, const int &klo, const int &lev, const bool is_moist, amrex::MultiFab &cons_in, amrex::MultiFab &xvel_in, amrex::MultiFab &yvel_in, const erf_noahmp::PrecipSlots &precip, amrex::Vector< erf_noahmp::ClampedPrecipCell > &clamped_cells, amrex::Vector< erf_noahmp::InvariantPrecipCell > &invariant_cells)
Definition: ERF_NOAHMP_Advance.cpp:76
void prepare_precip_snapshots(const int &lev, const erf_noahmp::PrecipSlots &precip)
Definition: ERF_NOAHMP_Precip.cpp:38
bool m_has_nc_file
Definition: ERF_NOAHMP.H:415
int m_nz_lsm
Definition: ERF_NOAHMP.H:370
amrex::Vector< amrex::MultiFab * > lsm_lev0_data
Definition: ERF_NOAHMP.H:383
int m_lsm_flux_size
Definition: ERF_NOAHMP.H:326
amrex::Vector< amrex::Array< std::unique_ptr< amrex::MultiFab >, NoahmpPrecipSlot::NumSlots > > m_precip_accum_prev
Definition: ERF_NOAHMP.H:402
amrex::Real m_dtbl
Definition: ERF_NOAHMP.H:364
void interp_from_lev0(const int &lev, amrex::MultiFab &cons_in, const int &nstep)
Definition: ERF_NOAHMP_Advance.cpp:24
void Lsm_Set_Lev0_Flux_Ptr(const int &varIdx, amrex::MultiFab *lev0_flux_ptr) override
Definition: ERF_NOAHMP.H:189
amrex::Vector< int > LsmFluxMap
Definition: ERF_NOAHMP.H:332
void Lsm_Set_Lev0_Data_Ptr(const int &varIdx, amrex::MultiFab *lev0_data_ptr) override
Definition: ERF_NOAHMP.H:181
void Set_LSM_Step(int step) override
Definition: ERF_NOAHMP.H:208
amrex::MultiFab * Lsm_Data_Ptr(const int &varIdx) override
Definition: ERF_NOAHMP.H:105
static constexpr int m_num_soil_groups
Definition: ERF_NOAHMP.H:287
amrex::Array< std::unique_ptr< amrex::MultiFab >, NoahmpPrecipSlot::NumSlots > m_precip_accum_restored
Definition: ERF_NOAHMP.H:406
void m_ensure_nsoil_resolved()
Definition: ERF_NOAHMP.H:298
amrex::Vector< std::string > LsmFluxName
Definition: ERF_NOAHMP.H:338
void advance_precip_snapshots(const int &lev, const erf_noahmp::PrecipSlots &precip)
Definition: ERF_NOAHMP_Precip.cpp:66
amrex::Geometry m_geom
Definition: ERF_NOAHMP.H:341
bool time_to_fire(const amrex::Real &elapsed_time)
Definition: ERF_NOAHMP_Advance.cpp:59
amrex::Real m_dz_lsm
Definition: ERF_NOAHMP.H:373
amrex::MultiFab * Lsm_Flux_Ptr(const int &varIdx) override
Definition: ERF_NOAHMP.H:114
amrex::Real m_dt
Definition: ERF_NOAHMP.H:356
Definition: ERF_NullSurf.H:10
@ NumVars
Definition: ERF_NOAHMP_Fields.H:109
@ NumVars
Definition: ERF_NOAHMP_Fields.H:122
@ NumSlots
Definition: ERF_NOAHMP_Fields.H:135
Definition: ERF_NOAHMP.H:31
real(c_double), parameter g
Definition: ERF_module_model_constants.F90:19
Definition: ERF_DataStruct.H:241
Definition: ERF_SurfacePrecipitation.H:21
Definition: ERF_NOAHMP.H:42
int i
Definition: ERF_NOAHMP.H:42
amrex::Real raw_mm
Definition: ERF_NOAHMP.H:42
int j
Definition: ERF_NOAHMP.H:42
Definition: ERF_NOAHMP.H:46
int j
Definition: ERF_NOAHMP.H:46
amrex::Real froz_mm
Definition: ERF_NOAHMP.H:46
amrex::Real total_mm
Definition: ERF_NOAHMP.H:46
int i
Definition: ERF_NOAHMP.H:46
Definition: ERF_NOAHMP.H:50
NoahmpIO_type * io
Definition: ERF_NOAHMP.H:51
amrex::Array4< amrex::Real > output
Definition: ERF_NOAHMP.H:53
amrex::Array4< amrex::Real > input
Definition: ERF_NOAHMP.H:52
Definition: ERF_NOAHMP.H:34
bool have_any
Definition: ERF_NOAHMP.H:38
bool has[NoahmpPrecipSlot::NumSlots]
Definition: ERF_NOAHMP.H:37
const amrex::MultiFab * accum[NoahmpPrecipSlot::NumSlots]
Definition: ERF_NOAHMP.H:35
amrex::Real factor[NoahmpPrecipSlot::NumSlots]
Definition: ERF_NOAHMP.H:36