17 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
18 AMREX_SPACEDIM * divphi.num_comp() == phi.num_comp(),
19 "AMREX_SPACEDIM = " + std::to_string(AMREX_SPACEDIM) +
20 ", divphi.num_comp() = " + std::to_string(divphi.num_comp()) +
21 ", phi.num_comp() = " + std::to_string(phi.num_comp()));
22 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
23 m_phi.num_grow() > amrex::IntVect(0),
24 "m_phi.num_grow() = (" + std::to_string(
m_phi.num_grow()[0]) +
25 ", " + std::to_string(
m_phi.num_grow()[1]) +
", " +
26 std::to_string(
m_phi.num_grow()[2]) +
")");
32 const int ncomp =
m_divphi.num_comp();
33 const auto& geom =
m_phi.repo().mesh().Geom(lev);
34 const auto& idx = geom.InvCellSizeArray();
35 const auto dlo = geom.Domain().smallEnd();
36 const auto dhi = geom.Domain().bigEnd();
39 auto const& in_arrs =
m_phi(lev).const_arrays();
40 auto const& out_arrs = out_mf.arrays();
43 out_mf, amrex::IntVect(0),
44 [=] AMREX_GPU_DEVICE(
int nbx,
int i,
int j,
int k) {
45 if (!Stencil::applies_to(i, j, k, dlo, dhi)) {
48 auto const& phi_arr = in_arrs[nbx];
49 auto const& divphi_arr = out_arrs[nbx];
50 for (
int icomp = 0; icomp < ncomp; icomp++) {
51 divphi_arr(i, j, k, icomp) =
53 phi_arr(i + 1, j, k, (icomp * AMREX_SPACEDIM) + 0)) +
55 phi_arr(i, j, k, (icomp * AMREX_SPACEDIM) + 0)) +
57 phi_arr(i - 1, j, k, (icomp * AMREX_SPACEDIM) + 0))) *
60 divphi_arr(i, j, k, icomp) +=
62 phi_arr(i, j + 1, k, (icomp * AMREX_SPACEDIM) + 1)) +
64 phi_arr(i, j, k, (icomp * AMREX_SPACEDIM) + 1)) +
66 phi_arr(i, j - 1, k, (icomp * AMREX_SPACEDIM) + 1))) *
69 divphi_arr(i, j, k, icomp) +=
71 phi_arr(i, j, k + 1, (icomp * AMREX_SPACEDIM) + 2)) +
73 phi_arr(i, j, k, (icomp * AMREX_SPACEDIM) + 2)) +
75 phi_arr(i, j, k - 1, (icomp * AMREX_SPACEDIM) + 2))) *