From 01cbbc01b5dc8ac610c99f87d92382e999d818b5 Mon Sep 17 00:00:00 2001 From: Mladen Ivkovic <mladen.ivkovic@hotmail.com> Date: Tue, 16 May 2023 11:27:53 +0000 Subject: [PATCH] Rt gear unphysical check fix --- src/rt/GEAR/rt_unphysical.h | 58 ++++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/src/rt/GEAR/rt_unphysical.h b/src/rt/GEAR/rt_unphysical.h index 93728a3a86..83c31063d0 100644 --- a/src/rt/GEAR/rt_unphysical.h +++ b/src/rt/GEAR/rt_unphysical.h @@ -176,7 +176,14 @@ rt_check_unphysical_hyperbolic_flux(float flux[4][3]) { __attribute__((always_inline)) INLINE static void rt_check_unphysical_mass_fractions(struct part* restrict p) { - if (p->conserved.mass <= 0.f) { + /* For now, catch either mass or rho being zero. At the moment, they are not + * necessarily both zero. For example, an unphysical check may zero out both + * mass and density when it becomes negative in a hydro step. Once that + * happens, particles may gain mass through flux exchanges with other active + * particles, while they themselves remain inactive. The density of such + * inactive particles however remains zero until the particle is active + * again. See issue #833. */ + if (p->conserved.mass * p->rho <= 0.f) { /* Deal with unphysical situations and vacuum. */ p->rt_data.tchem.mass_fraction_HI = 0.f; p->rt_data.tchem.mass_fraction_HII = 0.f; @@ -186,31 +193,30 @@ rt_check_unphysical_mass_fractions(struct part* restrict p) { return; } - if (p->rt_data.tchem.mass_fraction_HI <= 0.f) { - if (p->rt_data.tchem.mass_fraction_HI < -1e4) - message("WARNING: Got negative HI mass fraction?"); - p->rt_data.tchem.mass_fraction_HI = RT_GEAR_TINY_MASS_FRACTION; - } - if (p->rt_data.tchem.mass_fraction_HII <= 0.f) { - if (p->rt_data.tchem.mass_fraction_HII < -1e4) - message("WARNING: Got negative HII mass fraction?"); - p->rt_data.tchem.mass_fraction_HII = RT_GEAR_TINY_MASS_FRACTION; - } - if (p->rt_data.tchem.mass_fraction_HeI <= 0.f) { - if (p->rt_data.tchem.mass_fraction_HeI < -1e4) - message("WARNING: Got negative HeI mass fraction?"); - p->rt_data.tchem.mass_fraction_HeI = RT_GEAR_TINY_MASS_FRACTION; - } - if (p->rt_data.tchem.mass_fraction_HeII <= 0.f) { - if (p->rt_data.tchem.mass_fraction_HeII < -1e4) - message("WARNING: Got negative HeII mass fraction?"); - p->rt_data.tchem.mass_fraction_HeII = RT_GEAR_TINY_MASS_FRACTION; - } - if (p->rt_data.tchem.mass_fraction_HeIII <= 0.f) { - if (p->rt_data.tchem.mass_fraction_HeIII < -1e4) - message("WARNING: Got negative HeIII mass fraction?"); - p->rt_data.tchem.mass_fraction_HeIII = RT_GEAR_TINY_MASS_FRACTION; - } +#ifdef SWIFT_RT_DEBUG_CHECKS + if (p->rt_data.tchem.mass_fraction_HI < -1e4) + message("WARNING: Got negative HI mass fraction?"); + if (p->rt_data.tchem.mass_fraction_HII < -1e4) + message("WARNING: Got negative HII mass fraction?"); + if (p->rt_data.tchem.mass_fraction_HeI < -1e4) + message("WARNING: Got negative HeI mass fraction?"); + if (p->rt_data.tchem.mass_fraction_HeII < -1e4) + message("WARNING: Got negative HeII mass fraction?"); + if (p->rt_data.tchem.mass_fraction_HeIII < -1e4) + message("WARNING: Got negative HeIII mass fraction?"); +#endif + + /* TODO: this should be a for loop with mass fractions being enums. */ + p->rt_data.tchem.mass_fraction_HI = + max(p->rt_data.tchem.mass_fraction_HI, RT_GEAR_TINY_MASS_FRACTION); + p->rt_data.tchem.mass_fraction_HII = + max(p->rt_data.tchem.mass_fraction_HII, RT_GEAR_TINY_MASS_FRACTION); + p->rt_data.tchem.mass_fraction_HeI = + max(p->rt_data.tchem.mass_fraction_HeI, RT_GEAR_TINY_MASS_FRACTION); + p->rt_data.tchem.mass_fraction_HeII = + max(p->rt_data.tchem.mass_fraction_HeII, RT_GEAR_TINY_MASS_FRACTION); + p->rt_data.tchem.mass_fraction_HeIII = + max(p->rt_data.tchem.mass_fraction_HeIII, RT_GEAR_TINY_MASS_FRACTION); const float XHI = p->rt_data.tchem.mass_fraction_HI; const float XHII = p->rt_data.tchem.mass_fraction_HII; -- GitLab