Source code for syssimx.components.fem
from __future__ import annotations
from abc import abstractmethod
from pathlib import Path
from typing import Any
from ..core.base import CoSimComponent
[docs]
class FEMComponent(CoSimComponent):
"""
Minimal abstract base for FEM co-simulation components.
- No direct dependency on a specific FEM library (ngsolve/netgen, etc.).
- Subclasses implement backend specifics (mesh, FE spaces, solvers, visualization).
"""
[docs]
def __init__(self, name: str, label: str | None = None, group: str | None = None):
super().__init__(name, label, group)
# Geometry and Mesh
self.geometry: Any | None = None
self.mesh: Any | None = None
# Spaces and Grid functions
self.spaces: dict[str, Any] | None = {}
self.gfs: dict[str, Any] | None = {}
self.gfs_history: dict[str, Any] | None = {}
# Bilinear and Linear Form
self.bfa: Any | None = None
self.lf: Any | None = None
# Solver
self.solver: Any | None = None
# Visualization
self.scene: Any | None = None
# ---- Abstract hooks for FEM-specific setup ----
[docs]
@abstractmethod
def _initialize_component(self, t0: float) -> None:
"""Setup mesh, FE spaces, solver, material laws, initial conditions."""
...
[docs]
@abstractmethod
def _do_step_internal(self, t: float, dt: float) -> None:
"""Advance FEM solver from t to t+dt."""
...
# ---- Optional file I/O hooks (raise NotImplementedError by default) ----
[docs]
def load_mesh_from_file(self, path: Path) -> None:
"""Optional: load mesh from file (GMSH, VTK, XDMF, etc.)."""
raise NotImplementedError(f"{self.name}: load_mesh_from_file not implemented")
[docs]
def export_results(self, path: Path, format: str = "vtk") -> None:
"""Optional: export time series to file."""
raise NotImplementedError(f"{self.name}: export_results not implemented")
[docs]
def visualize_state(self) -> None:
"""Optional: library-specific visualization (NGSolve Draw, matplotlib, etc.)."""
raise NotImplementedError(f"{self.name}: visualize_state not implemented")