# Stable-Fluids

Le Stable-Fluids est une méthode de simulation de fluide (MFN) décrite par Jos Stam en 1999 dans le cadre de la conférence SIGGRAPH99.
Elle utilise une grille eulerienne : un espace composé exclusivement de fluide où le mouvement du fluide est décrit par un champ de vecteurs vitesse (aussi nommé vélocité).

## Formulation mathématique
### Équations de Navier-Stokes

Le modèle du Stable-Fluid utilise les équations de Navier-Stokes dans le cas des fluides incompressibles.
* Équation d'incompressibilité
    ${\overrightarrow {\nabla }}\cdot {\vec {v}}=0$
* Équation de bilan de la quantité de mouvement
    ${\frac {\partial {\vec {v}}}{\partial t}}=-\left({\vec {v}}\cdot {\overrightarrow {\nabla }}\right){\vec {v}}-{\frac {1}{\rho }}{\overrightarrow {\nabla }}p+\nu \nabla ^{2}{\vec {v}}+{\vec {f}}$
Ces équations peuvent être interprétées de la manière suivante :
* Le terme ${\vec {v}}$ représente le vecteur vitesse à un point donné du fluide.
* Les termes d'accélérations correspondent à : ${\frac {\partial {\vec {v}}}{\partial t}}+\left({\vec {v}}\cdot {\overrightarrow {\nabla }}\right){\vec {v}}$ où le second membre est nommé advection.
* Les forces de viscosité correspondent au terme : $\nu \nabla ^{2}{\vec {v}}$
* Les forces de pression correspondent au terme : ${\frac {1}{\rho }}{\overrightarrow {\nabla }}p$
* Les forces extérieures correspondent au terme ${\vec {f}}$.
* L’incompressibilité se traduit par la relation : ${\overrightarrow {\nabla }}\cdot u=0$

### Théorème de décomposition de Helmholtz-Hodge

À partir de là, on cherche à simplifier les équations de Navier et Stokes en utilisant le théorème de décomposition de Helmholtz-Hodge. De cette manière on inclut le terme de projection $\mathbb {P}$.
    $\mathbb {P} {\frac {\partial {\vec {v}}}{\partial t}}=\mathbb {P} \left(-\left({\vec {v}}\cdot {\overrightarrow {\nabla }}\right){\vec {v}}-{\frac {1}{\rho }}{\overrightarrow {\nabla }}p+\nu \nabla ^{2}{\vec {v}}+{\vec {f}}\right)$
De plus, ce théorème nous permet de supprimer plusieurs éléments de l'équation, comme l'équation de l'incompressibilité et le terme relatif à la pression :
    $\mathbb {P} ({\overrightarrow {\nabla }}v)=0$
    $\mathbb {P} ({\overrightarrow {\nabla }}p)=0$
    $\mathbb {P} ({\vec {v}})={\vec {v}}$
Ainsi on arrive à l'équation suivante :
    ${\frac {\partial {\vec {v}}}{\partial t}}=\mathbb {P} \left(-\left({\vec {v}}\cdot {\overrightarrow {\nabla }}\right){\vec {v}}+\nu \nabla ^{2}{\vec {v}}+{\vec {f}}\right)$

### Le modèle numérique

Concernant la résolution numérique, les différents composants (diffusion, advection, projection, forces extérieures) ne sont pas calculés puis additionnés ensemble contrairement à sa forme mathématique. On considère plutôt que chaque composant, à partir d'un champ de vecteurs d'entrée, effectue des modifications sur le champ et donne le résultat au composant suivant.
On définit des opérateurs pour l'advection ($\mathbb {A}$), la diffusion ($\mathbb {D}$), l'application des forces extérieures ($\mathbb {F}$) et la projection ($\mathbb {P}$) et $\mathbb {S}$ opérateur équivalent à la formulation mathématique pour un pas-de-temps.
    $\mathbb {S} (u)=\mathbb {P} \circ \mathbb {F} \circ \mathbb {D} \circ \mathbb {A} (u)$
Ainsi, à chaque pas-de-temps, le champ de vecteur u passe successivement par l'opérateur d'advection puis ceux de diffusion, des forces extérieures et en dernier par l'opérateur de projection.

## Mise en œuvre de la méthode

Considérons un cas 2D (peu de différence pour la 3D), et considérons une grille régulière de N×N cellules, où chaque cellule est définie par un vecteur vélocité (au centre de la cellule) et une pression (pour la partie projection).
Les données seront représentées dans des tableaux $v^{i,j}$ ou i et j correspondent à la position de la cellule courante dans la grille.

### Diffusion

L'étape de diffusion correspond à la résolution de la viscosité. La vitesse du fluide va influencer les cellules voisines. Pour cela, un solveur linéaire sera utilisé.
Si $v^{i,j}$ correspond à la vélocité d'une des cellules et $v^{i+1,j}$ , $v^{i-1,j}$ , $v^{i,j+1}$ et $v^{i,j-1}$ aux cellules voisines, alors le solveur doit résoudre le système où pour chaque cellule :
    $(1-4\mathrm {A} )\cdot {\vec {v^{i,j}}}=\mathrm {A} \cdot {\vec {v^{i+1,j}}}+\mathrm {A} \cdot {\vec {v^{i-1,j}}}+\mathrm {A} \cdot {\vec {v^{i,j+1}}}+\mathrm {A} \cdot {\vec {v^{i,j-1}}}$
où
* A = dt⋅ν⋅N×N
* dt : le pas de temps.
* ν : coefficient de diffusion/viscosité.
* N×N : nombre de cellules ⇒ correspond à 1/Aire.
Pour la résolution du système, le solveur du Gauss-Seidel peut être utilisé. Dans cet exemple, on travaille dans un tableau où seuls les voisins directs sont utilisés, les autres cellules n'apparaissent pas et ont comme coefficient 0.

### Advection

Durant l'étape d'advection, on considère donc qu'il y a une particule au niveau du vecteur vélocité, on effectue un retour sur trace (backtracking) pour déterminer la position de la particule au pas-de-temps précédent, enfin on effectue une interpolation pour connaitre la vélocité de la particule. Cette dernière remplacera la valeur du vecteur vélocité. On cherche donc à garder l'énergie contenue dans la particule.

### Projection

La projection permet de rétablir la conservation de masse et donc l'incompressibilité du fluide. Pour cela, on doit déterminer les quantités de matière entrante et sortante au niveau de chaque cellule, puis corriger les vitesses de telle façon à avoir autant de matière entrante que sortante.
La divergence correspond à la différence entre les flux entrants et sortants. Pour cela on prend la composante horizontale des vecteurs voisins situés à l'horizontal et la composante verticale des vecteurs voisins situés à la verticale.
    $div^{ij}=-0,5(vx^{i+1,j}-vx^{i-1,j})\cdot \mathrm {d} y-0,5(vy^{i,j+1}-vy^{i,j-1})\cdot \mathrm {d} x$
    $vx^{i,j}$ : composante horizontale du vecteur vélocité ${\vec {v^{i,j}}}$
    $vy^{i,j}$ : composante verticale du vecteur vélocité ${\vec {v^{i,j}}}$
    $\mathrm {d} x$ : distance entre les vecteurs $v^{i+1,j}$ et $v^{i-1,j}$
    $\mathrm {d} y$ : distance entre les vecteurs $v^{i,j+1}$ et $v^{i,j-1}$
Dans le cas d'une grille de N×N cellules on a $\mathrm {d} x=\mathrm {d} y={\frac {1}{\mathrm {N} }}$

### Conditions aux limites
## Extensions de la méthode
### Staggered-Grid

Dans une staggered-grid les variables scalaires (comme la pression) sont stockées aux centre des cellules, tandis que les vélocités sont localisées sur les bords (ou faces) de la cellule.
Utiliser une Staggered Grid évite un odd-even decoupling entre la pression et la vélocité. On peut connaitre exactement le volume de fluide entrant et sortant de la cellule, ce qui n'est pas le cas si les vélocités sont au centre. Donc la Staggered-Grid permet des calculs plus précis et moins de dissipation numérique.
Le désavantage est que les valeurs sont stockées à différents emplacements, ce qui rend plus difficile le contrôle de volume.

### Retour sur trace

Le retour sur trace (backtracking) est la méthode qui permet de trouver la position d'une particule dans un fluide eulérien au pas-de-temps précédent. Dans l'advection de base, il s'agit simplement de prendre la vélocité, multiplier par le pas-de-temps et par les dimensions d'une cellule pour retrouver la position précédente de la particule.
Cela dit, le fluide suit un parcours curviligne et la simple utilisation de la vélocité ne suffit pas pour trouver précisément l'ancienne position de la particule. Il peut être effectué des corrections afin d'améliorer la précision. Il y a le Runge-Kutta, le MacCormack et le BFECC (Back and Forth Error Compensation and Correction).
La première figure du schéma ci-contre montre le cas du retour sur trace simple : on peut remarquer que le retour sur trace récupère une vélocité (en gris) qui n'appartient pas à la bonne ligne de caractéristique. Le MacCormack permet de se rapprocher de la ligne de caractéristique (dernière figure du schéma, vecteur en gris).

### Flux sur une surface arbitraire et Distorsion

Dans le cas où on choisit de travailler sur un flux de fluide parcourant une surface, on se retrouve dans le cas où les cellules formant le système ne sont pas des carrés. Ces déformations doivent être prises en compte pour éviter des phénomènes irréalistes.

### Surface Libre

La notion de Surface Libre concerne la modélisation de la surface de l'eau. Il existe différentes méthodes comme le level-set ou le fast and robust tracking of fluid surface.

### Cellules triangulaires et tétraèdres

Dans les cas précédents, ce sont des cellules carrées (ou au moins des quadrilatères) qui ont été utilisées pour les cas 2D et des cubes pour le cas 3D. Il est néanmoins possible d'utiliser des cellules triangulaires ou des tétraèdres.

### Vorticité

Il s'agit de remplacer l'étape de projection par une étape où l'on cherche à préserver la vorticité. La vorticité correspond aux phénomènes de tourbillons. Ainsi au lieu de vérifier qu'une cellule contient la bonne quantité de fluide, on vérifie l'incompressibilité par les flux autour de points.