SimVascular / SimVascular/svMultiPhysics
Temporal instability in electromechanics force-fiber-stretch feedback
@kko27 is already working on this.
Since Sep 4, 2026.
- Dominant language
- C++
- Stars
- 45
- Forks
- 60
- Avg merge
- 5d 23h
- Merged PRs (30d)
- 11
Description
Problem description
Coupled electromechanics simulations, in some settings, give rise to unphysical oscillations in the structural solution, that build up over time eventually leading up to the crash of the solver.
I attach some screenshots of this behavior below, for the slab test case and a ventricular simulation, both using ActiveStressRegazzoni. Both were taken at the last computed timestep, after which the linear solver for struct failed to converge.
The slab test case was slightly modified with respect to the test suite, to use active stress parameters from Fedele et al. (2023), and I have introduced a small perturbation to the fiber orientation in one point to break the symmetry (otherwise, the test would use an axis-aligned domain, with an axis-aligned structured grid). I plan to test this again on an unstructured tetrahedral grid without artificial perturbations to the fibers.
I think that @kko27 has observed a similar behavior in testing the implementation of the Land-Niederer model (#606).
Probable explanation
For realistic active stress models such as ActiveStressRegazzoni, the active tension $T_{act}$ depends on the fiber stretch $\lambda$, both directly through the expression of the active tension itself, $T_{act} = T_{act}(\mathbf{s}, \lambda)$, and indirectly through the dependence of the ODE system on $\lambda$ (so that the state vector $\mathbf{s}$ ends up depending on $\lambda$ too).
This dependence is treated explicitly. More precisely:
- in
Integrator::predictor, the active stress model is advanced by callingActiveStress::advance_time_steppassing the fiber stretch from previous time step; Integrator::initiatorandIntegrator::correctorproceed to solve thestructequation keeping the active tension fixed.
I believe that the oscillations and blowup are due to the instability (or maybe conditional stability) of this explicit coupling.
Evidence supporting the explanation
- In the slab test, reducing $\Delta t$ delays or removes the instability: with $\Delta t = 1 \text{ms}$, the solver blows up at $t = 193 \text{ms}$; with $\Delta t = 0.5 \text{ms}$, it blows up at $t = 230 \text{ms}$; with $\Delta t = 0.25 \text{ms}$, blows up at around $t = 340 \text{ms}$.
- The oscillations in velocity have a period of 2 timesteps, regardless of timestep size, which is a hallmark of instability due to explicit timestepping.
- Removing the feedback removes the issue: if I hardcode $\lambda = 1$ in the active stress model code, oscillations disappear.
- Experimental (AI-generated) code implementing implicit coupling (the active stress model is updated within the nonlinear iterations in which
structis also solved) also removes the instabilities (at the price of much increased number of iterations and computational cost). I trust this code only up to a point, but I'll verify it, push it and update this description.
Possible solutions
- Implicit partitioned coupling (that is, point 3 from above). It seems to increase computational cost substantially, because convergence requires many more (2-3x) iterations. I experimented adding Aitken acceleration but it didn't help much.
- Semi-implicit discretization. The dependence of $T_{act}$ on $\lambda$ could be made implicit only in direct part (i.e. in the way $\lambda$ appears in the expression of $T_{act}$), but not in the indirect part (i.e. in the dependence of $\mathbf{s}$ on $\lambda$ through the ODE timestepping). The tangent for this term would be manageable, I think. I have not verified whether this solves the problem or not.
Open questions
- The explicit coupling is not uncommon in electromechanics models (see e.g. Fedele et al. (2023)). It is not obvious to me why it should not work here. Some candidate (currently unverified) explanations:
- other solvers may use more dissipative timestepping methods, and numerical dissipation compensates for instability;
- other models may have further sources of damping (e.g. more viscous boundary conditions)
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.