6#include "Numeric/Stencil.H"
15#if AMREX_SPACEDIM == 2
28 BL_PROFILE(
"Integrator::Hydro::Hydro()");
36 std::string scheme_str;
38 pp.
query_validate(
"scheme",scheme_str, {
"forwardeuler",
"ssprk3",
"rk4"});
39 if (scheme_str ==
"forwardeuler") value.scheme = IntegrationScheme::ForwardEuler;
40 else if (scheme_str ==
"ssprk3") value.scheme = IntegrationScheme::SSPRK3;
41 else if (scheme_str ==
"rk4") value.scheme = IntegrationScheme::RK4;
45 pp.
query_default(
"eta_refinement_criterion", value.eta_refinement_criterion , 0.01);
47 pp.
query_default(
"omega_refinement_criterion", value.omega_refinement_criterion, 0.01);
49 pp.
query_default(
"gradu_refinement_criterion", value.gradu_refinement_criterion, 0.01);
51 pp.
query_default(
"p_refinement_criterion", value.p_refinement_criterion, 1e100);
53 pp.
query_default(
"rho_refinement_criterion", value.rho_refinement_criterion, 1e100);
69 pp_forbid(
"velocity.bc",
"--> momentum.bc");
84 pp_forbid(
"roefix",
"--> solver.roe.entropy_fix");
91 value.RegisterNewFab(value.eta_mf, value.eta_bc, 1, nghost,
"eta",
true,
true);
92 value.RegisterNewFab(value.eta_old_mf, value.eta_bc, 1, nghost,
"eta_old",
true,
true);
93 value.RegisterNewFab(value.etadot_mf, value.eta_bc, 1, nghost,
"etadot",
true,
false);
95 value.RegisterNewFab(value.density_mf, value.density_bc, 1, nghost,
"density",
true ,
true);
96 value.RegisterNewFab(value.density_old_mf, value.density_bc, 1, nghost,
"density_old",
false,
true);
98 value.RegisterNewFab(value.energy_mf, value.energy_bc, 1, nghost,
"energy",
true ,
true);
99 value.RegisterNewFab(value.energy_old_mf, value.energy_bc, 1, nghost,
"energy_old" ,
false,
true);
101 value.RegisterNewFab(value.momentum_mf, value.momentum_bc, 2, nghost,
"momentum",
true ,
true, {
"x",
"y"});
102 value.RegisterNewFab(value.momentum_old_mf, value.momentum_bc, 2, nghost,
"momentum_old",
false,
true);
104 value.RegisterNewFab(value.pressure_mf, &value.bc_nothing, 1, nghost,
"pressure",
true,
false);
105 value.RegisterNewFab(value.velocity_mf, &value.bc_nothing, 2, nghost,
"velocity",
true,
false,{
"x",
"y"});
106 value.RegisterNewFab(value.vorticity_mf, &value.bc_nothing, 1, nghost,
"vorticity",
true,
false);
108 value.RegisterNewFab(value.m0_mf, &value.bc_nothing, 1, 0,
"m0",
true,
false);
109 value.RegisterNewFab(value.u0_mf, &value.bc_nothing, 2, 0,
"u0",
true,
false, {
"x",
"y"});
110 value.RegisterNewFab(value.q_mf, &value.bc_nothing, 2, 0,
"q",
true,
false, {
"x",
"y"});
112 value.RegisterNewFab(value.solid.momentum_mf, &value.neumann_bc_D, 2, nghost,
"solid.momentum",
true,
false, {
"x",
"y"});
113 value.RegisterNewFab(value.solid.density_mf, &value.neumann_bc_1, 1, nghost,
"solid.density",
true,
false);
114 value.RegisterNewFab(value.solid.energy_mf, &value.neumann_bc_1, 1, nghost,
"solid.energy",
true,
false);
116 value.RegisterNewFab(value.Source_mf, &value.bc_nothing, 4, 0,
"Source",
true,
false);
119 pp_forbid(
"Velocity.ic.type",
"--> velocity.ic.type");
120 pp_forbid(
"Pressure.ic",
"--> pressure.ic");
121 pp_forbid(
"SolidMomentum.ic",
"--> solid.momentum.ic");
122 pp_forbid(
"SolidDensity.ic.type",
"--> solid.density.ic.type");
123 pp_forbid(
"SolidEnergy.ic.type",
"--> solid.energy.ic.type");
124 pp_forbid(
"Density.ic.type",
"--> density.ic.type");
125 pp_forbid(
"rho_injected.ic.type",
"no longer using rho_injected use m0 instead");
126 pp.
forbid(
"mdot.ic.type",
"replace mdot with u0");
183void Hydro::Initialize(
int lev)
185 BL_PROFILE(
"Integrator::Hydro::Initialize");
187 eta_ic ->Initialize(lev, eta_mf, 0.0);
188 eta_ic ->Initialize(lev, eta_old_mf, 0.0);
189 etadot_mf[lev] ->setVal(0.0);
193 velocity_ic ->Initialize(lev, velocity_mf, 0.0);
194 pressure_ic ->Initialize(lev, pressure_mf, 0.0);
195 density_ic ->Initialize(lev, density_mf, 0.0);
197 density_ic ->Initialize(lev, density_old_mf, 0.0);
200 solid.density_ic ->Initialize(lev, solid.density_mf, 0.0);
201 solid.momentum_ic->Initialize(lev, solid.momentum_mf, 0.0);
202 solid.energy_ic ->Initialize(lev, solid.energy_mf, 0.0);
204 ic_m0 ->Initialize(lev, m0_mf, 0.0);
205 ic_u0 ->Initialize(lev, u0_mf, 0.0);
206 ic_q ->Initialize(lev, q_mf, 0.0);
208 Source_mf[lev] ->setVal(0.0);
213void Hydro::Mix(
int lev)
215 for (amrex::MFIter mfi(*eta_mf[lev],
true); mfi.isValid(); ++mfi)
217 const amrex::Box& bx = mfi.growntilebox();
234 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
236 rho(i, j, k) = eta(i, j, k) * rho(i, j, k) + (1.0 - eta(i, j, k)) * rho_solid(i, j, k);
237 rho_old(i, j, k) = rho(i, j, k);
239 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));
240 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));
241 M_old(i, j, k, 0) = M(i, j, k, 0);
242 M_old(i, j, k, 1) = M(i, j, k, 1);
245 (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)
247 E_solid(i, j, k) * (1.0 - eta(i, j, k));
248 E_old(i, j, k) = E(i, j, k);
258 eta_ic->Initialize(lev, eta_mf, time);
268 if (dynamictimestep.on)
269 Integrator::DynamicTimestep_Update();
274 amrex::ParallelDescriptor::ReduceRealMax(c_max);
275 amrex::ParallelDescriptor::ReduceRealMax(vx_max);
276 amrex::ParallelDescriptor::ReduceRealMax(vy_max);
278 Set::Scalar new_timestep = cfl / ((c_max + vx_max) / DX[0] + (c_max + vy_max) / DX[1]);
282 SetTimestep(new_timestep);
288 std::swap(eta_old_mf, eta_mf);
289 std::swap(density_old_mf[lev], density_mf[lev]);
290 std::swap(momentum_old_mf[lev], momentum_mf[lev]);
291 std::swap(energy_old_mf[lev], energy_mf[lev]);
292 Set::Scalar dt_max = std::numeric_limits<Set::Scalar>::max();
294 UpdateEta(lev, time);
296 for (amrex::MFIter mfi(*eta_mf[lev],
true); mfi.isValid(); ++mfi)
298 const amrex::Box& bx = mfi.growntilebox();
299 amrex::Array4<const Set::Scalar>
const& eta_new = (*eta_mf[lev]).array(mfi);
300 amrex::Array4<const Set::Scalar>
const& eta = (*eta_old_mf[lev]).array(mfi);
301 amrex::Array4<Set::Scalar>
const& etadot = (*etadot_mf[lev]).array(mfi);
302 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
304 etadot(i, j, k) = (eta_new(i, j, k) - eta(i, j, k)) / dt;
309 if (scheme == IntegrationScheme::ForwardEuler)
313 *density_mf[lev], *momentum_mf[lev], *energy_mf[lev],
314 *density_old_mf[lev], *momentum_old_mf[lev], *energy_old_mf[lev]);
316 for (amrex::MFIter mfi(*eta_mf[lev],
false); mfi.isValid(); ++mfi)
318 const amrex::Box& bx = mfi.validbox();
333 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
335 rho_new(i, j, k) = rho_old(i, j, k) + dt * rho_rhs(i,j,k);
336 M_new(i,j,k,0) = M_old(i,j,k,0) + dt * M_rhs(i,j,k,0);
337 M_new(i,j,k,1) = M_old(i,j,k,1) + dt * M_rhs(i,j,k,1);
338 E_new(i,j,k) = E_old(i,j,k) + dt * E_rhs(i,j,k);
344 else if (scheme == IntegrationScheme::SSPRK3)
355 c2 = 1.0 , a21 = 1.0,
356 c3 = 0.5, a31 = 0.25, a32 = 0.25,
358 b1 = 1./6, b2 = 1./6., b3 = 2./3.;
361 const amrex::BoxArray &ba = density_mf[lev]->boxArray();
362 const amrex::DistributionMapping &dm = density_mf[lev]->DistributionMap();
363 const int ng = density_mf[lev]->nGrow();
366 const amrex::MultiFab &density_old = *density_old_mf[lev];
367 const amrex::MultiFab &momentum_old = *momentum_old_mf[lev];
368 const amrex::MultiFab &energy_old = *energy_old_mf[lev];
372 amrex::MultiFab density_k1(ba,dm,1,0), momentum_k1(ba,dm,2,0), energy_k1(ba,dm,1,0);
373 amrex::MultiFab density_k2(ba,dm,1,0), momentum_k2(ba,dm,2,0), energy_k2(ba,dm,1,0);
374 amrex::MultiFab density_k3(ba,dm,1,0), momentum_k3(ba,dm,2,0), energy_k3(ba,dm,1,0);
377 amrex::MultiFab density_temp(ba,dm,1,ng), momentum_temp(ba,dm,2,ng), energy_temp(ba,dm,1,ng);
380 density_temp.ParallelCopyToGhost(*density_old_mf[lev],0,0,1,amrex::IntVect(1),amrex::IntVect(1));
381 momentum_temp.ParallelCopyToGhost(*momentum_old_mf[lev],0,0,2,amrex::IntVect(1),amrex::IntVect(1));
382 energy_temp.ParallelCopyToGhost(*energy_old_mf[lev],0,0,1,amrex::IntVect(1),amrex::IntVect(1));
385 amrex::MultiFab &density_new = *density_mf[lev];
386 amrex::MultiFab &momentum_new = *momentum_mf[lev];
387 amrex::MultiFab &energy_new = *energy_mf[lev];
396 density_k1,momentum_k1,energy_k1,
397 *density_old_mf[lev], *momentum_old_mf[lev], *energy_old_mf[lev]);
404 amrex::MultiFab::LinComb(density_temp, 1.0, density_old, 0, dt*a21, density_k1, 0, 0, 1, 0);
405 amrex::MultiFab::LinComb(momentum_temp, 1.0, momentum_old, 0, dt*a21, momentum_k1, 0, 0, 2, 0);
406 amrex::MultiFab::LinComb(energy_temp, 1.0, energy_old, 0, dt*a21, energy_k1, 0, 0, 1, 0);
408 density_bc ->FillBoundary(density_temp, 0, 1, time, 0); density_temp.FillBoundary(
true);
409 momentum_bc->FillBoundary(momentum_temp, 0, 2, time, 0); momentum_temp.FillBoundary(
true);
410 energy_bc ->FillBoundary(energy_temp, 0, 1, time, 0); energy_temp.FillBoundary(
true);
412 RHS(lev,time + c2*dt,
413 density_k2, momentum_k2, energy_k2,
414 density_temp, momentum_temp, energy_temp);
422 amrex::MultiFab::LinComb(density_temp, 1.0, density_old, 0, dt*a31, density_k1, 0, 0, 1, 0);
423 amrex::MultiFab::LinComb(momentum_temp, 1.0, momentum_old, 0, dt*a31, momentum_k1, 0, 0, 2, 0);
424 amrex::MultiFab::LinComb(energy_temp, 1.0, energy_old, 0, dt*a31, energy_k1, 0, 0, 1, 0);
426 amrex::MultiFab::Saxpy(density_temp, dt*a32, density_k2, 0, 0, 1, 0);
427 amrex::MultiFab::Saxpy(momentum_temp, dt*a32, momentum_k2, 0, 0, 2, 0);
428 amrex::MultiFab::Saxpy(energy_temp, dt*a32, energy_k2, 0, 0, 1, 0);
430 density_bc ->FillBoundary(density_temp, 0, 1, time+c2*dt, 0); density_temp.FillBoundary(
true);
431 momentum_bc->FillBoundary(momentum_temp, 0, 2, time+c2*dt, 0); momentum_temp.FillBoundary(
true);
432 energy_bc ->FillBoundary(energy_temp, 0, 1, time+c2*dt, 0); energy_temp.FillBoundary(
true);
434 RHS(lev,time + c3*dt,
435 density_k3, momentum_k3, energy_k3,
436 density_temp, momentum_temp, energy_temp);
444 amrex::MultiFab::LinComb(density_new, 1.0, density_old, 0, dt*b1, density_k1, 0, 0, 1, 0);
445 amrex::MultiFab::LinComb(momentum_new, 1.0, momentum_old, 0, dt*b1, momentum_k1, 0, 0, 2, 0);
446 amrex::MultiFab::LinComb(energy_new, 1.0, energy_old, 0, dt*b1, energy_k1, 0, 0, 1, 0);
448 amrex::MultiFab::Saxpy(density_new, dt*b2, density_k2, 0, 0, 1, 0);
449 amrex::MultiFab::Saxpy(momentum_new, dt*b2, momentum_k2, 0, 0, 2, 0);
450 amrex::MultiFab::Saxpy(energy_new, dt*b2, energy_k2, 0, 0, 1, 0);
452 amrex::MultiFab::Saxpy(density_new, dt*b3, density_k3, 0, 0, 1, 0);
453 amrex::MultiFab::Saxpy(momentum_new, dt*b3, momentum_k3, 0, 0, 2, 0);
454 amrex::MultiFab::Saxpy(energy_new, dt*b3, energy_k3, 0, 0, 1, 0);
460 else if (scheme == IntegrationScheme::RK4)
466 const amrex::BoxArray &ba = density_mf[lev]->boxArray();
467 const amrex::DistributionMapping &dm = density_mf[lev]->DistributionMap();
468 const int ng = density_mf[lev]->nGrow();
471 const amrex::MultiFab &density_old = *density_old_mf[lev];
472 const amrex::MultiFab &momentum_old = *momentum_old_mf[lev];
473 const amrex::MultiFab &energy_old = *energy_old_mf[lev];
476 amrex::MultiFab density_k1(ba,dm,1,0), momentum_k1(ba,dm,2,0), energy_k1(ba,dm,1,0);
477 amrex::MultiFab density_k2(ba,dm,1,0), momentum_k2(ba,dm,2,0), energy_k2(ba,dm,1,0);
478 amrex::MultiFab density_k3(ba,dm,1,0), momentum_k3(ba,dm,2,0), energy_k3(ba,dm,1,0);
479 amrex::MultiFab density_k4(ba,dm,1,0), momentum_k4(ba,dm,2,0), energy_k4(ba,dm,1,0);
482 amrex::MultiFab density_st(ba,dm,1,ng), momentum_st(ba,dm,2,ng), energy_st(ba,dm,1,ng);
485 density_st.ParallelCopyToGhost(*density_old_mf[lev],0,0,1,amrex::IntVect(1),amrex::IntVect(1));
486 momentum_st.ParallelCopyToGhost(*momentum_old_mf[lev],0,0,2,amrex::IntVect(1),amrex::IntVect(1));
487 energy_st.ParallelCopyToGhost(*energy_old_mf[lev],0,0,1,amrex::IntVect(1),amrex::IntVect(1));
491 amrex::MultiFab &density_new = *density_mf[lev];
492 amrex::MultiFab &momentum_new = *momentum_mf[lev];
493 amrex::MultiFab &energy_new = *energy_mf[lev];
501 density_k1,momentum_k1,energy_k1,
502 density_old, momentum_old, energy_old);
509 amrex::MultiFab::LinComb(density_st, 1.0, density_old, 0, dt/2.0, density_k1, 0, 0, 1, 0);
510 amrex::MultiFab::LinComb(momentum_st, 1.0, momentum_old, 0, dt/2.0, momentum_k1, 0, 0, 2, 0);
511 amrex::MultiFab::LinComb(energy_st, 1.0, energy_old, 0, dt/2.0, energy_k1, 0, 0, 1, 0);
513 density_bc->FillBoundary(density_st, 0, 1, time, 0); density_st.FillBoundary(
true);
514 momentum_bc->FillBoundary(momentum_st, 0, 2, time, 0); momentum_st.FillBoundary(
true);
515 energy_bc->FillBoundary(energy_st,0,1,time,0); energy_st.FillBoundary(
true);
519 density_k2, momentum_k2, energy_k2,
520 density_st, momentum_st, energy_st);
527 amrex::MultiFab::LinComb(density_st, 1.0, density_old, 0, dt/2.0, density_k2, 0, 0, 1, 0);
528 amrex::MultiFab::LinComb(momentum_st, 1.0, momentum_old, 0, dt/2.0, momentum_k2, 0, 0, 2, 0);
529 amrex::MultiFab::LinComb(energy_st, 1.0, energy_old, 0, dt/2.0, energy_k2, 0, 0, 1, 0);
531 density_bc->FillBoundary(density_st, 0, 1, time, 0); density_st.FillBoundary(
true);
532 momentum_bc->FillBoundary(momentum_st, 0, 2, time, 0); momentum_st.FillBoundary(
true);
533 energy_bc->FillBoundary(energy_st,0,1,time,0); energy_st.FillBoundary(
true);
536 density_k3, momentum_k3, energy_k3,
537 density_st, momentum_st, energy_st);
544 amrex::MultiFab::LinComb(density_st, 1.0, density_old, 0, dt, density_k3, 0, 0, 1, 0);
545 amrex::MultiFab::LinComb(momentum_st, 1.0, momentum_old, 0, dt, momentum_k3, 0, 0, 2, 0);
546 amrex::MultiFab::LinComb(energy_st, 1.0, energy_old, 0, dt, energy_k3, 0, 0, 1, 0);
548 density_bc-> FillBoundary(density_st, 0, 1, time, 0); density_st.FillBoundary(
true);
549 momentum_bc->FillBoundary(momentum_st, 0, 2, time, 0); momentum_st.FillBoundary(
true);
550 energy_bc-> FillBoundary(energy_st, 0, 1, time, 0); energy_st.FillBoundary(
true);
554 density_k4, momentum_k4, energy_k4,
555 density_st, momentum_st, energy_st);
559 amrex::MultiFab::LinComb(density_new, 1.0, density_old, 0, (dt/6.0), density_k1, 0, 0, 1, 0);
560 amrex::MultiFab::LinComb(momentum_new, 1.0, momentum_old, 0, (dt/6.0), momentum_k1, 0, 0, 2, 0);
561 amrex::MultiFab::LinComb(energy_new, 1.0, energy_old, 0, (dt/6.0), energy_k1, 0, 0, 1, 0);
564 amrex::MultiFab::Saxpy(density_new, (dt/3.0), density_k2, 0, 0, 1, 0);
565 amrex::MultiFab::Saxpy(momentum_new, (dt/3.0), momentum_k2, 0, 0, 2, 0);
566 amrex::MultiFab::Saxpy(energy_new, (dt/3.0), energy_k2, 0, 0, 1, 0);
569 amrex::MultiFab::Saxpy(density_new, (dt/3.0), density_k3, 0, 0, 1, 0);
570 amrex::MultiFab::Saxpy(momentum_new, (dt/3.0), momentum_k3, 0, 0, 2, 0);
571 amrex::MultiFab::Saxpy(energy_new, (dt/3.0), energy_k3, 0, 0, 1, 0);
574 amrex::MultiFab::Saxpy(density_new, (dt/6.0), density_k4, 0, 0, 1, 0);
575 amrex::MultiFab::Saxpy(momentum_new, (dt/6.0), momentum_k4, 0, 0, 2, 0);
576 amrex::MultiFab::Saxpy(energy_new, (dt/6.0), energy_k4, 0, 0, 1, 0);
581 for (amrex::MFIter mfi(*eta_mf[lev],
false); mfi.isValid(); ++mfi)
583 const amrex::Box& bx = mfi.validbox();
602 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
604 if (eta(i,j,k) < cutoff)
606 rho_new(i,j,k,0) = rho_solid(i,j,k,0);
607 M_new(i,j,k,0) = M_solid(i,j,k,0);
608 M_new(i,j,k,1) = M_solid(i,j,k,1);
609 E_new(i,j,k,0) = E_solid(i,j,k,0);
613 omega(i, j, k) = eta(i, j, k) * (
gradu(1,0) -
gradu(0,1));
615 if (dynamictimestep.on)
617 *dt_max_handle = std::fabs(cfl * DX[0] / (u(i,j,k,0)*eta(i,j,k) + small));
618 *dt_max_handle = std::min(*dt_max_handle, std::fabs(cfl * DX[1] / (u(i,j,k,1)*eta(i,j,k) + small)));
619 *dt_max_handle = std::min(*dt_max_handle, std::fabs(cfl_v * DX[0]*DX[0] / (Source(i,j,k,1)+small)));
620 *dt_max_handle = std::min(*dt_max_handle, std::fabs(cfl_v * DX[1]*DX[1] / (Source(i,j,k,2)+small)));
626 if (dynamictimestep.on)
628 this->DynamicTimestep_SyncTimeStep(lev,dt_max);
635 amrex::MultiFab &rho_rhs_mf,
636 amrex::MultiFab &M_rhs_mf,
637 amrex::MultiFab &E_rhs_mf,
638 const amrex::MultiFab &rho_mf,
639 const amrex::MultiFab &M_mf,
640 const amrex::MultiFab &E_mf)
643 for (amrex::MFIter mfi(*eta_mf[lev],
true); mfi.isValid(); ++mfi)
645 const amrex::Box& bx = mfi.growntilebox();
646 amrex::Array4<const Set::Scalar>
const& eta = (*eta_old_mf[lev]).array(mfi);
659 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
662 Set::Scalar etarho_fluid = rho(i,j,k) - (1.-eta(i,j,k)) * rho_solid(i,j,k);
663 Set::Scalar etaE_fluid = E(i,j,k) - (1.-eta(i,j,k)) * E_solid(i,j,k);
665 Set::Vector etaM_fluid( M(i,j,k,0) - (1.-eta(i,j,k)) * M_solid(i,j,k,0),
666 M(i,j,k,1) - (1.-eta(i,j,k)) * M_solid(i,j,k,1) );
670 v(i,j,k,0) = etaM_fluid(0) / (etarho_fluid + small);
671 v(i,j,k,1) = etaM_fluid(1) / (etarho_fluid + small);
672 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;
677 amrex::Box domain = geom[lev].Domain();
679 for (amrex::MFIter mfi(*eta_mf[lev],
false); mfi.isValid(); ++mfi)
681 const amrex::Box& bx = mfi.validbox();
712 amrex::Array4<Set::Scalar>
const& Source = (*Source_mf[lev]).array(mfi);
714 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
741 for (
int p = 0; p < 2; p++)
742 for (
int q = 0; q < 2; q++)
743 for (
int r = 0; r < 2; r++)
746 (hess_M(r,p,q) -
gradu(r,q)*gradrho(p) -
gradu(r,p)*gradrho(q) - u(r)*hess_rho(p,q))
752 for (
int p = 0; p<2; p++)
753 for (
int q = 0; q<2; q++)
754 for (
int r = 0; r<2; r++)
755 for (
int s = 0; s<2; s++)
758 if (p==r && q==s) Mpqrs += 0.5 * mu;
760 Ldot0(p) += 0.5*Mpqrs * (u(r) - u0(r)) * hess_eta(q, s);
761 div_tau(p) += 2.0*Mpqrs * hess_u(r,s,q);
764 Source(i,j, k, 0) = mdot0;
765 Source(i,j, k, 1) = Pdot0(0) - Ldot0(0);
766 Source(i,j, k, 2) = Pdot0(1) - Ldot0(1);
767 Source(i,j, k, 3) = qdot0;
770 Source(i,j,k,1) -= lagrange*(u-u0).dot(grad_eta)*grad_eta(0);
771 Source(i,j,k,2) -= lagrange*(u-u0).dot(grad_eta)*grad_eta(1);
775 const int X = 0, Y = 1;
806 flux_xlo = riemannsolver->Solve(state_xlo_fluid, state_x_fluid, gamma, pref, small) * eta(i,j,k);
807 flux_ylo = riemannsolver->Solve(state_ylo_fluid, state_y_fluid, gamma, pref, small) * eta(i,j,k);
810 flux_xhi = riemannsolver->Solve(state_x_fluid, state_xhi_fluid, gamma, pref, small) * eta(i,j,k);
811 flux_yhi = riemannsolver->Solve(state_y_fluid, state_yhi_fluid, gamma, pref, small) * eta(i,j,k);
822 (flux_xlo.
mass - flux_xhi.
mass) / DX[0] +
823 (flux_ylo.
mass - flux_yhi.
mass) / DX[1] +
831 etadot(i,j,k) * (rho(i,j,k) - rho_solid(i,j,k)) / (eta(i,j,k) + small)
840 div_tau(0) * eta(i,j,k) +
848 etadot(i,j,k)*(M(i,j,k,0) - M_solid(i,j,k,0)) / (eta(i,j,k) + small)
855 div_tau(1) * eta(i,j,k) +
863 etadot(i,j,k)*(M(i,j,k,1) - M_solid(i,j,k,1)) / (eta(i,j,k)+small)
877 etadot(i,j,k)*(E(i,j,k) - E_solid(i,j,k)) / (eta(i,j,k)+small)
882 if ((rho_rhs(i,j,k) != rho_rhs(i,j,k)) ||
883 (M_rhs(i,j,k,0) != M_rhs(i,j,k,0)) ||
884 (M_rhs(i,j,k,1) != M_rhs(i,j,k,1)) ||
885 (E_rhs(i,j,k) != E_rhs(i,j,k)))
944 omega(i, j, k) = eta(i, j, k) * (
gradu(1,0) -
gradu(0,1));
951 BL_PROFILE(
"Integrator::Hydro::Regrid");
952 Source_mf[lev]->setVal(0.0);
953 if (lev < finest_level)
return;
959void Hydro::TagCellsForRefinement(
int lev, amrex::TagBoxArray& a_tags,
Set::Scalar,
int)
961 BL_PROFILE(
"Integrator::Flame::TagCellsForRefinement");
964 Set::Scalar dr = sqrt(AMREX_D_TERM(DX[0] * DX[0], +DX[1] * DX[1], +DX[2] * DX[2]));
967 for (amrex::MFIter mfi(*eta_mf[lev],
true); mfi.isValid(); ++mfi) {
968 const amrex::Box& bx = mfi.tilebox();
969 amrex::Array4<char>
const& tags = a_tags.array(mfi);
970 amrex::Array4<const Set::Scalar>
const& eta = (*eta_mf[lev]).array(mfi);
972 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
974 if (grad_eta.lpNorm<2>() * dr * 2 > eta_refinement_criterion) tags(i, j, k) = amrex::TagBox::SET;
979 for (amrex::MFIter mfi(*vorticity_mf[lev],
true); mfi.isValid(); ++mfi) {
980 const amrex::Box& bx = mfi.tilebox();
981 amrex::Array4<char>
const& tags = a_tags.array(mfi);
982 amrex::Array4<const Set::Scalar>
const& omega = (*vorticity_mf[lev]).array(mfi);
984 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
987 if (grad_omega.lpNorm<2>() * dr * 2 > omega_refinement_criterion) tags(i, j, k) = amrex::TagBox::SET;
992 for (amrex::MFIter mfi(*velocity_mf[lev],
true); mfi.isValid(); ++mfi) {
993 const amrex::Box& bx = mfi.tilebox();
994 amrex::Array4<char>
const& tags = a_tags.array(mfi);
995 amrex::Array4<const Set::Scalar>
const& v = (*velocity_mf[lev]).array(mfi);
997 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
1000 if (grad_u.lpNorm<2>() * dr * 2 > gradu_refinement_criterion) tags(i, j, k) = amrex::TagBox::SET;
1005 for (amrex::MFIter mfi(*pressure_mf[lev],
true); mfi.isValid(); ++mfi) {
1006 const amrex::Box& bx = mfi.tilebox();
1007 amrex::Array4<char>
const& tags = a_tags.array(mfi);
1008 amrex::Array4<const Set::Scalar>
const& p = (*pressure_mf[lev]).array(mfi);
1010 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
1013 if (grad_p.lpNorm<2>() * dr * 2 > p_refinement_criterion) tags(i, j, k) = amrex::TagBox::SET;
1018 for (amrex::MFIter mfi(*density_mf[lev],
true); mfi.isValid(); ++mfi) {
1019 const amrex::Box& bx = mfi.tilebox();
1020 amrex::Array4<char>
const& tags = a_tags.array(mfi);
1021 amrex::Array4<const Set::Scalar>
const& rho = (*density_mf[lev]).array(mfi);
1023 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
1026 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(...)
#define pp_queryclass(...)
Initialize Laminates in a matrix.
void forbid(std::string name, std::string explanation)
int AnyUnusedInputs(bool inscopeonly=true, bool verbose=false)
void select_default(std::string name, PTRTYPE *&ic_eta, Args &&... args)
static int AllUnusedInputs()
int query_default(std::string name, T &value, T defaultvalue)
int query_validate(std::string name, int &value, std::vector< int > possibleintvals)
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