Next generation cardiac mechanics solver based on FEniCSx
Project description
fenicsx-pulse
fenicsx-pulse
is a cardiac mechanics solver based on FEniCSx. It is a successor of pulse
which is a cardiac mechanics solver based on FEniCS.
Notice
This repo is a complete rewrite of pulse
to work with FEniCSx. The package is not yet ready for release.
If you are using FEniCS please check out pulse
instead
- Documentation: https://finsberg.github.io/fenicsx-pulse/
- Source code: https://github.com/finsberg/fenicsx-pulse
Install
To install fenicsx_pulse
you need to first install FEniCSx. Next you can install fenicsx_pulse
via pip
python3 -m pip install fenicsx-pulse
We also provide a pre-built docker image with FEniCSx and fenicsx_pulse
installed. You pull this image using the command
docker pull ghcr.io/finsberg/fenicsx-pulse:v0.1.5
Simple Example
import dolfinx
import numpy as np
import fenicsx_pulse
from mpi4py import MPI
from petsc4py import PETSc
# Create unit cube mesh
mesh = dolfinx.mesh.create_unit_cube(MPI.COMM_WORLD, 3, 3, 3)
# Specific list of boundary markers
boundaries = [
fenicsx_pulse.Marker(marker=1, dim=2, locator=lambda x: np.isclose(x[0], 0)),
fenicsx_pulse.Marker(marker=2, dim=2, locator=lambda x: np.isclose(x[0], 1)),
]
# Create geometry
geo = fenicsx_pulse.Geometry(
mesh=mesh,
boundaries=boundaries,
metadata={"quadrature_degree": 4},
)
# Create passive material model
material_params = fenicsx_pulse.HolzapfelOgden.transversely_isotropic_parameters()
f0 = dolfinx.fem.Constant(mesh, PETSc.ScalarType((1.0, 0.0, 0.0)))
s0 = dolfinx.fem.Constant(mesh, PETSc.ScalarType((0.0, 1.0, 0.0)))
material = fenicsx_pulse.HolzapfelOgden(f0=f0, s0=s0, **material_params)
# Create model for active contraction
Ta = dolfinx.fem.Constant(mesh, PETSc.ScalarType(0.0))
active_model = fenicsx_pulse.ActiveStress(f0, activation=Ta)
# Create model for compressibility
comp_model = fenicsx_pulse.Incompressible()
# Create Cardiac Model
model = fenicsx_pulse.CardiacModel(
material=material,
active=active_model,
compressibility=comp_model,
)
# Specific dirichlet boundary conditions on the boundary
def dirichlet_bc(
state_space: dolfinx.fem.FunctionSpace,
) -> list[dolfinx.fem.bcs.DirichletBCMetaClass]:
V, _ = state_space.sub(0).collapse()
facets = geo.facet_tags.find(1) # Specify the marker used on the boundary
dofs = dolfinx.fem.locate_dofs_topological((state_space.sub(0), V), 2, facets)
u_fixed = dolfinx.fem.Function(V)
u_fixed.x.set(0.0)
return [dolfinx.fem.dirichletbc(u_fixed, dofs, state_space.sub(0))]
# Use a traction on the opposite boundary
traction = dolfinx.fem.Constant(mesh, PETSc.ScalarType(-1.0))
neumann = fenicsx_pulse.NeumannBC(traction=traction, marker=2)
# Collect all boundary conditions
bcs = fenicsx_pulse.BoundaryConditions(dirichlet=(dirichlet_bc,), neumann=(neumann,))
# Create mechanics problem
problem = fenicsx_pulse.MechanicsProblem(model=model, geometry=geo, bcs=bcs)
# Set a value for the active stress
Ta.value = 2.0
# Solve the problem
problem.solve()
# Get the solution
u, p = problem.state.split()
# And save to XDMF
xdmf = dolfinx.io.XDMFFile(mesh.comm, "results.xdmf", "w")
xdmf.write_mesh(mesh)
xdmf.write_function(u, 0.0)
xdmf.write_function(p, 0.0)
Contributing
See https://finsberg.github.io/fenicsx-pulse/CONTRIBUTING.html
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for fenicsx_pulse-0.1.5-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f9c70e54a58a26cd7717304d6ce419f3cfcbb9c37e4d3f515d85021ff3277ef0 |
|
MD5 | 409d400dda66394af4bbd61faff9d09e |
|
BLAKE2b-256 | 739395cf9dd614287c1c6e1c5062ad5319490502710903aaccd704b03b5b5e3b |