Shear experiment

Shear experiment#

Attempt to reproduce Figure 7 in [1].

[1] Holzapfel, Gerhard A., and Ray W. Ogden. “Constitutive modelling of passive myocardium: a structurally based framework for material characterization. “Philosophical Transactions of the Royal Society of London A: Mathematical, Physical and Engineering Sciences 367.1902 (2009): 3445-3475.

from __future__ import annotations
from pathlib import Path
import dolfin
import matplotlib.pyplot as plt
import numpy as np
try:
    import ufl_legacy as ufl
except ImportError:
    import ufl
import typing
import pulse
from pulse.mechanicsproblem import MechanicsProblem
try:
    from dolfin_adjoint import (
        Constant,
        DirichletBC,
        Expression,
        UnitCubeMesh,
        interpolate,
        Function,
    )
except ImportError:
    from dolfin import (
        Constant,
        DirichletBC,
        interpolate,
        Expression,
        UnitCubeMesh,
        Function,
    )
class Experiment(typing.NamedTuple):
    problem: MechanicsProblem
    increment: typing.Callable[[float], typing.Tuple[float, float, float]]
    shear_component: typing.Callable[[ufl.tensors.ComponentTensor], float]
# Create mesh
N = 2
mesh = UnitCubeMesh(N, N, N)

Create a facet fuction in order to mark the subdomains

ffun = dolfin.MeshFunction("size_t", mesh, 2)
ffun.set_all(0)

Mark subdomains

xlow = dolfin.CompiledSubDomain("near(x[0], 0) && on_boundary")
xlow_marker = 1
xlow.mark(ffun, xlow_marker)
xhigh = dolfin.CompiledSubDomain("near(x[0], 1.0) && on_boundary")
xhigh_marker = 2
xhigh.mark(ffun, xhigh_marker)
ylow = dolfin.CompiledSubDomain("near(x[1], 0) && on_boundary")
ylow_marker = 3
ylow.mark(ffun, ylow_marker)
yhigh = dolfin.CompiledSubDomain("near(x[1], 1) && on_boundary")
yhigh_marker = 4
yhigh.mark(ffun, yhigh_marker)
zlow = dolfin.CompiledSubDomain("near(x[2], 0) && on_boundary")
zlow_marker = 5
zlow.mark(ffun, zlow_marker)
zhigh = dolfin.CompiledSubDomain("near(x[2], 1) && on_boundary")
zhigh_marker = 6
zhigh.mark(ffun, zhigh_marker)

Collect the functions containing the markers

marker_functions = pulse.MarkerFunctions(ffun=ffun)

Create mictrotructure

V_f = dolfin.VectorFunctionSpace(mesh, "CG", 1)

Fibers, sheets and fiber-sheet normal

f0 = interpolate(Expression(("1.0", "0.0", "0.0"), degree=1), V_f)
s0 = interpolate(Expression(("0.0", "1.0", "0.0"), degree=1), V_f)
n0 = interpolate(Expression(("0.0", "0.0", "1.0"), degree=1), V_f)

Collect the mictrotructure

microstructure = pulse.Microstructure(f0=f0, s0=s0, n0=n0)

Create the geometry

geometry = pulse.Geometry(
    mesh=mesh,
    marker_functions=marker_functions,
    microstructure=microstructure,
)

Use the default material parameters from the paper

material_parameters = {
    "a": 0.059,
    "b": 8.023,
    "a_f": 18.472,
    "b_f": 16.026,
    "a_s": 2.481,
    "b_s": 11.120,
    "a_fs": 0.216,
    "b_fs": 11.436,
}

Create material

material = pulse.HolzapfelOgden(parameters=material_parameters)

Make a space for controling the amount of shear displacement

X_space = dolfin.VectorFunctionSpace(mesh, "R", 0)
x = Function(X_space)
zero = Constant((0.0, 0.0, 0.0))

Make a method that will return

def create_experiment(case):  # noqa: C901
    if case == "fs":

        def dirichlet_bc(W):
            V = W if W.sub(0).num_sub_spaces() == 0 else W.sub(0)
            return [
                DirichletBC(V, zero, xlow),
                DirichletBC(V, x, xhigh),
            ]

        def increment(xi):
            return (0, xi, 0)

        def shear_component(T):
            return dolfin.assemble(T[0, 1] * dolfin.dx)

    elif case == "fn":

        def dirichlet_bc(W):
            V = W if W.sub(0).num_sub_spaces() == 0 else W.sub(0)
            return [
                DirichletBC(V, zero, xlow),
                DirichletBC(V, x, xhigh),
            ]

        def increment(xi):
            return (0, 0, xi)

        def shear_component(T):
            return dolfin.assemble(T[0, 2] * dolfin.dx)

    elif case == "sf":

        def dirichlet_bc(W):
            V = W if W.sub(0).num_sub_spaces() == 0 else W.sub(0)
            return [
                DirichletBC(V, zero, ylow),
                DirichletBC(V, x, yhigh),
            ]

        def increment(xi):
            return (xi, 0, 0)

        def shear_component(T):
            return dolfin.assemble(T[1, 0] * dolfin.dx)

    elif case == "sn":

        def dirichlet_bc(W):
            V = W if W.sub(0).num_sub_spaces() == 0 else W.sub(0)
            return [
                DirichletBC(V, zero, ylow),
                DirichletBC(V, x, yhigh),
            ]

        def increment(xi):
            return (0, 0, xi)

        def shear_component(T):
            return dolfin.assemble(T[1, 2] * dolfin.dx)

    elif case == "nf":

        def dirichlet_bc(W):
            V = W if W.sub(0).num_sub_spaces() == 0 else W.sub(0)
            return [
                DirichletBC(V, zero, zlow),
                DirichletBC(V, x, zhigh),
            ]

        def increment(xi):
            return (xi, 0, 0)

        def shear_component(T):
            return dolfin.assemble(T[2, 0] * dolfin.dx)

    elif case == "ns":

        def dirichlet_bc(W):
            V = W if W.sub(0).num_sub_spaces() == 0 else W.sub(0)
            return [
                DirichletBC(V, zero, zlow),
                DirichletBC(V, x, zhigh),
            ]

        def increment(xi):
            return (0, xi, 0)

        def shear_component(T):
            return dolfin.assemble(T[2, 1] * dolfin.dx)

    else:
        raise ValueError(f"Unknown case {case}")

    # Collect Boundary Conditions
    bcs = pulse.BoundaryConditions(dirichlet=(dirichlet_bc,))

    # Create problem
    return Experiment(
        problem=pulse.MechanicsProblem(geometry, material, bcs),
        increment=increment,
        shear_component=shear_component,
    )

Loop over all modes and collect the stress values

modes = ["fs", "fn", "sf", "sn", "nf", "ns"]
stress: dict[str, dict[str, list[float]]] = {
    "cauchy": {m: [] for m in modes},
    "pk1": {m: [] for m in modes},
}
shear_values = np.linspace(0, 0.6, 10)
recompute = True
# Solve problem
results_file = Path("result.npy")
if recompute or not results_file.is_file():
    for mode in modes:
        x.assign(zero)
        experiment = create_experiment(mode)

        for shear in shear_values:
            pulse.iterate.iterate(
                experiment.problem,
                x,
                experiment.increment(shear),
                reinit_each_step=True,
            )
            stress["cauchy"][mode].append(
                experiment.shear_component(experiment.problem.ChachyStress()),
            )
            stress["pk1"][mode].append(
                experiment.shear_component(experiment.problem.FirstPiolaStress()),
            )

    np.save(results_file, stress)
2025-06-06 11:01:58,050 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:01:58,051 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.000,0.000
2025-06-06 11:01:58,051 [562] INFO     pulse.iterate: Target: 0.000,0.000,0.000
2025-06-06 11:01:58,066 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:01:58,066 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.000,0.000
2025-06-06 11:01:58,067 [562] INFO     pulse.iterate: Target: 0.000,0.067,0.000
2025-06-06 11:01:58,254 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:01:58,255 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.067,0.000
2025-06-06 11:01:58,256 [562] INFO     pulse.iterate: Target: 0.000,0.133,0.000
2025-06-06 11:01:58,383 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:01:58,383 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.133,0.000
2025-06-06 11:01:58,384 [562] INFO     pulse.iterate: Target: 0.000,0.200,0.000
2025-06-06 11:01:58,521 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:01:58,522 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.200,0.000
2025-06-06 11:01:58,522 [562] INFO     pulse.iterate: Target: 0.000,0.267,0.000
2025-06-06 11:01:58,659 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:01:58,659 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.267,0.000
2025-06-06 11:01:58,660 [562] INFO     pulse.iterate: Target: 0.000,0.333,0.000
2025-06-06 11:01:58,787 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:01:58,788 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.333,0.000
2025-06-06 11:01:58,788 [562] INFO     pulse.iterate: Target: 0.000,0.400,0.000
2025-06-06 11:01:58,925 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:01:58,926 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.400,0.000
2025-06-06 11:01:58,926 [562] INFO     pulse.iterate: Target: 0.000,0.467,0.000
2025-06-06 11:01:59,065 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:01:59,065 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.467,0.000
2025-06-06 11:01:59,066 [562] INFO     pulse.iterate: Target: 0.000,0.533,0.000
2025-06-06 11:01:59,212 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:01:59,213 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.533,0.000
2025-06-06 11:01:59,213 [562] INFO     pulse.iterate: Target: 0.000,0.600,0.000
2025-06-06 11:01:59,364 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:01:59,365 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.000,0.000
2025-06-06 11:01:59,365 [562] INFO     pulse.iterate: Target: 0.000,0.000,0.000
2025-06-06 11:01:59,378 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:01:59,379 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.000,0.000
2025-06-06 11:01:59,379 [562] INFO     pulse.iterate: Target: 0.000,0.000,0.067
2025-06-06 11:01:59,525 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:01:59,526 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.000,0.067
2025-06-06 11:01:59,527 [562] INFO     pulse.iterate: Target: 0.000,0.000,0.133
2025-06-06 11:01:59,653 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:01:59,654 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.000,0.133
2025-06-06 11:01:59,654 [562] INFO     pulse.iterate: Target: 0.000,0.000,0.200
2025-06-06 11:01:59,780 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:01:59,781 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.000,0.200
2025-06-06 11:01:59,781 [562] INFO     pulse.iterate: Target: 0.000,0.000,0.267
2025-06-06 11:01:59,907 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:01:59,908 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.000,0.267
2025-06-06 11:01:59,908 [562] INFO     pulse.iterate: Target: 0.000,0.000,0.333
2025-06-06 11:02:00,034 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:00,035 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.000,0.333
2025-06-06 11:02:00,035 [562] INFO     pulse.iterate: Target: 0.000,0.000,0.400
2025-06-06 11:02:00,161 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:00,162 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.000,0.400
2025-06-06 11:02:00,163 [562] INFO     pulse.iterate: Target: 0.000,0.000,0.467
2025-06-06 11:02:00,298 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:00,299 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.000,0.467
2025-06-06 11:02:00,299 [562] INFO     pulse.iterate: Target: 0.000,0.000,0.533
2025-06-06 11:02:00,444 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:00,444 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.000,0.533
2025-06-06 11:02:00,445 [562] INFO     pulse.iterate: Target: 0.000,0.000,0.600
2025-06-06 11:02:00,595 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:00,595 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.000,0.000
2025-06-06 11:02:00,596 [562] INFO     pulse.iterate: Target: 0.000,0.000,0.000
2025-06-06 11:02:00,608 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:00,609 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.000,0.000
2025-06-06 11:02:00,609 [562] INFO     pulse.iterate: Target: 0.067,0.000,0.000
2025-06-06 11:02:00,813 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:00,814 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.067,0.000,0.000
2025-06-06 11:02:00,814 [562] INFO     pulse.iterate: Target: 0.133,0.000,0.000
2025-06-06 11:02:00,950 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:00,951 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.133,0.000,0.000
2025-06-06 11:02:00,951 [562] INFO     pulse.iterate: Target: 0.200,0.000,0.000
2025-06-06 11:02:01,098 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:01,098 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.200,0.000,0.000
2025-06-06 11:02:01,099 [562] INFO     pulse.iterate: Target: 0.267,0.000,0.000
2025-06-06 11:02:01,235 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:01,236 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.267,0.000,0.000
2025-06-06 11:02:01,236 [562] INFO     pulse.iterate: Target: 0.333,0.000,0.000
2025-06-06 11:02:01,373 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:01,373 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.333,0.000,0.000
2025-06-06 11:02:01,374 [562] INFO     pulse.iterate: Target: 0.400,0.000,0.000
2025-06-06 11:02:01,501 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:01,502 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.400,0.000,0.000
2025-06-06 11:02:01,502 [562] INFO     pulse.iterate: Target: 0.467,0.000,0.000
2025-06-06 11:02:01,648 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:01,649 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.467,0.000,0.000
2025-06-06 11:02:01,649 [562] INFO     pulse.iterate: Target: 0.533,0.000,0.000
2025-06-06 11:02:01,805 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:01,806 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.533,0.000,0.000
2025-06-06 11:02:01,806 [562] INFO     pulse.iterate: Target: 0.600,0.000,0.000
2025-06-06 11:02:01,996 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:01,996 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.000,0.000
2025-06-06 11:02:01,997 [562] INFO     pulse.iterate: Target: 0.000,0.000,0.000
2025-06-06 11:02:02,009 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:02,010 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.000,0.000
2025-06-06 11:02:02,011 [562] INFO     pulse.iterate: Target: 0.000,0.000,0.067
2025-06-06 11:02:02,177 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:02,177 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.000,0.067
2025-06-06 11:02:02,178 [562] INFO     pulse.iterate: Target: 0.000,0.000,0.133
2025-06-06 11:02:02,305 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:02,306 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.000,0.133
2025-06-06 11:02:02,306 [562] INFO     pulse.iterate: Target: 0.000,0.000,0.200
2025-06-06 11:02:02,433 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:02,434 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.000,0.200
2025-06-06 11:02:02,434 [562] INFO     pulse.iterate: Target: 0.000,0.000,0.267
2025-06-06 11:02:02,561 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:02,562 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.000,0.267
2025-06-06 11:02:02,563 [562] INFO     pulse.iterate: Target: 0.000,0.000,0.333
2025-06-06 11:02:02,700 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:02,700 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.000,0.333
2025-06-06 11:02:02,701 [562] INFO     pulse.iterate: Target: 0.000,0.000,0.400
2025-06-06 11:02:02,828 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:02,828 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.000,0.400
2025-06-06 11:02:02,829 [562] INFO     pulse.iterate: Target: 0.000,0.000,0.467
2025-06-06 11:02:02,995 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:02,996 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.000,0.467
2025-06-06 11:02:02,996 [562] INFO     pulse.iterate: Target: 0.000,0.000,0.533
2025-06-06 11:02:03,124 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:03,125 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.000,0.533
2025-06-06 11:02:03,125 [562] INFO     pulse.iterate: Target: 0.000,0.000,0.600
2025-06-06 11:02:03,267 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:03,267 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.000,0.000
2025-06-06 11:02:03,268 [562] INFO     pulse.iterate: Target: 0.000,0.000,0.000
2025-06-06 11:02:03,281 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:03,282 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.000,0.000
2025-06-06 11:02:03,282 [562] INFO     pulse.iterate: Target: 0.067,0.000,0.000
2025-06-06 11:02:03,467 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:03,467 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.067,0.000,0.000
2025-06-06 11:02:03,468 [562] INFO     pulse.iterate: Target: 0.133,0.000,0.000
2025-06-06 11:02:03,604 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:03,605 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.133,0.000,0.000
2025-06-06 11:02:03,605 [562] INFO     pulse.iterate: Target: 0.200,0.000,0.000
2025-06-06 11:02:03,751 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:03,752 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.200,0.000,0.000
2025-06-06 11:02:03,752 [562] INFO     pulse.iterate: Target: 0.267,0.000,0.000
2025-06-06 11:02:03,898 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:03,899 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.267,0.000,0.000
2025-06-06 11:02:03,899 [562] INFO     pulse.iterate: Target: 0.333,0.000,0.000
2025-06-06 11:02:04,044 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:04,045 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.333,0.000,0.000
2025-06-06 11:02:04,045 [562] INFO     pulse.iterate: Target: 0.400,0.000,0.000
2025-06-06 11:02:04,181 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:04,181 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.400,0.000,0.000
2025-06-06 11:02:04,182 [562] INFO     pulse.iterate: Target: 0.467,0.000,0.000
2025-06-06 11:02:04,329 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:04,330 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.467,0.000,0.000
2025-06-06 11:02:04,330 [562] INFO     pulse.iterate: Target: 0.533,0.000,0.000
2025-06-06 11:02:04,465 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:04,466 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.533,0.000,0.000
2025-06-06 11:02:04,467 [562] INFO     pulse.iterate: Target: 0.600,0.000,0.000
2025-06-06 11:02:04,617 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:04,617 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.000,0.000
2025-06-06 11:02:04,618 [562] INFO     pulse.iterate: Target: 0.000,0.000,0.000
2025-06-06 11:02:04,630 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:04,631 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.000,0.000
2025-06-06 11:02:04,632 [562] INFO     pulse.iterate: Target: 0.000,0.067,0.000
2025-06-06 11:02:04,825 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:04,826 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.067,0.000
2025-06-06 11:02:04,826 [562] INFO     pulse.iterate: Target: 0.000,0.133,0.000
2025-06-06 11:02:04,990 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:04,991 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.133,0.000
2025-06-06 11:02:04,991 [562] INFO     pulse.iterate: Target: 0.000,0.200,0.000
2025-06-06 11:02:05,147 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:05,147 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.200,0.000
2025-06-06 11:02:05,148 [562] INFO     pulse.iterate: Target: 0.000,0.267,0.000
2025-06-06 11:02:05,303 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:05,304 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.267,0.000
2025-06-06 11:02:05,304 [562] INFO     pulse.iterate: Target: 0.000,0.333,0.000
2025-06-06 11:02:05,459 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:05,460 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.333,0.000
2025-06-06 11:02:05,460 [562] INFO     pulse.iterate: Target: 0.000,0.400,0.000
2025-06-06 11:02:05,606 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:05,606 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.400,0.000
2025-06-06 11:02:05,607 [562] INFO     pulse.iterate: Target: 0.000,0.467,0.000
2025-06-06 11:02:05,742 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:05,742 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.467,0.000
2025-06-06 11:02:05,743 [562] INFO     pulse.iterate: Target: 0.000,0.533,0.000
2025-06-06 11:02:05,878 [562] INFO     pulse.iterate: Iterating to target control (f_32)...
2025-06-06 11:02:05,879 [562] INFO     pulse.iterate: Current control: f_32 = Current control: f_32 = 0.000,0.533,0.000
2025-06-06 11:02:05,880 [562] INFO     pulse.iterate: Target: 0.000,0.600,0.000

Plot results

stress = np.load(results_file, allow_pickle=True).item()
fig, ax = plt.subplots(1, 2, sharey=True, sharex=True)
for mode, values in stress["cauchy"].items():
    ax[0].plot(shear_values, stress["cauchy"][mode], label=mode)
ax[0].set_title("Cauchy Stress")
for mode, values in stress["pk1"].items():
    ax[1].plot(shear_values, stress["pk1"][mode], label=mode)
ax[1].set_title("First Piola Kirchhoff Stress")
ax[0].set_ylabel("Shear stress (kPa)")
for axi in ax:
    axi.set_xlabel("Amount of shear")
    axi.set_ylim((0, 16))
    axi.grid()
    axi.legend()
plt.show()
../_images/ca616ae66ddb88f26b4d677e6c3466b26165739e833b6615542e631852f6ec21.png