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