Skip to content

Use stress-based variational forms based on 2nd Piola#91

Merged
finsberg merged 5 commits into
mainfrom
stress-based-var-forms
Jun 29, 2025
Merged

Use stress-based variational forms based on 2nd Piola#91
finsberg merged 5 commits into
mainfrom
stress-based-var-forms

Conversation

@finsberg

@finsberg finsberg commented Jun 25, 2025

Copy link
Copy Markdown
Owner

Instead of defining variational forms through the strain energy we now define them via the second piola stress. This means that a variational form on the form

$$ \int \psi (F) \mathrm{d}x = \int \psi_{\text{passive}}(F) + \psi_{\text{active}}(F) + \psi_{\text{comp}}(J) \mathrm{d}x $$

which has been solved by performing derivative to get the residual, i.e

R = ufl.derivative(psi*dx, u, v)

will now be computed using the second piola stress instead, i.e

$$ \int S(C) : \frac{1}{2}C \mathrm{d}x = \int S_{\text{passive}}(C) +S_{\text{active}}(C) +S_{\text{comp}}(C) : \frac{1}{2}C \mathrm{d}x $$

using

R = ufl.inner(S(C), 0.5 * var_C) * dx

with

var_C = ufl.grad(v).T * F + F.T * ufl.grad(v)

This is useful since $\psi_{\text{active}}$ can depend on variables (e.g T_a) which in electro-mechanical simulations can depend on u in which case a derivative will trigger a chain rule operation which is not what we want, see e.g ComputationalPhysiology/simcardems#253

To make this work we also rewrite all the strain energy functions ($\psi$) to depend on C rather than F so that we can use S = 2 * ufl.diff(psi, C).

@finsberg finsberg force-pushed the stress-based-var-forms branch from 7a4e2ac to b93ba65 Compare June 25, 2025 17:57
@finsberg finsberg merged commit f6a4863 into main Jun 29, 2025
7 checks passed
@finsberg finsberg deleted the stress-based-var-forms branch April 11, 2026 17:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant