ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF.H
Go to the documentation of this file.
1 #ifndef ERF_H_
2 #define ERF_H_
3 
4 #include <string>
5 #include <limits>
6 #include <memory>
7 
8 #ifdef _OPENMP
9 #include <omp.h>
10 #endif
11 
12 #include <AMReX_AmrCore.H>
13 #include <AMReX_BCRec.H>
14 
15 #include <AMReX_ParallelDescriptor.H>
16 #include <AMReX_ParmParse.H>
17 #include <AMReX_MultiFabUtil.H>
18 #include <AMReX_FillPatchUtil.H>
19 #include <AMReX_VisMF.H>
20 #include <AMReX_PhysBCFunct.H>
21 #include <AMReX_YAFluxRegister.H>
22 #include <AMReX_ErrorList.H>
23 
24 #ifdef AMREX_MEM_PROFILING
25 #include <AMReX_MemProfiler.H>
26 #endif
27 
28 #include "prob_common.H"
29 
30 #include <IndexDefines.H>
31 #include <DataStruct.H>
32 #include <InputSoundingData.H>
33 #include <InputSpongeData.H>
34 #include <ABLMost.H>
35 #include <Derive.H>
36 #include <ERF_ReadBndryPlanes.H>
37 #include <ERF_WriteBndryPlanes.H>
38 #include <ERF_MRI.H>
39 #include <ERF_PhysBCFunct.H>
40 #include <ERF_FillPatcher.H>
41 
42 #ifdef ERF_USE_PARTICLES
43 #include "ParticleData.H"
44 #endif
45 
46 #include "EulerianMicrophysics.H"
47 #include "LagrangianMicrophysics.H"
48 #include "LandSurface.H"
49 
50 #ifdef ERF_USE_RRTMGP
51 #include "Radiation.H"
52 #endif
53 
54 #include <iostream>
55 
56 #ifdef AMREX_LAZY
57 #include <AMReX_Lazy.H>
58 #endif
59 
60 #ifdef ERF_USE_MULTIBLOCK
62 #endif
63 
64 /**
65  * Enum of possible coarse/fine interpolation options
66 */
67 namespace InterpType {
68  enum {
69  PCInterp = 0,
78  };
79 }
80 
81 /**
82  * Main class in ERF code, instantiated from main.cpp
83 */
84 
85 class ERF
86  : public amrex::AmrCore
87 {
88 public:
89 
90  ////////////////
91  // public member functions
92 
93  // constructor - reads in parameters from inputs file
94  // - sizes multilevel arrays and data structures
95  ERF ();
96  ~ERF () override;
97 
98  // Declare a default move constructor so we ensure the destructor is
99  // not called when we return an object of this class by value
100  ERF (ERF&&) noexcept = delete;
101 
102  // Declare a default move assignment operator
103  ERF& operator=(ERF&& other) noexcept = delete;
104 
105  // Delete the copy constructor
106  ERF (const ERF& other) = delete;
107  //
108  // Delete the copy assignment operator
109  ERF& operator=(const ERF& other) = delete;
110 
111  // Advance solution to final time
112  void Evolve ();
113 
114  // Tag cells for refinement
115  void ErrorEst (int lev, amrex::TagBoxArray& tags, amrex::Real time, int ngrow) override;
116 
117  // Initialize multilevel data
118  void InitData ();
119 
120 #ifdef ERF_USE_EB
121  void WriteMyEBSurface ();
122 #endif
123 
124 #ifdef ERF_USE_POISSON_SOLVE
125  // Project the velocities to be divergence-free
126  void project_velocities (int lev, amrex::Real dt, amrex::Vector<amrex::MultiFab >& vars, amrex::MultiFab& p);
127 
128  // Project the velocities to be divergence-free with a thin body
129  void project_velocities_tb (int lev, amrex::Real dt, amrex::Vector<amrex::MultiFab >& vars, amrex::MultiFab& p);
130 
131  // Define the projection bc's based on the domain bc types
132  amrex::Array<amrex::LinOpBCType,AMREX_SPACEDIM>
133  get_projection_bc (amrex::Orientation::Side side) const noexcept;
134  bool projection_has_dirichlet (amrex::Array<amrex::LinOpBCType,AMREX_SPACEDIM> bcs) const;
135 
136 #endif
137 
138  // Init (NOT restart or regrid)
139  void init_only (int lev, amrex::Real time);
140 
141  // Restart
142  void restart ();
143 
144  // Is it time to write a plotfile or checkpoint?
145  bool writeNow (const amrex::Real cur_time, const amrex::Real dt, const int nstep, const int plot_int, const amrex::Real plot_per);
146 
147  // Called after every level 0 timestep
148  void post_timestep (int nstep, amrex::Real time, amrex::Real dt_lev);
149 
150  // Diagnostics
151  void sum_integrated_quantities (amrex::Real time);
152  void write_1D_profiles (amrex::Real time);
153  void write_1D_profiles_stag (amrex::Real time);
154 
155  // Fill the physical boundary conditions for cell-centered velocity (diagnostic only)
156  void FillBdyCCVels (amrex::Vector<amrex::MultiFab>& mf_cc_vel);
157 
158  void sample_points (int lev, amrex::Real time, amrex::IntVect cell, amrex::MultiFab& mf);
159  void sample_lines (int lev, amrex::Real time, amrex::IntVect cell, amrex::MultiFab& mf);
160 
161  void derive_diag_profiles (amrex::Gpu::HostVector<amrex::Real>& h_avg_u , amrex::Gpu::HostVector<amrex::Real>& h_avg_v ,
162  amrex::Gpu::HostVector<amrex::Real>& h_avg_w , amrex::Gpu::HostVector<amrex::Real>& h_avg_rho,
163  amrex::Gpu::HostVector<amrex::Real>& h_avg_th , amrex::Gpu::HostVector<amrex::Real>& h_avg_ksgs,
164  amrex::Gpu::HostVector<amrex::Real>& h_avg_qv , amrex::Gpu::HostVector<amrex::Real>& h_avg_qc ,
165  amrex::Gpu::HostVector<amrex::Real>& h_avg_qr ,
166  amrex::Gpu::HostVector<amrex::Real>& h_avg_wqv , amrex::Gpu::HostVector<amrex::Real>& h_avg_wqc ,
167  amrex::Gpu::HostVector<amrex::Real>& h_avg_wqr ,
168  amrex::Gpu::HostVector<amrex::Real>& h_avg_qi , amrex::Gpu::HostVector<amrex::Real>& h_avg_qs ,
169  amrex::Gpu::HostVector<amrex::Real>& h_avg_qg ,
170  amrex::Gpu::HostVector<amrex::Real>& h_avg_uu , amrex::Gpu::HostVector<amrex::Real>& h_avg_uv ,
171  amrex::Gpu::HostVector<amrex::Real>& h_avg_uw,
172  amrex::Gpu::HostVector<amrex::Real>& h_avg_vv , amrex::Gpu::HostVector<amrex::Real>& h_avg_vw ,
173  amrex::Gpu::HostVector<amrex::Real>& h_avg_ww,
174  amrex::Gpu::HostVector<amrex::Real>& h_avg_uth , amrex::Gpu::HostVector<amrex::Real>& h_avg_vth,
175  amrex::Gpu::HostVector<amrex::Real>& h_avg_wth, amrex::Gpu::HostVector<amrex::Real>& h_avg_thth,
176  amrex::Gpu::HostVector<amrex::Real>& h_avg_ku, amrex::Gpu::HostVector<amrex::Real>& h_avg_kv,
177  amrex::Gpu::HostVector<amrex::Real>& h_avg_kw,
178  amrex::Gpu::HostVector<amrex::Real>& h_avg_p,
179  amrex::Gpu::HostVector<amrex::Real>& h_avg_pu, amrex::Gpu::HostVector<amrex::Real>& h_avg_pv,
180  amrex::Gpu::HostVector<amrex::Real>& h_avg_pw);
181  void derive_diag_profiles_stag (amrex::Gpu::HostVector<amrex::Real>& h_avg_u , amrex::Gpu::HostVector<amrex::Real>& h_avg_v ,
182  amrex::Gpu::HostVector<amrex::Real>& h_avg_w , amrex::Gpu::HostVector<amrex::Real>& h_avg_rho,
183  amrex::Gpu::HostVector<amrex::Real>& h_avg_th , amrex::Gpu::HostVector<amrex::Real>& h_avg_ksgs,
184  amrex::Gpu::HostVector<amrex::Real>& h_avg_uu , amrex::Gpu::HostVector<amrex::Real>& h_avg_uv ,
185  amrex::Gpu::HostVector<amrex::Real>& h_avg_uw,
186  amrex::Gpu::HostVector<amrex::Real>& h_avg_vv , amrex::Gpu::HostVector<amrex::Real>& h_avg_vw ,
187  amrex::Gpu::HostVector<amrex::Real>& h_avg_ww,
188  amrex::Gpu::HostVector<amrex::Real>& h_avg_uth , amrex::Gpu::HostVector<amrex::Real>& h_avg_vth,
189  amrex::Gpu::HostVector<amrex::Real>& h_avg_wth, amrex::Gpu::HostVector<amrex::Real>& h_avg_thth,
190  amrex::Gpu::HostVector<amrex::Real>& h_avg_ku, amrex::Gpu::HostVector<amrex::Real>& h_avg_kv,
191  amrex::Gpu::HostVector<amrex::Real>& h_avg_kw,
192  amrex::Gpu::HostVector<amrex::Real>& h_avg_p,
193  amrex::Gpu::HostVector<amrex::Real>& h_avg_pu, amrex::Gpu::HostVector<amrex::Real>& h_avg_pv,
194  amrex::Gpu::HostVector<amrex::Real>& h_avg_pw);
195 
196  void derive_stress_profiles (amrex::Gpu::HostVector<amrex::Real>& h_avg_tau11, amrex::Gpu::HostVector<amrex::Real>& h_avg_tau12,
197  amrex::Gpu::HostVector<amrex::Real>& h_avg_tau13, amrex::Gpu::HostVector<amrex::Real>& h_avg_tau22,
198  amrex::Gpu::HostVector<amrex::Real>& h_avg_tau23, amrex::Gpu::HostVector<amrex::Real>& h_avg_tau33,
199  amrex::Gpu::HostVector<amrex::Real>& h_avg_hfx3, amrex::Gpu::HostVector<amrex::Real>& h_avg_diss);
200  void derive_stress_profiles_stag (amrex::Gpu::HostVector<amrex::Real>& h_avg_tau11, amrex::Gpu::HostVector<amrex::Real>& h_avg_tau12,
201  amrex::Gpu::HostVector<amrex::Real>& h_avg_tau13, amrex::Gpu::HostVector<amrex::Real>& h_avg_tau22,
202  amrex::Gpu::HostVector<amrex::Real>& h_avg_tau23, amrex::Gpu::HostVector<amrex::Real>& h_avg_tau33,
203  amrex::Gpu::HostVector<amrex::Real>& h_avg_hfx3, amrex::Gpu::HostVector<amrex::Real>& h_avg_diss);
204 
205  // Perform the volume-weighted sum
206  amrex::Real
207  volWgtSumMF (int lev, const amrex::MultiFab& mf, int comp,
208  const amrex::MultiFab& mapfac,
209  bool local, bool finemask);
210 
211  // Decide if it is time to take an action
212  static bool is_it_time_for_action (int nstep, amrex::Real time, amrex::Real dt,
213  int action_interval, amrex::Real action_per);
214 
215  // Make a new level using provided BoxArray and DistributionMapping and
216  // fill with interpolated coarse level data.
217  // overrides the pure virtual function in AmrCore
218  void MakeNewLevelFromCoarse (int lev, amrex::Real time, const amrex::BoxArray& ba,
219  const amrex::DistributionMapping& dm) override;
220 
221  // Remake an existing level using provided BoxArray and DistributionMapping and
222  // fill with existing fine and coarse data.
223  // overrides the pure virtual function in AmrCore
224  void RemakeLevel (int lev, amrex::Real time, const amrex::BoxArray& ba,
225  const amrex::DistributionMapping& dm) override;
226 
227  // Delete level data
228  // overrides the pure virtual function in AmrCore
229  void ClearLevel (int lev) override;
230 
231  // Make a new level from scratch using provided BoxArray and DistributionMapping.
232  // Only used during initialization.
233  // overrides the pure virtual function in AmrCore
234  void MakeNewLevelFromScratch (int lev, amrex::Real time, const amrex::BoxArray& ba,
235  const amrex::DistributionMapping& dm) override;
236 
237  // compute dt from CFL considerations
238  amrex::Real estTimeStep (int lev, long& dt_fast_ratio) const;
239 
240  // Interface for advancing the data at one level by one "slow" timestep
241  void advance_dycore (int level,
242  amrex::Vector<amrex::MultiFab>& state_old,
243  amrex::Vector<amrex::MultiFab>& state_new,
244  amrex::MultiFab& xvel_old, amrex::MultiFab& yvel_old, amrex::MultiFab& zvel_old,
245  amrex::MultiFab& xvel_new, amrex::MultiFab& yvel_new, amrex::MultiFab& zvel_new,
246  amrex::MultiFab& source, amrex::MultiFab& xmom_src,
247  amrex::MultiFab& ymom_src, amrex::MultiFab& zmom_src,
248  amrex::Geometry fine_geom,
249  amrex::Real dt, amrex::Real time);
250 
251  void advance_microphysics (int lev,
252  amrex::MultiFab& cons_in,
253  const amrex::Real& dt_advance,
254  const int& iteration,
255  const amrex::Real& time);
256 
257  void advance_lsm (int lev,
258  amrex::MultiFab& /*cons_in*/,
259  const amrex::Real& dt_advance);
260 
261 #if defined(ERF_USE_RRTMGP)
262  void advance_radiation (int lev,
263  amrex::MultiFab& cons_in,
264  const amrex::Real& dt_advance);
265 #endif
266 
267  amrex::MultiFab& build_fine_mask (int lev);
268 
269  void MakeHorizontalAverages ();
270  void MakeDiagnosticAverage (amrex::Vector<amrex::Real>& h_havg, amrex::MultiFab& S, int n);
271  void derive_upwp (amrex::Vector<amrex::Real>& h_havg);
272 
273  // write plotfile to disk
274  void WritePlotFile (int which, amrex::Vector<std::string> plot_var_names);
275 
276  void WriteMultiLevelPlotfileWithTerrain (const std::string &plotfilename,
277  int nlevels,
278  const amrex::Vector<const amrex::MultiFab*> &mf,
279  const amrex::Vector<const amrex::MultiFab*> &mf_nd,
280  const amrex::Vector<std::string> &varnames,
281  amrex::Real time,
282  const amrex::Vector<int> &level_steps,
283  const std::string &versionName = "HyperCLaw-V1.1",
284  const std::string &levelPrefix = "Level_",
285  const std::string &mfPrefix = "Cell",
286  const amrex::Vector<std::string>& extra_dirs = amrex::Vector<std::string>()) const;
287 
288 
289  void WriteGenericPlotfileHeaderWithTerrain (std::ostream &HeaderFile,
290  int nlevels,
291  const amrex::Vector<amrex::BoxArray> &bArray,
292  const amrex::Vector<std::string> &varnames,
293  amrex::Real time,
294  const amrex::Vector<int> &level_steps,
295  const std::string &versionName,
296  const std::string &levelPrefix,
297  const std::string &mfPrefix) const;
298 
299  void erf_enforce_hse (int lev,
300  amrex::MultiFab& dens, amrex::MultiFab& pres, amrex::MultiFab& pi,
301  std::unique_ptr<amrex::MultiFab>& z_cc);
302 
303 #ifdef ERF_USE_NETCDF
304  //! Write a timestep to 1D vertical column output for coupling
305  void writeToNCColumnFile (int lev,
306  const std::string& colfile_name, amrex::Real xloc, amrex::Real yloc,
307  amrex::Real time);
308 #endif //ERF_USE_NETCDF
309 
310  void init_from_input_sounding (int lev);
311 
312  void input_sponge (int lev);
313 
314  void init_from_hse (int lev);
315 
316 #ifdef ERF_USE_MULTIBLOCK
317  // constructor used when ERF is created by a multiblock driver
318  // calls AmrCore constructor -> AmrMesh constructor
319  ERF (const amrex::RealBox& rb, int max_level_in,
320  const amrex::Vector<int>& n_cell_in, int coord,
321  const amrex::Vector<amrex::IntVect>& ref_ratios,
322  const amrex::Array<int,AMREX_SPACEDIM>& is_per,
323  std::string prefix);
324 
325  // Advance a block specified number of time steps
326  void Evolve_MB (int MBstep, int max_block_step);
327 
328  // get the current time values
329  amrex::Real get_t_old() {return t_old[0];}
330  amrex::Real get_t_new() {return t_new[0];}
331 
332  // Set parmparse prefix for MultiBlock
333  void SetParmParsePrefix (std::string name) { pp_prefix = name; }
334 
335  // Set 'this' from multiblock container
336  void SetMultiBlockPointer (MultiBlockContainer *mbc) { m_mbc = mbc; }
337 
338  // Public data copy for MB
339  std::vector<amrex::Box> domain_p;
340  MultiBlockContainer *m_mbc = nullptr;
341  amrex::Vector<amrex::Vector<amrex::MultiFab> > vars_new;
342  amrex::Vector<amrex::Vector<amrex::MultiFab> > vars_old;
343 
344  // Velocity time averaged field
345  amrex::Vector<std::unique_ptr<amrex::MultiFab>> vel_t_avg;
346  amrex::Vector<int> t_avg_cnt;
347 
348 #endif
349  std::string pp_prefix {"erf"};
350 
351  void fill_from_bndryregs (const amrex::Vector<amrex::MultiFab*>& mfs,
352  amrex::Real time);
353 
354 #ifdef ERF_USE_NETCDF
355  void fill_from_realbdy (const amrex::Vector<amrex::MultiFab*>& mfs,
356  amrex::Real time,
357  bool cons_only,
358  int icomp_cons,
359  int ncomp_cons);
360 #endif
361 
362 #ifdef ERF_USE_NETCDF
363  void init_from_wrfinput (int lev);
364  void init_from_metgrid (int lev);
365 #endif // ERF_USE_NETCDF
366 
367 #ifdef ERF_USE_WINDFARM
368  void init_windfarm(int lev);
369 #endif
370 
371 #ifdef ERF_USE_EB
372  void MakeEBGeometry ();
373  void make_eb_box ();
374  void make_eb_cylinder ();
375  void make_eb_regular ();
376 #endif
377 
378  // more flexible version of AverageDown() that lets you average down across multiple levels
379  void AverageDownTo (int crse_lev, int scomp, int ncomp); // NOLINT
380 
381 private:
382 
383  ///////////////////////////
384  // private member functions
385  ///////////////////////////
386 
387  // read in some parameters from inputs file
388  void ReadParameters ();
389 
390  // set covered coarse cells/faces to be the average of overlying fine cells/faces
391  void AverageDown ();
392 
393  void update_diffusive_arrays (int lev, const amrex::BoxArray& ba, const amrex::DistributionMapping& dm);
394 
395  void update_terrain_arrays (int lev, amrex::Real time);
396 
397  void Construct_ERFFillPatchers (int lev);
398 
399  void Define_ERFFillPatchers (int lev);
400 
401  void init1DArrays ();
402 
403  void init_bcs ();
404 
405  void init_custom (int lev);
406 
407  void init_uniform (int lev);
408 
409  void init_stuff (int lev, const amrex::BoxArray& ba, const amrex::DistributionMapping& dm,
410  amrex::Vector<amrex::MultiFab>& lev_new,
411  amrex::Vector<amrex::MultiFab>& lev_old);
412 
413  // Initialize the integrator object
414  void initialize_integrator (int lev, amrex::MultiFab& cons_mf, amrex::MultiFab& vel_mf);
415 
416  // Initialize the bc routines
417  void initialize_bcs (int lev);
418 
419  // Initialize the microphysics object
420  void initializeMicrophysics (const int&);
421 
422  // Compute a vector of new MultiFabs by copying from valid region and filling ghost cells
423  //
424  // NOTE: FillPatch takes in an empty MF, and returns cell-centered + velocities (not momenta)
425  //
426  void FillPatch (int lev, amrex::Real time,
427  const amrex::Vector<amrex::MultiFab*>& mfs_vel,
428  const amrex::Vector<amrex::MultiFab*>& mfs_mom,
429  bool fillset=true, bool cons_only=false);
430 
431  // Compute a new MultiFab by copying from valid region and filling ghost cells -
432  void FillPatchMoistVars (int lev, amrex::MultiFab& mf);
433 
434  // Compute new multifabs by copying data from valid region and filling ghost cells.
435  // Unlike FillPatch, FillIntermediatePatch will use the supplied multifabs instead of fine level data.
436  // This is to support filling boundary cells at an intermediate time between old/new times
437  // on the fine level when valid data at a specific time is already available (such as
438  // at each RK stage when integrating between initial and final times at a given level).
439  //
440  // NOTE: FillIntermediatePatch takes in updated momenta, and returns both updated velocity and momenta
441  //
442  void FillIntermediatePatch (int lev, amrex::Real time,
443  const amrex::Vector<amrex::MultiFab*>& mfs_vel,
444  const amrex::Vector<amrex::MultiFab*>& mfs_mom,
445  int ng_cons, int ng_vel, bool cons_only, int icomp_cons, int ncomp_cons,
446  bool allow_most_bcs = true);
447 
448  // Fill all multifabs (and all components) in a vector of multifabs corresponding to the
449  // grid variables defined in vars_old and vars_new just as FillCoarsePatch.
450  void FillCoarsePatch (int lev, amrex::Real time);
451 
452  // advance a level by dt
453  // includes a recursive call for finer levels
454  void timeStep (int lev, amrex::Real time, int iteration);
455 
456  // advance a single level for a single time step
457  void Advance (int lev, amrex::Real time, amrex::Real dt_lev, int iteration, int ncycle);
458 
459  //! Initialize HSE
460  void initHSE ();
461  void initHSE (int lev);
462 
463  //! Initialize Rayleigh damping profiles
464  void initRayleigh ();
465 
466  //! Initialize sponge profiles
467  void initSponge ();
468 
469  //! Set Rayleigh mean profiles from input sounding
470  void setRayleighRefFromSounding (bool restarting);
471 
472  //! Set sponge mean profiles from input sounding
473  void setSpongeRefFromSounding (bool restarting);
474 
475  // a wrapper for estTimeStep()
476  void ComputeDt ();
477 
478  // get plotfile name
479  [[nodiscard]] std::string PlotFileName (int lev) const;
480 
481  // set plotfile variables names
482  static amrex::Vector<std::string> PlotFileVarNames (amrex::Vector<std::string> plot_var_names) ;
483 
484  // set which variables and derived quantities go into plotfiles
485  void setPlotVariables (const std::string& pp_plot_var_names, amrex::Vector<std::string>& plot_var_names);
486  // append variables to plot
487  void appendPlotVariables (const std::string& pp_plot_var_names, amrex::Vector<std::string>& plot_var_names);
488 
489 #ifdef ERF_USE_NETCDF
490  //! Write plotfile using NETCDF
491  void writeNCPlotFile (int lev, int which, const std::string& dir,
492  const amrex::Vector<const amrex::MultiFab*> &mf,
493  const amrex::Vector<std::string> &plot_var_names,
494  const amrex::Vector<int>& level_steps, amrex::Real time) const;
495 
496  //! Write checkpointFile using NetCdf
497  void WriteNCCheckpointFile () const;
498 
499  //! Read checkpointFile for restart
500  void ReadNCCheckpointFile ();
501 
502  //! Write MultiFab in NetCDF format
503  static void WriteNCMultiFab (const amrex::FabArray<amrex::FArrayBox> &fab,
504  const std::string& name,
505  bool set_ghost = false) ;
506 
507  //! Read MultiFab in NetCDF format
508  void ReadNCMultiFab (amrex::FabArray<amrex::FArrayBox> &mf,
509  const std::string &name,
510  int coordinatorProc = amrex::ParallelDescriptor::IOProcessorNumber(),
511  int allow_empty_mf = 0);
512 
513  //! Create 1D vertical column output for coupling
514  void createNCColumnFile (int lev,
515  const std::string& colfile_name, amrex::Real xloc, amrex::Real yloc);
516 
517  // Copy from the NC*fabs into the MultiFabs holding the boundary data
518  void init_from_wrfbdy (amrex::Vector<amrex::FArrayBox*> x_vel_lateral,
519  amrex::Vector<amrex::FArrayBox*> y_vel_lateral,
520  amrex::Vector<amrex::FArrayBox*> z_vel_lateral,
521  amrex::Vector<amrex::FArrayBox*> T_lateral);
522 
523  amrex::Real start_bdy_time;
524 
525  // *** *** FArrayBox's for holding the SURFACE data
526  // amrex::IArrayBox NC_IVGTYP_fab; // Vegetation type (IVGTYP); Discrete numbers;
527  // amrex::FArrayBox NC_z0_fab; // Surface Roughness, z0 = z0 (IVGTYP)
528  // amrex::FArrayBox NC_PSFC_fab; // Surface pressure
529 
530  // TODO: Clarify the relation between SST and TSK
531  // amrex::FArrayBox NC_SST_fab; // Sea Surface Temperature; Defined even for land area
532  // amrex::FArrayBox NC_TSK_fab; // Surface Skin Temperature; Appears to be same as SST...
533 
534  // Vectors (over time) of Vector (over variables) of FArrayBoxs for holding the data read from the wrfbdy NetCDF file
535  amrex::Vector<amrex::Vector<amrex::FArrayBox>> bdy_data_xlo;
536  amrex::Vector<amrex::Vector<amrex::FArrayBox>> bdy_data_xhi;
537  amrex::Vector<amrex::Vector<amrex::FArrayBox>> bdy_data_ylo;
538  amrex::Vector<amrex::Vector<amrex::FArrayBox>> bdy_data_yhi;
539 
540  amrex::Real bdy_time_interval;
541  amrex::Vector<std::unique_ptr<amrex::MultiFab>> lat_m, lon_m;
542  amrex::Real Latitude;
543  amrex::Real Longitude;
544 #endif // ERF_USE_NETCDF
545 
546  // Struct for working with the sounding data we take as an input
548 
549  // Struct for working with the sponge data we take as an input
551 
552  // write checkpoint file to disk
553  void WriteCheckpointFile () const;
554 
555  // read checkpoint file from disk
556  void ReadCheckpointFile ();
557 
558  // Read the file passed to amr.restart and use it as an initial condition for
559  // the current simulation. Supports a different number of components and
560  // ghost cells.
562 
563  // Initialize the new-time data at a level from the initial_data MultiFab
564  void InitializeLevelFromData (int lev, const amrex::MultiFab& initial_data);
565 
566  // utility to skip to next line in Header
567  static void GotoNextLine (std::istream& is);
568 
569  // Single level functions called by advance()
570  void post_update (amrex::MultiFab& state_mf, amrex::Real time, const amrex::Geometry& geom);
571  void fill_rhs (amrex::MultiFab& rhs_mf, const amrex::MultiFab& state_mf, amrex::Real time, const amrex::Geometry& geom);
572 
573  ////////////////
574  // private data members
575 
576  // These are the minimum and maximum values of k in valid boxes *at this level*
577  amrex::Vector<int> min_k_at_level;
578  amrex::Vector<int> max_k_at_level;
579 
580  std::unique_ptr<ProblemBase> prob = nullptr; // problem-specific functions
581 
582  amrex::Vector<int> num_boxes_at_level; // how many boxes specified at each level by tagging criteria
583  amrex::Vector<int> num_files_at_level; // how many wrfinput files specified at each level
584  amrex::Vector<amrex::Vector<amrex::Box>> boxes_at_level; // the boxes specified at each level by tagging criteria
585 
586  amrex::Vector<int> istep; // which step?
587  amrex::Vector<int> nsubsteps; // how many substeps on each level?
588 
589  // keep track of old time, new time, and time step at each level
590  amrex::Vector<amrex::Real> t_new;
591  amrex::Vector<amrex::Real> t_old;
592  amrex::Vector<amrex::Real> dt;
593  amrex::Vector<long> dt_mri_ratio;
594 
595  // array of multifabs to store the solution at each level of refinement
596  // after advancing a level we use "swap".
597 #ifndef ERF_USE_MULTIBLOCK
598  amrex::Vector<amrex::Vector<amrex::MultiFab> > vars_new;
599  amrex::Vector<amrex::Vector<amrex::MultiFab> > vars_old;
600 
601  // Velocity time averaged field
602  amrex::Vector<std::unique_ptr<amrex::MultiFab>> vel_t_avg;
603  amrex::Vector<amrex::Real> t_avg_cnt;
604 #endif
605  amrex::Vector<std::unique_ptr<MRISplitIntegrator<amrex::Vector<amrex::MultiFab> > > > mri_integrator_mem;
606 
607 #ifdef ERF_USE_POISSON_SOLVE
608  amrex::Vector<amrex::MultiFab> pp_inc;
609 #endif
610 
611  // Vector over levels of routines to impose physical boundary conditions
612  amrex::Vector<std::unique_ptr<ERFPhysBCFunct_cons>> physbcs_cons;
613  amrex::Vector<std::unique_ptr<ERFPhysBCFunct_u>> physbcs_u;
614  amrex::Vector<std::unique_ptr<ERFPhysBCFunct_v>> physbcs_v;
615  amrex::Vector<std::unique_ptr<ERFPhysBCFunct_w>> physbcs_w;
616  amrex::Vector<std::unique_ptr<ERFPhysBCFunct_w_no_terrain>> physbcs_w_no_terrain;
617 
618  // Store primitive variable for MOST BC
619  amrex::Vector<std::unique_ptr<amrex::MultiFab>> Theta_prim;
620  amrex::Vector<std::unique_ptr<amrex::MultiFab>> Qv_prim;
621 
622  // Scratch space for time integrator
623  amrex::Vector<amrex::MultiFab> rU_old;
624  amrex::Vector<amrex::MultiFab> rU_new;
625  amrex::Vector<amrex::MultiFab> rV_old;
626  amrex::Vector<amrex::MultiFab> rV_new;
627  amrex::Vector<amrex::MultiFab> rW_old;
628  amrex::Vector<amrex::MultiFab> rW_new;
629 
630  std::unique_ptr<Microphysics> micro;
631  amrex::Vector<amrex::Vector<amrex::MultiFab*>> qmoist; // (lev,ncomp) This has up to 8 components: qt, qv, qc, qi, qp, qr, qs, qg
632 
633  amrex::Vector<amrex::MultiFab> Nturb;
634  amrex::Vector<amrex::MultiFab> vars_fitch; // Vabs, Vabsdt, dudt, dvdt, dTKEdt
635  amrex::Vector<amrex::MultiFab> vars_ewp; // dudt, dvdt, dTKEdt
637  amrex::Vector<amrex::Real> wind_speed, thrust_coeff, power;
638 
639 
641  amrex::Vector<amrex::Vector<amrex::MultiFab*>> lsm_data; // (lev,ncomp) Components: theta, q1, q2
642  amrex::Vector<amrex::Vector<amrex::MultiFab*>> lsm_flux; // (lev,ncomp) Components: theta, q1, q2
643 
644 #if defined(ERF_USE_RRTMGP)
645  Radiation rad;
646  amrex::Vector<std::unique_ptr<amrex::MultiFab>> qheating_rates; // radiation heating rate source terms
647 
648  // Containers for additional SLM inputs
649  amrex::Vector<std::unique_ptr<amrex::MultiFab>> sw_lw_fluxes; // Direct SW (visible, NIR), Diffuse SW (visible, NIR), LW flux
650  amrex::Vector<std::unique_ptr<amrex::MultiFab>> solar_zenith; // Solar zenith angle
651 #endif
652 
653  // Fillpatcher classes for coarse-fine boundaries
654  int cf_width{0};
655  int cf_set_width{0};
656  amrex::Vector<ERFFillPatcher> FPr_c;
657  amrex::Vector<ERFFillPatcher> FPr_u;
658  amrex::Vector<ERFFillPatcher> FPr_v;
659  amrex::Vector<ERFFillPatcher> FPr_w;
660 
661  // Diffusive stresses and Smag
662  amrex::Vector<std::unique_ptr<amrex::MultiFab>> Tau11_lev, Tau22_lev, Tau33_lev;
663  amrex::Vector<std::unique_ptr<amrex::MultiFab>> Tau12_lev, Tau21_lev;
664  amrex::Vector<std::unique_ptr<amrex::MultiFab>> Tau13_lev, Tau31_lev;
665  amrex::Vector<std::unique_ptr<amrex::MultiFab>> Tau23_lev, Tau32_lev;
666  amrex::Vector<std::unique_ptr<amrex::MultiFab>> eddyDiffs_lev;
667  amrex::Vector<std::unique_ptr<amrex::MultiFab>> SmnSmn_lev;
668 
669  // Sea Surface Temps and Land Masks (lev, ntimes)
670  amrex::Vector<amrex::Vector<std::unique_ptr<amrex::MultiFab>>> sst_lev;
671  amrex::Vector<amrex::Vector<std::unique_ptr<amrex::iMultiFab>>> lmask_lev;
672 
673  // Other SFS terms
674  amrex::Vector<std::unique_ptr<amrex::MultiFab>> SFS_hfx1_lev, SFS_hfx2_lev, SFS_hfx3_lev;
675  amrex::Vector<std::unique_ptr<amrex::MultiFab>> SFS_diss_lev;
676 
677  // Terrain / grid stretching
678  amrex::Vector<amrex::Real> zlevels_stag; // nominal height levels
679  amrex::Vector<std::unique_ptr<amrex::MultiFab>> z_phys_nd;
680  amrex::Vector<std::unique_ptr<amrex::MultiFab>> z_phys_cc;
681 
682  amrex::Vector<std::unique_ptr<amrex::MultiFab>> detJ_cc;
683  amrex::Vector<std::unique_ptr<amrex::MultiFab>> ax;
684  amrex::Vector<std::unique_ptr<amrex::MultiFab>> ay;
685  amrex::Vector<std::unique_ptr<amrex::MultiFab>> az;
686 
687  amrex::Vector<std::unique_ptr<amrex::MultiFab>> z_phys_nd_src;
688  amrex::Vector<std::unique_ptr<amrex::MultiFab>> detJ_cc_src;
689  amrex::Vector<std::unique_ptr<amrex::MultiFab>> ax_src;
690  amrex::Vector<std::unique_ptr<amrex::MultiFab>> ay_src;
691  amrex::Vector<std::unique_ptr<amrex::MultiFab>> az_src;
692 
693  amrex::Vector<std::unique_ptr<amrex::MultiFab>> z_phys_nd_new;
694  amrex::Vector<std::unique_ptr<amrex::MultiFab>> detJ_cc_new;
695  amrex::Vector<std::unique_ptr<amrex::MultiFab>> ax_new;
696  amrex::Vector<std::unique_ptr<amrex::MultiFab>> ay_new;
697  amrex::Vector<std::unique_ptr<amrex::MultiFab>> az_new;
698 
699  amrex::Vector<std::unique_ptr<amrex::MultiFab>> z_t_rk;
700 
701  amrex::Vector<std::unique_ptr<amrex::MultiFab>> mapfac_m;
702  amrex::Vector<std::unique_ptr<amrex::MultiFab>> mapfac_u;
703  amrex::Vector<std::unique_ptr<amrex::MultiFab>> mapfac_v;
704 
705  amrex::Vector<amrex::MultiFab> base_state;
706  amrex::Vector<amrex::MultiFab> base_state_new;
707 
708  // array of flux registers
709  amrex::Vector<amrex::YAFluxRegister*> advflux_reg;
710 
711  // A BCRec is essentially a 2*DIM integer array storing the boundary
712  // condition type at each lo/hi walls in each direction. We have one BCRec
713  // for each component of the cell-centered variables and each velocity component.
714  amrex::Vector <amrex::BCRec> domain_bcs_type;
715  amrex::Gpu::DeviceVector<amrex::BCRec> domain_bcs_type_d;
716 
717  // We store these so that we can print them out in the job_info file
718  amrex::Array<std::string,2*AMREX_SPACEDIM> domain_bc_type;
719 
720  // These hold the Dirichlet values at walls which need them ...
721  amrex::Array<amrex::Array<amrex::Real, AMREX_SPACEDIM*2>, AMREX_SPACEDIM+NVAR_max> m_bc_extdir_vals;
722 
723  // These hold the Neumann values at walls which need them ...
724  amrex::Array<amrex::Array<amrex::Real, AMREX_SPACEDIM*2>, AMREX_SPACEDIM+NVAR_max> m_bc_neumann_vals;
725 
726  // These are the "physical" boundary condition types (e.g. "inflow")
727  amrex::GpuArray<ERF_BC, AMREX_SPACEDIM*2> phys_bc_type;
728 
729  // These are the masks for the thin immersed body
730  amrex::Vector<std::unique_ptr<amrex::iMultiFab>> xflux_imask;
731  amrex::Vector<std::unique_ptr<amrex::iMultiFab>> yflux_imask;
732  amrex::Vector<std::unique_ptr<amrex::iMultiFab>> zflux_imask;
733  //amrex::Vector<std::unique_ptr<amrex::iMultiFab>> overset_imask;
734 
735  // These are the body forces that result from the thin immersed body
736  amrex::Vector<std::unique_ptr<amrex::MultiFab>> thin_xforce;
737  amrex::Vector<std::unique_ptr<amrex::MultiFab>> thin_yforce;
738  amrex::Vector<std::unique_ptr<amrex::MultiFab>> thin_zforce;
739 
742 
745 
746  ////////////////
747  // runtime parameters
748 
749  // maximum number of steps and stop time
750  int max_step = std::numeric_limits<int>::max();
751  amrex::Real start_time = 0.0;
752  amrex::Real stop_time = std::numeric_limits<amrex::Real>::max();
753 
754  // if >= 0 we restart from a checkpoint
755  std::string restart_chkfile = "";
756 
757  // Time step controls
758  static amrex::Real cfl;
759  static amrex::Real init_shrink;
760  static amrex::Real change_max;
761 
762  // Fixed dt for level 0 timesteps (only used if positive)
763  static amrex::Real fixed_dt;
764  static amrex::Real fixed_fast_dt;
765  static int fixed_mri_dt_ratio;
766 
767  // how often each level regrids the higher levels of refinement
768  // (after a level advances that many time steps)
769  int regrid_int = -1;
770 
771  // plotfile prefix and frequency
772  std::string plot_file_1 {"plt_1_"};
773  std::string plot_file_2 {"plt_2_"};
774  int m_plot_int_1 = -1;
775  int m_plot_int_2 = -1;
776  amrex::Real m_plot_per_1 = -1.0;
777  amrex::Real m_plot_per_2 = -1.0;
778 
779  bool plot_lsm = false;
780 
781  // other sampling output control
782  int profile_int = -1;
783  bool cc_profiles = true;
784 
785  // Checkpoint type, prefix and frequency
786  std::string check_file {"chk"};
787  std::string check_type {"native"};
788  std::string restart_type {"native"};
789  int m_check_int = -1;
790  amrex::Real m_check_per = -1.0;
791 
792  amrex::Vector<std::string> plot_var_names_1;
793  amrex::Vector<std::string> plot_var_names_2;
794  const amrex::Vector<std::string> cons_names {"density", "rhotheta", "rhoKE", "rhoQKE", "rhoadv_0",
795  "rhoQ1", "rhoQ2", "rhoQ3",
796  "rhoQ4", "rhoQ5", "rhoQ6"};
797 
798  // Note that the order of variable names here must match the order in Derive.cpp
799  const amrex::Vector<std::string> derived_names {"soundspeed", "temp", "theta", "KE", "QKE", "scalar",
800  "vorticity_x","vorticity_y","vorticity_z",
801  "magvel", "divU",
802  "pres_hse", "dens_hse", "pressure", "pert_pres", "pert_dens", "eq_pot_temp", "num_turb",
803  "dpdx", "dpdy", "pres_hse_x", "pres_hse_y",
804  "z_phys", "detJ" , "mapfac", "lat_m", "lon_m",
805  // Time averaged velocity
806  "u_t_avg", "v_t_avg", "w_t_avg", "umag_t_avg",
807  // eddy viscosity
808  "Kmv","Kmh",
809  // eddy diffusivity of heat
810  "Khv","Khh",
811  // mynn pbl lengthscale
812  "Lpbl",
813  // moisture vars
814  "qt", "qv", "qc", "qi", "qp", "qrain", "qsnow", "qgraup", "rain_accum", "snow_accum", "graup_accum"
815 #ifdef ERF_COMPUTE_ERROR
816  ,"xvel_err", "yvel_err", "zvel_err", "pp_err"
817 #endif
818  };
819 
820  // algorithm choices
822 
823 #ifdef ERF_USE_PARTICLES
824  // Particle container with all particle species
825  ParticleData particleData;
826 
827  // variables and functions for tracers particles
828  bool m_use_tracer_particles; /*!< tracer particles that advect with flow */
829  bool m_use_hydro_particles; /*!< tracer particles that fall with gravity */
830 
831  /*! Read tracer and hydro particles parameters */
832  void readTracersParams();
833 
834  /*! Initialize tracer and hydro particles */
835  void initializeTracers ( amrex::ParGDBBase*,
836  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& );
837  /*! Evolve tracers and hydro particles */
838  void evolveTracers( int,
839  amrex::Real,
840  amrex::Vector<amrex::Vector<amrex::MultiFab>>&,
841  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& );
842 
843 #endif
844 
845  static int verbose;
846 #ifdef ERF_USE_POISSON_SOLVE
847  static int mg_verbose;
848 #endif
849 
850  // Diagnostic output interval
851  static int sum_interval;
852  static amrex::Real sum_per;
853 
854  // Native or NetCDF
855  static std::string plotfile_type;
856 
857  // init_type: "ideal", "real", "input_sounding", "metgrid" or ""
858  static std::string init_type;
859 
860  // sponge_type: "input_sponge"
861  static std::string sponge_type;
862 
863  // use_real_bcs: only true if 1) ( (init_type == real) or (init_type == metgrid) )
864  // AND 2) we want to use the bc's from the WRF bdy file
865  static bool use_real_bcs;
866 
867  // NetCDF initialization (wrfinput) file
868  static amrex::Vector<amrex::Vector<std::string>> nc_init_file;
869 
870  // NetCDF initialization (wrfbdy/met_em) file
871  static std::string nc_bdy_file;
872  int real_width{0};
874 
875  // Text input_sounding file
876  static std::string input_sounding_file;
877 
878  // Text input_sponge file
879  static std::string input_sponge_file;
880 
881  // Flag to trigger initialization from input_sounding like WRF's ideal.exe
882  // used with init_type == "input_sounding"
883  static bool init_sounding_ideal;
884 
885  // 1D CDF output (for ingestion in AMR-Wind)
886  static int output_1d_column;
887  static int column_interval;
888  static amrex::Real column_per;
889  static amrex::Real column_loc_x;
890  static amrex::Real column_loc_y;
891  static std::string column_file_name;
892 
893  // 2D BndryRegister output (for ingestion in AMR-Wind)
896  static amrex::Real bndry_output_planes_per;
897  static amrex::Real bndry_output_planes_start_time;
898 
899  // 2D BndryRegister input
900  static int input_bndry_planes;
901 
902  static int ng_dens_hse;
903  static int ng_pres_hse;
904 
905  // Custom source terms
906  amrex::Vector< amrex::Vector<amrex::Real> > h_rhotheta_src;
907  amrex::Vector<amrex::Gpu::DeviceVector<amrex::Real> > d_rhotheta_src;
908 
909  amrex::Vector< amrex::Vector<amrex::Real> > h_rhoqt_src;
910  amrex::Vector<amrex::Gpu::DeviceVector<amrex::Real> > d_rhoqt_src;
911 
912  amrex::Vector< amrex::Vector<amrex::Real> > h_w_subsid;
913  amrex::Vector<amrex::Gpu::DeviceVector<amrex::Real> > d_w_subsid;
914 
915  amrex::Vector< amrex::Vector<amrex::Real> > h_u_geos;
916  amrex::Vector<amrex::Gpu::DeviceVector<amrex::Real> > d_u_geos;
917 
918  amrex::Vector< amrex::Vector<amrex::Real> > h_v_geos;
919  amrex::Vector<amrex::Gpu::DeviceVector<amrex::Real> > d_v_geos;
920 
921  // This is a vector over levels of vectors across quantities of Vectors
922  amrex::Vector<amrex::Vector< amrex::Vector<amrex::Real> > > h_rayleigh_ptrs;
923 
924  // This is a vector over levels of vectors across quantities of Vectors
925  amrex::Vector<amrex::Vector< amrex::Vector<amrex::Real> > > h_sponge_ptrs;
926 
927  // This is a vector over levels of vectors across quantities of DeviceVectors
928  amrex::Vector<amrex::Vector<amrex::Gpu::DeviceVector<amrex::Real> > > d_rayleigh_ptrs;
929 
930  // This is a vector over levels of vectors across quantities of DeviceVectors
931  amrex::Vector<amrex::Vector<amrex::Gpu::DeviceVector<amrex::Real> > > d_sponge_ptrs;
932 
933  amrex::Vector<amrex::Real> h_havg_density;
934  amrex::Vector<amrex::Real> h_havg_temperature;
935  amrex::Vector<amrex::Real> h_havg_pressure;
936  amrex::Vector<amrex::Real> h_havg_qv;
937  amrex::Vector<amrex::Real> h_havg_qc;
938 
939  amrex::Gpu::DeviceVector<amrex::Real> d_havg_density;
940  amrex::Gpu::DeviceVector<amrex::Real> d_havg_temperature;
941  amrex::Gpu::DeviceVector<amrex::Real> d_havg_pressure;
942  amrex::Gpu::DeviceVector<amrex::Real> d_havg_qv;
943  amrex::Gpu::DeviceVector<amrex::Real> d_havg_qc;
944 
946 
947  std::unique_ptr<WriteBndryPlanes> m_w2d = nullptr;
948  std::unique_ptr<ReadBndryPlanes> m_r2d = nullptr;
949  std::unique_ptr<ABLMost> m_most = nullptr;
950 
951  //
952  // Holds info for dynamically generated tagging criteria
953  //
954  static amrex::Vector<amrex::AMRErrorTag> ref_tags;
955 
956  //
957  // Build a mask that zeroes out values on a coarse level underlying
958  // grids on the next finest level
959  //
960  amrex::MultiFab fine_mask;
961 
962  amrex::Real dz_min;
963 
964  static AMREX_FORCE_INLINE
965  int
966  ComputeGhostCells (const AdvChoice& advChoice, bool use_num_diff)
967  {
968  if (use_num_diff)
969  {
970  return 3;
971  } else {
972  if (
978  || (advChoice.dryscal_vert_adv_type == AdvType::Centered_6th) )
979  { return 3; }
980  else if (
982  || (advChoice.dycore_vert_adv_type == AdvType::Upwind_5th)
986  || (advChoice.dryscal_vert_adv_type == AdvType::Upwind_5th) )
987  { return 3; }
988  else if (
990  || (advChoice.dryscal_vert_adv_type == AdvType::Weno_5)
991  || (advChoice.moistscal_horiz_adv_type == AdvType::Weno_5)
992  || (advChoice.moistscal_vert_adv_type == AdvType::Weno_5)
994  || (advChoice.moistscal_vert_adv_type == AdvType::Weno_5Z)
995  || (advChoice.dryscal_horiz_adv_type == AdvType::Weno_5Z)
996  || (advChoice.dryscal_vert_adv_type == AdvType::Weno_5Z) )
997  { return 3; }
998  else
999  { return 2; }
1000  }
1001  }
1002 
1003  AMREX_FORCE_INLINE
1004  amrex::YAFluxRegister* getAdvFluxReg (int lev)
1005  {
1006  return advflux_reg[lev];
1007  }
1008 
1009  AMREX_FORCE_INLINE
1010  std::ostream&
1011  DataLog (int i)
1012  {
1013  return *datalog[i];
1014  }
1015 
1016  AMREX_FORCE_INLINE
1017  int
1018  NumDataLogs () noexcept
1019  {
1020  return datalog.size();
1021  }
1022 
1023  AMREX_FORCE_INLINE
1024  std::ostream&
1026  {
1027  return *sampleptlog[i];
1028  }
1029 
1030  AMREX_FORCE_INLINE
1031  int
1033  {
1034  return sampleptlog.size();
1035  }
1036 
1037  AMREX_FORCE_INLINE
1038  std::ostream&
1040  {
1041  return *samplelinelog[i];
1042  }
1043 
1044  AMREX_FORCE_INLINE
1045  int
1046  NumSampleLineLogs () noexcept
1047  {
1048  return samplelinelog.size();
1049  }
1050 
1051  amrex::IntVect&
1052  SamplePoint (int i)
1053  {
1054  return samplepoint[i];
1055  }
1056 
1057  AMREX_FORCE_INLINE
1058  int
1059  NumSamplePoints () noexcept
1060  {
1061  return samplepoint.size();
1062  }
1063 
1064  amrex::IntVect&
1065  SampleLine (int i)
1066  {
1067  return sampleline[i];
1068  }
1069 
1070  AMREX_FORCE_INLINE
1071  int
1072  NumSampleLines () noexcept
1073  {
1074  return sampleline.size();
1075  }
1076 
1077  static amrex::Real startCPUTime;
1078  static amrex::Real previousCPUTimeUsed;
1079 
1080  static amrex::Real
1082  {
1083  int numCores = amrex::ParallelDescriptor::NProcs();
1084 #ifdef _OPENMP
1085  numCores = numCores * omp_get_max_threads();
1086 #endif
1087 
1088  amrex::Real T =
1089  numCores * (amrex::ParallelDescriptor::second() - startCPUTime) +
1091 
1092  return T;
1093  }
1094 
1095  void setRecordDataInfo (int i, const std::string& filename) // NOLINT
1096  {
1097  if (amrex::ParallelDescriptor::IOProcessor())
1098  {
1099  datalog[i] = std::make_unique<std::fstream>();
1100  datalog[i]->open(filename.c_str(),std::ios::out|std::ios::app);
1101  if (!datalog[i]->good()) {
1102  amrex::FileOpenFailed(filename);
1103  }
1104  }
1105  amrex::ParallelDescriptor::Barrier("ERF::setRecordDataInfo");
1106  }
1107 
1108  void setRecordSamplePointInfo (int i, int lev, amrex::IntVect& cell, const std::string& filename) // NOLINT
1109  {
1110  amrex::MultiFab dummy(grids[lev],dmap[lev],1,0);
1111  for (amrex::MFIter mfi(dummy); mfi.isValid(); ++mfi)
1112  {
1113  const amrex::Box& bx = mfi.validbox();
1114  if (bx.contains(cell)) {
1115  sampleptlog[i] = std::make_unique<std::fstream>();
1116  sampleptlog[i]->open(filename.c_str(),std::ios::out|std::ios::app);
1117  if (!sampleptlog[i]->good()) {
1118  amrex::FileOpenFailed(filename);
1119  }
1120  }
1121  }
1122  amrex::ParallelDescriptor::Barrier("ERF::setRecordSamplePointInfo");
1123  }
1124 
1125  void setRecordSampleLineInfo (int i, int lev, amrex::IntVect& cell, const std::string& filename) // NOLINT
1126  {
1127  amrex::MultiFab dummy(grids[lev],dmap[lev],1,0);
1128  for (amrex::MFIter mfi(dummy); mfi.isValid(); ++mfi)
1129  {
1130  const amrex::Box& bx = mfi.validbox();
1131  if (bx.contains(cell)) {
1132  samplelinelog[i] = std::make_unique<std::fstream>();
1133  samplelinelog[i]->open(filename.c_str(),std::ios::out|std::ios::app);
1134  if (!samplelinelog[i]->good()) {
1135  amrex::FileOpenFailed(filename);
1136  }
1137  }
1138  }
1139  amrex::ParallelDescriptor::Barrier("ERF::setRecordSampleLineInfo");
1140  }
1141 
1142  amrex::Vector<std::unique_ptr<std::fstream> > datalog;
1143  amrex::Vector<std::string> datalogname;
1144 
1145  amrex::Vector<std::unique_ptr<std::fstream> > sampleptlog;
1146  amrex::Vector<std::string> sampleptlogname;
1147  amrex::Vector<amrex::IntVect> samplepoint;
1148 
1149  amrex::Vector<std::unique_ptr<std::fstream> > samplelinelog;
1150  amrex::Vector<std::string> samplelinelogname;
1151  amrex::Vector<amrex::IntVect> sampleline;
1152 
1153  //! The filename of the ith datalog file.
1154  [[nodiscard]] std::string DataLogName (int i) const noexcept { return datalogname[i]; }
1155 
1156  //! The filename of the ith sampleptlog file.
1157  [[nodiscard]] std::string SamplePointLogName (int i) const noexcept { return sampleptlogname[i]; }
1158 
1159  //! The filename of the ith samplelinelog file.
1160  [[nodiscard]] std::string SampleLineLogName (int i) const noexcept { return samplelinelogname[i]; }
1161 
1162  amrex::Vector<std::unique_ptr<amrex::FabFactory<amrex::FArrayBox> > > m_factory;
1163 
1164  [[nodiscard]] amrex::FabFactory<amrex::FArrayBox> const&
1165  Factory (int lev) const noexcept { return *m_factory[lev]; }
1166 #ifdef ERF_USE_EB
1167  [[nodiscard]] amrex::EBFArrayBoxFactory const&
1168  EBFactory (int lev) const noexcept {
1169  return static_cast<amrex::EBFArrayBoxFactory const&>(*m_factory[lev]);
1170  }
1171 
1172  [[nodiscard]] static int nghost_eb_basic ()
1173  { return 5; }
1174 
1175  // We need 5 for doing StateRedistribution; otherwise 4 would be enough
1176  [[nodiscard]] static int nghost_eb_volume ()
1177  { return 5; }
1178 
1179  [[nodiscard]] static int nghost_eb_full ()
1180  { return 4; }
1181 #endif
1182 
1183 public:
1184  void writeJobInfo (const std::string& dir) const;
1185  static void writeBuildInfo (std::ostream& os);
1186 
1187  static void print_banner(MPI_Comm /*comm*/, std::ostream& /*out*/);
1188  static void print_usage(MPI_Comm /*comm*/, std::ostream& /*out*/);
1189  static void print_error(MPI_Comm /*comm*/, const std::string& msg);
1190  static void print_summary(std::ostream&);
1191  static void print_tpls(std::ostream& /*out*/);
1192 };
1193 
1194 #endif
Containes the Eulerian microphysics class.
#define NVAR_max
Definition: IndexDefines.H:27
@ Centered_6th
Containes the Lagrangian microphysics class.
Definition: ERF.H:87
amrex::Vector< amrex::MultiFab > vars_ewp
Definition: ERF.H:635
void MakeHorizontalAverages()
Definition: ERF.cpp:1470
amrex::Vector< amrex::MultiFab > rU_new
Definition: ERF.H:624
int last_check_file_step
Definition: ERF.H:743
void initRayleigh()
Initialize Rayleigh damping profiles.
Definition: ERF_init1d.cpp:18
amrex::Vector< std::unique_ptr< amrex::MultiFab > > Tau23_lev
Definition: ERF.H:665
amrex::Vector< amrex::Vector< amrex::Box > > boxes_at_level
Definition: ERF.H:584
std::unique_ptr< ABLMost > m_most
Definition: ERF.H:949
amrex::Vector< std::string > samplelinelogname
Definition: ERF.H:1150
int max_step
Definition: ERF.H:750
amrex::Real dz_min
Definition: ERF.H:962
void setRayleighRefFromSounding(bool restarting)
Set Rayleigh mean profiles from input sounding.
Definition: ERF_init1d.cpp:56
int last_plot_file_step_2
Definition: ERF.H:741
static std::string input_sponge_file
Definition: ERF.H:879
amrex::Vector< std::unique_ptr< MRISplitIntegrator< amrex::Vector< amrex::MultiFab > > > > mri_integrator_mem
Definition: ERF.H:605
void WritePlotFile(int which, amrex::Vector< std::string > plot_var_names)
Definition: Plotfile.cpp:145
void Evolve()
Definition: ERF.cpp:324
amrex::Vector< amrex::Gpu::DeviceVector< amrex::Real > > d_rhotheta_src
Definition: ERF.H:907
amrex::Vector< ERFFillPatcher > FPr_u
Definition: ERF.H:657
void derive_stress_profiles(amrex::Gpu::HostVector< amrex::Real > &h_avg_tau11, amrex::Gpu::HostVector< amrex::Real > &h_avg_tau12, amrex::Gpu::HostVector< amrex::Real > &h_avg_tau13, amrex::Gpu::HostVector< amrex::Real > &h_avg_tau22, amrex::Gpu::HostVector< amrex::Real > &h_avg_tau23, amrex::Gpu::HostVector< amrex::Real > &h_avg_tau33, amrex::Gpu::HostVector< amrex::Real > &h_avg_hfx3, amrex::Gpu::HostVector< amrex::Real > &h_avg_diss)
Definition: ERF_Write1DProfiles.cpp:396
amrex::Vector< amrex::IntVect > sampleline
Definition: ERF.H:1151
amrex::Vector< amrex::Vector< amrex::MultiFab > > vars_new
Definition: ERF.H:598
amrex::Real rotor_dia
Definition: ERF.H:636
ERF(ERF &&) noexcept=delete
AMREX_FORCE_INLINE int NumSampleLineLogs() noexcept
Definition: ERF.H:1046
static void print_tpls(std::ostream &)
Definition: console_io.cpp:137
std::string DataLogName(int i) const noexcept
The filename of the ith datalog file.
Definition: ERF.H:1154
void WriteGenericPlotfileHeaderWithTerrain(std::ostream &HeaderFile, int nlevels, const amrex::Vector< amrex::BoxArray > &bArray, const amrex::Vector< std::string > &varnames, amrex::Real time, const amrex::Vector< int > &level_steps, const std::string &versionName, const std::string &levelPrefix, const std::string &mfPrefix) const
Definition: Plotfile.cpp:1443
amrex::Vector< std::unique_ptr< amrex::MultiFab > > thin_yforce
Definition: ERF.H:737
void ErrorEst(int lev, amrex::TagBoxArray &tags, amrex::Real time, int ngrow) override
Definition: ERF_Tagging.cpp:15
std::string plot_file_2
Definition: ERF.H:773
amrex::Array< amrex::Array< amrex::Real, AMREX_SPACEDIM *2 >, AMREX_SPACEDIM+NVAR_max > m_bc_extdir_vals
Definition: ERF.H:721
void FillBdyCCVels(amrex::Vector< amrex::MultiFab > &mf_cc_vel)
Definition: ERF_FillPatch.cpp:545
amrex::Vector< std::unique_ptr< amrex::MultiFab > > SFS_hfx3_lev
Definition: ERF.H:674
amrex::Vector< amrex::Vector< amrex::Real > > h_w_subsid
Definition: ERF.H:912
amrex::Vector< amrex::Real > wind_speed
Definition: ERF.H:637
static void print_banner(MPI_Comm, std::ostream &)
Definition: console_io.cpp:60
amrex::Vector< std::unique_ptr< std::fstream > > datalog
Definition: ERF.H:1142
static amrex::Real sum_per
Definition: ERF.H:852
amrex::Vector< ERFFillPatcher > FPr_v
Definition: ERF.H:658
int cf_set_width
Definition: ERF.H:655
amrex::Vector< std::unique_ptr< amrex::MultiFab > > mapfac_u
Definition: ERF.H:702
static amrex::Real previousCPUTimeUsed
Definition: ERF.H:1078
void setPlotVariables(const std::string &pp_plot_var_names, amrex::Vector< std::string > &plot_var_names)
Definition: Plotfile.cpp:18
amrex::Gpu::DeviceVector< amrex::Real > d_havg_temperature
Definition: ERF.H:940
amrex::Vector< std::unique_ptr< amrex::MultiFab > > Tau31_lev
Definition: ERF.H:664
amrex::Vector< amrex::Vector< amrex::Vector< amrex::Real > > > h_sponge_ptrs
Definition: ERF.H:925
static amrex::Real fixed_fast_dt
Definition: ERF.H:764
void fill_from_bndryregs(const amrex::Vector< amrex::MultiFab * > &mfs, amrex::Real time)
Definition: BoundaryConditions_bndryreg.cpp:13
amrex::Vector< std::unique_ptr< amrex::MultiFab > > mapfac_m
Definition: ERF.H:701
void setRecordDataInfo(int i, const std::string &filename)
Definition: ERF.H:1095
amrex::Vector< std::unique_ptr< amrex::MultiFab > > SFS_hfx1_lev
Definition: ERF.H:674
void init_from_input_sounding(int lev)
Definition: ERF_init_from_input_sounding.cpp:49
bool cc_profiles
Definition: ERF.H:783
amrex::Gpu::DeviceVector< amrex::Real > d_havg_qv
Definition: ERF.H:942
static amrex::Real column_loc_y
Definition: ERF.H:890
void ReadParameters()
Definition: ERF.cpp:1211
static amrex::Vector< std::string > PlotFileVarNames(amrex::Vector< std::string > plot_var_names)
Definition: Plotfile.cpp:133
void InitializeFromFile()
amrex::Vector< std::unique_ptr< ERFPhysBCFunct_cons > > physbcs_cons
Definition: ERF.H:612
static bool init_sounding_ideal
Definition: ERF.H:883
amrex::Vector< std::unique_ptr< amrex::MultiFab > > ay_new
Definition: ERF.H:696
ERF()
Definition: ERF.cpp:96
~ERF() override
std::string restart_type
Definition: ERF.H:788
amrex::Vector< std::unique_ptr< amrex::MultiFab > > z_phys_nd_src
Definition: ERF.H:687
amrex::Vector< std::unique_ptr< amrex::MultiFab > > detJ_cc
Definition: ERF.H:682
amrex::Real m_plot_per_1
Definition: ERF.H:776
amrex::Vector< std::unique_ptr< amrex::MultiFab > > z_phys_cc
Definition: ERF.H:680
amrex::Vector< std::unique_ptr< amrex::MultiFab > > eddyDiffs_lev
Definition: ERF.H:666
static SolverChoice solverChoice
Definition: ERF.H:821
std::string check_type
Definition: ERF.H:787
amrex::Vector< ERFFillPatcher > FPr_c
Definition: ERF.H:656
void initialize_bcs(int lev)
Definition: ERF_make_new_arrays.cpp:420
amrex::Vector< amrex::MultiFab > base_state_new
Definition: ERF.H:706
amrex::Vector< std::unique_ptr< amrex::MultiFab > > az
Definition: ERF.H:685
int regrid_int
Definition: ERF.H:769
void write_1D_profiles_stag(amrex::Real time)
Definition: ERF_Write1DProfiles_stag.cpp:21
amrex::Vector< amrex::Vector< amrex::Gpu::DeviceVector< amrex::Real > > > d_sponge_ptrs
Definition: ERF.H:931
amrex::Vector< amrex::Vector< amrex::Real > > h_rhoqt_src
Definition: ERF.H:909
amrex::Vector< long > dt_mri_ratio
Definition: ERF.H:593
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vel_t_avg
Definition: ERF.H:602
amrex::Vector< amrex::Vector< std::unique_ptr< amrex::iMultiFab > > > lmask_lev
Definition: ERF.H:671
amrex::Real stop_time
Definition: ERF.H:752
AMREX_FORCE_INLINE int NumSamplePointLogs() noexcept
Definition: ERF.H:1032
amrex::Vector< amrex::Real > h_havg_pressure
Definition: ERF.H:935
void update_diffusive_arrays(int lev, const amrex::BoxArray &ba, const amrex::DistributionMapping &dm)
Definition: ERF_make_new_arrays.cpp:285
static int verbose
Definition: ERF.H:845
amrex::Vector< amrex::Real > h_havg_qc
Definition: ERF.H:937
amrex::Vector< std::unique_ptr< ERFPhysBCFunct_w > > physbcs_w
Definition: ERF.H:615
amrex::Vector< int > min_k_at_level
Definition: ERF.H:577
void Advance(int lev, amrex::Real time, amrex::Real dt_lev, int iteration, int ncycle)
Definition: ERF_Advance.cpp:21
amrex::Vector< amrex::MultiFab > vars_fitch
Definition: ERF.H:634
static std::string column_file_name
Definition: ERF.H:891
amrex::Vector< std::unique_ptr< std::fstream > > samplelinelog
Definition: ERF.H:1149
std::unique_ptr< Microphysics > micro
Definition: ERF.H:630
amrex::Vector< amrex::MultiFab > base_state
Definition: ERF.H:705
AMREX_FORCE_INLINE amrex::YAFluxRegister * getAdvFluxReg(int lev)
Definition: ERF.H:1004
amrex::Vector< std::unique_ptr< ERFPhysBCFunct_w_no_terrain > > physbcs_w_no_terrain
Definition: ERF.H:616
amrex::Vector< amrex::Real > h_havg_density
Definition: ERF.H:933
amrex::Vector< std::unique_ptr< amrex::MultiFab > > z_phys_nd_new
Definition: ERF.H:693
amrex::Vector< std::unique_ptr< amrex::MultiFab > > Qv_prim
Definition: ERF.H:620
static int sum_interval
Definition: ERF.H:851
void restart()
Definition: ERF.cpp:1099
static std::string input_sounding_file
Definition: ERF.H:876
amrex::Vector< std::unique_ptr< amrex::MultiFab > > Tau13_lev
Definition: ERF.H:664
void FillIntermediatePatch(int lev, amrex::Real time, const amrex::Vector< amrex::MultiFab * > &mfs_vel, const amrex::Vector< amrex::MultiFab * > &mfs_mom, int ng_cons, int ng_vel, bool cons_only, int icomp_cons, int ncomp_cons, bool allow_most_bcs=true)
Definition: ERF_FillPatch.cpp:231
amrex::IntVect & SampleLine(int i)
Definition: ERF.H:1065
amrex::Vector< std::unique_ptr< amrex::MultiFab > > Tau21_lev
Definition: ERF.H:663
amrex::Vector< amrex::MultiFab > rV_new
Definition: ERF.H:626
std::string PlotFileName(int lev) const
void write_1D_profiles(amrex::Real time)
Definition: ERF_Write1DProfiles.cpp:15
void initialize_integrator(int lev, amrex::MultiFab &cons_mf, amrex::MultiFab &vel_mf)
Definition: ERF_make_new_arrays.cpp:398
amrex::Vector< std::unique_ptr< amrex::MultiFab > > thin_zforce
Definition: ERF.H:738
amrex::Vector< amrex::BCRec > domain_bcs_type
Definition: ERF.H:714
int m_plot_int_1
Definition: ERF.H:774
void post_timestep(int nstep, amrex::Real time, amrex::Real dt_lev)
Definition: ERF.cpp:411
std::string pp_prefix
Definition: ERF.H:349
std::string SampleLineLogName(int i) const noexcept
The filename of the ith samplelinelog file.
Definition: ERF.H:1160
amrex::Vector< amrex::Vector< std::unique_ptr< amrex::MultiFab > > > sst_lev
Definition: ERF.H:670
amrex::Vector< std::unique_ptr< amrex::MultiFab > > thin_xforce
Definition: ERF.H:736
AMREX_FORCE_INLINE int NumSamplePoints() noexcept
Definition: ERF.H:1059
static amrex::Real bndry_output_planes_per
Definition: ERF.H:896
amrex::Real m_check_per
Definition: ERF.H:790
void init_custom(int lev)
Definition: ERF_init_custom.cpp:26
amrex::Vector< std::unique_ptr< amrex::MultiFab > > Tau33_lev
Definition: ERF.H:662
std::unique_ptr< ProblemBase > prob
Definition: ERF.H:580
amrex::Vector< int > num_files_at_level
Definition: ERF.H:583
void init_bcs()
Definition: ERF_init_bcs.cpp:21
void ComputeDt()
Definition: ERF_ComputeTimestep.cpp:11
int profile_int
Definition: ERF.H:782
amrex::Vector< std::unique_ptr< ERFPhysBCFunct_u > > physbcs_u
Definition: ERF.H:613
amrex::Vector< amrex::Real > t_new
Definition: ERF.H:590
amrex::Vector< amrex::Real > t_avg_cnt
Definition: ERF.H:603
amrex::Vector< std::string > plot_var_names_1
Definition: ERF.H:792
int m_check_int
Definition: ERF.H:789
amrex::Array< amrex::Array< amrex::Real, AMREX_SPACEDIM *2 >, AMREX_SPACEDIM+NVAR_max > m_bc_neumann_vals
Definition: ERF.H:724
amrex::Real estTimeStep(int lev, long &dt_fast_ratio) const
Definition: ERF_ComputeTimestep.cpp:49
static std::string sponge_type
Definition: ERF.H:861
static amrex::Real startCPUTime
Definition: ERF.H:1077
amrex::Vector< std::unique_ptr< amrex::MultiFab > > SFS_diss_lev
Definition: ERF.H:675
amrex::Vector< amrex::MultiFab > rU_old
Definition: ERF.H:623
amrex::Vector< amrex::Real > t_old
Definition: ERF.H:591
AMREX_FORCE_INLINE int NumSampleLines() noexcept
Definition: ERF.H:1072
amrex::Vector< std::unique_ptr< amrex::MultiFab > > Theta_prim
Definition: ERF.H:619
void init1DArrays()
amrex::Vector< std::unique_ptr< amrex::MultiFab > > z_t_rk
Definition: ERF.H:699
void fill_rhs(amrex::MultiFab &rhs_mf, const amrex::MultiFab &state_mf, amrex::Real time, const amrex::Geometry &geom)
void appendPlotVariables(const std::string &pp_plot_var_names, amrex::Vector< std::string > &plot_var_names)
Definition: Plotfile.cpp:87
amrex::Vector< std::unique_ptr< ERFPhysBCFunct_v > > physbcs_v
Definition: ERF.H:614
amrex::Vector< std::string > plot_var_names_2
Definition: ERF.H:793
amrex::Vector< amrex::Real > zlevels_stag
Definition: ERF.H:678
static amrex::Real column_per
Definition: ERF.H:888
static int output_bndry_planes
Definition: ERF.H:894
amrex::Vector< amrex::Gpu::DeviceVector< amrex::Real > > d_v_geos
Definition: ERF.H:919
int last_plot_file_step_1
Definition: ERF.H:740
static std::string nc_bdy_file
Definition: ERF.H:871
static amrex::Vector< amrex::Vector< std::string > > nc_init_file
Definition: ERF.H:868
void init_only(int lev, amrex::Real time)
Definition: ERF.cpp:1130
static int input_bndry_planes
Definition: ERF.H:900
amrex::Gpu::DeviceVector< amrex::Real > d_havg_qc
Definition: ERF.H:943
amrex::Real hub_height
Definition: ERF.H:636
void AverageDown()
Definition: ERF.cpp:1612
amrex::Vector< amrex::Vector< amrex::Real > > h_v_geos
Definition: ERF.H:918
InputSoundingData input_sounding_data
Definition: ERF.H:547
amrex::Vector< amrex::Gpu::DeviceVector< amrex::Real > > d_rhoqt_src
Definition: ERF.H:910
amrex::MultiFab fine_mask
Definition: ERF.H:960
amrex::Gpu::DeviceVector< amrex::Real > d_havg_density
Definition: ERF.H:939
void init_from_hse(int lev)
Definition: ERF_init_from_hse.cpp:34
static bool use_real_bcs
Definition: ERF.H:865
amrex::Vector< amrex::YAFluxRegister * > advflux_reg
Definition: ERF.H:709
amrex::Vector< amrex::Vector< amrex::Real > > h_rhotheta_src
Definition: ERF.H:906
static int ng_pres_hse
Definition: ERF.H:903
static amrex::Real bndry_output_planes_start_time
Definition: ERF.H:897
void WriteMultiLevelPlotfileWithTerrain(const std::string &plotfilename, int nlevels, const amrex::Vector< const amrex::MultiFab * > &mf, const amrex::Vector< const amrex::MultiFab * > &mf_nd, const amrex::Vector< std::string > &varnames, amrex::Real time, const amrex::Vector< int > &level_steps, const std::string &versionName="HyperCLaw-V1.1", const std::string &levelPrefix="Level_", const std::string &mfPrefix="Cell", const amrex::Vector< std::string > &extra_dirs=amrex::Vector< std::string >()) const
Definition: Plotfile.cpp:1358
static amrex::Real cfl
Definition: ERF.H:758
amrex::Gpu::DeviceVector< amrex::BCRec > domain_bcs_type_d
Definition: ERF.H:715
InputSpongeData input_sponge_data
Definition: ERF.H:550
void FillPatch(int lev, amrex::Real time, const amrex::Vector< amrex::MultiFab * > &mfs_vel, const amrex::Vector< amrex::MultiFab * > &mfs_mom, bool fillset=true, bool cons_only=false)
Definition: ERF_FillPatch.cpp:22
void derive_diag_profiles_stag(amrex::Gpu::HostVector< amrex::Real > &h_avg_u, amrex::Gpu::HostVector< amrex::Real > &h_avg_v, amrex::Gpu::HostVector< amrex::Real > &h_avg_w, amrex::Gpu::HostVector< amrex::Real > &h_avg_rho, amrex::Gpu::HostVector< amrex::Real > &h_avg_th, amrex::Gpu::HostVector< amrex::Real > &h_avg_ksgs, amrex::Gpu::HostVector< amrex::Real > &h_avg_uu, amrex::Gpu::HostVector< amrex::Real > &h_avg_uv, amrex::Gpu::HostVector< amrex::Real > &h_avg_uw, amrex::Gpu::HostVector< amrex::Real > &h_avg_vv, amrex::Gpu::HostVector< amrex::Real > &h_avg_vw, amrex::Gpu::HostVector< amrex::Real > &h_avg_ww, amrex::Gpu::HostVector< amrex::Real > &h_avg_uth, amrex::Gpu::HostVector< amrex::Real > &h_avg_vth, amrex::Gpu::HostVector< amrex::Real > &h_avg_wth, amrex::Gpu::HostVector< amrex::Real > &h_avg_thth, amrex::Gpu::HostVector< amrex::Real > &h_avg_ku, amrex::Gpu::HostVector< amrex::Real > &h_avg_kv, amrex::Gpu::HostVector< amrex::Real > &h_avg_kw, amrex::Gpu::HostVector< amrex::Real > &h_avg_p, amrex::Gpu::HostVector< amrex::Real > &h_avg_pu, amrex::Gpu::HostVector< amrex::Real > &h_avg_pv, amrex::Gpu::HostVector< amrex::Real > &h_avg_pw)
Definition: ERF_Write1DProfiles_stag.cpp:276
amrex::Vector< amrex::MultiFab > Nturb
Definition: ERF.H:633
std::string restart_chkfile
Definition: ERF.H:755
amrex::Vector< std::string > sampleptlogname
Definition: ERF.H:1146
void update_terrain_arrays(int lev, amrex::Real time)
Definition: ERF_make_new_arrays.cpp:350
amrex::IntVect & SamplePoint(int i)
Definition: ERF.H:1052
amrex::Vector< int > max_k_at_level
Definition: ERF.H:578
amrex::Vector< amrex::Vector< amrex::Real > > h_u_geos
Definition: ERF.H:915
void InitializeLevelFromData(int lev, const amrex::MultiFab &initial_data)
void sum_integrated_quantities(amrex::Real time)
Definition: ERF_WriteScalarProfiles.cpp:14
amrex::Vector< std::string > datalogname
Definition: ERF.H:1143
void initHSE()
Initialize HSE.
Definition: ERF_init1d.cpp:240
static amrex::Real column_loc_x
Definition: ERF.H:889
amrex::Vector< std::unique_ptr< amrex::MultiFab > > ax
Definition: ERF.H:683
amrex::Vector< std::unique_ptr< amrex::MultiFab > > z_phys_nd
Definition: ERF.H:679
void MakeDiagnosticAverage(amrex::Vector< amrex::Real > &h_havg, amrex::MultiFab &S, int n)
Definition: ERF.cpp:1565
amrex::Vector< amrex::Real > h_havg_temperature
Definition: ERF.H:934
amrex::Vector< std::unique_ptr< std::fstream > > sampleptlog
Definition: ERF.H:1145
void init_stuff(int lev, const amrex::BoxArray &ba, const amrex::DistributionMapping &dm, amrex::Vector< amrex::MultiFab > &lev_new, amrex::Vector< amrex::MultiFab > &lev_old)
Definition: ERF_make_new_arrays.cpp:26
amrex::Vector< std::unique_ptr< amrex::MultiFab > > detJ_cc_src
Definition: ERF.H:688
amrex::Gpu::DeviceVector< amrex::Real > d_havg_pressure
Definition: ERF.H:941
amrex::Vector< std::unique_ptr< amrex::MultiFab > > SmnSmn_lev
Definition: ERF.H:667
const amrex::Vector< std::string > derived_names
Definition: ERF.H:799
amrex::Real start_time
Definition: ERF.H:751
void derive_stress_profiles_stag(amrex::Gpu::HostVector< amrex::Real > &h_avg_tau11, amrex::Gpu::HostVector< amrex::Real > &h_avg_tau12, amrex::Gpu::HostVector< amrex::Real > &h_avg_tau13, amrex::Gpu::HostVector< amrex::Real > &h_avg_tau22, amrex::Gpu::HostVector< amrex::Real > &h_avg_tau23, amrex::Gpu::HostVector< amrex::Real > &h_avg_tau33, amrex::Gpu::HostVector< amrex::Real > &h_avg_hfx3, amrex::Gpu::HostVector< amrex::Real > &h_avg_diss)
Definition: ERF_Write1DProfiles_stag.cpp:489
amrex::Vector< std::unique_ptr< amrex::MultiFab > > ay_src
Definition: ERF.H:690
void sample_points(int lev, amrex::Real time, amrex::IntVect cell, amrex::MultiFab &mf)
Definition: ERF_WriteScalarProfiles.cpp:181
AMREX_FORCE_INLINE std::ostream & DataLog(int i)
Definition: ERF.H:1011
void writeJobInfo(const std::string &dir) const
Definition: writeJobInfo.cpp:9
amrex::Vector< int > nsubsteps
Definition: ERF.H:587
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > yflux_imask
Definition: ERF.H:731
amrex::Vector< amrex::MultiFab > rW_new
Definition: ERF.H:628
amrex::Vector< std::unique_ptr< amrex::MultiFab > > az_new
Definition: ERF.H:697
std::unique_ptr< WriteBndryPlanes > m_w2d
Definition: ERF.H:947
std::string plot_file_1
Definition: ERF.H:772
AMREX_FORCE_INLINE std::ostream & SampleLineLog(int i)
Definition: ERF.H:1039
amrex::Vector< amrex::Vector< amrex::MultiFab * > > lsm_flux
Definition: ERF.H:642
amrex::Vector< std::unique_ptr< amrex::MultiFab > > Tau32_lev
Definition: ERF.H:665
std::string SamplePointLogName(int i) const noexcept
The filename of the ith sampleptlog file.
Definition: ERF.H:1157
void refinement_criteria_setup()
Definition: ERF_Tagging.cpp:107
static int bndry_output_planes_interval
Definition: ERF.H:895
void RemakeLevel(int lev, amrex::Real time, const amrex::BoxArray &ba, const amrex::DistributionMapping &dm) override
Definition: ERF_make_new_level.cpp:366
static void GotoNextLine(std::istream &is)
Definition: Checkpoint.cpp:13
void MakeNewLevelFromScratch(int lev, amrex::Real time, const amrex::BoxArray &ba, const amrex::DistributionMapping &dm) override
Definition: ERF_make_new_level.cpp:27
void initSponge()
Initialize sponge profiles.
Definition: ERF_init1d.cpp:122
int real_width
Definition: ERF.H:872
void MakeNewLevelFromCoarse(int lev, amrex::Real time, const amrex::BoxArray &ba, const amrex::DistributionMapping &dm) override
Definition: ERF_make_new_level.cpp:270
amrex::Vector< std::unique_ptr< amrex::FabFactory< amrex::FArrayBox > > > m_factory
Definition: ERF.H:1162
amrex::Vector< std::unique_ptr< amrex::MultiFab > > ax_src
Definition: ERF.H:689
void input_sponge(int lev)
Definition: ERF_input_sponge.cpp:20
amrex::Vector< amrex::Gpu::DeviceVector< amrex::Real > > d_u_geos
Definition: ERF.H:916
void Define_ERFFillPatchers(int lev)
Definition: ERF.cpp:1746
AMREX_FORCE_INLINE int NumDataLogs() noexcept
Definition: ERF.H:1018
amrex::Vector< amrex::MultiFab > rW_old
Definition: ERF.H:627
void advance_lsm(int lev, amrex::MultiFab &, const amrex::Real &dt_advance)
Definition: ERF_advance_lsm.cpp:5
void FillCoarsePatch(int lev, amrex::Real time)
Definition: ERF_FillPatch.cpp:427
void ClearLevel(int lev) override
Definition: ERF_make_new_level.cpp:486
void derive_diag_profiles(amrex::Gpu::HostVector< amrex::Real > &h_avg_u, amrex::Gpu::HostVector< amrex::Real > &h_avg_v, amrex::Gpu::HostVector< amrex::Real > &h_avg_w, amrex::Gpu::HostVector< amrex::Real > &h_avg_rho, amrex::Gpu::HostVector< amrex::Real > &h_avg_th, amrex::Gpu::HostVector< amrex::Real > &h_avg_ksgs, amrex::Gpu::HostVector< amrex::Real > &h_avg_qv, amrex::Gpu::HostVector< amrex::Real > &h_avg_qc, amrex::Gpu::HostVector< amrex::Real > &h_avg_qr, amrex::Gpu::HostVector< amrex::Real > &h_avg_wqv, amrex::Gpu::HostVector< amrex::Real > &h_avg_wqc, amrex::Gpu::HostVector< amrex::Real > &h_avg_wqr, amrex::Gpu::HostVector< amrex::Real > &h_avg_qi, amrex::Gpu::HostVector< amrex::Real > &h_avg_qs, amrex::Gpu::HostVector< amrex::Real > &h_avg_qg, amrex::Gpu::HostVector< amrex::Real > &h_avg_uu, amrex::Gpu::HostVector< amrex::Real > &h_avg_uv, amrex::Gpu::HostVector< amrex::Real > &h_avg_uw, amrex::Gpu::HostVector< amrex::Real > &h_avg_vv, amrex::Gpu::HostVector< amrex::Real > &h_avg_vw, amrex::Gpu::HostVector< amrex::Real > &h_avg_ww, amrex::Gpu::HostVector< amrex::Real > &h_avg_uth, amrex::Gpu::HostVector< amrex::Real > &h_avg_vth, amrex::Gpu::HostVector< amrex::Real > &h_avg_wth, amrex::Gpu::HostVector< amrex::Real > &h_avg_thth, amrex::Gpu::HostVector< amrex::Real > &h_avg_ku, amrex::Gpu::HostVector< amrex::Real > &h_avg_kv, amrex::Gpu::HostVector< amrex::Real > &h_avg_kw, amrex::Gpu::HostVector< amrex::Real > &h_avg_p, amrex::Gpu::HostVector< amrex::Real > &h_avg_pu, amrex::Gpu::HostVector< amrex::Real > &h_avg_pv, amrex::Gpu::HostVector< amrex::Real > &h_avg_pw)
Definition: ERF_Write1DProfiles.cpp:184
static amrex::Vector< amrex::AMRErrorTag > ref_tags
Definition: ERF.H:954
amrex::Vector< amrex::Gpu::DeviceVector< amrex::Real > > d_w_subsid
Definition: ERF.H:913
amrex::Vector< ERFFillPatcher > FPr_w
Definition: ERF.H:659
int real_set_width
Definition: ERF.H:873
amrex::Vector< std::unique_ptr< amrex::MultiFab > > SFS_hfx2_lev
Definition: ERF.H:674
static amrex::Real fixed_dt
Definition: ERF.H:763
amrex::Vector< amrex::Real > thrust_coeff
Definition: ERF.H:637
amrex::Vector< amrex::Vector< amrex::MultiFab * > > lsm_data
Definition: ERF.H:641
void WriteCheckpointFile() const
Definition: Checkpoint.cpp:23
static int output_1d_column
Definition: ERF.H:886
amrex::Vector< std::unique_ptr< amrex::MultiFab > > az_src
Definition: ERF.H:691
static int fixed_mri_dt_ratio
Definition: ERF.H:765
int m_plot_int_2
Definition: ERF.H:775
amrex::Vector< amrex::Real > dt
Definition: ERF.H:592
static amrex::Real init_shrink
Definition: ERF.H:759
static bool is_it_time_for_action(int nstep, amrex::Real time, amrex::Real dt, int action_interval, amrex::Real action_per)
Definition: ERF_WriteScalarProfiles.cpp:396
amrex::Vector< amrex::Vector< amrex::Gpu::DeviceVector< amrex::Real > > > d_rayleigh_ptrs
Definition: ERF.H:928
void InitData()
Definition: ERF.cpp:535
void advance_microphysics(int lev, amrex::MultiFab &cons_in, const amrex::Real &dt_advance, const int &iteration, const amrex::Real &time)
Definition: ERF_advance_microphysics.cpp:5
amrex::Vector< std::unique_ptr< amrex::MultiFab > > Tau12_lev
Definition: ERF.H:663
int cf_width
Definition: ERF.H:654
amrex::Vector< amrex::Vector< amrex::Vector< amrex::Real > > > h_rayleigh_ptrs
Definition: ERF.H:922
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > zflux_imask
Definition: ERF.H:732
int plot_file_on_restart
Definition: ERF.H:744
void Construct_ERFFillPatchers(int lev)
Definition: ERF.cpp:1720
void post_update(amrex::MultiFab &state_mf, amrex::Real time, const amrex::Geometry &geom)
amrex::Vector< int > num_boxes_at_level
Definition: ERF.H:582
void erf_enforce_hse(int lev, amrex::MultiFab &dens, amrex::MultiFab &pres, amrex::MultiFab &pi, std::unique_ptr< amrex::MultiFab > &z_cc)
Definition: ERF_init1d.cpp:259
amrex::FabFactory< amrex::FArrayBox > const & Factory(int lev) const noexcept
Definition: ERF.H:1165
static void print_error(MPI_Comm, const std::string &msg)
Definition: console_io.cpp:43
static int ng_dens_hse
Definition: ERF.H:902
std::unique_ptr< ReadBndryPlanes > m_r2d
Definition: ERF.H:948
amrex::Vector< std::unique_ptr< amrex::MultiFab > > ay
Definition: ERF.H:684
amrex::Vector< std::unique_ptr< amrex::MultiFab > > ax_new
Definition: ERF.H:695
amrex::Vector< amrex::Vector< amrex::MultiFab * > > qmoist
Definition: ERF.H:631
static amrex::Real getCPUTime()
Definition: ERF.H:1081
LandSurface lsm
Definition: ERF.H:640
static amrex::Real change_max
Definition: ERF.H:760
void AverageDownTo(int crse_lev, int scomp, int ncomp)
Definition: ERF.cpp:1625
void setRecordSampleLineInfo(int i, int lev, amrex::IntVect &cell, const std::string &filename)
Definition: ERF.H:1125
void setSpongeRefFromSounding(bool restarting)
Set sponge mean profiles from input sounding.
Definition: ERF_init1d.cpp:152
amrex::Vector< std::unique_ptr< amrex::MultiFab > > detJ_cc_new
Definition: ERF.H:694
amrex::Vector< std::unique_ptr< amrex::MultiFab > > mapfac_v
Definition: ERF.H:703
amrex::Real nominal_power
Definition: ERF.H:636
amrex::Array< std::string, 2 *AMREX_SPACEDIM > domain_bc_type
Definition: ERF.H:718
void init_uniform(int lev)
Definition: ERF_init_uniform.cpp:17
static AMREX_FORCE_INLINE int ComputeGhostCells(const AdvChoice &advChoice, bool use_num_diff)
Definition: ERF.H:966
static void writeBuildInfo(std::ostream &os)
Definition: writeJobInfo.cpp:137
amrex::GpuArray< ERF_BC, AMREX_SPACEDIM *2 > phys_bc_type
Definition: ERF.H:727
std::string check_file
Definition: ERF.H:786
static std::string plotfile_type
Definition: ERF.H:855
amrex::Vector< amrex::IntVect > samplepoint
Definition: ERF.H:1147
amrex::Vector< amrex::Real > h_havg_qv
Definition: ERF.H:936
amrex::Real volWgtSumMF(int lev, const amrex::MultiFab &mf, int comp, const amrex::MultiFab &mapfac, bool local, bool finemask)
Definition: ERF_WriteScalarProfiles.cpp:310
static void print_usage(MPI_Comm, std::ostream &)
Definition: console_io.cpp:26
amrex::Vector< amrex::MultiFab > rV_old
Definition: ERF.H:625
amrex::Vector< std::unique_ptr< amrex::MultiFab > > Tau11_lev
Definition: ERF.H:662
amrex::Vector< int > istep
Definition: ERF.H:586
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > xflux_imask
Definition: ERF.H:730
void derive_upwp(amrex::Vector< amrex::Real > &h_havg)
void ReadCheckpointFile()
Definition: Checkpoint.cpp:265
bool writeNow(const amrex::Real cur_time, const amrex::Real dt, const int nstep, const int plot_int, const amrex::Real plot_per)
Definition: ERF.cpp:2013
amrex::Vector< amrex::Vector< amrex::MultiFab > > vars_old
Definition: ERF.H:599
amrex::MultiFab & build_fine_mask(int lev)
Definition: ERF_WriteScalarProfiles.cpp:359
static std::string init_type
Definition: ERF.H:858
AMREX_FORCE_INLINE std::ostream & SamplePointLog(int i)
Definition: ERF.H:1025
amrex::Vector< amrex::Real > power
Definition: ERF.H:637
void advance_dycore(int level, amrex::Vector< amrex::MultiFab > &state_old, amrex::Vector< amrex::MultiFab > &state_new, amrex::MultiFab &xvel_old, amrex::MultiFab &yvel_old, amrex::MultiFab &zvel_old, amrex::MultiFab &xvel_new, amrex::MultiFab &yvel_new, amrex::MultiFab &zvel_new, amrex::MultiFab &source, amrex::MultiFab &xmom_src, amrex::MultiFab &ymom_src, amrex::MultiFab &zmom_src, amrex::Geometry fine_geom, amrex::Real dt, amrex::Real time)
Definition: ERF_advance_dycore.cpp:38
void setRecordSamplePointInfo(int i, int lev, amrex::IntVect &cell, const std::string &filename)
Definition: ERF.H:1108
static int column_interval
Definition: ERF.H:887
static void print_summary(std::ostream &)
void FillPatchMoistVars(int lev, amrex::MultiFab &mf)
Definition: ERF_FillPatch.cpp:190
amrex::Vector< std::unique_ptr< amrex::MultiFab > > Tau22_lev
Definition: ERF.H:662
void sample_lines(int lev, amrex::Real time, amrex::IntVect cell, amrex::MultiFab &mf)
Definition: ERF_WriteScalarProfiles.cpp:219
void initializeMicrophysics(const int &)
Definition: ERF.cpp:1072
bool plot_lsm
Definition: ERF.H:779
const amrex::Vector< std::string > cons_names
Definition: ERF.H:794
amrex::Real thrust_coeff_standing
Definition: ERF.H:636
void timeStep(int lev, amrex::Real time, int iteration)
Definition: ERF_TimeStep.cpp:16
amrex::Real m_plot_per_2
Definition: ERF.H:777
Definition: LandSurface.H:10
Definition: MultiBlockContainer.H:8
Definition: Radiation.H:36
Definition: ERF.H:67
@ FaceConserativeLinear
Definition: ERF.H:77
@ CellConservativeQuartic
Definition: ERF.H:75
@ CellBilinear
Definition: ERF.H:72
@ FaceLinear
Definition: ERF.H:76
@ PCInterp
Definition: ERF.H:69
@ NodeBilinear
Definition: ERF.H:70
@ CellConservativeLinear
Definition: ERF.H:71
@ CellQuadratic
Definition: ERF.H:73
@ CellConservativeProtected
Definition: ERF.H:74
@ pres
Definition: Kessler.H:33
@ T
Definition: IndexDefines.H:67
Definition: console_io.cpp:12
Definition: AdvStruct.H:19
AdvType moistscal_horiz_adv_type
Definition: AdvStruct.H:287
AdvType dycore_vert_adv_type
Definition: AdvStruct.H:284
AdvType moistscal_vert_adv_type
Definition: AdvStruct.H:288
AdvType dryscal_horiz_adv_type
Definition: AdvStruct.H:285
AdvType dycore_horiz_adv_type
Definition: AdvStruct.H:283
AdvType dryscal_vert_adv_type
Definition: AdvStruct.H:286
Definition: InputSoundingData.H:20
Definition: InputSpongeData.H:19
Definition: DataStruct.H:63