Compute the vertical perturbational gravitational force density [N/m^3] used by the dry-momentum equation. Compressible selector values 1–4 select density, temperature (2 and 3 are identical), or potential- temperature formulations. Anelastic flow dispatches to its active dry or moist kernel independently of the stored selector.
46 BL_PROFILE(
"make_buoyancy()");
48 const Array<Real,AMREX_SPACEDIM> grav{
zero,
zero, -solverChoice.
gravity};
49 const GpuArray<Real,AMREX_SPACEDIM> grav_gpu{grav[0], grav[1], grav[2]};
51 const int klo = geom.Domain().smallEnd()[2];
52 const int khi = geom.Domain().bigEnd()[2] + 1;
60 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
62 for ( MFIter mfi(buoyancy,TilingIfNotGPU()); mfi.isValid(); ++mfi)
64 Box tbz = mfi.tilebox();
67 if (tbz.smallEnd(2) ==
klo) tbz.growLo(2,-1);
68 if (tbz.bigEnd(2) ==
khi) tbz.growHi(2,-1);
70 const Array4<const Real> & cell_data = S_data[
IntVars::cons].array(mfi);
71 const Array4<const Real> & cell_prim = S_prim.array(mfi);
72 const Array4<const Real> & qt_arr =
qt.array(mfi);
73 const Array4< Real> & buoyancy_fab = buoyancy.array(mfi);
76 const Array4<const Real>& r0_arr =
r0.const_array(mfi);
77 const Array4<const Real>& p0_arr =
p0.const_array(mfi);
78 const Array4<const Real>& th0_arr = th0.const_array(mfi);
79 const Array4<const Real>& qv0_arr = qv0.const_array(mfi);
88 ParallelFor(tbz, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
94 r0_arr,th0_arr,cell_data);
102 ParallelFor(tbz, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
107 r0_arr,th0_arr,qv0_arr,cell_prim,qt_arr);
117 ParallelFor(tbz, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
123 r0_arr,qv0_arr,cell_data,qt_arr);
129 ParallelFor(tbz, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
135 r0_arr,p0_arr,th0_arr,cell_data);
140 ParallelFor(tbz, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
146 r0_arr,th0_arr,cell_prim);
156 if ( (solverChoice.
moisture_type == MoistureType::Kessler_NoRain) ||
158 (solverChoice.
moisture_type == MoistureType::SAM_NoPrecip_NoIce) )
165 ParallelFor(tbz, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
168 r0_arr,qv0_arr,cell_data,qt_arr);
174 ParallelFor(tbz, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
177 r0_arr,th0_arr,qv0_arr,p0_arr,
178 cell_prim,cell_data,qt_arr);
183 ParallelFor(tbz, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
186 r0_arr,th0_arr,qv0_arr,cell_prim,qt_arr);
195 if (grav_gpu[2]==0) {
196 ParallelFor(tbz, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
198 buoyancy_fab(i, j, k) =
zero;
202 Array4<const EBCellFlag> cellflg = (ebfact.
get_const_factory())->getMultiEBCellFlagFab()[mfi].const_array();
204 ParallelFor(tbz, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
207 r0_arr,th0_arr,cell_data,cellflg);
213 if (grav_gpu[2]==0) {
214 ParallelFor(tbz, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
216 buoyancy_fab(i, j, k) =
zero;
222 Array4<const EBCellFlag> cellflg = (ebfact.
get_const_factory())->getMultiEBCellFlagFab()[mfi].const_array();
224 ParallelFor(tbz, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
227 r0_arr,qv0_arr,cell_data,qt_arr,cellflg);
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real buoyancy_dry_Thpert(int &i, int &j, int &k, const amrex::Real &grav_gpu, const amrex::Array4< const amrex::Real > &r0_arr, const amrex::Array4< const amrex::Real > &th0_arr, const amrex::Array4< const amrex::Real > &cell_prim)
Definition: ERF_BuoyancyUtils.H:239
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real buoyancy_rhopert(int &i, int &j, int &k, const amrex::Real &grav_gpu, const amrex::Array4< const amrex::Real > &r0_arr, const amrex::Array4< const amrex::Real > &qv0_arr, const amrex::Array4< const amrex::Real > &cell_data, const amrex::Array4< const amrex::Real > &qt_arr)
Definition: ERF_BuoyancyUtils.H:113
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real buoyancy_moist_Tpert(int &i, int &j, int &k, const int &n_qstate, const amrex::Real &grav_gpu, const amrex::Array4< const amrex::Real > &r0_arr, const amrex::Array4< const amrex::Real > &th0_arr, const amrex::Array4< const amrex::Real > &qv0_arr, const amrex::Array4< const amrex::Real > &p0_arr, const amrex::Array4< const amrex::Real > &cell_prim, const amrex::Array4< const amrex::Real > &cell_data, const amrex::Array4< const amrex::Real > &qt_arr)
Definition: ERF_BuoyancyUtils.H:275
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real buoyancy_moist_Thpert(int &i, int &j, int &k, const int &n_qstate, const amrex::Real &grav_gpu, const amrex::Array4< const amrex::Real > &r0_arr, const amrex::Array4< const amrex::Real > &th0_arr, const amrex::Array4< const amrex::Real > &qv0_arr, const amrex::Array4< const amrex::Real > &cell_prim, const amrex::Array4< const amrex::Real > &qt_arr)
Definition: ERF_BuoyancyUtils.H:326
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real buoyancy_dry_anelastic_eb(int &i, int &j, int &k, const amrex::Real &grav_gpu, const amrex::Array4< const amrex::Real > &r0_arr, const amrex::Array4< const amrex::Real > &th0_arr, const amrex::Array4< const amrex::Real > &cell_data, amrex::Array4< amrex::EBCellFlag const > const &flag)
Definition: ERF_BuoyancyUtils.H:55
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real buoyancy_rhopert_eb(int &i, int &j, int &k, const amrex::Real &grav_gpu, const amrex::Array4< const amrex::Real > &r0_arr, const amrex::Array4< const amrex::Real > &qv0_arr, const amrex::Array4< const amrex::Real > &cell_data, const amrex::Array4< const amrex::Real > &qt_arr, amrex::Array4< amrex::EBCellFlag const > const &flag)
Definition: ERF_BuoyancyUtils.H:144
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real buoyancy_dry_anelastic(int &i, int &j, int &k, const amrex::Real &grav_gpu, const amrex::Array4< const amrex::Real > &r0_arr, const amrex::Array4< const amrex::Real > &th0_arr, const amrex::Array4< const amrex::Real > &cell_data)
Definition: ERF_BuoyancyUtils.H:22
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real buoyancy_dry_Tpert(int &i, int &j, int &k, const amrex::Real &grav_gpu, const amrex::Array4< const amrex::Real > &r0_arr, const amrex::Array4< const amrex::Real > &p0_arr, const amrex::Array4< const amrex::Real > &th0_arr, const amrex::Array4< const amrex::Real > &cell_data)
Definition: ERF_BuoyancyUtils.H:202
const int klo
Definition: ERF_InitCustomPert_ABL.H:75
const int khi
Definition: ERF_InitCustomPert_Bubble.H:21
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
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);})
constexpr amrex::Real zero
Definition: ERF_NumericalConstants.H:36
const std::unique_ptr< amrex::EBFArrayBoxFactory > & get_const_factory() const noexcept
Return the cell-centered EB factory.
Definition: ERF_EB.H:102
@ qv0_comp
Definition: ERF_IndexDefines.H:83
@ p0_comp
Definition: ERF_IndexDefines.H:80
@ th0_comp
Definition: ERF_IndexDefines.H:82
@ r0_comp
Definition: ERF_IndexDefines.H:79
@ cons
Definition: ERF_IndexDefines.H:235
@ None
Definition: ERF_LSM_Types.H:6
@ qt
Definition: ERF_Kessler.H:30
real(c_double), parameter p0
Definition: ERF_module_model_constants.F90:40
real(kind=kind_phys), parameter, private r0
Definition: ERF_module_mp_wdm6.F90:75
amrex::Real gravity
Effective gravitational acceleration.
Definition: ERF_DataStruct.H:2343
MoistureType moisture_type
Moisture or microphysics model.
Definition: ERF_DataStruct.H:2524
amrex::Vector< int > buoyancy_type
Per-level buoyancy formulation selector.
Definition: ERF_DataStruct.H:2263
static TerrainType terrain_type
Terrain or immersed-boundary representation.
Definition: ERF_DataStruct.H:2224