diff --git a/src/Chemistry.hpp b/src/Chemistry.hpp index 47a396757..0e289148c 100644 --- a/src/Chemistry.hpp +++ b/src/Chemistry.hpp @@ -28,7 +28,7 @@ namespace quokka::chemistry AMREX_GPU_DEVICE void chemburner(burn_t &chemstate, Real dt); -template void computeChemistry(amrex::MultiFab &mf, const Real dt, const Real max_density_allowed, const Real min_density_allowed) +template auto computeChemistry(amrex::MultiFab &mf, const Real dt, const Real max_density_allowed, const Real min_density_allowed) -> bool { // Start off by assuming a successful burn. @@ -164,8 +164,12 @@ template void computeChemistry(amrex::MultiFab &mf, const R amrex::ParallelDescriptor::ReduceIntMin(burn_success); if (!burn_success) { - amrex::Abort("Burn failed in VODE. Aborting."); + // amrex::Abort("Burn failed in VODE. Aborting."); + amrex::Print() << "\t>> WARNING: Unsuccessful burn. Retrying hydro step." + << "\n"; } + + return burn_success; } } // namespace quokka::chemistry diff --git a/src/RadhydroSimulation.hpp b/src/RadhydroSimulation.hpp index c1b5654ed..92345d849 100644 --- a/src/RadhydroSimulation.hpp +++ b/src/RadhydroSimulation.hpp @@ -230,7 +230,7 @@ template class RadhydroSimulation : public AMRSimulation bool; void addStrangSplitSources(amrex::MultiFab &state, int lev, amrex::Real time, amrex::Real dt_lev); - void addStrangSplitSourcesWithBuiltin(amrex::MultiFab &state, int lev, amrex::Real time, amrex::Real dt_lev); + auto addStrangSplitSourcesWithBuiltin(amrex::MultiFab &state, int lev, amrex::Real time, amrex::Real dt_lev) -> bool; auto isCflViolated(int lev, amrex::Real time, amrex::Real dt_actual) -> bool; @@ -507,8 +507,12 @@ template void RadhydroSimulation::addStrangSplit } template -void RadhydroSimulation::addStrangSplitSourcesWithBuiltin(amrex::MultiFab &state, int lev, amrex::Real time, amrex::Real dt) +auto RadhydroSimulation::addStrangSplitSourcesWithBuiltin(amrex::MultiFab &state, int lev, amrex::Real time, amrex::Real dt) -> bool { + + // start by assuming chemistry burn is successful. + bool burn_success = true; // NOLINT + if (enableCooling_ == 1) { // compute cooling if (coolingTableType_ == "grackle") { @@ -523,12 +527,14 @@ void RadhydroSimulation::addStrangSplitSourcesWithBuiltin(amrex::Mult #ifdef PRIMORDIAL_CHEM if (enableChemistry_ == 1) { // compute chemistry - quokka::chemistry::computeChemistry(state, dt, max_density_allowed, min_density_allowed); + burn_success = quokka::chemistry::computeChemistry(state, dt, max_density_allowed, min_density_allowed); } #endif // compute user-specified sources addStrangSplitSources(state, lev, time, dt); + + return burn_success; } template @@ -1028,7 +1034,12 @@ auto RadhydroSimulation::advanceHydroAtLevel(amrex::MultiFab &state_o auto dx = geom[lev].CellSizeArray(); // do Strang split source terms (first half-step) - addStrangSplitSourcesWithBuiltin(state_old_cc_tmp, lev, time, 0.5 * dt_lev); + auto burn_success_first = addStrangSplitSourcesWithBuiltin(state_old_cc_tmp, lev, time, 0.5 * dt_lev); + + // check if burn failed in chemistry. If it did, return + if (!burn_success_first) { + return burn_success_first; + } // create temporary multifab for intermediate state amrex::MultiFab state_inter_cc_(grids[lev], dmap[lev], Physics_Indices::nvarTotal_cc, nghost_cc_); @@ -1290,10 +1301,10 @@ auto RadhydroSimulation::advanceHydroAtLevel(amrex::MultiFab &state_o #endif // do Strang split source terms (second half-step) - addStrangSplitSourcesWithBuiltin(state_new_cc_[lev], lev, time + dt_lev, 0.5 * dt_lev); + auto burn_success_second = addStrangSplitSourcesWithBuiltin(state_new_cc_[lev], lev, time + dt_lev, 0.5 * dt_lev); - // check if we have violated the CFL timestep - return !isCflViolated(lev, time, dt_lev); + // check if we have violated the CFL timestep or burn failed in chemistry + return (!isCflViolated(lev, time, dt_lev) && burn_success_second); } template