235 for (amrex::MFIter mfi(*
velocity_mf[lev],
true); mfi.isValid(); ++mfi)
237 const amrex::Box& bx = mfi.growntilebox();
254 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
256 Set::Scalar eta =
invert ? 1.0-eta_patch(i,j,k)*eta_patch(i,j,k) : eta_patch(i,j,k);
258 rho(i, j, k) = eta * rho(i, j, k) + (1.0 - eta) * rho_solid(i, j, k);
259 rho_old(i, j, k) = rho(i, j, k);
261 M(i, j, k, 0) = (rho(i, j, k)*v(i, j, k, 0))*eta + M_solid(i, j, k, 0)*(1.0-eta);
262 M(i, j, k, 1) = (rho(i, j, k)*v(i, j, k, 1))*eta + M_solid(i, j, k, 1)*(1.0-eta);
263 M_old(i, j, k, 0) = M(i, j, k, 0);
264 M_old(i, j, k, 1) = M(i, j, k, 1);
267 (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
269 E_solid(i, j, k) * (1.0 - eta);
270 E_old(i, j, k) = E(i, j, k);
332 for (amrex::MFIter mfi(*(
velocity_mf)[lev],
true); mfi.isValid(); ++mfi)
334 const amrex::Box& bx = mfi.growntilebox();
335 amrex::Array4<const Set::Scalar>
const& eta_new = (*(*eta_mf)[lev]).array(mfi);
336 amrex::Array4<const Set::Scalar>
const& eta = (*(*eta_old_mf)[lev]).array(mfi);
337 amrex::Array4<Set::Scalar>
const& etadot = (*
etadot_mf[lev]).array(mfi);
338 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
341 etadot(i, j, k) = (eta_new(i, j, k) - eta(i, j, k)) /
dt;
342 if (
invert) etadot(i,j,k) *= 1.0;
353 amrex::Vector<amrex::MultiFab> solution_new;
354 solution_new.emplace_back(*
density_mf[lev].get(),amrex::MakeType::make_alias,0,1);
355 solution_new.emplace_back(*
momentum_mf[lev].get(),amrex::MakeType::make_alias,0,2);
356 solution_new.emplace_back(*
energy_mf[lev].get(),amrex::MakeType::make_alias,0,1);
359 amrex::Vector<amrex::MultiFab> solution_old;
360 solution_old.emplace_back(*
density_old_mf[lev].get(),amrex::MakeType::make_alias,0,1);
361 solution_old.emplace_back(*
momentum_old_mf[lev].get(),amrex::MakeType::make_alias,0,2);
362 solution_old.emplace_back(*
energy_old_mf[lev].get(),amrex::MakeType::make_alias,0,1);
365 amrex::TimeIntegrator timeintegrator(solution_new, time);
368 timeintegrator.set_rhs([&](amrex::Vector<amrex::MultiFab> & rhs_mf, amrex::Vector<amrex::MultiFab> & solution_mf,
const Set::Scalar time)
371 rhs_mf[0], rhs_mf[1], rhs_mf[2],
372 solution_mf[0],solution_mf[1],solution_mf[2]);
376 timeintegrator.set_post_stage_action([&](amrex::Vector<amrex::MultiFab> & stage_mf,
Set::Scalar time)
379 stage_mf[0].FillBoundary(
true);
381 stage_mf[1].FillBoundary(
true);
383 stage_mf[2].FillBoundary(
true);
387 timeintegrator.advance(solution_old, solution_new, time,
dt);
394 Set::Scalar dt_max = std::numeric_limits<Set::Scalar>::max();
395 for (amrex::MFIter mfi(*
velocity_mf[lev],
false); mfi.isValid(); ++mfi)
397 const amrex::Box& bx = mfi.validbox();
416 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
418 Set::Scalar eta =
invert ? 1.0-eta_patch(i,j,k)*eta_patch(i,j,k) : eta_patch(i,j,k);
422 rho_new(i,j,k,0) = rho_solid(i,j,k,0);
423 M_new(i,j,k,0) = M_solid(i,j,k,0);
424 M_new(i,j,k,1) = M_solid(i,j,k,1);
425 E_new(i,j,k,0) = E_solid(i,j,k,0);
429 omega(i, j, k) = eta * (gradu(1,0) - gradu(0,1));
433 *dt_max_handle = std::fabs(
cfl * DX[0] / (u(i,j,k,0)*eta +
small));
434 *dt_max_handle = std::min(*dt_max_handle, std::fabs(
cfl * DX[1] / (u(i,j,k,1)*eta +
small)));
435 *dt_max_handle = std::min(*dt_max_handle, std::fabs(
cfl_v * DX[0]*DX[0] / (Source(i,j,k,1)+
small)));
436 *dt_max_handle = std::min(*dt_max_handle, std::fabs(
cfl_v * DX[1]*DX[1] / (Source(i,j,k,2)+
small)));
451 amrex::MultiFab &rho_rhs_mf,
452 amrex::MultiFab &M_rhs_mf,
453 amrex::MultiFab &E_rhs_mf,
454 const amrex::MultiFab &rho_mf,
455 const amrex::MultiFab &M_mf,
456 const amrex::MultiFab &E_mf)
459 for (amrex::MFIter mfi(*(
velocity_mf)[lev],
true); mfi.isValid(); ++mfi)
461 const amrex::Box& bx = mfi.growntilebox();
462 amrex::Array4<const Set::Scalar>
const& eta_patch = (*(*eta_old_mf)[lev]).array(mfi);
475 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
477 Set::Scalar eta =
invert ? 1.0-eta_patch(i,j,k)*eta_patch(i,j,k) : eta_patch(i,j,k);
479 Set::Scalar etarho_fluid = rho(i,j,k) - (1.-eta) * rho_solid(i,j,k);
480 Set::Scalar etaE_fluid = E(i,j,k) - (1.-eta) * E_solid(i,j,k);
484 etaM_fluid(0) = M(i,j,k,0) - (1.-eta) * M_solid(i,j,k,0);
485 etaM_fluid(1) = M(i,j,k,1) - (1.-eta) * M_solid(i,j,k,1);
487 #if AMREX_SPACEDIM == 3
493 v(i,j,k,0) = etaM_fluid(0) / (etarho_fluid +
small);
494 v(i,j,k,1) = etaM_fluid(1) / (etarho_fluid +
small);
495 p(i,j,k) = (etaE_fluid / (eta +
small) - 0.5 * (etaM_fluid(0)*etaM_fluid(0) + etaM_fluid(1)*etaM_fluid(1)) / (etarho_fluid +
small)) * ((
gamma - 1.0) / (eta +
small))-
pref;
502 #if AMREX_SPACEDIM == 3
510 amrex::Box domain = geom[lev].Domain();
512 for (amrex::MFIter mfi(*(*
eta_mf)[lev],
false); mfi.isValid(); ++mfi)
514 const amrex::Box& bx = mfi.validbox();
545 amrex::Array4<Set::Scalar>
const& Source = (*
Source_mf[lev]).array(mfi);
547 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
551 Set::Scalar eta =
invert ? 1.0-eta_patch(i,j,k)*eta_patch(i,j,k) : eta_patch(i,j,k);
557 if (
invert) grad_eta *= -1.0;
558 if (
invert) hess_eta *= -1.0;
560 #if AMREX_SPACEDIM == 2
566 #if AMREX_SPACEDIM == 3
567 Set::Vector u =
Set::Vector(velocity(i, j, k, 0), velocity(i, j, k, 1), velocity(i, j, k, 2));
568 Set::Vector u0 =
Set::Vector(_u0(i, j, k, 0), _u0(i, j, k, 1), _u0(i, j, k, 2));
569 Set::Vector q0 =
Set::Vector(q(i,j,k,0), q(i,j,k,1), q(i,j,k,2));
575 Set::Matrix gradu = (gradM - u*gradrho.transpose()) / rho(i,j,k);
583 #if AMREX_SPACEDIM == 2
585 u0 = N * u0(0) + T * u0(1);
588 #if AMREX_SPACEDIM == 3
593 u0 = N*u0(0) + T * u0(1);
605 for (
int p = 0; p < 2; p++)
606 for (
int q = 0; q < 2; q++)
607 for (
int r = 0; r < 2; r++)
610 (hess_M(r,p,q) - gradu(r,q)*gradrho(p) - gradu(r,p)*gradrho(q) - u(r)*hess_rho(p,q))
616 for (
int p = 0; p<2; p++)
617 for (
int q = 0; q<2; q++)
618 for (
int r = 0; r<2; r++)
619 for (
int s = 0; s<2; s++)
622 if (p==r && q==s) Mpqrs += 0.5 *
mu;
624 Ldot0(p) += 0.5*Mpqrs * (u(r) - u0(r)) * hess_eta(q, s);
625 div_tau(p) += 2.0*Mpqrs * hess_u(r,s,q);
628 Source(i,j, k, 0) = mdot0;
629 Source(i,j, k, 1) = (Pdot0(0) - Ldot0(0));
630 Source(i,j, k, 2) = (Pdot0(1) - Ldot0(1));
631 Source(i,j, k, 3) = qdot0;
634 Source(i,j,k,1) -=
lagrange*(u-u0).dot(grad_eta)*grad_eta(0);
635 Source(i,j,k,2) -=
lagrange*(u-u0).dot(grad_eta)*grad_eta(1);
639 const int X = 0, Y = 1;
659 (state_xlo - (eta_patch(i-1,j,k))*state_xlo_solid) / (1.0 - eta_patch(i-1,j,k) +
small) :
660 (state_xlo - (1.0 - eta_patch(i-1,j,k))*state_xlo_solid) / (eta_patch(i-1,j,k) +
small);
662 (state_x - (eta_patch(i,j,k) )*state_x_solid ) / (1.0 - eta_patch(i,j,k) +
small):
663 (state_x - (1.0 - eta_patch(i,j,k) )*state_x_solid ) / (eta_patch(i,j,k) +
small);
665 (state_xhi - (eta_patch(i+1,j,k))*state_xhi_solid) / (1.0 - eta_patch(i+1,j,k) +
small) :
666 (state_xhi - (1.0 - eta_patch(i+1,j,k))*state_xhi_solid) / (eta_patch(i+1,j,k) +
small);
668 (state_ylo - (eta_patch(i,j-1,k))*state_ylo_solid) / (1.0 - eta_patch(i,j-1,k) +
small):
669 (state_ylo - (1.0 - eta_patch(i,j-1,k))*state_ylo_solid) / (eta_patch(i,j-1,k) +
small);
671 (state_y - (eta_patch(i,j,k) )*state_y_solid ) / (1.0 - eta_patch(i,j,k) +
small):
672 (state_y - (1.0 - eta_patch(i,j,k) )*state_y_solid ) / (eta_patch(i,j,k) +
small);
674 (state_yhi - (eta_patch(i,j+1,k))*state_yhi_solid) / (1.0 - eta_patch(i,j+1,k) +
small):
675 (state_yhi - (1.0 - eta_patch(i,j+1,k))*state_yhi_solid) / (eta_patch(i,j+1,k) +
small);
698 (flux_xlo.
mass - flux_xhi.
mass) / DX[0] +
699 (flux_ylo.
mass - flux_yhi.
mass) / DX[1] +
707 etadot(i,j,k) * (rho(i,j,k) - rho_solid(i,j,k)) / (eta +
small)
725 etadot(i,j,k)*(M(i,j,k,0) - M_solid(i,j,k,0)) / (eta +
small)
741 etadot(i,j,k)*(M(i,j,k,1) - M_solid(i,j,k,1)) / (eta+
small)
755 etadot(i,j,k)*(E(i,j,k) - E_solid(i,j,k)) / (eta+
small)
760 if ((rho_rhs(i,j,k) != rho_rhs(i,j,k)) ||
761 (M_rhs(i,j,k,0) != M_rhs(i,j,k,0)) ||
762 (M_rhs(i,j,k,1) != M_rhs(i,j,k,1)) ||
763 (E_rhs(i,j,k) != E_rhs(i,j,k)))
822 omega(i, j, k) = eta * (gradu(1,0) - gradu(0,1));
839 BL_PROFILE(
"Integrator::Flame::TagCellsForRefinement");
842 Set::Scalar dr = sqrt(AMREX_D_TERM(DX[0] * DX[0], +DX[1] * DX[1], +DX[2] * DX[2]));
845 for (amrex::MFIter mfi(*(*
eta_mf)[lev],
true); mfi.isValid(); ++mfi) {
846 const amrex::Box& bx = mfi.tilebox();
847 amrex::Array4<char>
const& tags = a_tags.array(mfi);
848 amrex::Array4<const Set::Scalar>
const& eta = (*(*eta_mf)[lev]).array(mfi);
850 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
857 for (amrex::MFIter mfi(*
vorticity_mf[lev],
true); mfi.isValid(); ++mfi) {
858 const amrex::Box& bx = mfi.tilebox();
859 amrex::Array4<char>
const& tags = a_tags.array(mfi);
860 amrex::Array4<const Set::Scalar>
const& omega = (*
vorticity_mf[lev]).array(mfi);
862 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
870 for (amrex::MFIter mfi(*
velocity_mf[lev],
true); mfi.isValid(); ++mfi) {
871 const amrex::Box& bx = mfi.tilebox();
872 amrex::Array4<char>
const& tags = a_tags.array(mfi);
873 amrex::Array4<const Set::Scalar>
const& v = (*
velocity_mf[lev]).array(mfi);
875 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
883 for (amrex::MFIter mfi(*
pressure_mf[lev],
true); mfi.isValid(); ++mfi) {
884 const amrex::Box& bx = mfi.tilebox();
885 amrex::Array4<char>
const& tags = a_tags.array(mfi);
886 amrex::Array4<const Set::Scalar>
const& p = (*
pressure_mf[lev]).array(mfi);
888 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
896 for (amrex::MFIter mfi(*
density_mf[lev],
true); mfi.isValid(); ++mfi) {
897 const amrex::Box& bx = mfi.tilebox();
898 amrex::Array4<char>
const& tags = a_tags.array(mfi);
899 amrex::Array4<const Set::Scalar>
const& rho = (*
density_mf[lev]).array(mfi);
901 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {