You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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_p2kcc by 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 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;
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 Object-oriented solid material models #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?
Current situation
Different passive material models apply the active stress in different ways:
compute_p2kccby whitelisting the models that have all three directions, and throwing an exception if tension along sheets or cross-fibers is positive;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;Table of active stress formulation by model
bar_to_isostIso_linstIso_StVKstIso_mStVKstIso_MRstIso_HGOstIso_GuccistIso_HOstIso_HO_mabar_to_iso)stArtificialNeuralNetbar_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 ofS_bar, as it does not come from an elastic energy, and as such the derivation of the relation betweenSandS_bardoes not apply to it.Proposed solution
I suggest hoisting the addition of the active stress to after the
switchstatement on the constitutive model. The structure would look something like this:This would simultaneously address all four points discussed above.
Additional context
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?