Docsity
Docsity

Prépare tes examens
Prépare tes examens

Étudies grâce aux nombreuses ressources disponibles sur Docsity


Obtiens des points à télécharger
Obtiens des points à télécharger

Gagnz des points en aidant d'autres étudiants ou achete-les avec un plan Premium


Guides et conseils
Guides et conseils


Équation de Schrödinger à deux dimensions: module Python, Lectures de Physique

Ce document présente le module python pyschrodinger2d, qui permet de résoudre numériquement des problèmes de diffusion d'un paquet d'onde par ...

Typologie: Lectures

2021/2022

Téléchargé le 18/02/2022

Seraphine90
Seraphine90 🇫🇷

4.3

(83)

753 documents

1 / 10

Toggle sidebar

Cette page n'est pas visible dans l'aperçu

Ne manques pas les parties importantes!

bg1
Frédéric Legrand Licence Creative Commons 1
Équation de Schrödinger à deux dimensions : module Python
1. Introduction
Ce document présente le module python
pyschrodinger2d
, qui permet de résoudre
numériquement des problèmes de diusion d'un paquet d'onde par un potentiel, ou de
diraction par un obstacle (diraction par des fentes).
La méthode numérique est exposée dans Équation de Schrödinger à deux dimensions.
La représentation graphique de la densité de probabilité est faite sous forme d'image
ou sous forme de surfaces.
Si l'on dispose d'une carte graphique moyen ou haut de gamme, on peut utiliser une
plateforme OpenCL pour faire les calculs. Avec un processeur multic÷urs, l'utilisation
d'OpenCL peut être intéressante.
2. Installation
Exécutables d'installation pour python win32 :
.
schrodinger2d-0.1.win32-py2.7.exe
.
schrodinger2d-0.1.win32-py3.4.exe
.
schrodinger2d-0.1.win32-py3.5.exe
Exécutable d'installation pour python 3.5 amd64 :
.
schrodinger2d-0.1.win-amd64-py3.5.exe
Code source :
.
schrodinger2d-0.1.zip
Bibliothèques nécessaires pour la compilation : openGL, glew, freeglut, pthread, openCL
(optionnel)
Installation par PIP pour python win32 :
.
Aller dans le dossier
Scripts
de la distribution (python 2.7 win32, 3.4 win32, 3.5
win32, python 3.5 amd64)
.
Exécuter :
pip install schrodinger2d
.
.
Si nécessaire, mettre à jour pip puis recommencer.
3. Scripts de démonstration
.
Fentes
.
Fentes avec montage vidéo
.
Disque de potentiel uniforme
.
Disque de potentiel uniforme avec montage vidéo
.
Barrière de potentiel
.
Potentiel coulombien
.
Tests de vitesse de calcul
pf3
pf4
pf5
pf8
pf9
pfa

Aperçu partiel du texte

Télécharge Équation de Schrödinger à deux dimensions: module Python et plus Lectures au format PDF de Physique sur Docsity uniquement!

Équation de Schrödinger à deux dimensions : module Python

1. Introduction

Ce document présente le module python pyschrodinger2d, qui permet de résoudre numériquement des problèmes de diusion d'un paquet d'onde par un potentiel, ou de diraction par un obstacle (diraction par des fentes). La méthode numérique est exposée dans Équation de Schrödinger à deux dimensions. La représentation graphique de la densité de probabilité est faite sous forme d'image ou sous forme de surfaces. Si l'on dispose d'une carte graphique moyen ou haut de gamme, on peut utiliser une plateforme OpenCL pour faire les calculs. Avec un processeur multic÷urs, l'utilisation d'OpenCL peut être intéressante.

2. Installation

Exécutables d'installation pour python win32 :

. schrodinger2d-0.1.win32-py2.7.exe . schrodinger2d-0.1.win32-py3.4.exe . schrodinger2d-0.1.win32-py3.5.exe Exécutable d'installation pour python 3.5 amd64 : . schrodinger2d-0.1.win-amd64-py3.5.exe Code source : . schrodinger2d-0.1.zip Bibliothèques nécessaires pour la compilation : openGL, glew, freeglut, pthread, openCL (optionnel) Installation par PIP pour python win32 : . Aller dans le dossier Scripts de la distribution (python 2.7 win32, 3.4 win32, 3. win32, python 3.5 amd64) . Exécuter : pip install schrodinger2d. . Si nécessaire, mettre à jour pip puis recommencer.

3. Scripts de démonstration

. Fentes . Fentes avec montage vidéo . Disque de potentiel uniforme . Disque de potentiel uniforme avec montage vidéo . Barrière de potentiel . Potentiel coulombien . Tests de vitesse de calcul

4. Interface

4.a. Dénition du maillage

La classe principale est Schrodinger2d. Elle se trouve dans le module pyschrodinger2d.main. Son constructeur eectue les allocations de mémoire pour le maillage, et permet de dénir la palette de couleur utilisée pour les représentations graphiques. Le maillage comporte un nombre de points puissance de 2 dans les deux directions x et y. On dénit un maillage réduit et un niveau de subdivision pour dénir le maillage utilisé dans les calculs. Le maillage réduit est utilisé pour dénir le problème.

object = Schrodinger2d.Schrodinger2d(px_min,py_min,levels,Lx,normalize,colormap,g

Dénition du maillage et du mode de calcul des couleurs

. px_min,py_min (integer) : puissances dénissant les dimensions du maillage réduit. Les nombres de points sont 2 pxmin^ dans la direction X et 2 pymin^ dans la direction Y. . levels (integer) : le maillage de calcul a 2 pxmin+levels^ et 2 pymin+levels^ points. . Lx (float) : largeur du domaine. . normalize (boolean) : normalisation de la densité de probabilité, c'est-à-dire division par sa valeur maximale à chaque pas de calcul. . colormap (integer) : palette de couleurs utilisée pour les représentations gra- phiques de la densité de probabilité. Les deux possibilités sont 1 (niveau de gris) et 2 (palette couleur). . gamma (float) : coecient gamma pour la dénition de la palette. Un coecient inférieur à 1 permet de renforcer la visibilité des faibles valeurs. Une seule instance de cette classe est utilisable, car le programme C sous-jacent ne comporte qu'une instance des données.

Schrodinger.close()

Libération de l'espace mémoire réservé pour le maillage. À appeler avant d'ouvrir une nouvelle instance de la classe.

4.b. Dénition du potentiel

La valeur par défaut du potentiel sur tout le domaine est 0. On peut dénir un potentiel constant sur un domaine rectangulaire ou circulaire (dénis sur le maillage réduit) avec les deux fonctions suivantes :

Schrodinger2d.potential_rectangle(ci0,cj0,width,height,v)

Potentiel uniforme sur un domaine rectangulaire

. ci0,cj0 (integer) : indices du centre du rectangle, déni sur le maillage réduit. . width, height (integer) : demi-largeur et demi-hauteur du rectangle.

On peut aussi dénir une liste de lignes :

Schrodinger2d.zero_line_list(line_list)

Liste de lignes d'annulation de la fonction d'onde.

. line_list (list) : liste de listes de la forme [i9,j0,length,direction].

4.e. Ordre des dénitions

Pour résumer, voici dans quel ordre les dénitions doivent être faites :

. Dénition du potentiel (si nécessaire). . Appel de la fonction schrodinger(dt) pour dénir le pas de temps. . Dénition de conditions limites (si nécessaire). La condition limite sur le bord du domaine est automatiquement dénie.

4.f. Condition initiale

La fonction suivante permet de dénir une condition initiale pour un paquet d'onde gaussien se propageant dans la direction x. Voir la page Équation de schrödinger à une dimension pour les conditions à respecter.

Schrodinger2d.paquet(x0,y0,k0,sigma0)

Dénition d'un paquet d'onde initial

. x0,y0 (float) : centre du paquet. L'abscisse est comprise entre 0 et Lx (largeur du domaine). L'ordonnée est comprise entre 0 et Ly (hauteur du domaine). . k0 (float) : nombre d'onde. . sigma0 (float) : largeur du paquet (écart-type de la position).

4.g. Initialisation OpenCL

Pour le calcul sur une plateforme OpenCL, des fonctions de conguration doivent être appelées après le constructeur. La première fonction permet d'acher les plateformes openCL présentes sur le sys- tème, et pour chaque plateforme les périphériques associés. Les plateformes et les péri- phériques sont numérotés à partir de 0.

Schrodinger2d.opencl_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 :

Schrodinger2d.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 Si des pilotes OpenCL sont installés pour le processeur central, celui-ci apparaît comme plateforme OpenCL. L'utilisation d'OpenCL n'a vraiment d'intérêt que sur un processeur graphique d'une carte graphique moyen ou haut de gamme (type carte pour jeu ou pour station de travail graphique). Il faut choisir la plateforme correspondante. La fonction suivante doit être appelée après la sélection de la plateforme :

Schrodinger2d.opencl_init()

Initialisation du programme OpenCL (compilation des noyaux). La fonction suivante doit être appelée lorsque toute la conguration du système est faite (après la fonction init décrite ci-dessous.

Schrodinger2d.opencl_create_memory()

Création des tampons de mémoire sur la carte graphique et transfert des données. Lorsque les calculs sont terminés, on doit libérer la mémoire avec la fonction suivante :

Schrodinger2d.opencl_release_memory()

Destruction des tampons de mémoire sur la carte graphique.

4.h. Itérations de calcul

Avant d'eectuer les calculs, il faut initialiser les matrices de calcul du schéma numé- rique avec la fonction suivante :

Schrodinger2d.init()

Initialisation des matrices de calcul. La fonction suivante eectue des itérations avec le processeur central (CPU) :

Schrodinger2d.iterations(ti,tf,threads=1)

Itérations sur CPU.

. ti,tf (float) : instants initial et nal. . threads (integer) : 1, 2 ou 4 : nombre de threads. Seule la diérence entre les deux instants importe (on obtient le nombre d'itérations en la divisant par le pas de temps). La possibilité de dénir le temps de manière absolue est introduite ici pour une éventuelle future implémentation d'un potentiel dépendant du temps. Avec un processeur multi-c÷urs, l'utilisation de 2 threads apporte un gain d'un facteur 2 environ. La fonction suivante eectue des itérations sur le processeur graphique (GPU).

Schrodinger2d.start_rendering(ti,tf,opencl,width,height,surface_height,rendering,

Animation sous la forme d'une image ou d'une surface.

. ti,tf (float) : instants initial et nal. . opencl (boolean) : utilisation de la plateforme OpenCL. . width,height (integer) : taille de la fenêtre. . rendering (integer) : 1 pour obtenir une image, 2 pour une surface. . surface_height (float) : hauteur de la surface. La densité de probabilité est multipliée par cette valeur. . angle_x,angle_y (float) : angles (en degré) dénissant l'orientation de la ca- méra (pour le rendu en surface). Il peut être nécessaire de générer les images de l'animation pour faire un montage vidéo. La fonction suivante eectue des itérations et renvoit l'image nale (celle-ci n'est pas achée) :

img=Schrodinger2d.offscreen_rendering(ti,tf,opencl,width,height,surface_height,re

Itérations et récupération d'une image.

. ti,tf (float) : instants initial et nal. . opencl (boolean) : utilisation de la plateforme OpenCL. . width,height (integer) : taille de la fenêtre. . rendering (integer) : 1 pour obtenir une image, 2 pour une surface. . surface_height (float) : hauteur de la surface. La densité de probabilité est multipliée par cette valeur. . angle_x,angle_y (float) : angles (en degré) dénissant l'orientation de la ca- méra (pour le rendu en surface). . img (ndarray) : image RGBA (8 bits par couche), identique à celle qui serait obtenue dans une animation en temps réel.

5. Exemple

import numpy from schrodinger2d.main import Schrodinger2d from matplotlib.pyplot import * import imageio

On dénit un maillage réduit de 128 points par 64. Le niveau de subdivision est 3, ce qui donne un maillage nal de 1024 par 512, susant pour faire une bonne simulation. La taille du domaine est 2 par 1.

px_min = 7 py_min = 6 levels = 3 Lx = 2. solver = Schrodinger2d(px_min,py_min,levels,Lx,normalize=False,colormap=2,gamma=0.6)

On initialise la plateforme OpenCL (si l'on dispose d'une carte graphique) :

solver.opencl_platforms() solver.set_opencl_platform_device(0,0) solver.opencl_init()

On doit ensuite dénir le pas de temps. Un bon choix est deux fois le pas d'espace au carré :

dt = 2solver.dx* solver.schrodinger(dt)

Pour obtenir la diraction par deux fentes, on dénit trois traits de condition limite nulle :

lignes_nulles_fentesA = [[64,0,29,"u"],[64,31,2,"u"],[64,35,29,"u"]] solver.zero_line_list(lignes_nulles_fentesA)

Il est important d'appeler la fonction schrodinger avant la fonction zero_line_list. Dans le cas contraire, la fonction schrodinger écraserait les lignes dénies. On dénit un paquet d'onde de déplaçant dans le sens de la longueur, et initialement situé à gauche :

x0=0. y0=0. k0 = 250 sigma0 = 0. E=k0*k solver.paquet(x0,y0,k0,sigma0)

On doit alors initialiser les matrices et les tampons mémoires pour OpenCL :

solver.init() solver.opencl_create_memory()

Voici le calcul de quelques itérations :

Avec normalize=False, il y a une saturation de couleur rouge lorsque la densité probabilité dépasse 1 (ce qui se produit lorsque le paquet est proche des fentes). Voici comment obtenir une animation avec une surface :

writer = imageio.get_writer('../../../../figures/numerique/diffusion/pyschrodinger2d/f t = 0 solver.paquet(x0,y0,k0,sigma0) solver.opencl_release_memory() solver.opencl_create_memory() delta_t = dt while t < 200*dt: img = solver.offscreen_rendering(t,t+delta_t,opencl=1,width=solver.width,height=so t+=delta_t writer.append_data(img) writer.close()

solver.opencl_release_memory() solver.close()