FESTIM v2.0: Upgraded framework for multi-species hydrogen transport
Remi Delaporte-Mathurin, James Dark, Jorgen Dokken, Huihua Yang, Kaelyn Dunnell, Chirag Khurana, Ethan Peterson
FEniCS 2026 | June, 2026 | Paris, France
+
+
Deuterium
Tritium
+
+
Helium
neutron
Fusion
Diffusion-reaction
or
At interfaces
Hard
Very hard!
Flux continuity
Conservation of chemical potential
2019 - 2024
2024 - Today
User friendly - Intuitive, Python API easy to use
Apache 2.0 license - Suitable for academic and commercial
Easy install - conda install -c conda-forge festim
Online tutorials - Dozens of tutorials
Online documentation - Auto-generated
8,000+ forum views/month - Public, searchable Q&A
27+ institutions - Adopted by universities, labs and industry
30+ contributors - Open to new developers and users
Monthly dev meetings - Community-driven roadmap
130+ Slack users - Active developer and user support
Built on FEniCSx - Proven FEM backend, 1.5M+ downloads
5 team members at MIT - more around the world
On GitHub - Transparent, version-controlled development
NumFOCUS affiliation - Backed by a sustainability non-profit
CI/CD workflows - Rigorous testing and streamlined releases
Performance
FEniCSx - JIT to fast C++ rapid assembly
High-performance solvers - PETSc back-end
Built for HPC - Native MPI, runs on 1000’s of cores
Tuned control - Custom meshes, solvers, finite elements
Fast I/O - Parallel mesh loading, low memory footprint
Usability
Sustainability
Community
Docs users
Fusion machine developers
Research organisations
Average person in this room
Us
import festim as F
import numpy as np
my_model = F.HydrogenTransportProblem()
my_model.mesh = F.Mesh1D(vertices=np.linspace(0, 1, num=1001))
mat = F.Material(D_0=1, E_D=0.0)
volume_subdomain = F.VolumeSubdomain1D(id=1, borders=[0, 1], material=mat)
boundary_left = F.SurfaceSubdomain1D(id=1, x=0)
boundary_right = F.SurfaceSubdomain1D(id=2, x=1)
my_model.subdomains = [volume_subdomain, boundary_left, boundary_right]
H = F.Species("H")
my_model.species = [H]
my_model.temperature = 300
my_model.boundary_conditions = [
F.FixedConcentrationBC(subdomain=boundary_left, value=1, species=H),
F.FixedConcentrationBC(subdomain=boundary_right, value=0, species=H),
]
my_model.settings = F.Settings(atol=1e-10, rtol=1e-10, final_time=2)
my_model.settings.stepsize = F.Stepsize(0.05, milestones=[0.05, 0.1, 0.2, 0.5, 1]) # s
profile = F.Profile1DExport(field=H, subdomain=volume_subdomain, times=my_model.settings.stepsize.milestones)
my_model.exports = [
F.VTXSpeciesExport(
field=H,
filename="hydrogen_concentration.bp",
),
profile,
]
my_model.initialise()
my_model.run()Change of variable method
Mixed formulation
Mixed formulation
Submesh 1
Submesh 2
Mixed formulation
1. Penalty method
2. Nitsche method
Dark, James, Rémi Delaporte-Mathurin, Jørgen S. Dokken, et al. “FESTIM v2.0: Upgraded Framework for Multi-Species Hydrogen Transport and Enhanced Performance.” International Journal of Hydrogen Energy 220 (March 2026): 153987. https://doi.org/10.1016/j.ijhydene.2026.153987.
Please redirect complex maths questions to this guy!
Mixed formulation
Mixed formulation
velocity, temperature, turbulent viscosity...
tritium production
Heat source
Temperature
Neutronics
Thermo-hydraulics
Tritium transport