File indexing completed on 2024-12-17 18:34:01 UTC
view on githubraw file Latest commit 8fbfd1f3 on 2018-02-26 18:39:21 UTC
8fbfd1f382 Oliv*0001 #include "DARWIN_OPTIONS.h"
0002
0003
0004
0005
0006
0007
0008 SUBROUTINE DARWIN_RANDOM_INIT(seed, myThid)
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 IMPLICIT NONE
0021 #include "EEPARAMS.h"
0022
0023
0024
0025
0026 INTEGER seed
0027 INTEGER myThid
0028
0029
0030 #ifdef ALLOW_DARWIN
0031
0032
0033 real*8 port_rand
0034 external port_rand
0035
0036
0037
0038 CHARACTER*(MAX_LEN_MBUF) msgBuf
0039 _RL RandNo
0040 REAL*8 Dseed
0041 CHARACTER*16 random_name
0042
0043 IF (myThid .GT. 1) THEN
0044 CALL PRINT_ERROR('DARWIN_RANDOM_INIT: threading no supported',
0045 & myThid)
0046 STOP 'ABNORMAL END: S/R DARWIN_RANDOM_INIT'
0047 END IF
0048
0049 IF (seed .LE. 0) THEN
0050 CALL PRINT_ERROR('DARWIN_RANDOM_INIT: seed must be positive'
0051 & , myThid)
0052 END IF
0053
0054 Dseed = float(seed)
0055 RandNo = port_rand(Dseed)
0056
0057 Dseed = -1.D0
0058 RandNo = port_rand(Dseed)
0059 random_name = 'port_rand'
0060
0061 WRITE(msgbuf,'(A,A,I10,X,F20.16)')
0062 & 'DARWIN_RANDOM_INIT: ', random_name, seed, RandNo
0063 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0064 & SQUEEZE_RIGHT , myThid)
0065
0066 #endif
0067
0068 RETURN
0069 END
0070
0071
0072
0073
0074
0075
0076 FUNCTION DARWIN_RANDOM(myThid)
0077
0078
0079
0080
0081
0082 IMPLICIT NONE
0083 #include "EEPARAMS.h"
0084
0085
0086
0087
0088 _RL DARWIN_RANDOM
0089 INTEGER myThid
0090
0091
0092 #ifdef ALLOW_DARWIN
0093
0094
0095 real*8 port_rand
0096 external port_rand
0097
0098
0099 real*8 Dseed
0100
0101 IF (myThid .GT. 1) THEN
0102 CALL PRINT_ERROR('DARWIN_RANDOM: threading no supported',
0103 & myThid)
0104 STOP 'ABNORMAL END: S/R DARWIN_RANDOM'
0105 END IF
0106
0107 Dseed = -1.d0
0108 darwin_random = port_rand(Dseed)
0109
0110 #endif
0111
0112 RETURN
0113 END
0114
0115
0116
0117
0118
0119
0120 FUNCTION DARWIN_RANDOM_NORMAL(myThid)
0121
0122
0123
0124
0125
0126
0127 IMPLICIT NONE
0128 #include "EEPARAMS.h"
0129
0130
0131
0132
0133 _RL DARWIN_RANDOM_NORMAL
0134 INTEGER myThid
0135
0136
0137 #ifdef ALLOW_DARWIN
0138
0139
0140 real*8 port_rand_norm
0141 external port_rand_norm
0142
0143
0144
0145 IF (myThid .GT. 1) THEN
0146 CALL PRINT_ERROR('DARWIN_RANDOM: threading no supported',
0147 & myThid)
0148 STOP 'ABNORMAL END: S/R DARWIN_RANDOM'
0149 END IF
0150
0151 darwin_random_normal = port_rand_norm()
0152
0153 #endif
0154
0155 RETURN
0156 END
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166 SUBROUTINE DARWIN_INVNORMAL(y,p,mean,sigma)
0167 implicit none
0168
0169
0170 real*8 mean
0171 real*8 sigma
0172 real*8 q
0173 real*8 r
0174 real*8 x
0175 real*8 p
0176 real*8 plow
0177 real*8 phigh
0178 real*8 y
0179 real*8 a(6)
0180 real*8 b(5)
0181 real*8 c(6)
0182 real*8 d(4)
0183
0184
0185
0186
0187 a(1) = -3.969683028665376d+01
0188 a(2) = 2.209460984245205d+02
0189 a(3) = -2.759285104469687d+02
0190 a(4) = 1.383577518672690d+02
0191 a(5) = -3.066479806614716d+01
0192 a(6) = 2.506628277459239d+00
0193
0194 b(1) = -5.447609879822406d+01
0195 b(2) = 1.615858368580409d+02
0196 b(3) = -1.556989798598866d+02
0197 b(4) = 6.680131188771972d+01
0198 b(5) = -1.328068155288572d+01
0199
0200 c(1) = -7.784894002430293d-03
0201 c(2) = -3.223964580411365d-01
0202 c(3) = -2.400758277161838d+00
0203 c(4) = -2.549732539343734d+00
0204 c(5) = 4.374664141464968d+00
0205 c(6) = 2.938163982698783d+00
0206
0207 d(1) = 7.784695709041462d-03
0208 d(2) = 3.224671290700398d-01
0209 d(3) = 2.445134137142996d+00
0210 d(4) = 3.754408661907416d+00
0211
0212
0213
0214 plow = 0.02425d0
0215 phigh = 1.d0 - plow
0216
0217
0218
0219 if ((0.d0 .lt. p) .and. (p .lt. plow))then
0220 q = sqrt(-2.0d0*log(p))
0221 x = (((((c(1)*q+c(2))*q+c(3))*q+c(4))*q+c(5))*q+c(6)) /
0222 & ((((d(1)*q+d(2))*q+d(3))*q+d(4))*q+1.d0)
0223 endif
0224
0225
0226
0227 if ((plow .le. p).and.(p .le. phigh))then
0228 q = p - 0.5d0
0229 r = q*q
0230 x = (((((a(1)*r+a(2))*r+a(3))*r+a(4))*r+a(5))*r+a(6))*q /
0231 & (((((b(1)*r+b(2))*r+b(3))*r+b(4))*r+b(5))*r+1.d0)
0232 endif
0233
0234
0235
0236 if ((phigh .lt. p).and.(p .lt. 1.d0))then
0237 q = sqrt(-2.0d0*log(1.d0-p))
0238 x = -(((((c(1)*q+c(2))*q+c(3))*q+c(4))*q+c(5))*q+c(6)) /
0239 & ((((d(1)*q+d(2))*q+d(3))*q+d(4))*q+1.d0)
0240 endif
0241
0242
0243
0244 y = sigma*sqrt(2.0d0)*x + mean
0245
0246
0247
0248
0249 RETURN
0250 END