Source code for ldrb.io

import logging
import shutil
from pathlib import Path
from typing import NamedTuple, Sequence

from mpi4py import MPI

import dolfinx
import io4dolfinx
import numpy as np

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: io4dolfinx.write_mesh(mesh=f.function_space.mesh, filename=filename) io4dolfinx.write_function_on_input_mesh(u=f, filename=filename) attributes[name] = utils.element2array(f.ufl_element()) io4dolfinx.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 = io4dolfinx.read_mesh(comm=comm, filename=filename) function_space = io4dolfinx.read_attributes(comm=comm, filename=filename, name="function_space") 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) io4dolfinx.read_function(u=f, filename=filename, name=key) functions[key] = f return functions