|
download
raw
8.8 kB
# 📚 Cours: Génération de Maillages dans FEniCS/DOLFINx
## 1. Introduction: Qu'est-ce qu'un maillage?
### Définition
Un **maillage** (mesh) est une discrétisation d'un domaine géométrique en éléments simples (triangles, quadrilatères, tétraèdres, hexaèdres, etc.) pour résoudre numériquement des équations aux dérivées partielles (EDP) par la méthode des éléments finis.
### Vocabulaire de base
- **Sommet (vertex)**: Point du maillage
- **Arête (edge)**: Ligne connectant deux sommets
- **Face**: Surface délimitée par des arêtes (2D ou faces de polyèdres 3D)
- **Cellule (cell)**: Élément du maillage (triangle en 2D, tétraèdre en 3D)
- **Topologie**: Structure de connectivité entre les entités
- **Géométrie**: Positions spatiales des sommets
---
## 2. Types d'éléments dans FEniCS
### En 2D
```
Triangle Quadrilatère
2 3--------2
/|\ | |
/ | \ | |
/ | \ | |
0---+---1 0--------1
```
### En 3D
```
Tétraèdre (4 faces) Hexaèdre (cube)
3 7--------6
/|\ /| /|
/ | \ / | / |
/ | \ 4--------5 |
0---+---2 | 3-----|--2
\ | / | / | /
\ | / |/ |/
\|/ 0--------1
1
```
---
## 3. Structure de données d'un maillage FEniCS
### Hiérarchie topologique
```
Dimension 0: Sommets (vertices)
Dimension 1: Arêtes (edges)
Dimension 2: Faces (2D) ou Cellules (en 2D)
Dimension 3: Cellules (en 3D)
```
### Exemple concret en 2D
```python
# Un triangle simple
Sommets: [(0,0), (1,0), (0,1)]
Arêtes: [[0,1], [1,2], [2,0]]
Cellule: [[0,1,2]]
```
---
## 4. Méthodes de création de maillage
### 4.1 Maillages intégrés (built-in)
FEniCS peut générer automatiquement des maillages pour des géométries simples.
#### Algorithme de subdivision (2D)
Pour `create_rectangle([0,0], [1,1], [nx, ny])`:
```
Étape 1: Créer une grille régulière
Points: (i*dx, j*dy) pour i=0..nx, j=0..ny
où dx = 1/nx, dy = 1/ny
Étape 2: Subdiviser chaque rectangle en 2 triangles
Rectangle [i,j]:
Sommets: P1=(i*dx, j*dy), P2=((i+1)*dx, j*dy),
P3=((i+1)*dx, (j+1)*dy), P4=(i*dx, (j+1)*dy)
Triangle 1: [P1, P2, P4]
Triangle 2: [P2, P3, P4]
Étape 3: Construire la connectivité
- Indexer les sommets de manière unique
- Créer la table de connectivité cellule->sommets
```
#### Exemple visuel
```
nx=2, ny=2 donne:
4---5---6
|\2 |\4 |
| \ | \ |
| \| \|
1---2---3
|\0 |\1 |
| \ | \ |
| \| \|
0---1---2
Cellules:
0: [0,1,2]
1: [1,3,2]
2: [2,3,4]
3: [3,5,4]
4: [4,5,6]
```
### 4.2 Algorithmes de génération (Gmsh)
#### Delaunay Triangulation (2D)
```
Entrée: Ensemble de points P et contraintes de frontière
Algorithme:
1. Créer un super-triangle englobant tous les points
2. Pour chaque point p dans P:
a. Trouver tous les triangles dont le cercle circonscrit contient p
b. Supprimer ces triangles
c. Créer de nouveaux triangles en connectant p aux arêtes du "trou"
3. Supprimer les triangles contenant des sommets du super-triangle
4. Raffiner jusqu'à atteindre la qualité désirée
```
**Propriété clé**: Maximise l'angle minimal de tous les triangles → évite les triangles "plats"
#### Advancing Front Method
```
1. Commencer avec les arêtes de la frontière (le "front")
2. Tant que le front n'est pas vide:
a. Sélectionner une arête du front
b. Créer un nouveau sommet optimal (si nécessaire)
c. Créer un nouveau triangle
d. Mettre à jour le front
3. Raffiner si nécessaire
```
---
## 5. Critères de qualité du maillage
### Mesures de qualité
1. **Rapport d'aspect (Aspect Ratio)**
```
AR = longueur max / longueur min
Idéal: AR ≈ 1 (triangle équilatéral)
Acceptable: AR < 10
```
2. **Angle minimal**
```
Pour triangles: θ_min > 30° (idéal > 40°)
```
3. **Critère de Delaunay**
```
Le cercle circonscrit ne contient aucun autre sommet
```
4. **Taille des éléments**
```
h = diamètre de l'élément
Doit varier graduellement (pas de changements brusques)
```
---
## 6. Processus complet dans FEniCS
### 6.1 Création directe (simple)
```python
from dolfinx import mesh
from mpi4py import MPI
import numpy as np
# 1. Définir les paramètres
points_debut = np.array([0, 0])
points_fin = np.array([1, 1])
nx, ny = 10, 10 # Nombre d'éléments
# 2. FEniCS génère automatiquement:
# - Les sommets (grid régulière)
# - Les cellules (triangulation)
# - La connectivité (tables d'adjacence)
domain = mesh.create_rectangle(
MPI.COMM_WORLD,
[points_debut, points_fin],
[nx, ny],
mesh.CellType.triangle
)
```
### 6.2 Avec Gmsh (complexe)
```python
import gmsh
# 1. Initialisation
gmsh.initialize()
gmsh.model.add("geometry")
# 2. Définir la géométrie (via API ou script .geo)
# - Créer les points
# - Créer les courbes
# - Créer les surfaces
# - Définir les contraintes de taille
# 3. Gmsh génère le maillage:
# a. Analyse de la géométrie
# b. Discrétisation des courbes (1D)
# c. Triangulation des surfaces (2D)
# d. Tétraédrisation des volumes (3D)
gmsh.model.mesh.generate(2) # 2 = dimension
# 4. Import dans FEniCS
from dolfinx.io import gmshio
domain, markers, facet_markers = gmshio.model_to_mesh(
gmsh.model, MPI.COMM_WORLD, 0, gdim=2
)
gmsh.finalize()
```
---
## 7. Raffinement de maillage
### Raffinement uniforme
```
Chaque cellule est subdivisée en 4 sous-cellules
Triangle parent: Triangles enfants:
2 2
/|\ /|\
/ | \ 4-+-5
/ | \ /|\ /|\
0---+---1 0-+-3-+-1
```
### Raffinement adaptatif
Basé sur un estimateur d'erreur:
```python
# Pseudo-code
while erreur > tolérance:
1. Calculer la solution
2. Estimer l'erreur locale par élément
3. Marquer les éléments à raffiner (erreur > seuil)
4. Raffiner ces éléments
5. Recalculer
```
---
## 8. Stockage et représentation en mémoire
### Structure de données dans FEniCS
```python
# Topologie (connectivité)
topology = {
0: { # Sommets
'count': N_vertices,
'connectivity': index_map
},
1: { # Arêtes
'count': N_edges,
'vertex_connectivity': [[v1, v2], ...],
'cell_connectivity': [[c1, c2], ...] # cellules adjacentes
},
2: { # Cellules (en 2D)
'count': N_cells,
'vertex_connectivity': [[v1, v2, v3], ...] # pour triangles
}
}
# Géométrie (coordonnées)
geometry = {
'x': [[x1, y1], [x2, y2], ...], # Coordonnées des sommets
'dofmap': index_map # Mapping DOF local -> global
}
```
### Exemple concret
```python
domain = create_rectangle(..., [2, 2])
# Accès aux données:
num_vertices = domain.topology.index_map(0).size_local
num_cells = domain.topology.index_map(2).size_local
# Coordonnées des sommets
coords = domain.geometry.x # Array numpy
# Connectivité cellule->sommets
dofmap = domain.geometry.dofmap # Array 2D
```
---
## 9. Parallélisation du maillage
FEniCS utilise MPI pour le calcul parallèle:
```
Processus 0 Processus 1 Processus 2
+--------+ +--------+ +--------+
| Part | | Part | | Part |
| 0 | <-----> | 1 | <-----> | 2 |
+--------+ +--------+ +--------+
Chaque processus:
- Possède une partie du maillage
- Connaît les cellules "fantômes" des voisins
- Communique aux interfaces
```
---
## 10. Points clés à retenir
1. **Un maillage = Topologie + Géométrie**
- Topologie: Connectivité (qui est connecté à qui)
- Géométrie: Positions dans l'espace
2. **Qualité du maillage = Qualité de la solution**
- Éléments trop déformés → erreurs numériques
- Maillage trop grossier → perte de précision
- Maillage trop fin → coût calculatoire élevé
3. **Choix de la méthode**
- Géométrie simple → maillages intégrés FEniCS
- Géométrie complexe → Gmsh
- Raffinement adaptatif → selon l'erreur locale
4. **Types d'éléments**
- Triangles/Tétraèdres: Plus flexibles, maillages non structurés
- Quadrilatères/Hexaèdres: Plus précis pour problèmes alignés
---
## Références et ressources
- Documentation FEniCSx: https://docs.fenicsproject.org
- Gmsh documentation: https://gmsh.info
- "The Finite Element Method" par Larson & Bengzon
- "Mesh Generation" par P.-L. George

Xet Storage Details

Size:
8.8 kB
·
Xet hash:
a37b033f5d340f93a7affca029cf80677a425f2b1cfcfdec50634eb417b0c5aa

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.