Skip to main content

FEM Core

NGSolve/Netgen finite-element model-building core — no PySide6 or Qt dependency. Runs headlessly (no display required).

Python Version License

Features

  • 🧱 Layered FEM pipeline — mesh → function space → weak-form assembly, each stage a swappable service
  • 🧩 Typed, serializable models — FemModel, FemFormulation, BoundaryCondition, ... with to_dict()/from_dict()
  • 🌊 Physics formulations — linear elasticity, (complex) Helmholtz, Reissner-Mindlin plates, Naghdi shells, and CUSTOM symbolic weak forms
  • 🎯 Domain facades — AcousticModel, PlateModel, ShellModel builders in physics vocabulary
  • 🧮 Studies — static, modal and frequency-sweep analyses through one StudyManager
  • 📐 Stress — stresses, membrane forces, moments and shear forces as CoefficientFunctions
  • 🗂️ Geometry import — STEP/IGES/BREP with deterministic, geometry-sorted region indices
  • 💾 Results and projects — HDF5 result files and shared FemProject documents, with the fem-core-run / fem-core-view CLIs
  • 🔒 Safe expressions — boundary and custom-form expressions parsed by a restricted AST walker, never eval()
  • 🧪 Dependency-injectable services — every service behind a Protocol, so tests can mock NGSolve/Netgen
  • 📊 Visualization — VTK post-processing (.vtu, .png, interactive) via the companion package fem-post

Scope

fem-core builds the mesh, function space and forms, and solves them with static, modal or frequency-sweep studies. Transient (time-stepping) analysis is out of scope for now.

Installation

pip install fem-core            # from PyPI
pip install "fem-core[viz]"     # plus fem-post (VTK post-processing)
pip install "fem-core[pardiso]" # plus MKL, for the PARDISO solver (x86-64 Linux/Windows)

fem-core is proprietary software (see License below). The optional pardiso extra installs Intel's MKL (with tbb and intel-openmp), which is governed by Intel's own licences, not fem-core's; fem-core works without it.

For development, from the repo root:

uv sync
source .venv/bin/activate

Quick Start

from netgen.occ import Box, OCCGeometry, Pnt

from fem_core.enums import BoundaryConditionType, FemDimension, FunctionSpaceType, StudyType
from fem_core.managers.fem_model_manager import FemModelManager
from fem_core.managers.study_manager import StudyManager
from fem_core.models.boundary_condition import BoundaryCondition
from fem_core.models.fem_formulation import FemFormulation
from fem_core.models.fem_model import FemModel
from fem_core.models.formulation_parameters import LinearElasticityParameters
from fem_core.models.function_space_config import FunctionSpaceConfig
from fem_core.models.mesh_config import MeshConfig
from fem_core.models.study import Study
from fem_core.models.study_parameters import ModalStudyParameters, StaticStudyParameters
from fem_core.physics import LINEAR_ELASTICITY

geo = OCCGeometry(Box(Pnt(0, 0, 0), Pnt(100, 20, 10)))

model = FemModel(
    name="Bracket",
    dimension=FemDimension.DIM_3D,
    formulation=FemFormulation(
        formulation_type=LINEAR_ELASTICITY.id,
        parameters=LinearElasticityParameters(E=210e9, nu=0.3, body_force_y=-9.81),
    ),
    function_space=FunctionSpaceConfig(space_type=FunctionSpaceType.VECTOR_H1, order=2),
    mesh_config=MeshConfig(maxh=5.0),
    boundary_conditions=[BoundaryCondition(bc_type=BoundaryConditionType.DIRICHLET, region="fixed_face")],
)

manager = FemModelManager()
managed = manager.build_model(model, geo=geo.shape)  # mesh -> function space -> forms

studies = StudyManager(manager)
static = studies.create_study(managed.model_id, Study(parameters=StaticStudyParameters()))
studies.run_study(static.study_id)
static.result.gridfunction

modal = studies.create_study(
    managed.model_id, Study(study_type=StudyType.MODAL, parameters=ModalStudyParameters(num_modes=6))
)
studies.run_study(modal.study_id)
modal.result.eigenvalues  # omega^2, ascending

Facades build the same FemModel from domain vocabulary:

from fem_core.facades.acoustic_model import AcousticModel

fem_model = (
    AcousticModel(name="Cabin Acoustics", speed_of_sound=343.0, density=1.225)
    .add_sound_hard_wall("rigid_walls")
    .add_impedance_boundary("absorber_panel", impedance=415.0 + 50.0j)
    .to_fem_model()
)

Saved projects and results can be solved or viewed from the command line:

fem-core-run beam.cadw
fem-core-view beam.results.h5 --study Modes --png modes.png

Documentation

  • User Guide — studies, undo/redo, result storage, projects, geometry import, 2D/shell/plate models, stress, subdomains, visualization
  • Architecture — layers, services, managers, facades and key design decisions
  • Development — testing and releasing
  • fem-post — VTK post-processing
  • Examples and validations

License

Proprietary — see LICENSE. Third-party libraries keep their own licences, listed in NOTICE.

Metadata

Release files for fem-core 0.1.18

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for fem-core 0.1.18
File Interpreter ABI Platform
fem_core-0.1.18-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
fem_core-0.1.18-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.17+ x86-64 Details

Total release size: 17.6 MB

Release files / fem_core-0.1.18-cp312-cp312-win_amd64.whl

Download URL fem_core-0.1.18-cp312-cp312-win_amd64.whl
Size 2.2 MB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
8cf52837b95184a343becccaf02d9783f1e56793452997e1121524230b308f38
BLAKE2b-256 checksum
How to use checksums
24ac41ec39baeaa9e58c2c66df302bddf5c1bc03bb789e4ba902903f265a8855
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release files / fem_core-0.1.18-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl

Download URL fem_core-0.1.18-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Size 15.4 MB
Tags CPython 3.12 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
593086639bdec870cb91676c1c518c3f45ea4c72d965b706040904632309475f
BLAKE2b-256 checksum
How to use checksums
598c81936ec91f2c8d6f9927630459547d772e18d3df7f9af641c6b8579c2fba
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.18 This release

2 release files

0.1.17

2 release files

0.1.16

2 release files

0.1.15

2 release files

0.1.9

2 release files

0.1.8

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page