ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_MOSTAverage.H
Go to the documentation of this file.
1 #ifndef ERF_MOSTAverage_H
2 #define ERF_MOSTAverage_H
3 
4 #include "AMReX_Gpu.H"
5 #include "AMReX_FArrayBox.H"
6 #include "AMReX_MultiFab.H"
7 #include "AMReX_iMultiFab.H"
8 #include "AMReX_ParmParse.H"
9 
10 #include "ERF_IndexDefines.H"
11 #include "ERF_TerrainMetrics.H"
12 #include "ERF_DataStruct.H"
13 #include "ERF_EB.H"
14 
15 class MOSTAverage {
16 public:
17  /**
18  * Construct the MOST averaging helper.
19  *
20  * @param[in] geom geometry for all AMR levels
21  * @param[in] has_zphys whether nodal physical-height data are available
22  * @param[in] a_pp_prefix ParmParse prefix
23  * @param[in] m_mesh_type mesh type
24  * @param[in] m_terrain_type terrain representation
25  * @param[in] eb_vec optional embedded-boundary geometry data
26  */
27  explicit MOSTAverage (amrex::Vector<amrex::Geometry> geom,
28  const bool& has_zphys,
29  std::string a_pp_prefix,
30  const MeshType& m_mesh_type,
31  const TerrainType& m_terrain_type,
32  const amrex::Vector<const eb_*>& eb_vec = {});
33 
34  // MOSTAverage() = default;
35 
36  /**
37  * Destroy the MOST averaging helper.
38  */
40  {}
41 
42  /**
43  * Default move constructor.
44  */
45  MOSTAverage (MOSTAverage&&) noexcept = default;
46 
47  /**
48  * Deleted move-assignment operator.
49  *
50  * @param[in] other source object
51  */
52  MOSTAverage& operator=(MOSTAverage&& other) noexcept = delete;
53 
54  /**
55  * Deleted copy constructor.
56  *
57  * @param[in] other source object
58  */
59  MOSTAverage (const MOSTAverage& other) = delete;
60 
61  /**
62  * Deleted copy-assignment operator.
63  *
64  * @param[in] other source object
65  */
66  MOSTAverage& operator=(const MOSTAverage& other) = delete;
67 
68  /**
69  * Make MOST-average data structures at one level.
70  *
71  * @param[in] lev level index
72  * @param[in] vars_old old-time state and velocity fields
73  * @param[in] Theta_prim primitive potential-temperature field
74  * @param[in] Qv_prim primitive water-vapor field
75  * @param[in] Qr_prim primitive rain-water field
76  * @param[in] z_phys_nd nodal physical-height field
77  */
78  void make_MOSTAverage_at_level (const int& lev,
79  const amrex::Vector<amrex::MultiFab*>& vars_old,
80  std::unique_ptr<amrex::MultiFab>& Theta_prim,
81  std::unique_ptr<amrex::MultiFab>& Qv_prim,
82  std::unique_ptr<amrex::MultiFab>& Qr_prim,
83  std::unique_ptr<amrex::MultiFab>& z_phys_nd);
84 
85  /**
86  * Reset pointers to field MultiFabs.
87  *
88  * @param[in] lev level index
89  * @param[in] vars_old old-time state and velocity fields
90  * @param[in] Theta_prim primitive potential-temperature fields by level
91  * @param[in] Qv_prim primitive water-vapor fields by level
92  * @param[in] Qr_prim primitive rain-water fields by level
93  */
94  void update_field_ptrs (const int& lev,
95  amrex::Vector<amrex::Vector<amrex::MultiFab>>& vars_old,
96  amrex::Vector<std::unique_ptr<amrex::MultiFab>>& Theta_prim,
97  amrex::Vector<std::unique_ptr<amrex::MultiFab>>& Qv_prim,
98  amrex::Vector<std::unique_ptr<amrex::MultiFab>>& Qr_prim);
99 
100  /**
101  * Update the rotated fields.
102  *
103  * @param[in] lev level index
104  */
105  void set_rotated_fields (const int& lev);
106 
107  /**
108  * Compute number of cells per averaging plane.
109  *
110  * @param[in] lev level index
111  */
112  void set_plane_normalization (const int& lev);
113 
114  /**
115  * Compute total embedded-boundary surface area.
116  *
117  * @param[in] lev level index
118  */
119  void set_eb_normalization (const int& lev);
120 
121  /**
122  * Compute number of cells in the region average.
123  *
124  * @param[in] lev level index
125  */
126  void set_region_normalization (const int& /*lev*/)
127  {m_ncell_region = (2 * m_radius + 1) * (2 * m_radius + 1) * (2 * m_radius + 1);}
128 
129  /**
130  * Populate the 2D k-index iMultiFab without terrain.
131  *
132  * @param[in] lev level index
133  */
134  void set_k_indices_N (const int& lev);
135 
136  /**
137  * Populate the 2D k-index iMultiFab with terrain.
138  *
139  * @param[in] lev level index
140  */
141  void set_k_indices_T (const int& lev);
142 
143  /**
144  * Populate all 2D normal-index iMultiFabs with terrain.
145  *
146  * @param[in] lev level index
147  */
148  void set_norm_indices_T (const int& lev);
149 
150  /**
151  * Populate terrain-aware z positions.
152  *
153  * @param[in] lev level index
154  */
155  void set_z_positions_T (const int& lev);
156 
157  /**
158  * Populate embedded-boundary z positions.
159  *
160  * @param[in] lev level index
161  */
162  void set_z_positions_EB (const int& lev);
163 
164  /**
165  * Populate terrain-aware normal positions.
166  *
167  * @param[in] lev level index
168  */
169  void set_norm_positions_T (const int& lev);
170 
171  /**
172  * Driver for the selected average policy.
173  *
174  * @param[in] lev level index
175  */
176  void compute_averages (const int& lev);
177 
178  /**
179  * Fill averages for the plane policy.
180  *
181  * @param[in] lev level index
182  */
183  void compute_plane_averages (const int& lev);
184 
185  /**
186  * Fill averages for the point or region policy.
187  *
188  * @param[in] lev level index
189  */
190  void compute_region_averages (const int& lev);
191 
192  /**
193  * Fill averages for the embedded-boundary policy.
194  *
195  * @param[in] lev level index
196  */
197  void compute_eb_averages (const int& lev);
198 
199  /**
200  * Write k-index data.
201  *
202  * @param[in] lev level index
203  */
204  void write_k_indices (const int& lev);
205 
206  /**
207  * Write normal-index data.
208  *
209  * @param[in] lev level index
210  */
211  void write_norm_indices (const int& lev);
212 
213  /**
214  * Write XZ planar positions.
215  *
216  * @param[in] lev level index
217  * @param[in] j y-index of the plane to write
218  */
219  void write_xz_positions (const int& lev,
220  const int& j);
221 
222  /**
223  * Write averages on the 2D MultiFab.
224  *
225  * @param[in] lev level index
226  */
227  void write_averages (const int& lev);
228 
229  /**
230  * Return one 2D average MultiFab.
231  *
232  * @param[in] lev level index
233  * @param[in] comp average component index
234  */
235  [[nodiscard]] const amrex::MultiFab* get_average (const int& lev, const int& comp) const { return m_averages[lev][comp].get(); }
236 
237  /**
238  * Return one 2D average MultiFab for modification (used to restore the
239  * exponential filter state from a checkpoint).
240  *
241  * @param[in] lev level index
242  * @param[in] comp average component index
243  */
244  [[nodiscard]] amrex::MultiFab* get_average (const int& lev, const int& comp) { return m_averages[lev][comp].get(); }
245 
246  /**
247  * Return whether the averages are filtered in time (erf.most.time_average).
248  */
249  [[nodiscard]] bool do_time_averaging () const { return m_t_avg; }
250 
251  /**
252  * Return the number of average components.
253  */
254  [[nodiscard]] int get_navg () const { return m_navg; }
255 
256  /**
257  * Return whether the time filter at this level holds meaningful history.
258  * Until it does, the next average is taken to be the instantaneous one.
259  *
260  * @param[in] lev level index
261  */
262  [[nodiscard]] bool time_avg_is_initialized (const int& lev) const
263  {
264  return ( m_t_avg && (lev < static_cast<int>(m_t_init.size())) && (m_t_init[lev] == 1) );
265  }
266 
267  /**
268  * Declare the time filter at this level to hold meaningful history. This is
269  * used on restart, once the filter state has been read back in.
270  *
271  * @param[in] lev level index
272  */
273  void set_time_avg_initialized (const int& lev)
274  {
275  if (m_t_avg) { m_t_init[lev] = 1; }
276  }
277 
278  /**
279  * Return the filtered plane averages, which hold the filter state for the
280  * plane and EB policies. The region policy holds its state in m_averages
281  * instead and never allocates these, in which case this is empty.
282  *
283  * @param[in] lev level index
284  */
285  [[nodiscard]] amrex::Vector<amrex::Real> get_plane_average (const int& lev) const
286  {
287  if (lev < static_cast<int>(m_plane_average.size())) { return m_plane_average[lev]; }
288  return amrex::Vector<amrex::Real>{};
289  }
290 
291  /**
292  * Restore the filtered plane averages from a checkpoint. Returns false if the
293  * checkpoint does not hold what this run expects, e.g. because the averaging
294  * policy changed, in which case nothing is restored.
295  *
296  * @param[in] lev level index
297  * @param[in] pavg filtered plane averages, one per average component
298  */
299  bool set_plane_average (const int& lev, const amrex::Vector<amrex::Real>& pavg)
300  {
301  const int n_have = (lev < static_cast<int>(m_plane_average.size())) ?
302  static_cast<int>(m_plane_average[lev].size()) : 0;
303  if (n_have != static_cast<int>(pavg.size())) { return false; }
304  if (n_have > 0) { m_plane_average[lev] = pavg; }
305  return true;
306  }
307 
308  /**
309  * Return z_ref, which may be computed from a specified k-index.
310  *
311  * @param[in] lev level index
312  */
313  [[nodiscard]] amrex::MultiFab* get_zref (const int& lev) const { return m_zref[lev].get(); }
314 
315  /**
316  * Return the k-index iMultiFab.
317  *
318  * @param[in] lev level index
319  */
320  [[nodiscard]] const amrex::iMultiFab* get_k_indices (const int& lev) const { return m_k_indx[lev].get(); }
321 
322  /**
323  * Function to compute trilinear interpolation with terrain.
324  *
325  * @param[in] xp X-position
326  * @param[in] yp Y-position
327  * @param[in] zp Z-position
328  * @param[out] interp_vals Values interpolated
329  * @param[in] interp_array Array to interpolate on
330  * @param[in] z_arr Physical heights
331  * @param[in] plo Problem lower bounds
332  * @param[in] dxi Inverse cell size array
333  * @param[in] interp_comp Number of components to interpolate
334  */
335  AMREX_GPU_HOST_DEVICE AMREX_INLINE
336  static void trilinear_interp_T (const amrex::Real& xp,
337  const amrex::Real& yp,
338  const amrex::Real& zp,
339  amrex::Real* interp_vals,
340  amrex::Array4<amrex::Real const> const& interp_array,
341  amrex::Array4<amrex::Real const> const& z_arr,
342  const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& plo,
343  const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dxi,
344  const int interp_comp)
345  {
346  // Search to get z/k
347  bool found = false;
348  int kmax = ubound(z_arr).z;
349  amrex::Real zval = zero;
350  amrex::Real z_target = zp;
351 
352  // Map position to i,j (must be same mapping in cpp file)
353  amrex::Real ireal = (xp - plo[0]) * dxi[0];
354  amrex::Real jreal = (yp - plo[1]) * dxi[1];
355  int i_new = (int) (ireal - myhalf);
356  int j_new = (int) (jreal - myhalf);
357 
358  for (int lk(0); lk<kmax; ++lk) {
359  amrex::Real z_lo = fourth * ( z_arr(i_new,j_new ,lk ) + z_arr(i_new+1,j_new ,lk )
360  + z_arr(i_new,j_new+1,lk ) + z_arr(i_new+1,j_new+1,lk ) );
361  amrex::Real z_hi = fourth * ( z_arr(i_new,j_new ,lk+1) + z_arr(i_new+1,j_new ,lk+1)
362  + z_arr(i_new,j_new+1,lk+1) + z_arr(i_new+1,j_new+1,lk+1) );
363  if (z_target > z_lo && z_target < z_hi){
364  found = true;
365  zval = (amrex::Real) lk + ((z_target - z_lo) / (z_hi - z_lo)) + myhalf;
366  break;
367  }
368  }
369 
370  amrex::ignore_unused(found);
371  AMREX_ALWAYS_ASSERT_WITH_MESSAGE(found, "MOSTAverage: Height above terrain not found, try increasing z_ref!");
372 
373  // NOTE: This is the point ahead of the current i,j (e.g. i/j_new + 1)
374  const amrex::RealVect lx(ireal + myhalf, jreal + myhalf, zval);
375 
376  const amrex::IntVect ijk = lx.floor();
377 
378  int i = ijk[0]; int j = ijk[1]; int k = ijk[2];
379 
380  // Convert ijk (IntVect) to a RealVect explicitly
381  amrex::RealVect ijk_r(static_cast<amrex::Real>(ijk[0]),
382  static_cast<amrex::Real>(ijk[1]),
383  static_cast<amrex::Real>(ijk[2]));
384 
385  // Weights
386  const amrex::RealVect sx_hi = lx - ijk_r;
387  const amrex::RealVect sx_lo = one - sx_hi;
388 
389  for (int n = 0; n < interp_comp; n++) {
390  interp_vals[n] = sx_lo[0]*sx_lo[1]*sx_lo[2]*interp_array(i-1, j-1, k-1,n) +
391  sx_lo[0]*sx_lo[1]*sx_hi[2]*interp_array(i-1, j-1, k ,n) +
392  sx_lo[0]*sx_hi[1]*sx_lo[2]*interp_array(i-1, j , k-1,n) +
393  sx_lo[0]*sx_hi[1]*sx_hi[2]*interp_array(i-1, j , k ,n) +
394  sx_hi[0]*sx_lo[1]*sx_lo[2]*interp_array(i , j-1, k-1,n) +
395  sx_hi[0]*sx_lo[1]*sx_hi[2]*interp_array(i , j-1, k ,n) +
396  sx_hi[0]*sx_hi[1]*sx_lo[2]*interp_array(i , j , k-1,n) +
397  sx_hi[0]*sx_hi[1]*sx_hi[2]*interp_array(i , j , k ,n);
398  }
399  }
400 
401 protected:
402 
403  // Passed through constructor
404  //--------------------------------------------
405  const amrex::Vector<amrex::Geometry> m_geom; // Geometry at each level
406  amrex::Vector<amrex::Vector<amrex::MultiFab*>> m_fields; // Ptr to fields to be averaged
407  amrex::Vector<amrex::MultiFab*> m_z_phys_nd; // Ptr to terrain height coords
408  std::string m_pp_prefix; // ParmParse prefix
409  MeshType m_mesh_type; // Mesh type
410  TerrainType m_terrain_type; // Terrain type
411 
412  // General vars for multiple or all policies
413  //--------------------------------------------
414  int m_nvar{6}; // 6 fields for U/V/T/Qv/Qr/W
415  int m_navg{6}; // 6 averages for U/V/T/Qv/Tv/Umag
416  int m_maxlev{0}; // Total number of levels
417  int m_policy{0}; // Policy for type of averaging
418  bool m_rotate{false}; // Do vector rotations for terrain?
419  amrex::Vector<std::unique_ptr<amrex::MultiFab>> m_zref; // Height above surface for MOST BC
420  amrex::Vector<std::unique_ptr<amrex::MultiFab>> m_x_pos; // Ptr to 2D mf to hold x position (maxlev)
421  amrex::Vector<std::unique_ptr<amrex::MultiFab>> m_y_pos; // Ptr to 2D mf to hold y position (maxlev)
422  amrex::Vector<std::unique_ptr<amrex::MultiFab>> m_z_pos; // Ptr to 2D mf to hold z position (maxlev)
423  amrex::Vector<std::unique_ptr<amrex::iMultiFab>> m_i_indx; // Ptr to 2D imf to hold i indices (maxlev)
424  amrex::Vector<std::unique_ptr<amrex::iMultiFab>> m_j_indx; // Ptr to 2D imf to hold j indices (maxlev)
425  amrex::Vector<std::unique_ptr<amrex::iMultiFab>> m_k_indx; // Ptr to 2D imf to hold k indices (maxlev)
426  amrex::Vector<amrex::Vector<std::unique_ptr<amrex::MultiFab>>> m_averages; // Ptr to 2D mf to hold averages (maxlev,navg)
427  amrex::Vector<amrex::Vector<std::unique_ptr<amrex::MultiFab>>> m_rot_fields; // Rotated field data
428 
429  // Vars for planar average policy
430  //--------------------------------------------
431  amrex::Vector<amrex::Vector<int>> m_ncell_plane; // Number of cells in plane (maxlev,navg)
432  amrex::Vector<amrex::Vector<amrex::Real>> m_plane_average; // Plane avgs (maxlev,navg)
433 
434  // Vars for point/region average policy
435  //--------------------------------------------
436  int m_radius{0}; // Radius around k_index
437  int m_ncell_region{1}; // Number of cells in local region
438  amrex::Vector<int> m_k_in; // Specified k_index for region avg (maxlev)
439 
440  // Vars for normal vector policy
441  //--------------------------------------------
442  bool m_interp{false}; // Do interpolation on destination?
443  bool m_norm_vec{false}; // Use normal vector to find IJK?
444 
445  // Vars for EB averaging policy
446  //--------------------------------------------
447  amrex::Vector<const eb_*> m_eb_vec; // Vector of pointers to EB objects (one per level)
448  amrex::Vector<amrex::Vector<amrex::Real>> m_total_bndry_area; // Total EB surface areas (maxlev, navg)
449 
450  // Time average w/ exponential filter fun
451  //--------------------------------------------
452  bool m_t_avg{false}; // Flag to do moving average in time
453  amrex::Vector<int> m_t_init; // Flag to specify if averages are initialized
454  double m_time_window{1.0e-16}; // Width of the exp filter function
455  amrex::Real m_fact_new, m_fact_old; // Time average factors for new and old means
456 
457  // Surface velocity correction
458  //--------------------------------------------
459  bool include_subgrid_vel = false;
460  amrex::Vector<amrex::Real> m_Vsg; // Subgrid velocity scale (Mahrt & Sun 1995 MWR)
461 
462  // Default values
463  //--------------------------------------------
465 
466  // Sentinel used to detect whether most.zref was set by the user. zref_default
467  // is itself a legal user value, so "was it specified" cannot be read off the
468  // value unless we probe with something unreachable first. A reference height
469  // is a distance above the surface and so is always positive. See the parse
470  // sites in ERF_MOSTAverage.cpp: they use ParmParse::queryAdd, whose return value
471  // is only meaningful on the first parse of a key, and these routines run once
472  // per level.
474 };
475 #endif
constexpr amrex::Real one
Definition: ERF_Constants.H:9
constexpr amrex::Real fourth
Definition: ERF_Constants.H:14
constexpr amrex::Real zero
Definition: ERF_Constants.H:8
constexpr amrex::Real myhalf
Definition: ERF_Constants.H:13
Declares the embedded-boundary factory manager used by ERF levels.
AMREX_ALWAYS_ASSERT_WITH_MESSAGE(m_cloud_chamber_config.active, "Cloud Chamber: initializer reached without a parsed configuration")
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_MOSTAverage.H:15
int m_navg
Definition: ERF_MOSTAverage.H:415
bool m_t_avg
Definition: ERF_MOSTAverage.H:452
void write_xz_positions(const int &lev, const int &j)
Definition: ERF_MOSTAverage.cpp:2067
void compute_plane_averages(const int &lev)
Definition: ERF_MOSTAverage.cpp:999
int m_policy
Definition: ERF_MOSTAverage.H:417
amrex::Vector< amrex::Vector< std::unique_ptr< amrex::MultiFab > > > m_averages
Definition: ERF_MOSTAverage.H:426
bool set_plane_average(const int &lev, const amrex::Vector< amrex::Real > &pavg)
Definition: ERF_MOSTAverage.H:299
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_y_pos
Definition: ERF_MOSTAverage.H:421
const amrex::Real zref_sentinel
Definition: ERF_MOSTAverage.H:473
double m_time_window
Definition: ERF_MOSTAverage.H:454
amrex::MultiFab * get_average(const int &lev, const int &comp)
Definition: ERF_MOSTAverage.H:244
int m_radius
Definition: ERF_MOSTAverage.H:436
void set_z_positions_EB(const int &lev)
Definition: ERF_MOSTAverage.cpp:597
void write_averages(const int &lev)
Definition: ERF_MOSTAverage.cpp:2109
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > m_i_indx
Definition: ERF_MOSTAverage.H:423
void compute_region_averages(const int &lev)
Definition: ERF_MOSTAverage.cpp:1298
amrex::Vector< amrex::MultiFab * > m_z_phys_nd
Definition: ERF_MOSTAverage.H:407
amrex::Vector< int > m_t_init
Definition: ERF_MOSTAverage.H:453
void compute_averages(const int &lev)
Definition: ERF_MOSTAverage.cpp:970
void set_rotated_fields(const int &lev)
Definition: ERF_MOSTAverage.cpp:328
amrex::Vector< amrex::Vector< amrex::Real > > m_total_bndry_area
Definition: ERF_MOSTAverage.H:448
void set_region_normalization(const int &)
Definition: ERF_MOSTAverage.H:126
void set_z_positions_T(const int &lev)
Definition: ERF_MOSTAverage.cpp:805
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_x_pos
Definition: ERF_MOSTAverage.H:420
amrex::Vector< amrex::Real > get_plane_average(const int &lev) const
Definition: ERF_MOSTAverage.H:285
void set_norm_positions_T(const int &lev)
Definition: ERF_MOSTAverage.cpp:875
amrex::Vector< amrex::Real > m_Vsg
Definition: ERF_MOSTAverage.H:460
bool do_time_averaging() const
Definition: ERF_MOSTAverage.H:249
void set_k_indices_T(const int &lev)
Definition: ERF_MOSTAverage.cpp:625
amrex::Vector< amrex::Vector< std::unique_ptr< amrex::MultiFab > > > m_rot_fields
Definition: ERF_MOSTAverage.H:427
bool m_rotate
Definition: ERF_MOSTAverage.H:418
amrex::MultiFab * get_zref(const int &lev) const
Definition: ERF_MOSTAverage.H:313
amrex::Vector< amrex::Vector< amrex::Real > > m_plane_average
Definition: ERF_MOSTAverage.H:432
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_z_pos
Definition: ERF_MOSTAverage.H:422
amrex::Vector< amrex::Vector< int > > m_ncell_plane
Definition: ERF_MOSTAverage.H:431
void set_plane_normalization(const int &lev)
Definition: ERF_MOSTAverage.cpp:388
void write_k_indices(const int &lev)
Definition: ERF_MOSTAverage.cpp:1963
TerrainType m_terrain_type
Definition: ERF_MOSTAverage.H:410
std::string m_pp_prefix
Definition: ERF_MOSTAverage.H:408
void set_time_avg_initialized(const int &lev)
Definition: ERF_MOSTAverage.H:273
bool m_norm_vec
Definition: ERF_MOSTAverage.H:443
int m_nvar
Definition: ERF_MOSTAverage.H:414
int get_navg() const
Definition: ERF_MOSTAverage.H:254
amrex::Real m_fact_new
Definition: ERF_MOSTAverage.H:455
const amrex::iMultiFab * get_k_indices(const int &lev) const
Definition: ERF_MOSTAverage.H:320
int m_ncell_region
Definition: ERF_MOSTAverage.H:437
void set_norm_indices_T(const int &lev)
Definition: ERF_MOSTAverage.cpp:711
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_zref
Definition: ERF_MOSTAverage.H:419
int m_maxlev
Definition: ERF_MOSTAverage.H:416
const amrex::MultiFab * get_average(const int &lev, const int &comp) const
Definition: ERF_MOSTAverage.H:235
void set_eb_normalization(const int &lev)
Definition: ERF_MOSTAverage.cpp:446
bool include_subgrid_vel
Definition: ERF_MOSTAverage.H:459
void update_field_ptrs(const int &lev, amrex::Vector< amrex::Vector< amrex::MultiFab >> &vars_old, amrex::Vector< std::unique_ptr< amrex::MultiFab >> &Theta_prim, amrex::Vector< std::unique_ptr< amrex::MultiFab >> &Qv_prim, amrex::Vector< std::unique_ptr< amrex::MultiFab >> &Qr_prim)
Definition: ERF_MOSTAverage.cpp:308
~MOSTAverage()
Definition: ERF_MOSTAverage.H:39
MOSTAverage(amrex::Vector< amrex::Geometry > geom, const bool &has_zphys, std::string a_pp_prefix, const MeshType &m_mesh_type, const TerrainType &m_terrain_type, const amrex::Vector< const eb_ * > &eb_vec={})
MeshType m_mesh_type
Definition: ERF_MOSTAverage.H:409
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > m_j_indx
Definition: ERF_MOSTAverage.H:424
void set_k_indices_N(const int &lev)
Definition: ERF_MOSTAverage.cpp:535
void make_MOSTAverage_at_level(const int &lev, const amrex::Vector< amrex::MultiFab * > &vars_old, std::unique_ptr< amrex::MultiFab > &Theta_prim, std::unique_ptr< amrex::MultiFab > &Qv_prim, std::unique_ptr< amrex::MultiFab > &Qr_prim, std::unique_ptr< amrex::MultiFab > &z_phys_nd)
Definition: ERF_MOSTAverage.cpp:111
MOSTAverage(MOSTAverage &&) noexcept=default
void write_norm_indices(const int &lev)
Definition: ERF_MOSTAverage.cpp:2010
amrex::Vector< amrex::Vector< amrex::MultiFab * > > m_fields
Definition: ERF_MOSTAverage.H:406
amrex::Vector< int > m_k_in
Definition: ERF_MOSTAverage.H:438
amrex::Vector< const eb_ * > m_eb_vec
Definition: ERF_MOSTAverage.H:447
const amrex::Real zref_default
Definition: ERF_MOSTAverage.H:464
amrex::Real m_fact_old
Definition: ERF_MOSTAverage.H:455
bool time_avg_is_initialized(const int &lev) const
Definition: ERF_MOSTAverage.H:262
bool m_interp
Definition: ERF_MOSTAverage.H:442
const amrex::Vector< amrex::Geometry > m_geom
Definition: ERF_MOSTAverage.H:405
AMREX_GPU_HOST_DEVICE static AMREX_INLINE void trilinear_interp_T(const amrex::Real &xp, const amrex::Real &yp, const amrex::Real &zp, amrex::Real *interp_vals, amrex::Array4< amrex::Real const > const &interp_array, amrex::Array4< amrex::Real const > const &z_arr, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &plo, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dxi, const int interp_comp)
Definition: ERF_MOSTAverage.H:336
void compute_eb_averages(const int &lev)
Definition: ERF_MOSTAverage.cpp:1675
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > m_k_indx
Definition: ERF_MOSTAverage.H:425
Definition: ERF_ConsoleIO.cpp:15