Modules
Published configurations
This catalogue presents Rodin's performance benchmarks, from individual mathematical operations to assembled finite element problems. Each benchmark describes the operation measured, the inputs and the measurement conditions. Published timing histories help track changes across commits for a selected configuration and benchmark case.
Benchmarks are organized by their owning module, following the library's directory hierarchy. The module groups below provide entry points to classes and workloads; MPI and PETSc benchmarks remain within their respective modules. Physical contexts, such as Stokes, collect benchmarks whose meaning depends on a mathematical model. Descriptions become more detailed as the navigation reaches individual benchmarks, explaining what is measured and why. Use the search to find a class, operation or workload directly. Modules without registered benchmarks are identified on their pages.
Benchmark machine
Published CI benchmarks run on standard GitHub-hosted ubuntu-24.04
virtual machines for public repositories.
| System | CPU | Memory | SSD |
|---|---|---|---|
| Ubuntu 24.04, x64 | 4 vCPUs | 16 GB | 14 GB |
The benchmark builds use GCC 14 and Release mode. Each job runs one benchmark executable at a time. OpenMP, OpenBLAS and MKL use one thread; MPI ranks share the same runner. The selected configuration identifies the build and rank count.
The CPU model and host load can vary between virtual machines, so small timing differences should be checked across repeated runs. GitHub runner specifications describe the available hardware. The source workflow is BenchmarkGroup.yml.
Core
Geometry, finite element spaces, variational expressions, assembly and linear algebra form the path from a weak formulation to an algebraic system.
Assembly
Global assembly of discrete operators.
Assembly::
Form language
Typed expressions for constructing variational forms.
auto stiffness = Integral(Grad(u), Grad(v)); auto load = Integral(f, v); Problem problem(u, v); problem = stiffness - load + DirichletBC(u, Zero());
An expression's C++ type records its operands and algebraic role. Function expressions represent known fields; shape-function expressions carry a trial or test slot; bilinear integrators pair those slots. Traits propagate scalar type, range and finite element space through composition.
No benchmarks yet
Geometry
Meshes, geometric transformations, and mapped evaluation.
Mesh<Context::
IO
Reading and writing meshes, fields, and associated data.
IO::XDMF xdmf("output"); xdmf.grid().setMesh(mesh).add("u", u.getSolution()); xdmf.write();
MeshLoader and MeshPrinter import and export meshes; GridFunctionLoader and GridFunctionPrinter transfer discrete fields. Format-specific backends support MFEM, MEDIT, and HDF5 data, while IO::
Math
Spatial arithmetic, matrix operations, and sparse linear algebra.
SpatialVector<Real> a{1, 2, 3}; SpatialVector<Real> b{4, 5, 6}; const Real product = dot(a, b); // 32 const auto normal = a.cross(b); // {-3, 6, -3} const Real length = a.norm(); // sqrt(14)
SpatialVector<T> and SpatialMatrix<T> support small spatial calculations without heap allocation. Vector<T>, Matrix<T>, and their fixed-size counterparts provide Eigen-compatible algebra; LinearSystem<Operator, Vector> groups system data and constraint elimination. These types support geometric mappings, constitutive calculations, assembly, and linear solves.
Quadrature formulae
Reference integration formulas selected by geometry and exactness.
A reference rule consists of sites and weights .
Solver
Solution of linear and nonlinear discrete systems.
CG handles symmetric positive-definite systems, GMRES handles general iterative solves, and SparseLU provides direct sparse factorization. NewtonSolver drives nonlinear solves. These solvers operate on prepared systems or variational problems and provide convergence controls for PDE and optimization calculations.
Variational
Finite element spaces, fields, and variational problems.
H1 and P1 define finite element spaces, while GridFunction evaluates and interpolates discrete fields. TrialFunction, TestFunction, and Problem express weak forms, boundary conditions, and the algebraic problems used to solve PDEs.
Infrastructure
Execution contexts, diagnostics, spatial search, type utilities, serialization and numerical test helpers support the numerical modules.
Alert
Contextual exceptions and diagnostic reporting.
Alert::Info() << "Assembling the system..." << Alert::Raise;
Alert::
No benchmarks yet
Context
Execution contexts for local and distributed computation.
using LocalMesh = Geometry::Mesh<Context::Local>; auto mesh = LocalMesh::UniformGrid(Geometry::Polytope::Type::Triangle, {8, 8});
Local selects local execution, and Context::
No benchmarks yet
Location
Spatial indexing and geometric search.
Location::AABB locator(mesh); const auto point = locator.locate(physicalCoordinates);
AABB builds a bounding-volume hierarchy to locate physical coordinates in a mesh and recover the containing cell and reference coordinates. The resulting Geometry::
Serialization
Serialization and reconstruction of library objects.
archive << values;
Boost.Serialization adapters store arrays, Eigen-compatible dense matrices, flat containers, and optional values. The export registrations cover selected ParametricTransformation instantiations used in MPI shard transfer. Including the relevant adapter headers enables binary archives of supported numerical data and container structures.
No benchmarks yet
Test
Helpers for constructing numerical tests.
FDProbe compares assembled tangents with finite differences and returns error diagnostics in FDProbeReport. ExpectedResultTable organizes known input-output cases, and random generators supply test samples. These helpers support numerical regression tests for constitutive laws, geometry, and variational operators.
No benchmarks yet
Utility
Type utilities and generic programming helpers.
std::variant<int, Real> value = 2; const Real result = std::visit(Utility::Overloaded{ [](int x) { return Real(x); }, [](Real x) { return x; } }, value);
ParameterPack and Zip support compile-time type and parameter manipulation. Overloaded combines callable visitors, and OptionalReference represents optional non-owning access. These helpers support generic expressions, type dispatch, and reusable library extensions.
No benchmarks yet
Models
Transport, distance construction, regularization, solid mechanics and cardiac models are expressed using the core numerical interfaces.
Adaptation
Mesh adaptation and deformation operations.
SWIFT::
No benchmarks yet
Advection
Transport and advection of fields.
Lagrangian advances scalar fields on unstructured meshes by tracing characteristics and projecting the transported field into a finite element space. It is used to transport level sets and other evolving fields; boundary policies control the treatment of characteristics that reach the mesh boundary.
No benchmarks yet
Distance
Distance propagation and Poisson-based level-set approximations.
The unsigned distance to a geometric set is
No benchmarks yet
Eikonal
Eikonal equations and distance propagation.
FMM implements fast marching on simplicial meshes, propagating arrival times from prescribed seed vertices. It provides the underlying distance propagation used by level-set reinitialization and distance-field construction, with a priority queue controlling the order of vertex updates.
No benchmarks yet
Heart
Cardiac models and their coupled state evolution.
const auto report = model.step(dt);
CCMLC2014T advances a reduced ventricular model through a cardiac cycle. HolzapfelReducedLaw and CCMLC2014PassiveLaw supply its reduced passive energy and stress response. The module supports cardiac-cycle studies and constitutive parameter calibration before larger three-dimensional simulations.
No benchmarks yet
Hilbert
Hilbert-space formulations and regularization.
getTrialFunction() / getTestFunction() solves a regularized extension problem that converts a linear functional into a smooth field over the mesh. It is commonly used to extend boundary shape derivatives into volume descent directions, with a configurable length scale controlling smoothing and boundary conditions constraining the extension.
No benchmarks yet
Solid
Finite-strain kinematics, constitutive responses and virtual-work forms.
A total-Lagrangian hyperelastic model uses a reference domain , displacement and deformation gradient . The stored energy determines the first Piola–Kirchhoff stress and tangent action.
Parallelism and integrations
These modules connect Rodin to distributed execution, external solver backends, mesh adaptation and graph partitioning libraries.
MMG
Mesh adaptation through the MMG integration.
MMG::Mesh cut = MMG::LevelSetDiscretizer() .setLevelSet(0.0) .split(interior, { interior, exterior }) .setBoundaryReference(interface) .discretize(phi);
MMG::
No benchmarks yet
MPI
Distributed meshes, finite element spaces, and search operations.
using DistributedMesh = Geometry::Mesh<Context::MPI>;
Context::
PETSc
PETSc storage, assembly and linear/nonlinear solver adapters.
PetscErrorCode ierr = PetscInitialize(&argc, &argv, PETSC_NULLPTR, PETSC_NULLPTR); assert(ierr == PETSC_SUCCESS); { // Construct and use PETSc-backed spaces, fields, forms and solvers here. } ierr = PetscFinalize(); assert(ierr == PETSC_SUCCESS);
PETSc-backed trial/test functions connect Rodin variational forms to PETSc matrices, vectors, Krylov solvers and nonlinear solvers. The mesh execution context determines whether those objects are local or distributed. Backends and supported configurations describes the relationship between context, assembly strategy and algebraic storage.
Scotch
Graph partitioning through the Scotch integration.
Scotch::Partitioner partitioner(mesh); partitioner.partition(numRanks);
Partitioner builds a graph-based partition of mesh cells using Scotch. The resulting cell assignments feed mesh sharding and distribution, helping divide finite element workloads across MPI ranks while limiting connections between partitions.
No benchmarks yet
Physical contexts
Stokes
The stationary Stokes model describes slow viscous flow of an incompressible Newtonian fluid, with inertia neglected. In a domain \(\Omega\), the velocity \(\boldsymbol{u}\) and pressure \(p\) satisfy momentum balance and incompressibility:
Here \(\nu>0\) is the constant viscosity coefficient and \(\boldsymbol{f}\) is the applied force. Pressure enforces the incompressibility constraint. With homogeneous velocity prescribed on \(\partial\Omega\), pressure is determined up to an additive constant; the normalization \(\int_\Omega p\,\mathrm dx=0\) fixes that constant. The mixed velocity–pressure discretization must preserve this coupling to give a stable approximation.