Alamo
SFI.H
Go to the documentation of this file.
1#if AMREX_SPACEDIM==2
2
3#ifndef INTEGRATOR_SFI_H
4#define INTEGRATOR_SFI_H
5
6#include "Hydro.H"
7
8namespace Integrator
9{
10template<class PF>
11class SFI :
12 virtual public PF,
13 virtual public Hydro
14{
15public:
16 SFI():
17 PF(),
18 Hydro()
19 {
20 }
21 SFI(IO::ParmParse &pp) : SFI()
22 {Parse(*this,pp);}
23 static void Parse(SFI &value, IO::ParmParse &pp)
24 {
25 pp.queryclass<PF>(PF::name,&value);
26 pp.queryclass<Hydro>("hydro",&value);
27
28 // time to activate hydro integrator
29 pp.query_default("tstart",value.tstart,0.0);
30 // If true, set hydro_eta to 1-pf_eta
31 pp.query_default("invert",value.invert,false);
32
33 }
34
35
36protected:
37 void Initialize(int lev) override
38 {
39 PF::Initialize(lev);
40 Hydro::Initialize(lev);
41 }
42
43 void TimeStepBegin(Set::Scalar a_time, int a_step) override
44 {
45 if (a_time > tstart && !hydro_initialized)
46 {
47 for (int lev = 0; lev <= finest_level; lev++)
48 {
49 Hydro::Initialize(lev);
50 Hydro::Mix(lev);
51 }
52 hydro_initialized=true;
53 }
54 PF::TimeStepBegin(a_time, a_step);
55 if (hydro_initialized) Hydro::TimeStepBegin(a_time, a_step);
56 }
57
58 void Advance(int a_lev, amrex::Real a_time, amrex::Real a_dt) override
59 {
60 PF::Advance(a_lev, a_time, a_dt);
61 if (hydro_initialized) Hydro::Advance(a_lev, a_time, a_dt);
62 }
63
64 void TagCellsForRefinement(int a_lev, amrex::TagBoxArray& a_tags, Set::Scalar a_time, int a_ngrow) override
65 {
66 PF::TagCellsForRefinement(a_lev, a_tags, a_time, a_ngrow);
67 if (hydro_initialized) Hydro::TagCellsForRefinement(a_lev, a_tags, a_time, a_ngrow);
68 }
69
70 void UpdateEta(int lev, Set::Scalar /*time*/) override
71 {
72 for (amrex::MFIter mfi(*eta_mf[lev], true); mfi.isValid(); ++mfi)
73 {
74 const amrex::Box& bx = mfi.growntilebox();
75 Set::Patch<Set::Scalar> eta_old = Hydro::eta_old_mf.Patch(lev,mfi);
76 Set::Patch<Set::Scalar> eta_new = Hydro::eta_mf.Patch(lev,mfi);
77 Set::Patch<const Set::Scalar> pf_eta_old = PF::eta_old_mf.Patch(lev,mfi);
78 Set::Patch<const Set::Scalar> pf_eta_new = PF::eta_mf.Patch(lev,mfi);
79 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
80 {
81 if (invert)
82 {
83 eta_new(i,j,k) = 1.0 - pf_eta_new(i,j,k);
84 eta_old(i,j,k) = 1.0 - pf_eta_old(i,j,k);
85 }
86 else
87 {
88 eta_new(i,j,k) = pf_eta_new(i,j,k);
89 eta_old(i,j,k) = pf_eta_old(i,j,k);
90 }
91 });
92 }
93 Util::RealFillBoundary(*eta_mf[lev], geom[lev]);
94 Util::RealFillBoundary(*eta_old_mf[lev], geom[lev]);
95 }
96
97 int invert = false;
98 Set::Scalar tstart = NAN;
99 bool hydro_initialized = false;
100};
101} // namespace Integrator
102#endif
103
104#endif
void queryclass(std::string name, T *value, std::string file="", std::string func="", int line=-1)
Definition ParmParse.H:604
int query_default(std::string name, T &value, T defaultvalue, std::string="", std::string="", int=-1)
Definition ParmParse.H:185
Collection of numerical integrator objects.
Definition AllenCahn.H:41
amrex::Real Scalar
Definition Base.H:19
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, 1 > Vector
Definition Base.H:20
std::complex< int > Parse(std::string input)
Definition Util.cpp:313
AMREX_FORCE_INLINE void RealFillBoundary(amrex::FabArray< amrex::BaseFab< T > > &a_mf, const amrex::Geometry &)
Definition Util.H:322
void Initialize()
Definition Util.cpp:128