6#include "Numeric/Stencil.H"
14#if AMREX_SPACEDIM == 2
27 BL_PROFILE(
"Integrator::Hydro::Hydro()");
35 std::string scheme_str;
37 pp.
query_validate(
"scheme",scheme_str, {
"forwardeuler",
"ssprk3",
"rk4"});
38 if (scheme_str ==
"forwardeuler") value.scheme = IntegrationScheme::ForwardEuler;
39 else if (scheme_str ==
"ssprk3") value.scheme = IntegrationScheme::SSPRK3;
40 else if (scheme_str ==
"rk4") value.scheme = IntegrationScheme::RK4;
44 pp.
query_default(
"eta_refinement_criterion", value.eta_refinement_criterion , 0.01);
46 pp.
query_default(
"omega_refinement_criterion", value.omega_refinement_criterion, 0.01);
48 pp.
query_default(
"gradu_refinement_criterion", value.gradu_refinement_criterion, 0.01);
50 pp.
query_default(
"p_refinement_criterion", value.p_refinement_criterion, 1e100);
52 pp.
query_default(
"rho_refinement_criterion", value.rho_refinement_criterion, 1e100);
68 pp_forbid(
"velocity.bc",
"--> momentum.bc");
83 pp_forbid(
"roefix",
"--> solver.roe.entropy_fix");
90 value.RegisterNewFab(value.eta_mf, value.eta_bc, 1, nghost,
"eta",
true,
true);
91 value.RegisterNewFab(value.eta_old_mf, value.eta_bc, 1, nghost,
"eta_old",
true,
true);
92 value.RegisterNewFab(value.etadot_mf, value.eta_bc, 1, nghost,
"etadot",
true,
false);
94 value.RegisterNewFab(value.density_mf, value.density_bc, 1, nghost,
"density",
true ,
true);
95 value.RegisterNewFab(value.density_old_mf, value.density_bc, 1, nghost,
"density_old",
false,
true);
97 value.RegisterNewFab(value.energy_mf, value.energy_bc, 1, nghost,
"energy",
true ,
true);
98 value.RegisterNewFab(value.energy_old_mf, value.energy_bc, 1, nghost,
"energy_old" ,
false,
true);
100 value.RegisterNewFab(value.momentum_mf, value.momentum_bc, 2, nghost,
"momentum",
true ,
true, {
"x",
"y"});
101 value.RegisterNewFab(value.momentum_old_mf, value.momentum_bc, 2, nghost,
"momentum_old",
false,
true);
103 value.RegisterNewFab(value.pressure_mf, &value.bc_nothing, 1, nghost,
"pressure",
true,
false);
104 value.RegisterNewFab(value.velocity_mf, &value.bc_nothing, 2, nghost,
"velocity",
true,
false,{
"x",
"y"});
105 value.RegisterNewFab(value.vorticity_mf, &value.bc_nothing, 1, nghost,
"vorticity",
true,
false);
107 value.RegisterNewFab(value.m0_mf, &value.bc_nothing, 1, 0,
"m0",
true,
false);
108 value.RegisterNewFab(value.u0_mf, &value.bc_nothing, 2, 0,
"u0",
true,
false, {
"x",
"y"});
109 value.RegisterNewFab(value.q_mf, &value.bc_nothing, 2, 0,
"q",
true,
false, {
"x",
"y"});
111 value.RegisterNewFab(value.solid.momentum_mf, &value.neumann_bc_D, 2, nghost,
"solid.momentum",
true,
false, {
"x",
"y"});
112 value.RegisterNewFab(value.solid.density_mf, &value.neumann_bc_1, 1, nghost,
"solid.density",
true,
false);
113 value.RegisterNewFab(value.solid.energy_mf, &value.neumann_bc_1, 1, nghost,
"solid.energy",
true,
false);
115 value.RegisterNewFab(value.Source_mf, &value.bc_nothing, 4, 0,
"Source",
true,
false);
118 pp_forbid(
"Velocity.ic.type",
"--> velocity.ic.type");
119 pp_forbid(
"Pressure.ic",
"--> pressure.ic");
120 pp_forbid(
"SolidMomentum.ic",
"--> solid.momentum.ic");
121 pp_forbid(
"SolidDensity.ic.type",
"--> solid.density.ic.type");
122 pp_forbid(
"SolidEnergy.ic.type",
"--> solid.energy.ic.type");
123 pp_forbid(
"Density.ic.type",
"--> density.ic.type");
124 pp_forbid(
"rho_injected.ic.type",
"no longer using rho_injected use m0 instead");
125 pp.
forbid(
"mdot.ic.type",
"replace mdot with u0");
180void Hydro::Initialize(
int lev)
182 BL_PROFILE(
"Integrator::Hydro::Initialize");
184 eta_ic ->Initialize(lev, eta_mf, 0.0);
185 eta_ic ->Initialize(lev, eta_old_mf, 0.0);
186 etadot_mf[lev] ->setVal(0.0);
190 velocity_ic ->Initialize(lev, velocity_mf, 0.0);
191 pressure_ic ->Initialize(lev, pressure_mf, 0.0);
192 density_ic ->Initialize(lev, density_mf, 0.0);
194 density_ic ->Initialize(lev, density_old_mf, 0.0);
197 solid.density_ic ->Initialize(lev, solid.density_mf, 0.0);
198 solid.momentum_ic->Initialize(lev, solid.momentum_mf, 0.0);
199 solid.energy_ic ->Initialize(lev, solid.energy_mf, 0.0);
201 ic_m0 ->Initialize(lev, m0_mf, 0.0);
202 ic_u0 ->Initialize(lev, u0_mf, 0.0);
203 ic_q ->Initialize(lev, q_mf, 0.0);
205 Source_mf[lev] ->setVal(0.0);
210void Hydro::Mix(
int lev)
212 for (amrex::MFIter mfi(*eta_mf[lev],
true); mfi.isValid(); ++mfi)
214 const amrex::Box& bx = mfi.growntilebox();
231 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
233 rho(i, j, k) = eta(i, j, k) * rho(i, j, k) + (1.0 - eta(i, j, k)) * rho_solid(i, j, k);
234 rho_old(i, j, k) = rho(i, j, k);
236 M(i, j, k, 0) = (rho(i, j, k)*v(i, j, k, 0))*eta(i, j, k) + M_solid(i, j, k, 0)*(1.0-eta(i, j, k));
237 M(i, j, k, 1) = (rho(i, j, k)*v(i, j, k, 1))*eta(i, j, k) + M_solid(i, j, k, 1)*(1.0-eta(i, j, k));
238 M_old(i, j, k, 0) = M(i, j, k, 0);
239 M_old(i, j, k, 1) = M(i, j, k, 1);
242 (0.5 * (v(i, j, k, 0) * v(i, j, k, 0) + v(i, j, k, 1) * v(i, j, k, 1)) * rho(i, j, k) + p(i, j, k) / (gamma - 1.0)) * eta(i, j, k)
244 E_solid(i, j, k) * (1.0 - eta(i, j, k));
245 E_old(i, j, k) = E(i, j, k);
255 eta_ic->Initialize(lev, eta_mf, time);
265 if (dynamictimestep.on)
266 Integrator::DynamicTimestep_Update();
271 amrex::ParallelDescriptor::ReduceRealMax(c_max);
272 amrex::ParallelDescriptor::ReduceRealMax(vx_max);
273 amrex::ParallelDescriptor::ReduceRealMax(vy_max);
275 Set::Scalar new_timestep = cfl / ((c_max + vx_max) / DX[0] + (c_max + vy_max) / DX[1]);
279 SetTimestep(new_timestep);
285 std::swap(eta_old_mf, eta_mf);
286 std::swap(density_old_mf[lev], density_mf[lev]);
287 std::swap(momentum_old_mf[lev], momentum_mf[lev]);
288 std::swap(energy_old_mf[lev], energy_mf[lev]);
289 Set::Scalar dt_max = std::numeric_limits<Set::Scalar>::max();
291 UpdateEta(lev, time);
293 for (amrex::MFIter mfi(*eta_mf[lev],
true); mfi.isValid(); ++mfi)
295 const amrex::Box& bx = mfi.growntilebox();
296 amrex::Array4<const Set::Scalar>
const& eta_new = (*eta_mf[lev]).array(mfi);
297 amrex::Array4<const Set::Scalar>
const& eta = (*eta_old_mf[lev]).array(mfi);
298 amrex::Array4<Set::Scalar>
const& etadot = (*etadot_mf[lev]).array(mfi);
299 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
301 etadot(i, j, k) = (eta_new(i, j, k) - eta(i, j, k)) / dt;
306 if (scheme == IntegrationScheme::ForwardEuler)
310 *density_mf[lev], *momentum_mf[lev], *energy_mf[lev],
311 *density_old_mf[lev], *momentum_old_mf[lev], *energy_old_mf[lev]);
313 for (amrex::MFIter mfi(*eta_mf[lev],
false); mfi.isValid(); ++mfi)
315 const amrex::Box& bx = mfi.validbox();
330 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
332 rho_new(i, j, k) = rho_old(i, j, k) + dt * rho_rhs(i,j,k);
333 M_new(i,j,k,0) = M_old(i,j,k,0) + dt * M_rhs(i,j,k,0);
334 M_new(i,j,k,1) = M_old(i,j,k,1) + dt * M_rhs(i,j,k,1);
335 E_new(i,j,k) = E_old(i,j,k) + dt * E_rhs(i,j,k);
341 else if (scheme == IntegrationScheme::SSPRK3)
352 c2 = 1.0 , a21 = 1.0,
353 c3 = 0.5, a31 = 0.25, a32 = 0.25,
355 b1 = 1./6, b2 = 1./6., b3 = 2./3.;
358 const amrex::BoxArray &ba = density_mf[lev]->boxArray();
359 const amrex::DistributionMapping &dm = density_mf[lev]->DistributionMap();
360 const int ng = density_mf[lev]->nGrow();
363 const amrex::MultiFab &density_old = *density_old_mf[lev];
364 const amrex::MultiFab &momentum_old = *momentum_old_mf[lev];
365 const amrex::MultiFab &energy_old = *energy_old_mf[lev];
369 amrex::MultiFab density_k1(ba,dm,1,0), momentum_k1(ba,dm,2,0), energy_k1(ba,dm,1,0);
370 amrex::MultiFab density_k2(ba,dm,1,0), momentum_k2(ba,dm,2,0), energy_k2(ba,dm,1,0);
371 amrex::MultiFab density_k3(ba,dm,1,0), momentum_k3(ba,dm,2,0), energy_k3(ba,dm,1,0);
374 amrex::MultiFab density_temp(ba,dm,1,ng), momentum_temp(ba,dm,2,ng), energy_temp(ba,dm,1,ng);
377 amrex::MultiFab &density_new = *density_mf[lev];
378 amrex::MultiFab &momentum_new = *momentum_mf[lev];
379 amrex::MultiFab &energy_new = *energy_mf[lev];
388 density_k1,momentum_k1,energy_k1,
389 *density_old_mf[lev], *momentum_old_mf[lev], *energy_old_mf[lev]);
396 amrex::MultiFab::LinComb(density_temp, 1.0, density_old, 0, dt*a21, density_k1, 0, 0, 1, 0);
397 amrex::MultiFab::LinComb(momentum_temp, 1.0, momentum_old, 0, dt*a21, momentum_k1, 0, 0, 2, 0);
398 amrex::MultiFab::LinComb(energy_temp, 1.0, energy_old, 0, dt*a21, energy_k1, 0, 0, 1, 0);
400 density_bc ->FillBoundary(density_temp, 0, 1, time, 0); density_temp.FillBoundary(
true);
401 momentum_bc->FillBoundary(momentum_temp, 0, 2, time, 0); momentum_temp.FillBoundary(
true);
402 energy_bc ->FillBoundary(energy_temp, 0, 1, time, 0); energy_temp.FillBoundary(
true);
404 RHS(lev,time + c2*dt,
405 density_k2, momentum_k2, energy_k2,
406 density_temp, momentum_temp, energy_temp);
414 amrex::MultiFab::LinComb(density_temp, 1.0, density_old, 0, dt*a31, density_k1, 0, 0, 1, 0);
415 amrex::MultiFab::LinComb(momentum_temp, 1.0, momentum_old, 0, dt*a31, momentum_k1, 0, 0, 2, 0);
416 amrex::MultiFab::LinComb(energy_temp, 1.0, energy_old, 0, dt*a31, energy_k1, 0, 0, 1, 0);
418 amrex::MultiFab::Saxpy(density_temp, dt*a32, density_k2, 0, 0, 1, 0);
419 amrex::MultiFab::Saxpy(momentum_temp, dt*a32, momentum_k2, 0, 0, 2, 0);
420 amrex::MultiFab::Saxpy(energy_temp, dt*a32, energy_k2, 0, 0, 1, 0);
422 density_bc ->FillBoundary(density_temp, 0, 1, time+c2*dt, 0); density_temp.FillBoundary(
true);
423 momentum_bc->FillBoundary(momentum_temp, 0, 2, time+c2*dt, 0); momentum_temp.FillBoundary(
true);
424 energy_bc ->FillBoundary(energy_temp, 0, 1, time+c2*dt, 0); energy_temp.FillBoundary(
true);
426 RHS(lev,time + c3*dt,
427 density_k3, momentum_k3, energy_k3,
428 density_temp, momentum_temp, energy_temp);
436 amrex::MultiFab::LinComb(density_new, 1.0, density_old, 0, dt*b1, density_k1, 0, 0, 1, 0);
437 amrex::MultiFab::LinComb(momentum_new, 1.0, momentum_old, 0, dt*b1, momentum_k1, 0, 0, 2, 0);
438 amrex::MultiFab::LinComb(energy_new, 1.0, energy_old, 0, dt*b1, energy_k1, 0, 0, 1, 0);
440 amrex::MultiFab::Saxpy(density_new, dt*b2, density_k2, 0, 0, 1, 0);
441 amrex::MultiFab::Saxpy(momentum_new, dt*b2, momentum_k2, 0, 0, 2, 0);
442 amrex::MultiFab::Saxpy(energy_new, dt*b2, energy_k2, 0, 0, 1, 0);
444 amrex::MultiFab::Saxpy(density_new, dt*b3, density_k3, 0, 0, 1, 0);
445 amrex::MultiFab::Saxpy(momentum_new, dt*b3, momentum_k3, 0, 0, 2, 0);
446 amrex::MultiFab::Saxpy(energy_new, dt*b3, energy_k3, 0, 0, 1, 0);
452 else if (scheme == IntegrationScheme::RK4)
458 const amrex::BoxArray &ba = density_mf[lev]->boxArray();
459 const amrex::DistributionMapping &dm = density_mf[lev]->DistributionMap();
460 const int ng = density_mf[lev]->nGrow();
463 const amrex::MultiFab &density_old = *density_old_mf[lev];
464 const amrex::MultiFab &momentum_old = *momentum_old_mf[lev];
465 const amrex::MultiFab &energy_old = *energy_old_mf[lev];
468 amrex::MultiFab density_k1(ba,dm,1,0), momentum_k1(ba,dm,2,0), energy_k1(ba,dm,1,0);
469 amrex::MultiFab density_k2(ba,dm,1,0), momentum_k2(ba,dm,2,0), energy_k2(ba,dm,1,0);
470 amrex::MultiFab density_k3(ba,dm,1,0), momentum_k3(ba,dm,2,0), energy_k3(ba,dm,1,0);
471 amrex::MultiFab density_k4(ba,dm,1,0), momentum_k4(ba,dm,2,0), energy_k4(ba,dm,1,0);
474 amrex::MultiFab density_st(ba,dm,1,ng), momentum_st(ba,dm,2,ng), energy_st(ba,dm,1,ng);
477 amrex::MultiFab &density_new = *density_mf[lev];
478 amrex::MultiFab &momentum_new = *momentum_mf[lev];
479 amrex::MultiFab &energy_new = *energy_mf[lev];
487 density_k1,momentum_k1,energy_k1,
488 density_old, momentum_old, energy_old);
495 amrex::MultiFab::LinComb(density_st, 1.0, density_old, 0, dt/2.0, density_k1, 0, 0, 1, 0);
496 amrex::MultiFab::LinComb(momentum_st, 1.0, momentum_old, 0, dt/2.0, momentum_k1, 0, 0, 2, 0);
497 amrex::MultiFab::LinComb(energy_st, 1.0, energy_old, 0, dt/2.0, energy_k1, 0, 0, 1, 0);
499 density_bc->FillBoundary(density_st, 0, 1, time, 0); density_st.FillBoundary(
true);
500 momentum_bc->FillBoundary(momentum_st, 0, 2, time, 0); momentum_st.FillBoundary(
true);
501 energy_bc->FillBoundary(energy_st,0,1,time,0); energy_st.FillBoundary(
true);
505 density_k2, momentum_k2, energy_k2,
506 density_st, momentum_st, energy_st);
513 amrex::MultiFab::LinComb(density_st, 1.0, density_old, 0, dt/2.0, density_k2, 0, 0, 1, 0);
514 amrex::MultiFab::LinComb(momentum_st, 1.0, momentum_old, 0, dt/2.0, momentum_k2, 0, 0, 2, 0);
515 amrex::MultiFab::LinComb(energy_st, 1.0, energy_old, 0, dt/2.0, energy_k2, 0, 0, 1, 0);
517 density_bc->FillBoundary(density_st, 0, 1, time, 0); density_st.FillBoundary(
true);
518 momentum_bc->FillBoundary(momentum_st, 0, 2, time, 0); momentum_st.FillBoundary(
true);
519 energy_bc->FillBoundary(energy_st,0,1,time,0); energy_st.FillBoundary(
true);
522 density_k3, momentum_k3, energy_k3,
523 density_st, momentum_st, energy_st);
530 amrex::MultiFab::LinComb(density_st, 1.0, density_old, 0, dt, density_k3, 0, 0, 1, 0);
531 amrex::MultiFab::LinComb(momentum_st, 1.0, momentum_old, 0, dt, momentum_k3, 0, 0, 2, 0);
532 amrex::MultiFab::LinComb(energy_st, 1.0, energy_old, 0, dt, energy_k3, 0, 0, 1, 0);
534 density_bc-> FillBoundary(density_st, 0, 1, time, 0); density_st.FillBoundary(
true);
535 momentum_bc->FillBoundary(momentum_st, 0, 2, time, 0); momentum_st.FillBoundary(
true);
536 energy_bc-> FillBoundary(energy_st, 0, 1, time, 0); energy_st.FillBoundary(
true);
540 density_k4, momentum_k4, energy_k4,
541 density_st, momentum_st, energy_st);
545 amrex::MultiFab::LinComb(density_new, 1.0, density_old, 0, (dt/6.0), density_k1, 0, 0, 1, 0);
546 amrex::MultiFab::LinComb(momentum_new, 1.0, momentum_old, 0, (dt/6.0), momentum_k1, 0, 0, 2, 0);
547 amrex::MultiFab::LinComb(energy_new, 1.0, energy_old, 0, (dt/6.0), energy_k1, 0, 0, 1, 0);
550 amrex::MultiFab::Saxpy(density_new, (dt/3.0), density_k2, 0, 0, 1, 0);
551 amrex::MultiFab::Saxpy(momentum_new, (dt/3.0), momentum_k2, 0, 0, 2, 0);
552 amrex::MultiFab::Saxpy(energy_new, (dt/3.0), energy_k2, 0, 0, 1, 0);
555 amrex::MultiFab::Saxpy(density_new, (dt/3.0), density_k3, 0, 0, 1, 0);
556 amrex::MultiFab::Saxpy(momentum_new, (dt/3.0), momentum_k3, 0, 0, 2, 0);
557 amrex::MultiFab::Saxpy(energy_new, (dt/3.0), energy_k3, 0, 0, 1, 0);
560 amrex::MultiFab::Saxpy(density_new, (dt/6.0), density_k4, 0, 0, 1, 0);
561 amrex::MultiFab::Saxpy(momentum_new, (dt/6.0), momentum_k4, 0, 0, 2, 0);
562 amrex::MultiFab::Saxpy(energy_new, (dt/6.0), energy_k4, 0, 0, 1, 0);
567 for (amrex::MFIter mfi(*eta_mf[lev],
false); mfi.isValid(); ++mfi)
569 const amrex::Box& bx = mfi.validbox();
588 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
590 if (eta(i,j,k) < cutoff)
592 rho_new(i,j,k,0) = rho_solid(i,j,k,0);
593 M_new(i,j,k,0) = M_solid(i,j,k,0);
594 M_new(i,j,k,1) = M_solid(i,j,k,1);
595 E_new(i,j,k,0) = E_solid(i,j,k,0);
599 omega(i, j, k) = eta(i, j, k) * (
gradu(1,0) -
gradu(0,1));
601 if (dynamictimestep.on)
603 *dt_max_handle = std::fabs(cfl * DX[0] / (u(i,j,k,0)*eta(i,j,k) + small));
604 *dt_max_handle = std::min(*dt_max_handle, std::fabs(cfl * DX[1] / (u(i,j,k,1)*eta(i,j,k) + small)));
605 *dt_max_handle = std::min(*dt_max_handle, std::fabs(cfl_v * DX[0]*DX[0] / (Source(i,j,k,1)+small)));
606 *dt_max_handle = std::min(*dt_max_handle, std::fabs(cfl_v * DX[1]*DX[1] / (Source(i,j,k,2)+small)));
612 if (dynamictimestep.on)
614 this->DynamicTimestep_SyncTimeStep(lev,dt_max);
621 amrex::MultiFab &rho_rhs_mf,
622 amrex::MultiFab &M_rhs_mf,
623 amrex::MultiFab &E_rhs_mf,
624 const amrex::MultiFab &rho_mf,
625 const amrex::MultiFab &M_mf,
626 const amrex::MultiFab &E_mf)
629 for (amrex::MFIter mfi(*eta_mf[lev],
true); mfi.isValid(); ++mfi)
631 const amrex::Box& bx = mfi.growntilebox();
632 amrex::Array4<const Set::Scalar>
const& eta = (*eta_old_mf[lev]).array(mfi);
645 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
648 Set::Scalar etarho_fluid = rho(i,j,k) - (1.-eta(i,j,k)) * rho_solid(i,j,k);
649 Set::Scalar etaE_fluid = E(i,j,k) - (1.-eta(i,j,k)) * E_solid(i,j,k);
651 Set::Vector etaM_fluid( M(i,j,k,0) - (1.-eta(i,j,k)) * M_solid(i,j,k,0),
652 M(i,j,k,1) - (1.-eta(i,j,k)) * M_solid(i,j,k,1) );
656 v(i,j,k,0) = etaM_fluid(0) / (etarho_fluid + small);
657 v(i,j,k,1) = etaM_fluid(1) / (etarho_fluid + small);
658 p(i,j,k) = (etaE_fluid / (eta(i, j, k) + small) - 0.5 * (etaM_fluid(0)*etaM_fluid(0) + etaM_fluid(1)*etaM_fluid(1)) / (etarho_fluid + small)) * ((gamma - 1.0) / (eta(i, j, k) + small))-pref;
663 amrex::Box domain = geom[lev].Domain();
665 for (amrex::MFIter mfi(*eta_mf[lev],
false); mfi.isValid(); ++mfi)
667 const amrex::Box& bx = mfi.validbox();
698 amrex::Array4<Set::Scalar>
const& Source = (*Source_mf[lev]).array(mfi);
700 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
727 for (
int p = 0; p < 2; p++)
728 for (
int q = 0; q < 2; q++)
729 for (
int r = 0; r < 2; r++)
732 (hess_M(r,p,q) -
gradu(r,q)*gradrho(p) -
gradu(r,p)*gradrho(q) - u(r)*hess_rho(p,q))
738 for (
int p = 0; p<2; p++)
739 for (
int q = 0; q<2; q++)
740 for (
int r = 0; r<2; r++)
741 for (
int s = 0; s<2; s++)
744 if (p==r && q==s) Mpqrs += 0.5 * mu;
746 Ldot0(p) += 0.5*Mpqrs * (u(r) - u0(r)) * hess_eta(q, s);
747 div_tau(p) += 2.0*Mpqrs * hess_u(r,s,q);
750 Source(i,j, k, 0) = mdot0;
751 Source(i,j, k, 1) = Pdot0(0) - Ldot0(0);
752 Source(i,j, k, 2) = Pdot0(1) - Ldot0(1);
753 Source(i,j, k, 3) = qdot0;
756 Source(i,j,k,1) -= lagrange*(u-u0).dot(grad_eta)*grad_eta(0);
757 Source(i,j,k,2) -= lagrange*(u-u0).dot(grad_eta)*grad_eta(1);
761 const int X = 0, Y = 1;
792 flux_xlo = riemannsolver->Solve(state_xlo_fluid, state_x_fluid, gamma, pref, small) * eta(i,j,k);
793 flux_ylo = riemannsolver->Solve(state_ylo_fluid, state_y_fluid, gamma, pref, small) * eta(i,j,k);
796 flux_xhi = riemannsolver->Solve(state_x_fluid, state_xhi_fluid, gamma, pref, small) * eta(i,j,k);
797 flux_yhi = riemannsolver->Solve(state_y_fluid, state_yhi_fluid, gamma, pref, small) * eta(i,j,k);
808 (flux_xlo.
mass - flux_xhi.
mass) / DX[0] +
809 (flux_ylo.
mass - flux_yhi.
mass) / DX[1] +
817 etadot(i,j,k) * (rho(i,j,k) - rho_solid(i,j,k)) / (eta(i,j,k) + small)
826 div_tau(0) * eta(i,j,k) +
834 etadot(i,j,k)*(M(i,j,k,0) - M_solid(i,j,k,0)) / (eta(i,j,k) + small)
841 div_tau(1) * eta(i,j,k) +
849 etadot(i,j,k)*(M(i,j,k,1) - M_solid(i,j,k,1)) / (eta(i,j,k)+small)
863 etadot(i,j,k)*(E(i,j,k) - E_solid(i,j,k)) / (eta(i,j,k)+small)
868 if ((rho_rhs(i,j,k) != rho_rhs(i,j,k)) ||
869 (M_rhs(i,j,k,0) != M_rhs(i,j,k,0)) ||
870 (M_rhs(i,j,k,1) != M_rhs(i,j,k,1)) ||
871 (E_rhs(i,j,k) != E_rhs(i,j,k)))
930 omega(i, j, k) = eta(i, j, k) * (
gradu(1,0) -
gradu(0,1));
937 BL_PROFILE(
"Integrator::Hydro::Regrid");
938 Source_mf[lev]->setVal(0.0);
939 if (lev < finest_level)
return;
945void Hydro::TagCellsForRefinement(
int lev, amrex::TagBoxArray& a_tags,
Set::Scalar,
int)
947 BL_PROFILE(
"Integrator::Flame::TagCellsForRefinement");
950 Set::Scalar dr = sqrt(AMREX_D_TERM(DX[0] * DX[0], +DX[1] * DX[1], +DX[2] * DX[2]));
953 for (amrex::MFIter mfi(*eta_mf[lev],
true); mfi.isValid(); ++mfi) {
954 const amrex::Box& bx = mfi.tilebox();
955 amrex::Array4<char>
const& tags = a_tags.array(mfi);
956 amrex::Array4<const Set::Scalar>
const& eta = (*eta_mf[lev]).array(mfi);
958 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
960 if (grad_eta.lpNorm<2>() * dr * 2 > eta_refinement_criterion) tags(i, j, k) = amrex::TagBox::SET;
965 for (amrex::MFIter mfi(*vorticity_mf[lev],
true); mfi.isValid(); ++mfi) {
966 const amrex::Box& bx = mfi.tilebox();
967 amrex::Array4<char>
const& tags = a_tags.array(mfi);
968 amrex::Array4<const Set::Scalar>
const& omega = (*vorticity_mf[lev]).array(mfi);
970 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
973 if (grad_omega.lpNorm<2>() * dr * 2 > omega_refinement_criterion) tags(i, j, k) = amrex::TagBox::SET;
978 for (amrex::MFIter mfi(*velocity_mf[lev],
true); mfi.isValid(); ++mfi) {
979 const amrex::Box& bx = mfi.tilebox();
980 amrex::Array4<char>
const& tags = a_tags.array(mfi);
981 amrex::Array4<const Set::Scalar>
const& v = (*velocity_mf[lev]).array(mfi);
983 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
986 if (grad_u.lpNorm<2>() * dr * 2 > gradu_refinement_criterion) tags(i, j, k) = amrex::TagBox::SET;
991 for (amrex::MFIter mfi(*pressure_mf[lev],
true); mfi.isValid(); ++mfi) {
992 const amrex::Box& bx = mfi.tilebox();
993 amrex::Array4<char>
const& tags = a_tags.array(mfi);
994 amrex::Array4<const Set::Scalar>
const& p = (*pressure_mf[lev]).array(mfi);
996 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
999 if (grad_p.lpNorm<2>() * dr * 2 > p_refinement_criterion) tags(i, j, k) = amrex::TagBox::SET;
1004 for (amrex::MFIter mfi(*density_mf[lev],
true); mfi.isValid(); ++mfi) {
1005 const amrex::Box& bx = mfi.tilebox();
1006 amrex::Array4<char>
const& tags = a_tags.array(mfi);
1007 amrex::Array4<const Set::Scalar>
const& rho = (*density_mf[lev]).array(mfi);
1009 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
1012 if (grad_rho.lpNorm<2>() * dr * 2 > rho_refinement_criterion) tags(i, j, k) = amrex::TagBox::SET;
#define pp_query_required(...)
#define pp_query_default(...)
Initialize Laminates in a matrix.
void forbid(std::string name, std::string explanation, std::string file="", std::string func="", int line=-1)
int AnyUnusedInputs(bool inscopeonly=true, bool verbose=false)
void queryclass(std::string name, T *value, std::string file="", std::string func="", int line=-1)
void select_default(std::string name, PTRTYPE *&ic_eta, Args &&... args)
int query_default(std::string name, T &value, T defaultvalue, std::string="", std::string="", int=-1)
static int AllUnusedInputs()
int query_validate(std::string name, int &value, std::vector< int > possibleintvals, std::string file="", std::string func="", int line=-1)
Roe Riemann Solver based on Gas Dynamics - Culbert B. Laney.
Collection of numerical integrator objects.
static AMREX_FORCE_INLINE std::array< StencilType, AMREX_SPACEDIM > GetStencil(const int i, const int j, const int k, const amrex::Box domain)
AMREX_FORCE_INLINE Set::Matrix Hessian(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)
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)
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, 1 > Vector
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, AMREX_SPACEDIM > Matrix
void ParallelMessage(std::string file, std::string func, int line, Args const &... args)
void Abort(const char *msg)
AMREX_FORCE_INLINE void Assert(std::string file, std::string func, int line, std::string smt, bool pass, Args const &... args)
void Warning(std::string file, std::string func, int line, Args const &... args)
void Message(std::string file, std::string func, int line, Args const &... args)
void Exception(std::string file, std::string func, int line, Args const &... args)
Set::Scalar momentum_normal
Set::Scalar momentum_tangent