368 for (amrex::MFIter mfi(*(
velocity_mf)[lev],
true); mfi.isValid(); ++mfi)
370 const amrex::Box& bx = mfi.growntilebox();
371 amrex::Array4<const Set::Scalar>
const& eta_new = (*(*eta_mf)[lev]).array(mfi);
372 amrex::Array4<const Set::Scalar>
const& eta = (*(*eta_old_mf)[lev]).array(mfi);
373 amrex::Array4<Set::Scalar>
const& etadot = (*
etadot_mf[lev]).array(mfi);
374 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
377 etadot(i, j, k) = (eta_new(i, j, k) - eta(i, j, k)) /
dt;
378 if (
invert) etadot(i,j,k) *= 1.0;
389 amrex::Vector<amrex::MultiFab> solution_new;
390 solution_new.emplace_back(*
density_mf[lev].get(),amrex::MakeType::make_alias,0,1);
391 solution_new.emplace_back(*
momentum_mf[lev].get(),amrex::MakeType::make_alias,0,2);
392 solution_new.emplace_back(*
energy_mf[lev].get(),amrex::MakeType::make_alias,0,1);
395 amrex::Vector<amrex::MultiFab> solution_old;
396 solution_old.emplace_back(*
density_old_mf[lev].get(),amrex::MakeType::make_alias,0,1);
397 solution_old.emplace_back(*
momentum_old_mf[lev].get(),amrex::MakeType::make_alias,0,2);
398 solution_old.emplace_back(*
energy_old_mf[lev].get(),amrex::MakeType::make_alias,0,1);
401 amrex::TimeIntegrator timeintegrator(solution_new, time);
404 timeintegrator.set_rhs([&](amrex::Vector<amrex::MultiFab> & rhs_mf, amrex::Vector<amrex::MultiFab> & solution_mf,
const Set::Scalar time)
407 rhs_mf[0], rhs_mf[1], rhs_mf[2],
408 solution_mf[0],solution_mf[1],solution_mf[2]);
412 timeintegrator.set_post_stage_action([&](amrex::Vector<amrex::MultiFab> & stage_mf,
Set::Scalar time)
415 stage_mf[0].FillBoundary(
true);
417 stage_mf[1].FillBoundary(
true);
419 stage_mf[2].FillBoundary(
true);
423 timeintegrator.advance(solution_old, solution_new, time,
dt);
430 Set::Scalar dt_max = std::numeric_limits<Set::Scalar>::max();
431 for (amrex::MFIter mfi(*
velocity_mf[lev],
false); mfi.isValid(); ++mfi)
433 const amrex::Box& bx = mfi.validbox();
452 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
454 Set::Scalar eta =
invert ? 1.0-eta_patch(i,j,k)*eta_patch(i,j,k) : eta_patch(i,j,k);
458 rho_new(i,j,k,0) = rho_solid(i,j,k,0);
459 M_new(i,j,k,0) = M_solid(i,j,k,0);
460 M_new(i,j,k,1) = M_solid(i,j,k,1);
461 E_new(i,j,k,0) = E_solid(i,j,k,0);
465 omega(i, j, k) = eta * (gradu(1,0) - gradu(0,1));
469 *dt_max_handle = std::fabs(
cfl * DX[0] / (u(i,j,k,0)*eta +
small));
470 *dt_max_handle = std::min(*dt_max_handle, std::fabs(
cfl * DX[1] / (u(i,j,k,1)*eta +
small)));
471 *dt_max_handle = std::min(*dt_max_handle, std::fabs(
cfl_v * DX[0]*DX[0] / (Source(i,j,k,1)+
small)));
472 *dt_max_handle = std::min(*dt_max_handle, std::fabs(
cfl_v * DX[1]*DX[1] / (Source(i,j,k,2)+
small)));
487 amrex::MultiFab &rho_rhs_mf,
488 amrex::MultiFab &M_rhs_mf,
489 amrex::MultiFab &E_rhs_mf,
490 const amrex::MultiFab &rho_mf,
491 const amrex::MultiFab &M_mf,
492 const amrex::MultiFab &E_mf)
495 for (amrex::MFIter mfi(*(
velocity_mf)[lev],
true); mfi.isValid(); ++mfi)
497 const amrex::Box& bx = mfi.growntilebox();
498 amrex::Array4<const Set::Scalar>
const& eta_patch = (*(*eta_old_mf)[lev]).array(mfi);
515 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
517 Set::Scalar eta =
invert ? 1.0-eta_patch(i,j,k)*eta_patch(i,j,k) : eta_patch(i,j,k);
521 T(i,j,k) =
gas.
ComputeT(density, M(i,j,k,0), M(i,j,k,1), E(i,j,k), T(i,j,k),
X, i, j, k);
525 scratch(i,j,k) = (rho(i,j,k) - rho_solid(i,j,k)*(1.0 - eta))/(eta +
small);
528 Set::Scalar Mx_fluid = (M(i,j,k,0) - M_solid(i,j,k,0)*(1.0 - eta))/(eta +
small);
529 Set::Scalar My_fluid = (M(i,j,k,1) - M_solid(i,j,k,1)*(1.0 - eta))/(eta +
small);
530 v(i,j,k,0) = Mx_fluid/density_fluid;
531 v(i,j,k,1) = My_fluid/density_fluid;
538 #if AMREX_SPACEDIM == 3
546 amrex::Box domain = geom[lev].Domain();
548 for (amrex::MFIter mfi(*(*
eta_mf)[lev],
false); mfi.isValid(); ++mfi)
550 const amrex::Box& bx = mfi.validbox();
583 amrex::Array4<Set::Scalar>
const& Source = (*
Source_mf[lev]).array(mfi);
585 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
589 Set::Scalar eta =
invert ? 1.0-eta_patch(i,j,k)*eta_patch(i,j,k) : eta_patch(i,j,k);
595 if (
invert) grad_eta *= -1.0;
596 if (
invert) hess_eta *= -1.0;
598 #if AMREX_SPACEDIM == 2
604 #if AMREX_SPACEDIM == 3
605 Set::Vector u =
Set::Vector(velocity(i, j, k, 0), velocity(i, j, k, 1), velocity(i, j, k, 2));
606 Set::Vector u0 =
Set::Vector(_u0(i, j, k, 0), _u0(i, j, k, 1), _u0(i, j, k, 2));
607 Set::Vector q0 =
Set::Vector(q(i,j,k,0), q(i,j,k,1), q(i,j,k,2));
613 Set::Matrix gradu = (gradM - u*gradrho.transpose()) / rho(i,j,k);
621 #if AMREX_SPACEDIM == 2
623 u0 = N * u0(0) + T * u0(1);
626 #if AMREX_SPACEDIM == 3
631 u0 = N*u0(0) + T * u0(1);
647 for (
int p = 0; p < 2; p++)
648 for (
int q = 0; q < 2; q++)
649 for (
int r = 0; r < 2; r++)
652 (hess_M(r,p,q) - gradu(r,q)*gradrho(p) - gradu(r,p)*gradrho(q) - u(r)*hess_rho(p,q))
659 for (
int p = 0; p<2; p++)
660 for (
int q = 0; q<2; q++)
661 for (
int r = 0; r<2; r++)
662 for (
int s = 0; s<2; s++)
664 Ldot0(p) += 0.25 * (mu * ((p==r && q==s) + (p==s && q==r)) + lambda * (p==q && r==s)) * (u(r) - u0(r)) * hess_eta(q, s);
665 div_tau(p) += 0.5 * (mu * ((p==r && q==s) + (p==s && q==r)) + lambda * (p==q && r==s)) * (hess_u(r,q,s) + hess_u(s,q,r));
669 Source(i,j, k, 0) = mdot0;
670 Source(i,j, k, 1) = Pdot0(0) - Ldot0(0);
671 Source(i,j, k, 2) = Pdot0(1) - Ldot0(1);
672 Source(i,j, k, 3) = qdot0;
675 Source(i,j,k,1) -=
lagrange*(u-u0).dot(grad_eta)*grad_eta(0);
676 Source(i,j,k,2) -=
lagrange*(u-u0).dot(grad_eta)*grad_eta(1);
680 const int X = 0, Y = 1;
699 (state_xlo - (eta_patch(i-1,j,k))*state_xlo_solid) / (1.0 - eta_patch(i-1,j,k) +
small) :
700 (state_xlo - (1.0 - eta_patch(i-1,j,k))*state_xlo_solid) / (eta_patch(i-1,j,k) +
small);
702 (state_x - (eta_patch(i,j,k) )*state_x_solid ) / (1.0 - eta_patch(i,j,k) +
small):
703 (state_x - (1.0 - eta_patch(i,j,k) )*state_x_solid ) / (eta_patch(i,j,k) +
small);
705 (state_xhi - (eta_patch(i+1,j,k))*state_xhi_solid) / (1.0 - eta_patch(i+1,j,k) +
small) :
706 (state_xhi - (1.0 - eta_patch(i+1,j,k))*state_xhi_solid) / (eta_patch(i+1,j,k) +
small);
708 (state_ylo - (eta_patch(i,j-1,k))*state_ylo_solid) / (1.0 - eta_patch(i,j-1,k) +
small):
709 (state_ylo - (1.0 - eta_patch(i,j-1,k))*state_ylo_solid) / (eta_patch(i,j-1,k) +
small);
711 (state_y - (eta_patch(i,j,k) )*state_y_solid ) / (1.0 - eta_patch(i,j,k) +
small):
712 (state_y - (1.0 - eta_patch(i,j,k) )*state_y_solid ) / (eta_patch(i,j,k) +
small);
714 (state_yhi - (eta_patch(i,j+1,k))*state_yhi_solid) / (1.0 - eta_patch(i,j+1,k) +
small):
715 (state_yhi - (1.0 - eta_patch(i,j+1,k))*state_yhi_solid) / (eta_patch(i,j+1,k) +
small);
738 (flux_xlo.
mass - flux_xhi.
mass) / DX[0] +
739 (flux_ylo.
mass - flux_yhi.
mass) / DX[1] +
747 etadot(i,j,k) * (rho(i,j,k) - rho_solid(i,j,k)) / (eta +
small)
765 etadot(i,j,k)*(M(i,j,k,0) - M_solid(i,j,k,0)) / (eta +
small)
781 etadot(i,j,k)*(M(i,j,k,1) - M_solid(i,j,k,1)) / (eta+
small)
795 etadot(i,j,k)*(E(i,j,k) - E_solid(i,j,k)) / (eta+
small)
800 if ((rho_rhs(i,j,k) != rho_rhs(i,j,k)) ||
801 (M_rhs(i,j,k,0) != M_rhs(i,j,k,0)) ||
802 (M_rhs(i,j,k,1) != M_rhs(i,j,k,1)) ||
803 (E_rhs(i,j,k) != E_rhs(i,j,k)))
862 omega(i, j, k) = eta * (gradu(1,0) - gradu(0,1));
879 BL_PROFILE(
"Integrator::Flame::TagCellsForRefinement");
882 Set::Scalar dr = sqrt(AMREX_D_TERM(DX[0] * DX[0], +DX[1] * DX[1], +DX[2] * DX[2]));
885 for (amrex::MFIter mfi(*(*
eta_mf)[lev],
true); mfi.isValid(); ++mfi) {
886 const amrex::Box& bx = mfi.tilebox();
887 amrex::Array4<char>
const& tags = a_tags.array(mfi);
888 amrex::Array4<const Set::Scalar>
const& eta = (*(*eta_mf)[lev]).array(mfi);
890 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
897 for (amrex::MFIter mfi(*
vorticity_mf[lev],
true); mfi.isValid(); ++mfi) {
898 const amrex::Box& bx = mfi.tilebox();
899 amrex::Array4<char>
const& tags = a_tags.array(mfi);
900 amrex::Array4<const Set::Scalar>
const& omega = (*
vorticity_mf[lev]).array(mfi);
902 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
910 for (amrex::MFIter mfi(*
velocity_mf[lev],
true); mfi.isValid(); ++mfi) {
911 const amrex::Box& bx = mfi.tilebox();
912 amrex::Array4<char>
const& tags = a_tags.array(mfi);
913 amrex::Array4<const Set::Scalar>
const& v = (*
velocity_mf[lev]).array(mfi);
915 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
923 for (amrex::MFIter mfi(*
pressure_mf[lev],
true); mfi.isValid(); ++mfi) {
924 const amrex::Box& bx = mfi.tilebox();
925 amrex::Array4<char>
const& tags = a_tags.array(mfi);
926 amrex::Array4<const Set::Scalar>
const& p = (*
pressure_mf[lev]).array(mfi);
928 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
936 for (amrex::MFIter mfi(*
density_mf[lev],
true); mfi.isValid(); ++mfi) {
937 const amrex::Box& bx = mfi.tilebox();
938 amrex::Array4<char>
const& tags = a_tags.array(mfi);
939 amrex::Array4<const Set::Scalar>
const& rho = (*
density_mf[lev]).array(mfi);
941 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {