##// END OF EJS Templates
fix line 461 y 665
fix line 461 y 665

File last commit:

r1601:3b2826fe0d97
r1791:e4984c469c9f isr
Show More
zeta.f
234 lines | 6.3 KiB | text/x-fortran | FortranFixedLexer
C - RELATE PLASMA Z-FUNCTION TO THE COMPLENETARY ERROR FUNCTION AND USE A
C LIBRARY TO CALCULATE THE COMPLEMENTARY ERROR FUNCTION
complex*16 FUNCTION Zz(ZARG)
IMPLICIT NONE
COMPLEX*16 I,ZARG
REAL*8 XI,YI,U,V,PI
PARAMETER(I=(0.0D0,1.0D0),PI=3.141592653589793d0)
LOGICAL FLAG
c write(*,*)"zeta",zarg
XI=dREAL(ZARG)
YI=diMAG(ZARG)
CALL WOFZ(XI, YI, U, V, FLAG)
Zz=DSQRT(PI)*I*(U+I*V)
RETURN
END
C ALGORITHM 680, COLLECTED ALGORITHMS FROM ACM.
C THIS WORK PUBLISHED IN TRANSACTIONS ON MATHEMATICAL SOFTWARE,
C VOL. 16, NO. 1, PP. 47.
SUBROUTINE WOFZ (XI, YI, U, V, FLAG)
C
C GIVEN A COMPLEX NUMBER Z = (XI,YI), THIS SUBROUTINE COMPUTES
C THE VALUE OF THE FADDEEVA-FUNCTION W(Z) = EXP(-Z**2)*ERFC(-I*Z),
C WHERE ERFC IS THE COMPLEX COMPLEMENTARY ERROR-FUNCTION AND I
C MEANS SQRT(-1).
C THE ACCURACY OF THE ALGORITHM FOR Z IN THE 1ST AND 2ND QUADRANT
C IS 14 SIGNIFICANT DIGITS; IN THE 3RD AND 4TH IT IS 13 SIGNIFICANT
C DIGITS OUTSIDE A CIRCULAR REGION WITH RADIUS 0.126 AROUND A ZERO
C OF THE FUNCTION.
C ALL REAL VARIABLES IN THE PROGRAM ARE DOUBLE PRECISION.
C
C
C THE CODE CONTAINS A FEW COMPILER-DEPENDENT PARAMETERS :
C RMAXREAL = THE MAXIMUM VALUE OF RMAXREAL EQUALS THE ROOT OF
C RMAX = THE LARGEST NUMBER WHICH CAN STILL BE
C IMPLEMENTED ON THE COMPUTER IN DOUBLE PRECISION
C FLOATING-POINT ARITHMETIC
C RMAXEXP = LN(RMAX) - LN(2)
C RMAXGONI = THE LARGEST POSSIBLE ARGUMENT OF A DOUBLE PRECISION
C GONIOMETRIC FUNCTION (DCOS, DSIN, ...)
C THE REASON WHY THESE PARAMETERS ARE NEEDED AS THEY ARE DEFINED WILL
C BE EXPLAINED IN THE CODE BY MEANS OF COMMENTS
C
C
C PARAMETER LIST
C XI = REAL PART OF Z
C YI = IMAGINARY PART OF Z
C U = REAL PART OF W(Z)
C V = IMAGINARY PART OF W(Z)
C FLAG = AN ERROR FLAG INDICATING WHETHER OVERFLOW WILL
C OCCUR OR NOT; TYPE LOGICAL;
C THE VALUES OF THIS VARIABLE HAVE THE FOLLOWING
C MEANING :
C FLAG=.FALSE. : NO ERROR CONDITION
C FLAG=.TRUE. : OVERFLOW WILL OCCUR, THE ROUTINE
C BECOMES INACTIVE
C XI, YI ARE THE INPUT-PARAMETERS
C U, V, FLAG ARE THE OUTPUT-PARAMETERS
C
C FURTHERMORE THE PARAMETER FACTOR EQUALS 2/SQRT(PI)
C
C THE ROUTINE IS NOT UNDERFLOW-PROTECTED BUT ANY VARIABLE CAN BE
C PUT TO 0 UPON UNDERFLOW;
C
C REFERENCE - GPM POPPE, CMJ WIJERS; MORE EFFICIENT COMPUTATION OF
C THE COMPLEX ERROR-FUNCTION, ACM TRANS. MATH. SOFTWARE.
C
*
*
*
*
IMPLICIT DOUBLE PRECISION (A-H, O-Z)
*
LOGICAL A, B, FLAG
PARAMETER (FACTOR = 1.12837916709551257388D0,
* RMAXREAL = 0.5D+154,
* RMAXEXP = 708.503061461606D0,
* RMAXGONI = 3.53711887601422D+15)
*
FLAG = .FALSE.
*
XABS = DABS(XI)
YABS = DABS(YI)
X = XABS/6.3
Y = YABS/4.4
*
C
C THE FOLLOWING IF-STATEMENT PROTECTS
C QRHO = (X**2 + Y**2) AGAINST OVERFLOW
C
IF ((XABS.GT.RMAXREAL).OR.(YABS.GT.RMAXREAL)) GOTO 100
*
QRHO = X**2 + Y**2
*
XABSQ = XABS**2
XQUAD = XABSQ - YABS**2
YQUAD = 2*XABS*YABS
*
A = QRHO.LT.0.085264D0
*
IF (A) THEN
C
C IF (QRHO.LT.0.085264D0) THEN THE FADDEEVA-FUNCTION IS EVALUATED
C USING A POWER-SERIES (ABRAMOWITZ/STEGUN, EQUATION (7.1.5), P.297)
C N IS THE MINIMUM NUMBER OF TERMS NEEDED TO OBTAIN THE REQUIRED
C ACCURACY
C
QRHO = (1-0.85*Y)*DSQRT(QRHO)
N = IDNINT(6 + 72*QRHO)
J = 2*N+1
XSUM = 1.0/J
YSUM = 0.0D0
DO 10 I=N, 1, -1
J = J - 2
XAUX = (XSUM*XQUAD - YSUM*YQUAD)/I
YSUM = (XSUM*YQUAD + YSUM*XQUAD)/I
XSUM = XAUX + 1.0/J
10 CONTINUE
U1 = -FACTOR*(XSUM*YABS + YSUM*XABS) + 1.0
V1 = FACTOR*(XSUM*XABS - YSUM*YABS)
DAUX = DEXP(-XQUAD)
U2 = DAUX*DCOS(YQUAD)
V2 = -DAUX*DSIN(YQUAD)
*
U = U1*U2 - V1*V2
V = U1*V2 + V1*U2
*
ELSE
C
C IF (QRHO.GT.1.O) THEN W(Z) IS EVALUATED USING THE LAPLACE
C CONTINUED FRACTION
C NU IS THE MINIMUM NUMBER OF TERMS NEEDED TO OBTAIN THE REQUIRED
C ACCURACY
C
C IF ((QRHO.GT.0.085264D0).AND.(QRHO.LT.1.0)) THEN W(Z) IS EVALUATED
C BY A TRUNCATED TAYLOR EXPANSION, WHERE THE LAPLACE CONTINUED FRACTION
C IS USED TO CALCULATE THE DERIVATIVES OF W(Z)
C KAPN IS THE MINIMUM NUMBER OF TERMS IN THE TAYLOR EXPANSION NEEDED
C TO OBTAIN THE REQUIRED ACCURACY
C NU IS THE MINIMUM NUMBER OF TERMS OF THE CONTINUED FRACTION NEEDED
C TO CALCULATE THE DERIVATIVES WITH THE REQUIRED ACCURACY
C
*
IF (QRHO.GT.1.0) THEN
H = 0.0D0
KAPN = 0
QRHO = DSQRT(QRHO)
NU = IDINT(3 + (1442/(26*QRHO+77)))
ELSE
QRHO = (1-Y)*DSQRT(1-QRHO)
H = 1.88*QRHO
H2 = 2*H
KAPN = IDNINT(7 + 34*QRHO)
NU = IDNINT(16 + 26*QRHO)
ENDIF
*
B = (H.GT.0.0)
*
IF (B) QLAMBDA = H2**KAPN
*
RX = 0.0
RY = 0.0
SX = 0.0
SY = 0.0
*
DO 11 N=NU, 0, -1
NP1 = N + 1
TX = YABS + H + NP1*RX
TY = XABS - NP1*RY
C = 0.5/(TX**2 + TY**2)
RX = C*TX
RY = C*TY
IF ((B).AND.(N.LE.KAPN)) THEN
TX = QLAMBDA + SX
SX = RX*TX - RY*SY
SY = RY*TX + RX*SY
QLAMBDA = QLAMBDA/H2
ENDIF
11 CONTINUE
*
IF (H.EQ.0.0) THEN
U = FACTOR*RX
V = FACTOR*RY
ELSE
U = FACTOR*SX
V = FACTOR*SY
END IF
*
IF (YABS.EQ.0.0) U = DEXP(-XABS**2)
*
END IF
*
*
C
C EVALUATION OF W(Z) IN THE OTHER QUADRANTS
C
*
IF (YI.LT.0.0) THEN
*
IF (A) THEN
U2 = 2*U2
V2 = 2*V2
ELSE
XQUAD = -XQUAD
*
C
C THE FOLLOWING IF-STATEMENT PROTECTS 2*EXP(-Z**2)
C AGAINST OVERFLOW
C
IF ((YQUAD.GT.RMAXGONI).OR.
* (XQUAD.GT.RMAXEXP)) GOTO 100
*
W1 = 2*DEXP(XQUAD)
U2 = W1*DCOS(YQUAD)
V2 = -W1*DSIN(YQUAD)
END IF
*
U = U2 - U
V = V2 - V
IF (XI.GT.0.0) V = -V
ELSE
IF (XI.LT.0.0) V = -V
END IF
*
RETURN
*
100 FLAG = .TRUE.
RETURN
*
END