C ACM ALGORITHM 577 C C ALGORITHMS FOR INCOMPLETE ELLIPTIC INTEGRALS C C BY B.C. CARLSON AND E.M. NOTIS C C ACM TRANSACTIONS ON MATHEMATICAL SOFTWARE, SEPTEMBER, 1981. C C C THIS FILE CONTAINS FOUR SUBROUTINES FOR COMPUTING INCOMPLETE C ELLIPTIC INTEGRALS, FOLLOWED BY SIX DRIVERS FOR TESTING THE C SUBROUTINES. EACH SUBROUTINE AND EACH DRIVER IS PRECEDED BY C A COMMENT CARD WITH A LINE OF DOLLAR SIGNS, AND EACH DRIVER IS C FOLLOWED BY ITS INPUT DATA IF ANY. THE FOUR SUBROUTINES HAVE C THE NAMES RC, RF, RD, RJ IN THAT ORDER. THE DRIVERS HAVE NO C NAMES BUT BEGIN WITH DESCRIPTIVE COMMENTS. THE FIRST FOUR C DRIVERS TEST RC, RF, RD, RJ IN THAT ORDER. THE FIFTH DRIVER C TESTS RC AGAINST LIBRARY ROUTINES. THE SIXTH DRIVER TESTS RF C AGAINST THE FUNPACK SUBROUTINE DELIKM. C C C $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ C C C ******************************************************** C DOUBLE PRECISION FUNCTION RC(X,Y,ERRTOL,IERR) C C THIS FUNCTION SUBROUTINE COMPUTES THE ELEMENTARY INTEGRAL C RC(X,Y) = INTEGRAL FROM ZERO TO INFINITY OF C C -1/2 -1 C (1/2)(T+X) (T+Y) DT, C C WHERE X IS NONNEGATIVE AND Y IS POSITIVE. THE DUPLICATION C THEOREM IS ITERATED UNTIL THE VARIABLES ARE NEARLY EQUAL, C AND THE FUNCTION IS THEN EXPANDED IN TAYLOR SERIES TO FIFTH C ORDER. LOGARITHMIC, INVERSE CIRCULAR, AND INVERSE HYPER- C BOLIC FUNCTIONS CAN BE EXPRESSED IN TERMS OF RC. REFERENCE: C B. C. CARLSON, COMPUTING ELLIPTIC INTEGRALS BY DUPLICATION, C NUMER. MATH. 33 (1979), 1-16. CODED BY B. C. CARLSON AND C ELAINE M. NOTIS, AMES LABORATORY-DOE, IOWA STATE UNIVERSITY, C AMES, IOWA 50011. MARCH 1, 1980. C C CHECK BY ADDITION THEOREM: RC(X,X+Z) + RC(Y,Y+Z) = RC(0,Z), C WHERE X, Y, AND Z ARE POSITIVE AND X * Y = Z * Z. C INTEGER IERR,PRINTR DOUBLE PRECISION C1,C2,ERRTOL,LAMDA,LOLIM DOUBLE PRECISION MU,S,SN,UPLIM,X,XN,Y,YN C INTRINSIC FUNCTIONS USED: DABS,DMAX1,DSQRT C C PRINTR IS THE UNIT NUMBER OF THE PRINTER. DATA PRINTR/6/ C C LOLIM AND UPLIM DETERMINE THE RANGE OF VALID ARGUMENTS. C LOLIM IS NOT LESS THAN THE MACHINE MINIMUM MULTIPLIED BY 5. C UPLIM IS NOT GREATER THAN THE MACHINE MAXIMUM DIVIDED BY 5. C C ACCEPTABLE VALUES FOR: LOLIM UPLIM C IBM 360/370 SERIES : 3.D-78 1.D+75 C CDC 6000/7000 SERIES : 1.D-292 1.D+321 C UNIVAC 1100 SERIES : 1.D-307 1.D+307 C C WARNING: IF THIS PROGRAM IS CONVERTED TO SINGLE PRECISION, C THE VALUES FOR THE UNIVAC 1100 SERIES SHOULD BE CHANGED TO C LOLIM = 1.E-37 AND UPLIM = 1.E+37 BECAUSE THE MACHINE C EXTREMA CHANGE WITH THE PRECISION. C DATA LOLIM/3.D-78/, UPLIM/1.D+75/ C C ON INPUT: C C X AND Y ARE THE VARIABLES IN THE INTEGRAL RC(X,Y). C C ERRTOL IS SET TO THE DESIRED ERROR TOLERANCE. C RELATIVE ERROR DUE TO TRUNCATION IS LESS THAN C 16 * ERRTOL ** 6 / (1 - 2 * ERRTOL). C C SAMPLE CHOICES: ERRTOL RELATIVE TRUNCATION C ERROR LESS THAN C 1.D-3 2.D-17 C 3.D-3 2.D-14 C 1.D-2 2.D-11 C 3.D-2 2.D-8 C 1.D-1 2.D-5 C C ON OUTPUT: C C X, Y, AND ERRTOL ARE UNALTERED. C C IERR IS THE RETURN ERROR CODE: C IERR = 0 FOR NORMAL COMPLETION OF THE SUBROUTINE, C IERR = 1 FOR ABNORMAL TERMINATION. C C ******************************************************** C WARNING: CHANGES IN THE PROGRAM MAY IMPROVE SPEED AT THE C EXPENSE OF ROBUSTNESS. C IF (X .LT. 0.D0 .OR. Y .LE. 0.D0) GO TO 100 IF ((X + Y) .LT. LOLIM) GO TO 100 IF (DMAX1(X,Y) .LE. UPLIM) GO TO 112 100 WRITE(PRINTR,104) 104 FORMAT(1H0,42H*** ERROR - INVALID ARGUMENTS PASSED TO RC) WRITE(PRINTR,108) X,Y 108 FORMAT(1H ,4HX = ,D23.16,4X,4HY = ,D23.16) IERR = 1 GO TO 124 C 112 IERR = 0 XN = X YN = Y C 116 MU = (XN + YN + YN) / 3.D0 SN = (YN + MU) / MU - 2.D0 IF (DABS(SN) .LT. ERRTOL) GO TO 120 LAMDA = 2.D0 * DSQRT(XN) * DSQRT(YN) + YN XN = (XN + LAMDA) * 0.25D0 YN = (YN + LAMDA) * 0.25D0 GO TO 116 C 120 C1 = 1.D0 / 7.D0 C2 = 9.D0 / 22.D0 S = SN * SN * (0.3D0 + SN * (C1 + SN * (0.375D0 + SN * C2))) RC = (1.D0 + S) / DSQRT(MU) C 124 RETURN END C C C $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ C C C ******************************************************** C DOUBLE PRECISION FUNCTION RF(X,Y,Z,ERRTOL,IERR) C C THIS FUNCTION SUBROUTINE COMPUTES THE INCOMPLETE ELLIPTIC C INTEGRAL OF THE FIRST KIND, C RF(X,Y,Z) = INTEGRAL FROM ZERO TO INFINITY OF C C -1/2 -1/2 -1/2 C (1/2)(T+X) (T+Y) (T+Z) DT, C C WHERE X, Y, AND Z ARE NONNEGATIVE AND AT MOST ONE OF THEM C IS ZERO. IF ONE OF THEM IS ZERO, THE INTEGRAL IS COMPLETE. C THE DUPLICATION THEOREM IS ITERATED UNTIL THE VARIABLES ARE C NEARLY EQUAL, AND THE FUNCTION IS THEN EXPANDED IN TAYLOR C SERIES TO FIFTH ORDER. REFERENCE: B. C. CARLSON, COMPUTING C ELLIPTIC INTEGRALS BY DUPLICATION, NUMER. MATH. 33 (1979), C 1-16. CODED BY B. C. CARLSON AND ELAINE M. NOTIS, AMES C LABORATORY-DOE, IOWA STATE UNIVERSITY, AMES, IOWA 50011. C MARCH 1, 1980. C C CHECK BY ADDITION THEOREM: RF(X,X+Z,X+W) + RF(Y,Y+Z,Y+W) C = RF(0,Z,W), WHERE X,Y,Z,W ARE POSITIVE AND X * Y = Z * W. C INTEGER IERR,PRINTR DOUBLE PRECISION C1,C2,C3,E2,E3,EPSLON,ERRTOL,LAMDA DOUBLE PRECISION LOLIM,MU,S,UPLIM,X,XN,XNDEV,XNROOT DOUBLE PRECISION Y,YN,YNDEV,YNROOT,Z,ZN,ZNDEV,ZNROOT C INTRINSIC FUNCTIONS USED: DABS,DMAX1,DMIN1,DSQRT C C PRINTR IS THE UNIT NUMBER OF THE PRINTER. DATA PRINTR/6/ C C LOLIM AND UPLIM DETERMINE THE RANGE OF VALID ARGUMENTS. C LOLIM IS NOT LESS THAN THE MACHINE MINIMUM MULTIPLIED BY 5. C UPLIM IS NOT GREATER THAN THE MACHINE MAXIMUM DIVIDED BY 5. C C ACCEPTABLE VALUES FOR: LOLIM UPLIM C IBM 360/370 SERIES : 3.D-78 1.D+75 C CDC 6000/7000 SERIES : 1.D-292 1.D+321 C UNIVAC 1100 SERIES : 1.D-307 1.D+307 C C WARNING: IF THIS PROGRAM IS CONVERTED TO SINGLE PRECISION, C THE VALUES FOR THE UNIVAC 1100 SERIES SHOULD BE CHANGED TO C LOLIM = 1.E-37 AND UPLIM = 1.E+37 BECAUSE THE MACHINE C EXTREMA CHANGE WITH THE PRECISION. C DATA LOLIM/3.D-78/, UPLIM/1.D+75/ C C ON INPUT: C C X, Y, AND Z ARE THE VARIABLES IN THE INTEGRAL RF(X,Y,Z). C C ERRTOL IS SET TO THE DESIRED ERROR TOLERANCE. C RELATIVE ERROR DUE TO TRUNCATION IS LESS THAN C ERRTOL ** 6 / (4 * (1 - ERRTOL)). C C SAMPLE CHOICES: ERRTOL RELATIVE TRUNCATION C ERROR LESS THAN C 1.D-3 3.D-19 C 3.D-3 2.D-16 C 1.D-2 3.D-13 C 3.D-2 2.D-10 C 1.D-1 3.D-7 C C ON OUTPUT: C C X, Y, Z, AND ERRTOL ARE UNALTERED. C C IERR IS THE RETURN ERROR CODE: C IERR = 0 FOR NORMAL COMPLETION OF THE SUBROUTINE, C IERR = 1 FOR ABNORMAL TERMINATION. C C ******************************************************** C WARNING: CHANGES IN THE PROGRAM MAY IMPROVE SPEED AT THE C EXPENSE OF ROBUSTNESS. C IF (DMIN1(X,Y,Z) .LT. 0.D0) GO TO 100 IF (DMIN1(X+Y,X+Z,Y+Z) .LT. LOLIM) GO TO 100 IF (DMAX1(X,Y,Z) .LE. UPLIM) GO TO 112 100 WRITE(PRINTR,104) 104 FORMAT(1H0,42H*** ERROR - INVALID ARGUMENTS PASSED TO RF) WRITE(PRINTR,108) X,Y,Z 108 FORMAT(1H ,4HX = ,D23.16,4X,4HY = ,D23.16,4X,4HZ = ,D23.16) IERR = 1 GO TO 124 C 112 IERR = 0 XN = X YN = Y ZN = Z C 116 MU = (XN + YN + ZN) / 3.D0 XNDEV = 2.D0 - (MU + XN) / MU YNDEV = 2.D0 - (MU + YN) / MU ZNDEV = 2.D0 - (MU + ZN) / MU EPSLON = DMAX1(DABS(XNDEV),DABS(YNDEV),DABS(ZNDEV)) IF (EPSLON .LT. ERRTOL) GO TO 120 XNROOT = DSQRT(XN) YNROOT = DSQRT(YN) ZNROOT = DSQRT(ZN) LAMDA = XNROOT * (YNROOT + ZNROOT) + YNROOT * ZNROOT XN = (XN + LAMDA) * 0.25D0 YN = (YN + LAMDA) * 0.25D0 ZN = (ZN + LAMDA) * 0.25D0 GO TO 116 C 120 C1 = 1.D0 / 24.D0 C2 = 3.D0 / 44.D0 C3 = 1.D0 / 14.D0 E2 = XNDEV * YNDEV - ZNDEV * ZNDEV E3 = XNDEV * YNDEV * ZNDEV S = 1.D0 + (C1 * E2 - 0.1D0 - C2 * E3) * E2 + C3 * E3 RF = S / DSQRT(MU) C 124 RETURN END C C C $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ C C C ******************************************************** C DOUBLE PRECISION FUNCTION RD(X,Y,Z,ERRTOL,IERR) C C THIS FUNCTION SUBROUTINE COMPUTES AN INCOMPLETE ELLIPTIC C INTEGRAL OF THE SECOND KIND, C RD(X,Y,Z) = INTEGRAL FROM ZERO TO INFINITY OF C C -1/2 -1/2 -3/2 C (3/2)(T+X) (T+Y) (T+Z) DT, C C WHERE X AND Y ARE NONNEGATIVE, X + Y IS POSITIVE, AND Z IS C POSITIVE. IF X OR Y IS ZERO, THE INTEGRAL IS COMPLETE. C THE DUPLICATION THEOREM IS ITERATED UNTIL THE VARIABLES ARE C NEARLY EQUAL, AND THE FUNCTION IS THEN EXPANDED IN TAYLOR C SERIES TO FIFTH ORDER. REFERENCE: B. C. CARLSON, COMPUTING C ELLIPTIC INTEGRALS BY DUPLICATION, NUMER. MATH. 33 (1979), C 1-16. CODED BY B. C. CARLSON AND ELAINE M. NOTIS, AMES C LABORATORY-DOE, IOWA STATE UNIVERSITY, AMES, IOWA 50011. C MARCH 1, 1980.. C C CHECK: RD(X,Y,Z) + RD(Y,Z,X) + RD(Z,X,Y) C = 3 / DSQRT(X * Y * Z), WHERE X, Y, AND Z ARE POSITIVE. C INTEGER IERR,PRINTR DOUBLE PRECISION C1,C2,C3,C4,EA,EB,EC,ED,EF,EPSLON,ERRTOL,LAMDA DOUBLE PRECISION LOLIM,MU,POWER4,SIGMA,S1,S2,UPLIM,X,XN,XNDEV DOUBLE PRECISION XNROOT,Y,YN,YNDEV,YNROOT,Z,ZN,ZNDEV,ZNROOT C INTRINSIC FUNCTIONS USED: DABS,DMAX1,DMIN1,DSQRT C C PRINTR IS THE UNIT NUMBER OF THE PRINTER. DATA PRINTR/6/ C C LOLIM AND UPLIM DETERMINE THE RANGE OF VALID ARGUMENTS. C LOLIM IS NOT LESS THAN 2 / (MACHINE MAXIMUM) ** (2/3). C UPLIM IS NOT GREATER THAN (0.1 * ERRTOL / MACHINE C MINIMUM) ** (2/3), WHERE ERRTOL IS DESCRIBED BELOW. C IN THE FOLLOWING TABLE IT IS ASSUMED THAT ERRTOL WILL C NEVER BE CHOSEN SMALLER THAN 1.D-5. C C ACCEPTABLE VALUES FOR: LOLIM UPLIM C IBM 360/370 SERIES : 6.D-51 1.D+48 C CDC 6000/7000 SERIES : 5.D-215 2.D+191 C UNIVAC 1100 SERIES : 1.D-205 2.D+201 C C WARNING: IF THIS PROGRAM IS CONVERTED TO SINGLE PRECISION, C THE VALUES FOR THE UNIVAC 1100 SERIES SHOULD BE CHANGED TO C LOLIM = 1.E-25 AND UPLIM = 2.E+21 BECAUSE THE MACHINE C EXTREMA CHANGE WITH THE PRECISION. C DATA LOLIM/6.D-51/, UPLIM/1.D+48/ C C ON INPUT: C C X, Y, AND Z ARE THE VARIABLES IN THE INTEGRAL RD(X,Y,Z). C C ERRTOL IS SET TO THE DESIRED ERROR TOLERANCE. C RELATIVE ERROR DUE TO TRUNCATION IS LESS THAN C 3 * ERRTOL ** 6 / (1-ERRTOL) ** 3/2. C C SAMPLE CHOICES: ERRTOL RELATIVE TRUNCATION C ERROR LESS THAN C 1.D-3 4.D-18 C 3.D-3 3.D-15 C 1.D-2 4.D-12 C 3.D-2 3.D-9 C 1.D-1 4.D-6 C C ON OUTPUT: C C X, Y, Z, AND ERRTOL ARE UNALTERED. C C IERR IS THE RETURN ERROR CODE: C IERR = 0 FOR NORMAL COMPLETION OF THE SUBROUTINE, C IERR = 1 FOR ABNORMAL TERMINATION. C C ******************************************************** C WARNING: CHANGES IN THE PROGRAM MAY IMPROVE SPEED AT THE C EXPENSE OF ROBUSTNESS. C IF (DMIN1(X,Y) .LT. 0.D0) GO TO 100 IF (DMIN1(X+Y,Z) .LT. LOLIM) GO TO 100 IF (DMAX1(X,Y,Z) .LE. UPLIM) GO TO 112 100 WRITE(PRINTR,104) 104 FORMAT(1H0,42H*** ERROR - INVALID ARGUMENTS PASSED TO RD) WRITE(PRINTR,108) X,Y,Z 108 FORMAT(1H ,4HX = ,D23.16,4X,4HY = ,D23.16,4X,4HZ = ,D23.16) IERR = 1 GO TO 124 C 112 IERR = 0 XN = X YN = Y ZN = Z SIGMA = 0.D0 POWER4 = 1.D0 C 116 MU = (XN + YN + 3.D0 * ZN) * 0.2D0 XNDEV = (MU - XN) / MU YNDEV = (MU - YN) / MU ZNDEV = (MU - ZN) / MU EPSLON = DMAX1(DABS(XNDEV),DABS(YNDEV),DABS(ZNDEV)) IF (EPSLON .LT. ERRTOL) GO TO 120 XNROOT = DSQRT(XN) YNROOT = DSQRT(YN) ZNROOT = DSQRT(ZN) LAMDA = XNROOT * (YNROOT + ZNROOT) + YNROOT * ZNROOT SIGMA = SIGMA + POWER4 / (ZNROOT * (ZN + LAMDA)) POWER4 = POWER4 * 0.25D0 XN = (XN + LAMDA) * 0.25D0 YN = (YN + LAMDA) * 0.25D0 ZN = (ZN + LAMDA) * 0.25D0 GO TO 116 C 120 C1 = 3.D0 / 14.D0 C2 = 1.D0 / 6.D0 C3 = 9.D0 / 22.D0 C4 = 3.D0 / 26.D0 EA = XNDEV * YNDEV EB = ZNDEV * ZNDEV EC = EA - EB ED = EA - 6.D0 * EB EF = ED + EC + EC S1 = ED * (- C1 + 0.25D0 * C3 * ED - 1.5D0 * C4 * ZNDEV * EF) S2 = ZNDEV * (C2 * EF + ZNDEV * (- C3 * EC + ZNDEV * C4 * EA)) RD = 3.D0 * SIGMA + POWER4 * (1.D0 + S1 + S2) / (MU * DSQRT(MU)) C 124 RETURN END C C C $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ C C C ******************************************************** C DOUBLE PRECISION FUNCTION RJ(X,Y,Z,P,ERRTOL,IERR) C C THIS FUNCTION SUBROUTINE COMPUTES AN INCOMPLETE ELLIPTIC C INTEGRAL OF THE THIRD KIND, C RJ(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. REFERENCE: C B. C. CARLSON, COMPUTING ELLIPTIC INTEGRALS BY DUPLICATION, C NUMER. MATH. 33 (1979), 1-16. CODED BY B. C. CARLSON AND C ELAINE M. NOTIS, AMES LABORATORY-DOE, IOWA STATE UNIVERSITY, C AMES, IOWA 50011. MARCH 1, 1980. C C CHECK BY ADDITION THEOREM: RJ(X,X+Z,X+W,X+P) C + RJ(Y,Y+Z,Y+W,Y+P) + (A-B) * RJ(A,B,B,A) + 3 / DSQRT(A) C = RJ(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 * RC(A,B). C INTEGER IERR,PRINTR DOUBLE PRECISION ALFA,BETA,C1,C2,C3,C4,EA,EB,EC,E2,E3 DOUBLE PRECISION EPSLON,ERRTOL,ETOLRC,LAMDA,LOLIM,MU,P,PN,PNDEV DOUBLE PRECISION POWER4,RC,SIGMA,S1,S2,S3,UPLIM,X,XN,XNDEV DOUBLE PRECISION XNROOT,Y,YN,YNDEV,YNROOT,Z,ZN,ZNDEV,ZNROOT C INTRINSIC FUNCTIONS USED: DABS,DMAX1,DMIN1,DSQRT C C PRINTR IS THE UNIT NUMBER OF THE PRINTER. DATA PRINTR/6/ C C RC IS A FUNCTION COMPUTED BY AN EXTERNAL SUBROUTINE. C C LOLIM AND UPLIM DETERMINE THE RANGE OF VALID ARGUMENTS. C LOLIM IS NOT LESS THAN THE CUBE ROOT OF THE VALUE C OF LOLIM USED IN THE SUBROUTINE FOR RC. C UPLIM IS NOT GREATER THAN 0.3 TIMES THE CUBE ROOT OF C THE VALUE OF UPLIM USED IN THE SUBROUTINE FOR RC. C C ACCEPTABLE VALUES FOR: LOLIM UPLIM C IBM 360/370 SERIES : 2.D-26 3.D+24 C CDC 6000/7000 SERIES : 5.D-98 3.D+106 C UNIVAC 1100 SERIES : 5.D-103 6.D+101 C C WARNING: IF THIS PROGRAM IS CONVERTED TO SINGLE PRECISION, C THE VALUES FOR THE UNIVAC 1100 SERIES SHOULD BE CHANGED TO C LOLIM = 5.E-13 AND UPLIM = 6.E+11 BECAUSE THE MACHINE C EXTREMA CHANGE WITH THE PRECISION. C DATA LOLIM/2.D-26/, UPLIM/3.D+24/ C C ON INPUT: C C X, Y, Z, AND P ARE THE VARIABLES IN THE INTEGRAL RJ(X,Y,Z,P). C C ERRTOL IS SET TO THE DESIRED ERROR TOLERANCE. C RELATIVE ERROR DUE TO TRUNCATION OF THE SERIES FOR RJ C IS LESS THAN 3 * ERRTOL ** 6 / (1 - ERRTOL) ** 3/2. C AN ERROR TOLERANCE (ETOLRC) WILL BE PASSED TO THE SUBROUTINE C FOR RC TO MAKE THE TRUNCATION ERROR FOR RC LESS THAN FOR RJ. C C SAMPLE CHOICES: ERRTOL RELATIVE TRUNCATION C ERROR LESS THAN C 1.D-3 4.D-18 C 3.D-3 3.D-15 C 1.D-2 4.D-12 C 3.D-2 3.D-9 C 1.D-1 4.D-6 C C ON OUTPUT: C C X, Y, Z, P, AND ERRTOL ARE UNALTERED. C C IERR IS THE RETURN ERROR CODE: C IERR = 0 FOR NORMAL COMPLETION OF THE SUBROUTINE, C IERR = 1 FOR ABNORMAL TERMINATION. C C ******************************************************** C WARNING: CHANGES IN THE PROGRAM MAY IMPROVE SPEED AT THE C EXPENSE OF ROBUSTNESS. C IF (DMIN1(X,Y,Z) .LT. 0.D0) GO TO 100 IF (DMIN1(X+Y,X+Z,Y+Z,P) .LT. LOLIM) GO TO 100 IF (DMAX1(X,Y,Z,P) .LE. UPLIM) GO TO 112 100 WRITE(PRINTR,104) 104 FORMAT(1H0,42H*** ERROR - INVALID ARGUMENTS PASSED TO RJ) WRITE(PRINTR,108) X,Y,Z,P 108 FORMAT(1H ,4HX = ,D23.16,4X,4HY = ,D23.16,4X,4HZ = ,D23.16, 1 4X,4HP = ,D23.16) IERR = 1 GO TO 124 C 112 IERR = 0 XN = X YN = Y ZN = Z PN = P SIGMA = 0.D0 POWER4 = 1.D0 ETOLRC = 0.5D0 * ERRTOL C 116 MU = (XN + YN + ZN + PN + PN) * 0.2D0 XNDEV = (MU - XN) / MU YNDEV = (MU - YN) / MU ZNDEV = (MU - ZN) / MU PNDEV = (MU - PN) / MU EPSLON = DMAX1(DABS(XNDEV),DABS(YNDEV),DABS(ZNDEV),DABS(PNDEV)) IF (EPSLON .LT. ERRTOL) GO TO 120 XNROOT = DSQRT(XN) YNROOT = DSQRT(YN) ZNROOT = DSQRT(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 * RC(ALFA,BETA,ETOLRC,IERR) IF (IERR .NE. 0) GO TO 124 POWER4 = POWER4 * 0.25D0 XN = (XN + LAMDA) * 0.25D0 YN = (YN + LAMDA) * 0.25D0 ZN = (ZN + LAMDA) * 0.25D0 PN = (PN + LAMDA) * 0.25D0 GO TO 116 C 120 C1 = 3.D0 / 14.D0 C2 = 1.D0 / 3.D0 C3 = 3.D0 / 22.D0 C4 = 3.D0 / 26.D0 EA = XNDEV * (YNDEV + ZNDEV) + YNDEV * ZNDEV EB = XNDEV * YNDEV * ZNDEV EC = PNDEV * PNDEV E2 = EA - 3.D0 * EC E3 = EB + 2.D0 * PNDEV * (EA - EC) S1 = 1.D0 + E2 * (- C1 + 0.75D0 * C3 * E2 - 1.5D0 * C4 * E3) S2 = EB * (0.5D0 * C2 + PNDEV * (- C3 - C3 + PNDEV * C4)) S3 = PNDEV * EA * (C2 - PNDEV * C3) - C2 * PNDEV * EC RJ = 3.D0 * SIGMA + POWER4 * (S1 + S2 + S3) / (MU * DSQRT(MU)) C 124 RETURN END C C C $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ C C C THIS DRIVER TESTS THE DOUBLE PRECISION FUNCTION SUBROUTINE FOR THE C INTEGRAL RC(X,Y). THE FIRST SIX SETS OF VALUES OF X AND Y ARE C EXTREME POINTS OF THE REGION OF VALID ARGUMENTS DEFINED BY THE C MACHINE-DEPENDENT CONSTANTS LOLIM AND UPLIM. THE VALUES OF LOLIM, C UPLIM, X, Y, AND ERRTOL (SEE COMMENTS IN SUBROUTINE) MAY BE USED ON C MOST MACHINES BUT PROVIDE A SEVERE TEST OF ROBUSTNESS ONLY ON THE C IBM 360/370 SERIES. THE SEVENTH SET TESTS THE FAILURE EXIT. THE C NEXT THREE SETS ARE CHECK VALUES: RC(0,0.25) = RC(0.0625,0.125) = PI C AND RC(2.25,2) = LN(2). THE REMAINING SETS SHOW THE DEPENDENCE ON X C WHEN Y = 1. FIXING Y ENTAILS NO LOSS HERE BECAUSE RC IS HOMOGENEOUS. C INTEGER IERR,PRINTR,READR DOUBLE PRECISION X,Y,ELIPTC,ERRTOL DOUBLE PRECISION RC C DATA PRINTR/6/, READR/5/ C WRITE(PRINTR,4) 4 FORMAT(1H1,24HTEST OF ROBUSTNESS OF RC) WRITE(PRINTR,8) 8 FORMAT(1H0,14X,1HX,26X,1HY,25X,2HRC) C ERRTOL = 1.D-3 C DO 20 I = 1,43 READ(READR,12) X,Y 12 FORMAT(2D11.2) ELIPTC = RC(X,Y,ERRTOL,IERR) IF (IERR .NE. 0) GO TO 18 WRITE(PRINTR,16) X,Y,ELIPTC 16 FORMAT(1H0,3D27.16) GO TO 20 18 WRITE(PRINTR,19) X,Y 19 FORMAT(1H0,2D27.16) 20 CONTINUE C STOP END C 1.51D-78 1.51D-78 3.01D-78 0.55D-78 0.00D+00 3.01D-78 0.99D+75 0.55D-78 0.00D+00 0.99D+75 0.99D+75 0.99D+75 0.00D+00 2.00D-78 0.00D+00 2.50D-01 6.25D-02 1.25D-01 2.25D+00 2.00D+00 0.01D+00 1.00D+00 0.02D+00 1.00D+00 0.05D+00 1.00D+00 0.10D+00 1.00D+00 0.20D+00 1.00D+00 0.40D+00 1.00D+00 0.60D+00 1.00D+00 0.80D+00 1.00D+00 1.00D+00 1.00D+00 1.20D+00 1.00D+00 1.50D+00 1.00D+00 2.00D+00 1.00D+00 3.00D+00 1.00D+00 4.00D+00 1.00D+00 5.00D+00 1.00D+00 1.00D+01 1.00D+00 2.00D+01 1.00D+00 5.00D+01 1.00D+00 1.00D+02 1.00D+00 1.00D+03 1.00D+00 1.00D+04 1.00D+00 1.00D+05 1.00D+00 1.00D+06 1.00D+00 1.00D+07 1.00D+00 1.00D+08 1.00D+00 1.00D+09 1.00D+00 1.00D+10 1.00D+00 1.00D+12 1.00D+00 1.00D+15 1.00D+00 1.00D+20 1.00D+00 1.00D+30 1.00D+00 1.00D+40 1.00D+00 1.00D+50 1.00D+00 C C C $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ C C C THIS DRIVER TESTS THE DOUBLE PRECISION FUNCTION SUBROUTINE FOR THE C INTEGRAL RF(X,Y,Z), WHICH IS SYMMETRIC IN X,Y,Z. THE FIRST NINE C SETS OF VALUES OF X,Y,Z ARE EXTREME POINTS OF THE REGION OF VALID C ARGUMENTS DEFINED BY THE MACHINE-DEPENDENT CONSTANTS LOLIM AND C UPLIM. THE VALUES OF LOLIM, UPLIM, X, Y, Z, AND ERRTOL (SEE C COMMENTS IN SUBROUTINE) MAY BE USED ON MOST MACHINES BUT PROVIDE A C SEVERE TEST OF ROBUSTNESS ONLY ON THE IBM 360/370 SERIES. THE C TENTH SET TESTS THE FAILURE EXIT. THE ELEVENTH SET IS A CHECK C VALUE: RF(0,1,2) = A, WHERE A IS THE FIRST LEMNISCATE CONSTANT. C THE REMAINING SETS SHOW THE DEPENDENCE ON Z WHEN Y = 1 (NO LOSS OF C GENERALITY BECAUSE OF HOMOGENEITY) AND X = 0.5 (MIDWAY BETWEEN THE C COMPLETE CASE X = 0 AND THE DEGENERATE CASE X = Y). C INTEGER IERR,PRINTR,READR DOUBLE PRECISION X,Y,Z,ELIPTC,ERRTOL DOUBLE PRECISION RF C DATA PRINTR/6/, READR/5/ C WRITE(PRINTR,4) 4 FORMAT(1H1,24HTEST OF ROBUSTNESS OF RF) WRITE(PRINTR,8) 8 FORMAT(1H0,14X,1HX,26X,1HY,26X,1HZ,25X,2HRF) C ERRTOL = 1.D-3 C DO 20 I = 1,55 READ(READR,12) X,Y,Z 12 FORMAT(3D11.2) ELIPTC = RF(X,Y,Z,ERRTOL,IERR) IF (IERR .NE. 0) GO TO 18 WRITE(PRINTR,16) X,Y,Z,ELIPTC 16 FORMAT(1H0,4D27.16) GO TO 20 18 WRITE(PRINTR,19) X,Y,Z 19 FORMAT(1H0,3D27.16) 20 CONTINUE C STOP END C 1.51D-78 1.51D-78 1.51D-78 1.51D-78 1.51D-78 0.99D+75 0.00D+00 3.01D-78 3.01D-78 0.00D+00 3.01D-78 0.99D+75 0.00D+00 0.99D+75 0.99D+75 0.99D+75 0.99D+75 0.99D+75 0.55D-78 3.01D-78 3.01D-78 0.55D-78 3.01D-78 0.99D+75 0.55D-78 0.99D+75 0.99D+75 0.00D+00 2.00D-78 1.00D+00 0.00D+00 1.00D+00 2.00D+00 0.50D+00 1.00D+00 1.00D+00 0.50D+00 1.00D+00 1.10D+00 0.50D+00 1.00D+00 1.20D+00 0.50D+00 1.00D+00 1.30D+00 0.50D+00 1.00D+00 1.40D+00 0.50D+00 1.00D+00 1.50D+00 0.50D+00 1.00D+00 1.60D+00 0.50D+00 1.00D+00 1.70D+00 0.50D+00 1.00D+00 1.80D+00 0.50D+00 1.00D+00 1.90D+00 0.50D+00 1.00D+00 2.00D+00 0.50D+00 1.00D+00 2.20D+00 0.50D+00 1.00D+00 2.40D+00 0.50D+00 1.00D+00 2.60D+00 0.50D+00 1.00D+00 2.80D+00 0.50D+00 1.00D+00 3.00D+00 0.50D+00 1.00D+00 3.50D+00 0.50D+00 1.00D+00 4.00D+00 0.50D+00 1.00D+00 4.50D+00 0.50D+00 1.00D+00 5.00D+00 0.50D+00 1.00D+00 6.00D+00 0.50D+00 1.00D+00 7.00D+00 0.50D+00 1.00D+00 8.00D+00 0.50D+00 1.00D+00 9.00D+00 0.50D+00 1.00D+00 1.00D+01 0.50D+00 1.00D+00 2.00D+01 0.50D+00 1.00D+00 3.00D+01 0.50D+00 1.00D+00 4.00D+01 0.50D+00 1.00D+00 5.00D+01 0.50D+00 1.00D+00 1.00D+02 0.50D+00 1.00D+00 2.00D+02 0.50D+00 1.00D+00 5.00D+02 0.50D+00 1.00D+00 1.00D+03 0.50D+00 1.00D+00 1.00D+04 0.50D+00 1.00D+00 1.00D+05 0.50D+00 1.00D+00 1.00D+06 0.50D+00 1.00D+00 1.00D+08 0.50D+00 1.00D+00 1.00D+10 0.50D+00 1.00D+00 1.00D+12 0.50D+00 1.00D+00 1.00D+15 0.50D+00 1.00D+00 1.00D+20 0.50D+00 1.00D+00 1.00D+30 0.50D+00 1.00D+00 1.00D+40 0.50D+00 1.00D+00 1.00D+50 C C C $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ C C C THIS DRIVER TESTS THE DOUBLE PRECISION FUNCTION SUBROUTINE FOR THE C INTEGRAL RD(X,Y,Z), WHICH IS SYMMETRIC IN X AND Y. THE FIRST C TWELVE SETS OF VALUES OF X,Y,Z ARE EXTREME POINTS OF THE REGION OF C VALID ARGUMENTS DEFINED BY THE MACHINE-DEPENDENT CONSTANTS LOLIM C AND UPLIM. THE VALUES OF LOLIM, UPLIM, X, Y, Z, AND ERRTOL (SEE C COMMENTS IN SUBROUTINE) MAY BE USED ON MOST MACHINES BUT PROVIDE A C SEVERE TEST OF ROBUSTNESS ONLY ON THE IBM 360/370 SERIES. THE C THIRTEENTH SET TESTS THE FAILURE EXIT. THE FOURTEENTH SET IS A C CHECK VALUE: RD(0,2,1) = 3B = 3(PI)/4A, WHERE A AND B ARE THE C LEMNISCATE CONSTANTS. THE REMAINING SETS SHOW THE DEPENDENCE C ON Z WHEN Y = 1 (NO LOSS OF GENERALITY BECAUSE OF HOMOGENEITY) C AND X = 0.5 (MIDWAY BETWEEN THE COMPLETE CASE X = 0 AND THE C DEGENERATE CASE X = Y). C INTEGER IERR,PRINTR,READR DOUBLE PRECISION X,Y,Z,ELIPTC,ERRTOL DOUBLE PRECISION RD C DATA PRINTR/6/, READR/5/ C WRITE(PRINTR,4) 4 FORMAT(1H0,24HTEST OF ROBUSTNESS OF RD) WRITE(PRINTR,8) 8 FORMAT(1H0,15X,1HX,26X,1HY,26X,1HZ,25X,2HRD) C ERRTOL = 1.D-3 C DO 20 I = 1,27 READ(READR,12) X,Y,Z 12 FORMAT(3D11.2) ELIPTC = RD(X,Y,Z,ERRTOL,IERR) IF (IERR .NE. 0) GO TO 18 WRITE(PRINTR,16) X,Y,Z,ELIPTC 16 FORMAT(1H0,4D27.16) GO TO 20 18 WRITE(PRINTR,19) X,Y,Z 19 FORMAT(1H0,3D27.16) 20 CONTINUE C STOP END C 0.00D+00 6.01D-51 6.01D-51 0.55D-78 6.01D-51 6.01D-51 0.00D+00 6.01D-51 0.99D+48 0.55D-78 6.01D-51 0.99D+48 0.00D+00 0.99D+48 6.01D-51 0.55D-78 0.99D+48 6.01D-51 0.00D+00 0.99D+48 0.99D+48 0.55D-78 0.99D+48 0.99D+48 3.01D-51 3.01D-51 6.01D-51 3.01D-51 3.01D-51 0.99D+48 0.99D+48 0.99D+48 6.01D-51 0.99D+48 0.99D+48 0.99D+48 0.00D+00 3.01D-51 1.00D+00 0.00D+00 2.00D+00 1.00D+00 0.50D+00 1.00D+00 1.00D-10 0.50D+00 1.00D+00 1.00D-05 0.5D+00 1.00D+00 1.00D-02 0.50D+00 1.00D+00 1.00D-01 0.50D+00 1.00D+00 2.00D-01 0.50D+00 1.00D+00 5.00D-01 0.50D+00 1.00D+00 1.00D+00 0.50D+00 1.00D+00 2.00D+00 0.50D+00 1.00D+00 5.00D+00 0.50D+00 1.00D+00 1.00D+01 0.50D+00 1.00D+00 1.00D+02 0.50D+00 1.00D+00 1.00D+05 0.50D+00 1.00D+00 1.00D+10 C C C $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ C C C THIS DRIVER TESTS THE DOUBLE PRECISION FUNCTION SUBROUTINE FOR THE C INTEGRAL RJ(X,Y,Z,P), WHICH IS SYMMETRIC IN X,Y,Z. THE FIRST C TWENTY SETS OF VALUES OF X,Y,Z,P ARE EXTREME POINTS OF THE REGION C OF VALID ARGUMENTS DEFINED BY THE MACHINE-DEPENDENT CONSTANTS C LOLIM AND UPLIM. THE VALUES OF LOLIM, UPLIM, X, Y, Z, P, AND C ERRTOL (SEE COMMENTS IN SUBROUTINE) MAY BE USED ON MOST MACHINES C BUT PROVIDE A SEVERE TEST OF ROBUSTNESS ONLY ON THE IBM 360/370 C SERIES. THE TWENTY-FIRST SET TESTS THE FAILURE EXIT. THE TWENTY- C SECOND SET IS A CHECK VALUE: RJ(2,3,4,5) = 0.14297 57966 71567 C 53833 23308. THE REMAINING SETS SHOW THE DEPENDENCE ON Z AND P C WHEN Y = 1 (NO LOSS OF GENERALITY BECAUSE OF HOMOGENEITY) AND C X = 0.5 (MIDWAY BETWEEN THE COMPLETE CASE X = 0 AND THE DEGENERATE C CASE X = Y). C INTEGER IERR,PRINTR,READR DOUBLE PRECISION X,Y,Z,P,ELIPTC,ERRTOL DOUBLE PRECISION RJ C DATA PRINTR/6/, READR/5/ C WRITE(PRINTR,4) 4 FORMAT(1H0,24HTEST OF ROBUSTNESS OF RJ) WRITE(PRINTR,8) 8 FORMAT(1H0,12X,1HX,25X,1HY,25X,1HZ,25X,1HP,25X,2HRJ) C ERRTOL = 1.D-3 C DO 20 I = 1,42 READ(READR,12) X,Y,Z,P 12 FORMAT(4D11.2) ELIPTC = RJ(X,Y,Z,P,ERRTOL,IERR) IF (IERR .NE. 0) GO TO 18 WRITE(PRINTR,16) X,Y,Z,P,ELIPTC 16 FORMAT(1H0,5D26.16) GO TO 20 18 WRITE(PRINTR,19) X,Y,Z,P 19 FORMAT(1H0,4D26.16) 20 CONTINUE C STOP END C 1.01D-26 1.01D-26 1.01D-26 2.01D-26 1.01D-26 1.01D-26 2.99D+24 2.01D-26 0.00D+00 2.01D-26 2.01D-26 2.01D-26 0.00D+00 2.01D-26 2.99D+24 2.01D-26 0.00D+00 2.99D+24 2.99D+24 2.01D-26 2.99D+24 2.99D+24 2.99D+24 2.01D-26 0.55D-78 2.01D-26 2.01D-26 2.01D-26 0.55D-78 2.01D-26 2.99D+24 2.01D-26 0.55D-78 2.99D+24 2.99D+24 2.01D-26 2.01D-26 2.01D-26 2.01D-26 2.01D-26 1.01D-26 1.01D-26 1.01D-26 2.99D+24 1.01D-26 1.01D-26 2.99D+24 2.99D+24 0.00D+00 2.01D-26 2.01D-26 2.99D+24 0.00D+00 2.01D-26 2.99D+24 2.99D+24 0.00D+00 2.99D+24 2.99D+24 2.99D+24 2.99D+24 2.99D+24 2.99D+24 2.99D+24 0.55D-78 2.01D-26 2.01D-26 2.99D+24 0.55D-78 2.01D-26 2.99D+24 2.99D+24 0.55D-78 2.99D+24 2.99D+24 2.99D+24 2.01D-26 2.01D-26 2.01D-26 2.99D+24 0.00D+00 1.90D-26 1.90D-26 1.00D+00 2.00D+00 3.00D+00 4.00D+00 5.00D+00 0.50D+00 1.00D+00 1.00D+00 0.25D+00 0.50D+00 1.00D+00 1.00D+00 0.75D+00 0.50D+00 1.00D+00 1.00D+00 1.00D+00 0.50D+00 1.00D+00 1.00D+00 2.00D+00 0.50D+00 1.00D+00 2.00D+00 0.25D+00 0.50D+00 1.00D+00 2.00D+00 0.75D+00 0.50D+00 1.00D+00 2.00D+00 1.50D+00 0.50D+00 1.00D+00 2.00D+00 4.00D+00 0.50D+00 1.00D+00 5.00D+00 0.25D+00 0.50D+00 1.00D+00 5.00D+00 0.75D+00 0.50D+00 1.00D+00 5.00D+00 3.00D+00 0.50D+00 1.00D+00 5.00D+00 1.00D+01 0.50D+00 1.00D+00 1.00D+01 0.25D+00 0.50D+00 1.00D+00 1.00D+01 0.75D+00 0.50D+00 1.00D+00 1.00D+01 5.00D+00 0.50D+00 1.00D+00 1.00D+01 2.00D+01 0.50D+00 1.00D+00 1.00D+02 0.25D+00 0.50D+00 1.00D+00 1.00D+02 0.75D+00 0.50D+00 1.00D+00 1.00D+02 5.00D+01 0.50D+00 1.00D+00 1.00D+02 2.00D+02 C C C $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ C C C THIS DRIVER COMPARES VALUES OF (LOG X)/(X-1) AND ARCTAN(X) C CALCULATED ON ONE HAND FROM THE SUBROUTINE RC AND ON THE OTHER C FROM LIBRARY LOG AND ARCTAN ROUTINES. TO AVOID OVER/UNDERFLOWS C FOR EXTREME VALUES OF X, WE WRITE (LOG X)/(X-1) = RC(Y,X/Y)/SQRT(Y), C WHERE Y = (1+X)/2, AND ARCTAN(X) = SQRT(X)*RC(Z,Z+X), WHERE Z = 1/X. INTEGER IERR,PRINTR,READR,IPOWER DOUBLE PRECISION ERRTOL,IBMARC,IBMLOG,MYARC,MYLOG,RC,V,W,X,Y,Z C DATA PRINTR/6/, READR/5/ C WRITE(PRINTR,4) 4 FORMAT(1H1,5X,1HX,15X,8HFROM LOG,19X,7HFROM RC) ERRTOL = 1.D-3 DO 20 J=1,10 X = 0.2D0 * J Y = (1.D0 + X) / 2.D0 V = X / Y MYLOG = RC(Y,V,ERRTOL,IERR) / DSQRT(Y) IF (J .NE. 5) GO TO 12 WRITE(PRINTR,8) X,MYLOG 8 FORMAT(1H0,1PD9.1,5X,22H**** ZERO DIVIDE *****,0PD27.16) GO TO 20 12 IBMLOG = DLOG(X) / (X - 1.D0) WRITE(PRINTR,16) X,IBMLOG,MYLOG 16 FORMAT(1H0,1PD9.1,0P2D27.16) 20 CONTINUE C C************************************************************* C WRITE(PRINTR,24) 24 FORMAT(1H-,30X,19HEXTREME VALUES OF X) WRITE(PRINTR,28) 28 FORMAT(1H0,5X,1HX,15X,8HFROM LOG,19X,7HFROM RC) DO 40 I=1,16 IPOWER = -75 + 10 * (I-1) X = 10.D0 ** IPOWER Y = (1.D0 + X) / 2.D0 V = X / Y MYLOG = RC(Y,V,ERRTOL,IERR) / DSQRT(Y) IBMLOG = DLOG(X) / (X - 1.D0) WRITE(PRINTR,30) X,IBMLOG,MYLOG 30 FORMAT(1H0,1PD9.1,0P2D27.16) 40 CONTINUE C C************************************************************* C WRITE(PRINTR,104) 104 FORMAT(1H1,5X,1HX,14X,11HFROM ARCTAN,17X,7HFROM RC) DO 116 M=1,13 READ(READR,108) X 108 FORMAT(1D9.0) Z = 1.D0 / X W = Z + X MYARC = DSQRT(X) * RC(Z,W,ERRTOL,IERR) IBMARC = DATAN(X) WRITE(PRINTR,112) X,IBMARC,MYARC 112 FORMAT(1H0,1PD9.1,0P2D27.16) 116 CONTINUE STOP END C 1.D-75 1.D-15 1.D-03 1.D-01 2.D-01 5.D-01 1.D+00 2.D+00 5.D+00 1.D+01 1.D+03 1.D+15 1.D+75 C C C $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ C C C THIS DRIVER COMPARES VALUES OF LEGENDRE'S COMPLETE ELLIPTIC C INTEGRAL K COMPUTED FROM THE SUBROUTINE RF AND VALUES COMPUTED FROM C THE FUNPACK SUBROUTINE DELIKM. THE FIRST TWENTY VALUES OF THE C SQUARED COMPLEMENTARY MODULUS ETA = KC * KC ARE IN THE UNIT INTERVAL, C AND THE VALUES OF K MAY BE COMPARED WITH 16S VALUES IN M. ABRAMOWITZ C AND I. A. STEGUN, HANDBOOK OF MATHEMATICAL FUNCTIONS (AMS 55). C THE NEXT TWENTY-NINE VALUES OF KC RANGE FROM 1.D-70 TO 1.D+70. C DELIKM CAN ACCEPT ONLY EIGHT OF THESE ON THE IBM 360/370 SERIES, C PARTLY BECAUSE IT DOES NOT ADMIT VALUES OF ETA GREATER THAN UNITY C AND PARTLY BECAUSE KC MUST BE SQUARED, BUT RF CAN ACCEPT ALL OF C THEM IF HOMOGENEITY IS USED TO AVOID THE SQUARE. C INTEGER I,IERR,IPOWER,PRINTR DOUBLE PRECISION DUPLIC,ERRTOL,FUNPK,RKC,X,Y,Z DOUBLE PRECISION DELIKM,RF C DATA PRINTR/6/ C WRITE(PRINTR,8) 8 FORMAT(1H1,47HCOMPARISON OF FUNPACK AND DUPLICATION ALGORITHM) WRITE(PRINTR,10) 10 FORMAT(1H0,22HK(1-ETA) = RF(0,ETA,1)) WRITE(PRINTR,12) 12 FORMAT(1H0,12X,3HETA,17X,21HDUPLICATION ALGORITHM,13X,7HFUNPACK) C X = 0.D0 Z = 1.D0 ERRTOL = 1.D-3 DO 20 I = 1,20 Y = I * .05D0 FUNPK = DELIKM(Y) DUPLIC = RF(X,Y,Z,ERRTOL,IERR) IF (IERR .EQ. 0) GO TO 15 WRITE(PRINTR,14) Y,FUNPK 14 FORMAT(1H0,D27.16,27X,D27.16) GO TO 20 15 WRITE(PRINTR,16) Y,DUPLIC,FUNPK 16 FORMAT(1H0,3D27.16) 20 CONTINUE C C***************************************************************** C WRITE(PRINTR,104) 104 FORMAT(1H1,48HCOMPARISON OF FUNPACK AND DUPLICATION ALGORITHMS) WRITE(PRINTR,108) 108 FORMAT(1H0,46HK((1-KC**2)**0.5) = 1/SQRT(KC) * RF(0,KC,1/KC)) WRITE(PRINTR,109) 109 FORMAT(1H0,13X,2HKC,17X,21HDUPLICATION ALGORITHM,13X,7HFUNPACK) C X = 0.D0 ERRTOL = 1.D-3 DO 130 I = 1,29 IPOWER = -(70 - (5 * (I - 1))) RKC = 10.D0 ** IPOWER Y = RKC Z = 1.D0 / RKC DUPLIC = 1.D0 / DSQRT(RKC) * RF(X,Y,Z,ERRTOL,IERR) IF (IPOWER .GE. -35 .AND. IPOWER .LE. 1) GO TO 114 IF (IERR .NE. 0) GO TO 112 WRITE(PRINTR,110) RKC,DUPLIC 110 FORMAT(1H0,2D27.16) GO TO 130 112 WRITE(PRINTR,113) RKC 113 FORMAT(1H0,D27.16) GO TO 130 114 Y = RKC * RKC FUNPK = DELIKM(Y) IF (IERR .NE. 0) GO TO 118 WRITE(PRINTR,116) RKC,DUPLIC,FUNPK 116 FORMAT(1H0,3D27.16) GO TO 130 118 WRITE(PRINTR,120) RKC,FUNPK 120 FORMAT(1H0,D27.16,27X,D27.16) 130 CONTINUE C STOP END