Function for computing the scalar RHS for diffusion operator without terrain.
79 const Real dz_inv = cellSizeInv[2];
85 for (
int n(0); n<num_comp; ++n) {
86 const int qty_index = start_comp + n;
87 const int prim_index = qty_index - 1;
89 const int eff_index = (l_consA && l_turb) ? prim_scal_index : prim_index;
93 const Real alpha_mol = d_alpha_eff[eff_index];
94 const int eddy_x = d_eddy_diff_idx[eff_index];
95 const int eddy_y = d_eddy_diff_idy[eff_index];
96 const int eddy_z = d_eddy_diff_idz[eff_index];
98 ParallelFor(xbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
101 Real rhoAlpha = rhoFace * alpha_mol;
103 rhoAlpha +=
myhalf * ( mu_turb(i , j, k, eddy_x)
104 + mu_turb(i-1, j, k, eddy_x) );
110 ext_dir_on_xlo &= (i == dom_lo.x);
115 ext_dir_on_xhi &= (i == dom_hi.x+1);
117 if (ext_dir_on_xlo) {
118 xflux(i,j,k) = -rhoAlpha * ( -(
Real(8.)/
three) * cell_prim(i-1, j, k, prim_index)
119 +
three * cell_prim(i , j, k, prim_index)
120 - (
one/
three) * cell_prim(i+1, j, k, prim_index) ) * dx_inv;
121 }
else if (ext_dir_on_xhi) {
122 xflux(i,j,k) = -rhoAlpha * ( (
Real(8.)/
three) * cell_prim(i , j, k, prim_index)
123 -
three * cell_prim(i-1, j, k, prim_index)
124 + (
one/
three) * cell_prim(i-2, j, k, prim_index) ) * dx_inv;
126 if (cfg_arr(i,j,k).isCovered()) {
127 xflux(i,j,k) = -rhoAlpha * ( cell_prim(i-3, j, k, prim_index)
128 -
three*cell_prim(i-2, j, k, prim_index)
129 +
two*cell_prim(i-1, j, k, prim_index) ) * dx_inv;
130 }
else if (cfg_arr(i-1,j,k).isCovered()) {
131 xflux(i,j,k) = -rhoAlpha * (
three*cell_prim(i+1, j, k, prim_index)
132 - cell_prim(i+2, j, k, prim_index)
133 -
two*cell_prim(i, j, k, prim_index) ) * dx_inv;
135 xflux(i,j,k) = -rhoAlpha * ( cell_prim(i , j, k, prim_index)
136 - cell_prim(i-1, j, k, prim_index) ) * dx_inv;
140 ParallelFor(ybx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
143 Real rhoAlpha = rhoFace * alpha_mol;
145 rhoAlpha +=
myhalf * ( mu_turb(i, j , k, eddy_y)
146 + mu_turb(i, j-1, k, eddy_y) );
152 ext_dir_on_ylo &= (j == dom_lo.y);
157 ext_dir_on_yhi &= (j == dom_hi.y+1);
159 if (ext_dir_on_ylo) {
160 yflux(i,j,k) = -rhoAlpha * ( -(
Real(8.)/
three) * cell_prim(i, j-1, k, prim_index)
161 +
three * cell_prim(i, j , k, prim_index)
162 - (
one/
three) * cell_prim(i, j+1, k, prim_index) ) * dy_inv;
163 }
else if (ext_dir_on_yhi) {
164 yflux(i,j,k) = -rhoAlpha * ( (
Real(8.)/
three) * cell_prim(i, j , k, prim_index)
165 -
three * cell_prim(i, j-1, k, prim_index)
166 + (
one/
three) * cell_prim(i, j-2, k, prim_index) ) * dy_inv;
168 if (cfg_arr(i,j,k).isCovered()) {
169 yflux(i,j,k) = -rhoAlpha * ( cell_prim(i, j-3, k, prim_index)
170 -
three*cell_prim(i, j-2, k, prim_index)
171 +
two*cell_prim(i, j-1, k, prim_index) ) * dy_inv;
172 }
else if (cfg_arr(i,j-1,k).isCovered()) {
173 yflux(i,j,k) = -rhoAlpha * (
three*cell_prim(i, j+1, k, prim_index)
174 - cell_prim(i, j+2, k, prim_index)
175 -
two*cell_prim(i, j, k, prim_index) ) * dy_inv;
177 yflux(i,j,k) = -rhoAlpha * (cell_prim(i, j, k, prim_index)
178 - cell_prim(i, j-1, k, prim_index)) * dy_inv;
182 ParallelFor(zbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
185 Real rhoAlpha = rhoFace * alpha_mol;
187 rhoAlpha +=
myhalf * ( mu_turb(i, j, k , eddy_z)
188 + mu_turb(i, j, k-1, eddy_z) );
197 bool SurfLayer_on_zlo = ( use_SurfLayer && k == dom_lo.z);
199 if (ext_dir_on_zlo) {
200 zflux(i,j,k) = -rhoAlpha * ( -(
Real(8.)/
three) * cell_prim(i, j, k-1, prim_index)
201 +
three * cell_prim(i, j, k , prim_index)
202 - (
one/
three) * cell_prim(i, j, k+1, prim_index) ) * dz_inv;
203 }
else if (ext_dir_on_zhi) {
204 zflux(i,j,k) = -rhoAlpha * ( (
Real(8.)/
three) * cell_prim(i, j, k , prim_index)
205 -
three * cell_prim(i, j, k-1, prim_index)
206 + (
one/
three) * cell_prim(i, j, k-2, prim_index) ) * dz_inv;
207 }
else if (SurfLayer_on_zlo && (qty_index ==
RhoTheta_comp)) {
208 zflux(i,j,k) = hfx_z(i,j,0);
209 }
else if (SurfLayer_on_zlo && (qty_index ==
RhoQ1_comp)) {
210 zflux(i,j,k) = qfx1_z(i,j,0);
212 if (cfg_arr(i,j,k).isCovered()) {
213 zflux(i,j,k) = -rhoAlpha * ( cell_prim(i, j, k-3, prim_index)
214 -
three*cell_prim(i, j, k-2, prim_index)
215 +
two*cell_prim(i, j, k-1, prim_index) ) * dz_inv;
216 }
else if (cfg_arr(i,j,k-1).isCovered()) {
217 zflux(i,j,k) = -rhoAlpha * (
three*cell_prim(i, j, k+1, prim_index)
218 - cell_prim(i, j, k+2, prim_index)
219 -
two*cell_prim(i, j, k, prim_index) ) * dz_inv;
221 zflux(i,j,k) = -rhoAlpha * (cell_prim(i, j, k, prim_index)
222 - cell_prim(i, j, k-1, prim_index)) * dz_inv;
241 ParallelFor(bx,[=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
243 if (!cfg_arr(i,j,k).isCovered()) {
244 cell_rhs(i,j,k,qty_index) -= ((ax_arr(i+1,j,k) * xflux(i+1,j ,k ) - ax_arr(i,j,k) * xflux(i, j, k)) * dx_inv
245 +(ay_arr(i,j+1,k) * yflux(i ,j+1,k ) - ay_arr(i,j,k) * yflux(i, j, k)) * dy_inv
246 +(az_arr(i,j,k+1) * zflux(i ,j ,k+1) - az_arr(i,j,k) * zflux(i, j, k)) * dz_inv)
253 if (l_surface_layer && l_rhotheta) {
254 ParallelFor(bx,[=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
256 if (cfg_arr(i,j,k).isSingleValued()) {
258 Real axm = ax_arr(i ,j ,k );
259 Real axp = ax_arr(i+1,j ,k );
260 Real aym = ay_arr(i ,j ,k );
261 Real ayp = ay_arr(i ,j+1,k );
262 Real azm = az_arr(i ,j ,k );
263 Real azp = az_arr(i ,j ,k+1);
269 Real barea = std::sqrt(adx*adx + ady*ady + adz*adz);
271 cell_rhs(i,j,k,qty_index) += barea * hfx_EB(i,j,k) / (vol * detJ(i,j,k));
void DiffusionSrcForState_EB(const Box &bx, const Box &domain, int start_comp, int num_comp, const Array4< const Real > &u, const Array4< const Real > &v, const Array4< const Real > &cell_data, const Array4< const Real > &cell_prim, const Array4< Real > &cell_rhs, const Array4< Real > &xflux, const Array4< Real > &yflux, const Array4< Real > &zflux, const Array4< const EBCellFlag > &cfg_arr, const Array4< const Real > &ax_arr, const Array4< const Real > &ay_arr, const Array4< const Real > &az_arr, const Array4< const Real > &detJ, [[maybe_unused]] const Array4< const Real > &barea_arr, [[maybe_unused]] const Array4< const Real > &bcent_arr, const Real *dx_arr, const GpuArray< Real, AMREX_SPACEDIM > &cellSizeInv, [[maybe_unused]] Array4< Real > &hfx_z, [[maybe_unused]] Array4< Real > &qfx1_z, [[maybe_unused]] Array4< Real > &qfx2_z, Array4< Real > &hfx_EB, const Array4< const Real > &mu_turb, const SolverChoice &solverChoice, const int level, const BCRec *bc_ptr, const bool use_SurfLayer, const Vector< std::unique_ptr< SurfaceLayer >> &SurfLayer)
Definition: ERF_DiffusionSrcForState_EB.cpp:42
#define RhoScalar_comp
Definition: ERF_IndexDefines.H:43
#define Rho_comp
Definition: ERF_IndexDefines.H:39
#define RhoTheta_comp
Definition: ERF_IndexDefines.H:40
#define NSCALARS
Definition: ERF_IndexDefines.H:16
#define RhoQ1_comp
Definition: ERF_IndexDefines.H:45
#define PrimScalar_comp
Definition: ERF_IndexDefines.H:60
const Real dy
Definition: ERF_InitCustomPert_ABL.H:45
const Real dx
Definition: ERF_InitCustomPert_ABL.H:44
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 three
Definition: ERF_NumericalConstants.H:32
constexpr amrex::Real two
Definition: ERF_NumericalConstants.H:31
constexpr amrex::Real one
Definition: ERF_NumericalConstants.H:30
constexpr amrex::Real zero
Definition: ERF_NumericalConstants.H:29
constexpr amrex::Real myhalf
Definition: ERF_NumericalConstants.H:34
amrex::Real Real
Definition: ERF_ShocInterface.H:19
@ RhoScalar_bc_comp
Definition: ERF_IndexDefines.H:93
@ ext_dir
Definition: ERF_IndexDefines.H:297
@ ext_dir_prim
Definition: ERF_IndexDefines.H:300
@ ext_dir_upwind
Definition: ERF_IndexDefines.H:305
@ dz
Definition: ERF_AdvanceWDM6.cpp:272
Definition: ERF_EBStruct.H:36
EBBoundaryType eb_boundary_type
Boundary condition model applied on embedded-boundary surfaces.
Definition: ERF_EBStruct.H:75
EBChoice ebChoice
Embedded-boundary options.
Definition: ERF_DataStruct.H:1975