1*DECK CLNGAM
2      COMPLEX FUNCTION CLNGAM (ZIN)
3C***BEGIN PROLOGUE  CLNGAM
4C***PURPOSE  Compute the logarithm of the absolute value of the Gamma
5C            function.
6C***LIBRARY   SLATEC (FNLIB)
7C***CATEGORY  C7A
8C***TYPE      COMPLEX (ALNGAM-S, DLNGAM-D, CLNGAM-C)
9C***KEYWORDS  ABSOLUTE VALUE, COMPLETE GAMMA FUNCTION, FNLIB, LOGARITHM,
10C             SPECIAL FUNCTIONS
11C***AUTHOR  Fullerton, W., (LANL)
12C***DESCRIPTION
13C
14C CLNGAM computes the natural log of the complex valued gamma function
15C at ZIN, where ZIN is a complex number.  This is a preliminary version,
16C which is not accurate.
17C
18C***REFERENCES  (NONE)
19C***ROUTINES CALLED  C9LGMC, CARG, CLNREL, R1MACH, XERMSG
20C***REVISION HISTORY  (YYMMDD)
21C   780401  DATE WRITTEN
22C   890531  Changed all specific intrinsics to generic.  (WRB)
23C   890531  REVISION DATE from Version 3.2
24C   891214  Prologue converted to Version 4.0 format.  (BAB)
25C   900315  CALLs to XERROR changed to CALLs to XERMSG.  (THJ)
26C***END PROLOGUE  CLNGAM
27      COMPLEX ZIN, Z, CORR, CLNREL, C9LGMC
28      LOGICAL FIRST
29      SAVE PI, SQ2PIL, BOUND, DXREL, FIRST
30      DATA PI / 3.1415926535 8979324E0 /
31      DATA SQ2PIL / 0.9189385332 0467274E0 /
32      DATA FIRST /.TRUE./
33C***FIRST EXECUTABLE STATEMENT  CLNGAM
34      IF (FIRST) THEN
35         N = -0.30*LOG(R1MACH(3))
36C BOUND = N*(0.1*EPS)**(-1/(2*N-1))/(PI*EXP(1))
37         BOUND = 0.1171*N*(0.1*R1MACH(3))**(-1./(2*N-1))
38         DXREL = SQRT (R1MACH(4))
39      ENDIF
40      FIRST = .FALSE.
41C
42      Z = ZIN
43      X = REAL(ZIN)
44      Y = AIMAG(ZIN)
45C
46      CORR = (0.0, 0.0)
47      CABSZ = ABS(Z)
48      IF (X.GE.0.0 .AND. CABSZ.GT.BOUND) GO TO 50
49      IF (X.LT.0.0 .AND. ABS(Y).GT.BOUND) GO TO 50
50C
51      IF (CABSZ.LT.BOUND) GO TO 20
52C
53C USE THE REFLECTION FORMULA FOR REAL(Z) NEGATIVE, ABS(Z) LARGE, AND
54C ABS(AIMAG(Y)) SMALL.
55C
56      IF (Y.GT.0.0) Z = CONJG (Z)
57      CORR = EXP (-CMPLX(0.0,2.0*PI)*Z)
58      IF (REAL(CORR) .EQ. 1.0 .AND. AIMAG(CORR) .EQ. 0.0) CALL XERMSG
59     +   ('SLATEC', 'CLNGAM', 'Z IS A NEGATIVE INTEGER', 3, 2)
60C
61      CLNGAM = SQ2PIL + 1.0 - CMPLX(0.0,PI)*(Z-0.5) - CLNREL(-CORR)
62     1  + (Z-0.5)*LOG(1.0-Z) - Z - C9LGMC(1.0-Z)
63      IF (Y.GT.0.0) CLNGAM = CONJG (CLNGAM)
64      RETURN
65C
66C USE THE RECURSION RELATION FOR ABS(Z) SMALL.
67C
68 20   IF (X.GE.(-0.5) .OR. ABS(Y).GT.DXREL) GO TO 30
69      IF (ABS((Z-AINT(X-0.5))/X) .LT. DXREL) CALL XERMSG ('SLATEC',
70     +   'CLNGAM',
71     +   'ANSWER LT HALF PRECISION BECAUSE Z TOO NEAR NEGATIVE INTEGER',
72     +   1, 1)
73C
74 30   N = SQRT (BOUND**2 - Y**2) - X + 1.0
75      ARGSUM = 0.0
76      CORR = (1.0, 0.0)
77      DO 40 I=1,N
78        ARGSUM = ARGSUM + CARG(Z)
79        CORR = Z*CORR
80        Z = 1.0 + Z
81 40   CONTINUE
82C
83      IF (REAL(CORR) .EQ. 0.0 .AND. AIMAG(CORR) .EQ. 0.0) CALL XERMSG
84     +   ('SLATEC', 'CLNGAM', 'Z IS A NEGATIVE INTEGER', 3, 2)
85      CORR = -CMPLX (LOG(ABS(CORR)), ARGSUM)
86C
87C USE STIRLING-S APPROXIMATION FOR LARGE Z.
88C
89 50   CLNGAM = SQ2PIL + (Z-0.5)*LOG(Z) - Z + CORR + C9LGMC(Z)
90      RETURN
91C
92      END
93