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.
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.
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 :
Maillage
Matériau
Résolution
Validation
Et cette indépendance se retrouve à trois niveaux, combinables librement :
Éléments
Tétraèdre linéaireTétraèdre quadratiqueHexaèdrePoutre 3DCoqueMatériaux
Référence (linéaire)Hyperélastique isotropeAnisotrope (fibres)ViscoélastiqueSolveurs
StatiqueDynamique impliciteToute 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ément | Usage |
|---|---|
| Tétraèdre linéaire | Maillages générés rapidement, précision modérée |
| Tétraèdre quadratique | Précision accrue, validé nœud par nœud contre un solveur de référence |
| Hexaèdre | Maillages structurés, sans verrouillage numérique |
| Poutre 3D | Structures filaires (formulation Euler-Bernoulli) |
| Coque | Surfaces 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.
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.
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.
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.