21 Filter(FTypeOut& filterphi,
const FTypeIn& phi)
24 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
25 filterphi.num_comp() == phi.num_comp(),
26 "filterphi.num_comp() = " + std::to_string(filterphi.num_comp()) +
27 ", phi.num_comp() = " + std::to_string(phi.num_comp()));
28 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
29 m_phi.num_grow() > amrex::IntVect(0),
30 "m_phi.num_grow() = (" + std::to_string(
m_phi.num_grow()[0]) +
31 ", " + std::to_string(
m_phi.num_grow()[1]) +
", " +
32 std::to_string(
m_phi.num_grow()[2]) +
")");
38 const int ncomp =
m_phi.num_comp();
39 const auto& geom =
m_phi.repo().mesh().Geom(lev);
40 const auto dlo = geom.Domain().smallEnd();
41 const auto dhi = geom.Domain().bigEnd();
44 auto const& in_arrs =
m_phi(lev).const_arrays();
45 auto const& out_arrs = out_mf.arrays();
48 out_mf, amrex::IntVect(0),
49 [=] AMREX_GPU_DEVICE(
int nbx,
int i,
int j,
int k) {
50 if (!Stencil::applies_to(i, j, k, dlo, dhi)) {
53 auto const& phi_arr = in_arrs[nbx];
54 auto const& filterphi_arr = out_arrs[nbx];
55 for (
int icomp = 0; icomp < ncomp; icomp++) {
56 const amrex::Real filx =
57 (Stencil::f00 * phi_arr(i + 1, j, k, icomp)) +
58 (Stencil::f01 * phi_arr(i, j, k, icomp)) +
59 (Stencil::f02 * phi_arr(i - 1, j, k, icomp));
60 const amrex::Real fily =
61 (Stencil::f10 * phi_arr(i, j + 1, k, icomp)) +
62 (Stencil::f11 * phi_arr(i, j, k, icomp)) +
63 (Stencil::f12 * phi_arr(i, j - 1, k, icomp));
64 const amrex::Real filz =
65 (Stencil::f20 * phi_arr(i, j, k + 1, icomp)) +
66 (Stencil::f21 * phi_arr(i, j, k, icomp)) +
67 (Stencil::f22 * phi_arr(i, j, k - 1, icomp));
68 filterphi_arr(i, j, k, icomp) =
69 1.0_rt / 3.0_rt * (filx + fily + filz);