Function for computing the momentum RHS for diffusion operator without terrain.
71 Real dx = dx_arr[0],
dy = dx_arr[1],
dz = dx_arr[2];
84 Array4<const EBCellFlag> u_cellflg = (ebfact.
get_u_const_factory())->getMultiEBCellFlagFab()[mfi].const_array();
85 Array4<const Real > u_volfrac = (ebfact.
get_u_const_factory())->getVolFrac().const_array(mfi);
86 Array4<const Real > u_volcent = (ebfact.
get_u_const_factory())->getCentroid().const_array(mfi);
87 Array4<const Real > u_afrac_x = (ebfact.
get_u_const_factory())->getAreaFrac()[0]->const_array(mfi);
88 Array4<const Real > u_afrac_y = (ebfact.
get_u_const_factory())->getAreaFrac()[1]->const_array(mfi);
89 Array4<const Real > u_afrac_z = (ebfact.
get_u_const_factory())->getAreaFrac()[2]->const_array(mfi);
90 Array4<const Real > u_bcent = (ebfact.
get_u_const_factory())->getBndryCent().const_array(mfi);
91 Array4<const Real > u_bnorm = (ebfact.
get_u_const_factory())->getBndryNorm().const_array(mfi);
94 Array4<const EBCellFlag> v_cellflg = (ebfact.
get_v_const_factory())->getMultiEBCellFlagFab()[mfi].const_array();
95 Array4<const Real > v_volfrac = (ebfact.
get_v_const_factory())->getVolFrac().const_array(mfi);
96 Array4<const Real > v_volcent = (ebfact.
get_v_const_factory())->getCentroid().const_array(mfi);
97 Array4<const Real > v_afrac_x = (ebfact.
get_v_const_factory())->getAreaFrac()[0]->const_array(mfi);
98 Array4<const Real > v_afrac_y = (ebfact.
get_v_const_factory())->getAreaFrac()[1]->const_array(mfi);
99 Array4<const Real > v_afrac_z = (ebfact.
get_v_const_factory())->getAreaFrac()[2]->const_array(mfi);
100 Array4<const Real > v_bcent = (ebfact.
get_v_const_factory())->getBndryCent().const_array(mfi);
101 Array4<const Real > v_bnorm = (ebfact.
get_v_const_factory())->getBndryNorm().const_array(mfi);
104 Array4<const EBCellFlag> w_cellflg = (ebfact.
get_w_const_factory())->getMultiEBCellFlagFab()[mfi].const_array();
105 Array4<const Real > w_volfrac = (ebfact.
get_w_const_factory())->getVolFrac().const_array(mfi);
106 Array4<const Real > w_volcent = (ebfact.
get_w_const_factory())->getCentroid().const_array(mfi);
107 Array4<const Real > w_afrac_x = (ebfact.
get_w_const_factory())->getAreaFrac()[0]->const_array(mfi);
108 Array4<const Real > w_afrac_y = (ebfact.
get_w_const_factory())->getAreaFrac()[1]->const_array(mfi);
109 Array4<const Real > w_afrac_z = (ebfact.
get_w_const_factory())->getAreaFrac()[2]->const_array(mfi);
110 Array4<const Real > w_bcent = (ebfact.
get_w_const_factory())->getBndryCent().const_array(mfi);
111 Array4<const Real > w_bnorm = (ebfact.
get_w_const_factory())->getBndryNorm().const_array(mfi);
115 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
117 if (u_volfrac(i,j,k)>
zero) {
120 Real mfsq = mf_ux(i,j,0) * mf_uy(i,j,0);
122 Real diffContrib = ( (
tau11(i , j , k ) * u_afrac_x(i+1,j ,k )
123 -
tau11(i-1, j , k ) * u_afrac_x(i ,j ,k ) ) * dxinv * mfsq
124 + (
tau12(i , j+1, k ) * u_afrac_y(i ,j+1,k )
125 -
tau12(i , j , k ) * u_afrac_y(i ,j ,k ) ) * dyinv * mfsq
126 + (
tau13(i , j , k+1) * u_afrac_z(i ,j ,k+1)
127 -
tau13(i , j , k ) * u_afrac_z(i ,j ,k )) * dzinv );
128 diffContrib /= u_volfrac(i,j,k);
130 rho_u_rhs(i,j,k) -= diffContrib;
132 if (!l_constraint_x && u_cellflg(i,j,k).isSingleValued()) {
134 Real axm = u_afrac_x(i ,j ,k );
135 Real axp = u_afrac_x(i+1,j ,k );
136 Real aym = u_afrac_y(i ,j ,k );
137 Real ayp = u_afrac_y(i ,j+1,k );
138 Real azm = u_afrac_z(i ,j ,k );
139 Real azp = u_afrac_z(i ,j ,k+1);
145 Real barea = std::sqrt(adx*adx + ady*ady + adz*adz);
151 const RealVect bcent_eb {u_bcent(i,j,k,0), u_bcent(i,j,k,1), u_bcent(i,j,k,2)};
156 GpuArray<Real,AMREX_SPACEDIM> slopes_u;
157 GpuArray<Real,AMREX_SPACEDIM> slopes_v;
158 GpuArray<Real,AMREX_SPACEDIM> slopes_w;
160 slopes_u =
erf_calc_slopes_eb_Dirichlet (
dx,
dy,
dz, i, j, k, bcent_eb, Dirichlet_u, u_arr, u_volcent, u_cellflg);
161 slopes_v =
erf_calc_slopes_eb_Dirichlet_staggered(
Vars::xvel,
Vars::yvel,
dx,
dy,
dz, i, j, k, bcent_eb, Dirichlet_v, v_arr, v_volcent, v_cellflg);
162 slopes_w =
erf_calc_slopes_eb_Dirichlet_staggered(
Vars::xvel,
Vars::zvel,
dx,
dy,
dz, i, j, k, bcent_eb, Dirichlet_w, w_arr, w_volcent, w_cellflg);
164 Real dudx = slopes_u[0];
165 Real dudy = slopes_u[1];
166 Real dudz = slopes_u[2];
167 Real dvdx = slopes_v[0];
168 Real dvdy = slopes_v[1];
169 Real dwdx = slopes_w[0];
170 Real dwdz = slopes_w[2];
172 Real tau11_eb = ( dudx - ( dudx + dvdy + dwdz ) /
three );
176 dudn = - mu_eff * (u_bnorm(i,j,k,0) * tau11_eb + u_bnorm(i,j,k,1) * tau12_eb + u_bnorm(i,j,k,2) * tau13_eb);
178 }
else if (l_surface_layer) {
183 rho_u_rhs(i,j,k) -= barea * dudn / (vol * u_volfrac(i,j,k));
191 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
193 if (v_volfrac(i,j,k)>
zero) {
196 Real mfsq = mf_vx(i,j,0) * mf_vy(i,j,0);
198 Real diffContrib = ( (
tau12(i+1, j , k ) * v_afrac_x(i+1,j ,k )
199 -
tau12(i , j , k ) * v_afrac_x(i ,j ,k ) ) * dxinv * mfsq
200 + (
tau22(i , j , k ) * v_afrac_y(i ,j+1,k )
201 -
tau22(i , j-1, k ) * v_afrac_y(i ,j ,k ) ) * dyinv * mfsq
202 + (
tau23(i , j , k+1) * v_afrac_z(i ,j ,k+1)
203 -
tau23(i , j , k ) * v_afrac_z(i ,j ,k ) ) * dzinv );
204 diffContrib /= v_volfrac(i,j,k);
206 rho_v_rhs(i,j,k) -= diffContrib;
208 if (!l_constraint_y && l_no_slip && v_cellflg(i,j,k).isSingleValued()) {
210 Real axm = v_afrac_x(i ,j ,k );
211 Real axp = v_afrac_x(i+1,j ,k );
212 Real aym = v_afrac_y(i ,j ,k );
213 Real ayp = v_afrac_y(i ,j+1,k );
214 Real azm = v_afrac_z(i ,j ,k );
215 Real azp = v_afrac_z(i ,j ,k+1);
221 Real barea = std::sqrt(adx*adx + ady*ady + adz*adz);
227 const RealVect bcent_eb {v_bcent(i,j,k,0), v_bcent(i,j,k,1), v_bcent(i,j,k,2)};
232 GpuArray<Real,AMREX_SPACEDIM> slopes_u;
233 GpuArray<Real,AMREX_SPACEDIM> slopes_v;
234 GpuArray<Real,AMREX_SPACEDIM> slopes_w;
236 slopes_u =
erf_calc_slopes_eb_Dirichlet_staggered(
Vars::yvel,
Vars::xvel,
dx,
dy,
dz, i, j, k, bcent_eb, Dirichlet_u, u_arr, u_volcent, u_cellflg);
237 slopes_v =
erf_calc_slopes_eb_Dirichlet (
dx,
dy,
dz, i, j, k, bcent_eb, Dirichlet_v, v_arr, v_volcent, v_cellflg);
238 slopes_w =
erf_calc_slopes_eb_Dirichlet_staggered(
Vars::yvel,
Vars::zvel,
dx,
dy,
dz, i, j, k, bcent_eb, Dirichlet_w, w_arr, w_volcent, w_cellflg);
240 Real dudx = slopes_u[0];
241 Real dudy = slopes_u[1];
242 Real dvdx = slopes_v[0];
243 Real dvdy = slopes_v[1];
244 Real dvdz = slopes_v[2];
245 Real dwdy = slopes_w[1];
246 Real dwdz = slopes_w[2];
248 Real tau22_eb = ( dvdy - ( dudx + dvdy + dwdz ) /
three );
252 dvdn = - mu_eff * (v_bnorm(i,j,k,0) * tau12_eb + v_bnorm(i,j,k,1) * tau22_eb + v_bnorm(i,j,k,2) * tau23_eb);
254 }
else if (l_surface_layer) {
259 rho_v_rhs(i,j,k) -= barea * dvdn / (vol * v_volfrac(i,j,k));
266 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
268 if (w_volfrac(i,j,k)>
zero) {
271 Real mfsq = mf_mx(i,j,0) * mf_my(i,j,0);
273 Real diffContrib = ( (
tau13(i+1, j , k ) * w_afrac_x(i+1,j ,k )
274 -
tau13(i , j , k ) * w_afrac_x(i ,j ,k ) ) * dxinv * mfsq
275 + (
tau23(i , j+1, k ) * w_afrac_y(i ,j+1,k )
276 -
tau23(i , j , k ) * w_afrac_y(i ,j ,k ) ) * dyinv * mfsq
277 + (
tau33(i , j , k ) * w_afrac_z(i ,j ,k+1)
278 -
tau33(i , j , k-1) * w_afrac_z(i ,j ,k ) ) * dzinv );
279 diffContrib /= w_volfrac(i,j,k);
280 rho_w_rhs(i,j,k) -= diffContrib;
282 if (!l_constraint_z && l_no_slip && w_cellflg(i,j,k).isSingleValued()) {
286 Real axm = w_afrac_x(i ,j ,k );
287 Real axp = w_afrac_x(i+1,j ,k );
288 Real aym = w_afrac_y(i ,j ,k );
289 Real ayp = w_afrac_y(i ,j+1,k );
290 Real azm = w_afrac_z(i ,j ,k );
291 Real azp = w_afrac_z(i ,j ,k+1);
297 Real barea = std::sqrt(adx*adx + ady*ady + adz*adz);
299 const RealVect bcent_eb {w_bcent(i,j,k,0), w_bcent(i,j,k,1), w_bcent(i,j,k,2)};
304 GpuArray<Real,AMREX_SPACEDIM> slopes_u;
305 GpuArray<Real,AMREX_SPACEDIM> slopes_v;
306 GpuArray<Real,AMREX_SPACEDIM> slopes_w;
308 slopes_u =
erf_calc_slopes_eb_Dirichlet_staggered(
Vars::zvel,
Vars::xvel,
dx,
dy,
dz, i, j, k, bcent_eb, Dirichlet_u, u_arr, u_volcent, u_cellflg);
309 slopes_v =
erf_calc_slopes_eb_Dirichlet_staggered(
Vars::zvel,
Vars::yvel,
dx,
dy,
dz, i, j, k, bcent_eb, Dirichlet_v, v_arr, v_volcent, v_cellflg);
310 slopes_w =
erf_calc_slopes_eb_Dirichlet (
dx,
dy,
dz, i, j, k, bcent_eb, Dirichlet_w, w_arr, w_volcent, w_cellflg);
312 Real dudx = slopes_u[0];
313 Real dudz = slopes_u[2];
314 Real dvdy = slopes_v[1];
315 Real dvdz = slopes_v[2];
316 Real dwdx = slopes_w[0];
317 Real dwdy = slopes_w[1];
318 Real dwdz = slopes_w[2];
320 Real tau33_eb = ( dwdz - ( dudx + dvdy + dwdz ) /
three );
324 Real dwdn = -(w_bnorm(i,j,k,0) * tau13_eb + w_bnorm(i,j,k,1) * tau23_eb + w_bnorm(i,j,k,2) * tau33_eb);
326 rho_w_rhs(i,j,k) -= mu_eff * barea * dwdn / (vol * w_volfrac(i,j,k));
constexpr amrex::Real three
Definition: ERF_Constants.H:9
constexpr amrex::Real two
Definition: ERF_Constants.H:8
constexpr amrex::Real zero
Definition: ERF_Constants.H:6
constexpr amrex::Real myhalf
Definition: ERF_Constants.H:11
@ tau12
Definition: ERF_DataStruct.H:32
@ tau23
Definition: ERF_DataStruct.H:32
@ tau33
Definition: ERF_DataStruct.H:32
@ tau22
Definition: ERF_DataStruct.H:32
@ tau11
Definition: ERF_DataStruct.H:32
@ tau13
Definition: ERF_DataStruct.H:32
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > erf_calc_slopes_eb_Dirichlet(amrex::Real dx, amrex::Real dy, amrex::Real dz, int i, int j, int k, amrex::RealVect const &bcent_eb, amrex::Real const state_eb, amrex::Array4< amrex::Real const > const &state, amrex::Array4< amrex::Real const > const &ccent, amrex::Array4< amrex::EBCellFlag const > const &flag)
Definition: ERF_EBSlopes.H:20
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > erf_calc_slopes_eb_Dirichlet_staggered(int igrid_query, int igrid_data, amrex::Real dx, amrex::Real dy, amrex::Real dz, int i, int j, int k, amrex::RealVect const &bcent_eb, amrex::Real const state_eb, amrex::Array4< amrex::Real const > const &state, amrex::Array4< amrex::Real const > const &ccent, amrex::Array4< amrex::EBCellFlag const > const &flag)
Definition: ERF_EBSlopes.H:146
@ tau_eb23
Definition: ERF_EBStruct.H:16
@ tau_eb13
Definition: ERF_EBStruct.H:16
amrex::GpuArray< Real, AMREX_SPACEDIM > dxInv
Definition: ERF_InitCustomPertVels_ParticleTests.H:17
const Real dy
Definition: ERF_InitCustomPert_ABL.H:24
const Real dx
Definition: ERF_InitCustomPert_ABL.H:23
const Real dz
Definition: ERF_InitCustomPert_Bubble.H:25
ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept { const auto prob_lo=geomdata.ProbLo();const auto dx=geomdata.CellSize();const Real x=(prob_lo[0]+(i+myhalf) *dx[0])/mf_m(i, j, 0);const Real z=z_cc(i, j, k);Real L=std::sqrt(std::pow((x - x_c)/x_r, 2)+std::pow((z - z_c)/z_r, 2));if(L<=one) { Real dT=T_pert *(std::cos(PI *L)+one)/two;Real Tbar_hse=p_hse(i, j, k)/(R_d *r_hse(i, j, k));Real theta_perturbed=(Tbar_hse+dT) *std::pow(p_0/p_hse(i, j, k), rdOcp);Real theta_0=(Tbar_hse) *std::pow(p_0/p_hse(i, j, k), rdOcp);if(const_rho) { state_pert(i, j, k, RhoTheta_comp)=r_hse(i, j, k) *(theta_perturbed - theta_0);} else { state_pert(i, j, k, Rho_comp)=getRhoThetagivenP(p_hse(i, j, k))/theta_perturbed - r_hse(i, j, k);} } })
amrex::Real Real
Definition: ERF_ShocInterface.H:19
eb_aux_ const * get_w_const_factory() const noexcept
Definition: ERF_EB.H:52
eb_aux_ const * get_v_const_factory() const noexcept
Definition: ERF_EB.H:51
eb_aux_ const * get_u_const_factory() const noexcept
Definition: ERF_EB.H:50
@ xvel
Definition: ERF_IndexDefines.H:159
@ zvel
Definition: ERF_IndexDefines.H:161
@ yvel
Definition: ERF_IndexDefines.H:160
Definition: ERF_DiffStruct.H:19
amrex::Real rho0_trans
Definition: ERF_DiffStruct.H:91
bool eb_diff_constraint_z
Definition: ERF_DiffStruct.H:99
bool eb_diff_constraint_x
Definition: ERF_DiffStruct.H:97
bool eb_diff_constraint_y
Definition: ERF_DiffStruct.H:98
MolecDiffType molec_diff_type
Definition: ERF_DiffStruct.H:84
amrex::Real dynamic_viscosity
Definition: ERF_DiffStruct.H:96
Definition: ERF_EBStruct.H:23
DiffChoice diffChoice
Definition: ERF_DataStruct.H:1088
EBChoice ebChoice
Definition: ERF_DataStruct.H:1092