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

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

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


Revision 1.7 - (show annotations) (download)
Tue Dec 8 21:50:35 2009 UTC (14 years, 5 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint62v, checkpoint62u, checkpoint62t, checkpoint62c, checkpoint62s, checkpoint62r, checkpoint62q, checkpoint62p, checkpoint62a, checkpoint62g, checkpoint62f, checkpoint62e, checkpoint62d, checkpoint62k, checkpoint62j, checkpoint62i, checkpoint62h, checkpoint62o, checkpoint62n, checkpoint62m, checkpoint62l, checkpoint62w, checkpoint62z, checkpoint62y, checkpoint62x, checkpoint63g, checkpoint64, checkpoint62, checkpoint63, checkpoint63p, checkpoint63q, checkpoint63r, checkpoint63s, checkpoint63l, checkpoint63m, checkpoint63n, checkpoint63o, checkpoint63h, checkpoint63i, checkpoint63j, checkpoint63k, checkpoint63d, checkpoint63e, checkpoint63f, checkpoint63a, checkpoint63b, checkpoint63c, checkpoint62b, checkpoint64i, checkpoint64h, checkpoint64k, checkpoint64j, checkpoint64l, checkpoint64a, checkpoint64c, checkpoint64b, checkpoint64e, checkpoint64d, checkpoint64g, checkpoint64f
Changes since 1.6: +81 -63 lines
remove unused variables

1 C $Header: /u/gcmpack/MITgcm/model/src/port_rand.F,v 1.6 2005/03/01 16:51:27 jmc Exp $
2 C $Name: $
3
4 #undef _USE_INTEGERS
5
6 C-- File port_rand.F: Portable random number generator functions
7 C-- Contents
8 C-- o PORT_RAND
9 C-- o PORT_RANARR
10 C-- o PORT_RAND_NORM
11
12 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
13 CBOP
14 C !ROUTINE: PORT_RAND
15 C !INTERFACE:
16 real*8 FUNCTION PORT_RAND(seed)
17
18 C !DESCRIPTION:
19 C Portable random number generator
20 C seed >=0 :: initialise using this seed ; and return 0
21 C seed < 0 :: if first call then initialise using the default seed (=mseed)
22 C and always return a random number
23
24 C !USES:
25 IMPLICIT NONE
26
27 C !INPUT PARAMETERS:
28 #ifdef _USE_INTEGERS
29 INTEGER seed
30 #else
31 real*8 seed
32 #endif
33 CEOP
34
35 C !LOCAL VARIABLES:
36 INTEGER nff,idum
37 PARAMETER(nff=55)
38 PARAMETER(idum=-2)
39 real*8 fac
40 #ifdef _USE_INTEGERS
41 INTEGER mbig,mseed,mZ
42 PARAMETER (mbig=1000000000,mz=0,fac=1.d0/mbig)
43 INTEGER mj,mk,ma(nff)
44 DATA mseed/161803398/
45 #else
46 real*8 mbig,mseed,mz
47 PARAMETER (mbig=4000000.,mz=0.,fac=1.d0/mbig)
48 real*8 mj,mk,ma(nff)
49 DATA mseed/1618033./
50 #endif
51 LOGICAL firstCall
52 INTEGER i,ii,inext,inextp,k
53 DATA firstCall /.true./
54 SAVE firstCall,inext,inextp,ma
55
56 C- Initialise the random number generator
57 IF (firstCall .OR. seed.GE.mz) THEN
58 IF (seed.GE.mz) mseed = seed
59 firstCall=.false.
60 mj=mseed-iabs(idum)
61 mj=mod(mj,mbig)
62 ma(nff)=mj
63 mk=1
64 DO i=1,nff-1
65 ii=mod(21*i,nff)
66 ma(ii)=mk
67 mk=mj-mk
68 IF (mk.LT.mz) mk=mk+mbig
69 mj=ma(ii)
70 ENDDO
71 DO k=1,4
72 DO i=1,nff
73 ma(i)=ma(i)-ma(1+mod(i+30,nff))
74 IF (ma(i).LT.mz) ma(i)=ma(i)+mbig
75 ENDDO
76 ENDDO
77 inext=0
78 inextp=31
79 ENDIF
80
81 C- Compute a random number (only if seed < 0)
82 IF (seed.GE.mz) THEN
83 port_rand=0.d0
84 ELSE
85 inext=mod(inext,nff)+1
86 inextp=mod(inextp,nff)+1
87 mj=ma(inext)-ma(inextp)
88 IF (mj.LT.mz) mj=mj+mbig
89 ma(inext)=mj
90 port_rand=mj*fac
91 ENDIF
92
93 RETURN
94 END
95
96 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
97
98 CBOP
99 C !ROUTINE: PORT_RANARR
100 C !INTERFACE:
101 SUBROUTINE PORT_RANARR(n,arr)
102
103 C !DESCRIPTION:
104 C Portable random number array generator
105
106 C !USES:
107 IMPLICIT NONE
108
109 C !INPUT PARAMETERS:
110 INTEGER n
111 real*8 arr(n)
112 CEOP
113
114 C !LOCAL VARIABLES:
115 INTEGER i
116 real*8 port_rand
117 #ifdef _USE_INTEGERS
118 INTEGER seed
119 seed=-1
120 #else
121 real*8 seed
122 seed=-1.d0
123 #endif
124 c seed=1618033.0d0
125 DO i=1,n
126 arr(i)=port_rand(seed)
127 ENDDO
128
129 RETURN
130 END
131
132 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
133 CBOP
134 C !ROUTINE: PORT_RAND_NORM
135 C !INTERFACE:
136 real*8 FUNCTION PORT_RAND_NORM()
137
138 C !DESCRIPTION:
139 C This function generates a normally distributed random number with
140 C the so called polar algorithm. The algorithm actually generates 2
141 C numbers, but only 1 is returned for maximum compatibility with old
142 C code. The most obvious way to improve this function would be to
143 C make sure that the second number is not wasted.
144
145 C Changed: 2004.09.06 antti.westerlund@fimr.fi
146
147 C !USES:
148 IMPLICIT NONE
149 CEOP
150
151 C !LOCAL VARIABLES:
152 real*8 port_rand
153 real*8 x1, x2, xs, t
154
155 #ifdef _USE_INTEGERS
156 INTEGER seed
157 seed=-1
158 #else
159 real*8 seed
160 seed=-1.d0
161 #endif
162 c seed=1618033.0d0
163
164 C first generate 2 equally distributed random numbers (-1,1)
165 DO WHILE (1 .EQ. 1)
166 x1=2.0*port_rand(seed)-1.0
167 x2=2.0*port_rand(seed)-1.0
168 xs=x1**2+x2**2
169 IF (xs .LT. 1.0 .AND. xs .NE. 0.0) THEN
170 GOTO 100
171 ENDIF
172 ENDDO
173 100 CONTINUE
174
175 t = SQRT(-2.0*LOG(xs)/xs)
176 port_rand_norm = t*x1
177 C
178 C also t*x2 would be a gaussian random number and could be returned
179
180 RETURN
181 END

  ViewVC Help
Powered by ViewVC 1.1.22