Alamo
Flame.cpp
Go to the documentation of this file.
1#include "Flame.H"
2#include "IO/ParmParse.H"
3#include "BC/Constant.H"
4#include "Numeric/Stencil.H"
5#include "IC/Laminate.H"
6#include "IC/Constant.H"
7#include "IC/PSRead.H"
8#include "Numeric/Function.H"
9#include "IC/Expression.H"
10#include "IC/BMP.H"
11#include "IC/PNG.H"
12#include "Base/Mechanics.H"
13
14#include <cmath>
15
16namespace Integrator
17{
18
20
22{
23 pp_queryclass(*this);
24}
25
26// [parser]
27void
29{
30 BL_PROFILE("Integrator::Flame::Flame()");
31 {
32 // Whether to include extra fields (such as mdot, etc) in the plot output
33 pp_query_default("plot_field",value.plot_field,true);
34
35 pp_query_default("timestep", value.base_time, 1.0e-4); //Simulation timestep
36 pp_query_default("pf.eps", value.pf.eps, 0.0); // Burn width thickness
37 pp_query_default("pf.kappa", value.pf.kappa, 0.0); // Interface energy param
38 pp_query_default("pf.gamma", value.pf.gamma, 1.0); // Scaling factor for mobility
39 pp_query_default("pf.lambda", value.pf.lambda, 0.0); // Chemical potential multiplier
40 pp_query_default("pf.w1", value.pf.w1, 0.0); // Unburned rest energy
41 pp_query_default("pf.w12", value.pf.w12, 0.0); // Barrier energy
42 pp_query_default("pf.w0", value.pf.w0, 0.0); // Burned rest energy
43 pp_query_default("amr.ghost_cells", value.ghost_count, 2); // number of ghost cells in all fields
44 pp_query_default("geometry.x_len", value.x_len, 0.001); // Domain x length
45 pp_query_default("geometry.y_len", value.y_len, 0.001); // Domain y length
46
47 //value.bc_eta = new BC::Constant(1);
48
49
50 // Boundary conditions for phase field order params
51 pp.select<BC::Constant>("pf.eta.bc", value.bc_eta, 1 );
52 value.RegisterNewFab(value.eta_mf, value.bc_eta, 1, value.ghost_count, "eta", true);
53 value.RegisterNewFab(value.eta_old_mf, value.bc_eta, 1, value.ghost_count, "eta_old", false);
54
55 // phase field initial condition
56 pp.select<IC::Laminate,IC::Constant,IC::Expression,IC::BMP,IC::PNG>("pf.eta.ic",value.ic_eta,value.geom);
57 pp.forbid("eta.ic","--> you must use pf.eta.ic instead"); // delete this eventually once all tests are updated
58 }
59
60 {
61 //IO::ParmParse pp("thermal");
62 pp_query_default("thermal.on", value.thermal.on, false); // Whether to use the Thermal Transport Model
63 pp_query_default("elastic.on", value.elastic.on, 0); // Whether to use Neo-hookean Elastic model
64 pp_query_default("thermal.bound", value.thermal.bound, 0.0); // System Initial Temperature
65 pp_query_default("elastic.traction", value.elastic.traction, 0.0); // Body force
66 pp_query_default("elastic.phirefinement", value.elastic.phirefinement, 1); // Phi refinement criteria
67
68
69
70 if (value.thermal.on) {
71 pp_query_required("thermal.rho_ap", value.thermal.rho_ap); // AP Density
72 pp_query_required("thermal.rho_htpb", value.thermal.rho_htpb); // HTPB Density
73 pp_query_required("thermal.k_ap", value.thermal.k_ap); // AP Thermal Conductivity
74 pp_query_required("thermal.k_htpb", value.thermal.k_htpb); // HTPB Thermal Conductivity
75 pp_query_required("thermal.cp_ap", value.thermal.cp_ap); // AP Specific Heat
76 pp_query_required("thermal.cp_htpb", value.thermal.cp_htpb); //HTPB Specific Heat
77
78 pp_query_default("thermal.q0", value.thermal.q0, 0.0); // Baseline heat flux
79
80 pp_query_required("thermal.m_ap", value.thermal.m_ap); // AP Pre-exponential factor for Arrhenius Law
81 pp_query_required("thermal.m_htpb", value.thermal.m_htpb); // HTPB Pre-exponential factor for Arrhenius Law
82 pp_query_required("thermal.E_ap", value.thermal.E_ap); // AP Activation Energy for Arrhenius Law
83 pp_query_required("thermal.E_htpb", value.thermal.E_htpb); // HTPB Activation Energy for Arrhenius Law
84
85 pp_query_default("thermal.hc", value.thermal.hc, 1.0); // Used to change heat flux units
86 pp_query_default("thermal.massfraction", value.thermal.massfraction, 0.8); // Systen AP mass fraction
87 pp_query_default("thermal.mlocal_ap", value.thermal.mlocal_ap, 0.0); // AP mass flux reference value
88 pp_query_default("thermal.mlocal_htpb", value.thermal.mlocal_htpb, 0.0); // HTPB mass flux reference value
89 pp_query_default("thermal.mlocal_comb", value.thermal.mlocal_comb, 0.0); // AP/HTPB mass flux reference value
90
91 pp_query_default("thermal.T_fluid", value.thermal.T_fluid, 300.0); // Temperature of the Standin Fluid
92
93 pp_query("thermal.disperssion1", value.thermal.disperssion1); // K; dispersion variables are use to set the outter field properties for the void grain case.
94 pp_query("thermal.disperssion2", value.thermal.disperssion2); // rho; dispersion variables are use to set the outter field properties for the void grain case.
95 pp_query("thermal.disperssion3", value.thermal.disperssion3); // cp; dispersion variables are use to set the outter field properties for the void grain case.
96
97 pp_query_default("thermal.modeling_ap", value.thermal.modeling_ap, 1.0); // Scaling factor for AP thermal conductivity (default = 1.0)
98 pp_query_default("thermal.modeling_htpb", value.thermal.modeling_htpb, 1.0); // Scaling factor for HTPB thermal conductivity (default = 1.0)
99
100
101 //Temperature boundary condition
102 pp.select_default<BC::Constant>("thermal.temp.bc", value.bc_temp, 1);
103
104 value.RegisterNewFab(value.temp_mf, value.bc_temp, 1, value.ghost_count + 1, "temp", true);
105 value.RegisterNewFab(value.temp_old_mf, value.bc_temp, 1, value.ghost_count + 1, "temp_old", false);
106 value.RegisterNewFab(value.temps_mf, value.bc_temp, 1, value.ghost_count + 1, "temps", false);
107 value.RegisterNewFab(value.temps_old_mf, value.bc_temp, 1, value.ghost_count + 1, "temps_old", false);
108
109 value.RegisterNewFab(value.mdot_mf, value.bc_eta, 1, value.ghost_count + 1, "mdot", value.plot_field);
110 value.RegisterNewFab(value.mob_mf, value.bc_eta, 1, value.ghost_count + 1, "mob", value.plot_field);
111 value.RegisterNewFab(value.alpha_mf, value.bc_temp, 1, value.ghost_count + 1, "alpha", value.plot_field);
112 value.RegisterNewFab(value.heatflux_mf, value.bc_temp, 1, value.ghost_count + 1, "heatflux", value.plot_field);
113 value.RegisterNewFab(value.laser_mf, value.bc_temp, 1, value.ghost_count + 1, "laser", value.plot_field);
114
115 value.RegisterIntegratedVariable(&value.volume, "total_area");
116 value.RegisterIntegratedVariable(&value.area, "Interface_area");
117 value.RegisterIntegratedVariable(&value.chamber_area, "chamber_area", false);
118 value.RegisterIntegratedVariable(&value.massflux, "mass_flux");
119 value.RegisterIntegratedVariable(&value.chamber_pressure, "Pressure", false);
120
121 // laser initial condition
122 pp.select_default<IC::Constant,IC::Expression>("laser.ic",value.ic_laser, value.geom);
123
124 // thermal initial condition
126 }
127 }
128
129 {
130 pp_query_default("pressure.P", value.pressure.P, 1.0); // Constant pressure value
131 if (value.thermal.on)
132 {
133 pp_query_required("pressure.a1", value.pressure.arrhenius.a1); // Surgate heat flux model paramater - AP
134 pp_query_required("pressure.a2", value.pressure.arrhenius.a2); // Surgate heat flux model paramater - HTPB
135 pp_query_required("pressure.a3", value.pressure.arrhenius.a3); // Surgate heat flux model paramater - Total
136 pp_query_required("pressure.b1", value.pressure.arrhenius.b1); // Surgate heat flux model paramater - AP
137 pp_query_required("pressure.b2", value.pressure.arrhenius.b2); // Surgate heat flux model paramater - HTPB
138 pp_query_required("pressure.b3", value.pressure.arrhenius.b3); // Surgate heat flux model paramater - Total
139 pp_query_required("pressure.c1", value.pressure.arrhenius.c1); // Surgate heat flux model paramater - Total
140 pp_query_default("pressure.mob_ap", value.pressure.arrhenius.mob_ap, 0); // Whether to include pressure to the arrhenius law
141 pp_query_default("pressure.dependency", value.pressure.arrhenius.dependency, 1); // Whether to use pressure to determined the reference Zeta
142 pp_query_default("pressure.h1", value.pressure.arrhenius.h1, 1.81); // Surgate heat flux model paramater - Homogenized
143 pp_query_default("pressure.h2", value.pressure.arrhenius.h2, 1.34); // Surgate heat flux model paramater - Homogenized
144
145 }
146 else
147 {
148 pp_query_required("pressure.r_ap", value.pressure.power.r_ap); // AP power pressure law parameter (r*P^n)
149 pp_query_required("pressure.r_htpb", value.pressure.power.r_htpb); // HTPB power pressure law parameter (r*P^n)
150 pp_query_required("pressure.r_comb", value.pressure.power.r_comb); // AP/HTPB power pressure law parameter (r*P^n)
151 pp_query_required("pressure.n_ap", value.pressure.power.n_ap); // AP power pressure law parameter (r*P^n)
152 pp_query_required("pressure.n_htpb", value.pressure.power.n_htpb); // HTPB power pressure law parameter (r*P^n)
153 pp_query_required("pressure.n_comb", value.pressure.power.n_comb); // AP/HTPB power pressure law parameter (r*P^n)
154 }
155 pp_query_default("variable_pressure", value.variable_pressure, 0); // Whether to compute the pressure evolution
156 pp_query_default("homogeneousSystem", value.homogeneousSystem, 0); // Whether to initialize Phi with homogenized properties
157 }
158
159 pp_query_default("amr.refinement_criterion", value.m_refinement_criterion, 0.001);// Refinement criterion for eta field
160 pp_query_default("amr.refinement_criterion_temp", value.t_refinement_criterion, 0.001);// Refinement criterion for temperature field
161 pp_query_default("amr.refinament_restriction", value.t_refinement_restriction, 0.1);// Eta value to restrict the refinament for the temperature field
162 pp_query_default("amr.phi_refinement_criterion", value.phi_refinement_criterion, 1.0e100);// Refinement criterion for phi field [infinity]
163 pp_query_default("small", value.small, 1.0e-8); // Lowest value of Eta.
164
165 {
166 // The material field is referred to as :math:`\phi(\mathbf{x})` and is
167 // specified using these parameters.
168 std::string phi_ic_type = "packedspheres";
169 pp_query_validate("phi.ic.type", phi_ic_type, {"psread", "laminate", "expression", "constant", "bmp", "png"}); // IC type (psread, laminate, constant)
170 if (phi_ic_type == "psread") {
171 value.ic_phi = new IC::PSRead(value.geom, pp, "phi.ic.psread");
172 //value.ic_phicell = new IC::PSRead(value.geom, pp, "phi.ic.psread");
173 pp_query_default("phi.ic.psread.eps", value.zeta, 1.0e-5); // AP/HTPB interface length
174 pp_query_default("phi.zeta_0", value.zeta_0, 1.0e-5); // Reference interface length for heat integration
175 }
176 else if (phi_ic_type == "laminate") {
177 value.ic_phi = new IC::Laminate(value.geom, pp, "phi.ic.laminate");
178 //value.ic_phicell = new IC::Laminate(value.geom, pp, "phi.ic.laminate");
179 pp_query_default("phi.ic.laminate.eps", value.zeta, 1.0e-5); // AP/HTPB interface length
180 pp_query_default("phi.zeta_0", value.zeta_0, 1.0e-5); // Reference interface length for heat integration
181 }
182 else if (phi_ic_type == "expression") {
183 value.ic_phi = new IC::Expression(value.geom, pp, "phi.ic.expression");
184 //value.ic_phicell = new IC::Expression(value.geom, pp, "phi.ic.expression");
185 pp_query_default("phi.zeta_0", value.zeta_0, 1.0e-5); // Reference interface length for heat integration
186 pp_query_default("phi.zeta", value.zeta, 1.0e-5); // AP/HTPB interface length
187 }
188 else if (phi_ic_type == "constant") {
189 value.ic_phi = new IC::Constant(value.geom, pp, "phi.ic.constant");
190 //value.ic_phicell = new IC::Constant(value.geom, pp, "phi.ic.constant");
191 pp_query_default("phi.zeta_0", value.zeta_0, 1.0e-5); // Reference interface length for heat integration
192 pp_query_default("phi.zeta", value.zeta, 1.0e-5); // AP/HTPB interface length
193 }
194 else if (phi_ic_type == "bmp") {
195 value.ic_phi = new IC::BMP(value.geom, pp, "phi.ic.bmp");
196 //value.ic_phicell = new IC::BMP(value.geom, pp, "phi.ic.bmp");
197 pp_query_default("phi.zeta_0", value.zeta_0, 1.0e-5); // Reference interface length for heat integration
198 pp_query_default("phi.zeta", value.zeta, 1.0e-5); // AP/HTPB interface length
199 }
200 else if (phi_ic_type == "png") {
201 value.ic_phi = new IC::PNG(value.geom, pp, "phi.ic.png");
202 pp_query_default("phi.zeta_0", value.zeta_0, 1.0e-5); // Reference interface length for heat integration
203 pp_query_default("phi.zeta", value.zeta, 1.0e-5); // AP/HTPB interface length
204 }
205 else Util::Abort(INFO, "Invalid IC type ", phi_ic_type);
206 //value.RegisterNewFab(value.phi_mf, 1, "phi_cell", true);
207 value.RegisterNodalFab(value.phi_mf, 1, value.ghost_count + 1, "phi", true);
208 //value.RegisterNewFab(value.phicell_mf, value.bc_eta, 1, value.ghost_count + 1, "phi", true);
209 }
210
211 pp.queryclass<Base::Mechanics<model_type>>("elastic",value);
212
213 if (value.m_type != Type::Disable)
214 {
215 value.elastic.Tref = value.thermal.bound;
216 pp_query_default("Tref", value.elastic.Tref, 300.0); // Initial temperature for thermal expansion computation
219
220 value.bc_psi = new BC::Nothing();
221 value.RegisterNewFab(value.psi_mf, value.bc_psi, 1, value.ghost_count, "psi", value.plot_psi);
222 value.psi_on = true;
223 }
224
225 bool allow_unused;
226 // Set this to true to allow unused inputs without error.
227 // (Not recommended.)
228 pp.query_default("allow_unused",allow_unused,false);
229 if (!allow_unused && pp.AnyUnusedInputs())
230 {
231 Util::Warning(INFO,"The following inputs were specified but not used:");
232 pp.AllUnusedInputs();
233 Util::Exception(INFO,"Aborting. Specify 'allow_unused=True` to ignore this error.");
234 }
235
236}
237
238void Flame::Initialize(int lev)
239{
240 BL_PROFILE("Integrator::Flame::Initialize");
242
243 ic_eta->Initialize(lev, eta_mf);
245 ic_phi->Initialize(lev, phi_mf);
246 //ic_phicell->Initialize(lev, phicell_mf);
247
248 if (elastic.on) {
249 psi_mf[lev]->setVal(1.0);
250 rhs_mf[lev]->setVal(Set::Vector::Zero());
251 }
252 if (thermal.on) {
253 if (thermal.ic_temp)
254 {
255 thermal.ic_temp->Initialize(lev,temp_mf);
256 thermal.ic_temp->Initialize(lev,temp_old_mf);
257 thermal.ic_temp->Initialize(lev,temps_mf);
258 thermal.ic_temp->Initialize(lev,temps_old_mf);
259 }
260 else
261 {
262 temp_mf[lev]->setVal(thermal.bound);
263 temp_old_mf[lev]->setVal(thermal.bound);
264 temps_mf[lev]->setVal(thermal.bound);
265 temps_old_mf[lev]->setVal(thermal.bound);
266 }
267 alpha_mf[lev]->setVal(0.0);
268 mob_mf[lev]->setVal(0.0);
269 mdot_mf[lev]->setVal(0.0);
270 heatflux_mf[lev]->setVal(0.0);
271 // pressure_mf[lev]->setVal(1.0); // [error]
272 thermal.w1 = 0.2 * pressure.P + 0.9;
273 thermal.T_fluid = thermal.bound;
275 thermal.mlocal_htpb = 685000.0 - 850e3 * thermal.massfraction;
276 }
277 if (variable_pressure) pressure.P = 1.0;
278}
279
280void Flame::UpdateModel(int /*a_step*/, Set::Scalar /*a_time*/)
281{
283
284 for (int lev = 0; lev <= finest_level; ++lev)
285 {
286 amrex::Box domain = this->geom[lev].Domain();
287 domain.convert(amrex::IntVect::TheNodeVector());
288 const Set::Scalar* DX = geom[lev].CellSize();
289
290 //psi_mf[lev]->setVal(1.0);
291 phi_mf[lev]->FillBoundary();
292 //phicell_mf[lev]->FillBoundary();
293 eta_mf[lev]->FillBoundary();
294 temp_mf[lev]->FillBoundary();
295
296 for (MFIter mfi(*model_mf[lev], false); mfi.isValid(); ++mfi)
297 {
298 amrex::Box smallbox = mfi.nodaltilebox();
299 amrex::Box bx = mfi.grownnodaltilebox() & domain;
300 //amrex::Box bx = mfi.nodaltilebox();
301 //bx.grow(1);
302 amrex::Array4<model_type> const& model = model_mf[lev]->array(mfi);
303 amrex::Array4<const Set::Scalar> const& phi = phi_mf[lev]->array(mfi);
304 amrex::Array4<const Set::Scalar> const& eta = eta_mf[lev]->array(mfi);
305 amrex::Array4<Set::Vector> const& rhs = rhs_mf[lev]->array(mfi);
306 // amrex::Array4<const Set::Scalar> const& Pressure = pressure_mf[lev]->array(mfi); // [error]
307
308 if (elastic.on)
309 {
310 amrex::Array4<const Set::Scalar> const& temp = temp_mf[lev]->array(mfi);
311 amrex::ParallelFor(smallbox, [=] AMREX_GPU_DEVICE(int i, int j, int k)
312 {
313 Set::Vector grad_eta = Numeric::CellGradientOnNode(eta, i, j, k, 0, DX);
314 rhs(i, j, k) = elastic.traction * grad_eta;
315 });
316 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
317 {
318 Set::Scalar phi_avg = phi(i, j, k, 0);
319 Set::Scalar temp_avg = Numeric::Interpolate::CellToNodeAverage(temp, i, j, k, 0);
320 model_type model_ap = elastic.model_ap;
321 model_ap.F0 -= Set::Matrix::Identity();
322 model_ap.F0 *= (temp_avg - elastic.Tref);
323 model_ap.F0 += Set::Matrix::Identity();
324 model_type model_htpb = elastic.model_htpb;
325 model_htpb.F0 -= Set::Matrix::Identity();
326 model_htpb.F0 *= (temp_avg - elastic.Tref);
327 model_htpb.F0 += Set::Matrix::Identity();
328
329 model(i, j, k) = model_ap * phi_avg + model_htpb * (1. - phi_avg);
330 });
331 }
332 else
333 {
334 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
335 {
336 Set::Scalar phi_avg = Numeric::Interpolate::CellToNodeAverage(phi, i, j, k, 0);
337 //phi_avg = phi(i,j,k,0);
338 model_type model_ap = elastic.model_ap;
339 model_ap.F0 *= Set::Matrix::Zero();
340 model_type model_htpb = elastic.model_htpb;
341 model_htpb.F0 *= Set::Matrix::Zero();
342 model(i, j, k) = model_ap * phi_avg + model_htpb * (1. - phi_avg);
343 });
344 }
345 }
346 Util::RealFillBoundary(*model_mf[lev], geom[lev]);
347
348 psi_mf[lev]->setVal(1.0);
349 amrex::MultiFab::Copy(*psi_mf[lev], *eta_mf[lev], 0, 0, 1, psi_mf[lev]->nGrow());
350 }
351}
352
353void Flame::TimeStepBegin(Set::Scalar a_time, int a_iter)
354{
355 BL_PROFILE("Integrator::Flame::TimeStepBegin");
357 if (thermal.on) {
358 for (int lev = 0; lev <= finest_level; ++lev)
359 ic_laser->Initialize(lev, laser_mf, a_time);
360 }
361}
362
363void Flame::TimeStepComplete(Set::Scalar /*a_time*/, int /*a_iter*/)
364{
365 BL_PROFILE("Integrator::Flame::TimeStepComplete");
366 if (variable_pressure) {
367 Set::Scalar domain_area = x_len * y_len;
369 chamber_area = domain_area - volume;
370 Util::Message(INFO, "Mass = ", massflux);
371 Util::Message(INFO, "Pressure = ", pressure.P);
372 }
373}
374
376{
377 BL_PROFILE("Integrador::Flame::Advance");
379 const Set::Scalar* DX = geom[lev].CellSize();
380
381 if (true) //lev == finest_level) //(true)
382 {
383 if (thermal.on)
384 {
385 std::swap(eta_old_mf[lev], eta_mf[lev]);
386 std::swap(temp_old_mf[lev], temp_mf[lev]);
387 std::swap(temps_old_mf[lev], temps_mf[lev]);
388
390 0.0,
391 -5.0 * pf.w1 + 16.0 * pf.w12 - 11.0 * pf.w0,
392 14.0 * pf.w1 - 32.0 * pf.w12 + 18.0 * pf.w0,
393 -8.0 * pf.w1 + 16.0 * pf.w12 - 8.0 * pf.w0);
395
396 for (amrex::MFIter mfi(*eta_mf[lev], true); mfi.isValid(); ++mfi)
397 {
398 const amrex::Box& bx = mfi.tilebox();
399 // Phase fields
400 amrex::Array4<Set::Scalar> const& etanew = (*eta_mf[lev]).array(mfi);
401 amrex::Array4<const Set::Scalar> const& eta = (*eta_old_mf[lev]).array(mfi);
402 amrex::Array4<const Set::Scalar> const& phi = (*phi_mf[lev]).array(mfi);
403 //amrex::Array4<const Set::Scalar> const& phicell = (*phicell_mf[lev]).array(mfi);
404 // Heat transfer fields
405 amrex::Array4<Set::Scalar> const& tempnew = (*temp_mf[lev]).array(mfi);
406 amrex::Array4<const Set::Scalar> const& temp = (*temp_old_mf[lev]).array(mfi);
407 amrex::Array4<Set::Scalar> const& alpha = (*alpha_mf[lev]).array(mfi);
408 amrex::Array4<Set::Scalar> const& tempsnew = (*temps_mf[lev]).array(mfi);
409 amrex::Array4<Set::Scalar> const& temps = (*temps_old_mf[lev]).array(mfi);
410 amrex::Array4<Set::Scalar> const& laser = (*laser_mf[lev]).array(mfi);
411 // Diagnostic fields
412 amrex::Array4<Set::Scalar> const& mob = (*mob_mf[lev]).array(mfi);
413 amrex::Array4<Set::Scalar> const& mdot = (*mdot_mf[lev]).array(mfi);
414 amrex::Array4<Set::Scalar> const& heatflux = (*heatflux_mf[lev]).array(mfi);
415
416 if (variable_pressure) {
417 pressure.P = exp(0.00075 * massflux);
418 if (pressure.P > 10.0) {
419 pressure.P = 10.0;
420 }
421 else if (pressure.P <= 0.99) {
422 pressure.P = 0.99;
423 }
424 elastic.traction = pressure.P;
425
426 }
427
428 Set::Scalar zeta_2 = 0.000045 - pressure.P * 6.42e-6;
429 Set::Scalar zeta_1;
430 if (pressure.arrhenius.dependency == 1) zeta_1 = zeta_2;
431 else zeta_1 = zeta_0;
432
433 Set::Scalar k1 = pressure.arrhenius.a1 * pressure.P + pressure.arrhenius.b1 - zeta_1 / zeta;
434 Set::Scalar k2 = pressure.arrhenius.a2 * pressure.P + pressure.arrhenius.b2 - zeta_1 / zeta;
435 Set::Scalar k3 = 4.0 * log((pressure.arrhenius.c1 * pressure.P * pressure.P + pressure.arrhenius.a3 * pressure.P + pressure.arrhenius.b3) - k1 / 2.0 - k2 / 2.0);
436 Set::Scalar k4 = pressure.arrhenius.h1 * pressure.P + pressure.arrhenius.h2;
437
438 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
439 {
440 Set::Scalar phi_avg = Numeric::Interpolate::NodeToCellAverage(phi, i, j, k, 0);
441 Set::Scalar eta_lap = Numeric::Laplacian(eta, i, j, k, 0, DX);
442 Set::Scalar K; // Calculate effective thermal conductivity
443 Set::Scalar rho; // No special interface mixure rule is needed here.
444 Set::Scalar cp;
445 if (homogeneousSystem) {
446 K = (thermal.modeling_ap * thermal.k_ap * thermal.massfraction + thermal.modeling_htpb * thermal.k_htpb * (1.0 - thermal.massfraction)) * phi_avg + thermal.disperssion1 * (1. - phi_avg); // Calculate effective thermal conductivity
447 rho = (thermal.rho_ap * thermal.massfraction + thermal.rho_htpb * (1.0 - thermal.massfraction)) * phi_avg + thermal.disperssion2 * (1. - phi_avg); // No special interface mixure rule is needed here.
448 cp = (thermal.cp_ap * thermal.massfraction + thermal.cp_htpb * (1.0 - thermal.massfraction)) * phi_avg + thermal.disperssion3 * (1. - phi_avg);
449 }
450 else {
451 K = thermal.modeling_ap * thermal.k_ap * phi_avg + thermal.modeling_htpb * thermal.k_htpb * (1.0 - phi_avg); // Calculate effective thermal conductivity
452 rho = thermal.rho_ap * phi_avg + thermal.rho_htpb * (1.0 - phi_avg); // No special interface mixure rule is needed here.
453 cp = thermal.cp_ap * phi_avg + thermal.cp_htpb * (1.0 - phi_avg);
454 }
455 Set::Scalar df_deta = ((pf.lambda / pf.eps) * dw(eta(i, j, k)) - pf.eps * pf.kappa * eta_lap);
456 etanew(i, j, k) = eta(i, j, k) - mob(i, j, k) * dt * df_deta;
457 if (etanew(i, j, k) <= small) etanew(i, j, k) = small;
458
459 alpha(i, j, k) = K / rho / cp; // Calculate thermal diffusivity and store in fiel
460 mdot(i, j, k) = rho * fabs(eta(i, j, k) - etanew(i, j, k)) / dt; // deta/dt
461
462 if (isnan(etanew(i, j, k)) || isnan(alpha(i, j, k)) || isnan(mdot(i, j, k))) {
463 Util::Message(INFO, etanew(i, j, k), "etanew contains nan (i=", i, " j= ", j, ")");
464 Util::Message(INFO, mdot(i, j, k), "mdot contains nan (i=", i, " j= ", j, ")");
465 Util::Message(INFO, alpha(i, j, k), "alpha contains nan (i=", i, " j= ", j, ")");
467 }
468 });
469
470 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
471 {
472 Set::Scalar phi_avg = Numeric::Interpolate::NodeToCellAverage(phi, i, j, k, 0);
473 //phi_avg = phicell(i,j,k);
474 Set::Scalar K;
475 Set::Scalar qflux;
476 Set::Scalar mlocal;
477 Set::Scalar mdota;
478 Set::Scalar mbase;
479
480 if (homogeneousSystem) {
481 qflux = k4 * phi_avg;
482 mlocal = (thermal.mlocal_ap) * thermal.massfraction + (thermal.mlocal_htpb) * (1.0 - thermal.massfraction);
483 mdota = fabs(mdot(i, j, k));
484 mbase = tanh(4.0 * mdota / (mlocal));
485 K = (thermal.modeling_ap * thermal.k_ap * thermal.massfraction + thermal.modeling_htpb * thermal.k_htpb * (1.0 - thermal.massfraction)) * phi_avg + thermal.disperssion1 * (1. - phi_avg);
486 heatflux(i, j, k) = (laser(i, j, k) * phi_avg + thermal.hc * mbase * qflux) / K;
487 }
488 else {
489 qflux = k1 * phi_avg +
490 k2 * (1.0 - phi_avg) +
491 (zeta_1 / zeta) * exp(k3 * phi_avg * (1.0 - phi_avg));
492 mlocal = (thermal.mlocal_ap) * phi_avg + (thermal.mlocal_htpb) * (1.0 - phi_avg) + thermal.mlocal_comb * phi_avg * (1.0 - phi_avg);
493 mdota = fabs(mdot(i, j, k));
494 mbase = tanh(4.0 * mdota / (mlocal));
495
496 K = thermal.modeling_ap * thermal.k_ap * phi_avg + thermal.modeling_htpb * thermal.k_htpb * (1.0 - phi_avg);
497 heatflux(i, j, k) = (thermal.hc * mbase * qflux + laser(i, j, k)) / K;
498 }
499
500 if (isnan(heatflux(i, j, k))) {
501 Util::Message(INFO, heatflux(i, j, k), "heat contains nan (i=", i, " j= ", j, ")");
503 }
504 });
505
506 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
507 {
508 auto sten = Numeric::GetStencil(i, j, k, bx);
509 Set::Vector grad_eta = Numeric::Gradient(eta, i, j, k, 0, DX);
510 Set::Vector grad_temp = Numeric::Gradient(temp, i, j, k, 0, DX);
511 Set::Scalar lap_temp = Numeric::Laplacian(temp, i, j, k, 0, DX);
512 Set::Scalar grad_eta_mag = grad_eta.lpNorm<2>();
513 Set::Vector grad_alpha = Numeric::Gradient(alpha, i, j, k, 0, DX, sten);
514 Set::Scalar dTdt = 0.0;
515 dTdt += grad_eta.dot(grad_temp * alpha(i, j, k));
516 dTdt += grad_alpha.dot(eta(i, j, k) * grad_temp);
517 dTdt += eta(i, j, k) * alpha(i, j, k) * lap_temp;
518 dTdt += alpha(i, j, k) * heatflux(i, j, k) * grad_eta_mag;
519 Set::Scalar Tsolid;
520 Tsolid = dTdt + temps(i, j, k) * (etanew(i, j, k) - eta(i, j, k)) / dt;
521 tempsnew(i, j, k) = temps(i, j, k) + dt * Tsolid;
522 tempnew(i, j, k) = etanew(i, j, k) * tempsnew(i, j, k) + (1.0 - etanew(i, j, k)) * thermal.T_fluid;
523 if (isnan(tempsnew(i, j, k)) || isnan(temps(i, j, k))) {
524 Util::Message(INFO, tempsnew(i, j, k), "tempsnew contains nan (i=", i, " j= ", j, ")");
525 Util::Message(INFO, temps(i, j, k), "temps contains nan (i=", i, " j= ", j, ")");
527 }
528
529 });
530
531 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
532 {
533 Set::Scalar phi_avg = Numeric::Interpolate::NodeToCellAverage(phi, i, j, k, 0);
534 //phi_avg = phicell(i,j,k);
535
536 Set::Scalar L;
537 if (pressure.arrhenius.mob_ap == 1) L = thermal.m_ap * pressure.P * exp(-thermal.E_ap / tempnew(i, j, k)) * phi_avg;
538 else L = thermal.m_ap * exp(-thermal.E_ap / tempnew(i, j, k)) * phi_avg;
539 L += thermal.m_htpb * exp(-thermal.E_htpb / tempnew(i, j, k)) * (1.0 - phi_avg);
540 //L += thermal.m_comb * (0.5 * tempnew(i, j, k) / thermal.bound) * phi(i, j, k) * (1.0 - phi(i, j, k));
541 if (tempnew(i, j, k) <= thermal.bound) mob(i, j, k) = 0;
542 else mob(i, j, k) = L;
543 //mob(i,j,k) = L;
544 if (isnan(mob(i, j, k))) {
545 Util::Message(INFO, mob(i, j, k), "mob contains nan (i=", i, " j= ", j, ")");
547 }
548 });
549 } // MFi For loop
550
551 } // thermal IF
552 else
553 {
554 std::swap(eta_old_mf[lev], eta_mf[lev]);
556 0.0,
557 -5.0 * pf.w1 + 16.0 * pf.w12 - 11.0 * pf.w0,
558 14.0 * pf.w1 - 32.0 * pf.w12 + 18.0 * pf.w0,
559 -8.0 * pf.w1 + 16.0 * pf.w12 - 8.0 * pf.w0
560 );
562
563 for (amrex::MFIter mfi(*eta_mf[lev], true); mfi.isValid(); ++mfi)
564 {
565 const amrex::Box& bx = mfi.tilebox();
566 //Phase Fields
567 amrex::Array4<Set::Scalar> const& etanew = (*eta_mf[lev]).array(mfi);
568 amrex::Array4<Set::Scalar> const& eta = (*eta_old_mf[lev]).array(mfi);
569 amrex::Array4<Set::Scalar> const& phi = (*phi_mf[lev]).array(mfi);
570
571 Set::Scalar fmod_ap = pressure.power.r_ap * pow(pressure.P, pressure.power.n_ap);
572 Set::Scalar fmod_htpb = pressure.power.r_htpb * pow(pressure.P, pressure.power.n_htpb);
573 Set::Scalar fmod_comb = pressure.power.r_comb * pow(pressure.P, pressure.power.n_comb);
574
575 pressure.power.a_fit = -1.16582 * sin(pressure.P) - 0.681788 * cos(pressure.P) + 3.3563;
576 pressure.power.b_fit = -0.708225 * sin(pressure.P) + 0.548067 * cos(pressure.P) + 1.55985;
577 pressure.power.c_fit = -0.0130849 * sin(pressure.P) - 0.03597 * cos(pressure.P) + 0.00725694;
578
579
580 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
581 {
582 //Set::Scalar phi_avg = Numeric::Interpolate::NodeToCellAverage(phi, i, j, k, 0);
583 Set::Scalar L;
584 if (homogeneousSystem == 1) {
585 Set::Vector grad_eta = Numeric::Gradient(eta, i, j, k, 0, DX);
586 Set::Scalar angle = acos(grad_eta[0] / grad_eta.lpNorm<2>()) * 180 / 3.1415;
587 if (angle > 90) angle = angle - 90.0;
588 if (angle > 180) angle = angle - 180.0;
589 if (angle > 270) angle = angle - 270.0;
590 L = pressure.power.a_fit + pressure.power.b_fit * exp(-pressure.power.c_fit * angle);
591 }
592 else {
593 Set::Scalar fs_actual;
594 fs_actual = fmod_ap * phi(i, j, k)
595 + fmod_htpb * (1.0 - phi(i, j, k))
596 + 4.0 * fmod_comb * phi(i, j, k) * (1.0 - phi(i, j, k));
597 L = fs_actual / pf.gamma / (pf.w1 - pf.w0);
598 }
599 Set::Scalar eta_lap = Numeric::Laplacian(eta, i, j, k, 0, DX);
600 Set::Scalar df_deta = ((pf.lambda / pf.eps) * dw(eta(i, j, k)) - pf.eps * pf.kappa * eta_lap);
601 etanew(i, j, k) = eta(i, j, k) - L * dt * df_deta;
602
603 if (etanew(i, j, k) > eta(i, j, k)) etanew(i, j, k) = eta(i, j, k);
604 });
605 } // MFI For Loop
606 } // thermal ELSE
607 }// First IF
608} //Function
609
610
611void Flame::TagCellsForRefinement(int lev, amrex::TagBoxArray& a_tags, Set::Scalar time, int ngrow)
612{
613 BL_PROFILE("Integrator::Flame::TagCellsForRefinement");
615
616 const Set::Scalar* DX = geom[lev].CellSize();
617 Set::Scalar dr = sqrt(AMREX_D_TERM(DX[0] * DX[0], +DX[1] * DX[1], +DX[2] * DX[2]));
618
619 // Eta criterion for refinement
620 for (amrex::MFIter mfi(*eta_mf[lev], true); mfi.isValid(); ++mfi)
621 {
622 const amrex::Box& bx = mfi.tilebox();
623 amrex::Array4<char> const& tags = a_tags.array(mfi);
624 amrex::Array4<const Set::Scalar> const& eta = (*eta_mf[lev]).array(mfi);
625
626 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
627 {
628 Set::Vector gradeta = Numeric::Gradient(eta, i, j, k, 0, DX);
629 if (gradeta.lpNorm<2>() * dr * 2 > m_refinement_criterion && eta(i, j, k) >= t_refinement_restriction)
630 tags(i, j, k) = amrex::TagBox::SET;
631 });
632 }
633
634 // Phi criterion for refinement
635 if (elastic.phirefinement) {
636 for (amrex::MFIter mfi(*eta_mf[lev], true); mfi.isValid(); ++mfi)
637 {
638 const amrex::Box& bx = mfi.tilebox();
639 amrex::Array4<char> const& tags = a_tags.array(mfi);
640 amrex::Array4<const Set::Scalar> const& phi = (*phi_mf[lev]).array(mfi);
641
642 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
643 {
644 Set::Vector gradphi = Numeric::Gradient(phi, i, j, k, 0, DX);
645 if (gradphi.lpNorm<2>() * dr >= phi_refinement_criterion)
646 tags(i, j, k) = amrex::TagBox::SET;
647 });
648 }
649 }
650
651
652 // Thermal criterion for refinement
653 if (thermal.on) {
654 for (amrex::MFIter mfi(*temp_mf[lev], true); mfi.isValid(); ++mfi)
655 {
656 const amrex::Box& bx = mfi.tilebox();
657 amrex::Array4<char> const& tags = a_tags.array(mfi);
658 amrex::Array4<const Set::Scalar> const& temp = (*temp_mf[lev]).array(mfi);
659 amrex::Array4<const Set::Scalar> const& eta = (*eta_mf[lev]).array(mfi);
660 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
661 {
662 Set::Vector tempgrad = Numeric::Gradient(temp, i, j, k, 0, DX);
663 if (tempgrad.lpNorm<2>() * dr > t_refinement_criterion && eta(i, j, k) >= t_refinement_restriction)
664 tags(i, j, k) = amrex::TagBox::SET;
665 });
666 }
667 }
668
669
670}
671
672void Flame::Regrid(int lev, Set::Scalar time)
673{
674 BL_PROFILE("Integrator::Flame::Regrid");
675 //if (lev < finest_level) return;
676 //phi_mf[lev]->setVal(0.0);
677 ic_phi->Initialize(lev, phi_mf, time);
678 //ic_phicell->Initialize(lev, phi_mf, time);
679}
680
681void Flame::Integrate(int amrlev, Set::Scalar /*time*/, int /*step*/,
682 const amrex::MFIter& mfi, const amrex::Box& box)
683{
684 BL_PROFILE("Flame::Integrate");
685 const Set::Scalar* DX = geom[amrlev].CellSize();
686 Set::Scalar dv = AMREX_D_TERM(DX[0], *DX[1], *DX[2]);
687 amrex::Array4<amrex::Real> const& eta = (*eta_mf[amrlev]).array(mfi);
688 amrex::Array4<amrex::Real> const& mdot = (*mdot_mf[amrlev]).array(mfi);
689 if (variable_pressure) {
690 amrex::ParallelFor(box, [=] AMREX_GPU_DEVICE(int i, int j, int k)
691 {
692 volume += eta(i, j, k, 0) * dv;
693 Set::Vector grad = Numeric::Gradient(eta, i, j, k, 0, DX);
694 Set::Scalar normgrad = grad.lpNorm<2>();
695 Set::Scalar da = normgrad * dv;
696 area += da;
697
698 Set::Vector mgrad = Numeric::Gradient(mdot, i, j, k, 0, DX);
699 Set::Scalar mnormgrad = mgrad.lpNorm<2>();
700 Set::Scalar dm = mnormgrad * dv;
701 massflux += dm;
702
703 });
704 }
705 else {
706 amrex::ParallelFor(box, [=] AMREX_GPU_DEVICE(int i, int j, int k)
707 {
708 volume += eta(i, j, k, 0) * dv;
709 Set::Vector grad = Numeric::Gradient(eta, i, j, k, 0, DX);
710 Set::Scalar normgrad = grad.lpNorm<2>();
711 Set::Scalar da = normgrad * dv;
712 area += da;
713 });
714 }
715 // time dependent pressure data from experimenta -> p = 0.0954521220950523 * exp(15.289993148880678 * t)
716}
717} // namespace Integrator
718
719
#define pp_query_validate(...)
Definition ParmParse.H:101
#define pp_query_required(...)
Definition ParmParse.H:99
#define pp_query(...)
Definition ParmParse.H:106
#define pp_query_default(...)
Definition ParmParse.H:100
#define pp_queryclass(...)
Definition ParmParse.H:107
#define INFO
Definition Util.H:20
Definition BMP.H:21
void Initialize(const int &a_lev, Set::Field< T > &a_field, Set::Scalar a_time=0.0)
Definition IC.H:39
Initialize Laminates in a matrix.
Definition Laminate.H:16
Definition PNG.H:26
void forbid(std::string name, std::string explanation, std::string file="", std::string func="", int line=-1)
Definition ParmParse.H:140
int AnyUnusedInputs()
Definition ParmParse.H:549
void queryclass(std::string name, T *value, std::string file="", std::string func="", int line=-1)
Definition ParmParse.H:604
void select(std::string name, PTRTYPE *&ic_eta, Args &&... args)
Definition ParmParse.H:692
void select_default(std::string name, PTRTYPE *&ic_eta, Args &&... args)
Definition ParmParse.H:720
int query_default(std::string name, T &value, T defaultvalue, std::string="", std::string="", int=-1)
Definition ParmParse.H:185
static int AllUnusedInputs()
Definition ParmParse.H:576
virtual void TimeStepBegin(Set::Scalar a_time, int a_step) override
Definition Mechanics.H:163
void Initialize(int lev) override
Use the #ic object to initialize::Temp.
Definition Mechanics.H:143
void Advance(int lev, Set::Scalar time, Set::Scalar dt) override
Definition Mechanics.H:241
void TagCellsForRefinement(int lev, amrex::TagBoxArray &a_tags, Set::Scalar, int) override
Definition Mechanics.H:439
Set::Field< Set::Scalar > psi_mf
Definition Mechanics.H:465
Set::Field< Model::Solid::Finite::NeoHookeanPredeformed > model_mf
Definition Mechanics.H:463
Set::Scalar n_htpb
Definition Flame.H:115
Set::Scalar r_htpb
Definition Flame.H:114
struct Integrator::Flame::@2::@5 arrhenius
Set::Scalar b1
Definition Flame.H:106
Set::Scalar volume
Definition Flame.H:149
Set::Scalar cp_htpb
Definition Flame.H:124
IC::IC< Set::Scalar > * ic_eta
Definition Flame.H:84
Set::Field< Set::Scalar > laser_mf
Definition Flame.H:69
Set::Scalar mlocal_ap
Definition Flame.H:131
Set::Scalar zeta
Definition Flame.H:80
Set::Field< Set::Scalar > alpha_mf
Definition Flame.H:66
Set::Scalar n_ap
Definition Flame.H:115
struct Integrator::Flame::@2 pressure
BC::BC< Set::Scalar > * bc_temp
Definition Flame.H:71
Set::Scalar a1
Definition Flame.H:105
Set::Scalar c1
Definition Flame.H:107
void UpdateModel(int a_step, Set::Scalar a_time) override
Definition Flame.cpp:280
Set::Scalar lambda
Definition Flame.H:93
Set::Scalar gamma
Definition Flame.H:91
Set::Scalar disperssion2
Definition Flame.H:135
Set::Scalar w1
Definition Flame.H:95
Set::Scalar k_ap
Definition Flame.H:123
Set::Scalar a2
Definition Flame.H:105
Set::Field< Set::Scalar > mob_mf
Definition Flame.H:61
Set::Field< Set::Scalar > phi_mf
Definition Flame.H:64
Set::Field< Set::Scalar > temp_old_mf
Definition Flame.H:55
Set::Scalar h2
Definition Flame.H:110
Set::Scalar rho_ap
Definition Flame.H:122
Set::Scalar small
Definition Flame.H:82
Set::Scalar modeling_ap
Definition Flame.H:130
IC::IC< Set::Scalar > * ic_temp
Definition Flame.H:137
int variable_pressure
Definition Flame.H:88
Set::Scalar area
Definition Flame.H:150
Set::Scalar m_htpb
Definition Flame.H:127
Set::Scalar y_len
Definition Flame.H:156
Set::Scalar cp_ap
Definition Flame.H:124
Set::Scalar n_comb
Definition Flame.H:115
Set::Scalar T_fluid
Definition Flame.H:132
void Regrid(int lev, Set::Scalar time) override
Definition Flame.cpp:672
Set::Scalar mlocal_comb
Definition Flame.H:131
Set::Scalar rho_htpb
Definition Flame.H:122
BC::BC< Set::Scalar > * bc_psi
Definition Flame.H:158
Set::Scalar chamber_pressure
Definition Flame.H:152
model_type model_ap
Definition Flame.H:143
Set::Scalar w0
Definition Flame.H:95
void TimeStepComplete(Set::Scalar a_time, int a_iter) override
Definition Flame.cpp:363
Set::Scalar mlocal_htpb
Definition Flame.H:131
Set::Scalar zeta_0
Definition Flame.H:81
Set::Field< Set::Scalar > eta_mf
Definition Flame.H:59
Set::Scalar phi_refinement_criterion
Definition Flame.H:76
Set::Scalar chamber_area
Definition Flame.H:151
void TimeStepBegin(Set::Scalar a_time, int a_iter) override
Definition Flame.cpp:353
Set::Scalar disperssion1
Definition Flame.H:134
Set::Scalar b2
Definition Flame.H:106
int homogeneousSystem
Definition Flame.H:86
Set::Scalar x_len
Definition Flame.H:155
static void Parse(Flame &value, IO::ParmParse &pp)
Definition Flame.cpp:28
Set::Scalar k_htpb
Definition Flame.H:123
void Initialize(int lev) override
Definition Flame.cpp:238
Set::Scalar massflux
Definition Flame.H:153
struct Integrator::Flame::@1 pf
Set::Scalar kappa
Definition Flame.H:94
Set::Scalar traction
Definition Flame.H:144
Set::Scalar Tref
Definition Flame.H:142
Set::Field< Set::Scalar > temps_mf
Definition Flame.H:56
Set::Scalar q0
Definition Flame.H:125
void Advance(int lev, Set::Scalar time, Set::Scalar dt) override
Definition Flame.cpp:375
Set::Scalar E_htpb
Definition Flame.H:128
Set::Scalar t_refinement_restriction
Definition Flame.H:79
Set::Scalar E_ap
Definition Flame.H:128
Set::Scalar massfraction
Definition Flame.H:133
Set::Scalar disperssion3
Definition Flame.H:136
Set::Scalar t_refinement_criterion
Definition Flame.H:78
struct Integrator::Flame::@3 thermal
Set::Field< Set::Scalar > eta_old_mf
Definition Flame.H:60
Set::Scalar m_refinement_criterion
Definition Flame.H:77
Set::Scalar modeling_htpb
Definition Flame.H:130
struct Integrator::Flame::@2::@6 power
Set::Scalar hc
Definition Flame.H:129
void Integrate(int amrlev, Set::Scalar time, int step, const amrex::MFIter &mfi, const amrex::Box &box) override
Definition Flame.cpp:681
model_type model_htpb
Definition Flame.H:143
Set::Scalar P
Definition Flame.H:101
BC::BC< Set::Scalar > * bc_eta
Definition Flame.H:72
IC::IC< Set::Scalar > * ic_laser
Definition Flame.H:74
Set::Scalar bound
Definition Flame.H:126
Set::Scalar base_time
Definition Flame.H:83
Set::Field< Set::Scalar > temps_old_mf
Definition Flame.H:57
void TagCellsForRefinement(int lev, amrex::TagBoxArray &tags, amrex::Real, int) override
Definition Flame.cpp:611
struct Integrator::Flame::@4 elastic
Set::Field< Set::Scalar > temp_mf
Definition Flame.H:54
Set::Scalar b3
Definition Flame.H:106
Set::Scalar w12
Definition Flame.H:95
Set::Scalar h1
Definition Flame.H:110
Set::Scalar r_comb
Definition Flame.H:114
Set::Scalar m_ap
Definition Flame.H:127
Set::Field< Set::Scalar > heatflux_mf
Definition Flame.H:67
Set::Scalar r_ap
Definition Flame.H:114
bool plot_field
Definition Flame.H:87
Set::Field< Set::Scalar > mdot_mf
Definition Flame.H:62
IC::IC< Set::Scalar > * ic_phi
Definition Flame.H:73
Set::Scalar eps
Definition Flame.H:92
Set::Scalar a3
Definition Flame.H:105
void RegisterNewFab(Set::Field< Set::Scalar > &new_fab, BC::BC< Set::Scalar > *new_bc, int ncomp, int nghost, std::string name, bool writeout, std::vector< std::string > suffix={})
Add a new cell-based scalar field.
std::vector< amrex::Box > box
Definition Integrator.H:446
void RegisterNodalFab(Set::Field< Set::Scalar > &new_fab, int ncomp, int nghost, std::string name, bool writeout, std::vector< std::string > suffix={})
Add a new node-based scalar field.
amrex::Vector< amrex::Real > dt
Timesteps for each level of refinement.
Definition Integrator.H:381
void RegisterIntegratedVariable(Set::Scalar *integrated_variable, std::string name, bool extensive=true)
Register a variable to be integrated over the spatial domain using the Integrate function.
Collection of numerical integrator objects.
Definition AllenCahn.H:41
AMREX_FORCE_INLINE Set::Scalar Laplacian(const amrex::Array4< const Set::Scalar > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM], std::array< StencilType, AMREX_SPACEDIM > &stencil=DefaultType)
Definition Stencil.H:546
static AMREX_FORCE_INLINE std::array< StencilType, AMREX_SPACEDIM > GetStencil(const int i, const int j, const int k, const amrex::Box domain)
Definition Stencil.H:36
AMREX_FORCE_INLINE Set::Vector CellGradientOnNode(const amrex::Array4< const Set::Scalar > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM])
Definition Stencil.H:690
AMREX_FORCE_INLINE Set::Vector Gradient(const amrex::Array4< const Set::Scalar > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM], std::array< StencilType, AMREX_SPACEDIM > stencil=DefaultType)
Definition Stencil.H:672
amrex::Real Scalar
Definition Base.H:19
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
void Warning(std::string file, std::string func, int line, Args const &... args)
Definition Util.H:181
void Message(std::string file, std::string func, int line, Args const &... args)
Definition Util.H:141
void Exception(std::string file, std::string func, int line, Args const &... args)
Definition Util.H:205
static AMREX_FORCE_INLINE T NodeToCellAverage(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m)
Definition Stencil.H:1331
static AMREX_FORCE_INLINE T CellToNodeAverage(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m, std::array< StencilType, AMREX_SPACEDIM > stencil=DefaultType)
Definition Stencil.H:1293