SimVascular / SimVascular/svMultiPhysics

Uniform application of active stress across material models

Open
#635 4 comments 0 reactions 1 assignee View on GitHub

@michelebucelli is already working on this.

Since Sep 2, 2026.

bug enhancement
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:

  1. some models do not support active stress (not sure if this is checked at runtime);
  2. some models apply tension only along fibers, others also along sheets and cross-fibers; this is checked at runtime in compute_p2kcc by whitelisting the models that have all three directions, and throwing an exception if tension along sheets or cross-fibers is positive;
  3. most models that support active stress add it to the stress tensor S_bar, before calling bar_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 is stIso_HO_ma, which doesn't use bar_to_iso at all, and so adds the active contribution to the stress tensor S directly;
  4. 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

  1. 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.
  2. 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.
  3. 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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.