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#include "Util/Util.H"
17
18#include <cmath>
19
20namespace Integrator
21{
22
24
26{
27 pp_queryclass(*this);
28}
29
30
31void
33{
34 pp.forbid("pressure.P","use chamber.pressure instead");
35
36 pp.forbid("geometry.x_len","This is specified by geometry.prob_lo/hi");
37 pp.forbid("geometry.y_len","This is specified by geometry.prob_lo/hi");
38 pp.forbid("amr.ghost_cells", "This should not be adjustable ");
39
40 pp.forbid("pf.gamma","implemented in regression rate law objects now");
41
42 pp.forbid("pressure.r_ap", "use regression.powerlaw.r_ap");
43 pp.forbid("pressure.r_htpb", "use regression.powerlaw.r_htpb");
44 pp.forbid("pressure.r_comb", "use regression.powerlaw.r_comb");
45 pp.forbid("pressure.n_ap", "use regression.powerlaw.n_ap");
46 pp.forbid("pressure.n_htpb", "use regression.powerlaw.n_htpb");
47 pp.forbid("pressure.n_comb", "use regression.powerlaw.n_comb");
48
49 pp.forbid("thermal.bound", "use thermal.Tref");
50 pp.forbid("thermal.T_fluid", "use thermal.Tfluid (or nothing)");
51 pp.forbid("thermal.m_ap", "use regression.arrhenius.m_ap");
52 pp.forbid("thermal.m_htpb", "use regression.arrhenius.m_htpb");
53 pp.forbid("thermal.E_ap", "use regression.arrhenius.E_ap");
54 pp.forbid("thermal.E_htpb", "use regression.arrhenius.E_htpb");
55 pp.forbid("thermal.modeling_ap", "Old debug variable. Should equal 1 ");
56 pp.forbid("thermal.modeling_htpb", "Old debug variable. Should equal 1");
57
58 pp.forbid("pressure.a1", "use propellant.mesoscale.a1 instead");
59 pp.forbid("pressure.a2", "use propellant.mesoscale.a2 instead");
60 pp.forbid("pressure.a3", "use propellant.mesoscale.a3 instead");
61 pp.forbid("pressure.b1", "use propellant.mesoscale.b1 instead");
62 pp.forbid("pressure.b2", "use propellant.mesoscale.b2 instead");
63 pp.forbid("pressure.b3", "use propellant.mesoscale.b3 instead");
64 pp.forbid("pressure.c1", "use propellant.mesoscale.c1 instead");
65 pp.forbid("pressure.mob_ap", "no longer used");
66 pp.forbid("pressure.dependency", "use propellant.mesoscale.arrhenius_dependency");
67 pp.forbid("pressure.h1", "use propellant.mesoscale.h1 instead");
68 pp.forbid("pressure.h2", "use propellant.mesoscale.h2 instead");
69 pp.forbid("thermal.mlocal_ap", "use propellant.mesoscale.mlocal_ap");
70 pp.forbid("thermal.mlocal_comb", "use propellant.mesoscale.mlocal_comb");
71 pp.forbid("thermal.mlocal_htpb", "this actually did **nothing** - it was overridden by a hard code using massfraction.");
72
73 pp.forbid("thermal.disperssion1", "use propellant.mesoscale.dispersion1");
74 pp.forbid("thermal.disperssion2", "use propellant.mesoscale.dispersion2");
75 pp.forbid("thermal.disperssion3", "use propellant.mesoscale.dispersion3");
76
77 pp.forbid("thermal.rho_ap", "use propellant.XX.rho_ap ");
78 pp.forbid("thermal.rho_htpb","use propellant.XX.rho_htpb ");
79 pp.forbid("thermal.k_ap", "use propellant.XX.k_ap ");
80 pp.forbid("thermal.k_htpb", "use propellant.XX.k_htpb ");
81 pp.forbid("thermal.cp_ap", "use propellant.XX.cp_ap ");
82 pp.forbid("thermal.cp_htpb","use propellant.XX.cp_htpb ");
83}
84
85
86// [parser]
87void
89{
90 BL_PROFILE("Integrator::Flame::Flame()");
91
92 Forbids(pp);
93
94 // Whether to include extra fields (such as mdot, etc) in the plot output
95 pp_query_default("plot_field",value.plot_field,true);
96
97 //
98 // PHASE FIELD VARIABLES
99 //
100
101 pp_query_default("pf.eps", value.pf.eps, 0.0); // Burn width thickness
102 pp_query_default("pf.kappa", value.pf.kappa, 0.0); // Interface energy param
103 pp_query_default("pf.lambda", value.pf.lambda, 0.0); // Chemical potential multiplier
104 pp_query_default("pf.w1", value.pf.w1, 0.0); // Unburned rest energy
105 pp_query_default("pf.w12", value.pf.w12, 0.0); // Barrier energy
106 pp_query_default("pf.w0", value.pf.w0, 0.0); // Burned rest energy
107
108 // Boundary conditions for phase field order params
109 pp.select<BC::Constant>("pf.eta.bc", value.bc_eta, 1 );
110 value.RegisterNewFab(value.eta_mf, value.bc_eta, 1, 2, "eta", true);
111 value.RegisterNewFab(value.eta_old_mf, value.bc_eta, 1, 2, "eta_old", false);
112
113 // phase field initial condition
114 pp.select<IC::Laminate,IC::Constant,IC::Expression,IC::BMP,IC::PNG>("pf.eta.ic",value.ic_eta,value.geom);
115
116
117
118 // Select reduced order model to capture heat feedback
122 ("propellant",value.propellant);
123
124
125 // Whether to use the Thermal Transport Model
126 pp_query_default("thermal.on", value.thermal.on, false);
127
128 // Reference temperature
129 // Used to set all other reference temperatures by default.
130 pp_query_default("thermal.Tref", value.thermal.Tref, 300.0);
131
132 if (value.thermal.on) {
133
134 // Used to change heat flux units
135 pp_query_default("thermal.hc", value.thermal.hc, 1.0);
136 // System AP mass fraction
137 //pp_query_default("thermal.massfraction", value.thermal.massfraction, 0.8);
138
139 // Effective fluid temperature
140 pp_query_default("thermal.Tfluid", value.thermal.Tfluid, value.thermal.Tref);
141
142 //Temperature boundary condition
143 pp.select_default<BC::Constant>("thermal.temp.bc", value.bc_temp, 1);
144
145 value.RegisterNewFab(value.temp_mf, value.bc_temp, 1, 3, "temp", true);
146 value.RegisterNewFab(value.temp_old_mf, value.bc_temp, 1, 3, "temp_old", false);
147 value.RegisterNewFab(value.temps_mf, value.bc_temp, 1, 0, "temps", false);
148
149 value.RegisterNewFab(value.mdot_mf, value.bc_temp, 1, 0, "mdot", value.plot_field);
150 value.RegisterNewFab(value.alpha_mf, value.bc_temp, 1, 0, "alpha", value.plot_field);
151 value.RegisterNewFab(value.heatflux_mf, value.bc_temp, 1, 0, "heatflux", value.plot_field);
152 value.RegisterNewFab(value.laser_mf, value.bc_temp, 1, 0, "laser", value.plot_field);
153
154 value.RegisterIntegratedVariable(&value.chamber.volume, "volume");
155 value.RegisterIntegratedVariable(&value.chamber.area, "area");
156 value.RegisterIntegratedVariable(&value.chamber.massflux, "mass_flux");
157
158 // laser initial condition
159 pp.select_default<IC::Constant,IC::Expression>("laser.ic",value.ic_laser, value.geom);
160
161 // thermal initial condition
163 }
164
165
166 // Constant pressure value
167 pp_query_default("chamber.pressure", value.chamber.pressure, 1.0);
168
169 // Whether to compute the pressure evolution
170 pp_query_default("variable_pressure", value.variable_pressure, 0);
171
172 // Refinement criterion for eta field
173 pp_query_default("amr.refinement_criterion", value.m_refinement_criterion, 0.001);
174
175 // Refinement criterion for temperature field
176 pp_query_default("amr.refinement_criterion_temp", value.t_refinement_criterion, 0.001);
177
178 // Eta value to restrict the refinament for the temperature field
179 pp_query_default("amr.refinament_restriction", value.t_refinement_restriction, 0.1);
180
181 // Refinement criterion for phi field [infinity]
182 pp_query_default("amr.phi_refinement_criterion", value.phi_refinement_criterion, 1.0e100);
183
184 // Minimum allowable threshold for $\eta$
185 pp_query_default("small", value.small, 1.0e-8);
186
187 // Initial condition for $\phi$ field.
189 ("phi.ic",value.ic_phi,value.geom);
190
191 value.RegisterNodalFab(value.phi_mf, 1, 2, "phi", true);
192
193 // Whether to use Neo-hookean Elastic model
194 pp_query_default("elastic.on", value.elastic.on, 0);
195
196 // Body force
197 pp_query_default("elastic.traction", value.elastic.traction, 0.0);
198
199 // Phi refinement criteria
200 pp_query_default("elastic.phirefinement", value.elastic.phirefinement, 1);
201
202 pp.queryclass<Base::Mechanics<model_type>>("elastic",value);
203
204 if (value.m_type != Type::Disable)
205 {
206 // Reference temperature for thermal expansion
207 // (temperature at which the material is strain-free)
208 pp_query_default("Telastic", value.elastic.Telastic, value.thermal.Tref);
209 // elastic model of AP
211 // elastic model of HTPB
213
214 // Use our current eta field as the psi field for the solver
215 value.psi_on = false;
216 value.solver.setPsi(value.eta_mf);
217 }
218
219 bool allow_unused;
220 // Set this to true to allow unused inputs without error.
221 // (Not recommended.)
222 pp.query_default("allow_unused",allow_unused,false);
223 if (!allow_unused && pp.AnyUnusedInputs())
224 {
225 Util::Warning(INFO,"The following inputs were specified but not used:");
226 pp.AllUnusedInputs();
227 Util::Exception(INFO,"Aborting. Specify 'allow_unused=True` to ignore this error.");
228 }
229}
230
231void Flame::Initialize(int lev)
232{
233 BL_PROFILE("Integrator::Flame::Initialize");
235
236 ic_eta->Initialize(lev, eta_mf);
238 ic_phi->Initialize(lev, phi_mf);
239 //ic_phicell->Initialize(lev, phicell_mf);
240
241 if (elastic.on) {
242 rhs_mf[lev]->setVal(Set::Vector::Zero());
243 }
244 if (thermal.on) {
245 if (thermal.ic_temp)
246 {
247 thermal.ic_temp->Initialize(lev,temp_mf);
248 thermal.ic_temp->Initialize(lev,temp_old_mf);
249 thermal.ic_temp->Initialize(lev,temps_mf);
250 }
251 else
252 {
253 temp_mf[lev]->setVal(thermal.Tref);
254 temp_old_mf[lev]->setVal(thermal.Tref);
255 temps_mf[lev]->setVal(thermal.Tref);
256 }
257 alpha_mf[lev]->setVal(0.0);
258 mdot_mf[lev]->setVal(0.0);
259 heatflux_mf[lev]->setVal(0.0);
260 thermal.w1 = 0.2 * chamber.pressure + 0.9;
262 }
263 if (variable_pressure) chamber.pressure = 1.0;
264}
265
266void Flame::UpdateModel(int /*a_step*/, Set::Scalar /*a_time*/)
267{
269
270 for (int lev = 0; lev <= finest_level; ++lev)
271 {
272 amrex::Box domain = this->geom[lev].Domain();
273 domain.convert(amrex::IntVect::TheNodeVector());
274 const Set::Scalar* DX = geom[lev].CellSize();
275
276 phi_mf[lev]->FillBoundary();
277 eta_mf[lev]->FillBoundary();
278 temp_mf[lev]->FillBoundary();
279
280 for (MFIter mfi(*model_mf[lev], false); mfi.isValid(); ++mfi)
281 {
282 amrex::Box smallbox = mfi.nodaltilebox();
283 amrex::Box bx = mfi.grownnodaltilebox() & domain;
284 Set::Patch<model_type> model = model_mf.Patch(lev,mfi);
287 Set::Patch<Set::Vector> rhs = rhs_mf.Patch(lev,mfi);
288
289 if (elastic.on)
290 {
292 amrex::ParallelFor(smallbox, [=] AMREX_GPU_DEVICE(int i, int j, int k)
293 {
294 Set::Vector grad_eta = Numeric::CellGradientOnNode(eta, i, j, k, 0, DX);
295 rhs(i, j, k) = elastic.traction * grad_eta;
296 });
297 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
298 {
299 Set::Scalar phi_avg = phi(i, j, k, 0);
300 Set::Scalar temp_avg = Numeric::Interpolate::CellToNodeAverage(temp, i, j, k, 0);
301 model_type model_ap = elastic.model_ap;
302 model_ap.F0 -= Set::Matrix::Identity();
303 model_ap.F0 *= (temp_avg - elastic.Telastic);
304 model_ap.F0 += Set::Matrix::Identity();
305 model_type model_htpb = elastic.model_htpb;
306 model_htpb.F0 -= Set::Matrix::Identity();
307 model_htpb.F0 *= (temp_avg - elastic.Telastic);
308 model_htpb.F0 += Set::Matrix::Identity();
309
310 model(i, j, k) = model_ap * phi_avg + model_htpb * (1. - phi_avg);
311 });
312 }
313 else
314 {
315 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
316 {
317 Set::Scalar phi_avg = Numeric::Interpolate::CellToNodeAverage(phi, i, j, k, 0);
318 //phi_avg = phi(i,j,k,0);
319 model_type model_ap = elastic.model_ap;
320 model_ap.F0 *= Set::Matrix::Zero();
321 model_type model_htpb = elastic.model_htpb;
322 model_htpb.F0 *= Set::Matrix::Zero();
323 model(i, j, k) = model_ap * phi_avg + model_htpb * (1. - phi_avg);
324 });
325 }
326 }
327 Util::RealFillBoundary(*model_mf[lev], geom[lev]);
328
329 }
330}
331
332void Flame::TimeStepBegin(Set::Scalar a_time, int a_iter)
333{
334 BL_PROFILE("Integrator::Flame::TimeStepBegin");
336 if (thermal.on) {
337 for (int lev = 0; lev <= finest_level; ++lev)
338 ic_laser->Initialize(lev, laser_mf, a_time);
339 }
340}
341
342void Flame::TimeStepComplete(Set::Scalar /*a_time*/, int /*a_iter*/)
343{
344 BL_PROFILE("Integrator::Flame::TimeStepComplete");
345 if (variable_pressure) {
346 //Set::Scalar x_len = geom[0].ProbDomain().length(0);
347 //Set::Scalar y_len = geom[0].ProbDomain().length(1);
348 // Set::Scalar domain_area = x_len * y_len;
349 Util::Message(INFO, "Mass = ", chamber.massflux);
350 Util::Message(INFO, "Pressure = ", chamber.pressure);
351 }
352}
353
355{
356 BL_PROFILE("Integrador::Flame::Advance");
358 const Set::Scalar* DX = geom[lev].CellSize();
359
360 std::swap(eta_old_mf[lev], eta_mf[lev]);
361
362 //
363 // Chamber pressure update
364 //
365 if (variable_pressure) {
366 chamber.pressure = exp(0.00075 * chamber.massflux);
367 if (chamber.pressure > 10.0) {
368 chamber.pressure = 10.0;
369 }
370 else if (chamber.pressure <= 0.99) {
371 chamber.pressure = 0.99;
372 }
373 elastic.traction = chamber.pressure;
374 }
375
376
377 //
378 // Multi-well chemical potential
379 //
381 0.0,
382 -5.0 * pf.w1 + 16.0 * pf.w12 - 11.0 * pf.w0,
383 14.0 * pf.w1 - 32.0 * pf.w12 + 18.0 * pf.w0,
384 -8.0 * pf.w1 + 16.0 * pf.w12 - 8.0 * pf.w0);
386
388
389 for (amrex::MFIter mfi(*eta_mf[lev], true); mfi.isValid(); ++mfi)
390 {
391 const amrex::Box& bx = mfi.tilebox();
392 // Phase fields
393 Set::Patch<Set::Scalar> etanew = eta_mf.Patch(lev,mfi);
396 // Heat transfer fields
398 Set::Patch<Set::Scalar> alpha = alpha_mf.Patch(lev,mfi);
399 Set::Patch<Set::Scalar> laser = laser_mf.Patch(lev,mfi);
400 // Diagnostic fields
401 Set::Patch<Set::Scalar> mdot = mdot_mf.Patch(lev,mfi);
402 Set::Patch<Set::Scalar> heatflux = heatflux_mf.Patch(lev,mfi);
403
404
405 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
406 {
407 //
408 // CALCULATE PHI-AVERAGED QUANTITIES
409 //
410 Set::Scalar phi_avg = Numeric::Interpolate::NodeToCellAverage(phi, i, j, k, 0);
411 Set::Scalar T = thermal.on ? temp(i,j,k) : NAN;
412
413 Set::Scalar K = propellant.get_K(phi_avg);
414
416
417 Set::Scalar cp = propellant.get_cp(phi_avg);
418
419 //
420 // CALCULATE MOBILITY
421 //
422 Set::Scalar L = propellant.get_L( phi_avg, T);
423
424 //
425 // EVOLVE PHASE FIELD (ETA)
426 //
427
428 Set::Scalar eta_lap = Numeric::Laplacian(eta, i, j, k, 0, DX);
429 Set::Scalar df_deta = ((pf.lambda / pf.eps) * dw(eta(i, j, k)) - pf.eps * pf.kappa * eta_lap);
430 etanew(i, j, k) = eta(i, j, k) - L * dt * df_deta;
431 if (etanew(i, j, k) <= small) etanew(i, j, k) = small;
432
433 if (thermal.on)
434 {
435 //
436 // Calculate thermal diffisivity and store for later gradient
437 //
438
439 alpha(i, j, k) = K / rho / cp;
440
441 //
442 // CALCULATE MASS FLUX BASED ON EVOLVING ETA
443 //
444
445 mdot(i, j, k) = rho * fabs(eta(i, j, k) - etanew(i, j, k)) / dt;
446
447 //
448 // CALCULATE HEAT FLUX BASED ON THE CALCULATED MASS FLUX
449 //
450
451 Set::Scalar q0 = propellant.get_qdot(mdot(i,j,k), phi_avg);
452 heatflux(i,j,k) = ( thermal.hc*q0 + laser(i,j,k) ) / K;
453
454 }
455
456 });
457
458 } // MFi For loop
459
460
461 //
462 // THERMAL TRANSPORT
463 //
464 if (thermal.on)
465 {
466 std::swap(temp_old_mf[lev], temp_mf[lev]);
467
468 for (amrex::MFIter mfi(*eta_mf[lev], true); mfi.isValid(); ++mfi)
469 {
470 const amrex::Box& bx = mfi.tilebox();
471
472 Set::Patch<Set::Scalar> tempnew = temp_mf.Patch(lev,mfi);
475
476 Set::Patch<Set::Scalar> temps = temps_mf.Patch(lev,mfi);
477
478
479 // Phase field
480 Set::Patch<Set::Scalar> etanew = (*eta_mf[lev]).array(mfi);
481 Set::Patch<const Set::Scalar> eta = (*eta_old_mf[lev]).array(mfi);
482 // Diagnostic fields
484
485 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
486 {
487 auto sten = Numeric::GetStencil(i, j, k, bx);
488 Set::Vector grad_eta = Numeric::Gradient(eta, i, j, k, 0, DX);
489 Set::Vector grad_temp = Numeric::Gradient(temp, i, j, k, 0, DX);
490 Set::Scalar lap_temp = Numeric::Laplacian(temp, i, j, k, 0, DX);
491 Set::Scalar grad_eta_mag = grad_eta.lpNorm<2>();
492 Set::Vector grad_alpha = Numeric::Gradient(alpha, i, j, k, 0, DX, sten);
493 Set::Scalar dTdt = 0.0;
494 dTdt += grad_eta.dot(grad_temp * alpha(i, j, k));
495 dTdt += grad_alpha.dot(eta(i, j, k) * grad_temp);
496 dTdt += eta(i, j, k) * alpha(i, j, k) * lap_temp;
497 dTdt += alpha(i, j, k) * heatflux(i, j, k) * grad_eta_mag;
498
499 Set::Scalar Tsolid = dTdt + temps(i, j, k) * (etanew(i, j, k) - eta(i, j, k)) / dt;
500 temps(i, j, k) = temps(i, j, k) + dt * Tsolid;
501 tempnew(i, j, k) = etanew(i, j, k) * temps(i, j, k) + (1.0 - etanew(i, j, k)) * thermal.Tfluid;
502 });
503 }
504 }
505
506} //Function
507
508
509void Flame::TagCellsForRefinement(int lev, amrex::TagBoxArray& a_tags, Set::Scalar time, int ngrow)
510{
511 BL_PROFILE("Integrator::Flame::TagCellsForRefinement");
513
514 const Set::Scalar* DX = geom[lev].CellSize();
515 Set::Scalar dr = sqrt(AMREX_D_TERM(DX[0] * DX[0], +DX[1] * DX[1], +DX[2] * DX[2]));
516
517 // Eta criterion for refinement
518 for (amrex::MFIter mfi(*eta_mf[lev], true); mfi.isValid(); ++mfi)
519 {
520 const amrex::Box& bx = mfi.tilebox();
521 amrex::Array4<char> const& tags = a_tags.array(mfi);
523
524 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
525 {
526 Set::Vector gradeta = Numeric::Gradient(eta, i, j, k, 0, DX);
527 if (gradeta.lpNorm<2>() * dr * 2 > m_refinement_criterion && eta(i, j, k) >= t_refinement_restriction)
528 tags(i, j, k) = amrex::TagBox::SET;
529 });
530 }
531
532 // Phi criterion for refinement
533 if (elastic.phirefinement) {
534 for (amrex::MFIter mfi(*eta_mf[lev], true); mfi.isValid(); ++mfi)
535 {
536 const amrex::Box& bx = mfi.tilebox();
537 amrex::Array4<char> const& tags = a_tags.array(mfi);
539
540 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
541 {
542 Set::Vector gradphi = Numeric::Gradient(phi, i, j, k, 0, DX);
543 if (gradphi.lpNorm<2>() * dr >= phi_refinement_criterion)
544 tags(i, j, k) = amrex::TagBox::SET;
545 });
546 }
547 }
548
549
550 // Thermal criterion for refinement
551 if (thermal.on) {
552 for (amrex::MFIter mfi(*temp_mf[lev], true); mfi.isValid(); ++mfi)
553 {
554 const amrex::Box& bx = mfi.tilebox();
555 amrex::Array4<char> const& tags = a_tags.array(mfi);
558 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
559 {
560 Set::Vector tempgrad = Numeric::Gradient(temp, i, j, k, 0, DX);
561 if (tempgrad.lpNorm<2>() * dr > t_refinement_criterion && eta(i, j, k) >= t_refinement_restriction)
562 tags(i, j, k) = amrex::TagBox::SET;
563 });
564 }
565 }
566}
567
568void Flame::Regrid(int lev, Set::Scalar time)
569{
570 BL_PROFILE("Integrator::Flame::Regrid");
571 //if (lev < finest_level) return;
572 //phi_mf[lev]->setVal(0.0);
573 ic_phi->Initialize(lev, phi_mf, time);
574 //ic_phicell->Initialize(lev, phi_mf, time);
575}
576
577void Flame::Integrate(int amrlev, Set::Scalar /*time*/, int /*step*/,
578 const amrex::MFIter& mfi, const amrex::Box& box)
579{
580 BL_PROFILE("Flame::Integrate");
581 const Set::Scalar* DX = geom[amrlev].CellSize();
582 Set::Scalar dv = AMREX_D_TERM(DX[0], *DX[1], *DX[2]);
585 if (variable_pressure) {
586 amrex::ParallelFor(box, [=] AMREX_GPU_DEVICE(int i, int j, int k)
587 {
588 chamber.volume += eta(i, j, k, 0) * dv;
589 Set::Vector grad = Numeric::Gradient(eta, i, j, k, 0, DX);
590 Set::Scalar normgrad = grad.lpNorm<2>();
591 Set::Scalar da = normgrad * dv;
592 chamber.area += da;
593
594 Set::Vector mgrad = Numeric::Gradient(mdot, i, j, k, 0, DX);
595 Set::Scalar mnormgrad = mgrad.lpNorm<2>();
596 Set::Scalar dm = mnormgrad * dv;
597 chamber.massflux += dm;
598
599 });
600 }
601 else {
602 amrex::ParallelFor(box, [=] AMREX_GPU_DEVICE(int i, int j, int k)
603 {
604 chamber.volume += eta(i, j, k, 0) * dv;
605 Set::Vector grad = Numeric::Gradient(eta, i, j, k, 0, DX);
606 Set::Scalar normgrad = grad.lpNorm<2>();
607 Set::Scalar da = normgrad * dv;
608 chamber.area += da;
609 });
610 }
611 // time dependent pressure data from experimenta -> p = 0.0954521220950523 * exp(15.289993148880678 * t)
612}
613} // namespace Integrator
614
615
#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:158
int AnyUnusedInputs(bool inscopeonly=true, bool verbose=false)
Definition ParmParse.H:567
void queryclass(std::string name, T *value, std::string file="", std::string func="", int line=-1)
Definition ParmParse.H:633
void select(std::string name, PTRTYPE *&ic_eta, Args &&... args)
Definition ParmParse.H:721
void select_default(std::string name, PTRTYPE *&ic_eta, Args &&... args)
Definition ParmParse.H:749
int query_default(std::string name, T &value, T defaultvalue, std::string="", std::string="", int=-1)
Definition ParmParse.H:203
static int AllUnusedInputs()
Definition ParmParse.H:605
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
Solver::Nonlocal::Newton< MODEL > solver
Definition Mechanics.H:495
void TagCellsForRefinement(int lev, amrex::TagBoxArray &a_tags, Set::Scalar, int) override
Definition Mechanics.H:439
Set::Field< Model::Solid::Finite::NeoHookeanPredeformed > model_mf
Definition Mechanics.H:463
Model::Propellant::Propellant< Model::Propellant::PowerLaw, Model::Propellant::FullFeedback, Model::Propellant::Homogenize > propellant
Definition Flame.H:131
Set::Scalar volume
Definition Flame.H:119
Set::Scalar Telastic
Definition Flame.H:110
IC::IC< Set::Scalar > * ic_eta
Definition Flame.H:85
Set::Field< Set::Scalar > laser_mf
Definition Flame.H:73
Set::Field< Set::Scalar > alpha_mf
Definition Flame.H:70
struct Integrator::Flame::@3 elastic
BC::BC< Set::Scalar > * bc_temp
Definition Flame.H:75
void UpdateModel(int a_step, Set::Scalar a_time) override
Definition Flame.cpp:266
Set::Scalar lambda
Definition Flame.H:92
Set::Scalar w1
Definition Flame.H:94
Set::Field< Set::Scalar > phi_mf
Definition Flame.H:68
Set::Field< Set::Scalar > temp_old_mf
Definition Flame.H:61
Set::Scalar small
Definition Flame.H:84
IC::IC< Set::Scalar > * ic_temp
Definition Flame.H:104
int variable_pressure
Definition Flame.H:87
Set::Scalar area
Definition Flame.H:120
void Regrid(int lev, Set::Scalar time) override
Definition Flame.cpp:568
Set::Scalar pressure
Definition Flame.H:123
model_type model_ap
Definition Flame.H:111
Set::Scalar w0
Definition Flame.H:94
void TimeStepComplete(Set::Scalar a_time, int a_iter) override
Definition Flame.cpp:342
static void Forbids(IO::ParmParse &pp)
Definition Flame.cpp:32
struct Integrator::Flame::@2 thermal
Set::Field< Set::Scalar > eta_mf
Definition Flame.H:64
Set::Scalar phi_refinement_criterion
Definition Flame.H:80
void TimeStepBegin(Set::Scalar a_time, int a_iter) override
Definition Flame.cpp:332
static void Parse(Flame &value, IO::ParmParse &pp)
Definition Flame.cpp:88
void Initialize(int lev) override
Definition Flame.cpp:231
Set::Scalar massflux
Definition Flame.H:121
struct Integrator::Flame::@1 pf
Set::Scalar kappa
Definition Flame.H:93
Set::Scalar traction
Definition Flame.H:112
Set::Scalar Tref
Definition Flame.H:102
Set::Field< Set::Scalar > temps_mf
Definition Flame.H:62
void Advance(int lev, Set::Scalar time, Set::Scalar dt) override
Definition Flame.cpp:354
Set::Scalar t_refinement_restriction
Definition Flame.H:83
struct Integrator::Flame::@4 chamber
Set::Scalar t_refinement_criterion
Definition Flame.H:82
Set::Field< Set::Scalar > eta_old_mf
Definition Flame.H:65
Set::Scalar m_refinement_criterion
Definition Flame.H:81
Set::Scalar hc
Definition Flame.H:101
void Integrate(int amrlev, Set::Scalar time, int step, const amrex::MFIter &mfi, const amrex::Box &box) override
Definition Flame.cpp:577
model_type model_htpb
Definition Flame.H:111
Set::Scalar Tfluid
Definition Flame.H:103
BC::BC< Set::Scalar > * bc_eta
Definition Flame.H:76
IC::IC< Set::Scalar > * ic_laser
Definition Flame.H:78
void TagCellsForRefinement(int lev, amrex::TagBoxArray &tags, amrex::Real, int) override
Definition Flame.cpp:509
Set::Field< Set::Scalar > temp_mf
Definition Flame.H:60
Set::Scalar w12
Definition Flame.H:94
Set::Field< Set::Scalar > heatflux_mf
Definition Flame.H:71
bool plot_field
Definition Flame.H:86
Set::Field< Set::Scalar > mdot_mf
Definition Flame.H:66
IC::IC< Set::Scalar > * ic_phi
Definition Flame.H:77
Set::Scalar eps
Definition Flame.H:91
void RegisterNodalFab(Set::Field< Set::Scalar > &new_fab, int ncomp, int nghost, std::string name, bool writeout, bool evolving=true, std::vector< std::string > suffix={})
Add a new node-based scalar field.
void RegisterNewFab(Set::Field< Set::Scalar > &new_fab, BC::BC< Set::Scalar > *new_bc, int ncomp, int nghost, std::string name, bool writeout, bool evolving=true, std::vector< std::string > suffix={})
Add a new cell-based scalar field.
std::vector< amrex::Box > box
Definition Integrator.H:448
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.
AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE Set::Scalar get_cp(const Set::Scalar phi)
Definition Propellant.H:78
AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE Set::Scalar get_qdot(const Set::Scalar mdot, const Set::Scalar phi)
Definition Propellant.H:91
AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE void set_pressure(Set::Scalar P)
Definition Propellant.H:40
AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE Set::Scalar get_L(const Set::Scalar phi, const Set::Scalar T)
Definition Propellant.H:104
AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE Set::Scalar get_rho(const Set::Scalar phi)
Definition Propellant.H:65
AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE Set::Scalar get_K(const Set::Scalar phi)
Definition Propellant.H:52
amrex::Array4< Set::Scalar > Patch(const int lev, const amrex::MFIter &mfi) const &
Definition Set.H:263
amrex::Array4< T > Patch(int lev, amrex::MFIter &mfi) const &
Definition Set.H:76
void setPsi(Set::Field< Set::Scalar > &a_psi)
Definition Newton.H:46
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 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:1351
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:1313