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);
516 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
518 Set::Scalar eta =
invert ? 1.0-eta_patch(i,j,k)*eta_patch(i,j,k) : eta_patch(i,j,k);
522 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);
526 scratch(i,j,k) = (rho(i,j,k) - rho_solid(i,j,k)*(1.0 - eta))/(eta +
small);
529 Set::Scalar Mx_fluid = (M(i,j,k,0) - M_solid(i,j,k,0)*(1.0 - eta))/(eta +
small);
530 Set::Scalar My_fluid = (M(i,j,k,1) - M_solid(i,j,k,1)*(1.0 - eta))/(eta +
small);
531 v(i,j,k,0) = Mx_fluid/density_fluid;
532 v(i,j,k,1) = My_fluid/density_fluid;
539 #if AMREX_SPACEDIM == 3
547 amrex::Box domain = geom[lev].Domain();
549 for (amrex::MFIter mfi(*(*
eta_mf)[lev],
false); mfi.isValid(); ++mfi)
551 const amrex::Box& bx = mfi.validbox();
584 amrex::Array4<Set::Scalar>
const& Source = (*
Source_mf[lev]).array(mfi);
586 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
590 Set::Scalar eta =
invert ? 1.0-eta_patch(i,j,k)*eta_patch(i,j,k) : eta_patch(i,j,k);
596 if (
invert) grad_eta *= -1.0;
597 if (
invert) hess_eta *= -1.0;
599 #if AMREX_SPACEDIM == 2
605 #if AMREX_SPACEDIM == 3
606 Set::Vector u =
Set::Vector(velocity(i, j, k, 0), velocity(i, j, k, 1), velocity(i, j, k, 2));
607 Set::Vector u0 =
Set::Vector(_u0(i, j, k, 0), _u0(i, j, k, 1), _u0(i, j, k, 2));
608 Set::Vector q0 =
Set::Vector(q(i,j,k,0), q(i,j,k,1), q(i,j,k,2));
614 Set::Matrix gradu = (gradM - u*gradrho.transpose()) / rho(i,j,k);
622 #if AMREX_SPACEDIM == 2
624 u0 = N * u0(0) + T * u0(1);
627 #if AMREX_SPACEDIM == 3
632 u0 = N*u0(0) + T * u0(1);
648 for (
int p = 0; p < 2; p++)
649 for (
int q = 0; q < 2; q++)
650 for (
int r = 0; r < 2; r++)
653 (hess_M(r,p,q) - gradu(r,q)*gradrho(p) - gradu(r,p)*gradrho(q) - u(r)*hess_rho(p,q))
660 for (
int p = 0; p<2; p++)
661 for (
int q = 0; q<2; q++)
662 for (
int r = 0; r<2; r++)
663 for (
int s = 0; s<2; s++)
665 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);
666 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));
670 Source(i,j, k, 0) = mdot0;
671 Source(i,j, k, 1) = Pdot0(0) - Ldot0(0);
672 Source(i,j, k, 2) = Pdot0(1) - Ldot0(1);
673 Source(i,j, k, 3) = qdot0;
676 Source(i,j,k,1) -=
lagrange*(u-u0).dot(grad_eta)*grad_eta(0);
677 Source(i,j,k,2) -=
lagrange*(u-u0).dot(grad_eta)*grad_eta(1);
681 const int X = 0, Y = 1;
700 (state_xlo - (eta_patch(i-1,j,k))*state_xlo_solid) / (1.0 - eta_patch(i-1,j,k) +
small) :
701 (state_xlo - (1.0 - eta_patch(i-1,j,k))*state_xlo_solid) / (eta_patch(i-1,j,k) +
small);
703 (state_x - (eta_patch(i,j,k) )*state_x_solid ) / (1.0 - eta_patch(i,j,k) +
small):
704 (state_x - (1.0 - eta_patch(i,j,k) )*state_x_solid ) / (eta_patch(i,j,k) +
small);
706 (state_xhi - (eta_patch(i+1,j,k))*state_xhi_solid) / (1.0 - eta_patch(i+1,j,k) +
small) :
707 (state_xhi - (1.0 - eta_patch(i+1,j,k))*state_xhi_solid) / (eta_patch(i+1,j,k) +
small);
709 (state_ylo - (eta_patch(i,j-1,k))*state_ylo_solid) / (1.0 - eta_patch(i,j-1,k) +
small):
710 (state_ylo - (1.0 - eta_patch(i,j-1,k))*state_ylo_solid) / (eta_patch(i,j-1,k) +
small);
712 (state_y - (eta_patch(i,j,k) )*state_y_solid ) / (1.0 - eta_patch(i,j,k) +
small):
713 (state_y - (1.0 - eta_patch(i,j,k) )*state_y_solid ) / (eta_patch(i,j,k) +
small);
715 (state_yhi - (eta_patch(i,j+1,k))*state_yhi_solid) / (1.0 - eta_patch(i,j+1,k) +
small):
716 (state_yhi - (1.0 - eta_patch(i,j+1,k))*state_yhi_solid) / (eta_patch(i,j+1,k) +
small);
739 (flux_xlo.
mass - flux_xhi.
mass) / DX[0] +
740 (flux_ylo.
mass - flux_yhi.
mass) / DX[1] +
748 etadot(i,j,k) * (rho(i,j,k) - rho_solid(i,j,k)) / (eta +
small)
766 etadot(i,j,k)*(M(i,j,k,0) - M_solid(i,j,k,0)) / (eta +
small)
782 etadot(i,j,k)*(M(i,j,k,1) - M_solid(i,j,k,1)) / (eta+
small)
796 etadot(i,j,k)*(E(i,j,k) - E_solid(i,j,k)) / (eta+
small)
801 if ((rho_rhs(i,j,k) != rho_rhs(i,j,k)) ||
802 (M_rhs(i,j,k,0) != M_rhs(i,j,k,0)) ||
803 (M_rhs(i,j,k,1) != M_rhs(i,j,k,1)) ||
804 (E_rhs(i,j,k) != E_rhs(i,j,k)))
863 omega(i, j, k) = eta * (gradu(1,0) - gradu(0,1));
880 BL_PROFILE(
"Integrator::Flame::TagCellsForRefinement");
883 Set::Scalar dr = sqrt(AMREX_D_TERM(DX[0] * DX[0], +DX[1] * DX[1], +DX[2] * DX[2]));
886 for (amrex::MFIter mfi(*(*
eta_mf)[lev],
true); mfi.isValid(); ++mfi) {
887 const amrex::Box& bx = mfi.tilebox();
888 amrex::Array4<char>
const& tags = a_tags.array(mfi);
889 amrex::Array4<const Set::Scalar>
const& eta = (*(*eta_mf)[lev]).array(mfi);
891 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
898 for (amrex::MFIter mfi(*
vorticity_mf[lev],
true); mfi.isValid(); ++mfi) {
899 const amrex::Box& bx = mfi.tilebox();
900 amrex::Array4<char>
const& tags = a_tags.array(mfi);
901 amrex::Array4<const Set::Scalar>
const& omega = (*
vorticity_mf[lev]).array(mfi);
903 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
911 for (amrex::MFIter mfi(*
velocity_mf[lev],
true); mfi.isValid(); ++mfi) {
912 const amrex::Box& bx = mfi.tilebox();
913 amrex::Array4<char>
const& tags = a_tags.array(mfi);
914 amrex::Array4<const Set::Scalar>
const& v = (*
velocity_mf[lev]).array(mfi);
916 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
924 for (amrex::MFIter mfi(*
pressure_mf[lev],
true); mfi.isValid(); ++mfi) {
925 const amrex::Box& bx = mfi.tilebox();
926 amrex::Array4<char>
const& tags = a_tags.array(mfi);
927 amrex::Array4<const Set::Scalar>
const& p = (*
pressure_mf[lev]).array(mfi);
929 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
937 for (amrex::MFIter mfi(*
density_mf[lev],
true); mfi.isValid(); ++mfi) {
938 const amrex::Box& bx = mfi.tilebox();
939 amrex::Array4<char>
const& tags = a_tags.array(mfi);
940 amrex::Array4<const Set::Scalar>
const& rho = (*
density_mf[lev]).array(mfi);
942 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {