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