diff --git a/Src/AmrCore/AMReX_FillPatchUtil.H b/Src/AmrCore/AMReX_FillPatchUtil.H index e740ccce0d..652c50f9d7 100644 --- a/Src/AmrCore/AMReX_FillPatchUtil.H +++ b/Src/AmrCore/AMReX_FillPatchUtil.H @@ -694,6 +694,21 @@ namespace amrex const PreInterpHook& pre_interp = {}, const PostInterpHook& post_interp = {}); + /** + * \brief Fill with interpolation of coarse level data + * + * No ghost cells of the destination MF on the fine level are + * filled. It's the caller's responsibility to make sure all ghost cells + * of the coarse MF needed for interpolation are filled already before + * calling this function. There is no support for EB. + */ + template + std::enable_if_t::value> + InterpFromCoarseLevel (MF& mf, const MF& cmf, int scomp, int dcomp, int ncomp, + const Geometry& cgeom, const Geometry& fgeom, + const IntVect& ratio, Interp* mapper, + const Vector& bcs); + #ifndef BL_NO_FORT enum InterpEM_t { InterpE, InterpB}; diff --git a/Src/AmrCore/AMReX_FillPatchUtil_I.H b/Src/AmrCore/AMReX_FillPatchUtil_I.H index 190566a7fa..bc0ba93b1d 100644 --- a/Src/AmrCore/AMReX_FillPatchUtil_I.H +++ b/Src/AmrCore/AMReX_FillPatchUtil_I.H @@ -1210,6 +1210,35 @@ InterpFromCoarseLevel (Array const& mf, IntVect const& ngho } } +template +std::enable_if_t::value> +InterpFromCoarseLevel (MF& mf, const MF& cmf, int scomp, int dcomp, int ncomp, + const Geometry& cgeom, const Geometry& fgeom, + const IntVect& ratio, Interp* mapper, + const Vector& bcs) +{ + const InterpolaterBoxCoarsener& coarsener = mapper->BoxCoarsener(ratio); + + const BoxArray& ba = mf.boxArray(); + const DistributionMapping& dm = mf.DistributionMap(); + + const IndexType& typ = ba.ixType(); + + BL_ASSERT(typ == cmf.boxArray().ixType()); + + BoxArray ba_crse_patch(ba.size()); + for (int i = 0, N = ba.size(); i < N; ++i) + { + ba_crse_patch.set(i, coarsener.doit(ba[i])); + } + + MF mf_crse_patch(ba_crse_patch, dm, ncomp, 0); + mf_crse_patch.ParallelCopy(cmf, scomp, 0, ncomp, cgeom.periodicity()); + + FillPatchInterp(mf, dcomp, mf_crse_patch, 0, ncomp, IntVect(0), cgeom, fgeom, + amrex::convert(fgeom.Domain(),type), ratio, mapper, bcs, 0); +} + template std::enable_if_t::value> FillPatchNLevels (MF& mf, int level, const IntVect& nghost, Real time,