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