ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_Utils.H
Go to the documentation of this file.
1 #ifndef ERF_UTILS_H_
2 #define ERF_UTILS_H_
3 
4 #include "AMReX.H"
5 #include "AMReX_MultiFab.H"
6 #include "AMReX_BCRec.H"
7 #include "ERF_Constants.H"
8 #include "ERF_DataStruct.H"
9 #include "ERF_IndexDefines.H"
10 #include "ERF_SurfaceLayer.H"
11 #include "ERF_FillPatcher.H"
12 #include "ERF_ReadBndryPlanes.H"
13 
14 /*
15  * Rebalance state to satisfy both EOS and HSE one column at a time
16  */
17 void
18 rebalance_columns (amrex::MultiFab& rho,
19  amrex::MultiFab& theta,
20  const amrex::MultiFab& qt,
21  const amrex::MultiFab& qv,
22  const amrex::MultiFab* z_phys,
23  const amrex::Geometry& geom,
24  const bool& maintain_Th,
25  bool use_sfc = false);
26 
27 /*
28  * Create a new BoxArray in which every grid touches the bottom boundary
29  */
30 void ChopGrids2D (amrex::BoxArray& ba, const amrex::Box& domain, int target_size);
31 
32 /*
33  * Create a new BoxArray with exactly the number of boxes as MPI ranks.
34  * This is designed to work only on the base level which covers the entire domain.
35  */
36 amrex::BoxArray
37 ERFPostProcessBaseGrids (const amrex::Box& domain, bool decompose_in_z);
38 
39 void
40 cons_to_prim(const amrex::MultiFab& cons_state, amrex::MultiFab& S_prim, int ng);
41 
42 void
43 make_qt(const amrex::MultiFab& cons_state, amrex::MultiFab& qt, int n_qstate_into_total);
44 
45 /*
46  * Create the Jacobian for the metric transformation when use_terrain is true
47  */
48 void make_J (const amrex::Geometry& geom,
49  amrex::MultiFab& z_phys_nd,
50  amrex::MultiFab& detJ_cc);
51 
52 void make_areas (const amrex::Geometry& geom,
53  amrex::MultiFab& z_phys_nd,
54  amrex::MultiFab& ax,
55  amrex::MultiFab& ay,
56  amrex::MultiFab& az);
57 
58 /*
59  * Average z_phys_nd on nodes to cell centers
60  */
61 void make_zcc (const amrex::Geometry& geom,
62  amrex::MultiFab& z_phys_nd,
63  amrex::MultiFab& z_phys_cc);
64 
65 /*
66  * Convert momentum to velocity by dividing by density averaged onto faces
67  */
68 void MomentumToVelocity (amrex::MultiFab& xvel_out,
69  amrex::MultiFab& yvel_out,
70  amrex::MultiFab& zvel_out,
71  const amrex::MultiFab& cons_in,
72  const amrex::MultiFab& xmom_in,
73  const amrex::MultiFab& ymom_in,
74  const amrex::MultiFab& zmom_in,
75  const amrex::Box& domain,
76  const amrex::Vector<amrex::BCRec>& domain_bcs_type_h,
77  const amrex::MultiFab* c_vfrac = nullptr // optional
78  );
79 
80 /*
81  * Convert velocity to momentum by multiplying by density averaged onto faces
82  */
83 void VelocityToMomentum (const amrex::MultiFab& xvel_in,
84  const amrex::IntVect & xvel_ngrow,
85  const amrex::MultiFab& yvel_in,
86  const amrex::IntVect & yvel_ngrow,
87  const amrex::MultiFab& zvel_in,
88  const amrex::IntVect & zvel_ngrow,
89  const amrex::MultiFab& cons_in,
90  amrex::MultiFab& xmom_out,
91  amrex::MultiFab& ymom_out,
92  amrex::MultiFab& zmom_out,
93  const amrex::Box& domain,
94  const amrex::Vector<amrex::BCRec>& domain_bcs_type_h,
95  const amrex::MultiFab* c_vfrac = nullptr // optional
96  );
97 
98 /*
99  * Convert (den_div u) to (den_mlt u) by multiplying by (den_mlt/den_div)
100  */
101 void
102 ConvertForProjection (const amrex::MultiFab& den_div, const amrex::MultiFab& den_mlt,
103  amrex::MultiFab& xmom, amrex::MultiFab& ymom, amrex::MultiFab& zmom,
104  const amrex::Box& domain, const amrex::Vector<amrex::BCRec>& domain_bcs_type_h);
105 
106 /*
107  * Compute lateral boundary mass influx/outflux from base-state-density-weighted
108  * boundary normal velocities.
109  */
110 void
111 compute_influx_outflux_bdy (amrex::FArrayBox& bdy_data_xlo, amrex::FArrayBox& bdy_data_xhi,
112  amrex::FArrayBox& bdy_data_ylo, amrex::FArrayBox& bdy_data_yhi,
113  amrex::Array<amrex::MultiFab*, AMREX_SPACEDIM>& area_vec,
114  const amrex::Geometry& geom,
115  amrex::Real& influx, amrex::Real& outflux,
116  const int n);
117 
118 /*
119  * \brief Enforces solvability on lateral boundary data by scaling outflow to
120  * match with inflow.
121  */
122 void enforceInOutSolvability_bdy (const amrex::MultiFab& rho0,
123  amrex::FArrayBox& bdy_data_xlo,
124  amrex::FArrayBox& bdy_data_xhi,
125  amrex::FArrayBox& bdy_data_ylo,
126  amrex::FArrayBox& bdy_data_yhi,
127  amrex::Array<amrex::MultiFab*, AMREX_SPACEDIM>& area_vec,
128  const amrex::Geometry& geom,
129  const amrex::Vector<amrex::BCRec>& domain_bcs_type_h);
130 
131 /*
132  * \brief Enforces solvability by scaling outflow to match with inflow.
133  *
134  */
136  amrex::Array<amrex::MultiFab*, AMREX_SPACEDIM>& vels_vec,
137  amrex::Array<amrex::MultiFab*, AMREX_SPACEDIM>& area_vec,
138  const amrex::Geometry& geom);
139 
140 /*
141  * Compute boxes for looping over interior/exterior ghost cells
142  * for use by fillpatch, erf_slow_rhs_pre, and erf_slow_rhs_post
143  */
144 void realbdy_interior_bxs_xy (const amrex::Box& bx,
145  const amrex::Box& domain,
146  const int& width,
147  amrex::Box& bx_xlo,
148  amrex::Box& bx_xhi,
149  amrex::Box& bx_ylo,
150  amrex::Box& bx_yhi,
151  const amrex::IntVect& ng_vect=amrex::IntVect(0,0,0),
152  const bool get_int_ng=false);
153 
154 /*
155  * Compute boxes for looping over set region cells
156  * for use by fillpatch, erf_slow_rhs_pre, and erf_slow_rhs_post
157  */
158 void realbdy_bc_bxs_xy (const amrex::Box& bx,
159  const amrex::Box& domain,
160  const int& set_width,
161  amrex::Box& bx_xlo,
162  amrex::Box& bx_xhi,
163  amrex::Box& bx_ylo,
164  amrex::Box& bx_yhi,
165  const amrex::IntVect& ng_vect=amrex::IntVect(0,0,0));
166 
167 /*
168  * Compute relaxation region RHS with wrfbdy
169  */
170 void realbdy_compute_interior_ghost_rhs (const double& total_time,
171  const double& delta_t,
172  const double& start_bdy_time,
173  const double& final_bdy_time,
174  const double& bdy_time_interval,
175  const amrex::Real& nudge_factor,
176  int width,
177  const amrex::Geometry& geom,
178  amrex::Vector<amrex::MultiFab>& S_rhs,
179  amrex::Vector<amrex::MultiFab>& S_cur_data,
180  amrex::Vector<amrex::Vector<amrex::FArrayBox>>& bdy_data_xlo,
181  amrex::Vector<amrex::Vector<amrex::FArrayBox>>& bdy_data_xhi,
182  amrex::Vector<amrex::Vector<amrex::FArrayBox>>& bdy_data_ylo,
183  amrex::Vector<amrex::Vector<amrex::FArrayBox>>& bdy_data_yhi,
184  std::unique_ptr<ReadBndryPlanes>& m_r2d,
185  const amrex::Real& c_p,
186  const amrex::Real& rdOcp);
187 
188 /*
189  * Compute relaxation region RHS at fine-crse interface
190  */
191 void
193  const double& delta_t,
194  const int& width,
195  const int& set_width,
196  const amrex::Geometry& geom,
197  ERFFillPatcher* FPr_c,
198  ERFFillPatcher* FPr_u,
199  ERFFillPatcher* FPr_v,
200  ERFFillPatcher* FPr_w,
201  amrex::Vector<amrex::BCRec>& domain_bcs_type,
202  amrex::Vector<amrex::MultiFab>& S_rhs_f,
203  amrex::Vector<amrex::MultiFab>& S_data_f);
204 
205 /*
206  * Accumulate time averaged velocity fields
207  */
208 void
209 Time_Avg_Vel_atCC (double dt,
210  double& t_avg_cnt,
211  amrex::MultiFab* vel_t_avg,
212  amrex::MultiFab& xvel,
213  amrex::MultiFab& yvel,
214  amrex::MultiFab& zvel);
215 
216 /**
217  * Compute the nudging relaxation
218  *
219  * @param[in] delta_t time step
220  * @param[in] icomp component offset
221  * @param[in] num_var number of variables to loop
222  * @param[in] width width of wrf bdy file
223  * @param[in] dom_lo low bound of domain
224  * @param[in] dom_hi high bound of domain
225  * @param[in] F1 drift relaxation parameter
226  * @param[in] bx_xlo box for low x relaxation
227  * @param[in] bx_xhi box for high x relaxation
228  * @param[in] bx_ylo box for low y relaxation
229  * @param[in] bx_yhi box for high y relaxation
230  * @param[in] arr_xlo array for low x relaxation
231  * @param[in] arr_xhi array for high x relaxation
232  * @param[in] arr_ylo array for low y relaxation
233  * @param[in] arr_yhi array for high y relaxation
234  * @param[in] data_arr data array
235  * @param[out] rhs_arr RHS array
236  */
237 AMREX_GPU_HOST
238 AMREX_FORCE_INLINE
239 void
240 realbdy_compute_relaxation (const int& icomp,
241  const int& num_var,
242  const int& width,
243  const amrex::GpuArray<amrex::Real,AMREX_SPACEDIM>& dx,
244  const amrex::GpuArray<amrex::Real,AMREX_SPACEDIM>& ProbLo,
245  const amrex::GpuArray<amrex::Real,AMREX_SPACEDIM>& ProbHi,
246  const amrex::Real& F1,
247  const amrex::Box& bx_xlo,
248  const amrex::Box& bx_xhi,
249  const amrex::Box& bx_ylo,
250  const amrex::Box& bx_yhi,
251  const amrex::Array4<const amrex::Real>& arr_xlo,
252  const amrex::Array4<const amrex::Real>& arr_xhi,
253  const amrex::Array4<const amrex::Real>& arr_ylo,
254  const amrex::Array4<const amrex::Real>& arr_yhi,
255  const amrex::Array4<const amrex::Real>& data_arr,
256  const amrex::Array4<amrex::Real>& rhs_arr,
257  const amrex::Real& c_p,
258  const amrex::Real& rdOcp,
259  const int bdy_moist_nudge_type=0)
260 {
261  amrex::IntVect iv = bx_xlo.type();
262  amrex::Real ioff = (iv[0]==1) ? zero : myhalf;
263  amrex::Real joff = (iv[1]==1) ? zero : myhalf;
264 
265  // These are defined in ERF_Constants.H
266  amrex::Real l_rdOcp = rdOcp;
267  amrex::Real cond_fac = lcond / c_p; // condensation
268  amrex::Real sub_fac = lsub / c_p; // sublimation
269 
270  int nq = num_var;
271 
272  amrex::ParallelFor( bx_xlo, bx_xhi,
273  [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
274  {
275  // Corners with x boxes
276  amrex::Real x = ProbLo[0] + (i + ioff) * dx[0];
277  amrex::Real y = ProbLo[1] + (j + joff) * dx[1];
278  amrex::Real x_end = ProbLo[0] + width * dx[0];
279  amrex::Real y_end = ProbLo[1] + width * dx[1];
280  amrex::Real y_strt = ProbHi[1] - width * dx[1];
281  amrex::Real xi = (x_end - x) / (x_end - ProbLo[0]);
282  amrex::Real eta_lo = (y < y_end ) ? (y_end - y) / (y_end - ProbLo[1]) : zero;
283  amrex::Real eta_hi = (y > y_strt) ? (y - y_strt) / (ProbHi[1] - y_strt) : zero;
284  amrex::Real eta = std::max(eta_lo,eta_hi);
285  amrex::Real Factor = std::max(xi*xi,eta*eta) * F1;
286 
287  if (icomp == RhoQ1_comp)
288  {
289  amrex::Real exner_pi = getExnergivenRTh(data_arr(i,j,k,RhoTheta_comp),l_rdOcp,
290  data_arr(i,j,k,RhoQ1_comp)/data_arr(i,j,k,Rho_comp));
291 
292  // qv
293  amrex::Real delta = arr_xlo(i,j,k,0) - data_arr(i,j,k,icomp);
294  rhs_arr(i,j,k,icomp) += Factor*delta;
295 
296  if (bdy_moist_nudge_type==2) {
297  // qc and heat source term due to evaporation
298  delta = -data_arr(i,j,k,icomp+1); // This effectively nudges to 0
299  rhs_arr(i,j,k,icomp+1 ) += Factor*delta;
300  rhs_arr(i,j,k,RhoTheta_comp) += Factor * delta * cond_fac / exner_pi;
301 
302  for (int n = 2; n < nq; n++) {
303  delta = -data_arr(i,j,k,icomp+n); // This effectively nudges to 0
304  rhs_arr(i,j,k,icomp+n) += Factor*delta;
305  if (nq > 3 && n == 2) { // nq > 3 guarantees that component 2 is ice
306  rhs_arr(i,j,k,RhoTheta_comp) += Factor * delta * sub_fac / exner_pi;
307  }
308  } // n
309  } // moist_nudge_type
310  } else {
311  for (int n = 0; n < nq; n++) {
312  amrex::Real delta = arr_xlo(i,j,k,n) - data_arr(i,j,k,n+icomp);
313  rhs_arr(i,j,k,n+icomp) += Factor*delta;
314  }
315  }
316  },
317  [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
318  {
319  // Corners with x boxes
320  amrex::Real x = ProbLo[0] + (i + ioff) * dx[0];
321  amrex::Real y = ProbLo[1] + (j + joff) * dx[1];
322  amrex::Real x_strt = ProbHi[0] - width * dx[0];
323  amrex::Real y_strt = ProbHi[1] - width * dx[1];
324  amrex::Real y_end = ProbLo[1] + width * dx[1];
325  amrex::Real xi = (x - x_strt) / (ProbHi[0] - x_strt);
326  amrex::Real eta_lo = (y < y_end ) ? (y_end - y) / (y_end - ProbLo[1]) : zero;
327  amrex::Real eta_hi = (y > y_strt) ? (y - y_strt) / (ProbHi[1] - y_strt) : zero;
328  amrex::Real eta = std::max(eta_lo,eta_hi);
329  amrex::Real Factor = std::max(xi*xi,eta*eta) * F1;
330 
331  if (icomp == RhoQ1_comp)
332  {
333  amrex::Real exner_pi = getExnergivenRTh(data_arr(i,j,k,RhoTheta_comp),l_rdOcp,
334  data_arr(i,j,k,RhoQ1_comp)/data_arr(i,j,k,Rho_comp));
335 
336  // qv
337  amrex::Real delta = arr_xhi(i,j,k,0) - data_arr(i,j,k,icomp);
338  rhs_arr(i,j,k,icomp) += Factor*delta;
339 
340  if (bdy_moist_nudge_type==2) {
341  // qc and heat source term due to evaporation
342  delta = -data_arr(i,j,k,icomp+1); // This effectively nudges to 0
343  rhs_arr(i,j,k,icomp+1 ) += Factor*delta;
344  rhs_arr(i,j,k,RhoTheta_comp) += Factor * delta * cond_fac / exner_pi;
345 
346  for (int n = 2; n < nq; n++) {
347  delta = -data_arr(i,j,k,icomp+n); // This effectively nudges to 0
348  rhs_arr(i,j,k,icomp+n) += Factor*delta;
349  if (nq > 3 && n == 2) { // nq > 3 guarantees that component 2 is ice
350  rhs_arr(i,j,k,RhoTheta_comp) += Factor * delta * sub_fac / exner_pi;
351  }
352  } // n
353  } // moist_nudge_type
354  } else {
355  for (int n = 0; n < nq; n++) {
356  amrex::Real delta = arr_xhi(i,j,k,n) - data_arr(i,j,k,n+icomp);
357  rhs_arr(i,j,k,n+icomp) += Factor*delta;
358  }
359  }
360  });
361 
362  amrex::ParallelFor( bx_ylo, bx_yhi,
363  [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
364  {
365  // No corners for y boxes
366  amrex::Real y = ProbLo[1] + (j + joff) * dx[1];
367  amrex::Real y_end = ProbLo[1] + width * dx[1];
368  amrex::Real eta = (y_end - y) / (y_end - ProbLo[1]);
369  amrex::Real Factor = eta*eta * F1;
370 
371  if (icomp == RhoQ1_comp)
372  {
373  amrex::Real exner_pi = getExnergivenRTh(data_arr(i,j,k,RhoTheta_comp),l_rdOcp,
374  data_arr(i,j,k,RhoQ1_comp)/data_arr(i,j,k,Rho_comp));
375  // qv
376  amrex::Real delta = arr_ylo(i,j,k,0) - data_arr(i,j,k,icomp);
377  rhs_arr(i,j,k,icomp) += Factor*delta;
378 
379  if (bdy_moist_nudge_type==2) {
380  // qc and heat source term due to evaporation
381  delta = -data_arr(i,j,k,icomp+1); // This effectively nudges to 0
382  rhs_arr(i,j,k,icomp+1 ) += Factor*delta;
383  rhs_arr(i,j,k,RhoTheta_comp) += Factor * delta * cond_fac / exner_pi;
384 
385  for (int n = 2; n < nq; n++) {
386  delta = -data_arr(i,j,k,icomp+n); // This effectively nudges to 0
387  rhs_arr(i,j,k,icomp+n) += Factor*delta;
388  if (nq > 3 && n == 2) { // nq > 3 guarantees that component 2 is ice
389  rhs_arr(i,j,k,RhoTheta_comp) += Factor * delta * sub_fac / exner_pi;
390  }
391  } // n
392  } // moist_nudge_type
393  } else {
394  for (int n = 0; n < nq; n++) {
395  amrex::Real delta = arr_ylo(i,j,k,n) - data_arr(i,j,k,n+icomp);
396  rhs_arr(i,j,k,n+icomp) += Factor*delta;
397  }
398  }
399  },
400  [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
401  {
402  // No corners for y boxes
403  amrex::Real y = ProbLo[1] + (j + joff) * dx[1];
404  amrex::Real y_strt = ProbHi[1] - width * dx[1];
405  amrex::Real eta = (y - y_strt) / (ProbHi[1] - y_strt);
406  amrex::Real Factor = eta*eta * F1;
407 
408  if (icomp == RhoQ1_comp)
409  {
410  amrex::Real exner_pi = getExnergivenRTh(data_arr(i,j,k,RhoTheta_comp),l_rdOcp,
411  data_arr(i,j,k,RhoQ1_comp)/data_arr(i,j,k,Rho_comp));
412  // qv
413  amrex::Real delta = arr_yhi(i,j,k,0) - data_arr(i,j,k,icomp);
414  rhs_arr(i,j,k,icomp) += Factor*delta;
415 
416  if (bdy_moist_nudge_type==2) {
417  // qc and heat source term due to evaporation
418  delta = -data_arr(i,j,k,icomp+1); // This effectively nudges to 0
419  rhs_arr(i,j,k,icomp+1 ) += Factor*delta;
420  rhs_arr(i,j,k,RhoTheta_comp) += Factor * delta * cond_fac / exner_pi;
421 
422  for (int n = 2; n < nq; n++) {
423  delta = -data_arr(i,j,k,icomp+n); // This effectively nudges to 0
424  rhs_arr(i,j,k,icomp+n) += Factor*delta;
425  if (nq > 3 && n == 2) { // nq > 3 guarantees that component 2 is ice
426  rhs_arr(i,j,k,RhoTheta_comp) += Factor * delta * sub_fac / exner_pi;
427  }
428  } // n
429  } // moist_nudge_type
430  } else {
431  for (int n = 0; n < nq; n++) {
432  amrex::Real delta = arr_yhi(i,j,k,n) - data_arr(i,j,k,n+icomp);
433  rhs_arr(i,j,k,n+icomp) += Factor*delta;
434  }
435  }
436  });
437 }
438 
439 /*
440  * Effectively a Multiply for a MultiFab and an iMultiFab mask
441  */
442 AMREX_GPU_HOST
443 AMREX_FORCE_INLINE
444 void
445 ApplyMask (amrex::MultiFab& dst,
446  const amrex::iMultiFab& imask,
447  const int nghost = 0)
448 {
449  for (amrex::MFIter mfi(dst,amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
450  {
451  const amrex::Box& bx = mfi.growntilebox(nghost);
452  if (bx.ok())
453  {
454  auto dstFab = dst.array(mfi);
455  const auto maskFab = imask.const_array(mfi);
456  ParallelFor(bx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
457  {
458  dstFab(i,j,k) *= maskFab(i,j,k);
459  });
460  }
461  }
462 }
463 
464 AMREX_GPU_HOST
465 AMREX_FORCE_INLINE
466 void
467 ApplyInvertedMask (amrex::MultiFab& dst,
468  const amrex::iMultiFab& imask,
469  const int nghost = 0)
470 {
471  for (amrex::MFIter mfi(dst,amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
472  {
473  const amrex::Box& bx = mfi.growntilebox(nghost);
474  if (bx.ok())
475  {
476  auto dstFab = dst.array(mfi);
477  const auto maskFab = imask.const_array(mfi);
478  ParallelFor(bx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
479  {
480  dstFab(i,j,k) *= (1-maskFab(i,j,k));
481  });
482  }
483  }
484 }
485 
486 void
487 thinbody_wall_dist (std::unique_ptr<amrex::MultiFab>& wdist,
488  amrex::Vector<amrex::IntVect>& xfaces,
489  amrex::Vector<amrex::IntVect>& yfaces,
490  amrex::Vector<amrex::IntVect>& zfaces,
491  const amrex::Geometry& geomdata,
492  std::unique_ptr<amrex::MultiFab>& z_phys_cc);
493 
494 
495 void WeatherDataInterpolation(const double time);
496 
497 AMREX_GPU_HOST_DEVICE
498 AMREX_FORCE_INLINE
502  amrex::Real z1, amrex::Real p1,
503  amrex::Real z2, amrex::Real p2)
504 {
505  return p0 * ( (z - z1) * (z - z2) ) / ( (z0 - z1) * (z0 - z2) )
506  + p1 * ( (z - z0) * (z - z2) ) / ( (z1 - z0) * (z1 - z2) )
507  + p2 * ( (z - z0) * (z - z1) ) / ( (z2 - z0) * (z2 - z1) );
508 }
509 
510 #endif
constexpr amrex::Real lsub
Definition: ERF_Constants.H:111
constexpr amrex::Real zero
Definition: ERF_Constants.H:8
constexpr amrex::Real lcond
Definition: ERF_Constants.H:109
constexpr amrex::Real myhalf
Definition: ERF_Constants.H:13
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real getExnergivenRTh(const amrex::Real rhotheta, const amrex::Real rdOcp, const amrex::Real qv=amrex::Real(0))
Definition: ERF_EOS.H:156
#define Rho_comp
Definition: ERF_IndexDefines.H:36
#define RhoTheta_comp
Definition: ERF_IndexDefines.H:37
#define RhoQ1_comp
Definition: ERF_IndexDefines.H:42
Real z0
Definition: ERF_InitCustomPertVels_ScalarAdvDiff.H:8
const Real dx
Definition: ERF_InitCustomPert_ABL.H:23
const Real rdOcp
Definition: ERF_InitCustomPert_Bomex.H:16
rho
Definition: ERF_InitCustomPert_Bubble.H:107
ParallelFor(grown_box, [=] AMREX_GPU_DEVICE(int i, int j, int k) { qrcuten_arr(i, j, k)=Real(0);qscuten_arr(i, j, k)=Real(0);qicuten_arr(i, j, k)=Real(0);})
amrex::Real Real
Definition: ERF_ShocInterface.H:19
void realbdy_compute_interior_ghost_rhs(const double &total_time, const double &delta_t, const double &start_bdy_time, const double &final_bdy_time, const double &bdy_time_interval, const amrex::Real &nudge_factor, int width, const amrex::Geometry &geom, amrex::Vector< amrex::MultiFab > &S_rhs, amrex::Vector< amrex::MultiFab > &S_cur_data, amrex::Vector< amrex::Vector< amrex::FArrayBox >> &bdy_data_xlo, amrex::Vector< amrex::Vector< amrex::FArrayBox >> &bdy_data_xhi, amrex::Vector< amrex::Vector< amrex::FArrayBox >> &bdy_data_ylo, amrex::Vector< amrex::Vector< amrex::FArrayBox >> &bdy_data_yhi, std::unique_ptr< ReadBndryPlanes > &m_r2d, const amrex::Real &c_p, const amrex::Real &rdOcp)
void WeatherDataInterpolation(const double time)
void MomentumToVelocity(amrex::MultiFab &xvel_out, amrex::MultiFab &yvel_out, amrex::MultiFab &zvel_out, const amrex::MultiFab &cons_in, const amrex::MultiFab &xmom_in, const amrex::MultiFab &ymom_in, const amrex::MultiFab &zmom_in, const amrex::Box &domain, const amrex::Vector< amrex::BCRec > &domain_bcs_type_h, const amrex::MultiFab *c_vfrac=nullptr)
void compute_influx_outflux_bdy(amrex::FArrayBox &bdy_data_xlo, amrex::FArrayBox &bdy_data_xhi, amrex::FArrayBox &bdy_data_ylo, amrex::FArrayBox &bdy_data_yhi, amrex::Array< amrex::MultiFab *, AMREX_SPACEDIM > &area_vec, const amrex::Geometry &geom, amrex::Real &influx, amrex::Real &outflux, const int n)
void VelocityToMomentum(const amrex::MultiFab &xvel_in, const amrex::IntVect &xvel_ngrow, const amrex::MultiFab &yvel_in, const amrex::IntVect &yvel_ngrow, const amrex::MultiFab &zvel_in, const amrex::IntVect &zvel_ngrow, const amrex::MultiFab &cons_in, amrex::MultiFab &xmom_out, amrex::MultiFab &ymom_out, amrex::MultiFab &zmom_out, const amrex::Box &domain, const amrex::Vector< amrex::BCRec > &domain_bcs_type_h, const amrex::MultiFab *c_vfrac=nullptr)
void rebalance_columns(amrex::MultiFab &rho, amrex::MultiFab &theta, const amrex::MultiFab &qt, const amrex::MultiFab &qv, const amrex::MultiFab *z_phys, const amrex::Geometry &geom, const bool &maintain_Th, bool use_sfc=false)
void cons_to_prim(const amrex::MultiFab &cons_state, amrex::MultiFab &S_prim, int ng)
void enforceInOutSolvability_bdy(const amrex::MultiFab &rho0, amrex::FArrayBox &bdy_data_xlo, amrex::FArrayBox &bdy_data_xhi, amrex::FArrayBox &bdy_data_ylo, amrex::FArrayBox &bdy_data_yhi, amrex::Array< amrex::MultiFab *, AMREX_SPACEDIM > &area_vec, const amrex::Geometry &geom, const amrex::Vector< amrex::BCRec > &domain_bcs_type_h)
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real quad_interp_1d(amrex::Real z, amrex::Real z0, amrex::Real p0, amrex::Real z1, amrex::Real p1, amrex::Real z2, amrex::Real p2)
Definition: ERF_Utils.H:500
void fine_compute_interior_ghost_rhs(const double &time, const double &delta_t, const int &width, const int &set_width, const amrex::Geometry &geom, ERFFillPatcher *FPr_c, ERFFillPatcher *FPr_u, ERFFillPatcher *FPr_v, ERFFillPatcher *FPr_w, amrex::Vector< amrex::BCRec > &domain_bcs_type, amrex::Vector< amrex::MultiFab > &S_rhs_f, amrex::Vector< amrex::MultiFab > &S_data_f)
void thinbody_wall_dist(std::unique_ptr< amrex::MultiFab > &wdist, amrex::Vector< amrex::IntVect > &xfaces, amrex::Vector< amrex::IntVect > &yfaces, amrex::Vector< amrex::IntVect > &zfaces, const amrex::Geometry &geomdata, std::unique_ptr< amrex::MultiFab > &z_phys_cc)
amrex::BoxArray ERFPostProcessBaseGrids(const amrex::Box &domain, bool decompose_in_z)
void make_zcc(const amrex::Geometry &geom, amrex::MultiFab &z_phys_nd, amrex::MultiFab &z_phys_cc)
void realbdy_bc_bxs_xy(const amrex::Box &bx, const amrex::Box &domain, const int &set_width, amrex::Box &bx_xlo, amrex::Box &bx_xhi, amrex::Box &bx_ylo, amrex::Box &bx_yhi, const amrex::IntVect &ng_vect=amrex::IntVect(0, 0, 0))
void Time_Avg_Vel_atCC(double dt, double &t_avg_cnt, amrex::MultiFab *vel_t_avg, amrex::MultiFab &xvel, amrex::MultiFab &yvel, amrex::MultiFab &zvel)
void realbdy_interior_bxs_xy(const amrex::Box &bx, const amrex::Box &domain, const int &width, amrex::Box &bx_xlo, amrex::Box &bx_xhi, amrex::Box &bx_ylo, amrex::Box &bx_yhi, const amrex::IntVect &ng_vect=amrex::IntVect(0, 0, 0), const bool get_int_ng=false)
AMREX_GPU_HOST AMREX_FORCE_INLINE void realbdy_compute_relaxation(const int &icomp, const int &num_var, const int &width, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dx, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &ProbLo, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &ProbHi, const amrex::Real &F1, const amrex::Box &bx_xlo, const amrex::Box &bx_xhi, const amrex::Box &bx_ylo, const amrex::Box &bx_yhi, const amrex::Array4< const amrex::Real > &arr_xlo, const amrex::Array4< const amrex::Real > &arr_xhi, const amrex::Array4< const amrex::Real > &arr_ylo, const amrex::Array4< const amrex::Real > &arr_yhi, const amrex::Array4< const amrex::Real > &data_arr, const amrex::Array4< amrex::Real > &rhs_arr, const amrex::Real &c_p, const amrex::Real &rdOcp, const int bdy_moist_nudge_type=0)
Definition: ERF_Utils.H:240
AMREX_GPU_HOST AMREX_FORCE_INLINE void ApplyInvertedMask(amrex::MultiFab &dst, const amrex::iMultiFab &imask, const int nghost=0)
Definition: ERF_Utils.H:467
void make_J(const amrex::Geometry &geom, amrex::MultiFab &z_phys_nd, amrex::MultiFab &detJ_cc)
AMREX_GPU_HOST AMREX_FORCE_INLINE void ApplyMask(amrex::MultiFab &dst, const amrex::iMultiFab &imask, const int nghost=0)
Definition: ERF_Utils.H:445
void ConvertForProjection(const amrex::MultiFab &den_div, const amrex::MultiFab &den_mlt, amrex::MultiFab &xmom, amrex::MultiFab &ymom, amrex::MultiFab &zmom, const amrex::Box &domain, const amrex::Vector< amrex::BCRec > &domain_bcs_type_h)
void ChopGrids2D(amrex::BoxArray &ba, const amrex::Box &domain, int target_size)
void enforceInOutSolvability(int lev, amrex::Array< amrex::MultiFab *, AMREX_SPACEDIM > &vels_vec, amrex::Array< amrex::MultiFab *, AMREX_SPACEDIM > &area_vec, const amrex::Geometry &geom)
void make_areas(const amrex::Geometry &geom, amrex::MultiFab &z_phys_nd, amrex::MultiFab &ax, amrex::MultiFab &ay, amrex::MultiFab &az)
void make_qt(const amrex::MultiFab &cons_state, amrex::MultiFab &qt, int n_qstate_into_total)
Definition: ERF_FillPatcher.H:9
@ ymom
Definition: ERF_IndexDefines.H:195
@ zmom
Definition: ERF_IndexDefines.H:196
@ xmom
Definition: ERF_IndexDefines.H:194
@ theta
Definition: ERF_MM5.H:20
@ qt
Definition: ERF_Kessler.H:29
@ qv
Definition: ERF_Kessler.H:30
@ ng
Definition: ERF_Morrison.H:49
@ xvel
Definition: ERF_IndexDefines.H:176
@ zvel
Definition: ERF_IndexDefines.H:178
@ yvel
Definition: ERF_IndexDefines.H:177
real(c_double), parameter p0
Definition: ERF_module_model_constants.F90:40