File: /nfs/home/0/users/jenkins/mfix.git/model/des/randomno_mod.f
1
2
3
4
5
6
7
8
9
10 MODULE randomno
11
12 USE constant
13
14 IMPLICIT NONE
15
16 PRIVATE
17 PUBLIC :: uni_rno, nor_rno
18
19
20 CONTAINS
21
22
23
24 SUBROUTINE UNI_RNO(Y)
25
26 IMPLICIT NONE
27
28
29
30
31 double precision, intent(out), dimension(:) :: y
32 double precision rmean, variance, sigma
33 integer i, nsize
34
35
36 = size(y(:))
37
38 call init_random_seed
39 call random_number(y)
40
41 rmean = sum(y(:))/nsize
42
43
44
45
46 = 0.0
47 do i = 1, nsize
48
49 = variance + (y(i)-rmean)**2
50 end do
51
52 close(20)
53
54 variance = variance/nsize
55 sigma = sqrt(variance)
56
57
58
59 RETURN
60 END SUBROUTINE UNI_RNO
61
62
63
64
65 SUBROUTINE NOR_RNO(Y, mean, sigma)
66
67
68 IMPLICIT NONE
69
70
71
72
73 double precision, intent(out), dimension(:) :: y
74 double precision mean, sigma
75
76 double precision lmean, lvariance, lsigma
77 double precision x(2), w
78 integer i, nsize, n
79
80 integer, save :: COUNTER = 0
81
82 integer fileunit
83
84 = COUNTER + 1
85 fileunit = 20 + COUNTER
86
87 nsize = size(y(:))
88
89 call init_random_seed
90
91 do i = 1, ceiling(real(nsize/2))
92 do n = 1,100000
93 call random_number(x)
94 x = 2.0 * x - 1.0
95 w = x(1)**2 + x(2)**2
96 if(w.lt.1.0) exit
97 end do
98
99 w = sqrt( (-2.0 * log( w ) ) / w )
100 y(2*i-1) = x(1) * w * sigma + mean
101 if(2*i.lt.nsize) y(2*i) = x(2) * w * sigma + mean
102 end do
103
104 lmean = sum(y(:))/nsize
105
106
107
108
109
110
111
112
113
114
115
116 = 0.0
117 do i = 1, nsize
118
119 = lvariance + (y(i)-lmean)**2
120 end do
121
122
123
124 = lvariance/nsize
125 lsigma = sqrt(lvariance)
126
127
128
129
130 RETURN
131 END SUBROUTINE NOR_RNO
132
133
134
135
136 SUBROUTINE init_random_seed
137
138
139 IMPLICIT NONE
140
141
142
143
144 INTEGER :: isize,idate(8)
145 INTEGER,ALLOCATABLE :: iseed(:)
146
147
148 CALL DATE_AND_TIME(VALUES=idate)
149 CALL RANDOM_SEED(SIZE=isize)
150 ALLOCATE( iseed(isize) )
151 CALL RANDOM_SEED(GET=iseed)
152 iseed = iseed * (idate(8)-500)
153 CALL RANDOM_SEED(PUT=iseed)
154
155 DEALLOCATE( iseed )
156
157 END SUBROUTINE init_random_seed
158
159
160 END MODULE randomno
161
162