01.05.2013 Views

C++ et éléments finis Note de cours de DEA (version provisoire)

C++ et éléments finis Note de cours de DEA (version provisoire)

C++ et éléments finis Note de cours de DEA (version provisoire)

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

22 CHAPITRE 4. MÉTHODES D’ÉLÉMENTS FINIS P1<br />

2. Le produit y matrice A par un vecteur x est dans ce cas s’écrit mathématiquement:<br />

<br />

yi = K∈Th<br />

K ∇wi |K∇w j |Kxj si i n’est pas sur le bord<br />

0 si i est sur le bord<br />

Pour finir, on initialiserons le gradient conjugué par:<br />

<br />

ui =<br />

0<br />

g(qi)<br />

si i n’est pas sur le bord<br />

si i est sur le bord<br />

Les sources <strong>et</strong> un maillage sont accessibles sur la toile à l’adresse suivante: FTP:sfemGC.tar.gz (<strong>version</strong> tar<br />

compressée). Pour décompresser sous Unix, dans une fenêtre shell entré:<br />

tar zxvf sfemGC.tar.gz<br />

4.2 Les classes <strong>de</strong> base pour les <strong>éléments</strong> <strong>finis</strong><br />

Nous allons définir les outils informatiques en <strong>C++</strong> pour programmer l’algorithme 2, pour cela il nous faut<br />

modéliser IR 2 , le maillage formé <strong>de</strong> triangles qui sont dé<strong>finis</strong> par leurs trois somm<strong>et</strong>s. Mais attention, les<br />

fonctions <strong>de</strong> bases sont associées au somm<strong>et</strong> <strong>et</strong> donc il faut numéroter les somm<strong>et</strong>s. La question classique<br />

est donc <strong>de</strong> définir un triangle soit comme trois numéro <strong>de</strong> somm<strong>et</strong>s, ou soit comme trois pointeurs sur <strong>de</strong>s<br />

somm<strong>et</strong>s (nous ne pouvons pas définir un triangle comme trois références sur <strong>de</strong>s somm<strong>et</strong>s car il est impossible<br />

initialiser <strong>de</strong>s références par défaut). Les <strong>de</strong>ux sont possibles, mais les pointeurs sont plus efficaces pour faire<br />

<strong>de</strong>s calculs, d’où le choix <strong>de</strong> trois pointeurs pour définir un triangle. Maintenant les somm<strong>et</strong>s seront stockés<br />

dans un tableau donc il est inutile <strong>de</strong> stocker le numéro du somm<strong>et</strong> dans la classe qui définit un somm<strong>et</strong>,<br />

nous ferons une différence <strong>de</strong> pointeur pour trouver le numéro d’un somm<strong>et</strong>, ou du triangle<br />

Donc un maillage (classe <strong>de</strong> type Mesh) contiendra donc un tableau <strong>de</strong> triangles (classe <strong>de</strong> type Triangle)<br />

<strong>et</strong> un tableau <strong>de</strong> somm<strong>et</strong>s (classe <strong>de</strong> type Vertex), bien le nombre <strong>de</strong> triangles (nt) , le nombre <strong>de</strong> somm<strong>et</strong>s<br />

(nv), <strong>de</strong> plus il me paraît naturel <strong>de</strong> voir un maillage comme un tableau <strong>de</strong> triangles <strong>et</strong> un triangle comme<br />

un tableau <strong>de</strong> 3 somm<strong>et</strong>s.<br />

4.2.1 La classe Label (numéros logiques)<br />

Nous avons vu que le moyen le plus simple <strong>de</strong> distinguer (pour les conditions aux limites) les somm<strong>et</strong>s appartenant<br />

à une frontière était <strong>de</strong> leur attribuer un numéro logique ou étiqu<strong>et</strong>te (label en anglais). Rappelons<br />

que dans le format FreeFem++ les somm<strong>et</strong>s intérieurs sont i<strong>de</strong>ntifiés par un numéro logique nul.<br />

De manière similaire, les numéros logiques <strong>de</strong>s triangles nous perm<strong>et</strong>tront <strong>de</strong> séparer <strong>de</strong>s sous-domaines Ωi,<br />

correspondant, par exemple, à <strong>de</strong>s types <strong>de</strong> matériaux avec <strong>de</strong>s propriétés physiques différentes.<br />

La classe Label va contenir une seule donnée (lab), <strong>de</strong> type entier, qui sera le numéro logique.<br />

Listing 3 (sfem.hpp - la classe Label)<br />

class Label {<br />

friend ostream& operator > r.lab ; r<strong>et</strong>urn f ; }<br />

public:<br />

int lab ;<br />

Label(int r=0):lab(r){}<br />

int onGamma() const { r<strong>et</strong>urn lab ;}<br />

} ;<br />

C<strong>et</strong>te classe n’est pas utilisée directement, mais elle servira dans la construction <strong>de</strong>s classes pour les somm<strong>et</strong>s<br />

<strong>et</strong> les triangles. Il est juste possible <strong>de</strong> lire, écrire une étiqu<strong>et</strong>te, <strong>et</strong> tester si elle est nulle (pas <strong>de</strong> conditions<br />

aux limites).

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!