123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405 |
- *DECK DRJ
- DOUBLE PRECISION FUNCTION DRJ (X, Y, Z, P, IER)
- C***BEGIN PROLOGUE DRJ
- C***PURPOSE Compute the incomplete or complete (X or Y or Z is zero)
- C elliptic integral of the 3rd kind. For X, Y, and Z non-
- C negative, at most one of them zero, and P positive,
- C RJ(X,Y,Z,P) = Integral from zero to infinity of
- C -1/2 -1/2 -1/2 -1
- C (3/2)(t+X) (t+Y) (t+Z) (t+P) dt.
- C***LIBRARY SLATEC
- C***CATEGORY C14
- C***TYPE DOUBLE PRECISION (RJ-S, DRJ-D)
- C***KEYWORDS COMPLETE ELLIPTIC INTEGRAL, DUPLICATION THEOREM,
- C INCOMPLETE ELLIPTIC INTEGRAL, INTEGRAL OF THE THIRD KIND,
- C TAYLOR SERIES
- C***AUTHOR Carlson, B. C.
- C Ames Laboratory-DOE
- C Iowa State University
- C Ames, IA 50011
- C Notis, E. M.
- C Ames Laboratory-DOE
- C Iowa State University
- C Ames, IA 50011
- C Pexton, R. L.
- C Lawrence Livermore National Laboratory
- C Livermore, CA 94550
- C***DESCRIPTION
- C
- C 1. DRJ
- C Standard FORTRAN function routine
- C Double precision version
- C The routine calculates an approximation result to
- C DRJ(X,Y,Z,P) = Integral from zero to infinity of
- C
- C -1/2 -1/2 -1/2 -1
- C (3/2)(t+X) (t+Y) (t+Z) (t+P) dt,
- C
- C where X, Y, and Z are nonnegative, at most one of them is
- C zero, and P is positive. If X or Y or Z is zero, the
- C integral is COMPLETE. The duplication theorem is iterated
- C until the variables are nearly equal, and the function is
- C then expanded in Taylor series to fifth order.
- C
- C
- C 2. Calling Sequence
- C DRJ( X, Y, Z, P, IER )
- C
- C Parameters on Entry
- C Values assigned by the calling routine
- C
- C X - Double precision, nonnegative variable
- C
- C Y - Double precision, nonnegative variable
- C
- C Z - Double precision, nonnegative variable
- C
- C P - Double precision, positive variable
- C
- C
- C On Return (values assigned by the DRJ routine)
- C
- C DRJ - Double precision approximation to the integral
- C
- C IER - Integer
- C
- C IER = 0 Normal and reliable termination of the
- C routine. It is assumed that the requested
- C accuracy has been achieved.
- C
- C IER > 0 Abnormal termination of the routine
- C
- C
- C X, Y, Z, P are unaltered.
- C
- C
- C 3. Error Messages
- C
- C Value of IER assigned by the DRJ routine
- C
- C Value assigned Error Message printed
- C IER = 1 MIN(X,Y,Z) .LT. 0.0D0
- C = 2 MIN(X+Y,X+Z,Y+Z,P) .LT. LOLIM
- C = 3 MAX(X,Y,Z,P) .GT. UPLIM
- C
- C
- C
- C 4. Control Parameters
- C
- C Values of LOLIM, UPLIM, and ERRTOL are set by the
- C routine.
- C
- C
- C LOLIM and UPLIM determine the valid range of X, Y, Z, and P
- C
- C LOLIM is not less than the cube root of the value
- C of LOLIM used in the routine for DRC.
- C
- C UPLIM is not greater than 0.3 times the cube root of
- C the value of UPLIM used in the routine for DRC.
- C
- C
- C Acceptable values for: LOLIM UPLIM
- C IBM 360/370 SERIES : 2.0D-26 3.0D+24
- C CDC 6000/7000 SERIES : 5.0D-98 3.0D+106
- C UNIVAC 1100 SERIES : 5.0D-103 6.0D+101
- C CRAY : 1.32D-822 1.4D+821
- C VAX 11 SERIES : 2.5D-13 9.0D+11
- C
- C
- C
- C ERRTOL determines the accuracy of the answer
- C
- C the value assigned by the routine will result
- C in solution precision within 1-2 decimals of
- C "machine precision".
- C
- C
- C
- C
- C Relative error due to truncation of the series for DRJ
- C is less than 3 * ERRTOL ** 6 / (1 - ERRTOL) ** 3/2.
- C
- C
- C
- C The accuracy of the computed approximation to the integral
- C can be controlled by choosing the value of ERRTOL.
- C Truncation of a Taylor series after terms of fifth order
- C introduces an error less than the amount shown in the
- C second column of the following table for each value of
- C ERRTOL in the first column. In addition to the truncation
- C error there will be round-off error, but in practice the
- C total error from both sources is usually less than the
- C amount given in the table.
- C
- C
- C
- C Sample choices: ERRTOL Relative truncation
- C error less than
- C 1.0D-3 4.0D-18
- C 3.0D-3 3.0D-15
- C 1.0D-2 4.0D-12
- C 3.0D-2 3.0D-9
- C 1.0D-1 4.0D-6
- C
- C Decreasing ERRTOL by a factor of 10 yields six more
- C decimal digits of accuracy at the expense of one or
- C two more iterations of the duplication theorem.
- C
- C *Long Description:
- C
- C DRJ Special Comments
- C
- C
- C Check by addition theorem: DRJ(X,X+Z,X+W,X+P)
- C + DRJ(Y,Y+Z,Y+W,Y+P) + (A-B) * DRJ(A,B,B,A) + 3.0D0 / SQRT(A)
- C = DRJ(0,Z,W,P), where X,Y,Z,W,P are positive and X * Y
- C = Z * W, A = P * P * (X+Y+Z+W), B = P * (P+X) * (P+Y),
- C and B - A = P * (P-Z) * (P-W). The sum of the third and
- C fourth terms on the left side is 3.0D0 * DRC(A,B).
- C
- C
- C On Input:
- C
- C X, Y, Z, and P are the variables in the integral DRJ(X,Y,Z,P).
- C
- C
- C On Output:
- C
- C
- C X, Y, Z, P are unaltered.
- C
- C ********************************************************
- C
- C WARNING: Changes in the program may improve speed at the
- C expense of robustness.
- C
- C -------------------------------------------------------------------
- C
- C
- C Special double precision functions via DRJ and DRF
- C
- C
- C Legendre form of ELLIPTIC INTEGRAL of 3rd kind
- C -----------------------------------------
- C
- C
- C PHI 2 -1
- C P(PHI,K,N) = INT (1+N SIN (THETA) ) *
- C 0
- C
- C
- C 2 2 -1/2
- C *(1-K SIN (THETA) ) D THETA
- C
- C
- C 2 2 2
- C = SIN (PHI) DRF(COS (PHI), 1-K SIN (PHI),1)
- C
- C 3 2 2 2
- C -(N/3) SIN (PHI) DRJ(COS (PHI),1-K SIN (PHI),
- C
- C 2
- C 1,1+N SIN (PHI))
- C
- C
- C
- C Bulirsch form of ELLIPTIC INTEGRAL of 3rd kind
- C -----------------------------------------
- C
- C
- C 2 2 2
- C EL3(X,KC,P) = X DRF(1,1+KC X ,1+X ) +
- C
- C 3 2 2 2 2
- C +(1/3)(1-P) X DRJ(1,1+KC X ,1+X ,1+PX )
- C
- C
- C 2
- C CEL(KC,P,A,B) = A RF(0,KC ,1) +
- C
- C
- C 2
- C +(1/3)(B-PA) DRJ(0,KC ,1,P)
- C
- C
- C Heuman's LAMBDA function
- C -----------------------------------------
- C
- C
- C 2 2 2 1/2
- C L(A,B,P) =(COS (A)SIN(B)COS(B)/(1-COS (A)SIN (B)) )
- C
- C 2 2 2
- C *(SIN(P) DRF(COS (P),1-SIN (A) SIN (P),1)
- C
- C 2 3 2 2
- C +(SIN (A) SIN (P)/(3(1-COS (A) SIN (B))))
- C
- C 2 2 2
- C *DRJ(COS (P),1-SIN (A) SIN (P),1,1-
- C
- C 2 2 2 2
- C -SIN (A) SIN (P)/(1-COS (A) SIN (B))))
- C
- C
- C
- C (PI/2) LAMBDA0(A,B) =L(A,B,PI/2) =
- C
- C 2 2 2 -1/2
- C = COS (A) SIN(B) COS(B) (1-COS (A) SIN (B))
- C
- C 2 2 2
- C *DRF(0,COS (A),1) + (1/3) SIN (A) COS (A)
- C
- C 2 2 -3/2
- C *SIN(B) COS(B) (1-COS (A) SIN (B))
- C
- C 2 2 2 2 2
- C *DRJ(0,COS (A),1,COS (A) COS (B)/(1-COS (A) SIN (B)))
- C
- C
- C Jacobi ZETA function
- C -----------------------------------------
- C
- C 2 2 2 1/2
- C Z(B,K) = (K/3) SIN(B) COS(B) (1-K SIN (B))
- C
- C
- C 2 2 2 2
- C *DRJ(0,1-K ,1,1-K SIN (B)) / DRF (0,1-K ,1)
- C
- C
- C ---------------------------------------------------------------------
- C
- C***REFERENCES B. C. Carlson and E. M. Notis, Algorithms for incomplete
- C elliptic integrals, ACM Transactions on Mathematical
- C Software 7, 3 (September 1981), pp. 398-403.
- C B. C. Carlson, Computing elliptic integrals by
- C duplication, Numerische Mathematik 33, (1979),
- C pp. 1-16.
- C B. C. Carlson, Elliptic integrals of the first kind,
- C SIAM Journal of Mathematical Analysis 8, (1977),
- C pp. 231-242.
- C***ROUTINES CALLED D1MACH, DRC, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 790801 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 891009 Removed unreferenced statement labels. (WRB)
- C 891009 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 900510 Changed calls to XERMSG to standard form, and some
- C editorial changes. (RWC)).
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE DRJ
- INTEGER IER
- CHARACTER*16 XERN3, XERN4, XERN5, XERN6, XERN7
- DOUBLE PRECISION ALFA, BETA, C1, C2, C3, C4, EA, EB, EC, E2, E3
- DOUBLE PRECISION LOLIM, UPLIM, EPSLON, ERRTOL, D1MACH
- DOUBLE PRECISION LAMDA, MU, P, PN, PNDEV
- DOUBLE PRECISION POWER4, DRC, SIGMA, S1, S2, S3, X, XN, XNDEV
- DOUBLE PRECISION XNROOT, Y, YN, YNDEV, YNROOT, Z, ZN, ZNDEV,
- * ZNROOT
- LOGICAL FIRST
- SAVE ERRTOL,LOLIM,UPLIM,C1,C2,C3,C4,FIRST
- DATA FIRST /.TRUE./
- C
- C***FIRST EXECUTABLE STATEMENT DRJ
- IF (FIRST) THEN
- ERRTOL = (D1MACH(3)/3.0D0)**(1.0D0/6.0D0)
- LOLIM = (5.0D0 * D1MACH(1))**(1.0D0/3.0D0)
- UPLIM = 0.30D0*( D1MACH(2) / 5.0D0)**(1.0D0/3.0D0)
- C
- C1 = 3.0D0/14.0D0
- C2 = 1.0D0/3.0D0
- C3 = 3.0D0/22.0D0
- C4 = 3.0D0/26.0D0
- ENDIF
- FIRST = .FALSE.
- C
- C CALL ERROR HANDLER IF NECESSARY.
- C
- DRJ = 0.0D0
- IF (MIN(X,Y,Z).LT.0.0D0) THEN
- IER = 1
- WRITE (XERN3, '(1PE15.6)') X
- WRITE (XERN4, '(1PE15.6)') Y
- WRITE (XERN5, '(1PE15.6)') Z
- CALL XERMSG ('SLATEC', 'DRJ',
- * 'MIN(X,Y,Z).LT.0 WHERE X = ' // XERN3 // ' Y = ' // XERN4 //
- * ' AND Z = ' // XERN5, 1, 1)
- RETURN
- ENDIF
- C
- IF (MAX(X,Y,Z,P).GT.UPLIM) THEN
- IER = 3
- WRITE (XERN3, '(1PE15.6)') X
- WRITE (XERN4, '(1PE15.6)') Y
- WRITE (XERN5, '(1PE15.6)') Z
- WRITE (XERN6, '(1PE15.6)') P
- WRITE (XERN7, '(1PE15.6)') UPLIM
- CALL XERMSG ('SLATEC', 'DRJ',
- * 'MAX(X,Y,Z,P).GT.UPLIM WHERE X = ' // XERN3 // ' Y = ' //
- * XERN4 // ' Z = ' // XERN5 // ' P = ' // XERN6 //
- * ' AND UPLIM = ' // XERN7, 3, 1)
- RETURN
- ENDIF
- C
- IF (MIN(X+Y,X+Z,Y+Z,P).LT.LOLIM) THEN
- IER = 2
- WRITE (XERN3, '(1PE15.6)') X
- WRITE (XERN4, '(1PE15.6)') Y
- WRITE (XERN5, '(1PE15.6)') Z
- WRITE (XERN6, '(1PE15.6)') P
- WRITE (XERN7, '(1PE15.6)') LOLIM
- CALL XERMSG ('SLATEC', 'RJ',
- * 'MIN(X+Y,X+Z,Y+Z,P).LT.LOLIM WHERE X = ' // XERN3 //
- * ' Y = ' // XERN4 // ' Z = ' // XERN5 // ' P = ' // XERN6 //
- * ' AND LOLIM = ', 2, 1)
- RETURN
- ENDIF
- C
- IER = 0
- XN = X
- YN = Y
- ZN = Z
- PN = P
- SIGMA = 0.0D0
- POWER4 = 1.0D0
- C
- 30 MU = (XN+YN+ZN+PN+PN)*0.20D0
- XNDEV = (MU-XN)/MU
- YNDEV = (MU-YN)/MU
- ZNDEV = (MU-ZN)/MU
- PNDEV = (MU-PN)/MU
- EPSLON = MAX(ABS(XNDEV), ABS(YNDEV), ABS(ZNDEV), ABS(PNDEV))
- IF (EPSLON.LT.ERRTOL) GO TO 40
- XNROOT = SQRT(XN)
- YNROOT = SQRT(YN)
- ZNROOT = SQRT(ZN)
- LAMDA = XNROOT*(YNROOT+ZNROOT) + YNROOT*ZNROOT
- ALFA = PN*(XNROOT+YNROOT+ZNROOT) + XNROOT*YNROOT*ZNROOT
- ALFA = ALFA*ALFA
- BETA = PN*(PN+LAMDA)*(PN+LAMDA)
- SIGMA = SIGMA + POWER4*DRC(ALFA,BETA,IER)
- POWER4 = POWER4*0.250D0
- XN = (XN+LAMDA)*0.250D0
- YN = (YN+LAMDA)*0.250D0
- ZN = (ZN+LAMDA)*0.250D0
- PN = (PN+LAMDA)*0.250D0
- GO TO 30
- C
- 40 EA = XNDEV*(YNDEV+ZNDEV) + YNDEV*ZNDEV
- EB = XNDEV*YNDEV*ZNDEV
- EC = PNDEV*PNDEV
- E2 = EA - 3.0D0*EC
- E3 = EB + 2.0D0*PNDEV*(EA-EC)
- S1 = 1.0D0 + E2*(-C1+0.750D0*C3*E2-1.50D0*C4*E3)
- S2 = EB*(0.50D0*C2+PNDEV*(-C3-C3+PNDEV*C4))
- S3 = PNDEV*EA*(C2-PNDEV*C3) - C2*PNDEV*EC
- DRJ = 3.0D0*SIGMA + POWER4*(S1+S2+S3)/(MU* SQRT(MU))
- RETURN
- END
|