Source code for festim.subdomain.surface_subdomain

from collections.abc import Callable

import dolfinx
import numpy as np


[docs] class SurfaceSubdomain: """Surface subdomain class. Args: id: the id of the surface subdomain locator: a callable function that locates the boundary facets of the subdomain Examples: .. testsetup:: SurfaceSubdomain from festim import SurfaceSubdomain .. testcode:: SurfaceSubdomain SurfaceSubdomain(id=1, locator=lambda x: np.isclose(x[0], 1.0)) SurfaceSubdomain(id=1, locator=lambda x: np.logical_or(np.isclose(x[1], 0.0), np.isclose(x[1], 1.0))) SurfaceSubdomain(id=1, locator=lambda x: np.logical_and(np.isclose(x[0], 0.0), np.isclose(x[1], 1.0))) SurfaceSubdomain(id=1, locator=lambda x: np.logical_and(np.isclose(x[0], 0.0), x[1] <= 0.5)) """ id: int locator: Callable def __init__(self, id: int, locator: Callable | None = None): self.id = id self.locator = locator
[docs] def locate_boundary_facet_indices(self, mesh: dolfinx.mesh.Mesh) -> np.ndarray: """Locate boundary facets of the subdomain in the mesh. Args: mesh: a dolfinx mesh object Raises: ValueError: if no locator function is provided Returns: the list of entities (facets) that belong to the subdomain """ if self.locator is None: raise ValueError( "No locator function provided for locating boundary facets." ) return dolfinx.mesh.locate_entities_boundary( mesh, mesh.topology.dim - 1, self.locator )
[docs] class SurfaceSubdomain1D(SurfaceSubdomain): """Surface subdomain class for 1D cases. Args: id: the id of the surface subdomain x: the x coordinate of the surface subdomain Attributes: id: the id of the surface subdomain x: the x coordinate of the surface subdomain Examples: .. testsetup:: SurfaceSubdomain1D from festim import SurfaceSubdomain1D .. testcode:: SurfaceSubdomain1D SurfaceSubdomain1D(id=1, x=1) """ # FIXME: Rename this to _id and use getter/setter id: int x: float def __init__(self, id: int, x: float) -> None: super().__init__(id, locator=lambda x_: np.isclose(x_[0], x)) self.x = x
def find_surface_from_id(id: int, surfaces: list): """Returns the correct surface subdomain object from a list of surface ids based on an int. Args: id (int): the id of the surface subdomain surfaces (list of F.SurfaceSubdomain): the list of surfaces Returns: festim.SurfaceSubdomain: the surface subdomain object with the correct id Raises: ValueError: if the surface name is not found in the list of surfaces """ for surf in surfaces: if surf.id == id: return surf raise ValueError(f"id {id} not found in list of surfaces")