Équation de Poisson : programme Python



Documents pareils
chapitre 4 Nombres de Catalan

Fonctions de plusieurs variables

NOTATIONS PRÉLIMINAIRES

Segmentation d'images à l'aide d'agents sociaux : applications GPU

Les travaux doivent être remis sous forme papier.

Fonctions de deux variables. Mai 2011

= 1 si n = m& où n et m sont souvent des indices entiers, par exemple, n, m = 0, 1, 2, 3, 4... En fait,! n m

Cours d Analyse. Fonctions de plusieurs variables

Examen optimisation Centrale Marseille (2008) et SupGalilee (2008)

Fonctions de plusieurs variables, intégrales multiples, et intégrales dépendant d un paramètre

Corrigé du baccalauréat S Asie 21 juin 2010

Matérialiser les données d une BdD : créer une carte de densité de points par maillage

Les algorithmes de base du graphisme

Implémentation de Nouveaux Elements Finis dans Life et Applications

Développements limités. Notion de développement limité

CHAPITRE 10. Jacobien, changement de coordonnées.

Compte-rendu de projet de Système de gestion de base de données

Fonctions de plusieurs variables : dérivés partielles, diérentielle. Fonctions composées. Fonctions de classe C 1. Exemples

Virtualisation de Windows dans Ubuntu Linux

Introduire un nouveau type de maille ou un nouvel élément de référence

ANALYSE NUMERIQUE ET OPTIMISATION. Une introduction à la modélisation mathématique et à la simulation numérique

Chapitre 3. Mesures stationnaires. et théorèmes de convergence

Continuité et dérivabilité d une fonction

Introduction à Adobe Illustrator pour la cartographie et la mise en page

Démontage d'un ordinateur

Les Conditions aux limites

SSNV143 - Traction biaxiale avec la loi de comportement BETON_DOUBLE_DP

Couples de variables aléatoires discrètes

Cours Fonctions de deux variables

Éléments d'architecture des ordinateurs

Équations non linéaires

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

Correction du Baccalauréat S Amérique du Nord mai 2007

Approximations variationelles des EDP Notes du Cours de M2

Ecole Polytechnique de Louvain INGI Fichiers et bases de données

T.P. FLUENT. Cours Mécanique des Fluides. 24 février 2006 NAZIH MARZOUQY

Théorème du point fixe - Théorème de l inversion locale

Sujet proposé par Yves M. LEROY. Cet examen se compose d un exercice et de deux problèmes. Ces trois parties sont indépendantes.

TP3 : Creation de tables 1 seance

LE PROBLEME DU PLUS COURT CHEMIN

Les correcteurs accorderont une importance particulière à la rigueur des raisonnements et aux représentations graphiques demandées.

Compte rendu des TP matlab

LES DÉTERMINANTS DE MATRICES

Examen d informatique première session 2004

1 Introduction et modèle mathématique

Baccalauréat S Antilles-Guyane 11 septembre 2014 Corrigé

Exercice autour de densité, fonction de répatition, espérance et variance de variables quelconques.

Ordonnancement. N: nains de jardin. X: peinture extérieure. E: électricité T: toit. M: murs. F: fondations CHAPTER 1

Intégrales doubles et triples - M

Netvibes : optimiser sa veille d'informations

Chapitre 1 Régime transitoire dans les systèmes physiques

Artica. La déduplication. Révision Du 08 Février 2011 version

Happy birthday ZSet High performance computing dans ZSet

DYNAMIQUE DE FORMATION DES ÉTOILES

* très facile ** facile *** difficulté moyenne **** difficile ***** très difficile I : Incontournable T : pour travailler et mémoriser le cours

Vision industrielle et télédétection - Détection d ellipses. Guillaume Martinez 17 décembre 2007

Java à Murex: un retour d'expérience. Jean-Pierre DACHER & Craig MORRISON

YAO : Un logiciel pour les modèles

Première partie. Introduction à la méthodes des différences finies

CHAPITRE VIII : Les circuits avec résistances ohmiques

Découverte du logiciel ordinateur TI-n spire / TI-n spire CAS

Python - introduction à la programmation et calcul scientifique

Corrigé du baccalauréat S Pondichéry 12 avril 2007

Utilisation du logiciel GALAAD

Commun à tous les candidats

Cours 02 : Problème général de la programmation linéaire

Baccalauréat ES Pondichéry 7 avril 2014 Corrigé

Conception d'un réseau de transport d'électricité

Exemple d application en CFD : Coefficient de traînée d un cylindre

Nombre dérivé et tangente

SDLV120 - Absorption d'une onde de compression dans un barreau élastique

Une bibliothèque de templates pour CUDA

t 100. = 8 ; le pourcentage de réduction est : 8 % 1 t Le pourcentage d'évolution (appelé aussi taux d'évolution) est le nombre :

Exercices - Fonctions de plusieurs variables : corrigé. Pour commencer

ANALYSE CATIA V5. 14/02/2011 Daniel Geffroy IUT GMP Le Mans

Guide de l'utilisateur de l'application mobile

Vers l'ordinateur quantique

Guide pour la réalisation d'un document avec Open Office Writer 2.2

3 Approximation de solutions d équations

C f tracée ci- contre est la représentation graphique d une

Exercice 3 (5 points) A(x) = 1-e -0039' e- 0,039x A '() -'-,..--,-,--,------:-- X = (l_e-0,039x)2

Projet CFD sous ANSYS-CFX

Adobe Illustrator Logiciel de dessin vectoriel et de Cartographie Assistée par Ordinateur

Optimisation, traitement d image et éclipse de Soleil

Une réponse (très) partielle à la deuxième question : Calcul des exposants critiques en champ moyen

SYSTEME DE MODELISATION TELEMAC

Image d un intervalle par une fonction continue

Cours d électricité. Circuits électriques en courant constant. Mathieu Bardoux. 1 re année

Je communique par

Cours d analyse numérique SMI-S4

Exo7. Matrice d une application linéaire. Corrections d Arnaud Bodin.

NOTICE DOUBLE DIPLÔME

Sujet. calculatrice: autorisée durée: 4 heures

Calcul de développements de Puiseux et application au calcul du groupe de monodromie d'une courbe algébrique plane

1 Description générale de VISFIELD

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

Drupal (V7) : principes et petite expérience

Résolution de systèmes linéaires par des méthodes directes

6. Les différents types de démonstrations

Transcription:

Frédéric Legrand Licence Creative Commons 1 Équation de Poisson : programme Python 1. Introduction Ce document présente une interface Python pour le programme C présenté dans Équation de Poisson : programme C. Le module (pypoisson) permet d'eectuer la résolution numérique de l'équation de Poisson 2D (applications en électromagnétisme et en thermodynamique) par la méthode des diérences nies : 2 u x + 2 u = s(x, y) 2 y2 où u(x,y) est la fonction inconnue et s(x,y) la fonction source, éventuellement nulle (équation de Laplace). Pour la méthode de résolution itérative, le module comporte un solveur tournant sur le processeur central (CPU), et un solveur utilisant les capacités de calculs parallèles des cartes graphiques (GPU), via l'interface de programmation OpenCL. 2. Installation du module La bibliothèque pthreads est utilisée pour le multi-threading sur le processeur central (CPU). Cette bibliothèque est disponible en standard sur les distributions Linux. Pour win32, il faudra installer la version pthreads-win32. 3. Description de l'interface 3.a. Dénition du maillage La classe principale est Poisson. Elle se trouve dans le module poisson.main. Son constructeur eectue l'allocation de l'espace mémoire pour le maillage : object = Poisson.Poisson(pw,ph,width) Constructeur : dénition d'un maillage 2D pw, ph : puissances dénissant les nombres de points sur les deux dimensions du maillage. Les nombres de points sont 2 pw et 2 ph width : largeur du domaine, utilisé pour le calcul de la taille des mailles Remarque : une seule instance de cette classe est utilisable, car le programme C sous-jacent ne comporte qu'une instance des données. Poisson.close() Libération de l'espace mémoire réservée pour le maillage. À appeler avant d'ouvrir une nouvelle instance de la classe.

Frédéric Legrand Licence Creative Commons 2 3.b. Équation en coordonnées cartésiennes. En coordonnées cartésiennes, les mailles sont carrées, de côté h. Le domaine d'intégration est donc un rectangle de taille h2 pw par h2 ph. La fonction suivante permet de discrétiser le laplacien en coordonnées cartésiennes. Poisson.laplacien() 3.c. Conditions limites en coordonnées cartésiennes. Les deux fonctions suivantes permettent de dénir les conditions limites sur les bords du domaine rectangulaire. Poisson.dirichlet_borders(value) Condition limite de Dirichlet sur les bords du domaine rectangulaire. value : valeur sur les bords de u Poisson.neumann_borders(source,derivX1,derivX2,derivY1,derivY2) Condition limite de Neumann sur les bords du domaine, c'est-à-dire valeur de la dérivée selon la normale de chaque bord. 3.d. source : valeur de s(x,y) au voisinage du bord (0 pour l'équation de Laplace) derivx1 : valeur de la dérivée par rapport à x à imposer sur le bord gauche derivx1 : valeur de la dérivée par rapport à x à imposer sur le bord droit derivy1 : valeur de la dérivée par rapport à y à imposer sur le bord inférieur derivy2 : valeur de la dérivée par rapport à y à imposer sur le bord inférieur Polygones en coordonnées cartésiennes On peut dénir un polygone dont les arêtes sont parallèles aux axes x et y. Pour cela, il faut créer une instance de la classe Polygon, qui se trouve dans le module poisson.main. Les coordonnées des sommets du polygone peuvent être dénies sur une maille réduite. La maille réduite facilite la dénition des polygones ; de plus, elle sera nécessaire pour la méthode multigrille. Pour cela, on dénit un exposant p de réduction de la maille. La taille de la maille réduite est 2 pw p par 2 ph p. L'utilisateur doit calculer cette taille pour savoir comment dénir les polygones sur le domaine. Polygon.Polygon(poisson,p,point0) Construction d'un polygone à partir d'un point initial. poisson : instance de la classe Poisson utilisée pour le calcul p : exposant de réduction de maille, qui doit être inférieur à pw et à ph point0 : point initial, sous la forme [x,y] (coordonnées sur la maille réduite)

Frédéric Legrand Licence Creative Commons 3 La fonction suivante permet d'ajouter un sommet au polygone. Le sommet est déni par sa direction par rapport au dernier sommet et par sa distance. L'ajout d'un sommet dénit une arête sur laquelle on applique une condition limite. Polygon.add_vertex(direction,length,limit,source,value,derivX,derivY) Ajout d'un sommet au polygone. direction : direction du sommet par rapport au précédent, au choix :[0,1], [0,-1], [1,0] ou [-1,0] length : distance par rapport au sommet précédent (longueur de l'arête), dénie sur la maille réduite limit : type de condition limite : poisson.main.limit S OURCE, poisson.main.limit D IRICHL valeurdes(x, y)auvoisinagedubord(pourlimit S OURCEetLIMIT N EUMANN) value : valeur à imposer pour LIMIT D IRICHLET derivx : valeurdeladriveparrapportximposersurles derivy : valeur de la dérivée par rapport à y à imposer sur les bords parallèles à x, pour LIMIT N EUMANN Le polygone peut être ouvert, auquel cas il peut recevoir une condition limite de source ou de Dirichlet. Pour obtenir un polygone fermé, il faut ajouter le point initial comme dernier sommet. Pour la condition limite de Neumann, il faut savoir où se trouve l'intérieur du domaine (dans lequel se fait le calcul) par rapport au polygone. Cela est xé par la convention suivante : lorsqu'on est orienté dans le sens de dénition du polygone, le domaine de calcul se trouve à gauche. Par exemple, dans un problème d'électrostatique, si l'on veut dénir un conducteur plein dans le domaine, il faudra dénir le polygone dans le sens horaire. Les sommets d'un polygone recoivent un traitement spécial lors de la discrétisation de la condition de Neumann. Pour cette raison, le polygone doit être fermé pour recevoir une condition de Neumann. 3.e. Itérations de Gauss-Seidel sur CPU Le système linéaire obtenu par discrétisation des équations (équation de Poisson et conditions limites) est résolu par la méthode d'itération de Gauss-Seidel. Ce paragraphe présente les fonctions de la classe Poisson qui permettent d'eectuer ce calcul sur le processeur central (CPU). Poisson.iterations(niter) Itérations de Gauss-Seidel. niter : nombre d'itérations Pour contrôler la convergence, la fonctions suivante eectue des blocs d'itérations et calcule la norme de la matrice U à chaque bloc.

Frédéric Legrand Licence Creative Commons 4 [ni,norm]=poisson.iterations_norm(niter,nblock) 3.f. Itérations avec calcul de la norme de la matrice des valeurs de u. niter : nombre d'itérations dans un bloc nblock : nombre de blocs ni : liste des nombres d'itérations norm : liste des normes Itérations de Gauss-Seidel sur GPU Les itérations peuvent être eectuées sur processeur graphique (GPU). Une plateforme opencl doit être installée. La première fonction permet d'acher les plateformes opencl présentes sur le système, et pour chaque plateforme les périphériques associés. Dans les cas courants (une seule carte graphique), il y aura une seule plateforme avec un seul périphérique. Les plateformes et les périphériques sont numérotés à partir de 0. Poisson.platforms() Ache sur la console les plateformes opencl et leurs périphériques associés. Par défaut, la plateforme 0 et le périphérique 0 sont sélectionnés. La fonction suivante permet de sélectionner une plateforme opencl et un périphérique : Poisson.set_opencl_platform_device(platform,device) Sélection d'une plateforme et d'un périphérique pour eectuer les itérations. platform : numéro de la plateforme, 0 pour la première device : numéro du périphérique, 0 pour le premier Les deux fonctions suivantes eectuent les itérations, et sont analogues aux fonctions dénies plus haut pour le CPU : Poisson.opencl_iterations(niter) Itérations de Gauss-Seidel sur plateforme opencl. niter : nombre d'itérations [ni,norm]=poisson.opencl_iterations_norm(niter,nblock) Itérations avec calcul de la norme de la matrice des valeurs de u. niter : nombre d'itérations dans un bloc nblock : nombre de blocs ni : liste des nombres d'itérations norm : liste des normes

Frédéric Legrand Licence Creative Commons 5 3.g. Récupération des données La matrice U contient les valeurs de u(x, y) aux points de la maille. Elle est fournie sous forme d'ue matrice numpy par la fonction suivante : U=Poisson.get_array() U : tableau numpy contenant les valeurs de u Les dérivées par rapport à x et y sont obtenues avec les deux fonctions suivantes : DX=Poisson.get_derivX() DX : tableau numpy contenant les valeurs de u x DY=Poisson.get_derivY() DY : tableau numpy contenant les valeurs de u y 4. Exemples 4.a. Carré conducteur dans un champ uniforme On considère un problème d'électrostatique (équation de Laplace) avec un champ électrique sur les bords à gauche et à droite, et un conducteur carré au milieu. from pylab import * import numpy import poisson.main n=7 laplace=poisson.main.poisson(n,n,1) laplace.laplacien() laplace.neumann_borders(0,1,1,0,0) p=n-4 # maille reduite 4x4 conducteur = poisson.main.polygon(laplace,p,[7,7]) conducteur.add_vertex([0,1],2,poisson.main.limit_dirichlet,0,1,0,0) conducteur.add_vertex([1,0],2,poisson.main.limit_dirichlet,0,1,0,0) conducteur.add_vertex([0,-1],2,poisson.main.limit_dirichlet,0,1,0,0) conducteur.add_vertex([-1,0],2,poisson.main.limit_dirichlet,0,1,0,0) conducteur.apply_limit() laplace.set_opencl_platform_device(0,0) result=laplace.opencl_iterations_norm(2000,30) plot(result[0],result[1]) xlabel('niter') ylabel('norm')

Frédéric Legrand Licence Creative Commons 6 U=laplace.get_array() Ex=laplace.get_derivX() Ey=laplace.get_derivY() laplace.close() figure() contour(u,50)

Frédéric Legrand Licence Creative Commons 7 figure() plot(u[math.pow(2,n-1),:]) xlabel('x') ylabel('u')

Frédéric Legrand Licence Creative Commons 8 figure() plot(ex[math.pow(2,n-1),:]) xlabel('x') ylabel('ex') 4.b. Carré chargé Une forme carrée placée au centre porte une charge sur son contour. Le potentiel est nul sur les bords du domaine. n=7 laplace = poisson.main.poisson(n,n,1) laplace.laplacien() laplace.dirichlet_borders(0.0) p=n-4 # maille reduite 4x4 conducteur = poisson.main.polygon(laplace,p,[7,7]) s=1000 conducteur.add_vertex([0,1],2,poisson.main.limit_source,s,0,0,0) conducteur.add_vertex([1,0],2,poisson.main.limit_source,s,0,0,0) conducteur.add_vertex([0,-1],2,poisson.main.limit_source,s,0,0,0) conducteur.add_vertex([-1,0],2,poisson.main.limit_source,s,0,0,0) conducteur.apply_limit() laplace.set_opencl_platform_device(0,0) result=laplace.opencl_iterations_norm(2000,30) U=laplace.get_array() Ex=laplace.get_derivX()

Frédéric Legrand Licence Creative Commons 9 Ey=laplace.get_derivY() laplace.close() figure() contour(u,30) figure() plot(ex[math.pow(2,n-1),:]) xlabel('x') ylabel('ex')

Frédéric Legrand Licence Creative Commons 10