Fonctions d`assemblage de l`élément fini P1 en dimension 3
Transcription
Fonctions d`assemblage de l`élément fini P1 en dimension 3
Institut Supérieur d’ Informatique, de Modélisation et de leurs Applications Complexe Universitaire des Cézeaux BP125 63173 Aubière CEDEX Projet de troisième année Fonctions d’assemblage de l’élément fini P1 en dimension 3 (TOME I) Responsable ISIMA : Jonas KOKO Présenté par : Pierre PETITPREZ Mathieu LAPOINTE 2006-2007 F4 Institut Supérieur d’ Informatique, de Modélisation et de leurs Applications Complexe Universitaire des Cézeaux BP125 63173 Aubière CEDEX Projet de troisième année Fonctions d’assemblage de l’élément fini P1 en dimension 3 (TOME I) Responsable ISIMA : Jonas KOKO Présenté par : Pierre PETITPREZ Mathieu LAPOINTE 2006-2007 F4 Fonctions d’assemblage de l’élément fini P1 en dimension 3 Remerciements Nous tenons en premier lieu à remercier Mr Jonas KOKO pour nous avoir proposé ce projet, pour ses nombreux conseils lors de sa réalisation et pour la confiance qu’il nous a témoigné. En particulier, merci pour nous avoir mis à disposition vos études qui nous ont largement servi dans l’étape de compréhension des algorithmes. Merci également pour avoir su nous éclairer lorsque nous avions des problèmes. Nous exprimons également notre gratitude à Mr Gilles LEBORGNE, qui, en plus d’avoir su nous inculquer les notions nécessaires à la résolution d’équations aux dérivées partielles, nous a fourni une aide très utile lorsque nous voulions générer des maillages afin de tester nos algorithmes. 2006/2007 Fonctions d’assemblage de l’élément fini P1 en dimension 3 Résumé Les méthodes de résolution d’équations aux dérivées partielles qui se basent sur les éléments finis nous permettent d’obtenir une solution approchée à un problème. Toutefois, les besoins en calcul de telle méthode sont relativement élevés dès que l’on cherche à résoudre dans un espace de dimension 3. L’obtention d’un code Matlab rapide est alors primordiale. C’est ce à quoi essaye de répondre ce projet. Nous adaptons la méthode de résolution proposée par Mr Jonas KOKO au cas 3D. Afin de limiter les temps de calcul, les inversions de matrice liées au calcul seront faite de manière analytique. De plus, nous nous efforcerons d’obtenir un code vectorisé afin d’avoir les meilleures performances possibles. Mots clés: éléments finis, espace de dimension 3, inversion analytique, code vectorisé Abstract The methods of solution of partial derivative equation which bases on finite elements allow us to obtain a solution approached for a problem. However, the requirements in calculation for such method are relatively high as soon as one seeks to solve in a space of dimension 3. Obtaining a fast Matlab code is then of primary importance. It is the main purpose of our project. We adapt the method of resolution of Mr. Jonas KOKO to the case 3D. In order to limit the computing times, the inversions of matrix related to calculation will be made in an analytical way. Moreover, we will endeavour to obtain a vectorized code in order to have the best possible performances. Keywords: finite elements, space of dimension 3, analytical inversion, vectorized code 2006/2007 Fonctions d’assemblage de l’élément fini P1 en dimension 3 Table des matières Remerciements Résumé / Abstract Table des matières Table des figures Liste des tableaux Introduction 6 1 Position du problème 1.1 Problème modèle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Problème de dirichlet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 7 7 2 Maillage 2.1 Eléments de référence . . . . . . . . . . . . . 2.2 Représentation Matlab . . . . . . . . . . . . 2.3 Approximation P 1 . . . . . . . . . . . . . . 2.3.1 Formulation du problème variationnel 2.3.2 Méthode de Galerkin . . . . . . . . . . . . . . . . . . . . . . . . . . . approché . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 9 11 11 11 12 3 Assemblage des matrices et calculs nécessaires 3.1 Assemblage de la matrice de rigidité . . . . . . . . . 3.2 Assemblage de la matrice de masse . . . . . . . . . 3.3 Assemblage du vecteur second membre . . . . . . . 3.4 Assemblage de la condition aux limites de Dirichlet 3.5 Inversion analytique d’une matrice 4 ∗ 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 13 13 14 14 14 4 Analyse des résultats 4.1 Justification de l’inversion analytique de la matrice 4.2 Calcul de l’erreur en espace . . . . . . . . . . . . . 4.3 Cas où α et ν sont constants . . . . . . . . . . . . . 4.3.1 Erreur en espace . . . . . . . . . . . . . . . 4.3.2 Temps de calcul . . . . . . . . . . . . . . . . 4.4 Cas où α et ν non constants . . . . . . . . . . . . . 4.4.1 Erreur en espace . . . . . . . . . . . . . . . 4.4.2 Temps de calcul . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 15 15 15 16 16 18 19 19 Conclusion Références bibliographiques 2006/2007 22 Fonctions d’assemblage de l’élément fini P1 en dimension 3 Table des figures .1 .2 .3 .4 .5 .6 A.1 Tétraèdres de référence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Temps de calcul des gradients des fonctions de base en fonction du nombre de points . Erreur en fonction du nombre de points avec α et ν constants . . . . . . . . . . . . . Temps de calcul en fonction du nombre de points avec α et ν constants . . . . . . . . Erreur en fonction du nombre de points avec α et ν non constants . . . . . . . . . . . Temps de calcul en fonction du nombre de points avec α et ν non constants . . . . . . Les 6 tétraèdres contenus dans un cube . . . . . . . . . . . . . . . . . . . . . . . . . . 2006/2007 9 15 17 17 20 20 V Fonctions d’assemblage de l’élément fini P1 en dimension 3 Liste des tableaux .1 .2 .3 .4 .5 Exemple de fichier du maillage de l’élément de référence . . . . . . . . . . . Erreur en fonction du nombre de points avec α et ν constants . . . . . . . Temps de calcul en fonction du nombre de points avec α et ν constants . . Erreur en fonction du nombre de points avec α et ν non constants . . . . . Temps de calcul en fonction du nombre de points avec α et ν non constants 2006/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 16 18 19 21 Fonctions d’assemblage de l’élément fini P1 en dimension 3 Introduction L’évolution de l’informatique nous permet aujourd’hui de résoudre des problèmes de plus en plus complexes. Elle permet notamment la résolution d’équations aux dérivées partielles par des méthodes d’éléments finis. Ce projet entend reprendre la méthode de résolution d’équation aux dérivées partielles proposée par Jonas KOKO dans son cours et de l’adapter au cas tridimensionnel [1]. Notre étude propose donc une méthode de résolution s’appuyant sur le calcul des matrices de rigidité et de masse ramenant notre système différentiel à un système linéaire. L’objectif est la création d’un code Matlab vectorisé. L’assemblage de la matrice de rigidité requiert le calcul des gradients des fonctions de base. Ceux ci seront calculés de manière analytique afin de ne pas nuire à la vitesse de calcul. La présentation de notre étude se déroulera de la manière suivante. Dans un premier temps, nous expliciterons les problèmes que notre méthode se propose de résoudre. Ensuite, après avoir défini les maillages sur lesquels nous travaillerons, nous poserons le problème sous forme variationelle. Nous en déduirons alors une expression des matrices de masse et de rigidité et du vecteur second membre, que nous calculerons dans une troisième partie. Enfin, dans une dernière partie, nous testerons notre algorithme sur différents problèmes et conclurons sur son efficacité, sa rapidité et sa précision. Dans nos annexes, nous avons fait figurer les différents codes que nous avons implémentés. Tout d’abord le code Matlab de la méthode de résolution puis un petit code C que nous avons développé afin de générer des maillages dans l’espace. 2006/2007 page 6 / 23 Fonctions d’assemblage de l’élément fini P1 en dimension 3 1 Position du problème 1.1 Problème modèle Soit Ω un domaine borné de R2 de frontière Γ suffisamment régulière. Un point de Ω sera noté ~x = (x, y). Notre problème modèle est le suivant : Trouver une fonction u : Ω → R solution de ~ α(~x)u(~x) − div(ν(~x)grad(u(~ x))) = f (~x), ∀~x ∈ Ω u(~x) = 0, ∀~x ∈ Γ (1) (2) Les données du problème sont les fonctions α, ν et f définies sur Ω. Nous supposons que les fonctions f ,α et ν vérifient : f ∈ L2 (Ω), α ∈ L∞ (Ω)etα(~x) ≥ 0, ∀~x ∈ Ω. ∗ ∃νmin , νmax ∈ R+ , 0 < νmin ≤ ν(~x) ≤ νmax , ∀~x ∈ Ω (3) (4) (5) Nous résoudrons cette équation par une méthode des éléments finis. Pour cela, nous allons avoir besoin de la formulation variationelle du problème 1-2. En posant V = H01 (Ω), on obtient, à l’aide de la formule de Green : Trouver v ∈ V = H01 (Ω) tel que : Z Z α(~x)u(~x)v(~x)d~x + ~ ~ ν(~x)grad(u(~ x))grad(v(~ x))d~x = f (~x)v(~x)d~x, ∀v ∈ V (6) Ω Ω Ω Z Les conditions du théorème de Lax-Milgram sont satisfaites grâce aux équations 4-5. La forme bilinéaire Z Z α(~x)u(~x)v(~x)d~x + a(u, v) = Ω ~ ~ ν(~x)grad(u(~ x))grad(v(~ x))d~x (7) Ω est donc continue et coercitive sur Ω. Alors le problème 10 admet une solution unique dans V . 1.2 Problème de dirichlet Nous gardons les mêmes hypothèses sur α, ν et f . On se propose de résoudre le problème suivant. Trouver une fonction u : Ω → R solution de ~ α(~x)u(~x) − div(ν(~x)grad(u(~ x)) = f (~x), ∀~x ∈ Ω u(~x) = g(~x), ∀~x ∈ Γ (8) (9) Posons V D = {v ∈ H 1 (Ω), ∀~x ∈ Γ, v(~x) = v(~x)}. 2006/2007 page 7 / 23 Fonctions d’assemblage de l’élément fini P1 en dimension 3 Sous des hypothèses de régularité supplémentaires sur g, la formulation variationelle de 8-9 est : Trouver u ∈ V D tel que : Z Z α(~x)u(~x)v(~x)d~x + Ω 2006/2007 Ω ~ ~ ν(~x)grad(u(~ x))grad(v(~ x))d~x = Z f (~x)v(~x)d~x, ∀v ∈ V (10) Ω page 8 / 23 Fonctions d’assemblage de l’élément fini P1 en dimension 3 2 Maillage 2.1 Eléments de référence Dans le cas de tetraèdres, l’élément de référence est le tétraèdre {(0, 0, 0), (1, 0, 0), (0, 1, 0), (0, 0, 1)}, figure .1. La transformation τ définit les coordonnées ~x = (x, y, z) de l’élément réel à partir des coordonnées ξ~ = (ξ, η, γ) de l’élément de référence. Fig. .1 – Tétraèdres de référence La transformation τ doit générer des éléments compatibles avec les propriétés de la définition d’un maillage. Chaque transformation τ est donc choisie de sorte qu’elle soit bijective et transforme les noeuds géométriques de l’élément de référence en noeuds géométriques de l’élément réel. L’élément de référence est défini par les contraintes suivantes : ξ+η+γ ξ η γ ≤ ≥ ≥ ≥ 1 0 0 0. Plaçons nous sur un tétraèdre réel T , de sommets {~ xi = (xi , yi , zi )}i=1,2,3,4 . En posant : ~ = 1−ξ−η−γ φ1 (ξ) ~ = ξ φ2 (ξ) ~ = η φ3 (ξ) (11) ~ = γ φ4 (ξ) (14) (12) (13) La transformation τ est définie par ~ = ~x(ξ) 4 X ~ xi φi (ξ)~ i=1 2006/2007 page 9 / 23 Fonctions d’assemblage de l’élément fini P1 en dimension 3 que l’on peut encore écrire ~ = x~1 + J ξ~ ~x(ξ) (15) où J est la matrice x2 − x1 x3 − x1 x4 − x1 J = y2 − y1 y3 − y1 y4 − y1 z2 − z1 z3 − z1 z4 − z1 La matrice J est la matrice jacobienne de la transformation τ et son déterminant peut être calculé par une méthode de type Sarrus et on a detJ = 6 |T | (16) où |T | est le volume du tétraèdre T . La transformation τ est donc réversible dès lors que |T | = 6 0, ie. le volume du tétraèdre réel T est non nul. Sur un élément réel T , de sommets {xi }i=1,...,4 , on utilise l’approximation nodale uh (~x) = 4 X (17) Φi (~x)ui i=1 où les {Φi (~x)} sont les fonctions de base sur l’élément réel. On leur préférera les fonctions {φi }, données par les équations 11-14, définies sur l’élément de référence en remplaçant 17 par ~ = uh (ξ) 4 X ~ i φi (ξ)u (18) i=1 Les variables ~x et ξ~ se correspondant par la transformation τ −1 . ~ Pour Puisque nous utiliserons 18 au lieu de 17, nous devons calculer les dérivations par rapport à ξ. cela nous utilisons la formule suivante [2] 1 ∇φ1 x1 ∇φ2 ∇φ3 = y1 ∇φ4 z1 1 x2 y2 z2 1 x3 y3 z3 −1 1 x4 y4 z4 0 1 0 0 0 0 1 0 0 0 0 1 (19) La matrice sera inversée par une méthode analytique que nous verrons plus tard. Les intégrales sur les éléments réels doivent être aussi transformées en intégrales sur l’élément de référence. A l’aide de la formule de changement de variables, on a Z Z f (~x)d~x = T 2006/2007 Tr ~ |detJ| dξ~ = 6 |T | f (ξ) Z ~ ξ~ f (ξ)d (20) Tr page 10 / 23 Fonctions d’assemblage de l’élément fini P1 en dimension 3 2.2 Représentation Matlab La tétraédrisation de l’espace sera représentée de la manière suivante. Les noeuds et les tétraèdres sont stockés dans deux tableaux p(1 : np, 1 : 3) et t(1 : nt, 1 : 4) où np et nt représentent respectivement le nombre de points et le nombre de tétraèdres du maillage de l’espace. Nos maillages seront générés par un utilitaire que nous avons développé en C. Le code de celui ci sera fourni en annexe. Il génère un fichier dans lequel le maillage est représenté comme suit : – La première ligne contient le nombre de points et le nombre de tétraèdres. – La première partie du fichier contient les coordonnées de chaque point. Sur chaque ligne figurent les 3 coordonnées d’un point. – Enfin, les tétraèdres sont représentés par les 4 points qui les composent. 4 0.0000 1.0000 0.0000 0.0000 1 1 0.0000 0.0000 1.0000 0.0000 2 0.0000 0.0000 0.0000 1.0000 3 4 Tab. .1 – Exemple de fichier du maillage de l’élément de référence Approximation P 1 2.3 2.3.1 Formulation du problème variationnel approché Définissons l’espace dans lequel nous allons résoudre le problème 10. Soit P 1 l’espace des polynômes à 3 variables de degré inférieur ou égal à 1. Définissons les espaces variationnels discrets suivants : Hh1 = {vh ∈ C 0 (Ω); vh |T ∈ P 1 , ∈ Th }, Vh = {vh ∈ Hh1 ; vh (x, y) = 0, ∀(x, y) ∈ Γh }. (21) (22) La solution approchée uh est linéaire par morceaux sur Ωh . Les valeurs des fonctions vh de Hh sont entièrement déterminées par leurs valeurs aux noeuds de la triangulation. La dimension de Hh est donc égale au nombre de noeuds du maillage. Soit une base de Hh1 (Φi )i=1,...,N où les φi sont les fonctions suivantes : Φi (xj , yj , zj ) = δij Pour toute fonction vh de Vh , on a donc vh (~x) = ~ grad(v x)) = h (~ N X i=1 N X Φi (~x)vi , (23) ~ grad(Φ x))vi . i (~ (24) i=1 Nous pouvons maintenant formuler le problème variationnel approché : Trouver uh ∈ Vh tel que : Z Z α(~x)uh (~x)vh (~x)d~x + Ωh 2006/2007 Ω ~ ~ ν(~x)grad(u x))grad(v x))d~x = h (~ h (~ Z f (~x)vh (~x)d~x, ∀vh ∈ Vh (25) Ω page 11 / 23 Fonctions d’assemblage de l’élément fini P1 en dimension 3 2.3.2 Méthode de Galerkin L’équation 25 est vraie, en particulier pour une fonction vh = Φi . Ce qui correspond au problème : Trouver uh ∈ Vh tel que : Z Z ~ ~ ν(~x)grad(u x))grad(Φ x))d~x = h (~ i (~ α(~x)uh (~x)Φi (~x)d~x + Ωh Z f (~x)vh (~x)d~x, ∀i = 1, ..., N (26) Ωh Ωh N étant le nombre de noeuds internes de la triangulation. En écrivant uh dans la base des (Φi )i=1,...,N , nous obtenons : N Z X j=1 Z α(~x)Φj (~x)Φi (~x)d~x + Ωh ~ ~ ν(~x)grad(Φ x))grad(Φ x))d~x ui = j (~ i (~ Z Ωh f (~x)Φi (~x)d~x, ∀i = 1, ..., (N27) Ωh Le problème variationnel discret 25 est donc équivalent au système linéaire n ∗ n (M + R)~u = f~. où M = (Mij ) la matrice de masse, R = (Rij ) la matrice de rigidité ou de raideur et f~ = (fi ) le second membre sont définis par Z Mij = α(~x)Φj (~x)Φi (~x)d~x (28) ~ ~ ν(~x)grad(Φ x))grad(Φ x))d~x j (~ i (~ (29) f (~x)Φi (~x)d~x (30) Ωh Z Rij = Ωh Z fi = Ωh On peut se ramener à des intégrales sur les triangles T . On pose : (T ) Mij Z = α(~x)Φj (~x)Φi (~x)d~x (31) ~ ~ ν(~x)grad(Φ x))grad(Φ x))d~x j (~ i (~ (32) f (~x)Φi (~x)d~x (33) T (T ) Rij (T ) fi Z = ZT = T On obtient alors Mij = X (T ) Mij , T ∈Th Rij = X (T ) Rij , T ∈Th fi = X (T ) fi . T ∈Th 2006/2007 page 12 / 23 Fonctions d’assemblage de l’élément fini P1 en dimension 3 3 Assemblage des matrices et calculs nécessaires 3.1 Assemblage de la matrice de rigidité Pour un tétraèdre T de Th , soient {xi }i=1,...,4 les sommets et φi les fonctions de base correspondantes. Si le coefficient ν n’est pas une constante, nous supposons sa valeur connue pour tous les sommets de la triangulation. Le volume du tétraèdre nous est donné par la formule 16 et les gradients des fonctions de base par 19. En utilisant la formule du changement de variable 20, on obtient (T ) Rij Z Z ν∇φi (~x)∇φj (~x)d~x = 6 |T | = T ~ x φj (ξ)d ~ ξ~ i, j = 1, ..., 4 ν∇x φi (ξ)∇ Tr où les φi sont les fonctions de base 11-14 de l’élément de référence Tr . Sachant que les ∇φi sont constants et que |Tr | = 1/6, il vient que (T ) ~ x φj (ξ) ~ Rij = νT |T | ∇x φi (ξ)∇ où νT = 3.2 ν 1 (ν(x~1 ) 4 si ν constant + ν(x~2 ) + ν(x~3 ) + ν(x~4 )) sinon Assemblage de la matrice de masse En utilisant la formule du changement de variable 20, un élément d’indice (i, j) de la matrice de masse élémentaire est donné par Z Z (T ) ~ i (ξ)φ ~ j (ξ)d ~ ξ~ α(~x)φi (~x)φj (~x)d~x = 6 |T | α(ξ)φ Mij = T Tr où les φi sont les fonctions de base sur l’élément de référence 11-14. De plus, d’après [3], on a la formule suivante : Z 1 0 Z 0 1−ξ Z 1−ξ−η ξ i η j γ k dγdηdξ = 0 i!j!k! (i + j + k + 3)! (34) Grâce à 34, on obtient par un calcul direct ( (T ) Mij = | αT |T si i=j 10 |T | αT 20 sinon où αT = 2006/2007 α si α constant 1 (α(x~1 ) + α(x~2 ) + α(x~3 ) + α(x~4 )) sinon 4 page 13 / 23 Fonctions d’assemblage de l’élément fini P1 en dimension 3 3.3 Assemblage du vecteur second membre Nous supposons les valeurs de f connues pour tout les sommets du maillage. Le vecteur second membre est alors calculé de la manière suivante Z Z (T ) fi = f φi d~x = 6 |T | f φi dξ~ T Tr Et donc en utilisant la formule 34, on obtient (T ) fi = fT |T | 4 (35) où fT = 3.4 f 1 (f (x~1 ) 4 si f constant + f (x~2 ) + f (x~3 ) + f (x~4 )) sinon Assemblage de la condition aux limites de Dirichlet Après assemblage, on obtient le système linéaire suivant : Au = b Il faut le modifier afin d’incorporer la condition au limite de Dirichlet. Nous utiliserons une méthode de pénalisation car nous utiliserons une méthode de résolution directe. Soit la précision de la machine A chaque ligne i du système, on ajoute −1 sur la diagonale et −1 uD i au second membre. 3.5 Inversion analytique d’une matrice 4 ∗ 4 Pour inverser la matrice 4∗4 nécessaire au calcul des gradients de fonctions de base, nous utiliserons une méthode analytique afin d’obtenir de meilleures performances dans notre implémentation Matlab. Pour cela, nous donnons la formule suivante : A−1 = 1 ∗ com(A)T det(A) (36) où com(A) est la matrice des cofacteurs de A. 2006/2007 page 14 / 23 Fonctions d’assemblage de l’élément fini P1 en dimension 3 4 Analyse des résultats 4.1 Justification de l’inversion analytique de la matrice Lors du calcul du vecteur des gradients des fonctions de base, nous utilisons une formule d’inversion analytique de la matrice afin d’éviter des calculs trop lourds. Afin de mettre en avant l’intérêt d’une telle méthode, nous avons calculé les temps de calcul en utilisant une inversion simple de la matrice sous Matlab. La figure .2 représente le temps de calcul des gradients des fonctions de base en fonction du nombre de points. Fig. .2 – Temps de calcul des gradients des fonctions de base en fonction du nombre de points 4.2 Calcul de l’erreur en espace Soit usol la solution fournie par notre algorithme et u la fonction satisfaisant l’équation 1-2. Nous avons calculé l’erreur en fonction du nombre de points. Pour cela, nous avons utilisé la norme classique dans Rn : v u n uX erreur = t usol (i)2 − u(i)2 . i=1 Les calculs ont été effectués sur des maillages composés de 8 à 8000 points. 4.3 Cas où α et ν sont constants Dans un premier temps, nous testerons notre algorithme sur le problème suivant. Trouver une fonction u : [0, 1]3 → R solution de 2006/2007 page 15 / 23 Fonctions d’assemblage de l’élément fini P1 en dimension 3 u(~x) − ∆u(~x) = −2 ∗ ex+y+z , ∀~x ∈ Ω u(~x) = 0, aux bords La solution à ce problème est la fonction u : [0, 1]3 → R ~x 7→ ex+y+z 4.3.1 Erreur en espace Nombre de points Erreur 8.0000 0.0000 27.0000 0.2021 64.0000 0.2263 125.0000 0.2187 216.0000 0.2059 343.0000 0.1932 512.0000 0.1818 729.0000 0.1719 1000.0000 0.1633 1331.0000 0.1557 1728.0000 0.1490 2197.0000 0.1431 2744.0000 0.1378 3375.0000 0.1330 4096.0000 0.1287 4913.0000 0.1248 5832.0000 0.1212 6859.0000 0.1178 8000.0000 0.1148 Tab. .2 – Erreur en fonction du nombre de points avec α et ν constants La figure .3 représente l’évolution de l’erreur en fonction du nombre de points. 4.3.2 Temps de calcul La figure .4 représente l’évolution du temps de traitement en fonction du nombre de points dans un repère logarithmique. A partir d’un certain nombre de points, les points paraissent alignés. Cherchons une approximation de cette droite par une regression linéaire : y = ax + b où 2006/2007 page 16 / 23 Fonctions d’assemblage de l’élément fini P1 en dimension 3 Fig. .3 – Erreur en fonction du nombre de points avec α et ν constants Fig. .4 – Temps de calcul en fonction du nombre de points avec α et ν constants 2006/2007 page 17 / 23 Fonctions d’assemblage de l’élément fini P1 en dimension 3 Nombre de points Temps de calcul total (s) Temps de lecture (s) Temps de traitement (s) 8.0000 0.127504 0.001603 0.0125901 27.0000 0.018077 0.006092 0.011985 64.0000 0.026737 0.016720 0.010017 125.0000 0.058683 0.037113 0.02157 216.0000 0.112821 0.062057 0.050764 343.0000 0.191509 0.104569 0.08694 512.0000 0.308543 0.163872 0.144671 729.0000 0.488136 0.242643 0.245493 1000.0000 0.695576 0.343185 0.352391 1331.0000 0.984830 0.466234 0.518596 1728.0000 1.362043 0.622816 0.739227 2197.0000 1.901611 0.806430 1.095181 2744.0000 2.459966 1.027587 1.432379 3375.0000 3.459436 1.278818 2.180618 4096.0000 4.495414 1.568973 2.926441 4913.0000 5.739330 1.902805 3.836525 5832.0000 7.955548 2.280429 5.675119 6859.0000 9.799278 2.705467 7.093811 8000.0000 13.743943 3.178593 10.56535 Tab. .3 – Temps de calcul en fonction du nombre de points avec α et ν constants cov(x, y) V (x) xcov(x, y) = y − ax b = y− V (x) a = On obtient a = 1.38 et b = −10.44. La complexité de la méthode est donc O(nombre de points1.38 ) 4.4 Cas où α et ν non constants Nous appliquons notre algorithme au problème suivant : Trouver une fonction u : [0, 1]3 → R solution de ~ α(~x)u(~x) − div(ν(~x)grad(u(~ x)) = f (~x), ∀~x ∈ Ω u(~x) = 0, ∀~x ∈ Γ avec α : [0, 1]3 ~x ν : [0, 1]3 ~x →R 7→ xyz →R 7→ 2(x + y + z) La solution à ce problème est la fonction 2006/2007 page 18 / 23 Fonctions d’assemblage de l’élément fini P1 en dimension 3 u : [0, 1]3 → R ~x 7→ sin(πx)cos(πy)eπz 4.4.1 Erreur en espace Nombre de points Erreur 8.0000 0.0000 27.0000 1.4526 64.0000 2.0067 125.0000 2.0367 216.0000 1.9356 343.0000 1.8073 512.0000 1.6837 729.0000 1.5744 1000.0000 1.4818 1331.0000 1.4055 1728.0000 1.3445 2197.0000 1.2971 2744.0000 1.2620 3375.0000 1.2375 4096.0000 1.2225 4913.0000 1.2156 5832.0000 1.2156 6859.0000 1.2215 8000.0000 1.2324 Tab. .4 – Erreur en fonction du nombre de points avec α et ν non constants La figure .5 représente l’évolution de l’erreur en fonction du nombre de points. 4.4.2 Temps de calcul La figure .6 représente l’évolution du temps de traitement en fonction du nombre de points dans un repère logarithmique. De même que précedemment, on effectue une régression linéaire. Nous obtenons a = 1, 36 et b = −10, 74. Soit une complexité en temps en O(nombre de points1,36 ) 2006/2007 page 19 / 23 Fonctions d’assemblage de l’élément fini P1 en dimension 3 Fig. .5 – Erreur en fonction du nombre de points avec α et ν non constants Fig. .6 – Temps de calcul en fonction du nombre de points avec α et ν non constants 2006/2007 page 20 / 23 Fonctions d’assemblage de l’élément fini P1 en dimension 3 Nombre de points Temps de traitement (s) 8.0000 0.007897 27.0000 0.004502 64.0000 0.011142 125.0000 0.023900 216.0000 0.033927 343.0000 0.055696 512.0000 0.090982 729.0000 0.161817 1000.0000 0.246200 1331.0000 0.339417 1728.0000 0.449763 2197.0000 0.650939 2744.0000 0.881604 3375.0000 1.328120 4096.0000 1.795960 4913.0000 2.348859 5832.0000 3.430067 6859.0000 4.405764 8000.0000 6.536970 Tab. .5 – Temps de calcul en fonction du nombre de points avec α et ν non constants 2006/2007 page 21 / 23 Conclusion L’objectif de ce projet était l’implémentation des méthodes d’assemblage des matrices de masse et de rigidité grâce à un code Matlab vectorisé et performant. Ceci a pu être possible notamment grâce à l’inversion analytique de la matrice intervenant dans le calcul des gradients des fonctions de base. Nous avons, après avoir rappelé la méthode de résolution que nous employons, explicité l’assemblage des différentes matrices et du second membre. Nous avons aussi intégré au système linéaire que nous obtenions les conditions de Dirichlet. La résolution de problèmes d’équations aux dérivées partielles nous montre alors l’efficacité de notre algorithme. Ce projet nous a permis de coder une application de notre cours d’équation aux dérivées partielles. Notre algorithme permet de fournir une solution approchée au système différentiel présenté au début de notre étude. 2006/2007 page 22 / 23 Références [1] J. Koko. Méthode des élements finis en dimension 2. [2] S.A. Funken R. Klose J. Alberty, C. Carstensen. Matlab implementation of the finite element method in elasticity, 2002. [3] Gouri Dhatt Touzot. Une présentation de la méthode des élements finis, 1981. 2006/2007 page 23 / 23 Institut Supérieur d’ Informatique, de Modélisation et de leurs Applications Complexe Universitaire des Cézeaux BP125 63173 Aubière CEDEX Projet de troisième année ANNEXES (TOME II) Responsable ISIMA : Jonas KOKO Présenté par : Pierre PETITPREZ Mathieu LAPOINTE 2006-2007 F4 Table des Annexes A Code Matlab A.1 Assemblage de la matrice de masse . . . A.2 Assemblage de la matrice de rigidité . . A.3 Assemblage du vecteur second membre . A.4 Calcul des gradients de fonction de base A.5 Lecture du maillage . . . . . . . . . . . A.6 Calcul des données du problème . . . . A.7 Résolution . . . . . . . . . . . . . . . . B . . . . . . . I I I II III IV IV IV Générateur de maillage 3D B.1 Le principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . B.2 Le code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . V V V 2006/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 A. Code Matlab A.1 Assemblage de la matrice de masse 1 3 5 7 9 11 13 15 17 19 21 f u n c t i o n M=edp2dmss3D ( p , t , alpha ) %EDP2DMSS3D Assemblage de l a m a t r i c e de masse 3D %−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− % Synopsis : % M=edp2dmss3D ( p , t , a l p h a ) % Arguments : % p − c o o r d o n né e s d e s sommets , t a b l e a u np ∗3 % t − sommets d e s t é t r a è d r e s , t a b l e a u nt ∗4 % a l p h a − s c a l a i r e ou v e c t e u r c o l o n n e de l o n g u e u r np ou nt %−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− np=s i z e ( p , 1 ) ; nt=s i z e ( t , 1 ) ; %1 . t r a i t e m e n t du c o e f f i c i e n t a l p h a [ m1 , m2 ] = s i z e ( alpha ) ; i f ( m2>1 | ( m1>1 & m1˜=nt & m1˜=np ) ) e r r o r ( ’ a l p h a d o i t e t r e un v e c t e u r c o l o n n e de l o n g u e u r np ou nt ’ ) end i f ( m1==1 | m1==nt ) c=alpha ; else c=( alpha ( t ( : , 1 ) ) + alpha ( t ( : , 2 ) ) + alpha ( t ( : , 3 ) ) + alpha ( t ( : , 4 ) ) ) / 4 . ; end 23 25 27 29 31 33 35 37 39 41 %2 . volume d e s t e t r a e d r e s x21=p ( t ( : , 2 ) , 1 ) − p ( t ( : , 1 ) , 1 ) ; y21=p ( t ( : , 2 ) , 2 ) − p ( t ( : , 1 ) , 2 ) ; z21=p ( t ( : , 2 ) , 3 ) − p ( t ( : , 1 ) , 3 ) ; x31=p ( t ( : , 3 ) , 1 ) − p ( t ( : , 1 ) , 1 ) ; y31=p ( t ( : , 3 ) , 2 ) − p ( t ( : , 1 ) , 2 ) ; z31=p ( t ( : , 3 ) , 3 ) − p ( t ( : , 1 ) , 3 ) ; x41=p ( t ( : , 4 ) , 1 ) − p ( t ( : , 1 ) , 1 ) ; y41=p ( t ( : , 4 ) , 2 ) − p ( t ( : , 4 ) , 2 ) ; z41=p ( t ( : , 4 ) , 3 ) − p ( t ( : , 1 ) , 3 ) ; tetr_vol =(x21 . ∗ ( y31 . ∗ z41−z31 . ∗ y41)+x31 . ∗ ( y41 . ∗ z21−z41 . ∗ y21)+x41 . ∗ ( y21 . ∗ z31−z21 . ∗ y31 ) ) / 6 . ; %ca marche pas l a %t e t r v o l=d e t S a r r u s ( [ x21 x31 x41 ; y21 y31 y41 ; z21 z31 z41 ] ) / 6 . ; c=c . ∗ tetr_vol / 2 0 . ; %4 . a s s e m b l a g e d e s é l e m e n t s sous −diagonaux M=s p a r s e ( np , np ) ; M=M+s p a r s e ( t ( : , 2 ) , t ( : , 1 ) , c , np , np)+ s p a r s e ( t ( : , 3 ) , t ( : , 1 ) , c , np , np)+ s p a r s e ( t ( : , 4 ) , t ( : , 1 ) , c , np , np ) . . . +s p a r s e ( t ( : , 3 ) , t ( : , 2 ) , c , np , np)+ s p a r s e ( t ( : , 4 ) , t ( : , 2 ) , c , np , np)+ s p a r s e ( t ( : , 4 ) , t ( : , 3 ) , c , np , np ) ; 43 45 47 49 %5 . t r a n s p o s i t i o n M = M+M . ’ ; %6 . a s s e m b l a g e d e s é l e m e n t s de l a d i a g o n a l e c=2∗c ; M=M+s p a r s e ( t ( : , 1 ) , t ( : , 1 ) , c , np , np)+ s p a r s e ( t ( : , 2 ) , t ( : , 2 ) , c , np , np)+ s p a r s e ( t ( : , 3 ) , t ( : , 3 ) , c , np , np ) . . . +s p a r s e ( t ( : , 4 ) , t ( : , 4 ) , c , np , np ) ; A.2 Assemblage de la matrice de rigidité 2 4 6 8 10 f u n c t i o n R=edp2drgd3D ( p , t , nu ) %EDP2DRGD3D Assemblage de l a m a t r i c e de r i g i d i t é 3D %−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− % Synopsis : % M=edp2drgd3D ( p , t , nu ) % Arguments : % p − c o o r d o n né e s d e s sommets , t a b l e a u np ∗3 % t − sommets d e s t é t r a è d r e s , t a b l e a u nt ∗4 % nu − s c a l a i r e ou v e c t e u r c o l o n n e de l o n g u e u r np ou nt %−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− np=s i z e ( p , 1 ) ; nt=s i z e ( t , 1 ) ; 12 14 %1 . t r a i t e m e n t du c o e f f i c i e n t nu [ m1 , m2 ]= s i z e ( nu ) ; i f ( m2>1 | ( m1>1 & m1˜=nt & m1˜=np ) ) 2006/2007 I 16 18 20 22 24 26 28 30 32 e r r o r ( ’ nu d o i t e t r e un v e c t e u r c o l o n n e de l o n g u e u r np ou nt ’ ) end i f ( m1==1 | m1==nt ) c=nu ; else c=(nu ( t ( : , 1 ) ) + nu ( t ( : , 2 ) ) + nu ( t ( : , 3 ) ) + nu ( t ( : , 4 ) ) ) / 4 ; end %2 . volume d e s t e t r a e d r e s x21=p ( t ( : , 2 ) , 1 ) − p ( t ( : , 1 ) , 1 ) ; y21=p ( t ( : , 2 ) , 2 ) − p ( t ( : , 1 ) , 2 ) ; z21=p ( t ( : , 2 ) , 3 ) − p ( t ( : , 1 ) , 3 ) ; x31=p ( t ( : , 3 ) , 1 ) − p ( t ( : , 1 ) , 1 ) ; y31=p ( t ( : , 3 ) , 2 ) − p ( t ( : , 1 ) , 2 ) ; z31=p ( t ( : , 3 ) , 3 ) − p ( t ( : , 1 ) , 3 ) ; x41=p ( t ( : , 4 ) , 1 ) − p ( t ( : , 1 ) , 1 ) ; y41=p ( t ( : , 4 ) , 2 ) − p ( t ( : , 4 ) , 2 ) ; z41=p ( t ( : , 4 ) , 3 ) − p ( t ( : , 1 ) , 3 ) ; tetr_vol =(x21 . ∗ ( y31 . ∗ z41−z31 . ∗ y41)+x31 . ∗ ( y41 . ∗ z21−z41 . ∗ y21)+x41 . ∗ ( y21 . ∗ z31−z21 . ∗ y31 ) ) / 6 . ; %t e t r v o l=d e t S a r r u s ( [ x21 x31 x41 ; y21 y31 y41 ; z21 z31 z41 ] ) / 6 . ; c=c . ∗ tetr_vol ; %3 . c a l c u l d e s g r a d i e n t s de f o n c t i o n s de b a s e [ GradPhi1 , GradPhi2 , GradPhi3 , GradPhi4 ] = GradPhi ( p , t ) ; 34 36 38 40 42 44 46 48 %4 . a s s e m b l a g e d e s é l e m e n t s sous −diagonaux R = s p a r s e ( np , np ) ; R = R + s p a r s e ( t ( : , 2 ) , t ( : , 1 ) , c . ∗ ( GradPhi2 ( : . . . + GradPhi2 ( : , 3 ) . ∗ GradPhi1 ( : , 3 ) ) , np , np ) ; R = R + s p a r s e ( t ( : , 3 ) , t ( : , 1 ) , c . ∗ ( GradPhi3 ( : . . . + GradPhi3 ( : , 3 ) . ∗ GradPhi1 ( : , 3 ) ) , np , np ) ; R = R + s p a r s e ( t ( : , 3 ) , t ( : , 2 ) , c . ∗ ( GradPhi3 ( : . . . + GradPhi3 ( : , 3 ) . ∗ GradPhi2 ( : , 3 ) ) , np , np ) ; R = R + s p a r s e ( t ( : , 4 ) , t ( : , 1 ) , c . ∗ ( GradPhi4 ( : . . . + GradPhi4 ( : , 3 ) . ∗ GradPhi1 ( : , 3 ) ) , np , np ) ; R = R + s p a r s e ( t ( : , 4 ) , t ( : , 2 ) , c . ∗ ( GradPhi4 ( : . . . + GradPhi4 ( : , 3 ) . ∗ GradPhi2 ( : , 3 ) ) , np , np ) ; R = R + s p a r s e ( t ( : , 4 ) , t ( : , 3 ) , c . ∗ ( GradPhi4 ( : . . . + GradPhi4 ( : , 3 ) . ∗ GradPhi3 ( : , 3 ) ) , np , np ) ; , 1 ) . ∗ GradPhi1 ( : , 1 ) + GradPhi2 ( : , 2 ) . ∗ GradPhi1 ( : , 2 ) . . . , 1 ) . ∗ GradPhi1 ( : , 1 ) + GradPhi3 ( : , 2 ) . ∗ GradPhi1 ( : , 2 ) . . . , 1 ) . ∗ GradPhi2 ( : , 1 ) + GradPhi3 ( : , 2 ) . ∗ GradPhi2 ( : , 2 ) . . . , 1 ) . ∗ GradPhi1 ( : , 1 ) + GradPhi4 ( : , 2 ) . ∗ GradPhi1 ( : , 2 ) . . . , 1 ) . ∗ GradPhi2 ( : , 1 ) + GradPhi4 ( : , 2 ) . ∗ GradPhi2 ( : , 2 ) . . . , 1 ) . ∗ GradPhi3 ( : , 1 ) + GradPhi4 ( : , 2 ) . ∗ GradPhi3 ( : , 2 ) . . . 50 52 54 56 58 60 62 %5 . t r a n s p o s i t i o n R = R+R . ’ ; %6 . a s s e m b l a g e d e s é l e m e n t s de l a d i a g o n a l e R = R + s p a r s e ( t ( : , 1 ) , t ( : , 1 ) , c . ∗ ( GradPhi1 ( : . . . + GradPhi1 ( : , 3 ) . ∗ GradPhi1 ( : , 3 ) ) , np , np ) ; R = R + s p a r s e ( t ( : , 2 ) , t ( : , 2 ) , c . ∗ ( GradPhi2 ( : . . . + GradPhi2 ( : , 3 ) . ∗ GradPhi2 ( : , 3 ) ) , np , np ) ; R = R + s p a r s e ( t ( : , 3 ) , t ( : , 3 ) , c . ∗ ( GradPhi3 ( : . . . + GradPhi3 ( : , 3 ) . ∗ GradPhi3 ( : , 3 ) ) , np , np ) ; R = R + s p a r s e ( t ( : , 4 ) , t ( : , 4 ) , c . ∗ ( GradPhi4 ( : . . . + GradPhi4 ( : , 3 ) . ∗ GradPhi4 ( : , 3 ) ) , np , np ) ; , 1 ) . ∗ GradPhi1 ( : , 1 ) + GradPhi1 ( : , 2 ) . ∗ GradPhi1 ( : , 2 ) . . . , 1 ) . ∗ GradPhi2 ( : , 1 ) + GradPhi2 ( : , 2 ) . ∗ GradPhi2 ( : , 2 ) . . . , 1 ) . ∗ GradPhi3 ( : , 1 ) + GradPhi3 ( : , 2 ) . ∗ GradPhi3 ( : , 2 ) . . . , 1 ) . ∗ GradPhi4 ( : , 1 ) + GradPhi4 ( : , 2 ) . ∗ GradPhi4 ( : , 2 ) . . . A.3 Assemblage du vecteur second membre 2 4 6 8 10 f u n c t i o n fh=edp2dsmb3D ( p , t , f ) %EDP2DSMB3D Assemblage du v e c t e u r s e c o n d membre %−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− % Synopsis : % M=edp2dsmb3D ( p , t , f ) % Arguments : % p − c o o r d o n né e s d e s sommets , t a b l e a u np ∗3 % t − sommets d e s t é t r a è d r e s , t a b l e a u nt ∗4 % f − v a l e u r de f aux sommets du m a i l l a g e , v e c t e u r np ∗1 ou nt ∗1 %−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− np=s i z e ( p , 1 ) ; nt=s i z e ( t , 1 ) ; 12 22 %1 . t r a i t e m e n t de f [ m1 , m2 ]= s i z e ( f ) ; i f ( m2>1 | ( m1>1 & m1˜=nt & m1˜=np ) ) e r r o r ( ’ f d o i t e t r e un v e c t e u r c o l o n n e de l o n g u e u r np ou nt ’ ) end i f ( m1==1 | m1==nt ) ff=f ; else ff=(f ( t ( : , 1 ) ) + f ( t ( : , 2 ) ) + f ( t ( : , 3 ) ) + f ( t ( : , 4 ) ) ) / 4 ; end 24 %2 . volume d e s t é t r a è d r e s 14 16 18 20 2006/2007 II 26 28 30 32 x21=p ( t ( : , 2 ) , 1 ) − p ( t ( : , 1 ) , 1 ) ; y21=p ( t ( : , 2 ) , 2 ) − p ( t ( : , 1 ) , 2 ) ; z21=p ( t ( : , 2 ) , 3 ) − p ( t ( : , 1 ) , 3 ) ; x31=p ( t ( : , 3 ) , 1 ) − p ( t ( : , 1 ) , 1 ) ; y31=p ( t ( : , 3 ) , 2 ) − p ( t ( : , 1 ) , 2 ) ; z31=p ( t ( : , 3 ) , 3 ) − p ( t ( : , 1 ) , 3 ) ; x41=p ( t ( : , 4 ) , 1 ) − p ( t ( : , 1 ) , 1 ) ; y41=p ( t ( : , 4 ) , 2 ) − p ( t ( : , 4 ) , 2 ) ; z41=p ( t ( : , 4 ) , 3 ) − p ( t ( : , 1 ) , 3 ) ; tetr_vol =(x21 . ∗ ( y31 . ∗ z41−z31 . ∗ y41)+x31 . ∗ ( y41 . ∗ z21−z41 . ∗ y21)+x41 . ∗ ( y21 . ∗ z31−z21 . ∗ y31 ) ) / 6 . ; %3 . a s s e m b l a g e ff=ff . ∗ tetr_vol / 4 ; fh= f u l l ( s p a r s e ( t ( : , 1 ) , 1 , ff , np ,1)+ s p a r s e ( t ( : , 2 ) , 1 , ff , np , 1 ) + . . . . . . s p a r s e ( t ( : , 3 ) , 1 , ff , np ,1)+ s p a r s e ( t ( : , 4 ) , 1 , ff , np , 1 ) ) ; A.4 Calcul des gradients de fonction de base 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 f u n c t i o n [ GradPhi1 , GradPhi2 , GradPhi3 , GradPhi4 ]= GradPhi ( p , t ) %GRADPHI C a l c u l d e s g r a d i e n t s d e s f o n c t i o n s de b a s e %−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− % Synopsis : % [ GradPhi1 , GradPhi2 , GradPhi3 , GradPhi4 ]= GradPhi ( p , t ) % Arguments : % p − c o o r d o n né e s d e s sommets , t a b l e a u np ∗3 % t − sommets d e s t é t r a è d r e s , t a b l e a u nt ∗4 % Retour : % GradPhii − v a l e u r du g r a d i e n t %−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− %1 . c a l c u l du d e t e r m i n a n t d e t =( p ( t ( : , 2 ) , 1 ) . ∗ p ( t ( : , 3 ) , 2 ) . ∗ p ( t ( : , 4 ) , 3 ) + p ( t ( : , 2 ) , 2 ) . ∗ p ( t ( : , 3 ) , 3 ) . ∗ p ( t ( : , 4 ) , 1 ) . . . ...+ p(t ( : , 2 ) , 3 ) . ∗ p(t ( : , 3 ) , 1 ) . ∗ p(t (: ,4) ,2)) − (p(t ( : , 2 ) , 3 ) . ∗ p(t ( : , 3 ) , 2 ) . ∗ p(t (: ,4) ,1) +... . . . p(t (: ,2) ,1).∗ p(t (: ,3) ,3).∗ p(t (: ,4) ,2) + p(t (: ,2) ,2).∗ p(t (: ,3) ,1).∗ p(t (: ,4) ,3))... ... −(( p(t (: ,1) ,1).∗ p(t (: ,3) ,2).∗ p(t (: ,4) ,3)+ p(t (: ,1) ,2).∗ p(t (: ,3) ,3).∗ p(t ( : , 4 ) , 1 ) . . . ...+ p(t ( : , 1 ) , 3 ) . ∗ p(t ( : , 3 ) , 1 ) . ∗ p(t (: ,4) ,2)) − (p(t ( : , 1 ) , 3 ) . ∗ p(t ( : , 3 ) , 2 ) . ∗ p(t ( : , 4 ) , 1 ) . . . ...+ p(t (: ,1) ,1).∗ p(t (: ,3) ,3).∗ p(t (: ,4) ,2) + p(t (: ,1) ,2).∗ p(t (: ,3) ,1).∗ p(t (: ,4) ,3)))... ...+(( p(t (: ,1) ,1).∗ p(t (: ,2) ,2).∗ p(t (: ,4) ,3)+ p(t (: ,1) ,2).∗ p(t (: ,2) ,3).∗ p(t ( : , 4 ) , 1 ) . . . ...+ p(t ( : , 1 ) , 3 ) . ∗ p(t ( : , 2 ) , 1 ) . ∗ p(t (: ,4) ,2)) − (p(t ( : , 1 ) , 3 ) . ∗ p(t ( : , 2 ) , 2 ) . ∗ p(t (: ,4) ,1) +... . . . p(t (: ,1) ,1).∗ p(t (: ,2) ,3).∗ p(t (: ,4) ,2) + p(t (: ,1) ,2).∗ p(t (: ,2) ,1).∗ p(t (: ,4) ,3)))... ... −(( p(t (: ,1) ,1).∗ p(t (: ,2) ,2).∗ p(t (: ,3) ,3)+ p(t (: ,1) ,2).∗ p(t (: ,2) ,3).∗ p(t ( : , 3 ) , 1 ) . . . ...+ p(t ( : , 1 ) , 3 ) . ∗ p(t ( : , 2 ) , 1 ) . ∗ p(t (: ,3) ,2)) − (p(t ( : , 1 ) , 3 ) . ∗ p(t ( : , 2 ) , 2 ) . ∗ p(t (: ,3) ,1) +... . . . p(t (: ,1) ,1).∗ p(t (: ,2) ,3).∗ p(t (: ,3) ,2) + p(t (: ,1) ,2).∗ p(t (: ,2) ,1).∗ p(t (: ,3) ,3))); %2 . c a l c u l B12 = −( + + B13 = +( + + B14 = −( + + B22 = +( + + B23 = −( + + B24 = +( + + B32 = −( + + B33 = +( + + B34 = −( + + B42 = +( + + B43 = −( + + B44 = +( + 2006/2007 des c o f a c t e u r s p(t (: ,2) ,2) .∗ p(t (: ,3) ,2) .∗ p(t (: ,4) ,2) .∗ p(t (: ,2) ,1) .∗ p(t (: ,3) ,1) .∗ p(t (: ,4) ,1) .∗ p(t (: ,2) ,1) .∗ p(t (: ,3) ,1) .∗ p(t (: ,4) ,1) .∗ p(t (: ,1) ,2) .∗ p(t (: ,3) ,2) .∗ p(t (: ,4) ,2) .∗ p(t (: ,1) ,1) .∗ p(t (: ,3) ,1) .∗ p(t (: ,4) ,1) .∗ p(t (: ,1) ,1) .∗ p(t (: ,3) ,1) .∗ p(t (: ,4) ,1) .∗ p(t (: ,1) ,2) .∗ p(t (: ,2) ,2) .∗ p(t (: ,4) ,2) .∗ p(t (: ,1) ,1) .∗ p(t (: ,2) ,1) .∗ p(t (: ,4) ,1) .∗ p(t (: ,1) ,1) .∗ p(t (: ,2) ,1) .∗ p(t (: ,4) ,1) .∗ p(t (: ,1) ,2) .∗ p(t (: ,2) ,2) .∗ p(t (: ,3) ,2) .∗ p(t (: ,1) ,1) .∗ p(t (: ,2) ,1) .∗ p(t (: ,3) ,1) .∗ p(t (: ,2) ,1) .∗ p(t (: ,3) ,1) .∗ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( p(t (: p(t (: p(t (: p(t (: p(t (: p(t (: p(t (: p(t (: p(t (: p(t (: p(t (: p(t (: p(t (: p(t (: p(t (: p(t (: p(t (: p(t (: p(t (: p(t (: p(t (: p(t (: p(t (: p(t (: p(t (: p(t (: p(t (: p(t (: p(t (: p(t (: p(t (: p(t (: p(t (: p(t (: p(t (: ,3) ,4) ,2) ,3) ,4) ,2) ,3) ,4) ,2) ,3) ,4) ,1) ,3) ,4) ,1) ,3) ,4) ,1) ,2) ,4) ,1) ,2) ,4) ,1) ,2) ,4) ,1) ,2) ,3) ,1) ,2) ,3) ,1) ,3) ,1) ,3) ,3) ,3) ,3) ,3) ,3) ,2) ,2) ,2) ,3) ,3) ,3) ,3) ,3) ,3) ,2) ,2) ,2) ,3) ,3) ,3) ,3) ,3) ,3) ,2) ,2) ,2) ,3) ,3) ,3) ,3) ,3) ,3) ,2) ,2) − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − p(t (: ,4) ,3))... p(t (: ,2) ,3))... p ( t ( : , 3 ) , 3 ) ) ) . / det ; p(t (: ,4) ,3))... p(t (: ,2) ,3))... p ( t ( : , 3 ) , 3 ) ) ) . / det ; p(t (: ,4) ,2))... p(t (: ,2) ,2))... p ( t ( : , 3 ) , 2 ) ) ) . / det ; p(t (: ,4) ,3))... p(t (: ,1) ,3))... p ( t ( : , 3 ) , 3 ) ) ) . / det ; p(t (: ,4) ,3))... p(t (: ,1) ,3))... p ( t ( : , 3 ) , 3 ) ) ) . / det ; p(t (: ,4) ,2))... p(t (: ,1) ,2))... p ( t ( : , 3 ) , 2 ) ) ) . / det ; p(t (: ,4) ,3))... p(t (: ,1) ,3))... p ( t ( : , 2 ) , 3 ) ) ) . / det ; p(t (: ,4) ,3))... p(t (: ,1) ,3))... p ( t ( : , 2 ) , 3 ) ) ) . / det ; p(t (: ,4) ,2))... p(t (: ,1) ,2))... p ( t ( : , 2 ) , 2 ) ) ) . / det ; p(t (: ,3) ,3))... p(t (: ,1) ,3))... p ( t ( : , 2 ) , 3 ) ) ) . / det ; p(t (: ,3) ,3))... p(t (: ,1) ,3))... p ( t ( : , 2 ) , 3 ) ) ) . / det ; p(t (: ,1) ,2))... p(t (: ,2) ,2))... III 63 65 67 69 + p ( t ( : , 1 ) , 1 ) . ∗ ( p ( t ( : , 2 ) , 2 ) − p ( t ( : , 3 ) , 2 ) ) ) . / det ; %3 . c a l c u l d e s g r a d i e n t s de f o n c t i o n s de b a s e GradPhi1 =[ B12 B13 B14 ] ; GradPhi2 =[ B22 B23 B24 ] ; GradPhi3 =[ B32 B33 B34 ] ; GradPhi4 =[ B42 B43 B44 ] ; A.5 Lecture du maillage 1 3 5 7 9 11 13 f u n c t i o n [ p , t , np , nt , icl ]= lecture ( maillage ) %LECTURE F o n c t i o n de l e c t u r e du m a i l l a g e %−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− % Synopsis : % [ p , t , np , nt , i c l ]= l e c t u r e ( m a i l l a g e ) % Arguments : % m a i l l a g e − f i c h i e r de m a i l l a g e % Retour : % p − c o o r d o n né e s d e s sommets , t a b l e a u np ∗3 % t − sommets d e s t é t r a è d r e s , t a b l e a u nt ∗4 % np − nombre de p o i n t s du m a i l l a g e % nt − nombre de t é t r a è d r e s du m a i l l a g e % icl − i n d i c e d e s p o i n t s s i t u é s au bord %−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 15 17 19 21 %1 . l e c t u r e du m a i l l a g e e t i n i t i a l i s a t i o n fid=f o p e n ( maillage , ’ r ’ ) ; np=f s c a n f ( fid , ’%d ’ , 1 ) ; nt=f s c a n f ( fid , ’%d\n ’ , 1 ) ; p=z e r o s ( np , 3 ) ; t=z e r o s ( nt , 4 ) ; k =1; 23 25 27 29 31 33 35 37 %2 . l e c t u r e d e s p o i n t s e t c a l c u l d e s p o i n t s du bord f o r i =1: np p ( i , : ) = s s c a n f ( f g e t l ( fid ) , ’%f ’ ) ’ ; i f ( p ( i ,1)==0 | | p ( i ,1)==1 | | p ( i ,2)==0 | | p ( i ,2)==1 | | p ( i ,3)==0 | | p ( i ,3)==1) icl ( k)=i ; k=k +1; end end %3 . l e c t u r e d e s t é t r a è d r e s f o r i =1: nt t ( i , : ) = s s c a n f ( f g e t l ( fid ) , ’%f ’ ) ’ ; end f c l o s e ( fid ) ; A.6 Calcul des données du problème 2 4 6 8 10 12 14 16 18 20 f u n c t i o n [ f , alpha , nu , usol , ucl ]= secmb ( p , icl ) %SECMB c a l c u l d e s données du problème %−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− % Synopsis : % [ f , alpha , nu , u s o l , u c l ]= secmb ( p , i c l ) % Arguments : % p − c o o r d o n né e s d e s sommets , t a b l e a u np ∗3 % icl − i n d i c e d e s p o i n t s s i t u é s au bord % Retour : % f − v a l e u r de f aux sommets du m a i l l a g e , v e c t e u r np ∗1 ou nt ∗1 % alpha − s c a l a i r e ou v e c t e u r c o l o n n e de l o n g u e u r np ou nt % nu − s c a l a i r e ou v e c t e u r c o l o n n e de l o n g u e u r np ou nt % usol − vecteur solution % ucl −v a l e u r d e s c o n d i t i o n s aux l i m i t e s %−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− f=−2∗exp ( p ( : , 1 ) + p ( : , 2 ) + p ( : , 3 ) ) ; usol=exp ( p ( : , 1 ) + p ( : , 2 ) + p ( : , 3 ) ) ; alpha=ones ( s i z e ( p , 1 ) , 1 ) ; nu=ones ( s i z e ( p , 1 ) , 1 ) ; ucl=usol ( icl ) ; A.7 Résolution 2006/2007 IV 2 4 6 8 10 12 f u n c t i o n [ err ]= resolve ( maillage ) %RESOLVE r é s o l u t i o n du problème %−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− % Synopsis : % [ e r r ]= r e s o l v e ( m a i l l a g e ) % Arguments : % m a i l l a g e − f i c h i e r de m a i l l a g e % Retour : % erreur − v a l e u r de l ’ e r r e u r en e s p a c e %−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− %1 . l e c t u r e du m a i l l a g e t i c , [ p , t , np , nt , icl ]= lecture ( maillage ) ; , t o c 14 16 18 %2 . c a l c u l d e s m a t r i c e s [ f , alpha , nu , usol , ucl ]= secmb ( p , icl ) ; M=edp2dmss3D ( p , t , alpha ) ; R=edp2drgd3D ( p , t , nu ) ; b=edp2dsmb3D ( p , t , f ) ; 20 22 24 26 28 %3 . r é s o l u t i o n d u problème A=(M+R ) ; penalty =10ˆ15; A ( icl , icl)=A ( icl , icl)+ penalty ∗ s p e y e ( l e n g t h ( icl ) ) ; b ( icl)= penalty ∗ ucl ; u=A \ b ; %3 . c a l c u l de l ’ e r r e u r en e s p a c e err=s q r t ( sum ( ( usol−u ) . ˆ 2 ) ) ; B. Générateur de maillage 3D B.1 Le principe Afin de vérifier nos calculs, nous avons eu besoin de générer des maillages de l’espace. Pour cela, nous avons développé une petite application C générant des maillages. Le principe est simple. Partant d’un cube dans l’espace, nous pouvons diviser celui ci en plusieurs petits cubes. Chacun de ces cubes est alors divisé en 6 tétraèdres comme cela est représenté sur la figure A.1. Nous obtenons ainsi un maillage de l’espace. Fig. A.1 – Les 6 tétraèdres contenus dans un cube 2006/2007 V B.2 Le code 1 3 5 #include <stdio . h> #include <stdlib . h> int num ( int nb , int i , int j , int k ) { r e t u r n 1+ i + j ∗ nb + k ∗ nb ∗ nb ; } 7 9 11 13 int main ( int argc , char ∗ argv [ ] ) { int i , j , k ; FILE ∗ fid ; float pas ; int nb , imax , imin ; char nomfich [ 1 6 ] ; 15 17 19 21 23 25 27 29 31 33 35 37 i f ( argc <2) { printf ( ” Use : mailleur radical imin imax \ n ” ) ; printf ( ” Default : ∗ imin = 2\ n ” ) ; printf ( ” ∗ imax = 9\ n ” ) ; printf ( ” Out \” radicali . msh \” i = imin . . imax ” ) ; return 0; } e l s e i f ( argc <3) { imin =2; imax =9; } e l s e i f ( argc <4) { s s c a n f ( argv [ 2 ] , ”%d” ,& imin ) ; imax =9; } else { s s c a n f ( argv [ 2 ] , ”%d” ,& imin ) ; s s c a n f ( argv [ 3 ] , ”%d” ,& imax ) ; } 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 f o r ( nb=imin ; nb<imax +1; nb++) { s p r i n t f ( nomfich , ”%s%d . msh ” , a r g v [ 1 ] , nb ) ; printf ( ”%s \n ” , nomfich ) ; fid=f o p e n ( nomfich , ” w ” ) ; pas = 1 . 0 / ( ( float ) nb − 1 . ) ; f p r i n t f ( fid , ”%d %d\n ” , nb∗nb∗nb , 6 ∗ ( nb −1)∗( nb −1)∗( nb − 1 ) ) ; f o r ( i =0; i<nb ; i++) { f o r ( j =0; j<nb ; j++) { f o r ( k =0; k<nb ; k++) { f p r i n t f ( fid , ”%f %f %f \n ” , k∗ pas , j ∗ pas , i ∗ pas ) ; } } } f o r ( i =0; i<nb −1; i++) { f o r ( j =0; j<nb −1; j++) { f o r ( k =0; k<nb −1; k++) { f p r i n t f ( fid , ”%d %d %d %d\n ” ,num( nb , i , j , k ) , num( nb , i +1 , j , k ) , num ( nb , i +1 , j +1 , k ) , num ( nb , i +1 , j +1 , k + 1 ) ) ; f p r i n t f ( fid , ”%d %d %d %d\n ” ,num( nb , i , j , k ) , num( nb , i +1 , j +1 ,k ) , num ( nb , i , j +1 , k ) , num ( nb , i +1 , j +1 , k + 1 ) ) ; f p r i n t f ( fid , ”%d %d %d %d\n ” ,num( nb , i , j , k ) , num( nb , i +1 , j +1 ,k ) , num ( nb , i +1 , j +1 , k +1) , num ( nb , i +1 ,j , k + 1 ) ) ; f p r i n t f ( fid , ”%d %d %d %d\n ” ,num( nb , i , j , k ) , num( nb , i , j , k +1) , num ( nb , i +1 ,j , k +1) , num ( nb , i +1 , j +1 , k + 1 ) ) ; f p r i n t f ( fid , ”%d %d %d %d\n ” ,num( nb , i , j , k ) , num( nb , i , j +1 ,k ) , 2006/2007 VI num ( nb , i , j +1 , k +1) , num ( nb , i +1 , j +1 , k + 1 ) ) ; f p r i n t f ( fid , ”%d %d %d %d\n ” ,num( nb , i , j , k ) , num( nb , i , j , k +1) , num ( nb , i +1 , j +1 , k +1) , num ( nb , i , j +1 , k + 1 ) ) ; 73 75 } } 77 } 79 f c l o s e ( fid ) ; printf ( ” cree \ n ” ) ; 81 } return 0; 83 } 2006/2007 VII