Function for computing the coefficients for the tridiagonal solver used in the fast integrator (the acoustic substepping).
48 const GpuArray<Real, AMREX_SPACEDIM>
dxInv = geom.InvCellSizeArray();
51 const Box &domain = geom.Domain();
53 MultiFab coeff_A_mf(fast_coeffs, amrex::make_alias, 0, 1);
54 MultiFab coeff_B_mf(fast_coeffs, amrex::make_alias, 1, 1);
55 MultiFab coeff_C_mf(fast_coeffs, amrex::make_alias, 2, 1);
56 MultiFab coeff_P_mf(fast_coeffs, amrex::make_alias, 3, 1);
57 MultiFab coeff_Q_mf(fast_coeffs, amrex::make_alias, 4, 1);
62 const Array<Real,AMREX_SPACEDIM> grav{
zero,
zero, -gravity};
63 const GpuArray<Real,AMREX_SPACEDIM> grav_gpu{grav[0], grav[1], grav[2]};
69 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
75 Box bx = mfi.tilebox();
76 Box tbz = surroundingNodes(bx,2);
78 const Array4<const Real> & stage_cons = S_stage_data[
IntVars::cons].const_array(mfi);
79 const Array4<const Real> & prim = S_stage_prim.const_array(mfi);
81 const Array4<const Real>& detJ = (mesh_type != MeshType::ConstantDz) ?
82 detJ_cc->const_array(mfi) : Array4<const Real>{};
84 const Array4<const Real>& pi_stage_ca = pi_stage.const_array(mfi);
86 FArrayBox gam_fab; gam_fab.resize(surroundingNodes(bx,2),1,The_Async_Arena());
88 auto const& coeffA_a = coeff_A_mf.array(mfi);
89 auto const& coeffB_a = coeff_B_mf.array(mfi);
90 auto const& coeffC_a = coeff_C_mf.array(mfi);
91 auto const& coeffP_a = coeff_P_mf.array(mfi);
92 auto const& coeffQ_a = coeff_Q_mf.array(mfi);
93 auto const& gam_a = gam_fab.array();
99 Box bx_shrunk_in_k = bx;
100 int klo = tbz.smallEnd(2);
101 int khi = tbz.bigEnd(2);
102 bx_shrunk_in_k.setSmall(2,
klo+1);
103 bx_shrunk_in_k.setBig(2,
khi-1);
111 if (mesh_type != MeshType::ConstantDz)
113 ParallelFor(bx_shrunk_in_k, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
115 Real pi_c =
myhalf * (pi_stage_ca(i,j,k-1) + pi_stage_ca(i,j,k));
117 Real detJ_on_kface =
myhalf * (detJ(i,j,k) + detJ(i,j,k-1));
118 Real inv_detJ_on_kface =
one / detJ_on_kface;
125 Real Thm_grad = dzi * inv_detJ_on_kface * ( Thm_hi - Thm_lo );
135 if (l_use_moisture) {
138 coeff_P /= (
one +
q);
139 coeff_Q /= (
one +
q);
145 coeffP_a(i,j,k) = coeff_P;
146 coeffQ_a(i,j,k) = coeff_Q;
153 Real D = beta_2 * beta_2 * dzi *
static_cast<Real>(dtau * dtau);
154 coeffA_a(i,j,k) = D * (
one/detJ(i,j,k-1)) * ( halfg - coeff_Q * theta_t_lo );
155 coeffC_a(i,j,k) = D * (
one/detJ(i,j,k )) * (-halfg + coeff_P * theta_t_hi );
157 coeffB_a(i,j,k) =
one + D * ( (coeff_Q/detJ(i,j,k-1) - coeff_P/detJ(i,j,k)) * theta_t_mid
158 + halfg * (
one/detJ(i,j,k) -
one/detJ(i,j,k-1)) );
163 ParallelFor(bx_shrunk_in_k, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
165 Real pi_c =
myhalf * (pi_stage_ca(i,j,k-1) + pi_stage_ca(i,j,k));
172 Real Thm_grad = dzi * ( Thm_hi - Thm_lo );
182 if (l_use_moisture) {
185 coeff_P /= (
one +
q);
186 coeff_Q /= (
one +
q);
192 coeffP_a(i,j,k) = coeff_P;
193 coeffQ_a(i,j,k) = coeff_Q;
200 Real D = beta_2 * beta_2 * dzi *
static_cast<Real>(dtau * dtau);
201 coeffA_a(i,j,k) = D * ( halfg - coeff_Q * theta_t_lo );
202 coeffC_a(i,j,k) = D * (-halfg + coeff_P * theta_t_hi );
204 coeffB_a(i,j,k) =
one + D * (coeff_Q - coeff_P) * theta_t_mid;
208 amrex::Box b2d = tbz;
211 auto const lo = amrex::lbound(bx);
212 auto const hi = amrex::ubound(bx);
214 auto const domhi = amrex::ubound(domain);
217 BL_PROFILE(
"make_coeffs_b2d_loop");
219 ParallelFor(b2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) {
222 coeffA_a(i,j,
lo.z) =
zero;
223 coeffB_a(i,j,
lo.z) =
one;
224 coeffC_a(i,j,
lo.z) =
zero;
227 coeffA_a(i,j,
hi.z+1) =
zero;
228 coeffB_a(i,j,
hi.z+1) =
one;
229 coeffC_a(i,j,
hi.z+1) =
zero;
233 if ( (
hi.z == domhi.z) &&
236 coeffA_a(i,j,
hi.z+1) = -
one;
240 gam_a(i,j,
lo.z) = coeffC_a(i,j,
lo.z) / coeffB_a(i,j,
lo.z);
241 for (
int k =
lo.z+1; k <=
hi.z+1; k++) {
242 coeffB_a(i,j,k) =
one / ( coeffB_a(i,j,k) - coeffA_a(i,j,k)*gam_a(i,j,k-1) );
243 gam_a(i,j,k) = coeffC_a(i,j,k) * coeffB_a(i,j,k);
248 for (
int j =
lo.y; j <=
hi.y; ++j) {
250 for (
int i =
lo.x; i <=
hi.x; ++i) {
251 coeffA_a(i,j,
lo.z) =
zero;
252 coeffB_a(i,j,
lo.z) =
one;
253 coeffC_a(i,j,
lo.z) =
zero;
254 gam_a(i,j,
lo.z) = coeffC_a(i,j,
lo.z) / coeffB_a(i,j,
lo.z);
257 for (
int j =
lo.y; j <=
hi.y; ++j) {
259 for (
int i =
lo.x; i <=
hi.x; ++i) {
262 coeffA_a(i,j,
hi.z+1) =
zero;
263 coeffB_a(i,j,
hi.z+1) =
one;
264 coeffC_a(i,j,
hi.z+1) =
zero;
268 if ( (
hi.z == domhi.z) &&
271 coeffA_a(i,j,
hi.z+1) = -
one;
275 for (
int k =
lo.z+1; k <=
hi.z+1; ++k) {
276 for (
int j =
lo.y; j <=
hi.y; ++j) {
278 for (
int i =
lo.x; i <=
hi.x; ++i) {
279 coeffB_a(i,j,k) =
one / ( coeffB_a(i,j,k) - coeffA_a(i,j,k)*gam_a(i,j,k-1) );
280 gam_a(i,j,k) = coeffC_a(i,j,k) * coeffB_a(i,j,k);
constexpr amrex::Real RvoRd
Definition: ERF_Constants.H:43
constexpr amrex::Real R_d
Definition: ERF_Constants.H:34
constexpr amrex::Real Gamma
Definition: ERF_Constants.H:54
#define PrimQ1_comp
Definition: ERF_IndexDefines.H:61
#define PrimQ2_comp
Definition: ERF_IndexDefines.H:62
#define RhoTheta_comp
Definition: ERF_IndexDefines.H:40
#define PrimTheta_comp
Definition: ERF_IndexDefines.H:58
amrex::GpuArray< Real, AMREX_SPACEDIM > dxInv
Definition: ERF_InitCustomPertVels_ParticleTests.H:17
const int klo
Definition: ERF_InitCustomPert_ABL.H:75
const int khi
Definition: ERF_InitCustomPert_Bubble.H:21
void make_fast_coeffs(int, MultiFab &fast_coeffs, Vector< MultiFab > &S_stage_data, const MultiFab &S_stage_prim, const MultiFab &pi_stage, const amrex::Geometry geom, bool l_use_moisture, MeshType mesh_type, Real gravity, Real c_p, std::unique_ptr< MultiFab > &detJ_cc, const double dtau, Real beta_s, amrex::GpuArray< ERF_BC, AMREX_SPACEDIM *2 > &phys_bc_type)
Definition: ERF_MakeFastCoeffs.cpp:28
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
AMREX_FORCE_INLINE amrex::IntVect TileNoZ()
Definition: ERF_TileNoZ.H:11
@ cons
Definition: ERF_IndexDefines.H:232
@ q
Definition: ERF_WSM6.H:273