Source code for festim.exports.derived_quantities.point_value

from festim import DerivedQuantity
from mpi4py import MPI as pyMPI
import numpy as np


[docs] class PointValue(DerivedQuantity): """ Computes the value of a field at a given point Args: field (str, int): the field ("solute", 0, 1, "T", "retention") x (int, float, tuple, list): the point coordinates Attributes: field (str, int): the field ("solute", 0, 1, "T", "retention") x (int, float, tuple, list): the point coordinates title (str): the title of the derived quantity show_units (bool): show the units in the title in the derived quantities file function (dolfin.function.function.Function): the solution function of the field .. note:: Units are in H/m3 for hydrogen concentration and K for temperature """ def __init__(self, field: str | int, x: int | float | tuple | list) -> None: super().__init__(field=field) # make sure x is an iterable if not hasattr(x, "__iter__"): x = [x] self.x = x @property def export_unit(self): if self.field == "T": return "K" else: return "H m-3" @property def title(self): quantity_title = f"{self.field} value at {self.x}" if self.show_units: return quantity_title + f" ({self.export_unit})" else: return quantity_title
[docs] def compute(self): """Evaluates the value of a function at the given point""" # Handles the RuntimeError due to mesh partitioning try: value_local = self.function(self.x) except RuntimeError: value_local = np.inf * np.ones(self.function.value_shape()) mesh = self.function.function_space().mesh() comm = mesh.mpi_comm() value_global = np.zeros_like(value_local) comm.Allreduce(value_local, value_global, op=pyMPI.MIN) return value_global