Thème 5 : résolution numérique des équations aux dérivées partielles (EDP)
1 Résolution numérique de l’équation de Laplace à 2D
1.1 Formulation du problème
On cherche à calculer numériquement le champ de températureT(x, y) à l’intérieur d’un domaine rectangulaire de côtés ∆x et ∆y (voir figure 1). Ce champ vérifie l’équation de Laplace :
∆T = ∂2T
∂x2 +∂2T
∂y2 = 0 (1)
Les parois sont maintenues à des températures imposées (CL).
x
y
0 .'.'. j .'.'.'.'.'. nc+1
0
i
.'.'..'.'.'.'.'.
nl'+1
(i,nc+1) (0,j')
(i',j')
Figure 1 – Maillage du domaine : un point de la grille est repéré par un couple (i, j) où i re- présente le numéro de ligne etjle numéro de co- lonne. L’intérieur du domaine est numéroté de i= 1 à nl et dej = 1 ànc.
x 1
j
1g nc
i
2
k=(i'–1)nc+j
2nc
nl×'nc nc+1
y 1h
1b
2d
gauche
haut
bas
droite
Figure 2 – Renumérotation des points inté- rieurs ligne par ligne de gauche à droite, puis de haut en bas.
Le maillage choisi est une grille de pas dx=dy =p comme représentée sur la figure 1. Chaque point est repéré par un couple d’indices (i, j) où le premier indice note le numéro de la ligne et le second celui de la colonne où se trouve le point sur la grille. On noteTi,j la température en ce point, de coordonnées xi =i×p, yj = j×p. Les inconnues du problème sont les n = nl×nc valeurs de Ti,j où 1 6i6 nl,16 j 6nc qui seront déduites des valeurs deTi,j aux bords : nord (i= 0), sud (i=nl+ 1), ouest (j= 0) ou est (j=nc+ 1).
L’équation de Laplace discrétisée se traduit par un système linéaire de n équations reliant la température au point (i, j) à celles des 4 points voisins :
Ti+1,j+Ti−1,j+Ti,j+1+Ti,j−1−4Ti,j = 0 (2)
où 2nl+ 2nctempératures sont connues (celles sur les points aux bords indiqués par des croix sur la figure 1) et n=nl×ncsont à déterminer.
1.2 Renumérotation de la grille
N.-B. : Dans ce paragraphe, les indices sont les indices mathématiques commençant à 1. En langage C, penser à tenir compte du décalage d’une unité.
On représente le champ de température à calculer par un tableau 1DZàn=nl×nccomposantes en renumérotant les points de la grille à l’intérieur du rectangle par un seul indice k en suivant les lignes (voir figure 2) :
Zk =Ti,j pour k= (i−1)nc+j 16i6nl,16j6nc (3) Pour un point sans contact avec la paroi (1< i < nl,1< j < nc), l’équation (2) s’écrit :
Zk−nc+Zk−1−4Zk+Zk+1+Zk+nc = 0 (4) Dès qu’il y a contact avec la paroi, l’opérateur Laplacien discrétisé fait intervenir une (ou au plus deux, dans les coins) température imposée, qui va constituer le second membre du système.
A Z=B (5)
où Aest une matrice n×nconstituée denl×nl blocs de dimensionnc×nc, du type :
−4 1 0 0 1 0 0 0 0 0 0 0
1 −4 1 0 0 1 0 0 0 0 0 0
0 1 −4 1 0 0 1 0 0 0 0 0
0 0 1 −4 0 0 0 1 0 0 0 0
1 0 0 0 −4 1 0 0 1 0 0 0
0 1 0 0 1 −4 1 0 0 1 0 0
0 0 1 0 0 1 −4 1 0 0 1 0
0 0 0 1 0 0 1 −4 0 0 0 1
0 0 0 0 1 0 0 0 −4 1 0 0
0 0 0 0 0 1 0 0 1 −4 1 0
0 0 0 0 0 0 1 0 0 1 −4 1
0 0 0 0 0 0 0 1 0 0 1 −4
←−−−−−nc−−−−−→ ←−−−−−nc−−−−−→ ←−−−−−nc−−−−−→
x
y
nlblocs de taille nc×nc ici nl= 3 etnc= 4
(6)
etB est un vecteur àncomposantes, dont au plus 2(nl+nc) non nulles, qui se calcule en sommant les contributions des températures aux bords (voir représentation vectorielle dans le cours p. 24) :
Bk=(i−1)nc+j =−(δi,1Ti−1,j+δi,nlTi+1,j+δj,1Ti,j−1+δj,ncTi,j+1) (7) 1.3 Travail à effectuer
Créer un répertoirete5, puis deux sous répertoires dete5nomméslaplaceetdiffusion. Copier vers votre répertoire laplace le contenu du sous-répertoire laplace correspondant à votre langage de travail et situé sous /home/lefrere/M1/2012-2013/etu/mncs/te/te5/.
En fortran, en vue de l’utilisation de lapack, chaque procédure devra comporter l’instruction use la_precision pour définir la variante (kind) de type réel (wp) choisie pour tout le projet.
La mise au point du code se fera avec nl=3 et nc=4 pour rendre plus aisée la vérification de la bonne construction de AetB.
1.3.1 Programme principal : fichier resol.c ou resol.f90
Le programme principal devra lire les dimensions du domaine : nl, nc, calculer n=nl×nc puis allouer (dynamiquement en fortran et en tableaux 1D automatiques, avec aplatissement des matrices, en C99) :
– un tableau de réelsmat_a de dimensionn×noù sera stockée la matriceA.
– deux tableaux 1D de réels de dimension nl : ouest et est et deux tableaux 1D de réels de dimensionnc :nord etsudpour stocker les conditions aux limites ;
– un tableau 1D de réels de dimensionn :Z où sera stocké le second membre B, puis le champ des températures solution.
En fortran, on désallouera ces tableaux à la fin du programme principal.
1.3.2 Construction de la matrice A fichier laplace_mat.c ou laplace_mat.f90
La procédure laplace_mat remplira la matrice A pour une grillenl ×nc. On notera que cette ⇐1 matrice est tridiagonale par blocs : il sera donc plus judicieux de construire ces blocs élémentaires puis de les copier dans le tableau final (en utilisant la procédure matputblockfournie dansmatutilcm.c en C). Cette procédure devra respecter les interfaces suivantes :
subroutine laplace_mat(nl, nc, mat)
integer, intent(in) :: nl, nc ! taille du domaine
real(kind=wp), dimension(:,:), intent(out) :: mat ! matrice de laplace En C99 sous forme de tableau 2D (déconseillé) :
void laplace_mat(int nl, int nc, float mat[nl*nc][nl*nc]);
ou sous forme de matrice « aplatie » (nécessaire à l’utilisation dematputblock) : void laplace_mat(int nl, int nc, float mat[nl*nc*nl*nc]);
Appeler cette procédure depuis le programme principal et vérifier que cette matrice a bien été correctement construite en l’affichant, pour plusieurs valeurs (faibles) de nlet nc— notamment en échangeant les dimensions. (En C, on pourra utiliser la procédure affmatfournie dansmatutilcm.) 1.3.3 Conditions aux limites : fichiers cond_limites.f90 ou cond_limites.c
Les conditions aux limites sont spécifiées sur les parois par quatre tableaux 1Douest etestde dimension nl et nord et sud de dimension nc qui seront calculés par la procédure cond_limites.
Elle respectera les interfaces suivantes :
subroutine cond_limites(nord, sud, ouest, est)
real(kind=wp), dimension(:), intent(out) :: nord, sud, ouest, est void cond_limites(int nl, int nc, float nord[nc], float sud[nc],
float ouest[nl], float est[nl]);
Dans un premier temps, on suppose que chacune des parois est à une température uniforme (tn, ts,tw ette) que l’on doit donc saisir dans cette procédure.
Dans un second temps, on envisagera des gradients de température constants sur chaque paroi.
On saisira alors les deux températures extrêmes de chaque paroitnwettswpar exemple pour le bord ouest (nord, puis sud) et ainsi de suite. Il suffira alors de saisir des extrêmes identiques pour obtenir
1.3.4 Construction du second membre : second_membre.f90 ou second_membre.c
Écrire une procéduresecond_membrequi utilise les quatre tableaux 1D des températures sur les parois pour calculer le vecteur B à ncomposantes du second membre. Rajouter dans le programme principal l’appel à cette procédure et tester en affichant le système . ⇐2 subroutine second_membre(second_mb, nord, sud, ouest, est)
real(kind=wp), dimension(:), intent(out) :: second_mb
real(kind=wp), dimension(:), intent(in) :: nord, sud, ouest, est void second_membre(int nl, int nc, float second_mb[nl*nc],
float nord[nc], float sud[nc], float ouest[nl], float est[nl]);
1.3.5 Résolution du système avec gesv de lapack
Compléter le programme principal pour résoudre le système linéaire (5). On commencera par une méthode générale qui ne prend pas en compte les propriétés de la matrice A. On utilisera la procédure gesv de la bibliothèque lapack. Elle travaille « en place » en ce sens qu’elle remplace le vecteur second membre par le vecteur solution.
1.3.6 Écriture du tableau des Ti,j dans un fichier
Ajouter enfin l’appel à la procédure donnéeecritempqui écrit le champ complet des températures temp(intérieur et bords) dans un fichierlaplace.datsous la forme d’un tableau 2D (nl+2)×(nc+2).
La procédure d’écriture du champ de température suit les interfaces suivantes : subroutine ecritemp(Z, nl, nc, nord, sud, ouest, est, filename)
real(kind=wp), intent(in), dimension(:) :: Z ! tableau 1D des temperatures real(kind=wp), intent(in), dimension(:) :: nord, sud, ouest, est
integer, intent(in) :: nl,nc ! taille du domaine character(len=*) , intent(in) :: filename
void ecritemp(int nl, int nc, float Z[nl*nc],
float nord[nc], float sud[nc], float ouest[nl], float est[nl], char* filename);
1.3.7 Visualisation sous scilab
Visualiser les isothermes et la surface T(x, y) sous scilab à l’aide du fichier de commandes plot-laplace.scefourni. On pourra modifier le nombre d’isothermes via le paramètrenzdecontour2d et ajuster l’angle de vue de la surface suivant les choix de valeurs initiales.
1.3.8 Amélioration de la résolution
Reprendre le calcul et la visualisation avecnl=18 etnc=24 de façon obtenir des isothermes plus régulières. Sauvegarder le graphique 2D des isothermes dans le fichier laplace-18x24.pdf. Que se ⇐3 passe-t-il si on choisit deux fois plus de points dans chaque direction ? Expliquer. On pourra évaluer grossièrement le temps de calcul avec la commande unix time quitte à supprimer temporairement l’écriture sur fichier dans ce cas.
1.4 Résolution du système avec l’aide d’une procédure spécialisée de la biblio- thèque lapack : pbsv
Il est beaucoup plus efficace de profiter des particularités de la matrice (symétrique, bande par exemple) en appelant des procédures optimisées pour de telles matrices. On choisit ici la procédure pbsv afin d’exploiter toutes les propriétés de la matrice −A, c’est-à-dire symétrique, définie positive et matrice bande. Pour résoudre l’équation initiale, on changera donc aussi le signe du vecteur B.
Pour économiser la place mémoire et ne traiter que les éléments non nuls, les propriétés particulières de ces matrices sont exploitées pour stocker le minimum de termes :
– pour les matrices symétriques on ne stocke que la partie triangulaire inférieure ;
– pour les matrices symétriques bandes, on ne stocke que les diagonales et sous-diagonales non nulles sous forme d’une matrice obtenue en « tournant » de 45 degrés les diagonales non nulles.
On obtient ainsi une matrice avec un nombre de lignes égal au nombre de diagonales conservées et le même nombre de colonnes que la matrice initiale. Comme les sous-diagonales sont de plus en plus courtes lorsqu’on s’éloigne de la diagonale principale, certains éléments de la matrice compactée sont indéterminés. On les place ici en fin de ligne.
La matrice A est une matrice bande dont les éléments non-nuls sont au plus éloignés de nc de la diagonale principale : c’est une matrice avec 2nc+ 1 bandes. En tant que matrice symétrique, sa forme compactée AC est donc une matrice nc+ 1 lignes et nl×nc colonnes1.
En fortran, il est facile de reconstruire la matriceAC compactée directement. De plus, le vecteur B doit être recopié dans une matrice de profil (n, 1). Selon l’ordre choisi pour les lignes, on devra préciser le paramètre uplo adapté.
En C99, on construiraAC sous la forme d’un tableau 2D qu’on « aplatira » ensuite à l’aide de la procédure fournie.
Après avoir visualisé les résultats à haute résolution sous scilab (isothermes en 2D dans le fichier laplace-lapack.pdf, on comparera les temps de calcul entre les deux méthodes. ⇐4
?
?
?
?
?
?
? ? ?
? s1
d1
l1
p dn ln−1
sn−p
d2 d3
0 0
0
0 0 0 0 0 0 0 0 0
0 0
0 0
0 0
0 0
0 0 0
0 0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0 0 0 0 0
0 d1
l1
sn−p
d2
dn
l1
ln−1
s1
n
sn−p
forme compactée
ln−1
n
s1
d3
?
Figure3 – Stockage des matrices symétriques bande : cas où on stocke diagonale et partie inférieure. Si une matrice carrée n×ncomporte au pluspsous-diagonales (et autant de sur-diagonales) non nulles, on peut la représenter en ne stockant que la diagonale et, par exemple, lespsous-diagonales dans une matricep+ 1 lignes et ncolonnes. Pour ce faire, on effectue une rotation de +45 degrés des diagonales. Au fur et à mesure qu’on s’éloigne de la diagonale principale, les sous-diagonales raccourcissent donc il reste des éléments indéterminés (représentés par des?) en fin de ligne dans la matrice compactée.
2 Résolution numérique de l’équation de diffusion 1D
2.1 Rappels introductifs
On cherche à obtenir numériquement la fonctionu(x, t) pourt∈n[0, T], sur l’intervallex∈[0, L], solution de l’équation de diffusion à 1D avec des conditions initiales (CI) et aux limites (CL) :
∂u
∂t =D∂2u
∂x2 avec
((CI) ∀x, u(x,0) =u0(x)
(CL) ∀t, u(0, t) =ug(t) et u(L, t) =ud(t) (8) Le coefficient de diffusionD, nécessairement positif, est supposé constant pour simplifier.
L’intervalle [0, L] est divisé ennx+ 1 pas de largeur δx=L/(nx+ 1), et celui de temps en nt+ 1 pas de durée δt. On note unj, la valeur numérique de u(x, t) au point x =jδx et au tempst=nδt.
On définit le paramètre caractéristique :
α= D δt
(δx)2 (9)
– Les conditions aux limites fixent donc lesun0 et les unnx+1 pour toutn; – La condition initiale donneu0j pour 06j6nx+ 1.
La méthode de résolution est itérative en temps : à chaque pas d’intégration, on doit calculer les nx valeurs aux points intérieurs du domaine en prenant en compte les conditions aux limites.
2.2 Partie commune
2.2.1 Méthodes et notations On définit :
– le vecteur de taillenx desunj pour j∈[1, nx], Un= (un1, un2. . . unnx) ;
– le vecteur de taille nx déduits des conditions aux limites Vn = (ung,0. . . ,0, und), supposé ici constant pour simplifier ;
– la matrice, de taillenx×nx,M(α) =11−αL1D, où11 est l’identité etL1D la matrice tridiagonale définie au TE4, qui représente la dérivée seconde en différences finies.
Les différents algorithmes vus en cours s’écrivent : Explicite :Un+1=M(−α)·Un+αVn;
Implicite :Un+1 =M(α)−1·[Un+αVn] ;
Crank–Nicholson :Un+1 =M(α2)−1·M(−α2)·Un+α2 Vn+Vn+1. On rappelle que l’algorithme explicite n’est stable que pourα61/2.
On notera que pour α1 , M(−α)≈M(α)−1, mais que pourα petit mais fini, la matrice M(α)−1 contient des termes non-diagonaux qui décroissent comme α|i−j| lorsqu’on s’éloigne de la diagonale.
2.2.2 Organisation des codes
On souhaite écrire un code modulaire permettant de changer aisément d’algorithme, de l’explicite, plus simple, à celui de Crank-Nicholson, le plus précis. On écrira donc des modules distincts :
– matrice pour la construction des diverses matrices nécessaires (M(α), . . .11) ;
– matop pour les opérations matricielles (produit matrice-vecteur, matrice-matrice et inversion de matrice) ;
– methodespour les trois procédures d’avancement d’un pas en temps.
Ces modules, dont les interfaces sont fournies, seront complétés au fur et à mesure des besoins.
On notera :
– Que la matrice à inverser dans les deux derniers schémas est constante, et ne nécessite donc qu’une seule inversion. Il n’est donc pas indispensable de recourir à une méthode spécifique aux matrices bandes, et on se contentera d’appelerlapacke_dgesven C et LA_GESVen Fortran.
– Que la matrice utilisée par la méthode explicite est tridiagonale : son action devra être codée
«à la main» pour éviter de faire intervenir tous les éléments nuls.
– Au contraire, les produits matrice-matrice et/ou matrice-vecteur utilisés dans les méthodes implicite et Crank-Nicholson, impliquent des matrices denses, et devront être réalisés à l’aide de Blas :cblas_dgemmetcblas_dgemven C, et LA_GEMMet LA_GEMVen Fortran.
2.2.3 Spécifications du problème et choix des paramètres Pour les tests, on choisira par défaut les valeurs suivantes :
– L= 120 et une discrétisation fixe en espace avecδx= 1, donc nx=119.
– D= 1 : choisir le pas en tempsδtéquivaut donc à choisirα.
– des CL constantes ug(t) =ud(t) = 1 ∀t – Et comme CI :
u0(x) = 1 + sin π x
L
+ 0.2 sin 5π x
L
(10) 2.3 Travail à effectuer
2.3.1 Algorithme explicite
Fichiers fournis Créer un répertoire te5/diffusion/explicite/. Y copier depuis le compte de l’UE, les fichiers du répertoirete5/diffusion/explicite/ correspondant à votre langage :
– un fichiermakefile;
– un embryon des modulesmatricesetmethodesspécifiant les interfaces ;
– le modulematopdéfinissant quelques opérations fondées sur Blas et Lapack, à compléter ; – un fichierplot-diff.sce pour visualiser les résultats sousscilab4.
Programme principal diff_expl chargé de :
– Lire les paramètresdx etdt, ainsi que nx etnt, et afficher la valeur de α.
– Lire les conditions aux limitesu_droiteetu_gauche.
– Allouer les vecteursunew,uold de taillenx et les matrices nécessaires2; – Initialiseruold avec les conditions initiales (10).
– Effectuer la boucle sur les temps qui à chaque pas :
1. appelle avance_exppour calculer unew en fonction de uold; 2. recopie unewdans uold;
3. écrit3 les valeurs obtenues dans le fichier explicite.dat (et par la suiteimplicite.datpuis cranknich.dat).
Algorithme Écrire la procédure avance_explimplémentant l’algorithme explicite.
2. En Fortran, on utilisera l’allocation dynamique de tableaux 1D et 2D. En C, on utilisera au choix l’allocation dynamique ou des tableaux automatiques,exclusivement 1Dpuisque les matrices doivent être aplaties.
3. Pour ne pas avoir à stocker les données sous forme 2D, on choisit ici d’écrire les résultats desunj au fur et à
Tests
– Tester le programme avec, pour commencernt=1000,dt=0.1,u_gauche=1.,u_droite=1.
– Visualiser le résultat sous scilab figureexplicit.pdf. Puis augmenternt. ⇐5 – Augmenter enfin la valeur dedt et observer ; commenter ce qui se passe siα >0.5 . ⇐6 2.3.2 Algorithme implicite
Codes
– Recopier le contenu de votre sous-répertoirediffusion/explicite/vers un répertoireimplicite/, et renommer le programme principal endiff_impl.
– Le modifier pour déclarer et calculer les matricesmalphaetinvmalphaà l’aide des procédures de matriceset de matop.
– Implémenter dansmethodesla procédureavance_implqui calcule unew.
Tests
– Tester l’implémentation réalisée avecnt=1000,dt=0.1.
– Visualiser le résultat sous scilab figureimplicit.pdf. Puis augmenternt ⇐7 – Augmenter la valeur dedt et expliquer ce qui passe pour par exemple α= 1 . ⇐8 – Étudier le cas d’une condition initiale en forme de marche avec des conditions aux limites
constantes −1 et +1.
2.3.3 Algorithme de Crank–Nicholson Codes
– Recopier le contenu de votre sous-répertoirediffusion/explicite/vers un répertoirecranknich/, et renommer le programme principal endiff_cranknich.
– Le modifier pour déclarer et calculer les matrices nécessaires à l’aide des procédures dematrices et de matop.
– Implémenter dansmethodesla procédureavance_cranknich qui calculeunew(on utilisera un tableau 1D local pour stocker les vecteurs résultats intermédiaires).
Tests
– Tester l’implémentation réalisée avecnt=1000,dt=0.1.
– Visualiser le résultat sous scilab figurecranknich.pdf. ⇐9
– Augmenter la valeur dedt pour tester le cas α >1 :
– Comparer avec les résultats de l’algorithme implicite. . ⇐10
j∆x (j−1)∆x (j+ 1)∆x 0
un+1j t
(n+ 1)∆t n∆t
x unj
(nx+ 1)∆x j∆x
(j−1)∆x (j+ 1)∆x
0 (nx+ 1)∆x
un+1j t
(n+ 1)∆t n∆t
x unj
j∆x (j−1)∆x (j+ 1)∆x
0 (nx+ 1)∆x
un+1j t
(n+ 1)∆t n∆t
x unj
Figure 4 – Schémas différentiels des algorithmes explicite, implicite et de Crank–Nicholson (de gauche à droite)