Table des matières Python

Conduction thermique en régime stationnaire

1. Introduction

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 :

2Tx2+2Ty2=-σλ

σ(x,y) 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.

2. Conduction thermique entre deux plaques

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.

../../../../figures/sciphys/thermo/conduction/deuxplaques.svgFigure pleine page
from 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')
              
plotAplotA.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')
            
plotBplotB.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')
              
plotCplotC.pdf

3. Source thermique dans une enceinte

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.

../../../../figures/sciphys/thermo/conduction/source.svgFigure pleine page
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.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')
            
plotDplotD.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')
            
plotEplotE.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')
            
plotFplotF.pdf
Creative Commons LicenseTextes et figures sont mis à disposition sous contrat Creative Commons.