algo-680-erf.f 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. C ALGORITHM 680, COLLECTED ALGORITHMS FROM ACM.
  2. C THIS WORK PUBLISHED IN TRANSACTIONS ON MATHEMATICAL SOFTWARE,
  3. C VOL. 16, NO. 1, PP. 47.
  4. SUBROUTINE WOFZ (XI, YI, U, V, FLAG)
  5. C
  6. C GIVEN A COMPLEX NUMBER Z = (XI,YI), THIS SUBROUTINE COMPUTES
  7. C THE VALUE OF THE FADDEEVA-FUNCTION W(Z) = EXP(-Z**2)*ERFC(-I*Z),
  8. C WHERE ERFC IS THE COMPLEX COMPLEMENTARY ERROR-FUNCTION AND I
  9. C MEANS SQRT(-1).
  10. C THE ACCURACY OF THE ALGORITHM FOR Z IN THE 1ST AND 2ND QUADRANT
  11. C IS 14 SIGNIFICANT DIGITS; IN THE 3RD AND 4TH IT IS 13 SIGNIFICANT
  12. C DIGITS OUTSIDE A CIRCULAR REGION WITH RADIUS 0.126 AROUND A ZERO
  13. C OF THE FUNCTION.
  14. C ALL REAL VARIABLES IN THE PROGRAM ARE DOUBLE PRECISION.
  15. C
  16. C
  17. C THE CODE CONTAINS A FEW COMPILER-DEPENDENT PARAMETERS :
  18. C RMAXREAL = THE MAXIMUM VALUE OF RMAXREAL EQUALS THE ROOT OF
  19. C RMAX = THE LARGEST NUMBER WHICH CAN STILL BE
  20. C IMPLEMENTED ON THE COMPUTER IN DOUBLE PRECISION
  21. C FLOATING-POINT ARITHMETIC
  22. C RMAXEXP = LN(RMAX) - LN(2)
  23. C RMAXGONI = THE LARGEST POSSIBLE ARGUMENT OF A DOUBLE PRECISION
  24. C GONIOMETRIC FUNCTION (DCOS, DSIN, ...)
  25. C THE REASON WHY THESE PARAMETERS ARE NEEDED AS THEY ARE DEFINED WILL
  26. C BE EXPLAINED IN THE CODE BY MEANS OF COMMENTS
  27. C
  28. C
  29. C PARAMETER LIST
  30. C XI = REAL PART OF Z
  31. C YI = IMAGINARY PART OF Z
  32. C U = REAL PART OF W(Z)
  33. C V = IMAGINARY PART OF W(Z)
  34. C FLAG = AN ERROR FLAG INDICATING WHETHER OVERFLOW WILL
  35. C OCCUR OR NOT; TYPE LOGICAL;
  36. C THE VALUES OF THIS VARIABLE HAVE THE FOLLOWING
  37. C MEANING :
  38. C FLAG=.FALSE. : NO ERROR CONDITION
  39. C FLAG=.TRUE. : OVERFLOW WILL OCCUR, THE ROUTINE
  40. C BECOMES INACTIVE
  41. C XI, YI ARE THE INPUT-PARAMETERS
  42. C U, V, FLAG ARE THE OUTPUT-PARAMETERS
  43. C
  44. C FURTHERMORE THE PARAMETER FACTOR EQUALS 2/SQRT(PI)
  45. C
  46. C THE ROUTINE IS NOT UNDERFLOW-PROTECTED BUT ANY VARIABLE CAN BE
  47. C PUT TO 0 UPON UNDERFLOW;
  48. C
  49. C REFERENCE - GPM POPPE, CMJ WIJERS; MORE EFFICIENT COMPUTATION OF
  50. C THE COMPLEX ERROR-FUNCTION, ACM TRANS. MATH. SOFTWARE.
  51. C
  52. *
  53. *
  54. *
  55. *
  56. IMPLICIT DOUBLE PRECISION (A-H, O-Z)
  57. c DOUBLE PRECISION D1MACH, FACTOR, RMAX, RMAXREAL, RMAXEXP
  58. *
  59. LOGICAL A, B, FLAG
  60. c PARAMETER (FACTOR = 1.12837916709551257389615890312154517D0,
  61. c * RMAXREAL = 1.340780792994259D+154,
  62. c * RMAXEXP = 709.0895657128241D0,
  63. c * RMAXGONI = 0.6746518850690209D10)
  64. PARAMETER (FACTOR = 1.12837916709551257389615890312154517D0,
  65. * RMAXREAL = 0.5D+154,
  66. * RMAXEXP = 708.503061461606D0,
  67. * RMAXGONI = 3.53711887601422D+15)
  68. c RMAX = D1MACH(2)
  69. c RMAXREAL = DSQRT(RMAX)
  70. c RMAXEXP = DLOG(RMAX)-DLOG(2D0)
  71. *
  72. FLAG = .FALSE.
  73. *
  74. XABS = DABS(XI)
  75. YABS = DABS(YI)
  76. X = XABS/6.3
  77. Y = YABS/4.4
  78. *
  79. C
  80. C THE FOLLOWING IF-STATEMENT PROTECTS
  81. C QRHO = (X**2 + Y**2) AGAINST OVERFLOW
  82. C
  83. IF ((XABS.GT.RMAXREAL).OR.(YABS.GT.RMAXREAL)) GOTO 100
  84. *
  85. QRHO = X**2 + Y**2
  86. *
  87. XABSQ = XABS**2
  88. XQUAD = XABSQ - YABS**2
  89. YQUAD = 2*XABS*YABS
  90. *
  91. A = QRHO.LT.0.085264D0
  92. *
  93. IF (A) THEN
  94. C
  95. C IF (QRHO.LT.0.085264D0) THEN THE FADDEEVA-FUNCTION IS EVALUATED
  96. C USING A POWER-SERIES (ABRAMOWITZ/STEGUN, EQUATION (7.1.5), P.297)
  97. C N IS THE MINIMUM NUMBER OF TERMS NEEDED TO OBTAIN THE REQUIRED
  98. C ACCURACY
  99. C
  100. QRHO = (1-0.85*Y)*DSQRT(QRHO)
  101. N = IDNINT(6 + 72*QRHO)
  102. J = 2*N+1
  103. XSUM = 1.0/J
  104. YSUM = 0.0D0
  105. DO 10 I=N, 1, -1
  106. J = J - 2
  107. XAUX = (XSUM*XQUAD - YSUM*YQUAD)/I
  108. YSUM = (XSUM*YQUAD + YSUM*XQUAD)/I
  109. XSUM = XAUX + 1.0/J
  110. 10 CONTINUE
  111. U1 = -FACTOR*(XSUM*YABS + YSUM*XABS) + 1.0
  112. V1 = FACTOR*(XSUM*XABS - YSUM*YABS)
  113. DAUX = DEXP(-XQUAD)
  114. U2 = DAUX*DCOS(YQUAD)
  115. V2 = -DAUX*DSIN(YQUAD)
  116. *
  117. U = U1*U2 - V1*V2
  118. V = U1*V2 + V1*U2
  119. *
  120. ELSE
  121. C
  122. C IF (QRHO.GT.1.O) THEN W(Z) IS EVALUATED USING THE LAPLACE
  123. C CONTINUED FRACTION
  124. C NU IS THE MINIMUM NUMBER OF TERMS NEEDED TO OBTAIN THE REQUIRED
  125. C ACCURACY
  126. C
  127. C IF ((QRHO.GT.0.085264D0).AND.(QRHO.LT.1.0)) THEN W(Z) IS EVALUATED
  128. C BY A TRUNCATED TAYLOR EXPANSION, WHERE THE LAPLACE CONTINUED FRACTION
  129. C IS USED TO CALCULATE THE DERIVATIVES OF W(Z)
  130. C KAPN IS THE MINIMUM NUMBER OF TERMS IN THE TAYLOR EXPANSION NEEDED
  131. C TO OBTAIN THE REQUIRED ACCURACY
  132. C NU IS THE MINIMUM NUMBER OF TERMS OF THE CONTINUED FRACTION NEEDED
  133. C TO CALCULATE THE DERIVATIVES WITH THE REQUIRED ACCURACY
  134. C
  135. *
  136. IF (QRHO.GT.1.0) THEN
  137. H = 0.0D0
  138. KAPN = 0
  139. QRHO = DSQRT(QRHO)
  140. NU = IDINT(3 + (1442/(26*QRHO+77)))
  141. ELSE
  142. QRHO = (1-Y)*DSQRT(1-QRHO)
  143. H = 1.88*QRHO
  144. H2 = 2*H
  145. KAPN = IDNINT(7 + 34*QRHO)
  146. NU = IDNINT(16 + 26*QRHO)
  147. ENDIF
  148. *
  149. B = (H.GT.0.0)
  150. *
  151. IF (B) QLAMBDA = H2**KAPN
  152. *
  153. RX = 0.0
  154. RY = 0.0
  155. SX = 0.0
  156. SY = 0.0
  157. *
  158. DO 11 N=NU, 0, -1
  159. NP1 = N + 1
  160. TX = YABS + H + NP1*RX
  161. TY = XABS - NP1*RY
  162. C = 0.5/(TX**2 + TY**2)
  163. RX = C*TX
  164. RY = C*TY
  165. IF ((B).AND.(N.LE.KAPN)) THEN
  166. TX = QLAMBDA + SX
  167. SX = RX*TX - RY*SY
  168. SY = RY*TX + RX*SY
  169. QLAMBDA = QLAMBDA/H2
  170. ENDIF
  171. 11 CONTINUE
  172. *
  173. IF (H.EQ.0.0) THEN
  174. U = FACTOR*RX
  175. V = FACTOR*RY
  176. ELSE
  177. U = FACTOR*SX
  178. V = FACTOR*SY
  179. END IF
  180. *
  181. IF (YABS.EQ.0.0) U = DEXP(-XABS**2)
  182. *
  183. END IF
  184. *
  185. *
  186. C
  187. C EVALUATION OF W(Z) IN THE OTHER QUADRANTS
  188. C
  189. *
  190. IF (YI.LT.0.0) THEN
  191. *
  192. IF (A) THEN
  193. U2 = 2*U2
  194. V2 = 2*V2
  195. ELSE
  196. XQUAD = -XQUAD
  197. *
  198. C
  199. C THE FOLLOWING IF-STATEMENT PROTECTS 2*EXP(-Z**2)
  200. C AGAINST OVERFLOW
  201. C
  202. IF ((YQUAD.GT.RMAXGONI).OR.
  203. * (XQUAD.GT.RMAXEXP)) GOTO 100
  204. *
  205. W1 = 2*DEXP(XQUAD)
  206. U2 = W1*DCOS(YQUAD)
  207. V2 = -W1*DSIN(YQUAD)
  208. END IF
  209. *
  210. U = U2 - U
  211. V = V2 - V
  212. IF (XI.GT.0.0) V = -V
  213. ELSE
  214. IF (XI.LT.0.0) V = -V
  215. END IF
  216. *
  217. RETURN
  218. *
  219. 100 FLAG = .TRUE.
  220. RETURN
  221. *
  222. END