← Retour

ORFAS

Moteur de simulation physique non linéaire écrit en Rust pour la biomécanique de tissus mous, pensé comme alternative fiable aux outils C++ existants.

Projet personnel — calcul scientifique
Nov. 2025 – en cours, en solo
RustSimulation numériqueCalcul parallèleBiomécaniqueTests & validationInterface interactive

Contexte

La simulation de tissus mous pour des applications médicales (planification chirurgicale, retour haptique, jumeaux numériques d'organes) s'appuie depuis des décennies sur des outils C++ comme SOFA ou FEBio. SOFA a d'ailleurs directement inspiré ORFAS, mais son architecture par plugins C++ rend l'intégration de nouveaux composants coûteuse. Côté Rust, la bibliothèque FEM la plus aboutie de l'écosystème, Fenris, est à l'arrêt depuis 2022.

ORFAS est né de cette double observation : repenser un moteur de simulation physique en Rust, un langage conçu pour éliminer par construction toute une classe de bugs mémoire courants en calcul scientifique, avec une architecture où chaque brique (élément, matériau, solveur) est interchangeable par construction plutôt que figée dans une hiérarchie de classes.

Vue d'ensemble

ORFAS s'organise en quatre briques indépendantes, chacune publiée comme un module Rust à part entière, qui se combinent pour former la chaîne complète — de la donnée d'entrée jusqu'à la visualisation du résultat.

Tissus biologiques calibrés
Maillages 3D importés
Moteur de calculéléments finis, matériaux, solveurs
Visualiseur interactif

Le moteur physique

Le cœur du projet ne repose pas sur une hiérarchie de classes figée : chaque élément fini, chaque modèle de matériau et chaque solveur est un composant indépendant, interchangeable grâce au système de traits générique de Rust. Concrètement, n'importe quel type d'élément peut être simulé avec n'importe quel modèle de comportement et n'importe quel solveur, sans code spécial à écrire pour chaque combinaison.

Une simulation suit toujours la même chaîne de traitement :

1

Maillage

2

Matériau

3

Résolution

4

Validation

Et cette indépendance se retrouve à trois niveaux, combinables librement :

Éléments

Tétraèdre linéaireTétraèdre quadratiqueHexaèdrePoutre 3DCoque
×

Matériaux

Référence (linéaire)Hyperélastique isotropeAnisotrope (fibres)Viscoélastique
×

Solveurs

StatiqueDynamique implicite

Toute combinaison entre ces trois familles est valide : un maillage de coques avec un matériau anisotrope et un solveur dynamique fonctionne aussi nativement qu'un tétraèdre linéaire élastique en statique.

Bibliothèque d'éléments

ÉlémentUsage
Tétraèdre linéaireMaillages générés rapidement, précision modérée
Tétraèdre quadratiquePrécision accrue, validé nœud par nœud contre un solveur de référence
HexaèdreMaillages structurés, sans verrouillage numérique
Poutre 3DStructures filaires (formulation Euler-Bernoulli)
CoqueSurfaces minces (formulation Bathe & Dvorkin, 1986)

Modèles de comportement

Neuf modèles de comportement couvrent l'élasticité linéaire de référence jusqu'aux tissus fibreux anisotropes : Saint-Venant-Kirchhoff, élasticité linéaire, Neo-Hookéen, Mooney-Rivlin, Ogden, Holzapfel-Ogden (fibres anisotropes), et une extension viscoélastique applicable à n'importe lequel des modèles précédents pour représenter les effets visqueux des tissus vivants.

Solveurs

Deux modes de résolution sont disponibles : statique, par itérations de Newton-Raphson (avec une variante à matrice tangente mise en cache pour accélérer la convergence), et dynamique, par intégration implicite d'Euler avec amortissement de Rayleigh pour dissiper l'énergie numériquement. Les systèmes linéaires sont résolus par gradient conjugué préconditionné, assemblés en parallèle sur plusieurs cœurs.

Bibliothèque de tissus biologiques calibrés

Plutôt que de laisser l'utilisateur deviner des paramètres physiques, ORFAS embarque dix tissus pré-calibrés, chacun sourcé depuis un article scientifique publié et accompagné d'un intervalle de confiance.

FoieNava et al., 2008
Cerveau — matière griseBudday et al., 2017
Cerveau — matière blancheBudday et al., 2017
MyocardeHolzapfel & Ogden, 2009
Paroi artérielleHolzapfel et al., 2000
TendonWeiss et al., 1996
LigamentWeiss et al., 1996
PeauGroves et al., 2013
ReinNasseri et al., 2002
ProstatePhipps et al., 2005

Philosophie d'ingénierie

Vérifier plutôt que supposer. Un modèle de matériau mal formulé peut produire une simulation qui a l'air correcte visuellement tout en violant les lois de la physique. ORFAS embarque un vérificateur de cohérence physique qui teste automatiquement n'importe quel modèle de comportement contre huit critères avant de l'autoriser dans une simulation — ne jamais supposer qu'un résultat est correct simplement parce qu'il « a l'air bien ».

Ne pas paralléliser à l'aveugle. J'ai testé la parallélisation du calcul des forces internes élément par élément, en supposant que plus de threads irait toujours plus vite. Mesure faite, c'était faux sur cette étape précise : le coût de lancement des threads dépassait largement le temps de calcul réel. Résultat gardé séquentiel pour cette partie, calcul parallèle réservé à l'assemblage global où le gain est réel et mesuré.

Validation & performance

La rigueur ne s'arrête pas aux tests unitaires : chaque nouvelle fonctionnalité est comparée à une solution mathématique connue ou à un solveur de référence reconnu, avec l'erreur mesurée et documentée plutôt qu'une simple case cochée.

276tests automatisés (unitaires et d'intégration)
0,56 %écart mesuré face à une solution analytique connue (traction axiale)
Précision machinegradients d'éléments comparés à un solveur de référence reconnu (FEniCS)
DOI Zenodoprojet citable, référencé pour un usage académique

Autre exemple de vérification croisée : quand un modèle générique (Mooney-Rivlin, Ogden) est réduit aux paramètres d'un cas particulier connu, il doit retomber exactement sur le modèle historique correspondant — c'est le cas ici, à la précision machine près.

~10× (limite d'Amdahl)10×271255121k3,4k8k27k64k216k

Accélération de l'assemblage parallèle mesurée sur 20 cœurs, selon le nombre de nœuds du maillage — plafond attendu autour de 10×, conforme à la loi d'Amdahl.

Visualiseur interactif

Le moteur de calcul est accompagné d'un visualiseur 3D interactif permettant d'importer un maillage, de choisir un tissu prédéfini ou de saisir des paramètres manuels, de définir des conditions aux limites au clic, de lancer une simulation statique ou dynamique, et d'observer la déformation et la carte de déplacement en temps réel — sans écrire une ligne de code.

Où en est le projet

ORFAS est explicitement étiqueté Pre-Alpha (version 0.8.1, citable via son DOI Zenodo). La feuille de route vers la 1.0 est détaillée thème par thème :

  • Export/import — formats VTU, OBJ, STL, DICOM/NIfTI
  • Rigueur scientifique — unités physiques type-sûres, métriques d'erreur automatisées
  • Rendu — moteur graphique dédié, visualiseur pensé pour un usage clinique
  • Corps rigides & contact — couplage FEM-rigide, contact tissu-tissu et tissu-instrument
  • Réduction de modèle — bases réduites pour la simulation temps réel
  • Topologie dynamique — découpe chirurgicale et remaillage local en temps réel
  • Interfaces — bindings Python et WebAssembly
  • Temps réel & haptique — boucle de calcul à 1000 Hz pour le retour haptique
  • 1.0 stable — API C/C++, intégration en tant que plugin SOFA

Un plan d'ingénierie sur plusieurs années plutôt qu'un prototype ponctuel.