Source code for ldrb.io
import logging
import shutil
from pathlib import Path
from typing import NamedTuple, Sequence
from mpi4py import MPI
import adios2
import adios4dolfinx
import dolfinx
import numpy as np
from packaging.version import Version
from . import utils
logger = logging.getLogger(__name__)
[docs]
class LDRBOutput(NamedTuple):
f0: dolfinx.fem.Function
s0: dolfinx.fem.Function
n0: dolfinx.fem.Function
lv: dolfinx.fem.Function | None = None
rv: dolfinx.fem.Function | None = None
epi: dolfinx.fem.Function | None = None
lv_rv: dolfinx.fem.Function | None = None
apex: dolfinx.fem.Function | None = None
lv_scalar: dolfinx.fem.Function | None = None
rv_scalar: dolfinx.fem.Function | None = None
epi_scalar: dolfinx.fem.Function | None = None
lv_rv_scalar: dolfinx.fem.Function | None = None
apex_scalar: dolfinx.fem.Function | None = None
lv_gradient: dolfinx.fem.Function | None = None
rv_gradient: dolfinx.fem.Function | None = None
epi_gradient: dolfinx.fem.Function | None = None
lv_rv_gradient: dolfinx.fem.Function | None = None
apex_gradient: dolfinx.fem.Function | None = None
markers_scalar: dolfinx.fem.Function | None = None
[docs]
class FiberSheetSystem(NamedTuple):
f0: np.ndarray
s0: np.ndarray
n0: np.ndarray
def save(
comm: MPI.Comm,
filename: Path,
functions: Sequence[dolfinx.fem.Function],
overwrite: bool = False,
) -> None:
attributes = {}
if filename.exists():
if overwrite:
comm.barrier()
shutil.rmtree(filename, ignore_errors=True)
comm.barrier()
else:
logger.info(f"File {filename} already exists, skipping")
return
for i, f in enumerate(functions):
name = f.name
if i == 0:
adios4dolfinx.write_mesh(mesh=f.function_space.mesh, filename=filename)
adios4dolfinx.write_function_on_input_mesh(u=f, filename=filename)
attributes[name] = utils.element2array(f.ufl_element())
adios4dolfinx.write_attributes(
comm=comm,
filename=filename,
name="function_space",
attributes=attributes,
)
def load(
comm: MPI.Comm,
filename: Path,
mesh: dolfinx.mesh.Mesh | None = None,
function_space: dict[str, np.ndarray] | None = None,
) -> dict[str, dolfinx.fem.Function]:
if not Path(filename).exists():
raise FileNotFoundError(f"File {filename} does not exist")
if mesh is None:
mesh = adios4dolfinx.read_mesh(comm=comm, filename=filename)
if Version(np.__version__) >= Version("2.11") and Version(adios2.__version__) < Version(
"2.10.2"
):
# Broken on new numpy and old adios2
function_space = adios4dolfinx.read_attributes(
comm=comm, filename=filename, name="function_space"
)
else:
if not function_space:
raise ValueError(
"function_space must be provided if numpy version is lower "
"than 1.21.0 and adios2 version is lower than 2.10."
)
assert function_space is not None
# Assume same function space for all functions
functions = {}
for key, value in function_space.items():
element = utils.array2element(value)
V = dolfinx.fem.functionspace(mesh, element)
f = dolfinx.fem.Function(V, name=key)
adios4dolfinx.read_function(u=f, filename=filename, name=key)
functions[key] = f
return functions