Source code for festim.exports.vtx
import warnings
from pathlib import Path
from dolfinx import fem, io
from festim.species import Species
from festim.subdomain.volume_subdomain import VolumeSubdomain
[docs]
class ExportBaseClass:
"""Export functions to VTX file
Args:
filename: The name of the output file
times: if provided, the field will be exported at these timesteps. Otherwise
exports at all timesteps. Defaults to None.
Attributes:
filename: The name of the output file
times: if provided, the field will be exported at these timesteps. Otherwise
exports at all timesteps. Defaults to None.
"""
_filename: Path | str
writer: io.VTXWriter
def __init__(
self,
filename: str | Path,
ext: str,
times: list[float] | list[int] | None | None = None,
):
name = Path(filename)
if name.suffix != ext:
warnings.warn(
f"Filename {filename} does not have {ext} extension, adding it."
)
name = name.with_suffix(ext)
self._filename = name
if times:
self.times = sorted(times)
else:
self.times = times
@property
def filename(self):
return self._filename
[docs]
class VTXTemperatureExport(ExportBaseClass):
"""Export temperature field functions to VTX file
Args:
filename: The name of the output file
times: if provided, the field will be exported at these timesteps. Otherwise
exports at all timesteps. Defaults to None.
Attributes:
filename: The name of the output file
times: if provided, the field will be exported at these timesteps. Otherwise
exports at all timesteps. Defaults to None.
writer: The VTXWriter object used to write the file
"""
writer: io.VTXWriter
def __init__(
self,
filename: str | Path,
times: list[float] | list[int] | None | None = None,
):
super().__init__(filename, ".bp", times)
[docs]
class VTXSpeciesExport(ExportBaseClass):
"""Export species field functions to VTX file
Args:
filename: The name of the output file
field: Set of species to export
subdomain: A field can be defined on multiple domains. This arguments specifies
what subdomains we export on. If `None` we export on all domains.
checkpoint: If True, the export will be a checkpoint file using adios4dolfinx
and won't be readable by ParaView. Default is False.
times: if provided, the field will be exported at these timesteps. Otherwise
exports at all timesteps. Defaults to None.
Attributes:
filename: The name of the output file
field: Set of species to export
times: if provided, the field will be exported at these timesteps. Otherwise
exports at all timesteps. Defaults to None.
writer: The VTXWriter object used to write the file
"""
_subdomain: VolumeSubdomain
_checkpoint: bool
writer: io.VTXWriter
def __init__(
self,
filename: str | Path,
field: Species | list[Species],
subdomain: VolumeSubdomain = None,
checkpoint: bool = False,
times: list[float] | list[int] | None | None = None,
):
super().__init__(filename, ".bp", times)
self.field = field
self._subdomain = subdomain
self._checkpoint = checkpoint
@property
def field(self) -> list[Species]:
return self._field
@field.setter
def field(self, value: Species | list[Species]):
"""
Update the field to export.
Args:
value: The species to export
Raises:
TypeError: If input field is not a Species or a list of Species
Note:
This also creates a new writer with the updated field.
"""
# check that all elements of list are festim.Species
if isinstance(value, list):
for element in value:
if not isinstance(element, Species | str):
raise TypeError(
"field must be of type festim.Species or a list of "
"festim.Species or str"
)
val = value
elif isinstance(value, Species):
val = [value]
else:
raise TypeError(
"field must be of type festim.Species or a list of festim.Species or "
"str",
f"got {type(value)}.",
)
self._field = val
[docs]
def get_functions(self) -> list[fem.Function]:
"""
Returns list of species for a given subdomain. If using legacy mode, return the
whole species.
"""
legacy_output: bool = False
for field in self._field:
if field.legacy:
legacy_output = True
break
if legacy_output:
return [field.post_processing_solution for field in self._field]
else:
if self._subdomain is None:
raise ValueError("Subdomain must be specified")
else:
outfiles = []
for field in self._field:
if self._subdomain in field.subdomains:
outfiles.append(
field.subdomain_to_post_processing_solution[self._subdomain]
)
return outfiles