Skip to content

Commit 3e435cf

Browse files
authored
Merge pull request #37 from finsberg/test-guccione
Implement some tests for guccione model
2 parents 0e9446f + 47eff71 commit 3e435cf

File tree

3 files changed

+71
-2
lines changed

3 files changed

+71
-2
lines changed

src/fenicsx_pulse/material_models/guccione.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ def __post_init__(self):
7474
)
7575

7676
@staticmethod
77-
def default_parameters(self) -> dict:
77+
def default_parameters() -> dict:
7878
return {"C": 2.0, "bf": 8.0, "bt": 2.0, "bfs": 4.0}
7979

8080
def is_isotropic(self) -> bool:

tests/test_cardiac_model.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,32 @@ def test_CardiacModel_NeoHookean(comp_model, isotropy, mesh, u):
6363
assert math.isclose(value, 5.056)
6464
else:
6565
assert math.isclose(value, 49.57354795865461)
66+
67+
68+
@pytest.mark.parametrize("isotropy", (fenicsx_pulse.active_stress.ActiveStressModels.transversely,))
69+
@pytest.mark.parametrize(
70+
"comp_model",
71+
(fenicsx_pulse.compressibility.Incompressible(), fenicsx_pulse.compressibility.Compressible()),
72+
)
73+
def test_CardiacModel_Guccione(comp_model, isotropy, mesh, u):
74+
f0 = dolfinx.fem.Constant(mesh, (1.0, 0.0, 0.0))
75+
s0 = dolfinx.fem.Constant(mesh, (0.0, 1.0, 0.0))
76+
n0 = dolfinx.fem.Constant(mesh, (0.0, 0.0, 1.0))
77+
material_params = fenicsx_pulse.Guccione.default_parameters()
78+
material = fenicsx_pulse.Guccione(f0=f0, s0=s0, n0=n0, **material_params)
79+
active_model = fenicsx_pulse.ActiveStress(f0, isotropy=isotropy)
80+
model = fenicsx_pulse.CardiacModel(
81+
material=material,
82+
active=active_model,
83+
compressibility=comp_model,
84+
decouple_deviatoric_volumetric=False,
85+
)
86+
u.interpolate(lambda x: x / 10.0)
87+
F = fenicsx_pulse.kinematics.DeformationGradient(u)
88+
psi = model.strain_energy(F, p=1.0)
89+
value = dolfinx.fem.assemble_scalar(dolfinx.fem.form(psi * ufl.dx))
90+
91+
if isinstance(comp_model, fenicsx_pulse.compressibility.Incompressible):
92+
assert math.isclose(value, 0.47245070311801096)
93+
else:
94+
assert math.isclose(value, 49.57354795865461)

tests/test_material_models.py

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ def test_neo_hookean(u, mesh):
128128
assert math.isclose(value, 0.5 * 0.63)
129129

130130

131-
def test_saint_venant_kirchhoff(u, mesh):
131+
def test_saint_venant_kirchhoff(u):
132132
lmbda = 1.0
133133
mu = 1.0
134134
model = fenicsx_pulse.SaintVenantKirchhoff(lmbda=lmbda, mu=mu)
@@ -142,3 +142,43 @@ def test_saint_venant_kirchhoff(u, mesh):
142142

143143
expected = 0.5 * lmbda * 0.3**2 + mu * 0.03
144144
assert math.isclose(value, expected)
145+
146+
147+
def test_guccione_isotropic(u):
148+
C = 10.0
149+
bf = bt = bfs = 1.0
150+
model = fenicsx_pulse.Guccione(C=C, bf=bf, bt=bt, bfs=bfs)
151+
assert model.is_isotropic()
152+
153+
u.interpolate(lambda x: x / 10)
154+
F = fenicsx_pulse.kinematics.DeformationGradient(u)
155+
psi = model.strain_energy(F)
156+
value = dolfinx.fem.assemble_scalar(dolfinx.fem.form(psi * ufl.dx))
157+
# F = I + 0.1 I, C = 1.21 I, E = 0.5 * (C - I) = 0.105 I
158+
# E * E = 0.105**2 I, tr(E * E) = 0.105**2 * 3
159+
# psi = 0.5 * C * (exp(E * E) - 1) = 0.5 * 10.0 * (exp(0.105 ** 2) - 1)
160+
assert math.isclose(value, 0.5 * 10.0 * (math.exp(3 * (0.105**2)) - 1))
161+
162+
163+
def test_guccione_anisotropic(u, mesh):
164+
f0 = dolfinx.fem.Constant(mesh, (1.0, 0.0, 0.0))
165+
s0 = dolfinx.fem.Constant(mesh, (0.0, 1.0, 0.0))
166+
n0 = dolfinx.fem.Constant(mesh, (0.0, 0.0, 1.0))
167+
168+
C = 10.0
169+
bf = 1.0
170+
bt = 2.0
171+
bfs = 3.0
172+
model = fenicsx_pulse.Guccione(C=C, bf=bf, bt=bt, bfs=bfs, f0=f0, s0=s0, n0=n0)
173+
assert not model.is_isotropic()
174+
175+
u.interpolate(lambda x: x / 10)
176+
F = fenicsx_pulse.kinematics.DeformationGradient(u)
177+
psi = model.strain_energy(F)
178+
value = dolfinx.fem.assemble_scalar(dolfinx.fem.form(psi * ufl.dx))
179+
# F = I + 0.1 I, C = 1.21 I, E = 0.5 * (C - I) = 0.105 I
180+
# E11 = E22 = E33 = 0.105, E12 = E13 = E23 = 0
181+
# Q = bf * E11**2 + bt * (E22**2 + E33**2 + 2 * E23**2) + bfs * (2 * E12**2 + 2 * E13**2)
182+
# Q = E11**2 (bf + 2 bt)
183+
Q = (0.105**2) * (1 + 2 * 2)
184+
assert math.isclose(value, 0.5 * 10.0 * (math.exp(Q) - 1))

0 commit comments

Comments
 (0)