Source code for ggp.geometry.io.fenics_reader

# Copyright (c) 2026 Simone Coniglio
# Licensed under the MIT license. See LICENSE file in the project directory for details.
"""FEniCS built-in geometry reader.

Handles ``fenics_rectangle`` (2-D quadrilateral mesh) and ``fenics_box``
(3-D hexahedral mesh) geometry types by calling FEniCS mesh generators.
"""
from __future__ import annotations

from typing import Any

import numpy as np

from .base import DomainRepresentation, GeometryReader
from .registry import register_reader


[docs] @register_reader("fenics_rectangle") class FenicsRectangleReader(GeometryReader): """Creates a structured quadrilateral rectangle via ``dolfin.RectangleMesh``."""
[docs] def read(self, spec: Any) -> DomainRepresentation: import dolfin as df p = spec.params Lx = float(p.get("Lx", 1.0)) Ly = float(p.get("Ly", 1.0)) nx = int(p.get("nx", 10)) ny = int(p.get("ny", 10)) mesh = df.RectangleMesh.create( [df.Point(0.0, 0.0), df.Point(Lx, Ly)], [nx, ny], df.CellType.Type.quadrilateral, ) vertices = mesh.coordinates() cells = np.array([c.entities(0) for c in df.cells(mesh)]) return DomainRepresentation( vertices=vertices, cells=cells, cell_type="quad", dim=2, metadata={"dolfin_mesh": mesh, "Lx": Lx, "Ly": Ly, "nx": nx, "ny": ny}, )
[docs] @staticmethod def supports(geometry_type: str) -> bool: return geometry_type == "fenics_rectangle"
[docs] @register_reader("fenics_box") class FenicsBoxReader(GeometryReader): """Creates a structured hexahedral box via ``dolfin.BoxMesh``."""
[docs] def read(self, spec: Any) -> DomainRepresentation: import dolfin as df p = spec.params Lx = float(p.get("Lx", 1.0)) Ly = float(p.get("Ly", 1.0)) Lz = float(p.get("Lz", 1.0)) nx = int(p.get("nx", 10)) ny = int(p.get("ny", 10)) nz = int(p.get("nz", 10)) mesh = df.BoxMesh.create( [df.Point(0.0, 0.0, 0.0), df.Point(Lx, Ly, Lz)], [nx, ny, nz], df.CellType.Type.hexahedron, ) vertices = mesh.coordinates() cells = np.array([c.entities(0) for c in df.cells(mesh)]) return DomainRepresentation( vertices=vertices, cells=cells, cell_type="hex", dim=3, metadata={"dolfin_mesh": mesh, "Lx": Lx, "Ly": Ly, "Lz": Lz, "nx": nx, "ny": ny, "nz": nz}, )
[docs] @staticmethod def supports(geometry_type: str) -> bool: return geometry_type == "fenics_box"