Statistiques
| Révision :

root / Ising / Serial / Ising2D-MWC.py @ 96

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