Fauster | Bonjour à tous, j'ai besoin de votre aide. Je suis en stage dans le domaine de la mécanique des fluides (je ne suis pas informaticien de formation) et j'ai un problème sur mon code de résolution de l'équation de la chaleur à 2 dimensions avec terme advectif.
Le problème est le suisant:
J'ai un fluide (de l'eau) qui entre dans un canal à 20°C et qui est en contacte avec une paroi chauffante. Je résoud l'équation de la chaleur par différence finis en coordonnées cartésiennes. Mes conditions aux limites sont:
Une rampe de température de la paroi de 20°C à 100°C à en une seconde puis maintient à 100°C le reste du temps (bord gauche du maillage).
Une température d'entrée de 20°C
Une conditions de flux nul pour le bord droit du maillage.
En sortie je fais une extrapolation de la température gràce aux valeurs de températures précédentes
Voila mon code, je me suis inspiré d'un code que j'ai trouvé sur le net résolvant un problème de diffision de particule
Code :
- import scipy as sp
- import matplotlib
- matplotlib.use('GTKAgg')
- import gobject
- from pylab import *
- #variables du probleme
- dx=0.0001
- dy=0.001
- phof=1000.0
- cpf=4185.0
- lambdaf=0.6
- alphaf = lambdaf/(phof*cpf)
- timesteps=4000
- nx = int(0.01/dx)
- ny = int(0.2/dy)
- dx2=dx**2
- dy2=dy**2
- dtm=dx2*dy2/(2*alphaf*(dx2+dy2))
- vo = 1.0
- dtm_diff = min(dx2,dy2)*0.5/alphaf
- dtm_adv = dy/abs(vo)
- dt = 0.9 * min(dtm_diff, dtm_adv)
- ui = 20.0*ones([nx,ny])
- u = 20.0*ones([nx,ny])
- def updatefig(*args):
- global u, ui, m
- im.set_array(ui)
- manager.canvas.draw()
- print m
- if (m*dt<1.0):
- # conditions de bords
- ui[0,:] = 20.0+80.0*m*dt
- ui[:,0] = 20.0
- u[0,:] = ui[0,:]
- u[:,0] = ui[:,0]
-
- u[1:-1, 1:-1] = ui[1:-1, 1:-1] + alphaf*dt*( (ui[2:, 1:-1] - 2*ui[1:-1, 1:-1] + ui[:-2, 1:-1])/dx2 + (ui[1:-1, 2:] - 2*ui[1:-1, 1:-1] + ui[1:-1, :-2])/dy2 )-dt*vo*(ui[1:-1, 1:-1] - ui[1:-1, :-2])/dy
-
- else:
- # conditions de bords
- ui[0,:] = 100.00
- ui[:,0] = 20.00
- u[0,:] = ui[0,:]
- u[:,0] = ui[:,0]
- u[1:-1, 1:-1] = ui[1:-1, 1:-1] + alphaf*dt*( (ui[2:, 1:-1] - 2*ui[1:-1, 1:-1] + ui[:-2, 1:-1])/dx2 + (ui[1:-1, 2:] - 2*ui[1:-1, 1:-1] + ui[1:-1, :-2])/dy2 )-dt*vo*(ui[1:-1, 1:-1] - ui[1:-1, :-2])/dy
-
- print u
- ui = sp.copy(u)
- m+=1
- if m >= timesteps:
- return False
- return True
- fig = plt.figure()
- img = fig.add_subplot(1,1,1)
- ticks_at = [0,1]
- im = img.imshow( ui/100, interpolation='nearest', origin='lower')
- cbar = fig.colorbar(im,ticks=ticks_at)
- manager = get_current_fig_manager()
- m=1
- gobject.idle_add(updatefig)
- show()
|
Je n'arrive pas à visualiser correctement le champ de température. L 'écran est totalement noir. J'ai fait des prints pour regarder l'allure de mon tableau ui et les résultats sont physiques (le fluide se chauffe bien au contacte de la paroi) pourtant je n'arrive pas à les visualiser. Il faudrait que les zones chaudes se colorent en rouge au cours du calcul. Sauriez vous d'où vient le problème ?
Merci d'avance,
Fauster
edit du 25 Juillet : 8h13 prise en compte des remarques de Tentacle sur la stabilité et le schéma pour la dérivée d'ordre 1 (terme d'advection)
Modification sur le calcul de u[i,j]. u[i,j] remplace u[1:-1, 1:-1] etc..
Bonne prise en compte des conditions aux limites.
J'ai réussi à faire apparaître une image du champs de température (en bidouillant un peu) mais je ne parvient toujours pas à itérer cette image au cours du calcul:
PS: Le résultat est bien physique: apparition d'une couche limite de température pendant le transitoire. (champs de température normalisé, le fluide rentre à gauche et va vers la droite)
 Message édité par Fauster le 26-07-2012 à 13:58:08
|