SimVascular / SimVascular/svMultiPhysics
Uniform application of active stress across material models
@michelebucelli is already working on this.
Since Sep 2, 2026.
- Dominant language
- C++
- Stars
- 45
- Forks
- 60
- Avg merge
- 5d 23h
- Merged PRs (30d)
- 11
Description
Current situation
Different passive material models apply the active stress in different ways:
- some models do not support active stress (not sure if this is checked at runtime);
- some models apply tension only along fibers, others also along sheets and cross-fibers; this is checked at runtime in
compute_p2kccby whitelisting the models that have all three directions, and throwing an exception if tension along sheets or cross-fibers is positive; - most models that support active stress add it to the stress tensor
S_bar, before callingbar_to_iso; the resulting active stress tensor is different from the one that is usually found in literature (see e.g. Arostica et al. (2025), eq. (2), or Fedele et al. (2023), eq. (15)). The one exception to this isstIso_HO_ma, which doesn't usebar_to_isoat all, and so adds the active contribution to the stress tensorSdirectly; - in some models, addition of the active stress is mixed with the passive stress computation, instead of being added at the end; this is mostly a stylistic issue, but I think it would be good for readability to clearly demarcate active and passive contributions.
Table of active stress formulation by model
| Model | Supports active stress | Supports three directions | AS before bar_to_iso |
|---|---|---|---|
stIso_lin |
no | - | - |
stIso_StVK |
no | - | - |
stIso_mStVK |
no | - | - |
| `stIso_nHook | yes | no | yes |
stIso_MR |
yes | no | yes |
stIso_HGO |
yes | no | yes |
stIso_Gucci |
yes | yes | yes |
stIso_HO |
yes | yes | yes |
stIso_HO_ma |
yes | yes | no (there is no bar_to_iso) |
stArtificialNeuralNet |
yes | no | no (there is no bar_to_iso) |
I believe that there is no reason for points 1 and 2, although they are mostly harmless (unless one wants to use one of the unsupported combinations).
On the other hand, I believe point 3 to be incorrect. I think that active stress should be applied to S, instead of S_bar, as it does not come from an elastic energy, and as such the derivation of the relation between S and S_bar does not apply to it.
Proposed solution
I suggest hoisting the addition of the active stress to after the switch statement on the constitutive model. The structure would look something like this:
switch (stM.isoType) {
// ...compute the passive stress from the constitutive model,
// and add it to the tensor S.
}
// Active stress contribution (maybe, but not necessarily, guarded
// by a check that active stress is present, to save unnecessary
// computations, and maybe rewritten for efficiency, to avoid
// allocating temporary Arrays).
S += Tfa * Hff + Tsa * Hss + Tna * Hnn;
This would simultaneously address all four points discussed above.
Additional context
- Fixing points 1, 2 and 4 should have no impact on the solution; however, changing point 3 is expected to change the result for those tests that currently use active tension, at least for some of the constitutive models. I believe that the proposed change is more correct, and so the new solutions would also be more correct.
- The proposed change is related but orthogonal to what is discussed here about the different formulations/normalizations for active tension. While technically independent of that discussion, making the application of active stress uniform across models gives us a better place to place the active stress formulation switch.
- Another related but orthogonal issue is #178. While the proposed change would not provide object-oriented refactoring of material models, better decoupling of active and passive material contributions would probably facilitate that in the future.
What are your thoughts @dseyler @javijv4 @aabrown100-git @kko27? Do you know if any of the issues I raise were deliberately implemented as they currently are, and why?
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.