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