Initialize staggered z-levels and grid spacing for all levels.
Every grid starts at geometry.prob_lo[2]: the uniform and stretched grids are built up from it, and erf.terrain_z_levels must begin there.
36 int max_level = zlevels_stag.size()-1;
38 for (
int lev = 0; lev <= max_level; lev++)
40 auto dx = geom[lev].CellSizeArray();
41 const Box& domain = geom[lev].Domain();
42 int nz = domain.length(2);
44 zlevels_stag[lev].resize(nz+1);
46 stretched_dz_h[lev].resize(domain.length(2));
48 if (grid_stretching_ratio == 0 && !(dz0 > 0)) {
50 const Real zsurf = geom[lev].ProbLo(2);
51 for (
int k = 0; k < nz+1; k++)
53 zlevels_stag[lev][k] = zsurf + k *
dx[2];
55 for (
int k = 0; k < nz; k++)
57 stretched_dz_h[lev][k] =
dx[2];
59 }
else if (lev == 0 && grid_stretching_ratio == 0) {
63 #ifdef AMREX_USE_FLOAT
68 const Real zsurf = geom[lev].ProbLo(2);
69 const Real depth = geom[lev].ProbHi(2) - zsurf;
73 "Newton iterations to determine the grid stretching factor failed!\n");
75 Print() <<
"Note: erf.initial_dz = " << dz0 <<
" is no thinner than the uniform "
76 <<
"spacing, so the vertical grid is uniform with dz = " << gs.
dz0 << std::endl;
78 Print() <<
"Building a stretched grid with dz0: " << gs.
dz0
79 <<
" and stretching factor: " << gs.
ratio << std::endl;
81 Print() <<
"Stretched grid levels at level : " << lev <<
" is " << zsurf;
82 for (
int k = 0; k < nz+1; k++)
84 zlevels_stag[lev][k] += zsurf;
86 stretched_dz_h[lev][k-1] = zlevels_stag[lev][k] - zlevels_stag[lev][k-1];
87 Print() <<
" " << zlevels_stag[lev][k];
91 }
else if (lev == 0) {
93 const Real zsurf = geom[lev].ProbLo(2);
94 zlevels_stag[lev][0] = zsurf;
96 Print() <<
"Stretched grid levels at level : " << lev <<
" is " << zsurf;
97 for (
int k = 1; k < nz+1; k++)
99 stretched_dz_h[lev][k-1] =
dz;
100 zlevels_stag[lev][k] = zlevels_stag[lev][k-1] +
dz;
101 Print() <<
" " << zlevels_stag[lev][k];
102 dz *= grid_stretching_ratio;
104 Print() << std::endl;
105 }
else if (lev > 0) {
106 int rr = ref_ratio[lev-1][2];
108 for (
int k = 0; k < nz; k++)
110 stretched_dz_h[lev][k] = (zlevels_stag[lev][k+1] - zlevels_stag[lev][k]);
119 int n_zlevels =
pp.countval(
"terrain_z_levels");
122 int nz = geom[0].Domain().length(2);
123 if (n_zlevels != nz+1) {
124 Print() <<
"You supplied " << n_zlevels <<
" staggered terrain_z_levels " << std::endl;
125 Print() <<
"but n_cell+1 in the z-direction is " << nz+1 << std::endl;
126 Abort(
"You must specify a z_level for every value of k");
129 if (grid_stretching_ratio > 0) {
130 Print() <<
"Note: Found terrain_z_levels, ignoring grid_stretching_ratio" << std::endl;
131 }
else if (dz0 > 0) {
132 Print() <<
"Note: Found terrain_z_levels, ignoring initial_dz" << std::endl;
135 pp.getarr(
"terrain_z_levels", zlevels_stag[0], 0, nz+1);
140 if (zlevels_stag[0][0] != geom[0].ProbLo(2)) {
141 Abort(
"erf.terrain_z_levels must start at geometry.prob_lo[2] = " +
142 std::to_string(geom[0].ProbLo(2)) +
", not at " +
143 std::to_string(zlevels_stag[0][0]));
146 for (
int lev = 1; lev <= max_level; lev++) {
147 int rr = ref_ratio[lev-1][2];
151 for (
int lev = 0; lev <= max_level; lev++) {
152 int nz_zlevs = zlevels_stag[lev].size();
153 for (
int k = 0; k < nz_zlevs-1; k++)
155 stretched_dz_h[lev][k] = (zlevels_stag[lev][k+1] - zlevels_stag[lev][k]);
160 for (
int lev = 0; lev <= max_level; lev++) {
161 stretched_dz_d[lev].resize(stretched_dz_h[lev].size());
162 Gpu::copy(Gpu::hostToDevice, stretched_dz_h[lev].begin(), stretched_dz_h[lev].end(), stretched_dz_d[lev].begin());
const Real dx
Definition: ERF_InitCustomPert_ABL.H:44
AMREX_ALWAYS_ASSERT_WITH_MESSAGE(axis >=0 &&axis< AMREX_SPACEDIM, "prob.axis must be 0, 1 or 2")
AMREX_FORCE_INLINE void expand_and_interpolate_1d(amrex::Vector< amrex::Real > &znew, const amrex::Vector< amrex::Real > &zorig, int refine_fac, bool destag=false)
Definition: ERF_Interpolation_1D.H:95
amrex::Real Real
Definition: ERF_ShocInterface.H:19
@ dz
Definition: ERF_AdvanceWDM6.cpp:273
GeometricStretch build_geometric_zlevels(amrex::Vector< amrex::Real > &zlevels, amrex::Real dz0, amrex::Real z_top, amrex::Real tol)
Fill a staggered z-level array with a geometrically stretched grid.
Definition: ERF_GridUtils.H:274
real(c_double), private rr
Definition: ERF_module_mp_morr_two_moment.F90:224
A geometrically stretched vertical grid: dz_k = dz0 * ratio^k.
Definition: ERF_GridUtils.H:172
amrex::Real ratio
layer-to-layer stretch factor
Definition: ERF_GridUtils.H:174
bool converged
true when |residual| <= tol
Definition: ERF_GridUtils.H:177
bool uniform
true when the requested dz0 could not be honored
Definition: ERF_GridUtils.H:176
amrex::Real dz0
thickness of the first layer, as actually used
Definition: ERF_GridUtils.H:173