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