From fd00a030c87d0708b944f6412893735e8767fc22 Mon Sep 17 00:00:00 2001 From: adigitoleo Date: Mon, 16 Sep 2024 21:57:27 +1000 Subject: [PATCH] fix: Avoid zero-division under uniaxial compression This fixes a zero-division for some orientations under uniaxial compression, by catching the problematic values for slip invariants and returning null-values for orientation change and grain growth. There are some conditions where slip is simply not possible at all, and it is worth adding this check even though most Real World Problems are unlikely to hit this issue (strain rates would normally have pure shear, simple shear and compressional components combined). --- src/pydrex/core.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/pydrex/core.py b/src/pydrex/core.py index 9c8831b0..b3d09025 100644 --- a/src/pydrex/core.py +++ b/src/pydrex/core.py @@ -714,6 +714,12 @@ def _get_rotation_and_strain( """ crss = get_crss(phase, fabric) slip_invariants = _get_slip_invariants(strain_rate, orientation) + # Handle the case where all slip invariants are zero, + # thus no slip is possible (occurs for a few specific orientations and strain rates, + # for example in the case of uniaxial compression and an identity orientation + # i.e. grain orientation aligned to the coordinate system). + if min(slip_invariants) == max(slip_invariants) == 0.0: + return np.zeros((3, 3)), 0.0 if phase == MineralPhase.olivine: slip_indices = np.argsort(np.abs(slip_invariants / crss)) slip_rates = _get_slip_rates_olivine(