Projet Monte Carlo Fortran - Sophia - Inria · 2 I – Introduction On appelle méthode de...
Transcript of Projet Monte Carlo Fortran - Sophia - Inria · 2 I – Introduction On appelle méthode de...
0
Erik Pernod Calcul Scientifique 2ème année
Projet Monte Carlo
Fortran
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
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
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.
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 π−=
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.
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.
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
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).
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
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.
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
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.
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)
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
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
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
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
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
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
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
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
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
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
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
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