Source code for festim.exports.derived_quantities.average_volume

from festim import VolumeQuantity
import fenics as f


[docs] class AverageVolume(VolumeQuantity): """ Computes the average value of a field in a given volume int(f dx) / int (1 * dx) Args: field (str, int): the field ("solute", 0, 1, "T", "retention") volume (int): the volume id Attributes: field (str, int): the field ("solute", 0, 1, "T", "retention") volume (int): the volume 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 r (ufl.indexed.Indexed): the radius of the cylinder .. note:: Units are in H/m3 for hydrogen concentration and K for temperature """ def __init__(self, field, volume: int) -> None: super().__init__(field=field, volume=volume) @property def allowed_meshes(self): return ["cartesian"] @property def export_unit(self): if self.field == "T": return "K" else: return "H m-3" @property def title(self): quantity_title = f"Average {self.field} volume {self.volume}" if self.show_units: return quantity_title + f" ({self.export_unit})" else: return quantity_title def compute(self): return f.assemble(self.function * self.dx(self.volume)) / f.assemble( 1 * self.dx(self.volume) )
class AverageVolumeCylindrical(AverageVolume): """ Computes the average value of a field in a given volume int(f dx) / int (1 * dx) dx is the volume measure in cylindrical coordinates. dx = r dr dz dtheta Note: for particle fluxes J is given in H/s, for heat fluxes J is given in W Args: field (str, int): the field ("solute", 0, 1, "T", "retention") volume (int): the volume id Attributes: field (str, int): the field ("solute", 0, 1, "T", "retention") volume (int): the volume 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 r (ufl.indexed.Indexed): the radius of the sphere """ def __init__(self, field, volume) -> None: super().__init__(field=field, volume=volume) self.r = None @property def allowed_meshes(self): return ["cylindrical"] def compute(self): if self.r is None: mesh = ( self.function.function_space().mesh() ) # get the mesh from the function rthetaz = f.SpatialCoordinate(mesh) # get the coordinates from the mesh self.r = rthetaz[0] # only care about r here avg_vol = f.assemble( self.function * self.r * self.dx(self.volume) ) / f.assemble(1 * self.r * self.dx(self.volume)) return avg_vol class AverageVolumeSpherical(AverageVolume): """ Computes the average value of a field in a given volume int(f dx) / int (1 * dx) dx is the volume measure in cylindrical coordinates. dx = rho dtheta dphi Note: for particle fluxes J is given in H/s, for heat fluxes J is given in W Args: field (str, int): the field ("solute", 0, 1, "T", "retention") volume (int): the volume 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 """ def __init__(self, field, volume) -> None: super().__init__(field=field, volume=volume) self.r = None @property def allowed_meshes(self): return ["spherical"] def compute(self): if self.r is None: mesh = ( self.function.function_space().mesh() ) # get the mesh from the function rthetaphi = f.SpatialCoordinate(mesh) # get the coordinates from the mesh self.r = rthetaphi[0] # only care about r here avg_vol = f.assemble( self.function * self.r**2 * self.dx(self.volume) ) / f.assemble(1 * self.r**2 * self.dx(self.volume)) return avg_vol