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