Initialize a problem-specific terrain profile on the nodal terrain FAB.
28 bool test_mapfactor =
false;
29 pp.query(
"test_mapfactor",test_mapfactor);
39 auto dx = geom.CellSizeArray();
40 auto ProbLoArr = geom.ProbLoArray();
41 auto ProbHiArr = geom.ProbHiArray();
43 const amrex::Box& domain = geom.Domain();
44 int domlo_x = domain.smallEnd(0);
int domhi_x = domain.bigEnd(0) + 1;
45 int domlo_y = domain.smallEnd(1);
int domhi_y = domain.bigEnd(1) + 1;
46 int domlo_z = domain.smallEnd(2);
51 Real xcen =
myhalf * (ProbLoArr[0] + ProbHiArr[0]) / mf_m;
52 Real ycen =
myhalf * (ProbLoArr[1] + ProbHiArr[1]) / mf_m;
57 std::string custom_terrain_type =
"None";
58 ParmParse
pp_prob(
"prob");
pp_prob.query(
"custom_terrain_type", custom_terrain_type);
60 amrex::Box zbx = terrain_fab.box();
61 if (zbx.smallEnd(2) <= k0)
63 amrex::Array4<Real>
const& z_arr = terrain_fab.array();
65 if (custom_terrain_type ==
"WoA") {
68 int dir = 0;
pp_prob.query(
"dir", dir);
78 ParallelFor(zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
81 int ii = amrex::min(amrex::max(i,domlo_x),domhi_x);
84 Real x = (ProbLoArr[0] + ii *
dx[0] - xcen) * mf_m;
88 z_arr(i,j,k0) =
num / (
x*
x + 4 * a * a);
91 z_arr(i,j,k0) = hm / (1 + x_L*x_L) + z_offset;
94 }
else if (dir == 1) {
95 ParallelFor(zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
98 int jj = amrex::min(amrex::max(j,domlo_y),domhi_y);
101 Real y = (ProbLoArr[1] + jj *
dx[1] - ycen) * mf_m;
105 z_arr(i,j,k0) =
num / (
y*
y +
Real(4.0) * a * a);
108 z_arr(i,j,k0) = hm / (
one + y_L*y_L) + z_offset;
111 }
else if (dir == 2) {
112 ParallelFor(zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
115 int ii = amrex::min(amrex::max(i,domlo_x),domhi_x);
116 int jj = amrex::min(amrex::max(j,domlo_y),domhi_y);
119 Real x = (ProbLoArr[0] + ii *
dx[0] - xcen) * mf_m;
120 Real y = (ProbLoArr[1] + jj *
dx[1] - ycen) * mf_m;
121 Real r = std::sqrt(x*x + y*y);
125 z_arr(i,j,k0) =
num / (r*r +
Real(4.0) * a * a);
128 z_arr(i,j,k0) = hm / (
one + r_L*r_L) + z_offset;
132 amrex::Abort(
"Unknown dir in ERF_Prob.cpp");
135 }
else if (custom_terrain_type ==
"ScharMountain") {
141 ParallelFor(zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
144 int ii = amrex::min(amrex::max(i,domlo_x),domhi_x);
147 Real x = (ProbLoArr[0] + ii *
dx[0] - xcen);
149 Real cosx = std::cos(
PI * x / lambda);
151 z_arr(i,j,k0) = Hm * std::exp(-x*x/asq) * cosx * cosx;
154 }
else if (custom_terrain_type ==
"HalfCylinder") {
158 ParallelFor(zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
161 int ii = amrex::min(amrex::max(i,domlo_x),domhi_x);
164 Real x = (ProbLoArr[0] + ii *
dx[0] - xcen);
169 z_arr(i,j,k0) = std::sqrt(asq - rsq);
171 z_arr(i,j,k0) =
zero;
175 }
else if (custom_terrain_type ==
"Hemisphere") {
179 ParallelFor(zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
182 int ii = amrex::min(amrex::max(i,domlo_x),domhi_x);
183 int jj = amrex::min(amrex::max(j,domlo_y),domhi_y);
186 Real x = (ProbLoArr[0] + ii *
dx[0] - xcen);
187 Real y = (ProbLoArr[1] + jj *
dx[1] - ycen);
192 z_arr(i,j,k0) = std::pow(asq-rsq,
myhalf);
194 z_arr(i,j,k0) =
zero;
198 }
else if (custom_terrain_type ==
"MovingSineWave") {
207 Real time =
static_cast<Real>(time_d);
209 ParallelFor(zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
212 int ii = amrex::min(amrex::max(i,domlo_x),domhi_x);
224 }
else if (custom_terrain_type ==
"WindFarmTest") {
226 ParallelFor(zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
229 int ii = amrex::min(amrex::max(i,domlo_x),domhi_x);
230 int jj = amrex::min(amrex::max(j,domlo_y),domhi_y);
233 Real x = (ProbLoArr[0] + ii *
dx[0] - xcen);
234 Real y = (ProbLoArr[1] + jj *
dx[1] - ycen);
239 z_arr(i,j,k0) =
Real(100.0) / (
one + x_L*x_L + y_L*y_L);
242 }
else if (custom_terrain_type ==
"RaisedFlat") {
244 ParallelFor(zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
246 z_arr(i,j,k0) = z_offset;
248 }
else if (custom_terrain_type ==
"Cos4Hill") {
256 ParallelFor(zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
260 int ii = amrex::min(amrex::max(i,domlo_x),domhi_x);
261 int jj = amrex::min(amrex::max(j,domlo_y),domhi_y);
264 Real x = (ProbLoArr[0] + ii *
dx[0] - xcen);
265 Real y = (ProbLoArr[1] + jj *
dx[1] - ycen);
266 Real r = std::sqrt(x*x + y*y);
269 z_arr(i,j,k0) = z_offset + hm *
Real(0.0625) * std::pow(
one + std::cos(
PI*r/fourL),
four);
271 z_arr(i,j,k0) = z_offset;
275 }
else if (custom_terrain_type ==
"None") {
276 ParallelFor(zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
278 z_arr(i,j,k0) =
zero;
281 Abort(
"Don't know this custom_terrain_type");
constexpr amrex::Real four
Definition: ERF_Constants.H:12
constexpr amrex::Real two
Definition: ERF_Constants.H:10
constexpr amrex::Real one
Definition: ERF_Constants.H:9
constexpr amrex::Real zero
Definition: ERF_Constants.H:8
constexpr amrex::Real myhalf
Definition: ERF_Constants.H:13
constexpr amrex::Real PI
Definition: ERF_Constants.H:42
constexpr amrex::Real CONST_GRAV
Definition: ERF_Constants.H:64
@ num
Definition: ERF_DataStruct.H:27
const Real dx
Definition: ERF_InitCustomPert_ABL.H:23
ParmParse pp_prob("prob")
Real Ampl
Definition: ERF_InitCustomPert_MovingTerrain.H:4
Real wavelength
Definition: ERF_InitCustomPert_MovingTerrain.H:5
Real kp
Definition: ERF_InitCustomPert_MovingTerrain.H:8
Real height
Definition: ERF_InitCustomPert_SquallLine.H:33
ParallelFor(fab_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
@ omega
Definition: ERF_Morrison.H:54
real(c_double), parameter g
Definition: ERF_module_model_constants.F90:19