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 #include <AMReX_Print.H>
15 
16 #include <AMReX_ParallelDescriptor.H>
17 #include <AMReX_ParmParse.H>
18 #include <AMReX_MultiFabUtil.H>
19 #include <AMReX_FillPatchUtil.H>
20 #include <AMReX_VisMF.H>
21 #include <AMReX_PhysBCFunct.H>
22 #include <AMReX_YAFluxRegister.H>
23 #include <AMReX_ErrorList.H>
24 #include <AMReX_EBFabFactory.H>
25 #include <AMReX_EBMultiFabUtil.H>
26 
27 #include <ERF_EB.H>
29 #include "Prob/ERF_CloudChamber.H"
30 
31 #ifdef ERF_USE_FFT
32 #include <AMReX_FFT_Poisson.H>
33 #endif
34 
35 #ifdef AMREX_MEM_PROFILING
36 #include <AMReX_MemProfiler.H>
37 #endif
38 
39 #include "ERF_ProbCommon.H"
40 
41 #include <ERF_IndexDefines.H>
42 #include <ERF_DataStruct.H>
43 #include <ERF_TurbPertStruct.H>
44 #include <ERF_InputSoundingData.H>
45 #include <ERF_InputSpongeData.H>
46 #include <ERF_SurfaceLayer.H>
47 #include <ERF_Derive.H>
48 #include <ERF_ReadBndryPlanes.H>
49 #include <ERF_WriteBndryPlanes.H>
50 #include <ERF_MRI.H>
51 #include <ERF_PhysBCFunct.H>
52 #include <ERF_WallScalarBC.H>
53 #include <ERF_FillPatcher.H>
54 #include <ERF_SampleData.H>
55 #include <ERF_ForestDrag.H>
56 #include <ERF_Provenance.H>
57 
58 #ifdef ERF_USE_PARTICLES
59 #include "ERF_ParticleData.H"
60 #endif
61 
64 #include "ERF_LandSurface.H"
65 
66 #ifdef ERF_USE_WINDFARM
67 #include "ERF_WindFarm.H"
68 #endif
69 
70 #include <ERF_RadiationModels.H>
71 
72 #ifdef ERF_USE_EAMXX_SHOC
73 #include "ERF_ShocInterface.H"
74 #endif
75 
76 #include "ERF_ShocDriver.H"
77 
78 #ifdef ERF_USE_P3
79 #include "ERF_P3Interface.H"
80 #endif
81 
82 #include <iostream>
83 
84 #ifdef AMREX_LAZY
85 #include <AMReX_Lazy.H>
86 #endif
87 
88 #ifndef AMREX_USE_MPI
89 using amrex::MPI_COMM_WORLD;
90 using amrex::MPI_Comm;
91 #endif
92 
93 #ifdef ERF_USE_MULTIBLOCK
94 class MultiBlockContainer;
95 #endif
96 
97 /**
98  * Enum of possible interpolation types between coarse/fine
99 */
100 AMREX_ENUM(StateInterpType,
101  FullState, Perturbational
102 );
103 
104 /**
105  * Enum of possible plotfile types
106 */
107 AMREX_ENUM(PlotFileType,
108  None, Amrex, Netcdf
109 );
110 
111 /**
112  * Main class in ERF code, instantiated from main.cpp
113 */
114 
115 class ERF
116  : public amrex::AmrCore
117 {
118 public:
119 
120  ////////////////
121  // public member functions
122 
123  // constructor - reads in parameters from inputs file
124  // - sizes multilevel arrays and data structures
125  ERF ();
126  ~ERF () override;
127 
128  void ERF_shared ();
129 
130  // Declare a default move constructor so we ensure the destructor is
131  // not called when we return an object of this class by value
132  ERF (ERF&&) noexcept = delete;
133 
134  // Declare a default move assignment operator
135  ERF& operator=(ERF&& other) noexcept = delete;
136 
137  // Delete the copy constructor
138  ERF (const ERF& other) = delete;
139  //
140  // Delete the copy assignment operator
141  ERF& operator=(const ERF& other) = delete;
142 
143  // Advance solution to final time
144  void Evolve ();
145  double EvolveOneStep (double time, double dt_request);
146 
147  void ConfigureDriverAtmosToOceanCoupling (bool use_coupling_driver,
148  bool use_two_way_coupling,
149  bool use_state_contract);
150  void SetDriverAtmosToOceanStateContract (bool use_state_contract);
151  // Driver currently consumes BoxArray/DistributionMapping only. If we later
152  // need exact copy semantics, promote this to expose IndexType/ngrow
153  // explicitly or return the underlying MultiFab pointer/reference instead.
154  void GetOceanToAtmosSurfaceLayout (amrex::BoxArray& ba,
155  amrex::DistributionMapping& dm);
156 
157  void PackAtmosphericStates (amrex::Vector<amrex::MultiFab*>& states, double time);
158  void ApplyOceanSurfaceState (const amrex::Vector<amrex::MultiFab*>& state, double time);
159 
160  // Tag cells for refinement
161  void ErrorEst (int lev, amrex::TagBoxArray& tags, amrex::Real time, int ngrow) override;
162 
163  // Tag cells in a given box
164  void read_box_for_refinement (std::string& ref_prefix, int& lev_for_box, amrex::RealBox& real_box);
165  void update_box_for_refinement (std::string& ref_prefix, int& lev_for_box, amrex::RealBox& real_box, const double time);
166 
167  // Refinement criteria for hurricanes
168  void HurricaneTracker (int lev,
169  double time,
170  const amrex::MultiFab& cc_vel,
171  const amrex::Real velmag_threshold,
172  amrex::TagBoxArray* tags = nullptr);
173 
174  bool FindInitialEye (int lev,
175  const amrex::MultiFab& cc_vel,
176  const amrex::Real velmag_threshold,
177  amrex::Real& eye_x, amrex::Real& eye_y);
178 
179  // Hurricane track line output as VTKPolyline
180  amrex::Vector<std::array<amrex::Real, 2>> hurricane_track_xy;
181  amrex::Vector<std::array<amrex::Real, 2>> hurricane_eye_track_xy,
187  amrex::Vector<amrex::Vector<amrex::MultiFab>> forecast_state_1,
190  amrex::Vector<amrex::MultiFab> surface_state_1,
193 
194  amrex::Vector<amrex::Vector<amrex::MultiFab>> bckgnd_state;
195 
196  std::string MakeVTKFilename(int nstep);
197  std::string MakeVTKFilename_TrackerCircle(int nstep);
198  std::string MakeVTKFilename_EyeTracker_xy(int nstep);
199  std::string MakeFilename_EyeTracker_latlon(int nstep);
200  std::string MakeFilename_EyeTracker_maxvel(int nstep);
201  std::string MakeFilename_EyeTracker_minpressure(int nstep);
202  void WriteVTKPolyline(const std::string& filename,
203  amrex::Vector<std::array<amrex::Real, 2>>& points_xy);
204 
205  void WriteLinePlot(const std::string& filename,
206  amrex::Vector<std::array<amrex::Real, 2>>& points_xy);
207 
209 
211  const amrex::Geometry& geom,
212  const amrex::Vector<amrex::MultiFab>& S_data,
213  const amrex::Real& hurricane_eye_latitude,
214  const amrex::Real& hurricane_eye_longitude);
215 
217  const amrex::Geometry& geom,
218  const amrex::Vector<amrex::MultiFab>& S_data,
219  MoistureType moisture_type);
220 
221  void ComputeGlobalMinLocation(const SolverChoice& sc,
222  const amrex::Geometry& geom,
223  const amrex::Vector<amrex::MultiFab>& S_data,
224  amrex::Real* d_val_min_ptr,
225  int* d_i_min_ptr,
226  int* d_j_min_ptr,
227  amrex::Real& global_val_min,
228  int& global_i_min,
229  int& global_j_min);
230 
231  void HurricaneMaxVelTracker(const amrex::Geometry& geom,
232  const amrex::MultiFab& mf_cc_vel,
233  const double& time);
234 
235  void HurricaneMinPressureTracker(MoistureType moisture_type,
236  const amrex::Geometry& geom,
237  const amrex::MultiFab& mf_cons_var,
238  const double& time);
239 
240  void HurricaneTrackerCircle();
241 
243 
244  // Initialize multilevel data
245  void InitData ();
246 
247  // Initialize multilevel data before MultiBlock
248  void InitData_pre ();
249 
250  // Initialize multilevel data after MultiBlock
251  void InitData_post ();
252 
253  // Interpolate 2D arrays lat_m, lon_m, sinPhi, cosPhi
254  void Interp2DArrays (int lev, const amrex::BoxArray& my_ba2d, const amrex::DistributionMapping& my_dm);
255 
257 
258  // Compute the divergence -- whether EB, no-terrain, flat terrain or general terrain
259  void compute_divergence (int lev, amrex::MultiFab& rhs, amrex::Array<amrex::MultiFab const*,AMREX_SPACEDIM> rho0_u_const,
260  amrex::Geometry const& geom_at_lev);
261 
262  // Project the velocities to be divergence-free -- this is only relevant if anelastic == 1
263  void project_initial_velocity (int lev, double time, double dt);
264  void project_momenta (int lev, double l_time, double l_dt, amrex::Vector<amrex::MultiFab >& vars);
265 
266  // Project the velocities to be divergence-free with a thin body
267  void project_velocity_tb (int lev, double dt, amrex::Vector<amrex::MultiFab >& vars);
268 
269  // Calculate wall distance by solving a Poisson equation
270  void poisson_wall_dist (int lev);
271 
272  void make_subdomains(const amrex::BoxList& ba, amrex::Vector<amrex::BoxArray>& bins);
273 
274 #ifdef ERF_USE_FFT
275  void build_fft_solvers (int lev);
276  void solve_with_fft (int lev, int isub, const amrex::Box& subdomain,
277  amrex::MultiFab& rhs, amrex::MultiFab& p,
278  amrex::Array<amrex::MultiFab,AMREX_SPACEDIM>& fluxes);
279 #endif
280  void solve_with_gmres (int lev, const amrex::Box& subdomain,
281  amrex::MultiFab& rhs, amrex::MultiFab& p,
282  amrex::Array<amrex::MultiFab,AMREX_SPACEDIM>& fluxes,
283  amrex::MultiFab& ax_sub, amrex::MultiFab& ay_sub,
284  amrex::MultiFab& az_sub,
285  amrex::MultiFab& /*dJ_sub*/, amrex::MultiFab& znd_sub);
286 
287  void ImposeBCsOnPhi (int lev, amrex::MultiFab& phi, const amrex::Box& subdomain);
288 
289  // Init (NOT restart or regrid)
290  void init_only (int lev, double time);
291 
292  // Restart
293  void restart ();
294 
295  // Check for NaNs and other bad stuff
296  void check_state_for_nans(amrex::MultiFab const& S);
297  void check_vels_for_nans(amrex::MultiFab const& xvel, amrex::MultiFab const& yvel, amrex::MultiFab const& zvel);
298  void check_for_negative_theta (amrex::MultiFab& S);
299  void check_for_low_temp (amrex::MultiFab& S);
300 
302 
303  void check_mesh_type(int lev);
304 
305  // Is it time to write a plotfile or checkpoint?
306  // Note that "cur_time" is always in double precision
307  bool writeNow (double cur_time, const int nstep, const int plot_int,
308  const double plot_per, const double dt_0, double& last_file_time);
309 
310  // Called after every level 0 timestep
311  void post_timestep (int nstep, double time, double dt_lev);
312 
313  // Do whatever writing needs to be done at intermediate times
314  void WriteAtIntermediateTime(int nstep, double time);
315 
316  // Do whatever writing needs to be done after time-stepping is complete
317  void WriteAtFinalTime();
318 
319  // Diagnostics
320  void sum_integrated_quantities (double time);
321  void sum_derived_quantities (double time);
322  void sum_energy_quantities (double time);
323 
324  void write_1D_profiles (double time);
325  void write_1D_profiles_stag (double time);
326 
327  amrex::Real cloud_fraction (double time);
328 
329  // Fill the physical boundary conditions for cell-centered velocity (diagnostic only)
330  void FillBdyCCVels (amrex::MultiFab& mf_cc_vel, amrex::Geometry& lev_geom);
331 
332  void sample_points (int lev, double time, amrex::IntVect cell, amrex::MultiFab& mf);
333  void sample_lines (int lev, double time, amrex::IntVect cell, amrex::MultiFab& mf);
334 
335  void derive_diag_profiles (double time,
336  amrex::Gpu::HostVector<amrex::Real>& h_avg_u , amrex::Gpu::HostVector<amrex::Real>& h_avg_v,
337  amrex::Gpu::HostVector<amrex::Real>& h_avg_w , amrex::Gpu::HostVector<amrex::Real>& h_avg_rho,
338  amrex::Gpu::HostVector<amrex::Real>& h_avg_th , amrex::Gpu::HostVector<amrex::Real>& h_avg_ksgs,
339  amrex::Gpu::HostVector<amrex::Real>& h_avg_Kmv , amrex::Gpu::HostVector<amrex::Real>& h_avg_Khv,
340  amrex::Gpu::HostVector<amrex::Real>& h_avg_qv , amrex::Gpu::HostVector<amrex::Real>& h_avg_qc,
341  amrex::Gpu::HostVector<amrex::Real>& h_avg_qr ,
342  amrex::Gpu::HostVector<amrex::Real>& h_avg_wqv , amrex::Gpu::HostVector<amrex::Real>& h_avg_wqc,
343  amrex::Gpu::HostVector<amrex::Real>& h_avg_wqr ,
344  amrex::Gpu::HostVector<amrex::Real>& h_avg_qi , amrex::Gpu::HostVector<amrex::Real>& h_avg_qs,
345  amrex::Gpu::HostVector<amrex::Real>& h_avg_qg ,
346  amrex::Gpu::HostVector<amrex::Real>& h_avg_uu , amrex::Gpu::HostVector<amrex::Real>& h_avg_uv,
347  amrex::Gpu::HostVector<amrex::Real>& h_avg_uw,
348  amrex::Gpu::HostVector<amrex::Real>& h_avg_vv , amrex::Gpu::HostVector<amrex::Real>& h_avg_vw,
349  amrex::Gpu::HostVector<amrex::Real>& h_avg_ww,
350  amrex::Gpu::HostVector<amrex::Real>& h_avg_uth , amrex::Gpu::HostVector<amrex::Real>& h_avg_vth,
351  amrex::Gpu::HostVector<amrex::Real>& h_avg_wth, amrex::Gpu::HostVector<amrex::Real>& h_avg_thth,
352  amrex::Gpu::HostVector<amrex::Real>& h_avg_ku, amrex::Gpu::HostVector<amrex::Real>& h_avg_kv,
353  amrex::Gpu::HostVector<amrex::Real>& h_avg_kw,
354  amrex::Gpu::HostVector<amrex::Real>& h_avg_p,
355  amrex::Gpu::HostVector<amrex::Real>& h_avg_pu, amrex::Gpu::HostVector<amrex::Real>& h_avg_pv,
356  amrex::Gpu::HostVector<amrex::Real>& h_avg_pw, amrex::Gpu::HostVector<amrex::Real>& h_avg_wthv);
357  void derive_diag_profiles_stag (double time,
358  amrex::Gpu::HostVector<amrex::Real>& h_avg_u , amrex::Gpu::HostVector<amrex::Real>& h_avg_v,
359  amrex::Gpu::HostVector<amrex::Real>& h_avg_w , amrex::Gpu::HostVector<amrex::Real>& h_avg_rho,
360  amrex::Gpu::HostVector<amrex::Real>& h_avg_th , amrex::Gpu::HostVector<amrex::Real>& h_avg_ksgs,
361  amrex::Gpu::HostVector<amrex::Real>& h_avg_Kmv , amrex::Gpu::HostVector<amrex::Real>& h_avg_Khv,
362  amrex::Gpu::HostVector<amrex::Real>& h_avg_qv , amrex::Gpu::HostVector<amrex::Real>& h_avg_qc,
363  amrex::Gpu::HostVector<amrex::Real>& h_avg_qr ,
364  amrex::Gpu::HostVector<amrex::Real>& h_avg_wqv , amrex::Gpu::HostVector<amrex::Real>& h_avg_wqc,
365  amrex::Gpu::HostVector<amrex::Real>& h_avg_wqr ,
366  amrex::Gpu::HostVector<amrex::Real>& h_avg_qi , amrex::Gpu::HostVector<amrex::Real>& h_avg_qs,
367  amrex::Gpu::HostVector<amrex::Real>& h_avg_qg ,
368  amrex::Gpu::HostVector<amrex::Real>& h_avg_uu , amrex::Gpu::HostVector<amrex::Real>& h_avg_uv,
369  amrex::Gpu::HostVector<amrex::Real>& h_avg_uw,
370  amrex::Gpu::HostVector<amrex::Real>& h_avg_vv , amrex::Gpu::HostVector<amrex::Real>& h_avg_vw,
371  amrex::Gpu::HostVector<amrex::Real>& h_avg_ww,
372  amrex::Gpu::HostVector<amrex::Real>& h_avg_uth , amrex::Gpu::HostVector<amrex::Real>& h_avg_vth,
373  amrex::Gpu::HostVector<amrex::Real>& h_avg_wth, amrex::Gpu::HostVector<amrex::Real>& h_avg_thth,
374  amrex::Gpu::HostVector<amrex::Real>& h_avg_ku, amrex::Gpu::HostVector<amrex::Real>& h_avg_kv,
375  amrex::Gpu::HostVector<amrex::Real>& h_avg_kw,
376  amrex::Gpu::HostVector<amrex::Real>& h_avg_p,
377  amrex::Gpu::HostVector<amrex::Real>& h_avg_pu, amrex::Gpu::HostVector<amrex::Real>& h_avg_pv,
378  amrex::Gpu::HostVector<amrex::Real>& h_avg_pw, amrex::Gpu::HostVector<amrex::Real>& h_avg_wthv);
379 
380  void derive_stress_profiles (amrex::Gpu::HostVector<amrex::Real>& h_avg_tau11, amrex::Gpu::HostVector<amrex::Real>& h_avg_tau12,
381  amrex::Gpu::HostVector<amrex::Real>& h_avg_tau13, amrex::Gpu::HostVector<amrex::Real>& h_avg_tau22,
382  amrex::Gpu::HostVector<amrex::Real>& h_avg_tau23, amrex::Gpu::HostVector<amrex::Real>& h_avg_tau33,
383  amrex::Gpu::HostVector<amrex::Real>& h_avg_hfx3, amrex::Gpu::HostVector<amrex::Real>& h_avg_q1fx3,
384  amrex::Gpu::HostVector<amrex::Real>& h_avg_q2fx3, amrex::Gpu::HostVector<amrex::Real>& h_avg_diss);
385  void derive_stress_profiles_stag (amrex::Gpu::HostVector<amrex::Real>& h_avg_tau11, amrex::Gpu::HostVector<amrex::Real>& h_avg_tau12,
386  amrex::Gpu::HostVector<amrex::Real>& h_avg_tau13, amrex::Gpu::HostVector<amrex::Real>& h_avg_tau22,
387  amrex::Gpu::HostVector<amrex::Real>& h_avg_tau23, amrex::Gpu::HostVector<amrex::Real>& h_avg_tau33,
388  amrex::Gpu::HostVector<amrex::Real>& h_avg_hfx3, amrex::Gpu::HostVector<amrex::Real>& h_avg_q1fx3,
389  amrex::Gpu::HostVector<amrex::Real>& h_avg_q2fx3, amrex::Gpu::HostVector<amrex::Real>& h_avg_diss);
390 
391  // Perform the volume-weighted sum
393  volWgtSumMF (int lev, const amrex::MultiFab& mf, int comp,
394  const amrex::MultiFab& dJ, const amrex::MultiFab& mfx, const amrex::MultiFab& mfy,
395  bool finemask, bool local = true);
396 
397  void
398  volWgtColumnSum (int lev, const amrex::MultiFab& mf, int comp,
399  amrex::MultiFab& mf_2d, const amrex::MultiFab& dJ);
400 
401  // Decide if it is time to take an action
402  static bool is_it_time_for_action (int nstep, double time, double dt,
403  int action_interval, double action_per);
404 
405  // Make a new level using provided BoxArray and DistributionMapping and
406  // fill with interpolated coarse level data.
407  // overrides the pure virtual function in AmrCore
408  void MakeNewLevelFromCoarse (int lev, amrex::Real time, const amrex::BoxArray& ba,
409  const amrex::DistributionMapping& dm) override;
410 
411  // Remake an existing level using provided BoxArray and DistributionMapping and
412  // fill with existing fine and coarse data.
413  // overrides the pure virtual function in AmrCore
414  void RemakeLevel (int lev, amrex::Real time, const amrex::BoxArray& ba,
415  const amrex::DistributionMapping& dm) override;
416 
417  // Delete level data
418  // overrides the pure virtual function in AmrCore
419  void ClearLevel (int lev) override;
420 
421  // Make a new level from scratch using provided BoxArray and DistributionMapping.
422  // Only used during initialization.
423  // overrides the pure virtual function in AmrCore
424  void MakeNewLevelFromScratch (int lev, amrex::Real time, const amrex::BoxArray& ba,
425  const amrex::DistributionMapping& dm) override;
426 
427  // compute dt from CFL considerations
428  double estTimeStep (int lev, long& dt_fast_ratio) const;
429 
430 #ifdef ERF_USE_WW3_COUPLING
431  //amrex::Print() << " About to call send_to_ww3 from ERF.H" << std::endl;
432  void send_to_ww3(int lev);
433  //amrex::Print() << " About to call read_waves from ERF.H" << std::endl;
434  void read_waves(int lev);
435  //void send_to_ww3 (int lev);
436  //void read_waves (int lev);
437 
438  //void send_to_ww3 (int lev);
439 #endif
440 
441  // Interface for advancing the data at one level by one "slow" timestep
442  void advance_dycore (int level,
443  amrex::Vector<amrex::MultiFab>& state_old,
444  amrex::Vector<amrex::MultiFab>& state_new,
445  amrex::MultiFab& xvel_old, amrex::MultiFab& yvel_old, amrex::MultiFab& zvel_old,
446  amrex::MultiFab& xvel_new, amrex::MultiFab& yvel_new, amrex::MultiFab& zvel_new,
447  amrex::MultiFab& source, amrex::MultiFab& xmom_src,
448  amrex::MultiFab& ymom_src, amrex::MultiFab& zmom_src,
449  amrex::MultiFab& buoyancy, amrex::Geometry fine_geom,
450  double dt, double time);
451 
452  void advance_microphysics (int lev,
453  amrex::MultiFab& cons_in,
454  const double& dt_advance,
455  const int& iteration,
456  const double& time);
457 
458  void advance_lsm (int lev,
459  amrex::MultiFab& cons_in,
460  amrex::MultiFab& xvel_in,
461  amrex::MultiFab& yvel_in,
462  const double& time,
463  const double& dt_advance);
464 
465  void advance_radiation (int lev,
466  amrex::MultiFab& cons_in,
467  const double& dt_advance);
468 
469 #ifdef ERF_USE_EAMXX_SHOC
470  void compute_shoc_tendencies (int lev,
471  amrex::MultiFab* cons,
472  amrex::MultiFab* xvel,
473  amrex::MultiFab* yvel,
474  amrex::MultiFab* zvel,
475  amrex::Real* w_subsid,
476  amrex::MultiFab* tau13,
477  amrex::MultiFab* tau23,
478  amrex::MultiFab* hfx3,
479  amrex::MultiFab* qfx3,
480  amrex::MultiFab* eddyDiffs,
481  amrex::MultiFab* z_phys_nd,
482  const double& dt_advance);
483 #endif
484 
485  void compute_native_shoc_tendencies (int lev,
486  amrex::MultiFab* cons,
487  amrex::MultiFab* xvel,
488  amrex::MultiFab* yvel,
489  amrex::MultiFab* zvel,
490  amrex::Real* w_subsid,
491  amrex::MultiFab* tau13,
492  amrex::MultiFab* tau23,
493  amrex::MultiFab* hfx3,
494  amrex::MultiFab* qfx3,
495  amrex::MultiFab* eddyDiffs,
496  amrex::MultiFab* z_phys_nd,
497  const double& dt_advance);
498 
499 #ifdef ERF_USE_P3
500  void compute_p3_tendencies (int lev,
501  amrex::MultiFab& cons_in,
502  amrex::MultiFab& source,
503  const double& dt_advance);
504 #endif
505 
506  void build_fine_mask (int lev, amrex::MultiFab& fine_mask);
507 
508  void MakeHorizontalAverages ();
509  void MakeDiagnosticAverage (amrex::Vector<amrex::Real>& h_havg, amrex::MultiFab& S, int n);
510  void derive_upwp (amrex::Vector<amrex::Real>& h_havg);
511 
512  // Write plotfile to disk
513  void Write3DPlotFile (int which, PlotFileType plotfile_type, amrex::Vector<std::string> plot_var_names);
514  void Write2DPlotFile (int which, PlotFileType plotfile_type, amrex::Vector<std::string> plot_var_names);
515 
516  // Write subvolume of data into a different "plotfile"
517  void WriteSubvolume (int isub, amrex::Vector<std::string> subvol_var_names);
518 
519  void WriteMultiLevelPlotfileWithTerrain (const std::string &plotfilename,
520  int nlevels,
521  const amrex::Vector<const amrex::MultiFab*> &mf,
522  const amrex::Vector<const amrex::MultiFab*> &mf_nd,
523  const amrex::Vector<std::string> &varnames,
524  const amrex::Vector<amrex::Geometry>& my_geom,
525  double time,
526  const amrex::Vector<int> &level_steps,
527  const amrex::Vector<amrex::IntVect>& my_ref_ratio,
528  const std::string &versionName = "HyperCLaw-V1.1",
529  const std::string &levelPrefix = "Level_",
530  const std::string &mfPrefix = "Cell",
531  const amrex::Vector<std::string>& extra_dirs = amrex::Vector<std::string>()) const;
532 
533 
534  void WriteGenericPlotfileHeaderWithTerrain (std::ostream &HeaderFile,
535  int nlevels,
536  const amrex::Vector<amrex::BoxArray> &bArray,
537  const amrex::Vector<std::string> &varnames,
538  const amrex::Vector<amrex::Geometry>& my_geom,
539  double time,
540  const amrex::Vector<int> &level_steps,
541  const amrex::Vector<amrex::IntVect>& my_ref_ratio,
542  const std::string &versionName,
543  const std::string &levelPrefix,
544  const std::string &mfPrefix) const;
545 
546  void erf_enforce_hse (int lev,
547  amrex::MultiFab& dens, amrex::MultiFab& pres, amrex::MultiFab& pi,
548  amrex::MultiFab& th, amrex::MultiFab& qv,
549  std::unique_ptr<amrex::MultiFab>& z_cc);
550 
551 #ifdef ERF_USE_NETCDF
552  //! Write a timestep to 1D vertical column output for coupling
553  void writeToNCColumnFile (int lev,
554  const std::string& colfile_name, amrex::Real xloc, amrex::Real yloc,
555  double time);
556 #endif //ERF_USE_NETCDF
557 
558  void init_from_input_sounding (int lev);
559 
560  void init_immersed_forcing (int lev);
561 
562  void input_sponge (int lev);
563 
564  void init_from_hse (int lev);
565 
566  void init_thin_body (int lev, const amrex::BoxArray& ba, const amrex::DistributionMapping& dm);
567 
568  void FillForecastStateMultiFabs(const int lev,
569  const std::string& filename,
570  const std::unique_ptr<amrex::MultiFab>& z_phys_nd,
571  amrex::Vector<amrex::Vector<amrex::MultiFab>>& forecast_state);
572 
573  void FillSurfaceStateMultiFabs(const int lev,
574  const std::string& filename,
575  amrex::Vector<amrex::MultiFab>& surface_state);
576 
577 
578  void WeatherDataInterpolation(const int nlevs,
579  const double time,
580  amrex::Vector<std::unique_ptr<amrex::MultiFab>>& z_phys_nd,
581  bool regrid_forces_file_read);
582 
583  void SurfaceDataInterpolation(const int nlevs,
584  const double time,
585  amrex::Vector<std::unique_ptr<amrex::MultiFab>>& z_phys_nd,
586  bool regrid_forces_file_read);
587 
589  amrex::MultiFab& mf_cc_pert,
590  amrex::MultiFab& cons_pert,
591  amrex::MultiFab& xvel_pert,
592  amrex::MultiFab& yvel_pert,
593  amrex::MultiFab& zvel_pert);
594 
595  void create_random_perturbations (const int lev,
596  amrex::MultiFab& mf_cc_pert);
597 
598  void apply_gaussian_smoothing_to_perturbations (const int lev,
599  amrex::MultiFab& mf_cc_pert);
600 
602 
603  void PerformDataAssimilation(int da_iter);
604 
605  void init_custom (int lev);
606 
607 #ifdef ERF_USE_MULTIBLOCK
608  // constructor used when ERF is created by a multiblock driver
609  // calls AmrCore constructor -> AmrMesh constructor
610  ERF (const amrex::RealBox& rb, int max_level_in,
611  const amrex::Vector<int>& n_cell_in, int coord,
612  const amrex::Vector<amrex::IntVect>& ref_ratio,
613  const amrex::Array<int,AMREX_SPACEDIM>& is_per,
614  std::string prefix);
615 
616  // Advance a block specified number of time steps
617  void Evolve_MB (int MBstep, int max_block_step);
618 
619  // Set parmparse prefix for MultiBlock
620  void SetParmParsePrefix (std::string name) { pp_prefix = name; }
621 
622  // Set 'this' from multiblock container
623  void SetMultiBlockPointer (MultiBlockContainer *mbc) { m_mbc = mbc; }
624 
625  // Public data copy for MB
626  std::vector<amrex::Box> domain_p;
627 
628  // Primary solution data data containers
629  amrex::Vector<amrex::Vector<amrex::MultiFab> > vars_new;
630  amrex::Vector<amrex::Vector<amrex::MultiFab> > vars_old;
631 
632  // Pressure gradient at each level
633  amrex::Vector<amrex::Vector<amrex::MultiFab> > gradp;
634 
635  // Velocity time averaged field
636  amrex::Vector<std::unique_ptr<amrex::MultiFab>> vel_t_avg;
637  amrex::Vector<double> t_avg_cnt;
638 #endif
639 
640  std::string pp_prefix {"erf"};
641 
642  void fill_from_bndryregs (const amrex::Vector<amrex::MultiFab*>& mfs,
643  double time);
644 
645 #ifdef ERF_USE_NETCDF
646  // Version in which we always set the velocity values but don't set theta
647  void fill_from_realbdy (const amrex::Vector<amrex::MultiFab*>& mfs,
648  double time,
649  bool cons_only,
650  int icomp_cons,
651  int ncomp_cons,
652  amrex::IntVect ngvect_cons,
653  amrex::IntVect ngvect_vels);
654 #endif
655 
656 #ifdef ERF_USE_NETCDF
657  void init_from_wrfinput (int lev, amrex::MultiFab& mf_PSFC);
658  void init_from_metgrid (int lev);
659  void init_from_ncfile (int lev);
660 #endif // ERF_USE_NETCDF
661 
662 #ifdef ERF_USE_WINDFARM
663  void init_windfarm(int lev);
664  void advance_windfarm (const amrex::Geometry& a_geom,
665  const double& dt_advance,
666  amrex::MultiFab& cons_in,
667  amrex::MultiFab& U_old,
668  amrex::MultiFab& V_old,
669  amrex::MultiFab& W_old,
670  amrex::MultiFab& mf_vars_windfarm,
671  const amrex::MultiFab& mf_Nturb,
672  const amrex::MultiFab& mf_SMark,
673  const double& time);
674 #endif
675 
676  void MakeEBGeometry ();
677  void make_eb_box ();
679 
680  // more flexible version of AverageDown() that lets you average down across multiple levels
681  void AverageDownTo (int crse_lev,
682  int scomp,
683  int ncomp,
684  bool do_perturbational_and_momenta = true); // NOLINT
685 
686  /*! \brief Conservation-preserving fine-to-coarse average of RhoTheta and
687  * the active moist conserved components using detJ/mfac weighting, reusing
688  * AverageDownTo with perturbational-state and momentum handling disabled. */
689  void AverageDownMoistStateTo (int crse_lev);
690 
691  // Write checkpoint file to disk
692  void WriteCheckpointFile () const;
693 
694  // Read checkpoint file from disk
695  void ReadCheckpointFile ();
696 
697  // Read only velocities from checkpoint file
698  void ReadVelsOnlyFromCheckpointFile (int lev_to_fill, std::string& chkfile);
699 
700  // read checkpoint file from disk -- called after instantiating m_SurfaceLayer
702 
703  void init_zphys (int lev, double elapsed_time);
704  void remake_zphys (int lev, std::unique_ptr<amrex::MultiFab>& temp_zphys_nd);
705  void update_terrain_arrays (int lev);
706 
710 
711 private:
712 
713  ///////////////////////////
714  // private member functions
715  ///////////////////////////
716 
717  // read in some parameters from inputs file
718  void ReadParameters ();
719  void ParameterSanityChecks ();
720 
721  // set covered coarse cells/faces to be the average of overlying fine cells/faces
722  void AverageDown ();
723 
724  void update_diffusive_arrays (int lev, const amrex::BoxArray& ba, const amrex::DistributionMapping& dm);
725 
726  void Construct_ERFFillPatchers (int lev);
727 
728  void Define_ERFFillPatchers (int lev);
729 
730  void init1DArrays ();
731 
732  void init_bcs ();
733  void init_phys_bcs (bool& read_prim_theta);
734 
735  void init_stuff (int lev, const amrex::BoxArray& ba, const amrex::DistributionMapping& dm,
736  amrex::Vector<amrex::MultiFab>& lev_new, amrex::Vector<amrex::MultiFab>& lev_old,
737  amrex::MultiFab& tmp_base_state,
738  std::unique_ptr<amrex::MultiFab>& tmp_zphys_nd);
739 
740  // Initialize the Turbulent perturbation
741  void turbPert_update (const int lev, const double dt);
742  void turbPert_amplitude (const int lev);
743  void turbPert_amplitude_w (const int lev);
744 
745  // Initialize the integrator object
746  void initialize_integrator (int lev, amrex::MultiFab& cons_mf, amrex::MultiFab& vel_mf);
747 
748  // Create the physbcs objects
749  void make_physbcs (int lev);
750 
751  // Initialize the microphysics object
752  void initializeMicrophysics (const int&);
753 
754 #ifdef ERF_USE_WINDFARM
755  // Initialize the windfarm object
756  void initializeWindFarm (const int&);
757 #endif
758 
759  // Compute a vector of new MultiFabs by copying from valid region and filling ghost cells
760  //
761  // NOTE: FillPatch takes in an empty MF, and returns cell-centered + velocities (not momenta)
762  //
763  // This one works only at level = 0 (base state does not change)
764  void FillPatchCrseLevel (int lev, double time,
765  const amrex::Vector<amrex::MultiFab*>& mfs_vel,
766  bool cons_only=false);
767 
768  // This one works only at level > 0 (base state does change)
769  void FillPatchFineLevel (int lev, double time,
770  const amrex::Vector<amrex::MultiFab*>& mfs_vel,
771  const amrex::Vector<amrex::MultiFab*>& mfs_mom,
772  const amrex::MultiFab& old_base_state,
773  const amrex::MultiFab& new_base_state,
774  bool fillset=true, bool cons_only=false);
775 
776  // Compute new multifabs by copying data from valid region and filling ghost cells.
777  // Unlike FillPatch, FillIntermediatePatch will use the supplied multifabs instead of fine level data.
778  // This is to support filling boundary cells at an intermediate time between old/new times
779  // on the fine level when valid data at a specific time is already available (such as
780  // at each RK stage when integrating between initial and final times at a given level).
781  //
782  // NOTE: FillIntermediatePatch takes in updated momenta, and returns both updated velocity and momenta
783  //
784  void FillIntermediatePatch (int lev, double time,
785  const amrex::Vector<amrex::MultiFab*>& mfs_vel,
786  const amrex::Vector<amrex::MultiFab*>& mfs_mom,
787  int ng_cons, int ng_vel, bool cons_only, int icomp_cons, int ncomp_cons);
788 
789  // Fill all multifabs (and all components) in a vector of multifabs corresponding to the
790  // grid variables defined in vars_old and vars_new just as FillCoarsePatch.
791  void FillCoarsePatch (int lev, double time);
792 
793  // advance a level by dt
794  // includes a recursive call for finer levels
795  void timeStep (int lev, double time, int iteration);
796 
797  // advance a single level for a single time step
798  void Advance (int lev, double time, double dt_lev, int iteration, int ncycle);
799 
800  //! Initialize HSE
801  void initHSE ();
802  void initHSE (int lev);
803 
804  //! Initialize Rayleigh damping profiles at a level
805  void initRayleigh_at_level (const int& lev);
806 
807  //! Initialize sponge profiles
808  void initSponge ();
809 
810  //! Set Rayleigh mean profiles from input sounding
811  void setRayleighRefFromSounding (bool restarting);
812 
813  //! Set sponge mean profiles from input sounding
814  void setSpongeRefFromSounding (bool restarting);
815 
816  // a wrapper for estTimeStep()
817  void ComputeDt (int step = -1, double cur_time_d = 0.0);
818 
819  // get plotfile name
820  [[nodiscard]] std::string PlotFileName (int lev) const;
821 
822  // set plotfile variable names
823  static amrex::Vector<std::string> PlotFileVarNames (amrex::Vector<std::string> plot_var_names);
824 
825  // set which variables and derived quantities go into plotfiles
826  void setPlotVariables (const std::string& pp_plot_var_names, amrex::Vector<std::string>& plot_var_names);
827  void setPlotVariables2D (const std::string& pp_plot_var_names, amrex::Vector<std::string>& plot_var_names);
828  // append variables to plot
829  void appendPlotVariables (const std::string& pp_plot_var_names, amrex::Vector<std::string>& plot_var_names);
830 
831  void setSubVolVariables (const std::string& pp_subvol_var_names, amrex::Vector<std::string>& subvol_var_names);
832 
833 #ifdef ERF_USE_NETCDF
834  //! Create 1D vertical column output for coupling
835  void createNCColumnFile (int lev,
836  const std::string& colfile_name, amrex::Real xloc, amrex::Real yloc);
837 
838  // Copy from the NC*fabs into the MultiFabs holding the boundary data
839  void init_from_wrfbdy (amrex::Vector<amrex::FArrayBox*> x_vel_lateral,
840  amrex::Vector<amrex::FArrayBox*> y_vel_lateral,
841  amrex::Vector<amrex::FArrayBox*> z_vel_lateral,
842  amrex::Vector<amrex::FArrayBox*> T_lateral);
843 
844  static double start_bdy_time;
845  static double final_bdy_time;
846 
847  static double start_low_time;
848  static double final_low_time;
849 
850  static double bdy_time_interval;
851  static double low_time_interval;
852 
853  // *** *** FArrayBox's for holding the SURFACE data
854  // amrex::IArrayBox NC_IVGTYP_fab; // Vegetation type (IVGTYP); Discrete numbers;
855  // amrex::FArrayBox NC_z0_fab; // Surface Roughness, z0 = z0 (IVGTYP)
856  // amrex::FArrayBox NC_PSFC_fab; // Surface pressure
857 
858  // TODO: Clarify the relation between SST and TSK
859  // amrex::FArrayBox NC_SST_fab; // Sea Surface Temperature; Defined even for land area
860  // amrex::FArrayBox NC_TSK_fab; // Surface Skin Temperature; Appears to be same as SST...
861 
862  // Vectors (over time) of Vector (over variables) of FArrayBoxs for holding the data read from the wrfbdy NetCDF file
863  amrex::Vector<amrex::Vector<amrex::FArrayBox>> bdy_data_xlo;
864  amrex::Vector<amrex::Vector<amrex::FArrayBox>> bdy_data_xhi;
865  amrex::Vector<amrex::Vector<amrex::FArrayBox>> bdy_data_ylo;
866  amrex::Vector<amrex::Vector<amrex::FArrayBox>> bdy_data_yhi;
867 
868  amrex::Vector<amrex::Vector<amrex::FArrayBox>> low_data_zlo;
869 
870  // Maximum value of terrain read in from wrfinput at level 0
871  amrex::Real z_top = zero;
872 
873 #endif // ERF_USE_NETCDF
874 
875  amrex::Vector<std::unique_ptr<amrex::MultiFab>> lat_m, lon_m; // Latitude and Longitude on the grid
876 
877  amrex::Vector<std::unique_ptr<amrex::MultiFab>> sinPhi_m, cosPhi_m; // Coriolis factors on the grid
878 
879  // Struct for working with the sounding data we take as an input
881 
882  // Struct for working with the sponge data we take as an input
884 
885  // Vector (6 planes) of DeviceVectors (ncell in plane) for Dirichlet BC data
886  amrex::Vector<amrex::Gpu::DeviceVector<amrex::Real>> xvel_bc_data;
887  amrex::Vector<amrex::Gpu::DeviceVector<amrex::Real>> yvel_bc_data;
888  amrex::Vector<amrex::Gpu::DeviceVector<amrex::Real>> zvel_bc_data;
889  amrex::Vector<amrex::Gpu::DeviceVector<amrex::Real>> th_bc_data;
890 
891  // Function to read and populate above vectors (if input file exists)
892  void init_Dirichlet_bc_data (const std::string input_file);
893 
894  // Read the file passed to amr.restart and use it as an initial condition for
895  // the current simulation. Supports a different number of components and
896  // ghost cells.
898 
899  // Initialize the new-time data at a level from the initial_data MultiFab
900  void InitializeLevelFromData (int lev, const amrex::MultiFab& initial_data);
901 
902  // utility to skip to next line in Header
903  static void GotoNextLine (std::istream& is);
904 
905  // Single level functions called by advance()
906  void post_update (amrex::MultiFab& state_mf, double time, const amrex::Geometry& geom);
907  void fill_rhs (amrex::MultiFab& rhs_mf, const amrex::MultiFab& state_mf, double time, const amrex::Geometry& geom);
908 
909  ////////////////
910  // private data members
911 
912  std::unique_ptr<ProblemBase> prob = nullptr; // problem-specific functions
913 
914  amrex::Vector<int> num_boxes_at_level; // how many boxes specified at each level by tagging criteria
915  amrex::Vector<int> num_files_at_level; // how many wrfinput files specified at each level
916  amrex::Vector<amrex::Vector<amrex::Box>> boxes_at_level; // the boxes specified at each level by tagging criteria
917 
918  amrex::Vector<int> istep; // which step?
919  amrex::Vector<int> nsubsteps; // how many substeps on each level?
920 
921  // keep track of old time, new time, and time step at each level
922  amrex::Vector<double> t_new;
923  amrex::Vector<double> t_old;
924  amrex::Vector<double> dt;
925  amrex::Vector<long> dt_mri_ratio;
926 
927 #ifndef ERF_USE_MULTIBLOCK
928  // Array of multifabs to store the solution at each level of refinement;
929  // after advancing a level we use "swap".
930  amrex::Vector<amrex::Vector<amrex::MultiFab> > vars_new;
931  amrex::Vector<amrex::Vector<amrex::MultiFab> > vars_old;
932 
933  // Pressure gradient at each level
934  amrex::Vector<amrex::Vector<amrex::MultiFab> > gradp;
935 
936  // Velocity time averaged field
937  amrex::Vector<std::unique_ptr<amrex::MultiFab>> vel_t_avg;
938  amrex::Vector<double> t_avg_cnt;
939 #endif
940  amrex::Vector<std::unique_ptr<MRISplitIntegrator<amrex::Vector<amrex::MultiFab> > > > mri_integrator_mem;
941 
942  // Used for anelastic or when we impose an initial projection
943  amrex::Vector<amrex::MultiFab> pp_inc;
944 
945  // Used only for fast substepping
946  amrex::Vector<amrex::MultiFab> lagged_delta_rt;
947  amrex::Vector<amrex::MultiFab> avg_xmom;
948  amrex::Vector<amrex::MultiFab> avg_ymom;
949  amrex::Vector<amrex::MultiFab> avg_zmom;
950 
951  // Vector over levels of routines to impose physical boundary conditions
952  amrex::Vector<std::unique_ptr<ERFPhysBCFunct_cons>> physbcs_cons;
953  amrex::Vector<std::unique_ptr<ERFPhysBCFunct_u>> physbcs_u;
954  amrex::Vector<std::unique_ptr<ERFPhysBCFunct_v>> physbcs_v;
955  amrex::Vector<std::unique_ptr<ERFPhysBCFunct_w>> physbcs_w;
956  amrex::Vector<std::unique_ptr<ERFPhysBCFunct_base>> physbcs_base;
957 
958  // Store primitive variable for MOST BC
959  amrex::Vector<std::unique_ptr<amrex::MultiFab>> Theta_prim;
960  amrex::Vector<std::unique_ptr<amrex::MultiFab>> Qv_prim;
961  amrex::Vector<std::unique_ptr<amrex::MultiFab>> Qr_prim;
962 
963  // Scratch space for time integrator
964  amrex::Vector<amrex::MultiFab> rU_old;
965  amrex::Vector<amrex::MultiFab> rU_new;
966  amrex::Vector<amrex::MultiFab> rV_old;
967  amrex::Vector<amrex::MultiFab> rV_new;
968  amrex::Vector<amrex::MultiFab> rW_old;
969  amrex::Vector<amrex::MultiFab> rW_new;
970 
971  // amrex::Vector<amrex::MultiFab> xmom_crse_rhs;
972  // amrex::Vector<amrex::MultiFab> ymom_crse_rhs;
973  amrex::Vector<amrex::MultiFab> zmom_crse_rhs;
974 
975  std::unique_ptr<Microphysics> micro;
976  std::unique_ptr<CloudChamberBudget> cloud_chamber_budget;
978  amrex::Vector<amrex::Vector<amrex::MultiFab*>> qmoist; // (lev,ncomp) rain_accum, snow_accum, graup_accum
979 
980  // Variables for wind farm parametrization models
981 
982 #ifdef ERF_USE_WINDFARM
983  std::unique_ptr<WindFarm> windfarm;
984  amrex::Vector<amrex::MultiFab> Nturb;
985  amrex::Vector<amrex::MultiFab> vars_windfarm; // Fitch: Vabs, Vabsdt, dudt, dvdt, dTKEdt
986  // EWP: dudt, dvdt, dTKEdt
987 
988  amrex::Vector<amrex::MultiFab> SMark; // A multifab that holds an integer corresponding
989  // to the number of the wind turbine to sample
990  // velocity upstream of the turbine
991 #endif
992 
994  amrex::Vector<std::string> lsm_data_name; // (ncomp) -- e.g., sw_dn_dir/dif_vis/nir, lw_dn, cos_zen
995  amrex::Vector<amrex::Vector<amrex::MultiFab*>> lsm_data; // (lev,ncomp) Data for LSM coupling
996  amrex::Vector<std::string> lsm_flux_name; // (ncomp) -- e.g., hfx3, q1fx3, tau13, tau23
997  amrex::Vector<amrex::Vector<amrex::MultiFab*>> lsm_flux; // (lev,ncomp) Fluxes from LSM needed by DYCORE
998 
999  amrex::Vector<std::unique_ptr<IRadiation>> rad; // Radiation model at each level
1000  amrex::Vector<std::unique_ptr<amrex::MultiFab>> qheating_rates; // radiation heating rate source terms (SW, LW) (DYCORE)
1001  amrex::Vector<std::unique_ptr<amrex::MultiFab>> rad_fluxes; // radiation fluxes (SW up/dn, LW up/dn) (OUTPUT ONLY)
1002 #ifdef ERF_USE_EAMXX_SHOC
1003  amrex::Vector<std::unique_ptr<SHOCInterface>> eamxx_shoc_interface; // EAMxx SHOC model at each level
1004 #endif
1005 
1006  amrex::Vector<std::unique_ptr<ShocDriver>> native_shoc_driver; // Native SHOC model at each level
1007 
1008 #ifdef ERF_USE_P3
1009  amrex::Vector<std::unique_ptr<P3Interface>> p3_interface; // P3 model at each level
1010 #endif
1011 
1012  bool plot_rad = false;
1014 
1015  // Fillpatcher classes for coarse-fine boundaries
1016  int cf_width{0};
1018  amrex::Vector<ERFFillPatcher> FPr_c;
1019  amrex::Vector<ERFFillPatcher> FPr_u;
1020  amrex::Vector<ERFFillPatcher> FPr_v;
1021  amrex::Vector<ERFFillPatcher> FPr_w;
1022 
1023  // Diffusive stresses and Smag
1024  amrex::Vector<amrex::Vector<std::unique_ptr<amrex::MultiFab>>> Tau;
1025  amrex::Vector<amrex::Vector<std::unique_ptr<amrex::MultiFab>>> Tau_corr; // correction to tau for implicit
1026  amrex::Vector<std::unique_ptr<amrex::MultiFab>> eddyDiffs_lev;
1027  amrex::Vector<std::unique_ptr<amrex::MultiFab>> SmnSmn_lev;
1028 
1029  // Sea Surface Temps, Skin Temperature and Land Masks (lev, ntimes)
1030  amrex::Vector<amrex::Vector<std::unique_ptr<amrex::MultiFab>>> sst_lev;
1031  amrex::Vector<amrex::Vector<std::unique_ptr<amrex::MultiFab>>> tsk_lev;
1032  amrex::Vector<amrex::Vector<std::unique_ptr<amrex::iMultiFab>>> lmask_lev;
1033 
1034  // Land grid types and urban fraction
1035  amrex::Vector<amrex::Vector<std::unique_ptr<amrex::iMultiFab>>> land_type_lev;
1036  amrex::Vector<amrex::Vector<std::unique_ptr<amrex::iMultiFab>>> soil_type_lev;
1037  amrex::Vector<amrex::Vector<std::unique_ptr<amrex::MultiFab>>> urb_frac_lev;
1038 
1039  // Other SFS terms
1040  amrex::Vector<std::unique_ptr<amrex::MultiFab>> SFS_hfx1_lev, SFS_hfx2_lev, SFS_hfx3_lev;
1041  amrex::Vector<std::unique_ptr<amrex::MultiFab>> SFS_diss_lev;
1042  amrex::Vector<std::unique_ptr<amrex::MultiFab>> SFS_q1fx1_lev, SFS_q1fx2_lev, SFS_q1fx3_lev;
1043  amrex::Vector<std::unique_ptr<amrex::MultiFab>> SFS_q2fx3_lev;
1044 
1045  // Diffusive fluxes for EB
1046  // Tau_EB[level][component][grid_type]
1047  amrex::Vector<amrex::Vector<amrex::Vector<std::unique_ptr<amrex::MultiFab>>>> Tau_EB;
1048  amrex::Vector<std::unique_ptr<amrex::MultiFab>> hfx3_EB;
1049  amrex::Vector<std::unique_ptr<amrex::MultiFab>> qfx3_EB;
1050 
1051  // Grid stretching
1052  amrex::Vector<amrex::Vector<amrex::Real>> zlevels_stag; // nominal height levels
1053 
1054  // Data structures for terrain-fitted coordinates
1055  amrex::Vector<std::unique_ptr<amrex::MultiFab>> z_phys_nd;
1056  amrex::Vector<std::unique_ptr<amrex::MultiFab>> z_phys_cc;
1057 
1058  amrex::Vector<std::unique_ptr<amrex::MultiFab>> detJ_cc;
1059  amrex::Vector<std::unique_ptr<amrex::MultiFab>> ax;
1060  amrex::Vector<std::unique_ptr<amrex::MultiFab>> ay;
1061  amrex::Vector<std::unique_ptr<amrex::MultiFab>> az;
1062 
1063  amrex::Vector<std::unique_ptr<amrex::MultiFab>> z_phys_nd_src;
1064  amrex::Vector<std::unique_ptr<amrex::MultiFab>> z_phys_cc_src;
1065  amrex::Vector<std::unique_ptr<amrex::MultiFab>> detJ_cc_src;
1066  amrex::Vector<std::unique_ptr<amrex::MultiFab>> ax_src;
1067  amrex::Vector<std::unique_ptr<amrex::MultiFab>> ay_src;
1068  amrex::Vector<std::unique_ptr<amrex::MultiFab>> az_src;
1069 
1070  amrex::Vector<std::unique_ptr<amrex::MultiFab>> z_phys_nd_new;
1071  amrex::Vector<std::unique_ptr<amrex::MultiFab>> detJ_cc_new;
1072 
1073  amrex::Vector<std::unique_ptr<amrex::MultiFab>> z_t_rk;
1074 
1075  // Data structures for terrain immersed forcing
1076  amrex::Vector<std::unique_ptr<amrex::MultiFab>> terrain_blanking;
1077 
1078  // Wall distance function
1079  amrex::Vector<std::unique_ptr<amrex::MultiFab>> walldist;
1080 
1081  // Map scale factors -- vector across levels of vector across types
1082  amrex::Vector<amrex::Vector<std::unique_ptr<amrex::MultiFab>>> mapfac;
1083 
1084  // Mask to be used to identify cells covered by finer level (if level > 0)
1085  amrex::Vector<std::unique_ptr<amrex::MultiFab>> fine_mask;
1086 
1087  amrex::Vector<amrex::Vector<amrex::Real>> stretched_dz_h;
1088  amrex::Vector<amrex::Gpu::DeviceVector<amrex::Real>> stretched_dz_d;
1089 
1090  amrex::Vector<amrex::MultiFab> base_state;
1091  amrex::Vector<amrex::MultiFab> base_state_new;
1092 
1093  // Wave coupling data
1094  amrex::Vector<std::unique_ptr<amrex::MultiFab>> Hwave;
1095  amrex::Vector<std::unique_ptr<amrex::MultiFab>> Lwave;
1096  amrex::Vector<std::unique_ptr<amrex::MultiFab>> Hwave_onegrid;
1097  amrex::Vector<std::unique_ptr<amrex::MultiFab>> Lwave_onegrid;
1098  bool finished_wave = false;
1099 
1100  // array of flux registers
1101  amrex::Vector<amrex::YAFluxRegister*> advflux_reg;
1102 
1103  // A BCRec is essentially a 2*DIM integer array storing the boundary
1104  // condition type at each lo/hi walls in each direction. We have one BCRec
1105  // for each component of the cell-centered variables and each velocity component.
1106  amrex::Vector <amrex::BCRec> domain_bcs_type;
1107  amrex::Gpu::DeviceVector<amrex::BCRec> domain_bcs_type_d;
1108 
1109  // We store these so that we can print them out in the job_info file
1110  amrex::Array<std::string,2*AMREX_SPACEDIM> domain_bc_type;
1111 
1112  // These hold the Dirichlet values at walls which need them ...
1113  amrex::Array<amrex::Array<amrex::Real, AMREX_SPACEDIM*2>, AMREX_SPACEDIM+NBCVAR_max> m_bc_extdir_vals;
1114 
1115  // These hold the Neumann values at walls which need them ...
1116  amrex::Array<amrex::Array<amrex::Real, AMREX_SPACEDIM*2>, AMREX_SPACEDIM+NBCVAR_max> m_bc_neumann_vals;
1117 
1118  // Host-side, face-local metadata for solid-wall scalar inputs. This is
1119  // deliberately separate from the values copied into device ghost-fill
1120  // kernels so explicit zero values remain distinguishable from omission.
1121  amrex::Array<amrex::Array<erf_wall_scalar_bc::WallScalarBCIntent, AMREX_SPACEDIM*2>, NBCVAR_max>
1123 
1124  // Per-face flag: non-reflecting inflow (extrapolate RhoTheta instead of prescribing)
1125  amrex::Array<bool, AMREX_SPACEDIM*2> m_bc_nonreflecting = {{false}};
1126 
1127  // These are the "physical" boundary condition types (e.g. "inflow")
1128  amrex::GpuArray<ERF_BC, AMREX_SPACEDIM*2> phys_bc_type;
1129 
1130  // These are the masks for the thin immersed body
1131  amrex::Vector<std::unique_ptr<amrex::iMultiFab>> xflux_imask;
1132  amrex::Vector<std::unique_ptr<amrex::iMultiFab>> yflux_imask;
1133  amrex::Vector<std::unique_ptr<amrex::iMultiFab>> zflux_imask;
1134  //amrex::Vector<std::unique_ptr<amrex::iMultiFab>> overset_imask;
1135 
1136  // These are the body forces that result from the thin immersed body
1137  amrex::Vector<std::unique_ptr<amrex::MultiFab>> thin_xforce;
1138  amrex::Vector<std::unique_ptr<amrex::MultiFab>> thin_yforce;
1139  amrex::Vector<std::unique_ptr<amrex::MultiFab>> thin_zforce;
1140 
1146 
1151  static double last_check_file_time;
1152 
1153  amrex::Vector<int> last_subvol_step;
1154  amrex::Vector<double> last_subvol_time;
1155 
1157 
1158  // Output control
1159  const int datwidth = 14;
1160  const int datprecision = 6;
1161  const int timeprecision = 13; // e.g., 1-yr LES: 31,536,000 s with dt ~ amrex::Real(0.01) ==> min prec = 10
1162  // epoch time for 2030-01-01 00:00:00 is 1,893,456,000 s with dt ~ amrex::Real(0.01) ==> min prec = 12
1163 
1164  ////////////////
1165  // runtime parameters
1166 
1167  // Maximum number of steps
1168  int max_step = -1;
1169 
1170  // Start and stop times
1171  static double start_time;
1172  static double stop_time;
1173 
1174  bool use_datetime = false;
1175  const std::string datetime_format = "%Y-%m-%d %H:%M:%S"; // ISO 8601 standard
1176 
1177  // if >= 0 we restart from a checkpoint
1178  std::string restart_chkfile = "";
1179 
1180  // Host-only metadata shared by all native output paths. It never enters
1181  // device code or changes the model state read from a checkpoint.
1183 
1184  // Time step controls
1189  static double dt_max_initial;
1190  static double dt_max;
1191 
1192  // Fixed dt at each level (only used if positive)
1193  amrex::Vector<double> fixed_dt;
1194  amrex::Vector<double> fixed_fast_dt;
1196 
1197  // how often each level regrids the higher levels of refinement
1198  // (after a level advances that many time steps)
1199  int regrid_int = -1;
1200 
1201  // Should we regrid level 0 after restart if Ngrids < Nprocs or
1202  // max_grid_size has changed?
1204 
1205  // plotfile prefix and frequency
1206  std::string plot3d_file_1 {"plt_1_"};
1207  std::string plot3d_file_2 {"plt_2_"};
1208  std::string plot2d_file_1 {"plt2d_1_"};
1209  std::string plot2d_file_2 {"plt2d_2_"};
1210  std::string subvol_file {"subvol"};
1212  int m_plot3d_int_1 = -1;
1213  int m_plot3d_int_2 = -1;
1214  int m_plot2d_int_1 = -1;
1215  int m_plot2d_int_2 = -1;
1216 
1217  amrex::Vector<int> m_subvol_int;
1218  amrex::Vector<double> m_subvol_per;
1219 
1220  double m_plot3d_per_1 = -1.0;
1221  double m_plot3d_per_2 = -1.0;
1222  double m_plot2d_per_1 = -1.0;
1223  double m_plot2d_per_2 = -1.0;
1224  bool m_plot_face_vels = false;
1225 
1226  bool plot_lsm = false;
1227 
1228  // other sampling output control
1229  int profile_int = -1;
1230  bool destag_profiles = true;
1231 
1232  // Checkpoint type, prefix and frequency
1233  std::string check_file {"chk"};
1234  int m_check_int = -1;
1235  double m_check_per = -1.0;
1236 
1237  amrex::Vector<std::string> subvol3d_var_names;
1238 
1239  amrex::Vector<std::string> plot3d_var_names_1;
1240  amrex::Vector<std::string> plot3d_var_names_2;
1241  amrex::Vector<std::string> plot2d_var_names_1;
1242  amrex::Vector<std::string> plot2d_var_names_2;
1243  const amrex::Vector<std::string> cons_names {"density", "rhotheta", "rhoKE", "rhoadv_0",
1244  "rhoQ1", "rhoQ2", "rhoQ3",
1245  "rhoQ4", "rhoQ5", "rhoQ6",
1246  "rhoQ7", "rhoQ8", "rhoQ9",
1247  "rhoQ10", "rhoQ11"};
1248 
1249  // **************************************************************************************
1250  // NOTE: The order of variable names here **MUST MATCH THE ORDER** in IO/ERF_Plotfile.cpp
1251  // **************************************************************************************
1252  const amrex::Vector<std::string> derived_names {"temp", "theta", "KE", "scalar", "soundspeed",
1253  "reflectivity","max_reflectivity", "precipitable", "mucape",
1254  "vorticity_x","vorticity_y","vorticity_z",
1255  "helicity", "local_helicity",
1256  "magvel", "divU",
1257  "pres_hse", "dens_hse", "theta_hse", "qv_hse",
1258  "pressure", "pert_pres", "pert_dens",
1259  "buoyancy", "eq_pot_temp", "VPD",
1260 #ifdef ERF_USE_WINDFARM
1261  "num_turb", "SMark0", "SMark1",
1262 #endif
1263  "dpdx", "dpdy", "dpdz", "pres_hse_x", "pres_hse_y",
1264  "z_phys", "detJ", "mapfac", "lat_m", "lon_m",
1265  // Time averaged velocity
1266  "u_t_avg", "v_t_avg", "w_t_avg", "umag_t_avg",
1267  // eddy viscosity
1268  "nut",
1269  // eddy diffusivity of momentum
1270  "Kmv","Kmh",
1271  // eddy diffusivity of heat
1272  "Khv","Khh",
1273  // turbulence lengthscale
1274  "Lturb",
1275  // native SHOC diagnostics
1276  "pblh", "shoc_cldfrac", "shoc_ql", "shoc_ql2", "shoc_cond",
1277  "wqls_sec", "wthv_sec", "w_sec",
1278  "thl_sec", "qw_sec", "qwthl_sec", "wthl_sec", "wqw_sec", "w3",
1279  "brunt", "isotropy", "shear_prod", "buoy_prod", "diss_tke",
1280  // wall distance
1281  "walldist",
1282  // dissipation
1283  "diss",
1284  // moisture vars
1285  "moist_density", "qv", "qc", "qi", "qrain", "qsnow", "qgraup",
1286  "qt", "qn", "qp", "qsat", "nc", "ni", "nr", "ns", "ng",
1287  "rain_accum", "snow_accum", "graup_accum",
1288  "rel_humidity", "condensation_rate",
1289  // Terrain IB mask
1290  "terrain_IB_mask",
1291  // EB variables
1292  "volfrac"
1293 #ifdef ERF_COMPUTE_ERROR
1294  // error vars
1295  ,"xvel_err", "yvel_err", "zvel_err", "pp_err"
1296 #endif
1297  ,"qsrc_sw", "qsrc_lw"
1298  };
1299 
1300  // **************************************************************************************
1301  // NOTE: The order of variable names here **MUST MATCH THE ORDER** in IO/ERF_WriteSubVolume.cpp
1302  // **************************************************************************************
1303  const amrex::Vector<std::string> derived_subvol_names {"soundspeed", "temp", "theta", "KE", "scalar"};
1304 
1305  // algorithm choices
1307 
1308  // Turbulent perturbation structure
1310 
1311 #ifdef ERF_USE_PARTICLES
1312  // Particle container with all particle species
1313  ParticleData particleData;
1314 
1315  // variables and functions for tracers particles
1316  bool m_use_tracer_particles; /*!< tracer particles that advect with flow with optional sedimentation */
1317 
1318  /*! Read tracer and hydro particles parameters */
1319  void readTracersParams();
1320 
1321  /*! Initialize tracer and hydro particles */
1322  void initializeTracers ( amrex::ParGDBBase*,
1323  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>&,
1324  const double time);
1325 
1326  /*! Restart tracer and hydro particles */
1327  void restartTracers ( amrex::ParGDBBase*, const std::string& );
1328 
1329  /*! Evolve tracers and hydro particles */
1330  void evolveTracers( int,
1331  double,
1332  amrex::Vector<amrex::Vector<amrex::MultiFab>>&,
1333  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& );
1334 
1335 #endif
1336 
1337 #ifdef ERF_USE_MULTIBLOCK
1338  MultiBlockContainer *m_mbc = nullptr;
1339 #endif
1340 
1341  static int verbose;
1342  static int mg_verbose;
1343  static bool use_fft;
1344 
1345  static int check_for_nans;
1346 
1347  // Diagnostic output interval
1348  static int sum_interval;
1349  static int pert_interval;
1350  static double sum_per;
1351 
1352  // Write in native AMReX or NetCDF format for each plotfile
1353  static PlotFileType plotfile3d_type_1;
1354  static PlotFileType plotfile3d_type_2;
1355  static PlotFileType plotfile2d_type_1;
1356  static PlotFileType plotfile2d_type_2;
1357 
1360 
1361  static StateInterpType interpolation_type;
1362 
1363  // NetCDF initialization (wrfinput) file
1364  static amrex::Vector<amrex::Vector<std::string>> nc_init_file;
1365  static amrex::Vector<amrex::Vector<int>> have_read_nc_init_file;
1366 
1367  // NetCDF initialization (wrfbdy/met_em) file
1368  static std::string nc_bdy_file;
1369  int real_width{0};
1370  bool real_extrap_w{true};
1371 
1372  // NetCDF initialization of zlo boundary values
1373  static std::string nc_low_file;
1374 
1375  // Options for vertical interpolation of met_em*.nc data.
1378  bool metgrid_debug_dry{false};
1379  bool metgrid_debug_psfc{false};
1380  bool metgrid_debug_msf{false};
1384  bool metgrid_use_sfc{true};
1385  bool metgrid_retain_sfc{false};
1389 
1390  // Options for ERF boundary files for real simulations.
1391  bool write_erfbdy{false}; // User-settable: write erfbdy during initialization
1392  bool use_erfbdy{false}; // Internal: set during init or restart
1393  std::string erfbdy_file{"erfbdy"}; // User-settable: erfbdy file name
1394  int nvars_erfbdy{0}; // Internal: number of variables in erfbdy
1395 
1396  amrex::Vector<amrex::BoxArray> ba1d;
1397  amrex::Vector<amrex::BoxArray> ba2d;
1398 
1399  std::unique_ptr<amrex::MultiFab> wrf_C1H;
1400  std::unique_ptr<amrex::MultiFab> wrf_C2H;
1401  std::unique_ptr<amrex::MultiFab> wrf_MUB;
1402  std::unique_ptr<amrex::MultiFab> wrf_RDNW;
1403  std::unique_ptr<amrex::MultiFab> wrf_PHB; // Base geopotential
1404 
1405  amrex::Vector<std::unique_ptr<amrex::MultiFab>> mf_PSFC;
1406 
1407  // 1D CDF output (for ingestion in AMR-Wind)
1408  static int output_1d_column;
1409  static int column_interval;
1410  static double column_per;
1413  static std::string column_file_name;
1414 
1415  // 2D BndryRegister output (for ingestion in AMR-Wind)
1420 
1421  // 2D BndryRegister input
1423 
1424  static int ng_dens_hse;
1425  static int ng_pres_hse;
1426 
1427  // Custom source terms
1428  amrex::Vector<std::unique_ptr<amrex::MultiFab>> rhotheta_src;
1429  amrex::Vector<std::unique_ptr<amrex::MultiFab>> rhoqt_src;
1430 
1431  amrex::Vector< amrex::Vector<amrex::Real> > h_w_subsid;
1432  amrex::Vector<amrex::Gpu::DeviceVector<amrex::Real> > d_w_subsid;
1433 
1434  amrex::Vector< amrex::Vector<amrex::Real> > h_u_geos;
1435  amrex::Vector<amrex::Gpu::DeviceVector<amrex::Real> > d_u_geos;
1436 
1437  amrex::Vector< amrex::Vector<amrex::Real> > h_v_geos;
1438  amrex::Vector<amrex::Gpu::DeviceVector<amrex::Real> > d_v_geos;
1439 
1440  // Function to read and populate above host vectors (if input file exists)
1441  void init_geo_wind_profile (const std::string input_file,
1442  amrex::Vector<amrex::Real>& u_geos,
1443  amrex::Gpu::DeviceVector<amrex::Real>& u_geos_d,
1444  amrex::Vector<amrex::Real>& v_geos,
1445  amrex::Gpu::DeviceVector<amrex::Real>& v_geos_d,
1446  const amrex::Geometry& lgeom,
1447  const amrex::Vector<amrex::Real>& zlev_stag);
1448 
1449  // This is a vector over levels of vectors across quantities of Vectors
1450  amrex::Vector<amrex::Vector<amrex::Vector<amrex::Real> > > h_rayleigh_ptrs;
1451  amrex::Vector<amrex::Vector<amrex::Vector<amrex::Real> > > h_sponge_ptrs;
1452 
1453  // These are vectors over levels of Vectors
1454  amrex::Vector<amrex::Vector<amrex::Real> > h_sinesq_ptrs;
1455  amrex::Vector<amrex::Vector<amrex::Real> > h_sinesq_stag_ptrs;
1456 
1457  // This is a vector over levels of vectors across quantities of DeviceVectors
1458  amrex::Vector<amrex::Vector<amrex::Gpu::DeviceVector<amrex::Real> > > d_rayleigh_ptrs;
1459  amrex::Vector<amrex::Vector<amrex::Gpu::DeviceVector<amrex::Real> > > d_sponge_ptrs;
1460 
1461  // These are vectors over levels of DeviceVectors
1462  amrex::Vector<amrex::Gpu::DeviceVector<amrex::Real> > d_sinesq_ptrs;
1463  amrex::Vector<amrex::Gpu::DeviceVector<amrex::Real> > d_sinesq_stag_ptrs;
1464 
1465  amrex::Vector<amrex::Real> h_havg_density;
1466  amrex::Vector<amrex::Real> h_havg_temperature;
1467  amrex::Vector<amrex::Real> h_havg_pressure;
1468  amrex::Vector<amrex::Real> h_havg_qv;
1469  amrex::Vector<amrex::Real> h_havg_qc;
1470 
1471  amrex::Gpu::DeviceVector<amrex::Real> d_havg_density;
1472  amrex::Gpu::DeviceVector<amrex::Real> d_havg_temperature;
1473  amrex::Gpu::DeviceVector<amrex::Real> d_havg_pressure;
1474  amrex::Gpu::DeviceVector<amrex::Real> d_havg_qv;
1475  amrex::Gpu::DeviceVector<amrex::Real> d_havg_qc;
1476 
1477  void refinement_criteria_setup ();
1478 
1479  std::unique_ptr<WriteBndryPlanes> m_w2d = nullptr;
1480  std::unique_ptr<ReadBndryPlanes> m_r2d = nullptr;
1481  std::unique_ptr<SurfaceLayer> m_SurfaceLayer = nullptr;
1482  amrex::Vector<std::unique_ptr<ForestDrag>> m_forest_drag;
1483 
1484  //
1485  // Holds info for dynamically generated tagging criteria
1486  //
1487  static amrex::Vector<amrex::AMRErrorTag> ref_tags;
1488 
1489  amrex::Vector<amrex::Vector<amrex::BoxArray>> subdomains;
1490 
1491  amrex::Vector<amrex::Real> dz_min;
1492 
1493  static AMREX_FORCE_INLINE
1494  int
1496  {
1497  // We never have fewer than 2 ghost cells
1498  int ngrow = 2;
1499 
1500  // This sets the minimum to 3 if using num_diff but we might still need more
1501  if (sc.use_num_diff) {
1502  ngrow = 3;
1503  }
1504 
1505  // With EB we always have 4 so no need to do further tests
1506  if (sc.terrain_type == TerrainType::EB) {
1507  ngrow = 4;
1508  return ngrow;
1509  }
1510 
1511  if (
1518  { ngrow = 3; }
1519  else if (
1526  { ngrow = 3; }
1527  else if (
1534  { ngrow = 3; }
1535  else if (
1542  { ngrow = 3; }
1543  else if (
1550  { ngrow = 3; }
1551  else if (
1558  { ngrow = 4; }
1559 
1560  return ngrow;
1561  }
1562 
1563  AMREX_FORCE_INLINE
1564  amrex::YAFluxRegister* getAdvFluxReg (int lev)
1565  {
1566  return advflux_reg[lev];
1567  }
1568 
1569  AMREX_FORCE_INLINE
1570  std::ostream&
1571  DataLog (int i)
1572  {
1573  return *datalog[i];
1574  }
1575 
1576  AMREX_FORCE_INLINE
1577  std::ostream&
1578  DerDataLog (int i)
1579  {
1580  return *der_datalog[i];
1581  }
1582 
1583  AMREX_FORCE_INLINE
1584  int
1585  NumDataLogs () noexcept
1586  {
1587  return static_cast<int>(datalog.size());
1588  }
1589 
1590  AMREX_FORCE_INLINE
1591  int
1592  NumDerDataLogs () noexcept
1593  {
1594  return static_cast<int>(der_datalog.size());
1595  }
1596 
1597 
1598  AMREX_FORCE_INLINE
1599  std::ostream&
1601  {
1602  return *sampleptlog[i];
1603  }
1604 
1605  AMREX_FORCE_INLINE
1606  int
1608  {
1609  return static_cast<int>(sampleptlog.size());
1610  }
1611 
1612  AMREX_FORCE_INLINE
1613  std::ostream&
1615  {
1616  return *samplelinelog[i];
1617  }
1618 
1619  AMREX_FORCE_INLINE
1620  int
1621  NumSampleLineLogs () noexcept
1622  {
1623  return static_cast<int>(samplelinelog.size());
1624  }
1625 
1626  amrex::IntVect&
1627  SamplePoint (int i)
1628  {
1629  return samplepoint[i];
1630  }
1631 
1632  AMREX_FORCE_INLINE
1633  int
1634  NumSamplePoints () noexcept
1635  {
1636  return static_cast<int>(samplepoint.size());
1637  }
1638 
1639  amrex::IntVect&
1640  SampleLine (int i)
1641  {
1642  return sampleline[i];
1643  }
1644 
1645  AMREX_FORCE_INLINE
1646  int
1647  NumSampleLines () noexcept
1648  {
1649  return static_cast<int>(sampleline.size());
1650  }
1651 
1652  static double startCPUTime;
1653  static double previousCPUTimeUsed;
1654 
1655  static double
1657  {
1658  int numCores = amrex::ParallelDescriptor::NProcs();
1659 #ifdef _OPENMP
1660  numCores = numCores * omp_get_max_threads();
1661 #endif
1662 
1663  double T =
1664  numCores * (amrex::ParallelDescriptor::second() - startCPUTime) +
1666 
1667  return T;
1668  }
1669 
1670  void setRecordDataInfo (int i, const std::string& filename) // NOLINT
1671  {
1672  if (amrex::ParallelDescriptor::IOProcessor())
1673  {
1674  datalog[i] = std::make_unique<std::fstream>();
1675  datalog[i]->open(filename.c_str(),std::ios::out|std::ios::app);
1676  if (!datalog[i]->good()) {
1677  amrex::FileOpenFailed(filename);
1678  }
1679  }
1680  amrex::ParallelDescriptor::Barrier("ERF::setRecordDataInfo");
1681  }
1682 
1683  void setRecordDerDataInfo (int i, const std::string& filename) // NOLINT
1684  {
1685  if (amrex::ParallelDescriptor::IOProcessor())
1686  {
1687  der_datalog[i] = std::make_unique<std::fstream>();
1688  der_datalog[i]->open(filename.c_str(),std::ios::out|std::ios::app);
1689  if (!der_datalog[i]->good()) {
1690  amrex::FileOpenFailed(filename);
1691  }
1692  }
1693  amrex::ParallelDescriptor::Barrier("ERF::setRecordDerDataInfo");
1694  }
1695 
1696  void setRecordEnergyDataInfo (int i, const std::string& filename) // NOLINT
1697  {
1698  if (amrex::ParallelDescriptor::IOProcessor())
1699  {
1700  tot_e_datalog[i] = std::make_unique<std::fstream>();
1701  tot_e_datalog[i]->open(filename.c_str(),std::ios::out|std::ios::app);
1702  if (!tot_e_datalog[i]->good()) {
1703  amrex::FileOpenFailed(filename);
1704  }
1705  }
1706  amrex::ParallelDescriptor::Barrier("ERF::setRecordEnergyDataInfo");
1707  }
1708 
1709  void setRecordSamplePointInfo (int i, int lev, amrex::IntVect& cell, const std::string& filename) // NOLINT
1710  {
1711  amrex::MultiFab dummy(grids[lev],dmap[lev],1,0);
1712  for (amrex::MFIter mfi(dummy); mfi.isValid(); ++mfi)
1713  {
1714  const amrex::Box& bx = mfi.validbox();
1715  if (bx.contains(cell)) {
1716  sampleptlog[i] = std::make_unique<std::fstream>();
1717  sampleptlog[i]->open(filename.c_str(),std::ios::out|std::ios::app);
1718  if (!sampleptlog[i]->good()) {
1719  amrex::FileOpenFailed(filename);
1720  }
1721  }
1722  }
1723  amrex::ParallelDescriptor::Barrier("ERF::setRecordSamplePointInfo");
1724  }
1725 
1726  void setRecordSampleLineInfo (int i, int lev, amrex::IntVect& cell, const std::string& filename) // NOLINT
1727  {
1728  amrex::MultiFab dummy(grids[lev],dmap[lev],1,0);
1729  for (amrex::MFIter mfi(dummy); mfi.isValid(); ++mfi)
1730  {
1731  const amrex::Box& bx = mfi.validbox();
1732  if (bx.contains(cell)) {
1733  samplelinelog[i] = std::make_unique<std::fstream>();
1734  samplelinelog[i]->open(filename.c_str(),std::ios::out|std::ios::app);
1735  if (!samplelinelog[i]->good()) {
1736  amrex::FileOpenFailed(filename);
1737  }
1738  }
1739  }
1740  amrex::ParallelDescriptor::Barrier("ERF::setRecordSampleLineInfo");
1741  }
1742 
1743  // Data sampler for line and plane output
1748  std::unique_ptr<LineSampler> line_sampler = nullptr;
1749  std::unique_ptr<PlaneSampler> plane_sampler = nullptr;
1750 
1751  amrex::Vector<std::unique_ptr<std::fstream> > datalog;
1752  amrex::Vector<std::unique_ptr<std::fstream> > der_datalog;
1753  amrex::Vector<std::unique_ptr<std::fstream> > tot_e_datalog;
1754  amrex::Vector<std::string> datalogname;
1755  amrex::Vector<std::string> der_datalogname;
1756  amrex::Vector<std::string> tot_e_datalogname;
1757 
1758  amrex::Vector<std::unique_ptr<std::fstream> > sampleptlog;
1759  amrex::Vector<std::string> sampleptlogname;
1760  amrex::Vector<amrex::IntVect> samplepoint;
1761 
1762  amrex::Vector<std::unique_ptr<std::fstream> > samplelinelog;
1763  amrex::Vector<std::string> samplelinelogname;
1764  amrex::Vector<amrex::IntVect> sampleline;
1765 
1766  //! The filename of the ith datalog file.
1767  [[nodiscard]] std::string DataLogName (int i) const noexcept { return datalogname[i]; }
1768  [[nodiscard]] std::string DerDataLogName (int i) const noexcept { return der_datalogname[i]; }
1769 
1770  //! The filename of the ith sampleptlog file.
1771  [[nodiscard]] std::string SamplePointLogName (int i) const noexcept { return sampleptlogname[i]; }
1772 
1773  //! The filename of the ith samplelinelog file.
1774  [[nodiscard]] std::string SampleLineLogName (int i) const noexcept { return samplelinelogname[i]; }
1775 
1776  // array of EB objects
1777  amrex::Vector<std::unique_ptr<eb_>> eb;
1778 
1779  [[nodiscard]] eb_ const& get_eb (int lev) const noexcept {
1780  AMREX_ASSERT(lev >= 0 && lev < eb.size() && eb[lev] != nullptr);
1781  return *eb[lev];
1782  }
1783 
1784  [[nodiscard]] amrex::EBFArrayBoxFactory const&
1785  EBFactory (int lev) const noexcept {
1786  return *(eb[lev]->get_const_factory());
1787  }
1788 
1789  [[nodiscard]] static int nghost_eb_basic ()
1790  { return 5; }
1791 
1792  // We need 5 for doing StateRedistribution; otherwise 4 would be enough
1793  [[nodiscard]] static int nghost_eb_volume ()
1794  { return 5; }
1795 
1796  [[nodiscard]] static int nghost_eb_full ()
1797  { return 4; }
1798 
1799 #ifdef ERF_USE_FFT
1800  // Vector over levels of Vector over subdomains of solvers
1801  amrex::Vector<amrex::Vector<std::unique_ptr<amrex::FFT::Poisson<amrex::MultiFab>>>> m_3D_poisson;
1802  amrex::Vector<amrex::Vector<std::unique_ptr<amrex::FFT::PoissonHybrid<amrex::MultiFab>>>> m_2D_poisson;
1803 #endif
1804 
1805 public:
1806  void writeJobInfo (const std::string& dir,
1807  erf_provenance::ArtifactType artifact_type,
1808  int artifact_step,
1809  double artifact_time_seconds) const;
1810  static void writeBuildInfo (std::ostream& os);
1811 
1812  static void print_banner(MPI_Comm /*comm*/, std::ostream& /*out*/);
1813  static void print_usage(MPI_Comm /*comm*/, std::ostream& /*out*/);
1814  static void print_error(MPI_Comm /*comm*/, const std::string& msg);
1815  static void print_summary(std::ostream&);
1816  static void print_tpls(std::ostream& /*out*/);
1817 };
1818 
1819 #endif
AMREX_ENUM(StateInterpType, FullState, Perturbational)
constexpr amrex::Real one
Definition: ERF_Constants.H:9
constexpr amrex::Real zero
Definition: ERF_Constants.H:8
@ tau23
Definition: ERF_DataStruct.H:38
@ tau13
Definition: ERF_DataStruct.H:38
Declares the embedded-boundary factory manager used by ERF levels.
Contains the Eulerian microphysics class.
struct @28 out
#define NBCVAR_max
Definition: ERF_IndexDefines.H:29
@ Centered_6th
Real T
Definition: ERF_InitCustomPert_Bubble.H:106
Contains the Lagrangian microphysics class.
std::string name
Definition: ERF_Plotfile2DCatalog.cpp:101
amrex::Real Real
Definition: ERF_ShocInterface.H:19
void MakeHorizontalAverages()
Definition: ERF.cpp:2602
amrex::Vector< amrex::MultiFab > rU_new
Definition: ERF.H:965
static int last_check_file_step
Definition: ERF.H:1145
amrex::Vector< std::unique_ptr< amrex::MultiFab > > walldist
Definition: ERF.H:1079
void ConfigureDriverAtmosToOceanCoupling(bool use_coupling_driver, bool use_two_way_coupling, bool use_state_contract)
Definition: ERF_Coupling.cpp:118
amrex::Vector< amrex::Vector< amrex::Vector< amrex::Real > > > h_sponge_ptrs
Definition: ERF.H:1451
void GetOceanToAtmosSurfaceLayout(amrex::BoxArray &ba, amrex::DistributionMapping &dm)
Definition: ERF_Coupling.cpp:134
bool metgrid_basic_linear
Definition: ERF.H:1382
amrex::Vector< amrex::Vector< amrex::Box > > boxes_at_level
Definition: ERF.H:916
amrex::Vector< std::string > samplelinelogname
Definition: ERF.H:1763
void MakeEBGeometry()
int max_step
Definition: ERF.H:1168
void HurricaneTracker(int lev, double time, const amrex::MultiFab &cc_vel, const amrex::Real velmag_threshold, amrex::TagBoxArray *tags=nullptr)
Definition: ERF_RefineHurricane.cpp:109
bool metgrid_debug_msf
Definition: ERF.H:1380
AMREX_FORCE_INLINE std::ostream & DerDataLog(int i)
Definition: ERF.H:1578
amrex::Vector< amrex::Vector< std::unique_ptr< amrex::MultiFab > > > mapfac
Definition: ERF.H:1082
void setRayleighRefFromSounding(bool restarting)
Set Rayleigh mean profiles from input sounding.
Definition: ERF_InitRayleigh.cpp:85
void init_only(int lev, double time)
Definition: ERF.cpp:1820
void turbPert_amplitude_w(const int lev)
Definition: ERF_InitTurbPert.cpp:72
amrex::Vector< std::unique_ptr< MRISplitIntegrator< amrex::Vector< amrex::MultiFab > > > > mri_integrator_mem
Definition: ERF.H:940
amrex::Vector< amrex::Gpu::DeviceVector< amrex::Real > > d_sinesq_stag_ptrs
Definition: ERF.H:1463
void check_vels_for_nans(amrex::MultiFab const &xvel, amrex::MultiFab const &yvel, amrex::MultiFab const &zvel)
Definition: ERF.cpp:2894
void Evolve()
Definition: ERF.cpp:136
amrex::Vector< amrex::MultiFab > avg_xmom
Definition: ERF.H:947
amrex::Vector< amrex::MultiFab > pp_inc
Definition: ERF.H:943
void make_eb_box()
amrex::Vector< ERFFillPatcher > FPr_u
Definition: ERF.H:1019
amrex::Vector< amrex::IntVect > sampleline
Definition: ERF.H:1764
amrex::Vector< std::string > subvol3d_var_names
Definition: ERF.H:1237
amrex::Vector< std::unique_ptr< amrex::MultiFab > > SFS_q1fx3_lev
Definition: ERF.H:1042
amrex::Vector< double > t_new
Definition: ERF.H:922
amrex::Vector< std::unique_ptr< amrex::MultiFab > > Hwave_onegrid
Definition: ERF.H:1096
amrex::Vector< amrex::Vector< amrex::MultiFab > > vars_new
Definition: ERF.H:930
void FillCoarsePatch(int lev, double time)
Definition: ERF_FillCoarsePatch.cpp:20
void WriteAtIntermediateTime(int nstep, double time)
Definition: ERF.cpp:233
ERF(ERF &&) noexcept=delete
bool writeNow(double cur_time, const int nstep, const int plot_int, const double plot_per, const double dt_0, double &last_file_time)
Definition: ERF.cpp:2806
static double startCPUTime
Definition: ERF.H:1652
void FillBdyCCVels(amrex::MultiFab &mf_cc_vel, amrex::Geometry &lev_geom)
Definition: ERF_FillBdyCCVels.cpp:17
AMREX_FORCE_INLINE int NumSampleLineLogs() noexcept
Definition: ERF.H:1621
static double last_plot2d_file_time_1
Definition: ERF.H:1149
static void print_tpls(std::ostream &)
Definition: ERF_ConsoleIO.cpp:140
amrex::Vector< amrex::Real > dz_min
Definition: ERF.H:1491
amrex::Vector< amrex::MultiFab > lagged_delta_rt
Definition: ERF.H:946
amrex::Real plane_sampling_per
Definition: ERF.H:1747
std::string DataLogName(int i) const noexcept
The filename of the ith datalog file.
Definition: ERF.H:1767
std::string plot2d_file_2
Definition: ERF.H:1209
void remake_zphys(int lev, std::unique_ptr< amrex::MultiFab > &temp_zphys_nd)
Definition: ERF_MakeNewArrays.cpp:816
double m_plot3d_per_2
Definition: ERF.H:1221
static double bndry_output_planes_per
Definition: ERF.H:1418
amrex::Vector< std::unique_ptr< amrex::MultiFab > > thin_yforce
Definition: ERF.H:1138
void SetDriverAtmosToOceanStateContract(bool use_state_contract)
Definition: ERF_Coupling.cpp:128
void ErrorEst(int lev, amrex::TagBoxArray &tags, amrex::Real time, int ngrow) override
Definition: ERF_Tagging.cpp:25
amrex::Vector< std::unique_ptr< amrex::MultiFab > > SFS_hfx3_lev
Definition: ERF.H:1040
amrex::Vector< amrex::Vector< amrex::Real > > h_w_subsid
Definition: ERF.H:1431
static void print_banner(MPI_Comm, std::ostream &)
Definition: ERF_ConsoleIO.cpp:63
void volWgtColumnSum(int lev, const amrex::MultiFab &mf, int comp, amrex::MultiFab &mf_2d, const amrex::MultiFab &dJ)
Definition: ERF_VolWgtSum.cpp:82
amrex::Vector< std::unique_ptr< ShocDriver > > native_shoc_driver
Definition: ERF.H:1006
amrex::Vector< std::unique_ptr< std::fstream > > datalog
Definition: ERF.H:1751
std::string MakeFilename_EyeTracker_maxvel(int nstep)
Definition: ERF_TrackerOutput.cpp:69
amrex::Vector< ERFFillPatcher > FPr_v
Definition: ERF.H:1020
int cf_set_width
Definition: ERF.H:1017
std::unique_ptr< amrex::MultiFab > wrf_MUB
Definition: ERF.H:1401
void setPlotVariables(const std::string &pp_plot_var_names, amrex::Vector< std::string > &plot_var_names)
Definition: ERF_Plotfile.cpp:18
amrex::Gpu::DeviceVector< amrex::Real > d_havg_temperature
Definition: ERF.H:1472
void post_timestep(int nstep, double time, double dt_lev)
Definition: ERF.cpp:311
std::unique_ptr< amrex::MultiFab > wrf_C1H
Definition: ERF.H:1399
std::string erfbdy_file
Definition: ERF.H:1393
static int last_plot2d_file_step_2
Definition: ERF.H:1144
const int timeprecision
Definition: ERF.H:1161
void setRecordDataInfo(int i, const std::string &filename)
Definition: ERF.H:1670
amrex::Vector< std::unique_ptr< amrex::MultiFab > > SFS_hfx1_lev
Definition: ERF.H:1040
amrex::Vector< std::array< amrex::Real, 2 > > hurricane_eye_track_xy
Definition: ERF.H:181
void SurfaceDataInterpolation(const int nlevs, const double time, amrex::Vector< std::unique_ptr< amrex::MultiFab >> &z_phys_nd, bool regrid_forces_file_read)
Definition: ERF_SurfaceDataInterpolation.cpp:142
amrex::Vector< amrex::BoxArray > ba2d
Definition: ERF.H:1397
amrex::Array< amrex::Array< amrex::Real, AMREX_SPACEDIM *2 >, AMREX_SPACEDIM+NBCVAR_max > m_bc_extdir_vals
Definition: ERF.H:1113
void init_from_input_sounding(int lev)
Definition: ERF_InitFromInputSounding.cpp:53
void erf_enforce_hse(int lev, amrex::MultiFab &dens, amrex::MultiFab &pres, amrex::MultiFab &pi, amrex::MultiFab &th, amrex::MultiFab &qv, std::unique_ptr< amrex::MultiFab > &z_cc)
Definition: ERF_Init1D.cpp:204
amrex::Vector< amrex::Vector< amrex::MultiFab > > gradp
Definition: ERF.H:934
std::string plot3d_file_1
Definition: ERF.H:1206
eb_ const & get_eb(int lev) const noexcept
Definition: ERF.H:1779
amrex::Gpu::DeviceVector< amrex::Real > d_havg_qv
Definition: ERF.H:1474
amrex::Vector< std::unique_ptr< amrex::MultiFab > > qfx3_EB
Definition: ERF.H:1049
static amrex::Real column_loc_y
Definition: ERF.H:1412
static bool plot_file_on_restart
Definition: ERF.H:1156
amrex::Vector< amrex::Vector< amrex::MultiFab > > bckgnd_state
Definition: ERF.H:194
static int mg_verbose
Definition: ERF.H:1342
double m_check_per
Definition: ERF.H:1235
void ReadParameters()
Definition: ERF.cpp:1964
static double sum_per
Definition: ERF.H:1350
static amrex::Vector< std::string > PlotFileVarNames(amrex::Vector< std::string > plot_var_names)
Definition: ERF_Plotfile.cpp:236
amrex::Vector< amrex::Vector< amrex::MultiFab > > forecast_state_interp
Definition: ERF.H:189
bool FindInitialEye(int lev, const amrex::MultiFab &cc_vel, const amrex::Real velmag_threshold, amrex::Real &eye_x, amrex::Real &eye_y)
Definition: ERF_RefineHurricane.cpp:11
void InitializeFromFile()
amrex::Vector< std::unique_ptr< ERFPhysBCFunct_cons > > physbcs_cons
Definition: ERF.H:952
amrex::Vector< double > dt
Definition: ERF.H:924
static double stop_time
Definition: ERF.H:1172
void advance_lsm(int lev, amrex::MultiFab &cons_in, amrex::MultiFab &xvel_in, amrex::MultiFab &yvel_in, const double &time, const double &dt_advance)
Definition: ERF_AdvanceLSM.cpp:5
amrex::Vector< std::unique_ptr< amrex::MultiFab > > mf_PSFC
Definition: ERF.H:1405
ERF()
Definition: ERF_Constructors.cpp:21
void init_Dirichlet_bc_data(const std::string input_file)
Definition: ERF_InitBCs.cpp:703
~ERF() override
amrex::Vector< std::unique_ptr< amrex::MultiFab > > z_phys_nd_src
Definition: ERF.H:1063
amrex::Vector< std::unique_ptr< amrex::MultiFab > > detJ_cc
Definition: ERF.H:1058
amrex::Vector< std::string > lsm_flux_name
Definition: ERF.H:996
void WriteMyEBSurface()
amrex::Vector< std::unique_ptr< amrex::MultiFab > > z_phys_cc
Definition: ERF.H:1056
static double column_per
Definition: ERF.H:1410
amrex::Vector< std::unique_ptr< eb_ > > eb
Definition: ERF.H:1777
amrex::Vector< std::unique_ptr< amrex::MultiFab > > eddyDiffs_lev
Definition: ERF.H:1026
static SolverChoice solverChoice
Definition: ERF.H:1306
amrex::Vector< std::unique_ptr< amrex::MultiFab > > hfx3_EB
Definition: ERF.H:1048
amrex::Vector< ERFFillPatcher > FPr_c
Definition: ERF.H:1018
void WriteGenericPlotfileHeaderWithTerrain(std::ostream &HeaderFile, int nlevels, const amrex::Vector< amrex::BoxArray > &bArray, const amrex::Vector< std::string > &varnames, const amrex::Vector< amrex::Geometry > &my_geom, double time, const amrex::Vector< int > &level_steps, const amrex::Vector< amrex::IntVect > &my_ref_ratio, const std::string &versionName, const std::string &levelPrefix, const std::string &mfPrefix) const
Definition: ERF_Plotfile.cpp:2090
void update_box_for_refinement(std::string &ref_prefix, int &lev_for_box, amrex::RealBox &real_box, const double time)
Definition: ERF_RefineBox.cpp:336
bool plot_rad
Definition: ERF.H:1012
amrex::Vector< std::array< amrex::Real, 2 > > hurricane_tracker_circle
Definition: ERF.H:185
static bool use_fft
Definition: ERF.H:1343
bool m_plot_face_vels
Definition: ERF.H:1224
amrex::Vector< std::array< amrex::Real, 2 > > hurricane_maxvel_vs_time
Definition: ERF.H:183
void turbPert_update(const int lev, const double dt)
Definition: ERF_InitTurbPert.cpp:18
void sum_derived_quantities(double time)
Definition: ERF_WriteScalarProfiles.cpp:181
amrex::Vector< amrex::MultiFab > base_state_new
Definition: ERF.H:1091
std::string plot3d_file_2
Definition: ERF.H:1207
amrex::Vector< std::unique_ptr< amrex::MultiFab > > az
Definition: ERF.H:1061
int regrid_int
Definition: ERF.H:1199
void derive_diag_profiles(double time, 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_Kmv, amrex::Gpu::HostVector< amrex::Real > &h_avg_Khv, 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, amrex::Gpu::HostVector< amrex::Real > &h_avg_wthv)
Definition: ERF_Write1DProfiles.cpp:210
bool write_erfbdy
Definition: ERF.H:1391
void solve_with_gmres(int lev, const amrex::Box &subdomain, amrex::MultiFab &rhs, amrex::MultiFab &p, amrex::Array< amrex::MultiFab, AMREX_SPACEDIM > &fluxes, amrex::MultiFab &ax_sub, amrex::MultiFab &ay_sub, amrex::MultiFab &az_sub, amrex::MultiFab &, amrex::MultiFab &znd_sub)
Definition: ERF_SolveWithGMRES.cpp:28
amrex::Vector< amrex::Vector< amrex::Gpu::DeviceVector< amrex::Real > > > d_sponge_ptrs
Definition: ERF.H:1459
amrex::Vector< long > dt_mri_ratio
Definition: ERF.H:925
amrex::Vector< amrex::Vector< std::unique_ptr< amrex::MultiFab > > > Tau
Definition: ERF.H:1024
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vel_t_avg
Definition: ERF.H:937
amrex::Vector< std::unique_ptr< amrex::MultiFab > > SFS_q2fx3_lev
Definition: ERF.H:1043
void HurricaneEyeTrackerNotInitial(const SolverChoice &sc, const amrex::Geometry &geom, const amrex::Vector< amrex::MultiFab > &S_data, MoistureType moisture_type)
Definition: ERF_HurricaneDiagnostics.cpp:250
amrex::Vector< amrex::Vector< std::unique_ptr< amrex::iMultiFab > > > lmask_lev
Definition: ERF.H:1032
AMREX_FORCE_INLINE int NumSamplePointLogs() noexcept
Definition: ERF.H:1607
amrex::Vector< amrex::Real > h_havg_pressure
Definition: ERF.H:1467
void update_diffusive_arrays(int lev, const amrex::BoxArray &ba, const amrex::DistributionMapping &dm)
Definition: ERF_MakeNewArrays.cpp:529
std::unique_ptr< amrex::MultiFab > wrf_PHB
Definition: ERF.H:1403
static int verbose
Definition: ERF.H:1341
amrex::Vector< amrex::Real > h_havg_qc
Definition: ERF.H:1469
amrex::Vector< std::unique_ptr< ERFPhysBCFunct_w > > physbcs_w
Definition: ERF.H:955
static int nghost_eb_basic()
Definition: ERF.H:1789
void post_update(amrex::MultiFab &state_mf, double time, const amrex::Geometry &geom)
void AverageDownMoistStateTo(int crse_lev)
Conservation-preserving fine-to-coarse average of RhoTheta and the active moist conserved components ...
Definition: ERF_AverageDown.cpp:243
amrex::Vector< double > last_subvol_time
Definition: ERF.H:1154
void FillForecastStateMultiFabs(const int lev, const std::string &filename, const std::unique_ptr< amrex::MultiFab > &z_phys_nd, amrex::Vector< amrex::Vector< amrex::MultiFab >> &forecast_state)
Definition: ERF_WeatherDataInterpolation.cpp:64
static std::string column_file_name
Definition: ERF.H:1413
amrex::Vector< std::unique_ptr< std::fstream > > samplelinelog
Definition: ERF.H:1762
amrex::Vector< std::unique_ptr< amrex::MultiFab > > terrain_blanking
Definition: ERF.H:1076
std::unique_ptr< Microphysics > micro
Definition: ERF.H:975
int m_plot2d_int_2
Definition: ERF.H:1215
amrex::Vector< amrex::MultiFab > base_state
Definition: ERF.H:1090
void fill_rhs(amrex::MultiFab &rhs_mf, const amrex::MultiFab &state_mf, double time, const amrex::Geometry &geom)
AMREX_FORCE_INLINE amrex::YAFluxRegister * getAdvFluxReg(int lev)
Definition: ERF.H:1564
int m_plot3d_int_1
Definition: ERF.H:1212
amrex::Vector< amrex::Real > h_havg_density
Definition: ERF.H:1465
static double last_plot2d_file_time_2
Definition: ERF.H:1150
amrex::Vector< std::unique_ptr< amrex::MultiFab > > z_phys_nd_new
Definition: ERF.H:1070
void derive_diag_profiles_stag(double time, 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_Kmv, amrex::Gpu::HostVector< amrex::Real > &h_avg_Khv, 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, amrex::Gpu::HostVector< amrex::Real > &h_avg_wthv)
Definition: ERF_Write1DProfiles_stag.cpp:316
void create_background_state_for_ensemble(int lev, amrex::MultiFab &mf_cc_pert, amrex::MultiFab &cons_pert, amrex::MultiFab &xvel_pert, amrex::MultiFab &yvel_pert, amrex::MultiFab &zvel_pert)
Definition: ERF_InitForEnsemble.cpp:695
const amrex::Vector< std::string > derived_subvol_names
Definition: ERF.H:1303
amrex::Vector< std::array< amrex::Real, 2 > > hurricane_minpressure_vs_time
Definition: ERF.H:184
bool metgrid_retain_sfc
Definition: ERF.H:1385
amrex::Vector< std::unique_ptr< amrex::MultiFab > > Qv_prim
Definition: ERF.H:960
static int sum_interval
Definition: ERF.H:1348
static int pert_interval
Definition: ERF.H:1349
amrex::Real line_sampling_per
Definition: ERF.H:1746
void restart()
Definition: ERF.cpp:1754
amrex::Vector< double > t_avg_cnt
Definition: ERF.H:938
static int last_plot3d_file_step_2
Definition: ERF.H:1142
amrex::Vector< std::unique_ptr< amrex::MultiFab > > SFS_q1fx2_lev
Definition: ERF.H:1042
amrex::Vector< double > fixed_fast_dt
Definition: ERF.H:1194
amrex::IntVect & SampleLine(int i)
Definition: ERF.H:1640
void build_fine_mask(int lev, amrex::MultiFab &fine_mask)
Definition: ERF_VolWgtSum.cpp:125
void HurricaneMaxVelTracker(const amrex::Geometry &geom, const amrex::MultiFab &mf_cc_vel, const double &time)
Definition: ERF_HurricaneDiagnostics.cpp:501
int file_name_digits
Definition: ERF.H:1358
amrex::Vector< amrex::MultiFab > rV_new
Definition: ERF.H:967
std::string PlotFileName(int lev) const
void initialize_integrator(int lev, amrex::MultiFab &cons_mf, amrex::MultiFab &vel_mf)
Definition: ERF_MakeNewArrays.cpp:898
amrex::Vector< std::unique_ptr< amrex::MultiFab > > thin_zforce
Definition: ERF.H:1139
amrex::Vector< std::string > plot3d_var_names_2
Definition: ERF.H:1240
void sample_points(int lev, double time, amrex::IntVect cell, amrex::MultiFab &mf)
Definition: ERF_WriteScalarProfiles.cpp:536
void WeatherDataInterpolation(const int nlevs, const double time, amrex::Vector< std::unique_ptr< amrex::MultiFab >> &z_phys_nd, bool regrid_forces_file_read)
Definition: ERF_WeatherDataInterpolation.cpp:358
amrex::Vector< amrex::BCRec > domain_bcs_type
Definition: ERF.H:1106
amrex::Vector< std::unique_ptr< amrex::MultiFab > > Qr_prim
Definition: ERF.H:961
void apply_gaussian_smoothing_to_perturbations(const int lev, amrex::MultiFab &mf_cc_pert)
Definition: ERF_InitForEnsemble.cpp:103
std::string pp_prefix
Definition: ERF.H:640
std::string SampleLineLogName(int i) const noexcept
The filename of the ith samplelinelog file.
Definition: ERF.H:1774
amrex::Vector< amrex::Vector< std::unique_ptr< amrex::MultiFab > > > sst_lev
Definition: ERF.H:1030
amrex::Vector< std::string > plot2d_var_names_1
Definition: ERF.H:1241
void init_phys_bcs(bool &read_prim_theta)
Definition: ERF_InitBCs.cpp:26
amrex::Vector< std::unique_ptr< amrex::MultiFab > > thin_xforce
Definition: ERF.H:1137
AMREX_FORCE_INLINE int NumSamplePoints() noexcept
Definition: ERF.H:1634
bool metgrid_use_sfc
Definition: ERF.H:1384
void sample_lines(int lev, double time, amrex::IntVect cell, amrex::MultiFab &mf)
Definition: ERF_WriteScalarProfiles.cpp:572
void setPlotVariables2D(const std::string &pp_plot_var_names, amrex::Vector< std::string > &plot_var_names)
Definition: ERF_Plotfile2D.cpp:113
void init_custom(int lev)
Definition: ERF_InitCustomPertState.cpp:26
amrex::Vector< std::unique_ptr< IRadiation > > rad
Definition: ERF.H:999
void ComputeAndWriteEnsemblePerturbations()
std::unique_ptr< ProblemBase > prob
Definition: ERF.H:912
amrex::Vector< int > num_files_at_level
Definition: ERF.H:915
static double last_plot3d_file_time_2
Definition: ERF.H:1148
void init_bcs()
Definition: ERF_InitBCs.cpp:297
int profile_int
Definition: ERF.H:1229
erf_cloud_chamber::Config cloud_chamber_config
Definition: ERF.H:977
bool metgrid_debug_quiescent
Definition: ERF.H:1376
amrex::Vector< std::unique_ptr< ERFPhysBCFunct_u > > physbcs_u
Definition: ERF.H:953
bool destag_profiles
Definition: ERF.H:1230
amrex::Vector< amrex::Gpu::DeviceVector< amrex::Real > > stretched_dz_d
Definition: ERF.H:1088
amrex::Vector< amrex::Gpu::DeviceVector< amrex::Real > > th_bc_data
Definition: ERF.H:889
std::string DerDataLogName(int i) const noexcept
Definition: ERF.H:1768
void compute_max_pressure_gradient_diagnostic(int lev)
Definition: ERF_Diagnostics.cpp:12
void HurricaneEyeTracker(const SolverChoice &solverChoice)
Definition: ERF_HurricaneDiagnostics.cpp:475
void project_momenta(int lev, double l_time, double l_dt, amrex::Vector< amrex::MultiFab > &vars)
Definition: ERF_PoissonSolve.cpp:115
int m_check_int
Definition: ERF.H:1234
void HurricaneEyeTrackerInitial(const SolverChoice &sc, const amrex::Geometry &geom, const amrex::Vector< amrex::MultiFab > &S_data, const amrex::Real &hurricane_eye_latitude, const amrex::Real &hurricane_eye_longitude)
Definition: ERF_HurricaneDiagnostics.cpp:175
void ReadVelsOnlyFromCheckpointFile(int lev_to_fill, std::string &chkfile)
Definition: ERF_Checkpoint.cpp:1235
static double last_plot3d_file_time_1
Definition: ERF.H:1147
double m_plot2d_per_2
Definition: ERF.H:1223
amrex::Vector< amrex::MultiFab > surface_state_1
Definition: ERF.H:190
amrex::Vector< std::unique_ptr< amrex::MultiFab > > SFS_diss_lev
Definition: ERF.H:1041
amrex::Vector< amrex::Gpu::DeviceVector< amrex::Real > > d_sinesq_ptrs
Definition: ERF.H:1462
amrex::Vector< amrex::MultiFab > rU_old
Definition: ERF.H:964
AMREX_FORCE_INLINE int NumSampleLines() noexcept
Definition: ERF.H:1647
amrex::Array< bool, AMREX_SPACEDIM *2 > m_bc_nonreflecting
Definition: ERF.H:1125
amrex::Vector< std::unique_ptr< amrex::MultiFab > > Theta_prim
Definition: ERF.H:959
static double getCPUTime()
Definition: ERF.H:1656
void write_1D_profiles(double time)
Definition: ERF_Write1DProfiles.cpp:20
void init1DArrays()
amrex::Vector< std::unique_ptr< amrex::MultiFab > > z_t_rk
Definition: ERF.H:1073
static int check_for_nans
Definition: ERF.H:1345
void make_subdomains(const amrex::BoxList &ba, amrex::Vector< amrex::BoxArray > &bins)
Definition: ERF_MakeSubdomains.cpp:6
void compute_divergence(int lev, amrex::MultiFab &rhs, amrex::Array< amrex::MultiFab const *, AMREX_SPACEDIM > rho0_u_const, amrex::Geometry const &geom_at_lev)
Definition: ERF_ComputeDivergence.cpp:18
std::string MakeVTKFilename(int nstep)
Definition: ERF_TrackerOutput.cpp:14
void initRayleigh_at_level(const int &lev)
Initialize Rayleigh damping profiles at a level.
Definition: ERF_InitRayleigh.cpp:16
void appendPlotVariables(const std::string &pp_plot_var_names, amrex::Vector< std::string > &plot_var_names)
Definition: ERF_Plotfile.cpp:155
void read_box_for_refinement(std::string &ref_prefix, int &lev_for_box, amrex::RealBox &real_box)
Definition: ERF_RefineBox.cpp:6
int nvars_erfbdy
Definition: ERF.H:1394
amrex::Vector< std::unique_ptr< ERFPhysBCFunct_v > > physbcs_v
Definition: ERF.H:954
amrex::Vector< double > t_old
Definition: ERF.H:923
amrex::Vector< std::string > tot_e_datalogname
Definition: ERF.H:1756
void FillIntermediatePatch(int lev, double 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)
Definition: ERF_FillIntermediatePatch.cpp:26
static int output_bndry_planes
Definition: ERF.H:1416
void project_velocity_tb(int lev, double dt, amrex::Vector< amrex::MultiFab > &vars)
Definition: ERF_PoissonSolve_tb.cpp:35
amrex::Vector< amrex::Gpu::DeviceVector< amrex::Real > > d_v_geos
Definition: ERF.H:1438
void update_terrain_arrays(int lev)
Definition: ERF_MakeNewArrays.cpp:881
static std::string nc_bdy_file
Definition: ERF.H:1368
bool metgrid_interp_theta
Definition: ERF.H:1381
static amrex::Vector< amrex::Vector< std::string > > nc_init_file
Definition: ERF.H:1364
static int input_bndry_planes
Definition: ERF.H:1422
static StateInterpType interpolation_type
Definition: ERF.H:1361
amrex::Gpu::DeviceVector< amrex::Real > d_havg_qc
Definition: ERF.H:1475
amrex::Real cloud_fraction(double time)
Definition: ERF_WriteScalarProfiles.cpp:460
void AverageDown()
Definition: ERF_AverageDown.cpp:16
amrex::Vector< amrex::Vector< amrex::Real > > h_v_geos
Definition: ERF.H:1437
bool regrid_level_0_on_restart
Definition: ERF.H:1203
amrex::Vector< std::unique_ptr< amrex::MultiFab > > Lwave_onegrid
Definition: ERF.H:1097
void advance_microphysics(int lev, amrex::MultiFab &cons_in, const double &dt_advance, const int &iteration, const double &time)
Definition: ERF_AdvanceMicrophysics.cpp:5
InputSoundingData input_sounding_data
Definition: ERF.H:880
void write_1D_profiles_stag(double time)
Definition: ERF_Write1DProfiles_stag.cpp:28
void ApplyOceanSurfaceState(const amrex::Vector< amrex::MultiFab * > &state, double time)
Definition: ERF_Coupling.cpp:512
amrex::Vector< amrex::Vector< amrex::Real > > h_sinesq_ptrs
Definition: ERF.H:1454
void create_random_perturbations(const int lev, amrex::MultiFab &mf_cc_pert)
Definition: ERF_InitForEnsemble.cpp:20
void Write2DPlotFile(int which, PlotFileType plotfile_type, amrex::Vector< std::string > plot_var_names)
Definition: ERF_Plotfile2D.cpp:155
amrex::Gpu::DeviceVector< amrex::Real > d_havg_density
Definition: ERF.H:1471
amrex::Vector< std::unique_ptr< amrex::MultiFab > > rhotheta_src
Definition: ERF.H:1428
void init_from_hse(int lev)
Definition: ERF_InitFromHSE.cpp:32
const std::string datetime_format
Definition: ERF.H:1175
amrex::Vector< amrex::YAFluxRegister * > advflux_reg
Definition: ERF.H:1101
void check_mesh_type(int lev)
Definition: ERF.cpp:2994
erf_provenance::ExecutionProvenance execution_provenance
Definition: ERF.H:1182
int metgrid_force_sfc_k
Definition: ERF.H:1388
void setSubVolVariables(const std::string &pp_subvol_var_names, amrex::Vector< std::string > &subvol_var_names)
Definition: ERF_WriteSubvolume.cpp:12
static int ng_pres_hse
Definition: ERF.H:1425
bool real_extrap_w
Definition: ERF.H:1370
static amrex::Real cfl
Definition: ERF.H:1185
amrex::Vector< std::unique_ptr< amrex::MultiFab > > fine_mask
Definition: ERF.H:1085
amrex::Gpu::DeviceVector< amrex::BCRec > domain_bcs_type_d
Definition: ERF.H:1107
amrex::Vector< std::unique_ptr< ForestDrag > > m_forest_drag
Definition: ERF.H:1482
const int datwidth
Definition: ERF.H:1159
amrex::Vector< amrex::BoxArray > ba1d
Definition: ERF.H:1396
InputSpongeData input_sponge_data
Definition: ERF.H:883
amrex::Vector< amrex::Vector< amrex::BoxArray > > subdomains
Definition: ERF.H:1489
void check_state_for_nans(amrex::MultiFab const &S)
Definition: ERF.cpp:2827
std::string restart_chkfile
Definition: ERF.H:1178
bool metgrid_use_below_sfc
Definition: ERF.H:1383
amrex::Vector< std::string > sampleptlogname
Definition: ERF.H:1759
amrex::Vector< amrex::Gpu::DeviceVector< amrex::Real > > xvel_bc_data
Definition: ERF.H:886
void InitData_pre()
Definition: ERF.cpp:527
amrex::IntVect & SamplePoint(int i)
Definition: ERF.H:1627
bool use_datetime
Definition: ERF.H:1174
amrex::Vector< std::array< amrex::Real, 2 > > hurricane_track_xy
Definition: ERF.H:180
amrex::Vector< amrex::Vector< amrex::Real > > h_u_geos
Definition: ERF.H:1434
void InitializeLevelFromData(int lev, const amrex::MultiFab &initial_data)
std::string subvol_file
Definition: ERF.H:1210
int rad_datalog_int
Definition: ERF.H:1013
amrex::Vector< std::string > datalogname
Definition: ERF.H:1754
void initHSE()
Initialize HSE.
Definition: ERF_Init1D.cpp:184
void AverageDownTo(int crse_lev, int scomp, int ncomp, bool do_perturbational_and_momenta=true)
Definition: ERF_AverageDown.cpp:36
static amrex::Real column_loc_x
Definition: ERF.H:1411
static double dt_max
Definition: ERF.H:1190
amrex::Vector< amrex::MultiFab > surface_state_2
Definition: ERF.H:191
amrex::Vector< std::unique_ptr< amrex::MultiFab > > ax
Definition: ERF.H:1059
amrex::Vector< std::unique_ptr< amrex::MultiFab > > z_phys_nd
Definition: ERF.H:1055
void MakeDiagnosticAverage(amrex::Vector< amrex::Real > &h_havg, amrex::MultiFab &S, int n)
Definition: ERF.cpp:2708
amrex::Real metgrid_proximity
Definition: ERF.H:1386
amrex::Real volWgtSumMF(int lev, const amrex::MultiFab &mf, int comp, const amrex::MultiFab &dJ, const amrex::MultiFab &mfx, const amrex::MultiFab &mfy, bool finemask, bool local=true)
Definition: ERF_VolWgtSum.cpp:20
void setRecordDerDataInfo(int i, const std::string &filename)
Definition: ERF.H:1683
amrex::Vector< amrex::Real > h_havg_temperature
Definition: ERF.H:1466
amrex::Vector< std::unique_ptr< std::fstream > > sampleptlog
Definition: ERF.H:1758
void poisson_wall_dist(int lev)
Definition: ERF_PoissonWallDist.cpp:27
amrex::Vector< std::array< amrex::Real, 2 > > hurricane_eye_track_latlon
Definition: ERF.H:182
amrex::Vector< std::unique_ptr< amrex::MultiFab > > detJ_cc_src
Definition: ERF.H:1065
amrex::Gpu::DeviceVector< amrex::Real > d_havg_pressure
Definition: ERF.H:1473
static bool is_it_time_for_action(int nstep, double time, double dt, int action_interval, double action_per)
Definition: ERF_WriteScalarProfiles.cpp:662
std::string plot2d_file_1
Definition: ERF.H:1208
void Advance(int lev, double time, double dt_lev, int iteration, int ncycle)
Definition: ERF_Advance.cpp:20
amrex::Vector< std::string > der_datalogname
Definition: ERF.H:1755
amrex::Vector< std::unique_ptr< amrex::MultiFab > > SmnSmn_lev
Definition: ERF.H:1027
const amrex::Vector< std::string > derived_names
Definition: ERF.H:1252
void sum_integrated_quantities(double time)
Definition: ERF_WriteScalarProfiles.cpp:18
std::string MakeVTKFilename_TrackerCircle(int nstep)
Definition: ERF_TrackerOutput.cpp:27
void ComputeGlobalMinLocation(const SolverChoice &sc, const amrex::Geometry &geom, const amrex::Vector< amrex::MultiFab > &S_data, amrex::Real *d_val_min_ptr, int *d_i_min_ptr, int *d_j_min_ptr, amrex::Real &global_val_min, int &global_i_min, int &global_j_min)
Definition: ERF_HurricaneDiagnostics.cpp:36
amrex::Vector< std::unique_ptr< amrex::MultiFab > > ay_src
Definition: ERF.H:1067
void ComputeDt(int step=-1, double cur_time_d=0.0)
Definition: ERF_ComputeTimestep.cpp:11
AMREX_FORCE_INLINE std::ostream & DataLog(int i)
Definition: ERF.H:1571
std::string MakeVTKFilename_EyeTracker_xy(int nstep)
Definition: ERF_TrackerOutput.cpp:41
amrex::Vector< double > m_subvol_per
Definition: ERF.H:1218
amrex::Vector< int > nsubsteps
Definition: ERF.H:919
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > yflux_imask
Definition: ERF.H:1132
amrex::Vector< amrex::MultiFab > rW_new
Definition: ERF.H:969
amrex::Vector< amrex::MultiFab > weather_forecast_data_2
Definition: ERF.H:186
amrex::Vector< std::unique_ptr< amrex::MultiFab > > lon_m
Definition: ERF.H:875
std::unique_ptr< WriteBndryPlanes > m_w2d
Definition: ERF.H:1479
AMREX_FORCE_INLINE std::ostream & SampleLineLog(int i)
Definition: ERF.H:1614
void HurricaneMinPressureTracker(MoistureType moisture_type, const amrex::Geometry &geom, const amrex::MultiFab &mf_cons_var, const double &time)
Definition: ERF_HurricaneDiagnostics.cpp:556
amrex::Vector< amrex::Vector< amrex::MultiFab * > > lsm_flux
Definition: ERF.H:997
double EvolveOneStep(double time, double dt_request)
Definition: ERF_Coupling.cpp:92
bool use_erfbdy
Definition: ERF.H:1392
amrex::Vector< std::string > plot3d_var_names_1
Definition: ERF.H:1239
std::string SamplePointLogName(int i) const noexcept
The filename of the ith sampleptlog file.
Definition: ERF.H:1771
void InitData_post()
Definition: ERF.cpp:559
void refinement_criteria_setup()
Definition: ERF_Tagging.cpp:472
double estTimeStep(int lev, long &dt_fast_ratio) const
Definition: ERF_ComputeTimestep.cpp:60
static int nghost_eb_volume()
Definition: ERF.H:1793
bool metgrid_debug_dry
Definition: ERF.H:1378
static AMREX_FORCE_INLINE int ComputeGhostCells(const SolverChoice &sc)
Definition: ERF.H:1495
static int bndry_output_planes_interval
Definition: ERF.H:1417
void init_geo_wind_profile(const std::string input_file, amrex::Vector< amrex::Real > &u_geos, amrex::Gpu::DeviceVector< amrex::Real > &u_geos_d, amrex::Vector< amrex::Real > &v_geos, amrex::Gpu::DeviceVector< amrex::Real > &v_geos_d, const amrex::Geometry &lgeom, const amrex::Vector< amrex::Real > &zlev_stag)
Definition: ERF_InitGeowind.cpp:21
void ERF_shared()
Definition: ERF_Constructors.cpp:61
amrex::Vector< std::string > plot2d_var_names_2
Definition: ERF.H:1242
amrex::Vector< amrex::Vector< std::unique_ptr< amrex::MultiFab > > > Tau_corr
Definition: ERF.H:1025
void FillPatchCrseLevel(int lev, double time, const amrex::Vector< amrex::MultiFab * > &mfs_vel, bool cons_only=false)
Definition: ERF_FillPatch.cpp:302
void WriteSubvolume(int isub, amrex::Vector< std::string > subvol_var_names)
Definition: ERF_WriteSubvolume.cpp:148
void sum_energy_quantities(double time)
Definition: ERF_WriteScalarProfiles.cpp:320
static int nghost_eb_full()
Definition: ERF.H:1796
void RemakeLevel(int lev, amrex::Real time, const amrex::BoxArray &ba, const amrex::DistributionMapping &dm) override
Definition: ERF_MakeNewLevel.cpp:562
static void GotoNextLine(std::istream &is)
Definition: ERF_Checkpoint.cpp:28
void MakeNewLevelFromScratch(int lev, amrex::Real time, const amrex::BoxArray &ba, const amrex::DistributionMapping &dm) override
Definition: ERF_MakeNewLevel.cpp:25
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, amrex::MultiFab &tmp_base_state, std::unique_ptr< amrex::MultiFab > &tmp_zphys_nd)
Definition: ERF_MakeNewArrays.cpp:24
amrex::Vector< amrex::MultiFab > zmom_crse_rhs
Definition: ERF.H:973
void advance_radiation(int lev, amrex::MultiFab &cons_in, const double &dt_advance)
Definition: ERF_AdvanceRadiation.cpp:5
bool metgrid_debug_isothermal
Definition: ERF.H:1377
void PerformDataAssimilation(int da_iter)
amrex::Vector< std::string > lsm_data_name
Definition: ERF.H:994
amrex::Vector< std::unique_ptr< amrex::MultiFab > > rhoqt_src
Definition: ERF.H:1429
void initSponge()
Initialize sponge profiles.
Definition: ERF_InitSponge.cpp:35
std::unique_ptr< PlaneSampler > plane_sampler
Definition: ERF.H:1749
void check_for_low_temp(amrex::MultiFab &S)
Definition: ERF.cpp:2921
amrex::Vector< std::unique_ptr< std::fstream > > der_datalog
Definition: ERF.H:1752
static amrex::Vector< amrex::Vector< int > > have_read_nc_init_file
Definition: ERF.H:1365
amrex::Vector< std::unique_ptr< std::fstream > > tot_e_datalog
Definition: ERF.H:1753
amrex::Vector< std::unique_ptr< amrex::MultiFab > > sinPhi_m
Definition: ERF.H:877
static double previousCPUTimeUsed
Definition: ERF.H:1653
void writeJobInfo(const std::string &dir, erf_provenance::ArtifactType artifact_type, int artifact_step, double artifact_time_seconds) const
Definition: ERF_WriteJobInfo.cpp:15
bool m_driver_has_atm2ocn_coupling
Definition: ERF.H:707
double m_plot3d_per_1
Definition: ERF.H:1220
int real_width
Definition: ERF.H:1369
void MakeNewLevelFromCoarse(int lev, amrex::Real time, const amrex::BoxArray &ba, const amrex::DistributionMapping &dm) override
Definition: ERF_MakeNewLevel.cpp:278
amrex::Vector< int > last_subvol_step
Definition: ERF.H:1153
void fill_from_bndryregs(const amrex::Vector< amrex::MultiFab * > &mfs, double time)
Definition: ERF_BoundaryConditionsBndryReg.cpp:13
amrex::Vector< std::unique_ptr< amrex::MultiFab > > ax_src
Definition: ERF.H:1066
amrex::Vector< amrex::Vector< std::unique_ptr< amrex::MultiFab > > > urb_frac_lev
Definition: ERF.H:1037
amrex::Vector< std::unique_ptr< amrex::MultiFab > > z_phys_cc_src
Definition: ERF.H:1064
void input_sponge(int lev)
Definition: ERF_InitSponge.cpp:17
amrex::Vector< amrex::Gpu::DeviceVector< amrex::Real > > d_u_geos
Definition: ERF.H:1435
bool m_driver_uses_two_way_coupling
Definition: ERF.H:708
void Define_ERFFillPatchers(int lev)
Definition: ERF.cpp:2780
AMREX_FORCE_INLINE int NumDataLogs() noexcept
Definition: ERF.H:1585
static PlotFileType plotfile3d_type_2
Definition: ERF.H:1354
void setRecordEnergyDataInfo(int i, const std::string &filename)
Definition: ERF.H:1696
TurbulentPerturbation turbPert
Definition: ERF.H:1309
amrex::Vector< amrex::MultiFab > rW_old
Definition: ERF.H:968
amrex::Vector< double > fixed_dt
Definition: ERF.H:1193
amrex::Vector< amrex::Vector< amrex::MultiFab > > forecast_state_2
Definition: ERF.H:188
void check_for_negative_theta(amrex::MultiFab &S)
Definition: ERF.cpp:2956
void ImposeBCsOnPhi(int lev, amrex::MultiFab &phi, const amrex::Box &subdomain)
Definition: ERF_ImposeBCsOnPhi.cpp:19
void Interp2DArrays(int lev, const amrex::BoxArray &my_ba2d, const amrex::DistributionMapping &my_dm)
Definition: ERF.cpp:1522
void ClearLevel(int lev) override
Definition: ERF_MakeNewLevel.cpp:840
std::string MakeFilename_EyeTracker_minpressure(int nstep)
Definition: ERF_TrackerOutput.cpp:83
std::unique_ptr< amrex::MultiFab > wrf_RDNW
Definition: ERF.H:1402
std::unique_ptr< SurfaceLayer > m_SurfaceLayer
Definition: ERF.H:1481
static double dt_max_initial
Definition: ERF.H:1189
static PlotFileType plotfile2d_type_2
Definition: ERF.H:1356
int plane_sampling_interval
Definition: ERF.H:1745
static amrex::Vector< amrex::AMRErrorTag > ref_tags
Definition: ERF.H:1487
void make_physbcs(int lev)
Definition: ERF_MakeNewArrays.cpp:920
amrex::Vector< amrex::Gpu::DeviceVector< amrex::Real > > d_w_subsid
Definition: ERF.H:1432
amrex::Vector< ERFFillPatcher > FPr_w
Definition: ERF.H:1021
amrex::Vector< std::unique_ptr< amrex::MultiFab > > SFS_hfx2_lev
Definition: ERF.H:1040
void WriteLinePlot(const std::string &filename, amrex::Vector< std::array< amrex::Real, 2 >> &points_xy)
Definition: ERF_Write1DProfiles.cpp:607
amrex::Vector< amrex::Vector< std::unique_ptr< amrex::iMultiFab > > > soil_type_lev
Definition: ERF.H:1036
amrex::Vector< amrex::Vector< amrex::Real > > zlevels_stag
Definition: ERF.H:1052
AMREX_FORCE_INLINE int NumDerDataLogs() noexcept
Definition: ERF.H:1592
amrex::EBFArrayBoxFactory const & EBFactory(int lev) const noexcept
Definition: ERF.H:1785
amrex::Vector< amrex::Vector< amrex::MultiFab * > > lsm_data
Definition: ERF.H:995
void init_immersed_forcing(int lev)
Definition: ERF_InitImmersedForcing.cpp:15
amrex::Vector< amrex::Vector< amrex::Real > > stretched_dz_h
Definition: ERF.H:1087
bool use_real_time_in_pltname
Definition: ERF.H:1359
int m_plot2d_int_1
Definition: ERF.H:1214
void WriteCheckpointFile() const
Definition: ERF_Checkpoint.cpp:38
amrex::Array< amrex::Array< erf_wall_scalar_bc::WallScalarBCIntent, AMREX_SPACEDIM *2 >, NBCVAR_max > m_wall_scalar_bc_intent
Definition: ERF.H:1122
static int output_1d_column
Definition: ERF.H:1408
bool metgrid_debug_psfc
Definition: ERF.H:1379
void ReadStormTrackerRestart()
Definition: ERF_HurricaneDiagnostics.cpp:315
amrex::Vector< std::unique_ptr< amrex::MultiFab > > az_src
Definition: ERF.H:1068
static int fixed_mri_dt_ratio
Definition: ERF.H:1195
static amrex::Real init_shrink
Definition: ERF.H:1187
void WriteVTKPolyline(const std::string &filename, amrex::Vector< std::array< amrex::Real, 2 >> &points_xy)
Definition: ERF_TrackerOutput.cpp:97
void Write3DPlotFile(int which, PlotFileType plotfile_type, amrex::Vector< std::string > plot_var_names)
Definition: ERF_Plotfile.cpp:248
void HurricaneTrackerCircle()
Definition: ERF_HurricaneDiagnostics.cpp:149
static double last_check_file_time
Definition: ERF.H:1151
static std::string nc_low_file
Definition: ERF.H:1373
amrex::Vector< amrex::Vector< amrex::Gpu::DeviceVector< amrex::Real > > > d_rayleigh_ptrs
Definition: ERF.H:1458
void InitData()
Definition: ERF.cpp:518
amrex::Vector< std::unique_ptr< amrex::MultiFab > > Lwave
Definition: ERF.H:1095
amrex::Vector< std::unique_ptr< amrex::MultiFab > > cosPhi_m
Definition: ERF.H:877
void ParameterSanityChecks()
Definition: ERF.cpp:2509
amrex::Vector< amrex::Vector< std::unique_ptr< amrex::iMultiFab > > > land_type_lev
Definition: ERF.H:1035
static double start_time
Definition: ERF.H:1171
void init_zphys(int lev, double elapsed_time)
Definition: ERF_MakeNewArrays.cpp:688
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_q1fx3, amrex::Gpu::HostVector< amrex::Real > &h_avg_q2fx3, amrex::Gpu::HostVector< amrex::Real > &h_avg_diss)
Definition: ERF_Write1DProfiles.cpp:508
amrex::Vector< amrex::Vector< amrex::MultiFab > > forecast_state_1
Definition: ERF.H:187
int cf_width
Definition: ERF.H:1016
static int last_plot2d_file_step_1
Definition: ERF.H:1143
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > zflux_imask
Definition: ERF.H:1133
bool m_expand_plotvars_to_unif_rr
Definition: ERF.H:1211
std::unique_ptr< CloudChamberBudget > cloud_chamber_budget
Definition: ERF.H:976
void Construct_ERFFillPatchers(int lev)
Definition: ERF.cpp:2754
amrex::Vector< int > num_boxes_at_level
Definition: ERF.H:914
void compute_native_shoc_tendencies(int lev, amrex::MultiFab *cons, amrex::MultiFab *xvel, amrex::MultiFab *yvel, amrex::MultiFab *zvel, amrex::Real *w_subsid, amrex::MultiFab *tau13, amrex::MultiFab *tau23, amrex::MultiFab *hfx3, amrex::MultiFab *qfx3, amrex::MultiFab *eddyDiffs, amrex::MultiFab *z_phys_nd, const double &dt_advance)
Definition: ERF_ShocCoupling.cpp:6
void FillSurfaceStateMultiFabs(const int lev, const std::string &filename, amrex::Vector< amrex::MultiFab > &surface_state)
Definition: ERF_SurfaceDataInterpolation.cpp:19
static amrex::Real sub_cfl
Definition: ERF.H:1186
static void print_error(MPI_Comm, const std::string &msg)
Definition: ERF_ConsoleIO.cpp:46
static int ng_dens_hse
Definition: ERF.H:1424
std::unique_ptr< ReadBndryPlanes > m_r2d
Definition: ERF.H:1480
amrex::Vector< std::unique_ptr< amrex::MultiFab > > ay
Definition: ERF.H:1060
amrex::Vector< amrex::Vector< amrex::MultiFab * > > qmoist
Definition: ERF.H:978
amrex::Vector< std::unique_ptr< amrex::MultiFab > > SFS_q1fx1_lev
Definition: ERF.H:1042
amrex::Vector< amrex::Gpu::DeviceVector< amrex::Real > > zvel_bc_data
Definition: ERF.H:888
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_q1fx3, amrex::Gpu::HostVector< amrex::Real > &h_avg_q2fx3, amrex::Gpu::HostVector< amrex::Real > &h_avg_diss)
Definition: ERF_Write1DProfiles_stag.cpp:638
LandSurface lsm
Definition: ERF.H:993
static amrex::Real change_max
Definition: ERF.H:1188
void setRecordSampleLineInfo(int i, int lev, amrex::IntVect &cell, const std::string &filename)
Definition: ERF.H:1726
void setSpongeRefFromSounding(bool restarting)
Set sponge mean profiles from input sounding.
Definition: ERF_InitSponge.cpp:65
amrex::Vector< amrex::MultiFab > avg_ymom
Definition: ERF.H:948
int line_sampling_interval
Definition: ERF.H:1744
amrex::Vector< amrex::Vector< amrex::Real > > h_sinesq_stag_ptrs
Definition: ERF.H:1455
amrex::Vector< std::unique_ptr< amrex::MultiFab > > detJ_cc_new
Definition: ERF.H:1071
void project_initial_velocity(int lev, double time, double dt)
Definition: ERF_PoissonSolve.cpp:39
amrex::Array< std::string, 2 *AMREX_SPACEDIM > domain_bc_type
Definition: ERF.H:1110
amrex::Vector< amrex::Gpu::DeviceVector< amrex::Real > > yvel_bc_data
Definition: ERF.H:887
static void writeBuildInfo(std::ostream &os)
Definition: ERF_WriteJobInfo.cpp:178
amrex::GpuArray< ERF_BC, AMREX_SPACEDIM *2 > phys_bc_type
Definition: ERF.H:1128
std::string check_file
Definition: ERF.H:1233
amrex::Vector< amrex::IntVect > samplepoint
Definition: ERF.H:1760
amrex::Vector< amrex::MultiFab > surface_state_interp
Definition: ERF.H:192
amrex::Vector< amrex::Real > h_havg_qv
Definition: ERF.H:1468
amrex::Vector< amrex::MultiFab > weather_forecast_data_1
Definition: ERF.H:186
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::MultiFab &buoyancy, amrex::Geometry fine_geom, double dt, double time)
Definition: ERF_AdvanceDycore.cpp:38
static void print_usage(MPI_Comm, std::ostream &)
Definition: ERF_ConsoleIO.cpp:29
amrex::Vector< amrex::MultiFab > rV_old
Definition: ERF.H:966
amrex::Vector< std::unique_ptr< amrex::MultiFab > > lat_m
Definition: ERF.H:875
void timeStep(int lev, double time, int iteration)
Definition: ERF_TimeStep.cpp:18
amrex::Vector< amrex::Vector< amrex::Vector< amrex::Real > > > h_rayleigh_ptrs
Definition: ERF.H:1450
void make_eb_regular()
static int last_plot3d_file_step_1
Definition: ERF.H:1141
void FillPatchFineLevel(int lev, double time, const amrex::Vector< amrex::MultiFab * > &mfs_vel, const amrex::Vector< amrex::MultiFab * > &mfs_mom, const amrex::MultiFab &old_base_state, const amrex::MultiFab &new_base_state, bool fillset=true, bool cons_only=false)
Definition: ERF_FillPatch.cpp:24
std::unique_ptr< LineSampler > line_sampler
Definition: ERF.H:1748
amrex::Vector< std::unique_ptr< amrex::MultiFab > > Hwave
Definition: ERF.H:1094
amrex::Vector< amrex::Vector< amrex::Vector< std::unique_ptr< amrex::MultiFab > > > > Tau_EB
Definition: ERF.H:1047
amrex::Vector< int > istep
Definition: ERF.H:918
const int datprecision
Definition: ERF.H:1160
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > xflux_imask
Definition: ERF.H:1131
void derive_upwp(amrex::Vector< amrex::Real > &h_havg)
static PlotFileType plotfile2d_type_1
Definition: ERF.H:1355
int metgrid_order
Definition: ERF.H:1387
bool finished_wave
Definition: ERF.H:1098
void ReadCheckpointFile()
Definition: ERF_Checkpoint.cpp:523
amrex::Vector< amrex::Vector< amrex::MultiFab > > vars_old
Definition: ERF.H:931
void WriteAtFinalTime()
Definition: ERF.cpp:276
amrex::Vector< std::unique_ptr< ERFPhysBCFunct_base > > physbcs_base
Definition: ERF.H:956
void init_thin_body(int lev, const amrex::BoxArray &ba, const amrex::DistributionMapping &dm)
Definition: ERF_MakeNewLevel.cpp:925
static PlotFileType plotfile3d_type_1
Definition: ERF.H:1353
amrex::Vector< int > m_subvol_int
Definition: ERF.H:1217
AMREX_FORCE_INLINE std::ostream & SamplePointLog(int i)
Definition: ERF.H:1600
std::string MakeFilename_EyeTracker_latlon(int nstep)
Definition: ERF_TrackerOutput.cpp:55
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, const amrex::Vector< amrex::Geometry > &my_geom, double time, const amrex::Vector< int > &level_steps, const amrex::Vector< amrex::IntVect > &my_ref_ratio, 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: ERF_Plotfile.cpp:2003
amrex::Array< amrex::Array< amrex::Real, AMREX_SPACEDIM *2 >, AMREX_SPACEDIM+NBCVAR_max > m_bc_neumann_vals
Definition: ERF.H:1116
void PackAtmosphericStates(amrex::Vector< amrex::MultiFab * > &states, double time)
Definition: ERF_Coupling.cpp:169
bool m_driver_atm2ocn_uses_state_contract
Definition: ERF.H:709
amrex::Vector< amrex::Vector< std::unique_ptr< amrex::MultiFab > > > tsk_lev
Definition: ERF.H:1031
void setRecordSamplePointInfo(int i, int lev, amrex::IntVect &cell, const std::string &filename)
Definition: ERF.H:1709
static int column_interval
Definition: ERF.H:1409
static void print_summary(std::ostream &)
int m_plot3d_int_2
Definition: ERF.H:1213
amrex::Vector< std::unique_ptr< amrex::MultiFab > > qheating_rates
Definition: ERF.H:1000
void turbPert_amplitude(const int lev)
Definition: ERF_InitTurbPert.cpp:42
amrex::Vector< std::unique_ptr< amrex::MultiFab > > rad_fluxes
Definition: ERF.H:1001
void initializeMicrophysics(const int &)
Definition: ERF.cpp:1720
static double bndry_output_planes_start_time
Definition: ERF.H:1419
std::unique_ptr< amrex::MultiFab > wrf_C2H
Definition: ERF.H:1400
bool plot_lsm
Definition: ERF.H:1226
amrex::Vector< amrex::MultiFab > avg_zmom
Definition: ERF.H:949
const amrex::Vector< std::string > cons_names
Definition: ERF.H:1243
void ReadCheckpointFileSurfaceLayer()
Definition: ERF_Checkpoint.cpp:1275
double m_plot2d_per_1
Definition: ERF.H:1222
Definition: ERF_LandSurface.H:17
Owns and exposes cell-centered and face-centered EB factories.
Definition: ERF_EB.H:24
Definition: ERF_InterpolationUtils.H:16
@ pres
Definition: ERF_Kessler.H:27
@ qv
Definition: ERF_Kessler.H:30
@ xvel
Definition: ERF_IndexDefines.H:177
@ cons
Definition: ERF_IndexDefines.H:176
@ zvel
Definition: ERF_IndexDefines.H:179
@ yvel
Definition: ERF_IndexDefines.H:178
@ p
Definition: ERF_WSM6.H:191
Definition: ERF_ConsoleIO.cpp:15
ArtifactType
Definition: ERF_Provenance.H:37
real(c_double), parameter, private pi
Definition: ERF_module_mp_morr_two_moment.F90:100
integer, private isub
Definition: ERF_module_mp_morr_two_moment.F90:164
real(kind=kind_phys), parameter, private dens
Definition: ERF_module_mp_wsm6.F90:39
AdvType dycore_vert_adv_type
Vertical advection scheme for dynamical-core variables.
Definition: ERF_AdvStruct.H:442
AdvType moistscal_vert_adv_type
Vertical advection scheme for moist scalar variables.
Definition: ERF_AdvStruct.H:446
AdvType dryscal_horiz_adv_type
Horizontal advection scheme for dry scalar variables.
Definition: ERF_AdvStruct.H:443
AdvType dycore_horiz_adv_type
Horizontal advection scheme for dynamical-core variables.
Definition: ERF_AdvStruct.H:441
AdvType moistscal_horiz_adv_type
Horizontal advection scheme for moist scalar variables.
Definition: ERF_AdvStruct.H:445
AdvType dryscal_vert_adv_type
Vertical advection scheme for dry scalar variables.
Definition: ERF_AdvStruct.H:444
Definition: ERF_InputSoundingData.H:22
Definition: ERF_InputSpongeData.H:19
Definition: ERF_DataStruct.H:241
AdvChoice advChoice
Advection-related options.
Definition: ERF_DataStruct.H:1389
static TerrainType terrain_type
Terrain or immersed-boundary representation.
Definition: ERF_DataStruct.H:1368
bool use_num_diff
Whether sixth-order numerical diffusion is enabled.
Definition: ERF_DataStruct.H:1600
Runtime state and operations for turbulent perturbation forcing.
Definition: ERF_TurbPertStruct.H:25
Definition: ERF_CloudChamber.H:35
Definition: ERF_Provenance.H:66