1 #ifndef ERF_ADVECTION_SRC_FOR_SCALARS_H_
2 #define ERF_ADVECTION_SRC_FOR_SCALARS_H_
25 template<
typename InterpType_H,
typename InterpType_V>
29 const amrex::Array4<const amrex::Real>& scalar,
30 const int scalar_comp,
31 const amrex::GpuArray<
const amrex::Array4<amrex::Real>, AMREX_SPACEDIM>& flx_arr,
33 const amrex::Array4<const amrex::Real>& avg_xmom,
34 const amrex::Array4<const amrex::Real>& avg_ymom,
35 const amrex::Array4<const amrex::Real>& avg_zmom,
39 InterpType_H interp_h(scalar, horiz_upw_frac);
40 InterpType_V interp_v(scalar, vert_upw_frac);
42 const amrex::Box xbx = amrex::surroundingNodes(bx,0);
43 const amrex::Box ybx = amrex::surroundingNodes(bx,1);
44 const amrex::Box zbx = amrex::surroundingNodes(bx,2);
49 interp_h.InterpolateInX(i,j,k,scalar_comp,interpx,avg_xmom(i,j,k));
50 flx_arr[0](i,j,k,flux_comp) = avg_xmom(i,j,k) * interpx;
55 interp_h.InterpolateInY(i,j,k,scalar_comp,interpy,avg_ymom(i,j,k));
56 flx_arr[1](i,j,k,flux_comp) = avg_ymom(i,j,k) * interpy;
61 interp_v.InterpolateInZ(i,j,k,scalar_comp,interpz,avg_zmom(i,j,k));
62 flx_arr[2](i,j,k,flux_comp) = avg_zmom(i,j,k) * interpz;
81 const amrex::Array4<const amrex::Real>& scalar,
82 const int scalar_comp,
83 const amrex::GpuArray<
const amrex::Array4<amrex::Real>, AMREX_SPACEDIM>& flx_arr,
85 const amrex::Array4<const amrex::Real>& avg_xmom,
86 const amrex::Array4<const amrex::Real>& avg_ymom,
87 const amrex::Array4<const amrex::Real>& avg_zmom)
89 const amrex::Box xbx = amrex::surroundingNodes(bx,0);
90 const amrex::Box ybx = amrex::surroundingNodes(bx,1);
91 const amrex::Box zbx = amrex::surroundingNodes(bx,2);
96 (scalar(i,j,k,scalar_comp) + scalar(i-1,j,k,scalar_comp));
97 flx_arr[0](i,j,k,flux_comp) = avg_xmom(i,j,k) * scalar_on_face;
102 (scalar(i,j,k,scalar_comp) + scalar(i,j-1,k,scalar_comp));
103 flx_arr[1](i,j,k,flux_comp) = avg_ymom(i,j,k) * scalar_on_face;
108 (scalar(i,j,k,scalar_comp) + scalar(i,j,k-1,scalar_comp));
109 flx_arr[2](i,j,k,flux_comp) = avg_zmom(i,j,k) * scalar_on_face;
129 template<
typename InterpType_H>
132 const amrex::Box& bx,
133 const amrex::Array4<const amrex::Real>& scalar,
134 const int scalar_comp,
135 const amrex::GpuArray<
const amrex::Array4<amrex::Real>, AMREX_SPACEDIM>& flx_arr,
137 const amrex::Array4<const amrex::Real>& avg_xmom,
138 const amrex::Array4<const amrex::Real>& avg_ymom,
139 const amrex::Array4<const amrex::Real>& avg_zmom,
144 switch (vert_adv_type) {
146 BuildScalarAdvectionFluxesWithPolicy<InterpType_H,CENTERED2>(
147 bx, scalar, scalar_comp, flx_arr, flux_comp,
148 avg_xmom, avg_ymom, avg_zmom, horiz_upw_frac, vert_upw_frac);
151 BuildScalarAdvectionFluxesWithPolicy<InterpType_H,UPWIND3>(
152 bx, scalar, scalar_comp, flx_arr, flux_comp,
153 avg_xmom, avg_ymom, avg_zmom, horiz_upw_frac, vert_upw_frac);
156 BuildScalarAdvectionFluxesWithPolicy<InterpType_H,UPWIND3SL>(
157 bx, scalar, scalar_comp, flx_arr, flux_comp,
158 avg_xmom, avg_ymom, avg_zmom, horiz_upw_frac, vert_upw_frac);
161 BuildScalarAdvectionFluxesWithPolicy<InterpType_H,CENTERED4>(
162 bx, scalar, scalar_comp, flx_arr, flux_comp,
163 avg_xmom, avg_ymom, avg_zmom, horiz_upw_frac, vert_upw_frac);
166 BuildScalarAdvectionFluxesWithPolicy<InterpType_H,UPWIND5>(
167 bx, scalar, scalar_comp, flx_arr, flux_comp,
168 avg_xmom, avg_ymom, avg_zmom, horiz_upw_frac, vert_upw_frac);
171 BuildScalarAdvectionFluxesWithPolicy<InterpType_H,CENTERED6>(
172 bx, scalar, scalar_comp, flx_arr, flux_comp,
173 avg_xmom, avg_ymom, avg_zmom, horiz_upw_frac, vert_upw_frac);
181 amrex::Abort(
"Unknown or unsupported vertical advection scheme!");
205 const amrex::Box& bx,
206 const amrex::Array4<const amrex::Real>& scalar,
207 const int scalar_comp,
208 const amrex::GpuArray<
const amrex::Array4<amrex::Real>, AMREX_SPACEDIM>& flx_arr,
210 const amrex::Array4<const amrex::Real>& avg_xmom,
211 const amrex::Array4<const amrex::Real>& avg_ymom,
212 const amrex::Array4<const amrex::Real>& avg_zmom,
221 bx, scalar, scalar_comp, flx_arr, flux_comp,
222 avg_xmom, avg_ymom, avg_zmom);
226 switch (horiz_adv_type) {
228 BuildScalarAdvectionFluxesVert<CENTERED2>(
229 bx, scalar, scalar_comp, flx_arr, flux_comp,
230 avg_xmom, avg_ymom, avg_zmom, horiz_upw_frac, vert_upw_frac, vert_adv_type);
233 BuildScalarAdvectionFluxesVert<UPWIND3>(
234 bx, scalar, scalar_comp, flx_arr, flux_comp,
235 avg_xmom, avg_ymom, avg_zmom, horiz_upw_frac, vert_upw_frac, vert_adv_type);
238 BuildScalarAdvectionFluxesVert<UPWIND3SL>(
239 bx, scalar, scalar_comp, flx_arr, flux_comp,
240 avg_xmom, avg_ymom, avg_zmom, horiz_upw_frac, vert_upw_frac, vert_adv_type);
243 BuildScalarAdvectionFluxesVert<CENTERED4>(
244 bx, scalar, scalar_comp, flx_arr, flux_comp,
245 avg_xmom, avg_ymom, avg_zmom, horiz_upw_frac, vert_upw_frac, vert_adv_type);
248 BuildScalarAdvectionFluxesVert<UPWIND5>(
249 bx, scalar, scalar_comp, flx_arr, flux_comp,
250 avg_xmom, avg_ymom, avg_zmom, horiz_upw_frac, vert_upw_frac, vert_adv_type);
253 BuildScalarAdvectionFluxesVert<CENTERED6>(
254 bx, scalar, scalar_comp, flx_arr, flux_comp,
255 avg_xmom, avg_ymom, avg_zmom, horiz_upw_frac, vert_upw_frac, vert_adv_type);
258 BuildScalarAdvectionFluxesWithPolicy<WENO3,WENO3>(
259 bx, scalar, scalar_comp, flx_arr, flux_comp,
260 avg_xmom, avg_ymom, avg_zmom, horiz_upw_frac, vert_upw_frac);
263 BuildScalarAdvectionFluxesWithPolicy<WENO5,WENO5>(
264 bx, scalar, scalar_comp, flx_arr, flux_comp,
265 avg_xmom, avg_ymom, avg_zmom, horiz_upw_frac, vert_upw_frac);
268 BuildScalarAdvectionFluxesWithPolicy<WENO7,WENO7>(
269 bx, scalar, scalar_comp, flx_arr, flux_comp,
270 avg_xmom, avg_ymom, avg_zmom, horiz_upw_frac, vert_upw_frac);
273 BuildScalarAdvectionFluxesWithPolicy<WENO_Z3,WENO_Z3>(
274 bx, scalar, scalar_comp, flx_arr, flux_comp,
275 avg_xmom, avg_ymom, avg_zmom, horiz_upw_frac, vert_upw_frac);
278 BuildScalarAdvectionFluxesWithPolicy<WENO_MZQ3,WENO_MZQ3>(
279 bx, scalar, scalar_comp, flx_arr, flux_comp,
280 avg_xmom, avg_ymom, avg_zmom, horiz_upw_frac, vert_upw_frac);
283 BuildScalarAdvectionFluxesWithPolicy<WENO_Z5,WENO_Z5>(
284 bx, scalar, scalar_comp, flx_arr, flux_comp,
285 avg_xmom, avg_ymom, avg_zmom, horiz_upw_frac, vert_upw_frac);
288 BuildScalarAdvectionFluxesWithPolicy<WENO_Z7,WENO_Z7>(
289 bx, scalar, scalar_comp, flx_arr, flux_comp,
290 avg_xmom, avg_ymom, avg_zmom, horiz_upw_frac, vert_upw_frac);
295 amrex::Abort(
"Unknown horizontal advection scheme!");
314 const amrex::Box& bx,
315 const amrex::GpuArray<
const amrex::Array4<amrex::Real>, AMREX_SPACEDIM>& flx_arr,
317 const amrex::Array4<amrex::Real>& rhs,
319 const amrex::Array4<const amrex::Real>& detJ,
320 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
321 const amrex::Array4<const amrex::Real>& mf_mx,
322 const amrex::Array4<const amrex::Real>& mf_my)
324 const auto dxInv = cellSizeInv[0];
325 const auto dyInv = cellSizeInv[1];
326 const auto dzInv = cellSizeInv[2];
330 if (detJ(i,j,k) >
zero) {
332 const amrex::Real mfsq = mf_mx(i,j,0) * mf_my(i,j,0);
333 rhs(i,j,k,rhs_comp) = - invdetJ * mfsq * (
334 (flx_arr[0](i+1,j,k,flux_comp) - flx_arr[0](i,j,k,flux_comp)) *
dxInv +
335 (flx_arr[1](i,j+1,k,flux_comp) - flx_arr[1](i,j,k,flux_comp)) * dyInv +
336 (flx_arr[2](i,j,k+1,flux_comp) - flx_arr[2](i,j,k,flux_comp)) * dzInv);
338 rhs(i,j,k,rhs_comp) =
zero;
void BuildScalarAdvectionFluxesCentered2(const amrex::Box &bx, const amrex::Array4< const amrex::Real > &scalar, const int scalar_comp, const amrex::GpuArray< const amrex::Array4< amrex::Real >, AMREX_SPACEDIM > &flx_arr, const int flux_comp, const amrex::Array4< const amrex::Real > &avg_xmom, const amrex::Array4< const amrex::Real > &avg_ymom, const amrex::Array4< const amrex::Real > &avg_zmom)
Definition: ERF_AdvectionSrcForScalars.H:79
void BuildScalarAdvectionFluxes(const amrex::Box &bx, const amrex::Array4< const amrex::Real > &scalar, const int scalar_comp, const amrex::GpuArray< const amrex::Array4< amrex::Real >, AMREX_SPACEDIM > &flx_arr, const int flux_comp, const amrex::Array4< const amrex::Real > &avg_xmom, const amrex::Array4< const amrex::Real > &avg_ymom, const amrex::Array4< const amrex::Real > &avg_zmom, const AdvType horiz_adv_type, const AdvType vert_adv_type, const amrex::Real horiz_upw_frac, const amrex::Real vert_upw_frac)
Definition: ERF_AdvectionSrcForScalars.H:204
void BuildScalarAdvectionFluxesWithPolicy(const amrex::Box &bx, const amrex::Array4< const amrex::Real > &scalar, const int scalar_comp, const amrex::GpuArray< const amrex::Array4< amrex::Real >, AMREX_SPACEDIM > &flx_arr, const int flux_comp, const amrex::Array4< const amrex::Real > &avg_xmom, const amrex::Array4< const amrex::Real > &avg_ymom, const amrex::Array4< const amrex::Real > &avg_zmom, const amrex::Real horiz_upw_frac, const amrex::Real vert_upw_frac)
Definition: ERF_AdvectionSrcForScalars.H:27
void ApplyScalarAdvectionFluxDivergence(const amrex::Box &bx, const amrex::GpuArray< const amrex::Array4< amrex::Real >, AMREX_SPACEDIM > &flx_arr, const int flux_comp, const amrex::Array4< amrex::Real > &rhs, const int rhs_comp, const amrex::Array4< const amrex::Real > &detJ, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &mf_mx, const amrex::Array4< const amrex::Real > &mf_my)
Definition: ERF_AdvectionSrcForScalars.H:313
void BuildScalarAdvectionFluxesVert(const amrex::Box &bx, const amrex::Array4< const amrex::Real > &scalar, const int scalar_comp, const amrex::GpuArray< const amrex::Array4< amrex::Real >, AMREX_SPACEDIM > &flx_arr, const int flux_comp, const amrex::Array4< const amrex::Real > &avg_xmom, const amrex::Array4< const amrex::Real > &avg_ymom, const amrex::Array4< const amrex::Real > &avg_zmom, const amrex::Real horiz_upw_frac, const amrex::Real vert_upw_frac, const AdvType vert_adv_type)
Definition: ERF_AdvectionSrcForScalars.H:131
AdvType
Definition: ERF_IndexDefines.H:309
amrex::GpuArray< Real, AMREX_SPACEDIM > dxInv
Definition: ERF_InitCustomPertVels_ParticleTests.H:17
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 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