366 for (amrex::MFIter mfi(*(
velocity_mf)[lev],
true); mfi.isValid(); ++mfi)
368 const amrex::Box& bx = mfi.growntilebox();
369 amrex::Array4<const Set::Scalar>
const& eta_new = (*(*eta_mf)[lev]).array(mfi);
370 amrex::Array4<const Set::Scalar>
const& eta = (*(*eta_old_mf)[lev]).array(mfi);
371 amrex::Array4<Set::Scalar>
const& etadot = (*
etadot_mf[lev]).array(mfi);
372 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
375 etadot(i, j, k) = (eta_new(i, j, k) - eta(i, j, k)) /
dt;
376 if (
invert) etadot(i,j,k) *= 1.0;
387 amrex::Vector<amrex::MultiFab> solution_new;
388 solution_new.emplace_back(*
density_mf[lev].get(),amrex::MakeType::make_alias,0,1);
389 solution_new.emplace_back(*
momentum_mf[lev].get(),amrex::MakeType::make_alias,0,2);
390 solution_new.emplace_back(*
energy_mf[lev].get(),amrex::MakeType::make_alias,0,1);
393 amrex::Vector<amrex::MultiFab> solution_old;
394 solution_old.emplace_back(*
density_old_mf[lev].get(),amrex::MakeType::make_alias,0,1);
395 solution_old.emplace_back(*
momentum_old_mf[lev].get(),amrex::MakeType::make_alias,0,2);
396 solution_old.emplace_back(*
energy_old_mf[lev].get(),amrex::MakeType::make_alias,0,1);
399 amrex::TimeIntegrator timeintegrator(solution_new, time);
402 timeintegrator.set_rhs([&](amrex::Vector<amrex::MultiFab> & rhs_mf, amrex::Vector<amrex::MultiFab> & solution_mf,
const Set::Scalar time)
405 rhs_mf[0], rhs_mf[1], rhs_mf[2],
406 solution_mf[0],solution_mf[1],solution_mf[2]);
410 timeintegrator.set_post_stage_action([&](amrex::Vector<amrex::MultiFab> & stage_mf,
Set::Scalar time)
413 stage_mf[0].FillBoundary(
true);
415 stage_mf[1].FillBoundary(
true);
417 stage_mf[2].FillBoundary(
true);
421 timeintegrator.advance(solution_old, solution_new, time,
dt);
428 Set::Scalar dt_max = std::numeric_limits<Set::Scalar>::max();
429 for (amrex::MFIter mfi(*
velocity_mf[lev],
false); mfi.isValid(); ++mfi)
431 const amrex::Box& bx = mfi.validbox();
450 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
452 Set::Scalar eta =
invert ? 1.0-eta_patch(i,j,k)*eta_patch(i,j,k) : eta_patch(i,j,k);
456 rho_new(i,j,k,0) = rho_solid(i,j,k,0);
457 M_new(i,j,k,0) = M_solid(i,j,k,0);
458 M_new(i,j,k,1) = M_solid(i,j,k,1);
459 E_new(i,j,k,0) = E_solid(i,j,k,0);
463 omega(i, j, k) = eta * (gradu(1,0) - gradu(0,1));
467 *dt_max_handle = std::fabs(
cfl * DX[0] / (u(i,j,k,0)*eta +
small));
468 *dt_max_handle = std::min(*dt_max_handle, std::fabs(
cfl * DX[1] / (u(i,j,k,1)*eta +
small)));
469 *dt_max_handle = std::min(*dt_max_handle, std::fabs(
cfl_v * DX[0]*DX[0] / (Source(i,j,k,1)+
small)));
470 *dt_max_handle = std::min(*dt_max_handle, std::fabs(
cfl_v * DX[1]*DX[1] / (Source(i,j,k,2)+
small)));
485 amrex::MultiFab &rho_rhs_mf,
486 amrex::MultiFab &M_rhs_mf,
487 amrex::MultiFab &E_rhs_mf,
488 const amrex::MultiFab &rho_mf,
489 const amrex::MultiFab &M_mf,
490 const amrex::MultiFab &E_mf)
493 for (amrex::MFIter mfi(*(
velocity_mf)[lev],
true); mfi.isValid(); ++mfi)
495 const amrex::Box& bx = mfi.growntilebox();
496 amrex::Array4<const Set::Scalar>
const& eta_patch = (*(*eta_old_mf)[lev]).array(mfi);
513 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
515 Set::Scalar eta =
invert ? 1.0-eta_patch(i,j,k)*eta_patch(i,j,k) : eta_patch(i,j,k);
519 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);
523 scratch(i,j,k) = (rho(i,j,k) - rho_solid(i,j,k)*(1.0 - eta))/(eta +
small);
526 Set::Scalar Mx_fluid = (M(i,j,k,0) - M_solid(i,j,k,0)*(1.0 - eta))/(eta +
small);
527 Set::Scalar My_fluid = (M(i,j,k,1) - M_solid(i,j,k,1)*(1.0 - eta))/(eta +
small);
528 v(i,j,k,0) = Mx_fluid/density_fluid;
529 v(i,j,k,1) = My_fluid/density_fluid;
536 #if AMREX_SPACEDIM == 3
544 amrex::Box domain = geom[lev].Domain();
546 for (amrex::MFIter mfi(*(*
eta_mf)[lev],
false); mfi.isValid(); ++mfi)
548 const amrex::Box& bx = mfi.validbox();
581 amrex::Array4<Set::Scalar>
const& Source = (*
Source_mf[lev]).array(mfi);
583 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
587 Set::Scalar eta =
invert ? 1.0-eta_patch(i,j,k)*eta_patch(i,j,k) : eta_patch(i,j,k);
593 if (
invert) grad_eta *= -1.0;
594 if (
invert) hess_eta *= -1.0;
596 #if AMREX_SPACEDIM == 2
602 #if AMREX_SPACEDIM == 3
603 Set::Vector u =
Set::Vector(velocity(i, j, k, 0), velocity(i, j, k, 1), velocity(i, j, k, 2));
604 Set::Vector u0 =
Set::Vector(_u0(i, j, k, 0), _u0(i, j, k, 1), _u0(i, j, k, 2));
605 Set::Vector q0 =
Set::Vector(q(i,j,k,0), q(i,j,k,1), q(i,j,k,2));
611 Set::Matrix gradu = (gradM - u*gradrho.transpose()) / rho(i,j,k);
619 #if AMREX_SPACEDIM == 2
621 u0 = N * u0(0) + T * u0(1);
624 #if AMREX_SPACEDIM == 3
629 u0 = N*u0(0) + T * u0(1);
645 for (
int p = 0; p < 2; p++)
646 for (
int q = 0; q < 2; q++)
647 for (
int r = 0; r < 2; r++)
650 (hess_M(r,p,q) - gradu(r,q)*gradrho(p) - gradu(r,p)*gradrho(q) - u(r)*hess_rho(p,q))
657 for (
int p = 0; p<2; p++)
658 for (
int q = 0; q<2; q++)
659 for (
int r = 0; r<2; r++)
660 for (
int s = 0; s<2; s++)
662 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);
663 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));
667 Source(i,j, k, 0) = mdot0;
668 Source(i,j, k, 1) = Pdot0(0) - Ldot0(0);
669 Source(i,j, k, 2) = Pdot0(1) - Ldot0(1);
670 Source(i,j, k, 3) = qdot0;
673 Source(i,j,k,1) -=
lagrange*(u-u0).dot(grad_eta)*grad_eta(0);
674 Source(i,j,k,2) -=
lagrange*(u-u0).dot(grad_eta)*grad_eta(1);
678 const int X = 0, Y = 1;
697 (state_xlo - (eta_patch(i-1,j,k))*state_xlo_solid) / (1.0 - eta_patch(i-1,j,k) +
small) :
698 (state_xlo - (1.0 - eta_patch(i-1,j,k))*state_xlo_solid) / (eta_patch(i-1,j,k) +
small);
700 (state_x - (eta_patch(i,j,k) )*state_x_solid ) / (1.0 - eta_patch(i,j,k) +
small):
701 (state_x - (1.0 - eta_patch(i,j,k) )*state_x_solid ) / (eta_patch(i,j,k) +
small);
703 (state_xhi - (eta_patch(i+1,j,k))*state_xhi_solid) / (1.0 - eta_patch(i+1,j,k) +
small) :
704 (state_xhi - (1.0 - eta_patch(i+1,j,k))*state_xhi_solid) / (eta_patch(i+1,j,k) +
small);
706 (state_ylo - (eta_patch(i,j-1,k))*state_ylo_solid) / (1.0 - eta_patch(i,j-1,k) +
small):
707 (state_ylo - (1.0 - eta_patch(i,j-1,k))*state_ylo_solid) / (eta_patch(i,j-1,k) +
small);
709 (state_y - (eta_patch(i,j,k) )*state_y_solid ) / (1.0 - eta_patch(i,j,k) +
small):
710 (state_y - (1.0 - eta_patch(i,j,k) )*state_y_solid ) / (eta_patch(i,j,k) +
small);
712 (state_yhi - (eta_patch(i,j+1,k))*state_yhi_solid) / (1.0 - eta_patch(i,j+1,k) +
small):
713 (state_yhi - (1.0 - eta_patch(i,j+1,k))*state_yhi_solid) / (eta_patch(i,j+1,k) +
small);
736 (flux_xlo.
mass - flux_xhi.
mass) / DX[0] +
737 (flux_ylo.
mass - flux_yhi.
mass) / DX[1] +
745 etadot(i,j,k) * (rho(i,j,k) - rho_solid(i,j,k)) / (eta +
small)
763 etadot(i,j,k)*(M(i,j,k,0) - M_solid(i,j,k,0)) / (eta +
small)
779 etadot(i,j,k)*(M(i,j,k,1) - M_solid(i,j,k,1)) / (eta+
small)
793 etadot(i,j,k)*(E(i,j,k) - E_solid(i,j,k)) / (eta+
small)
798 if ((rho_rhs(i,j,k) != rho_rhs(i,j,k)) ||
799 (M_rhs(i,j,k,0) != M_rhs(i,j,k,0)) ||
800 (M_rhs(i,j,k,1) != M_rhs(i,j,k,1)) ||
801 (E_rhs(i,j,k) != E_rhs(i,j,k)))
860 omega(i, j, k) = eta * (gradu(1,0) - gradu(0,1));
877 BL_PROFILE(
"Integrator::Flame::TagCellsForRefinement");
880 Set::Scalar dr = sqrt(AMREX_D_TERM(DX[0] * DX[0], +DX[1] * DX[1], +DX[2] * DX[2]));
883 for (amrex::MFIter mfi(*(*
eta_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& eta = (*(*eta_mf)[lev]).array(mfi);
888 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
895 for (amrex::MFIter mfi(*
vorticity_mf[lev],
true); mfi.isValid(); ++mfi) {
896 const amrex::Box& bx = mfi.tilebox();
897 amrex::Array4<char>
const& tags = a_tags.array(mfi);
898 amrex::Array4<const Set::Scalar>
const& omega = (*
vorticity_mf[lev]).array(mfi);
900 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
908 for (amrex::MFIter mfi(*
velocity_mf[lev],
true); mfi.isValid(); ++mfi) {
909 const amrex::Box& bx = mfi.tilebox();
910 amrex::Array4<char>
const& tags = a_tags.array(mfi);
911 amrex::Array4<const Set::Scalar>
const& v = (*
velocity_mf[lev]).array(mfi);
913 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
921 for (amrex::MFIter mfi(*
pressure_mf[lev],
true); mfi.isValid(); ++mfi) {
922 const amrex::Box& bx = mfi.tilebox();
923 amrex::Array4<char>
const& tags = a_tags.array(mfi);
924 amrex::Array4<const Set::Scalar>
const& p = (*
pressure_mf[lev]).array(mfi);
926 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
934 for (amrex::MFIter mfi(*
density_mf[lev],
true); mfi.isValid(); ++mfi) {
935 const amrex::Box& bx = mfi.tilebox();
936 amrex::Array4<char>
const& tags = a_tags.array(mfi);
937 amrex::Array4<const Set::Scalar>
const& rho = (*
density_mf[lev]).array(mfi);
939 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {