ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_InitCustomPertVels_Terrain3DHemisphere.H
Go to the documentation of this file.
1 
2  amrex::Gpu::streamSynchronize();
3  ParmParse pp_for_pert_vels("prob");
4  Real U_0 = 0.0; pp_for_pert_vels.query("U_0", U_0);
5  Real V_0 = 0.0; pp_for_pert_vels.query("V_0", V_0);
6  Real U_0_Pert_Mag = 0.0; pp_for_pert_vels.query("U_0_Pert_Mag", U_0_Pert_Mag);
7  Real V_0_Pert_Mag = 0.0; pp_for_pert_vels.query("V_0_Pert_Mag", V_0_Pert_Mag);
8  Real W_0_Pert_Mag = 0.0; pp_for_pert_vels.query("W_0_Pert_Mag", W_0_Pert_Mag);
9  Real pert_deltaU = 0.0; pp_for_pert_vels.query("pert_deltaU", pert_deltaU);
10  Real pert_deltaV = 0.0; pp_for_pert_vels.query("pert_deltaV", pert_deltaV);
11  Real pert_periods_U = 5.0; pp_for_pert_vels.query("pert_periods_U", pert_periods_U);
12  Real pert_periods_V = 5.0; pp_for_pert_vels.query("pert_periods_V", pert_periods_V);;
13  Real pert_ref_height = 1.0; pp_for_pert_vels.query("pert_ref_height", pert_ref_height);
14 
15  pp_for_pert_vels.query("pert_ref_height", pert_ref_height);
16 
17  // Real aval = pert_periods_U * 2.0 * PI / (probhi[1] - problo[1]);
18  // Real ufac = pert_deltaU * std::exp(0.5) / pert_ref_height;
19 
20  const Real* problo = geomdata.ProbLo();
21  const Real* probhi = geomdata.ProbHi();
22 
23  Real bval = pert_periods_V * 2.0 * PI / (probhi[0] - problo[0]);
24  Real vfac = pert_deltaV * std::exp(0.5) / pert_ref_height;
25 
26  const bool use_terrain = (SolverChoice::terrain_type != TerrainType::None);
27 
28  // Set the x-velocity
29  ParallelForRNG(xbx, [=] AMREX_GPU_DEVICE(int i, int j, int k, const amrex::RandomEngine& engine) noexcept
30  {
31  const Real* prob_lo = geomdata.ProbLo();
32  const Real* dx = geomdata.CellSize();
33  const Real z = use_terrain ? 0.25*( z_nd(i,j ,k) + z_nd(i,j ,k+1)
34  + z_nd(i,j+1,k) + z_nd(i,j+1,k+1) )
35  : prob_lo[2] + (k + 0.5) * dx[2];
36 
37  x_vel_pert(i, j, k) = 0.0;
38  if ((z <= pert_ref_height) && (U_0_Pert_Mag != 0.0))
39  {
40  Real rand_double = amrex::Random(engine); // Between 0.0 and 1.0
41  Real x_vel_prime = (rand_double*2.0 - 1.0)*U_0_Pert_Mag;
42  x_vel_pert(i, j, k) += x_vel_prime;
43  }
44  });
45 
46  // Set the y-velocity
47  ParallelForRNG(ybx, [=] AMREX_GPU_DEVICE(int i, int j, int k, const amrex::RandomEngine& engine) noexcept
48  {
49  const Real* prob_lo = geomdata.ProbLo();
50  const Real* dx = geomdata.CellSize();
51  const Real x = prob_lo[0] + (i + 0.5) * dx[0];
52  const Real z = use_terrain ? 0.25*( z_nd(i ,j,k) + z_nd(i ,j,k+1)
53  + z_nd(i+1,j,k) + z_nd(i+1,j,k+1) )
54  : prob_lo[2] + (k + 0.5) * dx[2];
55 
56  // Set the y-velocity
57  y_vel_pert(i, j, k) = 0.0;
58  if ((z <= pert_ref_height) && (V_0_Pert_Mag != 0.0))
59  {
60  Real rand_double = amrex::Random(engine); // Between 0.0 and 1.0
61  Real y_vel_prime = (rand_double*2.0 - 1.0)*V_0_Pert_Mag;
62  y_vel_pert(i, j, k) += y_vel_prime;
63  }
64  if (pert_deltaV != 0.0)
65  {
66  const Real xl = x - prob_lo[0];
67  const Real zl = z / pert_ref_height;
68  const Real damp = std::exp(-0.5 * zl * zl);
69  y_vel_pert(i, j, k) += vfac * damp * z * std::cos(bval * xl);
70  }
71  });
72 
73  const auto dx = geomdata.CellSize();
74  amrex::GpuArray<Real, AMREX_SPACEDIM> dxInv;
75  dxInv[0] = 1. / dx[0];
76  dxInv[1] = 1. / dx[1];
77  dxInv[2] = 1. / dx[2];
78 
79  // Set the z-velocity from impenetrable condition
80  ParallelForRNG(zbx, [=] AMREX_GPU_DEVICE(int i, int j, int k, const amrex::RandomEngine& engine) noexcept
81  {
82  const int dom_lo_z = geomdata.Domain().smallEnd()[2];
83  const int dom_hi_z = geomdata.Domain().bigEnd()[2];
84 
85  // Set the z-velocity
86  if (k == dom_lo_z || k == dom_hi_z+1)
87  {
88  z_vel_pert(i, j, k) = 0.0;
89  }
90  else if (W_0_Pert_Mag != 0.0)
91  {
92  Real rand_double = amrex::Random(engine); // Between 0.0 and 1.0
93  Real z_vel_prime = (rand_double*2.0 - 1.0)*W_0_Pert_Mag;
94  z_vel_pert(i, j, k) = z_vel_prime;
95  }
96  });
constexpr amrex::Real PI
Definition: ERF_Constants.H:6
const bool use_terrain
Definition: ERF_InitCustomPertVels_Terrain3DHemisphere.H:26
Real bval
Definition: ERF_InitCustomPertVels_Terrain3DHemisphere.H:23
Real W_0_Pert_Mag
Definition: ERF_InitCustomPertVels_Terrain3DHemisphere.H:8
const Real * problo
Definition: ERF_InitCustomPertVels_Terrain3DHemisphere.H:20
Real pert_ref_height
Definition: ERF_InitCustomPertVels_Terrain3DHemisphere.H:13
ParmParse pp_for_pert_vels("prob")
Real U_0_Pert_Mag
Definition: ERF_InitCustomPertVels_Terrain3DHemisphere.H:6
Real pert_periods_V
Definition: ERF_InitCustomPertVels_Terrain3DHemisphere.H:12
Real vfac
Definition: ERF_InitCustomPertVels_Terrain3DHemisphere.H:24
Real pert_deltaV
Definition: ERF_InitCustomPertVels_Terrain3DHemisphere.H:10
Real U_0
Definition: ERF_InitCustomPertVels_Terrain3DHemisphere.H:4
ParallelForRNG(xbx, [=] AMREX_GPU_DEVICE(int i, int j, int k, const amrex::RandomEngine &engine) noexcept { const Real *prob_lo=geomdata.ProbLo();const Real *dx=geomdata.CellSize();const Real z=use_terrain ? 0.25 *(z_nd(i, j, k)+z_nd(i, j, k+1)+z_nd(i, j+1, k)+z_nd(i, j+1, k+1)) :prob_lo[2]+(k+0.5) *dx[2];x_vel_pert(i, j, k)=0.0;if((z<=pert_ref_height) &&(U_0_Pert_Mag !=0.0)) { Real rand_double=amrex::Random(engine);Real x_vel_prime=(rand_double *2.0 - 1.0) *U_0_Pert_Mag;x_vel_pert(i, j, k)+=x_vel_prime;} })
Real V_0
Definition: ERF_InitCustomPertVels_Terrain3DHemisphere.H:5
Real pert_deltaU
Definition: ERF_InitCustomPertVels_Terrain3DHemisphere.H:9
Real pert_periods_U
Definition: ERF_InitCustomPertVels_Terrain3DHemisphere.H:11
const auto dx
Definition: ERF_InitCustomPertVels_Terrain3DHemisphere.H:73
Real V_0_Pert_Mag
Definition: ERF_InitCustomPertVels_Terrain3DHemisphere.H:7
amrex::GpuArray< Real, AMREX_SPACEDIM > dxInv
Definition: ERF_InitCustomPertVels_Terrain3DHemisphere.H:74
const Real * probhi
Definition: ERF_InitCustomPertVels_Terrain3DHemisphere.H:21
const amrex::Real * prob_lo
Definition: ERF_InitCustomPert_IsentropicVortex.H:16
const Box zbx
Definition: ERF_SetupDiff.H:9
const Box xbx
Definition: ERF_SetupDiff.H:7
const Box ybx
Definition: ERF_SetupDiff.H:8
amrex::Real Real
Definition: ERF_ShocInterface.H:19
static TerrainType terrain_type
Definition: ERF_DataStruct.H:1056