Inscription / Connexion Nouveau Sujet
Niveau maths spé
Partager :

Discrétisation de l'équation de Navier-Stokes

Posté par
Aracneon
06-03-20 à 12:41

Bonjour,

Dans le cadre du TIPE, je me suis proposé de développer un programme de simulation d'un écoulement d'eau autour d'un cylindre en 2D à la surface de l'eau.

Le problème revient à résoudre les 3 équations de la mécanique des fluides en utilisant un langage de programmation quelconque.
Par ailleurs, je me place à la surface de l'eau donc P = P0 donc le gradient de pression est nulle. Le jeu d'équation peut alors se limiter à 2 équations sur 3.
Pour plus de simplicité dans les formes récursives, j'ai donc décidé de ne garder que les projections sur x et y des équations de Navier-Stokes.

Etant plus à l'aise en Java qu'en Python, j'ai donc déjà codé ma fenêtre, mon maillage, et les conditions aux limites du problème.
En l'occurrence: (voir image en attache)
- à x = 0: V = V0 cste comme on veut un flux d'entrée d'eau laminaire
- à y = ymax: V = V0 pour ne pas avoir d'effet de bords
- à y = 0: V = V0 pour les mêmes raisons
- à x = xmax: il ne devrait pas y avoir de conditions mais mes formules par récurrence en impose une... sinon je ne peux effectuer le calcul. J'ai donc décidé dans l'algorithme de ne pas calculer cette dernière colonne.

Toutefois il me reste encore à exécuter ma méthode de résolution pour voir l'évolution du système sur ma simulation.
Je me suis donc d'abord orienté vers une résolution naïve dans laquelle on approximera chaque dérivée partielle à un taux de de variation.

En posant dt un pas de temps entre deux images, on peut de plus écrire:
t = n*dt
v(t + dt, x, y) = v((n+1)dt, x, y)

Aussi on peut introduire les distances entre 2 centres de pixels notés dx et dy qui permettront d'écrire les taux de variations spatiales de v qui apparaissent dans Navier-Stokes.

Je fais alors apparaître une relation de récurrence pour calculer en chaque noeud du maillage carré le champ de vitesse v à la date n+1.

Voici les deux relations de récurrences obtenues: (voir photo en attache)

Toutefois... Le problème ne se résout pas bien du tout numériquement...
Il semblerait qu'il y ait une forte divergence qu'on pourrait associée à la simplicité du raisonnement que j'effectue, mais ça ne colle même pas sur 1 frame...

J'ai tenté ce même raisonnement avec une approximation d'ordre 2 sur le taux de variation, de sorte que
f/x (xi) = (f(xi+1) - f(xi-1))/(2x).
Le résultat est un peu plus satisfaisant mais toujours loin de la pratique dès la 1ère frame...

Les autres méthodes de discrétisation sont trop loin de ma portée de maths spé, bien que si quelqu'un se sent de les reformuler je suis preneur !
Voici un lien vers toutes les méthodes envisagées: https://perso.limsi.fr/podvin/polynsf11.pdf

Aussi ma question est la suivante: d'où vient le problème ? Je vous avoue que je tourne en rond sur la question depuis 3 jours déjà, et aucun poste ne semble approcher une solution quelconque.

Bonne journée,

Discrétisation de l\'équation de Navier-Stokes

Discrétisation de l\'équation de Navier-Stokes

Posté par
gts2
re : Discrétisation de l'équation de Navier-Stokes 06-03-20 à 13:05

La résolution de Navier et Stockes c'est compliqué !

Note : la résolution des équations de Navier-Stokes fait partie de l'un des sept "Problèmes du Millénaire" proposés par la Fondation Clay. Récompense 1 M$.

Plus concrètement,  la "simple" résolution de l'équation de la chaleur nécessite que, après adimensionnement, \delta t < \frac 12 \delta x^2, donc essayer de réduire dt.

Sinon, peut-être commencer par l'équation d'Euler et une fois que celle-ci tournera ajouter la viscosité.

Ceci étant, lire la première phrase...

Posté par
gts2
re : Discrétisation de l'équation de Navier-Stokes 06-03-20 à 13:08

Pour les problèmes de stabilité voir par exemple :


et là on parle de l'équation de la chaleur 1D !

Posté par
Aracneon
re : Discrétisation de l'équation de Navier-Stokes 06-03-20 à 14:08

Bonjour,

En effet, toutefois je ne me propose pas de "résoudre l'équation de Navier-Stokes" mais de calculer les différentes valeurs du champ de vitesse aux noeuds de mon maillage à l'aide d'une forme discrète de Navier-Stokes.

La question est donc la suivante: ma forme discrète est-elle valable ? Quelle discrétisation adopter sinon ?

Je vais me pencher sur la méthode des différences finies proposée sur votre deuxième lien, merci =)

La 2D n'apporte qu'un couplage des projections sur chaque axe, ce qui ne pose pas de problème pour un ordinateur.

Posté par
gts2
re : Discrétisation de l'équation de Navier-Stokes 06-03-20 à 14:13

Bonjour,

Jusqu'à présent j'ai répondu de manière générale. Cette fois je répond sur vos équations.
Ce qui est après ( est censé être un laplacien ? Cela n'a pas vraiment l'air d'être le cas : une approximation d'un laplacien peut être
\Delta f=\frac{f(x+\delta x , y)+f(x-\delta x , y)+f(x, y+\delta y)+f(x,y-\delta y)-4f(x,y)}{\delta x^2}
en prenant pour simplifier x=y

Posté par
Aracneon
re : Discrétisation de l'équation de Navier-Stokes 06-03-20 à 18:15

Bonsoir,

Merci pour cet apport =) !
J'ai remplacé le laplacien par sa bonne formule discrète, mais la divergence persiste...

Toutefois la manière dont elle diverge a fortement changé, et les première frames montre bien un écoulement laminaire qui se met en place.
La divergence semble provenir du cylindre (visuellement). Les valeurs de Vx et Vy divergent grossièrement vers l'infini positif.

J'ai fixé à tout instant Vx = Vy = 0 au niveau du cylindre comme mon liquide est visqueux: est-ce trop fort ?
Aussi trouvez-vous d'autres erreurs dans mes calculs ? Je peux les joindre si besoin par scans de ma version écrite à la main.

Merci,

Posté par
Aracneon
re : Discrétisation de l'équation de Navier-Stokes 06-03-20 à 19:00

Voici un screen de ma simulation à Reynolds petit (Re = 35).
On voit bien qu'il y a un problème de propagation dans le fluide.

J'aimerais une propagation selon ux  mais le fluide persiste à rejoindre une étrange diagonale...

Ici la simulation est stable, si on augmente v de 1 mm/s, tout diverge et l'écran devient jaune ( jaune = v valant l'infini).

Pour cette image, j'ai placé des conditions aux limites différentes:
- x = 0: V = V0
- y = 0 ou y = ymax: obstacle (mur par exemple)
- Au niveau d'un obstacle: V = 0 (viscosité)

J'ai bien changé mon Laplacien scalaire avec la condition respectée: dx = dy (maillage carré)

Discrétisation de l\'équation de Navier-Stokes

Posté par
gts2
re : Discrétisation de l'équation de Navier-Stokes 06-03-20 à 19:11

Bonjour,

Je crois que le problème vient de
"Par ailleurs, je me place à la surface de l'eau donc P = P0 donc le gradient de pression est nulle."

Un étude 2D n'est pas un étude en surface, mais une étude avec invariance selon z. La pression est donc indispensable .
Voir :
D'autre part, plus physiquement, lors d'un écoulement autour d'un cylindre, le fluide qui arrive sur le cylindre voit sa pression augmenter (Bernoulli ...)

L'équation complète (et complexe) est donnée
La discrétisation donnée est bien celle que vous avez obtenue, MAIS il faut ajouter la pression.
Essayez de résoudre le même problème avec votre code.

Posté par
gts2
re : Discrétisation de l'équation de Navier-Stokes 06-03-20 à 20:03

"J'ai fixé à tout instant Vx = Vy = 0 au niveau du cylindre comme mon liquide est visqueux: est-ce trop fort ? "

Non, pas de pb de ce côté là.
Pour votre diagonale, je pencherai pour une faute de frappe dans le code (type i à la place de j)

Posté par
Aracneon
re : Discrétisation de l'équation de Navier-Stokes 06-03-20 à 23:34

Bonsoir,

Après avoir étudié les liens que vous m'avez joins aux messages précédents (sois disant passant excellents, je n'étais jamais tombé dessus !), j'ai adapté ma méthode de résolution en ajoutant la pression comme paramètre.

Néanmoins, cela n'a pas vraiment améliorer le problème...

Le liquide ne parait même plus en mouvement, quelque soit la vitesse de départ.

Enfin, c'est vite dit ! On remarque quand même que la divergence apparaît au niveau de mon obstacle (assez rapidement, frame 200 en général à faible Reynolds).

Mes conditions aux limites sont désormais les suivantes:
en x = 0: Vx = V0,  Vy = 0
en y = 0, y = ymax: j'ai mis des parois donc V = 0
au niveau de l'obstacle: V = 0

J'ai aussi revérifier et fait revérifier par des collègues mes équations discrètes que j'ai rentré sur mon IDE: apparemment rien à redire... On a même penser à l'idée que Java m'imposerait décrire tous les nombres en type double pour ne pas transformer l'ensemble en integer, mais cela n'a pas changé grand chose...

Je propose de vous communiquer mes variables physiques, peut-être ont-elles une erreur que je ne vois pas =/:

- int xdim = 671; // dimensions de la fenêtre
- int ydim = 341;
- double viscosity = 1.01*Math.pow(10,-6); //en m²/s https://wiki.anton-paar.com/en/water/, il s'agit de la viscosité dynamique
- double rho = 1000.0; //rho de l'eau = 1000 kg/m^3
- double dt = (double)0.001;
- double dx = (double)(2.0/(xdim-1)); // pas entre 2 pixels
- double dy = (double)(2.0/(ydim-1));

A t = 0:
V respecte les conditions aux limites et le champ est uniforme à V0
P = 0 en tout point


Merci pour votre aide,
Bonne soirée,

Posté par
Aracneon
re : Discrétisation de l'équation de Navier-Stokes 06-03-20 à 23:39

Voici un screen pris à la frame où mon programme détecte une divergence à 103 de la vitesse entre 2 frames:

En vert on voit une légère progression du liquide, toujours avec une diagonale inférieure suspecte qui semble l'arrêter...

Le contraste représente le champ de vitesse.

L'image a été prise à 296*dt soit 2,96s.

Discrétisation de l\'équation de Navier-Stokes

Posté par
gts2
re : Discrétisation de l'équation de Navier-Stokes 07-03-20 à 08:15

Bonjour,

L'instabilité peut être due à la résolution (diminuer dt), ou aux conditions de simulation avec votre Re de 10^6, vous êtes en zone très turbulente.

Le mieux serait de considérer votre équation comme adimensionnée, donc prendre =1, le est en fait le 1/Re, et votre V0 toujours à 1, le contrôle se faisant par Re.

Rappel : même si ce n'est pas la même équation, donc à prendre avec des pincettes, l'équation de la chaleur impose \delta t<\frac 12 \delta x^2

Posté par
Aracneon
re : Discrétisation de l'équation de Navier-Stokes 07-03-20 à 12:35

Bonjour,

J'ai considérablement réduit dt en le plaçant à (1/3)*dx²: la simulation tourne sans diverger ! Je suis entrain de chercher si ce critère est bien celui attendu pour une simulation de fluide.

Aussi, d'après la page 39 de cette thèse: https://tel.archives-ouvertes.fr/tel-01311087/document
Mes conditions aux limites étaient incorrectes pour la vitesse. J'ai donc fait la modification suivante: pour respecter le critère en sortie: vx / x = 0, j'impose sur mes valeurs discrètes, Vx(x+dx) = Vx(x)
soit Vx[x][y] = Vx[x-1][y]
De même pour Vy.

Les conditions de pression étaient aussi incorrectes: il y a la même continuité de la pression en sortie qu'énoncé précédemment, donc P[x][y] = P[x-1][y] en sortie.
Il y a un maximum de pression au niveau de l'obstacle donc de même P[x][y] = P[x-1][y] à la surface de l'obstacle.
D'après la page 2 de cette publication: https://www.researchgate.net/publication/273399260_Simulation_numerique_d'un_ecoulement_autour_de_deux_cylindres_circulaires

Maintenant que tout semble un peu plus clair (malgré mon sens physique très abstrait x) ), le résultat obtenu devrait coller ! Et pourtant... Non x)...

Il y a comme un rebond du liquide en fin de course (à la sortie) et toujours aucune traînée apparente derrière le cylindre.
La propagation est aussi toujours diagonale bien que fort moins marquée.
La vitesse initiale ne semble pas se propager sur le reste de la cuve (on voit le trait plein rouge de la vitesse initiale bien statique, qui envoie à peine une petite "onde" de vitesse).
Au démarrage de la simulation, le cylindre semble "émettre" un champ de vitesse (photo 1)

Voici une photo du résultat lors d'un "rebond":  (photo 2)

Toutefois je sens qu'on se rapproche !

Merci de votre aide,
Bonne journée,

Discrétisation de l\'équation de Navier-Stokes

Discrétisation de l\'équation de Navier-Stokes

Posté par
Aracneon
re : Discrétisation de l'équation de Navier-Stokes 07-03-20 à 13:56

Voici l'écoulement "à l'équilibre" c'est-à-dire plus d'évolution en 10 minutes en écoulement type "poiseuille".
On remarque bien que l'équilibre n'est jamais atteint, et que la simulation stagne sur un système qui devrait être totalement instable.

Discrétisation de l\'équation de Navier-Stokes

Posté par
gts2
re : Discrétisation de l'équation de Navier-Stokes 07-03-20 à 20:37

Bonjour,

"Il y a un maximum de pression au niveau de l'obstacle donc de même P[x][y] = P[x-1][y] à la surface de l'obstacle. "

Oui mais uniquement au point d'arrêt.
Dans le lien , ce qui est nul est le gradient normal à la paroi, pas évident à écrire avec un cylindre et un maillage carré.
Sinon, oui, il fallait changer les CL du lien Python, le code était relatif à une autre géométrie.

Avec le code Python, "l'envahissement" est relativement rapide, quelques centaines de pas.

Posté par
gts2
re : Discrétisation de l'équation de Navier-Stokes 08-03-20 à 08:00

Bonjour,

Avez-vous tester l'exemple 11 de Python (cavity flow) pour vérifier votre code ?
Voire même le 12.

Posté par
Aracneon
re : Discrétisation de l'équation de Navier-Stokes 09-03-20 à 19:52

Bonsoir,

Merci pour votre aide précieuse jusqu'à maintenant, mais avec la reprise des cours il m'est difficile de poursuivre mon TIPE tous les jours.

Aussi mon problème a été pris en charge par mes professeurs qui m'aiguilleront je pense vers la bonne solution d'ici peu.

Je posterai certainement la réponse à mon problème une fois celui-ci résolu pour aider les futurs taupins dans leurs modélisations s'ils tombent sur ce topic !

Bonne soirée,

Posté par
gts2
re : Discrétisation de l'équation de Navier-Stokes 09-03-20 à 20:18

Merci d'avance pour le post final, cela n'a quand même pas l'air évident.

Posté par
buggle
re : Discrétisation de l'équation de Navier-Stokes 27-06-22 à 19:58

Bonjour. Ce sujet a deux ans. Je ne sais pas si cela va aider.

Personellement, j'ai rencontré le même problème. On se rends compte que le résultat du caclul est en dent de scie. On vois un fort "grillage" dans les valeurs.

Personellement, je fais des simulations en python. J'utilise la bibliothèque NumPy et SciPy (CuPy en fait). Dedans, il y a les outils pour calculer des derivées partielles. Je vous montre à peu près le problème que je rencontrais à l'époque, dans la première image.

J'ai vu un article de Wikipedia, qui indique la nécessité de filtrer le calcul, avec un filtre passe-bas:

https://fr.wikipedia.org/wiki/Simulation_des_grandes_structures_de_la_turbulence

Avec le filtre passe-bas, voici le résultat que j'obtiens, en seconde image. J'utilise le filtre médian de SciPy (Avec CuPy).

Mais l'avancée vraiment, ce serait d'effacer le "grillage", les dents de scie, pour avoir des valeurs adoucies. Si cela peut aider.

Bonne soirée à vous!

Discrétisation de l\'équation de Navier-Stokes

Discrétisation de l\'équation de Navier-Stokes



Mentions légales - Retrouvez cette page sur l'île de la physique - chimie
© digiSchool 2024

Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !