Génération de maillages 2D avec Matlab

Transcription

Génération de maillages 2D avec Matlab
Institut
Supérieur d’
Informatique, de
Modélisation et de leurs
Applications
Complexe Universitaire des Cézeaux
BP125
63173 Aubière CEDEX
Projet de deuxième année
Génération de maillages 2D
avec Matlab
Présenté par :
Chef de projet :
Jean-Philippe LEBOUCHER
Benjamin PACCOU
Jonas KOKO
Novembre 2005-Mars 2006
Institut
Supérieur d’
Informatique, de
Modélisation et de leurs
Applications
Complexe Universitaire des Cézeaux
BP125
63173 Aubière CEDEX
Projet de deuxième année
Génération de maillages 2D
avec Matlab
Présenté par :
Chef de projet :
Jean-Philippe LEBOUCHER
Benjamin PACCOU
Jonas KOKO
Novembre 2005-Mars 2006
Génération de maillages 2D
avec Matlab
Remerciements
Nous souhaiterions remercier :
– M. KOKO, notre chef de projet, pour son aide dans la compréhension du sujet, celle du langage
Matlab ainsi que pour nous avoir fourni les outils nécessaires à la réalisation de ce projet.
– M. LEBORGNE, professeur de l’ISIMA, pour ses cours sur les maillages, ainsi que pour ses
explications lors de travaux en Matlab.
– Quentin LEQUY, ZZ3F4 et Julien SITTER, ZZ2F4, pour leur aide dans la réalisation de
notre rapport avec le logiciel LateX.
2005/2006
Génération de maillages 2D
avec Matlab
Résumé
Notre travail a consisté à générer des maillages 2D à l’aide de Matlab sur différentes formes
géométriques avec différents types de maillages. Après que nous ayons pris connaissance des propriétés
des maillages et de l’utilisation du logiciel Matlab, nous avons cherché à comprendre la fonction
distmesh2D qui nous a été fournie, de la modifer pour l’améliorer, puis de générer différents maillages
grâce à celle-ci. Nous avons crée également des maillages sur des formes que nous avons nous même
définies, même si quelques uns se sont révélés être des échecs.
Mots clés: maillages 2D, Matlab, distmesh2D
Abstract
Our work has consisted in generating 2D meshes with the help of Matlab on different geometrical
shapes, with different kinds of meshes. After that we had studied the mesh properties and the use of
Matlab software, we have sought to understand the function distmesh2D that we received, to modify
it to upgrade it, and then to generate different meshes with the help of it. We have also created some
meshes on shapes that we have ourselves defined, even if some of them were some failures.
Keywords: 2D meshes, Matlab, distmesh2D
2005/2006
Génération de maillages 2D
avec Matlab
Table des matières
Remerciements
Résumé / Abstract
Table des matières
Table des figures
Glossaire
Introduction
7
I
8
Présentation des maillages 2D
1 Triangulation
8
2 Utilisation des maillages
2.1 Espace P1 et fonctions chapeaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 Espace P2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
9
9
3 Conclusion
10
II
Explication des diverses fonctions utilisées pour la génération d’un
maillage
11
1 Description de la fonction principale : distmesh2d
1.1 Paramètres de la fonction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Algorithme de la fonction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
11
11
2 Description des
2.1 dcircle . . .
2.2 ddiff . . . .
2.3 dell . . . . .
2.4 dpoly . . . .
2.5 drectangle .
2.6 dunion . . .
13
13
13
13
13
13
13
fonctions permettant
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
le calcul de fd
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3 Description de la fonction huniform
13
III
14
Résultats des générations de maillages
1 Formes simples, maillage
1.1 le disque . . . . . . . .
1.2 le carré . . . . . . . . .
1.3 l’ellipse . . . . . . . . .
1.4 le triangle . . . . . . .
2005/2006
uniforme
. . . . . .
. . . . . .
. . . . . .
. . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
14
14
15
16
17
Génération de maillages 2D
avec Matlab
1.5
un quadrilatère quelconque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
2 Formes simples, maillage non uniforme
2.1 un carré, avec un maillage centré à l’origine . . . . . . . . . . . . . . . . . . . . . . .
2.2 un carré, avec un maillage plus fin pour un de ses sommets . . . . . . . . . . . . . . .
2.3 un carré, avec un maillage en croix . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
19
20
21
3 Formes plus complexes
3.1 Maillage uniforme sur un carré privé d’un disque . . . . . . . . . . .
3.2 Maillage non uniforme sur un carré privé d’un disque . . . . . . . .
3.3 Maillage non uniforme sur un demi carré privé d’un demi disque . .
3.4 Maillage uniforme sur un carré privé d’un carré . . . . . . . . . . .
3.5 Maillage uniforme sur un quadrilatère privé d’un autre quadrilatère
3.6 Maillage uniforme sur une forme quelconque . . . . . . . . . . . . .
3.7 Maillage non uniforme sur une forme quelconque . . . . . . . . . . .
3.8 Maillage non uniforme sur une forme particilière . . . . . . . . . . .
22
22
23
24
25
26
27
28
29
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4 Maillages non réussis
30
Conclusion
32
2005/2006
Génération de maillages 2D
avec Matlab
Table des figures
I.1 Exemple de triangulation valide . . . . . . . . . . . . . . . . . . . .
I.2 Exemple de triangulation non valide . . . . . . . . . . . . . . . . . .
III.1 Disque unité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
III.2 Carré . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
III.3 Ellipse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
III.4 Triangle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
III.5 Quadrilatère quelconque . . . . . . . . . . . . . . . . . . . . . . . .
III.6 Carré avec maillage centré à l’origine . . . . . . . . . . . . . . . . .
III.7 Carré avec maillage plus fin pour un de ses sommets . . . . . . . . .
III.8 Carré avec maillage en croix . . . . . . . . . . . . . . . . . . . . . .
III.9 Maillage uniforme sur un carré privé d’un disque . . . . . . . . . . .
III.10Maillage non uniforme sur un carré privé d’un cercle . . . . . . . .
III.11Maillage non uniforme sur un demi carré privé d’un demi disque . .
III.12Maillage uniforme sur un carré privé d’un carré . . . . . . . . . . .
III.13Maillage uniforme sur un quadrilatère privé d’un autre quadrilatère
III.14Maillage uniforme sur une forme quelconque . . . . . . . . . . . . .
III.15Maillage non uniforme sur une forme quelconque . . . . . . . . . . .
III.16Maillage non uniforme sur un ZZ ! . . . . . . . . . . . . . . . . . . .
III.17Résultats obtenus dans l’ordre avec notre fonction dtri . . . . . . .
III.18Résultat obtenu avec la fonction dpoly . . . . . . . . . . . . . . . .
2005/2006
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
8
8
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Génération de maillages 2D
avec Matlab
Glossaire
arête un des cotés d’un polygône (ici, des triangles).
base famille d’éléments d’un ensemble libre et génératrice. Chaque élément de l’ensemble peut être
écrit de manière unique comme une combinaison linéaire des éléments de base.
ensemble ouvert ensemble où pour chaque élément x il existe un rayon r tel que la boule de centre
x et de rayon r soit incluse dans cet ensemble.
famille génératrice famille d’éléments d’un ensemble. Tout élément de cet ensemble peut être écrit
comme une combinaison linéaire des éléments de cette famille.
famille libre famille où chaque élément ne peut pas être écrit comme une combinaison linéaire des
autres éléments.
2005/2006
Génération de maillages 2D
avec Matlab
Introduction
Dans le cadre de notre deuxième année d’études à l’ISIMA, nous avons choisi comme sujet pour
notre projet la génération de maillages avec Matlab, sous l’encadrement de M. Koko.
Les maillages 2D permettent de partitionner un espace plan en un ensemble de triangles, ce qui
permet alors de passer d’un espace continu à un espace discret. Ceci pourra être utlisé par exemple
en informatique graphique et en conception assistée par ordinateur pour représenter et manipuler
des objets tridimensionnels. On peut également utiliser un maillage pour approximer une fonction
dont on ne peut pas connaı̂tre une forme analytique : c’est notamment le cas pour la résolution de
certaines équations différentielles.
Dans un premier temps, nous allons présenter plus en détails les maillages, puis nous présenterons
notre travail effectué sur le programme initial, et enfin nous exposerons les résultats des générations
de maillages 2D.
2005/2006
page 7 / 33
Génération de maillages 2D
avec Matlab
Présentation des maillages 2D
1
Triangulation
Une triangulation Th d’un ouvert Ω de R2 , de bord Γ = ∂Ω est une partition de Ω en triangles
Elle doit également vérifier certaines propriétés :
1. l’intersection de deux triangles de Th doit être réduite à un sommet commun, à une arête
commune et entière ou à l’ensemble vide.
2. l’aire des triangles ne doit pas être nulle.
3. tous les coins du bord Γ = ∂Ω sont des sommets de triangles de Th
4. réciproquement, soit Ωh l’union des triangles. Tous les coins de Γh = ∂Ωh doivent être sur Γ.
Fig. I.1 – Exemple de triangulation valide
Fig. I.2 – Exemple de triangulation non valide
La première figure montre une triangulation qui vérifie ces propriétés, alors que la deuxième ne
les vérifie pas.
On note que la triangulation est indexée par h > 0, qui représente la longueur de la plus grande
arête de la triangulation Th .
2005/2006
page 8 / 33
Génération de maillages 2D
avec Matlab
2
Utilisation des maillages
2.1
Espace P1 et fonctions chapeaux
On appelle P1 l’espace des fonctions continues sur Ω, et affines par morceaux, c’est-à-dire affines
sur les triangles de Th .
Une fonction fh de P1 peut donc se mettre sous la forme :
fh (~x) = ax + by + c
Pour définir une base de P1 , on choisit les fonctions chapeaux, notées ϕj : elles valent 1 en un
sommet d’un triangle, et 0 pour tous les autres sommets.
On peut aisément vérifier que l’ensemble de ces fonctions est une base de P1 . En effet :
– la famille de ces fonctions est libre : si on considère la somme
N
X
cj ϕj (~x) = 0
j=1
il suffit de prendre ~x = x~i , position d’un noeud. On obtient alors que tous les cj sont nuls, et
donc la famille est bien libre.
– la famille est génératrice . Soit une fonction fh de P1 : elle s’écrit :
fh (~x) =
N
X
cj ϕj (~x) où ci = fh (~
xi )
j=1
fh s’écrit donc comme une combinaison linéaire de fonctions continues affines par morceaux :
elle est donc elle aussi continue et affine par morceaux. La famille est donc génératrice.
On s’aperçoit alors que dans un triangle de sommets (x~1 ,x~2 ,x~3 ), il suffit de connaı̂tre les valeurs
de fh en ces sommets pour déterminer complètement fh : il suffit de résoudre le système :





x1 y1 1
a
f1





x
y
1
b
=
 2


 f2 
2
f3
x3 y3 1
c
Ce système est très rapide à résoudre, et donc fh facile à calculer.
2.2
Espace P2
On définit l’espace P2 comme l’ensemble des fonctions dont l’équation est un polynôme de degré
2.
Ainsi, dans un triangle, on a :
f ∈ P2 ⇒ f (~x) = a + bx + cy + dx2 + exy + gy 2
Les fonctions de base de P2 sont également les fonctions chapeaux, qui valent 1 en un noeud et 0
sur les autres noeuds. Il suffit alors de définir les noeuds : il faut 6 points pour définir complètement
une fonction dans P2 , donc nous considèrerons les noeuds comme étant les sommets des triangles,
ainsi que les milieux des arêtes.
2005/2006
page 9 / 33
Génération de maillages 2D
avec Matlab
3
Conclusion
Les maillages 2D permettent de découper un espace en triangles. Celui-ci peut alors être utilisé
pour approximer des fonctions dont on ne peut pas connaı̂tre la forme analytique, par exemple lors
de la résolution d’une équation aux dérivées partielles du type
” − ∆u = f ”
On se restreindra dans cette étude à la génération de différents maillages sur différentes formes
géométriques.
2005/2006
page 10 / 33
Génération de maillages 2D
avec Matlab
Explication des diverses fonctions
utilisées pour la génération d’un maillage
Dans cette partie, nous allons décrire toutes les fonctions que nous avons créées ou/et utilisées
pour la génération de maillages. On va tout d’abord expliquer l’algorithme de la fonction principale
qui génère le maillage. Cette fonction est appelée distmesh2d. Ensuite nous allons expliquer les autres
fonctions qui permettent de définir la figure sur laquelle on veut effectuer le maillage.
1
Description de la fonction principale : distmesh2d
1.1
Paramètres de la fonction
Cette fonction a pour but la génération de maillage 2D à partir d’au moins cinq paramètres. Ces
derniers sont dans l’ordre :
– une fonction fd qui délimite l’ouvert Ω sur lequel on va effectuer le maillage (on ne garde que
les points où la fonction est négative ou nulle),
– une fonction positive fh qui définit la finesse du maillage (plus la fonction fh est petite au point
~x, et plus le maillage sera fin),
– un réel positif h0 qui est la longueur initiale des arêtes,
– une matrice appelée bbox = [xmin, ymin; xmax, ymax] qui délimite l’espace que l’on considère,
– une matrice n ∗ 2 (n pouvant être nul) appelée pfix qui donne les cordonnées des points fixes
du maillage,
– les derniers paramètres sont facultatifs et sont utilisés, s’ils sont présents, dans le calcul des
fonctions fh et fd.
Cette fonction renvoie également 2 matrices et un vecteur :
– La première matrice p est composée des cordonnées de l’ensemble des sommets des triangles.
C’est donc une matrice N ∗ 2 avec N le nombre de sommets du maillage.
– La deuxième matrice t nous fournit les indices (entiers compris entre 1 et N) des 3 sommets
de chaque triangle, sachant qu’ils sont donnés dans l’ordre trigonométrique. Il s’agit donc d’une
matrice N T ∗ 3 avec NT le nombre de triangles du maillage.
– Le dernier résultat que renvoie la fonction est un vecteur de taille N appelé Z. Soit i compris
entre 1 et N, la ième cordonnée de Z est égale à 1 si le ième noeud de p est sur le bord du maillage,
0 sinon.
1.2
Algorithme de la fonction
Initialisation des variables :
– dptol : condition d’arrêt de la boucle ”répéter... jusqu’à”,
– ttol : condition de comparaison du ”si”,
– Fscale : scalaire permettant le calcul des forces,
– deltat : scalaire permettant la mise à jour des noeuds,
– geps : scalaire utilisé pour le test sur l’appartenance ou non d’un point au maillage,
– deps : scalaire utilisé pour le calcul du gradient quand on ramène les points extérieurs sur le bord.
2005/2006
page 11 / 33
Génération de maillages 2D
avec Matlab
Création de la distribution initiale :
– initialisation du maillage à l’aide de la commande meshgrid qui permet la réalisation d’un
maillage uniforme de paramêtre h0 sur l’epace compris dans la bbox.
– initialisation de p = matrice des coordonnées des noeuds.
On enlève les points qui sont en dehors de la figure sur laquelle on effectue le maillage :
– On ne garde que les points où fd est inférieure à geps.
– Ensuite on calcule fh aux noeuds du maillage et nous rejetons certains points avec une
1
probabilité proportionnelle à f h(x,y)
2 avec (x,y) coordonnées du noeud.
Soit N la taille de p, N est donc égal au nombre de noeuds du maillage.
On initialise également pold à p.
Puis on met à jour le maillage jusqu’à stabilisation :
Répéter
Si || p - pold ||^2 / h0 > ttol alors
pold = p
initialisation de la matrice t à l ’ aide de la commande delaunay
construction de la matrice pmid des coordonnées des centres de gravité
on ne garde que les triangles dont le centre de gravité est dans la figure →
,→ considérée
construction de la matrice bars composée de l ’ ensemble des noeuds qui →
,→ forment chaque ar^
e te du maillage
on dessine le maillage obtenu
finsi
construction de la matrice barvec composée des cordonnées du vecteur →
,→ définie par chaque ar^
e te ( on utilise pour cela la matrice bars , ainsi →
,→ que la matrice p )
construction du vecteur L qui correspond à la longueur de chaque vecteur →
,→ ar^
e te
construction du vecteur hbars composé de la valeur de fh prise au milieu de →
,→ chaque c^
o té
calcul de L0 longueur désirée de chaque ar^
e te définie par hbars * Fscale * →
,→ || L || / || hbars ||
calcul du vecteur force ( scalaire ) en chaque point
calcul des coordonnées des vecteurs forces en chaque point
calcul de la force totale en chaque point , sachant qu ’ aux points fixes →
,→ elles sont nulles
mise à jour des noeuds par la formule suivante : p = p + deltat * Ftot
on projette les points externes sur le bord de la figure
Jusqu ’à ce que les points intérieurs bougent moins que dptol
On enlève les points doubles, ce qui nous oblige à réindexer les triangles possédant ces points
comme sommets. On oriente les triangles dans le sens trigonométrique. Enfin on définit le vecteur Z
dont les composantes valent 1 si le noeud est sur le bord et 0 sinon.
2005/2006
page 12 / 33
Génération de maillages 2D
avec Matlab
2
2.1
Description des fonctions permettant le calcul de fd
dcircle
Cette fonction permet de modéliser un cercle. Elle prend en paramètres l’ensemble des points pi de
coordonnées (xi , yi ) sur lequel on va calculer la fonction, les coordonnées (xc,yc) du centre du cercle,
ainsi que son rayon. Elle renvoie comme résultat le vecteur d dont les composantes sont égales à :
di = sqrt((xi − xc)2 + (yi − yc)2 ) − r.
2.2
ddiff
Cette fonction prend en paramètres les vecteurs d1 et d2 (ces deux vecteurs doivent être de même
taille). Elle renvoie le vecteur d = max(d1, −d2). Cette fonction est utilisée pour représenter la figure
1 privée de la figure 2.
2.3
dell
Cette fonction permet de représenter une ellipse dont les petit et grand axes sont parallèles aux
axes du repère. Ses paramètres sont l’ensemble des points pi où on calcule la fonction, les coordonnées
xc et yc du centre de l’ellipse ainsi que les rayons r1 et r2 . Le résultat de cette fonction est :
d = sqrt((pi − xc)2 /r12 + (pi − yc)2 /r22 ) − 1.
2.4
dpoly
Cette fonction permet de modéliser un polygône connaissant ses sommets. Elle prend donc comme
paramètres l’ensemble p des points où calculer la fonction, ainsi que l’ensemble pv des sommets du
polygône (la dernier sommet doit correspondre au premier). Cette fonction renvoie 0 si le point est
dans la figure, sinon elle renvoie une valeur strictement positive.
2.5
drectangle
Cette fonction permet de dessiner un rectangle connaissant xmin, xmax, ymin et ymax. Le résultat
de cette fonction est :
d = −min(min(min(−ymin + y, ymax − y), −xmin + x), xmax − x).
2.6
dunion
Cette fonction prend en paramètres les vecteurs d1 et d2 (ces deux vecteurs doivent être de même
taille). Elle renvoie le vecteur d = max(d1, d2). Cette fonction est utilisée pour représenter l’union de
la figure 1 et de la figure 2.
3
Description de la fonction huniform
Cette fonction est utilisée pour le calcul de la fonction fh pour un maillage uniforme. Elle a
comme paramètres l’ensemble p des points où on va calculer la fonction, ainsi que d’autres paramètres
facultatifs. Le résultat de cette fonction est un vecteur de la taille de p, dont toutes les composantes
valent 1.
2005/2006
page 13 / 33
Génération de maillages 2D
avec Matlab
Résultats des générations de maillages
1
1.1
Formes simples, maillage uniforme
le disque
Le premier maillage que nous avons tenté de produire est celui d’un disque unité. Nous avons
délimité le disque à l’aide de la fonction fd suivante :
fd = i n l i n e ( ’ sqrt ( sum ( p .^2 ,2) ) -1 ’ , ’p ’) ;
Ensuite, pour générer le maillage, nous avons lancé la commande suivante :
[p , t ]= distmesh2d ( fd , @huniform ,0.2 ,[ -1 , -1;1 ,1] ,[]) ;
Nous obtenons alors la figure suivante :
Fig. III.1 – Disque unité
On observe bien alors que la taille des éléments du maillage est identique : on a alors bien un
maillage uniforme.
2005/2006
page 14 / 33
Génération de maillages 2D
avec Matlab
1.2
le carré
Nous avons ensuite tenté de créer un maillage uniforme sur un carré, en utilisant la fonction
drectangle vue précédemment.
fd = i n l i n e ( ’ drectangle (p , -1 ,1 , -1 ,1) ’ , ’p ’)
On appelle ensuite le programme de génération du maillage, en n’omettant pas de mettre les points
fixes en paramètres, à savoir les sommets du carré.
[p , t ]= distmesh2d ( fd , @huniform ,0.05 ,[ -1 , -1;1 ,1] ,[ -1 , -1;1 ,1; -1 ,1;1 , -1]) ;
Nous obtenons la figure suivante :
Fig. III.2 – Carré
Comme précedemment, on vérifie qu’on a bien un maillage uniforme.
2005/2006
page 15 / 33
Génération de maillages 2D
avec Matlab
1.3
l’ellipse
Nous avons effectué le maillage suivant sur une ellipse dont les axes de symétrie sont parallèles aux
axes des abscisses et des ordonnées. Pour cela, nous utilisons la fonction dell définie précedemment,
avec comme paramètres le centre de l’ellipse de coordonnées (4,4), le grand axe de longueur 2 et le
petit axe de longueur 1.
fd = i n l i n e ( ’ dell (p ,4 ,4 ,2 ,1) ’ , ’p ’) ;
On appelle alors le programme, en ne mettant pas ici de points fixes.
[p , t ]= distmesh2d ( fd , @huniform ,0.2 ,[2 ,3;6 ,5] ,[]) ;
Nous obtenons la figure suivante :
Fig. III.3 – Ellipse
Le résultat est conforme à celui attendu.
2005/2006
page 16 / 33
Génération de maillages 2D
avec Matlab
1.4
le triangle
Nous avons ensuite produit un maillage uniforme sur un triangle quelconque, en utilisant la fonction dpoly. On passe alors en paramètre les sommets du triangles.
pfix =[0 ,0;1 ,4; -2 ,1;0 ,0];
On appelle ensuite le programme en n’oubliant pas les points fixes :
[p , t ]= distmesh2d ( @dpoly , @huniform ,0.2 ,[ -2 ,0;1 ,4] , pfix , pfix ) ;
Nous obtenons la figure suivante :
Fig. III.4 – Triangle
2005/2006
page 17 / 33
Génération de maillages 2D
avec Matlab
1.5
un quadrilatère quelconque
Nous avons effectué le dernier maillage uniforme pour une figure simple sur un quadrilatère quelconque. Pour cela, nous avons utilisé la fonction dpoly qui délimite la surface du polygone
pfix =[ -2 -1 ;1 0 ;0 2 ; -1 1 ; -2 -1] ;
[p , t ]= distmesh2d ( @dpoly , @huniform ,0.1 ,[ -2 , -2;2 ,2] , pfix , pfix ) ;
Nous obtenons la figure suivante :
Fig. III.5 – Quadrilatère quelconque
2005/2006
page 18 / 33
Génération de maillages 2D
avec Matlab
2
Formes simples, maillage non uniforme
Nous avons ensuite effectué des maillages plus complexes sur des formes simples.
2.1
un carré, avec un maillage centré à l’origine
Nous avons fait un maillage dont les mailles sont plus serrées au centre d’un carré, dont le centre
de gravité est placé à l’origine.
fd = i n l i n e ( ’ drectangle (p , -1 ,1 , -1 ,1) ’ , ’p ’) ;
fh = i n l i n e ( ’ max ( sum ( abs ( p ) ,2) ,0.2) ’ , ’p ’) ;
[p , t ]= distmesh2d ( fd , fh ,0.05 ,[ -1 , -1;1 ,1] ,[ -1 , -1;1 ,1; -1 ,1;1 , -1]) ;
Nous obtenons la figure suivante :
Fig. III.6 – Carré avec maillage centré à l’origine
2005/2006
page 19 / 33
Génération de maillages 2D
avec Matlab
2.2
un carré, avec un maillage plus fin pour un de ses sommets
Nous avons ensuite crée un maillage plus fin pour un des sommets d’un carré.
fd = i n l i n e ( ’ drectangle (p ,1 ,3 ,1 ,3) ’ , ’p ’) ;
fh = i n l i n e ( ’ sum ( p .^2 ,2) ’ , ’p ’) ;
[p , t ]= distmesh2d ( fd , fh ,0.05 ,[1 ,1;3 ,3] ,[1 ,3;1 ,1;3 ,1;3 ,3]) ;
Nous obtenons la figure suivante :
Fig. III.7 – Carré avec maillage plus fin pour un de ses sommets
2005/2006
page 20 / 33
Génération de maillages 2D
avec Matlab
2.3
un carré, avec un maillage en croix
Le maillage suivant est un maillage plus serré sur les axes de symétrie horizontal et vertical d’un
carré centré en l’origine.
fh = i n l i n e ( ’ max ( min ( abs ( p ) ,[] ,2) ,0.2) ’ , ’p ’) ;
fd = i n l i n e ( ’ drectangle (p , -1 ,1 , -1 ,1) ’ , ’p ’) ;
[p , t ]= distmesh2d ( fd , fh ,0.1 ,[ -1 , -1;1 ,1] ,[ -1 , -1;1 ,1; -1 ,1;1 , -1]) ;
Nous obtenons la figure suivante :
Fig. III.8 – Carré avec maillage en croix
2005/2006
page 21 / 33
Génération de maillages 2D
avec Matlab
3
Formes plus complexes
3.1
Maillage uniforme sur un carré privé d’un disque
Nous avons créé un maillage uniforme sur un carré amputé d’un disque en son centre.
fd = i n l i n e ( ’ ddiff ( drectangle (p , -1 ,1 , -1 ,1) , dcircle (p ,0 ,0 ,0.5) ) ’ , ’p ’) ;
[p , t ]= distmesh2d ( fd , @huniform ,0.05 ,[ -1 , -1;1 ,1] ,[ -1 , -1; -1 ,1;1 , -1;1 ,1]) ;
Nous obtenons la figure suivante :
Fig. III.9 – Maillage uniforme sur un carré privé d’un disque
2005/2006
page 22 / 33
Génération de maillages 2D
avec Matlab
3.2
Maillage non uniforme sur un carré privé d’un disque
Nous avons fait un maillage non uniforme sur un carré amputé d’un disque en son centre.
Le maillage est plus fin si on se rapproche du centre du carré.
fd = i n l i n e ( ’ ddiff ( drectangle (p , -1 ,1 , -1 ,1) , dcircle (p ,0 ,0 ,0.5) ) ’ , ’p ’) ;
fh = i n l i n e ( ’ min (4* sqrt ( sum ( p .^2 ,2) ) -1 ,2) ’ , ’p ’) ;
[p , t ]= distmesh2d ( fd , fh ,0.05 ,[ -1 , -1;1 ,1] ,[ -1 , -1; -1 ,1;1 , -1;1 ,1]) ;
Nous obtenons la figure suivante :
Fig. III.10 – Maillage non uniforme sur un carré privé d’un cercle
2005/2006
page 23 / 33
Génération de maillages 2D
avec Matlab
3.3
Maillage non uniforme sur un demi carré privé d’un demi disque
Nous avons fait un maillage non uniforme sur un demi carré amputé d’un demi disque en son
centre.
fd = i n l i n e ( ’ ddiff ( drectangle (p , -1 ,0 , -1 ,1) , dcircle (p ,0 ,0 ,0.5) ) ’ , ’p ’) ;
fh = i n l i n e ( ’ min (4* sqrt ( sum ( p .^2 ,2) ) -1 ,2) ’ , ’p ’) ;
[p , t ]= distmesh2d ( fd , fh ,0.05 ,[ -1 , -1;1 ,1] ,[ -1 , -1; -1 ,1;1 , -1;1 ,1;0 , -1;0 , -1/2;
0 ,1/2;0 ,1]) ;
Nous obtenons la figure suivante :
Fig. III.11 – Maillage non uniforme sur un demi carré privé d’un demi disque
2005/2006
page 24 / 33
Génération de maillages 2D
avec Matlab
3.4
Maillage uniforme sur un carré privé d’un carré
Nous avons fait un maillage uniforme sur un carré amputé d’un autre carré de taille inférieure en
son centre.
pfix1 =[0 ,0;0 ,2;2 ,2;2 ,0;0 ,0];
pfix2 =[1 ,0;2 ,1;1 ,2;0 ,1;1 ,0];
fd = i n l i n e ( ’ ddiff ( dpoly (p , q ) , dpoly (p , r ) ) ’ , ’p ’ , ’q ’ , ’r ’) ;
[p , t ]= distmesh2d ( fd , @huniform ,0.1 ,[0 ,0;2 ,2] ,[ pfix1 ; pfix2 ] , pfix1 , pfix2 ) ;
Nous obtenons la figure suivante :
Fig. III.12 – Maillage uniforme sur un carré privé d’un carré
2005/2006
page 25 / 33
Génération de maillages 2D
avec Matlab
3.5
Maillage uniforme sur un quadrilatère privé d’un autre quadrilatère
Nous avons fait un maillage uniforme sur un quadrilatère quelconque privé d’un autre quadrilatère.
Nous avons ici pris le cas particulier où le deuxième quadrilatère est la réplique du premier à une
taille inférieure.
pfix =[ -2 -1 ;1 0 ;0 2 ; -1 1 ; -2 -1];
fd = i n l i n e ( ’ ddiff ( dpoly (p , q ) , dpoly (p , q /2) ) ’ , ’p ’ , ’q ’) ;
[p , t ]= distmesh2d ( fd , @huniform ,0.1 ,[ -2 , -2;2 ,2] ,[ pfix ; pfix /2] , pfix ) ;
Nous obtenons la figure suivante :
Fig. III.13 – Maillage uniforme sur un quadrilatère privé d’un autre quadrilatère
2005/2006
page 26 / 33
Génération de maillages 2D
avec Matlab
3.6
Maillage uniforme sur une forme quelconque
Nous avons fait un maillage uniforme sur un une forme quelconque. Nous avons ici pris l’exemple
d’un hexagone non régulier privé d’un cercle.
pfix =[3 0 ;4 -1 ;3.5 -2 ; -5 0 ;3.5 2 ;4 1 ;3 0] ;
fd = i n l i n e ( ’ ddiff ( dpoly (p , q ) , dcircle (p ,0 ,0 ,1) ) ’ , ’p ’ , ’q ’) ;
[p , t ]= distmesh2d ( fd , @huniform ,0.2 ,[ -5 , -3;4 ,3] , pfix , pfix ) ;
Nous obtenons la figure suivante :
Fig. III.14 – Maillage uniforme sur une forme quelconque
2005/2006
page 27 / 33
Génération de maillages 2D
avec Matlab
3.7
Maillage non uniforme sur une forme quelconque
Nous avons pris la même figure qu’au paragraphe précédent, à laquelle nous avons appliqué un
maillage uniforme, plus fin aux extrémites du polygone situées sur l’axe des abscisses.
pfix =[3 0 ;4 -1 ;3.5 -2 ; -5 0 ;3.5 2 ;4 1 ;3 0] ;
fd = i n l i n e ( ’ ddiff ( dpoly (p , q ) , dcircle (p ,0 ,0 ,1) ) ’ , ’p ’ , ’q ’) ;
fh = i n l i n e ( ’ min ( min ( min ( sqrt (( p (: ,1) +5) .^2+ p (: ,2) .^2) /10+0.05 ,
sqrt (( p (: ,1) -3) .^2+ p (: ,2) .^2) /10+0.05) , sqrt ( sum ( p .^2 ,2) ) /5) ,1) ’ , ’p ’ , ’q ’) ;
[p , t ]= distmesh2d ( fd , fh ,0.04 ,[ -5 , -3;4 ,3] , pfix , pfix ) ;
Nous obtenons la figure suivante :
Fig. III.15 – Maillage non uniforme sur une forme quelconque
2005/2006
page 28 / 33
Génération de maillages 2D
avec Matlab
3.8
Maillage non uniforme sur une forme particilière
Nous avons pour la dernière figure effectué un maillage non uniforme sur une forme qui n’est pas
sans rappeler l’appelation des élèves de l’ISIMA...
pfix =[1 1;1 1.5;5 5.5;1 5.5;1 6;6 6;6 5.5; 2 1.5;6 1.5;6 1;1 1];
pfix2 =[2 0;2 0.5;6 4.5;2 4.5;2 5;7 5;7 4.5;3 0.5;7 0.5;7 0;2 0];
pfix3 =[4.5 5 ; 5.5 5;4 4.5;5 4.5;3 1.5;4 1.5;2.5 1;3.5 1];
fd = i n l i n e ( ’ dunion ( dpoly (p , q ) , dpoly (p , r ) ) ’ , ’p ’ , ’q ’ , ’r ’) ;
fh = i n l i n e ( ’ min ( min ( sqrt (( p (: ,1) -5.5) .^2+( p (: ,2) -5) .^2) /30+0.05 ,
sqrt (( p (: ,1) -2.5) .^2+( p (: ,2) -1) .^2) /30+0.05) ,1) ’ , ’p ’ , ’q ’ , ’r ’) ;
[p , t ]= distmesh2d ( fd , fh ,0.1 ,[0 , -2;9 ,7] ,[ pfix ; pfix2 ; pfix3 ] , pfix , pfix2 ) ;
Nous obtenons la figure suivante :
Fig. III.16 – Maillage non uniforme sur un ZZ !
2005/2006
page 29 / 33
Génération de maillages 2D
avec Matlab
4
Maillages non réussis
Nous avons rencontré certaines difficultés lorsque nous voulions créer nos fonctions pour générer
des formes. Nous exposerons ici un exemple de ces difficultés : nous voulions créer une fonction dtri
qui aurait modélisé un triangle, en n’utilisant pas la fonction dpoly :
function d = dtri (p ,a , b )
d = ddiff ( p (: ,2) + b / a * p (: ,1) -b , min ( p (: ,1) ,p (: ,2) ) ) ;
Cette fonction modélise bien le triangle, mais le maillage uniforme que nous générions ne se
stabilisait pas : au contraire les triangles se déformaient indéfiniment. Nous avons généré le même
triangle avec la fonction dpoly, et là le maillage se stablise.
La figure III.17 montre le maillage crée par la fonction dtri. Le premier triangle montre le maillage
peu après le lancement de la ligne de commande, les deux autres montrent que le maillage ne se
stabilise pas. La figure III.18 montre le maillage obtenu grâce à la fonction dpoly.
Fig. III.17 – Résultats obtenus dans l’ordre avec notre fonction dtri
2005/2006
page 30 / 33
Génération de maillages 2D
avec Matlab
Fig. III.18 – Résultat obtenu avec la fonction dpoly
2005/2006
page 31 / 33
Conclusion
Pour conclure, nous dirons donc que ce projet nous a permis de découvrir un langage de
programmation mathématique, ainsi que d’appronfondir nos connaissances acquises en cours à
propos des maillages.
Nous avons également pu nous apercevoir de la difficulté de comprendre, puis de modifier un
code informatique crée par une autre personne. De plus, nous utilisions Matlab pour la première fois,
et la documentation du code informatique était en anglais, ce qui a encore accru cette difficulté. La
compréhension du code initial, ainsi que celle du langage Matlab, a ainsi pris une grande part du
temps dans la réalisation du projet.
Nous pouvons néanmoins émettre quelques critiques sur notre travail : d’une part nous avons
quelques difficultés à réaliser le maillage que l’on souhaite (dans le cas des maillages non uniformes),
et d’autre part nous avons échoué lors de la création de certaines fonctions générant des formes
géométriques spécifiques (le triangle notamment).
2005/2006
page 32 / 33
Références
[1] http ://math.mit.edu/persson/mesh
[2] http ://www.isima.fr/leborgne/IsimathEF/edpef.pdf
[3] LAPRESTE J.-T. Introduction à Matlab Ellipses, France, 1999
2005/2006
page 33 / 33
ANNEXES
Table des Annexes
A distmesh2D
I
B
dcircle
III
C
ddiff
III
D dell
III
E
dpoly
III
F
drectangle
III
G dunion
IV
H huniform
IV
2005/2006
35
A. distmesh2D
function [p ,t , Z ]= distmesh2d ( fd , fh , h0 , bbox , pfix , varargin )
% DISTMESH2D 2 - D Mesh Generator using Distance Functions .
%
[P , T ]= DISTMESH2D ( FD , FH , H0 , BBOX , PFIX , FPARAMS )
%
%
P:
Node positions ( Nx2 )
%
T:
Triangle indices ( NTx3 )
%
FD :
Distance function d (x , y )
%
FH :
Scaled edge length function h (x , y )
%
H0 :
Initial edge length
%
BBOX :
Bounding box [ xmin , ymin ; xmax , ymax ]
%
PFIX :
Fixed node positions ( NFIXx2 )
%
FPARAMS :
Additional parameters passed to FD and FH
%
%
Example : ( Uniform Mesh on Unit Circle )
%
fd = i n l i n e ( ’ sqrt ( sum ( p .^2 ,2) ) -1 ’ , ’p ’) ;
%
[p , t ]= distmesh2d ( fd , @huniform ,0.2 ,[ -1 , -1;1 ,1] ,[]) ;
%
%
Example : ( Rectangle with circular hole , refined at circle boundary )
%
fd = i n l i n e ( ’ ddiff ( drectangle (p , -1 ,1 , -1 ,1) , dcircle (p ,0 ,0 ,0.5) ) ’ , ’p ’) ;
%
fh = i n l i n e ( ’ min (4* sqrt ( sum ( p .^2 ,2) ) -1 ,2) ’ , ’p ’) ;
%
[p , t ]= distmesh2d ( fd , fh ,0.05 ,[ -1 , -1;1 ,1] ,[ -1 , -1; -1 ,1;1 , -1;1 ,1]) ;
%
%
See also : MESHDEMO2D , DISTMESHND , DELAUNAYN , TRIMESH .
%
Copyright ( C ) 2004 -2005 Per - Olof Persson . See COPYRIGHT . TXT f o r details .
dptol =.001; ttol =.1; Fscale =1.2; deltat =.2; geps =.001* h0 ; deps = sqrt ( eps ) * h0 ;
% 1. Create initial distribution in bounding box ( equilateral triangles )
[x , y ]= meshgrid ( bbox (1 ,1) : h0 : bbox (2 ,1) , bbox (1 ,2) : h0 * sqrt (3) /2: bbox (2 ,2) ) ;
x (2:2: end ,:) = x (2:2: end ,:) + h0 /2;
% Shift even rows
p =[ x (:) ,y (:) ];
% List of node →
,→ coordinates
% 2. Remove points outside the region , apply the rejection method
p = p ( feval ( fd ,p , varargin {:}) < geps ,:) ;
% Keep only d <0 points
r0 =1./ feval ( fh ,p , varargin {:}) .^2;
% Probability to keep →
,→ point
p =[ pfix ; p ( rand ( size (p ,1) ,1) < r0 ./ max ( r0 ) ,:) ];
% Rejection method
N = size (p ,1) ;
% Number of points N
pold = inf ;
while 1
% 3. Retriangulation by the Delaunay algorithm
i f max ( sqrt ( sum (( p - pold ) .^2 ,2) ) / h0 ) > ttol
pold = p ;
,→ positions
t = delaunayn ( p ) ;
pmid =( p ( t (: ,1) ,:) + p ( t (: ,2) ,:) + p ( t (: ,3) ,:) ) /3;
t = t ( feval ( fd , pmid , varargin {:}) <- geps ,:) ;
,→ triangles
% 4. Describe each bar by a unique pair of nodes
bars =[ t (: ,[1 ,2]) ; t (: ,[1 ,3]) ; t (: ,[2 ,3]) ];
,→ duplicated
2005/2006
% For first iteration
% Any large movement ?
% Save current →
% List of triangles
% Compute centroids
% Keep interior →
% Interior bars
→
I
bars = unique ( sort ( bars ,2) , ’ rows ’) ;
% 5. Graphical output of the current mesh
trimesh (t , p (: ,1) ,p (: ,2) , zeros (N ,1) )
view (2) , axis equal , axis off , drawnow
end
% Bars as node pairs
% 6. Move mesh points based on bar lengths L and forces F
barvec = p ( bars (: ,1) ,:) -p ( bars (: ,2) ,:) ;
% List of bar vectors
L = sqrt ( sum ( barvec .^2 ,2) ) ;
% L = Bar lengths
hbars = feval ( fh ,( p ( bars (: ,1) ,:) + p ( bars (: ,2) ,:) ) /2 , varargin {:}) ;
L0 = hbars * Fscale * sqrt ( sum ( L .^2) / sum ( hbars .^2) ) ;
% L0 = Desired lengths
F = max ( L0 -L ,0) ;
% Bar forces ( scalars )
Fvec = F ./ L *[1 ,1].* barvec ;
% Bar forces (x , y →
,→ components )
Ftot = full ( sparse ( bars (: ,[1 ,1 ,2 ,2]) , ones ( size ( F ) ) *[1 ,2 ,1 ,2] ,[ Fvec , - Fvec ] ,N →
,→ ,2) ) ;
Ftot (1: size ( pfix ,1) ,:) =0;
% Force = 0 at fixed →
,→ points
p = p + deltat * Ftot ;
% Update node positions
% 7. Bring outside points back to the boundary
d = feval ( fd ,p , varargin {:}) ; ix =d >0;
% Find points outside ( →
,→ d >0)
dgradx =( feval ( fd ,[ p ( ix ,1) + deps , p ( ix ,2) ] , varargin {:}) -d ( ix ) ) / deps ; % →
,→ Numerical
dgrady =( feval ( fd ,[ p ( ix ,1) ,p ( ix ,2) + deps ] , varargin {:}) -d ( ix ) ) / deps ; %
→
,→ gradient
p ( ix ,:) = p ( ix ,:) -[ d ( ix ) .* dgradx , d ( ix ) .* dgrady ];
% Project back to →
,→ boundary
% 8. Termination criterion : All interior nodes move less than dptol ( →
,→ scaled )
i f max ( sqrt ( sum ( deltat * Ftot (d < - geps ,:) .^2 ,2) ) / h0 ) < dptol , break ; end
end
[p ,m , n ]= unique (p , ’ rows ’) ;
t=n(t);
N = size (t ,1) ;
f o r J =1: N
i f (( p ( t (J ,2) ,1) -p ( t (J ,1) ,1) ) *( p ( t (J ,3) ,2) -p ( t (J ,1) ,2) ) -( p ( t (J ,2) ,2) -p ( t →
,→ (J ,1) ,2) ) *( p ( t (J ,3) ,1) -p ( t (J ,1) ,1) ) ) <0
tmp = t (J ,2) ;
t (J ,2) = t (J ,3) ;
t (J ,3) = tmp ;
end
end
Z = abs ( feval ( fd ,p , varargin {:}) ) < geps ;
2005/2006
II
B. dcircle
function d = dcirc (p , xc , yc , r )
%
Copyright ( C ) 2004 -2005 Per - Olof Persson . See COPYRIGHT . TXT f o r details .
d = sqrt (( p (: ,1) - xc ) .^2+( p (: ,2) - yc ) .^2) -r ;
C. ddiff
function d = ddiff ( d1 , d2 ) , d = max ( d1 , - d2 ) ;
%
Copyright ( C ) 2004 -2005 Per - Olof Persson . See COPYRIGHT . TXT f o r details .
D. dell
function d = dell (p , xc , yc , r1 , r2 )
%
Copyright ( C ) 2004 -2005 Per - Olof Persson . See COPYRIGHT . TXT f o r details .
d = sqrt (( p (: ,1) - xc ) .^2/( r1 ^2) +( p (: ,2) - yc ) .^2/( r2 ^2) ) -1;
E. dpoly
function d = dpoly (p , pv )
%
Copyright ( C ) 2004 -2005 Per - Olof Persson . See COPYRIGHT . TXT f o r details .
np = size (p ,1) ;
nvs = size ( pv ,1) -1;
ds = dsegment (p , pv ) ;
d = min ( ds ,[] ,2) ;
d =( -1) .^( inpolygon ( p (: ,1) ,p (: ,2) , pv (: ,1) , pv (: ,2) ) ) .* d ;
2005/2006
III
F. drectangle
function d = drectangle (p , x1 , x2 , y1 , y2 )
%
Copyright ( C ) 2004 -2005 Per - Olof Persson . See COPYRIGHT . TXT f o r details .
d = - min ( min ( min ( - y1 + p (: ,2) ,y2 - p (: ,2) ) ,- x1 + p (: ,1) ) ,x2 - p (: ,1) ) ;
G. dunion
function d = dunion ( d1 , d2 ) , d = min ( d1 , d2 ) ;
%
Copyright ( C ) 2004 -2005 Per - Olof Persson . See COPYRIGHT . TXT f o r details .
H. huniform
function h = huniform (p , varargin )
%
Copyright ( C ) 2004 -2005 Per - Olof Persson . See COPYRIGHT . TXT f o r details .
h = ones ( size (p ,1) ,1) ;
2005/2006
IV