Source code for festim.exports.xdmf

from pathlib import Path

import mpi4py

from dolfinx.io import XDMFFile

from festim.species import Species

from .vtx import ExportBaseClass


[docs] class XDMFExport(ExportBaseClass): """Export functions to XDMFfile. Args: filename: The name of the output file field: The field(s) to export Attributes: _writer (dolfinx.io.XDMFFile): the XDMF writer _field (festim.Species, list of festim.Species): the field index to export """ _mesh_written: bool _filename: Path _writer: XDMFFile | None def __init__(self, filename: str | Path, field: list[Species] | Species) -> None: # Initializes the writer self._writer = None super().__init__(filename, ".xdmf") self.field = field self._mesh_written = False @property def field(self) -> list[Species]: return self._field @field.setter def field(self, value: Species | list[Species]): # check that field is festim.Species or list of festim.Species if isinstance(value, list): for element in value: if not isinstance(element, Species): raise TypeError( f"Each element in the list must be a species, got {type(element)}." # noqa: E501 ) val = value elif isinstance(value, Species): val = [value] else: raise TypeError( f"field must be of type festim.Species or a list of festim.Species, got " # noqa: E501 f"{type(value)}." ) self._field = val
[docs] def define_writer(self, comm: mpi4py.MPI.Intracomm) -> None: """Define the writer. Args: comm (mpi4py.MPI.Intracomm): the MPI communicator """ self._writer = XDMFFile(comm, self.filename, "w")
[docs] def write(self, t: float): """Write functions to VTX file. Args: t (float): the time of export """ if not self._mesh_written: self._writer.write_mesh( self.field[0].post_processing_solution.function_space.mesh ) self._mesh_written = True for field in self.field: self._writer.write_function(field.post_processing_solution, t)
def __del__(self): if self._writer is not None: self._writer.close()