catan.f 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. *DECK CATAN
  2. COMPLEX FUNCTION CATAN (Z)
  3. C***BEGIN PROLOGUE CATAN
  4. C***PURPOSE Compute the complex arc tangent.
  5. C***LIBRARY SLATEC (FNLIB)
  6. C***CATEGORY C4A
  7. C***TYPE COMPLEX (CATAN-C)
  8. C***KEYWORDS ARC TANGENT, ELEMENTARY FUNCTIONS, FNLIB, TRIGONOMETRIC
  9. C***AUTHOR Fullerton, W., (LANL)
  10. C***DESCRIPTION
  11. C
  12. C CATAN(Z) calculates the complex trigonometric arc tangent of Z.
  13. C The result is in units of radians, and the real part is in the first
  14. C or fourth quadrant.
  15. C
  16. C***REFERENCES (NONE)
  17. C***ROUTINES CALLED R1MACH, XERMSG
  18. C***REVISION HISTORY (YYMMDD)
  19. C 770801 DATE WRITTEN
  20. C 890531 Changed all specific intrinsics to generic. (WRB)
  21. C 890531 REVISION DATE from Version 3.2
  22. C 891214 Prologue converted to Version 4.0 format. (BAB)
  23. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  24. C 900326 Removed duplicate information from DESCRIPTION section.
  25. C (WRB)
  26. C***END PROLOGUE CATAN
  27. COMPLEX Z, Z2
  28. LOGICAL FIRST
  29. SAVE PI2, NTERMS, SQEPS, RMIN, RMAX, FIRST
  30. DATA PI2 / 1.5707963267 9489661923E0 /
  31. DATA FIRST /.TRUE./
  32. C***FIRST EXECUTABLE STATEMENT CATAN
  33. IF (FIRST) THEN
  34. C NTERMS = LOG(EPS)/LOG(RBND) WHERE RBND = 0.1
  35. NTERMS = -0.4343*LOG(R1MACH(3)) + 1.0
  36. SQEPS = SQRT(R1MACH(4))
  37. RMIN = SQRT (3.0*R1MACH(3))
  38. RMAX = 1.0/R1MACH(3)
  39. ENDIF
  40. FIRST = .FALSE.
  41. C
  42. R = ABS(Z)
  43. IF (R.GT.0.1) GO TO 30
  44. C
  45. CATAN = Z
  46. IF (R.LT.RMIN) RETURN
  47. C
  48. CATAN = (0.0, 0.0)
  49. Z2 = Z*Z
  50. DO 20 I=1,NTERMS
  51. TWOI = 2*(NTERMS-I) + 1
  52. CATAN = 1.0/TWOI - Z2*CATAN
  53. 20 CONTINUE
  54. CATAN = Z*CATAN
  55. RETURN
  56. C
  57. 30 IF (R.GT.RMAX) GO TO 50
  58. X = REAL(Z)
  59. Y = AIMAG(Z)
  60. R2 = R*R
  61. IF (R2 .EQ. 1.0 .AND. X .EQ. 0.0) CALL XERMSG ('SLATEC', 'CATAN',
  62. + 'Z IS +I OR -I', 2, 2)
  63. IF (ABS(R2-1.0).GT.SQEPS) GO TO 40
  64. IF (ABS(CMPLX(1.0, 0.0)+Z*Z) .LT. SQEPS) CALL XERMSG ('SLATEC',
  65. + 'CATAN', 'ANSWER LT HALF PRECISION, Z**2 CLOSE TO -1', 1, 1)
  66. C
  67. 40 XANS = 0.5*ATAN2(2.0*X, 1.0-R2)
  68. YANS = 0.25*LOG((R2+2.0*Y+1.0)/(R2-2.0*Y+1.0))
  69. CATAN = CMPLX (XANS, YANS)
  70. RETURN
  71. C
  72. 50 CATAN = CMPLX (PI2, 0.)
  73. IF (REAL(Z).LT.0.0) CATAN = CMPLX(-PI2,0.0)
  74. RETURN
  75. C
  76. END