On considère un problème de conduction thermique à deux dimensions en coordonnées cartésiennes. En régime stationnaire, la température T(x,y) vérifie l'équation de Poisson :
où est la densité volumique de puissance générée localement et λ la conductivité thermique.
Ce document présente des exemples de résolution numérique de cette équation. La méthode est expliquée dans Équation de Poisson à deux dimensions.
Pour le module Python utilisé voir : Équation de Poisson : module python.
On considère deux plaques parallèles dont la température est fixée. La conduction se fait dans deux tranches de conductivités thermiques différentes. Sur les bords, on applique une condition limite de type Neumann, avec un flux thermique nul.
Figure pleine pagefrom matplotlib.pyplot import * import math import numpy import poisson.main
On utilise un maillage de 256 par 256 mailles. Pour définir les différents objets, on utilise un maillage réduit de 32 par 32. On commence par définir une condition limite de Neumann sur tous les bords, avant de définir la condition de Dirichlet sur les bords où se trouvent les deux plaques. La partie gauche a une conductivité deux fois plus grande.
On teste la convergence avec la méthode de Gauss-Seidel avec sur-relaxation, et avec une méthode multigrille (cycle en V).
n=8 p=5 levels = n-p+1 laplace=poisson.main.Poisson(p,p,levels,1.0,1.0,x0=0.0,y0=0.0) laplace.laplacien() laplace.neumann_borders(0.0,0.0,0.0,0.0,0.0) T1 = 0.0 T2 = 1.0 laplace.dirichlet_polygon(0,0,[0],[32],T1) laplace.dirichlet_polygon(32,0,[0],[32],T2) laplace.interface_polygon(16,0,[0],[32],0.0,2.0,1.0) result=laplace.opencl_iterations_norm(40,50,omega=1.95) laplace.init_array() result1=laplace.opencl_iterations_norm(40,50,omega=1.98) laplace.init_array() result2=laplace.opencl_iterations_norm(40,50,omega=1.99) laplace.init_array() result3=laplace.multigrid_Vcycles_norm(1,4,50,2,1,30) figure(figsize=(8,5)) plot(result[0],result[1],label='1 grille w=1.95') plot(result1[0],result1[1],label='1 grille w=1.98') plot(result2[0],result2[1],label='1 grille w=1.99') plot(result3[0],result3[1],label='4 grilles') xlabel('niter') ylabel('norm') legend(loc='lower right')plotA.pdf
Le paramètre de sur-relaxation ω=1.98 donne la convergence la plus rapide. La méthode multigrille est la plus rapide.
On trace les lignes d'égale température :
T=laplace.get_array() flux_x=-laplace.get_derivX() flux_y=-laplace.get_derivY() extent = laplace.get_extent() figure(figsize=(8,8)) contour(T,20,extent=extent) imshow(~laplace.get_mask(),extent=extent,alpha=0.5, cmap=cm.gray) xlabel('x') ylabel('y')plotB.pdf
La partie deux fois plus conductrice a un gradient de température deux fois moindre.
Pour obtenir un problème vraiment bidimensionnel, on ajoute deux carrés isolants. Pour cela on peut soit ajouter un carré avec un flux nul sur ces bords (condition limite de Neumann), soit un carré un avec une conductivité nulle.
a=4 laplace.neumann_polygon(8,10,[0,a,0,-a],[a,0,-a,0],[0,0,0,0],[0,0,0,0],0) laplace.interface_polygon(20,20,[a,0,-a,0],[0,a,0,-a],0.0,0.0,1.0) result=laplace.opencl_iterations_norm(20,50,omega=1.99) T=laplace.get_array() figure(figsize=(8,8)) contour(T,40,extent=extent) imshow(~laplace.get_mask(),extent=extent,alpha=0.5, cmap=cm.gray) xlabel('x') ylabel('y')plotC.pdf
Une source thermique est placée dans une enceinte dont les parois sont 5 fois moins conductrices que l'air. La température est imposée sur les bords du domaine.
Figure pleine pagen=8 p=5 levels = n-p+1 laplace=poisson.main.Poisson(p,p,levels,1.0,1.0,x0=0.0,y0=0.0) laplace.laplacien() laplace.dirichlet_borders(1.0) laplace.interface_polygon(8,8,[16,0,-16,0],[0,16,0,-16],0.0,1.0,5.0) laplace.interface_polygon(10,10,[12,0,-12,0],[0,12,0,-12],0.0,5.0,1.0) laplace.source_rect(16,18,2,2,1.0) result=laplace.opencl_iterations_norm(30,50,omega=1.97) figure(figsize=(8,5)) plot(result[0],result[1],label='1 grille w=1.97') xlabel('niter') ylabel('norm') legend(loc='lower right')plotD.pdf
T=laplace.get_array() extent = laplace.get_extent() figure(figsize=(8,8)) contour(T,20,extent=extent) imshow(~laplace.get_mask(),extent=extent,alpha=0.5, cmap=cm.gray) xlabel('x') ylabel('y')plotE.pdf
On ajoute une paroi isolante sur un côté de l'enceinte (rectangle avec un flux nul sur les bords) :
laplace.neumann_polygon(8,7,[0,16,0,-16],[1,0,-1,0],[0,0,0,0],[0,0,0,0],0) result=laplace.opencl_iterations_norm(30,50,omega=1.97) T=laplace.get_array() figure(figsize=(8,8)) contour(T,20,extent=extent) imshow(~laplace.get_mask(),extent=extent,alpha=0.5, cmap=cm.gray) xlabel('x') ylabel('y')plotF.pdf