365 for (amrex::MFIter mfi(*(
velocity_mf)[lev],
true); mfi.isValid(); ++mfi)
367 const amrex::Box& bx = mfi.growntilebox();
368 amrex::Array4<const Set::Scalar>
const& eta_new = (*(*eta_mf)[lev]).array(mfi);
369 amrex::Array4<const Set::Scalar>
const& eta = (*(*eta_old_mf)[lev]).array(mfi);
370 amrex::Array4<Set::Scalar>
const& etadot = (*
etadot_mf[lev]).array(mfi);
371 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
374 etadot(i, j, k) = (eta_new(i, j, k) - eta(i, j, k)) /
dt;
375 if (
invert) etadot(i,j,k) *= 1.0;
386 amrex::Vector<amrex::MultiFab> solution_new;
387 solution_new.emplace_back(*
density_mf[lev].get(),amrex::MakeType::make_alias,0,1);
388 solution_new.emplace_back(*
momentum_mf[lev].get(),amrex::MakeType::make_alias,0,2);
389 solution_new.emplace_back(*
energy_mf[lev].get(),amrex::MakeType::make_alias,0,1);
392 amrex::Vector<amrex::MultiFab> solution_old;
393 solution_old.emplace_back(*
density_old_mf[lev].get(),amrex::MakeType::make_alias,0,1);
394 solution_old.emplace_back(*
momentum_old_mf[lev].get(),amrex::MakeType::make_alias,0,2);
395 solution_old.emplace_back(*
energy_old_mf[lev].get(),amrex::MakeType::make_alias,0,1);
398 amrex::TimeIntegrator timeintegrator(solution_new, time);
401 timeintegrator.set_rhs([&](amrex::Vector<amrex::MultiFab> & rhs_mf, amrex::Vector<amrex::MultiFab> & solution_mf,
const Set::Scalar time)
404 rhs_mf[0], rhs_mf[1], rhs_mf[2],
405 solution_mf[0],solution_mf[1],solution_mf[2]);
409 timeintegrator.set_post_stage_action([&](amrex::Vector<amrex::MultiFab> & stage_mf,
Set::Scalar time)
412 stage_mf[0].FillBoundary(
true);
414 stage_mf[1].FillBoundary(
true);
416 stage_mf[2].FillBoundary(
true);
420 timeintegrator.advance(solution_old, solution_new, time,
dt);
427 Set::Scalar dt_max = std::numeric_limits<Set::Scalar>::max();
428 for (amrex::MFIter mfi(*
velocity_mf[lev],
false); mfi.isValid(); ++mfi)
430 const amrex::Box& bx = mfi.validbox();
449 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
451 Set::Scalar eta =
invert ? 1.0-eta_patch(i,j,k)*eta_patch(i,j,k) : eta_patch(i,j,k);
455 rho_new(i,j,k,0) = rho_solid(i,j,k,0);
456 M_new(i,j,k,0) = M_solid(i,j,k,0);
457 M_new(i,j,k,1) = M_solid(i,j,k,1);
458 E_new(i,j,k,0) = E_solid(i,j,k,0);
462 omega(i, j, k) = eta * (gradu(1,0) - gradu(0,1));
466 *dt_max_handle = std::fabs(
cfl * DX[0] / (u(i,j,k,0)*eta +
small));
467 *dt_max_handle = std::min(*dt_max_handle, std::fabs(
cfl * DX[1] / (u(i,j,k,1)*eta +
small)));
468 *dt_max_handle = std::min(*dt_max_handle, std::fabs(
cfl_v * DX[0]*DX[0] / (Source(i,j,k,1)+
small)));
469 *dt_max_handle = std::min(*dt_max_handle, std::fabs(
cfl_v * DX[1]*DX[1] / (Source(i,j,k,2)+
small)));
484 amrex::MultiFab &rho_rhs_mf,
485 amrex::MultiFab &M_rhs_mf,
486 amrex::MultiFab &E_rhs_mf,
487 const amrex::MultiFab &rho_mf,
488 const amrex::MultiFab &M_mf,
489 const amrex::MultiFab &E_mf)
492 for (amrex::MFIter mfi(*(
velocity_mf)[lev],
true); mfi.isValid(); ++mfi)
494 const amrex::Box& bx = mfi.growntilebox();
495 amrex::Array4<const Set::Scalar>
const& eta_patch = (*(*eta_old_mf)[lev]).array(mfi);
512 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
514 Set::Scalar eta =
invert ? 1.0-eta_patch(i,j,k)*eta_patch(i,j,k) : eta_patch(i,j,k);
518 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);
522 scratch(i,j,k) = (rho(i,j,k) - rho_solid(i,j,k)*(1.0 - eta))/(eta +
small);
525 Set::Scalar Mx_fluid = (M(i,j,k,0) - M_solid(i,j,k,0)*(1.0 - eta))/(eta +
small);
526 Set::Scalar My_fluid = (M(i,j,k,1) - M_solid(i,j,k,1)*(1.0 - eta))/(eta +
small);
527 v(i,j,k,0) = Mx_fluid/density_fluid;
528 v(i,j,k,1) = My_fluid/density_fluid;
535 #if AMREX_SPACEDIM == 3
543 amrex::Box domain = geom[lev].Domain();
545 for (amrex::MFIter mfi(*(*
eta_mf)[lev],
false); mfi.isValid(); ++mfi)
547 const amrex::Box& bx = mfi.validbox();
580 amrex::Array4<Set::Scalar>
const& Source = (*
Source_mf[lev]).array(mfi);
582 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
586 Set::Scalar eta =
invert ? 1.0-eta_patch(i,j,k)*eta_patch(i,j,k) : eta_patch(i,j,k);
592 if (
invert) grad_eta *= -1.0;
593 if (
invert) hess_eta *= -1.0;
595 #if AMREX_SPACEDIM == 2
601 #if AMREX_SPACEDIM == 3
602 Set::Vector u =
Set::Vector(velocity(i, j, k, 0), velocity(i, j, k, 1), velocity(i, j, k, 2));
603 Set::Vector u0 =
Set::Vector(_u0(i, j, k, 0), _u0(i, j, k, 1), _u0(i, j, k, 2));
604 Set::Vector q0 =
Set::Vector(q(i,j,k,0), q(i,j,k,1), q(i,j,k,2));
610 Set::Matrix gradu = (gradM - u*gradrho.transpose()) / rho(i,j,k);
618 #if AMREX_SPACEDIM == 2
620 u0 = N * u0(0) + T * u0(1);
623 #if AMREX_SPACEDIM == 3
628 u0 = N*u0(0) + T * u0(1);
644 for (
int p = 0; p < 2; p++)
645 for (
int q = 0; q < 2; q++)
646 for (
int r = 0; r < 2; r++)
649 (hess_M(r,p,q) - gradu(r,q)*gradrho(p) - gradu(r,p)*gradrho(q) - u(r)*hess_rho(p,q))
656 for (
int p = 0; p<2; p++)
657 for (
int q = 0; q<2; q++)
658 for (
int r = 0; r<2; r++)
659 for (
int s = 0; s<2; s++)
661 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);
662 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));
666 Source(i,j, k, 0) = mdot0;
667 Source(i,j, k, 1) = Pdot0(0) - Ldot0(0);
668 Source(i,j, k, 2) = Pdot0(1) - Ldot0(1);
669 Source(i,j, k, 3) = qdot0;
672 Source(i,j,k,1) -=
lagrange*(u-u0).dot(grad_eta)*grad_eta(0);
673 Source(i,j,k,2) -=
lagrange*(u-u0).dot(grad_eta)*grad_eta(1);
677 const int X = 0, Y = 1;
696 (state_xlo - (eta_patch(i-1,j,k))*state_xlo_solid) / (1.0 - eta_patch(i-1,j,k) +
small) :
697 (state_xlo - (1.0 - eta_patch(i-1,j,k))*state_xlo_solid) / (eta_patch(i-1,j,k) +
small);
699 (state_x - (eta_patch(i,j,k) )*state_x_solid ) / (1.0 - eta_patch(i,j,k) +
small):
700 (state_x - (1.0 - eta_patch(i,j,k) )*state_x_solid ) / (eta_patch(i,j,k) +
small);
702 (state_xhi - (eta_patch(i+1,j,k))*state_xhi_solid) / (1.0 - eta_patch(i+1,j,k) +
small) :
703 (state_xhi - (1.0 - eta_patch(i+1,j,k))*state_xhi_solid) / (eta_patch(i+1,j,k) +
small);
705 (state_ylo - (eta_patch(i,j-1,k))*state_ylo_solid) / (1.0 - eta_patch(i,j-1,k) +
small):
706 (state_ylo - (1.0 - eta_patch(i,j-1,k))*state_ylo_solid) / (eta_patch(i,j-1,k) +
small);
708 (state_y - (eta_patch(i,j,k) )*state_y_solid ) / (1.0 - eta_patch(i,j,k) +
small):
709 (state_y - (1.0 - eta_patch(i,j,k) )*state_y_solid ) / (eta_patch(i,j,k) +
small);
711 (state_yhi - (eta_patch(i,j+1,k))*state_yhi_solid) / (1.0 - eta_patch(i,j+1,k) +
small):
712 (state_yhi - (1.0 - eta_patch(i,j+1,k))*state_yhi_solid) / (eta_patch(i,j+1,k) +
small);
735 (flux_xlo.
mass - flux_xhi.
mass) / DX[0] +
736 (flux_ylo.
mass - flux_yhi.
mass) / DX[1] +
744 etadot(i,j,k) * (rho(i,j,k) - rho_solid(i,j,k)) / (eta +
small)
762 etadot(i,j,k)*(M(i,j,k,0) - M_solid(i,j,k,0)) / (eta +
small)
778 etadot(i,j,k)*(M(i,j,k,1) - M_solid(i,j,k,1)) / (eta+
small)
792 etadot(i,j,k)*(E(i,j,k) - E_solid(i,j,k)) / (eta+
small)
797 if ((rho_rhs(i,j,k) != rho_rhs(i,j,k)) ||
798 (M_rhs(i,j,k,0) != M_rhs(i,j,k,0)) ||
799 (M_rhs(i,j,k,1) != M_rhs(i,j,k,1)) ||
800 (E_rhs(i,j,k) != E_rhs(i,j,k)))
859 omega(i, j, k) = eta * (gradu(1,0) - gradu(0,1));
876 BL_PROFILE(
"Integrator::Flame::TagCellsForRefinement");
879 Set::Scalar dr = sqrt(AMREX_D_TERM(DX[0] * DX[0], +DX[1] * DX[1], +DX[2] * DX[2]));
882 for (amrex::MFIter mfi(*(*
eta_mf)[lev],
true); mfi.isValid(); ++mfi) {
883 const amrex::Box& bx = mfi.tilebox();
884 amrex::Array4<char>
const& tags = a_tags.array(mfi);
885 amrex::Array4<const Set::Scalar>
const& eta = (*(*eta_mf)[lev]).array(mfi);
887 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
894 for (amrex::MFIter mfi(*
vorticity_mf[lev],
true); mfi.isValid(); ++mfi) {
895 const amrex::Box& bx = mfi.tilebox();
896 amrex::Array4<char>
const& tags = a_tags.array(mfi);
897 amrex::Array4<const Set::Scalar>
const& omega = (*
vorticity_mf[lev]).array(mfi);
899 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
907 for (amrex::MFIter mfi(*
velocity_mf[lev],
true); mfi.isValid(); ++mfi) {
908 const amrex::Box& bx = mfi.tilebox();
909 amrex::Array4<char>
const& tags = a_tags.array(mfi);
910 amrex::Array4<const Set::Scalar>
const& v = (*
velocity_mf[lev]).array(mfi);
912 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
920 for (amrex::MFIter mfi(*
pressure_mf[lev],
true); mfi.isValid(); ++mfi) {
921 const amrex::Box& bx = mfi.tilebox();
922 amrex::Array4<char>
const& tags = a_tags.array(mfi);
923 amrex::Array4<const Set::Scalar>
const& p = (*
pressure_mf[lev]).array(mfi);
925 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
933 for (amrex::MFIter mfi(*
density_mf[lev],
true); mfi.isValid(); ++mfi) {
934 const amrex::Box& bx = mfi.tilebox();
935 amrex::Array4<char>
const& tags = a_tags.array(mfi);
936 amrex::Array4<const Set::Scalar>
const& rho = (*
density_mf[lev]).array(mfi);
938 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {