problème avec de manager.canvas.draw de matplotlib et gobject.idle_add - Python - Programmation
Marsh Posté le 24-07-2012 à 12:57:13
ReplyMarsh Posté le 24-07-2012 à 14:01:22
Quoiqu'il en soit, lorsque le calcul converge, ça ne marche toujours pas. Je suis pas sur que ce soit ça la balise "code"
Marsh Posté le 25-07-2012 à 02:27:00
Bonjour,
Fauster a écrit : Hum, j'ai peut être des problèmes de convergences...j'éclaircis cela |
Si j'ai bien compris ton problème, tu as effectivement des problèmes de convergence mais ça ne résoudra peut-être pas ton problème d'affichage (quoique, en cas d'instabilité, les valeurs explosent ce qui donne un affichage saturé) :
Code :
|
le coefficient 0.9 étant là pour contrôler le pas de temps par rapport à sa limite maximale (sachant que plus il est bas, plus ton schéma sera artificiellement diffusif).
Code :
|
à la place du dernier terme de ton schéma.
En espérant que ça fera avancer le smilblick
PS : tu affiches l'ensemble du vecteur ui or sur les bords du domaine, il vaudra toujours 0 au moment de l'affichage car il est copié à partir de u qui lui-même n'est calculé que sur les indices [1:-1, 1:-1]. Soit tu n'affiches que cette sous-matrice, soit il faut compléter ces valeurs avec les contraintes de ton problème.
PS2 : Je ne m'y connais pas beaucoup en python mais si j'ai bien compris, la méthode idle_add de gobject appelle updatefig tant que celle-ci renvoie True. Tu devrais peut-être faire en sorte de pouvoir contrôler ton résultat numérique toutes les n itérations ?
Marsh Posté le 25-07-2012 à 08:20:24
Merci à toi Tentacle. J'ai également lu un document qui expliquait pourquoi le terme advectif engendrait une instabilité vu son évaluation.
J'ai un peu modifié le calcul de u|i,j] pour que cela soit plus clair, cela reste équivalent à l'ancienne version, bien que le calcul soit moins rapide.
Je cherche toujours à résoudre le problème d'affichage.
J'ai tenté de normaliser mon profil de température-->ui/umax = ui/100 mais ecla ne fonctionne pas
Marsh Posté le 25-07-2012 à 15:22:24
Fauster a écrit : Merci à toi Tentacle. J'ai également lu un document qui expliquait pourquoi le terme advectif engendrait une instabilité vu son évaluation. |
Le calcul vectoriel est probablement plus rapide que faire des boucles sous python. D'ailleurs pourquoi l'avoir modifié ?
Sur le coup, tu mélanges des parties vectorielles (les conditions aux bords) avec le schéma numérique calculé en chaque i,j.
De plus, tu t'es trompé en convertissant le terme advectif :
Code :
|
Autre point : il y a un problème d'indentation dans ton code (ou du moins pour l'affichage sur le forum) ce qui le rend ambigu (surtout pour du python).
Comme on est dans les considérations de codage, tu pourrais ne mettre que la définition des conditions aux bords dans le test m*dt<0.1, le schéma numérique étant indépendant du temps.
Citation : |
Tu devrais peut-être mettre plus en avant, dans ton post, la partie affichage (problème avec l'utilisation de manager.canvas.draw de matplotlib et gobject.idle_add) et reléguer au second plan la partie numérique. Il te reste quoi comme problème d'affichage ? C'est toujours noir ou c'est juste que tu ne vois pas l'évolution du calcul ?
Le titre n'est d'ailleurs pas du tout clair.
À part ça, l'image que tu obtiens ressemble bien à la solution stationnaire que tu devrais obtenir. En attendant de résoudre tes soucis d'affichage, tu devrais d'ailleurs diminuer la vitesse vo pour obtenir une solution stationnaire moins proche de l'état initial et ainsi mieux visualiser l'évolution de ta solution.
Marsh Posté le 26-07-2012 à 08:16:36
Citation : De plus, tu t'es trompé en convertissant le terme advectif : |
C'est corrigé, merci.
Citation : Sur le coup, tu mélanges des parties vectorielles (les conditions aux bords) avec le schéma numérique calculé en chaque i,j. |
Oui en effet...je modifie ça
Citation : C'est toujours noir ou c'est juste que tu ne vois pas l'évolution du calcul ? |
Toujours noir
Marsh Posté le 26-07-2012 à 13:42:32
Le code suivant fonctionne:
Code :
|
Par contre ça ne fait pas ce que je veux. Je n'ai pas des conditions aux limites qui changent avec le pas de temps. Manifestement il y a un problème avec ça. Je rappel que je veux pour ui[0,:] une rampe de température de 0 à 1 seconde (20°C à 100) puis maintient en température à 100 °C le reste deu temps
Marsh Posté le 26-07-2012 à 14:32:42
Fauster a écrit :
|
En regardant la doc de imshow, la palette de couleur est automatiquement adaptée au min/max des données fournies mais uniquement au moment de l'appel de cette méthode. Dans ton code, quand imshow est appelée, ui est constant et vaut 20.0 ce qui donne une palette de couleurs réduite à sa plus petite valeur (noir).
Pour éviter ça, tu peux spécifier les bornes de tes données :
Code :
|
PS: faut attendre un peu que la température monte pour voir quelquechose.
Marsh Posté le 26-07-2012 à 14:59:16
Fauster a écrit : WOUOU ca marche. Merci encore à toi |
Au passage, je te conseille *fortement* ( pour l'avoir testé ) de repasser à la version vectorielle de ton code, tu devrais voir la différence de performance (tu peux aussi n'afficher le résultat que toutes les n itérations)
Marsh Posté le 24-07-2012 à 11:48:01
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
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