1#ifndef REMORA_FILLPATCHER_H_
2#define REMORA_FILLPATCHER_H_
5#include <AMReX_FillPatchUtil.H>
6#include <AMReX_Interp_C.H>
7#include <AMReX_MFInterp_C.H>
14 REMORAFillPatcher (amrex::BoxArray
const& fba, amrex::DistributionMapping
const& fdm,
15 amrex::Geometry
const& fgeom,
16 amrex::BoxArray
const& cba, amrex::DistributionMapping
const& cdm,
17 amrex::Geometry
const& cgeom,
18 int nghost,
int nghost_set,
int ncomp, amrex::InterpBase* interp);
21 void Define (amrex::BoxArray
const& fba, amrex::DistributionMapping
const& fdm,
22 amrex::Geometry
const& fgeom,
23 amrex::BoxArray
const& cba, amrex::DistributionMapping
const& cdm,
24 amrex::Geometry
const& cgeom,
25 int nghost,
int nghost_set,
int ncomp,
26 amrex::InterpBase* interp);
29 void BuildMask (amrex::BoxArray
const& fba,
int nghost,
int nghost_set);
33 amrex::Vector<amrex::Real>
const& crse_time);
37 amrex::MultiFab
const& crse,
42 amrex::MultiFab
const& crse,
43 amrex::Vector<amrex::BCRec>
const& bcr,
53 template <
typename BC>
54 void FillSet (amrex::MultiFab& mf, amrex::Real
time,
55 BC& cbc, amrex::Vector<amrex::BCRec>
const& bcs);
58 template <
typename BC>
60 BC& cbc, amrex::Vector<amrex::BCRec>
const& bcs);
62 template <
typename BC>
63 void Fill (amrex::MultiFab& mf, amrex::Real
time,
64 BC& cbc, amrex::Vector<amrex::BCRec>
const& bcs,
int mask_val);
70 amrex::DistributionMapping
m_fdm;
71 amrex::DistributionMapping
m_cdm;
97 BC& cbc, amrex::Vector<amrex::BCRec>
const& bcs)
108template <
typename BC>
111 BC& cbc, amrex::Vector<amrex::BCRec>
const& bcs)
123template <
typename BC>
126 BC& cbc, amrex::Vector<amrex::BCRec>
const& bcs,
int mask_val)
128 constexpr amrex::Real eps = std::numeric_limits<float>::epsilon();
134 amrex::Real fac_old =
one - fac_new;
145 amrex::MultiFab::LinComb(crse_data_time_interp,
148 0,
m_ncomp, amrex::IntVect{0});
151 amrex::IndexType m_ixt = mf.boxArray().ixType();
152 int ixt_sum = m_ixt[0]+m_ixt[1]+m_ixt[2];
154 InterpCell(mf,crse_data_time_interp,bcs,mask_val);
155 }
else if (ixt_sum == 1) {
156 InterpFace(mf,crse_data_time_interp,mask_val);
158 amrex::Abort(
"REMORA_FillPatcher only supports face linear and cell cons linear interp!");
constexpr amrex::Real one
AMREX_ALWAYS_ASSERT(!NSPeriodic||!EWPeriodic)
amrex::InterpBase * m_interp
void FillRelax(amrex::MultiFab &mf, amrex::Real time, BC &cbc, amrex::Vector< amrex::BCRec > const &bcs)
Fill fine data in the relax region.
amrex::DistributionMapping m_fdm
amrex::iMultiFab * GetMask()
void Define(amrex::BoxArray const &fba, amrex::DistributionMapping const &fdm, amrex::Geometry const &fgeom, amrex::BoxArray const &cba, amrex::DistributionMapping const &cdm, amrex::Geometry const &cgeom, int nghost, int nghost_set, int ncomp, amrex::InterpBase *interp)
Redefine the coarse and fine patch MultiFabs.
void RegisterCoarseData(amrex::Vector< amrex::MultiFab const * > const &crse_data, amrex::Vector< amrex::Real > const &crse_time)
Register the coarse data to be used by the REMORAFillPatcher.
void InterpCell(amrex::MultiFab &fine, amrex::MultiFab const &crse, amrex::Vector< amrex::BCRec > const &bcr, int mask_val)
Interpolate to cell centers.
void Fill(amrex::MultiFab &mf, amrex::Real time, BC &cbc, amrex::Vector< amrex::BCRec > const &bcs, int mask_val)
Fill fine data in the relax region.
amrex::Vector< amrex::Real > m_crse_times
void InterpFace(amrex::MultiFab &fine, amrex::MultiFab const &crse, int mask_val)
Interpolate to cell faces.
std::unique_ptr< amrex::MultiFab > m_cf_crse_data_new
void BuildMask(amrex::BoxArray const &fba, int nghost, int nghost_set)
Generate masking array.
amrex::DistributionMapping m_cdm
std::unique_ptr< amrex::iMultiFab > m_cf_mask
std::unique_ptr< amrex::MultiFab > m_cf_crse_data_old
void FillSet(amrex::MultiFab &mf, amrex::Real time, BC &cbc, amrex::Vector< amrex::BCRec > const &bcs)
Fill fine data in the set region.