32 BL_PROFILE_REGION(
"erf_make_tau_terms()");
34 const BCRec* bc_ptr_h = domain_bcs_type_h.data();
39 const bool l_use_terrain_fitted_coords = (solverChoice.
mesh_type != MeshType::ConstantDz);
40 const bool l_moving_terrain = (solverChoice.
terrain_type == TerrainType::MovingFittedMesh);
41 if (l_moving_terrain) AMREX_ALWAYS_ASSERT (l_use_terrain_fitted_coords);
49 const bool l_use_turb = ( tc.
les_type == LESType::Smagorinsky ||
56 const bool need_SmnSmn = (tc.
les_type == LESType::Deardorff ||
59 const bool use_most = (most !=
nullptr);
63 const Box& domain = geom.Domain();
64 const int domlo_z = domain.smallEnd(2);
65 const int domhi_z = domain.bigEnd(2);
67 const GpuArray<Real, AMREX_SPACEDIM> dxInv = geom.InvCellSizeArray();
74 const DistributionMapping& dm = S_data[
IntVars::cons].DistributionMap();
76 std::unique_ptr<MultiFab> expr;
77 std::unique_ptr<MultiFab> dflux_x;
78 std::unique_ptr<MultiFab> dflux_y;
79 std::unique_ptr<MultiFab> dflux_z;
82 expr = std::make_unique<MultiFab>(ba , dm, 1, IntVect(1,1,1));
83 dflux_x = std::make_unique<MultiFab>(convert(ba,IntVect(1,0,0)), dm,
nvars, 0);
84 dflux_y = std::make_unique<MultiFab>(convert(ba,IntVect(0,1,0)), dm,
nvars, 0);
85 dflux_z = std::make_unique<MultiFab>(convert(ba,IntVect(0,0,1)), dm,
nvars, 0);
94 #pragma omp parallel if (Gpu::notInLaunchRegion())
98 const Box& bx = mfi.tilebox();
99 const Box& valid_bx = mfi.validbox();
102 const Array4<const Real> & u =
xvel.array(mfi);
103 const Array4<const Real> & v =
yvel.array(mfi);
104 const Array4<const Real> & w =
zvel.array(mfi);
107 const Array4<const Real>& mf_m = mapfac_m->const_array(mfi);
108 const Array4<const Real>& mf_u = mapfac_u->const_array(mfi);
109 const Array4<const Real>& mf_v = mapfac_v->const_array(mfi);
112 const Array4<Real const>& mu_turb = l_use_turb ? eddyDiffs->const_array(mfi) : Array4<const Real>{};
113 const Array4<Real const>& cell_data = l_use_constAlpha ? S_data[
IntVars::cons].const_array(mfi) : Array4<const Real>{};
116 const Array4<const Real>& z_nd = z_phys_nd->const_array(mfi);
117 const Array4<const Real>& detJ_arr = detJ->const_array(mfi);
136 Box bxcc = mfi.tilebox();
137 Box tbxxy = mfi.tilebox(IntVect(1,1,0));
138 Box tbxxz = mfi.tilebox(IntVect(1,0,1));
139 Box tbxyz = mfi.tilebox(IntVect(0,1,1));
142 bxcc.grow(IntVect(1,1,0));
143 tbxxy.grow(IntVect(1,1,0));
144 tbxxz.grow(IntVect(1,1,0));
145 tbxyz.grow(IntVect(1,1,0));
147 if (bxcc.smallEnd(2) != domain.smallEnd(2)) {
154 if (bxcc.bigEnd(2) != domain.bigEnd(2)) {
162 Array4<Real> er_arr = expr->array(mfi);
165 FArrayBox S11,S22,S33;
166 FArrayBox S12,S13,S23;
167 S11.resize( bxcc,1,The_Async_Arena()); S22.resize(bxcc,1,The_Async_Arena()); S33.resize(bxcc,1,The_Async_Arena());
168 S12.resize(tbxxy,1,The_Async_Arena()); S13.resize(tbxxz,1,The_Async_Arena()); S23.resize(tbxyz,1,The_Async_Arena());
169 Array4<Real> s11 = S11.array(); Array4<Real> s22 = S22.array(); Array4<Real> s33 = S33.array();
170 Array4<Real> s12 = S12.array(); Array4<Real> s13 = S13.array(); Array4<Real> s23 = S23.array();
173 Array4<Real> tau11 = Tau11->array(mfi); Array4<Real> tau22 = Tau22->array(mfi); Array4<Real> tau33 = Tau33->array(mfi);
174 Array4<Real> tau12 = Tau12->array(mfi); Array4<Real> tau13 = Tau13->array(mfi); Array4<Real> tau23 = Tau23->array(mfi);
177 Array4<Real> SmnSmn_a;
179 if (l_use_terrain_fitted_coords) {
181 FArrayBox S21,S31,S32;
182 S21.resize(tbxxy,1,The_Async_Arena()); S31.resize(tbxxz,1,The_Async_Arena()); S32.resize(tbxyz,1,The_Async_Arena());
183 Array4<Real> s21 = S21.array(); Array4<Real> s31 = S31.array(); Array4<Real> s32 = S32.array();
184 Array4<Real> tau21 = Tau21->array(mfi); Array4<Real> tau31 = Tau31->array(mfi); Array4<Real> tau32 = Tau32->array(mfi);
191 BL_PROFILE(
"slow_rhs_making_er_T");
192 Box gbxo = surroundingNodes(bxcc,2);
197 Omega.resize(gbxo,1,The_Async_Arena());
200 Array4<Real> omega_arr = Omega.array();
201 ParallelFor(gbxo, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
203 omega_arr(i,j,k) = (k == 0) ? 0. :
OmegaFromW(i,j,k,w(i,j,k),u,v,z_nd,dxInv);
206 ParallelFor(bxcc, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
215 Real Omega_hi = omega_arr(i,j,k+1);
216 Real Omega_lo = omega_arr(i,j,k );
218 Real mfsq = mf_m(i,j,0)*mf_m(i,j,0);
220 Real expansionRate = (u(i+1,j ,k)/mf_u(i+1,j,0)*met_u_h_zeta_hi - u(i,j,k)/mf_u(i,j,0)*met_u_h_zeta_lo)*dxInv[0]*mfsq +
221 (v(i ,j+1,k)/mf_v(i,j+1,0)*met_v_h_zeta_hi - v(i,j,k)/mf_v(i,j,0)*met_v_h_zeta_lo)*dxInv[1]*mfsq +
222 (Omega_hi - Omega_lo)*dxInv[2];
224 er_arr(i,j,k) = expansionRate / detJ_arr(i,j,k);
232 BL_PROFILE(
"slow_rhs_making_strain_T");
239 z_nd, detJ_arr, bc_ptr_h, dxInv,
245 if ((nrk==0) && (need_SmnSmn)) {
246 SmnSmn_a = SmnSmn->array(mfi);
247 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
252 domlo_z,use_most,exp_most);
260 if (use_most && exp_most) {
274 BL_PROFILE(
"slow_rhs_making_stress_T");
277 tbxxy.grow(IntVect(-1,-1,0));
278 tbxxz.grow(IntVect(-1,-1,0));
279 tbxyz.grow(IntVect(-1,-1,0));
288 er_arr, z_nd, detJ_arr, dxInv);
296 er_arr, z_nd, detJ_arr, dxInv);
300 bxcc.grow(IntVect(-1,-1,0));
301 if (bxcc.smallEnd(0) == valid_bx.smallEnd(0)) bxcc.growLo(0, 1);
302 if (bxcc.bigEnd(0) == valid_bx.bigEnd(0)) bxcc.growHi(0, 1);
303 if (bxcc.smallEnd(1) == valid_bx.smallEnd(1)) bxcc.growLo(1, 1);
304 if (bxcc.bigEnd(1) == valid_bx.bigEnd(1)) bxcc.growHi(1, 1);
308 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept {
309 tau11(i,j,k) = s11(i,j,k);
310 tau22(i,j,k) = s22(i,j,k);
311 tau33(i,j,k) = s33(i,j,k);
314 ParallelFor(tbxxy, tbxxz, tbxyz,
315 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept {
316 tau12(i,j,k) = s12(i,j,k);
317 tau21(i,j,k) = s21(i,j,k);
319 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept {
320 tau13(i,j,k) = s13(i,j,k);
321 tau31(i,j,k) = s31(i,j,k);
323 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept {
324 tau23(i,j,k) = s23(i,j,k);
325 tau32(i,j,k) = s32(i,j,k);
335 BL_PROFILE(
"slow_rhs_making_er_N");
336 ParallelFor(bxcc, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept {
337 Real mfsq = mf_m(i,j,0)*mf_m(i,j,0);
338 er_arr(i,j,k) = (u(i+1, j , k )/mf_u(i+1,j,0) - u(i, j, k)/mf_u(i,j,0))*dxInv[0]*mfsq +
339 (v(i , j+1, k )/mf_v(i,j+1,0) - v(i, j, k)/mf_v(i,j,0))*dxInv[1]*mfsq +
340 (w(i , j , k+1) - w(i, j, k))*dxInv[2];
349 BL_PROFILE(
"slow_rhs_making_strain_N");
360 if ((nrk==0) && (need_SmnSmn)) {
361 SmnSmn_a = SmnSmn->array(mfi);
362 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
367 domlo_z,use_most,exp_most);
375 if (use_most && exp_most) {
385 BL_PROFILE(
"slow_rhs_making_stress_N");
388 tbxxy.grow(IntVect(-1,-1,0));
389 tbxxz.grow(IntVect(-1,-1,0));
390 tbxyz.grow(IntVect(-1,-1,0));
391 if (tbxxy.smallEnd(2) > domlo_z) {
396 if (tbxxy.bigEnd(2) < domhi_z) {
417 bxcc.grow(IntVect(-1,-1,0));
418 if (bxcc.smallEnd(0) == valid_bx.smallEnd(0)) bxcc.growLo(0, 1);
419 if (bxcc.bigEnd(0) == valid_bx.bigEnd(0)) bxcc.growHi(0, 1);
420 if (bxcc.smallEnd(1) == valid_bx.smallEnd(1)) bxcc.growLo(1, 1);
421 if (bxcc.bigEnd(1) == valid_bx.bigEnd(1)) bxcc.growHi(1, 1);
425 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept {
426 tau11(i,j,k) = s11(i,j,k);
427 tau22(i,j,k) = s22(i,j,k);
428 tau33(i,j,k) = s33(i,j,k);
430 ParallelFor(tbxxy, tbxxz, tbxyz,
431 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept {
432 tau12(i,j,k) = s12(i,j,k);
434 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept {
435 tau13(i,j,k) = s13(i,j,k);
437 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept {
438 tau23(i,j,k) = s23(i,j,k);
void ComputeStrain_N(Box bxcc, Box tbxxy, Box tbxxz, Box tbxyz, Box domain, const Array4< const Real > &u, const Array4< const Real > &v, const Array4< const Real > &w, Array4< Real > &tau11, Array4< Real > &tau22, Array4< Real > &tau33, Array4< Real > &tau12, Array4< Real > &tau13, Array4< Real > &tau23, const BCRec *bc_ptr, const GpuArray< Real, AMREX_SPACEDIM > &dxInv, const Array4< const Real > &mf_m, const Array4< const Real > &mf_u, const Array4< const Real > &mf_v)
Definition: ERF_ComputeStrain_N.cpp:28
void ComputeStrain_T(Box bxcc, Box tbxxy, Box tbxxz, Box tbxyz, Box domain, const Array4< const Real > &u, const Array4< const Real > &v, const Array4< const Real > &w, Array4< Real > &tau11, Array4< Real > &tau22, Array4< Real > &tau33, Array4< Real > &tau12, Array4< Real > &tau13, Array4< Real > &tau21, Array4< Real > &tau23, Array4< Real > &tau31, Array4< Real > &tau32, const Array4< const Real > &z_nd, const Array4< const Real > &detJ, const BCRec *bc_ptr, const GpuArray< Real, AMREX_SPACEDIM > &dxInv, const Array4< const Real > &mf_m, const Array4< const Real > &mf_u, const Array4< const Real > &mf_v)
Definition: ERF_ComputeStrain_T.cpp:33
void ComputeStressVarVisc_N(Box bxcc, Box tbxxy, Box tbxxz, Box tbxyz, Real mu_eff, const Array4< const Real > &mu_turb, const Array4< const Real > &cell_data, Array4< Real > &tau11, Array4< Real > &tau22, Array4< Real > &tau33, Array4< Real > &tau12, Array4< Real > &tau13, Array4< Real > &tau23, const Array4< const Real > &er_arr)
Definition: ERF_ComputeStress_N.cpp:105
void ComputeStressConsVisc_N(Box bxcc, Box tbxxy, Box tbxxz, Box tbxyz, Real mu_eff, const Array4< const Real > &cell_data, Array4< Real > &tau11, Array4< Real > &tau22, Array4< Real > &tau33, Array4< Real > &tau12, Array4< Real > &tau13, Array4< Real > &tau23, const Array4< const Real > &er_arr)
Definition: ERF_ComputeStress_N.cpp:23
void ComputeStressVarVisc_T(Box bxcc, Box tbxxy, Box tbxxz, Box tbxyz, Real mu_eff, const Array4< const Real > &mu_turb, const Array4< const Real > &cell_data, Array4< Real > &tau11, Array4< Real > &tau22, Array4< Real > &tau33, Array4< Real > &tau12, Array4< Real > &tau13, Array4< Real > &tau21, Array4< Real > &tau23, Array4< Real > &tau31, Array4< Real > &tau32, const Array4< const Real > &er_arr, const Array4< const Real > &z_nd, const Array4< const Real > &detJ, const GpuArray< Real, AMREX_SPACEDIM > &dxInv)
Definition: ERF_ComputeStress_T.cpp:303
void ComputeStressConsVisc_T(Box bxcc, Box tbxxy, Box tbxxz, Box tbxyz, Real mu_eff, const Array4< const Real > &cell_data, Array4< Real > &tau11, Array4< Real > &tau22, Array4< Real > &tau33, Array4< Real > &tau12, Array4< Real > &tau13, Array4< Real > &tau21, Array4< Real > &tau23, Array4< Real > &tau31, Array4< Real > &tau32, const Array4< const Real > &er_arr, const Array4< const Real > &z_nd, const Array4< const Real > &detJ, const GpuArray< Real, AMREX_SPACEDIM > &dxInv)
Definition: ERF_ComputeStress_T.cpp:29
@ nvars
Definition: ERF_DataStruct.H:74
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real ComputeSmnSmn(int &i, int &j, int &k, const amrex::Array4< amrex::Real const > &tau11, const amrex::Array4< amrex::Real const > &tau22, const amrex::Array4< amrex::Real const > &tau33, const amrex::Array4< amrex::Real const > &tau12, const amrex::Array4< amrex::Real const > &tau13, const amrex::Array4< amrex::Real const > &tau23, const int &klo, const bool &use_most, const bool &exp_most)
Definition: ERF_EddyViscosity.H:33
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real OmegaFromW(int i, int j, int k, amrex::Real w, const amrex::Array4< const amrex::Real > u_arr, const amrex::Array4< const amrex::Real > v_arr, const amrex::Array4< const amrex::Real > z_nd, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dxInv)
Definition: ERF_TerrainMetrics.H:381
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtIface(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:94
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtJface(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:137
AMREX_FORCE_INLINE amrex::IntVect TileNoZ()
Definition: ERF_TileNoZ.H:11
@ cons
Definition: ERF_IndexDefines.H:150
@ xvel
Definition: ERF_IndexDefines.H:141
@ zvel
Definition: ERF_IndexDefines.H:143
@ yvel
Definition: ERF_IndexDefines.H:142
Definition: ERF_DiffStruct.H:19
amrex::Real rho0_trans
Definition: ERF_DiffStruct.H:88
MolecDiffType molec_diff_type
Definition: ERF_DiffStruct.H:81
amrex::Real dynamic_viscosity
Definition: ERF_DiffStruct.H:93
bool use_explicit_most
Definition: ERF_DataStruct.H:737
static MeshType mesh_type
Definition: ERF_DataStruct.H:665
DiffChoice diffChoice
Definition: ERF_DataStruct.H:674
amrex::Vector< TurbChoice > turbChoice
Definition: ERF_DataStruct.H:676
static TerrainType terrain_type
Definition: ERF_DataStruct.H:659
bool use_rotate_most
Definition: ERF_DataStruct.H:740
Definition: ERF_TurbStruct.H:31
PBLType pbl_type
Definition: ERF_TurbStruct.H:240
RANSType rans_type
Definition: ERF_TurbStruct.H:237
LESType les_type
Definition: ERF_TurbStruct.H:204