26
0 Erik Pernod Calcul Scientifique 2 ème année Projet Monte Carlo Fortran

Projet Monte Carlo Fortran - Sophia - Inria · 2 I – Introduction On appelle méthode de Monte-Carlo toute méthode visant à calculer une valeur numérique, et utilisant des procédés

Embed Size (px)

Citation preview

Page 1: Projet Monte Carlo Fortran - Sophia - Inria · 2 I – Introduction On appelle méthode de Monte-Carlo toute méthode visant à calculer une valeur numérique, et utilisant des procédés

0

Erik Pernod Calcul Scientifique 2ème année

Projet Monte Carlo

Fortran

Page 2: Projet Monte Carlo Fortran - Sophia - Inria · 2 I – Introduction On appelle méthode de Monte-Carlo toute méthode visant à calculer une valeur numérique, et utilisant des procédés

1

SOMMAIRE

I – Introduction …………………………………………..…………..2

II – Aspect mathématique……………………………………......….3 II.1 – Problème de la plaque en 2D : Diffusion de chaleur……………….3 II.2 – Générateur de nombres aléatoires…………………………………..4 II.2.1 – Générateur de la loi uniforme sur [0,1]……………………...…………4 II.2.2 – Générateur de la loi uniforme sur [a,b]……………………...…………4 II.2.3 – Générateur de lois Gaussiennes………………………………..………4 II.3 – Mouvement Brownien…………………………………….………..5 II.4 – Marche sur les sphères…………………………...…………………6 II.5 – Chaînes de Markov…………………………………………………6

III – Algorithmes ……………………………..………………......….7

IV – Résultats……………….………………..………………......….9

V – Autre application : Pièce en 3D.………..………………......…11

VI – Programmes………….………………..……….………......…13

Page 3: Projet Monte Carlo Fortran - Sophia - Inria · 2 I – Introduction On appelle méthode de Monte-Carlo toute méthode visant à calculer une valeur numérique, et utilisant des procédés

2

I – Introduction On appelle méthode de Monte-Carlo toute méthode visant à calculer une valeur numérique, et utilisant des procédés aléatoires, c'est-à-dire des techniques probabilistes. Le nom de ces méthodes fait allusion aux jeux de hasard pratiqués à Monte-Carlo. Les méthodes de Monte-Carlo sont particulièrement utilisées pour calculer des intégrales en dimensions plus grandes que 1 (en particulier, pour calculer des surfaces, des volumes, etc.) Les méthodes de Monte Carlo peuvent être utilisées dans des problèmes tels que la modélisation de la diffusion de la chaleur dans une plaque. Un problème déjà étudié à l’aide de la méthode des éléments finis. Ainsi nous pourrons comparer la vitesse de calcul. Les trois méthodes de Monte Carlo utilisé ici sont : .

- Le mouvement Brownien - La marche sur les sphères - Les chaînes de Markov

Page 4: Projet Monte Carlo Fortran - Sophia - Inria · 2 I – Introduction On appelle méthode de Monte-Carlo toute méthode visant à calculer une valeur numérique, et utilisant des procédés

3

II – Aspect mathématique II.1 – Problème de la plaque en 2D : Diffusion de chaleur On se donne une plaque de largeur b et de longueur a. Par simplification on prendra une plaque carrée de coté 1. Un seul coté de la plaque est chauffé par une température de 100°C. Le but est donc de chercher la diffusion de la chaleur dans la plaque sans à avoir à résoudre l’équation de la chaleur par la méthode des différences finies ou par une autre méthode. Soit le problème suivant : - ∆T = 0 sur ]0,a[x]0,b[ T(0,y) = T(a,y) = T(x,0) = 0 T(x,b) = 100

. On essaye donc de décrire une trajectoire :

- On part d’une position donnée (x,y). - On tire l’état suivant avec une probabilité de ¼ suivant les quatre directions. - On continu jusqu’à ce que la position sorte de la plaque - On compte le nombre de fois où l’on sort par le côté de température 100°C

Par la suite, la température en tout point M se calcul avec la formule suivante :

n

NMT 1100)( ≈

Avec : N1 : le nombre de sorties par le haut de la plaque. n : le nombre d’itérations.

Page 5: Projet Monte Carlo Fortran - Sophia - Inria · 2 I – Introduction On appelle méthode de Monte-Carlo toute méthode visant à calculer une valeur numérique, et utilisant des procédés

4

II.2 – Générateur de nombres aléatoires : Pour obtenir la « trajectoire » à suivre, il nous faut créer une loi aléatoire. Différentes lois aléatoires sont utilisées dans les méthodes Monte Carlo. II.2.1 – Générateur de la loi uniforme sur [0,1] On se donne un nombre premier N très grand et x un entier naturel. On construit la suite : [ ]Naxx nn =+1

Ou encore : [ ]Nbaxx nn +=+1

Avec Nba ∈, et [ ] [ ]1;01;1 ∈⇒−∈N

xNx n

n

On prend en général a de la façon suivante : NNaN −≤≤ II.2.2 – Générateur de la loi uniforme sur [a,b] Il s’agit du même type de loi aléatoire mais sous la forme d’une variable aléatoire On se donne : ]1;0[UX ≈ et XabaY )( −+=

D’où : : : : ];[ baUY ≈

II.2.3 – Générateur de lois Gaussiennes Pour obtenir une loi normale sur [0,1], on a besoin de deux lois uniformes indépendantes U1 et U2. On obtient alors d’après la formule de Box Muller les lois gaussiennes N(0,1) suivantes :

)2cos(ln2 211 UUX π−=

)2sin(ln2 212 UUX π−=

Page 6: Projet Monte Carlo Fortran - Sophia - Inria · 2 I – Introduction On appelle méthode de Monte-Carlo toute méthode visant à calculer une valeur numérique, et utilisant des procédés

5

Pour des Gaussiennes de loi ²),( σmN il suffit de prendre, comme nous l’avons vu

auparavant :

XmY σ+= où )1;0(NX ≈

Bien entendu, il existe d’autres lois pour créer des nombres aléatoires. Tel que par exemple la exponentielle. II.3 – Mouvement Brownien On appel mouvement Brownien un processus tW à valeurs dans ℜ vérifiant :

- Une trajectoire continue, )(wWs s→ est continue pour presque tout w

- Une gaussien centré : ∀ 0< 1t <…< nt , ),...,( 1 tnt WW est un vecteur gaussien centré.

- Sa covariance est : ),inf(),...,( stWWE st =

Où tW est une variable aléatoire indexée par le temps. Lorsque tW est de loi N(0,t), alors sa

densité en dimension 2 est : t

yx

et

2

² 2

.2

1 −−

π.

Simulation du mouvement Brownien :

• Mouvement Brownien issue de (x,y) en dimension 2 : yYetxX == 00

nnn

nnn

VtYY

ZtXX

.

.

1

1

∆+=

∆+=

+

+

Zn et Vn sont des gaussiennes indépendantes de loi N (0,1). Le pas de temps suit la loi : W0=x

ZntWW tntt .∆+= ∆∆+ Où Zn~N(0,1)

• On arrête le mouvement quand ( 1+nX , 1+nY ) sort de la surface d’étude.

Page 7: Projet Monte Carlo Fortran - Sophia - Inria · 2 I – Introduction On appelle méthode de Monte-Carlo toute méthode visant à calculer une valeur numérique, et utilisant des procédés

6

II.4 – Marche sur les sphères Dans cette méthode on utilise l’isotropie du mouvement Brownien. On se donne une position de départ dans notre espace d’étude. Prenons la généralisation en 3D :

• Position de départ (x,y,z). • On prend la distance minimale entre ce point et le bord de l’espace en question.

Notons la D. • Avec cette distance, on construit une sphère de rayon D. Puis on tire un point au

hasard sur le la surface de la sphère. Et ce jusqu’à ce que le point se trouve à une distance inférieure à un epsilon donné du bord.

• On considère qu’au prochain tour le point sera en dehors de l’espace d’étude. Puis on projette sur le bord pour obtenir le point de sorti.

A chaque tirage, les nouvelles coordonnées seront obtenues par les formules suivantes :

θϕθϕθ

cos*

sin*cos*

sin*sin*

1

1

1

rzz

ryy

rxx

nn

nn

nn

+=+=+=

+

+

+

a..2πθ =

ϕ = ( )barcsin*2 a étant généré aléatoirement entre 0 et 1. II.5 – Chaînes de Markov Définition : On considère des variables aléatoires : nXX ...........0 à valeurs dans un espace fini

ou dénombrable E. On pose (x,y) les points de E. On dit que nXX ...........0 est une chaîne de Markov si :

( ) ( )110011 /,....,/ −−−− ====== nnnnnnnn xXxXPxXxXxXP

On suppose que la chaîne est homogène c'est-à-dire qu’elle ne dépend pas de n et on note la probabilité de transition de l’état x à l’état y : ( ) )/(, 1 xXyXPyx nn ===Π −

On a ( ) 0, ≥Π yx et ( ) 1, =Π∑ ∈Ey

yx

A partir d’un point de départ il y a donc équiprobabilité d’aller dans l’une des 6 directions, si on est en 3D. Et comme pour les autres méthodes, on stop le mouvement dès qu’on sort de l’espace d’étude.

Page 8: Projet Monte Carlo Fortran - Sophia - Inria · 2 I – Introduction On appelle méthode de Monte-Carlo toute méthode visant à calculer une valeur numérique, et utilisant des procédés

7

III- Algorithme Pour raccourcir la longueur des programmes je me suis arrangé pour faire un seul programme contenant en subroutines les différentes méthodes. Tout d’abord comme nous l’avons vu dans la partie théorique, il faut créer une subroutine contenant la création de nombre aléatoire. Cette subroutine sera régulièrement appelée. Elle sera nommé « loi_uniforme » On rappel : a = 16807 X0 = 51477 N = 2147483647 Algorithme :

• Déclaration des variables • On demande à l’opérateur de rentrer les coordonnées du point de départ des méthodes,

le nombre d’itérations. Ainsi que la valeur de delta t pour le mouvement brownien et une variable choix pour sélectionner la méthode.

• Dans le cas du mouvement Brownien : - On place le point d’origine - On calcul la nouvelle position après chaque tirage en utilisant les formules vues

auparavant et en utilisant la subroutine « loi_uniforme ». - A chaque fois qu’un tirage sort de la plaque (conditions aux limites) on passe à

l’itération suivante. - Si le tirage sort par la face chauffé à 100°C (y>1) on incrémente la température de

100 - On retourne la température totale au corps du programme.

• Dans le cas de la marche sur les cercles : - On place le point d’origine - On utilise une subroutine pour calculer la distance avec le bord le plus proche - On calcul la nouvelle position après chaque tirage en utilisant les formules vues

auparavant et en utilisant la subroutine « loi_uniforme » pour calculer l’angle. - A chaque fois q’un tirage se trouve à une distance inférieure à un epsilon donné du

bord. On passe à l’itération suivante. - Si à la dernière étape du tirage, le bord le plus proche est celui à 100°C on

incrémente la température de 100

Page 9: Projet Monte Carlo Fortran - Sophia - Inria · 2 I – Introduction On appelle méthode de Monte-Carlo toute méthode visant à calculer une valeur numérique, et utilisant des procédés

8

- On retourne la température totale au corps du programme.

• Dans le cas de la chaîne de Markov : - On place le point d’origine - On discrétise la plaque - On fait un tirage aléatoire à l’aide de la subroutine « loi_uniforme » - Suivant la valeur de ce tirage compris entre 0 et 1 on déplace le point dans une

direction (grâce à la discrétisation). - Par exemple : entre 0 et1 on déplace de y en y-1

Entre 0 et1 on déplace de y en y+1 Entre 0 et1 on déplace de x en x-1 Entre 0 et1 on déplace de x en x+1

- A chaque fois qu’un point sort de la plaque discrétisé, on passe à l’itération suivante.

- Si le point sort par la face du haut à 100°C, on incrémente la température totale de 100.

• Dans le corps du programme, on récupère la température totale. Que l’on divise par le nombre d’itérations pour obtenir la température au point demandé.

Il n’y a pas de difficultés particulières dans ce programme. De plus les calculs ne demande pas trop de capacité sauf peut être la chaîne de Markov (voir constatations des résultats).

Page 10: Projet Monte Carlo Fortran - Sophia - Inria · 2 I – Introduction On appelle méthode de Monte-Carlo toute méthode visant à calculer une valeur numérique, et utilisant des procédés

9

IV – Résultats Dans les trois méthodes on se contente de calculer la température en un point donné de la plaque. Ici le centre : (0.5 ; 0.5) Il suffirait de faire une boucle pour que le programme se déplace de point en point, pour obtenir la température en tout point de la plaque. On rappel les erreurs de chaque méthode :

• Mouvement Brownien : )/( tn ∆+σ

• Marche sur les Cercles : N

oσε +)( (ε étant la précision de la mesure du rayon)

• Chaîne de Markov : n/σ

Pas de temps Nombre

d’itérations Mouvement Brownien

Marche sur les cercles

Chaîne de MArkov

23 °C 24°C 29°C 100

Compteur : 23 Compteur : 24 Compteur : 29

22°C 23°C 27°C 200

Compteur : 44 Compteur : 46 Compteur : 54

25.7°C 24.3°C 25.4°C 1000

Compteur : 257 Compteur : 243 Compteur : 254

25.384°C 24.82°C 25.023°C

0.01

100 000

Compteur :

25384 Compteur :

24820 Compteur :

25023

18°C 25°C 29°C 100

Compteur : 18 Compteur : 25 Compteur : 29

18.5°C 23°C 27°C 200

Compteur : 37 Compteur : 46 Compteur : 54

22.3°C 24.3°C 25.4°C 1000

Compteur : 223 Compteur : 243 Compteur : 254

24.835°C 24.82°C 25.023°C

0.0001

100 000 Compteur : 24835

Compteur : 24820

Compteur : 25023

Page 11: Projet Monte Carlo Fortran - Sophia - Inria · 2 I – Introduction On appelle méthode de Monte-Carlo toute méthode visant à calculer une valeur numérique, et utilisant des procédés

10

Le compteur correspond au nombre de fois qu’un point est sorti par la face du haut. Constatations :

• Puisqu’il s’agit de méthode probabiliste, on a parfois des résultats très précis avec peu d’itérations. Mais il faut attribuer cette précision à un caractère dit « chance ».

• L’augmentation du pas de temps rend bien les méthodes plus précise.

• Avec un nombre d’itérations très élevées, la méthode qui converge le mieux est le

mouvement Brownien. En prenant en compte le temps de calcul.

• La méthode de la marche sur les cercles est la plus rapide en converge. Alors que la méthode de la chaîne de Markov se révèle très lente avec un nombre d’itérations et une discrétisation élevées. Elle se révèle toute fois très précise dans ces conditions.

Pour 100 000 itérations une discrétisation supérieur à 100 pose problème au PC.

Page 12: Projet Monte Carlo Fortran - Sophia - Inria · 2 I – Introduction On appelle méthode de Monte-Carlo toute méthode visant à calculer une valeur numérique, et utilisant des procédés

11

V – Autre application : Pièce en 3D Du point de vue théorique, les méthodes sont exactement les mêmes. Il s’agit juste d’un passage de la 2D à la 3D avec également des modifications des conditions aux limites. Les algorithmes des programmes sont donc les mêmes. Seul une subroutine « conditions aux limites » est nécessaire en plus. En effet dans le cas du mouvement Brownien comme pour la marche sur les Sphères, il faut définir la température sur chaque bord de la pièce. Dans le cas de la marche sur les Sphères, il faut au préalable définir les rayons. Un aspect délicat qui fait intervenir beaucoup de conditions sur la position du point.

Pas de temps Nombre

d’itérations Mouvement Brownien

Marche sur les cercles

100

14.2 °C 16.4°C

200

14.37°C 16.2°C

1000

13.795°C 16.85°C

0.01

100 000

14.3497°C 16.94°C

100

14°C 16.2°C

200

14.4°C 16.4°C

1000

14.095°C 16.89°C

0.0001

100 000

14.222°C 16.90°C

Page 13: Projet Monte Carlo Fortran - Sophia - Inria · 2 I – Introduction On appelle méthode de Monte-Carlo toute méthode visant à calculer une valeur numérique, et utilisant des procédés

12

Constatations :

• De même qu’avant, par moment il a des précisions étonnantes à faibles itérations. • L’augmentation du pas de temps rend bien les méthodes plus précise.

• Cette fois ci, on constate que le mouvement Brownien et la marche sur les Sphères ne

convergent pas vers la même température. La première converge vers 14°C à alors que la deuxième converge plutôt vers 17°C. On peut supposer que le mouvement Brownien ne prend pas bien en compte la géométrie de la pièce.

• Encore une fois, la méthode la marche sur les Sphères se révèle plus rapide en

convergence.

Page 14: Projet Monte Carlo Fortran - Sophia - Inria · 2 I – Introduction On appelle méthode de Monte-Carlo toute méthode visant à calculer une valeur numérique, et utilisant des procédés

13

VI – Programmes V.1 – Plaque : c ********************************************* ********************* c | | c | Diffusion de la chaleur | c | | c ********************************************* ********************* c PROGRAM Diff c INTEGER n,cpt,choix,relance DOUBLE PRECISION a,Nmax,Xo,res,deltat,x0,y0 c 17 WRITE (*,*) WRITE (*,*) WRITE (*,*) c c Initialisation : c c a=16807 Nmax=2147483647 Xo=51477 res=0 cpt=0 c c Formulaire : c WRITE (*,*) "Rentrez les coordonn‚es de X" READ(*,*)x0 c WRITE (*,*) "Rentrez les coordonn‚es de Y" READ(*,*)y0 c WRITE (*,*) "Rentrez nombre d'iteration " READ(*,*)n c WRITE (*,*) "Rentrez le pas de temps " READ(*,*)deltat c WRITE (*,*) "Choix de la methode :" WRITE (*,*) "Mouvement Brownien : 1" WRITE (*,*) "Marche sur les spheres : 2" WRITE (*,*) "Chaine de Markov : 3" READ(*,*)choix c c Programme : c IF (choix.eq.1)THEN CALL brownien(a,Nmax,Xo,x0,y0,n,deltat,res,cpt) ELSEIF (choix.eq.2)THEN CALL sphere(a,Nmax,Xo,x0,y0,n,res,cpt) ELSEIF (choix.eq.3)THEN CALL Markov(a,Nmax,Xo,x0,y0,n,res,cpt)

Page 15: Projet Monte Carlo Fortran - Sophia - Inria · 2 I – Introduction On appelle méthode de Monte-Carlo toute méthode visant à calculer une valeur numérique, et utilisant des procédés

14

ENDIF c c Resultats : c res=res/n WRITE (*,*) WRITE (*,*) WRITE (*,*) WRITE (*,*) "Nombre d'iterations : ",n WRITE (*,*) "temperature au point (",x0,";" ,y0," ) : ",res WRITE (*,*) "compteur :",cpt c WRITE (*,*) WRITE (*,*) WRITE (*,*) "relancer le programme 1=oui" READ(*,*)relance c IF (relance.eq.1)THEN GOTO 17 ENDIF c END c c ********************************************* ********************* c c ------------------------------------------------------------------ c MOUVEMENT BROWNIEN c ------------------------------------------------------------------ SUBROUTINE brownien(a,Nmax,Xo,x0,y0,n,deltat,res,cpt) c INTEGER n,cpt,i DOUBLE PRECISION a,Nmax,Xo,u1,u2,res,deltat,Pi,Zn,Vn,x0,y0,x,y c pi=4*datan(1.d0) c DO i=1,n x=x0 y=y0 c DOWHILE ((y.LT.1).and.(y.GT.0).and.(x.LT.1).and.(x.GT.0)) c CALL loi_uniforme(a,Nmax,Xo,u1) CALL loi_uniforme(a,Nmax,Xo,u2) c Zn=sqrt(-2*dlog(u1))*cos(2*Pi*u2) Vn=sqrt(-2*dlog(u1))*sin(2*Pi*u2) c x=x+sqrt(deltat)*Zn y=y+sqrt(deltat)*Vn IF (y.GE.1)THEN !le tirage sort par le haut res=res+100 cpt=cpt+1 ENDIF c ENDDO ENDDO c RETURN END c

Page 16: Projet Monte Carlo Fortran - Sophia - Inria · 2 I – Introduction On appelle méthode de Monte-Carlo toute méthode visant à calculer une valeur numérique, et utilisant des procédés

15

c ------------------------------------------------------------------ c MARCHE SUR LES SPHERES c ------------------------------------------------------------------ SUBROUTINE sphere(a,Nmax,Xo,x0,y0,n,res,cpt) c INTEGER n,cpt,i DOUBLE PRECISION a,Nmax,Xo,u1,res,Pi,x0,y0,x,y,precision,tetat,d c pi=4*datan(1.d0) precision=0.000001 c DO i=1,n x=x0 y=y0 CALL distance(x,y,d) c DOWHILE (d.GT.precision) c CALL loi_uniforme(a,Nmax,Xo,u1) tetat=2*pi*u1 c x=x+d*sin(tetat) y=y+d*cos(tetat) c CALL distance(x,y,d) c ENDDO IF(y.GE.1-precision)THEN !le tirage sort par le haut res=res+100 cpt=cpt+1 ENDIF ENDDO c RETURN END c c ------------------------------------------------------------------ c Chaine de Markov c ------------------------------------------------------------------ SUBROUTINE Markov(a,Nmax,Xo,x0,y0,n,res,cpt) c INTEGER i,n,cpt,disc DOUBLE PRECISION a,Nmax,Xo,u,res,x0,y0,x,y c WRITE (*,*) "discretisation :" READ(*,*)disc c DO i=1,n x=x0*disc y=y0*disc c DOWHILE ((y.LT.disc).and.(y.GT.0).and.(x.LT.disc).and.(x.GT.0)) CALL loi_uniforme(a,Nmax,Xo,u) c IF ((u.GE.0).and.(u.LE.0.25))THEN y=y-1 ENDIF IF((u.GE.0.25).and.(u.LE.0.5))THEN y=y+1 ENDIF

Page 17: Projet Monte Carlo Fortran - Sophia - Inria · 2 I – Introduction On appelle méthode de Monte-Carlo toute méthode visant à calculer une valeur numérique, et utilisant des procédés

16

IF((u.GE.0.5).and.(u.LE.0.75))THEN x=x-1 ENDIF IF((u.GE.0.75).and.(u.LE.1))THEN x=x+1 ENDIF c ENDDO WRITE(*,*)y IF (y.GE.disc)THEN !le tirage sort par le haut res=res+100 cpt=cpt+1 ENDIF ENDDO c RETURN END c c ------------------------------------------------------------------ c GENERATEUR NOMBRE ALEATOIRE c ------------------------------------------------------------------ SUBROUTINE loi_uniforme(a,Nmax,Xo,u) DOUBLE PRECISION a,Nmax,Xo,u c c Xo=abs(Xo*a) Xo=mod(Xo,Nmax) c u=dble(Xo)/dble(Nmax) c RETURN END c c ------------------------------------------------------------------ c c ------------------------------------------------------------------ SUBROUTINE distance(x,y,d) c DOUBLE PRECISION x,y,d,dx,dy c d=0 c IF (x.LT.0.5)THEN dx=x ELSE dx=1.d0-x ENDIF c IF (y.LT.0.5)THEN dy=y ELSE dy=1.d0-y ENDIF c IF (dx.LT.dy)THEN d=dx ELSE d=dy ENDIF c

Page 18: Projet Monte Carlo Fortran - Sophia - Inria · 2 I – Introduction On appelle méthode de Monte-Carlo toute méthode visant à calculer une valeur numérique, et utilisant des procédés

17

RETURN END

V.2 – Pièce 3D c ********************************************* ********************* c | | c | PiŠce en 3D avec des jolis radiateurs | c | | c ********************************************* ********************* c PROGRAM piece c INTEGER n,cpt,choix,relance DOUBLE PRECISION a,Nmax,Xo,res,deltat,x0,y0,z0 c 17 WRITE (*,*) WRITE (*,*) WRITE (*,*) c c Initialisation : c c a=16807 Nmax=2147483647 Xo=51477 res=0 cpt=0 c c Formulaire : c WRITE (*,*) "Rentrez les coordonn‚es de X" READ(*,*)x0 c WRITE (*,*) "Rentrez les coordonn‚es de Y" READ(*,*)y0 c WRITE (*,*) "Rentrez les coordonn‚es de Z" READ(*,*)z0 c WRITE (*,*) "Rentrez nombre d'iteration " READ(*,*)n c WRITE (*,*) "Rentrez le pas de temps " READ(*,*)deltat c c c Programme : c CALL brownien(a,Nmax,Xo,x0,y0,z0,n,deltat,res,cpt) c c Resultats : c res=res/n WRITE (*,*) WRITE (*,*) WRITE (*,*) WRITE (*,*) "Nombre d'iterations : ",n

Page 19: Projet Monte Carlo Fortran - Sophia - Inria · 2 I – Introduction On appelle méthode de Monte-Carlo toute méthode visant à calculer une valeur numérique, et utilisant des procédés

18

WRITE (*,*) "temperature au point (",x0,";" ,y0,";" ,z0," ) : ",res WRITE (*,*) "compteur :",cpt c WRITE (*,*) WRITE (*,*) WRITE (*,*) "relancer le programme 1=oui" READ(*,*)relance c IF (relance.eq.1)THEN GOTO 17 ENDIF c END c c ********************************************* ********************* c c ------------------------------------------------------------------ c MOUVEMENT BROWNIEN c ------------------------------------------------------------------ SUBROUTINE brownien(a,Nmax,Xo,x0,y0,z0,n,deltat,res,cpt) c INTEGER n,cpt,i,T DOUBLE PRECISION a,Nmax,Xo,u1,u2,res,deltat,Pi,Zn,Vn,x0,y0,x,y &,z0,z,u3,Un c pi=4*datan(1.d0) c DO i=1,n x=x0 y=y0 z=z0 T=0 c DOWHILE (T.EQ.0) c CALL loi_uniforme(a,Nmax,Xo,u1) CALL loi_uniforme(a,Nmax,Xo,u2) CALL loi_uniforme(a,Nmax,Xo,u3) c Zn=sqrt(-2*dlog(u2))*cos(2*Pi*u3) Vn=sqrt(-2*dlog(u3))*sin(2*Pi*u1) Un=sqrt(-2*dlog(u1))*sin(2*PI*u2) c x=x+sqrt(deltat)*Un y=y+sqrt(deltat)*Vn z=z+sqrt(deltat)*Zn call temperature(x,y,z,T) c IF (T.NE.0)THEN !le tirage sort par le haut res=res+T cpt=cpt+1 ENDIF c ENDDO ENDDO c RETURN

Page 20: Projet Monte Carlo Fortran - Sophia - Inria · 2 I – Introduction On appelle méthode de Monte-Carlo toute méthode visant à calculer une valeur numérique, et utilisant des procédés

19

END c ------------------------------------------------------------------ c GENERATEUR NOMBRE ALEATOIRE c ------------------------------------------------------------------ SUBROUTINE loi_uniforme(a,Nmax,Xo,u) DOUBLE PRECISION a,Nmax,Xo,u c c Xo=abs(Xo*a) Xo=mod(Xo,Nmax) c u=dble(Xo)/dble(Nmax) c RETURN END c c ------------------------------------------------------------------ c GEOMETRIE DE LA PIECE c ------------------------------------------------------------------ SUBROUTINE temperature(x,y,z,T) c INTEGER T DOUBLE PRECISION x,y,z,r1,r2 c c r1=sqrt(x*x+y*y) !position des radiateurs r2=sqrt((x-5)*(x-5)+(y-5)*(y-5)) c IF (r1.LE.1) T=50 IF (r2.LE.1) T=50 IF (z.LE.1.5.and.y.GE.4.and.x.GE.1.and.x.LE.2) T=15 IF (y.LE.0) T=15 IF (x.GE.5) T=15 IF (y.GE.5) T=15 IF (x.LE.0) T=15 IF (z.LE.0) T=15 IF (z.GE.2.5) T=10 c RETURN END c ********************************************* ********************* c | | c | PiŠce en 3D avec des jolis radiateurs | c | | c ********************************************* ********************* c PROGRAM Sphere c double precision x0,y0,z0,d1,d2,d3,d4,d5,r,eps,u1,u2 & ,teta2,PI,T,res,teta1,z,x,y,eps integer ix,n,k c 17 c Formulaire : c

Page 21: Projet Monte Carlo Fortran - Sophia - Inria · 2 I – Introduction On appelle méthode de Monte-Carlo toute méthode visant à calculer une valeur numérique, et utilisant des procédés

20

WRITE (*,*) "Rentrez les coordonn‚es de X" READ(*,*)x0 c WRITE (*,*) "Rentrez les coordonn‚es de Y" READ(*,*)y0 c WRITE (*,*) "Rentrez les coordonn‚es de Z" READ(*,*)z0 c WRITE (*,*) "Rentrez nombre d'iteration " READ(*,*)n c c c PI=4*datan(1.d0) a=16807 Nmax=2147483647 Xo=51477 res=0 cpt=0 eps=0.001 c c DO i=1,n x=x0 y=y0 z=z0 DOWHILE (r.gt.eps) call rayon(x,y,z,d1,d2,d3,d4,d5,r) call loi_uniforme(a,Nmax,Xo,u1) call loi_uniforme(a,Nmax,Xo,u2) c teta1=2*asin(sqrt(u1)) teta2=u2*2*PI c x=x+r*sin(teta1)*sin(teta2) y=y+r*cos(teta1)*sin(teta2) z=z+r*cos(teta1) ENDDO call piece(x,y,z,k) call rayon(x,y,z,d1,d2,d3,d4,d5,r) IF (k.eq.0) THEN IF (r.eq.d1) T=15 IF (r.eq.d2) T=15 IF (r.eq.(sqrt(x*x+y*y)-1.d0)) T=15 IF (r.eq.z) T=15 IF (r.eq.(25d-1-z))T=10 END IF c IF (k.eq.1) THEN IF (r.eq.d1)T=15 IF (r.eq.z) T=15 IF (r.eq.(25d-1-z))T=10 END IF c IF (k.eq.2) THEN

Page 22: Projet Monte Carlo Fortran - Sophia - Inria · 2 I – Introduction On appelle méthode de Monte-Carlo toute méthode visant à calculer une valeur numérique, et utilisant des procédés

21

IF (r.eq.d1)T=15 IF (r.eq.z) T=15 IF (r.eq.(25d-1-z)) T=10 END IF c IF (k.eq.3) THEN IF (r.eq.d1)T=15 IF (r.eq.(sqrt((5-x)*(5-x)+(5-y)*(5-y))-1)) T=50 IF (r.eq.z) T=15 IF (r.eq.(25d-1-z))T=10 END IF c IF (k.eq.4) THEN IF (r.eq.d2) T=15 IF (r.eq.d1) T=15 IF (r.eq.(5-y)) T=15 IF (r.eq.z) T=15 IF (r.eq.(25d-1-z))T=10 END IF c IF (k.eq.5) THEN IF (r.eq.(z-15d-1))T=15 IF (r.eq.(25d-1-z)) THEN T=10 ELSE T=15 ENDIF ENDIF c IF (k.eq.6) THEN IF (r.eq.d2)T=15 IF (r.eq.d1) T=15 IF (r.eq.(sqrt((5-x)*(5-x)+(5-y)*(5-y))-1)) T=50 IF (r.eq.z) T=15 IF (r.eq.(25d-1-z))T=10 END IF c IF (k.eq.7) THEN IF (r.eq.(sqrt((5-x)*(5-x)+(5-y)*(5-y))-1)) T=50 IF (r.eq.z) T=15 IF (r.eq.(25d-1-z))T=10 END IF c IF (k.eq.8) THEN IF (r.eq.(sqrt(x*x+y*y)-1.d0))T=50 IF (r.eq.z) T=15 IF (r.eq.(25d-1-z))T=10 END IF c IF (k.eq.9) THEN IF (r.eq.d1) T=15 IF (r.eq.(sqrt(x*x+y*y)-1.d0)) T=50 IF (r.eq.z) T=15 IF (r.eq.(25d-1-z))T=10 END IF c IF (k.eq.10) THEN IF (r.eq.y) T=15 IF (r.eq.d2) T=15 IF (r.eq.z) T=15

Page 23: Projet Monte Carlo Fortran - Sophia - Inria · 2 I – Introduction On appelle méthode de Monte-Carlo toute méthode visant à calculer une valeur numérique, et utilisant des procédés

22

IF (r.eq.(25d-1-z)) T=10 END IF c res=res+T cpt=cpt+1 ENDdo c res=res/n c WRITE (*,*) WRITE (*,*) WRITE (*,*) WRITE (*,*) "Nombre d'iterations : ",n WRITE (*,*) "temperature au point (",x0,";" ,y0,";" ,z0," ) : ",res WRITE (*,*) "compteur :",cpt c WRITE (*,*) WRITE (*,*) WRITE (*,*) "relancer le programme 1=oui" READ(*,*)relance c IF (relance.eq.1)THEN GOTO 17 ENDIF c END c ------------------------------------------------------------------ c GENERATEUR NOMBRE ALEATOIRE c ------------------------------------------------------------------ SUBROUTINE loi_uniforme(a,Nmax,Xo,u) DOUBLE PRECISION a,Nmax,Xo,u c c Xo=abs(Xo*a) Xo=mod(Xo,Nmax) c u=dble(Xo)/dble(Nmax) c RETURN END c c ------------------------------------------------------------------ c CREATION DE LA PIECE c ------------------------------------------------------------------ SUBROUTINE piece(x,y,z,k) c INTEGER k DOUBLE PRECISION x,y,z c k=0 IF (x.le.1) THEN IF (y.le.1)k=8 ELSE IF (y.lt.4) THEN k=0 ELSE k=4 END IF c

Page 24: Projet Monte Carlo Fortran - Sophia - Inria · 2 I – Introduction On appelle méthode de Monte-Carlo toute méthode visant à calculer une valeur numérique, et utilisant des procédés

23

IF (x.ge.4) THEN IF (y.lt.1) k=10 IF (y.lt.4) THEN k=3 ELSE k=7 END IF END IF c IF (x.lt.4) THEN IF (y.lt.1) k=9 ENDIF c IF (x.le.2) THEN IF(y.lt.4) THEN k=1 ELSE k=5 END IF ENDIF c IF (x.gt.2) THEN IF (y.gt.4) THEN k=6 ELSE k=5 END IF END IF c IF (x.gt.2) THEN IF (y.le.4) THEN k=2 ELSE k=6 END IF END IF c IF (x.lt.1)THEN IF(y.ge.4) THEN k=4 ELSE k=5 ENDIF END IF c IF (x.ge.4) THEN IF(y.ge.4) THEN k=7 ELSE k=3 ENDIF END IF c IF (x.ge.1.and.x.le.2) THEN IF(y.ge.4) k=5 END IF c RETURN END

Page 25: Projet Monte Carlo Fortran - Sophia - Inria · 2 I – Introduction On appelle méthode de Monte-Carlo toute méthode visant à calculer une valeur numérique, et utilisant des procédés

24

c c ------------------------------------------------------------------ c Creation du rayon c ------------------------------------------------------------------ SUBROUTINE rayon(x,y,z,d1,d2,d3,d4,d5,r) c DOUBLE PRECISION x,y,z,d1,d2,d3,d4,d5,r INTEGER k d1=2.d0 d2=2.d0 d3=2.d0 d4=2.d0 d5=2.d0 r=5.d0 c c Call piece(x,y,z,k) c IF (k.eq.0)THEN d1=x d2=sqrt((1-x)*(1-x)+(4-y)*(4-y)) r=sqrt((x*x+y*y))-1 IF (r.gt.d2) r=d2 IF (r.gt.d1)r=d1 ENDIF c IF (k.eq.1) THEN IF(z.gt.1.5) THEN d1=sqrt((4-y)*(4-y)+(z-15d-1)*(z-15d-1)) ELSE d1=4-y END IF d3=x d4=y r=sqrt(x*x+y*y)-1 IF (r.gt.d1) r=d1 IF (r.gt.d3)r=d3 IF (r.gt.d4) r=d4 ENDIF c IF (k.eq.2) THEN IF(z.gt.1.5) THEN d1=sqrt((4-y)*(4-y)+(x-2)*(x-2)+(z-15d-1)*(z-15d-1)) ELSE d1=sqrt((4-y)*(4-y)+(x-2)*(x-2)) END IF d2=y d3=5-x d4=5-y r=sqrt((5-x)*(5-x)+(5-y)*(5-y))-1 IF (r.gt.d2) r=d2 IF (r.gt.d3) r=d3 IF (r.gt.d1) r=d1 IF (r.gt.d4)r=d4 IF (r.gt.d2) r=d2 c END IF IF (k.eq.3) THEN d1=5-x

Page 26: Projet Monte Carlo Fortran - Sophia - Inria · 2 I – Introduction On appelle méthode de Monte-Carlo toute méthode visant à calculer une valeur numérique, et utilisant des procédés

25

d2=sqrt((5-x)*(5-x)+(5-y)*(5-y))-1 r=d2 IF (r.gt.d1) r=d1 END IF c IF (k.eq.4) THEN IF (z.gt.15d-1) THEN d1=sqrt((1-x)*(1-x)+(z-15d-1)*(z-15d-1)) ELSE d1=1-x END IF d2=x r=5-y IF (r.gt.d2)r=d2 IF (r.gt.d1) r=d1 ENDIF c IF (k.eq.5) THEN r=5-y IF (r.gt.(25d-1-z)) r=25d-1-z IF (r.gt.(z-15d-1)) r=z-15d-1 IF (r.gt.z)r=z END IF IF (k.eq.6) THEN IF (z.gt.15d-1) THEN d1=sqrt((x-2)*(x-2)+(z-15d-1)*(z-15d-1)) ELSE d1=x-2 END IF d2=5-y r=sqrt((5-x)*(5-x)+(5-y)*(5-y))-1 IF (r.gt.d2) r=d2 IF (r.gt.d1) r=d1 ENDIF c IF (k.eq.7) r=sqrt((5-x)*(5-x)+(5-y)*(5-y))-1 IF (k.eq.8) r=sqrt((x*x+y*y))-1 IF (k.eq.9) THEN d1=y d2=sqrt((x*x+y*y))-1.d0 r=d2 IF (d2.gt.d1) r=d1 ENDIF c IF (k.eq.10) THEN d2=5-x r=y IF (r.gt.d2) r=d2 END IF c RETURN END