Line data Source code
1 : #ifndef INTEGRATOR_HYDRO_H
2 : #define INTEGRATOR_HYDRO_H
3 :
4 : #include "Integrator/Integrator.H"
5 : #include "IO/ParmParse.H"
6 :
7 : #include "BC/BC.H"
8 : #include "BC/Constant.H"
9 : #include "BC/Nothing.H"
10 : #include "IC/IC.H"
11 :
12 : #include "Set/Base.H"
13 : #include "Solver/Local/Riemann/Roe.H"
14 :
15 : namespace Integrator
16 : {
17 : class Hydro : virtual public Integrator
18 : {
19 : public:
20 : static constexpr const char* name = "hydro";
21 :
22 7 : Hydro() {};
23 :
24 : Hydro( Set::Field<Set::Scalar> &a_eta,
25 : Set::Field<Set::Scalar> &a_etaold,
26 : bool a_invert) :
27 : eta_mf(&a_eta), eta_old_mf(&a_etaold), invert(a_invert)
28 : {
29 : this->managed = true;
30 : }
31 :
32 : Hydro(IO::ParmParse& pp);
33 : static void Parse(Hydro& value, IO::ParmParse& pp);
34 14 : virtual ~Hydro()
35 7 : {
36 7 : if (!managed)
37 : {
38 7 : delete eta_mf;
39 7 : delete eta_old_mf;
40 : }
41 :
42 7 : delete density_bc;
43 7 : delete momentum_bc;
44 7 : delete energy_bc;
45 7 : delete eta_bc;
46 :
47 7 : delete density_ic;
48 7 : delete velocity_ic;
49 7 : delete pressure_ic;
50 :
51 7 : delete ic_m0;
52 7 : delete ic_u0;
53 7 : delete ic_q;
54 :
55 7 : delete eta_ic;
56 7 : delete etadot_ic;
57 :
58 7 : delete solid.momentum_ic;
59 7 : delete solid.density_ic;
60 7 : delete solid.energy_ic;
61 :
62 7 : delete riemannsolver;
63 14 : }
64 :
65 : protected:
66 : void Initialize(int lev) override;
67 : void Mix(int lev);
68 : void TimeStepBegin(Set::Scalar a_time, int a_iter) override;
69 : void TimeStepComplete(Set::Scalar time, int lev) override;
70 : void Advance(int lev, Set::Scalar time, Set::Scalar dt) override;
71 : void TagCellsForRefinement(int lev, amrex::TagBoxArray& tags, amrex::Real /*time*/, int /*ngrow*/) override;
72 : void Regrid(int lev, Set::Scalar time) override;
73 :
74 : virtual void UpdateEta(int lev, Set::Scalar time);
75 : virtual void UpdateFluxes(int lev, Set::Scalar time, Set::Scalar dt);
76 : protected:
77 :
78 : void RHS( int lev, Set::Scalar time,
79 : amrex::MultiFab &rho_rhs_mf,
80 : amrex::MultiFab &M_rhs_mf,
81 : amrex::MultiFab &E_rhs_mf,
82 : const amrex::MultiFab &rho_mf,
83 : const amrex::MultiFab &M_mf,
84 : const amrex::MultiFab &E_mf);
85 :
86 : Set::Field<Set::Scalar> density_mf;
87 : Set::Field<Set::Scalar> density_old_mf;
88 :
89 : Set::Field<Set::Scalar> energy_mf;
90 : Set::Field<Set::Scalar> energy_old_mf;
91 :
92 : Set::Field<Set::Scalar> momentum_mf;
93 : Set::Field<Set::Scalar> momentum_old_mf;
94 :
95 : Set::Field<Set::Scalar> velocity_mf;
96 : Set::Field<Set::Scalar> pressure_mf;
97 :
98 : struct {
99 : Set::Field<Set::Scalar> density_mf;
100 : Set::Field<Set::Scalar> momentum_mf;
101 : Set::Field<Set::Scalar> energy_mf;
102 : IC::IC<Set::Scalar>* density_ic = nullptr;
103 : IC::IC<Set::Scalar>* momentum_ic = nullptr;
104 : IC::IC<Set::Scalar>* energy_ic = nullptr;
105 : } solid;
106 :
107 : Set::Field<Set::Scalar>* eta_mf;
108 : Set::Field<Set::Scalar>* eta_old_mf;
109 : Set::Field<Set::Scalar> etadot_mf;
110 :
111 : Set::Field<Set::Scalar> vorticity_mf;
112 :
113 : Set::Field<Set::Scalar> m0_mf;
114 : Set::Field<Set::Scalar> u0_mf;
115 : Set::Field<Set::Scalar> q_mf;
116 : Set::Field<Set::Scalar> Source_mf;
117 : Set::Field<Set::Scalar> flux_mf;
118 :
119 : BC::BC<Set::Scalar>* density_bc = nullptr;
120 : BC::BC<Set::Scalar>* momentum_bc = nullptr;
121 : BC::BC<Set::Scalar>* energy_bc = nullptr;
122 : BC::BC<Set::Scalar>* eta_bc = nullptr;
123 : BC::BC<Set::Scalar>* tracer_bc = nullptr;
124 :
125 : IC::IC<Set::Scalar>* velocity_ic = nullptr;
126 : IC::IC<Set::Scalar>* pressure_ic = nullptr;
127 : IC::IC<Set::Scalar>* density_ic = nullptr;
128 : IC::IC<Set::Scalar>* tracer_ic = nullptr;
129 :
130 : IC::IC<Set::Scalar>* ic_m0 = nullptr;
131 : IC::IC<Set::Scalar>* ic_u0 = nullptr;
132 : IC::IC<Set::Scalar>* ic_q = nullptr;
133 :
134 : IC::IC<Set::Scalar>* eta_ic = nullptr;
135 : IC::IC<Set::Scalar>* etadot_ic = nullptr;
136 :
137 : BC::Nothing bc_nothing;
138 :
139 : BC::Constant neumann_bc_1 = BC::Constant::ZeroNeumann(1);
140 : BC::Constant neumann_bc_D = BC::Constant::ZeroNeumann(AMREX_SPACEDIM);
141 :
142 : Set::Scalar c_max = 0.0;
143 : Set::Scalar vx_max = 0.0;
144 : Set::Scalar vy_max = 0.0;
145 :
146 : Set::Scalar eta_refinement_criterion=NAN, omega_refinement_criterion=NAN, gradu_refinement_criterion=NAN, p_refinement_criterion=NAN, rho_refinement_criterion;
147 : Set::Scalar gamma=NAN, cfl=NAN, cfl_v=NAN, mu=NAN, pref=NAN;
148 :
149 : Set::Scalar small=NAN;
150 : Set::Scalar cutoff=NAN;
151 : Set::Scalar lagrange=NAN;
152 : Set::Scalar lagrange_m0=NAN;
153 :
154 : Solver::Local::Riemann::Riemann *riemannsolver = nullptr;
155 :
156 : enum IntegrationScheme {
157 : ForwardEuler, SSPRK3, RK4
158 : };
159 : IntegrationScheme scheme;
160 :
161 : enum PrescribedFlowMode {
162 : Absolute, Relative
163 : };
164 : PrescribedFlowMode prescribedflowmode;
165 :
166 :
167 : Set::Vector g;
168 :
169 : bool managed = false;
170 : bool invert = false;
171 :
172 : std::vector<bool> mixed;
173 :
174 : };
175 : }
176 :
177 : #endif
|