From c34d67c89095bbb90abc93234ecf10299131247d Mon Sep 17 00:00:00 2001 From: Louis Moresi Date: Mon, 30 Mar 2026 14:41:04 +1100 Subject: [PATCH 1/9] Add TransverseIsotropicVEPFlowModel for fault mechanics MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New constitutive model combining: - Rank-4 anisotropic viscosity tensor (η₀ bulk, η₁ fault-plane) - VE stress history with BDF + bdf_blend - Yield limiting on fault-plane shear (not full invariant) - All three yield modes: smooth (default), softmin, min, harmonic Inherits from TransverseIsotropicFlowModel and adds the VEP machinery from ViscoElasticPlasticFlowModel (BDF coefficients, stress history, corrected harmonic yield). Initial implementation — needs testing with fault-flow workflow. Underworld development team with AI support from Claude Code (https://claude.com/claude-code) --- src/underworld3/constitutive_models.py | 529 +++++++++++++++++++++++++ 1 file changed, 529 insertions(+) diff --git a/src/underworld3/constitutive_models.py b/src/underworld3/constitutive_models.py index 9a74d5222..a43dfe46a 100644 --- a/src/underworld3/constitutive_models.py +++ b/src/underworld3/constitutive_models.py @@ -2404,6 +2404,535 @@ def _object_viewer(self): ) +class TransverseIsotropicVEPFlowModel(TransverseIsotropicFlowModel): + r"""Transversely isotropic viscoelastic-plastic flow model for fault mechanics. + + Combines the anisotropic viscosity tensor from :class:`TransverseIsotropicFlowModel` + with viscoelastic stress history and plastic yield limiting on the fault plane. + + The anisotropic viscosity tensor uses two viscosities (η₀ for the bulk, + η₁ for fault-plane shear) and a director n̂ defining the weak plane. + The yield stress τ_y limits the shear stress resolved on the fault plane. + + Parameters + ---------- + unknowns : Unknowns + Solver unknowns (velocity, pressure). + order : int, default=1 + Time integration order for stress history (1 or 2). + material_name : str, optional + Name for disambiguation in multi-material setups. + + See Also + -------- + TransverseIsotropicFlowModel : Anisotropic viscous model (no yield/elasticity). + ViscoElasticPlasticFlowModel : Isotropic VEP model. + """ + + def __init__(self, unknowns, order=1, material_name: str = None): + + self._material_name = material_name + + # Stress history expressions + self._stress_star = expression( + r"{\tau^{*}}", None, + r"Lagrangian Stress at $t - \delta_t$", + ) + self._stress_2star = expression( + r"{\tau^{**}}", None, + r"Lagrangian Stress at $t - 2\delta_t$", + ) + self._E_eff = expression( + r"{\dot{\varepsilon}_{\textrm{eff}}}", None, + "Equivalent value of strain rate (accounting for stress history)", + ) + self._E_eff_inv_II = expression( + r"{\dot{\varepsilon}_{II,\textrm{eff}}}", None, + "Equivalent value of strain rate 2nd invariant (accounting for stress history)", + ) + + self._order = order + self._yield_mode = "smooth" + self._yield_softness = 0.5 + self._bdf_blend = 0.5 + self._max_dt_ratio_for_higher_order = 2.0 + + # Timestep (set by solver) + self._dt = expression(r"{\Delta t}", sympy.oo, "Timestep (set by solver)") + + # BDF coefficients (initialised to BDF-1) + self._bdf_c0 = expression(r"{c_0^{\mathrm{BDF}}}", sympy.Integer(1), "BDF leading coefficient") + self._bdf_c1 = expression(r"{c_1^{\mathrm{BDF}}}", sympy.Integer(-1), "BDF history coefficient 1") + self._bdf_c2 = expression(r"{c_2^{\mathrm{BDF}}}", sympy.Integer(0), "BDF history coefficient 2") + self._bdf_c3 = expression(r"{c_3^{\mathrm{BDF}}}", sympy.Integer(0), "BDF history coefficient 3") + + self._reset() + + super().__init__(unknowns, material_name=material_name) + + return + + class _Parameters(_ParameterBase, _ViscousParameterAlias): + """Parameters for transverse isotropic VEP model. + + Combines anisotropic parameters (η₀, η₁, director) with VEP + parameters (shear_modulus, yield_stress, etc.). + """ + + import underworld3.utilities._api_tools as api_tools + + # Anisotropic parameters + shear_viscosity_0 = api_tools.Parameter( + r"\eta_0", lambda inner_self: 1, + "Bulk shear viscosity", units="Pa*s", + ) + shear_viscosity_1 = api_tools.Parameter( + r"\eta_1", lambda inner_self: 1, + "Fault-plane shear viscosity", units="Pa*s", + ) + director = api_tools.Parameter( + r"\hat{n}", lambda inner_self: 1, + "Director orientation (fault normal)", units=None, + ) + + # Elastic parameter + shear_modulus = api_tools.Parameter( + R"{\mu}", lambda inner_self: sympy.oo, + "Shear modulus", units="Pa", + ) + + # Timestep (managed by solver) + @property + def dt_elastic(inner_self): + """Timestep for VE formulas. Set by the solver.""" + return inner_self._owning_model._dt + + @dt_elastic.setter + def dt_elastic(inner_self, value): + if hasattr(value, 'sym'): + inner_self._owning_model._dt.sym = value.sym + else: + inner_self._owning_model._dt.sym = value + + # Viscosity limits + shear_viscosity_min = api_tools.Parameter( + R"{\eta_{\textrm{min}}}", + lambda inner_self: -sympy.oo, + "Shear viscosity, minimum cutoff", units="Pa*s", + ) + + # Yield parameters (applied to fault-plane shear) + yield_stress = api_tools.Parameter( + R"{\tau_{y}}", lambda inner_self: sympy.oo, + "Yield stress (fault-plane shear)", units="Pa", + ) + yield_stress_min = api_tools.Parameter( + R"{\tau_{y, \mathrm{min}}}", + lambda inner_self: -sympy.oo, + "Yield stress minimum cutoff", units="Pa", + ) + strainrate_inv_II_min = api_tools.Parameter( + R"{\dot\varepsilon_{II,\mathrm{min}}}", + lambda inner_self: 0, + "Strain rate invariant minimum value", units="1/s", + ) + + def __init__(inner_self, _owning_model): + inner_self._owning_model = _owning_model + + inner_self._ve_effective_viscosity = expression( + R"{\eta_{\mathrm{eff}}}", None, + "Effective viscosity (elastic, fault-plane)", + ) + inner_self._t_relax = expression( + R"{t_{\mathrm{relax}}}", None, + "Maxwell relaxation time", + ) + + @property + def ve_effective_viscosity(inner_self): + r"""VE effective viscosity using η₁ (fault-plane viscosity).""" + if inner_self.shear_modulus == sympy.oo: + return inner_self.shear_viscosity_1 + + eta = inner_self.shear_viscosity_1 + mu = inner_self.shear_modulus + dt_e = inner_self.dt_elastic + c0 = inner_self._owning_model._bdf_c0 + + el_eff_visc = eta * mu * dt_e / (c0 * eta + mu * dt_e) + inner_self._ve_effective_viscosity.sym = el_eff_visc + return inner_self._ve_effective_viscosity + + @property + def t_relax(inner_self): + r"""Maxwell relaxation time: η₁ / μ.""" + inner_self._t_relax.sym = inner_self.shear_viscosity_1 / inner_self.shear_modulus + return inner_self._t_relax + + ## End of parameters + + @property + def is_elastic(self): + return self.Parameters.shear_modulus != sympy.oo + + @property + def is_viscoplastic(self): + return self.Parameters.yield_stress.sym != sympy.oo + + @property + def order(self): + """Time integration order (1 or 2).""" + return self._order + + @order.setter + def order(self, value): + """Set time integration order (warns if DFDt already created).""" + self._order = value + self._reset() + solver = getattr(self.Parameters, '_solver', None) + if solver is not None: + ddt = getattr(solver.Unknowns, 'DFDt', None) + if ddt is not None and ddt.order < value: + import warnings + warnings.warn( + f"Setting order={value} but DFDt was created with order={ddt.order}. " + f"Create the model with the desired order before assigning to the solver.", + UserWarning, stacklevel=2, + ) + elif ddt is not None: + solver._order = value + return + + @property + def effective_order(self): + """Effective order accounting for DDt history startup.""" + if self.Unknowns is not None and self.Unknowns.DFDt is not None: + ddt_eff = self.Unknowns.DFDt.effective_order + return min(self._order, ddt_eff) + return self._order + + def _update_bdf_coefficients(self): + """Update BDF coefficient UWexpressions with blending.""" + order = self.effective_order + + if self.Unknowns is not None and self.Unknowns.DFDt is not None: + dt_current = self.Parameters.dt_elastic + if hasattr(dt_current, 'sym'): + dt_current = dt_current.sym + + dt_history = self.Unknowns.DFDt._dt_history + if order >= 2 and len(dt_history) > 0 and dt_history[0] is not None: + try: + ratio = float(dt_current) / float(dt_history[0]) + if ratio > self._max_dt_ratio_for_higher_order: + order = 1 + except (TypeError, ZeroDivisionError): + pass + + coeffs = _bdf_coefficients(order, dt_current, dt_history) + + alpha = self._bdf_blend + if 0 < alpha < 1 and order >= 2: + coeffs_o1 = _bdf_coefficients(1, dt_current, dt_history) + while len(coeffs_o1) < len(coeffs): + coeffs_o1.append(sympy.Integer(0)) + coeffs = [ + (1 - alpha) * c1 + alpha * ck + for c1, ck in zip(coeffs_o1, coeffs) + ] + else: + coeffs = _bdf_coefficients(order, None, []) + + while len(coeffs) < 4: + coeffs.append(sympy.Integer(0)) + + self._bdf_c0.sym = coeffs[0] + self._bdf_c1.sym = coeffs[1] + self._bdf_c2.sym = coeffs[2] + self._bdf_c3.sym = coeffs[3] + + @property + def stress_star(self): + r"""Previous timestep stress from history.""" + if self.Unknowns.DFDt is not None: + self._stress_star.sym = self.Unknowns.DFDt.psi_star[0].sym + return self._stress_star + + @property + def E_eff(self): + r"""Effective strain rate including elastic history.""" + E = self.Unknowns.E + + if self.Unknowns.DFDt is not None and self.is_elastic: + mu_dt = self.Parameters.dt_elastic * self.Parameters.shear_modulus + bdf_cs = [self._bdf_c1, self._bdf_c2, self._bdf_c3] + for i in range(self.Unknowns.DFDt.order): + E += -bdf_cs[i] * self.Unknowns.DFDt.psi_star[i].sym / (2 * mu_dt) + + self._E_eff.sym = E + return self._E_eff + + @property + def E_eff_inv_II(self): + r"""Second invariant of effective strain rate.""" + E_eff = self.E_eff.sym + self._E_eff_inv_II.sym = sympy.sqrt((E_eff**2).trace() / 2) + return self._E_eff_inv_II + + @property + def viscosity(self): + r"""Effective viscosity for the fault-plane shear component. + + Applies the yield mode (smooth/softmin/min/harmonic) to η₁, + leaving η₀ (bulk) unchanged. The anisotropic tensor handles + the directional dependence. + """ + inner_self = self.Parameters + + if inner_self.yield_stress.sym == sympy.oo: + return inner_self.shear_viscosity_0 + + # η₁ is the fault-plane viscosity that gets yield-limited + eta_1_eff = inner_self.ve_effective_viscosity + + if self.is_viscoplastic: + vp_eff = self._plastic_effective_viscosity + if self._yield_mode == "harmonic": + eta_1_eff = 1 / (1 / eta_1_eff + 1 / vp_eff) + elif self._yield_mode == "smooth": + f = eta_1_eff / vp_eff + eta_1_eff = eta_1_eff * (1 + f) / (1 + f + f**2) + elif self._yield_mode == "softmin": + delta = self._yield_softness + f = eta_1_eff / vp_eff + g = (1 + f) / 2 + sympy.sqrt((f - 1)**2 + delta**2) / 2 + eta_1_eff = eta_1_eff / g + else: + eta_1_eff = sympy.Min(eta_1_eff, vp_eff) + + return inner_self.shear_viscosity_0 + + @property + def K(self): + """Effective stiffness for preconditioner.""" + return self.Parameters.shear_viscosity_0 + + @property + def _plastic_effective_viscosity(self): + """Plastic viscosity based on resolved shear strain rate.""" + parameters = self.Parameters + + if parameters.yield_stress == sympy.oo: + return sympy.oo + + Edot = self.E_eff.sym + strainrate_inv_II = expression( + R"{\dot\varepsilon_{II}'}", + sympy.sqrt((Edot**2).trace() / 2), + "Strain rate 2nd Invariant including elastic strain rate term", + ) + + tau_y = parameters.yield_stress + if parameters.yield_stress_min.sym != 0: + tau_y = sympy.Max(parameters.yield_stress_min, tau_y) + + if parameters.strainrate_inv_II_min.sym != 0: + viscosity_yield = tau_y / ( + 2 * (strainrate_inv_II + parameters.strainrate_inv_II_min) + ) + else: + viscosity_yield = tau_y / (2 * strainrate_inv_II) + + return viscosity_yield + + def _build_c_tensor(self): + """Build the anisotropic tensor with yield-limited η₁.""" + + if self._is_setup: + return + + d = self.dim + eta_0 = self.Parameters.shear_viscosity_0.sym + + # η₁ effective: VE + yield limited + eta_1_eff = self.Parameters.ve_effective_viscosity + + if self.is_viscoplastic: + vp_eff = self._plastic_effective_viscosity + if self._yield_mode == "harmonic": + eta_1_eff = 1 / (1 / eta_1_eff + 1 / vp_eff) + elif self._yield_mode == "smooth": + f = eta_1_eff / vp_eff + eta_1_eff = eta_1_eff * (1 + f) / (1 + f + f**2) + elif self._yield_mode == "softmin": + delta = self._yield_softness + f = eta_1_eff / vp_eff + g = (1 + f) / 2 + sympy.sqrt((f - 1)**2 + delta**2) / 2 + eta_1_eff = eta_1_eff / g + else: + eta_1_eff = sympy.Min(eta_1_eff, vp_eff) + + n = self.Parameters.director.sym + Delta = eta_0 - eta_1_eff + + identity = uw.maths.tensor.rank4_identity(d) + lambda_mat = sympy.MutableDenseNDimArray.zeros(d, d, d, d) + + for i in range(d): + for j in range(d): + for k in range(d): + for l in range(d): + base_val = 2 * identity[i, j, k, l] * eta_0 + aniso_correction = ( + 2 * Delta * ( + (n[i] * n[k] * int(j == l) + + n[j] * n[k] * int(l == i) + + n[i] * n[l] * int(j == k) + + n[j] * n[l] * int(k == i)) / 2 + - 2 * n[i] * n[j] * n[k] * n[l] + ) + ) + val = base_val - aniso_correction + if hasattr(val, '__getitem__') and not isinstance(val, (sympy.MatrixBase, sympy.NDimArray)): + val = sympy.Mul(sympy.S.One, val, evaluate=False) + lambda_mat[i, j, k, l] = val + + lambda_mat = sympy.simplify(uw.maths.tensor.rank4_to_mandel(lambda_mat, d)) + self._c = uw.maths.tensor.mandel_to_rank4(lambda_mat, d) + + self._is_setup = True + self._solver_is_setup = False + return + + @property + def flux(self): + """Stress flux for the weak form.""" + # Guard: if director not set yet, return simple viscous flux + n = self.Parameters.director.sym + if not hasattr(n, '__len__') or isinstance(n, (int, float, sympy.Basic)) and not isinstance(n, sympy.MatrixBase): + edot = self.grad_u + return 2 * self.Parameters.shear_viscosity_0 * edot + return self.stress() + + def stress_projection(self): + """VE stress without plastic correction (for history storage).""" + edot = self.grad_u + # Use the full anisotropic tensor but without yield + self._build_c_tensor_ve() + return self._q(edot) + + def _build_c_tensor_ve(self): + """Build anisotropic tensor with VE η₁ only (no yield).""" + d = self.dim + eta_0 = self.Parameters.shear_viscosity_0.sym + eta_1_ve = self.Parameters.ve_effective_viscosity + n = self.Parameters.director.sym + Delta = eta_0 - eta_1_ve + + identity = uw.maths.tensor.rank4_identity(d) + lambda_mat = sympy.MutableDenseNDimArray.zeros(d, d, d, d) + + for i in range(d): + for j in range(d): + for k in range(d): + for l in range(d): + base_val = 2 * identity[i, j, k, l] * eta_0 + aniso_correction = ( + 2 * Delta * ( + (n[i] * n[k] * int(j == l) + + n[j] * n[k] * int(l == i) + + n[i] * n[l] * int(j == k) + + n[j] * n[l] * int(k == i)) / 2 + - 2 * n[i] * n[j] * n[k] * n[l] + ) + ) + val = base_val - aniso_correction + if hasattr(val, '__getitem__') and not isinstance(val, (sympy.MatrixBase, sympy.NDimArray)): + val = sympy.Mul(sympy.S.One, val, evaluate=False) + lambda_mat[i, j, k, l] = val + + lambda_mat = sympy.simplify(uw.maths.tensor.rank4_to_mandel(lambda_mat, d)) + self._c_ve = uw.maths.tensor.mandel_to_rank4(lambda_mat, d) + + def stress(self): + """Viscoelastic-plastic anisotropic stress for the weak form. + + Uses the anisotropic tensor with yield-limited η₁ and adds + BDF stress history terms. + """ + self._build_c_tensor() + edot = self.grad_u + stress = self._q(edot) + + if self.Unknowns.DFDt is not None and self.is_elastic: + mu_dt = self.Parameters.dt_elastic * self.Parameters.shear_modulus + bdf_cs = [self._bdf_c1, self._bdf_c2, self._bdf_c3] + + # History uses the yield-limited tensor applied to stored stress + for i in range(self.Unknowns.DFDt.order): + # The history contribution: apply C tensor to (-cᵢ·σ*/2μdt) + # But σ* is already the full stress tensor, so we scale it + # by the ratio of current to VE viscosity + eta_ve = self.Parameters.ve_effective_viscosity + eta_0 = self.Parameters.shear_viscosity_0 + # Simple scaling: history contribution proportional to VE viscosity + stress += 2 * eta_ve * ( + -bdf_cs[i] * self.Unknowns.DFDt.psi_star[i].sym / (2 * mu_dt) + ) + + return stress + + @property + def yield_mode(self): + r"""How to apply yield limiting to the fault-plane viscosity. + + Same options as :class:`ViscoElasticPlasticFlowModel`: + ``"smooth"`` (default), ``"softmin"``, ``"harmonic"``, ``"min"``. + """ + return self._yield_mode + + @yield_mode.setter + def yield_mode(self, value): + if value not in ("min", "harmonic", "smooth", "softmin"): + raise ValueError(f"yield_mode must be 'min', 'harmonic', 'smooth', or 'softmin', got '{value}'") + self._yield_mode = value + self._reset() + + @property + def yield_softness(self): + """Regularisation parameter δ for softmin mode.""" + return self._yield_softness + + @yield_softness.setter + def yield_softness(self, value): + self._yield_softness = value + self._reset() + + @property + def bdf_blend(self): + """BDF coefficient blending: 0=pure O1, 0.5=default, 1=pure O2.""" + return self._bdf_blend + + @bdf_blend.setter + def bdf_blend(self, value): + self._bdf_blend = value + + @property + def requires_stress_history(self): + """Transverse isotropic VEP requires stress history tracking.""" + return True + + @property + def plastic_fraction(self): + """Fraction of strain rate that is plastic.""" + eta_1_ve = self.Parameters.ve_effective_viscosity + eta_1_eff = self.viscosity + # viscosity property returns η₀, need to compare η₁ effective vs η₁ ve + # This is approximate for the anisotropic case + return sympy.Max(0, 1 - eta_1_eff / eta_1_ve.sym if hasattr(eta_1_ve, 'sym') else 0) + + class MultiMaterialConstitutiveModel(Constitutive_Model): r""" Multi-material constitutive model using level-set weighted flux averaging. From 753d7b2d0b786380879739c97b7e5b49509679ae Mon Sep 17 00:00:00 2001 From: Louis Moresi Date: Mon, 30 Mar 2026 15:28:26 +1100 Subject: [PATCH 2/9] Default director to unit vector, fix parent class default Both TransverseIsotropicFlowModel and TransverseIsotropicVEPFlowModel now default the director to [0,...,0,1] (dimension-dependent) instead of scalar 1, which caused TypeError in tensor construction. Underworld development team with AI support from Claude Code (https://claude.com/claude-code) --- src/underworld3/constitutive_models.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/underworld3/constitutive_models.py b/src/underworld3/constitutive_models.py index a43dfe46a..c8aa58527 100644 --- a/src/underworld3/constitutive_models.py +++ b/src/underworld3/constitutive_models.py @@ -2283,7 +2283,7 @@ class _Parameters(_ParameterBase, _ViscousParameterAlias): director = api_tools.Parameter( r"\hat{n}", - lambda inner_self: 1, + lambda inner_self: sympy.Matrix([0] * (inner_self._owning_model.dim - 1) + [1]), "Director orientation", units=None, # Dimensionless unit vector ) @@ -2491,7 +2491,8 @@ class _Parameters(_ParameterBase, _ViscousParameterAlias): "Fault-plane shear viscosity", units="Pa*s", ) director = api_tools.Parameter( - r"\hat{n}", lambda inner_self: 1, + r"\hat{n}", + lambda inner_self: sympy.Matrix([0] * (inner_self._owning_model.dim - 1) + [1]), "Director orientation (fault normal)", units=None, ) @@ -2808,11 +2809,6 @@ def _build_c_tensor(self): @property def flux(self): """Stress flux for the weak form.""" - # Guard: if director not set yet, return simple viscous flux - n = self.Parameters.director.sym - if not hasattr(n, '__len__') or isinstance(n, (int, float, sympy.Basic)) and not isinstance(n, sympy.MatrixBase): - edot = self.grad_u - return 2 * self.Parameters.shear_viscosity_0 * edot return self.stress() def stress_projection(self): From 1496b776f2d106823b5458ffdd58e2e55a8bf6ae Mon Sep 17 00:00:00 2001 From: Louis Moresi Date: Tue, 31 Mar 2026 13:39:45 +1100 Subject: [PATCH 3/9] TI-VEP: fix stress history and parameter comparison bugs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The stress() method used raw η_ve for VE history terms instead of the yield-limited η₁_eff. This prevented yield from capping stress — the isotropic VEP uses yield-limited viscosity for both tensor and history terms. Now the TI-VEP matches the isotropic VEP step-by-step. Also fix is_elastic, is_viscoplastic, ve_effective_viscosity, and _plastic_effective_viscosity to use .sym identity checks (is sympy.oo) instead of object-level comparisons that always returned True/False regardless of the actual parameter value. Validated: TI-VEP matches isotropic VEP to 4 d.p. across 15+ steps with smooth yield mode. Min yield mode diverges (58/80 steps) — smooth is the correct default. Underworld development team with AI support from Claude Code --- src/underworld3/constitutive_models.py | 51 +++++++++++++++++++------- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/src/underworld3/constitutive_models.py b/src/underworld3/constitutive_models.py index c8aa58527..e908aaaa5 100644 --- a/src/underworld3/constitutive_models.py +++ b/src/underworld3/constitutive_models.py @@ -2553,7 +2553,8 @@ def __init__(inner_self, _owning_model): @property def ve_effective_viscosity(inner_self): r"""VE effective viscosity using η₁ (fault-plane viscosity).""" - if inner_self.shear_modulus == sympy.oo: + mu_val = inner_self.shear_modulus.sym if hasattr(inner_self.shear_modulus, 'sym') else inner_self.shear_modulus + if mu_val is sympy.oo: return inner_self.shear_viscosity_1 eta = inner_self.shear_viscosity_1 @@ -2575,11 +2576,17 @@ def t_relax(inner_self): @property def is_elastic(self): - return self.Parameters.shear_modulus != sympy.oo + """True if elastic behavior is active (finite shear_modulus).""" + if self.Parameters.shear_modulus.sym is sympy.oo: + return False + return True @property def is_viscoplastic(self): - return self.Parameters.yield_stress.sym != sympy.oo + """True if plastic yielding is active (finite yield_stress).""" + if self.Parameters.yield_stress.sym is sympy.oo: + return False + return True @property def order(self): @@ -2724,7 +2731,8 @@ def _plastic_effective_viscosity(self): """Plastic viscosity based on resolved shear strain rate.""" parameters = self.Parameters - if parameters.yield_stress == sympy.oo: + ty_val = parameters.yield_stress.sym if hasattr(parameters.yield_stress, 'sym') else parameters.yield_stress + if ty_val is sympy.oo: return sympy.oo Edot = self.E_eff.sym @@ -2854,8 +2862,11 @@ def _build_c_tensor_ve(self): def stress(self): """Viscoelastic-plastic anisotropic stress for the weak form. - Uses the anisotropic tensor with yield-limited η₁ and adds - BDF stress history terms. + Matches isotropic VEP pattern: tensor contraction for current strain + rate, scalar yield-limited viscosity for VE history terms. The tensor + C(η₁_eff) handles anisotropy; the history uses the same η₁_eff as + a scalar multiplier (consistent with how isotropic VEP uses + self.viscosity for both). """ self._build_c_tensor() edot = self.grad_u @@ -2865,15 +2876,27 @@ def stress(self): mu_dt = self.Parameters.dt_elastic * self.Parameters.shear_modulus bdf_cs = [self._bdf_c1, self._bdf_c2, self._bdf_c3] - # History uses the yield-limited tensor applied to stored stress + # Compute yield-limited η₁ — same expression used in tensor + eta_1_eff = self.Parameters.ve_effective_viscosity + if self.is_viscoplastic: + vp_eff = self._plastic_effective_viscosity + if self._yield_mode == "harmonic": + eta_1_eff = 1 / (1 / eta_1_eff + 1 / vp_eff) + elif self._yield_mode == "smooth": + f = eta_1_eff / vp_eff + eta_1_eff = eta_1_eff * (1 + f) / (1 + f + f**2) + elif self._yield_mode == "softmin": + delta = self._yield_softness + f = eta_1_eff / vp_eff + g = (1 + f) / 2 + sympy.sqrt((f - 1)**2 + delta**2) / 2 + eta_1_eff = eta_1_eff / g + else: + eta_1_eff = sympy.Min(eta_1_eff, vp_eff) + for i in range(self.Unknowns.DFDt.order): - # The history contribution: apply C tensor to (-cᵢ·σ*/2μdt) - # But σ* is already the full stress tensor, so we scale it - # by the ratio of current to VE viscosity - eta_ve = self.Parameters.ve_effective_viscosity - eta_0 = self.Parameters.shear_viscosity_0 - # Simple scaling: history contribution proportional to VE viscosity - stress += 2 * eta_ve * ( + # History terms use yield-limited viscosity as scalar, + # matching isotropic VEP: 2 * viscosity * (-c_i * σ* / 2μdt) + stress += 2 * eta_1_eff * ( -bdf_cs[i] * self.Unknowns.DFDt.psi_star[i].sym / (2 * mu_dt) ) From 162a5120fc4c4076aa3947f4ab52d3f71bc87f58 Mon Sep 17 00:00:00 2001 From: Louis Moresi Date: Tue, 31 Mar 2026 20:57:11 +1100 Subject: [PATCH 4/9] =?UTF-8?q?TI-VEP:=20resolved=20fault-plane=20yield,?= =?UTF-8?q?=20VE=20tensor,=20and=20C:=CE=B5=CC=87=5Feff=20stress?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three coupled fixes for the TransverseIsotropicVEPFlowModel: 1. Yield criterion uses resolved fault-plane shear strain rate γ̇ = t·ε̇_eff·n instead of global invariant ε̇_II. This ensures yield activates when fault-plane shear exceeds τ_y regardless of fault orientation (validated at 15 degrees). 2. Tensor base uses VE effective η₀_ve = η₀·μ·dt/(c₀·η₀+μ·dt) instead of raw η₀. This ensures Δ = η₀_ve - η₁_eff = 0 when η₁ = η₀ and yield is inactive (no spurious anisotropy). 3. Stress formula simplified to σ = C(η₀_ve, η₁_eff) : ε̇_eff. The tensor naturally separates normal (VE, η₀_ve) and shear (VEP, η₁_eff) components on the fault plane. No separate scalar history terms needed. Validated: 15 degree rotated fault, η₁=η₀=1, τ_y=0.15. Resolved fault shear caps at τ_y while normal stress grows as pure VE. Stable with 1 SNES iteration (smooth yield mode). Underworld development team with AI support from Claude Code --- src/underworld3/constitutive_models.py | 89 ++++++++++++++------------ 1 file changed, 49 insertions(+), 40 deletions(-) diff --git a/src/underworld3/constitutive_models.py b/src/underworld3/constitutive_models.py index e908aaaa5..49a050a64 100644 --- a/src/underworld3/constitutive_models.py +++ b/src/underworld3/constitutive_models.py @@ -2728,7 +2728,16 @@ def K(self): @property def _plastic_effective_viscosity(self): - """Plastic viscosity based on resolved shear strain rate.""" + """Plastic viscosity from resolved fault-plane shear strain rate. + + Uses γ̇ = t · ε̇_eff · n (shear strain rate resolved on the fault + plane) rather than the global invariant ε̇_II. This ensures yield + activates when the fault-plane shear exceeds τ_y, regardless of + fault orientation. + + The formula 2η₁_pl = τ_y / γ̇ is the same pattern as isotropic + Drucker-Prager but projected onto the fault plane. + """ parameters = self.Parameters ty_val = parameters.yield_stress.sym if hasattr(parameters.yield_stress, 'sym') else parameters.yield_stress @@ -2736,11 +2745,16 @@ def _plastic_effective_viscosity(self): return sympy.oo Edot = self.E_eff.sym - strainrate_inv_II = expression( - R"{\dot\varepsilon_{II}'}", - sympy.sqrt((Edot**2).trace() / 2), - "Strain rate 2nd Invariant including elastic strain rate term", - ) + + # Resolve strain rate onto fault plane: γ̇ = t · ε̇ · n + n = parameters.director.sym + # Fault-parallel direction (2D: rotate normal 90° clockwise) + t_fault = sympy.Matrix([n[1], -n[0]]) + + gamma_dot = (t_fault.T * Edot * n)[0, 0] + + # Use absolute value — shear can be in either sense + gamma_dot_abs = sympy.sqrt(gamma_dot**2) tau_y = parameters.yield_stress if parameters.yield_stress_min.sym != 0: @@ -2748,23 +2762,41 @@ def _plastic_effective_viscosity(self): if parameters.strainrate_inv_II_min.sym != 0: viscosity_yield = tau_y / ( - 2 * (strainrate_inv_II + parameters.strainrate_inv_II_min) + 2 * (gamma_dot_abs + parameters.strainrate_inv_II_min) ) else: - viscosity_yield = tau_y / (2 * strainrate_inv_II) + viscosity_yield = tau_y / (2 * gamma_dot_abs) return viscosity_yield def _build_c_tensor(self): - """Build the anisotropic tensor with yield-limited η₁.""" + """Build the anisotropic tensor with VE effective viscosities. + + Both η₀ and η₁ are replaced by their VE effective values: + η₀_ve = η₀·μ·dt / (c₀·η₀ + μ·dt) + η₁_ve = η₁·μ·dt / (c₀·η₁ + μ·dt) + Then η₁_ve is further yield-limited to η₁_eff. This ensures + Δ = η₀_ve - η₁_eff = 0 when η₁ = η₀ and yield is inactive. + """ if self._is_setup: return d = self.dim - eta_0 = self.Parameters.shear_viscosity_0.sym - # η₁ effective: VE + yield limited + # η₀: VE effective (no yield) + eta_0_raw = self.Parameters.shear_viscosity_0 + mu = self.Parameters.shear_modulus + dt_e = self.Parameters.dt_elastic + c0 = self._bdf_c0 + + mu_val = mu.sym if hasattr(mu, 'sym') else mu + if mu_val is sympy.oo: + eta_0 = eta_0_raw.sym if hasattr(eta_0_raw, 'sym') else eta_0_raw + else: + eta_0 = eta_0_raw * mu * dt_e / (c0 * eta_0_raw + mu * dt_e) + + # η₁: VE effective + yield limited eta_1_eff = self.Parameters.ve_effective_viscosity if self.is_viscoplastic: @@ -2869,36 +2901,13 @@ def stress(self): self.viscosity for both). """ self._build_c_tensor() - edot = self.grad_u - stress = self._q(edot) - if self.Unknowns.DFDt is not None and self.is_elastic: - mu_dt = self.Parameters.dt_elastic * self.Parameters.shear_modulus - bdf_cs = [self._bdf_c1, self._bdf_c2, self._bdf_c3] - - # Compute yield-limited η₁ — same expression used in tensor - eta_1_eff = self.Parameters.ve_effective_viscosity - if self.is_viscoplastic: - vp_eff = self._plastic_effective_viscosity - if self._yield_mode == "harmonic": - eta_1_eff = 1 / (1 / eta_1_eff + 1 / vp_eff) - elif self._yield_mode == "smooth": - f = eta_1_eff / vp_eff - eta_1_eff = eta_1_eff * (1 + f) / (1 + f + f**2) - elif self._yield_mode == "softmin": - delta = self._yield_softness - f = eta_1_eff / vp_eff - g = (1 + f) / 2 + sympy.sqrt((f - 1)**2 + delta**2) / 2 - eta_1_eff = eta_1_eff / g - else: - eta_1_eff = sympy.Min(eta_1_eff, vp_eff) - - for i in range(self.Unknowns.DFDt.order): - # History terms use yield-limited viscosity as scalar, - # matching isotropic VEP: 2 * viscosity * (-c_i * σ* / 2μdt) - stress += 2 * eta_1_eff * ( - -bdf_cs[i] * self.Unknowns.DFDt.psi_star[i].sym / (2 * mu_dt) - ) + # Apply the anisotropic tensor to the effective strain rate + # (current + VE history): σ = C(η₀_ve, η₁_eff) : ε̇_eff + # This is the correct VE formula — the tensor handles anisotropy + # for both current and history contributions uniformly. + edot_eff = self.E_eff.sym if hasattr(self.E_eff, 'sym') else self.E_eff + stress = self._q(edot_eff) return stress From 3eaac53deb5003b43fdfedb86ae0285adcf081d7 Mon Sep 17 00:00:00 2001 From: Louis Moresi Date: Tue, 31 Mar 2026 21:23:29 +1100 Subject: [PATCH 5/9] TI-VEP: generalise resolved shear to 2D/3D via Pythagoras MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the 2D-specific tangent vector (t = [n₁, -n₀]) with the dimension-independent Pythagoras approach: T = ε̇_eff · n (traction on fault) ε̇_n = T · n (normal component) |γ̇| = √(|T|² - ε̇_n²) (in-plane shear magnitude) This works in any dimension without constructing an explicit tangent vector (which is not unique in 3D). Verified identical results to the 2D formulation on the 15° rotated fault test. Underworld development team with AI support from Claude Code --- src/underworld3/constitutive_models.py | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/underworld3/constitutive_models.py b/src/underworld3/constitutive_models.py index 49a050a64..1d051457c 100644 --- a/src/underworld3/constitutive_models.py +++ b/src/underworld3/constitutive_models.py @@ -2730,12 +2730,13 @@ def K(self): def _plastic_effective_viscosity(self): """Plastic viscosity from resolved fault-plane shear strain rate. - Uses γ̇ = t · ε̇_eff · n (shear strain rate resolved on the fault - plane) rather than the global invariant ε̇_II. This ensures yield - activates when the fault-plane shear exceeds τ_y, regardless of - fault orientation. + Computes the in-plane shear magnitude using Pythagoras: + T = ε̇_eff · n (traction-like vector on fault) + ε̇_n = T · n (normal component) + |γ̇| = √(|T|² - ε̇_n²) (in-plane shear magnitude) - The formula 2η₁_pl = τ_y / γ̇ is the same pattern as isotropic + This works in both 2D and 3D — no explicit tangent vector needed. + The formula 2η₁_pl = τ_y / |γ̇| is the same pattern as isotropic Drucker-Prager but projected onto the fault plane. """ parameters = self.Parameters @@ -2746,15 +2747,13 @@ def _plastic_effective_viscosity(self): Edot = self.E_eff.sym - # Resolve strain rate onto fault plane: γ̇ = t · ε̇ · n + # Resolve strain rate onto fault plane via Pythagoras n = parameters.director.sym - # Fault-parallel direction (2D: rotate normal 90° clockwise) - t_fault = sympy.Matrix([n[1], -n[0]]) - - gamma_dot = (t_fault.T * Edot * n)[0, 0] - - # Use absolute value — shear can be in either sense - gamma_dot_abs = sympy.sqrt(gamma_dot**2) + T = Edot * n # "traction" vector on fault + edot_n = (n.T * T)[0, 0] # normal component + T_sq = (T.T * T)[0, 0] # |T|² + gamma_dot_sq = T_sq - edot_n**2 # in-plane shear² + gamma_dot_abs = sympy.sqrt(sympy.Max(gamma_dot_sq, 0)) tau_y = parameters.yield_stress if parameters.yield_stress_min.sym != 0: From 44076d925f31aa3ef5442a5ce3d0a399c2b274ae Mon Sep 17 00:00:00 2001 From: lmoresi Date: Sun, 12 Apr 2026 10:19:24 -0600 Subject: [PATCH 6/9] Fix softmin yield mode: correct offset, default delta, remove simplify Three fixes to the softmin yield approximation: 1. Corrected softmin formula so g(0) = 1 exactly. The old formula g = (1+f)/2 + sqrt((f-1)^2 + d^2)/2 gives g(0) = 1.06 for d=0.5, causing spurious yield correction below onset. New formula subtracts the constant offset: g = 1 + softplus(f-1) - softplus(-1). 2. Changed default yield_softness from 0.5 to 0.1. The old value was too soft for cases where tau_y is a significant fraction of the viscous stress (f_ss < 2), causing 15-50% undershoot of the yield cap. With delta=0.1, all tested cases reach within 1-2% of tau_y. 3. Removed sympy.simplify() from TI-VEP _build_c_tensor and _build_c_tensor_ve. These caused hangs with sympy.Min expressions and are unnecessary (the Mandel conversion is correct without simplification, consistent with the fix already applied elsewhere). Validated: 0-degree and 15-degree fault benchmarks with tau_y = 0.15 and 0.30 all reach within 1-2% of analytical yield cap. Underworld development team with AI support from Claude Code --- src/underworld3/constitutive_models.py | 28 +++++++++++++++++--------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/underworld3/constitutive_models.py b/src/underworld3/constitutive_models.py index 1d051457c..af2d09e5a 100644 --- a/src/underworld3/constitutive_models.py +++ b/src/underworld3/constitutive_models.py @@ -1111,7 +1111,7 @@ def __init__(self, unknowns, order=1, material_name: str = None): self._order = order self._yield_mode = "smooth" # "min", "harmonic", "smooth", or "softmin" - self._yield_softness = 0.5 # δ parameter for "softmin" mode + self._yield_softness = 0.1 # δ parameter for "softmin" mode self._bdf_blend = None # auto: 1.0 for VE, 0.75 for VEP # Timestep — set by the solver before each solve(). Not a user parameter. @@ -1484,12 +1484,15 @@ def viscosity(self): elif self._yield_mode == "softmin": # Smooth approximation to Min(η_ve, η_pl): # η_eff = η_ve / g(f) - # g(f) = (1+f)/2 + √((f-1)² + δ²)/2 ≈ max(1, f) - # where f = η_ve/η_pl and δ = yield_softness. + # g(f) = 1 + softplus(f-1) - softplus(-1) ≈ max(1, f) + # where softplus(x) = (x + √(x² + δ²))/2 and f = η_ve/η_pl. + # Corrected so g(0) = 1 exactly (no spurious yield below onset). # Approaches exact Min as δ→0. No Min/Max in expression. delta = self._yield_softness f = effective_viscosity / vp_effective_viscosity - g = (1 + f) / 2 + sympy.sqrt((f - 1)**2 + delta**2) / 2 + import math + offset = (-1 + math.sqrt(1 + delta**2)) / 2 + g = 1 + (f - 1 + sympy.sqrt((f - 1)**2 + delta**2)) / 2 - offset effective_viscosity = effective_viscosity / g else: effective_viscosity = sympy.Min(effective_viscosity, vp_effective_viscosity) @@ -1745,7 +1748,8 @@ def yield_softness(self): Smaller values → sharper yield (closer to Min, less robust). Larger values → smoother transition (more robust, lower stress). - Default 0.5. Only used when ``yield_mode == "softmin"``. + Default 0.1. Only used when ``yield_mode == "softmin"``. + Increase toward 0.5 if SNES convergence is difficult at yield onset. """ return self._yield_softness @@ -2453,7 +2457,7 @@ def __init__(self, unknowns, order=1, material_name: str = None): self._order = order self._yield_mode = "smooth" - self._yield_softness = 0.5 + self._yield_softness = 0.1 self._bdf_blend = 0.5 self._max_dt_ratio_for_higher_order = 2.0 @@ -2714,7 +2718,9 @@ def viscosity(self): elif self._yield_mode == "softmin": delta = self._yield_softness f = eta_1_eff / vp_eff - g = (1 + f) / 2 + sympy.sqrt((f - 1)**2 + delta**2) / 2 + import math + offset = (-1 + math.sqrt(1 + delta**2)) / 2 + g = 1 + (f - 1 + sympy.sqrt((f - 1)**2 + delta**2)) / 2 - offset eta_1_eff = eta_1_eff / g else: eta_1_eff = sympy.Min(eta_1_eff, vp_eff) @@ -2808,7 +2814,9 @@ def _build_c_tensor(self): elif self._yield_mode == "softmin": delta = self._yield_softness f = eta_1_eff / vp_eff - g = (1 + f) / 2 + sympy.sqrt((f - 1)**2 + delta**2) / 2 + import math + offset = (-1 + math.sqrt(1 + delta**2)) / 2 + g = 1 + (f - 1 + sympy.sqrt((f - 1)**2 + delta**2)) / 2 - offset eta_1_eff = eta_1_eff / g else: eta_1_eff = sympy.Min(eta_1_eff, vp_eff) @@ -2838,7 +2846,7 @@ def _build_c_tensor(self): val = sympy.Mul(sympy.S.One, val, evaluate=False) lambda_mat[i, j, k, l] = val - lambda_mat = sympy.simplify(uw.maths.tensor.rank4_to_mandel(lambda_mat, d)) + lambda_mat = uw.maths.tensor.rank4_to_mandel(lambda_mat, d) self._c = uw.maths.tensor.mandel_to_rank4(lambda_mat, d) self._is_setup = True @@ -2887,7 +2895,7 @@ def _build_c_tensor_ve(self): val = sympy.Mul(sympy.S.One, val, evaluate=False) lambda_mat[i, j, k, l] = val - lambda_mat = sympy.simplify(uw.maths.tensor.rank4_to_mandel(lambda_mat, d)) + lambda_mat = uw.maths.tensor.rank4_to_mandel(lambda_mat, d) self._c_ve = uw.maths.tensor.mandel_to_rank4(lambda_mat, d) def stress(self): From 2c4fe8bd8f43a73cc03a377d9bc756ca980b951e Mon Sep 17 00:00:00 2001 From: lmoresi Date: Sun, 12 Apr 2026 10:20:45 -0600 Subject: [PATCH 7/9] Add TI-VEP documentation, benchmark figure, and angled fault example Technical document (docs/advanced/vep-transverse-isotropy-faults.md): - Mathematical formulation from isotropic VEP through TI tensor to combined TI-VEP with resolved fault-plane yield criterion - Pythagoras formulation for dimension-independent resolved shear - Softmin yield approximation with corrected offset formula - Guidance on choosing the sharpness parameter delta - Benchmark results at 0 and 15 degree fault angles Benchmark figure (docs/advanced/figures/ti_vep_benchmark_final.png): - 0-degree and 15-degree fault, tau_y = 0.15 and 0.30 - Analytical VE curves with yield cap overlay - Shows resolved shear capping at tau_y while global stress grows Example (Ex_TI_VEP_Angled_Fault.py): - 2D shear box with 15-degree embedded fault - TransverseIsotropicVEPFlowModel with softmin yield - Time-stepping with stress monitoring and matplotlib output Underworld development team with AI support from Claude Code --- .../figures/ti_vep_benchmark_final.png | Bin 0 -> 118984 bytes docs/advanced/index.md | 7 + .../vep-transverse-isotropy-faults.md | 265 ++++++++++++++ .../intermediate/Ex_TI_VEP_Angled_Fault.py | 330 ++++++++++++++++++ 4 files changed, 602 insertions(+) create mode 100644 docs/advanced/figures/ti_vep_benchmark_final.png create mode 100644 docs/advanced/vep-transverse-isotropy-faults.md create mode 100644 docs/examples/solid_mechanics/intermediate/Ex_TI_VEP_Angled_Fault.py diff --git a/docs/advanced/figures/ti_vep_benchmark_final.png b/docs/advanced/figures/ti_vep_benchmark_final.png new file mode 100644 index 0000000000000000000000000000000000000000..f2336266056f3e80201b578fce72e1925dc7a897 GIT binary patch literal 118984 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

Qc?^UQX!UPL@pO(?GWN^8wSk>PtN|s-F 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%0D6K*>Pjl;+(G57DGS-#=tEXVK?3&#-$Z{k|94~- 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

  • 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 1.5$). For problems where SNES convergence is difficult at yield onset, increase $\delta$ toward 0.3--0.5 as a relaxation parameter. Set it via `cm._yield_softness = 0.1`. + +## Benchmark Results + +The figure below shows the TI-VEP model validated against the analytical Maxwell viscoelastic solution with plastic yield cap, for a simple shear box with an embedded fault. Two yield stresses are tested ($\tau_y = 0.15$ and $\tau_y = 0.30$) at both 0 and 15 degrees fault angle. Solid curves show the analytical VE solution capped at $\tau_y$; markers show the numerical results. + +```{figure} figures/ti_vep_benchmark_final.png +:name: fig-tivep-benchmark + +TI-VEP shear box benchmark. **Left**: horizontal fault ($\theta = 0°$), where resolved shear equals $\sigma_{xy}$. **Right**: angled fault ($\theta = 15°$), showing resolved fault-plane shear (circles) capping at $\tau_y$ while the global $\sigma_{xy}$ (crosses) continues to build as the bulk VE component grows. With the corrected softmin ($\delta = 0.1$), all cases reach within 1--2% of the analytical yield cap. +``` + +At 0 degrees, the resolved shear is simply $\sigma_{xy}$ and the yield cap is exact. At 15 degrees, the anisotropic tensor creates a mechanical coupling between normal and shear components on the fault plane: the resolved shear caps at $\tau_y$ while the global stress tensor reflects contributions from both the yielded fault-plane component (governed by $\eta_{1,\text{eff}}$) and the non-yielding bulk component (governed by $\eta_{0,\text{ve}}$). + +## Summary of Constitutive Models + +| Model | Viscosity | Elasticity | Yield | Anisotropy | +|-------|-----------|------------|-------|------------| +| `ViscousFlowModel` | $\eta$ | -- | -- | -- | +| `ViscoPlasticFlowModel` | $\eta$ | -- | $\dot\varepsilon_{II}$ | -- | +| `ViscoElasticPlasticFlowModel` | $\eta$ | $\mu$, BDF-$k$ | $\dot\varepsilon_{II}$ | -- | +| `TransverseIsotropicFlowModel` | $\eta_0, \eta_1, \hat{n}$ | -- | -- | TI tensor | +| `TransverseIsotropicVEPFlowModel` | $\eta_0, \eta_1, \hat{n}$ | $\mu$, BDF-$k$ | $\|\dot\gamma\|$ (fault-plane) | TI tensor | + +## References + +- Moresi, L., Muhlhaus, H.-B., 2006. Anisotropic viscous models of large-deformation Mohr-Coulomb failure. *Phil. Mag.*, 86, 3287-3305. +- Muhlhaus, H.-B., Moresi, L., Hobbs, B., Dufour, F., 2002. Large amplitude folding in finely layered viscoelastic rock structures. *Pure Appl. Geophys.*, 159, 2311-2333. diff --git a/docs/examples/solid_mechanics/intermediate/Ex_TI_VEP_Angled_Fault.py b/docs/examples/solid_mechanics/intermediate/Ex_TI_VEP_Angled_Fault.py new file mode 100644 index 000000000..4c045ba0f --- /dev/null +++ b/docs/examples/solid_mechanics/intermediate/Ex_TI_VEP_Angled_Fault.py @@ -0,0 +1,330 @@ +# %% [markdown] +r""" +# Viscoelastic-Plastic Shear Box with Angled Fault + +**PHYSICS:** solid_mechanics +**DIFFICULTY:** intermediate +**RUNTIME:** ~2 minutes + +## Description + +A 2D shear box with an embedded fault at 15 degrees from horizontal, using the +`TransverseIsotropicVEPFlowModel` constitutive model. This combines: + +- **Transverse isotropy**: anisotropic viscosity with the fault normal as director +- **Viscoelasticity**: Maxwell stress buildup with BDF-1 time integration +- **Plastic yield**: resolved fault-plane shear limits the stress + +The key physical result: stress builds elastically until the **resolved shear +stress on the fault plane** reaches the yield stress $\tau_y$. At that point, +fault-plane shear yields while the stress component normal to the fault +continues to build as pure viscoelastic. + +## Physical Setup + +| Parameter | Value | +|-----------|-------| +| Domain | 1 x 1 | +| Fault | centred, 15 deg from horizontal | +| $\eta_0$ (bulk) | 1 | +| $\eta_1$ (fault-plane) | 1 | +| $\mu$ (shear modulus) | 1 | +| $\tau_y$ (fault yield) | 0.15 | +| Fault width | 0.08 | +| Top velocity | 0.5 | +""" + +# %% +#| echo: false +import nest_asyncio +nest_asyncio.apply() + +# %% +import os +import numpy as np +import sympy +import underworld3 as uw + +import matplotlib +if not os.environ.get('DISPLAY') and not os.environ.get('WAYLAND_DISPLAY'): + matplotlib.use('Agg') +import matplotlib.pyplot as plt + +os.makedirs("output", exist_ok=True) + +# %% [markdown] +""" +## Parameters +""" + +# %% +# Physical parameters +ETA_0 = 1.0 # bulk viscosity +ETA_1 = 1.0 # fault-plane viscosity (same as bulk for this test) +MU = 1.0 # shear modulus +TAU_Y = 0.15 # fault-plane yield stress +V_TOP = 0.5 # top boundary velocity +DT = 0.025 # timestep +N_STEPS = 80 # number of steps + +# Mesh +RES = 64 # mesh resolution (RES x RES) + +# Fault geometry +FAULT_ANGLE_DEG = 15.0 # angle from horizontal (degrees) +FAULT_WIDTH = 0.08 # influence function width +FAULT_LENGTH = 0.6 # fault length (centered in domain) + +# %% [markdown] +r""" +## Mesh and Variables +""" + +# %% +mesh = uw.meshing.StructuredQuadBox( + elementRes=(RES, RES), + minCoords=(0.0, 0.0), + maxCoords=(1.0, 1.0), + qdegree=3, +) + +v = uw.discretisation.MeshVariable("U", mesh, 2, degree=2, vtype=uw.VarType.VECTOR) +p = uw.discretisation.MeshVariable("P", mesh, 1, degree=1, + continuous=True, vtype=uw.VarType.SCALAR) + +# %% [markdown] +r""" +## Fault Surface + +The fault is a 1D polyline at 15 degrees from horizontal, centered in the domain. +The `Surface` class computes the signed distance field and normals automatically. +""" + +# %% +theta = np.radians(FAULT_ANGLE_DEG) +cx, cy = 0.5, 0.5 # centre of domain + +# Fault endpoints +dx = FAULT_LENGTH / 2 * np.cos(theta) +dy = FAULT_LENGTH / 2 * np.sin(theta) +fault_points = np.array([ + [cx - dx, cy - dy], + [cx + dx, cy + dy], +]) + +fault = uw.meshing.Surface("fault", mesh, fault_points, symbol="F") +fault.discretize() + +# Director: fault normal (perpendicular to fault, pointing "up") +n_x = -np.sin(theta) +n_y = np.cos(theta) +director = sympy.Matrix([n_x, n_y]) + +print(f"Fault angle: {FAULT_ANGLE_DEG} deg") +print(f"Director (fault normal): [{n_x:.4f}, {n_y:.4f}]") + +# %% [markdown] +r""" +## Yield Stress Field + +The yield stress varies spatially: low near the fault, high in the bulk. +We interpolate the weakness (1/$\tau_y$) to avoid steep gradients. +""" + +# %% +TAU_Y_BULK = 200.0 # effectively infinite for the bulk + +weakness = fault.influence_function( + width=FAULT_WIDTH, + value_near=1 / TAU_Y, + value_far=1 / TAU_Y_BULK, + profile="gaussian", +) +tau_y_field = 1 / weakness + +# %% [markdown] +r""" +## Solver Setup + +The `TransverseIsotropicVEPFlowModel` combines the anisotropic viscosity tensor +(Muhlhaus-Moresi) with viscoelastic stress history and plastic yield on the +fault plane. +""" + +# %% +stokes = uw.systems.Stokes(mesh, velocityField=v, pressureField=p) + +# Create model with BDF-1 time integration +cm = uw.constitutive_models.TransverseIsotropicVEPFlowModel( + stokes.Unknowns, order=1 +) +stokes.constitutive_model = cm + +# Set parameters +cm.Parameters.shear_viscosity_0 = ETA_0 +cm.Parameters.shear_viscosity_1 = ETA_1 +cm.Parameters.shear_modulus = MU +cm.Parameters.yield_stress = tau_y_field +cm.Parameters.director = director +cm.Parameters.shear_viscosity_min = ETA_0 * 1.0e-3 +cm.Parameters.strainrate_inv_II_min = 1.0e-6 +cm.yield_mode = "softmin" # smooth approximation to min (default delta=0.1) + +# Solver settings +stokes.saddle_preconditioner = 1 / cm.K +stokes.tolerance = 1.0e-4 +stokes.petsc_options["ksp_type"] = "fgmres" + +# Boundary conditions: simple shear +stokes.add_essential_bc(sympy.Matrix([V_TOP, 0.0]), "Top") +stokes.add_essential_bc(sympy.Matrix([0.0, 0.0]), "Bottom") +stokes.add_essential_bc((sympy.oo, 0.0), "Left") +stokes.add_essential_bc((sympy.oo, 0.0), "Right") +stokes.bodyforce = sympy.Matrix([0.0, 0.0]) + +# %% [markdown] +r""" +## Time Stepping + +Track the stress components at a point on the fault to show elastic buildup +and yield cap behavior. +""" + +# %% +# Monitoring point: centre of the fault +monitor_coord = np.array([[0.5, 0.5]]) + +times = [] +sigma_xy_history = [] +sigma_resolved_history = [] + +# Analytical VE reference (no yield): sigma_xy = eta * gamma_dot * (1 - exp(-t / t_r)) +gamma_dot = V_TOP # approximate global shear rate +t_relax = ETA_1 / MU + +for step in range(N_STEPS): + stokes.solve(timestep=DT, zero_init_guess=(step == 0)) + + t = (step + 1) * DT + reason = stokes.snes.getConvergedReason() + its = stokes.snes.getIterationNumber() + + # Sample stress at monitoring point + tau = stokes.tau + tau_data = tau.data + tau_coords = tau.coords + + # Find nearest stress evaluation point to monitor location + dists = np.linalg.norm(tau_coords - monitor_coord, axis=1) + idx = np.argmin(dists) + s_xx, s_yy, s_xy = tau_data[idx, 0], tau_data[idx, 1], tau_data[idx, 2] + + # Resolved shear on fault plane: tau_resolved = n^T sigma n_perp + # For a fault with normal (n_x, n_y), the tangent is (n_y, -n_x) + # Resolved shear = t^T sigma n = sigma_ij * t_i * n_j + t_x, t_y = n_y, -n_x # tangent vector + resolved_shear = (s_xx * t_x * n_x + s_xy * (t_x * n_y + t_y * n_x) + + s_yy * t_y * n_y) + + times.append(t) + sigma_xy_history.append(s_xy) + sigma_resolved_history.append(resolved_shear) + + flag = " ***" if reason < 0 else "" + if step % 10 == 0 or reason < 0: + print(f"Step {step+1:3d}, t={t:.3f}: " + f"sigma_xy={s_xy:.4f}, resolved={resolved_shear:.4f}, " + f"SNES={reason}, its={its}{flag}") + +# %% [markdown] +r""" +## Stress Evolution + +The plot shows stress at the fault centre over time. The dashed line shows +the analytical VE solution (no yield). The resolved shear stress on the +fault plane should cap at $\tau_y = 0.15$. +""" + +# %% +times = np.array(times) +sigma_xy_history = np.array(sigma_xy_history) +sigma_resolved_history = np.array(sigma_resolved_history) + +# Analytical VE solution (no yield) +t_analytical = np.linspace(0, times[-1], 200) +sigma_ve_analytical = ETA_1 * gamma_dot * (1 - np.exp(-t_analytical / t_relax)) + +fig, axes = plt.subplots(1, 2, figsize=(12, 5)) + +# Left panel: sigma_xy and resolved shear vs time +ax = axes[0] +ax.plot(times, sigma_xy_history, 'b-o', markersize=2, label=r'$\sigma_{xy}$ (global)') +ax.plot(times, sigma_resolved_history, 'r-s', markersize=2, + label=r'$\tau_{\mathrm{resolved}}$ (fault plane)') +ax.plot(t_analytical, sigma_ve_analytical, 'k--', alpha=0.5, label='VE analytical (no yield)') +ax.axhline(y=TAU_Y, color='gray', linestyle=':', linewidth=2, + label=rf'$\tau_y = {TAU_Y}$') +ax.set_xlabel('Time') +ax.set_ylabel('Stress') +ax.set_title(f'Stress at fault centre (angle={FAULT_ANGLE_DEG} deg)') +ax.legend(fontsize=9) +ax.grid(True, alpha=0.3) + +# Right panel: stress profile across fault at end of simulation +ax = axes[1] +n_samples = 100 +# Profile perpendicular to the fault, through the centre +profile_dist = np.linspace(-0.4, 0.4, n_samples) +profile_x = 0.5 + profile_dist * n_x # along fault normal direction +profile_y = 0.5 + profile_dist * n_y +# Clip to domain +valid = (profile_x > 0.02) & (profile_x < 0.98) & (profile_y > 0.02) & (profile_y < 0.98) +profile_coords = np.column_stack([profile_x[valid], profile_y[valid]]) + +# Evaluate tau_y field along profile +tau_y_profile = uw.function.evaluate(tau_y_field, profile_coords).flatten() + +# For stress, find nearest tau evaluation points +tau_coords = stokes.tau.coords +tau_data = stokes.tau.data +stress_profile = np.zeros(len(profile_coords)) +for i, pc in enumerate(profile_coords): + dists = np.linalg.norm(tau_coords - pc, axis=1) + idx = np.argmin(dists) + s_xx, s_yy, s_xy = tau_data[idx, 0], tau_data[idx, 1], tau_data[idx, 2] + t_x, t_y = n_y, -n_x + stress_profile[i] = (s_xx * t_x * n_x + s_xy * (t_x * n_y + t_y * n_x) + + s_yy * t_y * n_y) + +ax.plot(profile_dist[valid], np.abs(stress_profile), 'r-', linewidth=2, + label=r'$|\tau_{\mathrm{resolved}}|$') +ax.plot(profile_dist[valid], tau_y_profile, 'k--', linewidth=1, + label=r'$\tau_y$ (yield stress)') +ax.axvline(0, color='gray', linestyle=':', alpha=0.5, label='Fault centre') +ax.set_xlabel('Distance from fault (along normal)') +ax.set_ylabel('Stress') +ax.set_title('Final stress profile across fault') +ax.legend(fontsize=9) +ax.grid(True, alpha=0.3) + +plt.tight_layout() +plt.savefig("output/ti_vep_angled_fault.png", dpi=150) +plt.show() + +# %% [markdown] +r""" +## Summary + +This example demonstrates the `TransverseIsotropicVEPFlowModel`: + +1. **Elastic stress buildup**: stress grows from zero following the Maxwell solution +2. **Fault-plane yield**: the resolved shear stress on the fault plane caps at $\tau_y$ +3. **Anisotropic yield**: only the fault-parallel shear component yields; the normal + component continues to build elastically +4. **Smooth spatial transition**: the Gaussian influence function localises yield to + the fault zone, with background material remaining elastic + +The resolved shear criterion ($|\dot\gamma| = \sqrt{|T|^2 - \dot\varepsilon_n^2}$) +correctly identifies fault-plane shear regardless of the fault orientation, avoiding +the orientation-dependent errors that arise from using the global strain rate invariant. +""" From 21c6bfc816fbfc3f13ba3e8887fb878c02f90985 Mon Sep 17 00:00:00 2001 From: lmoresi Date: Sun, 12 Apr 2026 10:34:03 -0600 Subject: [PATCH 8/9] Address Copilot review: fix stress_projection, doc corrections - Fix stress_projection() to use _c_ve tensor directly instead of calling _q() which always uses _c (the yield-limited tensor). This ensures stress history stores VE-only stress as intended. - Fix director sign in doc example: [-sin(theta), cos(theta)] - Clarify that softmin is not the default yield mode (smooth is) - Use public cm.yield_softness API instead of cm._yield_softness - Add comment explaining deliberate math.sqrt for float offset Underworld development team with AI support from Claude Code --- .../vep-transverse-isotropy-faults.md | 6 ++--- src/underworld3/constitutive_models.py | 24 ++++++++++++++----- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/docs/advanced/vep-transverse-isotropy-faults.md b/docs/advanced/vep-transverse-isotropy-faults.md index 9ffd1ac21..26599267b 100644 --- a/docs/advanced/vep-transverse-isotropy-faults.md +++ b/docs/advanced/vep-transverse-isotropy-faults.md @@ -206,14 +206,14 @@ cm.Parameters.yield_stress = 0.15 # fault-plane yield stress # Director from fault normal (e.g., fault at 15 degrees from horizontal) theta = np.radians(15) -cm.Parameters.director = sympy.Matrix([np.sin(theta), np.cos(theta)]) +cm.Parameters.director = sympy.Matrix([-np.sin(theta), np.cos(theta)]) ``` The director can also be a spatially varying field (e.g., from a `Surface` object's normals transferred to a mesh variable), and the yield stress can vary spatially using an influence function to localise yielding near the fault. ## Smooth Yield Approximations -The `"softmin"` yield mode (default) uses a smooth approximation to $\min(\eta_{\text{ve}}, \eta_{\text{pl}})$ to avoid the non-differentiable kink that causes problems for the SNES solver. The approximation is: +The `"softmin"` yield mode uses a smooth approximation to $\min(\eta_{\text{ve}}, \eta_{\text{pl}})$ to avoid the non-differentiable kink that causes problems for the SNES solver. The approximation is: $$g(f) = 1 + \text{softplus}(f-1) - \text{softplus}(-1), \qquad \eta_{\text{eff}} = \eta_{\text{ve}} / g(f)$$ @@ -235,7 +235,7 @@ The softmin is accurate when $\delta \ll f_{ss}$, i.e., when the viscous stress | 0.1 | ~99% of $\tau_y$ | ~100% | low | | 0.01 | ~100% | ~100% | moderate | -The default $\delta = 0.1$ is accurate for all cases where the viscous stress exceeds the yield stress by at least 50% ($f_{ss} > 1.5$). For problems where SNES convergence is difficult at yield onset, increase $\delta$ toward 0.3--0.5 as a relaxation parameter. Set it via `cm._yield_softness = 0.1`. +The default $\delta = 0.1$ is accurate for all cases where the viscous stress exceeds the yield stress by at least 50% ($f_{ss} > 1.5$). For problems where SNES convergence is difficult at yield onset, increase $\delta$ toward 0.3--0.5 as a relaxation parameter. Set it via `cm.yield_softness = 0.1`. ## Benchmark Results diff --git a/src/underworld3/constitutive_models.py b/src/underworld3/constitutive_models.py index af2d09e5a..f6f92308f 100644 --- a/src/underworld3/constitutive_models.py +++ b/src/underworld3/constitutive_models.py @@ -1490,7 +1490,7 @@ def viscosity(self): # Approaches exact Min as δ→0. No Min/Max in expression. delta = self._yield_softness f = effective_viscosity / vp_effective_viscosity - import math + import math # float offset avoids sympy expression blowup in tensor offset = (-1 + math.sqrt(1 + delta**2)) / 2 g = 1 + (f - 1 + sympy.sqrt((f - 1)**2 + delta**2)) / 2 - offset effective_viscosity = effective_viscosity / g @@ -2718,7 +2718,7 @@ def viscosity(self): elif self._yield_mode == "softmin": delta = self._yield_softness f = eta_1_eff / vp_eff - import math + import math # float offset avoids sympy expression blowup in tensor offset = (-1 + math.sqrt(1 + delta**2)) / 2 g = 1 + (f - 1 + sympy.sqrt((f - 1)**2 + delta**2)) / 2 - offset eta_1_eff = eta_1_eff / g @@ -2814,7 +2814,7 @@ def _build_c_tensor(self): elif self._yield_mode == "softmin": delta = self._yield_softness f = eta_1_eff / vp_eff - import math + import math # float offset avoids sympy expression blowup in tensor offset = (-1 + math.sqrt(1 + delta**2)) / 2 g = 1 + (f - 1 + sympy.sqrt((f - 1)**2 + delta**2)) / 2 - offset eta_1_eff = eta_1_eff / g @@ -2859,11 +2859,23 @@ def flux(self): return self.stress() def stress_projection(self): - """VE stress without plastic correction (for history storage).""" + """VE stress without plastic correction (for history storage). + + Uses the anisotropic tensor with VE effective viscosities but + no yield limiting (η₁_ve, not η₁_eff). This is the stress that + should be stored in the DFDt history for the next timestep. + """ edot = self.grad_u - # Use the full anisotropic tensor but without yield self._build_c_tensor_ve() - return self._q(edot) + # Contract with the VE-only tensor (not self._c which has yield) + c_ve = self._c_ve + if len(c_ve.shape) == 2: + flux = c_ve * edot + else: + flux = sympy.tensorcontraction( + sympy.tensorcontraction(sympy.tensorproduct(c_ve, edot), (1, 5)), (0, 3) + ) + return sympy.Matrix(flux) def _build_c_tensor_ve(self): """Build anisotropic tensor with VE η₁ only (no yield).""" From 4e763fe46d7bdecf74bb629498460584b62d2e2c Mon Sep 17 00:00:00 2001 From: lmoresi Date: Sun, 12 Apr 2026 10:36:52 -0600 Subject: [PATCH 9/9] Default yield_mode to softmin (with delta=0.1) Change default from "smooth" to "softmin" in both ViscoElasticPlasticFlowModel and TransverseIsotropicVEPFlowModel. The corrected softmin with delta=0.1 is more accurate than smooth across the full range of yield ratios. Underworld development team with AI support from Claude Code --- docs/advanced/vep-transverse-isotropy-faults.md | 2 +- src/underworld3/constitutive_models.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/advanced/vep-transverse-isotropy-faults.md b/docs/advanced/vep-transverse-isotropy-faults.md index 26599267b..8bf3e56a4 100644 --- a/docs/advanced/vep-transverse-isotropy-faults.md +++ b/docs/advanced/vep-transverse-isotropy-faults.md @@ -213,7 +213,7 @@ The director can also be a spatially varying field (e.g., from a `Surface` objec ## Smooth Yield Approximations -The `"softmin"` yield mode uses a smooth approximation to $\min(\eta_{\text{ve}}, \eta_{\text{pl}})$ to avoid the non-differentiable kink that causes problems for the SNES solver. The approximation is: +The `"softmin"` yield mode (default) uses a smooth approximation to $\min(\eta_{\text{ve}}, \eta_{\text{pl}})$ to avoid the non-differentiable kink that causes problems for the SNES solver. The approximation is: $$g(f) = 1 + \text{softplus}(f-1) - \text{softplus}(-1), \qquad \eta_{\text{eff}} = \eta_{\text{ve}} / g(f)$$ diff --git a/src/underworld3/constitutive_models.py b/src/underworld3/constitutive_models.py index f6f92308f..b6c7c2b9f 100644 --- a/src/underworld3/constitutive_models.py +++ b/src/underworld3/constitutive_models.py @@ -1110,7 +1110,7 @@ def __init__(self, unknowns, order=1, material_name: str = None): ) self._order = order - self._yield_mode = "smooth" # "min", "harmonic", "smooth", or "softmin" + self._yield_mode = "softmin" # "min", "harmonic", "smooth", or "softmin" self._yield_softness = 0.1 # δ parameter for "softmin" mode self._bdf_blend = None # auto: 1.0 for VE, 0.75 for VEP @@ -2456,7 +2456,7 @@ def __init__(self, unknowns, order=1, material_name: str = None): ) self._order = order - self._yield_mode = "smooth" + self._yield_mode = "softmin" self._yield_softness = 0.1 self._bdf_blend = 0.5 self._max_dt_ratio_for_higher_order = 2.0