/[MITgcm]/MITgcm/model/src/port_rand.F
ViewVC logotype

Diff of /MITgcm/model/src/port_rand.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph | View Patch Patch

revision 1.5 by edhill, Tue Sep 7 15:16:58 2004 UTC revision 1.6 by jmc, Tue Mar 1 16:51:27 2005 UTC
# Line 13  C     !INTERFACE: Line 13  C     !INTERFACE:
13    
14  C     !DESCRIPTION:  C     !DESCRIPTION:
15  C     Portable random number generator  C     Portable random number generator
16    C      seed >=0 :: initialise using this seed ; and return 0
17    C      seed < 0 :: if first call then initialise using the default seed (=mseed)
18    C                  and always return a random number
19                
20  C     !USES:  C     !USES:
21        implicit none        implicit none
22    C     !INPUT PARAMETERS:
23    #ifdef _USE_INTEGERS
24          integer seed
25    #else
26          real*8  seed
27    #endif
28  CEOP  CEOP
29    
30  C     !LOCAL VARIABLES:  C     !LOCAL VARIABLES:
31        integer nff        integer nff,idum
32        parameter(nff=55)        parameter(nff=55)
 #ifdef _USE_INTEGERS  
       integer mbig,mseed,mZ,seed  
 #else  
       real*8 mbig,mseed,mz,seed  
 #endif  
       real*8 fac  
 #ifdef _USE_INTEGERS  
       parameter (mbig=1000000000,mz=0,fac=1./mbig)  
       data mseed/161803398/  
 #else  
       parameter (mbig=4000000.,mz=0.,fac=1./mbig)  
       data mseed/1618033./  
 #endif  
       integer i,ii,inext,inextp,k,idum  
33        parameter(idum=-2)        parameter(idum=-2)
34          real*8 fac
35  #ifdef _USE_INTEGERS  #ifdef _USE_INTEGERS
36          integer mbig,mseed,mZ
37          parameter (mbig=1000000000,mz=0,fac=1.d0/mbig)
38        integer mj,mk,ma(nff)        integer mj,mk,ma(nff)
39          data mseed/161803398/
40  #else  #else
41          real*8 mbig,mseed,mz
42          parameter (mbig=4000000.,mz=0.,fac=1.d0/mbig)
43        real*8 mj,mk,ma(nff)        real*8 mj,mk,ma(nff)
44          data mseed/1618033./
45  #endif  #endif
46        logical firstCall        logical firstCall
47        save firstCall,inext,inextp,ma        integer i,ii,inext,inextp,k
48        data firstCall /.true./        data firstCall /.true./
49          save firstCall,inext,inextp,ma
50    
51        mseed = seed  C-    Initialise the random number generator
52        if(firstCall)then        if(firstCall .OR. seed.GE.mz)then
53            if (seed.GE.mz) mseed = seed
54          firstCall=.false.          firstCall=.false.
55          mj=mseed-iabs(idum)          mj=mseed-iabs(idum)
56          mj=mod(mj,mbig)          mj=mod(mj,mbig)
# Line 62  C     !LOCAL VARIABLES: Line 66  C     !LOCAL VARIABLES:
66          do k=1,4          do k=1,4
67            do i=1,nff            do i=1,nff
68              ma(i)=ma(i)-ma(1+mod(i+30,nff))              ma(i)=ma(i)-ma(1+mod(i+30,nff))
69              if(ma(i).lt.MZ)ma(i)=ma(i)+mbig              if(ma(i).lt.mz)ma(i)=ma(i)+mbig
70            enddo            enddo
71          enddo          enddo
72          inext=0          inext=0
73          inextp=31          inextp=31
74        endif        endif
       inext=mod(inext,nff)+1  
       inextp=mod(inextp,nff)+1  
       mj=ma(inext)-ma(inextp)  
       if(mj.lt.MZ)mj=mj+mbig  
       ma(inext)=mj  
       port_rand=mj*fac  
       return  
75    
76    C-    Compute a random number (only if seed < 0)
77          if(seed.GE.mz)then
78            port_rand=0.d0
79          else
80            inext=mod(inext,nff)+1
81            inextp=mod(inextp,nff)+1
82            mj=ma(inext)-ma(inextp)
83            if(mj.lt.mz)mj=mj+mbig
84            ma(inext)=mj
85            port_rand=mj*fac
86          endif
87    
88          return
89        end        end
90    
91  C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|  C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
# Line 84  C---+----1----+----2----+----3----+----4 Line 94  C---+----1----+----2----+----3----+----4
94        implicit none        implicit none
95        integer n,i        integer n,i
96        real arr(n)        real arr(n)
97        real*8 port_rand,seed        real*8 port_rand
98        seed=1618033.0d0  #ifdef _USE_INTEGERS
99          integer seed
100          seed=-1
101    #else
102          real*8  seed
103          seed=-1.d0
104    #endif
105    c     seed=1618033.0d0
106        do i=1,n        do i=1,n
107         arr(i)=port_rand(seed)         arr(i)=port_rand(seed)
108        enddo        enddo
# Line 113  C     !USES: Line 130  C     !USES:
130  CEOP  CEOP
131    
132  C     !LOCAL VARIABLES:  C     !LOCAL VARIABLES:
133        real*8 port_rand,seed        real*8 port_rand
134        real*8 x1, x2, xs, t                  real*8 x1, x2, xs, t          
135        integer i        integer i
136    
137        seed=1618033.0d0  #ifdef _USE_INTEGERS
138          integer seed
139          seed=-1
140    #else
141          real*8  seed
142          seed=-1.d0
143    #endif
144    c     seed=1618033.0d0
145    
146  C     first generate 2 equally distributed random numbers (-1,1)  C     first generate 2 equally distributed random numbers (-1,1)
147        DO WHILE (1 .eq. 1)        DO WHILE (1 .eq. 1)
148           x1=2.0*port_rand(seed)-1.0           x1=2.0*port_rand(seed)-1.0

Legend:
Removed from v.1.5  
changed lines
  Added in v.1.6

  ViewVC Help
Powered by ViewVC 1.1.22