La chaleur se propage dans un matériau au repos par diffusion. Le flux de chaleur est proportionel au gradient de température. Si le milieu est homogène, la distribution de température obéit à l'équation
∂u/∂t - k ∂²u/∂x² = 0
La même équation peut décrire d'autres systèmes diffusifs, comme par
exemple la dilution de colorant dans de l'eau. La constante
k
s'appelle la diffusivité thermique du matériau dans
notre cas, et constante de diffusion en général.
Considérons la cuisson d'un panino qui est initialement à température ambiante (disons 20°C) et qui est placé entre deux fers chauffants à 220°C. Les fers du gauffrier se maitiennent à cette température et imposent donc la température sur les deux faces du panino avec lesquels ils sont en contact. En supposant le panino nettement plus plat que large ou long, en combien de temps l'intérieur dépassera-t-il les 80°C qu'il faut par exemple pour faire fondre le fromage ? On supposera que le panino fait 1cm d'épaisseur, et possède une diffusivité thermique de 0.0004 cm²/s. On négligera les enthalpies de cuisson et d'évaporation de l'eau contenue dans le panino.
Considérons un anneau (un tore) de longueur 1 qui à été coupé en 2 parties identiques, selon un plan de coupe qui comprend l'axe de symétrie de l'anneau. Les 2 parties sont chauffées à deux températures différentes (disons 1 et 2), puis recollées ensemble à l'instant t=0. La thermodynamique nous enseigne que l'ensemble va évoluer vers un état où la température sera uniforme. Calculez la distribution de température le long de l'anneau pendant tout le transitoire, numériquement et analytiquement (adimensionnez l'équation tel que k=1).
Pour simuler le système on discrétise l'espace et le temps: on ne
décrit la température qu'en des points j*Δx, j=0,1,2,...
distants de Δx
, à des instants t=n*Δt,
n=0,1,2,...
sépares de Δt
. Si L
est
l'épaisseur de notre panino, la distribution de température à un
instant donné est décrite par un ensemble de L/Δx + 1
points ujn, j=0,1,2,...,L/Δx
.
Écrivez un programme qui calcule la diffusion de la chaleur en utilisant le schéma centré explicite suivant:
(ujn+1 - ujn) / Δt - k (uj+1n - 2*ujn + uj-1n) / Δx² = 0
La condition de stabilité de ce schéma est
k Δt / Δx² <= 0.5
Vous pouvez vous servir du squelette de programme suivant comme point de départ. Affichez la distribution de température à intervalles réguliers.
#include <stdio.h> #include <stdlib.h> #define LONGUEUR 1.0 #define DUREE 0.1 #define NX 100 #define NT 10000 #define K 1.0 /* xmalloc: remplacement de la fonction malloc */ /* l'appel à malloc est encapsulé dans divers vérifications; xmalloc préfère mourir (et entraîner le programme dans la mort :-P) plutôt qu'avouer son échec */ void * xmalloc(size_t len) { void *buf; if (len == 0) return NULL; buf = malloc(len); if (buf == NULL) { fprintf(stderr, "Erreur d'allocation de mémoire, fatale.\n"); exit(EXIT_FAILURE); } return buf; } /* xfree: pendant de xmalloc pour libérer la mémoire */ void xfree(void *buf) { if (buf != NULL) free(buf); } int main (void) { double *u; u = xmalloc(NX*sizeof(double)); /* ... à compléter ... */ xfree(u); return EXIT_SUCCESS; }
k Δt/Δx² = 0.5
et
k Δt/Δx² = 0.55
et relancez la simulation. Que ce
passe-t-il ?
Pour comparer, nous allons calculer une solution analytique approchée. On peut tenter d'écrire la fonction u(x,t) sous forme d'une série de Fourier:
u(x,t) = a0/2 + ∑p=1,2,...[ ( ap cos(2π p x) + bp sin(2π p x) ) up(t) ]
up(t)
satisfont l'EDO
dup/dt + (p π/L)² up = 0qui a la solution
up(t) = cp exp[ - (p π/L)² t ](on peut absorber la valeur de
cp
dans les
coefficients ap
et bp
,
c'est-à-dire prendre cp=1
)
ap
et
bp
à partir de la condition initiale pour la
température du tore:
ap = ∫0L u(x,0) cos(2π p x) dx bp = ∫0L u(x,0) sin(2π p x) dx