Alamo
BaseField.H
Go to the documentation of this file.
1#ifndef INTEGRATOR_BASEFIELD_H
2#define INTEGRATOR_BASEFIELD_H
3
4#include "AMReX_FillPatchUtil.H"
5
6#include "Util/Util.H"
7#include "Set/Set.H"
9
10namespace Integrator
11{
12
14{
15public:
16 virtual ~BaseField() = default;
17
18 virtual void RemakeLevel (int lev,
19 amrex::Real time,
20 const amrex::BoxArray& cgrids,
21 const amrex::DistributionMapping& dm) = 0;
22 virtual void MakeNewLevelFromCoarse (int lev,
23 amrex::Real time,
24 const amrex::BoxArray& cgrids,
25 const amrex::DistributionMapping& dm) = 0;
26 virtual void MakeNewLevelFromScratch (int lev,
27 amrex::Real t,
28 const amrex::BoxArray& cgrids,
29 const amrex::DistributionMapping& dm) = 0;
30 virtual void SetFinestLevel(const int a_finestlevel) = 0;
31 virtual void FillPatch(const int lev, const Set::Scalar time)=0;
32 virtual void FillBoundary(const int lev, Set::Scalar time)=0;
33 virtual void AverageDown(const int lev, amrex::IntVect refRatio) = 0;
34
35 virtual int NComp() = 0;
36 virtual void Copy(int /*a_lev*/, amrex::MultiFab &/*a_dst*/, int /*a_dstcomp*/, int /*a_nghost*/) = 0;
37 bool writeout = false;
38 virtual std::string Name(int) = 0;
39 virtual void setName(std::string a_name) = 0;
40 bool evolving = true;
41 virtual void setBC(void * a_bc) = 0;
42 virtual void * getBC() = 0;
44};
45
46template<class T>
47class Field : public BaseField
48{
49public:
50 class EmptyBC
51 {
52 public:
53 virtual void operator () (amrex::FabArray<amrex::BaseFab<T>> & /*mf*/,
54 int /*dcomp*/, int /*ncomp*/, amrex::IntVect const& /*nghost*/,
55 amrex::Real /*time*/, int /*bccomp*/)
56 { /* Do nothing - this is a shell to satisfy the FillPatch functions.*/ }
57 amrex::BCRec GetBCRec() {return amrex::BCRec();}
58 };
59
60 Field(Set::Field<T> & a_field,
61 const amrex::Vector<amrex::Geometry> &a_geom,
62 const amrex::Vector<amrex::IntVect> &a_refRatio,
63 int a_ncomp, int a_nghost) :
64 m_field(a_field), m_geom(a_geom), m_refRatio(a_refRatio),
65 m_ncomp(a_ncomp), m_nghost(a_nghost)
66 {}
67
68 void
69 FillPatch (int lev, amrex::Real time,
70 amrex::Vector<std::unique_ptr<amrex::FabArray<amrex::BaseFab<T>>>> &source_mf,
71 amrex::FabArray<amrex::BaseFab<T>> &destination_mf,
72 int icomp)
73 {
74 EmptyBC physbc;
75 if (lev == 0)
76 {
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);
81
83 {
84 m_bc->define(m_geom[lev]);
85 amrex::FillPatchSingleLevel(destination_mf, time, smf, stime,
86 0, icomp, destination_mf.nComp(), m_geom[lev],
87 *m_bc, 0);
88 }
90 {
91 amrex::FillPatchSingleLevel(destination_mf, time, smf, stime,
92 0, icomp, destination_mf.nComp(), m_geom[lev],
93 physbc, 0);
94 }
95 }
96 else
97 {
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);
104
105 amrex::Vector<amrex::BCRec> bcs(destination_mf.nComp(), physbc.GetBCRec());
106
107 if (destination_mf.boxArray().ixType() == amrex::IndexType::TheNodeType())
108 {
109 amrex::FillPatchTwoLevels(destination_mf, time, cmf, ctime, fmf, ftime,
110 0, icomp, destination_mf.nComp(), m_geom[lev-1], m_geom[lev],
111 physbc, 0,
112 physbc, 0,
113 m_refRatio[lev-1],
114 &node_bilinear, bcs, 0);
115
116 }
117 else
118 {
119 Util::Abort(INFO,"This implementation is not yet complete.");
120 /*
121 Numeric::Interpolator::CellBilinear<T> *mapper
122 = new Numeric::Interpolator::CellBilinear<T>();
123 m_bc->define(m_geom[lev]);
124 amrex::FillPatchTwoLevels(destination_mf, time, cmf, ctime, fmf, ftime,
125 0, icomp, destination_mf.nComp(), m_geom[lev-1], m_geom[lev],
126 *m_bc, 0,
127 *m_bc, 0,
128 m_refRatio[lev-1],
129 mapper, bcs, 0);
130 */
131 }
132 }
133
134 }
135 void
136 FillPatch (int lev, amrex::Real time) override
137 {
138 this->FillPatch(lev,time,m_field,*(m_field[lev]),0);
139 }
140 void
142 amrex::Real time,
143 int icomp,
144 int ncomp)
145 {
146 BL_PROFILE("Integrator::FillCoarsePatch");
147 AMREX_ASSERT(lev > 0);
148
150 {
151 Util::Assert(INFO, TEST(m_field[lev]->boxArray().ixType() == amrex::IndexType::TheNodeType()));
152 EmptyBC physbc;
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,
159 m_geom[lev-1], m_geom[lev],
160 physbc, 0,
161 physbc, 0,
162 m_refRatio[lev-1],
163 &node_bilinear, bcs, 0);
164 }
166 {
167 Util::Abort(INFO,"This implementation is not yet complete");
168 /*
169 amrex::Vector<amrex::FabArray<amrex::BaseFab<T>> *> cmf;
170 cmf.push_back(m_field[lev-1].get());
171 amrex::Vector<amrex::Real> ctime;
172 ctime.push_back(time);
173 m_bc->define(m_geom[lev]);
174 Numeric::Interpolator::CellBilinear<T> *mapper = new Numeric::Interpolator::CellBilinear<T>();
175 amrex::Vector<amrex::BCRec> bcs(ncomp, m_bc->GetBCRec());
176 amrex::InterpFromCoarseLevel(*m_field[lev], time, *cmf[0], 0, icomp, ncomp,
177 m_geom[lev-1], m_geom[lev],
178 *m_bc, 0,
179 *m_bc, 0,
180 m_refRatio[lev-1],
181 mapper, bcs, 0);
182 */
183 }
184 else
185 Util::Abort(INFO,"Invalid grid");
186 }
187
188
189 virtual void RemakeLevel (int lev,
190 amrex::Real time,
191 const amrex::BoxArray& cgrids,
192 const amrex::DistributionMapping& dm) override
193 {
195 {
196 Util::Assert(INFO, TEST(m_field[lev]->boxArray().ixType() == amrex::IndexType::TheNodeType()));
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);
200 this->FillPatch(lev, time, m_field, new_state, 0);
201 std::swap(new_state, *m_field[lev]);
202 }
204 {
205 amrex::FabArray<amrex::BaseFab<T>> new_state(cgrids, dm, m_ncomp, m_nghost);
206 this->FillPatch(lev, time, m_field, new_state, 0);
207 std::swap(new_state, *m_field[lev]);
208 }
209 else
210 Util::Abort(INFO,"Invalid grid");
211 }
212
213 virtual void MakeNewLevelFromCoarse (int lev,
214 amrex::Real time,
215 const amrex::BoxArray& cgrids,
216 const amrex::DistributionMapping& dm) override
217 {
219 {
220 amrex::BoxArray ngrids = cgrids;
221 ngrids.convert(amrex::IntVect::TheNodeVector());
222 m_field[lev].reset(new amrex::FabArray<amrex::BaseFab<T>>(ngrids,dm,m_ncomp,m_nghost));
223 FillCoarsePatch(lev,time,0,m_ncomp);
224 }
226 {
227 m_field[lev].reset(new amrex::FabArray<amrex::BaseFab<T>>(cgrids,dm,m_ncomp,m_nghost));
228 FillCoarsePatch(lev,time,0,m_ncomp);
229 }
230 else
231 Util::Abort(INFO,"Invalid grid");
232 }
233
234 virtual void MakeNewLevelFromScratch (int lev,
235 amrex::Real /*time*/,
236 const amrex::BoxArray& cgrids,
237 const amrex::DistributionMapping& dm) override
238 {
240 {
241 amrex::BoxArray ngrids = cgrids;
242 ngrids.convert(amrex::IntVect::TheNodeVector());
243 m_field[lev].reset(new amrex::FabArray<amrex::BaseFab<T>>(ngrids,dm,m_ncomp,m_nghost));
244 m_field[lev]->setVal(T::Zero());
245 }
247 {
248 m_field[lev].reset(new amrex::FabArray<amrex::BaseFab<T>>(cgrids,dm,m_ncomp,m_nghost));
249 m_field[lev]->setVal(T::Zero());
250 }
251 else
252 Util::Abort(INFO,"Invalid grid");
253 }
254
255 virtual void SetFinestLevel(const int a_finestlevel) override
256 {
257 m_field.finest_level = a_finestlevel;
258 }
259
260 virtual void FillBoundary(const int lev, Set::Scalar time) override
261 {
264 {
265 m_bc->define(m_geom[lev]);
266 for (amrex::MFIter mfi(*m_field[lev],true); mfi.isValid(); ++mfi)
267 {
268 const amrex::Box& box = mfi.tilebox();
269 amrex::BaseFab<T> &patch = (*(m_field[lev]))[mfi];
270 m_bc->FillBoundary(patch,box,m_nghost,0,m_ncomp,time);
271 }
272 //
273 }
274 }
275
276 virtual void AverageDown(const int lev, amrex::IntVect refRatio) override
277 {
279 amrex::average_down_nodal(*m_field[lev+1],*m_field[lev],refRatio);
281 Util::Abort(INFO,"This is not yet working");
282 //amrex::average_down(*m_field[lev+1],*m_field[lev],0,m_ncomp,refRatio);
283 //amrex::average_down(*m_field[lev+1],*m_field[lev],0,m_ncomp,refRatio);
284 else
285 Util::Abort(INFO,"Incorrect grid");
286 }
287
288private:
289
291 const amrex::Vector<amrex::Geometry> &m_geom;
292 const amrex::Vector<amrex::IntVect> &m_refRatio;
293 const int m_ncomp, m_nghost;
295
297
298public:
299 virtual int NComp() override {
300 return m_field.NComp();
301 }
302 virtual void Copy(int a_lev, amrex::MultiFab &a_dst, int a_dstcomp, int a_nghost) override
303 {
304 m_field.Copy(a_lev,a_dst,a_dstcomp,a_nghost);
305 }
306 virtual void setName(std::string a_name) override {
307 m_field.name = a_name;
308 }
309 virtual std::string Name(int i) override {
310 return m_field.Name(i);
311 }
312 virtual void setBC(void * a_bc) override {
313 m_bc = (BC::BC<T> *)(a_bc);
314 }
315 virtual void * getBC() override {
316 return (void*)m_bc;
317 }
318
319};
320
321}
322
323#endif
std::time_t t
#define TEST(x)
Definition Util.H:21
#define INFO
Definition Util.H:20
Definition BC.H:42
virtual std::string Name(int)=0
virtual void * getBC()=0
Set::Hypercube m_gridtype
Definition BaseField.H:43
virtual int NComp()=0
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
amrex::BCRec GetBCRec()
Definition BaseField.H:57
virtual void operator()(amrex::FabArray< amrex::BaseFab< T > > &, int, int, amrex::IntVect const &, amrex::Real, int)
Definition BaseField.H:53
virtual void Copy(int a_lev, amrex::MultiFab &a_dst, int a_dstcomp, int a_nghost) override
Definition BaseField.H:302
void FillPatch(int lev, amrex::Real time) override
Definition BaseField.H:136
virtual void AverageDown(const int lev, amrex::IntVect refRatio) override
Definition BaseField.H:276
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)
Definition BaseField.H:60
virtual std::string Name(int i) override
Definition BaseField.H:309
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)
Definition BaseField.H:69
virtual void SetFinestLevel(const int a_finestlevel) override
Definition BaseField.H:255
virtual void RemakeLevel(int lev, amrex::Real time, const amrex::BoxArray &cgrids, const amrex::DistributionMapping &dm) override
Definition BaseField.H:189
virtual void MakeNewLevelFromCoarse(int lev, amrex::Real time, const amrex::BoxArray &cgrids, const amrex::DistributionMapping &dm) override
Definition BaseField.H:213
virtual void setName(std::string a_name) override
Definition BaseField.H:306
const int m_nghost
Definition BaseField.H:293
const amrex::Vector< amrex::IntVect > & m_refRatio
Definition BaseField.H:292
virtual void setBC(void *a_bc) override
Definition BaseField.H:312
Numeric::Interpolator::NodeBilinear< T > node_bilinear
Definition BaseField.H:296
virtual void MakeNewLevelFromScratch(int lev, amrex::Real, const amrex::BoxArray &cgrids, const amrex::DistributionMapping &dm) override
Definition BaseField.H:234
Set::Field< T > & m_field
Definition BaseField.H:290
BC::BC< T > * m_bc
Definition BaseField.H:294
const amrex::Vector< amrex::Geometry > & m_geom
Definition BaseField.H:291
virtual int NComp() override
Definition BaseField.H:299
virtual void * getBC() override
Definition BaseField.H:315
void FillCoarsePatch(int lev, amrex::Real time, int icomp, int ncomp)
Definition BaseField.H:141
virtual void FillBoundary(const int lev, Set::Scalar time) override
Definition BaseField.H:260
const int m_ncomp
Definition BaseField.H:293
Collection of numerical integrator objects.
Definition AllenCahn.H:41
amrex::Real Scalar
Definition Base.H:19
Hypercube
Definition Set.H:31
@ Cell
Definition Set.H:32
@ Node
Definition Set.H:32
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, 1 > Vector
Definition Base.H:20
AMREX_FORCE_INLINE void RealFillBoundary(amrex::FabArray< amrex::BaseFab< T > > &a_mf, const amrex::Geometry &)
Definition Util.H:322
void Abort(const char *msg)
Definition Util.cpp:170
AMREX_FORCE_INLINE void Assert(std::string file, std::string func, int line, std::string smt, bool pass, Args const &... args)
Definition Util.H:70