Source code for festim.exports.surface_flux
import ufl
from dolfinx import fem
from scifem import assemble_scalar
from festim.exports.surface_quantity import SurfaceQuantity
from festim.species import Species
from festim.subdomain.surface_subdomain import SurfaceSubdomain
[docs]
class SurfaceFlux(SurfaceQuantity):
"""Computes the flux of a field on a given surface.
Args:
field: species for which the surface flux is computed
surface: surface subdomain
filename: name of the file to which the surface flux is exported
Attributes:
see `festim.SurfaceQuantity`
"""
field: Species
surface: SurfaceSubdomain
filename: str
title: str
value: float
data: list[float]
@property
def title(self):
return f"{self.field.name} flux surface {self.surface.id}"
def __init__(
self, field: Species, surface: SurfaceSubdomain, filename: str | None = None
) -> None:
super().__init__(field=field, surface=surface, filename=filename)
[docs]
def compute(
self, u: fem.Function | ufl.indexed.Indexed, ds: ufl.Measure, entity_maps=None
):
"""Computes the value of the flux at the surface.
Args:
u: field for which the flux is computed
ds: surface measure of the model
entity_maps: entity maps relating parent mesh and submesh
"""
# obtain mesh normal from integration domain
mesh = ds.ufl_domain()
n = ufl.FacetNormal(mesh)
self.value = assemble_scalar(
fem.form(
-self.D * ufl.dot(ufl.grad(u), n) * ds(self.surface.id),
entity_maps=entity_maps,
)
)
self.data.append(self.value)