1#ifndef INTEGRATOR_BASEFIELD_H
2#define INTEGRATOR_BASEFIELD_H
4#include "AMReX_FillPatchUtil.H"
20 const amrex::BoxArray& cgrids,
21 const amrex::DistributionMapping& dm) = 0;
24 const amrex::BoxArray& cgrids,
25 const amrex::DistributionMapping& dm) = 0;
28 const amrex::BoxArray& cgrids,
29 const amrex::DistributionMapping& dm) = 0;
33 virtual void AverageDown(
const int lev, amrex::IntVect refRatio) = 0;
36 virtual void Copy(
int , amrex::MultiFab &,
int ,
int ) = 0;
38 virtual std::string
Name(
int) = 0;
39 virtual void setName(std::string a_name) = 0;
41 virtual void setBC(
void * a_bc) = 0;
53 virtual void operator () (amrex::FabArray<amrex::BaseFab<T>> & ,
54 int ,
int , amrex::IntVect
const& ,
57 amrex::BCRec
GetBCRec() {
return amrex::BCRec();}
61 const amrex::Vector<amrex::Geometry> &a_geom,
62 const amrex::Vector<amrex::IntVect> &a_refRatio,
63 int a_ncomp,
int a_nghost) :
70 amrex::Vector<std::unique_ptr<amrex::FabArray<amrex::BaseFab<T>>>> &source_mf,
71 amrex::FabArray<amrex::BaseFab<T>> &destination_mf,
77 amrex::Vector<amrex::FabArray<amrex::BaseFab<T>>*> smf;
78 smf.push_back(source_mf[lev].get());
79 amrex::Vector<amrex::Real> stime;
80 stime.push_back(time);
85 amrex::FillPatchSingleLevel(destination_mf, time, smf, stime,
86 0, icomp, destination_mf.nComp(),
m_geom[lev],
91 amrex::FillPatchSingleLevel(destination_mf, time, smf, stime,
92 0, icomp, destination_mf.nComp(),
m_geom[lev],
98 amrex::Vector<amrex::FabArray<amrex::BaseFab<T>>*> cmf, fmf;
99 cmf.push_back(source_mf[lev-1].get());
100 fmf.push_back(source_mf[lev].get());
101 amrex::Vector<amrex::Real> ctime, ftime;
102 ctime.push_back(time);
103 ftime.push_back(time);
105 amrex::Vector<amrex::BCRec> bcs(destination_mf.nComp(), physbc.
GetBCRec());
107 if (destination_mf.boxArray().ixType() == amrex::IndexType::TheNodeType())
109 amrex::FillPatchTwoLevels(destination_mf, time, cmf, ctime, fmf, ftime,
110 0, icomp, destination_mf.nComp(),
m_geom[lev-1],
m_geom[lev],
146 BL_PROFILE(
"Integrator::FillCoarsePatch");
147 AMREX_ASSERT(lev > 0);
153 amrex::Vector<amrex::FabArray<amrex::BaseFab<T>> *> cmf;
154 cmf.push_back(
m_field[lev-1].get());
155 amrex::Vector<amrex::Real> ctime;
156 ctime.push_back(time);
157 amrex::Vector<amrex::BCRec> bcs(ncomp, physbc.
GetBCRec());
158 amrex::InterpFromCoarseLevel(*
m_field[lev], time, *cmf[0], 0, icomp, ncomp,
191 const amrex::BoxArray& cgrids,
192 const amrex::DistributionMapping& dm)
override
197 amrex::BoxArray ngrids = cgrids;
198 ngrids.convert(amrex::IntVect::TheNodeVector());
199 amrex::FabArray<amrex::BaseFab<T>> new_state(ngrids, dm,
m_ncomp,
m_nghost);
201 std::swap(new_state, *
m_field[lev]);
205 amrex::FabArray<amrex::BaseFab<T>> new_state(cgrids, dm,
m_ncomp,
m_nghost);
207 std::swap(new_state, *
m_field[lev]);
215 const amrex::BoxArray& cgrids,
216 const amrex::DistributionMapping& dm)
override
220 amrex::BoxArray ngrids = cgrids;
221 ngrids.convert(amrex::IntVect::TheNodeVector());
236 const amrex::BoxArray& cgrids,
237 const amrex::DistributionMapping& dm)
override
241 amrex::BoxArray ngrids = cgrids;
242 ngrids.convert(amrex::IntVect::TheNodeVector());
244 m_field[lev]->setVal(T::Zero());
249 m_field[lev]->setVal(T::Zero());
257 m_field.finest_level = a_finestlevel;
266 for (amrex::MFIter mfi(*
m_field[lev],
true); mfi.isValid(); ++mfi)
268 const amrex::Box& box = mfi.tilebox();
269 amrex::BaseFab<T> &patch = (*(
m_field[lev]))[mfi];
276 virtual void AverageDown(
const int lev, amrex::IntVect refRatio)
override
279 amrex::average_down_nodal(*
m_field[lev+1],*
m_field[lev],refRatio);
291 const amrex::Vector<amrex::Geometry> &
m_geom;
302 virtual void Copy(
int a_lev, amrex::MultiFab &a_dst,
int a_dstcomp,
int a_nghost)
override
304 m_field.Copy(a_lev,a_dst,a_dstcomp,a_nghost);
306 virtual void setName(std::string a_name)
override {
309 virtual std::string
Name(
int i)
override {
312 virtual void setBC(
void * a_bc)
override {
virtual std::string Name(int)=0
Set::Hypercube m_gridtype
virtual void MakeNewLevelFromScratch(int lev, amrex::Real t, const amrex::BoxArray &cgrids, const amrex::DistributionMapping &dm)=0
virtual void FillBoundary(const int lev, Set::Scalar time)=0
virtual void setName(std::string a_name)=0
virtual void RemakeLevel(int lev, amrex::Real time, const amrex::BoxArray &cgrids, const amrex::DistributionMapping &dm)=0
virtual void AverageDown(const int lev, amrex::IntVect refRatio)=0
virtual void MakeNewLevelFromCoarse(int lev, amrex::Real time, const amrex::BoxArray &cgrids, const amrex::DistributionMapping &dm)=0
virtual void Copy(int, amrex::MultiFab &, int, int)=0
virtual ~BaseField()=default
virtual void FillPatch(const int lev, const Set::Scalar time)=0
virtual void setBC(void *a_bc)=0
virtual void SetFinestLevel(const int a_finestlevel)=0
virtual void operator()(amrex::FabArray< amrex::BaseFab< T > > &, int, int, amrex::IntVect const &, amrex::Real, int)
virtual void Copy(int a_lev, amrex::MultiFab &a_dst, int a_dstcomp, int a_nghost) override
void FillPatch(int lev, amrex::Real time) override
virtual void AverageDown(const int lev, amrex::IntVect refRatio) override
Field(Set::Field< T > &a_field, const amrex::Vector< amrex::Geometry > &a_geom, const amrex::Vector< amrex::IntVect > &a_refRatio, int a_ncomp, int a_nghost)
virtual std::string Name(int i) override
void FillPatch(int lev, amrex::Real time, amrex::Vector< std::unique_ptr< amrex::FabArray< amrex::BaseFab< T > > > > &source_mf, amrex::FabArray< amrex::BaseFab< T > > &destination_mf, int icomp)
virtual void SetFinestLevel(const int a_finestlevel) override
virtual void RemakeLevel(int lev, amrex::Real time, const amrex::BoxArray &cgrids, const amrex::DistributionMapping &dm) override
virtual void MakeNewLevelFromCoarse(int lev, amrex::Real time, const amrex::BoxArray &cgrids, const amrex::DistributionMapping &dm) override
virtual void setName(std::string a_name) override
const amrex::Vector< amrex::IntVect > & m_refRatio
virtual void setBC(void *a_bc) override
Numeric::Interpolator::NodeBilinear< T > node_bilinear
virtual void MakeNewLevelFromScratch(int lev, amrex::Real, const amrex::BoxArray &cgrids, const amrex::DistributionMapping &dm) override
Set::Field< T > & m_field
const amrex::Vector< amrex::Geometry > & m_geom
virtual int NComp() override
virtual void * getBC() override
void FillCoarsePatch(int lev, amrex::Real time, int icomp, int ncomp)
virtual void FillBoundary(const int lev, Set::Scalar time) override
Collection of numerical integrator objects.
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, 1 > Vector
AMREX_FORCE_INLINE void RealFillBoundary(amrex::FabArray< amrex::BaseFab< T > > &a_mf, const amrex::Geometry &)
void Abort(const char *msg)
AMREX_FORCE_INLINE void Assert(std::string file, std::string func, int line, std::string smt, bool pass, Args const &... args)