377 BL_PROFILE(
"Integrador::Flame::Advance");
391 -5.0 *
pf.w1 + 16.0 *
pf.w12 - 11.0 *
pf.w0,
392 14.0 *
pf.w1 - 32.0 *
pf.w12 + 18.0 *
pf.w0,
393 -8.0 *
pf.w1 + 16.0 *
pf.w12 - 8.0 *
pf.w0);
396 for (amrex::MFIter mfi(*
eta_mf[lev],
true); mfi.isValid(); ++mfi)
398 const amrex::Box& bx = mfi.tilebox();
400 amrex::Array4<Set::Scalar>
const& etanew = (*
eta_mf[lev]).array(mfi);
401 amrex::Array4<const Set::Scalar>
const& eta = (*
eta_old_mf[lev]).array(mfi);
402 amrex::Array4<const Set::Scalar>
const& phi = (*
phi_mf[lev]).array(mfi);
405 amrex::Array4<Set::Scalar>
const& tempnew = (*
temp_mf[lev]).array(mfi);
406 amrex::Array4<const Set::Scalar>
const& temp = (*
temp_old_mf[lev]).array(mfi);
407 amrex::Array4<Set::Scalar>
const& alpha = (*
alpha_mf[lev]).array(mfi);
408 amrex::Array4<Set::Scalar>
const& tempsnew = (*
temps_mf[lev]).array(mfi);
409 amrex::Array4<Set::Scalar>
const& temps = (*
temps_old_mf[lev]).array(mfi);
410 amrex::Array4<Set::Scalar>
const& laser = (*
laser_mf[lev]).array(mfi);
412 amrex::Array4<Set::Scalar>
const& mob = (*
mob_mf[lev]).array(mfi);
413 amrex::Array4<Set::Scalar>
const& mdot = (*
mdot_mf[lev]).array(mfi);
414 amrex::Array4<Set::Scalar>
const& heatflux = (*
heatflux_mf[lev]).array(mfi);
430 if (
pressure.arrhenius.dependency == 1) zeta_1 = zeta_2;
438 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
455 Set::Scalar df_deta = ((
pf.lambda /
pf.eps) * dw(eta(i, j, k)) -
pf.eps *
pf.kappa * eta_lap);
456 etanew(i, j, k) = eta(i, j, k) - mob(i, j, k) *
dt * df_deta;
457 if (etanew(i, j, k) <=
small) etanew(i, j, k) =
small;
459 alpha(i, j, k) = K /
rho / cp;
460 mdot(i, j, k) =
rho * fabs(eta(i, j, k) - etanew(i, j, k)) /
dt;
462 if (isnan(etanew(i, j, k)) || isnan(alpha(i, j, k)) || isnan(mdot(i, j, k))) {
463 Util::Message(
INFO, etanew(i, j, k),
"etanew contains nan (i=", i,
" j= ", j,
")");
465 Util::Message(
INFO, alpha(i, j, k),
"alpha contains nan (i=", i,
" j= ", j,
")");
470 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
481 qflux = k4 * phi_avg;
483 mdota = fabs(mdot(i, j, k));
484 mbase = tanh(4.0 * mdota / (mlocal));
486 heatflux(i, j, k) = (laser(i, j, k) * phi_avg +
thermal.hc * mbase * qflux) / K;
489 qflux = k1 * phi_avg +
490 k2 * (1.0 - phi_avg) +
491 (zeta_1 /
zeta) * exp(k3 * phi_avg * (1.0 - phi_avg));
492 mlocal = (
thermal.mlocal_ap) * phi_avg + (
thermal.mlocal_htpb) * (1.0 - phi_avg) +
thermal.mlocal_comb * phi_avg * (1.0 - phi_avg);
493 mdota = fabs(mdot(i, j, k));
494 mbase = tanh(4.0 * mdota / (mlocal));
497 heatflux(i, j, k) = (
thermal.hc * mbase * qflux + laser(i, j, k)) / K;
500 if (isnan(heatflux(i, j, k))) {
501 Util::Message(
INFO, heatflux(i, j, k),
"heat contains nan (i=", i,
" j= ", j,
")");
506 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
515 dTdt += grad_eta.dot(grad_temp * alpha(i, j, k));
516 dTdt += grad_alpha.dot(eta(i, j, k) * grad_temp);
517 dTdt += eta(i, j, k) * alpha(i, j, k) * lap_temp;
518 dTdt += alpha(i, j, k) * heatflux(i, j, k) * grad_eta_mag;
520 Tsolid = dTdt + temps(i, j, k) * (etanew(i, j, k) - eta(i, j, k)) /
dt;
521 tempsnew(i, j, k) = temps(i, j, k) +
dt * Tsolid;
522 tempnew(i, j, k) = etanew(i, j, k) * tempsnew(i, j, k) + (1.0 - etanew(i, j, k)) *
thermal.T_fluid;
523 if (isnan(tempsnew(i, j, k)) || isnan(temps(i, j, k))) {
524 Util::Message(
INFO, tempsnew(i, j, k),
"tempsnew contains nan (i=", i,
" j= ", j,
")");
525 Util::Message(
INFO, temps(i, j, k),
"temps contains nan (i=", i,
" j= ", j,
")");
531 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
538 else L =
thermal.m_ap * exp(-
thermal.E_ap / tempnew(i, j, k)) * phi_avg;
539 L +=
thermal.m_htpb * exp(-
thermal.E_htpb / tempnew(i, j, k)) * (1.0 - phi_avg);
541 if (tempnew(i, j, k) <=
thermal.bound) mob(i, j, k) = 0;
542 else mob(i, j, k) = L;
544 if (isnan(mob(i, j, k))) {
557 -5.0 *
pf.w1 + 16.0 *
pf.w12 - 11.0 *
pf.w0,
558 14.0 *
pf.w1 - 32.0 *
pf.w12 + 18.0 *
pf.w0,
559 -8.0 *
pf.w1 + 16.0 *
pf.w12 - 8.0 *
pf.w0
563 for (amrex::MFIter mfi(*
eta_mf[lev],
true); mfi.isValid(); ++mfi)
565 const amrex::Box& bx = mfi.tilebox();
567 amrex::Array4<Set::Scalar>
const& etanew = (*
eta_mf[lev]).array(mfi);
568 amrex::Array4<Set::Scalar>
const& eta = (*
eta_old_mf[lev]).array(mfi);
569 amrex::Array4<Set::Scalar>
const& phi = (*
phi_mf[lev]).array(mfi);
580 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
586 Set::Scalar angle = acos(grad_eta[0] / grad_eta.lpNorm<2>()) * 180 / 3.1415;
587 if (angle > 90) angle = angle - 90.0;
588 if (angle > 180) angle = angle - 180.0;
589 if (angle > 270) angle = angle - 270.0;
594 fs_actual = fmod_ap * phi(i, j, k)
595 + fmod_htpb * (1.0 - phi(i, j, k))
596 + 4.0 * fmod_comb * phi(i, j, k) * (1.0 - phi(i, j, k));
597 L = fs_actual /
pf.gamma / (
pf.w1 -
pf.w0);
600 Set::Scalar df_deta = ((
pf.lambda /
pf.eps) * dw(eta(i, j, k)) -
pf.eps *
pf.kappa * eta_lap);
601 etanew(i, j, k) = eta(i, j, k) - L *
dt * df_deta;
603 if (etanew(i, j, k) > eta(i, j, k)) etanew(i, j, k) = eta(i, j, k);
613 BL_PROFILE(
"Integrator::Flame::TagCellsForRefinement");
617 Set::Scalar dr = sqrt(AMREX_D_TERM(DX[0] * DX[0], +DX[1] * DX[1], +DX[2] * DX[2]));
620 for (amrex::MFIter mfi(*
eta_mf[lev],
true); mfi.isValid(); ++mfi)
622 const amrex::Box& bx = mfi.tilebox();
623 amrex::Array4<char>
const& tags = a_tags.array(mfi);
624 amrex::Array4<const Set::Scalar>
const& eta = (*
eta_mf[lev]).array(mfi);
626 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
630 tags(i, j, k) = amrex::TagBox::SET;
636 for (amrex::MFIter mfi(*
eta_mf[lev],
true); mfi.isValid(); ++mfi)
638 const amrex::Box& bx = mfi.tilebox();
639 amrex::Array4<char>
const& tags = a_tags.array(mfi);
640 amrex::Array4<const Set::Scalar>
const& phi = (*
phi_mf[lev]).array(mfi);
642 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
646 tags(i, j, k) = amrex::TagBox::SET;
654 for (amrex::MFIter mfi(*
temp_mf[lev],
true); mfi.isValid(); ++mfi)
656 const amrex::Box& bx = mfi.tilebox();
657 amrex::Array4<char>
const& tags = a_tags.array(mfi);
658 amrex::Array4<const Set::Scalar>
const& temp = (*
temp_mf[lev]).array(mfi);
659 amrex::Array4<const Set::Scalar>
const& eta = (*
eta_mf[lev]).array(mfi);
660 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
664 tags(i, j, k) = amrex::TagBox::SET;