Source code for festim.exports.derived_quantities.maximum_surface
from festim import SurfaceQuantity
from dolfin import MPI
import numpy as np
[docs]
class MaximumSurface(SurfaceQuantity):
"""
Computes the maximum value of a field on a given surface
Args:
field (str, int): the field ("solute", 0, 1, "T", "retention")
surface (int): the surface id
Attributes:
field (str, int): the field ("solute", 0, 1, "T", "retention")
surface (int): the surface id
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, surface) -> None:
super().__init__(field=field, surface=surface)
@property
def export_unit(self):
if self.field == "T":
return "K"
else:
return "H m-3"
@property
def title(self):
quantity_title = f"Maximum {self.field} surface {self.surface}"
if self.show_units:
return quantity_title + f" ({self.export_unit})"
else:
return quantity_title
[docs]
def compute(self, surface_markers):
"""Maximum of f over subdomains facets marked with self.surface"""
V = self.function.function_space()
mesh = surface_markers.mesh()
dm = V.dofmap()
facets = surface_markers.where_equal(self.surface)
entity_closure_dofs = np.array(
dm.entity_closure_dofs(mesh, mesh.topology().dim() - 1, facets),
dtype=np.int32,
)
local_dofs = entity_closure_dofs < len(self.function.vector().get_local())
if len(local_dofs) == 0:
local_max = -np.inf
else:
local_max = np.max(
self.function.vector().get_local()[entity_closure_dofs[local_dofs]]
)
global_max = MPI.max(mesh.mpi_comm(), local_max)
return global_max