FIPY est un cadre basé sur Python pour résoudre des équations aux dérivées partielles avec la méthode du volume fini. Il est couramment utilisé pour la diffusion, le transfert de chaleur, la modélisation en champ de phase, l’électrochimie, le transport lié aux fluides et d’autres problèmes qui peuvent être exprimés à travers des équations de conservation.
Chaque simulation FIPY commence par un maillage. Le maillage définit le domaine physique, le divise en volumes de contrôle, identifie les limites entre ces volumes et détermine où les variables numériques sont stockées. Un maillage soigneusement sélectionné peut rendre un modèle précis et efficace. Un maillage médiocre peut créer des calculs instables, des gradients irréalistes ou un coût de calcul inutile.
FIPY prend en charge de simples grilles cartésiennes, un espacement non uniforme, des domaines périodiques, des coordonnées cylindriques et sphériques, des structures triangulaires et des mailles créées avec GMSH. La compréhension de ces options aide les utilisateurs à sélectionner la grille la plus simple qui représente toujours correctement le problème physique.
Qu’est-ce qu’un maillage dans Fipy ?
Un maillage est une représentation discrète d’une région physique continue. Au lieu de résoudre une équation différentielle à chaque point possible, FIPY divise le domaine en un nombre fini de cellules et calcule en leur sein des valeurs approximatives.
Chaque cellule agit comme un volume de contrôle. Les quantités physiques telles que la température, la concentration, la pression ou la fraction de phase sont généralement associées aux centres cellulaires. Le transport entre les cellules voisines est calculé sur les faces qui les séparent.
Le maillage fournit à la fois la géométrie et la topologie. La géométrie décrit les tailles, les coordonnées, les zones et les volumes. La topologie décrit les cellules qui partagent des visages et comment les éléments sont connectés.
Cette information permet à FIPY de transformer une équation différentielle en un système d’équations algébriques qu’un solveur numérique peut traiter.
Cellules, visages et sommets
Les maillages Fipy sont construits autour de trois principaux composants structuraux : cellules, faces et sommets.
Les cellules sont les volumes de contrôle utilisés par la méthode du volume fini. Une cellule unidimensionnelle est un segment de ligne. Une cellule bidimensionnelle peut être un rectangle ou un triangle. Une cellule tridimensionnelle peut être une boîte ou un autre volume polyédrique.
Les visages forment les limites des cellules. Une face intérieure sépare deux cellules voisines. Une face extérieure se trouve sur la limite extérieure du domaine complet.
Les sommets définissent les points géométriques à partir desquels les faces et les cellules sont construites. La plupart des utilisateurs ne manipulent pas les sommets directement lorsqu’ils travaillent avec des grilles régulières, mais ils deviennent importants lors de l’importation ou de la création de géométrie irrégulière.
Les relations entre ces composants déterminent la façon dont les valeurs et les flux se déplacent dans la simulation.
Pourquoi la structure de maillage est importante dans la méthode du volume fini
La méthode du volume fini intègre une équation gouvernante sur chaque cellule. Il calcule ensuite la quantité d’une quantité physique qui pénètre ou sort à travers les faces environnantes.
Pour un problème de diffusion, FIPY estime les gradients entre les valeurs de cellules voisines et calcule le flux diffusif sur chaque face. Pour un problème de convection, la direction et l’ampleur du transport dépendent des vitesses centrées sur le visage et des vecteurs normaux.
La taille des cellules influence la résolution. La zone du visage influence la quantité de flux. Le volume cellulaire affecte l’accumulation et les termes sources. La distance entre les centres cellulaires voisins affecte les approximations de gradient.
Par conséquent, le maillage n’est pas seulement un conteneur visuel. Sa géométrie entre directement dans les équations numériques.
Maillages structurés et non structurés
Un maillage structuré organise les cellules dans un modèle prévisible. Les grilles rectangulaires sont l’exemple le plus courant. Les cellules forment des lignes, des colonnes et des couches, et leurs voisins peuvent être identifiés systématiquement.
Les grilles structurées sont faciles à créer et généralement efficaces à traiter. Ils conviennent aux domaines rectangulaires, aux systèmes en couches, aux canaux et aux problèmes avec des limites simples.
Un maillage non structuré ne suit pas une disposition régulière de rangées et de colonnes. Il peut contenir des triangles, des tétraèdres ou des polygones irréguliers. Les mailles non structurées peuvent s’adapter aux limites courbes, aux trous, aux caractéristiques étroites et à la géométrie d’ingénierie complexe de manière plus précise.
La flexibilité d’un maillage non structuré s’accompagne d’un coût supplémentaire. La génération de maillage, le contrôle de la qualité, la sélection des limites et le traitement numérique deviennent plus compliqués.
Création d’une grille unidimensionnelle
Le maillage fipy le plus simple est Grid1D. Il divise une ligne en un nombre spécifié de cellules.
from fipy import Grid1D
mesh = Grid1D(nx=100, dx=0.01)
Le paramètre nx définit le nombre de cellules. Le paramètre dx définit la largeur de chaque cellule. Dans cet exemple, la longueur totale du domaine est une unité.
Les grilles unidimensionnelles sont utiles pour la diffusion en couches, le transfert de chaleur à travers un mur, les changements de concentration le long d’un canal et les systèmes à forte symétrie. Un modèle 1D est souvent beaucoup plus rapide qu’une simulation 2D ou 3D et peut être suffisant lorsque des variations dans d’autres directions peuvent être ignorées.
Création d’une grille bidimensionnelle
Un domaine rectangulaire à deux dimensions peut être créé avec Grid2D.
from fipy import Grid2D
mesh = Grid2D(
nx=50,
ny=30,
dx=0.02,
dy=0.02
)
Le maillage contient 50 cellules le long de l’axe des x et 30 cellules le long de l’axe Y. Chaque cellule a une largeur de 0,02 unité et une hauteur de 0,02 unité.
Cette structure est adaptée au transfert de chaleur planaire, aux microstructures de matériaux, à la diffusion sur les surfaces, aux problèmes électrostatiques et à de nombreux exemples de champs de phase.
Une grille rectangulaire est généralement le meilleur point de départ lorsque le domaine physique est simple. Il est facile de visualiser, d’affiner et de tester l’indépendance du maillage.
Création d’une grille en trois dimensions
FIPY fournit Grid3D pour les domaines volumétriques.
from fipy import Grid3D
mesh = Grid3D(
nx=40,
ny=30,
nz=20,
dx=0.01,
dy=0.01,
dz=0.01
)
Les simulations tridimensionnelles peuvent représenter une géométrie spatiale complète, mais elles nécessitent beaucoup plus de mémoire et de temps de traitement. Doubler le nombre de cellules dans toutes les directions peut augmenter le nombre total de cellules d’un facteur huit.
Avant d’utiliser une grille 3D, il est utile de vérifier si la symétrie ou la réduction dimensionnelle peut fournir un résultat adéquat. Un modèle radial cylindrique ou unidimensionnel peut parfois remplacer une simulation 3D beaucoup plus coûteuse.
Espacement uniforme et non uniforme
Une grille uniforme utilise des cellules de taille égale le long d’un axe donné. Ceci est pratique lorsque la solution change progressivement dans tout le domaine.
Certains problèmes contiennent des gradients nets près d’une limite, d’une interface ou d’une source. L’utilisation d’une grille fine partout peut être inutile. FIPY peut créer un espacement non uniforme en recevant une séquence de largeurs de cellules.
from fipy import Grid1D
mesh = Grid1D(
dx=(0.01, 0.01, 0.02, 0.04, 0.08)
)
Les cellules s’élargissent progressivement. Les cellules plus petites peuvent être placées près d’une limite importante, tandis que les cellules plus grandes couvrent les régions où la solution change lentement.
Les grilles non uniformes réduisent le coût de calcul, mais des changements brutaux de taille de cellule peuvent réduire la qualité numérique. Les dimensions des cellules doivent généralement changer progressivement plutôt que de sauter entre des valeurs extrêmement différentes.
Accéder aux centres de cellules
FIPY expose les coordonnées de la cellule via mesh.cellCenters. Ces coordonnées sont souvent utilisées pour définir les conditions initiales, les sources, les coefficients spatiaux et les régions d’intérêt.
x, y = mesh.cellCenters
Un utilisateur peut créer une région initiale circulaire en appliquant une condition logique aux coordonnées :
initial_region = (
(x - 0.5) ** 2 + (y - 0.5) ** 2
) < 0.1 ** 2
Le masque booléen qui en résulte identifie les cellules dont les centres tombent à l’intérieur du cercle.
Les coordonnées du centre de cellule sont particulièrement utiles car la plupart des variables de solution FIPY sont stockées sous forme d’objets CellVariable.
Variables de cellule et association de maillage
A CellVariable stocke une valeur pour chaque cellule du maillage.
from fipy import CellVariable
temperature = CellVariable(
name="temperature",
mesh=mesh,
value=300.0
)
La variable reçoit automatiquement le même nombre de valeurs que le maillage a des cellules. Il accède également aux opérations basées sur le maillage telles que les gradients, l’interpolation de la face et les contraintes.
Les valeurs ne peuvent être modifiées que dans les cellules sélectionnées :
temperature.setValue(
500.0,
where=initial_region
)
Cette relation entre les variables et les maillages permet à Fipy de gérer les opérations dépendantes de la géométrie sans obliger les utilisateurs à assembler chaque matrice manuellement.
Centres de visage et variables de visage
Les visages sont importants car les flux les traversent. Leurs coordonnées sont disponibles via mesh.faceCenters.
x_face, y_face = mesh.faceCenters
Les coordonnées du visage peuvent être utilisées pour identifier les limites ou appliquer une condition uniquement à une partie d’un bord.
FIPY prend également en charge les objets FaceVariable. Ceux-ci sont utiles pour des quantités naturellement situées sur des faces, telles que la vitesse d’écoulement ou le flux spécifié de l’extérieur.
Une variable centrée sur les cellules peut souvent être interpolée sur des faces grâce à des propriétés telles que faceValue. Son gradient au niveau des visages est accessible via faceGrad.
Il est important de choisir l’emplacement correct pour une variable. Les températures et les concentrations sont généralement centrées sur les cellules, tandis que les flux et les vitesses de transport sont souvent centrés sur le visage.
Volumes de cellules, zones de visage et normales
FIPY calcule automatiquement les propriétés géométriques. Les volumes de cellules sont disponibles jusqu’à mesh.cellVolumes. En 2D, ces valeurs représentent des zones de cellules sous les hypothèses dimensionnelles du modèle.
Les zones du visage influencent la quantité totale de matériau, de chaleur ou de quantité de mouvement traversant une limite. Les normales du visage identifient la direction perpendiculaire à chaque face.
L’orientation d’une normale est importante lors du calcul des flux vers l’extérieur et vers l’intérieur. Un flux positif dans une direction peut représenter un flux négatif par rapport à une cellule voisine.
Ces propriétés permettent à FIPY d’appliquer de manière cohérente les lois de conservation sur les différentes formes de grille et les systèmes de coordonnées.
Visages extérieurs et intérieurs
Fipy sépare les visages en groupes extérieurs et intérieurs. Les faces extérieures forment la limite extérieure du domaine. Les faces intérieures relient les cellules voisines.
Les masques correspondants sont disponibles sous la forme :
mesh.exteriorFaces
mesh.interiorFaces
Les faces extérieures sont couramment utilisées pour les conditions aux limites. Les faces intérieures participent au transport ordinaire entre les cellules.
Les grilles cartésiennes régulières fournissent également des masques directionnels pratiques tels que facesLeft, facesRight, facesTop et facesBottom.
temperature.constrain(
350.0,
where=mesh.facesLeft
)
temperature.constrain(
300.0,
where=mesh.facesRight
)
Cela applique des valeurs fixes aux limites gauche et droite.
Création de masques de limite personnalisés
Une condition physique ne peut s’appliquer qu’à une partie d’une limite. Les masques personnalisés peuvent combiner des ensembles de visages standard avec des conditions de coordonnées.
x_face, y_face = mesh.faceCenters
heated_section = (
mesh.facesTop
& (x_face > 0.4)
& (x_face < 0.6)
)
temperature.constrain(
400.0,
where=heated_section
)
Cet exemple ne limite que la partie centrale de la limite supérieure.
Les masques personnalisés peuvent également sélectionner des limites circulaires, des interfaces, des entrées, des points de vente ou des faces à proximité d’une coordonnée spécifiée. Il est important de créer des masques à partir des coordonnées du visage lors de l’application des conditions aux limites du visage. Un masque cellulaire et un masque facial ont des longueurs et des objectifs différents.
Structures de grille périodiques
Les mailles périodiques relient les côtés opposés d’un domaine. Une valeur laissant un côté ré-entre efficacement par l’autre.
FIPY fournit des classes de grille périodiques pour une, deux et trois dimensions. Certaines variantes s’appliquent uniquement à la périodicité le long des axes sélectionnés.
Les grilles périodiques sont utiles pour les microstructures répétées, les modèles de cristal, les volumes de matériaux représentatifs, les systèmes en forme d’onde et les simulations de champ de phase où les limites externes artificielles déformeraient la solution.
Les utilisateurs doivent se rappeler qu’une direction périodique ne se comporte pas comme une limite extérieure ordinaire. L’application de contraintes de limites contradictoires aux faces connectées peut produire un modèle incorrect.
Grilles cylindriques et sphériques
Les grilles cartésiennes ne sont pas toujours le choix le plus efficace. FIPY fournit des classes de maillage cylindriques et sphériques pour les systèmes à symétrie radiale.
Une grille cylindrique peut représenter un transfert de chaleur à travers une paroi de tuyau, une diffusion radiale ou un réacteur axisymétrique. Les volumes de cellules et les zones de face changent avec Radius, et Fipy explique automatiquement cette géométrie.
Une grille unidimensionnelle sphérique peut modéliser la diffusion dans une particule, un transfert de chaleur à l’intérieur d’une sphère ou un transport chimique radial.
Ces maillages spécifiques aux coordonnées peuvent remplacer des calculs multidimensionnels coûteux lorsque la solution est symétrique. Cependant, ils ne doivent pas être utilisés lorsque des variations angulaires importantes sont présentes.
Maillages triangulaires et asymétriques
FIPY comprend des structures triangulaires telles que Tri2D. Les cellules triangulaires peuvent fournir une discrétisation différente d’une région bidimensionnelle et peuvent être utiles pour tester le comportement numérique.
Les grilles asymétriques s’éloignent intentionnellement des sommets d’un arrangement orthogonal. Ils peuvent démontrer comment un solveur répond à la géométrie non orthogonale.
Une asymétrie forte peut réduire la précision du gradient et augmenter l’erreur numérique. Un maillage avec de nombreuses cellules de mauvaise qualité peut fonctionner moins bien qu’une grille plus grossière mais bien formée.
La qualité du maillage doit donc être évaluée séparément de la résolution du maillage. L’ajout de cellules plus déformées n’améliore pas nécessairement la solution.
Modélisation de la géométrie complexe avec GMSH
Les grilles régulières sont limitées lorsque le domaine contient des courbes, des trous, des limites irrégulières ou des caractéristiques tridimensionnelles détaillées. Fipy peut utiliser GMSH pour générer ou importer des maillages plus complexes.
Un maillage bidimensionnel de base peut être créé à partir des commandes GMSH :
from fipy import Gmsh2D
mesh = Gmsh2D("""
cellSize = 0.05;
Point(1) = {0, 0, 0, cellSize};
Point(2) = {1, 0, 0, cellSize};
Point(3) = {1, 1, 0, cellSize};
Point(4) = {0, 1, 0, cellSize};
Line(1) = {1, 2};
Line(2) = {2, 3};
Line(3) = {3, 4};
Line(4) = {4, 1};
Curve Loop(1) = {1, 2, 3, 4};
Plane Surface(1) = {1};
""")
GMSH peut également charger la géométrie à partir d’un fichier .geo ou importer un fichier .msh généré. Conserver une géométrie complexe dans un fichier séparé rend souvent le modèle Python plus facile à entretenir.
Raffinement local
Les problèmes complexes ne nécessitent souvent que de petites cellules dans certaines zones. Le raffinement local peut améliorer la résolution à proximité des interfaces, des coins, des limites, des sources, des canaux étroits ou des gradients abrupts.
GMSH fournit des contrôles flexibles pour définir la taille des éléments locaux. Une région fine peut être placée autour d’une caractéristique importante tandis que le reste du domaine utilise des cellules plus grandes.
Cette approche est généralement plus efficace que le raffinage de l’ensemble du réseau. Cependant, les transitions entre les régions fines et grossières doivent être progressives. Des changements de taille soudains peuvent réduire la qualité numérique ou créer des cellules mal formées.
Test de convergence de maillage
Un résultat de simulation ne doit pas dépendre fortement d’une taille de maillage arbitraire. Les tests de convergence de maillage vérifient si la solution devient stable à mesure que la grille est raffinée.
Un test pratique utilise au moins deux ou trois résolutions. L’utilisateur compare une quantité importante, telle que la température maximale, la concentration moyenne, la position de l’interface ou le flux total.
Si le résultat change considérablement après le raffinement, le maillage d’origine était probablement trop grossier. Si la différence devient faible, un raffinement supplémentaire peut ne pas justifier son coût de calcul.
La convergence doit être testée pour le résultat qui compte pour l’étude. Un maillage peut prédire avec précision une valeur moyenne tout en ne parvenant pas à capturer un maximum local.
Maillages dans des simulations parallèles
Les simulations de grande taille FIPY peuvent répartir un maillage sur plusieurs processus. Chaque processus fonctionne avec une partie du domaine et échange des informations avec des parties voisines.
Les maillages parallèles peuvent contenir des cellules locales, des cellules de chevauchement et des valeurs globalement identifiées. La taille d’un tableau NumPy local peut donc différer du nombre total de cellules dans le maillage complet.
Les utilisateurs doivent être prudents lorsqu’ils indexent directement les tableaux ou exportent des valeurs lors de l’exécution parallèle. Le code qui suppose que chaque processus possède le maillage complet peut fonctionner en mode série mais échouer en mode parallèle.
L’exécution parallèle peut réduire le temps d’exécution pour de gros problèmes, mais la surcharge de communication peut limiter les avantages pour les petits maillages.
Inspection et visualisation d’un maillage
Un maillage doit être inspecté avant de résoudre une équation complexe. Les utilisateurs peuvent vérifier le nombre de cellules, les plages de coordonnées, les volumes, les masques extérieurs et les sélections de limites.
Les visionneuses FIPY peuvent afficher une variable sur le maillage :
from fipy import Viewer
viewer = Viewer(vars=temperature)
viewer.plot()
La visualisation peut révéler des dimensions de domaine incorrectes, un espacement cellulaire inattendu, des régions manquantes ou des masques de limite mal sélectionnés.
Pour la géométrie basée sur GMSH, il est utile d’inspecter le maillage généré dans un outil de visualisation dédié avant de commencer une longue simulation.
Erreurs courantes pour débutants
Une erreur courante consiste à confondre le nombre de cellules avec la taille physique. Une grille de 100 cellules n’a pas une longueur de 100 à moins que chaque cellule ne soit d’une unité de largeur.
Une autre erreur consiste à appliquer une contrainte de limite avec un masque cellulaire au lieu d’un masque facial. Les conditions aux limites agissent généralement sur les faces extérieures.
Les utilisateurs peuvent également choisir une grille trop grossière pour capturer un gradient ou inutilement bien pour un problème simple.
D’autres problèmes courants incluent des hypothèses de coordonnées incorrectes, un espacement non uniforme brutal, une mauvaise qualité des éléments GMSH, des conditions périodiques contradictoires et des tests de convergence de saut.
Choisir le bon maillage Fipy
| Type de maillage | Meilleure utilisation | Principale limitation |
|---|---|---|
Grid1D |
Transport en couches et unidirectionnel | ne peut pas représenter la variation latérale |
Grid2D |
Domaines planaires rectangulaires | Limité aux limites simples |
Grid3D |
Modèles volumétriques complets | Coût de calcul élevé |
| Grille non uniforme | Dégradés et interfaces localisés | Nécessite des transitions d’espacement prudentes |
| Grille périodique | Structures et cellules unitaires répétées | Les frontières opposées sont liées |
| Grille cylindrique ou sphérique | Systèmes radialement symétriques | Invalide lorsque la variation angulaire est importante |
| Maille GMSH | Géométrie courbe et irrégulière | Génération et contrôle de la qualité plus complexes |
Un workflow de sélection de maillage pratique
Commencez par identifier la forme physique du domaine et les dimensions dans lesquelles la solution peut varier. Vérifiez si la symétrie peut réduire un problème 3D en 2D ou 1D.
Choisissez la classe de maillage la plus simple et la plus simple. Estimez où des gradients ou des interfaces forts peuvent apparaître et ajuster la taille des cellules en conséquence.
Inspectez les centres de cellules, les dimensions du domaine, les volumes et les masques de limite. Visualisez le maillage et appliquez une simple variable de test avant de résoudre l’équation complète.
Exécutez la simulation sur plusieurs résolutions et comparez les principaux résultats. Déplacez-vous vers GMSH, le raffinement local ou le traitement parallèle uniquement lorsque la grille de base ne peut pas répondre aux exigences géométriques ou numériques.
Conclusion
Les maillages FIPY définissent la géométrie, la connectivité, les volumes de cellules, les faces et les coordonnées utilisées par la méthode du volume fini. Ils fournissent la structure sur laquelle fonctionnent les variables, les équations, les flux et les conditions aux limites.
Les classes régulières telles que Grid1D, Grid2D et Grid3D couvrent de nombreux problèmes courants. Les maillages non uniformes, périodiques, cylindriques, sphériques, triangulaires et GMSH prennent en charge des domaines plus spécialisés.
Le maillage le plus détaillé n’est pas automatiquement le meilleur. Un bon maillage capture le comportement physique requis tout en gardant un coût de calcul gérable. Des masques de limite corrects, une qualité cellulaire raisonnable, des systèmes de coordonnées appropriés et des tests de convergence sont tous essentiels.
En choisissant la grille la plus simple et en affinant uniquement le cas échéant, les utilisateurs de FIPY peuvent créer des simulations plus faciles à comprendre, plus rapides à résoudre et plus fiables.