Skip to content

Commit

Permalink
Add a new InterFromCoarseLevel for ERF
Browse files Browse the repository at this point in the history
  • Loading branch information
WeiqunZhang committed Sep 16, 2024
1 parent dfe1747 commit 38687ce
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 0 deletions.
15 changes: 15 additions & 0 deletions Src/AmrCore/AMReX_FillPatchUtil.H
Original file line number Diff line number Diff line change
Expand Up @@ -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 <typename MF, typename Interp>
std::enable_if_t<IsFabArray<MF>::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<BCRec>& bcs);

#ifndef BL_NO_FORT
enum InterpEM_t { InterpE, InterpB};

Expand Down
29 changes: 29 additions & 0 deletions Src/AmrCore/AMReX_FillPatchUtil_I.H
Original file line number Diff line number Diff line change
Expand Up @@ -1210,6 +1210,35 @@ InterpFromCoarseLevel (Array<MF*, AMREX_SPACEDIM> const& mf, IntVect const& ngho
}
}

template <typename MF, typename Interp>
std::enable_if_t<IsFabArray<MF>::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<BCRec>& 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 <typename MF, typename BC, typename Interp>
std::enable_if_t<IsFabArray<MF>::value>
FillPatchNLevels (MF& mf, int level, const IntVect& nghost, Real time,
Expand Down

0 comments on commit 38687ce

Please sign in to comment.