0001
0002
0003
0004 SUBROUTINE WOFZ (XI, YI, U, V, FLAG)
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052 *
0053 *
0054 *
0055 *
0056 IMPLICIT DOUBLE PRECISION (A-H, O-Z)
0057 *
0058 LOGICAL A, B, FLAG
0059 PARAMETER (FACTOR = 1.12837916709551257388D0,
0060 * RMAXREAL = 0.5D+154,
0061 * RMAXEXP = 708.503061461606D0,
0062 * RMAXGONI = 3.53711887601422D+15)
0063 *
0064 FLAG = .FALSE.
0065 *
0066 XABS = DABS(XI)
0067 YABS = DABS(YI)
0068 X = XABS/6.3
0069 Y = YABS/4.4
0070 *
0071
0072
0073
0074
0075 IF ((XABS.GT.RMAXREAL).OR.(YABS.GT.RMAXREAL)) GOTO 100
0076 *
0077 QRHO = X**2 + Y**2
0078 *
0079 XABSQ = XABS**2
0080 XQUAD = XABSQ - YABS**2
0081 YQUAD = 2*XABS*YABS
0082 *
0083 A = QRHO.LT.0.085264D0
0084 *
0085 IF (A) THEN
0086
0087
0088
0089
0090
0091
0092 QRHO = (1-0.85*Y)*DSQRT(QRHO)
0093 N = IDNINT(6 + 72*QRHO)
0094 J = 2*N+1
0095 XSUM = 1.0D0/J
0096 YSUM = 0.0D0
0097 DO 10 I=N, 1, -1
0098 J = J - 2
0099 XAUX = (XSUM*XQUAD - YSUM*YQUAD)/I
0100 YSUM = (XSUM*YQUAD + YSUM*XQUAD)/I
0101 XSUM = XAUX + 1.0D0/J
0102 10 CONTINUE
0103 U1 = -FACTOR*(XSUM*YABS + YSUM*XABS) + 1.0D0
0104 V1 = FACTOR*(XSUM*XABS - YSUM*YABS)
0105 DAUX = DEXP(-XQUAD)
0106 U2 = DAUX*DCOS(YQUAD)
0107 V2 = -DAUX*DSIN(YQUAD)
0108 *
0109 U = U1*U2 - V1*V2
0110 V = U1*V2 + V1*U2
0111 *
0112 ELSE
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127 *
0128 IF (QRHO.GT.1.0) THEN
0129 H = 0.0D0
0130 KAPN = 0
0131 QRHO = DSQRT(QRHO)
0132 NU = IDINT(3 + (1442/(26*QRHO+77)))
0133 ELSE
0134 QRHO = (1-Y)*DSQRT(1-QRHO)
0135 H = 1.88*QRHO
0136 H2 = 2*H
0137 KAPN = IDNINT(7 + 34*QRHO)
0138 NU = IDNINT(16 + 26*QRHO)
0139 ENDIF
0140 *
0141 B = (H.GT.0.0)
0142 *
0143 IF (B) QLAMBDA = H2**KAPN
0144 *
0145 RX = 0.0
0146 RY = 0.0
0147 SX = 0.0
0148 SY = 0.0
0149 *
0150 DO 11 N=NU, 0, -1
0151 NP1 = N + 1
0152 TX = YABS + H + NP1*RX
0153 TY = XABS - NP1*RY
0154 C = 0.5/(TX**2 + TY**2)
0155 RX = C*TX
0156 RY = C*TY
0157 IF ((B).AND.(N.LE.KAPN)) THEN
0158 TX = QLAMBDA + SX
0159 SX = RX*TX - RY*SY
0160 SY = RY*TX + RX*SY
0161 QLAMBDA = QLAMBDA/H2
0162 ENDIF
0163 11 CONTINUE
0164 *
0165 IF (H.EQ.0.0) THEN
0166 U = FACTOR*RX
0167 V = FACTOR*RY
0168 ELSE
0169 U = FACTOR*SX
0170 V = FACTOR*SY
0171 END IF
0172 *
0173 IF (YABS.EQ.0.0) U = DEXP(-XABS**2)
0174 *
0175 END IF
0176 *
0177 *
0178
0179
0180
0181 *
0182 IF (YI.LT.0.0) THEN
0183 *
0184 IF (A) THEN
0185 U2 = 2*U2
0186 V2 = 2*V2
0187 ELSE
0188 XQUAD = -XQUAD
0189 *
0190
0191
0192
0193
0194 IF ((YQUAD.GT.RMAXGONI).OR.
0195 * (XQUAD.GT.RMAXEXP)) GOTO 100
0196 *
0197 W1 = 2*DEXP(XQUAD)
0198 U2 = W1*DCOS(YQUAD)
0199 V2 = -W1*DSIN(YQUAD)
0200 END IF
0201 *
0202 U = U2 - U
0203 V = V2 - V
0204 IF (XI.GT.0.0) V = -V
0205 ELSE
0206 IF (XI.LT.0.0) V = -V
0207 END IF
0208 *
0209 RETURN
0210 *
0211 100 FLAG = .TRUE.
0212 RETURN
0213 *
0214 END