root / Ising / Serial / Ising2D-MWC.py @ 308
Historique | Voir | Annoter | Télécharger (2,4 ko)
1 | 18 | equemene | #!/usr/bin/env python
|
---|---|---|---|
2 | 18 | equemene | #
|
3 | 18 | equemene | # Ising2D model in serial mode
|
4 | 18 | equemene | #
|
5 | 18 | equemene | # CC BY-NC-SA 2011 : <emmanuel.quemener@ens-lyon.fr>
|
6 | 18 | equemene | #
|
7 | 18 | equemene | # Thanks to George Marsaglia : http://en.wikipedia.org/wiki/Multiply-with-carry
|
8 | 18 | equemene | |
9 | 18 | equemene | import sys |
10 | 18 | equemene | import numpy |
11 | 18 | equemene | #import pylab
|
12 | 18 | equemene | from PIL import Image |
13 | 18 | equemene | from math import exp |
14 | 18 | equemene | from random import random |
15 | 18 | equemene | import time |
16 | 18 | equemene | |
17 | 18 | equemene | z=0
|
18 | 18 | equemene | w=0
|
19 | 18 | equemene | |
20 | 18 | equemene | def ImageOutput(sigma,prefix): |
21 | 18 | equemene | Max=sigma.max() |
22 | 18 | equemene | Min=sigma.min() |
23 | 18 | equemene | |
24 | 18 | equemene | # Normalize value as 8bits Integer
|
25 | 18 | equemene | SigmaInt=(255*(sigma-Min)/(Max-Min)).astype('uint8') |
26 | 18 | equemene | image = Image.fromarray(SigmaInt) |
27 | 18 | equemene | image.save("%s.jpg" % prefix)
|
28 | 18 | equemene | |
29 | 18 | equemene | SIZE=256
|
30 | 18 | equemene | |
31 | 18 | equemene | def Metropolis(sigma,J,T,iterations,seed_w,seed_z): |
32 | 18 | equemene | Energy=0
|
33 | 18 | equemene | |
34 | 18 | equemene | global z
|
35 | 18 | equemene | global w
|
36 | 18 | equemene | |
37 | 18 | equemene | z=seed_z |
38 | 18 | equemene | w=seed_w |
39 | 18 | equemene | |
40 | 18 | equemene | for p in range(0,iterations): |
41 | 18 | equemene | # Random access coordonate
|
42 | 18 | equemene | #X,Y=numpy.random.randint(SIZE),numpy.random.randint(SIZE)
|
43 | 18 | equemene | |
44 | 18 | equemene | # def znew():
|
45 | 18 | equemene | # global z
|
46 | 18 | equemene | # z=numpy.uint32(36969*(z&65535)+(z>>16))
|
47 | 18 | equemene | # return(z)
|
48 | 18 | equemene | # def wnew():
|
49 | 18 | equemene | # global w
|
50 | 18 | equemene | # w=numpy.uint32(18000*(w&65535)+(w>>16))
|
51 | 18 | equemene | # return(w)
|
52 | 18 | equemene | # def MWC(): return(numpy.uint32((znew()<<16)+wnew()))
|
53 | 18 | equemene | # def MWCfp(): return((MWC() + 1.0) * 2.328306435454494e-10)
|
54 | 18 | equemene | |
55 | 18 | equemene | def MWC(): |
56 | 18 | equemene | global w
|
57 | 18 | equemene | global z
|
58 | 18 | equemene | z=numpy.uint32(36969*(z&65535)+(z>>16)) |
59 | 18 | equemene | w=numpy.uint32(18000*(w&65535)+(w>>16)) |
60 | 18 | equemene | return(numpy.uint32((z<<16)+w)) |
61 | 18 | equemene | |
62 | 18 | equemene | def MWCfp(): |
63 | 18 | equemene | global w
|
64 | 18 | equemene | global z
|
65 | 18 | equemene | z=numpy.uint32(36969*(z&65535)+(z>>16)) |
66 | 18 | equemene | w=numpy.uint32(18000*(w&65535)+(w>>16)) |
67 | 18 | equemene | return(((numpy.uint32((z<<16)+w))+1.0)* |
68 | 18 | equemene | 2.328306435454494e-10)
|
69 | 18 | equemene | |
70 | 18 | equemene | X=numpy.uint32(SIZE*MWCfp()) |
71 | 18 | equemene | Y=numpy.uint32(SIZE*MWCfp()) |
72 | 18 | equemene | |
73 | 18 | equemene | #print X,Y
|
74 | 18 | equemene | |
75 | 18 | equemene | DeltaE=2.*J*sigma[X,Y]*(sigma[X,(Y+1)%SIZE]+ |
76 | 18 | equemene | sigma[X,(Y-1)%SIZE]+
|
77 | 18 | equemene | sigma[(X-1)%SIZE,Y]+
|
78 | 18 | equemene | sigma[(X+1)%SIZE,Y])
|
79 | 18 | equemene | |
80 | 18 | equemene | if DeltaE < 0. or random() < exp(-DeltaE/T): |
81 | 18 | equemene | sigma[X,Y]=-sigma[X,Y] |
82 | 18 | equemene | Energy+=DeltaE |
83 | 18 | equemene | |
84 | 18 | equemene | return(Energy)
|
85 | 18 | equemene | |
86 | 18 | equemene | if __name__=='__main__': |
87 | 18 | equemene | |
88 | 18 | equemene | J=1.
|
89 | 18 | equemene | T=0.5
|
90 | 18 | equemene | |
91 | 18 | equemene | iterations=numpy.uint32(SIZE*SIZE*SIZE) |
92 | 18 | equemene | |
93 | 18 | equemene | sigma=numpy.where(numpy.random.randn(SIZE,SIZE)>0,1,-1).astype(numpy.int8) |
94 | 18 | equemene | |
95 | 18 | equemene | ImageOutput(sigma,"Ising2D_OpenCL_%i_Initial" % (SIZE))
|
96 | 18 | equemene | |
97 | 18 | equemene | seed_w=numpy.uint32(37)
|
98 | 18 | equemene | seed_z=numpy.uint32(91)
|
99 | 18 | equemene | |
100 | 18 | equemene | i=0
|
101 | 18 | equemene | step=262144
|
102 | 18 | equemene | while (step*i < iterations):
|
103 | 18 | equemene | start=time.time() |
104 | 18 | equemene | Metropolis(sigma,J,T,step,seed_w*(i+1),seed_z*((i+1)%SIZE)) |
105 | 18 | equemene | stop=time.time() |
106 | 18 | equemene | elapsed = (stop-start) |
107 | 18 | equemene | print "Iteration %i in %f: " % (i,elapsed) |
108 | 18 | equemene | ImageOutput(sigma,"Ising2D_OpenCL_%i_%.3i_Final" % (SIZE,i))
|
109 | 18 | equemene | i=i+1
|