30 const DiffusionType difftype,
const amrex::Real dt,
bool mesh_mapping)
32 amrex::Real factor = 0.0;
47 amrex::Abort(
"Invalid diffusion type");
52 auto fstate = std::is_same<Scheme, fvm::Godunov>::value
60 if (field.in_uniform_space() && mesh_mapping) {
61 field.to_stretched_space();
64 if (field_old.in_uniform_space() && mesh_mapping) {
65 field_old.to_stretched_space();
74 Field const* mesh_detJ =
78 for (
int lev = 0; lev < nlevels; ++lev) {
79 const auto& fld_arrs = field(lev).arrays();
80 const auto& fld_o_arrs = field_old(lev).const_arrays();
81 const auto& rho_o_arrs = den_old(lev).const_arrays();
82 const auto& rho_arrs = den_new(lev).const_arrays();
83 const auto& src_arrs = src_term(lev).const_arrays();
84 const auto& diff_arrs = diff_term(lev).const_arrays();
85 const auto& ddt_o_arrs = conv_term(lev).const_arrays();
86 const auto& imask_arrs = mask_cell(lev).const_arrays();
87 const auto& detJ_arrs =
88 mesh_mapping ? ((*mesh_detJ)(lev).const_arrays())
89 : amrex::MultiArray4<amrex::Real const>();
91 if (PDE::multiply_rho) {
95 field(lev), amrex::IntVect(0), PDE::ndim,
97 int nbx,
int i,
int j,
int k,
int n)
noexcept {
99 mesh_mapping ? (detJ_arrs[nbx](i, j, k)) : 1.0;
101 fld_arrs[nbx](i, j, k, n) =
102 rho_o_arrs[nbx](i, j, k) * det_j *
103 fld_o_arrs[nbx](i, j, k, n) +
104 static_cast<amrex::Real
>(imask_arrs[nbx](i, j, k)) *
106 (ddt_o_arrs[nbx](i, j, k, n) +
107 det_j * src_arrs[nbx](i, j, k, n) +
108 factor * diff_arrs[nbx](i, j, k, n));
110 fld_arrs[nbx](i, j, k, n) /= rho_arrs[nbx](i, j, k);
113 fld_arrs[nbx](i, j, k, n) /= det_j;
118 field(lev), amrex::IntVect(0), PDE::ndim,
119 [=] AMREX_GPU_DEVICE(
120 int nbx,
int i,
int j,
int k,
int n)
noexcept {
122 mesh_mapping ? (detJ_arrs[nbx](i, j, k)) : 1.0;
124 fld_arrs[nbx](i, j, k, n) =
125 det_j * fld_o_arrs[nbx](i, j, k, n) +
126 static_cast<amrex::Real
>(imask_arrs[nbx](i, j, k)) *
128 (ddt_o_arrs[nbx](i, j, k, n) +
129 det_j * src_arrs[nbx](i, j, k, n) +
130 factor * diff_arrs[nbx](i, j, k, n));
133 fld_arrs[nbx](i, j, k, n) /= det_j;
138 amrex::Gpu::streamSynchronize();
148 const DiffusionType difftype,
const amrex::Real dt,
bool mesh_mapping)
150 amrex::Real ofac = 0.0;
151 amrex::Real nfac = 0.0;
169 amrex::Abort(
"Invalid diffusion type");
176 if (field.in_uniform_space() && mesh_mapping) {
177 field.to_stretched_space();
180 if (field_old.in_uniform_space() && mesh_mapping) {
181 field_old.to_stretched_space();
192 Field const* mesh_detJ =
196 for (
int lev = 0; lev < nlevels; ++lev) {
197 const auto& fld_arrs = field(lev).arrays();
198 const auto& fld_o_arrs = field_old(lev).const_arrays();
199 const auto& rho_o_arrs = den_old(lev).const_arrays();
200 const auto& rho_arrs = den_new(lev).const_arrays();
201 const auto& src_arrs = src_term(lev).const_arrays();
202 const auto& diff_arrs = diff_term(lev).const_arrays();
203 const auto& ddt_arrs = conv_term(lev).const_arrays();
204 const auto& diff_o_arrs = diff_term_old(lev).const_arrays();
205 const auto& ddt_o_arrs = conv_term_old(lev).const_arrays();
206 const auto& imask_arrs = mask_cell(lev).const_arrays();
207 const auto& detJ_arrs =
208 mesh_mapping ? ((*mesh_detJ)(lev).const_arrays())
209 : amrex::MultiArray4<amrex::Real const>();
211 if (PDE::multiply_rho) {
215 field(lev), amrex::IntVect(0), PDE::ndim,
216 [=] AMREX_GPU_DEVICE(
217 int nbx,
int i,
int j,
int k,
int n)
noexcept {
219 mesh_mapping ? (detJ_arrs[nbx](i, j, k)) : 1.0;
221 fld_arrs[nbx](i, j, k, n) =
222 rho_o_arrs[nbx](i, j, k) * det_j *
223 fld_o_arrs[nbx](i, j, k, n) +
224 static_cast<amrex::Real
>(imask_arrs[nbx](i, j, k)) *
226 (0.5 * (ddt_o_arrs[nbx](i, j, k, n) +
227 ddt_arrs[nbx](i, j, k, n)) +
228 ofac * diff_o_arrs[nbx](i, j, k, n) +
229 nfac * diff_arrs[nbx](i, j, k, n) +
230 det_j * src_arrs[nbx](i, j, k, n));
232 fld_arrs[nbx](i, j, k, n) /= rho_arrs[nbx](i, j, k);
235 fld_arrs[nbx](i, j, k, n) /= det_j;
240 field(lev), amrex::IntVect(0), PDE::ndim,
241 [=] AMREX_GPU_DEVICE(
242 int nbx,
int i,
int j,
int k,
int n)
noexcept {
244 mesh_mapping ? (detJ_arrs[nbx](i, j, k)) : 1.0;
246 fld_arrs[nbx](i, j, k, n) =
247 det_j * fld_o_arrs[nbx](i, j, k, n) +
248 static_cast<amrex::Real
>(imask_arrs[nbx](i, j, k)) *
250 (0.5 * (ddt_o_arrs[nbx](i, j, k, n) +
251 ddt_arrs[nbx](i, j, k, n)) +
252 ofac * diff_o_arrs[nbx](i, j, k, n) +
253 nfac * diff_arrs[nbx](i, j, k, n) +
254 det_j * src_arrs[nbx](i, j, k, n));
257 fld_arrs[nbx](i, j, k, n) /= det_j;
262 amrex::Gpu::streamSynchronize();