home *** CD-ROM | disk | FTP | other *** search
Text File | 1992-10-16 | 7.6 MB | 221,872 lines |
Text Truncated. Only the first 1MB is shown below. Download the file for the complete contents.
- *DECK AAAAAA
- SUBROUTINE AAAAAA (VER)
- C***BEGIN PROLOGUE AAAAAA
- C***PURPOSE SLATEC Common Mathematical Library disclaimer and version.
- C***LIBRARY SLATEC
- C***CATEGORY Z
- C***TYPE ALL (AAAAAA-A)
- C***KEYWORDS DISCLAIMER, DOCUMENTATION, VERSION
- C***AUTHOR SLATEC Common Mathematical Library Committee
- C***DESCRIPTION
- C
- C The SLATEC Common Mathematical Library is issued by the following
- C
- C Air Force Weapons Laboratory, Albuquerque
- C Lawrence Livermore National Laboratory, Livermore
- C Los Alamos National Laboratory, Los Alamos
- C National Institute of Standards and Technology, Washington
- C National Energy Research Supercomputer Center, Livermore
- C Oak Ridge National Laboratory, Oak Ridge
- C Sandia National Laboratories, Albuquerque
- C Sandia National Laboratories, Livermore
- C
- C All questions concerning the distribution of the library should be
- C directed to the NATIONAL ENERGY SOFTWARE CENTER, 9700 Cass Ave.,
- C Argonne, Illinois 60439, and not to the authors of the subprograms.
- C
- C * * * * * Notice * * * * *
- C
- C This material was prepared as an account of work sponsored by the
- C United States Government. Neither the United States, nor the
- C Department of Energy, nor the Department of Defense, nor any of
- C their employees, nor any of their contractors, subcontractors, or
- C their employees, makes any warranty, expressed or implied, or
- C assumes any legal liability or responsibility for the accuracy,
- C completeness, or usefulness of any information, apparatus, product,
- C or process disclosed, or represents that its use would not infringe
- C upon privately owned rights.
- C
- C *Usage:
- C
- C CHARACTER * 16 VER
- C
- C CALL AAAAAA (VER)
- C
- C *Arguments:
- C
- C VER:OUT will contain the version number of the SLATEC CML.
- C
- C *Description:
- C
- C This routine contains the SLATEC Common Mathematical Library
- C disclaimer and can be used to return the library version number.
- C
- C***REFERENCES Kirby W. Fong, Thomas H. Jefferson, Tokihiko Suyehiro
- C and Lee Walton, Guide to the SLATEC Common Mathema-
- C tical Library, April 10, 1990.
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 800424 DATE WRITTEN
- C 890414 REVISION DATE from Version 3.2
- C 890713 Routine modified to return version number. (WRB)
- C 900330 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE AAAAAA
- CHARACTER * (*) VER
- C***FIRST EXECUTABLE STATEMENT AAAAAA
- VER = ' 4.0-'
- RETURN
- END
- *DECK ACOSH
- FUNCTION ACOSH (X)
- C***BEGIN PROLOGUE ACOSH
- C***PURPOSE Compute the arc hyperbolic cosine.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C4C
- C***TYPE SINGLE PRECISION (ACOSH-S, DACOSH-D, CACOSH-C)
- C***KEYWORDS ACOSH, ARC HYPERBOLIC COSINE, ELEMENTARY FUNCTIONS, FNLIB,
- C INVERSE HYPERBOLIC COSINE
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C ACOSH(X) computes the arc hyperbolic cosine of X.
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770401 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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***END PROLOGUE ACOSH
- SAVE ALN2,XMAX
- DATA ALN2 / 0.6931471805 5994530942E0/
- DATA XMAX /0./
- C***FIRST EXECUTABLE STATEMENT ACOSH
- IF (XMAX.EQ.0.) XMAX = 1.0/SQRT(R1MACH(3))
- C
- IF (X .LT. 1.0) CALL XERMSG ('SLATEC', 'ACOSH', 'X LESS THAN 1',
- + 1, 2)
- C
- IF (X.LT.XMAX) ACOSH = LOG (X + SQRT(X*X-1.0))
- IF (X.GE.XMAX) ACOSH = ALN2 + LOG(X)
- C
- RETURN
- END
- *DECK AI
- FUNCTION AI (X)
- C***BEGIN PROLOGUE AI
- C***PURPOSE Evaluate the Airy function.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C10D
- C***TYPE SINGLE PRECISION (AI-S, DAI-D)
- C***KEYWORDS AIRY FUNCTION, FNLIB, SPECIAL FUNCTIONS
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C AI(X) computes the Airy function Ai(X)
- C Series for AIF on the interval -1.00000D+00 to 1.00000D+00
- C with weighted error 1.09E-19
- C log weighted error 18.96
- C significant figures required 17.76
- C decimal places required 19.44
- C
- C Series for AIG on the interval -1.00000D+00 to 1.00000D+00
- C with weighted error 1.51E-17
- C log weighted error 16.82
- C significant figures required 15.19
- C decimal places required 17.27
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED AIE, CSEVL, INITS, R1MACH, R9AIMP, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770701 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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 920618 Removed space from variable names. (RWC, WRB)
- C***END PROLOGUE AI
- DIMENSION AIFCS(9), AIGCS(8)
- LOGICAL FIRST
- SAVE AIFCS, AIGCS, NAIF, NAIG, X3SML, XMAX, FIRST
- DATA AIFCS( 1) / -.0379713584 9666999750E0 /
- DATA AIFCS( 2) / .0591918885 3726363857E0 /
- DATA AIFCS( 3) / .0009862928 0577279975E0 /
- DATA AIFCS( 4) / .0000068488 4381907656E0 /
- DATA AIFCS( 5) / .0000000259 4202596219E0 /
- DATA AIFCS( 6) / .0000000000 6176612774E0 /
- DATA AIFCS( 7) / .0000000000 0010092454E0 /
- DATA AIFCS( 8) / .0000000000 0000012014E0 /
- DATA AIFCS( 9) / .0000000000 0000000010E0 /
- DATA AIGCS( 1) / .0181523655 8116127E0 /
- DATA AIGCS( 2) / .0215725631 6601076E0 /
- DATA AIGCS( 3) / .0002567835 6987483E0 /
- DATA AIGCS( 4) / .0000014265 2141197E0 /
- DATA AIGCS( 5) / .0000000045 7211492E0 /
- DATA AIGCS( 6) / .0000000000 0952517E0 /
- DATA AIGCS( 7) / .0000000000 0001392E0 /
- DATA AIGCS( 8) / .0000000000 0000001E0 /
- DATA FIRST /.TRUE./
- C***FIRST EXECUTABLE STATEMENT AI
- IF (FIRST) THEN
- NAIF = INITS (AIFCS, 9, 0.1*R1MACH(3))
- NAIG = INITS (AIGCS, 8, 0.1*R1MACH(3))
- C
- X3SML = R1MACH(3)**0.3334
- XMAXT = (-1.5*LOG(R1MACH(1)))**0.6667
- XMAX = XMAXT - XMAXT*LOG(XMAXT)/
- * (4.0*SQRT(XMAXT)+1.0) - 0.01
- ENDIF
- FIRST = .FALSE.
- C
- IF (X.GE.(-1.0)) GO TO 20
- CALL R9AIMP (X, XM, THETA)
- AI = XM * COS(THETA)
- RETURN
- C
- 20 IF (X.GT.1.0) GO TO 30
- Z = 0.0
- IF (ABS(X).GT.X3SML) Z = X**3
- AI = 0.375 + (CSEVL (Z, AIFCS, NAIF) - X*(0.25 +
- 1 CSEVL (Z, AIGCS, NAIG)) )
- RETURN
- C
- 30 IF (X.GT.XMAX) GO TO 40
- AI = AIE(X) * EXP(-2.0*X*SQRT(X)/3.0)
- RETURN
- C
- 40 AI = 0.0
- CALL XERMSG ('SLATEC', 'AI', 'X SO BIG AI UNDERFLOWS', 1, 1)
- RETURN
- C
- END
- *DECK AIE
- FUNCTION AIE (X)
- C***BEGIN PROLOGUE AIE
- C***PURPOSE Calculate the Airy function for a negative argument and an
- C exponentially scaled Airy function for a non-negative
- C argument.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C10D
- C***TYPE SINGLE PRECISION (AIE-S, DAIE-D)
- C***KEYWORDS EXPONENTIALLY SCALED AIRY FUNCTION, FNLIB,
- C SPECIAL FUNCTIONS
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C AIE(X) computes the exponentially scaled Airy function for
- C non-negative X. It evaluates AI(X) for X .LE. 0.0 and
- C EXP(ZETA)*AI(X) for X .GE. 0.0 where ZETA = (2.0/3.0)*(X**1.5).
- C
- C Series for AIF on the interval -1.00000D+00 to 1.00000D+00
- C with weighted error 1.09E-19
- C log weighted error 18.96
- C significant figures required 17.76
- C decimal places required 19.44
- C
- C Series for AIG on the interval -1.00000D+00 to 1.00000D+00
- C with weighted error 1.51E-17
- C log weighted error 16.82
- C significant figures required 15.19
- C decimal places required 17.27
- C
- C Series for AIP on the interval 0. to 1.00000D+00
- C with weighted error 5.10E-17
- C log weighted error 16.29
- C significant figures required 14.41
- C decimal places required 17.06
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED CSEVL, INITS, R1MACH, R9AIMP
- C***REVISION HISTORY (YYMMDD)
- C 770701 DATE WRITTEN
- C 890206 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920618 Removed space from variable names. (RWC, WRB)
- C***END PROLOGUE AIE
- DIMENSION AIFCS(9), AIGCS(8), AIPCS(34)
- LOGICAL FIRST
- SAVE AIFCS, AIGCS, AIPCS, NAIF, NAIG,
- 1 NAIP, X3SML, X32SML, XBIG, FIRST
- DATA AIFCS( 1) / -.0379713584 9666999750E0 /
- DATA AIFCS( 2) / .0591918885 3726363857E0 /
- DATA AIFCS( 3) / .0009862928 0577279975E0 /
- DATA AIFCS( 4) / .0000068488 4381907656E0 /
- DATA AIFCS( 5) / .0000000259 4202596219E0 /
- DATA AIFCS( 6) / .0000000000 6176612774E0 /
- DATA AIFCS( 7) / .0000000000 0010092454E0 /
- DATA AIFCS( 8) / .0000000000 0000012014E0 /
- DATA AIFCS( 9) / .0000000000 0000000010E0 /
- DATA AIGCS( 1) / .0181523655 8116127E0 /
- DATA AIGCS( 2) / .0215725631 6601076E0 /
- DATA AIGCS( 3) / .0002567835 6987483E0 /
- DATA AIGCS( 4) / .0000014265 2141197E0 /
- DATA AIGCS( 5) / .0000000045 7211492E0 /
- DATA AIGCS( 6) / .0000000000 0952517E0 /
- DATA AIGCS( 7) / .0000000000 0001392E0 /
- DATA AIGCS( 8) / .0000000000 0000001E0 /
- DATA AIPCS( 1) / -.0187519297 793868E0 /
- DATA AIPCS( 2) / -.0091443848 250055E0 /
- DATA AIPCS( 3) / .0009010457 337825E0 /
- DATA AIPCS( 4) / -.0001394184 127221E0 /
- DATA AIPCS( 5) / .0000273815 815785E0 /
- DATA AIPCS( 6) / -.0000062750 421119E0 /
- DATA AIPCS( 7) / .0000016064 844184E0 /
- DATA AIPCS( 8) / -.0000004476 392158E0 /
- DATA AIPCS( 9) / .0000001334 635874E0 /
- DATA AIPCS(10) / -.0000000420 735334E0 /
- DATA AIPCS(11) / .0000000139 021990E0 /
- DATA AIPCS(12) / -.0000000047 831848E0 /
- DATA AIPCS(13) / .0000000017 047897E0 /
- DATA AIPCS(14) / -.0000000006 268389E0 /
- DATA AIPCS(15) / .0000000002 369824E0 /
- DATA AIPCS(16) / -.0000000000 918641E0 /
- DATA AIPCS(17) / .0000000000 364278E0 /
- DATA AIPCS(18) / -.0000000000 147475E0 /
- DATA AIPCS(19) / .0000000000 060851E0 /
- DATA AIPCS(20) / -.0000000000 025552E0 /
- DATA AIPCS(21) / .0000000000 010906E0 /
- DATA AIPCS(22) / -.0000000000 004725E0 /
- DATA AIPCS(23) / .0000000000 002076E0 /
- DATA AIPCS(24) / -.0000000000 000924E0 /
- DATA AIPCS(25) / .0000000000 000417E0 /
- DATA AIPCS(26) / -.0000000000 000190E0 /
- DATA AIPCS(27) / .0000000000 000087E0 /
- DATA AIPCS(28) / -.0000000000 000040E0 /
- DATA AIPCS(29) / .0000000000 000019E0 /
- DATA AIPCS(30) / -.0000000000 000009E0 /
- DATA AIPCS(31) / .0000000000 000004E0 /
- DATA AIPCS(32) / -.0000000000 000002E0 /
- DATA AIPCS(33) / .0000000000 000001E0 /
- DATA AIPCS(34) / -.0000000000 000000E0 /
- DATA FIRST /.TRUE./
- C***FIRST EXECUTABLE STATEMENT AIE
- IF (FIRST) THEN
- ETA = 0.1*R1MACH(3)
- NAIF = INITS (AIFCS, 9, ETA)
- NAIG = INITS (AIGCS, 8, ETA)
- NAIP = INITS (AIPCS, 34, ETA)
- C
- X3SML = ETA**0.3333
- X32SML = 1.3104*X3SML**2
- XBIG = R1MACH(2)**0.6666
- ENDIF
- FIRST = .FALSE.
- C
- IF (X.GE.(-1.0)) GO TO 20
- CALL R9AIMP (X, XM, THETA)
- AIE = XM * COS(THETA)
- RETURN
- C
- 20 IF (X.GT.1.0) GO TO 30
- Z = 0.0
- IF (ABS(X).GT.X3SML) Z = X**3
- AIE = 0.375 + (CSEVL (Z, AIFCS, NAIF) - X*(0.25 +
- 1 CSEVL (Z, AIGCS, NAIG)) )
- IF (X.GT.X32SML) AIE = AIE * EXP(2.0*X*SQRT(X)/3.0)
- RETURN
- C
- 30 SQRTX = SQRT(X)
- Z = -1.0
- IF (X.LT.XBIG) Z = 2.0/(X*SQRTX) - 1.0
- AIE = (.28125 + CSEVL (Z, AIPCS, NAIP))/SQRT(SQRTX)
- RETURN
- C
- END
- *DECK ALBETA
- FUNCTION ALBETA (A, B)
- C***BEGIN PROLOGUE ALBETA
- C***PURPOSE Compute the natural logarithm of the complete Beta
- C function.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C7B
- C***TYPE SINGLE PRECISION (ALBETA-S, DLBETA-D, CLBETA-C)
- C***KEYWORDS FNLIB, LOGARITHM OF THE COMPLETE BETA FUNCTION,
- C SPECIAL FUNCTIONS
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C ALBETA computes the natural log of the complete beta function.
- C
- C Input Parameters:
- C A real and positive
- C B real and positive
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED ALNGAM, ALNREL, GAMMA, R9LGMC, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770701 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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 900727 Added EXTERNAL statement. (WRB)
- C***END PROLOGUE ALBETA
- EXTERNAL GAMMA
- SAVE SQ2PIL
- DATA SQ2PIL / 0.9189385332 0467274 E0 /
- C***FIRST EXECUTABLE STATEMENT ALBETA
- P = MIN (A, B)
- Q = MAX (A, B)
- C
- IF (P .LE. 0.0) CALL XERMSG ('SLATEC', 'ALBETA',
- + 'BOTH ARGUMENTS MUST BE GT ZERO', 1, 2)
- IF (P.GE.10.0) GO TO 30
- IF (Q.GE.10.0) GO TO 20
- C
- C P AND Q ARE SMALL.
- C
- ALBETA = LOG(GAMMA(P) * (GAMMA(Q)/GAMMA(P+Q)) )
- RETURN
- C
- C P IS SMALL, BUT Q IS BIG.
- C
- 20 CORR = R9LGMC(Q) - R9LGMC(P+Q)
- ALBETA = ALNGAM(P) + CORR + P - P*LOG(P+Q) +
- 1 (Q-0.5)*ALNREL(-P/(P+Q))
- RETURN
- C
- C P AND Q ARE BIG.
- C
- 30 CORR = R9LGMC(P) + R9LGMC(Q) - R9LGMC(P+Q)
- ALBETA = -0.5*LOG(Q) + SQ2PIL + CORR + (P-0.5)*LOG(P/(P+Q))
- 1 + Q*ALNREL(-P/(P+Q))
- RETURN
- C
- END
- *DECK ALGAMS
- SUBROUTINE ALGAMS (X, ALGAM, SGNGAM)
- C***BEGIN PROLOGUE ALGAMS
- C***PURPOSE Compute the logarithm of the absolute value of the Gamma
- C function.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C7A
- C***TYPE SINGLE PRECISION (ALGAMS-S, DLGAMS-D)
- C***KEYWORDS ABSOLUTE VALUE OF THE LOGARITHM OF THE GAMMA FUNCTION,
- C FNLIB, SPECIAL FUNCTIONS
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C Evaluates the logarithm of the absolute value of the gamma
- C function.
- C X - input argument
- C ALGAM - result
- C SGNGAM - is set to the sign of GAMMA(X) and will
- C be returned at +1.0 or -1.0.
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED ALNGAM
- C***REVISION HISTORY (YYMMDD)
- C 770701 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C***END PROLOGUE ALGAMS
- C***FIRST EXECUTABLE STATEMENT ALGAMS
- ALGAM = ALNGAM(X)
- SGNGAM = 1.0
- IF (X.GT.0.0) RETURN
- C
- INT = MOD (-AINT(X), 2.0) + 0.1
- IF (INT.EQ.0) SGNGAM = -1.0
- C
- RETURN
- END
- *DECK ALI
- FUNCTION ALI (X)
- C***BEGIN PROLOGUE ALI
- C***PURPOSE Compute the logarithmic integral.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C5
- C***TYPE SINGLE PRECISION (ALI-S, DLI-D)
- C***KEYWORDS FNLIB, LOGARITHMIC INTEGRAL, SPECIAL FUNCTIONS
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C ALI(X) computes the logarithmic integral; i.e., the
- C integral from 0.0 to X of (1.0/ln(t))dt.
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED EI, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770601 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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***END PROLOGUE ALI
- C***FIRST EXECUTABLE STATEMENT ALI
- IF (X .LE. 0.0) CALL XERMSG ('SLATEC', 'ALI',
- + 'LOG INTEGRAL UNDEFINED FOR X LE 0', 1, 2)
- IF (X .EQ. 1.0) CALL XERMSG ('SLATEC', 'ALI',
- + 'LOG INTEGRAL UNDEFINED FOR X = 1', 2, 2)
- C
- ALI = EI (LOG(X) )
- C
- RETURN
- END
- *DECK ALNGAM
- FUNCTION ALNGAM (X)
- C***BEGIN PROLOGUE ALNGAM
- C***PURPOSE Compute the logarithm of the absolute value of the Gamma
- C function.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C7A
- C***TYPE SINGLE PRECISION (ALNGAM-S, DLNGAM-D, CLNGAM-C)
- C***KEYWORDS ABSOLUTE VALUE, COMPLETE GAMMA FUNCTION, FNLIB, LOGARITHM,
- C SPECIAL FUNCTIONS
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C ALNGAM(X) computes the logarithm of the absolute value of the
- C gamma function at X.
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED GAMMA, R1MACH, R9LGMC, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770601 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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 900727 Added EXTERNAL statement. (WRB)
- C***END PROLOGUE ALNGAM
- LOGICAL FIRST
- EXTERNAL GAMMA
- SAVE SQ2PIL, SQPI2L, PI, XMAX, DXREL, FIRST
- DATA SQ2PIL / 0.9189385332 0467274E0/
- DATA SQPI2L / 0.2257913526 4472743E0/
- DATA PI / 3.1415926535 8979324E0/
- DATA FIRST /.TRUE./
- C***FIRST EXECUTABLE STATEMENT ALNGAM
- IF (FIRST) THEN
- XMAX = R1MACH(2)/LOG(R1MACH(2))
- DXREL = SQRT (R1MACH(4))
- ENDIF
- FIRST = .FALSE.
- C
- Y = ABS(X)
- IF (Y.GT.10.0) GO TO 20
- C
- C LOG (ABS (GAMMA(X))) FOR ABS(X) .LE. 10.0
- C
- ALNGAM = LOG (ABS (GAMMA(X)))
- RETURN
- C
- C LOG (ABS (GAMMA(X))) FOR ABS(X) .GT. 10.0
- C
- 20 IF (Y .GT. XMAX) CALL XERMSG ('SLATEC', 'ALNGAM',
- + 'ABS(X) SO BIG ALNGAM OVERFLOWS', 2, 2)
- C
- IF (X.GT.0.) ALNGAM = SQ2PIL + (X-0.5)*LOG(X) - X + R9LGMC(Y)
- IF (X.GT.0.) RETURN
- C
- SINPIY = ABS (SIN(PI*Y))
- IF (SINPIY .EQ. 0.) CALL XERMSG ('SLATEC', 'ALNGAM',
- + 'X IS A NEGATIVE INTEGER', 3, 2)
- C
- IF (ABS((X-AINT(X-0.5))/X) .LT. DXREL) CALL XERMSG ('SLATEC',
- + 'ALNGAM', 'ANSWER LT HALF PRECISION BECAUSE X TOO NEAR ' //
- + 'NEGATIVE INTEGER', 1, 1)
- C
- ALNGAM = SQPI2L + (X-0.5)*LOG(Y) - X - LOG(SINPIY) - R9LGMC(Y)
- RETURN
- C
- END
- *DECK ALNREL
- FUNCTION ALNREL (X)
- C***BEGIN PROLOGUE ALNREL
- C***PURPOSE Evaluate ln(1+X) accurate in the sense of relative error.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C4B
- C***TYPE SINGLE PRECISION (ALNREL-S, DLNREL-D, CLNREL-C)
- C***KEYWORDS ELEMENTARY FUNCTIONS, FNLIB, LOGARITHM
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C ALNREL(X) evaluates ln(1+X) accurately in the sense of relative
- C error when X is very small. This routine must be used to
- C maintain relative error accuracy whenever X is small and
- C accurately known.
- C
- C Series for ALNR on the interval -3.75000D-01 to 3.75000D-01
- C with weighted error 1.93E-17
- C log weighted error 16.72
- C significant figures required 16.44
- C decimal places required 17.40
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED CSEVL, INITS, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770401 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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***END PROLOGUE ALNREL
- DIMENSION ALNRCS(23)
- LOGICAL FIRST
- SAVE ALNRCS, NLNREL, XMIN, FIRST
- DATA ALNRCS( 1) / 1.0378693562 743770E0 /
- DATA ALNRCS( 2) / -.1336430150 4908918E0 /
- DATA ALNRCS( 3) / .0194082491 35520563E0 /
- DATA ALNRCS( 4) / -.0030107551 12753577E0 /
- DATA ALNRCS( 5) / .0004869461 47971548E0 /
- DATA ALNRCS( 6) / -.0000810548 81893175E0 /
- DATA ALNRCS( 7) / .0000137788 47799559E0 /
- DATA ALNRCS( 8) / -.0000023802 21089435E0 /
- DATA ALNRCS( 9) / .0000004164 04162138E0 /
- DATA ALNRCS(10) / -.0000000735 95828378E0 /
- DATA ALNRCS(11) / .0000000131 17611876E0 /
- DATA ALNRCS(12) / -.0000000023 54670931E0 /
- DATA ALNRCS(13) / .0000000004 25227732E0 /
- DATA ALNRCS(14) / -.0000000000 77190894E0 /
- DATA ALNRCS(15) / .0000000000 14075746E0 /
- DATA ALNRCS(16) / -.0000000000 02576907E0 /
- DATA ALNRCS(17) / .0000000000 00473424E0 /
- DATA ALNRCS(18) / -.0000000000 00087249E0 /
- DATA ALNRCS(19) / .0000000000 00016124E0 /
- DATA ALNRCS(20) / -.0000000000 00002987E0 /
- DATA ALNRCS(21) / .0000000000 00000554E0 /
- DATA ALNRCS(22) / -.0000000000 00000103E0 /
- DATA ALNRCS(23) / .0000000000 00000019E0 /
- DATA FIRST /.TRUE./
- C***FIRST EXECUTABLE STATEMENT ALNREL
- IF (FIRST) THEN
- NLNREL = INITS (ALNRCS, 23, 0.1*R1MACH(3))
- XMIN = -1.0 + SQRT(R1MACH(4))
- ENDIF
- FIRST = .FALSE.
- C
- IF (X .LE. (-1.0)) CALL XERMSG ('SLATEC', 'ALNREL', 'X IS LE -1',
- + 2, 2)
- IF (X .LT. XMIN) CALL XERMSG ('SLATEC', 'ALNREL',
- + 'ANSWER LT HALF PRECISION BECAUSE X TOO NEAR -1', 1, 1)
- C
- IF (ABS(X).LE.0.375) ALNREL = X*(1. -
- 1 X*CSEVL (X/.375, ALNRCS, NLNREL))
- IF (ABS(X).GT.0.375) ALNREL = LOG (1.0+X)
- C
- RETURN
- END
- *DECK ASINH
- FUNCTION ASINH (X)
- C***BEGIN PROLOGUE ASINH
- C***PURPOSE Compute the arc hyperbolic sine.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C4C
- C***TYPE SINGLE PRECISION (ASINH-S, DASINH-D, CASINH-C)
- C***KEYWORDS ARC HYPERBOLIC SINE, ASINH, ELEMENTARY FUNCTIONS, FNLIB,
- C INVERSE HYPERBOLIC SINE
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C ASINH(X) computes the arc hyperbolic sine of X.
- C
- C Series for ASNH on the interval 0. to 1.00000D+00
- C with weighted error 2.19E-17
- C log weighted error 16.66
- C significant figures required 15.60
- C decimal places required 17.31
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED CSEVL, INITS, R1MACH
- C***REVISION HISTORY (YYMMDD)
- C 770401 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C***END PROLOGUE ASINH
- DIMENSION ASNHCS(20)
- LOGICAL FIRST
- SAVE ALN2, ASNHCS, NTERMS, XMAX, SQEPS, FIRST
- DATA ALN2 /0.6931471805 5994530942E0/
- DATA ASNHCS( 1) / -.1282003991 1738186E0 /
- DATA ASNHCS( 2) / -.0588117611 89951768E0 /
- DATA ASNHCS( 3) / .0047274654 32212481E0 /
- DATA ASNHCS( 4) / -.0004938363 16265361E0 /
- DATA ASNHCS( 5) / .0000585062 07058557E0 /
- DATA ASNHCS( 6) / -.0000074669 98328931E0 /
- DATA ASNHCS( 7) / .0000010011 69358355E0 /
- DATA ASNHCS( 8) / -.0000001390 35438587E0 /
- DATA ASNHCS( 9) / .0000000198 23169483E0 /
- DATA ASNHCS(10) / -.0000000028 84746841E0 /
- DATA ASNHCS(11) / .0000000004 26729654E0 /
- DATA ASNHCS(12) / -.0000000000 63976084E0 /
- DATA ASNHCS(13) / .0000000000 09699168E0 /
- DATA ASNHCS(14) / -.0000000000 01484427E0 /
- DATA ASNHCS(15) / .0000000000 00229037E0 /
- DATA ASNHCS(16) / -.0000000000 00035588E0 /
- DATA ASNHCS(17) / .0000000000 00005563E0 /
- DATA ASNHCS(18) / -.0000000000 00000874E0 /
- DATA ASNHCS(19) / .0000000000 00000138E0 /
- DATA ASNHCS(20) / -.0000000000 00000021E0 /
- DATA FIRST /.TRUE./
- C***FIRST EXECUTABLE STATEMENT ASINH
- IF (FIRST) THEN
- NTERMS = INITS (ASNHCS, 20, 0.1*R1MACH(3))
- SQEPS = SQRT (R1MACH(3))
- XMAX = 1.0/SQEPS
- ENDIF
- FIRST = .FALSE.
- C
- Y = ABS(X)
- IF (Y.GT.1.0) GO TO 20
- C
- ASINH = X
- IF (Y.GT.SQEPS) ASINH = X*(1.0 + CSEVL (2.*X*X-1., ASNHCS,NTERMS))
- RETURN
- C
- 20 IF (Y.LT.XMAX) ASINH = LOG (Y + SQRT(Y**2+1.))
- IF (Y.GE.XMAX) ASINH = ALN2 + LOG(Y)
- ASINH = SIGN (ASINH, X)
- C
- RETURN
- END
- *DECK ASYIK
- SUBROUTINE ASYIK (X, FNU, KODE, FLGIK, RA, ARG, IN, Y)
- C***BEGIN PROLOGUE ASYIK
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to BESI and BESK
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (ASYIK-S, DASYIK-D)
- C***AUTHOR Amos, D. E., (SNLA)
- C***DESCRIPTION
- C
- C ASYIK computes Bessel functions I and K
- C for arguments X.GT.0.0 and orders FNU.GE.35
- C on FLGIK = 1 and FLGIK = -1 respectively.
- C
- C INPUT
- C
- C X - argument, X.GT.0.0E0
- C FNU - order of first Bessel function
- C KODE - a parameter to indicate the scaling option
- C KODE=1 returns Y(I)= I/SUB(FNU+I-1)/(X), I=1,IN
- C or Y(I)= K/SUB(FNU+I-1)/(X), I=1,IN
- C on FLGIK = 1.0E0 or FLGIK = -1.0E0
- C KODE=2 returns Y(I)=EXP(-X)*I/SUB(FNU+I-1)/(X), I=1,IN
- C or Y(I)=EXP( X)*K/SUB(FNU+I-1)/(X), I=1,IN
- C on FLGIK = 1.0E0 or FLGIK = -1.0E0
- C FLGIK - selection parameter for I or K function
- C FLGIK = 1.0E0 gives the I function
- C FLGIK = -1.0E0 gives the K function
- C RA - SQRT(1.+Z*Z), Z=X/FNU
- C ARG - argument of the leading exponential
- C IN - number of functions desired, IN=1 or 2
- C
- C OUTPUT
- C
- C Y - a vector whose first in components contain the sequence
- C
- C Abstract
- C ASYIK implements the uniform asymptotic expansion of
- C the I and K Bessel functions for FNU.GE.35 and real
- C X.GT.0.0E0. The forms are identical except for a change
- C in sign of some of the terms. This change in sign is
- C accomplished by means of the flag FLGIK = 1 or -1.
- C
- C***SEE ALSO BESI, BESK
- C***ROUTINES CALLED R1MACH
- C***REVISION HISTORY (YYMMDD)
- C 750101 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900328 Added TYPE section. (WRB)
- C 910408 Updated the AUTHOR section. (WRB)
- C***END PROLOGUE ASYIK
- C
- INTEGER IN, J, JN, K, KK, KODE, L
- REAL AK,AP,ARG,C, COEF,CON,ETX,FLGIK,FN, FNU,GLN,RA,S1,S2,
- 1 T, TOL, T2, X, Y, Z
- REAL R1MACH
- DIMENSION Y(*), C(65), CON(2)
- SAVE CON, C
- DATA CON(1), CON(2) /
- 1 3.98942280401432678E-01, 1.25331413731550025E+00/
- DATA C(1), C(2), C(3), C(4), C(5), C(6), C(7), C(8), C(9), C(10),
- 1 C(11), C(12), C(13), C(14), C(15), C(16), C(17), C(18),
- 2 C(19), C(20), C(21), C(22), C(23), C(24)/
- 3 -2.08333333333333E-01, 1.25000000000000E-01,
- 4 3.34201388888889E-01, -4.01041666666667E-01,
- 5 7.03125000000000E-02, -1.02581259645062E+00,
- 6 1.84646267361111E+00, -8.91210937500000E-01,
- 7 7.32421875000000E-02, 4.66958442342625E+00,
- 8 -1.12070026162230E+01, 8.78912353515625E+00,
- 9 -2.36408691406250E+00, 1.12152099609375E-01,
- 1 -2.82120725582002E+01, 8.46362176746007E+01,
- 2 -9.18182415432400E+01, 4.25349987453885E+01,
- 3 -7.36879435947963E+00, 2.27108001708984E-01,
- 4 2.12570130039217E+02, -7.65252468141182E+02,
- 5 1.05999045252800E+03, -6.99579627376133E+02/
- DATA C(25), C(26), C(27), C(28), C(29), C(30), C(31), C(32),
- 1 C(33), C(34), C(35), C(36), C(37), C(38), C(39), C(40),
- 2 C(41), C(42), C(43), C(44), C(45), C(46), C(47), C(48)/
- 3 2.18190511744212E+02, -2.64914304869516E+01,
- 4 5.72501420974731E-01, -1.91945766231841E+03,
- 5 8.06172218173731E+03, -1.35865500064341E+04,
- 6 1.16553933368645E+04, -5.30564697861340E+03,
- 7 1.20090291321635E+03, -1.08090919788395E+02,
- 8 1.72772750258446E+00, 2.02042913309661E+04,
- 9 -9.69805983886375E+04, 1.92547001232532E+05,
- 1 -2.03400177280416E+05, 1.22200464983017E+05,
- 2 -4.11926549688976E+04, 7.10951430248936E+03,
- 3 -4.93915304773088E+02, 6.07404200127348E+00,
- 4 -2.42919187900551E+05, 1.31176361466298E+06,
- 5 -2.99801591853811E+06, 3.76327129765640E+06/
- DATA C(49), C(50), C(51), C(52), C(53), C(54), C(55), C(56),
- 1 C(57), C(58), C(59), C(60), C(61), C(62), C(63), C(64),
- 2 C(65)/
- 3 -2.81356322658653E+06, 1.26836527332162E+06,
- 4 -3.31645172484564E+05, 4.52187689813627E+04,
- 5 -2.49983048181121E+03, 2.43805296995561E+01,
- 6 3.28446985307204E+06, -1.97068191184322E+07,
- 7 5.09526024926646E+07, -7.41051482115327E+07,
- 8 6.63445122747290E+07, -3.75671766607634E+07,
- 9 1.32887671664218E+07, -2.78561812808645E+06,
- 1 3.08186404612662E+05, -1.38860897537170E+04,
- 2 1.10017140269247E+02/
- C***FIRST EXECUTABLE STATEMENT ASYIK
- TOL = R1MACH(3)
- TOL = MAX(TOL,1.0E-15)
- FN = FNU
- Z = (3.0E0-FLGIK)/2.0E0
- KK = INT(Z)
- DO 50 JN=1,IN
- IF (JN.EQ.1) GO TO 10
- FN = FN - FLGIK
- Z = X/FN
- RA = SQRT(1.0E0+Z*Z)
- GLN = LOG((1.0E0+RA)/Z)
- ETX = KODE - 1
- T = RA*(1.0E0-ETX) + ETX/(Z+RA)
- ARG = FN*(T-GLN)*FLGIK
- 10 COEF = EXP(ARG)
- T = 1.0E0/RA
- T2 = T*T
- T = T/FN
- T = SIGN(T,FLGIK)
- S2 = 1.0E0
- AP = 1.0E0
- L = 0
- DO 30 K=2,11
- L = L + 1
- S1 = C(L)
- DO 20 J=2,K
- L = L + 1
- S1 = S1*T2 + C(L)
- 20 CONTINUE
- AP = AP*T
- AK = AP*S1
- S2 = S2 + AK
- IF (MAX(ABS(AK),ABS(AP)) .LT. TOL) GO TO 40
- 30 CONTINUE
- 40 CONTINUE
- T = ABS(T)
- Y(JN) = S2*COEF*SQRT(T)*CON(KK)
- 50 CONTINUE
- RETURN
- END
- *DECK ASYJY
- SUBROUTINE ASYJY (FUNJY, X, FNU, FLGJY, IN, Y, WK, IFLW)
- C***BEGIN PROLOGUE ASYJY
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to BESJ and BESY
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (ASYJY-S, DASYJY-D)
- C***AUTHOR Amos, D. E., (SNLA)
- C***DESCRIPTION
- C
- C ASYJY computes Bessel functions J and Y
- C for arguments X.GT.0.0 and orders FNU.GE.35.0
- C on FLGJY = 1 and FLGJY = -1 respectively
- C
- C INPUT
- C
- C FUNJY - external function JAIRY or YAIRY
- C X - argument, X.GT.0.0E0
- C FNU - order of the first Bessel function
- C FLGJY - selection flag
- C FLGJY = 1.0E0 gives the J function
- C FLGJY = -1.0E0 gives the Y function
- C IN - number of functions desired, IN = 1 or 2
- C
- C OUTPUT
- C
- C Y - a vector whose first in components contain the sequence
- C IFLW - a flag indicating underflow or overflow
- C return variables for BESJ only
- C WK(1) = 1 - (X/FNU)**2 = W**2
- C WK(2) = SQRT(ABS(WK(1)))
- C WK(3) = ABS(WK(2) - ATAN(WK(2))) or
- C ABS(LN((1 + WK(2))/(X/FNU)) - WK(2))
- C = ABS((2/3)*ZETA**(3/2))
- C WK(4) = FNU*WK(3)
- C WK(5) = (1.5*WK(3)*FNU)**(1/3) = SQRT(ZETA)*FNU**(1/3)
- C WK(6) = SIGN(1.,W**2)*WK(5)**2 = SIGN(1.,W**2)*ZETA*FNU**(2/3)
- C WK(7) = FNU**(1/3)
- C
- C Abstract
- C ASYJY implements the uniform asymptotic expansion of
- C the J and Y Bessel functions for FNU.GE.35 and real
- C X.GT.0.0E0. The forms are identical except for a change
- C in sign of some of the terms. This change in sign is
- C accomplished by means of the flag FLGJY = 1 or -1. On
- C FLGJY = 1 the AIRY functions AI(X) and DAI(X) are
- C supplied by the external function JAIRY, and on
- C FLGJY = -1 the AIRY functions BI(X) and DBI(X) are
- C supplied by the external function YAIRY.
- C
- C***SEE ALSO BESJ, BESY
- C***ROUTINES CALLED I1MACH, R1MACH
- C***REVISION HISTORY (YYMMDD)
- C 750101 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 891009 Removed unreferenced variable. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900328 Added TYPE section. (WRB)
- C 910408 Updated the AUTHOR section. (WRB)
- C***END PROLOGUE ASYJY
- INTEGER I, IFLW, IN, J, JN,JR,JU,K, KB,KLAST,KMAX,KP1, KS, KSP1,
- * KSTEMP, L, LR, LRP1, ISETA, ISETB
- INTEGER I1MACH
- REAL ABW2, AKM, ALFA, ALFA1, ALFA2, AP, AR, ASUM, AZ,
- * BETA, BETA1, BETA2, BETA3, BR, BSUM, C, CON1, CON2,
- * CON548,CR,CRZ32, DFI,ELIM, DR,FI, FLGJY, FN, FNU,
- * FN2, GAMA, PHI, RCZ, RDEN, RELB, RFN2, RTZ, RZDEN,
- * SA, SB, SUMA, SUMB, S1, TA, TAU, TB, TFN, TOL, TOLS, T2, UPOL,
- * WK, X, XX, Y, Z, Z32
- REAL R1MACH
- DIMENSION Y(*), WK(*), C(65)
- DIMENSION ALFA(26,4), BETA(26,5)
- DIMENSION ALFA1(26,2), ALFA2(26,2)
- DIMENSION BETA1(26,2), BETA2(26,2), BETA3(26,1)
- DIMENSION GAMA(26), KMAX(5), AR(8), BR(10), UPOL(10)
- DIMENSION CR(10), DR(10)
- EQUIVALENCE (ALFA(1,1),ALFA1(1,1))
- EQUIVALENCE (ALFA(1,3),ALFA2(1,1))
- EQUIVALENCE (BETA(1,1),BETA1(1,1))
- EQUIVALENCE (BETA(1,3),BETA2(1,1))
- EQUIVALENCE (BETA(1,5),BETA3(1,1))
- SAVE TOLS, CON1, CON2, CON548, AR, BR, C, ALFA1, ALFA2,
- 1 BETA1, BETA2, BETA3, GAMA
- DATA TOLS /-6.90775527898214E+00/
- DATA CON1,CON2,CON548/
- 1 6.66666666666667E-01, 3.33333333333333E-01, 1.04166666666667E-01/
- DATA AR(1), AR(2), AR(3), AR(4), AR(5), AR(6), AR(7),
- A AR(8) / 8.35503472222222E-02, 1.28226574556327E-01,
- 1 2.91849026464140E-01, 8.81627267443758E-01, 3.32140828186277E+00,
- 2 1.49957629868626E+01, 7.89230130115865E+01, 4.74451538868264E+02/
- DATA BR(1), BR(2), BR(3), BR(4), BR(5), BR(6), BR(7), BR(8),
- A BR(9), BR(10) /-1.45833333333333E-01,-9.87413194444444E-02,
- 1-1.43312053915895E-01,-3.17227202678414E-01,-9.42429147957120E-01,
- 2-3.51120304082635E+00,-1.57272636203680E+01,-8.22814390971859E+01,
- 3-4.92355370523671E+02,-3.31621856854797E+03/
- DATA C(1), C(2), C(3), C(4), C(5), C(6), C(7), C(8), C(9), C(10),
- 1 C(11), C(12), C(13), C(14), C(15), C(16), C(17), C(18),
- 2 C(19), C(20), C(21), C(22), C(23), C(24)/
- 3 -2.08333333333333E-01, 1.25000000000000E-01,
- 4 3.34201388888889E-01, -4.01041666666667E-01,
- 5 7.03125000000000E-02, -1.02581259645062E+00,
- 6 1.84646267361111E+00, -8.91210937500000E-01,
- 7 7.32421875000000E-02, 4.66958442342625E+00,
- 8 -1.12070026162230E+01, 8.78912353515625E+00,
- 9 -2.36408691406250E+00, 1.12152099609375E-01,
- A -2.82120725582002E+01, 8.46362176746007E+01,
- B -9.18182415432400E+01, 4.25349987453885E+01,
- C -7.36879435947963E+00, 2.27108001708984E-01,
- D 2.12570130039217E+02, -7.65252468141182E+02,
- E 1.05999045252800E+03, -6.99579627376133E+02/
- DATA C(25), C(26), C(27), C(28), C(29), C(30), C(31), C(32),
- 1 C(33), C(34), C(35), C(36), C(37), C(38), C(39), C(40),
- 2 C(41), C(42), C(43), C(44), C(45), C(46), C(47), C(48)/
- 3 2.18190511744212E+02, -2.64914304869516E+01,
- 4 5.72501420974731E-01, -1.91945766231841E+03,
- 5 8.06172218173731E+03, -1.35865500064341E+04,
- 6 1.16553933368645E+04, -5.30564697861340E+03,
- 7 1.20090291321635E+03, -1.08090919788395E+02,
- 8 1.72772750258446E+00, 2.02042913309661E+04,
- 9 -9.69805983886375E+04, 1.92547001232532E+05,
- A -2.03400177280416E+05, 1.22200464983017E+05,
- B -4.11926549688976E+04, 7.10951430248936E+03,
- C -4.93915304773088E+02, 6.07404200127348E+00,
- D -2.42919187900551E+05, 1.31176361466298E+06,
- E -2.99801591853811E+06, 3.76327129765640E+06/
- DATA C(49), C(50), C(51), C(52), C(53), C(54), C(55), C(56),
- 1 C(57), C(58), C(59), C(60), C(61), C(62), C(63), C(64),
- 2 C(65)/
- 3 -2.81356322658653E+06, 1.26836527332162E+06,
- 4 -3.31645172484564E+05, 4.52187689813627E+04,
- 5 -2.49983048181121E+03, 2.43805296995561E+01,
- 6 3.28446985307204E+06, -1.97068191184322E+07,
- 7 5.09526024926646E+07, -7.41051482115327E+07,
- 8 6.63445122747290E+07, -3.75671766607634E+07,
- 9 1.32887671664218E+07, -2.78561812808645E+06,
- A 3.08186404612662E+05, -1.38860897537170E+04,
- B 1.10017140269247E+02/
- DATA ALFA1(1,1), ALFA1(2,1), ALFA1(3,1), ALFA1(4,1), ALFA1(5,1),
- 1 ALFA1(6,1), ALFA1(7,1), ALFA1(8,1), ALFA1(9,1), ALFA1(10,1),
- 2 ALFA1(11,1),ALFA1(12,1),ALFA1(13,1),ALFA1(14,1),ALFA1(15,1),
- 3 ALFA1(16,1),ALFA1(17,1),ALFA1(18,1),ALFA1(19,1),ALFA1(20,1),
- 4 ALFA1(21,1),ALFA1(22,1),ALFA1(23,1),ALFA1(24,1),ALFA1(25,1),
- 5 ALFA1(26,1) /-4.44444444444444E-03,-9.22077922077922E-04,
- 6-8.84892884892885E-05, 1.65927687832450E-04, 2.46691372741793E-04,
- 7 2.65995589346255E-04, 2.61824297061501E-04, 2.48730437344656E-04,
- 8 2.32721040083232E-04, 2.16362485712365E-04, 2.00738858762752E-04,
- 9 1.86267636637545E-04, 1.73060775917876E-04, 1.61091705929016E-04,
- 1 1.50274774160908E-04, 1.40503497391270E-04, 1.31668816545923E-04,
- 2 1.23667445598253E-04, 1.16405271474738E-04, 1.09798298372713E-04,
- 3 1.03772410422993E-04, 9.82626078369363E-05, 9.32120517249503E-05,
- 4 8.85710852478712E-05, 8.42963105715700E-05, 8.03497548407791E-05/
- DATA ALFA1(1,2), ALFA1(2,2), ALFA1(3,2), ALFA1(4,2), ALFA1(5,2),
- 1 ALFA1(6,2), ALFA1(7,2), ALFA1(8,2), ALFA1(9,2), ALFA1(10,2),
- 2 ALFA1(11,2),ALFA1(12,2),ALFA1(13,2),ALFA1(14,2),ALFA1(15,2),
- 3 ALFA1(16,2),ALFA1(17,2),ALFA1(18,2),ALFA1(19,2),ALFA1(20,2),
- 4 ALFA1(21,2),ALFA1(22,2),ALFA1(23,2),ALFA1(24,2),ALFA1(25,2),
- 5 ALFA1(26,2) / 6.93735541354589E-04, 2.32241745182922E-04,
- 6-1.41986273556691E-05,-1.16444931672049E-04,-1.50803558053049E-04,
- 7-1.55121924918096E-04,-1.46809756646466E-04,-1.33815503867491E-04,
- 8-1.19744975684254E-04,-1.06184319207974E-04,-9.37699549891194E-05,
- 9-8.26923045588193E-05,-7.29374348155221E-05,-6.44042357721016E-05,
- 1-5.69611566009369E-05,-5.04731044303562E-05,-4.48134868008883E-05,
- 2-3.98688727717599E-05,-3.55400532972042E-05,-3.17414256609022E-05,
- 3-2.83996793904175E-05,-2.54522720634871E-05,-2.28459297164725E-05,
- 4-2.05352753106481E-05,-1.84816217627666E-05,-1.66519330021394E-05/
- DATA ALFA2(1,1), ALFA2(2,1), ALFA2(3,1), ALFA2(4,1), ALFA2(5,1),
- 1 ALFA2(6,1), ALFA2(7,1), ALFA2(8,1), ALFA2(9,1), ALFA2(10,1),
- 2 ALFA2(11,1),ALFA2(12,1),ALFA2(13,1),ALFA2(14,1),ALFA2(15,1),
- 3 ALFA2(16,1),ALFA2(17,1),ALFA2(18,1),ALFA2(19,1),ALFA2(20,1),
- 4 ALFA2(21,1),ALFA2(22,1),ALFA2(23,1),ALFA2(24,1),ALFA2(25,1),
- 5 ALFA2(26,1) /-3.54211971457744E-04,-1.56161263945159E-04,
- 6 3.04465503594936E-05, 1.30198655773243E-04, 1.67471106699712E-04,
- 7 1.70222587683593E-04, 1.56501427608595E-04, 1.36339170977445E-04,
- 8 1.14886692029825E-04, 9.45869093034688E-05, 7.64498419250898E-05,
- 9 6.07570334965197E-05, 4.74394299290509E-05, 3.62757512005344E-05,
- 1 2.69939714979225E-05, 1.93210938247939E-05, 1.30056674793963E-05,
- 2 7.82620866744497E-06, 3.59257485819352E-06, 1.44040049814252E-07,
- 3-2.65396769697939E-06,-4.91346867098486E-06,-6.72739296091248E-06,
- 4-8.17269379678658E-06,-9.31304715093561E-06,-1.02011418798016E-05/
- DATA ALFA2(1,2), ALFA2(2,2), ALFA2(3,2), ALFA2(4,2), ALFA2(5,2),
- 1 ALFA2(6,2), ALFA2(7,2), ALFA2(8,2), ALFA2(9,2), ALFA2(10,2),
- 2 ALFA2(11,2),ALFA2(12,2),ALFA2(13,2),ALFA2(14,2),ALFA2(15,2),
- 3 ALFA2(16,2),ALFA2(17,2),ALFA2(18,2),ALFA2(19,2),ALFA2(20,2),
- 4 ALFA2(21,2),ALFA2(22,2),ALFA2(23,2),ALFA2(24,2),ALFA2(25,2),
- 5 ALFA2(26,2) / 3.78194199201773E-04, 2.02471952761816E-04,
- 6-6.37938506318862E-05,-2.38598230603006E-04,-3.10916256027362E-04,
- 7-3.13680115247576E-04,-2.78950273791323E-04,-2.28564082619141E-04,
- 8-1.75245280340847E-04,-1.25544063060690E-04,-8.22982872820208E-05,
- 9-4.62860730588116E-05,-1.72334302366962E-05, 5.60690482304602E-06,
- 1 2.31395443148287E-05, 3.62642745856794E-05, 4.58006124490189E-05,
- 2 5.24595294959114E-05, 5.68396208545815E-05, 5.94349820393104E-05,
- 3 6.06478527578422E-05, 6.08023907788436E-05, 6.01577894539460E-05,
- 4 5.89199657344698E-05, 5.72515823777593E-05, 5.52804375585853E-05/
- DATA BETA1(1,1), BETA1(2,1), BETA1(3,1), BETA1(4,1), BETA1(5,1),
- 1 BETA1(6,1), BETA1(7,1), BETA1(8,1), BETA1(9,1), BETA1(10,1),
- 2 BETA1(11,1),BETA1(12,1),BETA1(13,1),BETA1(14,1),BETA1(15,1),
- 3 BETA1(16,1),BETA1(17,1),BETA1(18,1),BETA1(19,1),BETA1(20,1),
- 4 BETA1(21,1),BETA1(22,1),BETA1(23,1),BETA1(24,1),BETA1(25,1),
- 5 BETA1(26,1) / 1.79988721413553E-02, 5.59964911064388E-03,
- 6 2.88501402231133E-03, 1.80096606761054E-03, 1.24753110589199E-03,
- 7 9.22878876572938E-04, 7.14430421727287E-04, 5.71787281789705E-04,
- 8 4.69431007606482E-04, 3.93232835462917E-04, 3.34818889318298E-04,
- 9 2.88952148495752E-04, 2.52211615549573E-04, 2.22280580798883E-04,
- 1 1.97541838033063E-04, 1.76836855019718E-04, 1.59316899661821E-04,
- 2 1.44347930197334E-04, 1.31448068119965E-04, 1.20245444949303E-04,
- 3 1.10449144504599E-04, 1.01828770740567E-04, 9.41998224204238E-05,
- 4 8.74130545753834E-05, 8.13466262162801E-05, 7.59002269646219E-05/
- DATA BETA1(1,2), BETA1(2,2), BETA1(3,2), BETA1(4,2), BETA1(5,2),
- 1 BETA1(6,2), BETA1(7,2), BETA1(8,2), BETA1(9,2), BETA1(10,2),
- 2 BETA1(11,2),BETA1(12,2),BETA1(13,2),BETA1(14,2),BETA1(15,2),
- 3 BETA1(16,2),BETA1(17,2),BETA1(18,2),BETA1(19,2),BETA1(20,2),
- 4 BETA1(21,2),BETA1(22,2),BETA1(23,2),BETA1(24,2),BETA1(25,2),
- 5 BETA1(26,2) /-1.49282953213429E-03,-8.78204709546389E-04,
- 6-5.02916549572035E-04,-2.94822138512746E-04,-1.75463996970783E-04,
- 7-1.04008550460816E-04,-5.96141953046458E-05,-3.12038929076098E-05,
- 8-1.26089735980230E-05,-2.42892608575730E-07, 8.05996165414274E-06,
- 9 1.36507009262147E-05, 1.73964125472926E-05, 1.98672978842134E-05,
- 1 2.14463263790823E-05, 2.23954659232457E-05, 2.28967783814713E-05,
- 2 2.30785389811178E-05, 2.30321976080909E-05, 2.28236073720349E-05,
- 3 2.25005881105292E-05, 2.20981015361991E-05, 2.16418427448104E-05,
- 4 2.11507649256221E-05, 2.06388749782171E-05, 2.01165241997082E-05/
- DATA BETA2(1,1), BETA2(2,1), BETA2(3,1), BETA2(4,1), BETA2(5,1),
- 1 BETA2(6,1), BETA2(7,1), BETA2(8,1), BETA2(9,1), BETA2(10,1),
- 2 BETA2(11,1),BETA2(12,1),BETA2(13,1),BETA2(14,1),BETA2(15,1),
- 3 BETA2(16,1),BETA2(17,1),BETA2(18,1),BETA2(19,1),BETA2(20,1),
- 4 BETA2(21,1),BETA2(22,1),BETA2(23,1),BETA2(24,1),BETA2(25,1),
- 5 BETA2(26,1) / 5.52213076721293E-04, 4.47932581552385E-04,
- 6 2.79520653992021E-04, 1.52468156198447E-04, 6.93271105657044E-05,
- 7 1.76258683069991E-05,-1.35744996343269E-05,-3.17972413350427E-05,
- 8-4.18861861696693E-05,-4.69004889379141E-05,-4.87665447413787E-05,
- 9-4.87010031186735E-05,-4.74755620890087E-05,-4.55813058138628E-05,
- 1-4.33309644511266E-05,-4.09230193157750E-05,-3.84822638603221E-05,
- 2-3.60857167535411E-05,-3.37793306123367E-05,-3.15888560772110E-05,
- 3-2.95269561750807E-05,-2.75978914828336E-05,-2.58006174666884E-05,
- 4-2.41308356761280E-05,-2.25823509518346E-05,-2.11479656768913E-05/
- DATA BETA2(1,2), BETA2(2,2), BETA2(3,2), BETA2(4,2), BETA2(5,2),
- 1 BETA2(6,2), BETA2(7,2), BETA2(8,2), BETA2(9,2), BETA2(10,2),
- 2 BETA2(11,2),BETA2(12,2),BETA2(13,2),BETA2(14,2),BETA2(15,2),
- 3 BETA2(16,2),BETA2(17,2),BETA2(18,2),BETA2(19,2),BETA2(20,2),
- 4 BETA2(21,2),BETA2(22,2),BETA2(23,2),BETA2(24,2),BETA2(25,2),
- 5 BETA2(26,2) /-4.74617796559960E-04,-4.77864567147321E-04,
- 6-3.20390228067038E-04,-1.61105016119962E-04,-4.25778101285435E-05,
- 7 3.44571294294968E-05, 7.97092684075675E-05, 1.03138236708272E-04,
- 8 1.12466775262204E-04, 1.13103642108481E-04, 1.08651634848774E-04,
- 9 1.01437951597662E-04, 9.29298396593364E-05, 8.40293133016090E-05,
- 1 7.52727991349134E-05, 6.69632521975731E-05, 5.92564547323195E-05,
- 2 5.22169308826976E-05, 4.58539485165361E-05, 4.01445513891487E-05,
- 3 3.50481730031328E-05, 3.05157995034347E-05, 2.64956119950516E-05,
- 4 2.29363633690998E-05, 1.97893056664022E-05, 1.70091984636413E-05/
- DATA BETA3(1,1), BETA3(2,1), BETA3(3,1), BETA3(4,1), BETA3(5,1),
- 1 BETA3(6,1), BETA3(7,1), BETA3(8,1), BETA3(9,1), BETA3(10,1),
- 2 BETA3(11,1),BETA3(12,1),BETA3(13,1),BETA3(14,1),BETA3(15,1),
- 3 BETA3(16,1),BETA3(17,1),BETA3(18,1),BETA3(19,1),BETA3(20,1),
- 4 BETA3(21,1),BETA3(22,1),BETA3(23,1),BETA3(24,1),BETA3(25,1),
- 5 BETA3(26,1) / 7.36465810572578E-04, 8.72790805146194E-04,
- 6 6.22614862573135E-04, 2.85998154194304E-04, 3.84737672879366E-06,
- 7-1.87906003636972E-04,-2.97603646594555E-04,-3.45998126832656E-04,
- 8-3.53382470916038E-04,-3.35715635775049E-04,-3.04321124789040E-04,
- 9-2.66722723047613E-04,-2.27654214122820E-04,-1.89922611854562E-04,
- 1-1.55058918599094E-04,-1.23778240761874E-04,-9.62926147717644E-05,
- 2-7.25178327714425E-05,-5.22070028895634E-05,-3.50347750511901E-05,
- 3-2.06489761035552E-05,-8.70106096849767E-06, 1.13698686675100E-06,
- 4 9.16426474122779E-06, 1.56477785428873E-05, 2.08223629482467E-05/
- DATA GAMA(1), GAMA(2), GAMA(3), GAMA(4), GAMA(5),
- 1 GAMA(6), GAMA(7), GAMA(8), GAMA(9), GAMA(10),
- 2 GAMA(11), GAMA(12), GAMA(13), GAMA(14), GAMA(15),
- 3 GAMA(16), GAMA(17), GAMA(18), GAMA(19), GAMA(20),
- 4 GAMA(21), GAMA(22), GAMA(23), GAMA(24), GAMA(25),
- 5 GAMA(26) / 6.29960524947437E-01, 2.51984209978975E-01,
- 6 1.54790300415656E-01, 1.10713062416159E-01, 8.57309395527395E-02,
- 7 6.97161316958684E-02, 5.86085671893714E-02, 5.04698873536311E-02,
- 8 4.42600580689155E-02, 3.93720661543510E-02, 3.54283195924455E-02,
- 9 3.21818857502098E-02, 2.94646240791158E-02, 2.71581677112934E-02,
- 1 2.51768272973862E-02, 2.34570755306079E-02, 2.19508390134907E-02,
- 2 2.06210828235646E-02, 1.94388240897881E-02, 1.83810633800683E-02,
- 3 1.74293213231963E-02, 1.65685837786612E-02, 1.57865285987918E-02,
- 4 1.50729501494096E-02, 1.44193250839955E-02, 1.38184805735342E-02/
- C***FIRST EXECUTABLE STATEMENT ASYJY
- TA = R1MACH(3)
- TOL = MAX(TA,1.0E-15)
- TB = R1MACH(5)
- JU = I1MACH(12)
- IF(FLGJY.EQ.1.0E0) GO TO 6
- JR = I1MACH(11)
- ELIM = -2.303E0*TB*(JU+JR)
- GO TO 7
- 6 CONTINUE
- ELIM = -2.303E0*(TB*JU+3.0E0)
- 7 CONTINUE
- FN = FNU
- IFLW = 0
- DO 170 JN=1,IN
- XX = X/FN
- WK(1) = 1.0E0 - XX*XX
- ABW2 = ABS(WK(1))
- WK(2) = SQRT(ABW2)
- WK(7) = FN**CON2
- IF (ABW2.GT.0.27750E0) GO TO 80
- C
- C ASYMPTOTIC EXPANSION
- C CASES NEAR X=FN, ABS(1.-(X/FN)**2).LE.0.2775
- C COEFFICIENTS OF ASYMPTOTIC EXPANSION BY SERIES
- C
- C ZETA AND TRUNCATION FOR A(ZETA) AND B(ZETA) SERIES
- C
- C KMAX IS TRUNCATION INDEX FOR A(ZETA) AND B(ZETA) SERIES=MAX(2,SA)
- C
- SA = 0.0E0
- IF (ABW2.EQ.0.0E0) GO TO 10
- SA = TOLS/LOG(ABW2)
- 10 SB = SA
- DO 20 I=1,5
- AKM = MAX(SA,2.0E0)
- KMAX(I) = INT(AKM)
- SA = SA + SB
- 20 CONTINUE
- KB = KMAX(5)
- KLAST = KB - 1
- SA = GAMA(KB)
- DO 30 K=1,KLAST
- KB = KB - 1
- SA = SA*WK(1) + GAMA(KB)
- 30 CONTINUE
- Z = WK(1)*SA
- AZ = ABS(Z)
- RTZ = SQRT(AZ)
- WK(3) = CON1*AZ*RTZ
- WK(4) = WK(3)*FN
- WK(5) = RTZ*WK(7)
- WK(6) = -WK(5)*WK(5)
- IF(Z.LE.0.0E0) GO TO 35
- IF(WK(4).GT.ELIM) GO TO 75
- WK(6) = -WK(6)
- 35 CONTINUE
- PHI = SQRT(SQRT(SA+SA+SA+SA))
- C
- C B(ZETA) FOR S=0
- C
- KB = KMAX(5)
- KLAST = KB - 1
- SB = BETA(KB,1)
- DO 40 K=1,KLAST
- KB = KB - 1
- SB = SB*WK(1) + BETA(KB,1)
- 40 CONTINUE
- KSP1 = 1
- FN2 = FN*FN
- RFN2 = 1.0E0/FN2
- RDEN = 1.0E0
- ASUM = 1.0E0
- RELB = TOL*ABS(SB)
- BSUM = SB
- DO 60 KS=1,4
- KSP1 = KSP1 + 1
- RDEN = RDEN*RFN2
- C
- C A(ZETA) AND B(ZETA) FOR S=1,2,3,4
- C
- KSTEMP = 5 - KS
- KB = KMAX(KSTEMP)
- KLAST = KB - 1
- SA = ALFA(KB,KS)
- SB = BETA(KB,KSP1)
- DO 50 K=1,KLAST
- KB = KB - 1
- SA = SA*WK(1) + ALFA(KB,KS)
- SB = SB*WK(1) + BETA(KB,KSP1)
- 50 CONTINUE
- TA = SA*RDEN
- TB = SB*RDEN
- ASUM = ASUM + TA
- BSUM = BSUM + TB
- IF (ABS(TA).LE.TOL .AND. ABS(TB).LE.RELB) GO TO 70
- 60 CONTINUE
- 70 CONTINUE
- BSUM = BSUM/(FN*WK(7))
- GO TO 160
- C
- 75 CONTINUE
- IFLW = 1
- RETURN
- C
- 80 CONTINUE
- UPOL(1) = 1.0E0
- TAU = 1.0E0/WK(2)
- T2 = 1.0E0/WK(1)
- IF (WK(1).GE.0.0E0) GO TO 90
- C
- C CASES FOR (X/FN).GT.SQRT(1.2775)
- C
- WK(3) = ABS(WK(2)-ATAN(WK(2)))
- WK(4) = WK(3)*FN
- RCZ = -CON1/WK(4)
- Z32 = 1.5E0*WK(3)
- RTZ = Z32**CON2
- WK(5) = RTZ*WK(7)
- WK(6) = -WK(5)*WK(5)
- GO TO 100
- 90 CONTINUE
- C
- C CASES FOR (X/FN).LT.SQRT(0.7225)
- C
- WK(3) = ABS(LOG((1.0E0+WK(2))/XX)-WK(2))
- WK(4) = WK(3)*FN
- RCZ = CON1/WK(4)
- IF(WK(4).GT.ELIM) GO TO 75
- Z32 = 1.5E0*WK(3)
- RTZ = Z32**CON2
- WK(7) = FN**CON2
- WK(5) = RTZ*WK(7)
- WK(6) = WK(5)*WK(5)
- 100 CONTINUE
- PHI = SQRT((RTZ+RTZ)*TAU)
- TB = 1.0E0
- ASUM = 1.0E0
- TFN = TAU/FN
- RDEN=1.0E0/FN
- RFN2=RDEN*RDEN
- RDEN=1.0E0
- UPOL(2) = (C(1)*T2+C(2))*TFN
- CRZ32 = CON548*RCZ
- BSUM = UPOL(2) + CRZ32
- RELB = TOL*ABS(BSUM)
- AP = TFN
- KS = 0
- KP1 = 2
- RZDEN = RCZ
- L = 2
- ISETA=0
- ISETB=0
- DO 140 LR=2,8,2
- C
- C COMPUTE TWO U POLYNOMIALS FOR NEXT A(ZETA) AND B(ZETA)
- C
- LRP1 = LR + 1
- DO 120 K=LR,LRP1
- KS = KS + 1
- KP1 = KP1 + 1
- L = L + 1
- S1 = C(L)
- DO 110 J=2,KP1
- L = L + 1
- S1 = S1*T2 + C(L)
- 110 CONTINUE
- AP = AP*TFN
- UPOL(KP1) = AP*S1
- CR(KS) = BR(KS)*RZDEN
- RZDEN = RZDEN*RCZ
- DR(KS) = AR(KS)*RZDEN
- 120 CONTINUE
- SUMA = UPOL(LRP1)
- SUMB = UPOL(LR+2) + UPOL(LRP1)*CRZ32
- JU = LRP1
- DO 130 JR=1,LR
- JU = JU - 1
- SUMA = SUMA + CR(JR)*UPOL(JU)
- SUMB = SUMB + DR(JR)*UPOL(JU)
- 130 CONTINUE
- RDEN=RDEN*RFN2
- TB = -TB
- IF (WK(1).GT.0.0E0) TB = ABS(TB)
- IF (RDEN.LT.TOL) GO TO 131
- ASUM = ASUM + SUMA*TB
- BSUM = BSUM + SUMB*TB
- GO TO 140
- 131 IF(ISETA.EQ.1) GO TO 132
- IF(ABS(SUMA).LT.TOL) ISETA=1
- ASUM=ASUM+SUMA*TB
- 132 IF(ISETB.EQ.1) GO TO 133
- IF(ABS(SUMB).LT.RELB) ISETB=1
- BSUM=BSUM+SUMB*TB
- 133 IF(ISETA.EQ.1 .AND. ISETB.EQ.1) GO TO 150
- 140 CONTINUE
- 150 TB = WK(5)
- IF (WK(1).GT.0.0E0) TB = -TB
- BSUM = BSUM/TB
- C
- 160 CONTINUE
- CALL FUNJY(WK(6), WK(5), WK(4), FI, DFI)
- TA=1.0E0/TOL
- TB=R1MACH(1)*TA*1.0E+3
- IF(ABS(FI).GT.TB) GO TO 165
- FI=FI*TA
- DFI=DFI*TA
- PHI=PHI*TOL
- 165 CONTINUE
- Y(JN) = FLGJY*PHI*(FI*ASUM+DFI*BSUM)/WK(7)
- FN = FN - FLGJY
- 170 CONTINUE
- RETURN
- END
- *DECK ATANH
- FUNCTION ATANH (X)
- C***BEGIN PROLOGUE ATANH
- C***PURPOSE Compute the arc hyperbolic tangent.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C4C
- C***TYPE SINGLE PRECISION (ATANH-S, DATANH-D, CATANH-C)
- C***KEYWORDS ARC HYPERBOLIC TANGENT, ATANH, ELEMENTARY FUNCTIONS,
- C FNLIB, INVERSE HYPERBOLIC TANGENT
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C ATANH(X) computes the arc hyperbolic tangent of X.
- C
- C Series for ATNH on the interval 0. to 2.50000D-01
- C with weighted error 6.70E-18
- C log weighted error 17.17
- C significant figures required 16.01
- C decimal places required 17.76
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED CSEVL, INITS, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770401 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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***END PROLOGUE ATANH
- DIMENSION ATNHCS(15)
- LOGICAL FIRST
- SAVE ATNHCS, NTERMS, DXREL, SQEPS, FIRST
- DATA ATNHCS( 1) / .0943951023 93195492E0 /
- DATA ATNHCS( 2) / .0491984370 55786159E0 /
- DATA ATNHCS( 3) / .0021025935 22455432E0 /
- DATA ATNHCS( 4) / .0001073554 44977611E0 /
- DATA ATNHCS( 5) / .0000059782 67249293E0 /
- DATA ATNHCS( 6) / .0000003505 06203088E0 /
- DATA ATNHCS( 7) / .0000000212 63743437E0 /
- DATA ATNHCS( 8) / .0000000013 21694535E0 /
- DATA ATNHCS( 9) / .0000000000 83658755E0 /
- DATA ATNHCS(10) / .0000000000 05370503E0 /
- DATA ATNHCS(11) / .0000000000 00348665E0 /
- DATA ATNHCS(12) / .0000000000 00022845E0 /
- DATA ATNHCS(13) / .0000000000 00001508E0 /
- DATA ATNHCS(14) / .0000000000 00000100E0 /
- DATA ATNHCS(15) / .0000000000 00000006E0 /
- DATA FIRST /.TRUE./
- C***FIRST EXECUTABLE STATEMENT ATANH
- IF (FIRST) THEN
- NTERMS = INITS (ATNHCS, 15, 0.1*R1MACH(3))
- DXREL = SQRT (R1MACH(4))
- SQEPS = SQRT (3.0*R1MACH(3))
- ENDIF
- FIRST = .FALSE.
- C
- Y = ABS(X)
- IF (Y .GE. 1.0) CALL XERMSG ('SLATEC', 'ATANH', 'ABS(X) GE 1', 2,
- + 2)
- C
- IF (1.0-Y .LT. DXREL) CALL XERMSG ('SLATEC', 'ATANH',
- + 'ANSWER LT HALF PRECISION BECAUSE ABS(X) TOO NEAR 1', 1, 1)
- C
- ATANH = X
- IF (Y.GT.SQEPS .AND. Y.LE.0.5) ATANH = X*(1.0 + CSEVL (8.*X*X-1.,
- 1 ATNHCS, NTERMS))
- IF (Y.GT.0.5) ATANH = 0.5*LOG((1.0+X)/(1.0-X))
- C
- RETURN
- END
- *DECK AVINT
- SUBROUTINE AVINT (X, Y, N, XLO, XUP, ANS, IERR)
- C***BEGIN PROLOGUE AVINT
- C***PURPOSE Integrate a function tabulated at arbitrarily spaced
- C abscissas using overlapping parabolas.
- C***LIBRARY SLATEC
- C***CATEGORY H2A1B2
- C***TYPE SINGLE PRECISION (AVINT-S, DAVINT-D)
- C***KEYWORDS INTEGRATION, QUADRATURE, TABULATED DATA
- C***AUTHOR Jones, R. E., (SNLA)
- C***DESCRIPTION
- C
- C Abstract
- C AVINT integrates a function tabulated at arbitrarily spaced
- C abscissas. The limits of integration need not coincide
- C with the tabulated abscissas.
- C
- C A method of overlapping parabolas fitted to the data is used
- C provided that there are at least 3 abscissas between the
- C limits of integration. AVINT also handles two special cases.
- C If the limits of integration are equal, AVINT returns a result
- C of zero regardless of the number of tabulated values.
- C If there are only two function values, AVINT uses the
- C trapezoid rule.
- C
- C Description of Parameters
- C The user must dimension all arrays appearing in the call list
- C X(N), Y(N).
- C
- C Input--
- C X - real array of abscissas, which must be in increasing
- C order.
- C Y - real array of functional values. i.e., Y(I)=FUNC(X(I)).
- C N - the integer number of function values supplied.
- C N .GE. 2 unless XLO = XUP.
- C XLO - real lower limit of integration.
- C XUP - real upper limit of integration.
- C Must have XLO .LE. XUP.
- C
- C Output--
- C ANS - computed approximate value of integral
- C IERR - a status code
- C --normal code
- C =1 means the requested integration was performed.
- C --abnormal codes
- C =2 means XUP was less than XLO.
- C =3 means the number of X(I) between XLO and XUP
- C (inclusive) was less than 3 and neither of the two
- C special cases described in the Abstract occurred.
- C No integration was performed.
- C =4 means the restriction X(I+1) .GT. X(I) was violated.
- C =5 means the number N of function values was .LT. 2.
- C ANS is set to zero if IERR=2,3,4,or 5.
- C
- C AVINT is documented completely in SC-M-69-335
- C Original program from "Numerical Integration" by Davis &
- C Rabinowitz.
- C Adaptation and modifications for Sandia Mathematical Program
- C Library by Rondall E. Jones.
- C
- C***REFERENCES R. E. Jones, Approximate integrator of functions
- C tabulated at arbitrarily spaced abscissas,
- C Report SC-M-69-335, Sandia Laboratories, 1969.
- C***ROUTINES CALLED XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 690901 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 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 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE AVINT
- C
- DOUBLE PRECISION R3,RP5,SUM,SYL,SYL2,SYL3,SYU,SYU2,SYU3,X1,X2,X3
- 1,X12,X13,X23,TERM1,TERM2,TERM3,A,B,C,CA,CB,CC
- DIMENSION X(*),Y(*)
- C***FIRST EXECUTABLE STATEMENT AVINT
- IERR=1
- ANS =0.0
- IF (XLO-XUP) 3,100,200
- 3 IF (N.LT.2) GO TO 215
- DO 5 I=2,N
- IF (X(I).LE.X(I-1)) GO TO 210
- IF (X(I).GT.XUP) GO TO 6
- 5 CONTINUE
- 6 CONTINUE
- IF (N.GE.3) GO TO 9
- C
- C SPECIAL N=2 CASE
- SLOPE = (Y(2)-Y(1))/(X(2)-X(1))
- FL = Y(1) + SLOPE*(XLO-X(1))
- FR = Y(2) + SLOPE*(XUP-X(2))
- ANS = 0.5*(FL+FR)*(XUP-XLO)
- RETURN
- 9 CONTINUE
- IF (X(N-2).LT.XLO) GO TO 205
- IF (X(3).GT.XUP) GO TO 205
- I = 1
- 10 IF (X(I).GE.XLO) GO TO 15
- I = I+1
- GO TO 10
- 15 INLFT = I
- I = N
- 20 IF (X(I).LE.XUP) GO TO 25
- I = I-1
- GO TO 20
- 25 INRT = I
- IF ((INRT-INLFT).LT.2) GO TO 205
- ISTART = INLFT
- IF (INLFT.EQ.1) ISTART = 2
- ISTOP = INRT
- IF (INRT.EQ.N) ISTOP = N-1
- C
- R3 = 3.0D0
- RP5= 0.5D0
- SUM = 0.0
- SYL = XLO
- SYL2= SYL*SYL
- SYL3= SYL2*SYL
- C
- DO 50 I=ISTART,ISTOP
- X1 = X(I-1)
- X2 = X(I)
- X3 = X(I+1)
- X12 = X1-X2
- X13 = X1-X3
- X23 = X2-X3
- TERM1 = DBLE(Y(I-1))/(X12*X13)
- TERM2 =-DBLE(Y(I)) /(X12*X23)
- TERM3 = DBLE(Y(I+1))/(X13*X23)
- A = TERM1+TERM2+TERM3
- B = -(X2+X3)*TERM1 - (X1+X3)*TERM2 - (X1+X2)*TERM3
- C = X2*X3*TERM1 + X1*X3*TERM2 + X1*X2*TERM3
- IF (I-ISTART) 30,30,35
- 30 CA = A
- CB = B
- CC = C
- GO TO 40
- 35 CA = 0.5*(A+CA)
- CB = 0.5*(B+CB)
- CC = 0.5*(C+CC)
- 40 SYU = X2
- SYU2= SYU*SYU
- SYU3= SYU2*SYU
- SUM = SUM + CA*(SYU3-SYL3)/R3 + CB*RP5*(SYU2-SYL2) + CC*(SYU-SYL)
- CA = A
- CB = B
- CC = C
- SYL = SYU
- SYL2= SYU2
- SYL3= SYU3
- 50 CONTINUE
- SYU = XUP
- ANS = SUM + CA*(SYU**3-SYL3)/R3 + CB*RP5*(SYU**2-SYL2)
- 1 + CC*(SYU-SYL)
- 100 RETURN
- 200 IERR=2
- CALL XERMSG ('SLATEC', 'AVINT',
- + 'THE UPPER LIMIT OF INTEGRATION WAS NOT GREATER THAN THE ' //
- + 'LOWER LIMIT.', 4, 1)
- RETURN
- 205 IERR=3
- CALL XERMSG ('SLATEC', 'AVINT',
- + 'THERE WERE LESS THAN THREE FUNCTION VALUES BETWEEN THE ' //
- + 'LIMITS OF INTEGRATION.', 4, 1)
- RETURN
- 210 IERR=4
- CALL XERMSG ('SLATEC', 'AVINT',
- + 'THE ABSCISSAS WERE NOT STRICTLY INCREASING. MUST HAVE ' //
- + 'X(I-1) .LT. X(I) FOR ALL I.', 4, 1)
- RETURN
- 215 IERR=5
- CALL XERMSG ('SLATEC', 'AVINT',
- + 'LESS THAN TWO FUNCTION VALUES WERE SUPPLIED.', 4, 1)
- RETURN
- END
- *DECK BAKVEC
- SUBROUTINE BAKVEC (NM, N, T, E, M, Z, IERR)
- C***BEGIN PROLOGUE BAKVEC
- C***PURPOSE Form the eigenvectors of a certain real non-symmetric
- C tridiagonal matrix from a symmetric tridiagonal matrix
- C output from FIGI.
- C***LIBRARY SLATEC (EISPACK)
- C***CATEGORY D4C4
- C***TYPE SINGLE PRECISION (BAKVEC-S)
- C***KEYWORDS EIGENVECTORS, EISPACK
- C***AUTHOR Smith, B. T., et al.
- C***DESCRIPTION
- C
- C This subroutine forms the eigenvectors of a NONSYMMETRIC
- C TRIDIAGONAL matrix by back transforming those of the
- C corresponding symmetric matrix determined by FIGI.
- C
- C On INPUT
- C
- C NM must be set to the row dimension of the two-dimensional
- C array parameters, T and Z, as declared in the calling
- C program dimension statement. NM is an INTEGER variable.
- C
- C N is the order of the matrix T. N is an INTEGER variable.
- C N must be less than or equal to NM.
- C
- C T contains the nonsymmetric matrix. Its subdiagonal is
- C stored in the last N-1 positions of the first column,
- C its diagonal in the N positions of the second column,
- C and its superdiagonal in the first N-1 positions of
- C the third column. T(1,1) and T(N,3) are arbitrary.
- C T is a two-dimensional REAL array, dimensioned T(NM,3).
- C
- C E contains the subdiagonal elements of the symmetric
- C matrix in its last N-1 positions. E(1) is arbitrary.
- C E is a one-dimensional REAL array, dimensioned E(N).
- C
- C M is the number of eigenvectors to be back transformed.
- C M is an INTEGER variable.
- C
- C Z contains the eigenvectors to be back transformed
- C in its first M columns. Z is a two-dimensional REAL
- C array, dimensioned Z(NM,M).
- C
- C On OUTPUT
- C
- C T is unaltered.
- C
- C E is destroyed.
- C
- C Z contains the transformed eigenvectors in its first M columns.
- C
- C IERR is an INTEGER flag set to
- C Zero for normal return,
- C 2*N+I if E(I) is zero with T(I,1) or T(I-1,3) non-zero.
- C In this case, the symmetric matrix is not similar
- C to the original matrix, and the eigenvectors
- C cannot be found by this program.
- C
- C Questions and comments should be directed to B. S. Garbow,
- C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY
- C ------------------------------------------------------------------
- C
- C***REFERENCES B. T. Smith, J. M. Boyle, J. J. Dongarra, B. S. Garbow,
- C Y. Ikebe, V. C. Klema and C. B. Moler, Matrix Eigen-
- C system Routines - EISPACK Guide, Springer-Verlag,
- C 1976.
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 760101 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE BAKVEC
- C
- INTEGER I,J,M,N,NM,IERR
- REAL T(NM,3),E(*),Z(NM,*)
- C
- C***FIRST EXECUTABLE STATEMENT BAKVEC
- IERR = 0
- IF (M .EQ. 0) GO TO 1001
- E(1) = 1.0E0
- IF (N .EQ. 1) GO TO 1001
- C
- DO 100 I = 2, N
- IF (E(I) .NE. 0.0E0) GO TO 80
- IF (T(I,1) .NE. 0.0E0 .OR. T(I-1,3) .NE. 0.0E0) GO TO 1000
- E(I) = 1.0E0
- GO TO 100
- 80 E(I) = E(I-1) * E(I) / T(I-1,3)
- 100 CONTINUE
- C
- DO 120 J = 1, M
- C
- DO 120 I = 2, N
- Z(I,J) = Z(I,J) * E(I)
- 120 CONTINUE
- C
- GO TO 1001
- C .......... SET ERROR -- EIGENVECTORS CANNOT BE
- C FOUND BY THIS PROGRAM ..........
- 1000 IERR = 2 * N + I
- 1001 RETURN
- END
- *DECK BALANC
- SUBROUTINE BALANC (NM, N, A, LOW, IGH, SCALE)
- C***BEGIN PROLOGUE BALANC
- C***PURPOSE Balance a real general matrix and isolate eigenvalues
- C whenever possible.
- C***LIBRARY SLATEC (EISPACK)
- C***CATEGORY D4C1A
- C***TYPE SINGLE PRECISION (BALANC-S, CBAL-C)
- C***KEYWORDS EIGENVECTORS, EISPACK
- C***AUTHOR Smith, B. T., et al.
- C***DESCRIPTION
- C
- C This subroutine is a translation of the ALGOL procedure BALANCE,
- C NUM. MATH. 13, 293-304(1969) by Parlett and Reinsch.
- C HANDBOOK FOR AUTO. COMP., Vol.II-LINEAR ALGEBRA, 315-326(1971).
- C
- C This subroutine balances a REAL matrix and isolates
- C eigenvalues whenever possible.
- C
- C On INPUT
- C
- C NM must be set to the row dimension of the two-dimensional
- C array parameter, A, as declared in the calling program
- C dimension statement. NM is an INTEGER variable.
- C
- C N is the order of the matrix A. N is an INTEGER variable.
- C N must be less than or equal to NM.
- C
- C A contains the input matrix to be balanced. A is a
- C two-dimensional REAL array, dimensioned A(NM,N).
- C
- C On OUTPUT
- C
- C A contains the balanced matrix.
- C
- C LOW and IGH are two INTEGER variables such that A(I,J)
- C is equal to zero if
- C (1) I is greater than J and
- C (2) J=1,...,LOW-1 or I=IGH+1,...,N.
- C
- C SCALE contains information determining the permutations and
- C scaling factors used. SCALE is a one-dimensional REAL array,
- C dimensioned SCALE(N).
- C
- C Suppose that the principal submatrix in rows LOW through IGH
- C has been balanced, that P(J) denotes the index interchanged
- C with J during the permutation step, and that the elements
- C of the diagonal matrix used are denoted by D(I,J). Then
- C SCALE(J) = P(J), for J = 1,...,LOW-1
- C = D(J,J), J = LOW,...,IGH
- C = P(J) J = IGH+1,...,N.
- C The order in which the interchanges are made is N to IGH+1,
- C then 1 TO LOW-1.
- C
- C Note that 1 is returned for IGH if IGH is zero formally.
- C
- C The ALGOL procedure EXC contained in BALANCE appears in
- C BALANC in line. (Note that the ALGOL roles of identifiers
- C K,L have been reversed.)
- C
- C Questions and comments should be directed to B. S. Garbow,
- C Applied Mathematics Division, ARGONNE NATIONAL LABORATORY
- C ------------------------------------------------------------------
- C
- C***REFERENCES B. T. Smith, J. M. Boyle, J. J. Dongarra, B. S. Garbow,
- C Y. Ikebe, V. C. Klema and C. B. Moler, Matrix Eigen-
- C system Routines - EISPACK Guide, Springer-Verlag,
- C 1976.
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 760101 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE BALANC
- C
- INTEGER I,J,K,L,M,N,JJ,NM,IGH,LOW,IEXC
- REAL A(NM,*),SCALE(*)
- REAL C,F,G,R,S,B2,RADIX
- LOGICAL NOCONV
- C
- C***FIRST EXECUTABLE STATEMENT BALANC
- RADIX = 16
- C
- B2 = RADIX * RADIX
- K = 1
- L = N
- GO TO 100
- C .......... IN-LINE PROCEDURE FOR ROW AND
- C COLUMN EXCHANGE ..........
- 20 SCALE(M) = J
- IF (J .EQ. M) GO TO 50
- C
- DO 30 I = 1, L
- F = A(I,J)
- A(I,J) = A(I,M)
- A(I,M) = F
- 30 CONTINUE
- C
- DO 40 I = K, N
- F = A(J,I)
- A(J,I) = A(M,I)
- A(M,I) = F
- 40 CONTINUE
- C
- 50 GO TO (80,130), IEXC
- C .......... SEARCH FOR ROWS ISOLATING AN EIGENVALUE
- C AND PUSH THEM DOWN ..........
- 80 IF (L .EQ. 1) GO TO 280
- L = L - 1
- C .......... FOR J=L STEP -1 UNTIL 1 DO -- ..........
- 100 DO 120 JJ = 1, L
- J = L + 1 - JJ
- C
- DO 110 I = 1, L
- IF (I .EQ. J) GO TO 110
- IF (A(J,I) .NE. 0.0E0) GO TO 120
- 110 CONTINUE
- C
- M = L
- IEXC = 1
- GO TO 20
- 120 CONTINUE
- C
- GO TO 140
- C .......... SEARCH FOR COLUMNS ISOLATING AN EIGENVALUE
- C AND PUSH THEM LEFT ..........
- 130 K = K + 1
- C
- 140 DO 170 J = K, L
- C
- DO 150 I = K, L
- IF (I .EQ. J) GO TO 150
- IF (A(I,J) .NE. 0.0E0) GO TO 170
- 150 CONTINUE
- C
- M = K
- IEXC = 2
- GO TO 20
- 170 CONTINUE
- C .......... NOW BALANCE THE SUBMATRIX IN ROWS K TO L ..........
- DO 180 I = K, L
- 180 SCALE(I) = 1.0E0
- C .......... ITERATIVE LOOP FOR NORM REDUCTION ..........
- 190 NOCONV = .FALSE.
- C
- DO 270 I = K, L
- C = 0.0E0
- R = 0.0E0
- C
- DO 200 J = K, L
- IF (J .EQ. I) GO TO 200
- C = C + ABS(A(J,I))
- R = R + ABS(A(I,J))
- 200 CONTINUE
- C .......... GUARD AGAINST ZERO C OR R DUE TO UNDERFLOW ..........
- IF (C .EQ. 0.0E0 .OR. R .EQ. 0.0E0) GO TO 270
- G = R / RADIX
- F = 1.0E0
- S = C + R
- 210 IF (C .GE. G) GO TO 220
- F = F * RADIX
- C = C * B2
- GO TO 210
- 220 G = R * RADIX
- 230 IF (C .LT. G) GO TO 240
- F = F / RADIX
- C = C / B2
- GO TO 230
- C .......... NOW BALANCE ..........
- 240 IF ((C + R) / F .GE. 0.95E0 * S) GO TO 270
- G = 1.0E0 / F
- SCALE(I) = SCALE(I) * F
- NOCONV = .TRUE.
- C
- DO 250 J = K, N
- 250 A(I,J) = A(I,J) * G
- C
- DO 260 J = 1, L
- 260 A(J,I) = A(J,I) * F
- C
- 270 CONTINUE
- C
- IF (NOCONV) GO TO 190
- C
- 280 LOW = K
- IGH = L
- RETURN
- END
- *DECK BALBAK
- SUBROUTINE BALBAK (NM, N, LOW, IGH, SCALE, M, Z)
- C***BEGIN PROLOGUE BALBAK
- C***PURPOSE Form the eigenvectors of a real general matrix from the
- C eigenvectors of matrix output from BALANC.
- C***LIBRARY SLATEC (EISPACK)
- C***CATEGORY D4C4
- C***TYPE SINGLE PRECISION (BALBAK-S, CBABK2-C)
- C***KEYWORDS EIGENVECTORS, EISPACK
- C***AUTHOR Smith, B. T., et al.
- C***DESCRIPTION
- C
- C This subroutine is a translation of the ALGOL procedure BALBAK,
- C NUM. MATH. 13, 293-304(1969) by Parlett and Reinsch.
- C HANDBOOK FOR AUTO. COMP., Vol.II-LINEAR ALGEBRA, 315-326(1971).
- C
- C This subroutine forms the eigenvectors of a REAL GENERAL
- C matrix by back transforming those of the corresponding
- C balanced matrix determined by BALANC.
- C
- C On INPUT
- C
- C NM must be set to the row dimension of the two-dimensional
- C array parameter, Z, as declared in the calling program
- C dimension statement. NM is an INTEGER variable.
- C
- C N is the number of components of the vectors in matrix Z.
- C N is an INTEGER variable. N must be less than or equal
- C to NM.
- C
- C LOW and IGH are INTEGER variables determined by BALANC.
- C
- C SCALE contains information determining the permutations and
- C scaling factors used by BALANC. SCALE is a one-dimensional
- C REAL array, dimensioned SCALE(N).
- C
- C M is the number of columns of Z to be back transformed.
- C M is an INTEGER variable.
- C
- C Z contains the real and imaginary parts of the eigen-
- C vectors to be back transformed in its first M columns.
- C Z is a two-dimensional REAL array, dimensioned Z(NM,M).
- C
- C On OUTPUT
- C
- C Z contains the real and imaginary parts of the
- C transformed eigenvectors in its first M columns.
- C
- C Questions and comments should be directed to B. S. Garbow,
- C Applied Mathematics Division, ARGONNE NATIONAL LABORATORY
- C ------------------------------------------------------------------
- C
- C***REFERENCES B. T. Smith, J. M. Boyle, J. J. Dongarra, B. S. Garbow,
- C Y. Ikebe, V. C. Klema and C. B. Moler, Matrix Eigen-
- C system Routines - EISPACK Guide, Springer-Verlag,
- C 1976.
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 760101 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE BALBAK
- C
- INTEGER I,J,K,M,N,II,NM,IGH,LOW
- REAL SCALE(*),Z(NM,*)
- REAL S
- C
- C***FIRST EXECUTABLE STATEMENT BALBAK
- IF (M .EQ. 0) GO TO 200
- IF (IGH .EQ. LOW) GO TO 120
- C
- DO 110 I = LOW, IGH
- S = SCALE(I)
- C .......... LEFT HAND EIGENVECTORS ARE BACK TRANSFORMED
- C IF THE FOREGOING STATEMENT IS REPLACED BY
- C S=1.0E0/SCALE(I). ..........
- DO 100 J = 1, M
- 100 Z(I,J) = Z(I,J) * S
- C
- 110 CONTINUE
- C ......... FOR I=LOW-1 STEP -1 UNTIL 1,
- C IGH+1 STEP 1 UNTIL N DO -- ..........
- 120 DO 140 II = 1, N
- I = II
- IF (I .GE. LOW .AND. I .LE. IGH) GO TO 140
- IF (I .LT. LOW) I = LOW - II
- K = SCALE(I)
- IF (K .EQ. I) GO TO 140
- C
- DO 130 J = 1, M
- S = Z(I,J)
- Z(I,J) = Z(K,J)
- Z(K,J) = S
- 130 CONTINUE
- C
- 140 CONTINUE
- C
- 200 RETURN
- END
- *DECK BANDR
- SUBROUTINE BANDR (NM, N, MB, A, D, E, E2, MATZ, Z)
- C***BEGIN PROLOGUE BANDR
- C***PURPOSE Reduce a real symmetric band matrix to symmetric
- C tridiagonal matrix and, optionally, accumulate
- C orthogonal similarity transformations.
- C***LIBRARY SLATEC (EISPACK)
- C***CATEGORY D4C1B1
- C***TYPE SINGLE PRECISION (BANDR-S)
- C***KEYWORDS EIGENVALUES, EIGENVECTORS, EISPACK
- C***AUTHOR Smith, B. T., et al.
- C***DESCRIPTION
- C
- C This subroutine is a translation of the ALGOL procedure BANDRD,
- C NUM. MATH. 12, 231-241(1968) by Schwarz.
- C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 273-283(1971).
- C
- C This subroutine reduces a REAL SYMMETRIC BAND matrix
- C to a symmetric tridiagonal matrix using and optionally
- C accumulating orthogonal similarity transformations.
- C
- C On INPUT
- C
- C NM must be set to the row dimension of the two-dimensional
- C array parameters, A and Z, as declared in the calling
- C program dimension statement. NM is an INTEGER variable.
- C
- C N is the order of the matrix A. N is an INTEGER variable.
- C N must be less than or equal to NM.
- C
- C MB is the (half) band width of the matrix, defined as the
- C number of adjacent diagonals, including the principal
- C diagonal, required to specify the non-zero portion of the
- C lower triangle of the matrix. MB is less than or equal
- C to N. MB is an INTEGER variable.
- C
- C A contains the lower triangle of the real symmetric band
- C matrix. Its lowest subdiagonal is stored in the last
- C N+1-MB positions of the first column, its next subdiagonal
- C in the last N+2-MB positions of the second column, further
- C subdiagonals similarly, and finally its principal diagonal
- C in the N positions of the last column. Contents of storage
- C locations not part of the matrix are arbitrary. A is a
- C two-dimensional REAL array, dimensioned A(NM,MB).
- C
- C MATZ should be set to .TRUE. if the transformation matrix is
- C to be accumulated, and to .FALSE. otherwise. MATZ is a
- C LOGICAL variable.
- C
- C On OUTPUT
- C
- C A has been destroyed, except for its last two columns which
- C contain a copy of the tridiagonal matrix.
- C
- C D contains the diagonal elements of the tridiagonal matrix.
- C D is a one-dimensional REAL array, dimensioned D(N).
- C
- C E contains the subdiagonal elements of the tridiagonal
- C matrix in its last N-1 positions. E(1) is set to zero.
- C E is a one-dimensional REAL array, dimensioned E(N).
- C
- C E2 contains the squares of the corresponding elements of E.
- C E2 may coincide with E if the squares are not needed.
- C E2 is a one-dimensional REAL array, dimensioned E2(N).
- C
- C Z contains the orthogonal transformation matrix produced in
- C the reduction if MATZ has been set to .TRUE. Otherwise, Z
- C is not referenced. Z is a two-dimensional REAL array,
- C dimensioned Z(NM,N).
- C
- C Questions and comments should be directed to B. S. Garbow,
- C Applied Mathematics Division, ARGONNE NATIONAL LABORATORY
- C ------------------------------------------------------------------
- C
- C***REFERENCES B. T. Smith, J. M. Boyle, J. J. Dongarra, B. S. Garbow,
- C Y. Ikebe, V. C. Klema and C. B. Moler, Matrix Eigen-
- C system Routines - EISPACK Guide, Springer-Verlag,
- C 1976.
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 760101 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE BANDR
- C
- INTEGER J,K,L,N,R,I1,I2,J1,J2,KR,MB,MR,M1,NM,N2,R1,UGL,MAXL,MAXR
- REAL A(NM,*),D(*),E(*),E2(*),Z(NM,*)
- REAL G,U,B1,B2,C2,F1,F2,S2,DMIN,DMINRT
- LOGICAL MATZ
- C
- C***FIRST EXECUTABLE STATEMENT BANDR
- DMIN = 2.0E0**(-64)
- DMINRT = 2.0E0**(-32)
- C .......... INITIALIZE DIAGONAL SCALING MATRIX ..........
- DO 30 J = 1, N
- 30 D(J) = 1.0E0
- C
- IF (.NOT. MATZ) GO TO 60
- C
- DO 50 J = 1, N
- C
- DO 40 K = 1, N
- 40 Z(J,K) = 0.0E0
- C
- Z(J,J) = 1.0E0
- 50 CONTINUE
- C
- 60 M1 = MB - 1
- IF (M1 - 1) 900, 800, 70
- 70 N2 = N - 2
- C
- DO 700 K = 1, N2
- MAXR = MIN(M1,N-K)
- C .......... FOR R=MAXR STEP -1 UNTIL 2 DO -- ..........
- DO 600 R1 = 2, MAXR
- R = MAXR + 2 - R1
- KR = K + R
- MR = MB - R
- G = A(KR,MR)
- A(KR-1,1) = A(KR-1,MR+1)
- UGL = K
- C
- DO 500 J = KR, N, M1
- J1 = J - 1
- J2 = J1 - 1
- IF (G .EQ. 0.0E0) GO TO 600
- B1 = A(J1,1) / G
- B2 = B1 * D(J1) / D(J)
- S2 = 1.0E0 / (1.0E0 + B1 * B2)
- IF (S2 .GE. 0.5E0 ) GO TO 450
- B1 = G / A(J1,1)
- B2 = B1 * D(J) / D(J1)
- C2 = 1.0E0 - S2
- D(J1) = C2 * D(J1)
- D(J) = C2 * D(J)
- F1 = 2.0E0 * A(J,M1)
- F2 = B1 * A(J1,MB)
- A(J,M1) = -B2 * (B1 * A(J,M1) - A(J,MB)) - F2 + A(J,M1)
- A(J1,MB) = B2 * (B2 * A(J,MB) + F1) + A(J1,MB)
- A(J,MB) = B1 * (F2 - F1) + A(J,MB)
- C
- DO 200 L = UGL, J2
- I2 = MB - J + L
- U = A(J1,I2+1) + B2 * A(J,I2)
- A(J,I2) = -B1 * A(J1,I2+1) + A(J,I2)
- A(J1,I2+1) = U
- 200 CONTINUE
- C
- UGL = J
- A(J1,1) = A(J1,1) + B2 * G
- IF (J .EQ. N) GO TO 350
- MAXL = MIN(M1,N-J1)
- C
- DO 300 L = 2, MAXL
- I1 = J1 + L
- I2 = MB - L
- U = A(I1,I2) + B2 * A(I1,I2+1)
- A(I1,I2+1) = -B1 * A(I1,I2) + A(I1,I2+1)
- A(I1,I2) = U
- 300 CONTINUE
- C
- I1 = J + M1
- IF (I1 .GT. N) GO TO 350
- G = B2 * A(I1,1)
- 350 IF (.NOT. MATZ) GO TO 500
- C
- DO 400 L = 1, N
- U = Z(L,J1) + B2 * Z(L,J)
- Z(L,J) = -B1 * Z(L,J1) + Z(L,J)
- Z(L,J1) = U
- 400 CONTINUE
- C
- GO TO 500
- C
- 450 U = D(J1)
- D(J1) = S2 * D(J)
- D(J) = S2 * U
- F1 = 2.0E0 * A(J,M1)
- F2 = B1 * A(J,MB)
- U = B1 * (F2 - F1) + A(J1,MB)
- A(J,M1) = B2 * (B1 * A(J,M1) - A(J1,MB)) + F2 - A(J,M1)
- A(J1,MB) = B2 * (B2 * A(J1,MB) + F1) + A(J,MB)
- A(J,MB) = U
- C
- DO 460 L = UGL, J2
- I2 = MB - J + L
- U = B2 * A(J1,I2+1) + A(J,I2)
- A(J,I2) = -A(J1,I2+1) + B1 * A(J,I2)
- A(J1,I2+1) = U
- 460 CONTINUE
- C
- UGL = J
- A(J1,1) = B2 * A(J1,1) + G
- IF (J .EQ. N) GO TO 480
- MAXL = MIN(M1,N-J1)
- C
- DO 470 L = 2, MAXL
- I1 = J1 + L
- I2 = MB - L
- U = B2 * A(I1,I2) + A(I1,I2+1)
- A(I1,I2+1) = -A(I1,I2) + B1 * A(I1,I2+1)
- A(I1,I2) = U
- 470 CONTINUE
- C
- I1 = J + M1
- IF (I1 .GT. N) GO TO 480
- G = A(I1,1)
- A(I1,1) = B1 * A(I1,1)
- 480 IF (.NOT. MATZ) GO TO 500
- C
- DO 490 L = 1, N
- U = B2 * Z(L,J1) + Z(L,J)
- Z(L,J) = -Z(L,J1) + B1 * Z(L,J)
- Z(L,J1) = U
- 490 CONTINUE
- C
- 500 CONTINUE
- C
- 600 CONTINUE
- C
- IF (MOD(K,64) .NE. 0) GO TO 700
- C .......... RESCALE TO AVOID UNDERFLOW OR OVERFLOW ..........
- DO 650 J = K, N
- IF (D(J) .GE. DMIN) GO TO 650
- MAXL = MAX(1,MB+1-J)
- C
- DO 610 L = MAXL, M1
- 610 A(J,L) = DMINRT * A(J,L)
- C
- IF (J .EQ. N) GO TO 630
- MAXL = MIN(M1,N-J)
- C
- DO 620 L = 1, MAXL
- I1 = J + L
- I2 = MB - L
- A(I1,I2) = DMINRT * A(I1,I2)
- 620 CONTINUE
- C
- 630 IF (.NOT. MATZ) GO TO 645
- C
- DO 640 L = 1, N
- 640 Z(L,J) = DMINRT * Z(L,J)
- C
- 645 A(J,MB) = DMIN * A(J,MB)
- D(J) = D(J) / DMIN
- 650 CONTINUE
- C
- 700 CONTINUE
- C .......... FORM SQUARE ROOT OF SCALING MATRIX ..........
- 800 DO 810 J = 2, N
- 810 E(J) = SQRT(D(J))
- C
- IF (.NOT. MATZ) GO TO 840
- C
- DO 830 J = 1, N
- C
- DO 820 K = 2, N
- 820 Z(J,K) = E(K) * Z(J,K)
- C
- 830 CONTINUE
- C
- 840 U = 1.0E0
- C
- DO 850 J = 2, N
- A(J,M1) = U * E(J) * A(J,M1)
- U = E(J)
- E2(J) = A(J,M1) ** 2
- A(J,MB) = D(J) * A(J,MB)
- D(J) = A(J,MB)
- E(J) = A(J,M1)
- 850 CONTINUE
- C
- D(1) = A(1,MB)
- E(1) = 0.0E0
- E2(1) = 0.0E0
- GO TO 1001
- C
- 900 DO 950 J = 1, N
- D(J) = A(J,MB)
- E(J) = 0.0E0
- E2(J) = 0.0E0
- 950 CONTINUE
- C
- 1001 RETURN
- END
- *DECK BANDV
- SUBROUTINE BANDV (NM, N, MBW, A, E21, M, W, Z, IERR, NV, RV, RV6)
- C***BEGIN PROLOGUE BANDV
- C***PURPOSE Form the eigenvectors of a real symmetric band matrix
- C associated with a set of ordered approximate eigenvalues
- C by inverse iteration.
- C***LIBRARY SLATEC (EISPACK)
- C***CATEGORY D4C3
- C***TYPE SINGLE PRECISION (BANDV-S)
- C***KEYWORDS EIGENVECTORS, EISPACK
- C***AUTHOR Smith, B. T., et al.
- C***DESCRIPTION
- C
- C This subroutine finds those eigenvectors of a REAL SYMMETRIC
- C BAND matrix corresponding to specified eigenvalues, using inverse
- C iteration. The subroutine may also be used to solve systems
- C of linear equations with a symmetric or non-symmetric band
- C coefficient matrix.
- C
- C On INPUT
- C
- C NM must be set to the row dimension of the two-dimensional
- C array parameters, A and Z, as declared in the calling
- C program dimension statement. NM is an INTEGER variable.
- C
- C N is the order of the matrix A. N is an INTEGER variable.
- C N must be less than or equal to NM.
- C
- C MBW is the number of columns of the array A used to store the
- C band matrix. If the matrix is symmetric, MBW is its (half)
- C band width, denoted MB and defined as the number of adjacent
- C diagonals, including the principal diagonal, required to
- C specify the non-zero portion of the lower triangle of the
- C matrix. If the subroutine is being used to solve systems
- C of linear equations and the coefficient matrix is not
- C symmetric, it must however have the same number of adjacent
- C diagonals above the main diagonal as below, and in this
- C case, MBW=2*MB-1. MBW is an INTEGER variable. MB must not
- C be greater than N.
- C
- C A contains the lower triangle of the symmetric band input
- C matrix stored as an N by MB array. Its lowest subdiagonal
- C is stored in the last N+1-MB positions of the first column,
- C its next subdiagonal in the last N+2-MB positions of the
- C second column, further subdiagonals similarly, and finally
- C its principal diagonal in the N positions of column MB.
- C If the subroutine is being used to solve systems of linear
- C equations and the coefficient matrix is not symmetric, A is
- C N by 2*MB-1 instead with lower triangle as above and with
- C its first superdiagonal stored in the first N-1 positions of
- C column MB+1, its second superdiagonal in the first N-2
- C positions of column MB+2, further superdiagonals similarly,
- C and finally its highest superdiagonal in the first N+1-MB
- C positions of the last column. Contents of storage locations
- C not part of the matrix are arbitrary. A is a two-dimensional
- C REAL array, dimensioned A(NM,MBW).
- C
- C E21 specifies the ordering of the eigenvalues and contains
- C 0.0E0 if the eigenvalues are in ascending order, or
- C 2.0E0 if the eigenvalues are in descending order.
- C If the subroutine is being used to solve systems of linear
- C equations, E21 should be set to 1.0E0 if the coefficient
- C matrix is symmetric and to -1.0E0 if not. E21 is a REAL
- C variable.
- C
- C M is the number of specified eigenvalues or the number of
- C systems of linear equations. M is an INTEGER variable.
- C
- C W contains the M eigenvalues in ascending or descending order.
- C If the subroutine is being used to solve systems of linear
- C equations (A-W(J)*I)*X(J)=B(J), where I is the identity
- C matrix, W(J) should be set accordingly, for J=1,2,...,M.
- C W is a one-dimensional REAL array, dimensioned W(M).
- C
- C Z contains the constant matrix columns (B(J),J=1,2,...,M), if
- C the subroutine is used to solve systems of linear equations.
- C Z is a two-dimensional REAL array, dimensioned Z(NM,M).
- C
- C NV must be set to the dimension of the array parameter RV
- C as declared in the calling program dimension statement.
- C NV is an INTEGER variable.
- C
- C On OUTPUT
- C
- C A and W are unaltered.
- C
- C Z contains the associated set of orthogonal eigenvectors.
- C Any vector which fails to converge is set to zero. If the
- C subroutine is used to solve systems of linear equations,
- C Z contains the solution matrix columns (X(J),J=1,2,...,M).
- C
- C IERR is an INTEGER flag set to
- C Zero for normal return,
- C -J if the eigenvector corresponding to the J-th
- C eigenvalue fails to converge, or if the J-th
- C system of linear equations is nearly singular.
- C
- C RV and RV6 are temporary storage arrays. If the subroutine
- C is being used to solve systems of linear equations, the
- C determinant (up to sign) of A-W(M)*I is available, upon
- C return, as the product of the first N elements of RV.
- C RV and RV6 are one-dimensional REAL arrays. Note that RV
- C is dimensioned RV(NV), where NV must be at least N*(2*MB-1).
- C RV6 is dimensioned RV6(N).
- C
- C Questions and comments should be directed to B. S. Garbow,
- C Applied Mathematics Division, ARGONNE NATIONAL LABORATORY
- C ------------------------------------------------------------------
- C
- C***REFERENCES B. T. Smith, J. M. Boyle, J. J. Dongarra, B. S. Garbow,
- C Y. Ikebe, V. C. Klema and C. B. Moler, Matrix Eigen-
- C system Routines - EISPACK Guide, Springer-Verlag,
- C 1976.
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 760101 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE BANDV
- C
- INTEGER I,J,K,M,N,R,II,IJ,JJ,KJ,MB,M1,NM,NV,IJ1,ITS,KJ1,MBW,M21
- INTEGER IERR,MAXJ,MAXK,GROUP
- REAL A(NM,*),W(*),Z(NM,*),RV(*),RV6(*)
- REAL U,V,UK,XU,X0,X1,E21,EPS2,EPS3,EPS4,NORM,ORDER,S
- C
- C***FIRST EXECUTABLE STATEMENT BANDV
- IERR = 0
- IF (M .EQ. 0) GO TO 1001
- MB = MBW
- IF (E21 .LT. 0.0E0) MB = (MBW + 1) / 2
- M1 = MB - 1
- M21 = M1 + MB
- ORDER = 1.0E0 - ABS(E21)
- C .......... FIND VECTORS BY INVERSE ITERATION ..........
- DO 920 R = 1, M
- ITS = 1
- X1 = W(R)
- IF (R .NE. 1) GO TO 100
- C .......... COMPUTE NORM OF MATRIX ..........
- NORM = 0.0E0
- C
- DO 60 J = 1, MB
- JJ = MB + 1 - J
- KJ = JJ + M1
- IJ = 1
- S = 0.0E0
- C
- DO 40 I = JJ, N
- S = S + ABS(A(I,J))
- IF (E21 .GE. 0.0E0) GO TO 40
- S = S + ABS(A(IJ,KJ))
- IJ = IJ + 1
- 40 CONTINUE
- C
- NORM = MAX(NORM,S)
- 60 CONTINUE
- C
- IF (E21 .LT. 0.0E0) NORM = 0.5E0 * NORM
- C .......... EPS2 IS THE CRITERION FOR GROUPING,
- C EPS3 REPLACES ZERO PIVOTS AND EQUAL
- C ROOTS ARE MODIFIED BY EPS3,
- C EPS4 IS TAKEN VERY SMALL TO AVOID OVERFLOW ..........
- IF (NORM .EQ. 0.0E0) NORM = 1.0E0
- EPS2 = 1.0E-3 * NORM * ABS(ORDER)
- EPS3 = NORM
- 70 EPS3 = 0.5E0*EPS3
- IF (NORM + EPS3 .GT. NORM) GO TO 70
- UK = SQRT(REAL(N))
- EPS3 = UK * EPS3
- EPS4 = UK * EPS3
- 80 GROUP = 0
- GO TO 120
- C .......... LOOK FOR CLOSE OR COINCIDENT ROOTS ..........
- 100 IF (ABS(X1-X0) .GE. EPS2) GO TO 80
- GROUP = GROUP + 1
- IF (ORDER * (X1 - X0) .LE. 0.0E0) X1 = X0 + ORDER * EPS3
- C .......... EXPAND MATRIX, SUBTRACT EIGENVALUE,
- C AND INITIALIZE VECTOR ..........
- 120 DO 200 I = 1, N
- IJ = I + MIN(0,I-M1) * N
- KJ = IJ + MB * N
- IJ1 = KJ + M1 * N
- IF (M1 .EQ. 0) GO TO 180
- C
- DO 150 J = 1, M1
- IF (IJ .GT. M1) GO TO 125
- IF (IJ .GT. 0) GO TO 130
- RV(IJ1) = 0.0E0
- IJ1 = IJ1 + N
- GO TO 130
- 125 RV(IJ) = A(I,J)
- 130 IJ = IJ + N
- II = I + J
- IF (II .GT. N) GO TO 150
- JJ = MB - J
- IF (E21 .GE. 0.0E0) GO TO 140
- II = I
- JJ = MB + J
- 140 RV(KJ) = A(II,JJ)
- KJ = KJ + N
- 150 CONTINUE
- C
- 180 RV(IJ) = A(I,MB) - X1
- RV6(I) = EPS4
- IF (ORDER .EQ. 0.0E0) RV6(I) = Z(I,R)
- 200 CONTINUE
- C
- IF (M1 .EQ. 0) GO TO 600
- C .......... ELIMINATION WITH INTERCHANGES ..........
- DO 580 I = 1, N
- II = I + 1
- MAXK = MIN(I+M1-1,N)
- MAXJ = MIN(N-I,M21-2) * N
- C
- DO 360 K = I, MAXK
- KJ1 = K
- J = KJ1 + N
- JJ = J + MAXJ
- C
- DO 340 KJ = J, JJ, N
- RV(KJ1) = RV(KJ)
- KJ1 = KJ
- 340 CONTINUE
- C
- RV(KJ1) = 0.0E0
- 360 CONTINUE
- C
- IF (I .EQ. N) GO TO 580
- U = 0.0E0
- MAXK = MIN(I+M1,N)
- MAXJ = MIN(N-II,M21-2) * N
- C
- DO 450 J = I, MAXK
- IF (ABS(RV(J)) .LT. ABS(U)) GO TO 450
- U = RV(J)
- K = J
- 450 CONTINUE
- C
- J = I + N
- JJ = J + MAXJ
- IF (K .EQ. I) GO TO 520
- KJ = K
- C
- DO 500 IJ = I, JJ, N
- V = RV(IJ)
- RV(IJ) = RV(KJ)
- RV(KJ) = V
- KJ = KJ + N
- 500 CONTINUE
- C
- IF (ORDER .NE. 0.0E0) GO TO 520
- V = RV6(I)
- RV6(I) = RV6(K)
- RV6(K) = V
- 520 IF (U .EQ. 0.0E0) GO TO 580
- C
- DO 560 K = II, MAXK
- V = RV(K) / U
- KJ = K
- C
- DO 540 IJ = J, JJ, N
- KJ = KJ + N
- RV(KJ) = RV(KJ) - V * RV(IJ)
- 540 CONTINUE
- C
- IF (ORDER .EQ. 0.0E0) RV6(K) = RV6(K) - V * RV6(I)
- 560 CONTINUE
- C
- 580 CONTINUE
- C .......... BACK SUBSTITUTION
- C FOR I=N STEP -1 UNTIL 1 DO -- ..........
- 600 DO 630 II = 1, N
- I = N + 1 - II
- MAXJ = MIN(II,M21)
- IF (MAXJ .EQ. 1) GO TO 620
- IJ1 = I
- J = IJ1 + N
- JJ = J + (MAXJ - 2) * N
- C
- DO 610 IJ = J, JJ, N
- IJ1 = IJ1 + 1
- RV6(I) = RV6(I) - RV(IJ) * RV6(IJ1)
- 610 CONTINUE
- C
- 620 V = RV(I)
- IF (ABS(V) .GE. EPS3) GO TO 625
- C .......... SET ERROR -- NEARLY SINGULAR LINEAR SYSTEM ..........
- IF (ORDER .EQ. 0.0E0) IERR = -R
- V = SIGN(EPS3,V)
- 625 RV6(I) = RV6(I) / V
- 630 CONTINUE
- C
- XU = 1.0E0
- IF (ORDER .EQ. 0.0E0) GO TO 870
- C .......... ORTHOGONALIZE WITH RESPECT TO PREVIOUS
- C MEMBERS OF GROUP ..........
- IF (GROUP .EQ. 0) GO TO 700
- C
- DO 680 JJ = 1, GROUP
- J = R - GROUP - 1 + JJ
- XU = 0.0E0
- C
- DO 640 I = 1, N
- 640 XU = XU + RV6(I) * Z(I,J)
- C
- DO 660 I = 1, N
- 660 RV6(I) = RV6(I) - XU * Z(I,J)
- C
- 680 CONTINUE
- C
- 700 NORM = 0.0E0
- C
- DO 720 I = 1, N
- 720 NORM = NORM + ABS(RV6(I))
- C
- IF (NORM .GE. 0.1E0) GO TO 840
- C .......... IN-LINE PROCEDURE FOR CHOOSING
- C A NEW STARTING VECTOR ..........
- IF (ITS .GE. N) GO TO 830
- ITS = ITS + 1
- XU = EPS4 / (UK + 1.0E0)
- RV6(1) = EPS4
- C
- DO 760 I = 2, N
- 760 RV6(I) = XU
- C
- RV6(ITS) = RV6(ITS) - EPS4 * UK
- GO TO 600
- C .......... SET ERROR -- NON-CONVERGED EIGENVECTOR ..........
- 830 IERR = -R
- XU = 0.0E0
- GO TO 870
- C .......... NORMALIZE SO THAT SUM OF SQUARES IS
- C 1 AND EXPAND TO FULL ORDER ..........
- 840 U = 0.0E0
- C
- DO 860 I = 1, N
- 860 U = U + RV6(I)**2
- C
- XU = 1.0E0 / SQRT(U)
- C
- 870 DO 900 I = 1, N
- 900 Z(I,R) = RV6(I) * XU
- C
- X0 = X1
- 920 CONTINUE
- C
- 1001 RETURN
- END
- *DECK BCRH
- FUNCTION BCRH (XLL, XRR, IZ, C, A, BH, F, SGN)
- C***BEGIN PROLOGUE BCRH
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to CBLKTR
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (BCRH-S, BSRH-S)
- C***AUTHOR (UNKNOWN)
- C***SEE ALSO CBLKTR
- C***ROUTINES CALLED (NONE)
- C***COMMON BLOCKS CCBLK
- C***REVISION HISTORY (YYMMDD)
- C 801001 DATE WRITTEN
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900402 Added TYPE section. (WRB)
- C***END PROLOGUE BCRH
- DIMENSION A(*) ,C(*) ,BH(*)
- COMMON /CCBLK/ NPP ,K ,EPS ,CNV ,
- 1 NM ,NCMPLX ,IK
- C***FIRST EXECUTABLE STATEMENT BCRH
- XL = XLL
- XR = XRR
- DX = .5*ABS(XR-XL)
- 101 X = .5*(XL+XR)
- IF (SGN*F(X,IZ,C,A,BH)) 103,105,102
- 102 XR = X
- GO TO 104
- 103 XL = X
- 104 DX = .5*DX
- IF (DX-CNV) 105,105,101
- 105 BCRH = .5*(XL+XR)
- RETURN
- END
- *DECK BDIFF
- SUBROUTINE BDIFF (L, V)
- C***BEGIN PROLOGUE BDIFF
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to BSKIN
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (BDIFF-S, DBDIFF-D)
- C***AUTHOR Amos, D. E., (SNLA)
- C***DESCRIPTION
- C
- C BDIFF computes the sum of B(L,K)*V(K)*(-1)**K where B(L,K)
- C are the binomial coefficients. Truncated sums are computed by
- C setting last part of the V vector to zero. On return, the binomial
- C sum is in V(L).
- C
- C***SEE ALSO BSKIN
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 820601 DATE WRITTEN
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900328 Added TYPE section. (WRB)
- C***END PROLOGUE BDIFF
- INTEGER I, J, K, L
- REAL V
- DIMENSION V(*)
- C***FIRST EXECUTABLE STATEMENT BDIFF
- IF (L.EQ.1) RETURN
- DO 20 J=2,L
- K = L
- DO 10 I=J,L
- V(K) = V(K-1) - V(K)
- K = K - 1
- 10 CONTINUE
- 20 CONTINUE
- RETURN
- END
- *DECK BESI
- SUBROUTINE BESI (X, ALPHA, KODE, N, Y, NZ)
- C***BEGIN PROLOGUE BESI
- C***PURPOSE Compute an N member sequence of I Bessel functions
- C I/SUB(ALPHA+K-1)/(X), K=1,...,N or scaled Bessel functions
- C EXP(-X)*I/SUB(ALPHA+K-1)/(X), K=1,...,N for non-negative
- C ALPHA and X.
- C***LIBRARY SLATEC
- C***CATEGORY C10B3
- C***TYPE SINGLE PRECISION (BESI-S, DBESI-D)
- C***KEYWORDS I BESSEL FUNCTION, SPECIAL FUNCTIONS
- C***AUTHOR Amos, D. E., (SNLA)
- C Daniel, S. L., (SNLA)
- C***DESCRIPTION
- C
- C Abstract
- C BESI computes an N member sequence of I Bessel functions
- C I/sub(ALPHA+K-1)/(X), K=1,...,N or scaled Bessel functions
- C EXP(-X)*I/sub(ALPHA+K-1)/(X), K=1,...,N for non-negative ALPHA
- C and X. A combination of the power series, the asymptotic
- C expansion for X to infinity, and the uniform asymptotic
- C expansion for NU to infinity are applied over subdivisions of
- C the (NU,X) plane. For values not covered by one of these
- C formulae, the order is incremented by an integer so that one
- C of these formulae apply. Backward recursion is used to reduce
- C orders by integer values. The asymptotic expansion for X to
- C infinity is used only when the entire sequence (specifically
- C the last member) lies within the region covered by the
- C expansion. Leading terms of these expansions are used to test
- C for over or underflow where appropriate. If a sequence is
- C requested and the last member would underflow, the result is
- C set to zero and the next lower order tried, etc., until a
- C member comes on scale or all are set to zero. An overflow
- C cannot occur with scaling.
- C
- C Description of Arguments
- C
- C Input
- C X - X .GE. 0.0E0
- C ALPHA - order of first member of the sequence,
- C ALPHA .GE. 0.0E0
- C KODE - a parameter to indicate the scaling option
- C KODE=1 returns
- C Y(K)= I/sub(ALPHA+K-1)/(X),
- C K=1,...,N
- C KODE=2 returns
- C Y(K)=EXP(-X)*I/sub(ALPHA+K-1)/(X),
- C K=1,...,N
- C N - number of members in the sequence, N .GE. 1
- C
- C Output
- C Y - a vector whose first N components contain
- C values for I/sub(ALPHA+K-1)/(X) or scaled
- C values for EXP(-X)*I/sub(ALPHA+K-1)/(X),
- C K=1,...,N depending on KODE
- C NZ - number of components of Y set to zero due to
- C underflow,
- C NZ=0 , normal return, computation completed
- C NZ .NE. 0, last NZ components of Y set to zero,
- C Y(K)=0.0E0, K=N-NZ+1,...,N.
- C
- C Error Conditions
- C Improper input arguments - a fatal error
- C Overflow with KODE=1 - a fatal error
- C Underflow - a non-fatal error (NZ .NE. 0)
- C
- C***REFERENCES D. E. Amos, S. L. Daniel and M. K. Weston, CDC 6600
- C subroutines IBESS and JBESS for Bessel functions
- C I(NU,X) and J(NU,X), X .GE. 0, NU .GE. 0, ACM
- C Transactions on Mathematical Software 3, (1977),
- C pp. 76-92.
- C F. W. J. Olver, Tables of Bessel Functions of Moderate
- C or Large Orders, NPL Mathematical Tables 6, Her
- C Majesty's Stationery Office, London, 1962.
- C***ROUTINES CALLED ALNGAM, ASYIK, I1MACH, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 750101 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE BESI
- C
- INTEGER I, IALP, IN, INLIM, IS, I1, K, KK, KM, KODE, KT,
- 1 N, NN, NS, NZ
- INTEGER I1MACH
- REAL AIN, AK, AKM, ALPHA, ANS, AP, ARG, ATOL, TOLLN, DFN,
- 1 DTM, DX, EARG, ELIM, ETX, FLGIK,FN, FNF, FNI,FNP1,FNU,GLN,RA,
- 2 RTTPI, S, SX, SXO2, S1, S2, T, TA, TB, TEMP, TFN, TM, TOL,
- 3 TRX, T2, X, XO2, XO2L, Y, Z
- REAL R1MACH, ALNGAM
- DIMENSION Y(*), TEMP(3)
- SAVE RTTPI, INLIM
- DATA RTTPI / 3.98942280401433E-01/
- DATA INLIM / 80 /
- C***FIRST EXECUTABLE STATEMENT BESI
- NZ = 0
- KT = 1
- C I1MACH(15) REPLACES I1MACH(12) IN A DOUBLE PRECISION CODE
- C I1MACH(14) REPLACES I1MACH(11) IN A DOUBLE PRECISION CODE
- RA = R1MACH(3)
- TOL = MAX(RA,1.0E-15)
- I1 = -I1MACH(12)
- GLN = R1MACH(5)
- ELIM = 2.303E0*(I1*GLN-3.0E0)
- C TOLLN = -LN(TOL)
- I1 = I1MACH(11)+1
- TOLLN = 2.303E0*GLN*I1
- TOLLN = MIN(TOLLN,34.5388E0)
- IF (N-1) 590, 10, 20
- 10 KT = 2
- 20 NN = N
- IF (KODE.LT.1 .OR. KODE.GT.2) GO TO 570
- IF (X) 600, 30, 80
- 30 IF (ALPHA) 580, 40, 50
- 40 Y(1) = 1.0E0
- IF (N.EQ.1) RETURN
- I1 = 2
- GO TO 60
- 50 I1 = 1
- 60 DO 70 I=I1,N
- Y(I) = 0.0E0
- 70 CONTINUE
- RETURN
- 80 CONTINUE
- IF (ALPHA.LT.0.0E0) GO TO 580
- C
- IALP = INT(ALPHA)
- FNI = IALP + N - 1
- FNF = ALPHA - IALP
- DFN = FNI + FNF
- FNU = DFN
- IN = 0
- XO2 = X*0.5E0
- SXO2 = XO2*XO2
- ETX = KODE - 1
- SX = ETX*X
- C
- C DECISION TREE FOR REGION WHERE SERIES, ASYMPTOTIC EXPANSION FOR X
- C TO INFINITY AND ASYMPTOTIC EXPANSION FOR NU TO INFINITY ARE
- C APPLIED.
- C
- IF (SXO2.LE.(FNU+1.0E0)) GO TO 90
- IF (X.LE.12.0E0) GO TO 110
- FN = 0.55E0*FNU*FNU
- FN = MAX(17.0E0,FN)
- IF (X.GE.FN) GO TO 430
- ANS = MAX(36.0E0-FNU,0.0E0)
- NS = INT(ANS)
- FNI = FNI + NS
- DFN = FNI + FNF
- FN = DFN
- IS = KT
- KM = N - 1 + NS
- IF (KM.GT.0) IS = 3
- GO TO 120
- 90 FN = FNU
- FNP1 = FN + 1.0E0
- XO2L = LOG(XO2)
- IS = KT
- IF (X.LE.0.5E0) GO TO 230
- NS = 0
- 100 FNI = FNI + NS
- DFN = FNI + FNF
- FN = DFN
- FNP1 = FN + 1.0E0
- IS = KT
- IF (N-1+NS.GT.0) IS = 3
- GO TO 230
- 110 XO2L = LOG(XO2)
- NS = INT(SXO2-FNU)
- GO TO 100
- 120 CONTINUE
- C
- C OVERFLOW TEST ON UNIFORM ASYMPTOTIC EXPANSION
- C
- IF (KODE.EQ.2) GO TO 130
- IF (ALPHA.LT.1.0E0) GO TO 150
- Z = X/ALPHA
- RA = SQRT(1.0E0+Z*Z)
- GLN = LOG((1.0E0+RA)/Z)
- T = RA*(1.0E0-ETX) + ETX/(Z+RA)
- ARG = ALPHA*(T-GLN)
- IF (ARG.GT.ELIM) GO TO 610
- IF (KM.EQ.0) GO TO 140
- 130 CONTINUE
- C
- C UNDERFLOW TEST ON UNIFORM ASYMPTOTIC EXPANSION
- C
- Z = X/FN
- RA = SQRT(1.0E0+Z*Z)
- GLN = LOG((1.0E0+RA)/Z)
- T = RA*(1.0E0-ETX) + ETX/(Z+RA)
- ARG = FN*(T-GLN)
- 140 IF (ARG.LT.(-ELIM)) GO TO 280
- GO TO 190
- 150 IF (X.GT.ELIM) GO TO 610
- GO TO 130
- C
- C UNIFORM ASYMPTOTIC EXPANSION FOR NU TO INFINITY
- C
- 160 IF (KM.NE.0) GO TO 170
- Y(1) = TEMP(3)
- RETURN
- 170 TEMP(1) = TEMP(3)
- IN = NS
- KT = 1
- I1 = 0
- 180 CONTINUE
- IS = 2
- FNI = FNI - 1.0E0
- DFN = FNI + FNF
- FN = DFN
- IF(I1.EQ.2) GO TO 350
- Z = X/FN
- RA = SQRT(1.0E0+Z*Z)
- GLN = LOG((1.0E0+RA)/Z)
- T = RA*(1.0E0-ETX) + ETX/(Z+RA)
- ARG = FN*(T-GLN)
- 190 CONTINUE
- I1 = ABS(3-IS)
- I1 = MAX(I1,1)
- FLGIK = 1.0E0
- CALL ASYIK(X,FN,KODE,FLGIK,RA,ARG,I1,TEMP(IS))
- GO TO (180, 350, 510), IS
- C
- C SERIES FOR (X/2)**2.LE.NU+1
- C
- 230 CONTINUE
- GLN = ALNGAM(FNP1)
- ARG = FN*XO2L - GLN - SX
- IF (ARG.LT.(-ELIM)) GO TO 300
- EARG = EXP(ARG)
- 240 CONTINUE
- S = 1.0E0
- IF (X.LT.TOL) GO TO 260
- AK = 3.0E0
- T2 = 1.0E0
- T = 1.0E0
- S1 = FN
- DO 250 K=1,17
- S2 = T2 + S1
- T = T*SXO2/S2
- S = S + T
- IF (ABS(T).LT.TOL) GO TO 260
- T2 = T2 + AK
- AK = AK + 2.0E0
- S1 = S1 + FN
- 250 CONTINUE
- 260 CONTINUE
- TEMP(IS) = S*EARG
- GO TO (270, 350, 500), IS
- 270 EARG = EARG*FN/XO2
- FNI = FNI - 1.0E0
- DFN = FNI + FNF
- FN = DFN
- IS = 2
- GO TO 240
- C
- C SET UNDERFLOW VALUE AND UPDATE PARAMETERS
- C
- 280 Y(NN) = 0.0E0
- NN = NN - 1
- FNI = FNI - 1.0E0
- DFN = FNI + FNF
- FN = DFN
- IF (NN-1) 340, 290, 130
- 290 KT = 2
- IS = 2
- GO TO 130
- 300 Y(NN) = 0.0E0
- NN = NN - 1
- FNP1 = FN
- FNI = FNI - 1.0E0
- DFN = FNI + FNF
- FN = DFN
- IF (NN-1) 340, 310, 320
- 310 KT = 2
- IS = 2
- 320 IF (SXO2.LE.FNP1) GO TO 330
- GO TO 130
- 330 ARG = ARG - XO2L + LOG(FNP1)
- IF (ARG.LT.(-ELIM)) GO TO 300
- GO TO 230
- 340 NZ = N - NN
- RETURN
- C
- C BACKWARD RECURSION SECTION
- C
- 350 CONTINUE
- NZ = N - NN
- 360 CONTINUE
- IF(KT.EQ.2) GO TO 420
- S1 = TEMP(1)
- S2 = TEMP(2)
- TRX = 2.0E0/X
- DTM = FNI
- TM = (DTM+FNF)*TRX
- IF (IN.EQ.0) GO TO 390
- C BACKWARD RECUR TO INDEX ALPHA+NN-1
- DO 380 I=1,IN
- S = S2
- S2 = TM*S2 + S1
- S1 = S
- DTM = DTM - 1.0E0
- TM = (DTM+FNF)*TRX
- 380 CONTINUE
- Y(NN) = S1
- IF (NN.EQ.1) RETURN
- Y(NN-1) = S2
- IF (NN.EQ.2) RETURN
- GO TO 400
- 390 CONTINUE
- C BACKWARD RECUR FROM INDEX ALPHA+NN-1 TO ALPHA
- Y(NN) = S1
- Y(NN-1) = S2
- IF (NN.EQ.2) RETURN
- 400 K = NN + 1
- DO 410 I=3,NN
- K = K - 1
- Y(K-2) = TM*Y(K-1) + Y(K)
- DTM = DTM - 1.0E0
- TM = (DTM+FNF)*TRX
- 410 CONTINUE
- RETURN
- 420 Y(1) = TEMP(2)
- RETURN
- C
- C ASYMPTOTIC EXPANSION FOR X TO INFINITY
- C
- 430 CONTINUE
- EARG = RTTPI/SQRT(X)
- IF (KODE.EQ.2) GO TO 440
- IF (X.GT.ELIM) GO TO 610
- EARG = EARG*EXP(X)
- 440 ETX = 8.0E0*X
- IS = KT
- IN = 0
- FN = FNU
- 450 DX = FNI + FNI
- TM = 0.0E0
- IF (FNI.EQ.0.0E0 .AND. ABS(FNF).LT.TOL) GO TO 460
- TM = 4.0E0*FNF*(FNI+FNI+FNF)
- 460 CONTINUE
- DTM = DX*DX
- S1 = ETX
- TRX = DTM - 1.0E0
- DX = -(TRX+TM)/ETX
- T = DX
- S = 1.0E0 + DX
- ATOL = TOL*ABS(S)
- S2 = 1.0E0
- AK = 8.0E0
- DO 470 K=1,25
- S1 = S1 + ETX
- S2 = S2 + AK
- DX = DTM - S2
- AP = DX + TM
- T = -T*AP/S1
- S = S + T
- IF (ABS(T).LE.ATOL) GO TO 480
- AK = AK + 8.0E0
- 470 CONTINUE
- 480 TEMP(IS) = S*EARG
- IF(IS.EQ.2) GO TO 360
- IS = 2
- FNI = FNI - 1.0E0
- DFN = FNI + FNF
- FN = DFN
- GO TO 450
- C
- C BACKWARD RECURSION WITH NORMALIZATION BY
- C ASYMPTOTIC EXPANSION FOR NU TO INFINITY OR POWER SERIES.
- C
- 500 CONTINUE
- C COMPUTATION OF LAST ORDER FOR SERIES NORMALIZATION
- AKM = MAX(3.0E0-FN,0.0E0)
- KM = INT(AKM)
- TFN = FN + KM
- TA = (GLN+TFN-0.9189385332E0-0.0833333333E0/TFN)/(TFN+0.5E0)
- TA = XO2L - TA
- TB = -(1.0E0-1.0E0/TFN)/TFN
- AIN = TOLLN/(-TA+SQRT(TA*TA-TOLLN*TB)) + 1.5E0
- IN = INT(AIN)
- IN = IN + KM
- GO TO 520
- 510 CONTINUE
- C COMPUTATION OF LAST ORDER FOR ASYMPTOTIC EXPANSION NORMALIZATION
- T = 1.0E0/(FN*RA)
- AIN = TOLLN/(GLN+SQRT(GLN*GLN+T*TOLLN)) + 1.5E0
- IN = INT(AIN)
- IF (IN.GT.INLIM) GO TO 160
- 520 CONTINUE
- TRX = 2.0E0/X
- DTM = FNI + IN
- TM = (DTM+FNF)*TRX
- TA = 0.0E0
- TB = TOL
- KK = 1
- 530 CONTINUE
- C
- C BACKWARD RECUR UNINDEXED
- C
- DO 540 I=1,IN
- S = TB
- TB = TM*TB + TA
- TA = S
- DTM = DTM - 1.0E0
- TM = (DTM+FNF)*TRX
- 540 CONTINUE
- C NORMALIZATION
- IF (KK.NE.1) GO TO 550
- TA = (TA/TB)*TEMP(3)
- TB = TEMP(3)
- KK = 2
- IN = NS
- IF (NS.NE.0) GO TO 530
- 550 Y(NN) = TB
- NZ = N - NN
- IF (NN.EQ.1) RETURN
- TB = TM*TB + TA
- K = NN - 1
- Y(K) = TB
- IF (NN.EQ.2) RETURN
- DTM = DTM - 1.0E0
- TM = (DTM+FNF)*TRX
- KM = K - 1
- C
- C BACKWARD RECUR INDEXED
- C
- DO 560 I=1,KM
- Y(K-1) = TM*Y(K) + Y(K+1)
- DTM = DTM - 1.0E0
- TM = (DTM+FNF)*TRX
- K = K - 1
- 560 CONTINUE
- RETURN
- C
- C
- C
- 570 CONTINUE
- CALL XERMSG ('SLATEC', 'BESI',
- + 'SCALING OPTION, KODE, NOT 1 OR 2.', 2, 1)
- RETURN
- 580 CONTINUE
- CALL XERMSG ('SLATEC', 'BESI', 'ORDER, ALPHA, LESS THAN ZERO.',
- + 2, 1)
- RETURN
- 590 CONTINUE
- CALL XERMSG ('SLATEC', 'BESI', 'N LESS THAN ONE.', 2, 1)
- RETURN
- 600 CONTINUE
- CALL XERMSG ('SLATEC', 'BESI', 'X LESS THAN ZERO.', 2, 1)
- RETURN
- 610 CONTINUE
- CALL XERMSG ('SLATEC', 'BESI',
- + 'OVERFLOW, X TOO LARGE FOR KODE = 1.', 6, 1)
- RETURN
- END
- *DECK BESI0
- FUNCTION BESI0 (X)
- C***BEGIN PROLOGUE BESI0
- C***PURPOSE Compute the hyperbolic Bessel function of the first kind
- C of order zero.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C10B1
- C***TYPE SINGLE PRECISION (BESI0-S, DBESI0-D)
- C***KEYWORDS FIRST KIND, FNLIB, HYPERBOLIC BESSEL FUNCTION,
- C MODIFIED BESSEL FUNCTION, ORDER ZERO, SPECIAL FUNCTIONS
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C BESI0(X) computes the modified (hyperbolic) Bessel function
- C of the first kind of order zero and real argument X.
- C
- C Series for BI0 on the interval 0. to 9.00000D+00
- C with weighted error 2.46E-18
- C log weighted error 17.61
- C significant figures required 17.90
- C decimal places required 18.15
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED BESI0E, CSEVL, INITS, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770401 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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***END PROLOGUE BESI0
- DIMENSION BI0CS(12)
- LOGICAL FIRST
- SAVE BI0CS, NTI0, XSML, XMAX, FIRST
- DATA BI0CS( 1) / -.0766054725 2839144951E0 /
- DATA BI0CS( 2) / 1.9273379539 93808270E0 /
- DATA BI0CS( 3) / .2282644586 920301339E0 /
- DATA BI0CS( 4) / .0130489146 6707290428E0 /
- DATA BI0CS( 5) / .0004344270 9008164874E0 /
- DATA BI0CS( 6) / .0000094226 5768600193E0 /
- DATA BI0CS( 7) / .0000001434 0062895106E0 /
- DATA BI0CS( 8) / .0000000016 1384906966E0 /
- DATA BI0CS( 9) / .0000000000 1396650044E0 /
- DATA BI0CS(10) / .0000000000 0009579451E0 /
- DATA BI0CS(11) / .0000000000 0000053339E0 /
- DATA BI0CS(12) / .0000000000 0000000245E0 /
- DATA FIRST /.TRUE./
- C***FIRST EXECUTABLE STATEMENT BESI0
- IF (FIRST) THEN
- NTI0 = INITS (BI0CS, 12, 0.1*R1MACH(3))
- XSML = SQRT (4.5*R1MACH(3))
- XMAX = LOG (R1MACH(2))
- ENDIF
- FIRST = .FALSE.
- C
- Y = ABS(X)
- IF (Y.GT.3.0) GO TO 20
- C
- BESI0 = 1.0
- IF (Y.GT.XSML) BESI0 = 2.75 + CSEVL (Y*Y/4.5-1.0, BI0CS, NTI0)
- RETURN
- C
- 20 IF (Y .GT. XMAX) CALL XERMSG ('SLATEC', 'BESI0',
- + 'ABS(X) SO BIG I0 OVERFLOWS', 1, 2)
- C
- BESI0 = EXP(Y) * BESI0E(X)
- C
- RETURN
- END
- *DECK BESI0E
- FUNCTION BESI0E (X)
- C***BEGIN PROLOGUE BESI0E
- C***PURPOSE Compute the exponentially scaled modified (hyperbolic)
- C Bessel function of the first kind of order zero.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C10B1
- C***TYPE SINGLE PRECISION (BESI0E-S, DBSI0E-D)
- C***KEYWORDS EXPONENTIALLY SCALED, FIRST KIND, FNLIB,
- C HYPERBOLIC BESSEL FUNCTION, MODIFIED BESSEL FUNCTION,
- C ORDER ZERO, SPECIAL FUNCTIONS
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C BESI0E(X) calculates the exponentially scaled modified (hyperbolic)
- C Bessel function of the first kind of order zero for real argument X;
- C i.e., EXP(-ABS(X))*I0(X).
- C
- C
- C Series for BI0 on the interval 0. to 9.00000D+00
- C with weighted error 2.46E-18
- C log weighted error 17.61
- C significant figures required 17.90
- C decimal places required 18.15
- C
- C
- C Series for AI0 on the interval 1.25000D-01 to 3.33333D-01
- C with weighted error 7.87E-17
- C log weighted error 16.10
- C significant figures required 14.69
- C decimal places required 16.76
- C
- C
- C Series for AI02 on the interval 0. to 1.25000D-01
- C with weighted error 3.79E-17
- C log weighted error 16.42
- C significant figures required 14.86
- C decimal places required 17.09
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED CSEVL, INITS, R1MACH
- C***REVISION HISTORY (YYMMDD)
- C 770701 DATE WRITTEN
- C 890313 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C***END PROLOGUE BESI0E
- DIMENSION BI0CS(12), AI0CS(21), AI02CS(22)
- LOGICAL FIRST
- SAVE BI0CS, AI0CS, AI02CS, NTI0, NTAI0, NTAI02, XSML, FIRST
- DATA BI0CS( 1) / -.0766054725 2839144951E0 /
- DATA BI0CS( 2) / 1.9273379539 93808270E0 /
- DATA BI0CS( 3) / .2282644586 920301339E0 /
- DATA BI0CS( 4) / .0130489146 6707290428E0 /
- DATA BI0CS( 5) / .0004344270 9008164874E0 /
- DATA BI0CS( 6) / .0000094226 5768600193E0 /
- DATA BI0CS( 7) / .0000001434 0062895106E0 /
- DATA BI0CS( 8) / .0000000016 1384906966E0 /
- DATA BI0CS( 9) / .0000000000 1396650044E0 /
- DATA BI0CS(10) / .0000000000 0009579451E0 /
- DATA BI0CS(11) / .0000000000 0000053339E0 /
- DATA BI0CS(12) / .0000000000 0000000245E0 /
- DATA AI0CS( 1) / .0757599449 4023796E0 /
- DATA AI0CS( 2) / .0075913808 1082334E0 /
- DATA AI0CS( 3) / .0004153131 3389237E0 /
- DATA AI0CS( 4) / .0000107007 6463439E0 /
- DATA AI0CS( 5) / -.0000079011 7997921E0 /
- DATA AI0CS( 6) / -.0000007826 1435014E0 /
- DATA AI0CS( 7) / .0000002783 8499429E0 /
- DATA AI0CS( 8) / .0000000082 5247260E0 /
- DATA AI0CS( 9) / -.0000000120 4463945E0 /
- DATA AI0CS(10) / .0000000015 5964859E0 /
- DATA AI0CS(11) / .0000000002 2925563E0 /
- DATA AI0CS(12) / -.0000000001 1916228E0 /
- DATA AI0CS(13) / .0000000000 1757854E0 /
- DATA AI0CS(14) / .0000000000 0112822E0 /
- DATA AI0CS(15) / -.0000000000 0114684E0 /
- DATA AI0CS(16) / .0000000000 0027155E0 /
- DATA AI0CS(17) / -.0000000000 0002415E0 /
- DATA AI0CS(18) / -.0000000000 0000608E0 /
- DATA AI0CS(19) / .0000000000 0000314E0 /
- DATA AI0CS(20) / -.0000000000 0000071E0 /
- DATA AI0CS(21) / .0000000000 0000007E0 /
- DATA AI02CS( 1) / .0544904110 1410882E0 /
- DATA AI02CS( 2) / .0033691164 7825569E0 /
- DATA AI02CS( 3) / .0000688975 8346918E0 /
- DATA AI02CS( 4) / .0000028913 7052082E0 /
- DATA AI02CS( 5) / .0000002048 9185893E0 /
- DATA AI02CS( 6) / .0000000226 6668991E0 /
- DATA AI02CS( 7) / .0000000033 9623203E0 /
- DATA AI02CS( 8) / .0000000004 9406022E0 /
- DATA AI02CS( 9) / .0000000000 1188914E0 /
- DATA AI02CS(10) / -.0000000000 3149915E0 /
- DATA AI02CS(11) / -.0000000000 1321580E0 /
- DATA AI02CS(12) / -.0000000000 0179419E0 /
- DATA AI02CS(13) / .0000000000 0071801E0 /
- DATA AI02CS(14) / .0000000000 0038529E0 /
- DATA AI02CS(15) / .0000000000 0001539E0 /
- DATA AI02CS(16) / -.0000000000 0004151E0 /
- DATA AI02CS(17) / -.0000000000 0000954E0 /
- DATA AI02CS(18) / .0000000000 0000382E0 /
- DATA AI02CS(19) / .0000000000 0000176E0 /
- DATA AI02CS(20) / -.0000000000 0000034E0 /
- DATA AI02CS(21) / -.0000000000 0000027E0 /
- DATA AI02CS(22) / .0000000000 0000003E0 /
- DATA FIRST /.TRUE./
- C***FIRST EXECUTABLE STATEMENT BESI0E
- IF (FIRST) THEN
- NTI0 = INITS (BI0CS, 12, 0.1*R1MACH(3))
- NTAI0 = INITS (AI0CS, 21, 0.1*R1MACH(3))
- NTAI02 = INITS (AI02CS, 22, 0.1*R1MACH(3))
- XSML = SQRT (4.5*R1MACH(3))
- ENDIF
- FIRST = .FALSE.
- C
- Y = ABS(X)
- IF (Y.GT.3.0) GO TO 20
- C
- BESI0E = 1.0 - X
- IF (Y.GT.XSML) BESI0E = EXP(-Y) * ( 2.75 +
- 1 CSEVL (Y*Y/4.5-1.0, BI0CS, NTI0) )
- RETURN
- C
- 20 IF (Y.LE.8.) BESI0E = (.375 + CSEVL ((48./Y-11.)/5., AI0CS, NTAI0)
- 1 ) / SQRT(Y)
- IF (Y.GT.8.) BESI0E = (.375 + CSEVL (16./Y-1., AI02CS, NTAI02))
- 1 / SQRT(Y)
- C
- RETURN
- END
- *DECK BESI1
- FUNCTION BESI1 (X)
- C***BEGIN PROLOGUE BESI1
- C***PURPOSE Compute the modified (hyperbolic) Bessel function of the
- C first kind of order one.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C10B1
- C***TYPE SINGLE PRECISION (BESI1-S, DBESI1-D)
- C***KEYWORDS FIRST KIND, FNLIB, HYPERBOLIC BESSEL FUNCTION,
- C MODIFIED BESSEL FUNCTION, ORDER ONE, SPECIAL FUNCTIONS
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C BESI1(X) calculates the modified (hyperbolic) Bessel function
- C of the first kind of order one for real argument X.
- C
- C Series for BI1 on the interval 0. to 9.00000D+00
- C with weighted error 2.40E-17
- C log weighted error 16.62
- C significant figures required 16.23
- C decimal places required 17.14
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED BESI1E, CSEVL, INITS, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770401 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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***END PROLOGUE BESI1
- DIMENSION BI1CS(11)
- LOGICAL FIRST
- SAVE BI1CS, NTI1, XMIN, XSML, XMAX, FIRST
- DATA BI1CS( 1) / -.0019717132 61099859E0 /
- DATA BI1CS( 2) / .4073488766 7546481E0 /
- DATA BI1CS( 3) / .0348389942 99959456E0 /
- DATA BI1CS( 4) / .0015453945 56300123E0 /
- DATA BI1CS( 5) / .0000418885 21098377E0 /
- DATA BI1CS( 6) / .0000007649 02676483E0 /
- DATA BI1CS( 7) / .0000000100 42493924E0 /
- DATA BI1CS( 8) / .0000000000 99322077E0 /
- DATA BI1CS( 9) / .0000000000 00766380E0 /
- DATA BI1CS(10) / .0000000000 00004741E0 /
- DATA BI1CS(11) / .0000000000 00000024E0 /
- DATA FIRST /.TRUE./
- C***FIRST EXECUTABLE STATEMENT BESI1
- IF (FIRST) THEN
- NTI1 = INITS (BI1CS, 11, 0.1*R1MACH(3))
- XMIN = 2.0*R1MACH(1)
- XSML = SQRT (4.5*R1MACH(3))
- XMAX = LOG (R1MACH(2))
- ENDIF
- FIRST = .FALSE.
- C
- Y = ABS(X)
- IF (Y.GT.3.0) GO TO 20
- C
- BESI1 = 0.0
- IF (Y.EQ.0.0) RETURN
- C
- IF (Y .LE. XMIN) CALL XERMSG ('SLATEC', 'BESI1',
- + 'ABS(X) SO SMALL I1 UNDERFLOWS', 1, 1)
- IF (Y.GT.XMIN) BESI1 = 0.5*X
- IF (Y.GT.XSML) BESI1 = X * (.875 + CSEVL(Y*Y/4.5-1., BI1CS, NTI1))
- RETURN
- C
- 20 IF (Y .GT. XMAX) CALL XERMSG ('SLATEC', 'BESI1',
- + 'ABS(X) SO BIG I1 OVERFLOWS', 2, 2)
- C
- BESI1 = EXP(Y) * BESI1E(X)
- C
- RETURN
- END
- *DECK BESI1E
- FUNCTION BESI1E (X)
- C***BEGIN PROLOGUE BESI1E
- C***PURPOSE Compute the exponentially scaled modified (hyperbolic)
- C Bessel function of the first kind of order one.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C10B1
- C***TYPE SINGLE PRECISION (BESI1E-S, DBSI1E-D)
- C***KEYWORDS EXPONENTIALLY SCALED, FIRST KIND, FNLIB,
- C HYPERBOLIC BESSEL FUNCTION, MODIFIED BESSEL FUNCTION,
- C ORDER ONE, SPECIAL FUNCTIONS
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C BESI1E(X) calculates the exponentially scaled modified (hyperbolic)
- C Bessel function of the first kind of order one for real argument X;
- C i.e., EXP(-ABS(X))*I1(X).
- C
- C Series for BI1 on the interval 0. to 9.00000D+00
- C with weighted error 2.40E-17
- C log weighted error 16.62
- C significant figures required 16.23
- C decimal places required 17.14
- C
- C Series for AI1 on the interval 1.25000D-01 to 3.33333D-01
- C with weighted error 6.98E-17
- C log weighted error 16.16
- C significant figures required 14.53
- C decimal places required 16.82
- C
- C Series for AI12 on the interval 0. to 1.25000D-01
- C with weighted error 3.55E-17
- C log weighted error 16.45
- C significant figures required 14.69
- C decimal places required 17.12
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED CSEVL, INITS, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770401 DATE WRITTEN
- C 890210 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 920618 Removed space from variable names. (RWC, WRB)
- C***END PROLOGUE BESI1E
- DIMENSION BI1CS(11), AI1CS(21), AI12CS(22)
- LOGICAL FIRST
- SAVE BI1CS, AI1CS, AI12CS, NTI1, NTAI1, NTAI12, XMIN, XSML, FIRST
- DATA BI1CS( 1) / -.0019717132 61099859E0 /
- DATA BI1CS( 2) / .4073488766 7546481E0 /
- DATA BI1CS( 3) / .0348389942 99959456E0 /
- DATA BI1CS( 4) / .0015453945 56300123E0 /
- DATA BI1CS( 5) / .0000418885 21098377E0 /
- DATA BI1CS( 6) / .0000007649 02676483E0 /
- DATA BI1CS( 7) / .0000000100 42493924E0 /
- DATA BI1CS( 8) / .0000000000 99322077E0 /
- DATA BI1CS( 9) / .0000000000 00766380E0 /
- DATA BI1CS(10) / .0000000000 00004741E0 /
- DATA BI1CS(11) / .0000000000 00000024E0 /
- DATA AI1CS( 1) / -.0284674418 1881479E0 /
- DATA AI1CS( 2) / -.0192295323 1443221E0 /
- DATA AI1CS( 3) / -.0006115185 8579437E0 /
- DATA AI1CS( 4) / -.0000206997 1253350E0 /
- DATA AI1CS( 5) / .0000085856 1914581E0 /
- DATA AI1CS( 6) / .0000010494 9824671E0 /
- DATA AI1CS( 7) / -.0000002918 3389184E0 /
- DATA AI1CS( 8) / -.0000000155 9378146E0 /
- DATA AI1CS( 9) / .0000000131 8012367E0 /
- DATA AI1CS(10) / -.0000000014 4842341E0 /
- DATA AI1CS(11) / -.0000000002 9085122E0 /
- DATA AI1CS(12) / .0000000001 2663889E0 /
- DATA AI1CS(13) / -.0000000000 1664947E0 /
- DATA AI1CS(14) / -.0000000000 0166665E0 /
- DATA AI1CS(15) / .0000000000 0124260E0 /
- DATA AI1CS(16) / -.0000000000 0027315E0 /
- DATA AI1CS(17) / .0000000000 0002023E0 /
- DATA AI1CS(18) / .0000000000 0000730E0 /
- DATA AI1CS(19) / -.0000000000 0000333E0 /
- DATA AI1CS(20) / .0000000000 0000071E0 /
- DATA AI1CS(21) / -.0000000000 0000006E0 /
- DATA AI12CS( 1) / .0285762350 1828014E0 /
- DATA AI12CS( 2) / -.0097610974 9136147E0 /
- DATA AI12CS( 3) / -.0001105889 3876263E0 /
- DATA AI12CS( 4) / -.0000038825 6480887E0 /
- DATA AI12CS( 5) / -.0000002512 2362377E0 /
- DATA AI12CS( 6) / -.0000000263 1468847E0 /
- DATA AI12CS( 7) / -.0000000038 3538039E0 /
- DATA AI12CS( 8) / -.0000000005 5897433E0 /
- DATA AI12CS( 9) / -.0000000000 1897495E0 /
- DATA AI12CS(10) / .0000000000 3252602E0 /
- DATA AI12CS(11) / .0000000000 1412580E0 /
- DATA AI12CS(12) / .0000000000 0203564E0 /
- DATA AI12CS(13) / -.0000000000 0071985E0 /
- DATA AI12CS(14) / -.0000000000 0040836E0 /
- DATA AI12CS(15) / -.0000000000 0002101E0 /
- DATA AI12CS(16) / .0000000000 0004273E0 /
- DATA AI12CS(17) / .0000000000 0001041E0 /
- DATA AI12CS(18) / -.0000000000 0000382E0 /
- DATA AI12CS(19) / -.0000000000 0000186E0 /
- DATA AI12CS(20) / .0000000000 0000033E0 /
- DATA AI12CS(21) / .0000000000 0000028E0 /
- DATA AI12CS(22) / -.0000000000 0000003E0 /
- DATA FIRST /.TRUE./
- C***FIRST EXECUTABLE STATEMENT BESI1E
- IF (FIRST) THEN
- NTI1 = INITS (BI1CS, 11, 0.1*R1MACH(3))
- NTAI1 = INITS (AI1CS, 21, 0.1*R1MACH(3))
- NTAI12 = INITS (AI12CS, 22, 0.1*R1MACH(3))
- C
- XMIN = 2.0*R1MACH(1)
- XSML = SQRT (4.5*R1MACH(3))
- ENDIF
- FIRST = .FALSE.
- C
- Y = ABS(X)
- IF (Y.GT.3.0) GO TO 20
- C
- BESI1E = 0.0
- IF (Y.EQ.0.0) RETURN
- C
- IF (Y .LE. XMIN) CALL XERMSG ('SLATEC', 'BESI1E',
- + 'ABS(X) SO SMALL I1 UNDERFLOWS', 1, 1)
- IF (Y.GT.XMIN) BESI1E = 0.5*X
- IF (Y.GT.XSML) BESI1E = X * (.875 + CSEVL(Y*Y/4.5-1., BI1CS,NTI1))
- BESI1E = EXP(-Y) * BESI1E
- RETURN
- C
- 20 IF (Y.LE.8.) BESI1E = (.375 + CSEVL ((48./Y-11.)/5., AI1CS, NTAI1)
- 1 ) / SQRT(Y)
- IF (Y.GT.8.) BESI1E = (.375 + CSEVL (16./Y-1.0, AI12CS, NTAI12))
- 1 / SQRT(Y)
- BESI1E = SIGN (BESI1E, X)
- C
- RETURN
- END
- *DECK BESJ
- SUBROUTINE BESJ (X, ALPHA, N, Y, NZ)
- C***BEGIN PROLOGUE BESJ
- C***PURPOSE Compute an N member sequence of J Bessel functions
- C J/SUB(ALPHA+K-1)/(X), K=1,...,N for non-negative ALPHA
- C and X.
- C***LIBRARY SLATEC
- C***CATEGORY C10A3
- C***TYPE SINGLE PRECISION (BESJ-S, DBESJ-D)
- C***KEYWORDS J BESSEL FUNCTION, SPECIAL FUNCTIONS
- C***AUTHOR Amos, D. E., (SNLA)
- C Daniel, S. L., (SNLA)
- C Weston, M. K., (SNLA)
- C***DESCRIPTION
- C
- C Abstract
- C BESJ computes an N member sequence of J Bessel functions
- C J/sub(ALPHA+K-1)/(X), K=1,...,N for non-negative ALPHA and X.
- C A combination of the power series, the asymptotic expansion
- C for X to infinity and the uniform asymptotic expansion for
- C NU to infinity are applied over subdivisions of the (NU,X)
- C plane. For values of (NU,X) not covered by one of these
- C formulae, the order is incremented or decremented by integer
- C values into a region where one of the formulae apply. Backward
- C recursion is applied to reduce orders by integer values except
- C where the entire sequence lies in the oscillatory region. In
- C this case forward recursion is stable and values from the
- C asymptotic expansion for X to infinity start the recursion
- C when it is efficient to do so. Leading terms of the series
- C and uniform expansion are tested for underflow. If a sequence
- C is requested and the last member would underflow, the result
- C is set to zero and the next lower order tried, etc., until a
- C member comes on scale or all members are set to zero.
- C Overflow cannot occur.
- C
- C Description of Arguments
- C
- C Input
- C X - X .GE. 0.0E0
- C ALPHA - order of first member of the sequence,
- C ALPHA .GE. 0.0E0
- C N - number of members in the sequence, N .GE. 1
- C
- C Output
- C Y - a vector whose first N components contain
- C values for J/sub(ALPHA+K-1)/(X), K=1,...,N
- C NZ - number of components of Y set to zero due to
- C underflow,
- C NZ=0 , normal return, computation completed
- C NZ .NE. 0, last NZ components of Y set to zero,
- C Y(K)=0.0E0, K=N-NZ+1,...,N.
- C
- C Error Conditions
- C Improper input arguments - a fatal error
- C Underflow - a non-fatal error (NZ .NE. 0)
- C
- C***REFERENCES D. E. Amos, S. L. Daniel and M. K. Weston, CDC 6600
- C subroutines IBESS and JBESS for Bessel functions
- C I(NU,X) and J(NU,X), X .GE. 0, NU .GE. 0, ACM
- C Transactions on Mathematical Software 3, (1977),
- C pp. 76-92.
- C F. W. J. Olver, Tables of Bessel Functions of Moderate
- C or Large Orders, NPL Mathematical Tables 6, Her
- C Majesty's Stationery Office, London, 1962.
- C***ROUTINES CALLED ALNGAM, ASYJY, I1MACH, JAIRY, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 750101 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE BESJ
- EXTERNAL JAIRY
- INTEGER I,IALP,IDALP,IFLW,IN,INLIM,IS,I1,I2,K,KK,KM,KT,N,NN,
- 1 NS,NZ
- INTEGER I1MACH
- REAL AK,AKM,ALPHA,ANS,AP,ARG,COEF,DALPHA,DFN,DTM,EARG,
- 1 ELIM1,ETX,FIDAL,FLGJY,FN,FNF,FNI,FNP1,FNU,FNULIM,
- 2 GLN,PDF,PIDT,PP,RDEN,RELB,RTTP,RTWO,RTX,RZDEN,
- 3 S,SA,SB,SXO2,S1,S2,T,TA,TAU,TB,TEMP,TFN,TM,TOL,
- 4 TOLLN,TRX,TX,T1,T2,WK,X,XO2,XO2L,Y,RTOL,SLIM
- SAVE RTWO, PDF, RTTP, PIDT, PP, INLIM, FNULIM
- REAL R1MACH, ALNGAM
- DIMENSION Y(*), TEMP(3), FNULIM(2), PP(4), WK(7)
- DATA RTWO,PDF,RTTP,PIDT / 1.34839972492648E+00,
- 1 7.85398163397448E-01, 7.97884560802865E-01, 1.57079632679490E+00/
- DATA PP(1), PP(2), PP(3), PP(4) / 8.72909153935547E+00,
- 1 2.65693932265030E-01, 1.24578576865586E-01, 7.70133747430388E-04/
- DATA INLIM / 150 /
- DATA FNULIM(1), FNULIM(2) / 100.0E0, 60.0E0 /
- C***FIRST EXECUTABLE STATEMENT BESJ
- NZ = 0
- KT = 1
- NS=0
- C I1MACH(14) REPLACES I1MACH(11) IN A DOUBLE PRECISION CODE
- C I1MACH(15) REPLACES I1MACH(12) IN A DOUBLE PRECISION CODE
- TA = R1MACH(3)
- TOL = MAX(TA,1.0E-15)
- I1 = I1MACH(11) + 1
- I2 = I1MACH(12)
- TB = R1MACH(5)
- ELIM1 = -2.303E0*(I2*TB+3.0E0)
- RTOL=1.0E0/TOL
- SLIM=R1MACH(1)*1.0E+3*RTOL
- C TOLLN = -LN(TOL)
- TOLLN = 2.303E0*TB*I1
- TOLLN = MIN(TOLLN,34.5388E0)
- IF (N-1) 720, 10, 20
- 10 KT = 2
- 20 NN = N
- IF (X) 730, 30, 80
- 30 IF (ALPHA) 710, 40, 50
- 40 Y(1) = 1.0E0
- IF (N.EQ.1) RETURN
- I1 = 2
- GO TO 60
- 50 I1 = 1
- 60 DO 70 I=I1,N
- Y(I) = 0.0E0
- 70 CONTINUE
- RETURN
- 80 CONTINUE
- IF (ALPHA.LT.0.0E0) GO TO 710
- C
- IALP = INT(ALPHA)
- FNI = IALP + N - 1
- FNF = ALPHA - IALP
- DFN = FNI + FNF
- FNU = DFN
- XO2 = X*0.5E0
- SXO2 = XO2*XO2
- C
- C DECISION TREE FOR REGION WHERE SERIES, ASYMPTOTIC EXPANSION FOR X
- C TO INFINITY AND ASYMPTOTIC EXPANSION FOR NU TO INFINITY ARE
- C APPLIED.
- C
- IF (SXO2.LE.(FNU+1.0E0)) GO TO 90
- TA = MAX(20.0E0,FNU)
- IF (X.GT.TA) GO TO 120
- IF (X.GT.12.0E0) GO TO 110
- XO2L = LOG(XO2)
- NS = INT(SXO2-FNU) + 1
- GO TO 100
- 90 FN = FNU
- FNP1 = FN + 1.0E0
- XO2L = LOG(XO2)
- IS = KT
- IF (X.LE.0.50E0) GO TO 330
- NS = 0
- 100 FNI = FNI + NS
- DFN = FNI + FNF
- FN = DFN
- FNP1 = FN + 1.0E0
- IS = KT
- IF (N-1+NS.GT.0) IS = 3
- GO TO 330
- 110 ANS = MAX(36.0E0-FNU,0.0E0)
- NS = INT(ANS)
- FNI = FNI + NS
- DFN = FNI + FNF
- FN = DFN
- IS = KT
- IF (N-1+NS.GT.0) IS = 3
- GO TO 130
- 120 CONTINUE
- RTX = SQRT(X)
- TAU = RTWO*RTX
- TA = TAU + FNULIM(KT)
- IF (FNU.LE.TA) GO TO 480
- FN = FNU
- IS = KT
- C
- C UNIFORM ASYMPTOTIC EXPANSION FOR NU TO INFINITY
- C
- 130 CONTINUE
- I1 = ABS(3-IS)
- I1 = MAX(I1,1)
- FLGJY = 1.0E0
- CALL ASYJY(JAIRY,X,FN,FLGJY,I1,TEMP(IS),WK,IFLW)
- IF(IFLW.NE.0) GO TO 380
- GO TO (320, 450, 620), IS
- 310 TEMP(1) = TEMP(3)
- KT = 1
- 320 IS = 2
- FNI = FNI - 1.0E0
- DFN = FNI + FNF
- FN = DFN
- IF(I1.EQ.2) GO TO 450
- GO TO 130
- C
- C SERIES FOR (X/2)**2.LE.NU+1
- C
- 330 CONTINUE
- GLN = ALNGAM(FNP1)
- ARG = FN*XO2L - GLN
- IF (ARG.LT.(-ELIM1)) GO TO 400
- EARG = EXP(ARG)
- 340 CONTINUE
- S = 1.0E0
- IF (X.LT.TOL) GO TO 360
- AK = 3.0E0
- T2 = 1.0E0
- T = 1.0E0
- S1 = FN
- DO 350 K=1,17
- S2 = T2 + S1
- T = -T*SXO2/S2
- S = S + T
- IF (ABS(T).LT.TOL) GO TO 360
- T2 = T2 + AK
- AK = AK + 2.0E0
- S1 = S1 + FN
- 350 CONTINUE
- 360 CONTINUE
- TEMP(IS) = S*EARG
- GO TO (370, 450, 610), IS
- 370 EARG = EARG*FN/XO2
- FNI = FNI - 1.0E0
- DFN = FNI + FNF
- FN = DFN
- IS = 2
- GO TO 340
- C
- C SET UNDERFLOW VALUE AND UPDATE PARAMETERS
- C UNDERFLOW CAN ONLY OCCUR FOR NS=0 SINCE THE ORDER MUST BE
- C LARGER THAN 36. THEREFORE, NS NEED NOT BE CONSIDERED.
- C
- 380 Y(NN) = 0.0E0
- NN = NN - 1
- FNI = FNI - 1.0E0
- DFN = FNI + FNF
- FN = DFN
- IF (NN-1) 440, 390, 130
- 390 KT = 2
- IS = 2
- GO TO 130
- 400 Y(NN) = 0.0E0
- NN = NN - 1
- FNP1 = FN
- FNI = FNI - 1.0E0
- DFN = FNI + FNF
- FN = DFN
- IF (NN-1) 440, 410, 420
- 410 KT = 2
- IS = 2
- 420 IF (SXO2.LE.FNP1) GO TO 430
- GO TO 130
- 430 ARG = ARG - XO2L + LOG(FNP1)
- IF (ARG.LT.(-ELIM1)) GO TO 400
- GO TO 330
- 440 NZ = N - NN
- RETURN
- C
- C BACKWARD RECURSION SECTION
- C
- 450 CONTINUE
- IF(NS.NE.0) GO TO 451
- NZ = N - NN
- IF (KT.EQ.2) GO TO 470
- C BACKWARD RECUR FROM INDEX ALPHA+NN-1 TO ALPHA
- Y(NN) = TEMP(1)
- Y(NN-1) = TEMP(2)
- IF (NN.EQ.2) RETURN
- 451 CONTINUE
- TRX = 2.0E0/X
- DTM = FNI
- TM = (DTM+FNF)*TRX
- AK=1.0E0
- TA=TEMP(1)
- TB=TEMP(2)
- IF(ABS(TA).GT.SLIM) GO TO 455
- TA=TA*RTOL
- TB=TB*RTOL
- AK=TOL
- 455 CONTINUE
- KK=2
- IN=NS-1
- IF(IN.EQ.0) GO TO 690
- IF(NS.NE.0) GO TO 670
- K=NN-2
- DO 460 I=3,NN
- S=TB
- TB=TM*TB-TA
- TA=S
- Y(K)=TB*AK
- K=K-1
- DTM = DTM - 1.0E0
- TM = (DTM+FNF)*TRX
- 460 CONTINUE
- RETURN
- 470 Y(1) = TEMP(2)
- RETURN
- C
- C ASYMPTOTIC EXPANSION FOR X TO INFINITY WITH FORWARD RECURSION IN
- C OSCILLATORY REGION X.GT.MAX(20, NU), PROVIDED THE LAST MEMBER
- C OF THE SEQUENCE IS ALSO IN THE REGION.
- C
- 480 CONTINUE
- IN = INT(ALPHA-TAU+2.0E0)
- IF (IN.LE.0) GO TO 490
- IDALP = IALP - IN - 1
- KT = 1
- GO TO 500
- 490 CONTINUE
- IDALP = IALP
- IN = 0
- 500 IS = KT
- FIDAL = IDALP
- DALPHA = FIDAL + FNF
- ARG = X - PIDT*DALPHA - PDF
- SA = SIN(ARG)
- SB = COS(ARG)
- COEF = RTTP/RTX
- ETX = 8.0E0*X
- 510 CONTINUE
- DTM = FIDAL + FIDAL
- DTM = DTM*DTM
- TM = 0.0E0
- IF (FIDAL.EQ.0.0E0 .AND. ABS(FNF).LT.TOL) GO TO 520
- TM = 4.0E0*FNF*(FIDAL+FIDAL+FNF)
- 520 CONTINUE
- TRX = DTM - 1.0E0
- T2 = (TRX+TM)/ETX
- S2 = T2
- RELB = TOL*ABS(T2)
- T1 = ETX
- S1 = 1.0E0
- FN = 1.0E0
- AK = 8.0E0
- DO 530 K=1,13
- T1 = T1 + ETX
- FN = FN + AK
- TRX = DTM - FN
- AP = TRX + TM
- T2 = -T2*AP/T1
- S1 = S1 + T2
- T1 = T1 + ETX
- AK = AK + 8.0E0
- FN = FN + AK
- TRX = DTM - FN
- AP = TRX + TM
- T2 = T2*AP/T1
- S2 = S2 + T2
- IF (ABS(T2).LE.RELB) GO TO 540
- AK = AK + 8.0E0
- 530 CONTINUE
- 540 TEMP(IS) = COEF*(S1*SB-S2*SA)
- IF(IS.EQ.2) GO TO 560
- FIDAL = FIDAL + 1.0E0
- DALPHA = FIDAL + FNF
- IS = 2
- TB = SA
- SA = -SB
- SB = TB
- GO TO 510
- C
- C FORWARD RECURSION SECTION
- C
- 560 IF (KT.EQ.2) GO TO 470
- S1 = TEMP(1)
- S2 = TEMP(2)
- TX = 2.0E0/X
- TM = DALPHA*TX
- IF (IN.EQ.0) GO TO 580
- C
- C FORWARD RECUR TO INDEX ALPHA
- C
- DO 570 I=1,IN
- S = S2
- S2 = TM*S2 - S1
- TM = TM + TX
- S1 = S
- 570 CONTINUE
- IF (NN.EQ.1) GO TO 600
- S = S2
- S2 = TM*S2 - S1
- TM = TM + TX
- S1 = S
- 580 CONTINUE
- C
- C FORWARD RECUR FROM INDEX ALPHA TO ALPHA+N-1
- C
- Y(1) = S1
- Y(2) = S2
- IF (NN.EQ.2) RETURN
- DO 590 I=3,NN
- Y(I) = TM*Y(I-1) - Y(I-2)
- TM = TM + TX
- 590 CONTINUE
- RETURN
- 600 Y(1) = S2
- RETURN
- C
- C BACKWARD RECURSION WITH NORMALIZATION BY
- C ASYMPTOTIC EXPANSION FOR NU TO INFINITY OR POWER SERIES.
- C
- 610 CONTINUE
- C COMPUTATION OF LAST ORDER FOR SERIES NORMALIZATION
- AKM = MAX(3.0E0-FN,0.0E0)
- KM = INT(AKM)
- TFN = FN + KM
- TA = (GLN+TFN-0.9189385332E0-0.0833333333E0/TFN)/(TFN+0.5E0)
- TA = XO2L - TA
- TB = -(1.0E0-1.5E0/TFN)/TFN
- AKM = TOLLN/(-TA+SQRT(TA*TA-TOLLN*TB)) + 1.5E0
- IN = KM + INT(AKM)
- GO TO 660
- 620 CONTINUE
- C COMPUTATION OF LAST ORDER FOR ASYMPTOTIC EXPANSION NORMALIZATION
- GLN = WK(3) + WK(2)
- IF (WK(6).GT.30.0E0) GO TO 640
- RDEN = (PP(4)*WK(6)+PP(3))*WK(6) + 1.0E0
- RZDEN = PP(1) + PP(2)*WK(6)
- TA = RZDEN/RDEN
- IF (WK(1).LT.0.10E0) GO TO 630
- TB = GLN/WK(5)
- GO TO 650
- 630 TB=(1.259921049E0+(0.1679894730E0+0.0887944358E0*WK(1))*WK(1))
- 1 /WK(7)
- GO TO 650
- 640 CONTINUE
- TA = 0.5E0*TOLLN/WK(4)
- TA=((0.0493827160E0*TA-0.1111111111E0)*TA+0.6666666667E0)*TA*WK(6)
- IF (WK(1).LT.0.10E0) GO TO 630
- TB = GLN/WK(5)
- 650 IN = INT(TA/TB+1.5E0)
- IF (IN.GT.INLIM) GO TO 310
- 660 CONTINUE
- DTM = FNI + IN
- TRX = 2.0E0/X
- TM = (DTM+FNF)*TRX
- TA = 0.0E0
- TB = TOL
- KK = 1
- AK=1.0E0
- 670 CONTINUE
- C
- C BACKWARD RECUR UNINDEXED AND SCALE WHEN MAGNITUDES ARE CLOSE TO
- C UNDERFLOW LIMITS (LESS THAN SLIM=R1MACH(1)*1.0E+3/TOL)
- C
- DO 680 I=1,IN
- S = TB
- TB = TM*TB - TA
- TA = S
- DTM = DTM - 1.0E0
- TM = (DTM+FNF)*TRX
- 680 CONTINUE
- C NORMALIZATION
- IF (KK.NE.1) GO TO 690
- S=TEMP(3)
- SA=TA/TB
- TA=S
- TB=S
- IF(ABS(S).GT.SLIM) GO TO 685
- TA=TA*RTOL
- TB=TB*RTOL
- AK=TOL
- 685 CONTINUE
- TA=TA*SA
- KK = 2
- IN = NS
- IF (NS.NE.0) GO TO 670
- 690 Y(NN) = TB*AK
- NZ = N - NN
- IF (NN.EQ.1) RETURN
- K = NN - 1
- S=TB
- TB = TM*TB - TA
- TA=S
- Y(K)=TB*AK
- IF (NN.EQ.2) RETURN
- DTM = DTM - 1.0E0
- TM = (DTM+FNF)*TRX
- K=NN-2
- C
- C BACKWARD RECUR INDEXED
- C
- DO 700 I=3,NN
- S=TB
- TB = TM*TB - TA
- TA=S
- Y(K)=TB*AK
- DTM = DTM - 1.0E0
- TM = (DTM+FNF)*TRX
- K = K - 1
- 700 CONTINUE
- RETURN
- C
- C
- C
- 710 CONTINUE
- CALL XERMSG ('SLATEC', 'BESJ', 'ORDER, ALPHA, LESS THAN ZERO.',
- + 2, 1)
- RETURN
- 720 CONTINUE
- CALL XERMSG ('SLATEC', 'BESJ', 'N LESS THAN ONE.', 2, 1)
- RETURN
- 730 CONTINUE
- CALL XERMSG ('SLATEC', 'BESJ', 'X LESS THAN ZERO.', 2, 1)
- RETURN
- END
- *DECK BESJ0
- FUNCTION BESJ0 (X)
- C***BEGIN PROLOGUE BESJ0
- C***PURPOSE Compute the Bessel function of the first kind of order
- C zero.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C10A1
- C***TYPE SINGLE PRECISION (BESJ0-S, DBESJ0-D)
- C***KEYWORDS BESSEL FUNCTION, FIRST KIND, FNLIB, ORDER ZERO,
- C SPECIAL FUNCTIONS
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C BESJ0(X) calculates the Bessel function of the first kind of
- C order zero for real argument X.
- C
- C Series for BJ0 on the interval 0. to 1.60000D+01
- C with weighted error 7.47E-18
- C log weighted error 17.13
- C significant figures required 16.98
- C decimal places required 17.68
- C
- C Series for BM0 on the interval 0. to 6.25000D-02
- C with weighted error 4.98E-17
- C log weighted error 16.30
- C significant figures required 14.97
- C decimal places required 16.96
- C
- C Series for BTH0 on the interval 0. to 6.25000D-02
- C with weighted error 3.67E-17
- C log weighted error 16.44
- C significant figures required 15.53
- C decimal places required 17.13
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED CSEVL, INITS, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770401 DATE WRITTEN
- C 890210 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***END PROLOGUE BESJ0
- DIMENSION BJ0CS(13), BM0CS(21), BTH0CS(24)
- LOGICAL FIRST
- SAVE BJ0CS, BM0CS, BTH0CS, PI4, NTJ0, NTM0, NTTH0, XSML, XMAX,
- 1 FIRST
- DATA BJ0CS( 1) / .1002541619 68939137E0 /
- DATA BJ0CS( 2) / -.6652230077 64405132E0 /
- DATA BJ0CS( 3) / .2489837034 98281314E0 /
- DATA BJ0CS( 4) / -.0332527231 700357697E0 /
- DATA BJ0CS( 5) / .0023114179 304694015E0 /
- DATA BJ0CS( 6) / -.0000991127 741995080E0 /
- DATA BJ0CS( 7) / .0000028916 708643998E0 /
- DATA BJ0CS( 8) / -.0000000612 108586630E0 /
- DATA BJ0CS( 9) / .0000000009 838650793E0 /
- DATA BJ0CS(10) / -.0000000000 124235515E0 /
- DATA BJ0CS(11) / .0000000000 001265433E0 /
- DATA BJ0CS(12) / -.0000000000 000010619E0 /
- DATA BJ0CS(13) / .0000000000 000000074E0 /
- DATA BM0CS( 1) / .0928496163 7381644E0 /
- DATA BM0CS( 2) / -.0014298770 7403484E0 /
- DATA BM0CS( 3) / .0000283057 9271257E0 /
- DATA BM0CS( 4) / -.0000014330 0611424E0 /
- DATA BM0CS( 5) / .0000001202 8628046E0 /
- DATA BM0CS( 6) / -.0000000139 7113013E0 /
- DATA BM0CS( 7) / .0000000020 4076188E0 /
- DATA BM0CS( 8) / -.0000000003 5399669E0 /
- DATA BM0CS( 9) / .0000000000 7024759E0 /
- DATA BM0CS(10) / -.0000000000 1554107E0 /
- DATA BM0CS(11) / .0000000000 0376226E0 /
- DATA BM0CS(12) / -.0000000000 0098282E0 /
- DATA BM0CS(13) / .0000000000 0027408E0 /
- DATA BM0CS(14) / -.0000000000 0008091E0 /
- DATA BM0CS(15) / .0000000000 0002511E0 /
- DATA BM0CS(16) / -.0000000000 0000814E0 /
- DATA BM0CS(17) / .0000000000 0000275E0 /
- DATA BM0CS(18) / -.0000000000 0000096E0 /
- DATA BM0CS(19) / .0000000000 0000034E0 /
- DATA BM0CS(20) / -.0000000000 0000012E0 /
- DATA BM0CS(21) / .0000000000 0000004E0 /
- DATA BTH0CS( 1) / -.2463916377 4300119E0 /
- DATA BTH0CS( 2) / .0017370983 07508963E0 /
- DATA BTH0CS( 3) / -.0000621836 33402968E0 /
- DATA BTH0CS( 4) / .0000043680 50165742E0 /
- DATA BTH0CS( 5) / -.0000004560 93019869E0 /
- DATA BTH0CS( 6) / .0000000621 97400101E0 /
- DATA BTH0CS( 7) / -.0000000103 00442889E0 /
- DATA BTH0CS( 8) / .0000000019 79526776E0 /
- DATA BTH0CS( 9) / -.0000000004 28198396E0 /
- DATA BTH0CS(10) / .0000000001 02035840E0 /
- DATA BTH0CS(11) / -.0000000000 26363898E0 /
- DATA BTH0CS(12) / .0000000000 07297935E0 /
- DATA BTH0CS(13) / -.0000000000 02144188E0 /
- DATA BTH0CS(14) / .0000000000 00663693E0 /
- DATA BTH0CS(15) / -.0000000000 00215126E0 /
- DATA BTH0CS(16) / .0000000000 00072659E0 /
- DATA BTH0CS(17) / -.0000000000 00025465E0 /
- DATA BTH0CS(18) / .0000000000 00009229E0 /
- DATA BTH0CS(19) / -.0000000000 00003448E0 /
- DATA BTH0CS(20) / .0000000000 00001325E0 /
- DATA BTH0CS(21) / -.0000000000 00000522E0 /
- DATA BTH0CS(22) / .0000000000 00000210E0 /
- DATA BTH0CS(23) / -.0000000000 00000087E0 /
- DATA BTH0CS(24) / .0000000000 00000036E0 /
- DATA PI4 / 0.7853981633 9744831E0 /
- DATA FIRST /.TRUE./
- C***FIRST EXECUTABLE STATEMENT BESJ0
- IF (FIRST) THEN
- NTJ0 = INITS (BJ0CS, 13, 0.1*R1MACH(3))
- NTM0 = INITS (BM0CS, 21, 0.1*R1MACH(3))
- NTTH0 = INITS (BTH0CS, 24, 0.1*R1MACH(3))
- C
- XSML = SQRT (8.0*R1MACH(3))
- XMAX = 1.0/R1MACH(4)
- ENDIF
- FIRST = .FALSE.
- C
- Y = ABS(X)
- IF (Y.GT.4.0) GO TO 20
- C
- BESJ0 = 1.0
- IF (Y.GT.XSML) BESJ0 = CSEVL (.125*Y*Y-1., BJ0CS, NTJ0)
- RETURN
- C
- 20 IF (Y .GT. XMAX) CALL XERMSG ('SLATEC', 'BESJ0',
- + 'NO PRECISION BECAUSE ABS(X) IS TOO BIG', 1, 2)
- C
- Z = 32.0/Y**2 - 1.0
- AMPL = (0.75 + CSEVL (Z, BM0CS, NTM0)) / SQRT(Y)
- THETA = Y - PI4 + CSEVL (Z, BTH0CS, NTTH0) / Y
- BESJ0 = AMPL * COS (THETA)
- C
- RETURN
- END
- *DECK BESJ1
- FUNCTION BESJ1 (X)
- C***BEGIN PROLOGUE BESJ1
- C***PURPOSE Compute the Bessel function of the first kind of order one.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C10A1
- C***TYPE SINGLE PRECISION (BESJ1-S, DBESJ1-D)
- C***KEYWORDS BESSEL FUNCTION, FIRST KIND, FNLIB, ORDER ONE,
- C SPECIAL FUNCTIONS
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C BESJ1(X) calculates the Bessel function of the first kind of
- C order one for real argument X.
- C
- C Series for BJ1 on the interval 0. to 1.60000D+01
- C with weighted error 4.48E-17
- C log weighted error 16.35
- C significant figures required 15.77
- C decimal places required 16.89
- C
- C Series for BM1 on the interval 0. to 6.25000D-02
- C with weighted error 5.61E-17
- C log weighted error 16.25
- C significant figures required 14.97
- C decimal places required 16.91
- C
- C Series for BTH1 on the interval 0. to 6.25000D-02
- C with weighted error 4.10E-17
- C log weighted error 16.39
- C significant figures required 15.96
- C decimal places required 17.08
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED CSEVL, INITS, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 780601 DATE WRITTEN
- C 890210 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***END PROLOGUE BESJ1
- DIMENSION BJ1CS(12), BM1CS(21), BTH1CS(24)
- LOGICAL FIRST
- SAVE BJ1CS, BM1CS, BTH1CS, PI4, NTJ1, NTM1, NTTH1,
- 1 XSML, XMIN, XMAX, FIRST
- DATA BJ1CS( 1) / -.1172614151 3332787E0 /
- DATA BJ1CS( 2) / -.2536152183 0790640E0 /
- DATA BJ1CS( 3) / .0501270809 84469569E0 /
- DATA BJ1CS( 4) / -.0046315148 09625081E0 /
- DATA BJ1CS( 5) / .0002479962 29415914E0 /
- DATA BJ1CS( 6) / -.0000086789 48686278E0 /
- DATA BJ1CS( 7) / .0000002142 93917143E0 /
- DATA BJ1CS( 8) / -.0000000039 36093079E0 /
- DATA BJ1CS( 9) / .0000000000 55911823E0 /
- DATA BJ1CS(10) / -.0000000000 00632761E0 /
- DATA BJ1CS(11) / .0000000000 00005840E0 /
- DATA BJ1CS(12) / -.0000000000 00000044E0 /
- DATA BM1CS( 1) / .1047362510 931285E0 /
- DATA BM1CS( 2) / .0044244389 3702345E0 /
- DATA BM1CS( 3) / -.0000566163 9504035E0 /
- DATA BM1CS( 4) / .0000023134 9417339E0 /
- DATA BM1CS( 5) / -.0000001737 7182007E0 /
- DATA BM1CS( 6) / .0000000189 3209930E0 /
- DATA BM1CS( 7) / -.0000000026 5416023E0 /
- DATA BM1CS( 8) / .0000000004 4740209E0 /
- DATA BM1CS( 9) / -.0000000000 8691795E0 /
- DATA BM1CS(10) / .0000000000 1891492E0 /
- DATA BM1CS(11) / -.0000000000 0451884E0 /
- DATA BM1CS(12) / .0000000000 0116765E0 /
- DATA BM1CS(13) / -.0000000000 0032265E0 /
- DATA BM1CS(14) / .0000000000 0009450E0 /
- DATA BM1CS(15) / -.0000000000 0002913E0 /
- DATA BM1CS(16) / .0000000000 0000939E0 /
- DATA BM1CS(17) / -.0000000000 0000315E0 /
- DATA BM1CS(18) / .0000000000 0000109E0 /
- DATA BM1CS(19) / -.0000000000 0000039E0 /
- DATA BM1CS(20) / .0000000000 0000014E0 /
- DATA BM1CS(21) / -.0000000000 0000005E0 /
- DATA BTH1CS( 1) / .7406014102 6313850E0 /
- DATA BTH1CS( 2) / -.0045717556 59637690E0 /
- DATA BTH1CS( 3) / .0001198185 10964326E0 /
- DATA BTH1CS( 4) / -.0000069645 61891648E0 /
- DATA BTH1CS( 5) / .0000006554 95621447E0 /
- DATA BTH1CS( 6) / -.0000000840 66228945E0 /
- DATA BTH1CS( 7) / .0000000133 76886564E0 /
- DATA BTH1CS( 8) / -.0000000024 99565654E0 /
- DATA BTH1CS( 9) / .0000000005 29495100E0 /
- DATA BTH1CS(10) / -.0000000001 24135944E0 /
- DATA BTH1CS(11) / .0000000000 31656485E0 /
- DATA BTH1CS(12) / -.0000000000 08668640E0 /
- DATA BTH1CS(13) / .0000000000 02523758E0 /
- DATA BTH1CS(14) / -.0000000000 00775085E0 /
- DATA BTH1CS(15) / .0000000000 00249527E0 /
- DATA BTH1CS(16) / -.0000000000 00083773E0 /
- DATA BTH1CS(17) / .0000000000 00029205E0 /
- DATA BTH1CS(18) / -.0000000000 00010534E0 /
- DATA BTH1CS(19) / .0000000000 00003919E0 /
- DATA BTH1CS(20) / -.0000000000 00001500E0 /
- DATA BTH1CS(21) / .0000000000 00000589E0 /
- DATA BTH1CS(22) / -.0000000000 00000237E0 /
- DATA BTH1CS(23) / .0000000000 00000097E0 /
- DATA BTH1CS(24) / -.0000000000 00000040E0 /
- DATA PI4 / 0.7853981633 9744831E0 /
- DATA FIRST /.TRUE./
- C***FIRST EXECUTABLE STATEMENT BESJ1
- IF (FIRST) THEN
- NTJ1 = INITS (BJ1CS, 12, 0.1*R1MACH(3))
- NTM1 = INITS (BM1CS, 21, 0.1*R1MACH(3))
- NTTH1 = INITS (BTH1CS, 24, 0.1*R1MACH(3))
- C
- XSML = SQRT (8.0*R1MACH(3))
- XMIN = 2.0*R1MACH(1)
- XMAX = 1.0/R1MACH(4)
- ENDIF
- FIRST = .FALSE.
- C
- Y = ABS(X)
- IF (Y.GT.4.0) GO TO 20
- C
- BESJ1 = 0.
- IF (Y.EQ.0.0) RETURN
- IF (Y .LE. XMIN) CALL XERMSG ('SLATEC', 'BESJ1',
- + 'ABS(X) SO SMALL J1 UNDERFLOWS', 1, 1)
- IF (Y.GT.XMIN) BESJ1 = 0.5*X
- IF (Y.GT.XSML) BESJ1 = X * (.25 + CSEVL(.125*Y*Y-1., BJ1CS, NTJ1))
- RETURN
- C
- 20 IF (Y .GT. XMAX) CALL XERMSG ('SLATEC', 'BESJ1',
- + 'NO PRECISION BECAUSE ABS(X) IS TOO BIG', 2, 2)
- Z = 32.0/Y**2 - 1.0
- AMPL = (0.75 + CSEVL (Z, BM1CS, NTM1)) / SQRT(Y)
- THETA = Y - 3.0*PI4 + CSEVL (Z, BTH1CS, NTTH1) / Y
- BESJ1 = SIGN (AMPL, X) * COS (THETA)
- C
- RETURN
- END
- *DECK BESK
- SUBROUTINE BESK (X, FNU, KODE, N, Y, NZ)
- C***BEGIN PROLOGUE BESK
- C***PURPOSE Implement forward recursion on the three term recursion
- C relation for a sequence of non-negative order Bessel
- C functions K/SUB(FNU+I-1)/(X), or scaled Bessel functions
- C EXP(X)*K/SUB(FNU+I-1)/(X), I=1,...,N for real, positive
- C X and non-negative orders FNU.
- C***LIBRARY SLATEC
- C***CATEGORY C10B3
- C***TYPE SINGLE PRECISION (BESK-S, DBESK-D)
- C***KEYWORDS K BESSEL FUNCTION, SPECIAL FUNCTIONS
- C***AUTHOR Amos, D. E., (SNLA)
- C***DESCRIPTION
- C
- C Abstract
- C BESK implements forward recursion on the three term
- C recursion relation for a sequence of non-negative order Bessel
- C functions K/sub(FNU+I-1)/(X), or scaled Bessel functions
- C EXP(X)*K/sub(FNU+I-1)/(X), I=1,...,N for real X .GT. 0.0E0 and
- C non-negative orders FNU. If FNU .LT. NULIM, orders FNU and
- C FNU+1 are obtained from BESKNU to start the recursion. If
- C FNU .GE. NULIM, the uniform asymptotic expansion is used for
- C orders FNU and FNU+1 to start the recursion. NULIM is 35 or
- C 70 depending on whether N=1 or N .GE. 2. Under and overflow
- C tests are made on the leading term of the asymptotic expansion
- C before any extensive computation is done.
- C
- C Description of Arguments
- C
- C Input
- C X - X .GT. 0.0E0
- C FNU - order of the initial K function, FNU .GE. 0.0E0
- C KODE - a parameter to indicate the scaling option
- C KODE=1 returns Y(I)= K/sub(FNU+I-1)/(X),
- C I=1,...,N
- C KODE=2 returns Y(I)=EXP(X)*K/sub(FNU+I-1)/(X),
- C I=1,...,N
- C N - number of members in the sequence, N .GE. 1
- C
- C Output
- C y - a vector whose first n components contain values
- C for the sequence
- C Y(I)= K/sub(FNU+I-1)/(X), I=1,...,N or
- C Y(I)=EXP(X)*K/sub(FNU+I-1)/(X), I=1,...,N
- C depending on KODE
- C NZ - number of components of Y set to zero due to
- C underflow with KODE=1,
- C NZ=0 , normal return, computation completed
- C NZ .NE. 0, first NZ components of Y set to zero
- C due to underflow, Y(I)=0.0E0, I=1,...,NZ
- C
- C Error Conditions
- C Improper input arguments - a fatal error
- C Overflow - a fatal error
- C Underflow with KODE=1 - a non-fatal error (NZ .NE. 0)
- C
- C***REFERENCES F. W. J. Olver, Tables of Bessel Functions of Moderate
- C or Large Orders, NPL Mathematical Tables 6, Her
- C Majesty's Stationery Office, London, 1962.
- C N. M. Temme, On the numerical evaluation of the modified
- C Bessel function of the third kind, Journal of
- C Computational Physics 19, (1975), pp. 324-337.
- C***ROUTINES CALLED ASYIK, BESK0, BESK0E, BESK1, BESK1E, BESKNU,
- C I1MACH, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 790201 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE BESK
- C
- INTEGER I, J, K, KODE, MZ, N, NB, ND, NN, NUD, NULIM, NZ
- INTEGER I1MACH
- REAL CN, DNU, ELIM, ETX, FLGIK,FN, FNN, FNU,GLN,GNU,RTZ,S,S1,S2,
- 1 T, TM, TRX, W, X, XLIM, Y, ZN
- REAL BESK0, BESK1, BESK1E, BESK0E, R1MACH
- DIMENSION W(2), NULIM(2), Y(*)
- SAVE NULIM
- DATA NULIM(1),NULIM(2) / 35 , 70 /
- C***FIRST EXECUTABLE STATEMENT BESK
- NN = -I1MACH(12)
- ELIM = 2.303E0*(NN*R1MACH(5)-3.0E0)
- XLIM = R1MACH(1)*1.0E+3
- IF (KODE.LT.1 .OR. KODE.GT.2) GO TO 280
- IF (FNU.LT.0.0E0) GO TO 290
- IF (X.LE.0.0E0) GO TO 300
- IF (X.LT.XLIM) GO TO 320
- IF (N.LT.1) GO TO 310
- ETX = KODE - 1
- C
- C ND IS A DUMMY VARIABLE FOR N
- C GNU IS A DUMMY VARIABLE FOR FNU
- C NZ = NUMBER OF UNDERFLOWS ON KODE=1
- C
- ND = N
- NZ = 0
- NUD = INT(FNU)
- DNU = FNU - NUD
- GNU = FNU
- NN = MIN(2,ND)
- FN = FNU + N - 1
- FNN = FN
- IF (FN.LT.2.0E0) GO TO 150
- C
- C OVERFLOW TEST (LEADING EXPONENTIAL OF ASYMPTOTIC EXPANSION)
- C FOR THE LAST ORDER, FNU+N-1.GE.NULIM
- C
- ZN = X/FN
- IF (ZN.EQ.0.0E0) GO TO 320
- RTZ = SQRT(1.0E0+ZN*ZN)
- GLN = LOG((1.0E0+RTZ)/ZN)
- T = RTZ*(1.0E0-ETX) + ETX/(ZN+RTZ)
- CN = -FN*(T-GLN)
- IF (CN.GT.ELIM) GO TO 320
- IF (NUD.LT.NULIM(NN)) GO TO 30
- IF (NN.EQ.1) GO TO 20
- 10 CONTINUE
- C
- C UNDERFLOW TEST (LEADING EXPONENTIAL OF ASYMPTOTIC EXPANSION)
- C FOR THE FIRST ORDER, FNU.GE.NULIM
- C
- FN = GNU
- ZN = X/FN
- RTZ = SQRT(1.0E0+ZN*ZN)
- GLN = LOG((1.0E0+RTZ)/ZN)
- T = RTZ*(1.0E0-ETX) + ETX/(ZN+RTZ)
- CN = -FN*(T-GLN)
- 20 CONTINUE
- IF (CN.LT.-ELIM) GO TO 230
- C
- C ASYMPTOTIC EXPANSION FOR ORDERS FNU AND FNU+1.GE.NULIM
- C
- FLGIK = -1.0E0
- CALL ASYIK(X,GNU,KODE,FLGIK,RTZ,CN,NN,Y)
- IF (NN.EQ.1) GO TO 240
- TRX = 2.0E0/X
- TM = (GNU+GNU+2.0E0)/X
- GO TO 130
- C
- 30 CONTINUE
- IF (KODE.EQ.2) GO TO 40
- C
- C UNDERFLOW TEST (LEADING EXPONENTIAL OF ASYMPTOTIC EXPANSION IN X)
- C FOR ORDER DNU
- C
- IF (X.GT.ELIM) GO TO 230
- 40 CONTINUE
- IF (DNU.NE.0.0E0) GO TO 80
- IF (KODE.EQ.2) GO TO 50
- S1 = BESK0(X)
- GO TO 60
- 50 S1 = BESK0E(X)
- 60 CONTINUE
- IF (NUD.EQ.0 .AND. ND.EQ.1) GO TO 120
- IF (KODE.EQ.2) GO TO 70
- S2 = BESK1(X)
- GO TO 90
- 70 S2 = BESK1E(X)
- GO TO 90
- 80 CONTINUE
- NB = 2
- IF (NUD.EQ.0 .AND. ND.EQ.1) NB = 1
- CALL BESKNU(X, DNU, KODE, NB, W, NZ)
- S1 = W(1)
- IF (NB.EQ.1) GO TO 120
- S2 = W(2)
- 90 CONTINUE
- TRX = 2.0E0/X
- TM = (DNU+DNU+2.0E0)/X
- C FORWARD RECUR FROM DNU TO FNU+1 TO GET Y(1) AND Y(2)
- IF (ND.EQ.1) NUD = NUD - 1
- IF (NUD.GT.0) GO TO 100
- IF (ND.GT.1) GO TO 120
- S1 = S2
- GO TO 120
- 100 CONTINUE
- DO 110 I=1,NUD
- S = S2
- S2 = TM*S2 + S1
- S1 = S
- TM = TM + TRX
- 110 CONTINUE
- IF (ND.EQ.1) S1 = S2
- 120 CONTINUE
- Y(1) = S1
- IF (ND.EQ.1) GO TO 240
- Y(2) = S2
- 130 CONTINUE
- IF (ND.EQ.2) GO TO 240
- C FORWARD RECUR FROM FNU+2 TO FNU+N-1
- DO 140 I=3,ND
- Y(I) = TM*Y(I-1) + Y(I-2)
- TM = TM + TRX
- 140 CONTINUE
- GO TO 240
- C
- 150 CONTINUE
- C UNDERFLOW TEST FOR KODE=1
- IF (KODE.EQ.2) GO TO 160
- IF (X.GT.ELIM) GO TO 230
- 160 CONTINUE
- C OVERFLOW TEST
- IF (FN.LE.1.0E0) GO TO 170
- IF (-FN*(LOG(X)-0.693E0).GT.ELIM) GO TO 320
- 170 CONTINUE
- IF (DNU.EQ.0.0E0) GO TO 180
- CALL BESKNU(X, FNU, KODE, ND, Y, MZ)
- GO TO 240
- 180 CONTINUE
- J = NUD
- IF (J.EQ.1) GO TO 210
- J = J + 1
- IF (KODE.EQ.2) GO TO 190
- Y(J) = BESK0(X)
- GO TO 200
- 190 Y(J) = BESK0E(X)
- 200 IF (ND.EQ.1) GO TO 240
- J = J + 1
- 210 IF (KODE.EQ.2) GO TO 220
- Y(J) = BESK1(X)
- GO TO 240
- 220 Y(J) = BESK1E(X)
- GO TO 240
- C
- C UPDATE PARAMETERS ON UNDERFLOW
- C
- 230 CONTINUE
- NUD = NUD + 1
- ND = ND - 1
- IF (ND.EQ.0) GO TO 240
- NN = MIN(2,ND)
- GNU = GNU + 1.0E0
- IF (FNN.LT.2.0E0) GO TO 230
- IF (NUD.LT.NULIM(NN)) GO TO 230
- GO TO 10
- 240 CONTINUE
- NZ = N - ND
- IF (NZ.EQ.0) RETURN
- IF (ND.EQ.0) GO TO 260
- DO 250 I=1,ND
- J = N - I + 1
- K = ND - I + 1
- Y(J) = Y(K)
- 250 CONTINUE
- 260 CONTINUE
- DO 270 I=1,NZ
- Y(I) = 0.0E0
- 270 CONTINUE
- RETURN
- C
- C
- C
- 280 CONTINUE
- CALL XERMSG ('SLATEC', 'BESK', 'SCALING OPTION, KODE, NOT 1 OR 2'
- + , 2, 1)
- RETURN
- 290 CONTINUE
- CALL XERMSG ('SLATEC', 'BESK', 'ORDER, FNU, LESS THAN ZERO', 2,
- + 1)
- RETURN
- 300 CONTINUE
- CALL XERMSG ('SLATEC', 'BESK', 'X LESS THAN OR EQUAL TO ZERO', 2,
- + 1)
- RETURN
- 310 CONTINUE
- CALL XERMSG ('SLATEC', 'BESK', 'N LESS THAN ONE', 2, 1)
- RETURN
- 320 CONTINUE
- CALL XERMSG ('SLATEC', 'BESK',
- + 'OVERFLOW, FNU OR N TOO LARGE OR X TOO SMALL', 6, 1)
- RETURN
- END
- *DECK BESK0
- FUNCTION BESK0 (X)
- C***BEGIN PROLOGUE BESK0
- C***PURPOSE Compute the modified (hyperbolic) Bessel function of the
- C third kind of order zero.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C10B1
- C***TYPE SINGLE PRECISION (BESK0-S, DBESK0-D)
- C***KEYWORDS FNLIB, HYPERBOLIC BESSEL FUNCTION,
- C MODIFIED BESSEL FUNCTION, ORDER ZERO, SPECIAL FUNCTIONS,
- C THIRD KIND
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C BESK0(X) calculates the modified (hyperbolic) Bessel function
- C of the third kind of order zero for real argument X .GT. 0.0.
- C
- C Series for BK0 on the interval 0. to 4.00000D+00
- C with weighted error 3.57E-19
- C log weighted error 18.45
- C significant figures required 17.99
- C decimal places required 18.97
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED BESI0, BESK0E, CSEVL, INITS, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770401 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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***END PROLOGUE BESK0
- DIMENSION BK0CS(11)
- LOGICAL FIRST
- SAVE BK0CS, NTK0, XSML, XMAX, FIRST
- DATA BK0CS( 1) / -.0353273932 3390276872E0 /
- DATA BK0CS( 2) / .3442898999 246284869E0 /
- DATA BK0CS( 3) / .0359799365 1536150163E0 /
- DATA BK0CS( 4) / .0012646154 1144692592E0 /
- DATA BK0CS( 5) / .0000228621 2103119451E0 /
- DATA BK0CS( 6) / .0000002534 7910790261E0 /
- DATA BK0CS( 7) / .0000000019 0451637722E0 /
- DATA BK0CS( 8) / .0000000000 1034969525E0 /
- DATA BK0CS( 9) / .0000000000 0004259816E0 /
- DATA BK0CS(10) / .0000000000 0000013744E0 /
- DATA BK0CS(11) / .0000000000 0000000035E0 /
- DATA FIRST /.TRUE./
- C***FIRST EXECUTABLE STATEMENT BESK0
- IF (FIRST) THEN
- NTK0 = INITS (BK0CS, 11, 0.1*R1MACH(3))
- XSML = SQRT (4.0*R1MACH(3))
- XMAXT = -LOG(R1MACH(1))
- XMAX = XMAXT - 0.5*XMAXT*LOG(XMAXT)/(XMAXT+0.5) - 0.01
- ENDIF
- FIRST = .FALSE.
- C
- IF (X .LE. 0.) CALL XERMSG ('SLATEC', 'BESK0',
- + 'X IS ZERO OR NEGATIVE', 2, 2)
- IF (X.GT.2.) GO TO 20
- C
- Y = 0.
- IF (X.GT.XSML) Y = X*X
- BESK0 = -LOG(0.5*X)*BESI0(X) - .25 + CSEVL (.5*Y-1., BK0CS, NTK0)
- RETURN
- C
- 20 BESK0 = 0.
- IF (X .GT. XMAX) CALL XERMSG ('SLATEC', 'BESK0',
- + 'X SO BIG K0 UNDERFLOWS', 1, 1)
- IF (X.GT.XMAX) RETURN
- C
- BESK0 = EXP(-X) * BESK0E(X)
- C
- RETURN
- END
- *DECK BESK0E
- FUNCTION BESK0E (X)
- C***BEGIN PROLOGUE BESK0E
- C***PURPOSE Compute the exponentially scaled modified (hyperbolic)
- C Bessel function of the third kind of order zero.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C10B1
- C***TYPE SINGLE PRECISION (BESK0E-S, DBSK0E-D)
- C***KEYWORDS EXPONENTIALLY SCALED, FNLIB, HYPERBOLIC BESSEL FUNCTION,
- C MODIFIED BESSEL FUNCTION, ORDER ZERO, SPECIAL FUNCTIONS,
- C THIRD KIND
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C BESK0E(X) computes the exponentially scaled modified (hyperbolic)
- C Bessel function of third kind of order zero for real argument
- C X .GT. 0.0, i.e., EXP(X)*K0(X).
- C
- C Series for BK0 on the interval 0. to 4.00000D+00
- C with weighted error 3.57E-19
- C log weighted error 18.45
- C significant figures required 17.99
- C decimal places required 18.97
- C
- C Series for AK0 on the interval 1.25000D-01 to 5.00000D-01
- C with weighted error 5.34E-17
- C log weighted error 16.27
- C significant figures required 14.92
- C decimal places required 16.89
- C
- C Series for AK02 on the interval 0. to 1.25000D-01
- C with weighted error 2.34E-17
- C log weighted error 16.63
- C significant figures required 14.67
- C decimal places required 17.20
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED BESI0, CSEVL, INITS, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770401 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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***END PROLOGUE BESK0E
- DIMENSION BK0CS(11), AK0CS(17), AK02CS(14)
- LOGICAL FIRST
- SAVE BK0CS, AK0CS, AK02CS, NTK0, NTAK0, NTAK02, XSML, FIRST
- DATA BK0CS( 1) / -.0353273932 3390276872E0 /
- DATA BK0CS( 2) / .3442898999 246284869E0 /
- DATA BK0CS( 3) / .0359799365 1536150163E0 /
- DATA BK0CS( 4) / .0012646154 1144692592E0 /
- DATA BK0CS( 5) / .0000228621 2103119451E0 /
- DATA BK0CS( 6) / .0000002534 7910790261E0 /
- DATA BK0CS( 7) / .0000000019 0451637722E0 /
- DATA BK0CS( 8) / .0000000000 1034969525E0 /
- DATA BK0CS( 9) / .0000000000 0004259816E0 /
- DATA BK0CS(10) / .0000000000 0000013744E0 /
- DATA BK0CS(11) / .0000000000 0000000035E0 /
- DATA AK0CS( 1) / -.0764394790 3327941E0 /
- DATA AK0CS( 2) / -.0223565260 5699819E0 /
- DATA AK0CS( 3) / .0007734181 1546938E0 /
- DATA AK0CS( 4) / -.0000428100 6688886E0 /
- DATA AK0CS( 5) / .0000030817 0017386E0 /
- DATA AK0CS( 6) / -.0000002639 3672220E0 /
- DATA AK0CS( 7) / .0000000256 3713036E0 /
- DATA AK0CS( 8) / -.0000000027 4270554E0 /
- DATA AK0CS( 9) / .0000000003 1694296E0 /
- DATA AK0CS(10) / -.0000000000 3902353E0 /
- DATA AK0CS(11) / .0000000000 0506804E0 /
- DATA AK0CS(12) / -.0000000000 0068895E0 /
- DATA AK0CS(13) / .0000000000 0009744E0 /
- DATA AK0CS(14) / -.0000000000 0001427E0 /
- DATA AK0CS(15) / .0000000000 0000215E0 /
- DATA AK0CS(16) / -.0000000000 0000033E0 /
- DATA AK0CS(17) / .0000000000 0000005E0 /
- DATA AK02CS( 1) / -.0120186982 6307592E0 /
- DATA AK02CS( 2) / -.0091748526 9102569E0 /
- DATA AK02CS( 3) / .0001444550 9317750E0 /
- DATA AK02CS( 4) / -.0000040136 1417543E0 /
- DATA AK02CS( 5) / .0000001567 8318108E0 /
- DATA AK02CS( 6) / -.0000000077 7011043E0 /
- DATA AK02CS( 7) / .0000000004 6111825E0 /
- DATA AK02CS( 8) / -.0000000000 3158592E0 /
- DATA AK02CS( 9) / .0000000000 0243501E0 /
- DATA AK02CS(10) / -.0000000000 0020743E0 /
- DATA AK02CS(11) / .0000000000 0001925E0 /
- DATA AK02CS(12) / -.0000000000 0000192E0 /
- DATA AK02CS(13) / .0000000000 0000020E0 /
- DATA AK02CS(14) / -.0000000000 0000002E0 /
- DATA FIRST /.TRUE./
- C***FIRST EXECUTABLE STATEMENT BESK0E
- IF (FIRST) THEN
- NTK0 = INITS (BK0CS, 11, 0.1*R1MACH(3))
- NTAK0 = INITS (AK0CS, 17, 0.1*R1MACH(3))
- NTAK02 = INITS (AK02CS, 14, 0.1*R1MACH(3))
- XSML = SQRT (4.0*R1MACH(3))
- ENDIF
- FIRST = .FALSE.
- C
- IF (X .LE. 0.) CALL XERMSG ('SLATEC', 'BESK0E',
- + 'X IS ZERO OR NEGATIVE', 2, 2)
- IF (X.GT.2.) GO TO 20
- C
- Y = 0.
- IF (X.GT.XSML) Y = X*X
- BESK0E = EXP(X) * (-LOG(0.5*X)*BESI0(X)
- 1 - .25 + CSEVL (.5*Y-1., BK0CS, NTK0) )
- RETURN
- C
- 20 IF (X.LE.8.) BESK0E = (1.25 + CSEVL ((16./X-5.)/3., AK0CS, NTAK0))
- 1 / SQRT(X)
- IF (X.GT.8.) BESK0E = (1.25 + CSEVL (16./X-1., AK02CS, NTAK02))
- 1 / SQRT(X)
- C
- RETURN
- END
- *DECK BESK1
- FUNCTION BESK1 (X)
- C***BEGIN PROLOGUE BESK1
- C***PURPOSE Compute the modified (hyperbolic) Bessel function of the
- C third kind of order one.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C10B1
- C***TYPE SINGLE PRECISION (BESK1-S, DBESK1-D)
- C***KEYWORDS FNLIB, HYPERBOLIC BESSEL FUNCTION,
- C MODIFIED BESSEL FUNCTION, ORDER ONE, SPECIAL FUNCTIONS,
- C THIRD KIND
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C BESK1(X) computes the modified (hyperbolic) Bessel function of third
- C kind of order one for real argument X, where X .GT. 0.
- C
- C Series for BK1 on the interval 0. to 4.00000D+00
- C with weighted error 7.02E-18
- C log weighted error 17.15
- C significant figures required 16.73
- C decimal places required 17.67
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED BESI1, BESK1E, CSEVL, INITS, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770401 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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***END PROLOGUE BESK1
- DIMENSION BK1CS(11)
- LOGICAL FIRST
- SAVE BK1CS, NTK1, XMIN, XSML, XMAX, FIRST
- DATA BK1CS( 1) / .0253002273 389477705E0 /
- DATA BK1CS( 2) / -.3531559607 76544876E0 /
- DATA BK1CS( 3) / -.1226111808 22657148E0 /
- DATA BK1CS( 4) / -.0069757238 596398643E0 /
- DATA BK1CS( 5) / -.0001730288 957513052E0 /
- DATA BK1CS( 6) / -.0000024334 061415659E0 /
- DATA BK1CS( 7) / -.0000000221 338763073E0 /
- DATA BK1CS( 8) / -.0000000001 411488392E0 /
- DATA BK1CS( 9) / -.0000000000 006666901E0 /
- DATA BK1CS(10) / -.0000000000 000024274E0 /
- DATA BK1CS(11) / -.0000000000 000000070E0 /
- DATA FIRST /.TRUE./
- C***FIRST EXECUTABLE STATEMENT BESK1
- IF (FIRST) THEN
- NTK1 = INITS (BK1CS, 11, 0.1*R1MACH(3))
- XMIN = EXP (MAX(LOG(R1MACH(1)), -LOG(R1MACH(2))) + .01)
- XSML = SQRT (4.0*R1MACH(3))
- XMAXT = -LOG(R1MACH(1))
- XMAX = XMAXT - 0.5*XMAXT*LOG(XMAXT)/(XMAXT+0.5)
- ENDIF
- FIRST = .FALSE.
- C
- IF (X .LE. 0.) CALL XERMSG ('SLATEC', 'BESK1',
- + 'X IS ZERO OR NEGATIVE', 2, 2)
- IF (X.GT.2.0) GO TO 20
- C
- IF (X .LT. XMIN) CALL XERMSG ('SLATEC', 'BESK1',
- + 'X SO SMALL K1 OVERFLOWS', 3, 2)
- Y = 0.
- IF (X.GT.XSML) Y = X*X
- BESK1 = LOG(0.5*X)*BESI1(X) +
- 1 (0.75 + CSEVL (.5*Y-1., BK1CS, NTK1))/X
- RETURN
- C
- 20 BESK1 = 0.
- IF (X .GT. XMAX) CALL XERMSG ('SLATEC', 'BESK1',
- + 'X SO BIG K1 UNDERFLOWS', 1, 1)
- IF (X.GT.XMAX) RETURN
- C
- BESK1 = EXP(-X) * BESK1E(X)
- C
- RETURN
- END
- *DECK BESK1E
- FUNCTION BESK1E (X)
- C***BEGIN PROLOGUE BESK1E
- C***PURPOSE Compute the exponentially scaled modified (hyperbolic)
- C Bessel function of the third kind of order one.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C10B1
- C***TYPE SINGLE PRECISION (BESK1E-S, DBSK1E-D)
- C***KEYWORDS EXPONENTIALLY SCALED, FNLIB, HYPERBOLIC BESSEL FUNCTION,
- C MODIFIED BESSEL FUNCTION, ORDER ONE, SPECIAL FUNCTIONS,
- C THIRD KIND
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C BESK1E(X) computes the exponentially scaled modified (hyperbolic)
- C Bessel function of third kind of order one for real argument
- C X .GT. 0.0, i.e., EXP(X)*K1(X).
- C
- C Series for BK1 on the interval 0. to 4.00000D+00
- C with weighted error 7.02E-18
- C log weighted error 17.15
- C significant figures required 16.73
- C decimal places required 17.67
- C
- C Series for AK1 on the interval 1.25000D-01 to 5.00000D-01
- C with weighted error 6.06E-17
- C log weighted error 16.22
- C significant figures required 15.41
- C decimal places required 16.83
- C
- C Series for AK12 on the interval 0. to 1.25000D-01
- C with weighted error 2.58E-17
- C log weighted error 16.59
- C significant figures required 15.22
- C decimal places required 17.16
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED BESI1, CSEVL, INITS, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770401 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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***END PROLOGUE BESK1E
- DIMENSION BK1CS(11), AK1CS(17), AK12CS(14)
- LOGICAL FIRST
- SAVE BK1CS, AK1CS, AK12CS, NTK1, NTAK1, NTAK12, XMIN, XSML,
- 1 FIRST
- DATA BK1CS( 1) / .0253002273 389477705E0 /
- DATA BK1CS( 2) / -.3531559607 76544876E0 /
- DATA BK1CS( 3) / -.1226111808 22657148E0 /
- DATA BK1CS( 4) / -.0069757238 596398643E0 /
- DATA BK1CS( 5) / -.0001730288 957513052E0 /
- DATA BK1CS( 6) / -.0000024334 061415659E0 /
- DATA BK1CS( 7) / -.0000000221 338763073E0 /
- DATA BK1CS( 8) / -.0000000001 411488392E0 /
- DATA BK1CS( 9) / -.0000000000 006666901E0 /
- DATA BK1CS(10) / -.0000000000 000024274E0 /
- DATA BK1CS(11) / -.0000000000 000000070E0 /
- DATA AK1CS( 1) / .2744313406 973883E0 /
- DATA AK1CS( 2) / .0757198995 3199368E0 /
- DATA AK1CS( 3) / -.0014410515 5647540E0 /
- DATA AK1CS( 4) / .0000665011 6955125E0 /
- DATA AK1CS( 5) / -.0000043699 8470952E0 /
- DATA AK1CS( 6) / .0000003540 2774997E0 /
- DATA AK1CS( 7) / -.0000000331 1163779E0 /
- DATA AK1CS( 8) / .0000000034 4597758E0 /
- DATA AK1CS( 9) / -.0000000003 8989323E0 /
- DATA AK1CS(10) / .0000000000 4720819E0 /
- DATA AK1CS(11) / -.0000000000 0604783E0 /
- DATA AK1CS(12) / .0000000000 0081284E0 /
- DATA AK1CS(13) / -.0000000000 0011386E0 /
- DATA AK1CS(14) / .0000000000 0001654E0 /
- DATA AK1CS(15) / -.0000000000 0000248E0 /
- DATA AK1CS(16) / .0000000000 0000038E0 /
- DATA AK1CS(17) / -.0000000000 0000006E0 /
- DATA AK12CS( 1) / .0637930834 3739001E0 /
- DATA AK12CS( 2) / .0283288781 3049721E0 /
- DATA AK12CS( 3) / -.0002475370 6739052E0 /
- DATA AK12CS( 4) / .0000057719 7245160E0 /
- DATA AK12CS( 5) / -.0000002068 9392195E0 /
- DATA AK12CS( 6) / .0000000097 3998344E0 /
- DATA AK12CS( 7) / -.0000000005 5853361E0 /
- DATA AK12CS( 8) / .0000000000 3732996E0 /
- DATA AK12CS( 9) / -.0000000000 0282505E0 /
- DATA AK12CS(10) / .0000000000 0023720E0 /
- DATA AK12CS(11) / -.0000000000 0002176E0 /
- DATA AK12CS(12) / .0000000000 0000215E0 /
- DATA AK12CS(13) / -.0000000000 0000022E0 /
- DATA AK12CS(14) / .0000000000 0000002E0 /
- DATA FIRST /.TRUE./
- C***FIRST EXECUTABLE STATEMENT BESK1E
- IF (FIRST) THEN
- NTK1 = INITS (BK1CS, 11, 0.1*R1MACH(3))
- NTAK1 = INITS (AK1CS, 17, 0.1*R1MACH(3))
- NTAK12 = INITS (AK12CS, 14, 0.1*R1MACH(3))
- C
- XMIN = EXP (MAX(LOG(R1MACH(1)), -LOG(R1MACH(2))) + .01)
- XSML = SQRT (4.0*R1MACH(3))
- ENDIF
- FIRST = .FALSE.
- C
- IF (X .LE. 0.) CALL XERMSG ('SLATEC', 'BESK1E',
- + 'X IS ZERO OR NEGATIVE', 2, 2)
- IF (X.GT.2.0) GO TO 20
- C
- IF (X .LT. XMIN) CALL XERMSG ('SLATEC', 'BESK1E',
- + 'X SO SMALL K1 OVERFLOWS', 3, 2)
- Y = 0.
- IF (X.GT.XSML) Y = X*X
- BESK1E = EXP(X) * (LOG(0.5*X)*BESI1(X) +
- 1 (0.75 + CSEVL (.5*Y-1., BK1CS, NTK1))/X )
- RETURN
- C
- 20 IF (X.LE.8.) BESK1E = (1.25 + CSEVL ((16./X-5.)/3., AK1CS, NTAK1))
- 1 / SQRT(X)
- IF (X.GT.8.) BESK1E = (1.25 + CSEVL (16./X-1., AK12CS, NTAK12))
- 1 / SQRT(X)
- C
- RETURN
- END
- *DECK BESKES
- SUBROUTINE BESKES (XNU, X, NIN, BKE)
- C***BEGIN PROLOGUE BESKES
- C***PURPOSE Compute a sequence of exponentially scaled modified Bessel
- C functions of the third kind of fractional order.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C10B3
- C***TYPE SINGLE PRECISION (BESKES-S, DBSKES-D)
- C***KEYWORDS EXPONENTIALLY SCALED, FNLIB, FRACTIONAL ORDER,
- C MODIFIED BESSEL FUNCTION, SEQUENCE OF BESSEL FUNCTIONS,
- C SPECIAL FUNCTIONS, THIRD KIND
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C BESKES computes a sequence of exponentially scaled
- C (i.e., multipled by EXP(X)) modified Bessel
- C functions of the third kind of order XNU + I at X, where X .GT. 0,
- C XNU lies in (-1,1), and I = 0, 1, ... , NIN - 1, if NIN is positive
- C and I = 0, -1, ... , NIN + 1, if NIN is negative. On return, the
- C vector BKE(.) contains the results at X for order starting at XNU.
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED R1MACH, R9KNUS, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770601 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890911 Removed unnecessary intrinsics. (WRB)
- C 890911 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***END PROLOGUE BESKES
- DIMENSION BKE(*)
- SAVE ALNBIG
- DATA ALNBIG / 0. /
- C***FIRST EXECUTABLE STATEMENT BESKES
- IF (ALNBIG.EQ.0.) ALNBIG = LOG (R1MACH(2))
- C
- V = ABS(XNU)
- N = ABS(NIN)
- C
- IF (V .GE. 1.) CALL XERMSG ('SLATEC', 'BESKES',
- + 'ABS(XNU) MUST BE LT 1', 2, 2)
- IF (X .LE. 0.) CALL XERMSG ('SLATEC', 'BESKES', 'X IS LE 0', 3,
- + 2)
- IF (N .EQ. 0) CALL XERMSG ('SLATEC', 'BESKES',
- + 'N THE NUMBER IN THE SEQUENCE IS 0', 4, 2)
- C
- CALL R9KNUS (V, X, BKE(1), BKNU1, ISWTCH)
- IF (N.EQ.1) RETURN
- C
- VINCR = SIGN (1.0, REAL(NIN))
- DIRECT = VINCR
- IF (XNU.NE.0.) DIRECT = VINCR*SIGN(1.0,XNU)
- IF (ISWTCH .EQ. 1 .AND. DIRECT .GT. 0.) CALL XERMSG ('SLATEC',
- + 'BESKES', 'X SO SMALL BESSEL K-SUB-XNU+1 OVERFLOWS', 5, 2)
- BKE(2) = BKNU1
- C
- IF (DIRECT.LT.0.) CALL R9KNUS (ABS(XNU+VINCR), X, BKE(2), BKNU1,
- 1 ISWTCH)
- IF (N.EQ.2) RETURN
- C
- VEND = ABS(XNU+NIN) - 1.0
- IF ((VEND-0.5)*LOG(VEND)+0.27-VEND*(LOG(X)-.694) .GT. ALNBIG)
- 1CALL XERMSG ( 'SLATEC', 'BESKES',
- 2'X SO SMALL OR ABS(NU) SO BIG THAT BESSEL K-SUB-NU OVERFLOWS',
- 35, 2)
- C
- V = XNU
- DO 10 I=3,N
- V = V + VINCR
- BKE(I) = 2.0*V*BKE(I-1)/X + BKE(I-2)
- 10 CONTINUE
- C
- RETURN
- END
- *DECK BESKNU
- SUBROUTINE BESKNU (X, FNU, KODE, N, Y, NZ)
- C***BEGIN PROLOGUE BESKNU
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to BESK
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (BESKNU-S, DBSKNU-D)
- C***AUTHOR Amos, D. E., (SNLA)
- C***DESCRIPTION
- C
- C Abstract
- C BESKNU computes N member sequences of K Bessel functions
- C K/SUB(FNU+I-1)/(X), I=1,N for non-negative orders FNU and
- C positive X. Equations of the references are implemented on
- C small orders DNU for K/SUB(DNU)/(X) and K/SUB(DNU+1)/(X).
- C Forward recursion with the three term recursion relation
- C generates higher orders FNU+I-1, I=1,...,N. The parameter
- C KODE permits K/SUB(FNU+I-1)/(X) values or scaled values
- C EXP(X)*K/SUB(FNU+I-1)/(X), I=1,N to be returned.
- C
- C To start the recursion FNU is normalized to the interval
- C -0.5.LE.DNU.LT.0.5. A special form of the power series is
- C implemented on 0.LT.X.LE.X1 while the Miller algorithm for the
- C K Bessel function in terms of the confluent hypergeometric
- C function U(FNU+0.5,2*FNU+1,X) is implemented on X1.LT.X.LE.X2.
- C For X.GT.X2, the asymptotic expansion for large X is used.
- C When FNU is a half odd integer, a special formula for
- C DNU=-0.5 and DNU+1.0=0.5 is used to start the recursion.
- C
- C BESKNU assumes that a significant digit SINH(X) function is
- C available.
- C
- C Description of Arguments
- C
- C Input
- C X - X.GT.0.0E0
- C FNU - Order of initial K function, FNU.GE.0.0E0
- C N - Number of members of the sequence, N.GE.1
- C KODE - A parameter to indicate the scaling option
- C KODE= 1 returns
- C Y(I)= K/SUB(FNU+I-1)/(X)
- C I=1,...,N
- C = 2 returns
- C Y(I)=EXP(X)*K/SUB(FNU+I-1)/(X)
- C I=1,...,N
- C
- C Output
- C Y - A vector whose first N components contain values
- C for the sequence
- C Y(I)= K/SUB(FNU+I-1)/(X), I=1,...,N or
- C Y(I)=EXP(X)*K/SUB(FNU+I-1)/(X), I=1,...,N
- C depending on KODE
- C NZ - Number of components set to zero due to
- C underflow,
- C NZ= 0 , Normal return
- C NZ.NE.0 , First NZ components of Y set to zero
- C due to underflow, Y(I)=0.0E0,I=1,...,NZ
- C
- C Error Conditions
- C Improper input arguments - a fatal error
- C Overflow - a fatal error
- C Underflow with KODE=1 - a non-fatal error (NZ.NE.0)
- C
- C***SEE ALSO BESK
- C***REFERENCES N. M. Temme, On the numerical evaluation of the modified
- C Bessel function of the third kind, Journal of
- C Computational Physics 19, (1975), pp. 324-337.
- C***ROUTINES CALLED GAMMA, I1MACH, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 790201 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- 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 900328 Added TYPE section. (WRB)
- C 900727 Added EXTERNAL statement. (WRB)
- C 910408 Updated the AUTHOR and REFERENCES sections. (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE BESKNU
- C
- INTEGER I, IFLAG, INU, J, K, KK, KODE, KODED, N, NN, NZ
- INTEGER I1MACH
- REAL A, AK, A1, A2, B, BK, CC, CK, COEF, CX, DK, DNU, DNU2, ELIM,
- 1 ETEST, EX, F, FC, FHS, FK, FKS, FLRX, FMU, FNU, G1, G2, P, PI,
- 2 PT, P1, P2, Q, RTHPI, RX, S, SMU, SQK, ST, S1, S2, TM, TOL, T1,
- 3 T2, X, X1, X2, Y
- REAL GAMMA, R1MACH
- DIMENSION A(160), B(160), Y(*), CC(8)
- EXTERNAL GAMMA
- SAVE X1, X2, PI, RTHPI, CC
- DATA X1, X2 / 2.0E0, 17.0E0 /
- DATA PI,RTHPI / 3.14159265358979E+00, 1.25331413731550E+00/
- DATA CC(1), CC(2), CC(3), CC(4), CC(5), CC(6), CC(7), CC(8)
- 1 / 5.77215664901533E-01,-4.20026350340952E-02,
- 2-4.21977345555443E-02, 7.21894324666300E-03,-2.15241674114900E-04,
- 3-2.01348547807000E-05, 1.13302723200000E-06, 6.11609500000000E-09/
- C***FIRST EXECUTABLE STATEMENT BESKNU
- KK = -I1MACH(12)
- ELIM = 2.303E0*(KK*R1MACH(5)-3.0E0)
- AK = R1MACH(3)
- TOL = MAX(AK,1.0E-15)
- IF (X.LE.0.0E0) GO TO 350
- IF (FNU.LT.0.0E0) GO TO 360
- IF (KODE.LT.1 .OR. KODE.GT.2) GO TO 370
- IF (N.LT.1) GO TO 380
- NZ = 0
- IFLAG = 0
- KODED = KODE
- RX = 2.0E0/X
- INU = INT(FNU+0.5E0)
- DNU = FNU - INU
- IF (ABS(DNU).EQ.0.5E0) GO TO 120
- DNU2 = 0.0E0
- IF (ABS(DNU).LT.TOL) GO TO 10
- DNU2 = DNU*DNU
- 10 CONTINUE
- IF (X.GT.X1) GO TO 120
- C
- C SERIES FOR X.LE.X1
- C
- A1 = 1.0E0 - DNU
- A2 = 1.0E0 + DNU
- T1 = 1.0E0/GAMMA(A1)
- T2 = 1.0E0/GAMMA(A2)
- IF (ABS(DNU).GT.0.1E0) GO TO 40
- C SERIES FOR F0 TO RESOLVE INDETERMINACY FOR SMALL ABS(DNU)
- S = CC(1)
- AK = 1.0E0
- DO 20 K=2,8
- AK = AK*DNU2
- TM = CC(K)*AK
- S = S + TM
- IF (ABS(TM).LT.TOL) GO TO 30
- 20 CONTINUE
- 30 G1 = -S
- GO TO 50
- 40 CONTINUE
- G1 = (T1-T2)/(DNU+DNU)
- 50 CONTINUE
- G2 = (T1+T2)*0.5E0
- SMU = 1.0E0
- FC = 1.0E0
- FLRX = LOG(RX)
- FMU = DNU*FLRX
- IF (DNU.EQ.0.0E0) GO TO 60
- FC = DNU*PI
- FC = FC/SIN(FC)
- IF (FMU.NE.0.0E0) SMU = SINH(FMU)/FMU
- 60 CONTINUE
- F = FC*(G1*COSH(FMU)+G2*FLRX*SMU)
- FC = EXP(FMU)
- P = 0.5E0*FC/T2
- Q = 0.5E0/(FC*T1)
- AK = 1.0E0
- CK = 1.0E0
- BK = 1.0E0
- S1 = F
- S2 = P
- IF (INU.GT.0 .OR. N.GT.1) GO TO 90
- IF (X.LT.TOL) GO TO 80
- CX = X*X*0.25E0
- 70 CONTINUE
- F = (AK*F+P+Q)/(BK-DNU2)
- P = P/(AK-DNU)
- Q = Q/(AK+DNU)
- CK = CK*CX/AK
- T1 = CK*F
- S1 = S1 + T1
- BK = BK + AK + AK + 1.0E0
- AK = AK + 1.0E0
- S = ABS(T1)/(1.0E0+ABS(S1))
- IF (S.GT.TOL) GO TO 70
- 80 CONTINUE
- Y(1) = S1
- IF (KODED.EQ.1) RETURN
- Y(1) = S1*EXP(X)
- RETURN
- 90 CONTINUE
- IF (X.LT.TOL) GO TO 110
- CX = X*X*0.25E0
- 100 CONTINUE
- F = (AK*F+P+Q)/(BK-DNU2)
- P = P/(AK-DNU)
- Q = Q/(AK+DNU)
- CK = CK*CX/AK
- T1 = CK*F
- S1 = S1 + T1
- T2 = CK*(P-AK*F)
- S2 = S2 + T2
- BK = BK + AK + AK + 1.0E0
- AK = AK + 1.0E0
- S = ABS(T1)/(1.0E0+ABS(S1)) + ABS(T2)/(1.0E0+ABS(S2))
- IF (S.GT.TOL) GO TO 100
- 110 CONTINUE
- S2 = S2*RX
- IF (KODED.EQ.1) GO TO 170
- F = EXP(X)
- S1 = S1*F
- S2 = S2*F
- GO TO 170
- 120 CONTINUE
- COEF = RTHPI/SQRT(X)
- IF (KODED.EQ.2) GO TO 130
- IF (X.GT.ELIM) GO TO 330
- COEF = COEF*EXP(-X)
- 130 CONTINUE
- IF (ABS(DNU).EQ.0.5E0) GO TO 340
- IF (X.GT.X2) GO TO 280
- C
- C MILLER ALGORITHM FOR X1.LT.X.LE.X2
- C
- ETEST = COS(PI*DNU)/(PI*X*TOL)
- FKS = 1.0E0
- FHS = 0.25E0
- FK = 0.0E0
- CK = X + X + 2.0E0
- P1 = 0.0E0
- P2 = 1.0E0
- K = 0
- 140 CONTINUE
- K = K + 1
- FK = FK + 1.0E0
- AK = (FHS-DNU2)/(FKS+FK)
- BK = CK/(FK+1.0E0)
- PT = P2
- P2 = BK*P2 - AK*P1
- P1 = PT
- A(K) = AK
- B(K) = BK
- CK = CK + 2.0E0
- FKS = FKS + FK + FK + 1.0E0
- FHS = FHS + FK + FK
- IF (ETEST.GT.FK*P1) GO TO 140
- KK = K
- S = 1.0E0
- P1 = 0.0E0
- P2 = 1.0E0
- DO 150 I=1,K
- PT = P2
- P2 = (B(KK)*P2-P1)/A(KK)
- P1 = PT
- S = S + P2
- KK = KK - 1
- 150 CONTINUE
- S1 = COEF*(P2/S)
- IF (INU.GT.0 .OR. N.GT.1) GO TO 160
- GO TO 200
- 160 CONTINUE
- S2 = S1*(X+DNU+0.5E0-P1/P2)/X
- C
- C FORWARD RECURSION ON THE THREE TERM RECURSION RELATION
- C
- 170 CONTINUE
- CK = (DNU+DNU+2.0E0)/X
- IF (N.EQ.1) INU = INU - 1
- IF (INU.GT.0) GO TO 180
- IF (N.GT.1) GO TO 200
- S1 = S2
- GO TO 200
- 180 CONTINUE
- DO 190 I=1,INU
- ST = S2
- S2 = CK*S2 + S1
- S1 = ST
- CK = CK + RX
- 190 CONTINUE
- IF (N.EQ.1) S1 = S2
- 200 CONTINUE
- IF (IFLAG.EQ.1) GO TO 220
- Y(1) = S1
- IF (N.EQ.1) RETURN
- Y(2) = S2
- IF (N.EQ.2) RETURN
- DO 210 I=3,N
- Y(I) = CK*Y(I-1) + Y(I-2)
- CK = CK + RX
- 210 CONTINUE
- RETURN
- C IFLAG=1 CASES
- 220 CONTINUE
- S = -X + LOG(S1)
- Y(1) = 0.0E0
- NZ = 1
- IF (S.LT.-ELIM) GO TO 230
- Y(1) = EXP(S)
- NZ = 0
- 230 CONTINUE
- IF (N.EQ.1) RETURN
- S = -X + LOG(S2)
- Y(2) = 0.0E0
- NZ = NZ + 1
- IF (S.LT.-ELIM) GO TO 240
- NZ = NZ - 1
- Y(2) = EXP(S)
- 240 CONTINUE
- IF (N.EQ.2) RETURN
- KK = 2
- IF (NZ.LT.2) GO TO 260
- DO 250 I=3,N
- KK = I
- ST = S2
- S2 = CK*S2 + S1
- S1 = ST
- CK = CK + RX
- S = -X + LOG(S2)
- NZ = NZ + 1
- Y(I) = 0.0E0
- IF (S.LT.-ELIM) GO TO 250
- Y(I) = EXP(S)
- NZ = NZ - 1
- GO TO 260
- 250 CONTINUE
- RETURN
- 260 CONTINUE
- IF (KK.EQ.N) RETURN
- S2 = S2*CK + S1
- CK = CK + RX
- KK = KK + 1
- Y(KK) = EXP(-X+LOG(S2))
- IF (KK.EQ.N) RETURN
- KK = KK + 1
- DO 270 I=KK,N
- Y(I) = CK*Y(I-1) + Y(I-2)
- CK = CK + RX
- 270 CONTINUE
- RETURN
- C
- C ASYMPTOTIC EXPANSION FOR LARGE X, X.GT.X2
- C
- C IFLAG=0 MEANS NO UNDERFLOW OCCURRED
- C IFLAG=1 MEANS AN UNDERFLOW OCCURRED- COMPUTATION PROCEEDS WITH
- C KODED=2 AND A TEST FOR ON SCALE VALUES IS MADE DURING FORWARD
- C RECURSION
- 280 CONTINUE
- NN = 2
- IF (INU.EQ.0 .AND. N.EQ.1) NN = 1
- DNU2 = DNU + DNU
- FMU = 0.0E0
- IF (ABS(DNU2).LT.TOL) GO TO 290
- FMU = DNU2*DNU2
- 290 CONTINUE
- EX = X*8.0E0
- S2 = 0.0E0
- DO 320 K=1,NN
- S1 = S2
- S = 1.0E0
- AK = 0.0E0
- CK = 1.0E0
- SQK = 1.0E0
- DK = EX
- DO 300 J=1,30
- CK = CK*(FMU-SQK)/DK
- S = S + CK
- DK = DK + EX
- AK = AK + 8.0E0
- SQK = SQK + AK
- IF (ABS(CK).LT.TOL) GO TO 310
- 300 CONTINUE
- 310 S2 = S*COEF
- FMU = FMU + 8.0E0*DNU + 4.0E0
- 320 CONTINUE
- IF (NN.GT.1) GO TO 170
- S1 = S2
- GO TO 200
- 330 CONTINUE
- KODED = 2
- IFLAG = 1
- GO TO 120
- C
- C FNU=HALF ODD INTEGER CASE
- C
- 340 CONTINUE
- S1 = COEF
- S2 = COEF
- GO TO 170
- C
- C
- 350 CALL XERMSG ('SLATEC', 'BESKNU', 'X NOT GREATER THAN ZERO', 2, 1)
- RETURN
- 360 CALL XERMSG ('SLATEC', 'BESKNU', 'FNU NOT ZERO OR POSITIVE', 2,
- + 1)
- RETURN
- 370 CALL XERMSG ('SLATEC', 'BESKNU', 'KODE NOT 1 OR 2', 2, 1)
- RETURN
- 380 CALL XERMSG ('SLATEC', 'BESKNU', 'N NOT GREATER THAN 0', 2, 1)
- RETURN
- END
- *DECK BESKS
- SUBROUTINE BESKS (XNU, X, NIN, BK)
- C***BEGIN PROLOGUE BESKS
- C***PURPOSE Compute a sequence of modified Bessel functions of the
- C third kind of fractional order.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C10B3
- C***TYPE SINGLE PRECISION (BESKS-S, DBESKS-D)
- C***KEYWORDS FNLIB, FRACTIONAL ORDER, MODIFIED BESSEL FUNCTION,
- C SEQUENCE OF BESSEL FUNCTIONS, SPECIAL FUNCTIONS,
- C THIRD KIND
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C BESKS computes a sequence of modified Bessel functions of the third
- C kind of order XNU + I at X, where X .GT. 0, XNU lies in (-1,1),
- C and I = 0, 1, ... , NIN - 1, if NIN is positive and I = 0, 1, ... ,
- C NIN + 1, if NIN is negative. On return, the vector BK(.) Contains
- C the results at X for order starting at XNU.
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED BESKES, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770601 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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***END PROLOGUE BESKS
- DIMENSION BK(*)
- SAVE XMAX
- DATA XMAX / 0.0 /
- C***FIRST EXECUTABLE STATEMENT BESKS
- IF (XMAX.EQ.0.0) XMAX = -LOG (R1MACH(1))
- C
- IF (X .GT. XMAX) CALL XERMSG ('SLATEC', 'BESKS',
- + 'X SO BIG BESSEL K UNDERFLOWS', 1, 2)
- C
- CALL BESKES (XNU, X, NIN, BK)
- C
- EXPXI = EXP (-X)
- N = ABS (NIN)
- DO 20 I=1,N
- BK(I) = EXPXI * BK(I)
- 20 CONTINUE
- C
- RETURN
- END
- *DECK BESY
- SUBROUTINE BESY (X, FNU, N, Y)
- C***BEGIN PROLOGUE BESY
- C***PURPOSE Implement forward recursion on the three term recursion
- C relation for a sequence of non-negative order Bessel
- C functions Y/SUB(FNU+I-1)/(X), I=1,...,N for real, positive
- C X and non-negative orders FNU.
- C***LIBRARY SLATEC
- C***CATEGORY C10A3
- C***TYPE SINGLE PRECISION (BESY-S, DBESY-D)
- C***KEYWORDS SPECIAL FUNCTIONS, Y BESSEL FUNCTION
- C***AUTHOR Amos, D. E., (SNLA)
- C***DESCRIPTION
- C
- C Abstract
- C BESY implements forward recursion on the three term
- C recursion relation for a sequence of non-negative order Bessel
- C functions Y/sub(FNU+I-1)/(X), I=1,N for real X .GT. 0.0E0 and
- C non-negative orders FNU. If FNU .LT. NULIM, orders FNU and
- C FNU+1 are obtained from BESYNU which computes by a power
- C series for X .LE. 2, the K Bessel function of an imaginary
- C argument for 2 .LT. X .LE. 20 and the asymptotic expansion for
- C X .GT. 20.
- C
- C If FNU .GE. NULIM, the uniform asymptotic expansion is coded
- C in ASYJY for orders FNU and FNU+1 to start the recursion.
- C NULIM is 70 or 100 depending on whether N=1 or N .GE. 2. An
- C overflow test is made on the leading term of the asymptotic
- C expansion before any extensive computation is done.
- C
- C Description of Arguments
- C
- C Input
- C X - X .GT. 0.0E0
- C FNU - order of the initial Y function, FNU .GE. 0.0E0
- C N - number of members in the sequence, N .GE. 1
- C
- C Output
- C Y - a vector whose first N components contain values
- C for the sequence Y(I)=Y/sub(FNU+I-1)/(X), I=1,N.
- C
- C Error Conditions
- C Improper input arguments - a fatal error
- C Overflow - a fatal error
- C
- C***REFERENCES F. W. J. Olver, Tables of Bessel Functions of Moderate
- C or Large Orders, NPL Mathematical Tables 6, Her
- C Majesty's Stationery Office, London, 1962.
- C N. M. Temme, On the numerical evaluation of the modified
- C Bessel function of the third kind, Journal of
- C Computational Physics 19, (1975), pp. 324-337.
- C N. M. Temme, On the numerical evaluation of the ordinary
- C Bessel function of the second kind, Journal of
- C Computational Physics 21, (1976), pp. 343-350.
- C***ROUTINES CALLED ASYJY, BESY0, BESY1, BESYNU, I1MACH, R1MACH,
- C XERMSG, YAIRY
- C***REVISION HISTORY (YYMMDD)
- C 800501 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE BESY
- C
- EXTERNAL YAIRY
- INTEGER I, IFLW, J, N, NB, ND, NN, NUD, NULIM
- INTEGER I1MACH
- REAL AZN,CN,DNU,ELIM,FLGJY,FN,FNU,RAN,S,S1,S2,TM,TRX,
- 1 W,WK,W2N,X,XLIM,XXN,Y
- REAL BESY0, BESY1, R1MACH
- DIMENSION W(2), NULIM(2), Y(*), WK(7)
- SAVE NULIM
- DATA NULIM(1),NULIM(2) / 70 , 100 /
- C***FIRST EXECUTABLE STATEMENT BESY
- NN = -I1MACH(12)
- ELIM = 2.303E0*(NN*R1MACH(5)-3.0E0)
- XLIM = R1MACH(1)*1.0E+3
- IF (FNU.LT.0.0E0) GO TO 140
- IF (X.LE.0.0E0) GO TO 150
- IF (X.LT.XLIM) GO TO 170
- IF (N.LT.1) GO TO 160
- C
- C ND IS A DUMMY VARIABLE FOR N
- C
- ND = N
- NUD = INT(FNU)
- DNU = FNU - NUD
- NN = MIN(2,ND)
- FN = FNU + N - 1
- IF (FN.LT.2.0E0) GO TO 100
- C
- C OVERFLOW TEST (LEADING EXPONENTIAL OF ASYMPTOTIC EXPANSION)
- C FOR THE LAST ORDER, FNU+N-1.GE.NULIM
- C
- XXN = X/FN
- W2N = 1.0E0-XXN*XXN
- IF(W2N.LE.0.0E0) GO TO 10
- RAN = SQRT(W2N)
- AZN = LOG((1.0E0+RAN)/XXN) - RAN
- CN = FN*AZN
- IF(CN.GT.ELIM) GO TO 170
- 10 CONTINUE
- IF (NUD.LT.NULIM(NN)) GO TO 20
- C
- C ASYMPTOTIC EXPANSION FOR ORDERS FNU AND FNU+1.GE.NULIM
- C
- FLGJY = -1.0E0
- CALL ASYJY(YAIRY,X,FNU,FLGJY,NN,Y,WK,IFLW)
- IF(IFLW.NE.0) GO TO 170
- IF (NN.EQ.1) RETURN
- TRX = 2.0E0/X
- TM = (FNU+FNU+2.0E0)/X
- GO TO 80
- C
- 20 CONTINUE
- IF (DNU.NE.0.0E0) GO TO 30
- S1 = BESY0(X)
- IF (NUD.EQ.0 .AND. ND.EQ.1) GO TO 70
- S2 = BESY1(X)
- GO TO 40
- 30 CONTINUE
- NB = 2
- IF (NUD.EQ.0 .AND. ND.EQ.1) NB = 1
- CALL BESYNU(X, DNU, NB, W)
- S1 = W(1)
- IF (NB.EQ.1) GO TO 70
- S2 = W(2)
- 40 CONTINUE
- TRX = 2.0E0/X
- TM = (DNU+DNU+2.0E0)/X
- C FORWARD RECUR FROM DNU TO FNU+1 TO GET Y(1) AND Y(2)
- IF (ND.EQ.1) NUD = NUD - 1
- IF (NUD.GT.0) GO TO 50
- IF (ND.GT.1) GO TO 70
- S1 = S2
- GO TO 70
- 50 CONTINUE
- DO 60 I=1,NUD
- S = S2
- S2 = TM*S2 - S1
- S1 = S
- TM = TM + TRX
- 60 CONTINUE
- IF (ND.EQ.1) S1 = S2
- 70 CONTINUE
- Y(1) = S1
- IF (ND.EQ.1) RETURN
- Y(2) = S2
- 80 CONTINUE
- IF (ND.EQ.2) RETURN
- C FORWARD RECUR FROM FNU+2 TO FNU+N-1
- DO 90 I=3,ND
- Y(I) = TM*Y(I-1) - Y(I-2)
- TM = TM + TRX
- 90 CONTINUE
- RETURN
- C
- 100 CONTINUE
- C OVERFLOW TEST
- IF (FN.LE.1.0E0) GO TO 110
- IF (-FN*(LOG(X)-0.693E0).GT.ELIM) GO TO 170
- 110 CONTINUE
- IF (DNU.EQ.0.0E0) GO TO 120
- CALL BESYNU(X, FNU, ND, Y)
- RETURN
- 120 CONTINUE
- J = NUD
- IF (J.EQ.1) GO TO 130
- J = J + 1
- Y(J) = BESY0(X)
- IF (ND.EQ.1) RETURN
- J = J + 1
- 130 CONTINUE
- Y(J) = BESY1(X)
- IF (ND.EQ.1) RETURN
- TRX = 2.0E0/X
- TM = TRX
- GO TO 80
- C
- C
- C
- 140 CONTINUE
- CALL XERMSG ('SLATEC', 'BESY', 'ORDER, FNU, LESS THAN ZERO', 2,
- + 1)
- RETURN
- 150 CONTINUE
- CALL XERMSG ('SLATEC', 'BESY', 'X LESS THAN OR EQUAL TO ZERO', 2,
- + 1)
- RETURN
- 160 CONTINUE
- CALL XERMSG ('SLATEC', 'BESY', 'N LESS THAN ONE', 2, 1)
- RETURN
- 170 CONTINUE
- CALL XERMSG ('SLATEC', 'BESY',
- + 'OVERFLOW, FNU OR N TOO LARGE OR X TOO SMALL', 6, 1)
- RETURN
- END
- *DECK BESY0
- FUNCTION BESY0 (X)
- C***BEGIN PROLOGUE BESY0
- C***PURPOSE Compute the Bessel function of the second kind of order
- C zero.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C10A1
- C***TYPE SINGLE PRECISION (BESY0-S, DBESY0-D)
- C***KEYWORDS BESSEL FUNCTION, FNLIB, ORDER ZERO, SECOND KIND,
- C SPECIAL FUNCTIONS
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C BESY0(X) calculates the Bessel function of the second kind
- C of order zero for real argument X.
- C
- C Series for BY0 on the interval 0. to 1.60000D+01
- C with weighted error 1.20E-17
- C log weighted error 16.92
- C significant figures required 16.15
- C decimal places required 17.48
- C
- C Series for BM0 on the interval 0. to 6.25000D-02
- C with weighted error 4.98E-17
- C log weighted error 16.30
- C significant figures required 14.97
- C decimal places required 16.96
- C
- C Series for BTH0 on the interval 0. to 6.25000D-02
- C with weighted error 3.67E-17
- C log weighted error 16.44
- C significant figures required 15.53
- C decimal places required 17.13
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED BESJ0, CSEVL, INITS, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770401 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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***END PROLOGUE BESY0
- DIMENSION BY0CS(13), BM0CS(21), BTH0CS(24)
- LOGICAL FIRST
- SAVE BY0CS, BM0CS, BTH0CS, TWODPI, PI4,
- 1 NTY0, NTM0, NTTH0, XSML, XMAX, FIRST
- DATA BY0CS( 1) / -.0112778393 92865573E0 /
- DATA BY0CS( 2) / -.1283452375 6042035E0 /
- DATA BY0CS( 3) / -.1043788479 9794249E0 /
- DATA BY0CS( 4) / .0236627491 83969695E0 /
- DATA BY0CS( 5) / -.0020903916 47700486E0 /
- DATA BY0CS( 6) / .0001039754 53939057E0 /
- DATA BY0CS( 7) / -.0000033697 47162423E0 /
- DATA BY0CS( 8) / .0000000772 93842676E0 /
- DATA BY0CS( 9) / -.0000000013 24976772E0 /
- DATA BY0CS(10) / .0000000000 17648232E0 /
- DATA BY0CS(11) / -.0000000000 00188105E0 /
- DATA BY0CS(12) / .0000000000 00001641E0 /
- DATA BY0CS(13) / -.0000000000 00000011E0 /
- DATA BM0CS( 1) / .0928496163 7381644E0 /
- DATA BM0CS( 2) / -.0014298770 7403484E0 /
- DATA BM0CS( 3) / .0000283057 9271257E0 /
- DATA BM0CS( 4) / -.0000014330 0611424E0 /
- DATA BM0CS( 5) / .0000001202 8628046E0 /
- DATA BM0CS( 6) / -.0000000139 7113013E0 /
- DATA BM0CS( 7) / .0000000020 4076188E0 /
- DATA BM0CS( 8) / -.0000000003 5399669E0 /
- DATA BM0CS( 9) / .0000000000 7024759E0 /
- DATA BM0CS(10) / -.0000000000 1554107E0 /
- DATA BM0CS(11) / .0000000000 0376226E0 /
- DATA BM0CS(12) / -.0000000000 0098282E0 /
- DATA BM0CS(13) / .0000000000 0027408E0 /
- DATA BM0CS(14) / -.0000000000 0008091E0 /
- DATA BM0CS(15) / .0000000000 0002511E0 /
- DATA BM0CS(16) / -.0000000000 0000814E0 /
- DATA BM0CS(17) / .0000000000 0000275E0 /
- DATA BM0CS(18) / -.0000000000 0000096E0 /
- DATA BM0CS(19) / .0000000000 0000034E0 /
- DATA BM0CS(20) / -.0000000000 0000012E0 /
- DATA BM0CS(21) / .0000000000 0000004E0 /
- DATA BTH0CS( 1) / -.2463916377 4300119E0 /
- DATA BTH0CS( 2) / .0017370983 07508963E0 /
- DATA BTH0CS( 3) / -.0000621836 33402968E0 /
- DATA BTH0CS( 4) / .0000043680 50165742E0 /
- DATA BTH0CS( 5) / -.0000004560 93019869E0 /
- DATA BTH0CS( 6) / .0000000621 97400101E0 /
- DATA BTH0CS( 7) / -.0000000103 00442889E0 /
- DATA BTH0CS( 8) / .0000000019 79526776E0 /
- DATA BTH0CS( 9) / -.0000000004 28198396E0 /
- DATA BTH0CS(10) / .0000000001 02035840E0 /
- DATA BTH0CS(11) / -.0000000000 26363898E0 /
- DATA BTH0CS(12) / .0000000000 07297935E0 /
- DATA BTH0CS(13) / -.0000000000 02144188E0 /
- DATA BTH0CS(14) / .0000000000 00663693E0 /
- DATA BTH0CS(15) / -.0000000000 00215126E0 /
- DATA BTH0CS(16) / .0000000000 00072659E0 /
- DATA BTH0CS(17) / -.0000000000 00025465E0 /
- DATA BTH0CS(18) / .0000000000 00009229E0 /
- DATA BTH0CS(19) / -.0000000000 00003448E0 /
- DATA BTH0CS(20) / .0000000000 00001325E0 /
- DATA BTH0CS(21) / -.0000000000 00000522E0 /
- DATA BTH0CS(22) / .0000000000 00000210E0 /
- DATA BTH0CS(23) / -.0000000000 00000087E0 /
- DATA BTH0CS(24) / .0000000000 00000036E0 /
- DATA TWODPI / 0.6366197723 6758134E0 /
- DATA PI4 / 0.7853981633 9744831E0 /
- DATA FIRST /.TRUE./
- C***FIRST EXECUTABLE STATEMENT BESY0
- IF (FIRST) THEN
- NTY0 = INITS (BY0CS, 13, 0.1*R1MACH(3))
- NTM0 = INITS (BM0CS, 21, 0.1*R1MACH(3))
- NTTH0 = INITS (BTH0CS, 24, 0.1*R1MACH(3))
- C
- XSML = SQRT (4.0*R1MACH(3))
- XMAX = 1.0/R1MACH(4)
- ENDIF
- FIRST = .FALSE.
- C
- IF (X .LE. 0.) CALL XERMSG ('SLATEC', 'BESY0',
- + 'X IS ZERO OR NEGATIVE', 1, 2)
- IF (X.GT.4.0) GO TO 20
- C
- Y = 0.
- IF (X.GT.XSML) Y = X*X
- BESY0 = TWODPI*LOG(0.5*X)*BESJ0(X) + .375 + CSEVL (.125*Y-1.,
- 1 BY0CS, NTY0)
- RETURN
- C
- 20 IF (X .GT. XMAX) CALL XERMSG ('SLATEC', 'BESY0',
- + 'NO PRECISION BECAUSE X IS BIG', 2, 2)
- C
- Z = 32.0/X**2 - 1.0
- AMPL = (0.75 + CSEVL (Z, BM0CS, NTM0)) / SQRT(X)
- THETA = X - PI4 + CSEVL (Z, BTH0CS, NTTH0) / X
- BESY0 = AMPL * SIN (THETA)
- C
- RETURN
- END
- *DECK BESY1
- FUNCTION BESY1 (X)
- C***BEGIN PROLOGUE BESY1
- C***PURPOSE Compute the Bessel function of the second kind of order
- C one.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C10A1
- C***TYPE SINGLE PRECISION (BESY1-S, DBESY1-D)
- C***KEYWORDS BESSEL FUNCTION, FNLIB, ORDER ONE, SECOND KIND,
- C SPECIAL FUNCTIONS
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C BESY1(X) calculates the Bessel function of the second kind of
- C order one for real argument X.
- C
- C Series for BY1 on the interval 0. to 1.60000D+01
- C with weighted error 1.87E-18
- C log weighted error 17.73
- C significant figures required 17.83
- C decimal places required 18.30
- C
- C Series for BM1 on the interval 0. to 6.25000D-02
- C with weighted error 5.61E-17
- C log weighted error 16.25
- C significant figures required 14.97
- C decimal places required 16.91
- C
- C Series for BTH1 on the interval 0. to 6.25000D-02
- C with weighted error 4.10E-17
- C log weighted error 16.39
- C significant figures required 15.96
- C decimal places required 17.08
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED BESJ1, CSEVL, INITS, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770401 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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***END PROLOGUE BESY1
- DIMENSION BY1CS(14), BM1CS(21), BTH1CS(24)
- LOGICAL FIRST
- SAVE BY1CS, BM1CS, BTH1CS, TWODPI, PI4,
- 1 NTY1, NTM1, NTTH1, XMIN, XSML, XMAX, FIRST
- DATA BY1CS( 1) / .0320804710 0611908629E0 /
- DATA BY1CS( 2) / 1.2627078974 33500450E0 /
- DATA BY1CS( 3) / .0064999618 9992317500E0 /
- DATA BY1CS( 4) / -.0893616452 8860504117E0 /
- DATA BY1CS( 5) / .0132508812 2175709545E0 /
- DATA BY1CS( 6) / -.0008979059 1196483523E0 /
- DATA BY1CS( 7) / .0000364736 1487958306E0 /
- DATA BY1CS( 8) / -.0000010013 7438166600E0 /
- DATA BY1CS( 9) / .0000000199 4539657390E0 /
- DATA BY1CS(10) / -.0000000003 0230656018E0 /
- DATA BY1CS(11) / .0000000000 0360987815E0 /
- DATA BY1CS(12) / -.0000000000 0003487488E0 /
- DATA BY1CS(13) / .0000000000 0000027838E0 /
- DATA BY1CS(14) / -.0000000000 0000000186E0 /
- DATA BM1CS( 1) / .1047362510 931285E0 /
- DATA BM1CS( 2) / .0044244389 3702345E0 /
- DATA BM1CS( 3) / -.0000566163 9504035E0 /
- DATA BM1CS( 4) / .0000023134 9417339E0 /
- DATA BM1CS( 5) / -.0000001737 7182007E0 /
- DATA BM1CS( 6) / .0000000189 3209930E0 /
- DATA BM1CS( 7) / -.0000000026 5416023E0 /
- DATA BM1CS( 8) / .0000000004 4740209E0 /
- DATA BM1CS( 9) / -.0000000000 8691795E0 /
- DATA BM1CS(10) / .0000000000 1891492E0 /
- DATA BM1CS(11) / -.0000000000 0451884E0 /
- DATA BM1CS(12) / .0000000000 0116765E0 /
- DATA BM1CS(13) / -.0000000000 0032265E0 /
- DATA BM1CS(14) / .0000000000 0009450E0 /
- DATA BM1CS(15) / -.0000000000 0002913E0 /
- DATA BM1CS(16) / .0000000000 0000939E0 /
- DATA BM1CS(17) / -.0000000000 0000315E0 /
- DATA BM1CS(18) / .0000000000 0000109E0 /
- DATA BM1CS(19) / -.0000000000 0000039E0 /
- DATA BM1CS(20) / .0000000000 0000014E0 /
- DATA BM1CS(21) / -.0000000000 0000005E0 /
- DATA BTH1CS( 1) / .7406014102 6313850E0 /
- DATA BTH1CS( 2) / -.0045717556 59637690E0 /
- DATA BTH1CS( 3) / .0001198185 10964326E0 /
- DATA BTH1CS( 4) / -.0000069645 61891648E0 /
- DATA BTH1CS( 5) / .0000006554 95621447E0 /
- DATA BTH1CS( 6) / -.0000000840 66228945E0 /
- DATA BTH1CS( 7) / .0000000133 76886564E0 /
- DATA BTH1CS( 8) / -.0000000024 99565654E0 /
- DATA BTH1CS( 9) / .0000000005 29495100E0 /
- DATA BTH1CS(10) / -.0000000001 24135944E0 /
- DATA BTH1CS(11) / .0000000000 31656485E0 /
- DATA BTH1CS(12) / -.0000000000 08668640E0 /
- DATA BTH1CS(13) / .0000000000 02523758E0 /
- DATA BTH1CS(14) / -.0000000000 00775085E0 /
- DATA BTH1CS(15) / .0000000000 00249527E0 /
- DATA BTH1CS(16) / -.0000000000 00083773E0 /
- DATA BTH1CS(17) / .0000000000 00029205E0 /
- DATA BTH1CS(18) / -.0000000000 00010534E0 /
- DATA BTH1CS(19) / .0000000000 00003919E0 /
- DATA BTH1CS(20) / -.0000000000 00001500E0 /
- DATA BTH1CS(21) / .0000000000 00000589E0 /
- DATA BTH1CS(22) / -.0000000000 00000237E0 /
- DATA BTH1CS(23) / .0000000000 00000097E0 /
- DATA BTH1CS(24) / -.0000000000 00000040E0 /
- DATA TWODPI / 0.6366197723 6758134E0 /
- DATA PI4 / 0.7853981633 9744831E0 /
- DATA FIRST /.TRUE./
- C***FIRST EXECUTABLE STATEMENT BESY1
- IF (FIRST) THEN
- NTY1 = INITS (BY1CS, 14, 0.1*R1MACH(3))
- NTM1 = INITS (BM1CS, 21, 0.1*R1MACH(3))
- NTTH1 = INITS (BTH1CS, 24, 0.1*R1MACH(3))
- C
- XMIN = 1.571*EXP ( MAX(LOG(R1MACH(1)), -LOG(R1MACH(2)))+.01)
- XSML = SQRT (4.0*R1MACH(3))
- XMAX = 1.0/R1MACH(4)
- ENDIF
- FIRST = .FALSE.
- C
- IF (X .LE. 0.) CALL XERMSG ('SLATEC', 'BESY1',
- + 'X IS ZERO OR NEGATIVE', 1, 2)
- IF (X.GT.4.0) GO TO 20
- C
- IF (X .LT. XMIN) CALL XERMSG ('SLATEC', 'BESY1',
- + 'X SO SMALL Y1 OVERFLOWS', 3, 2)
- Y = 0.
- IF (X.GT.XSML) Y = X*X
- BESY1 = TWODPI*LOG(0.5*X)*BESJ1(X) +
- 1 (0.5 + CSEVL (.125*Y-1., BY1CS, NTY1))/X
- RETURN
- C
- 20 IF (X .GT. XMAX) CALL XERMSG ('SLATEC', 'BESY1',
- + 'NO PRECISION BECAUSE X IS BIG', 2, 2)
- C
- Z = 32.0/X**2 - 1.0
- AMPL = (0.75 + CSEVL (Z, BM1CS, NTM1)) / SQRT(X)
- THETA = X - 3.0*PI4 + CSEVL (Z, BTH1CS, NTTH1) / X
- BESY1 = AMPL * SIN (THETA)
- C
- RETURN
- END
- *DECK BESYNU
- SUBROUTINE BESYNU (X, FNU, N, Y)
- C***BEGIN PROLOGUE BESYNU
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to BESY
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (BESYNU-S, DBSYNU-D)
- C***AUTHOR Amos, D. E., (SNLA)
- C***DESCRIPTION
- C
- C Abstract
- C BESYNU computes N member sequences of Y Bessel functions
- C Y/SUB(FNU+I-1)/(X), I=1,N for non-negative orders FNU and
- C positive X. Equations of the references are implemented on
- C small orders DNU for Y/SUB(DNU)/(X) and Y/SUB(DNU+1)/(X).
- C Forward recursion with the three term recursion relation
- C generates higher orders FNU+I-1, I=1,...,N.
- C
- C To start the recursion FNU is normalized to the interval
- C -0.5.LE.DNU.LT.0.5. A special form of the power series is
- C implemented on 0.LT.X.LE.X1 while the Miller algorithm for the
- C K Bessel function in terms of the confluent hypergeometric
- C function U(FNU+0.5,2*FNU+1,I*X) is implemented on X1.LT.X.LE.X
- C Here I is the complex number SQRT(-1.).
- C For X.GT.X2, the asymptotic expansion for large X is used.
- C When FNU is a half odd integer, a special formula for
- C DNU=-0.5 and DNU+1.0=0.5 is used to start the recursion.
- C
- C BESYNU assumes that a significant digit SINH(X) function is
- C available.
- C
- C Description of Arguments
- C
- C Input
- C X - X.GT.0.0E0
- C FNU - Order of initial Y function, FNU.GE.0.0E0
- C N - Number of members of the sequence, N.GE.1
- C
- C Output
- C Y - A vector whose first N components contain values
- C for the sequence Y(I)=Y/SUB(FNU+I-1), I=1,N.
- C
- C Error Conditions
- C Improper input arguments - a fatal error
- C Overflow - a fatal error
- C
- C***SEE ALSO BESY
- C***REFERENCES N. M. Temme, On the numerical evaluation of the ordinary
- C Bessel function of the second kind, Journal of
- C Computational Physics 21, (1976), pp. 343-350.
- C N. M. Temme, On the numerical evaluation of the modified
- C Bessel function of the third kind, Journal of
- C Computational Physics 19, (1975), pp. 324-337.
- C***ROUTINES CALLED GAMMA, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 800501 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- 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 900328 Added TYPE section. (WRB)
- C 900727 Added EXTERNAL statement. (WRB)
- C 910408 Updated the AUTHOR and REFERENCES sections. (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE BESYNU
- C
- INTEGER I, INU, J, K, KK, N, NN
- REAL A, AK, ARG, A1, A2, BK, CB, CBK, CC, CCK, CK, COEF, CPT,
- 1 CP1, CP2, CS, CS1, CS2, CX, DNU, DNU2, ETEST, ETX, F, FC, FHS,
- 2 FK, FKS, FLRX, FMU, FN, FNU, FX, G, G1, G2, HPI, P, PI, PT, Q,
- 3 RB, RBK, RCK, RELB, RPT, RP1, RP2, RS, RS1, RS2, RTHPI, RX, S,
- 4 SA, SB, SMU, SS, ST, S1, S2, TB, TM, TOL, T1, T2, X, X1, X2, Y
- DIMENSION A(120), RB(120), CB(120), Y(*), CC(8)
- REAL GAMMA, R1MACH
- EXTERNAL GAMMA
- SAVE X1, X2, PI, RTHPI, HPI, CC
- DATA X1, X2 / 3.0E0, 20.0E0 /
- DATA PI,RTHPI / 3.14159265358979E+00, 7.97884560802865E-01/
- DATA HPI / 1.57079632679490E+00/
- DATA CC(1), CC(2), CC(3), CC(4), CC(5), CC(6), CC(7), CC(8)
- 1 / 5.77215664901533E-01,-4.20026350340952E-02,
- 2-4.21977345555443E-02, 7.21894324666300E-03,-2.15241674114900E-04,
- 3-2.01348547807000E-05, 1.13302723200000E-06, 6.11609500000000E-09/
- C***FIRST EXECUTABLE STATEMENT BESYNU
- AK = R1MACH(3)
- TOL = MAX(AK,1.0E-15)
- IF (X.LE.0.0E0) GO TO 270
- IF (FNU.LT.0.0E0) GO TO 280
- IF (N.LT.1) GO TO 290
- RX = 2.0E0/X
- INU = INT(FNU+0.5E0)
- DNU = FNU - INU
- IF (ABS(DNU).EQ.0.5E0) GO TO 260
- DNU2 = 0.0E0
- IF (ABS(DNU).LT.TOL) GO TO 10
- DNU2 = DNU*DNU
- 10 CONTINUE
- IF (X.GT.X1) GO TO 120
- C
- C SERIES FOR X.LE.X1
- C
- A1 = 1.0E0 - DNU
- A2 = 1.0E0 + DNU
- T1 = 1.0E0/GAMMA(A1)
- T2 = 1.0E0/GAMMA(A2)
- IF (ABS(DNU).GT.0.1E0) GO TO 40
- C SERIES FOR F0 TO RESOLVE INDETERMINACY FOR SMALL ABS(DNU)
- S = CC(1)
- AK = 1.0E0
- DO 20 K=2,8
- AK = AK*DNU2
- TM = CC(K)*AK
- S = S + TM
- IF (ABS(TM).LT.TOL) GO TO 30
- 20 CONTINUE
- 30 G1 = -(S+S)
- GO TO 50
- 40 CONTINUE
- G1 = (T1-T2)/DNU
- 50 CONTINUE
- G2 = T1 + T2
- SMU = 1.0E0
- FC = 1.0E0/PI
- FLRX = LOG(RX)
- FMU = DNU*FLRX
- TM = 0.0E0
- IF (DNU.EQ.0.0E0) GO TO 60
- TM = SIN(DNU*HPI)/DNU
- TM = (DNU+DNU)*TM*TM
- FC = DNU/SIN(DNU*PI)
- IF (FMU.NE.0.0E0) SMU = SINH(FMU)/FMU
- 60 CONTINUE
- F = FC*(G1*COSH(FMU)+G2*FLRX*SMU)
- FX = EXP(FMU)
- P = FC*T1*FX
- Q = FC*T2/FX
- G = F + TM*Q
- AK = 1.0E0
- CK = 1.0E0
- BK = 1.0E0
- S1 = G
- S2 = P
- IF (INU.GT.0 .OR. N.GT.1) GO TO 90
- IF (X.LT.TOL) GO TO 80
- CX = X*X*0.25E0
- 70 CONTINUE
- F = (AK*F+P+Q)/(BK-DNU2)
- P = P/(AK-DNU)
- Q = Q/(AK+DNU)
- G = F + TM*Q
- CK = -CK*CX/AK
- T1 = CK*G
- S1 = S1 + T1
- BK = BK + AK + AK + 1.0E0
- AK = AK + 1.0E0
- S = ABS(T1)/(1.0E0+ABS(S1))
- IF (S.GT.TOL) GO TO 70
- 80 CONTINUE
- Y(1) = -S1
- RETURN
- 90 CONTINUE
- IF (X.LT.TOL) GO TO 110
- CX = X*X*0.25E0
- 100 CONTINUE
- F = (AK*F+P+Q)/(BK-DNU2)
- P = P/(AK-DNU)
- Q = Q/(AK+DNU)
- G = F + TM*Q
- CK = -CK*CX/AK
- T1 = CK*G
- S1 = S1 + T1
- T2 = CK*(P-AK*G)
- S2 = S2 + T2
- BK = BK + AK + AK + 1.0E0
- AK = AK + 1.0E0
- S = ABS(T1)/(1.0E0+ABS(S1)) + ABS(T2)/(1.0E0+ABS(S2))
- IF (S.GT.TOL) GO TO 100
- 110 CONTINUE
- S2 = -S2*RX
- S1 = -S1
- GO TO 160
- 120 CONTINUE
- COEF = RTHPI/SQRT(X)
- IF (X.GT.X2) GO TO 210
- C
- C MILLER ALGORITHM FOR X1.LT.X.LE.X2
- C
- ETEST = COS(PI*DNU)/(PI*X*TOL)
- FKS = 1.0E0
- FHS = 0.25E0
- FK = 0.0E0
- RCK = 2.0E0
- CCK = X + X
- RP1 = 0.0E0
- CP1 = 0.0E0
- RP2 = 1.0E0
- CP2 = 0.0E0
- K = 0
- 130 CONTINUE
- K = K + 1
- FK = FK + 1.0E0
- AK = (FHS-DNU2)/(FKS+FK)
- PT = FK + 1.0E0
- RBK = RCK/PT
- CBK = CCK/PT
- RPT = RP2
- CPT = CP2
- RP2 = RBK*RPT - CBK*CPT - AK*RP1
- CP2 = CBK*RPT + RBK*CPT - AK*CP1
- RP1 = RPT
- CP1 = CPT
- RB(K) = RBK
- CB(K) = CBK
- A(K) = AK
- RCK = RCK + 2.0E0
- FKS = FKS + FK + FK + 1.0E0
- FHS = FHS + FK + FK
- PT = MAX(ABS(RP1),ABS(CP1))
- FC = (RP1/PT)**2 + (CP1/PT)**2
- PT = PT*SQRT(FC)*FK
- IF (ETEST.GT.PT) GO TO 130
- KK = K
- RS = 1.0E0
- CS = 0.0E0
- RP1 = 0.0E0
- CP1 = 0.0E0
- RP2 = 1.0E0
- CP2 = 0.0E0
- DO 140 I=1,K
- RPT = RP2
- CPT = CP2
- RP2 = (RB(KK)*RPT-CB(KK)*CPT-RP1)/A(KK)
- CP2 = (CB(KK)*RPT+RB(KK)*CPT-CP1)/A(KK)
- RP1 = RPT
- CP1 = CPT
- RS = RS + RP2
- CS = CS + CP2
- KK = KK - 1
- 140 CONTINUE
- PT = MAX(ABS(RS),ABS(CS))
- FC = (RS/PT)**2 + (CS/PT)**2
- PT = PT*SQRT(FC)
- RS1 = (RP2*(RS/PT)+CP2*(CS/PT))/PT
- CS1 = (CP2*(RS/PT)-RP2*(CS/PT))/PT
- FC = HPI*(DNU-0.5E0) - X
- P = COS(FC)
- Q = SIN(FC)
- S1 = (CS1*Q-RS1*P)*COEF
- IF (INU.GT.0 .OR. N.GT.1) GO TO 150
- Y(1) = S1
- RETURN
- 150 CONTINUE
- PT = MAX(ABS(RP2),ABS(CP2))
- FC = (RP2/PT)**2 + (CP2/PT)**2
- PT = PT*SQRT(FC)
- RPT = DNU + 0.5E0 - (RP1*(RP2/PT)+CP1*(CP2/PT))/PT
- CPT = X - (CP1*(RP2/PT)-RP1*(CP2/PT))/PT
- CS2 = CS1*CPT - RS1*RPT
- RS2 = RPT*CS1 + RS1*CPT
- S2 = (RS2*Q+CS2*P)*COEF/X
- C
- C FORWARD RECURSION ON THE THREE TERM RECURSION RELATION
- C
- 160 CONTINUE
- CK = (DNU+DNU+2.0E0)/X
- IF (N.EQ.1) INU = INU - 1
- IF (INU.GT.0) GO TO 170
- IF (N.GT.1) GO TO 190
- S1 = S2
- GO TO 190
- 170 CONTINUE
- DO 180 I=1,INU
- ST = S2
- S2 = CK*S2 - S1
- S1 = ST
- CK = CK + RX
- 180 CONTINUE
- IF (N.EQ.1) S1 = S2
- 190 CONTINUE
- Y(1) = S1
- IF (N.EQ.1) RETURN
- Y(2) = S2
- IF (N.EQ.2) RETURN
- DO 200 I=3,N
- Y(I) = CK*Y(I-1) - Y(I-2)
- CK = CK + RX
- 200 CONTINUE
- RETURN
- C
- C ASYMPTOTIC EXPANSION FOR LARGE X, X.GT.X2
- C
- 210 CONTINUE
- NN = 2
- IF (INU.EQ.0 .AND. N.EQ.1) NN = 1
- DNU2 = DNU + DNU
- FMU = 0.0E0
- IF (ABS(DNU2).LT.TOL) GO TO 220
- FMU = DNU2*DNU2
- 220 CONTINUE
- ARG = X - HPI*(DNU+0.5E0)
- SA = SIN(ARG)
- SB = COS(ARG)
- ETX = 8.0E0*X
- DO 250 K=1,NN
- S1 = S2
- T2 = (FMU-1.0E0)/ETX
- SS = T2
- RELB = TOL*ABS(T2)
- T1 = ETX
- S = 1.0E0
- FN = 1.0E0
- AK = 0.0E0
- DO 230 J=1,13
- T1 = T1 + ETX
- AK = AK + 8.0E0
- FN = FN + AK
- T2 = -T2*(FMU-FN)/T1
- S = S + T2
- T1 = T1 + ETX
- AK = AK + 8.0E0
- FN = FN + AK
- T2 = T2*(FMU-FN)/T1
- SS = SS + T2
- IF (ABS(T2).LE.RELB) GO TO 240
- 230 CONTINUE
- 240 S2 = COEF*(S*SA+SS*SB)
- FMU = FMU + 8.0E0*DNU + 4.0E0
- TB = SA
- SA = -SB
- SB = TB
- 250 CONTINUE
- IF (NN.GT.1) GO TO 160
- S1 = S2
- GO TO 190
- C
- C FNU=HALF ODD INTEGER CASE
- C
- 260 CONTINUE
- COEF = RTHPI/SQRT(X)
- S1 = COEF*SIN(X)
- S2 = -COEF*COS(X)
- GO TO 160
- C
- C
- 270 CALL XERMSG ('SLATEC', 'BESYNU', 'X NOT GREATER THAN ZERO', 2, 1)
- RETURN
- 280 CALL XERMSG ('SLATEC', 'BESYNU', 'FNU NOT ZERO OR POSITIVE', 2,
- + 1)
- RETURN
- 290 CALL XERMSG ('SLATEC', 'BESYNU', 'N NOT GREATER THAN 0', 2, 1)
- RETURN
- END
- *DECK BETA
- FUNCTION BETA (A, B)
- C***BEGIN PROLOGUE BETA
- C***PURPOSE Compute the complete Beta function.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C7B
- C***TYPE SINGLE PRECISION (BETA-S, DBETA-D, CBETA-C)
- C***KEYWORDS COMPLETE BETA FUNCTION, FNLIB, SPECIAL FUNCTIONS
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C BETA computes the complete beta function.
- C
- C Input Parameters:
- C A real and positive
- C B real and positive
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED ALBETA, GAMLIM, GAMMA, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770601 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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 900727 Added EXTERNAL statement. (WRB)
- C***END PROLOGUE BETA
- EXTERNAL GAMMA
- SAVE XMAX, ALNSML
- DATA XMAX, ALNSML /0., 0./
- C***FIRST EXECUTABLE STATEMENT BETA
- IF (ALNSML.NE.0.0) GO TO 10
- CALL GAMLIM (XMIN, XMAX)
- ALNSML = LOG(R1MACH(1))
- C
- 10 IF (A .LE. 0. .OR. B .LE. 0.) CALL XERMSG ('SLATEC', 'BETA',
- + 'BOTH ARGUMENTS MUST BE GT 0', 2, 2)
- C
- IF (A+B.LT.XMAX) BETA = GAMMA(A) * GAMMA(B) / GAMMA(A+B)
- IF (A+B.LT.XMAX) RETURN
- C
- BETA = ALBETA (A, B)
- IF (BETA .LT. ALNSML) CALL XERMSG ('SLATEC', 'BETA',
- + 'A AND/OR B SO BIG BETA UNDERFLOWS', 1, 2)
- C
- BETA = EXP (BETA)
- C
- RETURN
- END
- *DECK BETAI
- REAL FUNCTION BETAI (X, PIN, QIN)
- C***BEGIN PROLOGUE BETAI
- C***PURPOSE Calculate the incomplete Beta function.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C7F
- C***TYPE SINGLE PRECISION (BETAI-S, DBETAI-D)
- C***KEYWORDS FNLIB, INCOMPLETE BETA FUNCTION, SPECIAL FUNCTIONS
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C BETAI calculates the REAL incomplete beta function.
- C
- C The incomplete beta function ratio is the probability that a
- C random variable from a beta distribution having parameters PIN and
- C QIN will be less than or equal to X.
- C
- C -- Input Arguments -- All arguments are REAL.
- C X upper limit of integration. X must be in (0,1) inclusive.
- C PIN first beta distribution parameter. PIN must be .GT. 0.0.
- C QIN second beta distribution parameter. QIN must be .GT. 0.0.
- C
- C***REFERENCES Nancy E. Bosten and E. L. Battiste, Remark on Algorithm
- C 179, Communications of the ACM 17, 3 (March 1974),
- C pp. 156.
- C***ROUTINES CALLED ALBETA, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770401 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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 920528 DESCRIPTION and REFERENCES sections revised. (WRB)
- C***END PROLOGUE BETAI
- LOGICAL FIRST
- SAVE EPS, ALNEPS, SML, ALNSML, FIRST
- DATA FIRST /.TRUE./
- C***FIRST EXECUTABLE STATEMENT BETAI
- IF (FIRST) THEN
- EPS = R1MACH(3)
- ALNEPS = LOG(EPS)
- SML = R1MACH(1)
- ALNSML = LOG(SML)
- ENDIF
- FIRST = .FALSE.
- C
- IF (X .LT. 0. .OR. X .GT. 1.0) CALL XERMSG ('SLATEC', 'BETAI',
- + 'X IS NOT IN THE RANGE (0,1)', 1, 2)
- IF (PIN .LE. 0. .OR. QIN .LE. 0.) CALL XERMSG ('SLATEC', 'BETAI',
- + 'P AND/OR Q IS LE ZERO', 2, 2)
- C
- Y = X
- P = PIN
- Q = QIN
- IF (Q.LE.P .AND. X.LT.0.8) GO TO 20
- IF (X.LT.0.2) GO TO 20
- Y = 1.0 - Y
- P = QIN
- Q = PIN
- C
- 20 IF ((P+Q)*Y/(P+1.).LT.EPS) GO TO 80
- C
- C EVALUATE THE INFINITE SUM FIRST.
- C TERM WILL EQUAL Y**P/BETA(PS,P) * (1.-PS)I * Y**I / FAC(I)
- C
- PS = Q - AINT(Q)
- IF (PS.EQ.0.) PS = 1.0
- XB = P*LOG(Y) - ALBETA(PS, P) - LOG(P)
- BETAI = 0.0
- IF (XB.LT.ALNSML) GO TO 40
- C
- BETAI = EXP (XB)
- TERM = BETAI*P
- IF (PS.EQ.1.0) GO TO 40
- C
- N = MAX (ALNEPS/LOG(Y), 4.0E0)
- DO 30 I=1,N
- TERM = TERM*(I-PS)*Y/I
- BETAI = BETAI + TERM/(P+I)
- 30 CONTINUE
- C
- C NOW EVALUATE THE FINITE SUM, MAYBE.
- C
- 40 IF (Q.LE.1.0) GO TO 70
- C
- XB = P*LOG(Y) + Q*LOG(1.0-Y) - ALBETA(P,Q) - LOG(Q)
- IB = MAX (XB/ALNSML, 0.0E0)
- TERM = EXP (XB - IB*ALNSML)
- C = 1.0/(1.0-Y)
- P1 = Q*C/(P+Q-1.)
- C
- FINSUM = 0.0
- N = Q
- IF (Q.EQ.REAL(N)) N = N - 1
- DO 50 I=1,N
- IF (P1.LE.1.0 .AND. TERM/EPS.LE.FINSUM) GO TO 60
- TERM = (Q-I+1)*C*TERM/(P+Q-I)
- C
- IF (TERM.GT.1.0) IB = IB - 1
- IF (TERM.GT.1.0) TERM = TERM*SML
- C
- IF (IB.EQ.0) FINSUM = FINSUM + TERM
- 50 CONTINUE
- C
- 60 BETAI = BETAI + FINSUM
- 70 IF (Y.NE.X .OR. P.NE.PIN) BETAI = 1.0 - BETAI
- BETAI = MAX (MIN (BETAI, 1.0), 0.0)
- RETURN
- C
- 80 BETAI = 0.0
- XB = P*LOG(MAX(Y,SML)) - LOG(P) - ALBETA(P,Q)
- IF (XB.GT.ALNSML .AND. Y.NE.0.) BETAI = EXP (XB)
- IF (Y.NE.X .OR. P.NE.PIN) BETAI = 1.0 - BETAI
- RETURN
- C
- END
- *DECK BFQAD
- SUBROUTINE BFQAD (F, T, BCOEF, N, K, ID, X1, X2, TOL, QUAD, IERR,
- + WORK)
- C***BEGIN PROLOGUE BFQAD
- C***PURPOSE Compute the integral of a product of a function and a
- C derivative of a B-spline.
- C***LIBRARY SLATEC
- C***CATEGORY H2A2A1, E3, K6
- C***TYPE SINGLE PRECISION (BFQAD-S, DBFQAD-D)
- C***KEYWORDS INTEGRAL OF B-SPLINE, QUADRATURE
- C***AUTHOR Amos, D. E., (SNLA)
- C***DESCRIPTION
- C
- C Abstract
- C BFQAD computes the integral on (X1,X2) of a product of a
- C function F and the ID-th derivative of a K-th order B-spline,
- C using the B-representation (T,BCOEF,N,K). (X1,X2) must be
- C a subinterval of T(K) .LE. X .le. T(N+1). An integration
- C routine BSGQ8 (a modification
- C of GAUS8), integrates the product on sub-
- C intervals of (X1,X2) formed by included (distinct) knots.
- C
- C Description of Arguments
- C Input
- C F - external function of one argument for the
- C integrand BF(X)=F(X)*BVALU(T,BCOEF,N,K,ID,X,INBV,
- C WORK)
- C T - knot array of length N+K
- C BCOEF - coefficient array of length N
- C N - length of coefficient array
- C K - order of B-spline, K .GE. 1
- C ID - order of the spline derivative, 0 .LE. ID .LE. K-1
- C ID=0 gives the spline function
- C X1,X2 - end points of quadrature interval in
- C T(K) .LE. X .LE. T(N+1)
- C TOL - desired accuracy for the quadrature, suggest
- C 10.*STOL .LT. TOL .LE. 0.1 where STOL is the single
- C precision unit roundoff for the machine = R1MACH(4)
- C
- C Output
- C QUAD - integral of BF(X) on (X1,X2)
- C IERR - a status code
- C IERR=1 normal return
- C 2 some quadrature on (X1,X2) does not meet
- C the requested tolerance.
- C WORK - work vector of length 3*K
- C
- C Error Conditions
- C X1 or X2 not in T(K) .LE. X .LE. T(N+1) is a fatal error.
- C TOL not greater than the single precision unit roundoff or
- C less than 0.1 is a fatal error.
- C Some quadrature fails to meet the requested tolerance.
- C
- C***REFERENCES D. E. Amos, Quadrature subroutines for splines and
- C B-splines, Report SAND79-1825, Sandia Laboratories,
- C December 1979.
- C***ROUTINES CALLED BSGQ8, INTRV, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 800901 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE BFQAD
- C
- C
- INTEGER ID, IERR, IFLG, ILO, IL1, IL2, K, LEFT, MFLAG, N, NPK, NP1
- REAL A,AA,ANS,B,BB,BCOEF,Q,QUAD,T,TA,TB,TOL,WORK,WTOL, X1,
- 1 X2
- REAL R1MACH, F
- DIMENSION T(*), BCOEF(*), WORK(*)
- EXTERNAL F
- C***FIRST EXECUTABLE STATEMENT BFQAD
- IERR = 1
- QUAD = 0.0E0
- IF(K.LT.1) GO TO 100
- IF(N.LT.K) GO TO 105
- IF(ID.LT.0 .OR. ID.GE.K) GO TO 110
- WTOL = R1MACH(4)
- IF (TOL.LT.WTOL .OR. TOL.GT.0.1E0) GO TO 30
- AA = MIN(X1,X2)
- BB = MAX(X1,X2)
- IF (AA.LT.T(K)) GO TO 20
- NP1 = N + 1
- IF (BB.GT.T(NP1)) GO TO 20
- IF (AA.EQ.BB) RETURN
- NPK = N + K
- C
- ILO = 1
- CALL INTRV(T, NPK, AA, ILO, IL1, MFLAG)
- CALL INTRV(T, NPK, BB, ILO, IL2, MFLAG)
- IF (IL2.GE.NP1) IL2 = N
- INBV = 1
- Q = 0.0E0
- DO 10 LEFT=IL1,IL2
- TA = T(LEFT)
- TB = T(LEFT+1)
- IF (TA.EQ.TB) GO TO 10
- A = MAX(AA,TA)
- B = MIN(BB,TB)
- CALL BSGQ8(F,T,BCOEF,N,K,ID,A,B,INBV,TOL,ANS,IFLG,WORK)
- IF (IFLG.GT.1) IERR = 2
- Q = Q + ANS
- 10 CONTINUE
- IF (X1.GT.X2) Q = -Q
- QUAD = Q
- RETURN
- C
- C
- 20 CONTINUE
- CALL XERMSG ('SLATEC', 'BFQAD',
- + 'X1 OR X2 OR BOTH DO NOT SATISFY T(K).LE.X.LE.T(N+1)', 2, 1)
- RETURN
- 30 CONTINUE
- CALL XERMSG ('SLATEC', 'BFQAD',
- + 'TOL IS LESS THAN THE SINGLE PRECISION TOLERANCE OR ' //
- + 'GREATER THAN 0.1', 2, 1)
- RETURN
- 100 CONTINUE
- CALL XERMSG ('SLATEC', 'BFQAD', 'K DOES NOT SATISFY K.GE.1', 2,
- + 1)
- RETURN
- 105 CONTINUE
- CALL XERMSG ('SLATEC', 'BFQAD', 'N DOES NOT SATISFY N.GE.K', 2,
- + 1)
- RETURN
- 110 CONTINUE
- CALL XERMSG ('SLATEC', 'BFQAD',
- + 'ID DOES NOT SATISFY 0 .LE. ID .LT. K', 2, 1)
- RETURN
- END
- *DECK BI
- FUNCTION BI (X)
- C***BEGIN PROLOGUE BI
- C***PURPOSE Evaluate the Bairy function (the Airy function of the
- C second kind).
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C10D
- C***TYPE SINGLE PRECISION (BI-S, DBI-D)
- C***KEYWORDS BAIRY FUNCTION, FNLIB, SPECIAL FUNCTIONS
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C BI(X) calculates the Airy function of the second kind for real
- C argument X.
- C
- C Series for BIF on the interval -1.00000D+00 to 1.00000D+00
- C with weighted error 1.88E-19
- C log weighted error 18.72
- C significant figures required 17.74
- C decimal places required 19.20
- C
- C Series for BIG on the interval -1.00000D+00 to 1.00000D+00
- C with weighted error 2.61E-17
- C log weighted error 16.58
- C significant figures required 15.17
- C decimal places required 17.03
- C
- C Series for BIF2 on the interval 1.00000D+00 to 8.00000D+00
- C with weighted error 1.11E-17
- C log weighted error 16.95
- C approx significant figures required 16.5
- C decimal places required 17.45
- C
- C Series for BIG2 on the interval 1.00000D+00 to 8.00000D+00
- C with weighted error 1.19E-18
- C log weighted error 17.92
- C approx significant figures required 17.2
- C decimal places required 18.42
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED BIE, CSEVL, INITS, R1MACH, R9AIMP, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770701 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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***END PROLOGUE BI
- DIMENSION BIFCS(9), BIGCS(8), BIF2CS(10), BIG2CS(10)
- LOGICAL FIRST
- SAVE BIFCS, BIGCS, BIF2CS, BIG2CS, NBIF, NBIG, NBIF2,
- 1 NBIG2, X3SML, XMAX, FIRST
- DATA BIFCS( 1) / -.0167302164 7198664948E0 /
- DATA BIFCS( 2) / .1025233583 424944561E0 /
- DATA BIFCS( 3) / .0017083092 5073815165E0 /
- DATA BIFCS( 4) / .0000118625 4546774468E0 /
- DATA BIFCS( 5) / .0000000449 3290701779E0 /
- DATA BIFCS( 6) / .0000000001 0698207143E0 /
- DATA BIFCS( 7) / .0000000000 0017480643E0 /
- DATA BIFCS( 8) / .0000000000 0000020810E0 /
- DATA BIFCS( 9) / .0000000000 0000000018E0 /
- DATA BIGCS( 1) / .0224662232 4857452E0 /
- DATA BIGCS( 2) / .0373647754 5301955E0 /
- DATA BIGCS( 3) / .0004447621 8957212E0 /
- DATA BIGCS( 4) / .0000024708 0756363E0 /
- DATA BIGCS( 5) / .0000000079 1913533E0 /
- DATA BIGCS( 6) / .0000000000 1649807E0 /
- DATA BIGCS( 7) / .0000000000 0002411E0 /
- DATA BIGCS( 8) / .0000000000 0000002E0 /
- DATA BIF2CS( 1) / 0.0998457269 3816041E0 /
- DATA BIF2CS( 2) / .4786249778 63005538E0 /
- DATA BIF2CS( 3) / .0251552119 604330118E0 /
- DATA BIF2CS( 4) / .0005820693 885232645E0 /
- DATA BIF2CS( 5) / .0000074997 659644377E0 /
- DATA BIF2CS( 6) / .0000000613 460287034E0 /
- DATA BIF2CS( 7) / .0000000003 462753885E0 /
- DATA BIF2CS( 8) / .0000000000 014288910E0 /
- DATA BIF2CS( 9) / .0000000000 000044962E0 /
- DATA BIF2CS(10) / .0000000000 000000111E0 /
- DATA BIG2CS( 1) / .0333056621 45514340E0 /
- DATA BIG2CS( 2) / .1613092151 23197068E0 /
- DATA BIG2CS( 3) / .0063190073 096134286E0 /
- DATA BIG2CS( 4) / .0001187904 568162517E0 /
- DATA BIG2CS( 5) / .0000013045 345886200E0 /
- DATA BIG2CS( 6) / .0000000093 741259955E0 /
- DATA BIG2CS( 7) / .0000000000 474580188E0 /
- DATA BIG2CS( 8) / .0000000000 001783107E0 /
- DATA BIG2CS( 9) / .0000000000 000005167E0 /
- DATA BIG2CS(10) / .0000000000 000000011E0 /
- DATA FIRST /.TRUE./
- C***FIRST EXECUTABLE STATEMENT BI
- IF (FIRST) THEN
- ETA = 0.1*R1MACH(3)
- NBIF = INITS (BIFCS , 9, ETA)
- NBIG = INITS (BIGCS , 8, ETA)
- NBIF2 = INITS (BIF2CS, 10, ETA)
- NBIG2 = INITS (BIG2CS, 10, ETA)
- C
- X3SML = ETA**0.3333
- XMAX = (1.5*LOG(R1MACH(2)))**0.6666
- ENDIF
- FIRST = .FALSE.
- C
- IF (X.GE.(-1.0)) GO TO 20
- CALL R9AIMP (X, XM, THETA)
- BI = XM * SIN(THETA)
- RETURN
- C
- 20 IF (X.GT.1.0) GO TO 30
- Z = 0.0
- IF (ABS(X).GT.X3SML) Z = X**3
- BI = 0.625 + CSEVL (Z, BIFCS, NBIF) + X*(0.4375 +
- 1 CSEVL (Z, BIGCS, NBIG))
- RETURN
- C
- 30 IF (X.GT.2.0) GO TO 40
- Z = (2.0*X**3 - 9.0) / 7.0
- BI = 1.125 + CSEVL (Z, BIF2CS, NBIF2) + X*(0.625 +
- 1 CSEVL (Z, BIG2CS, NBIG2))
- RETURN
- C
- 40 IF (X .GT. XMAX) CALL XERMSG ('SLATEC', 'BI',
- + 'X SO BIG THAT BI OVERFLOWS', 1, 2)
- C
- BI = BIE(X) * EXP(2.0*X*SQRT(X)/3.0)
- RETURN
- C
- END
- *DECK BIE
- FUNCTION BIE (X)
- C***BEGIN PROLOGUE BIE
- C***PURPOSE Calculate the Bairy function for a negative argument and an
- C exponentially scaled Bairy function for a non-negative
- C argument.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C10D
- C***TYPE SINGLE PRECISION (BIE-S, DBIE-D)
- C***KEYWORDS BAIRY FUNCTION, EXPONENTIALLY SCALED, FNLIB,
- C SPECIAL FUNCTIONS
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C Evaluate BI(X) for X .LE. 0 and BI(X)*EXP(ZETA) where
- C ZETA = 2/3 * X**(3/2) for X .GE. 0.0
- C
- C Series for BIF on the interval -1.00000D+00 to 1.00000D+00
- C with weighted error 1.88E-19
- C log weighted error 18.72
- C significant figures required 17.74
- C decimal places required 19.20
- C
- C Series for BIG on the interval -1.00000D+00 to 1.00000D+00
- C with weighted error 2.61E-17
- C log weighted error 16.58
- C significant figures required 15.17
- C decimal places required 17.03
- C
- C Series for BIF2 on the interval 1.00000D+00 to 8.00000D+00
- C with weighted error 1.11E-17
- C log weighted error 16.95
- C approx significant figures required 16.5
- C decimal places required 17.45
- C
- C Series for BIG2 on the interval 1.00000D+00 to 8.00000D+00
- C with weighted error 1.19E-18
- C log weighted error 17.92
- C approx significant figures required 17.2
- C decimal places required 18.42
- C
- C Series for BIP on the interval 1.25000D-01 to 3.53553D-01
- C with weighted error 1.91E-17
- C log weighted error 16.72
- C significant figures required 15.35
- C decimal places required 17.41
- C
- C Series for BIP2 on the interval 0. to 1.25000D-01
- C with weighted error 1.05E-18
- C log weighted error 17.98
- C significant figures required 16.74
- C decimal places required 18.71
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED CSEVL, INITS, R1MACH, R9AIMP
- C***REVISION HISTORY (YYMMDD)
- C 770701 DATE WRITTEN
- C 890206 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C***END PROLOGUE BIE
- LOGICAL FIRST
- DIMENSION BIFCS(9), BIGCS(8), BIF2CS(10), BIG2CS(10), BIPCS(24),
- 1 BIP2CS(29)
- SAVE BIFCS, BIGCS, BIF2CS, BIG2CS, BIPCS, BIP2CS, ATR, BTR,
- 1 NBIF, NBIG, NBIF2, NBIG2, NBIP, NBIP2, X3SML, X32SML, XBIG, FIRST
- DATA BIFCS( 1) / -.0167302164 7198664948E0 /
- DATA BIFCS( 2) / .1025233583 424944561E0 /
- DATA BIFCS( 3) / .0017083092 5073815165E0 /
- DATA BIFCS( 4) / .0000118625 4546774468E0 /
- DATA BIFCS( 5) / .0000000449 3290701779E0 /
- DATA BIFCS( 6) / .0000000001 0698207143E0 /
- DATA BIFCS( 7) / .0000000000 0017480643E0 /
- DATA BIFCS( 8) / .0000000000 0000020810E0 /
- DATA BIFCS( 9) / .0000000000 0000000018E0 /
- DATA BIGCS( 1) / .0224662232 4857452E0 /
- DATA BIGCS( 2) / .0373647754 5301955E0 /
- DATA BIGCS( 3) / .0004447621 8957212E0 /
- DATA BIGCS( 4) / .0000024708 0756363E0 /
- DATA BIGCS( 5) / .0000000079 1913533E0 /
- DATA BIGCS( 6) / .0000000000 1649807E0 /
- DATA BIGCS( 7) / .0000000000 0002411E0 /
- DATA BIGCS( 8) / .0000000000 0000002E0 /
- DATA BIF2CS( 1) / 0.0998457269 3816041E0 /
- DATA BIF2CS( 2) / .4786249778 63005538E0 /
- DATA BIF2CS( 3) / .0251552119 604330118E0 /
- DATA BIF2CS( 4) / .0005820693 885232645E0 /
- DATA BIF2CS( 5) / .0000074997 659644377E0 /
- DATA BIF2CS( 6) / .0000000613 460287034E0 /
- DATA BIF2CS( 7) / .0000000003 462753885E0 /
- DATA BIF2CS( 8) / .0000000000 014288910E0 /
- DATA BIF2CS( 9) / .0000000000 000044962E0 /
- DATA BIF2CS(10) / .0000000000 000000111E0 /
- DATA BIG2CS( 1) / .0333056621 45514340E0 /
- DATA BIG2CS( 2) / .1613092151 23197068E0 /
- DATA BIG2CS( 3) / .0063190073 096134286E0 /
- DATA BIG2CS( 4) / .0001187904 568162517E0 /
- DATA BIG2CS( 5) / .0000013045 345886200E0 /
- DATA BIG2CS( 6) / .0000000093 741259955E0 /
- DATA BIG2CS( 7) / .0000000000 474580188E0 /
- DATA BIG2CS( 8) / .0000000000 001783107E0 /
- DATA BIG2CS( 9) / .0000000000 000005167E0 /
- DATA BIG2CS(10) / .0000000000 000000011E0 /
- DATA BIPCS( 1) / -.0832204747 7943447E0 /
- DATA BIPCS( 2) / .0114611892 7371174E0 /
- DATA BIPCS( 3) / .0004289644 0718911E0 /
- DATA BIPCS( 4) / -.0001490663 9379950E0 /
- DATA BIPCS( 5) / -.0000130765 9726787E0 /
- DATA BIPCS( 6) / .0000063275 9839610E0 /
- DATA BIPCS( 7) / -.0000004222 6696982E0 /
- DATA BIPCS( 8) / -.0000001914 7186298E0 /
- DATA BIPCS( 9) / .0000000645 3106284E0 /
- DATA BIPCS(10) / -.0000000078 4485467E0 /
- DATA BIPCS(11) / -.0000000009 6077216E0 /
- DATA BIPCS(12) / .0000000007 0004713E0 /
- DATA BIPCS(13) / -.0000000001 7731789E0 /
- DATA BIPCS(14) / .0000000000 2272089E0 /
- DATA BIPCS(15) / .0000000000 0165404E0 /
- DATA BIPCS(16) / -.0000000000 0185171E0 /
- DATA BIPCS(17) / .0000000000 0059576E0 /
- DATA BIPCS(18) / -.0000000000 0012194E0 /
- DATA BIPCS(19) / .0000000000 0001334E0 /
- DATA BIPCS(20) / .0000000000 0000172E0 /
- DATA BIPCS(21) / -.0000000000 0000145E0 /
- DATA BIPCS(22) / .0000000000 0000049E0 /
- DATA BIPCS(23) / -.0000000000 0000011E0 /
- DATA BIPCS(24) / .0000000000 0000001E0 /
- DATA BIP2CS( 1) / -.1135967375 85988679E0 /
- DATA BIP2CS( 2) / .0041381473 947881595E0 /
- DATA BIP2CS( 3) / .0001353470 622119332E0 /
- DATA BIP2CS( 4) / .0000104273 166530153E0 /
- DATA BIP2CS( 5) / .0000013474 954767849E0 /
- DATA BIP2CS( 6) / .0000001696 537405438E0 /
- DATA BIP2CS( 7) / -.0000000100 965008656E0 /
- DATA BIP2CS( 8) / -.0000000167 291194937E0 /
- DATA BIP2CS( 9) / -.0000000045 815364485E0 /
- DATA BIP2CS(10) / .0000000003 736681366E0 /
- DATA BIP2CS(11) / .0000000005 766930320E0 /
- DATA BIP2CS(12) / .0000000000 621812650E0 /
- DATA BIP2CS(13) / -.0000000000 632941202E0 /
- DATA BIP2CS(14) / -.0000000000 149150479E0 /
- DATA BIP2CS(15) / .0000000000 078896213E0 /
- DATA BIP2CS(16) / .0000000000 024960513E0 /
- DATA BIP2CS(17) / -.0000000000 012130075E0 /
- DATA BIP2CS(18) / -.0000000000 003740493E0 /
- DATA BIP2CS(19) / .0000000000 002237727E0 /
- DATA BIP2CS(20) / .0000000000 000474902E0 /
- DATA BIP2CS(21) / -.0000000000 000452616E0 /
- DATA BIP2CS(22) / -.0000000000 000030172E0 /
- DATA BIP2CS(23) / .0000000000 000091058E0 /
- DATA BIP2CS(24) / -.0000000000 000009814E0 /
- DATA BIP2CS(25) / -.0000000000 000016429E0 /
- DATA BIP2CS(26) / .0000000000 000005533E0 /
- DATA BIP2CS(27) / .0000000000 000002175E0 /
- DATA BIP2CS(28) / -.0000000000 000001737E0 /
- DATA BIP2CS(29) / -.0000000000 000000010E0 /
- DATA ATR / 8.750690570 8484345 E0 /
- DATA BTR / -2.093836321 356054 E0 /
- DATA FIRST /.TRUE./
- C***FIRST EXECUTABLE STATEMENT BIE
- IF (FIRST) THEN
- ETA = 0.1*R1MACH(3)
- NBIF = INITS (BIFCS, 9, ETA)
- NBIG = INITS (BIGCS, 8, ETA)
- NBIF2 = INITS (BIF2CS, 10, ETA)
- NBIG2 = INITS (BIG2CS, 10, ETA)
- NBIP = INITS (BIPCS , 24, ETA)
- NBIP2 = INITS (BIP2CS, 29, ETA)
- C
- X3SML = ETA**0.3333
- X32SML = 1.3104*X3SML**2
- XBIG = R1MACH(2)**0.6666
- ENDIF
- FIRST = .FALSE.
- C
- IF (X.GE.(-1.0)) GO TO 20
- CALL R9AIMP (X, XM, THETA)
- BIE = XM * SIN(THETA)
- RETURN
- C
- 20 IF (X.GT.1.0) GO TO 30
- Z = 0.0
- IF (ABS(X).GT.X3SML) Z = X**3
- BIE = 0.625 + CSEVL (Z, BIFCS, NBIF) + X*(0.4375 +
- 1 CSEVL (Z, BIGCS, NBIG))
- IF (X.GT.X32SML) BIE = BIE * EXP(-2.0*X*SQRT(X)/3.0)
- RETURN
- C
- 30 IF (X.GT.2.0) GO TO 40
- Z = (2.0*X**3 - 9.0) / 7.0
- BIE = EXP(-2.0*X*SQRT(X)/3.0) * (1.125 + CSEVL (Z, BIF2CS, NBIF2)
- 1 + X*(0.625 + CSEVL (Z, BIG2CS, NBIG2)) )
- RETURN
- C
- 40 IF (X.GT.4.0) GO TO 50
- SQRTX = SQRT(X)
- Z = ATR/(X*SQRTX) + BTR
- BIE = (0.625 + CSEVL (Z, BIPCS, NBIP)) / SQRT(SQRTX)
- RETURN
- C
- 50 SQRTX = SQRT(X)
- Z = -1.0
- IF (X.LT.XBIG) Z = 16.0/(X*SQRTX) - 1.0
- BIE = (0.625 + CSEVL (Z, BIP2CS, NBIP2))/SQRT(SQRTX)
- RETURN
- C
- END
- *DECK BINOM
- FUNCTION BINOM (N, M)
- C***BEGIN PROLOGUE BINOM
- C***PURPOSE Compute the binomial coefficients.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C1
- C***TYPE SINGLE PRECISION (BINOM-S, DBINOM-D)
- C***KEYWORDS BINOMIAL COEFFICIENTS, FNLIB, SPECIAL FUNCTIONS
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C BINOM(N,M) calculates the binomial coefficient (N!)/((M!)*(N-M)!).
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED ALNREL, R1MACH, R9LGMC, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770701 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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***END PROLOGUE BINOM
- LOGICAL FIRST
- SAVE SQ2PIL, BILNMX, FINTMX, FIRST
- DATA SQ2PIL / 0.9189385332 0467274E0 /
- DATA FIRST /.TRUE./
- C***FIRST EXECUTABLE STATEMENT BINOM
- IF (FIRST) THEN
- BILNMX = LOG (R1MACH(2))
- FINTMX = 0.9/R1MACH(3)
- ENDIF
- FIRST = .FALSE.
- C
- IF (N .LT. 0 .OR. M .LT. 0) CALL XERMSG ('SLATEC', 'BINOM',
- + 'N OR M LT ZERO', 1, 2)
- IF (N .LT. M) CALL XERMSG ('SLATEC', 'BINOM', 'N LT M', 2, 2)
- C
- K = MIN (M, N-M)
- IF (K.GT.20) GO TO 30
- IF (K*LOG(AMAX0(N,1)).GT.BILNMX) GO TO 30
- C
- BINOM = 1.
- IF (K.EQ.0) RETURN
- C
- DO 20 I=1,K
- BINOM = BINOM * REAL(N-I+1)/I
- 20 CONTINUE
- C
- IF (BINOM.LT.FINTMX) BINOM = AINT (BINOM+0.5)
- RETURN
- C
- C IF K.LT.9, APPROX IS NOT VALID AND ANSWER IS CLOSE TO THE OVERFLOW LIM
- 30 IF (K .LT. 9) CALL XERMSG ('SLATEC', 'BINOM',
- + 'RESULT OVERFLOWS BECAUSE N AND/OR M TOO BIG', 3, 2)
- C
- XN = N + 1
- XK = K + 1
- XNK = N - K + 1
- C
- CORR = R9LGMC(XN) - R9LGMC(XK) - R9LGMC(XNK)
- BINOM = XK*LOG(XNK/XK) - XN*ALNREL(-(XK-1.)/XN)
- 1 - 0.5*LOG(XN*XNK/XK) + 1.0 - SQ2PIL + CORR
- C
- IF (BINOM .GT. BILNMX) CALL XERMSG ('SLATEC', 'BINOM',
- + 'RESULT OVERFLOWS BECAUSE N AND/OR M TOO BIG', 3, 2)
- C
- BINOM = EXP (BINOM)
- IF (BINOM.LT.FINTMX) BINOM = AINT (BINOM+0.5)
- C
- RETURN
- END
- *DECK BINT4
- SUBROUTINE BINT4 (X, Y, NDATA, IBCL, IBCR, FBCL, FBCR, KNTOPT, T,
- + BCOEF, N, K, W)
- C***BEGIN PROLOGUE BINT4
- C***PURPOSE Compute the B-representation of a cubic spline
- C which interpolates given data.
- C***LIBRARY SLATEC
- C***CATEGORY E1A
- C***TYPE SINGLE PRECISION (BINT4-S, DBINT4-D)
- C***KEYWORDS B-SPLINE, CUBIC SPLINES, DATA FITTING, INTERPOLATION
- C***AUTHOR Amos, D. E., (SNLA)
- C***DESCRIPTION
- C
- C Abstract
- C BINT4 computes the B representation (T,BCOEF,N,K) of a
- C cubic spline (K=4) which interpolates data (X(I)),Y(I))),
- C I=1,NDATA. Parameters IBCL, IBCR, FBCL, FBCR allow the
- C specification of the spline first or second derivative at
- C both X(1) and X(NDATA). When this data is not specified
- C by the problem, it is common practice to use a natural
- C spline by setting second derivatives at X(1) and X(NDATA)
- C to zero (IBCL=IBCR=2,FBCL=FBCR=0.0). The spline is defined on
- C T(4) .LE. X .LE. T(N+1) with (ordered) interior knots at X(I))
- C values where N=NDATA+2. The knots T(1), T(2), T(3) lie to
- C the left of T(4)=X(1) and the knots T(N+2), T(N+3), T(N+4)
- C lie to the right of T(N+1)=X(NDATA) in increasing order. If
- C no extrapolation outside (X(1),X(NDATA)) is anticipated, the
- C knots T(1)=T(2)=T(3)=T(4)=X(1) and T(N+2)=T(N+3)=T(N+4)=
- C T(N+1)=X(NDATA) can be specified by KNTOPT=1. KNTOPT=2
- C selects a knot placement for T(1), T(2), T(3) to make the
- C first 7 knots symmetric about T(4)=X(1) and similarly for
- C T(N+2), T(N+3), T(N+4) about T(N+1)=X(NDATA). KNTOPT=3
- C allows the user to make his own selection, in increasing
- C order, for T(1), T(2), T(3) to the left of X(1) and T(N+2),
- C T(N+3), T(N+4) to the right of X(NDATA) in the work array
- C W(1) through W(6). In any case, the interpolation on
- C T(4) .LE. X .LE. T(N+1) by using function BVALU is unique
- C for given boundary conditions.
- C
- C Description of Arguments
- C Input
- C X - X vector of abscissae of length NDATA, distinct
- C and in increasing order
- C Y - Y vector of ordinates of length NDATA
- C NDATA - number of data points, NDATA .GE. 2
- C IBCL - selection parameter for left boundary condition
- C IBCL = 1 constrain the first derivative at
- C X(1) to FBCL
- C = 2 constrain the second derivative at
- C X(1) to FBCL
- C IBCR - selection parameter for right boundary condition
- C IBCR = 1 constrain first derivative at
- C X(NDATA) to FBCR
- C IBCR = 2 constrain second derivative at
- C X(NDATA) to FBCR
- C FBCL - left boundary values governed by IBCL
- C FBCR - right boundary values governed by IBCR
- C KNTOPT - knot selection parameter
- C KNTOPT = 1 sets knot multiplicity at T(4) and
- C T(N+1) to 4
- C = 2 sets a symmetric placement of knots
- C about T(4) and T(N+1)
- C = 3 sets TNP)=WNP) and T(N+1+I)=w(3+I),I=1,3
- C where WNP),I=1,6 is supplied by the user
- C W - work array of dimension at least 5*(NDATA+2)
- C if KNTOPT=3, then W(1),W(2),W(3) are knot values to
- C the left of X(1) and W(4),W(5),W(6) are knot
- C values to the right of X(NDATA) in increasing
- C order to be supplied by the user
- C
- C Output
- C T - knot array of length N+4
- C BCOEF - B-spline coefficient array of length N
- C N - number of coefficients, N=NDATA+2
- C K - order of spline, K=4
- C
- C Error Conditions
- C Improper input is a fatal error
- C Singular system of equations is a fatal error
- C
- C***REFERENCES D. E. Amos, Computation with splines and B-splines,
- C Report SAND78-1968, Sandia Laboratories, March 1979.
- C Carl de Boor, Package for calculating with B-splines,
- C SIAM Journal on Numerical Analysis 14, 3 (June 1977),
- C pp. 441-472.
- C Carl de Boor, A Practical Guide to Splines, Applied
- C Mathematics Series 27, Springer-Verlag, New York,
- C 1978.
- C***ROUTINES CALLED BNFAC, BNSLV, BSPVD, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 800901 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE BINT4
- C
- INTEGER I, IBCL, IBCR, IFLAG, ILB, ILEFT, IT, IUB, IW, IWP, J,
- 1 JW, K, KNTOPT, N, NDATA, NDM, NP, NWROW
- REAL BCOEF,FBCL,FBCR,T, TOL,TXN,TX1,VNIKX,W,WDTOL,WORK,X, XL,
- 1 Y
- REAL R1MACH
- DIMENSION X(*), Y(*), T(*), BCOEF(*), W(5,*), VNIKX(4,4), WORK(15)
- C***FIRST EXECUTABLE STATEMENT BINT4
- WDTOL = R1MACH(4)
- TOL = SQRT(WDTOL)
- IF (NDATA.LT.2) GO TO 200
- NDM = NDATA - 1
- DO 10 I=1,NDM
- IF (X(I).GE.X(I+1)) GO TO 210
- 10 CONTINUE
- IF (IBCL.LT.1 .OR. IBCL.GT.2) GO TO 220
- IF (IBCR.LT.1 .OR. IBCR.GT.2) GO TO 230
- IF (KNTOPT.LT.1 .OR. KNTOPT.GT.3) GO TO 240
- K = 4
- N = NDATA + 2
- NP = N + 1
- DO 20 I=1,NDATA
- T(I+3) = X(I)
- 20 CONTINUE
- GO TO (30, 50, 90), KNTOPT
- C SET UP KNOT ARRAY WITH MULTIPLICITY 4 AT X(1) AND X(NDATA)
- 30 CONTINUE
- DO 40 I=1,3
- T(4-I) = X(1)
- T(NP+I) = X(NDATA)
- 40 CONTINUE
- GO TO 110
- C SET UP KNOT ARRAY WITH SYMMETRIC PLACEMENT ABOUT END POINTS
- 50 CONTINUE
- IF (NDATA.GT.3) GO TO 70
- XL = (X(NDATA)-X(1))/3.0E0
- DO 60 I=1,3
- T(4-I) = T(5-I) - XL
- T(NP+I) = T(NP+I-1) + XL
- 60 CONTINUE
- GO TO 110
- 70 CONTINUE
- TX1 = X(1) + X(1)
- TXN = X(NDATA) + X(NDATA)
- DO 80 I=1,3
- T(4-I) = TX1 - X(I+1)
- T(NP+I) = TXN - X(NDATA-I)
- 80 CONTINUE
- GO TO 110
- C SET UP KNOT ARRAY LESS THAN X(1) AND GREATER THAN X(NDATA) TO BE
- C SUPPLIED BY USER IN WORK LOCATIONS W(1) THROUGH W(6) WHEN KNTOPT=3
- 90 CONTINUE
- DO 100 I=1,3
- T(4-I) = W(4-I,1)
- JW = MAX(1,I-1)
- IW = MOD(I+2,5)+1
- T(NP+I) = W(IW,JW)
- IF (T(4-I).GT.T(5-I)) GO TO 250
- IF (T(NP+I).LT.T(NP+I-1)) GO TO 250
- 100 CONTINUE
- 110 CONTINUE
- C
- DO 130 I=1,5
- DO 120 J=1,N
- W(I,J) = 0.0E0
- 120 CONTINUE
- 130 CONTINUE
- C SET UP LEFT INTERPOLATION POINT AND LEFT BOUNDARY CONDITION FOR
- C RIGHT LIMITS
- IT = IBCL + 1
- CALL BSPVD(T, K, IT, X(1), K, 4, VNIKX, WORK)
- IW = 0
- IF (ABS(VNIKX(3,1)).LT.TOL) IW = 1
- DO 140 J=1,3
- W(J+1,4-J) = VNIKX(4-J,IT)
- W(J,4-J) = VNIKX(4-J,1)
- 140 CONTINUE
- BCOEF(1) = Y(1)
- BCOEF(2) = FBCL
- C SET UP INTERPOLATION EQUATIONS FOR POINTS I=2 TO I=NDATA-1
- ILEFT = 4
- IF (NDM.LT.2) GO TO 170
- DO 160 I=2,NDM
- ILEFT = ILEFT + 1
- CALL BSPVD(T, K, 1, X(I), ILEFT, 4, VNIKX, WORK)
- DO 150 J=1,3
- W(J+1,3+I-J) = VNIKX(4-J,1)
- 150 CONTINUE
- BCOEF(I+1) = Y(I)
- 160 CONTINUE
- C SET UP RIGHT INTERPOLATION POINT AND RIGHT BOUNDARY CONDITION FOR
- C LEFT LIMITS(ILEFT IS ASSOCIATED WITH T(N)=X(NDATA-1))
- 170 CONTINUE
- IT = IBCR + 1
- CALL BSPVD(T, K, IT, X(NDATA), ILEFT, 4, VNIKX, WORK)
- JW = 0
- IF (ABS(VNIKX(2,1)).LT.TOL) JW = 1
- DO 180 J=1,3
- W(J+1,3+NDATA-J) = VNIKX(5-J,IT)
- W(J+2,3+NDATA-J) = VNIKX(5-J,1)
- 180 CONTINUE
- BCOEF(N-1) = FBCR
- BCOEF(N) = Y(NDATA)
- C SOLVE SYSTEM OF EQUATIONS
- ILB = 2 - JW
- IUB = 2 - IW
- NWROW = 5
- IWP = IW + 1
- CALL BNFAC(W(IWP,1), NWROW, N, ILB, IUB, IFLAG)
- IF (IFLAG.EQ.2) GO TO 190
- CALL BNSLV(W(IWP,1), NWROW, N, ILB, IUB, BCOEF)
- RETURN
- C
- C
- 190 CONTINUE
- CALL XERMSG ('SLATEC', 'BINT4',
- + 'THE SYSTEM OF EQUATIONS IS SINGULAR', 2, 1)
- RETURN
- 200 CONTINUE
- CALL XERMSG ('SLATEC', 'BINT4', 'NDATA IS LESS THAN 2', 2, 1)
- RETURN
- 210 CONTINUE
- CALL XERMSG ('SLATEC', 'BINT4',
- + 'X VALUES ARE NOT DISTINCT OR NOT ORDERED', 2, 1)
- RETURN
- 220 CONTINUE
- CALL XERMSG ('SLATEC', 'BINT4', 'IBCL IS NOT 1 OR 2', 2, 1)
- RETURN
- 230 CONTINUE
- CALL XERMSG ('SLATEC', 'BINT4', 'IBCR IS NOT 1 OR 2', 2, 1)
- RETURN
- 240 CONTINUE
- CALL XERMSG ('SLATEC', 'BINT4', 'KNTOPT IS NOT 1, 2, OR 3', 2, 1)
- RETURN
- 250 CONTINUE
- CALL XERMSG ('SLATEC', 'BINT4',
- + 'KNOT INPUT THROUGH W ARRAY IS NOT ORDERED PROPERLY', 2, 1)
- RETURN
- END
- *DECK BINTK
- SUBROUTINE BINTK (X, Y, T, N, K, BCOEF, Q, WORK)
- C***BEGIN PROLOGUE BINTK
- C***PURPOSE Compute the B-representation of a spline which interpolates
- C given data.
- C***LIBRARY SLATEC
- C***CATEGORY E1A
- C***TYPE SINGLE PRECISION (BINTK-S, DBINTK-D)
- C***KEYWORDS B-SPLINE, DATA FITTING, INTERPOLATION
- C***AUTHOR Amos, D. E., (SNLA)
- C***DESCRIPTION
- C
- C Written by Carl de Boor and modified by D. E. Amos
- C
- C Abstract
- C
- C BINTK is the SPLINT routine of the reference.
- C
- C BINTK produces the B-spline coefficients, BCOEF, of the
- C B-spline of order K with knots T(I), I=1,...,N+K, which
- C takes on the value Y(I) at X(I), I=1,...,N. The spline or
- C any of its derivatives can be evaluated by calls to BVALU.
- C The I-th equation of the linear system A*BCOEF = B for the
- C coefficients of the interpolant enforces interpolation at
- C X(I)), I=1,...,N. Hence, B(I) = Y(I), all I, and A is
- C a band matrix with 2K-1 bands if A is invertible. The matrix
- C A is generated row by row and stored, diagonal by diagonal,
- C in the rows of Q, with the main diagonal going into row K.
- C The banded system is then solved by a call to BNFAC (which
- C constructs the triangular factorization for A and stores it
- C again in Q), followed by a call to BNSLV (which then
- C obtains the solution BCOEF by substitution). BNFAC does no
- C pivoting, since the total positivity of the matrix A makes
- C this unnecessary. The linear system to be solved is
- C (theoretically) invertible if and only if
- C T(I) .LT. X(I)) .LT. T(I+K), all I.
- C Equality is permitted on the left for I=1 and on the right
- C for I=N when K knots are used at X(1) or X(N). Otherwise,
- C violation of this condition is certain to lead to an error.
- C
- C Description of Arguments
- C Input
- C X - vector of length N containing data point abscissa
- C in strictly increasing order.
- C Y - corresponding vector of length N containing data
- C point ordinates.
- C T - knot vector of length N+K
- C since T(1),..,T(K) .LE. X(1) and T(N+1),..,T(N+K)
- C .GE. X(N), this leaves only N-K knots (not nec-
- C essarily X(I)) values) interior to (X(1),X(N))
- C N - number of data points, N .GE. K
- C K - order of the spline, K .GE. 1
- C
- C Output
- C BCOEF - a vector of length N containing the B-spline
- C coefficients
- C Q - a work vector of length (2*K-1)*N, containing
- C the triangular factorization of the coefficient
- C matrix of the linear system being solved. The
- C coefficients for the interpolant of an
- C additional data set (X(I)),YY(I)), I=1,...,N
- C with the same abscissa can be obtained by loading
- C YY into BCOEF and then executing
- C CALL BNSLV (Q,2K-1,N,K-1,K-1,BCOEF)
- C WORK - work vector of length 2*K
- C
- C Error Conditions
- C Improper input is a fatal error
- C Singular system of equations is a fatal error
- C
- C***REFERENCES D. E. Amos, Computation with splines and B-splines,
- C Report SAND78-1968, Sandia Laboratories, March 1979.
- C Carl de Boor, Package for calculating with B-splines,
- C SIAM Journal on Numerical Analysis 14, 3 (June 1977),
- C pp. 441-472.
- C Carl de Boor, A Practical Guide to Splines, Applied
- C Mathematics Series 27, Springer-Verlag, New York,
- C 1978.
- C***ROUTINES CALLED BNFAC, BNSLV, BSPVN, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 800901 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 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 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE BINTK
- C
- INTEGER IFLAG, IWORK, K, N, I, ILP1MX, J, JJ, KM1, KPKM2, LEFT,
- 1 LENQ, NP1
- REAL BCOEF(*), Y(*), Q(*), T(*), X(*), XI, WORK(*)
- C DIMENSION Q(2*K-1,N), T(N+K)
- C***FIRST EXECUTABLE STATEMENT BINTK
- IF(K.LT.1) GO TO 100
- IF(N.LT.K) GO TO 105
- JJ = N - 1
- IF(JJ.EQ.0) GO TO 6
- DO 5 I=1,JJ
- IF(X(I).GE.X(I+1)) GO TO 110
- 5 CONTINUE
- 6 CONTINUE
- NP1 = N + 1
- KM1 = K - 1
- KPKM2 = 2*KM1
- LEFT = K
- C ZERO OUT ALL ENTRIES OF Q
- LENQ = N*(K+KM1)
- DO 10 I=1,LENQ
- Q(I) = 0.0E0
- 10 CONTINUE
- C
- C *** LOOP OVER I TO CONSTRUCT THE N INTERPOLATION EQUATIONS
- DO 50 I=1,N
- XI = X(I)
- ILP1MX = MIN(I+K,NP1)
- C *** FIND LEFT IN THE CLOSED INTERVAL (I,I+K-1) SUCH THAT
- C T(LEFT) .LE. X(I) .LT. T(LEFT+1)
- C MATRIX IS SINGULAR IF THIS IS NOT POSSIBLE
- LEFT = MAX(LEFT,I)
- IF (XI.LT.T(LEFT)) GO TO 80
- 20 IF (XI.LT.T(LEFT+1)) GO TO 30
- LEFT = LEFT + 1
- IF (LEFT.LT.ILP1MX) GO TO 20
- LEFT = LEFT - 1
- IF (XI.GT.T(LEFT+1)) GO TO 80
- C *** THE I-TH EQUATION ENFORCES INTERPOLATION AT XI, HENCE
- C A(I,J) = B(J,K,T)(XI), ALL J. ONLY THE K ENTRIES WITH J =
- C LEFT-K+1,...,LEFT ACTUALLY MIGHT BE NONZERO. THESE K NUMBERS
- C ARE RETURNED, IN BCOEF (USED FOR TEMP.STORAGE HERE), BY THE
- C FOLLOWING
- 30 CALL BSPVN(T, K, K, 1, XI, LEFT, BCOEF, WORK, IWORK)
- C WE THEREFORE WANT BCOEF(J) = B(LEFT-K+J)(XI) TO GO INTO
- C A(I,LEFT-K+J), I.E., INTO Q(I-(LEFT+J)+2*K,(LEFT+J)-K) SINCE
- C A(I+J,J) IS TO GO INTO Q(I+K,J), ALL I,J, IF WE CONSIDER Q
- C AS A TWO-DIM. ARRAY , WITH 2*K-1 ROWS (SEE COMMENTS IN
- C BNFAC). IN THE PRESENT PROGRAM, WE TREAT Q AS AN EQUIVALENT
- C ONE-DIMENSIONAL ARRAY (BECAUSE OF FORTRAN RESTRICTIONS ON
- C DIMENSION STATEMENTS) . WE THEREFORE WANT BCOEF(J) TO GO INTO
- C ENTRY
- C I -(LEFT+J) + 2*K + ((LEFT+J) - K-1)*(2*K-1)
- C = I-LEFT+1 + (LEFT -K)*(2*K-1) + (2*K-2)*J
- C OF Q .
- JJ = I - LEFT + 1 + (LEFT-K)*(K+KM1)
- DO 40 J=1,K
- JJ = JJ + KPKM2
- Q(JJ) = BCOEF(J)
- 40 CONTINUE
- 50 CONTINUE
- C
- C ***OBTAIN FACTORIZATION OF A , STORED AGAIN IN Q.
- CALL BNFAC(Q, K+KM1, N, KM1, KM1, IFLAG)
- GO TO (60, 90), IFLAG
- C *** SOLVE A*BCOEF = Y BY BACKSUBSTITUTION
- 60 DO 70 I=1,N
- BCOEF(I) = Y(I)
- 70 CONTINUE
- CALL BNSLV(Q, K+KM1, N, KM1, KM1, BCOEF)
- RETURN
- C
- C
- 80 CONTINUE
- CALL XERMSG ('SLATEC', 'BINTK',
- + 'SOME ABSCISSA WAS NOT IN THE SUPPORT OF THE CORRESPONDING ' //
- + 'BASIS FUNCTION AND THE SYSTEM IS SINGULAR.', 2, 1)
- RETURN
- 90 CONTINUE
- CALL XERMSG ('SLATEC', 'BINTK',
- + 'THE SYSTEM OF SOLVER DETECTS A SINGULAR SYSTEM ALTHOUGH ' //
- + 'THE THEORETICAL CONDITIONS FOR A SOLUTION WERE SATISFIED.',
- + 8, 1)
- RETURN
- 100 CONTINUE
- CALL XERMSG ('SLATEC', 'BINTK', 'K DOES NOT SATISFY K.GE.1', 2,
- + 1)
- RETURN
- 105 CONTINUE
- CALL XERMSG ('SLATEC', 'BINTK', 'N DOES NOT SATISFY N.GE.K', 2,
- + 1)
- RETURN
- 110 CONTINUE
- CALL XERMSG ('SLATEC', 'BINTK',
- + 'X(I) DOES NOT SATISFY X(I).LT.X(I+1) FOR SOME I', 2, 1)
- RETURN
- END
- *DECK BISECT
- SUBROUTINE BISECT (N, EPS1, D, E, E2, LB, UB, MM, M, W, IND, IERR,
- + RV4, RV5)
- C***BEGIN PROLOGUE BISECT
- C***PURPOSE Compute the eigenvalues of a symmetric tridiagonal matrix
- C in a given interval using Sturm sequencing.
- C***LIBRARY SLATEC (EISPACK)
- C***CATEGORY D4A5, D4C2A
- C***TYPE SINGLE PRECISION (BISECT-S)
- C***KEYWORDS EIGENVALUES, EISPACK
- C***AUTHOR Smith, B. T., et al.
- C***DESCRIPTION
- C
- C This subroutine is a translation of the bisection technique
- C in the ALGOL procedure TRISTURM by Peters and Wilkinson.
- C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 418-439(1971).
- C
- C This subroutine finds those eigenvalues of a TRIDIAGONAL
- C SYMMETRIC matrix which lie in a specified interval,
- C using bisection.
- C
- C On INPUT
- C
- C N is the order of the matrix. N is an INTEGER variable.
- C
- C EPS1 is an absolute error tolerance for the computed
- C eigenvalues. If the input EPS1 is non-positive,
- C it is reset for each submatrix to a default value,
- C namely, minus the product of the relative machine
- C precision and the 1-norm of the submatrix.
- C EPS1 is a REAL variable.
- C
- C D contains the diagonal elements of the input matrix.
- C D is a one-dimensional REAL array, dimensioned D(N).
- C
- C E contains the subdiagonal elements of the input matrix
- C in its last N-1 positions. E(1) is arbitrary.
- C E is a one-dimensional REAL array, dimensioned E(N).
- C
- C E2 contains the squares of the corresponding elements of E.
- C E2(1) is arbitrary. E2 is a one-dimensional REAL array,
- C dimensioned E2(N).
- C
- C LB and UB define the interval to be searched for eigenvalues.
- C If LB is not less than UB, no eigenvalues will be found.
- C LB and UB are REAL variables.
- C
- C MM should be set to an upper bound for the number of
- C eigenvalues in the interval. WARNING - If more than
- C MM eigenvalues are determined to lie in the interval,
- C an error return is made with no eigenvalues found.
- C MM is an INTEGER variable.
- C
- C On OUTPUT
- C
- C EPS1 is unaltered unless it has been reset to its
- C (last) default value.
- C
- C D and E are unaltered.
- C
- C Elements of E2, corresponding to elements of E regarded
- C as negligible, have been replaced by zero causing the
- C matrix to split into a direct sum of submatrices.
- C E2(1) is also set to zero.
- C
- C M is the number of eigenvalues determined to lie in (LB,UB).
- C M is an INTEGER variable.
- C
- C W contains the M eigenvalues in ascending order.
- C W is a one-dimensional REAL array, dimensioned W(MM).
- C
- C IND contains in its first M positions the submatrix indices
- C associated with the corresponding eigenvalues in W --
- C 1 for eigenvalues belonging to the first submatrix from
- C the top, 2 for those belonging to the second submatrix, etc.
- C IND is an one-dimensional INTEGER array, dimensioned IND(MM).
- C
- C IERR is an INTEGER flag set to
- C Zero for normal return,
- C 3*N+1 if M exceeds MM. In this case, M contains the
- C number of eigenvalues determined to lie in
- C (LB,UB).
- C
- C RV4 and RV5 are one-dimensional REAL arrays used for temporary
- C storage, dimensioned RV4(N) and RV5(N).
- C
- C The ALGOL procedure STURMCNT contained in TRISTURM
- C appears in BISECT in-line.
- C
- C Note that subroutine TQL1 or IMTQL1 is generally faster than
- C BISECT, if more than N/4 eigenvalues are to be found.
- C
- C Questions and comments should be directed to B. S. Garbow,
- C Applied Mathematics Division, ARGONNE NATIONAL LABORATORY
- C ------------------------------------------------------------------
- C
- C***REFERENCES B. T. Smith, J. M. Boyle, J. J. Dongarra, B. S. Garbow,
- C Y. Ikebe, V. C. Klema and C. B. Moler, Matrix Eigen-
- C system Routines - EISPACK Guide, Springer-Verlag,
- C 1976.
- C***ROUTINES CALLED R1MACH
- C***REVISION HISTORY (YYMMDD)
- C 760101 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE BISECT
- C
- INTEGER I,J,K,L,M,N,P,Q,R,S,II,MM,M1,M2,TAG,IERR,ISTURM
- REAL D(*),E(*),E2(*),W(*),RV4(*),RV5(*)
- REAL U,V,LB,T1,T2,UB,XU,X0,X1,EPS1,MACHEP,S1,S2
- INTEGER IND(*)
- LOGICAL FIRST
- C
- SAVE FIRST, MACHEP
- DATA FIRST /.TRUE./
- C***FIRST EXECUTABLE STATEMENT BISECT
- IF (FIRST) THEN
- MACHEP = R1MACH(4)
- ENDIF
- FIRST = .FALSE.
- C
- IERR = 0
- TAG = 0
- T1 = LB
- T2 = UB
- C .......... LOOK FOR SMALL SUB-DIAGONAL ENTRIES ..........
- DO 40 I = 1, N
- IF (I .EQ. 1) GO TO 20
- S1 = ABS(D(I)) + ABS(D(I-1))
- S2 = S1 + ABS(E(I))
- IF (S2 .GT. S1) GO TO 40
- 20 E2(I) = 0.0E0
- 40 CONTINUE
- C .......... DETERMINE THE NUMBER OF EIGENVALUES
- C IN THE INTERVAL ..........
- P = 1
- Q = N
- X1 = UB
- ISTURM = 1
- GO TO 320
- 60 M = S
- X1 = LB
- ISTURM = 2
- GO TO 320
- 80 M = M - S
- IF (M .GT. MM) GO TO 980
- Q = 0
- R = 0
- C .......... ESTABLISH AND PROCESS NEXT SUBMATRIX, REFINING
- C INTERVAL BY THE GERSCHGORIN BOUNDS ..........
- 100 IF (R .EQ. M) GO TO 1001
- TAG = TAG + 1
- P = Q + 1
- XU = D(P)
- X0 = D(P)
- U = 0.0E0
- C
- DO 120 Q = P, N
- X1 = U
- U = 0.0E0
- V = 0.0E0
- IF (Q .EQ. N) GO TO 110
- U = ABS(E(Q+1))
- V = E2(Q+1)
- 110 XU = MIN(D(Q)-(X1+U),XU)
- X0 = MAX(D(Q)+(X1+U),X0)
- IF (V .EQ. 0.0E0) GO TO 140
- 120 CONTINUE
- C
- 140 X1 = MAX(ABS(XU),ABS(X0)) * MACHEP
- IF (EPS1 .LE. 0.0E0) EPS1 = -X1
- IF (P .NE. Q) GO TO 180
- C .......... CHECK FOR ISOLATED ROOT WITHIN INTERVAL ..........
- IF (T1 .GT. D(P) .OR. D(P) .GE. T2) GO TO 940
- M1 = P
- M2 = P
- RV5(P) = D(P)
- GO TO 900
- 180 X1 = X1 * (Q-P+1)
- LB = MAX(T1,XU-X1)
- UB = MIN(T2,X0+X1)
- X1 = LB
- ISTURM = 3
- GO TO 320
- 200 M1 = S + 1
- X1 = UB
- ISTURM = 4
- GO TO 320
- 220 M2 = S
- IF (M1 .GT. M2) GO TO 940
- C .......... FIND ROOTS BY BISECTION ..........
- X0 = UB
- ISTURM = 5
- C
- DO 240 I = M1, M2
- RV5(I) = UB
- RV4(I) = LB
- 240 CONTINUE
- C .......... LOOP FOR K-TH EIGENVALUE
- C FOR K=M2 STEP -1 UNTIL M1 DO --
- C (-DO- NOT USED TO LEGALIZE -COMPUTED GO TO-) ..........
- K = M2
- 250 XU = LB
- C .......... FOR I=K STEP -1 UNTIL M1 DO -- ..........
- DO 260 II = M1, K
- I = M1 + K - II
- IF (XU .GE. RV4(I)) GO TO 260
- XU = RV4(I)
- GO TO 280
- 260 CONTINUE
- C
- 280 IF (X0 .GT. RV5(K)) X0 = RV5(K)
- C .......... NEXT BISECTION STEP ..........
- 300 X1 = (XU + X0) * 0.5E0
- S1 = 2.0E0*(ABS(XU) + ABS(X0) + ABS(EPS1))
- S2 = S1 + ABS(X0 - XU)
- IF (S2 .EQ. S1) GO TO 420
- C .......... IN-LINE PROCEDURE FOR STURM SEQUENCE ..........
- 320 S = P - 1
- U = 1.0E0
- C
- DO 340 I = P, Q
- IF (U .NE. 0.0E0) GO TO 325
- V = ABS(E(I)) / MACHEP
- IF (E2(I) .EQ. 0.0E0) V = 0.0E0
- GO TO 330
- 325 V = E2(I) / U
- 330 U = D(I) - X1 - V
- IF (U .LT. 0.0E0) S = S + 1
- 340 CONTINUE
- C
- GO TO (60,80,200,220,360), ISTURM
- C .......... REFINE INTERVALS ..........
- 360 IF (S .GE. K) GO TO 400
- XU = X1
- IF (S .GE. M1) GO TO 380
- RV4(M1) = X1
- GO TO 300
- 380 RV4(S+1) = X1
- IF (RV5(S) .GT. X1) RV5(S) = X1
- GO TO 300
- 400 X0 = X1
- GO TO 300
- C .......... K-TH EIGENVALUE FOUND ..........
- 420 RV5(K) = X1
- K = K - 1
- IF (K .GE. M1) GO TO 250
- C .......... ORDER EIGENVALUES TAGGED WITH THEIR
- C SUBMATRIX ASSOCIATIONS ..........
- 900 S = R
- R = R + M2 - M1 + 1
- J = 1
- K = M1
- C
- DO 920 L = 1, R
- IF (J .GT. S) GO TO 910
- IF (K .GT. M2) GO TO 940
- IF (RV5(K) .GE. W(L)) GO TO 915
- C
- DO 905 II = J, S
- I = L + S - II
- W(I+1) = W(I)
- IND(I+1) = IND(I)
- 905 CONTINUE
- C
- 910 W(L) = RV5(K)
- IND(L) = TAG
- K = K + 1
- GO TO 920
- 915 J = J + 1
- 920 CONTINUE
- C
- 940 IF (Q .LT. N) GO TO 100
- GO TO 1001
- C .......... SET ERROR -- UNDERESTIMATE OF NUMBER OF
- C EIGENVALUES IN INTERVAL ..........
- 980 IERR = 3 * N + 1
- 1001 LB = T1
- UB = T2
- RETURN
- END
- *DECK BKIAS
- SUBROUTINE BKIAS (X, N, KTRMS, T, ANS, IND, MS, GMRN, H, IERR)
- C***BEGIN PROLOGUE BKIAS
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to BSKIN
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (BKIAS-S, DBKIAS-D)
- C***AUTHOR Amos, D. E., (SNLA)
- C***DESCRIPTION
- C
- C BKIAS computes repeated integrals of the K0 Bessel function
- C by the asymptotic expansion
- C
- C***SEE ALSO BSKIN
- C***ROUTINES CALLED BDIFF, GAMRN, HKSEQ, R1MACH
- C***REVISION HISTORY (YYMMDD)
- C 820601 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900328 Added TYPE section. (WRB)
- C 910722 Updated AUTHOR section. (ALS)
- C***END PROLOGUE BKIAS
- INTEGER I, II, IND, J, JMI, JN, K, KK, KM, KTRMS, MM, MP, MS, N,
- * IERR
- REAL ANS, B, BND, DEN1, DEN2, DEN3, ER, ERR, FJ, FK, FLN, FM1,
- * GMRN, G1, GS, H, HN, HRTPI, RAT, RG1, RXP, RZ, RZX, S, SS, SUMI,
- * SUMJ, T, TOL, V, W, X, XP, Z
- REAL GAMRN, R1MACH
- DIMENSION B(120), XP(16), S(31), H(*), V(52), W(52), T(50),
- * BND(15)
- SAVE B, BND, HRTPI
- C-----------------------------------------------------------------------
- C COEFFICIENTS OF POLYNOMIAL P(J-1,X), J=1,15
- C-----------------------------------------------------------------------
- DATA B(1), B(2), B(3), B(4), B(5), B(6), B(7), B(8), B(9), B(10),
- * B(11), B(12), B(13), B(14), B(15), B(16), B(17), B(18), B(19),
- * B(20), B(21), B(22), B(23), B(24) /1.00000000000000000E+00,
- * 1.00000000000000000E+00,-2.00000000000000000E+00,
- * 1.00000000000000000E+00,-8.00000000000000000E+00,
- * 6.00000000000000000E+00,1.00000000000000000E+00,
- * -2.20000000000000000E+01,5.80000000000000000E+01,
- * -2.40000000000000000E+01,1.00000000000000000E+00,
- * -5.20000000000000000E+01,3.28000000000000000E+02,
- * -4.44000000000000000E+02,1.20000000000000000E+02,
- * 1.00000000000000000E+00,-1.14000000000000000E+02,
- * 1.45200000000000000E+03,-4.40000000000000000E+03,
- * 3.70800000000000000E+03,-7.20000000000000000E+02,
- * 1.00000000000000000E+00,-2.40000000000000000E+02,
- * 5.61000000000000000E+03/
- DATA B(25), B(26), B(27), B(28), B(29), B(30), B(31), B(32),
- * B(33), B(34), B(35), B(36), B(37), B(38), B(39), B(40), B(41),
- * B(42), B(43), B(44), B(45), B(46), B(47), B(48)
- * /-3.21200000000000000E+04,5.81400000000000000E+04,
- * -3.39840000000000000E+04,5.04000000000000000E+03,
- * 1.00000000000000000E+00,-4.94000000000000000E+02,
- * 1.99500000000000000E+04,-1.95800000000000000E+05,
- * 6.44020000000000000E+05,-7.85304000000000000E+05,
- * 3.41136000000000000E+05,-4.03200000000000000E+04,
- * 1.00000000000000000E+00,-1.00400000000000000E+03,
- * 6.72600000000000000E+04,-1.06250000000000000E+06,
- * 5.76550000000000000E+06,-1.24400640000000000E+07,
- * 1.10262960000000000E+07,-3.73392000000000000E+06,
- * 3.62880000000000000E+05,1.00000000000000000E+00,
- * -2.02600000000000000E+03,2.18848000000000000E+05/
- DATA B(49), B(50), B(51), B(52), B(53), B(54), B(55), B(56),
- * B(57), B(58), B(59), B(60), B(61), B(62), B(63), B(64), B(65),
- * B(66), B(67), B(68), B(69), B(70), B(71), B(72)
- * /-5.32616000000000000E+06,4.47650000000000000E+07,
- * -1.55357384000000000E+08,2.38904904000000000E+08,
- * -1.62186912000000000E+08,4.43390400000000000E+07,
- * -3.62880000000000000E+06,1.00000000000000000E+00,
- * -4.07200000000000000E+03,6.95038000000000000E+05,
- * -2.52439040000000000E+07,3.14369720000000000E+08,
- * -1.64838430400000000E+09,4.00269508800000000E+09,
- * -4.64216395200000000E+09,2.50748121600000000E+09,
- * -5.68356480000000000E+08,3.99168000000000000E+07,
- * 1.00000000000000000E+00,-8.16600000000000000E+03,
- * 2.17062600000000000E+06,-1.14876376000000000E+08,
- * 2.05148277600000000E+09,-1.55489607840000000E+10/
- DATA B(73), B(74), B(75), B(76), B(77), B(78), B(79), B(80),
- * B(81), B(82), B(83), B(84), B(85), B(86), B(87), B(88), B(89),
- * B(90), B(91), B(92), B(93), B(94), B(95), B(96)
- * /5.60413987840000000E+10,-1.01180433024000000E+11,
- * 9.21997902240000000E+10,-4.07883018240000000E+10,
- * 7.82771904000000000E+09,-4.79001600000000000E+08,
- * 1.00000000000000000E+00,-1.63560000000000000E+04,
- * 6.69969600000000000E+06,-5.07259276000000000E+08,
- * 1.26698177760000000E+10,-1.34323420224000000E+11,
- * 6.87720046384000000E+11,-1.81818864230400000E+12,
- * 2.54986547342400000E+12,-1.88307966182400000E+12,
- * 6.97929436800000000E+11,-1.15336085760000000E+11,
- * 6.22702080000000000E+09,1.00000000000000000E+00,
- * -3.27380000000000000E+04,2.05079880000000000E+07,
- * -2.18982980800000000E+09,7.50160522280000000E+10/
- DATA B(97), B(98), B(99), B(100), B(101), B(102), B(103), B(104),
- * B(105), B(106), B(107), B(108), B(109), B(110), B(111), B(112),
- * B(113), B(114), B(115), B(116), B(117), B(118)
- * /-1.08467651241600000E+12,7.63483214939200000E+12,
- * -2.82999100661120000E+13,5.74943734645920000E+13,
- * -6.47283751398720000E+13,3.96895780558080000E+13,
- * -1.25509040179200000E+13,1.81099255680000000E+12,
- * -8.71782912000000000E+10,1.00000000000000000E+00,
- * -6.55040000000000000E+04,6.24078900000000000E+07,
- * -9.29252692000000000E+09,4.29826006340000000E+11,
- * -8.30844432796800000E+12,7.83913848313120000E+13,
- * -3.94365587815520000E+14,1.11174747256968000E+15,
- * -1.79717122069056000E+15,1.66642448627145600E+15,
- * -8.65023253219584000E+14,2.36908271543040000E+14/
- DATA B(119), B(120) /-3.01963769856000000E+13,
- * 1.30767436800000000E+12/
- C-----------------------------------------------------------------------
- C BOUNDS B(M,K) , K=M-3
- C-----------------------------------------------------------------------
- DATA BND(1), BND(2), BND(3), BND(4), BND(5), BND(6), BND(7),
- * BND(8), BND(9), BND(10), BND(11), BND(12), BND(13), BND(14),
- * BND(15) /1.0E0,1.0E0,1.0E0,1.0E0,3.10E0,5.18E0,11.7E0,29.8E0,
- * 90.4E0,297.0E0,1070.0E0,4290.0E0,18100.0E0,84700.0E0,408000.0E0/
- DATA HRTPI /8.86226925452758014E-01/
- C
- C***FIRST EXECUTABLE STATEMENT BKIAS
- IERR=0
- TOL = MAX(R1MACH(4),1.0E-18)
- FLN = N
- RZ = 1.0E0/(X+FLN)
- RZX = X*RZ
- Z = 0.5E0*(X+FLN)
- IF (IND.GT.1) GO TO 10
- GMRN = GAMRN(Z)
- 10 CONTINUE
- GS = HRTPI*GMRN
- G1 = GS + GS
- RG1 = 1.0E0/G1
- GMRN = (RZ+RZ)/GMRN
- IF (IND.GT.1) GO TO 70
- C-----------------------------------------------------------------------
- C EVALUATE ERROR FOR M=MS
- C-----------------------------------------------------------------------
- HN = 0.5E0*FLN
- DEN2 = KTRMS + KTRMS + N
- DEN3 = DEN2 - 2.0E0
- DEN1 = X + DEN2
- ERR = RG1*(X+X)/(DEN1-1.0E0)
- IF (N.EQ.0) GO TO 20
- RAT = 1.0E0/(FLN*FLN)
- 20 CONTINUE
- IF (KTRMS.EQ.0) GO TO 30
- FJ = KTRMS
- RAT = 0.25E0/(HRTPI*DEN3*SQRT(FJ))
- 30 CONTINUE
- ERR = ERR*RAT
- FJ = -3.0E0
- DO 50 J=1,15
- IF (J.LE.5) ERR = ERR/DEN1
- FM1 = MAX(1.0E0,FJ)
- FJ = FJ + 1.0E0
- ER = BND(J)*ERR
- IF (KTRMS.EQ.0) GO TO 40
- ER = ER/FM1
- IF (ER.LT.TOL) GO TO 60
- IF (J.GE.5) ERR = ERR/DEN3
- GO TO 50
- 40 CONTINUE
- ER = ER*(1.0E0+HN/FM1)
- IF (ER.LT.TOL) GO TO 60
- IF (J.GE.5) ERR = ERR/FLN
- 50 CONTINUE
- GO TO 200
- 60 CONTINUE
- MS = J
- 70 CONTINUE
- MM = MS + MS
- MP = MM + 1
- C-----------------------------------------------------------------------
- C H(K)=(-Z)**(K)*(PSI(K-1,Z)-PSI(K-1,Z+0.5))/GAMMA(K) , K=1,2,...,MM
- C-----------------------------------------------------------------------
- IF (IND.GT.1) GO TO 80
- CALL HKSEQ(Z, MM, H, IERR)
- GO TO 100
- 80 CONTINUE
- RAT = Z/(Z-0.5E0)
- RXP = RAT
- DO 90 I=1,MM
- H(I) = RXP*(1.0E0-H(I))
- RXP = RXP*RAT
- 90 CONTINUE
- 100 CONTINUE
- C-----------------------------------------------------------------------
- C SCALED S SEQUENCE
- C-----------------------------------------------------------------------
- S(1) = 1.0E0
- FK = 1.0E0
- DO 120 K=2,MP
- SS = 0.0E0
- KM = K - 1
- I = KM
- DO 110 J=1,KM
- SS = SS + S(J)*H(I)
- I = I - 1
- 110 CONTINUE
- S(K) = SS/FK
- FK = FK + 1.0E0
- 120 CONTINUE
- C-----------------------------------------------------------------------
- C SCALED S-TILDA SEQUENCE
- C-----------------------------------------------------------------------
- IF (KTRMS.EQ.0) GO TO 160
- FK = 0.0E0
- SS = 0.0E0
- RG1 = RG1/Z
- DO 130 K=1,KTRMS
- V(K) = Z/(Z+FK)
- W(K) = T(K)*V(K)
- SS = SS + W(K)
- FK = FK + 1.0E0
- 130 CONTINUE
- S(1) = S(1) - SS*RG1
- DO 150 I=2,MP
- SS = 0.0E0
- DO 140 K=1,KTRMS
- W(K) = W(K)*V(K)
- SS = SS + W(K)
- 140 CONTINUE
- S(I) = S(I) - SS*RG1
- 150 CONTINUE
- 160 CONTINUE
- C-----------------------------------------------------------------------
- C SUM ON J
- C-----------------------------------------------------------------------
- SUMJ = 0.0E0
- JN = 1
- RXP = 1.0E0
- XP(1) = 1.0E0
- DO 190 J=1,MS
- JN = JN + J - 1
- XP(J+1) = XP(J)*RZX
- RXP = RXP*RZ
- C-----------------------------------------------------------------------
- C SUM ON I
- C-----------------------------------------------------------------------
- SUMI = 0.0E0
- II = JN
- DO 180 I=1,J
- JMI = J - I + 1
- KK = J + I + 1
- DO 170 K=1,JMI
- V(K) = S(KK)*XP(K)
- KK = KK + 1
- 170 CONTINUE
- CALL BDIFF(JMI, V)
- SUMI = SUMI + B(II)*V(JMI)*XP(I+1)
- II = II + 1
- 180 CONTINUE
- SUMJ = SUMJ + SUMI*RXP
- 190 CONTINUE
- ANS = GS*(S(1)-SUMJ)
- RETURN
- 200 CONTINUE
- IERR=2
- RETURN
- END
- *DECK BKISR
- SUBROUTINE BKISR (X, N, SUM, IERR)
- C***BEGIN PROLOGUE BKISR
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to BSKIN
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (BKISR-S, DBKISR-D)
- C***AUTHOR Amos, D. E., (SNLA)
- C***DESCRIPTION
- C
- C BKISR computes repeated integrals of the K0 Bessel function
- C by the series for N=0,1, and 2.
- C
- C***SEE ALSO BSKIN
- C***ROUTINES CALLED PSIXN, R1MACH
- C***REVISION HISTORY (YYMMDD)
- C 820601 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900328 Added TYPE section. (WRB)
- C 910722 Updated AUTHOR section. (ALS)
- C***END PROLOGUE BKISR
- INTEGER I, IERR, K, KK, KKN, K1, N, NP
- REAL AK, ATOL, BK, C, FK, FN, HX, HXS, POL, PR, SUM, TKP, TOL,
- * TRM, X, XLN
- REAL PSIXN, R1MACH
- DIMENSION C(2)
- SAVE C
- C
- DATA C(1), C(2) /1.57079632679489662E+00,1.0E0/
- C***FIRST EXECUTABLE STATEMENT BKISR
- IERR=0
- TOL = MAX(R1MACH(4),1.0E-18)
- IF (X.LT.TOL) GO TO 50
- PR = 1.0E0
- POL = 0.0E0
- IF (N.EQ.0) GO TO 20
- DO 10 I=1,N
- POL = -POL*X + C(I)
- PR = PR*X/I
- 10 CONTINUE
- 20 CONTINUE
- HX = X*0.5E0
- HXS = HX*HX
- XLN = LOG(HX)
- NP = N + 1
- TKP = 3.0E0
- FK = 2.0E0
- FN = N
- BK = 4.0E0
- AK = 2.0E0/((FN+1.0E0)*(FN+2.0E0))
- SUM = AK*(PSIXN(N+3)-PSIXN(3)+PSIXN(2)-XLN)
- ATOL = SUM*TOL*0.75E0
- DO 30 K=2,20
- AK = AK*(HXS/BK)*((TKP+1.0E0)/(TKP+FN+1.0E0))*(TKP/(TKP+FN))
- K1 = K + 1
- KK = K1 + K
- KKN = KK + N
- TRM = (PSIXN(K1)+PSIXN(KKN)-PSIXN(KK)-XLN)*AK
- SUM = SUM + TRM
- IF (ABS(TRM).LE.ATOL) GO TO 40
- TKP = TKP + 2.0E0
- BK = BK + TKP
- FK = FK + 1.0E0
- 30 CONTINUE
- GO TO 80
- 40 CONTINUE
- SUM = (SUM*HXS+PSIXN(NP)-XLN)*PR
- IF (N.EQ.1) SUM = -SUM
- SUM = POL + SUM
- RETURN
- C-----------------------------------------------------------------------
- C SMALL X CASE, X.LT.WORD TOLERANCE
- C-----------------------------------------------------------------------
- 50 CONTINUE
- IF (N.GT.0) GO TO 60
- HX = X*0.5E0
- SUM = PSIXN(1) - LOG(HX)
- RETURN
- 60 CONTINUE
- SUM = C(N)
- RETURN
- 80 CONTINUE
- IERR=2
- RETURN
- END
- *DECK BKSOL
- SUBROUTINE BKSOL (N, A, X)
- C***BEGIN PROLOGUE BKSOL
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to BVSUP
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (BKSOL-S, DBKSOL-D)
- C***AUTHOR Watts, H. A., (SNLA)
- C***DESCRIPTION
- C
- C **********************************************************************
- C Solution of an upper triangular linear system by
- C back-substitution
- C
- C The matrix A is assumed to be stored in a linear
- C array proceeding in a row-wise manner. The
- C vector X contains the given constant vector on input
- C and contains the solution on return.
- C The actual diagonal of A is unity while a diagonal
- C scaling matrix is stored there.
- C **********************************************************************
- C
- C***SEE ALSO BVSUP
- C***ROUTINES CALLED SDOT
- C***REVISION HISTORY (YYMMDD)
- C 750601 DATE WRITTEN
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900328 Added TYPE section. (WRB)
- C 910722 Updated AUTHOR section. (ALS)
- C***END PROLOGUE BKSOL
- C
- DIMENSION A(*),X(*)
- C
- C***FIRST EXECUTABLE STATEMENT BKSOL
- M=(N*(N+1))/2
- X(N)=X(N)*A(M)
- IF (N .EQ. 1) GO TO 20
- NM1=N-1
- DO 10 K=1,NM1
- J=N-K
- M=M-K-1
- 10 X(J)=X(J)*A(M) - SDOT(K,A(M+1),1,X(J+1),1)
- C
- 20 RETURN
- END
- *DECK BLKTR1
- SUBROUTINE BLKTR1 (N, AN, BN, CN, M, AM, BM, CM, IDIMY, Y, B, W1,
- + W2, W3, WD, WW, WU, PRDCT, CPRDCT)
- C***BEGIN PROLOGUE BLKTR1
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to BLKTRI
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (BLKTR1-S, CBLKT1-C)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C BLKTR1 solves the linear system set up by BLKTRI.
- C
- C B contains the roots of all the B polynomials.
- C W1,W2,W3,WD,WW,WU are all working arrays.
- C PRDCT is either PRODP or PROD depending on whether the boundary
- C conditions in the M direction are periodic or not.
- C CPRDCT is either CPRODP or CPROD which are the complex versions
- C of PRODP and PROD. These are called in the event that some
- C of the roots of the B sub P polynomial are complex.
- C
- C***SEE ALSO BLKTRI
- C***ROUTINES CALLED INDXA, INDXB, INDXC
- C***COMMON BLOCKS CBLKT
- C***REVISION HISTORY (YYMMDD)
- C 801001 DATE WRITTEN
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900402 Added TYPE section. (WRB)
- C***END PROLOGUE BLKTR1
- C
- DIMENSION AN(*) ,BN(*) ,CN(*) ,AM(*) ,
- 1 BM(*) ,CM(*) ,B(*) ,W1(*) ,
- 2 W2(*) ,W3(*) ,WD(*) ,WW(*) ,
- 3 WU(*) ,Y(IDIMY,*)
- COMMON /CBLKT/ NPP ,K ,EPS ,CNV ,
- 1 NM ,NCMPLX ,IK
- C***FIRST EXECUTABLE STATEMENT BLKTR1
- KDO = K-1
- DO 109 L=1,KDO
- IR = L-1
- I2 = 2**IR
- I1 = I2/2
- I3 = I2+I1
- I4 = I2+I2
- IRM1 = IR-1
- CALL INDXB (I2,IR,IM2,NM2)
- CALL INDXB (I1,IRM1,IM3,NM3)
- CALL INDXB (I3,IRM1,IM1,NM1)
- CALL PRDCT (NM2,B(IM2),NM3,B(IM3),NM1,B(IM1),0,DUM,Y(1,I2),W3,
- 1 M,AM,BM,CM,WD,WW,WU)
- IF = 2**K
- DO 108 I=I4,IF,I4
- IF (I-NM) 101,101,108
- 101 IPI1 = I+I1
- IPI2 = I+I2
- IPI3 = I+I3
- CALL INDXC (I,IR,IDXC,NC)
- IF (I-IF) 102,108,108
- 102 CALL INDXA (I,IR,IDXA,NA)
- CALL INDXB (I-I1,IRM1,IM1,NM1)
- CALL INDXB (IPI2,IR,IP2,NP2)
- CALL INDXB (IPI1,IRM1,IP1,NP1)
- CALL INDXB (IPI3,IRM1,IP3,NP3)
- CALL PRDCT (NM1,B(IM1),0,DUM,0,DUM,NA,AN(IDXA),W3,W1,M,AM,
- 1 BM,CM,WD,WW,WU)
- IF (IPI2-NM) 105,105,103
- 103 DO 104 J=1,M
- W3(J) = 0.
- W2(J) = 0.
- 104 CONTINUE
- GO TO 106
- 105 CALL PRDCT (NP2,B(IP2),NP1,B(IP1),NP3,B(IP3),0,DUM,
- 1 Y(1,IPI2),W3,M,AM,BM,CM,WD,WW,WU)
- CALL PRDCT (NP1,B(IP1),0,DUM,0,DUM,NC,CN(IDXC),W3,W2,M,AM,
- 1 BM,CM,WD,WW,WU)
- 106 DO 107 J=1,M
- Y(J,I) = W1(J)+W2(J)+Y(J,I)
- 107 CONTINUE
- 108 CONTINUE
- 109 CONTINUE
- IF (NPP) 132,110,132
- C
- C THE PERIODIC CASE IS TREATED USING THE CAPACITANCE MATRIX METHOD
- C
- 110 IF = 2**K
- I = IF/2
- I1 = I/2
- CALL INDXB (I-I1,K-2,IM1,NM1)
- CALL INDXB (I+I1,K-2,IP1,NP1)
- CALL INDXB (I,K-1,IZ,NZ)
- CALL PRDCT (NZ,B(IZ),NM1,B(IM1),NP1,B(IP1),0,DUM,Y(1,I),W1,M,AM,
- 1 BM,CM,WD,WW,WU)
- IZR = I
- DO 111 J=1,M
- W2(J) = W1(J)
- 111 CONTINUE
- DO 113 LL=2,K
- L = K-LL+1
- IR = L-1
- I2 = 2**IR
- I1 = I2/2
- I = I2
- CALL INDXC (I,IR,IDXC,NC)
- CALL INDXB (I,IR,IZ,NZ)
- CALL INDXB (I-I1,IR-1,IM1,NM1)
- CALL INDXB (I+I1,IR-1,IP1,NP1)
- CALL PRDCT (NP1,B(IP1),0,DUM,0,DUM,NC,CN(IDXC),W1,W1,M,AM,BM,
- 1 CM,WD,WW,WU)
- DO 112 J=1,M
- W1(J) = Y(J,I)+W1(J)
- 112 CONTINUE
- CALL PRDCT (NZ,B(IZ),NM1,B(IM1),NP1,B(IP1),0,DUM,W1,W1,M,AM,
- 1 BM,CM,WD,WW,WU)
- 113 CONTINUE
- DO 118 LL=2,K
- L = K-LL+1
- IR = L-1
- I2 = 2**IR
- I1 = I2/2
- I4 = I2+I2
- IFD = IF-I2
- DO 117 I=I2,IFD,I4
- IF (I-I2-IZR) 117,114,117
- 114 IF (I-NM) 115,115,118
- 115 CALL INDXA (I,IR,IDXA,NA)
- CALL INDXB (I,IR,IZ,NZ)
- CALL INDXB (I-I1,IR-1,IM1,NM1)
- CALL INDXB (I+I1,IR-1,IP1,NP1)
- CALL PRDCT (NM1,B(IM1),0,DUM,0,DUM,NA,AN(IDXA),W2,W2,M,AM,
- 1 BM,CM,WD,WW,WU)
- DO 116 J=1,M
- W2(J) = Y(J,I)+W2(J)
- 116 CONTINUE
- CALL PRDCT (NZ,B(IZ),NM1,B(IM1),NP1,B(IP1),0,DUM,W2,W2,M,
- 1 AM,BM,CM,WD,WW,WU)
- IZR = I
- IF (I-NM) 117,119,117
- 117 CONTINUE
- 118 CONTINUE
- 119 DO 120 J=1,M
- Y(J,NM+1) = Y(J,NM+1)-CN(NM+1)*W1(J)-AN(NM+1)*W2(J)
- 120 CONTINUE
- CALL INDXB (IF/2,K-1,IM1,NM1)
- CALL INDXB (IF,K-1,IP,NP)
- IF (NCMPLX) 121,122,121
- 121 CALL CPRDCT (NM+1,B(IP),NM1,B(IM1),0,DUM,0,DUM,Y(1,NM+1),
- 1 Y(1,NM+1),M,AM,BM,CM,W1,W3,WW)
- GO TO 123
- 122 CALL PRDCT (NM+1,B(IP),NM1,B(IM1),0,DUM,0,DUM,Y(1,NM+1),
- 1 Y(1,NM+1),M,AM,BM,CM,WD,WW,WU)
- 123 DO 124 J=1,M
- W1(J) = AN(1)*Y(J,NM+1)
- W2(J) = CN(NM)*Y(J,NM+1)
- Y(J,1) = Y(J,1)-W1(J)
- Y(J,NM) = Y(J,NM)-W2(J)
- 124 CONTINUE
- DO 126 L=1,KDO
- IR = L-1
- I2 = 2**IR
- I4 = I2+I2
- I1 = I2/2
- I = I4
- CALL INDXA (I,IR,IDXA,NA)
- CALL INDXB (I-I2,IR,IM2,NM2)
- CALL INDXB (I-I2-I1,IR-1,IM3,NM3)
- CALL INDXB (I-I1,IR-1,IM1,NM1)
- CALL PRDCT (NM2,B(IM2),NM3,B(IM3),NM1,B(IM1),0,DUM,W1,W1,M,AM,
- 1 BM,CM,WD,WW,WU)
- CALL PRDCT (NM1,B(IM1),0,DUM,0,DUM,NA,AN(IDXA),W1,W1,M,AM,BM,
- 1 CM,WD,WW,WU)
- DO 125 J=1,M
- Y(J,I) = Y(J,I)-W1(J)
- 125 CONTINUE
- 126 CONTINUE
- C
- IZR = NM
- DO 131 L=1,KDO
- IR = L-1
- I2 = 2**IR
- I1 = I2/2
- I3 = I2+I1
- I4 = I2+I2
- IRM1 = IR-1
- DO 130 I=I4,IF,I4
- IPI1 = I+I1
- IPI2 = I+I2
- IPI3 = I+I3
- IF (IPI2-IZR) 127,128,127
- 127 IF (I-IZR) 130,131,130
- 128 CALL INDXC (I,IR,IDXC,NC)
- CALL INDXB (IPI2,IR,IP2,NP2)
- CALL INDXB (IPI1,IRM1,IP1,NP1)
- CALL INDXB (IPI3,IRM1,IP3,NP3)
- CALL PRDCT (NP2,B(IP2),NP1,B(IP1),NP3,B(IP3),0,DUM,W2,W2,M,
- 1 AM,BM,CM,WD,WW,WU)
- CALL PRDCT (NP1,B(IP1),0,DUM,0,DUM,NC,CN(IDXC),W2,W2,M,AM,
- 1 BM,CM,WD,WW,WU)
- DO 129 J=1,M
- Y(J,I) = Y(J,I)-W2(J)
- 129 CONTINUE
- IZR = I
- GO TO 131
- 130 CONTINUE
- 131 CONTINUE
- C
- C BEGIN BACK SUBSTITUTION PHASE
- C
- 132 DO 144 LL=1,K
- L = K-LL+1
- IR = L-1
- IRM1 = IR-1
- I2 = 2**IR
- I1 = I2/2
- I4 = I2+I2
- IFD = IF-I2
- DO 143 I=I2,IFD,I4
- IF (I-NM) 133,133,143
- 133 IMI1 = I-I1
- IMI2 = I-I2
- IPI1 = I+I1
- IPI2 = I+I2
- CALL INDXA (I,IR,IDXA,NA)
- CALL INDXC (I,IR,IDXC,NC)
- CALL INDXB (I,IR,IZ,NZ)
- CALL INDXB (IMI1,IRM1,IM1,NM1)
- CALL INDXB (IPI1,IRM1,IP1,NP1)
- IF (I-I2) 134,134,136
- 134 DO 135 J=1,M
- W1(J) = 0.
- 135 CONTINUE
- GO TO 137
- 136 CALL PRDCT (NM1,B(IM1),0,DUM,0,DUM,NA,AN(IDXA),Y(1,IMI2),
- 1 W1,M,AM,BM,CM,WD,WW,WU)
- 137 IF (IPI2-NM) 140,140,138
- 138 DO 139 J=1,M
- W2(J) = 0.
- 139 CONTINUE
- GO TO 141
- 140 CALL PRDCT (NP1,B(IP1),0,DUM,0,DUM,NC,CN(IDXC),Y(1,IPI2),
- 1 W2,M,AM,BM,CM,WD,WW,WU)
- 141 DO 142 J=1,M
- W1(J) = Y(J,I)+W1(J)+W2(J)
- 142 CONTINUE
- CALL PRDCT (NZ,B(IZ),NM1,B(IM1),NP1,B(IP1),0,DUM,W1,Y(1,I),
- 1 M,AM,BM,CM,WD,WW,WU)
- 143 CONTINUE
- 144 CONTINUE
- RETURN
- END
- *DECK BLKTRI
- SUBROUTINE BLKTRI (IFLG, NP, N, AN, BN, CN, MP, M, AM, BM, CM,
- + IDIMY, Y, IERROR, W)
- C***BEGIN PROLOGUE BLKTRI
- C***PURPOSE Solve a block tridiagonal system of linear equations
- C (usually resulting from the discretization of separable
- C two-dimensional elliptic equations).
- C***LIBRARY SLATEC (FISHPACK)
- C***CATEGORY I2B4B
- C***TYPE SINGLE PRECISION (BLKTRI-S, CBLKTR-C)
- C***KEYWORDS ELLIPTIC PDE, FISHPACK, TRIDIAGONAL LINEAR SYSTEM
- C***AUTHOR Adams, J., (NCAR)
- C Swarztrauber, P. N., (NCAR)
- C Sweet, R., (NCAR)
- C***DESCRIPTION
- C
- C Subroutine BLKTRI Solves a System of Linear Equations of the Form
- C
- C AN(J)*X(I,J-1) + AM(I)*X(I-1,J) + (BN(J)+BM(I))*X(I,J)
- C
- C + CN(J)*X(I,J+1) + CM(I)*X(I+1,J) = Y(I,J)
- C
- C for I = 1,2,...,M and J = 1,2,...,N.
- C
- C I+1 and I-1 are evaluated modulo M and J+1 and J-1 modulo N, i.e.,
- C
- C X(I,0) = X(I,N), X(I,N+1) = X(I,1),
- C X(0,J) = X(M,J), X(M+1,J) = X(1,J).
- C
- C These equations usually result from the discretization of
- C separable elliptic equations. Boundary conditions may be
- C Dirichlet, Neumann, or Periodic.
- C
- C
- C * * * * * * * * * * ON INPUT * * * * * * * * * *
- C
- C IFLG
- C = 0 Initialization only. Certain quantities that depend on NP,
- C N, AN, BN, and CN are computed and stored in the work
- C array W.
- C = 1 The quantities that were computed in the initialization are
- C used to obtain the solution X(I,J).
- C
- C NOTE A call with IFLG=0 takes approximately one half the time
- C as a call with IFLG = 1 . However, the
- C initialization does not have to be repeated unless NP, N,
- C AN, BN, or CN change.
- C
- C NP
- C = 0 If AN(1) and CN(N) are not zero, which corresponds to
- C periodic boundary conditions.
- C = 1 If AN(1) and CN(N) are zero.
- C
- C N
- C The number of unknowns in the J-direction. N must be greater
- C than 4. The operation count is proportional to MNlog2(N), hence
- C N should be selected less than or equal to M.
- C
- C AN,BN,CN
- C One-dimensional arrays of length N that specify the coefficients
- C in the linear equations given above.
- C
- C MP
- C = 0 If AM(1) and CM(M) are not zero, which corresponds to
- C periodic boundary conditions.
- C = 1 If AM(1) = CM(M) = 0 .
- C
- C M
- C The number of unknowns in the I-direction. M must be greater
- C than 4.
- C
- C AM,BM,CM
- C One-dimensional arrays of length M that specify the coefficients
- C in the linear equations given above.
- C
- C IDIMY
- C The row (or first) dimension of the two-dimensional array Y as
- C it appears in the program calling BLKTRI. This parameter is
- C used to specify the variable dimension of Y. IDIMY must be at
- C least M.
- C
- C Y
- C A two-dimensional array that specifies the values of the right
- C side of the linear system of equations given above. Y must be
- C dimensioned at least M*N.
- C
- C W
- C A one-dimensional array that must be provided by the user for
- C work space.
- C If NP=1 define K=INT(log2(N))+1 and set L=2**(K+1) then
- C W must have dimension (K-2)*L+K+5+MAX(2N,6M)
- C
- C If NP=0 define K=INT(log2(N-1))+1 and set L=2**(K+1) then
- C W must have dimension (K-2)*L+K+5+2N+MAX(2N,6M)
- C
- C **IMPORTANT** For purposes of checking, the required dimension
- C of W is computed by BLKTRI and stored in W(1)
- C in floating point format.
- C
- C * * * * * * * * * * On Output * * * * * * * * * *
- C
- C Y
- C Contains the solution X.
- C
- C IERROR
- C An error flag that indicates invalid input parameters. Except
- C for number zero, a solution is not attempted.
- C
- C = 0 No error.
- C = 1 M is less than 5.
- C = 2 N is less than 5.
- C = 3 IDIMY is less than M.
- C = 4 BLKTRI failed while computing results that depend on the
- C coefficient arrays AN, BN, CN. Check these arrays.
- C = 5 AN(J)*CN(J-1) is less than 0 for some J. Possible reasons
- C for this condition are
- C 1. The arrays AN and CN are not correct.
- C 2. Too large a grid spacing was used in the discretization
- C of the elliptic equation.
- C 3. The linear equations resulted from a partial
- C differential equation which was not elliptic.
- C
- C W
- C Contains intermediate values that must not be destroyed if
- C BLKTRI will be called again with IFLG=1. W(1) contains the
- C number of locations required by W in floating point format.
- C
- C *Long Description:
- C
- C * * * * * * * Program Specifications * * * * * * * * * * * *
- C
- C Dimension of AN(N),BN(N),CN(N),AM(M),BM(M),CM(M),Y(IDIMY,N)
- C Arguments W(See argument list)
- C
- C Latest June 1979
- C Revision
- C
- C Required BLKTRI,BLKTRI,PROD,PRODP,CPROD,CPRODP,COMPB,INDXA,
- C Subprograms INDXB,INDXC,PPADD,PSGF,PPSGF,PPSPF,BSRH,TEVLS,
- C R1MACH
- C
- C Special The Algorithm may fail if ABS(BM(I)+BN(J)) is less
- C Conditions than ABS(AM(I))+ABS(AN(J))+ABS(CM(I))+ABS(CN(J))
- C for some I and J. The Algorithm will also fail if
- C AN(J)*CN(J-1) is less than zero for some J.
- C See the description of the output parameter IERROR.
- C
- C Common CBLKT
- C Blocks
- C
- C I/O None
- C
- C Precision Single
- C
- C Specialist Paul Swarztrauber
- C
- C Language FORTRAN
- C
- C History Version 1 September 1973
- C Version 2 April 1976
- C Version 3 June 1979
- C
- C Algorithm Generalized Cyclic Reduction (See Reference below)
- C
- C Space
- C Required Control Data 7600
- C
- C Portability American National Standards Institute Fortran.
- C The machine accuracy is set using function R1MACH.
- C
- C Required None
- C Resident
- C Routines
- C
- C References Swarztrauber,P. and R. Sweet, 'Efficient FORTRAN
- C Subprograms For The Solution Of Elliptic Equations'
- C NCAR TN/IA-109, July, 1975, 138 PP.
- C
- C Swarztrauber P. ,'A Direct Method For The Discrete
- C Solution Of Separable Elliptic Equations', S.I.A.M.
- C J. Numer. Anal.,11(1974) PP. 1136-1150.
- C
- C***REFERENCES P. N. Swarztrauber and R. Sweet, Efficient Fortran
- C subprograms for the solution of elliptic equations,
- C NCAR TN/IA-109, July 1975, 138 pp.
- C P. N. Swarztrauber, A direct method for the discrete
- C solution of separable elliptic equations, SIAM Journal
- C on Numerical Analysis 11, (1974), pp. 1136-1150.
- C***ROUTINES CALLED BLKTR1, COMPB, CPROD, CPRODP, PROD, PRODP
- C***COMMON BLOCKS CBLKT
- C***REVISION HISTORY (YYMMDD)
- C 801001 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE BLKTRI
- C
- DIMENSION AN(*) ,BN(*) ,CN(*) ,AM(*) ,
- 1 BM(*) ,CM(*) ,Y(IDIMY,*) ,W(*)
- EXTERNAL PROD ,PRODP ,CPROD ,CPRODP
- COMMON /CBLKT/ NPP ,K ,EPS ,CNV ,
- 1 NM ,NCMPLX ,IK
- C***FIRST EXECUTABLE STATEMENT BLKTRI
- NM = N
- IERROR = 0
- IF (M-5) 101,102,102
- 101 IERROR = 1
- GO TO 119
- 102 IF (NM-3) 103,104,104
- 103 IERROR = 2
- GO TO 119
- 104 IF (IDIMY-M) 105,106,106
- 105 IERROR = 3
- GO TO 119
- 106 NH = N
- NPP = NP
- IF (NPP) 107,108,107
- 107 NH = NH+1
- 108 IK = 2
- K = 1
- 109 IK = IK+IK
- K = K+1
- IF (NH-IK) 110,110,109
- 110 NL = IK
- IK = IK+IK
- NL = NL-1
- IWAH = (K-2)*IK+K+6
- IF (NPP) 111,112,111
- C
- C DIVIDE W INTO WORKING SUB ARRAYS
- C
- 111 IW1 = IWAH
- IWBH = IW1+NM
- W(1) = IW1-1+MAX(2*NM,6*M)
- GO TO 113
- 112 IWBH = IWAH+NM+NM
- IW1 = IWBH
- W(1) = IW1-1+MAX(2*NM,6*M)
- NM = NM-1
- C
- C SUBROUTINE COMP B COMPUTES THE ROOTS OF THE B POLYNOMIALS
- C
- 113 IF (IERROR) 119,114,119
- 114 IW2 = IW1+M
- IW3 = IW2+M
- IWD = IW3+M
- IWW = IWD+M
- IWU = IWW+M
- IF (IFLG) 116,115,116
- 115 CALL COMPB (NL,IERROR,AN,BN,CN,W(2),W(IWAH),W(IWBH))
- GO TO 119
- 116 IF (MP) 117,118,117
- C
- C SUBROUTINE BLKTR1 SOLVES THE LINEAR SYSTEM
- C
- 117 CALL BLKTR1 (NL,AN,BN,CN,M,AM,BM,CM,IDIMY,Y,W(2),W(IW1),W(IW2),
- 1 W(IW3),W(IWD),W(IWW),W(IWU),PROD,CPROD)
- GO TO 119
- 118 CALL BLKTR1 (NL,AN,BN,CN,M,AM,BM,CM,IDIMY,Y,W(2),W(IW1),W(IW2),
- 1 W(IW3),W(IWD),W(IWW),W(IWU),PRODP,CPRODP)
- 119 CONTINUE
- RETURN
- END
- *DECK BNDACC
- SUBROUTINE BNDACC (G, MDG, NB, IP, IR, MT, JT)
- C***BEGIN PROLOGUE BNDACC
- C***PURPOSE Compute the LU factorization of a banded matrices using
- C sequential accumulation of rows of the data matrix.
- C Exactly one right-hand side vector is permitted.
- C***LIBRARY SLATEC
- C***CATEGORY D9
- C***TYPE SINGLE PRECISION (BNDACC-S, DBNDAC-D)
- C***KEYWORDS BANDED MATRIX, CURVE FITTING, LEAST SQUARES
- C***AUTHOR Lawson, C. L., (JPL)
- C Hanson, R. J., (SNLA)
- C***DESCRIPTION
- C
- C These subroutines solve the least squares problem Ax = b for
- C banded matrices A using sequential accumulation of rows of the
- C data matrix. Exactly one right-hand side vector is permitted.
- C
- C These subroutines are intended for the type of least squares
- C systems that arise in applications such as curve or surface
- C fitting of data. The least squares equations are accumulated and
- C processed using only part of the data. This requires a certain
- C user interaction during the solution of Ax = b.
- C
- C Specifically, suppose the data matrix (A B) is row partitioned
- C into Q submatrices. Let (E F) be the T-th one of these
- C submatrices where E = (0 C 0). Here the dimension of E is MT by N
- C and the dimension of C is MT by NB. The value of NB is the
- C bandwidth of A. The dimensions of the leading block of zeros in E
- C are MT by JT-1.
- C
- C The user of the subroutine BNDACC provides MT,JT,C and F for
- C T=1,...,Q. Not all of this data must be supplied at once.
- C
- C Following the processing of the various blocks (E F), the matrix
- C (A B) has been transformed to the form (R D) where R is upper
- C triangular and banded with bandwidth NB. The least squares
- C system Rx = d is then easily solved using back substitution by
- C executing the statement CALL BNDSOL(1,...). The sequence of
- C values for JT must be nondecreasing. This may require some
- C preliminary interchanges of rows and columns of the matrix A.
- C
- C The primary reason for these subroutines is that the total
- C processing can take place in a working array of dimension MU by
- C NB+1. An acceptable value for MU is
- C
- C MU = MAX(MT + N + 1),
- C
- C where N is the number of unknowns.
- C
- C Here the maximum is taken over all values of MT for T=1,...,Q.
- C Notice that MT can be taken to be a small as one, showing that
- C MU can be as small as N+2. The subprogram BNDACC processes the
- C rows more efficiently if MU is large enough so that each new
- C block (C F) has a distinct value of JT.
- C
- C The four principle parts of these algorithms are obtained by the
- C following call statements
- C
- C CALL BNDACC(...) Introduce new blocks of data.
- C
- C CALL BNDSOL(1,...)Compute solution vector and length of
- C residual vector.
- C
- C CALL BNDSOL(2,...)Given any row vector H solve YR = H for the
- C row vector Y.
- C
- C CALL BNDSOL(3,...)Given any column vector W solve RZ = W for
- C the column vector Z.
- C
- C The dots in the above call statements indicate additional
- C arguments that will be specified in the following paragraphs.
- C
- C The user must dimension the array appearing in the call list..
- C G(MDG,NB+1)
- C
- C Description of calling sequence for BNDACC..
- C
- C The entire set of parameters for BNDACC are
- C
- C Input..
- C
- C G(*,*) The working array into which the user will
- C place the MT by NB+1 block (C F) in rows IR
- C through IR+MT-1, columns 1 through NB+1.
- C See descriptions of IR and MT below.
- C
- C MDG The number of rows in the working array
- C G(*,*). The value of MDG should be .GE. MU.
- C The value of MU is defined in the abstract
- C of these subprograms.
- C
- C NB The bandwidth of the data matrix A.
- C
- C IP Set by the user to the value 1 before the
- C first call to BNDACC. Its subsequent value
- C is controlled by BNDACC to set up for the
- C next call to BNDACC.
- C
- C IR Index of the row of G(*,*) where the user is
- C to place the new block of data (C F). Set by
- C the user to the value 1 before the first call
- C to BNDACC. Its subsequent value is controlled
- C by BNDACC. A value of IR .GT. MDG is considered
- C an error.
- C
- C MT,JT Set by the user to indicate respectively the
- C number of new rows of data in the block and
- C the index of the first nonzero column in that
- C set of rows (E F) = (0 C 0 F) being processed.
- C
- C Output..
- C
- C G(*,*) The working array which will contain the
- C processed rows of that part of the data
- C matrix which has been passed to BNDACC.
- C
- C IP,IR The values of these arguments are advanced by
- C BNDACC to be ready for storing and processing
- C a new block of data in G(*,*).
- C
- C Description of calling sequence for BNDSOL..
- C
- C The user must dimension the arrays appearing in the call list..
- C
- C G(MDG,NB+1), X(N)
- C
- C The entire set of parameters for BNDSOL are
- C
- C Input..
- C
- C MODE Set by the user to one of the values 1, 2, or
- C 3. These values respectively indicate that
- C the solution of AX = B, YR = H or RZ = W is
- C required.
- C
- C G(*,*),MDG, These arguments all have the same meaning and
- C NB,IP,IR contents as following the last call to BNDACC.
- C
- C X(*) With mode=2 or 3 this array contains,
- C respectively, the right-side vectors H or W of
- C the systems YR = H or RZ = W.
- C
- C N The number of variables in the solution
- C vector. If any of the N diagonal terms are
- C zero the subroutine BNDSOL prints an
- C appropriate message. This condition is
- C considered an error.
- C
- C Output..
- C
- C X(*) This array contains the solution vectors X,
- C Y or Z of the systems AX = B, YR = H or
- C RZ = W depending on the value of MODE=1,
- C 2 or 3.
- C
- C RNORM If MODE=1 RNORM is the Euclidean length of the
- C residual vector AX-B. When MODE=2 or 3 RNORM
- C is set to zero.
- C
- C Remarks..
- C
- C To obtain the upper triangular matrix and transformed right-hand
- C side vector D so that the super diagonals of R form the columns
- C of G(*,*), execute the following Fortran statements.
- C
- C NBP1=NB+1
- C
- C DO 10 J=1, NBP1
- C
- C 10 G(IR,J) = 0.E0
- C
- C MT=1
- C
- C JT=N+1
- C
- C CALL BNDACC(G,MDG,NB,IP,IR,MT,JT)
- C
- C***REFERENCES C. L. Lawson and R. J. Hanson, Solving Least Squares
- C Problems, Prentice-Hall, Inc., 1974, Chapter 27.
- C***ROUTINES CALLED H12, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 790101 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 891006 Cosmetic changes to prologue. (WRB)
- C 891006 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 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE BNDACC
- DIMENSION G(MDG,*)
- C***FIRST EXECUTABLE STATEMENT BNDACC
- ZERO=0.
- C
- C ALG. STEPS 1-4 ARE PERFORMED EXTERNAL TO THIS SUBROUTINE.
- C
- NBP1=NB+1
- IF (MT.LE.0.OR.NB.LE.0) RETURN
- C
- IF(.NOT.MDG.LT.IR) GO TO 5
- NERR=1
- IOPT=2
- CALL XERMSG ('SLATEC', 'BNDACC', 'MDG.LT.IR, PROBABLE ERROR.',
- + NERR, IOPT)
- RETURN
- 5 CONTINUE
- C
- C ALG. STEP 5
- IF (JT.EQ.IP) GO TO 70
- C ALG. STEPS 6-7
- IF (JT.LE.IR) GO TO 30
- C ALG. STEPS 8-9
- DO 10 I=1,MT
- IG1=JT+MT-I
- IG2=IR+MT-I
- DO 10 J=1,NBP1
- G(IG1,J)=G(IG2,J)
- 10 CONTINUE
- C ALG. STEP 10
- IE=JT-IR
- DO 20 I=1,IE
- IG=IR+I-1
- DO 20 J=1,NBP1
- G(IG,J)=ZERO
- 20 CONTINUE
- C ALG. STEP 11
- IR=JT
- C ALG. STEP 12
- 30 MU=MIN(NB-1,IR-IP-1)
- IF (MU.EQ.0) GO TO 60
- C ALG. STEP 13
- DO 50 L=1,MU
- C ALG. STEP 14
- K=MIN(L,JT-IP)
- C ALG. STEP 15
- LP1=L+1
- IG=IP+L
- DO 40 I=LP1,NB
- JG=I-K
- G(IG,JG)=G(IG,I)
- 40 CONTINUE
- C ALG. STEP 16
- DO 50 I=1,K
- JG=NBP1-I
- G(IG,JG)=ZERO
- 50 CONTINUE
- C ALG. STEP 17
- 60 IP=JT
- C ALG. STEPS 18-19
- 70 MH=IR+MT-IP
- KH=MIN(NBP1,MH)
- C ALG. STEP 20
- DO 80 I=1,KH
- CALL H12 (1,I,MAX(I+1,IR-IP+1),MH,G(IP,I),1,RHO,
- 1 G(IP,I+1),1,MDG,NBP1-I)
- 80 CONTINUE
- C ALG. STEP 21
- IR=IP+KH
- C ALG. STEP 22
- IF (KH.LT.NBP1) GO TO 100
- C ALG. STEP 23
- DO 90 I=1,NB
- G(IR-1,I)=ZERO
- 90 CONTINUE
- C ALG. STEP 24
- 100 CONTINUE
- C ALG. STEP 25
- RETURN
- END
- *DECK BNDSOL
- SUBROUTINE BNDSOL (MODE, G, MDG, NB, IP, IR, X, N, RNORM)
- C***BEGIN PROLOGUE BNDSOL
- C***PURPOSE Solve the least squares problem for a banded matrix using
- C sequential accumulation of rows of the data matrix.
- C Exactly one right-hand side vector is permitted.
- C***LIBRARY SLATEC
- C***CATEGORY D9
- C***TYPE SINGLE PRECISION (BNDSOL-S, DBNDSL-D)
- C***KEYWORDS BANDED MATRIX, CURVE FITTING, LEAST SQUARES
- C***AUTHOR Lawson, C. L., (JPL)
- C Hanson, R. J., (SNLA)
- C***DESCRIPTION
- C
- C These subroutines solve the least squares problem Ax = b for
- C banded matrices A using sequential accumulation of rows of the
- C data matrix. Exactly one right-hand side vector is permitted.
- C
- C These subroutines are intended for the type of least squares
- C systems that arise in applications such as curve or surface
- C fitting of data. The least squares equations are accumulated and
- C processed using only part of the data. This requires a certain
- C user interaction during the solution of Ax = b.
- C
- C Specifically, suppose the data matrix (A B) is row partitioned
- C into Q submatrices. Let (E F) be the T-th one of these
- C submatrices where E = (0 C 0). Here the dimension of E is MT by N
- C and the dimension of C is MT by NB. The value of NB is the
- C bandwidth of A. The dimensions of the leading block of zeros in E
- C are MT by JT-1.
- C
- C The user of the subroutine BNDACC provides MT,JT,C and F for
- C T=1,...,Q. Not all of this data must be supplied at once.
- C
- C Following the processing of the various blocks (E F), the matrix
- C (A B) has been transformed to the form (R D) where R is upper
- C triangular and banded with bandwidth NB. The least squares
- C system Rx = d is then easily solved using back substitution by
- C executing the statement CALL BNDSOL(1,...). The sequence of
- C values for JT must be nondecreasing. This may require some
- C preliminary interchanges of rows and columns of the matrix A.
- C
- C The primary reason for these subroutines is that the total
- C processing can take place in a working array of dimension MU by
- C NB+1. An acceptable value for MU is
- C
- C MU = MAX(MT + N + 1),
- C
- C where N is the number of unknowns.
- C
- C Here the maximum is taken over all values of MT for T=1,...,Q.
- C Notice that MT can be taken to be a small as one, showing that
- C MU can be as small as N+2. The subprogram BNDACC processes the
- C rows more efficiently if MU is large enough so that each new
- C block (C F) has a distinct value of JT.
- C
- C The four principle parts of these algorithms are obtained by the
- C following call statements
- C
- C CALL BNDACC(...) Introduce new blocks of data.
- C
- C CALL BNDSOL(1,...)Compute solution vector and length of
- C residual vector.
- C
- C CALL BNDSOL(2,...)Given any row vector H solve YR = H for the
- C row vector Y.
- C
- C CALL BNDSOL(3,...)Given any column vector W solve RZ = W for
- C the column vector Z.
- C
- C The dots in the above call statements indicate additional
- C arguments that will be specified in the following paragraphs.
- C
- C The user must dimension the array appearing in the call list..
- C G(MDG,NB+1)
- C
- C Description of calling sequence for BNDACC..
- C
- C The entire set of parameters for BNDACC are
- C
- C Input..
- C
- C G(*,*) The working array into which the user will
- C place the MT by NB+1 block (C F) in rows IR
- C through IR+MT-1, columns 1 through NB+1.
- C See descriptions of IR and MT below.
- C
- C MDG The number of rows in the working array
- C G(*,*). The value of MDG should be .GE. MU.
- C The value of MU is defined in the abstract
- C of these subprograms.
- C
- C NB The bandwidth of the data matrix A.
- C
- C IP Set by the user to the value 1 before the
- C first call to BNDACC. Its subsequent value
- C is controlled by BNDACC to set up for the
- C next call to BNDACC.
- C
- C IR Index of the row of G(*,*) where the user is
- C the user to the value 1 before the first call
- C to BNDACC. Its subsequent value is controlled
- C by BNDACC. A value of IR .GT. MDG is considered
- C an error.
- C
- C MT,JT Set by the user to indicate respectively the
- C number of new rows of data in the block and
- C the index of the first nonzero column in that
- C set of rows (E F) = (0 C 0 F) being processed.
- C Output..
- C
- C G(*,*) The working array which will contain the
- C processed rows of that part of the data
- C matrix which has been passed to BNDACC.
- C
- C IP,IR The values of these arguments are advanced by
- C BNDACC to be ready for storing and processing
- C a new block of data in G(*,*).
- C
- C Description of calling sequence for BNDSOL..
- C
- C The user must dimension the arrays appearing in the call list..
- C
- C G(MDG,NB+1), X(N)
- C
- C The entire set of parameters for BNDSOL are
- C
- C Input..
- C
- C MODE Set by the user to one of the values 1, 2, or
- C 3. These values respectively indicate that
- C the solution of AX = B, YR = H or RZ = W is
- C required.
- C
- C G(*,*),MDG, These arguments all have the same meaning and
- C NB,IP,IR contents as following the last call to BNDACC.
- C
- C X(*) With mode=2 or 3 this array contains,
- C respectively, the right-side vectors H or W of
- C the systems YR = H or RZ = W.
- C
- C N The number of variables in the solution
- C vector. If any of the N diagonal terms are
- C zero the subroutine BNDSOL prints an
- C appropriate message. This condition is
- C considered an error.
- C
- C Output..
- C
- C X(*) This array contains the solution vectors X,
- C Y or Z of the systems AX = B, YR = H or
- C RZ = W depending on the value of MODE=1,
- C 2 or 3.
- C
- C RNORM If MODE=1 RNORM is the Euclidean length of the
- C residual vector AX-B. When MODE=2 or 3 RNORM
- C is set to zero.
- C
- C Remarks..
- C
- C To obtain the upper triangular matrix and transformed right-hand
- C side vector D so that the super diagonals of R form the columns
- C of G(*,*), execute the following Fortran statements.
- C
- C NBP1=NB+1
- C
- C DO 10 J=1, NBP1
- C
- C 10 G(IR,J) = 0.E0
- C
- C MT=1
- C
- C JT=N+1
- C
- C CALL BNDACC(G,MDG,NB,IP,IR,MT,JT)
- C
- C***REFERENCES C. L. Lawson and R. J. Hanson, Solving Least Squares
- C Problems, Prentice-Hall, Inc., 1974, Chapter 27.
- C***ROUTINES CALLED XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 790101 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 891006 Cosmetic changes to prologue. (WRB)
- C 891006 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 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE BNDSOL
- DIMENSION G(MDG,*),X(*)
- C***FIRST EXECUTABLE STATEMENT BNDSOL
- ZERO=0.
- C
- RNORM=ZERO
- GO TO (10,90,50), MODE
- C ********************* MODE = 1
- C ALG. STEP 26
- 10 DO 20 J=1,N
- X(J)=G(J,NB+1)
- 20 CONTINUE
- RSQ=ZERO
- NP1=N+1
- IRM1=IR-1
- IF (NP1.GT.IRM1) GO TO 40
- DO 30 J=NP1,IRM1
- RSQ=RSQ+G(J,NB+1)**2
- 30 CONTINUE
- RNORM=SQRT(RSQ)
- 40 CONTINUE
- C ********************* MODE = 3
- C ALG. STEP 27
- 50 DO 80 II=1,N
- I=N+1-II
- C ALG. STEP 28
- S=ZERO
- L=MAX(0,I-IP)
- C ALG. STEP 29
- IF (I.EQ.N) GO TO 70
- C ALG. STEP 30
- IE=MIN(N+1-I,NB)
- DO 60 J=2,IE
- JG=J+L
- IX=I-1+J
- S=S+G(I,JG)*X(IX)
- 60 CONTINUE
- C ALG. STEP 31
- 70 IF (G(I,L+1)) 80,130,80
- 80 X(I)=(X(I)-S)/G(I,L+1)
- C ALG. STEP 32
- RETURN
- C ********************* MODE = 2
- 90 DO 120 J=1,N
- S=ZERO
- IF (J.EQ.1) GO TO 110
- I1=MAX(1,J-NB+1)
- I2=J-1
- DO 100 I=I1,I2
- L=J-I+1+MAX(0,I-IP)
- S=S+X(I)*G(I,L)
- 100 CONTINUE
- 110 L=MAX(0,J-IP)
- IF (G(J,L+1)) 120,130,120
- 120 X(J)=(X(J)-S)/G(J,L+1)
- RETURN
- C
- 130 CONTINUE
- NERR=1
- IOPT=2
- CALL XERMSG ('SLATEC', 'BNDSOL',
- + 'A ZERO DIAGONAL TERM IS IN THE N BY N UPPER TRIANGULAR ' //
- + 'MATRIX.', NERR, IOPT)
- RETURN
- END
- *DECK BNFAC
- SUBROUTINE BNFAC (W, NROWW, NROW, NBANDL, NBANDU, IFLAG)
- C***BEGIN PROLOGUE BNFAC
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to BINT4 and BINTK
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (BNFAC-S, DBNFAC-D)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C BNFAC is the BANFAC routine from
- C * A Practical Guide to Splines * by C. de Boor
- C
- C Returns in W the lu-factorization (without pivoting) of the banded
- C matrix A of order NROW with (NBANDL + 1 + NBANDU) bands or diag-
- C onals in the work array W .
- C
- C ***** I N P U T ******
- C W.....Work array of size (NROWW,NROW) containing the interesting
- C part of a banded matrix A , with the diagonals or bands of A
- C stored in the rows of W , while columns of A correspond to
- C columns of W . This is the storage mode used in LINPACK and
- C results in efficient innermost loops.
- C Explicitly, A has NBANDL bands below the diagonal
- C + 1 (main) diagonal
- C + NBANDU bands above the diagonal
- C and thus, with MIDDLE = NBANDU + 1,
- C A(I+J,J) is in W(I+MIDDLE,J) for I=-NBANDU,...,NBANDL
- C J=1,...,NROW .
- C For example, the interesting entries of A (1,2)-banded matrix
- C of order 9 would appear in the first 1+1+2 = 4 rows of W
- C as follows.
- C 13 24 35 46 57 68 79
- C 12 23 34 45 56 67 78 89
- C 11 22 33 44 55 66 77 88 99
- C 21 32 43 54 65 76 87 98
- C
- C All other entries of W not identified in this way with an en-
- C try of A are never referenced .
- C NROWW.....Row dimension of the work array W .
- C must be .GE. NBANDL + 1 + NBANDU .
- C NBANDL.....Number of bands of A below the main diagonal
- C NBANDU.....Number of bands of A above the main diagonal .
- C
- C ***** O U T P U T ******
- C IFLAG.....Integer indicating success( = 1) or failure ( = 2) .
- C If IFLAG = 1, then
- C W.....contains the LU-factorization of A into a unit lower triangu-
- C lar matrix L and an upper triangular matrix U (both banded)
- C and stored in customary fashion over the corresponding entries
- C of A . This makes it possible to solve any particular linear
- C system A*X = B for X by A
- C CALL BNSLV ( W, NROWW, NROW, NBANDL, NBANDU, B )
- C with the solution X contained in B on return .
- C If IFLAG = 2, then
- C one of NROW-1, NBANDL,NBANDU failed to be nonnegative, or else
- C one of the potential pivots was found to be zero indicating
- C that A does not have an LU-factorization. This implies that
- C A is singular in case it is totally positive .
- C
- C ***** M E T H O D ******
- C Gauss elimination W I T H O U T pivoting is used. The routine is
- C intended for use with matrices A which do not require row inter-
- C changes during factorization, especially for the T O T A L L Y
- C P O S I T I V E matrices which occur in spline calculations.
- C The routine should not be used for an arbitrary banded matrix.
- C
- C***SEE ALSO BINT4, BINTK
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 800901 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900328 Added TYPE section. (WRB)
- C***END PROLOGUE BNFAC
- C
- INTEGER IFLAG, NBANDL, NBANDU, NROW, NROWW, I, IPK, J, JMAX, K,
- 1 KMAX, MIDDLE, MIDMK, NROWM1
- REAL W(NROWW,*), FACTOR, PIVOT
- C
- C***FIRST EXECUTABLE STATEMENT BNFAC
- IFLAG = 1
- MIDDLE = NBANDU + 1
- C W(MIDDLE,.) CONTAINS THE MAIN DIAGONAL OF A .
- NROWM1 = NROW - 1
- IF (NROWM1) 120, 110, 10
- 10 IF (NBANDL.GT.0) GO TO 30
- C A IS UPPER TRIANGULAR. CHECK THAT DIAGONAL IS NONZERO .
- DO 20 I=1,NROWM1
- IF (W(MIDDLE,I).EQ.0.0E0) GO TO 120
- 20 CONTINUE
- GO TO 110
- 30 IF (NBANDU.GT.0) GO TO 60
- C A IS LOWER TRIANGULAR. CHECK THAT DIAGONAL IS NONZERO AND
- C DIVIDE EACH COLUMN BY ITS DIAGONAL .
- DO 50 I=1,NROWM1
- PIVOT = W(MIDDLE,I)
- IF (PIVOT.EQ.0.0E0) GO TO 120
- JMAX = MIN(NBANDL,NROW-I)
- DO 40 J=1,JMAX
- W(MIDDLE+J,I) = W(MIDDLE+J,I)/PIVOT
- 40 CONTINUE
- 50 CONTINUE
- RETURN
- C
- C A IS NOT JUST A TRIANGULAR MATRIX. CONSTRUCT LU FACTORIZATION
- 60 DO 100 I=1,NROWM1
- C W(MIDDLE,I) IS PIVOT FOR I-TH STEP .
- PIVOT = W(MIDDLE,I)
- IF (PIVOT.EQ.0.0E0) GO TO 120
- C JMAX IS THE NUMBER OF (NONZERO) ENTRIES IN COLUMN I
- C BELOW THE DIAGONAL .
- JMAX = MIN(NBANDL,NROW-I)
- C DIVIDE EACH ENTRY IN COLUMN I BELOW DIAGONAL BY PIVOT .
- DO 70 J=1,JMAX
- W(MIDDLE+J,I) = W(MIDDLE+J,I)/PIVOT
- 70 CONTINUE
- C KMAX IS THE NUMBER OF (NONZERO) ENTRIES IN ROW I TO
- C THE RIGHT OF THE DIAGONAL .
- KMAX = MIN(NBANDU,NROW-I)
- C SUBTRACT A(I,I+K)*(I-TH COLUMN) FROM (I+K)-TH COLUMN
- C (BELOW ROW I ) .
- DO 90 K=1,KMAX
- IPK = I + K
- MIDMK = MIDDLE - K
- FACTOR = W(MIDMK,IPK)
- DO 80 J=1,JMAX
- W(MIDMK+J,IPK) = W(MIDMK+J,IPK) - W(MIDDLE+J,I)*FACTOR
- 80 CONTINUE
- 90 CONTINUE
- 100 CONTINUE
- C CHECK THE LAST DIAGONAL ENTRY .
- 110 IF (W(MIDDLE,NROW).NE.0.0E0) RETURN
- 120 IFLAG = 2
- RETURN
- END
- *DECK BNSLV
- SUBROUTINE BNSLV (W, NROWW, NROW, NBANDL, NBANDU, B)
- C***BEGIN PROLOGUE BNSLV
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to BINT4 and BINTK
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (BNSLV-S, DBNSLV-D)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C BNSLV is the BANSLV routine from
- C * A Practical Guide to Splines * by C. de Boor
- C
- C Companion routine to BNFAC . It returns the solution X of the
- C linear system A*X = B in place of B , given the LU-factorization
- C for A in the work array W from BNFAC.
- C
- C ***** I N P U T ******
- C W, NROWW,NROW,NBANDL,NBANDU.....Describe the LU-factorization of a
- C banded matrix A of order NROW as constructed in BNFAC .
- C For details, see BNFAC .
- C B.....Right side of the system to be solved .
- C
- C ***** O U T P U T ******
- C B.....Contains the solution X , of order NROW .
- C
- C ***** M E T H O D ******
- C (With A = L*U, as stored in W,) the unit lower triangular system
- C L(U*X) = B is solved for Y = U*X, and Y stored in B . Then the
- C upper triangular system U*X = Y is solved for X . The calcul-
- C ations are so arranged that the innermost loops stay within columns.
- C
- C***SEE ALSO BINT4, BINTK
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 800901 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900328 Added TYPE section. (WRB)
- C***END PROLOGUE BNSLV
- C
- INTEGER NBANDL, NBANDU, NROW, NROWW, I, J, JMAX, MIDDLE, NROWM1
- REAL W(NROWW,*), B(*)
- C***FIRST EXECUTABLE STATEMENT BNSLV
- MIDDLE = NBANDU + 1
- IF (NROW.EQ.1) GO TO 80
- NROWM1 = NROW - 1
- IF (NBANDL.EQ.0) GO TO 30
- C FORWARD PASS
- C FOR I=1,2,...,NROW-1, SUBTRACT RIGHT SIDE(I)*(I-TH COLUMN
- C OF L ) FROM RIGHT SIDE (BELOW I-TH ROW) .
- DO 20 I=1,NROWM1
- JMAX = MIN(NBANDL,NROW-I)
- DO 10 J=1,JMAX
- B(I+J) = B(I+J) - B(I)*W(MIDDLE+J,I)
- 10 CONTINUE
- 20 CONTINUE
- C BACKWARD PASS
- C FOR I=NROW,NROW-1,...,1, DIVIDE RIGHT SIDE(I) BY I-TH DIAG-
- C ONAL ENTRY OF U, THEN SUBTRACT RIGHT SIDE(I)*(I-TH COLUMN
- C OF U) FROM RIGHT SIDE (ABOVE I-TH ROW).
- 30 IF (NBANDU.GT.0) GO TO 50
- C A IS LOWER TRIANGULAR .
- DO 40 I=1,NROW
- B(I) = B(I)/W(1,I)
- 40 CONTINUE
- RETURN
- 50 I = NROW
- 60 B(I) = B(I)/W(MIDDLE,I)
- JMAX = MIN(NBANDU,I-1)
- DO 70 J=1,JMAX
- B(I-J) = B(I-J) - B(I)*W(MIDDLE-J,I)
- 70 CONTINUE
- I = I - 1
- IF (I.GT.1) GO TO 60
- 80 B(1) = B(1)/W(MIDDLE,1)
- RETURN
- END
- *DECK BQR
- SUBROUTINE BQR (NM, N, MB, A, T, R, IERR, NV, RV)
- C***BEGIN PROLOGUE BQR
- C***PURPOSE Compute some of the eigenvalues of a real symmetric
- C matrix using the QR method with shifts of origin.
- C***LIBRARY SLATEC (EISPACK)
- C***CATEGORY D4A6
- C***TYPE SINGLE PRECISION (BQR-S)
- C***KEYWORDS EIGENVALUES, EISPACK
- C***AUTHOR Smith, B. T., et al.
- C***DESCRIPTION
- C
- C This subroutine is a translation of the ALGOL procedure BQR,
- C NUM. MATH. 16, 85-92(1970) by Martin, Reinsch, and Wilkinson.
- C HANDBOOK FOR AUTO. COMP., VOL II-LINEAR ALGEBRA, 266-272(1971).
- C
- C This subroutine finds the eigenvalue of smallest (usually)
- C magnitude of a REAL SYMMETRIC BAND matrix using the
- C QR algorithm with shifts of origin. Consecutive calls
- C can be made to find further eigenvalues.
- C
- C On INPUT
- C
- C NM must be set to the row dimension of the two-dimensional
- C array parameter, A, as declared in the calling program
- C dimension statement. NM is an INTEGER variable.
- C
- C N is the order of the matrix A. N is an INTEGER variable.
- C N must be less than or equal to NM.
- C
- C MB is the (half) band width of the matrix, defined as the
- C number of adjacent diagonals, including the principal
- C diagonal, required to specify the non-zero portion of the
- C lower triangle of the matrix. MB is an INTEGER variable.
- C MB must be less than or equal to N on first call.
- C
- C A contains the lower triangle of the symmetric band input
- C matrix stored as an N by MB array. Its lowest subdiagonal
- C is stored in the last N+1-MB positions of the first column,
- C its next subdiagonal in the last N+2-MB positions of the
- C second column, further subdiagonals similarly, and finally
- C its principal diagonal in the N positions of the last column.
- C Contents of storages not part of the matrix are arbitrary.
- C On a subsequent call, its output contents from the previous
- C call should be passed. A is a two-dimensional REAL array,
- C dimensioned A(NM,MB).
- C
- C T specifies the shift (of eigenvalues) applied to the diagonal
- C of A in forming the input matrix. What is actually determined
- C is the eigenvalue of A+TI (I is the identity matrix) nearest
- C to T. On a subsequent call, the output value of T from the
- C previous call should be passed if the next nearest eigenvalue
- C is sought. T is a REAL variable.
- C
- C R should be specified as zero on the first call, and as its
- C output value from the previous call on a subsequent call.
- C It is used to determine when the last row and column of
- C the transformed band matrix can be regarded as negligible.
- C R is a REAL variable.
- C
- C NV must be set to the dimension of the array parameter RV
- C as declared in the calling program dimension statement.
- C NV is an INTEGER variable.
- C
- C On OUTPUT
- C
- C A contains the transformed band matrix. The matrix A+TI
- C derived from the output parameters is similar to the
- C input A+TI to within rounding errors. Its last row and
- C column are null (if IERR is zero).
- C
- C T contains the computed eigenvalue of A+TI (if IERR is zero),
- C where I is the identity matrix.
- C
- C R contains the maximum of its input value and the norm of the
- C last column of the input matrix A.
- C
- C IERR is an INTEGER flag set to
- C Zero for normal return,
- C J if the J-th eigenvalue has not been
- C determined after a total of 30 iterations.
- C
- C RV is a one-dimensional REAL array of dimension NV which is
- C at least (2*MB**2+4*MB-3), used for temporary storage. The
- C first (3*MB-2) locations correspond to the ALGOL array B,
- C the next (2*MB-1) locations correspond to the ALGOL array H,
- C and the final (2*MB**2-MB) locations correspond to the MB
- C by (2*MB-1) ALGOL array U.
- C
- C NOTE. For a subsequent call, N should be replaced by N-1, but
- C MB should not be altered even when it exceeds the current N.
- C
- C Calls PYTHAG(A,B) for SQRT(A**2 + B**2).
- C
- C Questions and comments should be directed to B. S. Garbow,
- C Applied Mathematics Division, ARGONNE NATIONAL LABORATORY
- C ------------------------------------------------------------------
- C
- C***REFERENCES B. T. Smith, J. M. Boyle, J. J. Dongarra, B. S. Garbow,
- C Y. Ikebe, V. C. Klema and C. B. Moler, Matrix Eigen-
- C system Routines - EISPACK Guide, Springer-Verlag,
- C 1976.
- C***ROUTINES CALLED PYTHAG
- C***REVISION HISTORY (YYMMDD)
- C 760101 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE BQR
- C
- INTEGER I,J,K,L,M,N,II,IK,JK,JM,KJ,KK,KM,LL,MB,MK,MN,MZ
- INTEGER M1,M2,M3,M4,NI,NM,NV,ITS,KJ1,M21,M31,IERR,IMULT
- REAL A(NM,*),RV(*)
- REAL F,G,Q,R,S,T,SCALE
- REAL PYTHAG
- C
- C***FIRST EXECUTABLE STATEMENT BQR
- IERR = 0
- M1 = MIN(MB,N)
- M = M1 - 1
- M2 = M + M
- M21 = M2 + 1
- M3 = M21 + M
- M31 = M3 + 1
- M4 = M31 + M2
- MN = M + N
- MZ = MB - M1
- ITS = 0
- C .......... TEST FOR CONVERGENCE ..........
- 40 G = A(N,MB)
- IF (M .EQ. 0) GO TO 360
- F = 0.0E0
- C
- DO 50 K = 1, M
- MK = K + MZ
- F = F + ABS(A(N,MK))
- 50 CONTINUE
- C
- IF (ITS .EQ. 0 .AND. F .GT. R) R = F
- IF (R + F .LE. R) GO TO 360
- IF (ITS .EQ. 30) GO TO 1000
- ITS = ITS + 1
- C .......... FORM SHIFT FROM BOTTOM 2 BY 2 MINOR ..........
- IF (F .GT. 0.25E0 * R .AND. ITS .LT. 5) GO TO 90
- F = A(N,MB-1)
- IF (F .EQ. 0.0E0) GO TO 70
- Q = (A(N-1,MB) - G) / (2.0E0 * F)
- S = PYTHAG(Q,1.0E0)
- G = G - F / (Q + SIGN(S,Q))
- 70 T = T + G
- C
- DO 80 I = 1, N
- 80 A(I,MB) = A(I,MB) - G
- C
- 90 DO 100 K = M31, M4
- 100 RV(K) = 0.0E0
- C
- DO 350 II = 1, MN
- I = II - M
- NI = N - II
- IF (NI .LT. 0) GO TO 230
- C .......... FORM COLUMN OF SHIFTED MATRIX A-G*I ..........
- L = MAX(1,2-I)
- C
- DO 110 K = 1, M3
- 110 RV(K) = 0.0E0
- C
- DO 120 K = L, M1
- KM = K + M
- MK = K + MZ
- RV(KM) = A(II,MK)
- 120 CONTINUE
- C
- LL = MIN(M,NI)
- IF (LL .EQ. 0) GO TO 135
- C
- DO 130 K = 1, LL
- KM = K + M21
- IK = II + K
- MK = MB - K
- RV(KM) = A(IK,MK)
- 130 CONTINUE
- C .......... PRE-MULTIPLY WITH HOUSEHOLDER REFLECTIONS ..........
- 135 LL = M2
- IMULT = 0
- C .......... MULTIPLICATION PROCEDURE ..........
- 140 KJ = M4 - M1
- C
- DO 170 J = 1, LL
- KJ = KJ + M1
- JM = J + M3
- IF (RV(JM) .EQ. 0.0E0) GO TO 170
- F = 0.0E0
- C
- DO 150 K = 1, M1
- KJ = KJ + 1
- JK = J + K - 1
- F = F + RV(KJ) * RV(JK)
- 150 CONTINUE
- C
- F = F / RV(JM)
- KJ = KJ - M1
- C
- DO 160 K = 1, M1
- KJ = KJ + 1
- JK = J + K - 1
- RV(JK) = RV(JK) - RV(KJ) * F
- 160 CONTINUE
- C
- KJ = KJ - M1
- 170 CONTINUE
- C
- IF (IMULT .NE. 0) GO TO 280
- C .......... HOUSEHOLDER REFLECTION ..........
- F = RV(M21)
- S = 0.0E0
- RV(M4) = 0.0E0
- SCALE = 0.0E0
- C
- DO 180 K = M21, M3
- 180 SCALE = SCALE + ABS(RV(K))
- C
- IF (SCALE .EQ. 0.0E0) GO TO 210
- C
- DO 190 K = M21, M3
- 190 S = S + (RV(K)/SCALE)**2
- C
- S = SCALE * SCALE * S
- G = -SIGN(SQRT(S),F)
- RV(M21) = G
- RV(M4) = S - F * G
- KJ = M4 + M2 * M1 + 1
- RV(KJ) = F - G
- C
- DO 200 K = 2, M1
- KJ = KJ + 1
- KM = K + M2
- RV(KJ) = RV(KM)
- 200 CONTINUE
- C .......... SAVE COLUMN OF TRIANGULAR FACTOR R ..........
- 210 DO 220 K = L, M1
- KM = K + M
- MK = K + MZ
- A(II,MK) = RV(KM)
- 220 CONTINUE
- C
- 230 L = MAX(1,M1+1-I)
- IF (I .LE. 0) GO TO 300
- C .......... PERFORM ADDITIONAL STEPS ..........
- DO 240 K = 1, M21
- 240 RV(K) = 0.0E0
- C
- LL = MIN(M1,NI+M1)
- C .......... GET ROW OF TRIANGULAR FACTOR R ..........
- DO 250 KK = 1, LL
- K = KK - 1
- KM = K + M1
- IK = I + K
- MK = MB - K
- RV(KM) = A(IK,MK)
- 250 CONTINUE
- C .......... POST-MULTIPLY WITH HOUSEHOLDER REFLECTIONS ..........
- LL = M1
- IMULT = 1
- GO TO 140
- C .......... STORE COLUMN OF NEW A MATRIX ..........
- 280 DO 290 K = L, M1
- MK = K + MZ
- A(I,MK) = RV(K)
- 290 CONTINUE
- C .......... UPDATE HOUSEHOLDER REFLECTIONS ..........
- 300 IF (L .GT. 1) L = L - 1
- KJ1 = M4 + L * M1
- C
- DO 320 J = L, M2
- JM = J + M3
- RV(JM) = RV(JM+1)
- C
- DO 320 K = 1, M1
- KJ1 = KJ1 + 1
- KJ = KJ1 - M1
- RV(KJ) = RV(KJ1)
- 320 CONTINUE
- C
- 350 CONTINUE
- C
- GO TO 40
- C .......... CONVERGENCE ..........
- 360 T = T + G
- C
- DO 380 I = 1, N
- 380 A(I,MB) = A(I,MB) - G
- C
- DO 400 K = 1, M1
- MK = K + MZ
- A(N,MK) = 0.0E0
- 400 CONTINUE
- C
- GO TO 1001
- C .......... SET ERROR -- NO CONVERGENCE TO
- C EIGENVALUE AFTER 30 ITERATIONS ..........
- 1000 IERR = N
- 1001 RETURN
- END
- *DECK BSGQ8
- SUBROUTINE BSGQ8 (FUN, XT, BC, N, KK, ID, A, B, INBV, ERR, ANS,
- + IERR, WORK)
- C***BEGIN PROLOGUE BSGQ8
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to BFQAD
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (BSGQ8-S, DBSGQ8-D)
- C***AUTHOR Jones, R. E., (SNLA)
- C***DESCRIPTION
- C
- C Abstract
- C BSGQ8, a modification of GAUS8, integrates the
- C product of FUN(X) by the ID-th derivative of a spline
- C BVALU(XT,BC,N,KK,ID,X,INBV,WORK) between limits A and B.
- C
- C Description of Arguments
- C
- C INPUT--
- C FUN - Name of external function of one argument which
- C multiplies BVALU.
- C XT - Knot array for BVALU
- C BC - B-coefficient array for BVALU
- C N - Number of B-coefficients for BVALU
- C KK - Order of the spline, KK.GE.1
- C ID - Order of the spline derivative, 0.LE.ID.LE.KK-1
- C A - Lower limit of integral
- C B - Upper limit of integral (may be less than A)
- C INBV- Initialization parameter for BVALU
- C ERR - Is a requested pseudorelative error tolerance. Normally
- C pick a value of ABS(ERR).LT.1E-3. ANS will normally
- C have no more error than ABS(ERR) times the integral of
- C the absolute value of FUN(X)*BVALU(XT,BC,N,KK,X,ID,
- C INBV,WORK).
- C
- C
- C OUTPUT--
- C ERR - Will be an estimate of the absolute error in ANS if the
- C input value of ERR was negative. (ERR is unchanged if
- C the input value of ERR was nonnegative.) The estimated
- C error is solely for information to the user and should
- C not be used as a correction to the computed integral.
- C ANS - Computed value of integral
- C IERR- A status code
- C --Normal Codes
- C 1 ANS most likely meets requested error tolerance,
- C or A=B.
- C -1 A and B are too nearly equal to allow normal
- C integration. ANS is set to zero.
- C --Abnormal Code
- C 2 ANS probably does not meet requested error tolerance.
- C WORK- Work vector of length 3*K for BVALU
- C
- C***SEE ALSO BFQAD
- C***ROUTINES CALLED BVALU, I1MACH, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 800901 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- 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 900328 Added TYPE section. (WRB)
- C 910408 Updated the AUTHOR section. (WRB)
- C***END PROLOGUE BSGQ8
- C
- INTEGER ID, IERR, INBV, K, KK, KML, KMX, L, LMN, LMX, LR, MXL,
- 1 N, NBITS, NIB, NLMN, NLMX
- INTEGER I1MACH
- REAL A, AA, AE, ANIB, ANS, AREA, B, BC, C, CE, EE, EF, EPS, ERR,
- 1 EST,GL,GLR,GR,HH,SQ2,TOL,VL,VR,WORK,W1, W2, W3, W4, XT, X1,
- 2 X2, X3, X4, X, H
- REAL R1MACH, BVALU, G8, FUN
- DIMENSION XT(*), BC(*)
- DIMENSION AA(30), HH(30), LR(30), VL(30), GR(30)
- SAVE X1, X2, X3, X4, W1, W2, W3, W4, SQ2, NLMN, KMX, KML
- DATA X1, X2, X3, X4/
- 1 1.83434642495649805E-01, 5.25532409916328986E-01,
- 2 7.96666477413626740E-01, 9.60289856497536232E-01/
- DATA W1, W2, W3, W4/
- 1 3.62683783378361983E-01, 3.13706645877887287E-01,
- 2 2.22381034453374471E-01, 1.01228536290376259E-01/
- DATA SQ2/1.41421356E0/
- DATA NLMN/1/,KMX/5000/,KML/6/
- G8(X,H)=H*((W1*(FUN(X-X1*H)*BVALU(XT,BC,N,KK,ID,X-X1*H,INBV,WORK)+
- 1 FUN(X+X1*H)*BVALU(XT,BC,N,KK,ID,X+X1*H,INBV,WORK))
- 2 +W2*(FUN(X-X2*H)*BVALU(XT,BC,N,KK,ID,X-X2*H,INBV,WORK)+
- 3 FUN(X+X2*H)*BVALU(XT,BC,N,KK,ID,X+X2*H,INBV,WORK)))
- 4 +(W3*(FUN(X-X3*H)*BVALU(XT,BC,N,KK,ID,X-X3*H,INBV,WORK)+
- 5 FUN(X+X3*H)*BVALU(XT,BC,N,KK,ID,X+X3*H,INBV,WORK))
- 6 +W4*(FUN(X-X4*H)*BVALU(XT,BC,N,KK,ID,X-X4*H,INBV,WORK)+
- 7 FUN(X+X4*H)*BVALU(XT,BC,N,KK,ID,X+X4*H,INBV,WORK))))
- C
- C INITIALIZE
- C
- C***FIRST EXECUTABLE STATEMENT BSGQ8
- K = I1MACH(11)
- ANIB = R1MACH(5)*K/0.30102000E0
- NBITS = INT(ANIB)
- NLMX = (NBITS*5)/8
- ANS = 0.0E0
- IERR = 1
- CE = 0.0E0
- IF (A.EQ.B) GO TO 140
- LMX = NLMX
- LMN = NLMN
- IF (B.EQ.0.0E0) GO TO 10
- IF (SIGN(1.0E0,B)*A.LE.0.0E0) GO TO 10
- C = ABS(1.0E0-A/B)
- IF (C.GT.0.1E0) GO TO 10
- IF (C.LE.0.0E0) GO TO 140
- ANIB = 0.5E0 - LOG(C)/0.69314718E0
- NIB = INT(ANIB)
- LMX = MIN(NLMX,NBITS-NIB-7)
- IF (LMX.LT.1) GO TO 130
- LMN = MIN(LMN,LMX)
- 10 TOL = MAX(ABS(ERR),2.0E0**(5-NBITS))/2.0E0
- IF (ERR.EQ.0.0E0) TOL = SQRT(R1MACH(4))
- EPS = TOL
- HH(1) = (B-A)/4.0E0
- AA(1) = A
- LR(1) = 1
- L = 1
- EST = G8(AA(L)+2.0E0*HH(L),2.0E0*HH(L))
- K = 8
- AREA = ABS(EST)
- EF = 0.5E0
- MXL = 0
- C
- C COMPUTE REFINED ESTIMATES, ESTIMATE THE ERROR, ETC.
- C
- 20 GL = G8(AA(L)+HH(L),HH(L))
- GR(L) = G8(AA(L)+3.0E0*HH(L),HH(L))
- K = K + 16
- AREA = AREA + (ABS(GL)+ABS(GR(L))-ABS(EST))
- GLR = GL + GR(L)
- EE = ABS(EST-GLR)*EF
- AE = MAX(EPS*AREA,TOL*ABS(GLR))
- IF (EE-AE) 40, 40, 50
- 30 MXL = 1
- 40 CE = CE + (EST-GLR)
- IF (LR(L)) 60, 60, 80
- C
- C CONSIDER THE LEFT HALF OF THIS LEVEL
- C
- 50 IF (K.GT.KMX) LMX = KML
- IF (L.GE.LMX) GO TO 30
- L = L + 1
- EPS = EPS*0.5E0
- EF = EF/SQ2
- HH(L) = HH(L-1)*0.5E0
- LR(L) = -1
- AA(L) = AA(L-1)
- EST = GL
- GO TO 20
- C
- C PROCEED TO RIGHT HALF AT THIS LEVEL
- C
- 60 VL(L) = GLR
- 70 EST = GR(L-1)
- LR(L) = 1
- AA(L) = AA(L) + 4.0E0*HH(L)
- GO TO 20
- C
- C RETURN ONE LEVEL
- C
- 80 VR = GLR
- 90 IF (L.LE.1) GO TO 120
- L = L - 1
- EPS = EPS*2.0E0
- EF = EF*SQ2
- IF (LR(L)) 100, 100, 110
- 100 VL(L) = VL(L+1) + VR
- GO TO 70
- 110 VR = VL(L+1) + VR
- GO TO 90
- C
- C EXIT
- C
- 120 ANS = VR
- IF ((MXL.EQ.0) .OR. (ABS(CE).LE.2.0E0*TOL*AREA)) GO TO 140
- IERR = 2
- CALL XERMSG ('SLATEC', 'BSGQ8',
- + 'ANS IS PROBABLY INSUFFICIENTLY ACCURATE.', 3, 1)
- GO TO 140
- 130 IERR = -1
- CALL XERMSG ('SLATEC', 'BSGQ8',
- + 'A AND B ARE TOO NEARLY EQUAL TO ALLOW NORMAL INTEGRATION. ' //
- + ' ANS IS SET TO ZERO AND IERR TO -1.', 1, -1)
- 140 CONTINUE
- IF (ERR.LT.0.0E0) ERR = CE
- RETURN
- END
- *DECK BSKIN
- SUBROUTINE BSKIN (X, N, KODE, M, Y, NZ, IERR)
- C***BEGIN PROLOGUE BSKIN
- C***PURPOSE Compute repeated integrals of the K-zero Bessel function.
- C***LIBRARY SLATEC
- C***CATEGORY C10F
- C***TYPE SINGLE PRECISION (BSKIN-S, DBSKIN-D)
- C***KEYWORDS BICKLEY FUNCTIONS, EXPONENTIAL INTEGRAL,
- C INTEGRALS OF BESSEL FUNCTIONS, K-ZERO BESSEL FUNCTION
- C***AUTHOR Amos, D. E., (SNLA)
- C***DESCRIPTION
- C
- C The following definitions are used in BSKIN:
- C
- C Definition 1
- C KI(0,X) = K-zero Bessel function.
- C
- C Definition 2
- C KI(N,X) = Bickley Function
- C = integral from X to infinity of KI(N-1,t)dt
- C for X .ge. 0 and N = 1,2,...
- C ____________________________________________________________________
- C BSKIN computes sequences of Bickley functions (repeated integrals
- C of the K0 Bessel function); i.e. for fixed X and N and K=1,...,
- C BSKIN computes the M-member sequence
- C
- C Y(K) = KI(N+K-1,X) for KODE=1
- C or
- C Y(K) = EXP(X)*KI(N+K-1,X) for KODE=2,
- C
- C for N.ge.0 and X.ge.0 (N and X cannot be zero simultaneously).
- C
- C INPUT
- C X - Argument, X .ge. 0.0E0
- C N - Order of first member of the sequence N .ge. 0
- C KODE - Selection parameter
- C KODE = 1 returns Y(K)= KI(N+K-1,X), K=1,M
- C = 2 returns Y(K)=EXP(X)*KI(N+K-1,X), K=1,M
- C M - Number of members in the sequence, M.ge.1
- C
- C OUTPUT
- C Y - A vector of dimension at least M containing the
- C sequence selected by KODE.
- C NZ - Underflow flag
- C NZ = 0 means computation completed
- C = M means an exponential underflow occurred on
- C KODE=1. Y(K)=0.0E0, K=1,...,M is returned
- C IERR - Error flag
- C IERR = 0, Normal return, computation completed.
- C = 1, Input error, no computation.
- C = 2, Error, no computation. The
- C termination condition was not met.
- C
- C The nominal computational accuracy is the maximum of unit
- C roundoff (=R1MACH(4)) and 1.0e-18 since critical constants
- C are given to only 18 digits.
- C
- C DBSKIN is the double precision version of BSKIN.
- C
- C *Long Description:
- C
- C Numerical recurrence on
- C
- C (L-1)*KI(L,X) = X(KI(L-3,X) - KI(L-1,X)) + (L-2)*KI(L-2,X)
- C
- C is stable where recurrence is carried forward or backward
- C away from INT(X+0.5). The power series for indices 0,1 and 2
- C on 0.le.X.le. 2 starts a stable recurrence for indices
- C greater than 2. If N is sufficiently large (N.gt.NLIM), the
- C uniform asymptotic expansion for N to INFINITY is more
- C economical. On X.gt.2 the recursion is started by evaluating
- C the uniform expansion for the three members whose indices are
- C closest to INT(X+0.5) within the set N,...,N+M-1. Forward
- C recurrence, backward recurrence or both, complete the
- C sequence depending on the relation of INT(X+0.5) to the
- C indices N,...,N+M-1.
- C
- C***REFERENCES D. E. Amos, Uniform asymptotic expansions for
- C exponential integrals E(N,X) and Bickley functions
- C KI(N,X), ACM Transactions on Mathematical Software,
- C 1983.
- C D. E. Amos, A portable Fortran subroutine for the
- C Bickley functions KI(N,X), Algorithm 609, ACM
- C Transactions on Mathematical Software, 1983.
- C***ROUTINES CALLED BKIAS, BKISR, EXINT, GAMRN, I1MACH, R1MACH
- C***REVISION HISTORY (YYMMDD)
- C 820601 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 891009 Removed unreferenced statement label. (WRB)
- C 891009 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE BSKIN
- INTEGER I, ICASE, IERR, IL, I1M, K, KK, KODE, KTRMS, M,
- * M3, N, NE, NFLG, NL, NLIM, NN, NP, NS, NT, NZ
- INTEGER I1MACH
- REAL A, ENLIM, EXI, FN, GR, H, HN, HRTPI, SS, TOL, T1, T2, W, X,
- * XLIM, XNLIM, XP, Y, YS, YSS
- REAL GAMRN, R1MACH
- DIMENSION EXI(102), A(50), YS(3), YSS(3), H(31), Y(*)
- SAVE A, HRTPI
- C-----------------------------------------------------------------------
- C COEFFICIENTS IN SERIES OF EXPONENTIAL INTEGRALS
- C-----------------------------------------------------------------------
- DATA A(1), A(2), A(3), A(4), A(5), A(6), A(7), A(8), A(9), A(10),
- * A(11), A(12), A(13), A(14), A(15), A(16), A(17), A(18), A(19),
- * A(20), A(21), A(22), A(23), A(24) /1.00000000000000000E+00,
- * 5.00000000000000000E-01,3.75000000000000000E-01,
- * 3.12500000000000000E-01,2.73437500000000000E-01,
- * 2.46093750000000000E-01,2.25585937500000000E-01,
- * 2.09472656250000000E-01,1.96380615234375000E-01,
- * 1.85470581054687500E-01,1.76197052001953125E-01,
- * 1.68188095092773438E-01,1.61180257797241211E-01,
- * 1.54981017112731934E-01,1.49445980787277222E-01,
- * 1.44464448094367981E-01,1.39949934091418982E-01,
- * 1.35833759559318423E-01,1.32060599571559578E-01,
- * 1.28585320635465905E-01,1.25370687619579257E-01,
- * 1.22385671247684513E-01,1.19604178719328047E-01,
- * 1.17004087877603524E-01/
- DATA A(25), A(26), A(27), A(28), A(29), A(30), A(31), A(32),
- * A(33), A(34), A(35), A(36), A(37), A(38), A(39), A(40), A(41),
- * A(42), A(43), A(44), A(45), A(46), A(47), A(48)
- * /1.14566502713486784E-01,1.12275172659217048E-01,
- * 1.10116034723462874E-01,1.08076848895250599E-01,
- * 1.06146905164978267E-01,1.04316786110409676E-01,
- * 1.02578173008569515E-01,1.00923686347140974E-01,
- * 9.93467537479668965E-02,9.78414999033007314E-02,
- * 9.64026543164874854E-02,9.50254735405376642E-02,
- * 9.37056752969190855E-02,9.24393823875012600E-02,
- * 9.12230747245078224E-02,9.00535481254756708E-02,
- * 8.89278787739072249E-02,8.78433924473961612E-02,
- * 8.67976377754033498E-02,8.57883629175498224E-02,
- * 8.48134951571231199E-02,8.38711229887106408E-02,
- * 8.29594803475290034E-02,8.20769326842574183E-02/
- DATA A(49), A(50) /8.12219646354630702E-02,8.03931690779583449E-02
- * /
- C-----------------------------------------------------------------------
- C SQRT(PI)/2
- C-----------------------------------------------------------------------
- DATA HRTPI /8.86226925452758014E-01/
- C
- C***FIRST EXECUTABLE STATEMENT BSKIN
- IERR = 0
- NZ=0
- IF (X.LT.0.0E0) IERR=1
- IF (N.LT.0) IERR=1
- IF (KODE.LT.1 .OR. KODE.GT.2) IERR=1
- IF (M.LT.1) IERR=1
- IF (X.EQ.0.0E0 .AND. N.EQ.0) IERR=1
- IF (IERR.NE.0) RETURN
- IF (X.EQ.0.0E0) GO TO 300
- I1M = -I1MACH(12)
- T1 = 2.3026E0*R1MACH(5)*I1M
- XLIM = T1 - 3.228086E0
- T2 = T1 + N + M - 1
- IF (T2.GT.1000.0E0) XLIM = T1 - 0.5E0*(LOG(T2)-0.451583E0)
- IF (X.GT.XLIM .AND. KODE.EQ.1) GO TO 320
- TOL = MAX(R1MACH(4),1.0E-18)
- I1M = I1MACH(11)
- C-----------------------------------------------------------------------
- C LN(NLIM) = 0.125*LN(EPS), NLIM = 2*KTRMS+N
- C-----------------------------------------------------------------------
- XNLIM = 0.287823E0*(I1M-1)*R1MACH(5)
- ENLIM = EXP(XNLIM)
- NLIM = INT(ENLIM) + 2
- NLIM = MIN(100,NLIM)
- NLIM = MAX(20,NLIM)
- M3 = MIN(M,3)
- NL = N + M - 1
- IF (X.GT.2.0E0) GO TO 130
- IF (N.GT.NLIM) GO TO 280
- C-----------------------------------------------------------------------
- C COMPUTATION BY SERIES FOR 0.LE.X.LE.2
- C-----------------------------------------------------------------------
- NFLG = 0
- NN = N
- IF (NL.LE.2) GO TO 60
- M3 = 3
- NN = 0
- NFLG = 1
- 60 CONTINUE
- XP = 1.0E0
- IF (KODE.EQ.2) XP = EXP(X)
- DO 80 I=1,M3
- CALL BKISR(X, NN, W, IERR)
- IF(IERR.NE.0) RETURN
- W = W*XP
- IF (NN.LT.N) GO TO 70
- KK = NN - N + 1
- Y(KK) = W
- 70 CONTINUE
- YS(I) = W
- NN = NN + 1
- 80 CONTINUE
- IF (NFLG.EQ.0) RETURN
- NS = NN
- XP = 1.0E0
- 90 CONTINUE
- C-----------------------------------------------------------------------
- C FORWARD RECURSION SCALED BY EXP(X) ON ICASE=0,1,2
- C-----------------------------------------------------------------------
- FN = NS - 1
- IL = NL - NS + 1
- IF (IL.LE.0) RETURN
- DO 110 I=1,IL
- T1 = YS(2)
- T2 = YS(3)
- YS(3) = (X*(YS(1)-YS(3))+(FN-1.0E0)*YS(2))/FN
- YS(2) = T2
- YS(1) = T1
- FN = FN + 1.0E0
- IF (NS.LT.N) GO TO 100
- KK = NS - N + 1
- Y(KK) = YS(3)*XP
- 100 CONTINUE
- NS = NS + 1
- 110 CONTINUE
- RETURN
- C-----------------------------------------------------------------------
- C COMPUTATION BY ASYMPTOTIC EXPANSION FOR X.GT.2
- C-----------------------------------------------------------------------
- 130 CONTINUE
- W = X + 0.5E0
- NT = INT(W)
- IF (NL.GT.NT) GO TO 270
- C-----------------------------------------------------------------------
- C CASE NL.LE.NT, ICASE=0
- C-----------------------------------------------------------------------
- ICASE = 0
- NN = NL
- NFLG = MIN(M-M3,1)
- 140 CONTINUE
- KK = (NLIM-NN)/2
- KTRMS = MAX(0,KK)
- NS = NN + 1
- NP = NN - M3 + 1
- XP = 1.0E0
- IF (KODE.EQ.1) XP = EXP(-X)
- DO 150 I=1,M3
- KK = I
- CALL BKIAS(X, NP, KTRMS, A, W, KK, NE, GR, H, IERR)
- IF(IERR.NE.0) RETURN
- YS(I) = W
- NP = NP + 1
- 150 CONTINUE
- C-----------------------------------------------------------------------
- C SUM SERIES OF EXPONENTIAL INTEGRALS BACKWARD
- C-----------------------------------------------------------------------
- IF (KTRMS.EQ.0) GO TO 160
- NE = KTRMS + KTRMS + 1
- NP = NN - M3 + 2
- CALL EXINT(X, NP, 2, NE, TOL, EXI, NZ, IERR)
- IF(NZ.NE.0) GO TO 320
- IF(IERR.EQ.2) RETURN
- 160 CONTINUE
- DO 190 I=1,M3
- SS = 0.0E0
- IF (KTRMS.EQ.0) GO TO 180
- KK = I + KTRMS + KTRMS - 2
- IL = KTRMS
- DO 170 K=1,KTRMS
- SS = SS + A(IL)*EXI(KK)
- KK = KK - 2
- IL = IL - 1
- 170 CONTINUE
- 180 CONTINUE
- YS(I) = YS(I) + SS
- 190 CONTINUE
- IF (ICASE.EQ.1) GO TO 200
- IF (NFLG.NE.0) GO TO 220
- 200 CONTINUE
- DO 210 I=1,M3
- Y(I) = YS(I)*XP
- 210 CONTINUE
- IF (ICASE.EQ.1 .AND. NFLG.EQ.1) GO TO 90
- RETURN
- 220 CONTINUE
- C-----------------------------------------------------------------------
- C BACKWARD RECURSION SCALED BY EXP(X) ICASE=0,2
- C-----------------------------------------------------------------------
- KK = NN - N + 1
- K = M3
- DO 230 I=1,M3
- Y(KK) = YS(K)*XP
- YSS(I) = YS(I)
- KK = KK - 1
- K = K - 1
- 230 CONTINUE
- IL = KK
- IF (IL.LE.0) GO TO 250
- FN = NN - 3
- DO 240 I=1,IL
- T1 = YS(2)
- T2 = YS(1)
- YS(1) = YS(2) + ((FN+2.0E0)*YS(3)-(FN+1.0E0)*YS(1))/X
- YS(2) = T2
- YS(3) = T1
- Y(KK) = YS(1)*XP
- KK = KK - 1
- FN = FN - 1.0E0
- 240 CONTINUE
- 250 CONTINUE
- IF (ICASE.NE.2) RETURN
- DO 260 I=1,M3
- YS(I) = YSS(I)
- 260 CONTINUE
- GO TO 90
- 270 CONTINUE
- IF (N.LT.NT) GO TO 290
- C-----------------------------------------------------------------------
- C ICASE=1, NT.LE.N.LE.NL WITH FORWARD RECURSION
- C-----------------------------------------------------------------------
- 280 CONTINUE
- NN = N + M3 - 1
- NFLG = MIN(M-M3,1)
- ICASE = 1
- GO TO 140
- C-----------------------------------------------------------------------
- C ICASE=2, N.LT.NT.LT.NL WITH BOTH FORWARD AND BACKWARD RECURSION
- C-----------------------------------------------------------------------
- 290 CONTINUE
- NN = NT + 1
- NFLG = MIN(M-M3,1)
- ICASE = 2
- GO TO 140
- C-----------------------------------------------------------------------
- C X=0 CASE
- C-----------------------------------------------------------------------
- 300 CONTINUE
- FN = N
- HN = 0.5E0*FN
- GR = GAMRN(HN)
- Y(1) = HRTPI*GR
- IF (M.EQ.1) RETURN
- Y(2) = HRTPI/(HN*GR)
- IF (M.EQ.2) RETURN
- DO 310 K=3,M
- Y(K) = FN*Y(K-2)/(FN+1.0E0)
- FN = FN + 1.0E0
- 310 CONTINUE
- RETURN
- C-----------------------------------------------------------------------
- C UNDERFLOW ON KODE=1, X.GT.XLIM
- C-----------------------------------------------------------------------
- 320 CONTINUE
- NZ=M
- DO 330 I=1,M
- Y(I) = 0.0E0
- 330 CONTINUE
- RETURN
- END
- *DECK BSPDOC
- SUBROUTINE BSPDOC
- C***BEGIN PROLOGUE BSPDOC
- C***PURPOSE Documentation for BSPLINE, a package of subprograms for
- C working with piecewise polynomial functions
- C in B-representation.
- C***LIBRARY SLATEC
- C***CATEGORY E, E1A, K, Z
- C***TYPE ALL (BSPDOC-A)
- C***KEYWORDS B-SPLINE, DOCUMENTATION, SPLINES
- C***AUTHOR Amos, D. E., (SNLA)
- C***DESCRIPTION
- C
- C Abstract
- C BSPDOC is a non-executable, B-spline documentary routine.
- C The narrative describes a B-spline and the routines
- C necessary to manipulate B-splines at a fairly high level.
- C The basic package described herein is that of reference
- C 5 with names altered to prevent duplication and conflicts
- C with routines from reference 3. The call lists used here
- C are also different. Work vectors were added to ensure
- C portability and proper execution in an overlay environ-
- C ment. These work arrays can be used for other purposes
- C except as noted in BSPVN. While most of the original
- C routines in reference 5 were restricted to orders 20
- C or less, this restriction was removed from all routines
- C except the quadrature routine BSQAD. (See the section
- C below on differentiation and integration for details.)
- C
- C The subroutines referenced below are single precision
- C routines. Corresponding double precision versions are also
- C part of the package, and these are referenced by prefixing
- C a D in front of the single precision name. For example,
- C BVALU and DBVALU are the single and double precision
- C versions for evaluating a B-spline or any of its deriva-
- C tives in the B-representation.
- C
- C ****Description of B-Splines****
- C
- C A collection of polynomials of fixed degree K-1 defined on a
- C subdivision (X(I),X(I+1)), I=1,...,M-1 of (A,B) with X(1)=A,
- C X(M)=B is called a B-spline of order K. If the spline has K-2
- C continuous derivatives on (A,B), then the B-spline is simply
- C called a spline of order K. Each of the M-1 polynomial pieces
- C has K coefficients, making a total of K(M-1) parameters. This
- C B-spline and its derivatives have M-2 jumps at the subdivision
- C points X(I), I=2,...,M-1. Continuity requirements at these
- C subdivision points add constraints and reduce the number of free
- C parameters. If a B-spline is continuous at each of the M-2 sub-
- C division points, there are K(M-1)-(M-2) free parameters; if in
- C addition the B-spline has continuous first derivatives, there
- C are K(M-1)-2(M-2) free parameters, etc., until we get to a
- C spline where we have K(M-1)-(K-1)(M-2) = M+K-2 free parameters.
- C Thus, the principle is that increasing the continuity of
- C derivatives decreases the number of free parameters and
- C conversely.
- C
- C The points at which the polynomials are tied together by the
- C continuity conditions are called knots. If two knots are
- C allowed to come together at some X(I), then we say that we
- C have a knot of multiplicity 2 there, and the knot values are
- C the X(I) value. If we reverse the procedure of the first
- C paragraph, we find that adding a knot to increase multiplicity
- C increases the number of free parameters and, according to the
- C principle above, we thereby introduce a discontinuity in what
- C was the highest continuous derivative at that knot. Thus, the
- C number of free parameters is N = NU+K-2 where NU is the sum
- C of multiplicities at the X(I) values with X(1) and X(M) of
- C multiplicity 1 (NU = M if all knots are simple, i.e., for a
- C spline, all knots have multiplicity 1.) Each knot can have a
- C multiplicity of at most K. A B-spline is commonly written in the
- C B-representation
- C
- C Y(X) = sum( A(I)*B(I,X), I=1 , N)
- C
- C to show the explicit dependence of the spline on the free
- C parameters or coefficients A(I)=BCOEF(I) and basis functions
- C B(I,X). These basis functions are themselves special B-splines
- C which are zero except on (at most) K adjoining intervals where
- C each B(I,X) is positive and, in most cases, hat or bell-
- C shaped. In order for the nonzero part of B(1,X) to be a spline
- C covering (X(1),X(2)), it is necessary to put K-1 knots to the
- C left of A and similarly for B(N,X) to the right of B. Thus, the
- C total number of knots for this representation is NU+2K-2 = N+K.
- C These knots are carried in an array T(*) dimensioned by at least
- C N+K. From the construction, A=T(K) and B=T(N+1) and the spline is
- C defined on T(K).LE.X.LE.T(N+1). The nonzero part of each basis
- C function lies in the Interval (T(I),T(I+K)). In many problems
- C where extrapolation beyond A or B is not anticipated, it is common
- C practice to set T(1)=T(2)=...=T(K)=A and T(N+1)=T(N+2)=...=
- C T(N+K)=B. In summary, since T(K) and T(N+1) as well as
- C interior knots can have multiplicity K, the number of free
- C parameters N = sum of multiplicities - K. The fact that each
- C B(I,X) function is nonzero over at most K intervals means that
- C for a given X value, there are at most K nonzero terms of the
- C sum. This leads to banded matrices in linear algebra problems,
- C and references 3 and 6 take advantage of this in con-
- C structing higher level routines to achieve speed and avoid
- C ill-conditioning.
- C
- C ****Basic Routines****
- C
- C The basic routines which most casual users will need are those
- C concerned with direct evaluation of splines or B-splines.
- C Since the B-representation, denoted by (T,BCOEF,N,K), is
- C preferred because of numerical stability, the knots T(*), the
- C B-spline coefficients BCOEF(*), the number of coefficients N,
- C and the order K of the polynomial pieces (of degree K-1) are
- C usually given. While the knot array runs from T(1) to T(N+K),
- C the B-spline is normally defined on the interval T(K).LE.X.LE.
- C T(N+1). To evaluate the B-spline or any of its derivatives
- C on this interval, one can use
- C
- C Y = BVALU(T,BCOEF,N,K,ID,X,INBV,WORK)
- C
- C where ID is an integer for the ID-th derivative, 0.LE.ID.LE.K-1.
- C ID=0 gives the zero-th derivative or B-spline value at X.
- C If X.LT.T(K) or X.GT.T(N+1), whether by mistake or the result
- C of round off accumulation in incrementing X, BVALU gives a
- C diagnostic. INBV is an initialization parameter which is set
- C to 1 on the first call. Distinct splines require distinct
- C INBV parameters. WORK is a scratch vector of length at least
- C 3*K.
- C
- C When more conventional communication is needed for publication,
- C physical interpretation, etc., the B-spline coefficients can
- C be converted to piecewise polynomial (PP) coefficients. Thus,
- C the breakpoints (distinct knots) XI(*), the number of
- C polynomial pieces LXI, and the (right) derivatives C(*,J) at
- C each breakpoint XI(J) are needed to define the Taylor
- C expansion to the right of XI(J) on each interval XI(J).LE.
- C X.LT.XI(J+1), J=1,LXI where XI(1)=A and XI(LXI+1)=B.
- C These are obtained from the (T,BCOEF,N,K) representation by
- C
- C CALL BSPPP(T,BCOEF,N,K,LDC,C,XI,LXI,WORK)
- C
- C where LDC.GE.K is the leading dimension of the matrix C and
- C WORK is a scratch vector of length at least K*(N+3).
- C Then the PP-representation (C,XI,LXI,K) of Y(X), denoted
- C by Y(J,X) on each interval XI(J).LE.X.LT.XI(J+1), is
- C
- C Y(J,X) = sum( C(I,J)*((X-XI(J))**(I-1))/factorial(I-1), I=1,K)
- C
- C for J=1,...,LXI. One must view this conversion from the B-
- C to the PP-representation with some skepticism because the
- C conversion may lose significant digits when the B-spline
- C varies in an almost discontinuous fashion. To evaluate
- C the B-spline or any of its derivatives using the PP-
- C representation, one uses
- C
- C Y = PPVAL(LDC,C,XI,LXI,K,ID,X,INPPV)
- C
- C where ID and INPPV have the same meaning and usage as ID and
- C INBV in BVALU.
- C
- C To determine to what extent the conversion process loses
- C digits, compute the relative error ABS((Y1-Y2)/Y2) over
- C the X interval with Y1 from PPVAL and Y2 from BVALU. A
- C major reason for considering PPVAL is that evaluation is
- C much faster than that from BVALU.
- C
- C Recall that when multiple knots are encountered, jump type
- C discontinuities in the B-spline or its derivatives occur
- C at these knots, and we need to know that BVALU and PPVAL
- C return right limiting values at these knots except at
- C X=B where left limiting values are returned. These values
- C are used for the Taylor expansions about left end points of
- C breakpoint intervals. That is, the derivatives C(*,J) are
- C right derivatives. Note also that a computed X value which,
- C mathematically, would be a knot value may differ from the knot
- C by a round off error. When this happens in evaluating a dis-
- C continuous B-spline or some discontinuous derivative, the
- C value at the knot and the value at X can be radically
- C different. In this case, setting X to a T or XI value makes
- C the computation precise. For left limiting values at knots
- C other than X=B, see the prologues to BVALU and other
- C routines.
- C
- C ****Interpolation****
- C
- C BINTK is used to generate B-spline parameters (T,BCOEF,N,K)
- C which will interpolate the data by calls to BVALU. A similar
- C interpolation can also be done for cubic splines using BINT4
- C or the code in reference 7. If the PP-representation is given,
- C one can evaluate this representation at an appropriate number of
- C abscissas to create data then use BINTK or BINT4 to generate
- C the B-representation.
- C
- C ****Differentiation and Integration****
- C
- C Derivatives of B-splines are obtained from BVALU or PPVAL.
- C Integrals are obtained from BSQAD using the B-representation
- C (T,BCOEF,N,K) and PPQAD using the PP-representation (C,XI,LXI,
- C K). More complicated integrals involving the product of a
- C of a function F and some derivative of a B-spline can be
- C evaluated with BFQAD or PFQAD using the B- or PP- represen-
- C tations respectively. All quadrature routines, except for PPQAD,
- C are limited in accuracy to 18 digits or working precision,
- C whichever is smaller. PPQAD is limited to working precision
- C only. In addition, the order K for BSQAD is limited to 20 or
- C less. If orders greater than 20 are required, use BFQAD with
- C F(X) = 1.
- C
- C ****Extrapolation****
- C
- C Extrapolation outside the interval (A,B) can be accomplished
- C easily by the PP-representation using PPVAL. However,
- C caution should be exercised, especially when several knots
- C are located at A or B or when the extrapolation is carried
- C significantly beyond A or B. On the other hand, direct
- C evaluation with BVALU outside A=T(K).LE.X.LE.T(N+1)=B
- C produces an error message, and some manipulation of the knots
- C and coefficients are needed to extrapolate with BVALU. This
- C process is described in reference 6.
- C
- C ****Curve Fitting and Smoothing****
- C
- C Unless one has many accurate data points, direct inter-
- C polation is not recommended for summarizing data. The
- C results are often not in accordance with intuition since the
- C fitted curve tends to oscillate through the set of points.
- C Monotone splines (reference 7) can help curb this undulating
- C tendency but constrained least squares is more likely to give an
- C acceptable fit with fewer parameters. Subroutine FC, des-
- C cribed in reference 6, is recommended for this purpose. The
- C output from this fitting process is the B-representation.
- C
- C **** Routines in the B-Spline Package ****
- C
- C Single Precision Routines
- C
- C The subroutines referenced below are SINGLE PRECISION
- C routines. Corresponding DOUBLE PRECISION versions are also
- C part of the package and these are referenced by prefixing
- C a D in front of the single precision name. For example,
- C BVALU and DBVALU are the SINGLE and DOUBLE PRECISION
- C versions for evaluating a B-spline or any of its deriva-
- C tives in the B-representation.
- C
- C BINT4 - interpolates with splines of order 4
- C BINTK - interpolates with splines of order k
- C BSQAD - integrates the B-representation on subintervals
- C PPQAD - integrates the PP-representation
- C BFQAD - integrates the product of a function F and any spline
- C derivative in the B-representation
- C PFQAD - integrates the product of a function F and any spline
- C derivative in the PP-representation
- C BVALU - evaluates the B-representation or a derivative
- C PPVAL - evaluates the PP-representation or a derivative
- C INTRV - gets the largest index of the knot to the left of x
- C BSPPP - converts from B- to PP-representation
- C BSPVD - computes nonzero basis functions and derivatives at x
- C BSPDR - sets up difference array for BSPEV
- C BSPEV - evaluates the B-representation and derivatives
- C BSPVN - called by BSPEV, BSPVD, BSPPP and BINTK for function and
- C derivative evaluations
- C Auxiliary Routines
- C
- C BSGQ8,PPGQ8,BNSLV,BNFAC,XERMSG,DBSGQ8,DPPGQ8,DBNSLV,DBNFAC
- C
- C Machine Dependent Routines
- C
- C I1MACH, R1MACH, D1MACH
- C
- C***REFERENCES 1. D. E. Amos, Computation with splines and
- C B-splines, Report SAND78-1968, Sandia
- C Laboratories, March 1979.
- C 2. D. E. Amos, Quadrature subroutines for splines and
- C B-splines, Report SAND79-1825, Sandia Laboratories,
- C December 1979.
- C 3. Carl de Boor, A Practical Guide to Splines, Applied
- C Mathematics Series 27, Springer-Verlag, New York,
- C 1978.
- C 4. Carl de Boor, On calculating with B-Splines, Journal
- C of Approximation Theory 6, (1972), pp. 50-62.
- C 5. Carl de Boor, Package for calculating with B-splines,
- C SIAM Journal on Numerical Analysis 14, 3 (June 1977),
- C pp. 441-472.
- C 6. R. J. Hanson, Constrained least squares curve fitting
- C to discrete data using B-splines, a users guide,
- C Report SAND78-1291, Sandia Laboratories, December
- C 1978.
- C 7. F. N. Fritsch and R. E. Carlson, Monotone piecewise
- C cubic interpolation, SIAM Journal on Numerical Ana-
- C lysis 17, 2 (April 1980), pp. 238-246.
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 810223 DATE WRITTEN
- C 861211 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900723 PURPOSE section revised. (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE BSPDOC
- C***FIRST EXECUTABLE STATEMENT BSPDOC
- RETURN
- END
- *DECK BSPDR
- SUBROUTINE BSPDR (T, A, N, K, NDERIV, AD)
- C***BEGIN PROLOGUE BSPDR
- C***PURPOSE Use the B-representation to construct a divided difference
- C table preparatory to a (right) derivative calculation.
- C***LIBRARY SLATEC
- C***CATEGORY E3
- C***TYPE SINGLE PRECISION (BSPDR-S, DBSPDR-D)
- C***KEYWORDS B-SPLINE, DATA FITTING, DIFFERENTIATION OF SPLINES,
- C INTERPOLATION
- C***AUTHOR Amos, D. E., (SNLA)
- C***DESCRIPTION
- C
- C Written by Carl de Boor and modified by D. E. Amos
- C
- C Abstract
- C BSPDR is the BSPLDR routine of the reference.
- C
- C BSPDR uses the B-representation (T,A,N,K) to construct a
- C divided difference table ADIF preparatory to a (right)
- C derivative calculation in BSPEV. The lower triangular matrix
- C ADIF is stored in vector AD by columns. The arrays are
- C related by
- C
- C ADIF(I,J) = AD(I-J+1 + (2*N-J+2)*(J-1)/2)
- C
- C I = J,N , J = 1,NDERIV .
- C
- C Description of Arguments
- C Input
- C T - knot vector of length N+K
- C A - B-spline coefficient vector of length N
- C N - number of B-spline coefficients
- C N = sum of knot multiplicities-K
- C K - order of the spline, K .GE. 1
- C NDERIV - number of derivatives, 1 .LE. NDERIV .LE. K.
- C NDERIV=1 gives the zero-th derivative = function
- C value
- C
- C Output
- C AD - table of differences in a vector of length
- C (2*N-NDERIV+1)*NDERIV/2 for input to BSPEV
- C
- C Error Conditions
- C Improper input is a fatal error
- C
- C***REFERENCES Carl de Boor, Package for calculating with B-splines,
- C SIAM Journal on Numerical Analysis 14, 3 (June 1977),
- C pp. 441-472.
- C***ROUTINES CALLED XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 800901 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 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 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE BSPDR
- C
- INTEGER I, ID, II, IPKMID, JJ, JM, K, KMID, N, NDERIV
- REAL A, AD, DIFF, FKMID, T
- C DIMENSION T(N+K), AD((2*N-NDERIV+1)*NDERIV/2)
- DIMENSION T(*), A(*), AD(*)
- C***FIRST EXECUTABLE STATEMENT BSPDR
- IF(K.LT.1) GO TO 100
- IF(N.LT.K) GO TO 105
- IF(NDERIV.LT.1 .OR. NDERIV.GT.K) GO TO 110
- DO 10 I=1,N
- AD(I) = A(I)
- 10 CONTINUE
- IF (NDERIV.EQ.1) RETURN
- KMID = K
- JJ = N
- JM = 0
- DO 30 ID=2,NDERIV
- KMID = KMID - 1
- FKMID = KMID
- II = 1
- DO 20 I=ID,N
- IPKMID = I + KMID
- DIFF = T(IPKMID) - T(I)
- IF (DIFF.NE.0.0E0) AD(II+JJ) = (AD(II+JM+1)-AD(II+JM))/
- 1 DIFF*FKMID
- II = II + 1
- 20 CONTINUE
- JM = JJ
- JJ = JJ + N - ID + 1
- 30 CONTINUE
- RETURN
- C
- C
- 100 CONTINUE
- CALL XERMSG ('SLATEC', 'BSPDR', 'K DOES NOT SATISFY K.GE.1', 2,
- + 1)
- RETURN
- 105 CONTINUE
- CALL XERMSG ('SLATEC', 'BSPDR', 'N DOES NOT SATISFY N.GE.K', 2,
- + 1)
- RETURN
- 110 CONTINUE
- CALL XERMSG ('SLATEC', 'BSPDR',
- + 'NDERIV DOES NOT SATISFY 1.LE.NDERIV.LE.K', 2, 1)
- RETURN
- END
- *DECK BSPEV
- SUBROUTINE BSPEV (T, AD, N, K, NDERIV, X, INEV, SVALUE, WORK)
- C***BEGIN PROLOGUE BSPEV
- C***PURPOSE Calculate the value of the spline and its derivatives from
- C the B-representation.
- C***LIBRARY SLATEC
- C***CATEGORY E3, K6
- C***TYPE SINGLE PRECISION (BSPEV-S, DBSPEV-D)
- C***KEYWORDS B-SPLINE, DATA FITTING, INTERPOLATION, SPLINES
- C***AUTHOR Amos, D. E., (SNLA)
- C***DESCRIPTION
- C
- C Written by Carl de Boor and modified by D. E. Amos
- C
- C Abstract
- C BSPEV is the BSPLEV routine of the reference.
- C
- C BSPEV calculates the value of the spline and its derivatives
- C at X from the B-representation (T,A,N,K) and returns them
- C in SVALUE(I),I=1,NDERIV, T(K) .LE. X .LE. T(N+1). AD(I) can
- C be the B-spline coefficients A(I), I=1,N if NDERIV=1. Other-
- C wise AD must be computed before hand by a call to BSPDR (T,A,
- C N,K,NDERIV,AD). If X=T(I),I=K,N, right limiting values are
- C obtained.
- C
- C To compute left derivatives or left limiting values at a
- C knot T(I), replace N by I-1 and set X=T(I), I=K+1,N+1.
- C
- C BSPEV calls INTRV, BSPVN
- C
- C Description of Arguments
- C Input
- C T - knot vector of length N+K
- C AD - vector of length (2*N-NDERIV+1)*NDERIV/2 containing
- C the difference table from BSPDR.
- C N - number of B-spline coefficients
- C N = sum of knot multiplicities-K
- C K - order of the B-spline, K .GE. 1
- C NDERIV - number of derivatives, 1 .LE. NDERIV .LE. K.
- C NDERIV=1 gives the zero-th derivative = function
- C value
- C X - argument, T(K) .LE. X .LE. T(N+1)
- C INEV - an initialization parameter which must be set
- C to 1 the first time BSPEV is called.
- C
- C Output
- C INEV - INEV contains information for efficient process-
- C ing after the initial call and INEV must not
- C be changed by the user. Distinct splines require
- C distinct INEV parameters.
- C SVALUE - vector of length NDERIV containing the spline
- C value in SVALUE(1) and the NDERIV-1 derivatives
- C in the remaining components.
- C WORK - work vector of length 3*K
- C
- C Error Conditions
- C Improper input is a fatal error.
- C
- C***REFERENCES Carl de Boor, Package for calculating with B-splines,
- C SIAM Journal on Numerical Analysis 14, 3 (June 1977),
- C pp. 441-472.
- C***ROUTINES CALLED BSPVN, INTRV, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 800901 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 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 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE BSPEV
- C
- INTEGER I,ID,INEV,IWORK,JJ,K,KP1,KP1MN,L,LEFT,LL,MFLAG,
- 1 N, NDERIV
- REAL AD, SVALUE, SUM, T, WORK, X
- C DIMENSION T(N+K)
- DIMENSION T(*), AD(*), SVALUE(*), WORK(*)
- C***FIRST EXECUTABLE STATEMENT BSPEV
- IF(K.LT.1) GO TO 100
- IF(N.LT.K) GO TO 105
- IF(NDERIV.LT.1 .OR. NDERIV.GT.K) GO TO 115
- ID = NDERIV
- CALL INTRV(T, N+1, X, INEV, I, MFLAG)
- IF (X.LT.T(K)) GO TO 110
- IF (MFLAG.EQ.0) GO TO 30
- IF (X.GT.T(I)) GO TO 110
- 20 IF (I.EQ.K) GO TO 120
- I = I - 1
- IF (X.EQ.T(I)) GO TO 20
- C
- C *I* HAS BEEN FOUND IN (K,N) SO THAT T(I) .LE. X .LT. T(I+1)
- C (OR .LE. T(I+1), IF T(I) .LT. T(I+1) = T(N+1) ).
- 30 KP1MN = K + 1 - ID
- KP1 = K + 1
- CALL BSPVN(T, KP1MN, K, 1, X, I, WORK(1),WORK(KP1),IWORK)
- JJ = (N+N-ID+2)*(ID-1)/2
- C ADIF(LEFTPL,ID) = AD(LEFTPL-ID+1 + (2*N-ID+2)*(ID-1)/2)
- C LEFTPL = LEFT + L
- 40 LEFT = I - KP1MN
- SUM = 0.0E0
- LL = LEFT + JJ + 2 - ID
- DO 50 L=1,KP1MN
- SUM = SUM + WORK(L)*AD(LL)
- LL = LL + 1
- 50 CONTINUE
- SVALUE(ID) = SUM
- ID = ID - 1
- IF (ID.EQ.0) GO TO 60
- JJ = JJ-(N-ID+1)
- KP1MN = KP1MN + 1
- CALL BSPVN(T, KP1MN, K, 2, X, I, WORK(1), WORK(KP1),IWORK)
- GO TO 40
- C
- 60 RETURN
- C
- C
- 100 CONTINUE
- CALL XERMSG ('SLATEC', 'BSPEV', 'K DOES NOT SATISFY K.GE.1', 2,
- + 1)
- RETURN
- 105 CONTINUE
- CALL XERMSG ('SLATEC', 'BSPEV', 'N DOES NOT SATISFY N.GE.K', 2,
- + 1)
- RETURN
- 110 CONTINUE
- CALL XERMSG ('SLATEC', 'BSPEV', 'X IS NOT IN T(K).LE.X.LE.T(N+1)'
- + , 2, 1)
- RETURN
- 115 CONTINUE
- CALL XERMSG ('SLATEC', 'BSPEV',
- + 'NDERIV DOES NOT SATISFY 1.LE.NDERIV.LE.K', 2, 1)
- RETURN
- 120 CONTINUE
- CALL XERMSG ('SLATEC', 'BSPEV',
- + 'A LEFT LIMITING VALUE CANNOT BE OBTAINED AT T(K)', 2, 1)
- RETURN
- END
- *DECK BSPLVD
- SUBROUTINE BSPLVD (T, K, X, ILEFT, VNIKX, NDERIV)
- C***BEGIN PROLOGUE BSPLVD
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to FC
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (BSPLVD-S, DFSPVD-D)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C Calculates value and deriv.s of all B-splines which do not vanish at X
- C
- C Fill VNIKX(J,IDERIV), J=IDERIV, ... ,K with nonzero values of
- C B-splines of order K+1-IDERIV , IDERIV=NDERIV, ... ,1, by repeated
- C calls to BSPLVN
- C
- C***SEE ALSO FC
- C***ROUTINES CALLED BSPLVN
- C***REVISION HISTORY (YYMMDD)
- C 780801 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900328 Added TYPE section. (WRB)
- C***END PROLOGUE BSPLVD
- DIMENSION T(*),VNIKX(K,*)
- DIMENSION A(20,20)
- C***FIRST EXECUTABLE STATEMENT BSPLVD
- CALL BSPLVN(T,K+1-NDERIV,1,X,ILEFT,VNIKX(NDERIV,NDERIV))
- IF (NDERIV .LE. 1) GO TO 99
- IDERIV = NDERIV
- DO 15 I=2,NDERIV
- IDERVM = IDERIV-1
- DO 11 J=IDERIV,K
- 11 VNIKX(J-1,IDERVM) = VNIKX(J,IDERIV)
- IDERIV = IDERVM
- CALL BSPLVN(T,0,2,X,ILEFT,VNIKX(IDERIV,IDERIV))
- 15 CONTINUE
- C
- DO 20 I=1,K
- DO 19 J=1,K
- 19 A(I,J) = 0.
- 20 A(I,I) = 1.
- KMD = K
- DO 40 M=2,NDERIV
- KMD = KMD-1
- FKMD = KMD
- I = ILEFT
- J = K
- 21 JM1 = J-1
- IPKMD = I + KMD
- DIFF = T(IPKMD) - T(I)
- IF (JM1 .EQ. 0) GO TO 26
- IF (DIFF .EQ. 0.) GO TO 25
- DO 24 L=1,J
- 24 A(L,J) = (A(L,J) - A(L,J-1))/DIFF*FKMD
- 25 J = JM1
- I = I - 1
- GO TO 21
- 26 IF (DIFF .EQ. 0.) GO TO 30
- A(1,1) = A(1,1)/DIFF*FKMD
- C
- 30 DO 40 I=1,K
- V = 0.
- JLOW = MAX(I,M)
- DO 35 J=JLOW,K
- 35 V = A(I,J)*VNIKX(J,M) + V
- 40 VNIKX(I,M) = V
- 99 RETURN
- END
- *DECK BSPLVN
- SUBROUTINE BSPLVN (T, JHIGH, INDEX, X, ILEFT, VNIKX)
- C***BEGIN PROLOGUE BSPLVN
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to FC
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (BSPLVN-S, DFSPVN-D)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C Calculates the value of all possibly nonzero B-splines at *X* of
- C order MAX(JHIGH,(J+1)(INDEX-1)) on *T*.
- C
- C***SEE ALSO FC
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 780801 DATE WRITTEN
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900328 Added TYPE section. (WRB)
- C***END PROLOGUE BSPLVN
- DIMENSION T(*),VNIKX(*)
- DIMENSION DELTAM(20),DELTAP(20)
- SAVE J, DELTAM, DELTAP
- DATA J/1/,(DELTAM(I),I=1,20),(DELTAP(I),I=1,20)/40*0./
- C***FIRST EXECUTABLE STATEMENT BSPLVN
- GO TO (10,20),INDEX
- 10 J = 1
- VNIKX(1) = 1.
- IF (J .GE. JHIGH) GO TO 99
- C
- 20 IPJ = ILEFT+J
- DELTAP(J) = T(IPJ) - X
- IMJP1 = ILEFT-J+1
- DELTAM(J) = X - T(IMJP1)
- VMPREV = 0.
- JP1 = J+1
- DO 26 L=1,J
- JP1ML = JP1-L
- VM = VNIKX(L)/(DELTAP(L) + DELTAM(JP1ML))
- VNIKX(L) = VM*DELTAP(L) + VMPREV
- 26 VMPREV = VM*DELTAM(JP1ML)
- VNIKX(JP1) = VMPREV
- J = JP1
- IF (J .LT. JHIGH) GO TO 20
- C
- 99 RETURN
- END
- *DECK BSPPP
- SUBROUTINE BSPPP (T, A, N, K, LDC, C, XI, LXI, WORK)
- C***BEGIN PROLOGUE BSPPP
- C***PURPOSE Convert the B-representation of a B-spline to the piecewise
- C polynomial (PP) form.
- C***LIBRARY SLATEC
- C***CATEGORY E3, K6
- C***TYPE SINGLE PRECISION (BSPPP-S, DBSPPP-D)
- C***KEYWORDS B-SPLINE, PIECEWISE POLYNOMIAL
- C***AUTHOR Amos, D. E., (SNLA)
- C***DESCRIPTION
- C
- C Written by Carl de Boor and modified by D. E. Amos
- C
- C Abstract
- C BSPPP is the BSPLPP routine of the reference.
- C
- C BSPPP converts the B-representation (T,A,N,K) to the
- C piecewise polynomial (PP) form (C,XI,LXI,K) for use with
- C PPVAL. Here XI(*), the break point array of length LXI, is
- C the knot array T(*) with multiplicities removed. The columns
- C of the matrix C(I,J) contain the right Taylor derivatives
- C for the polynomial expansion about XI(J) for the intervals
- C XI(J) .LE. X .LE. XI(J+1), I=1,K, J=1,LXI. Function PPVAL
- C makes this evaluation at a specified point X in
- C XI(1) .LE. X .LE. XI(LXI(1) .LE. X .LE. XI+1)
- C
- C Description of Arguments
- C Input
- C T - knot vector of length N+K
- C A - B-spline coefficient vector of length N
- C N - number of B-spline coefficients
- C N = sum of knot multiplicities-K
- C K - order of the B-spline, K .GE. 1
- C LDC - leading dimension of C, LDC .GE. K
- C
- C Output
- C C - matrix of dimension at least (K,LXI) containing
- C right derivatives at break points
- C XI - XI break point vector of length LXI+1
- C LXI - number of break points, LXI .LE. N-K+1
- C WORK - work vector of length K*(N+3)
- C
- C Error Conditions
- C Improper input is a fatal error
- C
- C***REFERENCES Carl de Boor, Package for calculating with B-splines,
- C SIAM Journal on Numerical Analysis 14, 3 (June 1977),
- C pp. 441-472.
- C***ROUTINES CALLED BSPDR, BSPEV, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 800901 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 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 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE BSPPP
- C
- INTEGER ILEFT, INEV, K, LDC, LXI, N, NK
- REAL A, C, T, WORK, XI
- C DIMENSION T(N+K),XI(LXI+1),C(LDC,*)
- C HERE, * = THE FINAL VALUE OF THE OUTPUT PARAMETER LXI.
- DIMENSION T(*), A(*), WORK(*), XI(*), C(LDC,*)
- C***FIRST EXECUTABLE STATEMENT BSPPP
- IF(K.LT.1) GO TO 100
- IF(N.LT.K) GO TO 105
- IF(LDC.LT.K) GO TO 110
- CALL BSPDR(T, A, N, K, K, WORK)
- LXI = 0
- XI(1) = T(K)
- INEV = 1
- NK = N*K + 1
- DO 10 ILEFT=K,N
- IF (T(ILEFT+1).EQ.T(ILEFT)) GO TO 10
- LXI = LXI + 1
- XI(LXI+1) = T(ILEFT+1)
- CALL BSPEV(T,WORK(1),N,K, K,XI(LXI),INEV,C(1,LXI),WORK(NK))
- 10 CONTINUE
- RETURN
- 100 CONTINUE
- CALL XERMSG ('SLATEC', 'BSPPP', 'K DOES NOT SATISFY K.GE.1', 2,
- + 1)
- RETURN
- 105 CONTINUE
- CALL XERMSG ('SLATEC', 'BSPPP', 'N DOES NOT SATISFY N.GE.K', 2,
- + 1)
- RETURN
- 110 CONTINUE
- CALL XERMSG ('SLATEC', 'BSPPP', 'LDC DOES NOT SATISFY LDC.GE.K',
- + 2, 1)
- RETURN
- END
- *DECK BSPVD
- SUBROUTINE BSPVD (T, K, NDERIV, X, ILEFT, LDVNIK, VNIKX, WORK)
- C***BEGIN PROLOGUE BSPVD
- C***PURPOSE Calculate the value and all derivatives of order less than
- C NDERIV of all basis functions which do not vanish at X.
- C***LIBRARY SLATEC
- C***CATEGORY E3, K6
- C***TYPE SINGLE PRECISION (BSPVD-S, DBSPVD-D)
- C***KEYWORDS DIFFERENTIATION OF B-SPLINE, EVALUATION OF B-SPLINE
- C***AUTHOR Amos, D. E., (SNLA)
- C***DESCRIPTION
- C
- C Written by Carl de Boor and modified by D. E. Amos
- C
- C Abstract
- C BSPVD is the BSPLVD routine of the reference.
- C
- C BSPVD calculates the value and all derivatives of order
- C less than NDERIV of all basis functions which do not
- C (possibly) vanish at X. ILEFT is input such that
- C T(ILEFT) .LE. X .LT. T(ILEFT+1). A call to INTRV(T,N+1,X,
- C ILO,ILEFT,MFLAG) will produce the proper ILEFT. The output of
- C BSPVD is a matrix VNIKX(I,J) of dimension at least (K,NDERIV)
- C whose columns contain the K nonzero basis functions and
- C their NDERIV-1 right derivatives at X, I=1,K, J=1,NDERIV.
- C These basis functions have indices ILEFT-K+I, I=1,K,
- C K .LE. ILEFT .LE. N. The nonzero part of the I-th basis
- C function lies in (T(I),T(I+K)), I=1,N.
- C
- C If X=T(ILEFT+1) then VNIKX contains left limiting values
- C (left derivatives) at T(ILEFT+1). In particular, ILEFT = N
- C produces left limiting values at the right end point
- C X=T(N+1). To obtain left limiting values at T(I), I=K+1,N+1,
- C set X= next lower distinct knot, call INTRV to get ILEFT,
- C set X=T(I), and then call BSPVD.
- C
- C Description of Arguments
- C Input
- C T - knot vector of length N+K, where
- C N = number of B-spline basis functions
- C N = sum of knot multiplicities-K
- C K - order of the B-spline, K .GE. 1
- C NDERIV - number of derivatives = NDERIV-1,
- C 1 .LE. NDERIV .LE. K
- C X - argument of basis functions,
- C T(K) .LE. X .LE. T(N+1)
- C ILEFT - largest integer such that
- C T(ILEFT) .LE. X .LT. T(ILEFT+1)
- C LDVNIK - leading dimension of matrix VNIKX
- C
- C Output
- C VNIKX - matrix of dimension at least (K,NDERIV) contain-
- C ing the nonzero basis functions at X and their
- C derivatives columnwise.
- C WORK - a work vector of length (K+1)*(K+2)/2
- C
- C Error Conditions
- C Improper input is a fatal error
- C
- C***REFERENCES Carl de Boor, Package for calculating with B-splines,
- C SIAM Journal on Numerical Analysis 14, 3 (June 1977),
- C pp. 441-472.
- C***ROUTINES CALLED BSPVN, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 800901 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 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 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE BSPVD
- C
- INTEGER I,IDERIV,ILEFT,IPKMD,J,JJ,JLOW,JM,JP1MID,K,KMD, KP1, L,
- 1 LDUMMY, M, MHIGH, NDERIV
- REAL FACTOR, FKMD, T, V, VNIKX, WORK, X
- C DIMENSION T(ILEFT+K), WORK((K+1)*(K+2)/2)
- C A(I,J) = WORK(I+J*(J+1)/2), I=1,J+1 J=1,K-1
- C A(I,K) = W0RK(I+K*(K-1)/2) I=1.K
- C WORK(1) AND WORK((K+1)*(K+2)/2) ARE NOT USED.
- DIMENSION T(*), VNIKX(LDVNIK,*), WORK(*)
- C***FIRST EXECUTABLE STATEMENT BSPVD
- IF(K.LT.1) GO TO 200
- IF(NDERIV.LT.1 .OR. NDERIV.GT.K) GO TO 205
- IF(LDVNIK.LT.K) GO TO 210
- IDERIV = NDERIV
- KP1 = K + 1
- JJ = KP1 - IDERIV
- CALL BSPVN(T, JJ, K, 1, X, ILEFT, VNIKX, WORK, IWORK)
- IF (IDERIV.EQ.1) GO TO 100
- MHIGH = IDERIV
- DO 20 M=2,MHIGH
- JP1MID = 1
- DO 10 J=IDERIV,K
- VNIKX(J,IDERIV) = VNIKX(JP1MID,1)
- JP1MID = JP1MID + 1
- 10 CONTINUE
- IDERIV = IDERIV - 1
- JJ = KP1 - IDERIV
- CALL BSPVN(T, JJ, K, 2, X, ILEFT, VNIKX, WORK, IWORK)
- 20 CONTINUE
- C
- JM = KP1*(KP1+1)/2
- DO 30 L = 1,JM
- WORK(L) = 0.0E0
- 30 CONTINUE
- C A(I,I) = WORK(I*(I+3)/2) = 1.0 I = 1,K
- L = 2
- J = 0
- DO 40 I = 1,K
- J = J + L
- WORK(J) = 1.0E0
- L = L + 1
- 40 CONTINUE
- KMD = K
- DO 90 M=2,MHIGH
- KMD = KMD - 1
- FKMD = KMD
- I = ILEFT
- J = K
- JJ = J*(J+1)/2
- JM = JJ - J
- DO 60 LDUMMY=1,KMD
- IPKMD = I + KMD
- FACTOR = FKMD/(T(IPKMD)-T(I))
- DO 50 L=1,J
- WORK(L+JJ) = (WORK(L+JJ)-WORK(L+JM))*FACTOR
- 50 CONTINUE
- I = I - 1
- J = J - 1
- JJ = JM
- JM = JM - J
- 60 CONTINUE
- C
- DO 80 I=1,K
- V = 0.0E0
- JLOW = MAX(I,M)
- JJ = JLOW*(JLOW+1)/2
- DO 70 J=JLOW,K
- V = WORK(I+JJ)*VNIKX(J,M) + V
- JJ = JJ + J + 1
- 70 CONTINUE
- VNIKX(I,M) = V
- 80 CONTINUE
- 90 CONTINUE
- 100 RETURN
- C
- C
- 200 CONTINUE
- CALL XERMSG ('SLATEC', 'BSPVD', 'K DOES NOT SATISFY K.GE.1', 2,
- + 1)
- RETURN
- 205 CONTINUE
- CALL XERMSG ('SLATEC', 'BSPVD',
- + 'NDERIV DOES NOT SATISFY 1.LE.NDERIV.LE.K', 2, 1)
- RETURN
- 210 CONTINUE
- CALL XERMSG ('SLATEC', 'BSPVD',
- + 'LDVNIK DOES NOT SATISFY LDVNIK.GE.K', 2, 1)
- RETURN
- END
- *DECK BSPVN
- SUBROUTINE BSPVN (T, JHIGH, K, INDEX, X, ILEFT, VNIKX, WORK,
- + IWORK)
- C***BEGIN PROLOGUE BSPVN
- C***PURPOSE Calculate the value of all (possibly) nonzero basis
- C functions at X.
- C***LIBRARY SLATEC
- C***CATEGORY E3, K6
- C***TYPE SINGLE PRECISION (BSPVN-S, DBSPVN-D)
- C***KEYWORDS EVALUATION OF B-SPLINE
- C***AUTHOR Amos, D. E., (SNLA)
- C***DESCRIPTION
- C
- C Written by Carl de Boor and modified by D. E. Amos
- C
- C Abstract
- C BSPVN is the BSPLVN routine of the reference.
- C
- C BSPVN calculates the value of all (possibly) nonzero basis
- C functions at X of order MAX(JHIGH,(J+1)*(INDEX-1)), where
- C T(K) .LE. X .LE. T(N+1) and J=IWORK is set inside the routine
- C on the first call when INDEX=1. ILEFT is such that T(ILEFT)
- C .LE. X .LT. T(ILEFT+1). A call to INTRV(T,N+1,X,ILO,ILEFT,
- C MFLAG) produces the proper ILEFT. BSPVN calculates using the
- C basic algorithm needed in BSPVD. If only basis functions are
- C desired, setting JHIGH=K and INDEX=1 can be faster than
- C calling BSPVD, but extra coding is required for derivatives
- C (INDEX=2) and BSPVD is set up for this purpose.
- C
- C Left limiting values are set up as described in BSPVD.
- C
- C Description of Arguments
- C Input
- C T - knot vector of length N+K, where
- C N = number of B-spline basis functions
- C N = sum of knot multiplicities-K
- C JHIGH - order of B-spline, 1 .LE. JHIGH .LE. K
- C K - highest possible order
- C INDEX - INDEX = 1 gives basis functions of order JHIGH
- C = 2 denotes previous entry with WORK, IWORK
- C values saved for subsequent calls to
- C BSPVN.
- C X - argument of basis functions,
- C T(K) .LE. X .LE. T(N+1)
- C ILEFT - largest integer such that
- C T(ILEFT) .LE. X .LT. T(ILEFT+1)
- C
- C Output
- C VNIKX - vector of length K for spline values.
- C WORK - a work vector of length 2*K
- C IWORK - a work parameter. Both WORK and IWORK contain
- C information necessary to continue for INDEX = 2.
- C When INDEX = 1 exclusively, these are scratch
- C variables and can be used for other purposes.
- C
- C Error Conditions
- C Improper input is a fatal error.
- C
- C***REFERENCES Carl de Boor, Package for calculating with B-splines,
- C SIAM Journal on Numerical Analysis 14, 3 (June 1977),
- C pp. 441-472.
- C***ROUTINES CALLED XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 800901 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 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 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE BSPVN
- C
- INTEGER ILEFT, IMJP1, INDEX, IPJ, IWORK, JHIGH, JP1, JP1ML, K, L
- REAL T, VM, VMPREV, VNIKX, WORK, X
- C DIMENSION T(ILEFT+JHIGH)
- DIMENSION T(*), VNIKX(*), WORK(*)
- C CONTENT OF J, DELTAM, DELTAP IS EXPECTED UNCHANGED BETWEEN CALLS.
- C WORK(I) = DELTAP(I), WORK(K+I) = DELTAM(I), I = 1,K
- C***FIRST EXECUTABLE STATEMENT BSPVN
- IF(K.LT.1) GO TO 90
- IF(JHIGH.GT.K .OR. JHIGH.LT.1) GO TO 100
- IF(INDEX.LT.1 .OR. INDEX.GT.2) GO TO 105
- IF(X.LT.T(ILEFT) .OR. X.GT.T(ILEFT+1)) GO TO 110
- GO TO (10, 20), INDEX
- 10 IWORK = 1
- VNIKX(1) = 1.0E0
- IF (IWORK.GE.JHIGH) GO TO 40
- C
- 20 IPJ = ILEFT + IWORK
- WORK(IWORK) = T(IPJ) - X
- IMJP1 = ILEFT - IWORK + 1
- WORK(K+IWORK) = X - T(IMJP1)
- VMPREV = 0.0E0
- JP1 = IWORK + 1
- DO 30 L=1,IWORK
- JP1ML = JP1 - L
- VM = VNIKX(L)/(WORK(L)+WORK(K+JP1ML))
- VNIKX(L) = VM*WORK(L) + VMPREV
- VMPREV = VM*WORK(K+JP1ML)
- 30 CONTINUE
- VNIKX(JP1) = VMPREV
- IWORK = JP1
- IF (IWORK.LT.JHIGH) GO TO 20
- C
- 40 RETURN
- C
- C
- 90 CONTINUE
- CALL XERMSG ('SLATEC', 'BSPVN', 'K DOES NOT SATISFY K.GE.1', 2,
- + 1)
- RETURN
- 100 CONTINUE
- CALL XERMSG ('SLATEC', 'BSPVN',
- + 'JHIGH DOES NOT SATISFY 1.LE.JHIGH.LE.K', 2, 1)
- RETURN
- 105 CONTINUE
- CALL XERMSG ('SLATEC', 'BSPVN', 'INDEX IS NOT 1 OR 2', 2, 1)
- RETURN
- 110 CONTINUE
- CALL XERMSG ('SLATEC', 'BSPVN',
- + 'X DOES NOT SATISFY T(ILEFT).LE.X.LE.T(ILEFT+1)', 2, 1)
- RETURN
- END
- *DECK BSQAD
- SUBROUTINE BSQAD (T, BCOEF, N, K, X1, X2, BQUAD, WORK)
- C***BEGIN PROLOGUE BSQAD
- C***PURPOSE Compute the integral of a K-th order B-spline using the
- C B-representation.
- C***LIBRARY SLATEC
- C***CATEGORY H2A2A1, E3, K6
- C***TYPE SINGLE PRECISION (BSQAD-S, DBSQAD-D)
- C***KEYWORDS INTEGRAL OF B-SPLINES, QUADRATURE
- C***AUTHOR Amos, D. E., (SNLA)
- C***DESCRIPTION
- C
- C Abstract
- C BSQAD computes the integral on (X1,X2) of a K-th order
- C B-spline using the B-representation (T,BCOEF,N,K). Orders
- C K as high as 20 are permitted by applying a 2, 6, or 10
- C point Gauss formula on subintervals of (X1,X2) which are
- C formed by included (distinct) knots.
- C
- C If orders K greater than 20 are needed, use BFQAD with
- C F(X) = 1.
- C
- C Description of Arguments
- C Input
- C T - knot array of length N+K
- C BCOEF - B-spline coefficient array of length N
- C N - length of coefficient array
- C K - order of B-spline, 1 .LE. K .LE. 20
- C X1,X2 - end points of quadrature interval in
- C T(K) .LE. X .LE. T(N+1)
- C
- C Output
- C BQUAD - integral of the B-spline over (X1,X2)
- C WORK - work vector of length 3*K
- C
- C Error Conditions
- C Improper input is a fatal error
- C
- C***REFERENCES D. E. Amos, Quadrature subroutines for splines and
- C B-splines, Report SAND79-1825, Sandia Laboratories,
- C December 1979.
- C***ROUTINES CALLED BVALU, INTRV, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 800901 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE BSQAD
- C
- INTEGER I,IL1,IL2,ILO,INBV, JF,K,LEFT,M,MF,MFLAG,N, NPK, NP1
- REAL A, AA, B, BB, BCOEF, BMA, BPA, BQUAD, C1, GPTS, GWTS, GX, Q,
- 1 SUM, T, TA, TB, WORK, X1, X2, Y1, Y2
- REAL BVALU
- DIMENSION T(*), BCOEF(*), GPTS(9), GWTS(9), SUM(5), WORK(*)
- C
- SAVE GPTS, GWTS
- DATA GPTS(1), GPTS(2), GPTS(3), GPTS(4), GPTS(5), GPTS(6),
- 1 GPTS(7), GPTS(8), GPTS(9)/
- 2 5.77350269189625764E-01, 2.38619186083196909E-01,
- 3 6.61209386466264514E-01, 9.32469514203152028E-01,
- 4 1.48874338981631211E-01, 4.33395394129247191E-01,
- 5 6.79409568299024406E-01, 8.65063366688984511E-01,
- 6 9.73906528517171720E-01/
- DATA GWTS(1), GWTS(2), GWTS(3), GWTS(4), GWTS(5), GWTS(6),
- 1 GWTS(7), GWTS(8), GWTS(9)/
- 2 1.00000000000000000E+00, 4.67913934572691047E-01,
- 3 3.60761573048138608E-01, 1.71324492379170345E-01,
- 4 2.95524224714752870E-01, 2.69266719309996355E-01,
- 5 2.19086362515982044E-01, 1.49451349150580593E-01,
- 6 6.66713443086881376E-02/
- C
- C***FIRST EXECUTABLE STATEMENT BSQAD
- BQUAD = 0.0E0
- IF(K.LT.1 .OR. K.GT.20) GO TO 65
- IF(N.LT.K) GO TO 70
- AA = MIN(X1,X2)
- BB = MAX(X1,X2)
- IF (AA.LT.T(K)) GO TO 60
- NP1 = N + 1
- IF (BB.GT.T(NP1)) GO TO 60
- IF (AA.EQ.BB) RETURN
- NPK = N + K
- C SELECTION OF 2, 6, OR 10 POINT GAUSS FORMULA
- JF = 0
- MF = 1
- IF (K.LE.4) GO TO 10
- JF = 1
- MF = 3
- IF (K.LE.12) GO TO 10
- JF = 4
- MF = 5
- 10 CONTINUE
- C
- DO 20 I=1,MF
- SUM(I) = 0.0E0
- 20 CONTINUE
- ILO = 1
- INBV = 1
- CALL INTRV(T, NPK, AA, ILO, IL1, MFLAG)
- CALL INTRV(T, NPK, BB, ILO, IL2, MFLAG)
- IF (IL2.GE.NP1) IL2 = N
- DO 40 LEFT=IL1,IL2
- TA = T(LEFT)
- TB = T(LEFT+1)
- IF (TA.EQ.TB) GO TO 40
- A = MAX(AA,TA)
- B = MIN(BB,TB)
- BMA = 0.5E0*(B-A)
- BPA = 0.5E0*(B+A)
- DO 30 M=1,MF
- C1 = BMA*GPTS(JF+M)
- GX = -C1 + BPA
- Y2 = BVALU(T,BCOEF,N,K,0,GX,INBV,WORK)
- GX = C1 + BPA
- Y1 = BVALU(T,BCOEF,N,K,0,GX,INBV,WORK)
- SUM(M) = SUM(M) + (Y1+Y2)*BMA
- 30 CONTINUE
- 40 CONTINUE
- Q = 0.0E0
- DO 50 M=1,MF
- Q = Q + GWTS(JF+M)*SUM(M)
- 50 CONTINUE
- IF (X1.GT.X2) Q = -Q
- BQUAD = Q
- RETURN
- C
- C
- 60 CONTINUE
- CALL XERMSG ('SLATEC', 'BSQAD',
- + 'X1 OR X2 OR BOTH DO NOT SATISFY T(K).LE.X.LE.T(N+1)', 2, 1)
- RETURN
- 65 CONTINUE
- CALL XERMSG ('SLATEC', 'BSQAD', 'K DOES NOT SATISFY 1.LE.K.LE.20'
- + , 2, 1)
- RETURN
- 70 CONTINUE
- CALL XERMSG ('SLATEC', 'BSQAD', 'N DOES NOT SATISFY N.GE.K', 2,
- + 1)
- RETURN
- END
- *DECK BSRH
- FUNCTION BSRH (XLL, XRR, IZ, C, A, BH, F, SGN)
- C***BEGIN PROLOGUE BSRH
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to BLKTRI
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (BCRH-S, BSRH-S)
- C***AUTHOR (UNKNOWN)
- C***SEE ALSO BLKTRI
- C***ROUTINES CALLED (NONE)
- C***COMMON BLOCKS CBLKT
- C***REVISION HISTORY (YYMMDD)
- C 801001 DATE WRITTEN
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900402 Added TYPE section. (WRB)
- C***END PROLOGUE BSRH
- DIMENSION A(*) ,C(*) ,BH(*)
- COMMON /CBLKT/ NPP ,K ,EPS ,CNV ,
- 1 NM ,NCMPLX ,IK
- C***FIRST EXECUTABLE STATEMENT BSRH
- XL = XLL
- XR = XRR
- DX = .5*ABS(XR-XL)
- 101 X = .5*(XL+XR)
- IF (SGN*F(X,IZ,C,A,BH)) 103,105,102
- 102 XR = X
- GO TO 104
- 103 XL = X
- 104 DX = .5*DX
- IF (DX-CNV) 105,105,101
- 105 BSRH = .5*(XL+XR)
- RETURN
- END
- *DECK BVALU
- FUNCTION BVALU (T, A, N, K, IDERIV, X, INBV, WORK)
- C***BEGIN PROLOGUE BVALU
- C***PURPOSE Evaluate the B-representation of a B-spline at X for the
- C function value or any of its derivatives.
- C***LIBRARY SLATEC
- C***CATEGORY E3, K6
- C***TYPE SINGLE PRECISION (BVALU-S, DBVALU-D)
- C***KEYWORDS DIFFERENTIATION OF B-SPLINE, EVALUATION OF B-SPLINE
- C***AUTHOR Amos, D. E., (SNLA)
- C***DESCRIPTION
- C
- C Written by Carl de Boor and modified by D. E. Amos
- C
- C Abstract
- C BVALU is the BVALUE function of the reference.
- C
- C BVALU evaluates the B-representation (T,A,N,K) of a B-spline
- C at X for the function value on IDERIV = 0 or any of its
- C derivatives on IDERIV = 1,2,...,K-1. Right limiting values
- C (right derivatives) are returned except at the right end
- C point X=T(N+1) where left limiting values are computed. The
- C spline is defined on T(K) .LE. X .LE. T(N+1). BVALU returns
- C a fatal error message when X is outside of this interval.
- C
- C To compute left derivatives or left limiting values at a
- C knot T(I), replace N by I-1 and set X=T(I), I=K+1,N+1.
- C
- C BVALU calls INTRV
- C
- C Description of Arguments
- C Input
- C T - knot vector of length N+K
- C A - B-spline coefficient vector of length N
- C N - number of B-spline coefficients
- C N = sum of knot multiplicities-K
- C K - order of the B-spline, K .GE. 1
- C IDERIV - order of the derivative, 0 .LE. IDERIV .LE. K-1
- C IDERIV=0 returns the B-spline value
- C X - argument, T(K) .LE. X .LE. T(N+1)
- C INBV - an initialization parameter which must be set
- C to 1 the first time BVALU is called.
- C
- C Output
- C INBV - INBV contains information for efficient process-
- C ing after the initial call and INBV must not
- C be changed by the user. Distinct splines require
- C distinct INBV parameters.
- C WORK - work vector of length 3*K.
- C BVALU - value of the IDERIV-th derivative at X
- C
- C Error Conditions
- C An improper input is a fatal error
- C
- C***REFERENCES Carl de Boor, Package for calculating with B-splines,
- C SIAM Journal on Numerical Analysis 14, 3 (June 1977),
- C pp. 441-472.
- C***ROUTINES CALLED INTRV, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 800901 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE BVALU
- C
- INTEGER I,IDERIV,IDERP1,IHI,IHMKMJ,ILO,IMK,IMKPJ, INBV, IPJ,
- 1 IP1, IP1MJ, J, JJ, J1, J2, K, KMIDER, KMJ, KM1, KPK, MFLAG, N
- REAL A, FKMJ, T, WORK, X
- C DIMENSION T(N+K), WORK(3*K)
- DIMENSION T(*), A(*), WORK(*)
- C***FIRST EXECUTABLE STATEMENT BVALU
- BVALU = 0.0E0
- IF(K.LT.1) GO TO 102
- IF(N.LT.K) GO TO 101
- IF(IDERIV.LT.0 .OR. IDERIV.GE.K) GO TO 110
- KMIDER = K - IDERIV
- C
- C *** FIND *I* IN (K,N) SUCH THAT T(I) .LE. X .LT. T(I+1)
- C (OR, .LE. T(I+1) IF T(I) .LT. T(I+1) = T(N+1)).
- KM1 = K - 1
- CALL INTRV(T, N+1, X, INBV, I, MFLAG)
- IF (X.LT.T(K)) GO TO 120
- IF (MFLAG.EQ.0) GO TO 20
- IF (X.GT.T(I)) GO TO 130
- 10 IF (I.EQ.K) GO TO 140
- I = I - 1
- IF (X.EQ.T(I)) GO TO 10
- C
- C *** DIFFERENCE THE COEFFICIENTS *IDERIV* TIMES
- C WORK(I) = AJ(I), WORK(K+I) = DP(I), WORK(K+K+I) = DM(I), I=1.K
- C
- 20 IMK = I - K
- DO 30 J=1,K
- IMKPJ = IMK + J
- WORK(J) = A(IMKPJ)
- 30 CONTINUE
- IF (IDERIV.EQ.0) GO TO 60
- DO 50 J=1,IDERIV
- KMJ = K - J
- FKMJ = KMJ
- DO 40 JJ=1,KMJ
- IHI = I + JJ
- IHMKMJ = IHI - KMJ
- WORK(JJ) = (WORK(JJ+1)-WORK(JJ))/(T(IHI)-T(IHMKMJ))*FKMJ
- 40 CONTINUE
- 50 CONTINUE
- C
- C *** COMPUTE VALUE AT *X* IN (T(I),(T(I+1)) OF IDERIV-TH DERIVATIVE,
- C GIVEN ITS RELEVANT B-SPLINE COEFF. IN AJ(1),...,AJ(K-IDERIV).
- 60 IF (IDERIV.EQ.KM1) GO TO 100
- IP1 = I + 1
- KPK = K + K
- J1 = K + 1
- J2 = KPK + 1
- DO 70 J=1,KMIDER
- IPJ = I + J
- WORK(J1) = T(IPJ) - X
- IP1MJ = IP1 - J
- WORK(J2) = X - T(IP1MJ)
- J1 = J1 + 1
- J2 = J2 + 1
- 70 CONTINUE
- IDERP1 = IDERIV + 1
- DO 90 J=IDERP1,KM1
- KMJ = K - J
- ILO = KMJ
- DO 80 JJ=1,KMJ
- WORK(JJ) = (WORK(JJ+1)*WORK(KPK+ILO)+WORK(JJ)
- 1 *WORK(K+JJ))/(WORK(KPK+ILO)+WORK(K+JJ))
- ILO = ILO - 1
- 80 CONTINUE
- 90 CONTINUE
- 100 BVALU = WORK(1)
- RETURN
- C
- C
- 101 CONTINUE
- CALL XERMSG ('SLATEC', 'BVALU', 'N DOES NOT SATISFY N.GE.K', 2,
- + 1)
- RETURN
- 102 CONTINUE
- CALL XERMSG ('SLATEC', 'BVALU', 'K DOES NOT SATISFY K.GE.1', 2,
- + 1)
- RETURN
- 110 CONTINUE
- CALL XERMSG ('SLATEC', 'BVALU',
- + 'IDERIV DOES NOT SATISFY 0.LE.IDERIV.LT.K', 2, 1)
- RETURN
- 120 CONTINUE
- CALL XERMSG ('SLATEC', 'BVALU',
- + 'X IS N0T GREATER THAN OR EQUAL TO T(K)', 2, 1)
- RETURN
- 130 CONTINUE
- CALL XERMSG ('SLATEC', 'BVALU',
- + 'X IS NOT LESS THAN OR EQUAL TO T(N+1)', 2, 1)
- RETURN
- 140 CONTINUE
- CALL XERMSG ('SLATEC', 'BVALU',
- + 'A LEFT LIMITING VALUE CANNOT BE OBTAINED AT T(K)', 2, 1)
- RETURN
- END
- *DECK BVDER
- SUBROUTINE BVDER (X, Y, YP, G, IPAR)
- C***BEGIN PROLOGUE BVDER
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to BVSUP
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (BVDER-S, DBVDER-D)
- C***AUTHOR Watts, H. A., (SNLA)
- C***DESCRIPTION
- C
- C **********************************************************************
- C NFC = Number of base solution vectors
- C
- C NCOMP = Number of components per solution vector
- C
- C 1 -- Nonzero particular solution
- C INHOMO =
- C 2 or 3 -- Zero particular solution
- C
- C 0 -- Inhomogeneous vector term G(X) identically zero
- C IGOFX =
- C 1 -- Inhomogeneous vector term G(X) not identically zero
- C
- C G = Inhomogeneous vector term G(X)
- C
- C XSAV = Previous value of X
- C
- C C = Normalization factor for the particular solution
- C
- C 0 ( if NEQIVP = 0 )
- C IVP =
- C Number of differential equations integrated due to
- C the original boundary value problem ( if NEQIVP .GT. 0 )
- C
- C NOFST - For problems with auxiliary initial value equations,
- C NOFST communicates to the routine FMAT how to access
- C the dependent variables corresponding to this initial
- C value problem. For example, during any call to FMAT,
- C the first dependent variable for the initial value
- C problem is in position Y(NOFST + 1).
- C See example in SAND77-1328.
- C **********************************************************************
- C
- C***SEE ALSO BVSUP
- C***ROUTINES CALLED (NONE)
- C***COMMON BLOCKS ML8SZ, MLIVP
- C***REVISION HISTORY (YYMMDD)
- C 750601 DATE WRITTEN
- C 890921 Realigned order of variables in certain COMMON blocks.
- C (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900328 Added TYPE section. (WRB)
- C 910701 Corrected ROUTINES CALLED section. (WRB)
- C 910722 Updated AUTHOR section. (ALS)
- C 920618 Minor restructuring of code. (RWC, WRB)
- C***END PROLOGUE BVDER
- DIMENSION Y(*),YP(*),G(*)
- C
- C **********************************************************************
- C
- COMMON /ML8SZ/ C,XSAV,IGOFX,INHOMO,IVP,NCOMP,NFC
- C
- C **********************************************************************
- C The COMMON block below is used to communicate with the user
- C supplied subroutine FMAT. The user should not alter this
- C COMMON block.
- C
- COMMON /MLIVP/ NOFST
- C **********************************************************************
- C
- C***FIRST EXECUTABLE STATEMENT BVDER
- IF (IVP .GT. 0) CALL UIVP(X,Y(IVP+1),YP(IVP+1))
- NOFST = IVP
- NA = 1
- DO 10 K=1,NFC
- CALL FMAT(X,Y(NA),YP(NA))
- NOFST = NOFST - NCOMP
- NA = NA + NCOMP
- 10 CONTINUE
- C
- IF (INHOMO .NE. 1) RETURN
- CALL FMAT(X,Y(NA),YP(NA))
- C
- IF (IGOFX .EQ. 0) RETURN
- IF (X .NE. XSAV) THEN
- IF (IVP .EQ. 0) CALL GVEC(X,G)
- IF (IVP .GT. 0) CALL UVEC(X,Y(IVP+1),G)
- XSAV = X
- ENDIF
- C
- C If the user has chosen not to normalize the particular
- C solution, then C is defined in BVPOR to be 1.0
- C
- C The following loop is just
- C CALL SAXPY (NCOMP, 1.0E0/C, G, 1, YP(NA), 1)
- C
- DO 20 J=1,NCOMP
- L = NA + J - 1
- YP(L) = YP(L) + G(J)/C
- 20 CONTINUE
- RETURN
- END
- *DECK BVPOR
- SUBROUTINE BVPOR (Y, NROWY, NCOMP, XPTS, NXPTS, A, NROWA, ALPHA,
- + NIC, B, NROWB, BETA, NFC, IFLAG, Z, MXNON, P, NTP, IP, W, NIV,
- + YHP, U, V, COEF, S, STOWA, G, WORK, IWORK, NFCC)
- C***BEGIN PROLOGUE BVPOR
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to BVSUP
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (BVPOR-S, DBVPOR-D)
- C***AUTHOR Watts, H. A., (SNLA)
- C***DESCRIPTION
- C
- C **********************************************************************
- C INPUT to BVPOR (items not defined in BVSUP comments)
- C **********************************************************************
- C
- C NOPG = 0 -- Orthonormalization points not pre-assigned
- C = 1 -- Orthonormalization points pre-assigned
- C
- C MXNON = Maximum number of orthogonalizations allowed.
- C
- C NDISK = 0 -- IN-CORE storage
- C = 1 -- DISK storage. Value of NTAPE in data statement
- C is set to 13. If another value is desired,
- C the data statement must be changed.
- C
- C INTEG = Type of integrator and associated test to be used
- C to determine when to orthonormalize.
- C
- C 1 -- Use GRAM-SCHMIDT test and DERKF
- C 2 -- Use GRAM-SCHMIDT test and DEABM
- C
- C TOL = Tolerance for allowable error in orthogonalization test.
- C
- C NPS = 0 Normalize particular solution to unit length at each
- C point of orthonormalization.
- C = 1 Do not normalize particular solution.
- C
- C NTP = Must be .GE. NFC*(NFC+1)/2.
- C
- C
- C NFCC = 2*NFC for special treatment of a complex valued problem
- C
- C ICOCO = 0 Skip final computations (superposition coefficients
- C and ,hence, boundary problem solution)
- C = 1 Calculate superposition coefficients and obtain
- C solution to the boundary value problem
- C
- C **********************************************************************
- C OUTPUT from BVPOR
- C **********************************************************************
- C
- C Y(NROWY,NXPTS) = Solution at specified output points.
- C
- C MXNON = Number of orthonormalizations performed by BVPOR.
- C
- C Z(MXNON+1) = Locations of orthonormalizations performed by BVPOR.
- C
- C NIV = Number of independent vectors returned from MGSBV. Normally
- C this parameter will be meaningful only when MGSBV returns with
- C MFLAG = 2.
- C
- C **********************************************************************
- C
- C The following variables are in the argument list because of
- C variable dimensioning. In general, they contain no information of
- C use to the user. The amount of storage set aside by the user must
- C be greater than or equal to that indicated by the dimension
- C statements. For the DISK storage mode, NON = 0 and KPTS = 1,
- C while for the IN-CORE storage mode, NON = MXNON and KPTS = NXPTS.
- C
- C P(NTP,NON+1)
- C IP(NFCC,NON+1)
- C YHP(NCOMP,NFC+1) plus an additional column of the length NEQIVP
- C U(NCOMP,NFC,KPTS)
- C V(NCOMP,KPTS)
- C W(NFCC,NON+1)
- C COEF(NFCC)
- C S(NFC+1)
- C STOWA(NCOMP*(NFC+1)+NEQIVP+1)
- C G(NCOMP)
- C WORK(KKKWS)
- C IWORK(LLLIWS)
- C
- C **********************************************************************
- C Subroutines used by BVPOR
- C LSSUDS -- Solves an underdetermined system of linear
- C equations. This routine is used to get a full
- C set of initial conditions for integration.
- C Called by BVPOR
- C
- C SVECS -- Obtains starting vectors for special treatment
- C of complex valued problems , called by BVPOR
- C
- C RKFAB -- Routine which conducts integration using DERKF or
- C DEABM
- C
- C STWAY -- Storage for backup capability, called by
- C BVPOR and REORT
- C
- C STOR1 -- Storage at output points, called by BVPOR,
- C RKFAB, REORT and STWAY.
- C
- C SDOT -- Single precision vector inner product routine,
- C called by BVPOR, SCOEF, LSSUDS, MGSBV,
- C BKSOL, REORT and PRVEC.
- C ** NOTE **
- C A considerable improvement in speed can be achieved if a
- C machine language version is used for SDOT.
- C
- C SCOEF -- Computes the superposition constants from the
- C boundary conditions at Xfinal.
- C
- C BKSOL -- Solves an upper triangular set of linear equations.
- C
- C **********************************************************************
- C
- C***SEE ALSO BVSUP
- C***ROUTINES CALLED BKSOL, LSSUDS, RKFAB, SCOEF, SDOT, STOR1, STWAY,
- C SVECS
- C***COMMON BLOCKS ML15TO, ML18JR, ML8SZ
- C***REVISION HISTORY (YYMMDD)
- C 750601 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890921 Realigned order of variables in certain COMMON blocks.
- C (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900328 Added TYPE section. (WRB)
- C 910722 Updated AUTHOR section. (ALS)
- C***END PROLOGUE BVPOR
- C
- DIMENSION Y(NROWY,*),A(NROWA,*),ALPHA(*),B(NROWB,*),
- 1 BETA(*),P(NTP,*),IP(NFCC,*),
- 2 U(NCOMP,NFC,*),V(NCOMP,*),W(NFCC,*),
- 3 COEF(*),Z(*),YHP(NCOMP,*),XPTS(*),S(*),
- 4 WORK(*),IWORK(*),STOWA(*),G(*)
- C
- C **********************************************************************
- C
- COMMON /ML8SZ/ C,XSAV,IGOFX,INHOMO,IVP,NCOMPD,NFCD
- COMMON /ML15TO/ PX,PWCND,TND,X,XBEG,XEND,XOT,XOP,INFO(15),ISTKOP,
- 1 KNSWOT,KOP,LOTJP,MNSWOT,NSWOT
- COMMON /ML18JR/ AE,RE,TOL,NXPTSD,NICD,NOPG,MXNOND,NDISK,NTAPE,
- 1 NEQ,INDPVT,INTEG,NPS,NTPD,NEQIVP,NUMORT,NFCCD,
- 2 ICOCO
- C
- C **********************************************************************
- C
- C***FIRST EXECUTABLE STATEMENT BVPOR
- NFCP1 = NFC + 1
- NUMORT = 0
- C = 1.0
- C
- C **********************************************************************
- C CALCULATE INITIAL CONDITIONS WHICH SATISFY
- C A*YH(XINITIAL)=0 AND A*YP(XINITIAL)=ALPHA.
- C WHEN NFC .NE. NFCC LSSUDS DEFINES VALUES YHP IN A MATRIX OF SIZE
- C (NFCC+1)*NCOMP AND ,HENCE, OVERFLOWS THE STORAGE ALLOCATION INTO
- C THE U ARRAY. HOWEVER, THIS IS OKAY SINCE PLENTY OF SPACE IS
- C AVAILABLE IN U AND IT HAS NOT YET BEEN USED.
- C
- NDW = NROWA * NCOMP
- KWS = NDW + NIC + 1
- KWD = KWS + NIC
- KWT = KWD + NIC
- KWC = KWT + NIC
- IFLAG = 0
- CALL LSSUDS(A,YHP(1,NFCC+1),ALPHA,NIC,NCOMP,NROWA,YHP,NCOMP,
- 1 IFLAG,1,IRA,0,WORK(1),WORK(NDW+1),IWORK,WORK(KWS),
- 2 WORK(KWD),WORK(KWT),ISFLG,WORK(KWC))
- IF (IFLAG .EQ. 1) GO TO 3
- IFLAG=-4
- GO TO 250
- 3 IF (NFC .NE. NFCC) CALL SVECS(NCOMP,NFC,YHP,WORK,IWORK,
- 1 INHOMO,IFLAG)
- IF (IFLAG .EQ. 1) GO TO 5
- IFLAG=-5
- GO TO 250
- C
- C **********************************************************************
- C DETERMINE THE NUMBER OF DIFFERENTIAL EQUATIONS TO BE INTEGRATED,
- C INITIALIZE VARIABLES FOR AUXILIARY INITIAL VALUE PROBLEM AND
- C STORE INITIAL CONDITIONS.
- C
- 5 NEQ = NCOMP * NFC
- IF (INHOMO .EQ. 1) NEQ = NEQ + NCOMP
- IVP = 0
- IF (NEQIVP .EQ. 0) GO TO 10
- IVP = NEQ
- NEQ = NEQ + NEQIVP
- NFCP2 = NFCP1
- IF (INHOMO .EQ. 1) NFCP2 = NFCP1 + 1
- DO 7 K = 1,NEQIVP
- 7 YHP(K,NFCP2) = ALPHA(NIC+K)
- 10 CALL STOR1(U,YHP,V,YHP(1,NFCP1),0,NDISK,NTAPE)
- C
- C **********************************************************************
- C SET UP DATA FOR THE ORTHONORMALIZATION TESTING PROCEDURE AND
- C SAVE INITIAL CONDITIONS IN CASE A RESTART IS NECESSARY.
- C
- NSWOT=1
- KNSWOT=0
- LOTJP=1
- TND=LOG10(10.*TOL)
- PWCND=LOG10(SQRT(TOL))
- X=XBEG
- PX=X
- XOT=XEND
- XOP=X
- KOP=1
- CALL STWAY(U,V,YHP,0,STOWA)
- C
- C **********************************************************************
- C ******** FORWARD INTEGRATION OF ALL INITIAL VALUE EQUATIONS **********
- C **********************************************************************
- C
- CALL RKFAB(NCOMP,XPTS,NXPTS,NFC,IFLAG,Z,MXNON,P,NTP,IP,
- 1 YHP,NIV,U,V,W,S,STOWA,G,WORK,IWORK,NFCC)
- IF (IFLAG .NE. 0 .OR. ICOCO .EQ. 0) GO TO 250
- C
- C **********************************************************************
- C **************** BACKWARD SWEEP TO OBTAIN SOLUTION *******************
- C **********************************************************************
- C
- C CALCULATE SUPERPOSITION COEFFICIENTS AT XFINAL.
- C
- C FOR THE DISK STORAGE VERSION, IT IS NOT NECESSARY TO READ U AND V
- C AT THE LAST OUTPUT POINT, SINCE THE LOCAL COPY OF EACH STILL EXISTS.
- C
- KOD = 1
- IF (NDISK .EQ. 0) KOD = NXPTS
- I1=1+NFCC*NFCC
- I2=I1+NFCC
- CALL SCOEF(U(1,1,KOD),V(1,KOD),NCOMP,NROWB,NFC,NIC,B,BETA,COEF,
- 1 INHOMO,RE,AE,WORK,WORK(I1),WORK(I2),IWORK,IFLAG,NFCC)
- C
- C **********************************************************************
- C CALCULATE SOLUTION AT OUTPUT POINTS BY RECURRING BACKWARDS.
- C AS WE RECUR BACKWARDS FROM XFINAL TO XINITIAL WE MUST CALCULATE
- C NEW SUPERPOSITION COEFFICIENTS EACH TIME WE CROSS A POINT OF
- C ORTHONORMALIZATION.
- C
- K = NUMORT
- NCOMP2=NCOMP/2
- IC=1
- IF (NFC .NE. NFCC) IC=2
- DO 200 J = 1,NXPTS
- KPTS = NXPTS - J + 1
- KOD = KPTS
- IF (NDISK .EQ. 1) KOD = 1
- 135 IF (K .EQ. 0) GO TO 170
- IF (XEND.GT.XBEG .AND. XPTS(KPTS).GE.Z(K)) GO TO 170
- IF (XEND.LT.XBEG .AND. XPTS(KPTS).LE.Z(K)) GO TO 170
- NON = K
- IF (NDISK .EQ. 0) GO TO 136
- NON = 1
- BACKSPACE NTAPE
- READ (NTAPE) (IP(I,1), I = 1,NFCC),(P(I,1), I = 1,NTP)
- BACKSPACE NTAPE
- 136 IF (INHOMO .NE. 1) GO TO 150
- IF (NDISK .EQ. 0) GO TO 138
- BACKSPACE NTAPE
- READ (NTAPE) (W(I,1), I = 1,NFCC)
- BACKSPACE NTAPE
- 138 DO 140 N = 1,NFCC
- 140 COEF(N) = COEF(N) - W(N,NON)
- 150 CALL BKSOL(NFCC,P(1,NON),COEF)
- DO 155 M = 1,NFCC
- 155 WORK(M) = COEF(M)
- DO 160 M = 1,NFCC
- L = IP(M,NON)
- 160 COEF(L) = WORK(M)
- K = K - 1
- GO TO 135
- 170 IF (NDISK .EQ. 0) GO TO 175
- BACKSPACE NTAPE
- READ (NTAPE) (V(I,1), I = 1,NCOMP),
- 1 ((U(I,M,1), I = 1,NCOMP), M = 1,NFC)
- BACKSPACE NTAPE
- 175 DO 180 N = 1,NCOMP
- 180 Y(N,KPTS) = V(N,KOD) + SDOT(NFC,U(N,1,KOD),NCOMP,COEF,IC)
- IF (NFC .EQ. NFCC) GO TO 200
- DO 190 N=1,NCOMP2
- NN=NCOMP2+N
- Y(N,KPTS)=Y(N,KPTS) - SDOT(NFC,U(NN,1,KOD),NCOMP,COEF(2),2)
- 190 Y(NN,KPTS)=Y(NN,KPTS) + SDOT(NFC,U(N,1,KOD),NCOMP,COEF(2),2)
- 200 CONTINUE
- C
- C **********************************************************************
- C
- 250 MXNON = NUMORT
- RETURN
- END
- *DECK BVSUP
- SUBROUTINE BVSUP (Y, NROWY, NCOMP, XPTS, NXPTS, A, NROWA, ALPHA,
- + NIC, B, NROWB, BETA, NFC, IGOFX, RE, AE, IFLAG, WORK, NDW,
- + IWORK, NDIW, NEQIVP)
- C***BEGIN PROLOGUE BVSUP
- C***PURPOSE Solve a linear two-point boundary value problem using
- C superposition coupled with an orthonormalization procedure
- C and a variable-step integration scheme.
- C***LIBRARY SLATEC
- C***CATEGORY I1B1
- C***TYPE SINGLE PRECISION (BVSUP-S, DBVSUP-D)
- C***KEYWORDS ORTHONORMALIZATION, SHOOTING,
- C TWO-POINT BOUNDARY VALUE PROBLEM
- C***AUTHOR Scott, M. R., (SNLA)
- C Watts, H. A., (SNLA)
- C***DESCRIPTION
- C
- C **********************************************************************
- C Subroutine BVSUP solves a LINEAR two-point boundary-value problem
- C of the form
- C dY/dX = MATRIX(X,U)*Y(X) + G(X,U)
- C A*Y(Xinitial) = ALPHA , B*Y(Xfinal) = BETA
- C
- C Coupled with the solution of the initial value problem
- C
- C dU/dX = F(X,U)
- C U(Xinitial) = ETA
- C
- C **********************************************************************
- C Abstract
- C The method of solution uses superposition coupled with an
- C orthonormalization procedure and a variable-step integration
- C scheme. Each time the superposition solutions start to
- C lose their numerical linear independence, the vectors are
- C reorthonormalized before integration proceeds. The underlying
- C principle of the algorithm is then to piece together the
- C intermediate (orthogonalized) solutions, defined on the various
- C subintervals, to obtain the desired solutions.
- C
- C **********************************************************************
- C INPUT to BVSUP
- C **********************************************************************
- C
- C NROWY = Actual row dimension of Y in calling program.
- C NROWY must be .GE. NCOMP
- C
- C NCOMP = Number of components per solution vector.
- C NCOMP is equal to number of original differential
- C equations. NCOMP = NIC + NFC.
- C
- C XPTS = Desired output points for solution. They must be monotonic.
- C Xinitial = XPTS(1)
- C Xfinal = XPTS(NXPTS)
- C
- C NXPTS = Number of output points
- C
- C A(NROWA,NCOMP) = Boundary condition matrix at Xinitial,
- C must be contained in (NIC,NCOMP) sub-matrix.
- C
- C NROWA = Actual row dimension of A in calling program,
- C NROWA must be .GE. NIC.
- C
- C ALPHA(NIC+NEQIVP) = Boundary conditions at Xinitial.
- C If NEQIVP .GT. 0 (see below), the boundary
- C conditions at Xinitial for the initial value
- C equations must be stored starting in
- C position (NIC + 1) of ALPHA.
- C Thus, ALPHA(NIC+K) = ETA(K).
- C
- C NIC = Number of boundary conditions at Xinitial.
- C
- C B(NROWB,NCOMP) = Boundary condition matrix at Xfinal,
- C must be contained in (NFC,NCOMP) sub-matrix.
- C
- C NROWB = Actual row dimension of B in calling program,
- C NROWB must be .GE. NFC.
- C
- C BETA(NFC) = Boundary conditions at Xfinal.
- C
- C NFC = Number of boundary conditions at Xfinal
- C
- C IGOFX =0 -- The inhomogeneous term G(X) is identically zero.
- C =1 -- The inhomogeneous term G(X) is not identically zero.
- C (if IGOFX=1, then subroutine GVEC (or UVEC) must be
- C supplied).
- C
- C RE = Relative error tolerance used by the integrator
- C (see one of the integrators)
- C
- C AE = Absolute error tolerance used by the integrator
- C (see one of the integrators)
- C **NOTE- RE and AE should not both be zero.
- C
- C IFLAG = A status parameter used principally for output.
- C However, for efficient solution of problems which
- C are originally defined as complex valued (but
- C converted to real systems to use this code), the
- C user must set IFLAG=13 on input. See the comment below
- C for more information on solving such problems.
- C
- C WORK(NDW) = Floating point array used for internal storage.
- C
- C NDW = Actual dimension of WORK array allocated by user.
- C An estimate for NDW can be computed from the following
- C NDW = 130 + NCOMP**2 * (6 + NXPTS/2 + expected number of
- C orthonormalizations/8)
- C For the DISK or TAPE storage mode,
- C NDW = 6 * NCOMP**2 + 10 * NCOMP + 130
- C However, when the ADAMS integrator is to be used, the estimates are
- C NDW = 130 + NCOMP**2 * (13 + NXPTS/2 + expected number of
- C orthonormalizations/8)
- C and NDW = 13 * NCOMP**2 + 22 * NCOMP + 130 , respectively.
- C
- C IWORK(NDIW) = Integer array used for internal storage.
- C
- C NDIW = Actual dimension of IWORK array allocated by user.
- C An estimate for NDIW can be computed from the following
- C NDIW = 68 + NCOMP * (1 + expected number of
- C orthonormalizations)
- C **NOTE -- The amount of storage required is problem dependent and may
- C be difficult to predict in advance. Experience has shown
- C that for most problems 20 or fewer orthonormalizations
- C should suffice. If the problem cannot be completed with the
- C allotted storage, then a message will be printed which
- C estimates the amount of storage necessary. In any case, the
- C user can examine the IWORK array for the actual storage
- C requirements, as described in the output information below.
- C
- C NEQIVP = Number of auxiliary initial value equations being added
- C to the boundary value problem.
- C **NOTE -- Occasionally the coefficients MATRIX and/or G may be
- C functions which depend on the independent variable X and
- C on U, the solution of an auxiliary initial value problem.
- C In order to avoid the difficulties associated with
- C interpolation, the auxiliary equations may be solved
- C simultaneously with the given boundary value problem.
- C This initial value problem may be LINEAR or NONLINEAR.
- C See SAND77-1328 for an example.
- C
- C
- C The user must supply subroutines FMAT, GVEC, UIVP and UVEC, when
- C needed (they MUST be so named), to evaluate the derivatives
- C as follows
- C
- C A. FMAT must be supplied.
- C
- C SUBROUTINE FMAT(X,Y,YP)
- C X = Independent variable (input to FMAT)
- C Y = Dependent variable vector (input to FMAT)
- C YP = dY/dX = Derivative vector (output from FMAT)
- C
- C Compute the derivatives for the HOMOGENEOUS problem
- C YP(I) = dY(I)/dX = MATRIX(X) * Y(I) , I = 1,...,NCOMP
- C
- C When (NEQIVP .GT. 0) and MATRIX is dependent on U as
- C well as on X, the following common statement must be
- C included in FMAT
- C COMMON /MLIVP/ NOFST
- C For convenience, the U vector is stored at the bottom
- C of the Y array. Thus, during any call to FMAT,
- C U(I) is referenced by Y(NOFST + I).
- C
- C
- C Subroutine BVDER calls FMAT NFC times to evaluate the
- C homogeneous equations and, if necessary, it calls FMAT once
- C in evaluating the particular solution. Since X remains
- C unchanged in this sequence of calls it is possible to
- C realize considerable computational savings for complicated
- C and expensive evaluations of the MATRIX entries. To do this
- C the user merely passes a variable, say XS, via COMMON where
- C XS is defined in the main program to be any value except
- C the initial X. Then the non-constant elements of MATRIX(X)
- C appearing in the differential equations need only be
- C computed if X is unequal to XS, whereupon XS is reset to X.
- C
- C
- C B. If NEQIVP .GT. 0 , UIVP must also be supplied.
- C
- C SUBROUTINE UIVP(X,U,UP)
- C X = Independent variable (input to UIVP)
- C U = Dependent variable vector (input to UIVP)
- C UP = dU/dX = Derivative vector (output from UIVP)
- C
- C Compute the derivatives for the auxiliary initial value eqs
- C UP(I) = dU(I)/dX, I = 1,...,NEQIVP.
- C
- C Subroutine BVDER calls UIVP once to evaluate the
- C derivatives for the auxiliary initial value equations.
- C
- C
- C C. If NEQIVP = 0 and IGOFX = 1 , GVEC must be supplied.
- C
- C SUBROUTINE GVEC(X,G)
- C X = Independent variable (input to GVEC)
- C G = Vector of inhomogeneous terms G(X) (output from GVEC)
- C
- C Compute the inhomogeneous terms G(X)
- C G(I) = G(X) values for I = 1,...,NCOMP.
- C
- C Subroutine BVDER calls GVEC in evaluating the particular
- C solution provided G(X) is NOT identically zero. Thus, when
- C IGOFX=0, the user need NOT write a GVEC subroutine. Also,
- C the user does not have to bother with the computational
- C savings scheme for GVEC as this is automatically achieved
- C via the BVDER subroutine.
- C
- C
- C D. If NEQIVP .GT. 0 and IGOFX = 1 , UVEC must be supplied.
- C
- C SUBROUTINE UVEC(X,U,G)
- C X = Independent variable (input to UVEC)
- C U = Dependent variable vector from the auxiliary initial
- C value problem (input to UVEC)
- C G = Array of inhomogeneous terms G(X,U)(output from UVEC)
- C
- C Compute the inhomogeneous terms G(X,U)
- C G(I) = G(X,U) values for I = 1,...,NCOMP.
- C
- C Subroutine BVDER calls UVEC in evaluating the particular
- C solution provided G(X,U) is NOT identically zero. Thus,
- C when IGOFX=0, the user need NOT write a UVEC subroutine.
- C
- C
- C
- C The following is optional input to BVSUP to give the user more
- C flexibility in use of the code. See SAND75-0198 , SAND77-1328 ,
- C SAND77-1690,SAND78-0522, and SAND78-1501 for more information.
- C
- C ****CAUTION -- The user MUST zero out IWORK(1),...,IWORK(15)
- C prior to calling BVSUP. These locations define optional
- C input and MUST be zero UNLESS set to special values by
- C the user as described below.
- C
- C IWORK(1) -- Number of orthonormalization points.
- C A value need be set only if IWORK(11) = 1
- C
- C IWORK(9) -- Integrator and orthonormalization parameter
- C (default value is 1)
- C 1 = RUNGE-KUTTA-FEHLBERG code using GRAM-SCHMIDT test.
- C 2 = ADAMS code using GRAM-SCHMIDT TEST.
- C
- C IWORK(11) -- Orthonormalization points parameter
- C (default value is 0)
- C 0 - Orthonormalization points not pre-assigned.
- C 1 - Orthonormalization points pre-assigned in
- C the first IWORK(1) positions of WORK.
- C
- C IWORK(12) -- Storage parameter
- C (default value is 0)
- C 0 - All storage IN CORE
- C LUN - Homogeneous and inhomogeneous solutions at
- C output points and orthonormalization information
- C are stored on DISK. The logical unit number to be
- C used for DISK I/O (NTAPE) is set to IWORK(12).
- C
- C WORK(1),... -- Pre-assigned orthonormalization points, stored
- C monotonically, corresponding to the direction
- C of integration.
- C
- C
- C
- C ******************************
- C *** COMPLEX VALUED PROBLEM ***
- C ******************************
- C **NOTE***
- C Suppose the original boundary value problem is NC equations
- C of the form
- C dW/dX = MAT(X,U)*W(X) + H(X,U)
- C R*W(Xinitial)=GAMMA , S*W(Xfinal)=DELTA
- C
- C where all variables are complex valued. The BVSUP code can be
- C used by converting to a real system of size 2*NC. To solve the
- C larger dimensioned problem efficiently, the user must initialize
- C IFLAG=13 on input and order the vector components according to
- C Y(1)=real(W(1)),...,Y(NC)=real(W(NC)),Y(NC+1)=imag(W(1)),....,
- C Y(2*NC)=imag(W(NC)). Then define
- C ...........................
- C . real(MAT) -imag(MAT) .
- C MATRIX = . .
- C . imag(MAT) real(MAT) .
- C ...........................
- C
- C The matrices A,B and vectors G,ALPHA,BETA must be defined
- C similarly. Further details can be found in SAND78-1501.
- C
- C
- C **********************************************************************
- C OUTPUT from BVSUP
- C **********************************************************************
- C
- C Y(NROWY,NXPTS) = Solution at specified output points.
- C
- C IFLAG output values
- C =-5 Algorithm ,for obtaining starting vectors for the
- C special complex problem structure, was unable to obtain
- C the initial vectors satisfying the necessary
- C independence criteria.
- C =-4 Rank of boundary condition matrix A is less than NIC,
- C as determined by LSSUDS.
- C =-2 Invalid input parameters.
- C =-1 Insufficient number of storage locations allocated for
- C WORK or IWORK.
- C
- C =0 Indicates successful solution
- C
- C =1 A computed solution is returned but UNIQUENESS of the
- C solution of the boundary-value problem is questionable.
- C For an eigenvalue problem, this should be treated as a
- C successful execution since this is the expected mode
- C of return.
- C =2 A computed solution is returned but the EXISTENCE of the
- C solution to the boundary-value problem is questionable.
- C =3 A nontrivial solution approximation is returned although
- C the boundary condition matrix B*Y(Xfinal) is found to be
- C nonsingular (to the desired accuracy level) while the
- C right hand side vector is zero. To eliminate this type
- C of return, the accuracy of the eigenvalue parameter
- C must be improved.
- C ***NOTE- We attempt to diagnose the correct problem behavior
- C and report possible difficulties by the appropriate
- C error flag. However, the user should probably resolve
- C the problem using smaller error tolerances and/or
- C perturbations in the boundary conditions or other
- C parameters. This will often reveal the correct
- C interpretation for the problem posed.
- C
- C =13 Maximum number of orthonormalizations attained before
- C reaching Xfinal.
- C =20-flag from integrator (DERKF or DEABM) values can range
- C from 21 to 25.
- C =30 Solution vectors form a dependent set.
- C
- C WORK(1),...,WORK(IWORK(1)) = Orthonormalization points
- C determined by BVPOR.
- C
- C IWORK(1) = Number of orthonormalizations performed by BVPOR.
- C
- C IWORK(2) = Maximum number of orthonormalizations allowed as
- C calculated from storage allocated by user.
- C
- C IWORK(3),IWORK(4),IWORK(5),IWORK(6) Give information about
- C actual storage requirements for WORK and IWORK
- C arrays. In particular,
- C required storage for WORK array is
- C IWORK(3) + IWORK(4)*(expected number of orthonormalizations)
- C
- C required storage for IWORK array is
- C IWORK(5) + IWORK(6)*(expected number of orthonormalizations)
- C
- C IWORK(8) = Final value of exponent parameter used in tolerance
- C test for orthonormalization.
- C
- C IWORK(16) = Number of independent vectors returned from MGSBV.
- C It is only of interest when IFLAG=30 is obtained.
- C
- C IWORK(17) = Numerically estimated rank of the boundary
- C condition matrix defined from B*Y(Xfinal)
- C
- C **********************************************************************
- C
- C Necessary machine constants are defined in the function
- C routine R1MACH. The user must make sure that the values
- C set in R1MACH are relevant to the computer being used.
- C
- C **********************************************************************
- C
- C***REFERENCES M. R. Scott and H. A. Watts, SUPORT - a computer code
- C for two-point boundary-value problems via
- C orthonormalization, SIAM Journal of Numerical
- C Analysis 14, (1977), pp. 40-70.
- C B. L. Darlow, M. R. Scott and H. A. Watts, Modifications
- C of SUPORT, a linear boundary value problem solver
- C Part I - pre-assigning orthonormalization points,
- C auxiliary initial value problem, disk or tape storage,
- C Report SAND77-1328, Sandia Laboratories, Albuquerque,
- C New Mexico, 1977.
- C B. L. Darlow, M. R. Scott and H. A. Watts, Modifications
- C of SUPORT, a linear boundary value problem solver
- C Part II - inclusion of an Adams integrator, Report
- C SAND77-1690, Sandia Laboratories, Albuquerque,
- C New Mexico, 1977.
- C M. E. Lord and H. A. Watts, Modifications of SUPORT,
- C a linear boundary value problem solver Part III -
- C orthonormalization improvements, Report SAND78-0522,
- C Sandia Laboratories, Albuquerque, New Mexico, 1978.
- C H. A. Watts, M. R. Scott and M. E. Lord, Computational
- C solution of complex*16 valued boundary problems,
- C Report SAND78-1501, Sandia Laboratories,
- C Albuquerque, New Mexico, 1978.
- C***ROUTINES CALLED EXBVP, MACON, XERMSG
- C***COMMON BLOCKS ML15TO, ML17BW, ML18JR, ML5MCO, ML8SZ
- C***REVISION HISTORY (YYMMDD)
- C 750601 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890921 Realigned order of variables in certain COMMON blocks.
- C (WRB)
- C 890921 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900510 Convert XERRWV calls to XERMSG calls. (RWC)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE BVSUP
- C **********************************************************************
- C
- C
- DIMENSION Y(NROWY,*),A(NROWA,*),ALPHA(*),B(NROWB,*),
- 1 BETA(*),WORK(*),IWORK(*),XPTS(*)
- CHARACTER*8 XERN1, XERN2, XERN3, XERN4
- C
- C **********************************************************************
- C THE COMMON BLOCK BELOW IS USED TO COMMUNICATE WITH SUBROUTINE
- C BVDER. THE USER SHOULD NOT ALTER OR USE THIS COMMON BLOCK IN THE
- C CALLING PROGRAM.
- C
- COMMON /ML8SZ/ C,XSAV,IGOFXD,INHOMO,IVP,NCOMPD,NFCD
- C
- C **********************************************************************
- C THESE COMMON BLOCKS AID IN REDUCING THE NUMBER OF SUBROUTINE
- C ARGUMENTS PREVALENT IN THIS MODULAR STRUCTURE
- C
- COMMON /ML18JR/ AED,RED,TOL,NXPTSD,NICD,NOPG,MXNON,NDISK,NTAPE,
- 1 NEQ,INDPVT,INTEG,NPS,NTP,NEQIVD,NUMORT,NFCC,
- 2 ICOCO
- COMMON /ML17BW/ KKKZPW,NEEDW,NEEDIW,K1,K2,K3,K4,K5,K6,K7,K8,K9,
- 1 K10,K11,L1,L2,KKKINT,LLLINT
- C
- C **********************************************************************
- C THIS COMMON BLOCK IS USED IN SUBROUTINES BVSUP,BVPOR,RKFAB,
- C REORT, AND STWAY. IT CONTAINS INFORMATION NECESSARY
- C FOR THE ORTHONORMALIZATION TESTING PROCEDURE AND A BACKUP
- C RESTARTING CAPABILITY.
- C
- COMMON /ML15TO/ PX,PWCND,TND,X,XBEG,XEND,XOT,XOP,INFO(15),ISTKOP,
- 1 KNSWOT,KOP,LOTJP,MNSWOT,NSWOT
- C
- C **********************************************************************
- C THIS COMMON BLOCK CONTAINS THE MACHINE DEPENDENT PARAMETERS
- C USED BY THE CODE
- C
- COMMON /ML5MCO/ URO,SRU,EPS,SQOVFL,TWOU,FOURU,LPAR
- C
- C **********************************************************************
- C SET UP MACHINE DEPENDENT CONSTANTS.
- C
- C***FIRST EXECUTABLE STATEMENT BVSUP
- CALL MACON
- C
- C **********************************************************************
- C TEST FOR INVALID INPUT
- C
- IF (NROWY .LT. NCOMP) GO TO 20
- IF (NCOMP .NE. NIC+NFC) GO TO 20
- IF (NXPTS .LT. 2) GO TO 20
- IF (NIC .LE. 0) GO TO 20
- IF (NROWA .LT. NIC) GO TO 20
- IF (NFC .LE. 0) GO TO 20
- IF (NROWB .LT. NFC) GO TO 20
- IF (IGOFX .LT. 0 .OR. IGOFX .GT. 1) GO TO 20
- IF (RE .LT. 0.0) GO TO 20
- IF (AE .LT. 0.0) GO TO 20
- IF (RE .EQ. 0.0 .AND. AE .EQ. 0.0) GO TO 20
- IS = 1
- IF (XPTS(NXPTS) .LT. XPTS(1)) IS = 2
- NXPTSM = NXPTS - 1
- DO 13 K = 1,NXPTSM
- IF (IS .EQ. 2) GO TO 12
- IF (XPTS(K+1) .LE. XPTS(K)) GO TO 20
- GO TO 13
- 12 IF (XPTS(K) .LE. XPTS(K+1)) GO TO 20
- 13 CONTINUE
- GO TO 30
- 20 IFLAG = -2
- RETURN
- 30 CONTINUE
- C
- C **********************************************************************
- C CHECK FOR DISK STORAGE
- C
- KPTS = NXPTS
- NDISK = 0
- IF (IWORK(12) .EQ. 0) GO TO 35
- NTAPE = IWORK(12)
- KPTS = 1
- NDISK = 1
- 35 CONTINUE
- C
- C **********************************************************************
- C SET INTEG PARAMETER ACCORDING TO CHOICE OF INTEGRATOR.
- C
- INTEG = 1
- IF (IWORK(9) .EQ. 2) INTEG = 2
- C
- C **********************************************************************
- C COMPUTE INHOMO
- C
- IF (IGOFX .EQ. 1) GO TO 43
- DO 40 J = 1,NIC
- IF (ALPHA(J) .NE. 0.0) GO TO 43
- 40 CONTINUE
- DO 41 J = 1,NFC
- IF (BETA(J) .NE. 0.0) GO TO 42
- 41 CONTINUE
- INHOMO = 3
- GO TO 45
- 42 INHOMO = 2
- GO TO 45
- 43 INHOMO = 1
- 45 CONTINUE
- C
- C **********************************************************************
- C TO TAKE ADVANTAGE OF THE SPECIAL STRUCTURE WHEN SOLVING A
- C COMPLEX VALUED PROBLEM,WE INTRODUCE NFCC=NFC WHILE CHANGING
- C THE INTERNAL VALUE OF NFC
- C
- NFCC=NFC
- IF (IFLAG .EQ. 13) NFC=NFC/2
- C
- C **********************************************************************
- C DETERMINE NECESSARY STORAGE REQUIREMENTS
- C
- C FOR BASIC ARRAYS IN BVPOR
- KKKYHP = NCOMP*(NFC+1) + NEQIVP
- KKKU = NCOMP*NFC*KPTS
- KKKV = NCOMP*KPTS
- KKKCOE = NFCC
- KKKS = NFC+1
- KKKSTO = NCOMP*(NFC+1) + NEQIVP + 1
- KKKG = NCOMP
- C
- C FOR ORTHONORMALIZATION RELATED MATTERS
- NTP = (NFCC*(NFCC+1))/2
- KKKZPW = 1 + NTP + NFCC
- LLLIP = NFCC
- C
- C FOR ADDITIONAL REQUIRED WORK SPACE
- C (LSSUDS)
- KKKSUD = 4*NIC + (NROWA+1)*NCOMP
- LLLSUD = NIC
- C (SVECS)
- KKKSVC = 1 + 4*NFCC + 2*NFCC**2
- LLLSVC = 2*NFCC
- C
- NDEQ=NCOMP*NFC+NEQIVP
- IF (INHOMO .EQ. 1) NDEQ=NDEQ+NCOMP
- GO TO (51,52),INTEG
- C (DERKF)
- 51 KKKINT = 33 + 7*NDEQ
- LLLINT = 34
- GO TO 55
- C (DEABM)
- 52 KKKINT = 130 + 21*NDEQ
- LLLINT = 51
- C
- C (COEF)
- 55 KKKCOF = 5*NFCC + NFCC**2
- LLLCOF = 3 + NFCC
- C
- KKKWS = MAX(KKKSUD,KKKSVC,KKKINT,KKKCOF)
- LLLIWS = MAX(LLLSUD,LLLSVC,LLLINT,LLLCOF)
- C
- NEEDW = KKKYHP + KKKU + KKKV + KKKCOE + KKKS + KKKSTO + KKKG +
- 1 KKKZPW + KKKWS
- NEEDIW = 17 + LLLIP + LLLIWS
- C **********************************************************************
- C COMPUTE THE NUMBER OF POSSIBLE ORTHONORMALIZATIONS WITH THE
- C ALLOTTED STORAGE
- C
- IWORK(3) = NEEDW
- IWORK(4) = KKKZPW
- IWORK(5) = NEEDIW
- IWORK(6) = LLLIP
- NRTEMP = NDW - NEEDW
- NITEMP = NDIW - NEEDIW
- IF (NRTEMP .LT. 0) GO TO 70
- IF (NITEMP .GE. 0) GO TO 75
- C
- 70 IFLAG = -1
- IF (NDISK .NE. 1) THEN
- WRITE (XERN1, '(I8)') NEEDW
- WRITE (XERN2, '(I8)') KKKZPW
- WRITE (XERN3, '(I8)') NEEDIW
- WRITE (XERN4, '(I8)') LLLIP
- CALL XERMSG ('SLATEC', 'BVSUP',
- * 'REQUIRED STORAGE FOR WORK ARRAY IS ' // XERN1 // ' + ' //
- * XERN2 // '*(EXPECTED NUMBER OF ORTHONORMALIZATIONS) $$' //
- * 'REQUIRED STORAGE FOR IWORK ARRAY IS ' // XERN3 // ' + ' //
- * XERN4 // '*(EXPECTED NUMBER OF ORTHONORMALIZATIONS)', 1, 0)
- ELSE
- WRITE (XERN1, '(I8)') NEEDW
- WRITE (XERN2, '(I8)') NEEDIW
- CALL XERMSG ('SLATEC', 'BVSUP',
- * 'REQUIRED STORAGE FOR WORK ARRAY IS ' // XERN1 //
- * ' + NUMBER OF ORTHONOMALIZATIONS. $$' //
- * 'REQUIRED STORAGE FOR IWORK ARRAY IS ' // XERN2, 1, 0)
- ENDIF
- RETURN
- C
- 75 IF (NDISK .EQ. 0) GO TO 77
- NON = 0
- MXNON = NRTEMP
- GO TO 78
- C
- 77 MXNONR = NRTEMP / KKKZPW
- MXNONI = NITEMP / LLLIP
- MXNON = MIN(MXNONR,MXNONI)
- NON = MXNON
- C
- 78 IWORK(2) = MXNON
- C
- C **********************************************************************
- C CHECK FOR PRE-ASSIGNED ORTHONORMALIZATION POINTS
- C
- NOPG = 0
- IF (IWORK(11) .NE. 1) GO TO 85
- IF (MXNON .LT. IWORK(1)) GO TO 70
- NOPG = 1
- MXNON = IWORK(1)
- WORK(MXNON+1) = 2. * XPTS(NXPTS) - XPTS(1)
- 85 CONTINUE
- C
- C **********************************************************************
- C ALLOCATE STORAGE FROM WORK AND IWORK ARRAYS
- C
- C (Z)
- K1 = 1 + (MXNON+1)
- C (P)
- K2 = K1 + NTP*(NON+1)
- C (W)
- K3 = K2 + NFCC*(NON+1)
- C (YHP)
- K4 = K3 + KKKYHP
- C (U)
- K5 = K4 + KKKU
- C (V)
- K6 = K5 + KKKV
- C (COEF)
- K7 = K6 + KKKCOE
- C (S)
- K8 = K7 + KKKS
- C (STOWA)
- K9 = K8 + KKKSTO
- C (G)
- K10 = K9 + KKKG
- K11 = K10 + KKKWS
- C REQUIRED ADDITIONAL REAL WORK SPACE STARTS AT WORK(K10)
- C AND EXTENDS TO WORK(K11-1)
- C
- C FIRST 17 LOCATIONS OF IWORK ARE USED FOR OPTIONAL
- C INPUT AND OUTPUT ITEMS
- C (IP)
- L1 = 18 + NFCC*(NON+1)
- L2 = L1 + LLLIWS
- C REQUIRED INTEGER WORK SPACE STARTS AT IWORK(L1)
- C AND EXTENDS TO IWORK(L2-1)
- C
- C **********************************************************************
- C SET INDICATOR FOR NORMALIZATION OF PARTICULAR SOLUTION
- C
- NPS = 0
- IF (IWORK(10) .EQ. 1) NPS = 1
- C
- C **********************************************************************
- C SET PIVOTING PARAMETER
- C
- INDPVT=0
- IF (IWORK(15) .EQ. 1) INDPVT=1
- C
- C **********************************************************************
- C SET OTHER COMMON BLOCK PARAMETERS
- C
- NFCD = NFC
- NCOMPD = NCOMP
- IGOFXD = IGOFX
- NXPTSD = NXPTS
- NICD = NIC
- RED = RE
- AED = AE
- NEQIVD = NEQIVP
- MNSWOT = 20
- IF (IWORK(13) .EQ. -1) MNSWOT=MAX(1,IWORK(14))
- XBEG=XPTS(1)
- XEND=XPTS(NXPTS)
- XSAV=XEND
- ICOCO=1
- IF (INHOMO .EQ. 3 .AND. NOPG .EQ. 1) WORK(MXNON+1)=XEND
- C
- C **********************************************************************
- C
- CALL EXBVP(Y,NROWY,XPTS,A,NROWA,ALPHA,B,NROWB,BETA,IFLAG,WORK,
- 1 IWORK)
- NFC=NFCC
- IWORK(17)=IWORK(L1)
- RETURN
- END
- *DECK C0LGMC
- COMPLEX FUNCTION C0LGMC (Z)
- C***BEGIN PROLOGUE C0LGMC
- C***PURPOSE Evaluate (Z+0.5)*LOG((Z+1.)/Z) - 1.0 with relative
- C accuracy.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C7A
- C***TYPE COMPLEX (C0LGMC-C)
- C***KEYWORDS FNLIB, GAMMA FUNCTION, SPECIAL FUNCTIONS
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C Evaluate (Z+0.5)*LOG((Z+1.0)/Z) - 1.0 with relative error accuracy
- C Let Q = 1.0/Z so that
- C (Z+0.5)*LOG(1+1/Z) - 1 = (Z+0.5)*(LOG(1+Q) - Q + Q*Q/2) - Q*Q/4
- C = (Z+0.5)*Q**3*C9LN2R(Q) - Q**2/4,
- C where C9LN2R is (LOG(1+Q) - Q + 0.5*Q**2) / Q**3.
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED C9LN2R, R1MACH
- C***REVISION HISTORY (YYMMDD)
- C 780401 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C***END PROLOGUE C0LGMC
- COMPLEX Z, Q, C9LN2R
- SAVE RBIG
- DATA RBIG / 0.0 /
- C***FIRST EXECUTABLE STATEMENT C0LGMC
- IF (RBIG.EQ.0.0) RBIG = 1.0/R1MACH(3)
- C
- CABSZ = ABS(Z)
- IF (CABSZ.GT.RBIG) C0LGMC = -(Z+0.5)*LOG(Z) - Z
- IF (CABSZ.GT.RBIG) RETURN
- C
- Q = 1.0/Z
- IF (CABSZ.LE.1.23) C0LGMC = (Z+0.5)*LOG(1.0+Q) - 1.0
- IF (CABSZ.GT.1.23) C0LGMC = ((1.+.5*Q)*C9LN2R(Q) - .25) * Q**2
- C
- RETURN
- END
- *DECK C1MERG
- SUBROUTINE C1MERG (TCOS, I1, M1, I2, M2, I3)
- C***BEGIN PROLOGUE C1MERG
- C***SUBSIDIARY
- C***PURPOSE Merge two strings of complex numbers. Each string is
- C ascending by the real part.
- C***LIBRARY SLATEC
- C***TYPE COMPLEX (S1MERG-S, D1MERG-D, C1MERG-C, I1MERG-I)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C This subroutine merges two ascending strings of numbers in the
- C array TCOS. The first string is of length M1 and starts at
- C TCOS(I1+1). The second string is of length M2 and starts at
- C TCOS(I2+1). The merged string goes into TCOS(I3+1). The ordering
- C is on the real part.
- C
- C***SEE ALSO CMGNBN
- C***ROUTINES CALLED CCOPY
- C***REVISION HISTORY (YYMMDD)
- C 801001 DATE WRITTEN
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900402 Added TYPE section. (WRB)
- C 910408 Modified to use IF-THEN-ELSE. Make it look like MERGE
- C which was modified earlier due to compiler problems on
- C the IBM RS6000. (RWC)
- C 920130 Code name changed from CMPMRG to C1MERG. (WRB)
- C***END PROLOGUE C1MERG
- INTEGER I1, I2, I3, M1, M2
- COMPLEX TCOS(*)
- C
- INTEGER J1, J2, J3
- C
- C***FIRST EXECUTABLE STATEMENT C1MERG
- IF (M1.EQ.0 .AND. M2.EQ.0) RETURN
- C
- IF (M1.EQ.0 .AND. M2.NE.0) THEN
- CALL CCOPY (M2, TCOS(I2+1), 1, TCOS(I3+1), 1)
- RETURN
- ENDIF
- C
- IF (M1.NE.0 .AND. M2.EQ.0) THEN
- CALL CCOPY (M1, TCOS(I1+1), 1, TCOS(I3+1), 1)
- RETURN
- ENDIF
- C
- J1 = 1
- J2 = 1
- J3 = 1
- C
- 10 IF (REAL(TCOS(J1+I1)) .LE. REAL(TCOS(I2+J2))) THEN
- TCOS(I3+J3) = TCOS(I1+J1)
- J1 = J1+1
- IF (J1 .GT. M1) THEN
- CALL CCOPY (M2-J2+1, TCOS(I2+J2), 1, TCOS(I3+J3+1), 1)
- RETURN
- ENDIF
- ELSE
- TCOS(I3+J3) = TCOS(I2+J2)
- J2 = J2+1
- IF (J2 .GT. M2) THEN
- CALL CCOPY (M1-J1+1, TCOS(I1+J1), 1, TCOS(I3+J3+1), 1)
- RETURN
- ENDIF
- ENDIF
- J3 = J3+1
- GO TO 10
- END
- *DECK C9LGMC
- COMPLEX FUNCTION C9LGMC (ZIN)
- C***BEGIN PROLOGUE C9LGMC
- C***SUBSIDIARY
- C***PURPOSE Compute the log gamma correction factor so that
- C LOG(CGAMMA(Z)) = 0.5*LOG(2.*PI) + (Z-0.5)*LOG(Z) - Z
- C + C9LGMC(Z).
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C7A
- C***TYPE COMPLEX (R9LGMC-S, D9LGMC-D, C9LGMC-C)
- C***KEYWORDS COMPLETE GAMMA FUNCTION, CORRECTION TERM, FNLIB,
- C LOG GAMMA, LOGARITHM, SPECIAL FUNCTIONS
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C Compute the LOG GAMMA correction term for large ABS(Z) when REAL(Z)
- C .GE. 0.0 and for large ABS(AIMAG(Y)) when REAL(Z) .LT. 0.0. We find
- C C9LGMC so that
- C LOG(Z) = 0.5*LOG(2.*PI) + (Z-0.5)*LOG(Z) - Z + C9LGMC(Z)
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 780401 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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 900720 Routine changed from user-callable to subsidiary. (WRB)
- C***END PROLOGUE C9LGMC
- COMPLEX ZIN, Z, Z2INV
- DIMENSION BERN(11)
- LOGICAL FIRST
- SAVE BERN, NTERM, BOUND, XBIG, XMAX, FIRST
- DATA BERN( 1) / .08333333333 3333333E0 /
- DATA BERN( 2) / -.002777777777 7777778E0 /
- DATA BERN( 3) / .0007936507936 5079365E0 /
- DATA BERN( 4) / -.0005952380952 3809524E0 /
- DATA BERN( 5) / .0008417508417 5084175E0 /
- DATA BERN( 6) / -.001917526917 5269175E0 /
- DATA BERN( 7) / .006410256410 2564103E0 /
- DATA BERN( 8) / -.02955065359 4771242E0 /
- DATA BERN( 9) / .1796443723 6883057E0 /
- DATA BERN(10) / -1.392432216 9059011E0 /
- DATA BERN(11) / 13.40286404 4168392E0 /
- DATA FIRST /.TRUE./
- C***FIRST EXECUTABLE STATEMENT C9LGMC
- IF (FIRST) THEN
- NTERM = -0.30*LOG(R1MACH(3))
- BOUND = 0.1170*NTERM*(0.1*R1MACH(3))**(-1./(2*NTERM-1))
- XBIG = 1.0/SQRT(R1MACH(3))
- XMAX = EXP (MIN(LOG(R1MACH(2)/12.0), -LOG(12.*R1MACH(1))) )
- ENDIF
- FIRST = .FALSE.
- C
- Z = ZIN
- X = REAL (Z)
- Y = AIMAG(Z)
- CABSZ = ABS(Z)
- C
- IF (X .LT. 0.0 .AND. ABS(Y) .LT. BOUND) CALL XERMSG ('SLATEC',
- + 'C9LGMC', 'NOT VALID FOR NEGATIVE REAL(Z) AND SMALL ' //
- + 'ABS(AIMAG(Z))', 2, 2)
- IF (CABSZ .LT. BOUND) CALL XERMSG ('SLATEC', 'C9LGMC',
- + 'NOT VALID FOR SMALL ABS(Z)', 3, 2)
- C
- IF (CABSZ.GE.XMAX) GO TO 50
- C
- IF (CABSZ.GE.XBIG) C9LGMC = 1.0/(12.0*Z)
- IF (CABSZ.GE.XBIG) RETURN
- C
- Z2INV = 1.0/Z**2
- C9LGMC = (0.0, 0.0)
- DO 40 I=1,NTERM
- NDX = NTERM + 1 - I
- C9LGMC = BERN(NDX) + C9LGMC*Z2INV
- 40 CONTINUE
- C
- C9LGMC = C9LGMC/Z
- RETURN
- C
- 50 C9LGMC = (0.0, 0.0)
- CALL XERMSG ('SLATEC', 'C9LGMC', 'Z SO BIG C9LGMC UNDERFLOWS', 1,
- + 1)
- RETURN
- C
- END
- *DECK C9LN2R
- COMPLEX FUNCTION C9LN2R (Z)
- C***BEGIN PROLOGUE C9LN2R
- C***SUBSIDIARY
- C***PURPOSE Evaluate LOG(1+Z) from second order relative accuracy so
- C that LOG(1+Z) = Z - Z**2/2 + Z**3*C9LN2R(Z).
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C4B
- C***TYPE COMPLEX (R9LN2R-S, D9LN2R-D, C9LN2R-C)
- C***KEYWORDS ELEMENTARY FUNCTIONS, FNLIB, LOGARITHM, SECOND ORDER
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C Evaluate LOG(1+Z) from 2-nd order with relative error accuracy so
- C that LOG(1+Z) = Z - Z**2/2 + Z**3*C9LN2R(Z).
- C
- C Now LOG(1+Z) = 0.5*LOG(1+2*X+ABS(Z)**2) + I*CARG(1+Z),
- C where X = REAL(Z) and Y = AIMAG(Z).
- C We find
- C Z**3 * C9LN2R(Z) = -X*ABS(Z)**2 - 0.25*ABS(Z)**4
- C + (2*X+ABS(Z)**2)**3 * R9LN2R(2*X+ABS(Z)**2)
- C + I * (CARG(1+Z) + (X-1)*Y)
- C The imaginary part must be evaluated carefully as
- C (ATAN(Y/(1+X)) - Y/(1+X)) + Y/(1+X) - (1-X)*Y
- C = (Y/(1+X))**3 * R9ATN1(Y/(1+X)) + X**2*Y/(1+X)
- C
- C Now we divide through by Z**3 carefully. Write
- C 1/Z**3 = (X-I*Y)/ABS(Z)**3 * (1/ABS(Z)**3)
- C then C9LN2R(Z) = ((X-I*Y)/ABS(Z))**3 * (-X/ABS(Z) - ABS(Z)/4
- C + 0.5*((2*X+ABS(Z)**2)/ABS(Z))**3 * R9LN2R(2*X+ABS(Z)**2)
- C + I*Y/(ABS(Z)*(1+X)) * ((X/ABS(Z))**2 +
- C + (Y/(ABS(Z)*(1+X)))**2 * R9ATN1(Y/(1+X)) ) )
- C
- C If we let XZ = X/ABS(Z) and YZ = Y/ABS(Z) we may write
- C C9LN2R(Z) = (XZ-I*YZ)**3 * (-XZ - ABS(Z)/4
- C + 0.5*(2*XZ+ABS(Z))**3 * R9LN2R(2*X+ABS(Z)**2)
- C + I*YZ/(1+X) * (XZ**2 + (YZ/(1+X))**2*R9ATN1(Y/(1+X)) ))
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED R9ATN1, R9LN2R
- C***REVISION HISTORY (YYMMDD)
- C 780401 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900720 Routine changed from user-callable to subsidiary. (WRB)
- C***END PROLOGUE C9LN2R
- COMPLEX Z
- C***FIRST EXECUTABLE STATEMENT C9LN2R
- X = REAL (Z)
- Y = AIMAG (Z)
- C
- CABSZ = ABS(Z)
- IF (CABSZ.GT.0.8125) GO TO 20
- C
- C9LN2R = CMPLX (1.0/3.0, 0.0)
- IF (CABSZ.EQ.0.0) RETURN
- C
- XZ = X/CABSZ
- YZ = Y/CABSZ
- C
- ARG = 2.0*XZ + CABSZ
- RPART = 0.5*ARG**3*R9LN2R(CABSZ*ARG) - XZ - 0.25*CABSZ
- Y1X = YZ/(1.0+X)
- AIPART = Y1X * (XZ**2 + Y1X**2*R9ATN1(CABSZ*Y1X) )
- C
- C9LN2R = CMPLX(XZ,-YZ)**3 * CMPLX(RPART,AIPART)
- RETURN
- C
- 20 C9LN2R = (LOG(1.0+Z) - Z*(1.0-0.5*Z)) / Z**3
- RETURN
- C
- END
- *DECK CACOS
- COMPLEX FUNCTION CACOS (Z)
- C***BEGIN PROLOGUE CACOS
- C***PURPOSE Compute the complex arc cosine.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C4A
- C***TYPE COMPLEX (CACOS-C)
- C***KEYWORDS ARC COSINE, ELEMENTARY FUNCTIONS, FNLIB, TRIGONOMETRIC
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C CACOS(Z) calculates the complex trigonometric arc cosine of Z.
- C The result is in units of radians, and the real part is in the
- C first or second quadrant.
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED CASIN
- C***REVISION HISTORY (YYMMDD)
- C 770401 DATE WRITTEN
- C 861211 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C***END PROLOGUE CACOS
- COMPLEX Z, CASIN
- SAVE PI2
- DATA PI2 /1.5707963267 9489661923E0/
- C***FIRST EXECUTABLE STATEMENT CACOS
- CACOS = PI2 - CASIN (Z)
- C
- RETURN
- END
- *DECK CACOSH
- COMPLEX FUNCTION CACOSH (Z)
- C***BEGIN PROLOGUE CACOSH
- C***PURPOSE Compute the arc hyperbolic cosine.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C4C
- C***TYPE COMPLEX (ACOSH-S, DACOSH-D, CACOSH-C)
- C***KEYWORDS ACOSH, ARC HYPERBOLIC COSINE, ELEMENTARY FUNCTIONS, FNLIB,
- C INVERSE HYPERBOLIC COSINE
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C CACOSH(Z) calculates the complex arc hyperbolic cosine of Z.
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED CACOS
- C***REVISION HISTORY (YYMMDD)
- C 770401 DATE WRITTEN
- C 861211 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C***END PROLOGUE CACOSH
- COMPLEX Z, CI, CACOS
- SAVE CI
- DATA CI /(0.,1.)/
- C***FIRST EXECUTABLE STATEMENT CACOSH
- CACOSH = CI*CACOS(Z)
- C
- RETURN
- END
- *DECK CARG
- FUNCTION CARG (Z)
- C***BEGIN PROLOGUE CARG
- C***PURPOSE Compute the argument of a complex number.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY A4A
- C***TYPE COMPLEX (CARG-C)
- C***KEYWORDS ARGUMENT OF A COMPLEX NUMBER, ELEMENTARY FUNCTIONS, FNLIB
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C CARG(Z) calculates the argument of the complex number Z. Note
- C that CARG returns a real result. If Z = X+iY, then CARG is ATAN(Y/X),
- C except when both X and Y are zero, in which case the result
- C will be zero.
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 770401 DATE WRITTEN
- C 861211 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C***END PROLOGUE CARG
- COMPLEX Z
- C***FIRST EXECUTABLE STATEMENT CARG
- CARG = 0.0
- IF (REAL(Z).NE.0. .OR. AIMAG(Z).NE.0.) CARG =
- 1 ATAN2 (AIMAG(Z), REAL(Z))
- C
- RETURN
- END
- *DECK CASIN
- COMPLEX FUNCTION CASIN (ZINP)
- C***BEGIN PROLOGUE CASIN
- C***PURPOSE Compute the complex arc sine.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C4A
- C***TYPE COMPLEX (CASIN-C)
- C***KEYWORDS ARC SINE, ELEMENTARY FUNCTIONS, FNLIB, TRIGONOMETRIC
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C CASIN(ZINP) calculates the complex trigonometric arc sine of ZINP.
- C The result is in units of radians, and the real part is in the first
- C or fourth quadrant.
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED R1MACH
- C***REVISION HISTORY (YYMMDD)
- C 770701 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C***END PROLOGUE CASIN
- COMPLEX ZINP, Z, Z2, SQZP1, CI
- LOGICAL FIRST
- SAVE PI2, PI, CI, NTERMS, RMIN, FIRST
- DATA PI2 /1.5707963267 9489661923E0/
- DATA PI /3.1415926535 8979324E0/
- DATA CI /(0.,1.)/
- DATA FIRST /.TRUE./
- C***FIRST EXECUTABLE STATEMENT CASIN
- IF (FIRST) THEN
- C NTERMS = LOG(EPS)/LOG(RMAX) WHERE RMAX = 0.1
- NTERMS = -0.4343*LOG(R1MACH(3))
- RMIN = SQRT (6.0*R1MACH(3))
- ENDIF
- FIRST = .FALSE.
- C
- Z = ZINP
- R = ABS (Z)
- IF (R.GT.0.1) GO TO 30
- C
- CASIN = Z
- IF (R.LT.RMIN) RETURN
- C
- CASIN = (0.0, 0.0)
- Z2 = Z*Z
- DO 20 I=1,NTERMS
- TWOI = 2*(NTERMS-I) + 1
- CASIN = 1.0/TWOI + TWOI*CASIN*Z2/(TWOI+1.0)
- 20 CONTINUE
- CASIN = Z*CASIN
- RETURN
- C
- 30 IF (REAL(ZINP).LT.0.0) Z = -ZINP
- C
- SQZP1 = SQRT (Z+1.0)
- IF (AIMAG(SQZP1).LT.0.) SQZP1 = -SQZP1
- CASIN = PI2 - CI * LOG (Z + SQZP1*SQRT(Z-1.0))
- C
- IF (REAL(CASIN).GT.PI2) CASIN = PI - CASIN
- IF (REAL(CASIN).LE.(-PI2)) CASIN = -PI - CASIN
- IF (REAL(ZINP).LT.0.) CASIN = -CASIN
- C
- RETURN
- END
- *DECK CASINH
- COMPLEX FUNCTION CASINH (Z)
- C***BEGIN PROLOGUE CASINH
- C***PURPOSE Compute the arc hyperbolic sine.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C4C
- C***TYPE COMPLEX (ASINH-S, DASINH-D, CASINH-C)
- C***KEYWORDS ARC HYPERBOLIC SINE, ASINH, ELEMENTARY FUNCTIONS, FNLIB,
- C INVERSE HYPERBOLIC SINE
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C CASINH(Z) calculates the complex arc hyperbolic sine of Z.
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED CASIN
- C***REVISION HISTORY (YYMMDD)
- C 770401 DATE WRITTEN
- C 861211 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C***END PROLOGUE CASINH
- COMPLEX Z, CI, CASIN
- SAVE CI
- DATA CI /(0.,1.)/
- C***FIRST EXECUTABLE STATEMENT CASINH
- CASINH = -CI*CASIN (CI*Z)
- C
- RETURN
- END
- *DECK CATAN
- COMPLEX FUNCTION CATAN (Z)
- C***BEGIN PROLOGUE CATAN
- C***PURPOSE Compute the complex arc tangent.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C4A
- C***TYPE COMPLEX (CATAN-C)
- C***KEYWORDS ARC TANGENT, ELEMENTARY FUNCTIONS, FNLIB, TRIGONOMETRIC
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C CATAN(Z) calculates the complex trigonometric arc tangent of Z.
- C The result is in units of radians, and the real part is in the first
- C or fourth quadrant.
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770801 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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***END PROLOGUE CATAN
- COMPLEX Z, Z2
- LOGICAL FIRST
- SAVE PI2, NTERMS, SQEPS, RMIN, RMAX, FIRST
- DATA PI2 / 1.5707963267 9489661923E0 /
- DATA FIRST /.TRUE./
- C***FIRST EXECUTABLE STATEMENT CATAN
- IF (FIRST) THEN
- C NTERMS = LOG(EPS)/LOG(RBND) WHERE RBND = 0.1
- NTERMS = -0.4343*LOG(R1MACH(3)) + 1.0
- SQEPS = SQRT(R1MACH(4))
- RMIN = SQRT (3.0*R1MACH(3))
- RMAX = 1.0/R1MACH(3)
- ENDIF
- FIRST = .FALSE.
- C
- R = ABS(Z)
- IF (R.GT.0.1) GO TO 30
- C
- CATAN = Z
- IF (R.LT.RMIN) RETURN
- C
- CATAN = (0.0, 0.0)
- Z2 = Z*Z
- DO 20 I=1,NTERMS
- TWOI = 2*(NTERMS-I) + 1
- CATAN = 1.0/TWOI - Z2*CATAN
- 20 CONTINUE
- CATAN = Z*CATAN
- RETURN
- C
- 30 IF (R.GT.RMAX) GO TO 50
- X = REAL(Z)
- Y = AIMAG(Z)
- R2 = R*R
- IF (R2 .EQ. 1.0 .AND. X .EQ. 0.0) CALL XERMSG ('SLATEC', 'CATAN',
- + 'Z IS +I OR -I', 2, 2)
- IF (ABS(R2-1.0).GT.SQEPS) GO TO 40
- IF (ABS(CMPLX(1.0, 0.0)+Z*Z) .LT. SQEPS) CALL XERMSG ('SLATEC',
- + 'CATAN', 'ANSWER LT HALF PRECISION, Z**2 CLOSE TO -1', 1, 1)
- C
- 40 XANS = 0.5*ATAN2(2.0*X, 1.0-R2)
- YANS = 0.25*LOG((R2+2.0*Y+1.0)/(R2-2.0*Y+1.0))
- CATAN = CMPLX (XANS, YANS)
- RETURN
- C
- 50 CATAN = CMPLX (PI2, 0.)
- IF (REAL(Z).LT.0.0) CATAN = CMPLX(-PI2,0.0)
- RETURN
- C
- END
- *DECK CATAN2
- COMPLEX FUNCTION CATAN2 (CSN, CCS)
- C***BEGIN PROLOGUE CATAN2
- C***PURPOSE Compute the complex arc tangent in the proper quadrant.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C4A
- C***TYPE COMPLEX (CATAN2-C)
- C***KEYWORDS ARC TANGENT, ELEMENTARY FUNCTIONS, FNLIB, POLAR ANGEL,
- C QUADRANT, TRIGONOMETRIC
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C CATAN2(CSN,CCS) calculates the complex trigonometric arc
- C tangent of the ratio CSN/CCS and returns a result whose real
- C part is in the correct quadrant (within a multiple of 2*PI). The
- C result is in units of radians and the real part is between -PI
- C and +PI.
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED CATAN, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770401 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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***END PROLOGUE CATAN2
- COMPLEX CSN, CCS, CATAN
- SAVE PI
- DATA PI / 3.1415926535 8979323846E0 /
- C***FIRST EXECUTABLE STATEMENT CATAN2
- IF (ABS(CCS).EQ.0.) GO TO 10
- C
- CATAN2 = CATAN (CSN/CCS)
- IF (REAL(CCS).LT.0.) CATAN2 = CATAN2 + PI
- IF (REAL(CATAN2).GT.PI) CATAN2 = CATAN2 - 2.0*PI
- RETURN
- C
- 10 IF (ABS(CSN) .EQ. 0.) CALL XERMSG ('SLATEC', 'CATAN2',
- + 'CALLED WITH BOTH ARGUMENTS ZERO', 1, 2)
- C
- CATAN2 = CMPLX (SIGN(0.5*PI,REAL(CSN)), 0.0)
- C
- RETURN
- END
- *DECK CATANH
- COMPLEX FUNCTION CATANH (Z)
- C***BEGIN PROLOGUE CATANH
- C***PURPOSE Compute the arc hyperbolic tangent.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C4C
- C***TYPE COMPLEX (ATANH-S, DATANH-D, CATANH-C)
- C***KEYWORDS ARC HYPERBOLIC TANGENT, ATANH, ELEMENTARY FUNCTIONS,
- C FNLIB, INVERSE HYPERBOLIC TANGENT
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C CATANH(Z) calculates the complex arc hyperbolic tangent of Z.
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED CATAN
- C***REVISION HISTORY (YYMMDD)
- C 770401 DATE WRITTEN
- C 861211 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C***END PROLOGUE CATANH
- COMPLEX Z, CI, CATAN
- SAVE CI
- DATA CI /(0.,1.)/
- C***FIRST EXECUTABLE STATEMENT CATANH
- CATANH = -CI*CATAN(CI*Z)
- C
- RETURN
- END
- *DECK CAXPY
- SUBROUTINE CAXPY (N, CA, CX, INCX, CY, INCY)
- C***BEGIN PROLOGUE CAXPY
- C***PURPOSE Compute a constant times a vector plus a vector.
- C***LIBRARY SLATEC (BLAS)
- C***CATEGORY D1A7
- C***TYPE COMPLEX (SAXPY-S, DAXPY-D, CAXPY-C)
- C***KEYWORDS BLAS, LINEAR ALGEBRA, TRIAD, VECTOR
- C***AUTHOR Lawson, C. L., (JPL)
- C Hanson, R. J., (SNLA)
- C Kincaid, D. R., (U. of Texas)
- C Krogh, F. T., (JPL)
- C***DESCRIPTION
- C
- C B L A S Subprogram
- C Description of Parameters
- C
- C --Input--
- C N number of elements in input vector(s)
- C CA complex scalar multiplier
- C CX complex vector with N elements
- C INCX storage spacing between elements of CX
- C CY complex vector with N elements
- C INCY storage spacing between elements of CY
- C
- C --Output--
- C CY complex result (unchanged if N .LE. 0)
- C
- C Overwrite complex CY with complex CA*CX + CY.
- C For I = 0 to N-1, replace CY(LY+I*INCY) with CA*CX(LX+I*INCX) +
- C CY(LY+I*INCY),
- C where LX = 1 if INCX .GE. 0, else LX = 1+(1-N)*INCX, and LY is
- C defined in a similar way using INCY.
- C
- C***REFERENCES C. L. Lawson, R. J. Hanson, D. R. Kincaid and F. T.
- C Krogh, Basic linear algebra subprograms for Fortran
- C usage, Algorithm No. 539, Transactions on Mathematical
- C Software 5, 3 (September 1979), pp. 308-323.
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 791001 DATE WRITTEN
- C 861211 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920310 Corrected definition of LX in DESCRIPTION. (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CAXPY
- COMPLEX CX(*),CY(*),CA
- C***FIRST EXECUTABLE STATEMENT CAXPY
- CANORM = ABS(REAL(CA)) + ABS(AIMAG(CA))
- IF (N.LE.0 .OR. CANORM.EQ.0.0E0) RETURN
- IF (INCX.EQ.INCY .AND. INCX.GT.0) GO TO 20
- C
- C Code for unequal or nonpositive increments.
- C
- KX = 1
- KY = 1
- IF (INCX .LT. 0) KX = 1+(1-N)*INCX
- IF (INCY .LT. 0) KY = 1+(1-N)*INCY
- DO 10 I = 1,N
- CY(KY) = CY(KY) + CA*CX(KX)
- KX = KX + INCX
- KY = KY + INCY
- 10 CONTINUE
- RETURN
- C
- C Code for equal, positive, non-unit increments.
- C
- 20 NS = N*INCX
- DO 30 I = 1,NS,INCX
- CY(I) = CA*CX(I) + CY(I)
- 30 CONTINUE
- RETURN
- END
- *DECK CBABK2
- SUBROUTINE CBABK2 (NM, N, LOW, IGH, SCALE, M, ZR, ZI)
- C***BEGIN PROLOGUE CBABK2
- C***PURPOSE Form the eigenvectors of a complex general matrix from the
- C eigenvectors of matrix output from CBAL.
- C***LIBRARY SLATEC (EISPACK)
- C***CATEGORY D4C4
- C***TYPE COMPLEX (BALBAK-S, CBABK2-C)
- C***KEYWORDS EIGENVECTORS, EISPACK
- C***AUTHOR Smith, B. T., et al.
- C***DESCRIPTION
- C
- C This subroutine is a translation of the ALGOL procedure
- C CBABK2, which is a complex version of BALBAK,
- C NUM. MATH. 13, 293-304(1969) by Parlett and Reinsch.
- C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 315-326(1971).
- C
- C This subroutine forms the eigenvectors of a COMPLEX GENERAL
- C matrix by back transforming those of the corresponding
- C balanced matrix determined by CBAL.
- C
- C On INPUT
- C
- C NM must be set to the row dimension of the two-dimensional
- C array parameters, ZR and ZI, as declared in the calling
- C program dimension statement. NM is an INTEGER variable.
- C
- C N is the order of the matrix Z=(ZR,ZI). N is an INTEGER
- C variable. N must be less than or equal to NM.
- C
- C LOW and IGH are INTEGER variables determined by CBAL.
- C
- C SCALE contains information determining the permutations and
- C scaling factors used by CBAL. SCALE is a one-dimensional
- C REAL array, dimensioned SCALE(N).
- C
- C M is the number of eigenvectors to be back transformed.
- C M is an INTEGER variable.
- C
- C ZR and ZI contain the real and imaginary parts, respectively,
- C of the eigenvectors to be back transformed in their first
- C M columns. ZR and ZI are two-dimensional REAL arrays,
- C dimensioned ZR(NM,M) and ZI(NM,M).
- C
- C On OUTPUT
- C
- C ZR and ZI contain the real and imaginary parts,
- C respectively, of the transformed eigenvectors
- C in their first M columns.
- C
- C Questions and comments should be directed to B. S. Garbow,
- C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY
- C ------------------------------------------------------------------
- C
- C***REFERENCES B. T. Smith, J. M. Boyle, J. J. Dongarra, B. S. Garbow,
- C Y. Ikebe, V. C. Klema and C. B. Moler, Matrix Eigen-
- C system Routines - EISPACK Guide, Springer-Verlag,
- C 1976.
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 760101 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CBABK2
- C
- INTEGER I,J,K,M,N,II,NM,IGH,LOW
- REAL SCALE(*),ZR(NM,*),ZI(NM,*)
- REAL S
- C
- C***FIRST EXECUTABLE STATEMENT CBABK2
- IF (M .EQ. 0) GO TO 200
- IF (IGH .EQ. LOW) GO TO 120
- C
- DO 110 I = LOW, IGH
- S = SCALE(I)
- C .......... LEFT HAND EIGENVECTORS ARE BACK TRANSFORMED
- C IF THE FOREGOING STATEMENT IS REPLACED BY
- C S=1.0E0/SCALE(I). ..........
- DO 100 J = 1, M
- ZR(I,J) = ZR(I,J) * S
- ZI(I,J) = ZI(I,J) * S
- 100 CONTINUE
- C
- 110 CONTINUE
- C .......... FOR I=LOW-1 STEP -1 UNTIL 1,
- C IGH+1 STEP 1 UNTIL N DO -- ..........
- 120 DO 140 II = 1, N
- I = II
- IF (I .GE. LOW .AND. I .LE. IGH) GO TO 140
- IF (I .LT. LOW) I = LOW - II
- K = SCALE(I)
- IF (K .EQ. I) GO TO 140
- C
- DO 130 J = 1, M
- S = ZR(I,J)
- ZR(I,J) = ZR(K,J)
- ZR(K,J) = S
- S = ZI(I,J)
- ZI(I,J) = ZI(K,J)
- ZI(K,J) = S
- 130 CONTINUE
- C
- 140 CONTINUE
- C
- 200 RETURN
- END
- *DECK CBAL
- SUBROUTINE CBAL (NM, N, AR, AI, LOW, IGH, SCALE)
- C***BEGIN PROLOGUE CBAL
- C***PURPOSE Balance a complex general matrix and isolate eigenvalues
- C whenever possible.
- C***LIBRARY SLATEC (EISPACK)
- C***CATEGORY D4C1A
- C***TYPE COMPLEX (BALANC-S, CBAL-C)
- C***KEYWORDS EIGENVECTORS, EISPACK
- C***AUTHOR Smith, B. T., et al.
- C***DESCRIPTION
- C
- C This subroutine is a translation of the ALGOL procedure
- C CBALANCE, which is a complex version of BALANCE,
- C NUM. MATH. 13, 293-304(1969) by Parlett and Reinsch.
- C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 315-326(1971).
- C
- C This subroutine balances a COMPLEX matrix and isolates
- C eigenvalues whenever possible.
- C
- C On INPUT
- C
- C NM must be set to the row dimension of the two-dimensional
- C array parameters, AR and AI, as declared in the calling
- C program dimension statement. NM is an INTEGER variable.
- C
- C N is the order of the matrix A=(AR,AI). N is an INTEGER
- C variable. N must be less than or equal to NM.
- C
- C AR and AI contain the real and imaginary parts,
- C respectively, of the complex matrix to be balanced.
- C AR and AI are two-dimensional REAL arrays, dimensioned
- C AR(NM,N) and AI(NM,N).
- C
- C On OUTPUT
- C
- C AR and AI contain the real and imaginary parts,
- C respectively, of the balanced matrix.
- C
- C LOW and IGH are two INTEGER variables such that AR(I,J)
- C and AI(I,J) are equal to zero if
- C (1) I is greater than J and
- C (2) J=1,...,LOW-1 or I=IGH+1,...,N.
- C
- C SCALE contains information determining the permutations and
- C scaling factors used. SCALE is a one-dimensional REAL array,
- C dimensioned SCALE(N).
- C
- C Suppose that the principal submatrix in rows LOW through IGH
- C has been balanced, that P(J) denotes the index interchanged
- C with J during the permutation step, and that the elements
- C of the diagonal matrix used are denoted by D(I,J). Then
- C SCALE(J) = P(J), for J = 1,...,LOW-1
- C = D(J,J) J = LOW,...,IGH
- C = P(J) J = IGH+1,...,N.
- C The order in which the interchanges are made is N to IGH+1,
- C then 1 to LOW-1.
- C
- C Note that 1 is returned for IGH if IGH is zero formally.
- C
- C The ALGOL procedure EXC contained in CBALANCE appears in
- C CBAL in line. (Note that the ALGOL roles of identifiers
- C K,L have been reversed.)
- C
- C Questions and comments should be directed to B. S. Garbow,
- C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY
- C ------------------------------------------------------------------
- C
- C***REFERENCES B. T. Smith, J. M. Boyle, J. J. Dongarra, B. S. Garbow,
- C Y. Ikebe, V. C. Klema and C. B. Moler, Matrix Eigen-
- C system Routines - EISPACK Guide, Springer-Verlag,
- C 1976.
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 760101 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CBAL
- C
- INTEGER I,J,K,L,M,N,JJ,NM,IGH,LOW,IEXC
- REAL AR(NM,*),AI(NM,*),SCALE(*)
- REAL C,F,G,R,S,B2,RADIX
- LOGICAL NOCONV
- C
- C THE FOLLOWING PORTABLE VALUE OF RADIX WORKS WELL ENOUGH
- C FOR ALL MACHINES WHOSE BASE IS A POWER OF TWO.
- C
- C***FIRST EXECUTABLE STATEMENT CBAL
- RADIX = 16
- C
- B2 = RADIX * RADIX
- K = 1
- L = N
- GO TO 100
- C .......... IN-LINE PROCEDURE FOR ROW AND
- C COLUMN EXCHANGE ..........
- 20 SCALE(M) = J
- IF (J .EQ. M) GO TO 50
- C
- DO 30 I = 1, L
- F = AR(I,J)
- AR(I,J) = AR(I,M)
- AR(I,M) = F
- F = AI(I,J)
- AI(I,J) = AI(I,M)
- AI(I,M) = F
- 30 CONTINUE
- C
- DO 40 I = K, N
- F = AR(J,I)
- AR(J,I) = AR(M,I)
- AR(M,I) = F
- F = AI(J,I)
- AI(J,I) = AI(M,I)
- AI(M,I) = F
- 40 CONTINUE
- C
- 50 GO TO (80,130), IEXC
- C .......... SEARCH FOR ROWS ISOLATING AN EIGENVALUE
- C AND PUSH THEM DOWN ..........
- 80 IF (L .EQ. 1) GO TO 280
- L = L - 1
- C .......... FOR J=L STEP -1 UNTIL 1 DO -- ..........
- 100 DO 120 JJ = 1, L
- J = L + 1 - JJ
- C
- DO 110 I = 1, L
- IF (I .EQ. J) GO TO 110
- IF (AR(J,I) .NE. 0.0E0 .OR. AI(J,I) .NE. 0.0E0) GO TO 120
- 110 CONTINUE
- C
- M = L
- IEXC = 1
- GO TO 20
- 120 CONTINUE
- C
- GO TO 140
- C .......... SEARCH FOR COLUMNS ISOLATING AN EIGENVALUE
- C AND PUSH THEM LEFT ..........
- 130 K = K + 1
- C
- 140 DO 170 J = K, L
- C
- DO 150 I = K, L
- IF (I .EQ. J) GO TO 150
- IF (AR(I,J) .NE. 0.0E0 .OR. AI(I,J) .NE. 0.0E0) GO TO 170
- 150 CONTINUE
- C
- M = K
- IEXC = 2
- GO TO 20
- 170 CONTINUE
- C .......... NOW BALANCE THE SUBMATRIX IN ROWS K TO L ..........
- DO 180 I = K, L
- 180 SCALE(I) = 1.0E0
- C .......... ITERATIVE LOOP FOR NORM REDUCTION ..........
- 190 NOCONV = .FALSE.
- C
- DO 270 I = K, L
- C = 0.0E0
- R = 0.0E0
- C
- DO 200 J = K, L
- IF (J .EQ. I) GO TO 200
- C = C + ABS(AR(J,I)) + ABS(AI(J,I))
- R = R + ABS(AR(I,J)) + ABS(AI(I,J))
- 200 CONTINUE
- C .......... GUARD AGAINST ZERO C OR R DUE TO UNDERFLOW ..........
- IF (C .EQ. 0.0E0 .OR. R .EQ. 0.0E0) GO TO 270
- G = R / RADIX
- F = 1.0E0
- S = C + R
- 210 IF (C .GE. G) GO TO 220
- F = F * RADIX
- C = C * B2
- GO TO 210
- 220 G = R * RADIX
- 230 IF (C .LT. G) GO TO 240
- F = F / RADIX
- C = C / B2
- GO TO 230
- C .......... NOW BALANCE ..........
- 240 IF ((C + R) / F .GE. 0.95E0 * S) GO TO 270
- G = 1.0E0 / F
- SCALE(I) = SCALE(I) * F
- NOCONV = .TRUE.
- C
- DO 250 J = K, N
- AR(I,J) = AR(I,J) * G
- AI(I,J) = AI(I,J) * G
- 250 CONTINUE
- C
- DO 260 J = 1, L
- AR(J,I) = AR(J,I) * F
- AI(J,I) = AI(J,I) * F
- 260 CONTINUE
- C
- 270 CONTINUE
- C
- IF (NOCONV) GO TO 190
- C
- 280 LOW = K
- IGH = L
- RETURN
- END
- *DECK CBETA
- COMPLEX FUNCTION CBETA (A, B)
- C***BEGIN PROLOGUE CBETA
- C***PURPOSE Compute the complete Beta function.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C7B
- C***TYPE COMPLEX (BETA-S, DBETA-D, CBETA-C)
- C***KEYWORDS COMPLETE BETA FUNCTION, FNLIB, SPECIAL FUNCTIONS
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C CBETA computes the complete beta function of complex parameters A
- C and B.
- C Input Parameters:
- C A complex and the real part of A positive
- C B complex and the real part of B positive
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED CGAMMA, CLBETA, GAMLIM, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770701 DATE WRITTEN
- C 890206 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 900727 Added EXTERNAL statement. (WRB)
- C***END PROLOGUE CBETA
- COMPLEX A, B, CGAMMA, CLBETA
- EXTERNAL CGAMMA
- SAVE XMAX
- DATA XMAX / 0.0 /
- C***FIRST EXECUTABLE STATEMENT CBETA
- IF (XMAX.EQ.0.0) THEN
- CALL GAMLIM (XMIN, XMAXT)
- XMAX = XMAXT
- ENDIF
- C
- IF (REAL(A) .LE. 0.0 .OR. REAL(B) .LE. 0.0) CALL XERMSG ('SLATEC',
- + 'CBETA', 'REAL PART OF BOTH ARGUMENTS MUST BE GT 0', 1, 2)
- C
- IF (REAL(A)+REAL(B).LT.XMAX) CBETA = CGAMMA(A) * (CGAMMA(B)/
- 1 CGAMMA(A+B) )
- IF (REAL(A)+REAL(B).LT.XMAX) RETURN
- C
- CBETA = EXP (CLBETA(A, B))
- C
- RETURN
- END
- *DECK CBLKT1
- SUBROUTINE CBLKT1 (N, AN, BN, CN, M, AM, BM, CM, IDIMY, Y, B, W1,
- + W2, W3, WD, WW, WU, PRDCT, CPRDCT)
- C***BEGIN PROLOGUE CBLKT1
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to CBLKTR
- C***LIBRARY SLATEC
- C***TYPE COMPLEX (BLKTR1-S, CBLKT1-C)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C CBLKT1 solves the linear system of routine CBLKTR.
- C
- C B contains the roots of all the B polynomials.
- C W1,W2,W3,WD,WW,WU are all working arrays.
- C PRDCT is either PROCP or PROC depending on whether the boundary
- C conditions in the M direction are periodic or not.
- C CPRDCT is either CPROCP or CPROC which are called if some of the zeros
- C of the B polynomials are complex.
- C
- C***SEE ALSO CBLKTR
- C***ROUTINES CALLED INXCA, INXCB, INXCC
- C***COMMON BLOCKS CCBLK
- C***REVISION HISTORY (YYMMDD)
- C 801001 DATE WRITTEN
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900402 Added TYPE section. (WRB)
- C***END PROLOGUE CBLKT1
- C
- DIMENSION AN(*) ,BN(*) ,CN(*) ,AM(*) ,
- 1 BM(*) ,CM(*) ,B(*) ,W1(*) ,
- 2 W2(*) ,W3(*) ,WD(*) ,WW(*) ,
- 3 WU(*) ,Y(IDIMY,*)
- COMMON /CCBLK/ NPP ,K ,EPS ,CNV ,
- 1 NM ,NCMPLX ,IK
- COMPLEX AM ,BM ,CM ,Y ,
- 1 W1 ,W2 ,W3 ,WD ,
- 2 WW ,WU
- C***FIRST EXECUTABLE STATEMENT CBLKT1
- KDO = K-1
- DO 109 L=1,KDO
- IR = L-1
- I2 = 2**IR
- I1 = I2/2
- I3 = I2+I1
- I4 = I2+I2
- IRM1 = IR-1
- CALL INXCB (I2,IR,IM2,NM2)
- CALL INXCB (I1,IRM1,IM3,NM3)
- CALL INXCB (I3,IRM1,IM1,NM1)
- CALL PRDCT (NM2,B(IM2),NM3,B(IM3),NM1,B(IM1),0,DUM,Y(1,I2),W3,
- 1 M,AM,BM,CM,WD,WW,WU)
- IF = 2**K
- DO 108 I=I4,IF,I4
- IF (I-NM) 101,101,108
- 101 IPI1 = I+I1
- IPI2 = I+I2
- IPI3 = I+I3
- CALL INXCC (I,IR,IDXC,NC)
- IF (I-IF) 102,108,108
- 102 CALL INXCA (I,IR,IDXA,NA)
- CALL INXCB (I-I1,IRM1,IM1,NM1)
- CALL INXCB (IPI2,IR,IP2,NP2)
- CALL INXCB (IPI1,IRM1,IP1,NP1)
- CALL INXCB (IPI3,IRM1,IP3,NP3)
- CALL PRDCT (NM1,B(IM1),0,DUM,0,DUM,NA,AN(IDXA),W3,W1,M,AM,
- 1 BM,CM,WD,WW,WU)
- IF (IPI2-NM) 105,105,103
- 103 DO 104 J=1,M
- W3(J) = (0.,0.)
- W2(J) = (0.,0.)
- 104 CONTINUE
- GO TO 106
- 105 CALL PRDCT (NP2,B(IP2),NP1,B(IP1),NP3,B(IP3),0,DUM,
- 1 Y(1,IPI2),W3,M,AM,BM,CM,WD,WW,WU)
- CALL PRDCT (NP1,B(IP1),0,DUM,0,DUM,NC,CN(IDXC),W3,W2,M,AM,
- 1 BM,CM,WD,WW,WU)
- 106 DO 107 J=1,M
- Y(J,I) = W1(J)+W2(J)+Y(J,I)
- 107 CONTINUE
- 108 CONTINUE
- 109 CONTINUE
- IF (NPP) 132,110,132
- C
- C THE PERIODIC CASE IS TREATED USING THE CAPACITANCE MATRIX METHOD
- C
- 110 IF = 2**K
- I = IF/2
- I1 = I/2
- CALL INXCB (I-I1,K-2,IM1,NM1)
- CALL INXCB (I+I1,K-2,IP1,NP1)
- CALL INXCB (I,K-1,IZ,NZ)
- CALL PRDCT (NZ,B(IZ),NM1,B(IM1),NP1,B(IP1),0,DUM,Y(1,I),W1,M,AM,
- 1 BM,CM,WD,WW,WU)
- IZR = I
- DO 111 J=1,M
- W2(J) = W1(J)
- 111 CONTINUE
- DO 113 LL=2,K
- L = K-LL+1
- IR = L-1
- I2 = 2**IR
- I1 = I2/2
- I = I2
- CALL INXCC (I,IR,IDXC,NC)
- CALL INXCB (I,IR,IZ,NZ)
- CALL INXCB (I-I1,IR-1,IM1,NM1)
- CALL INXCB (I+I1,IR-1,IP1,NP1)
- CALL PRDCT (NP1,B(IP1),0,DUM,0,DUM,NC,CN(IDXC),W1,W1,M,AM,BM,
- 1 CM,WD,WW,WU)
- DO 112 J=1,M
- W1(J) = Y(J,I)+W1(J)
- 112 CONTINUE
- CALL PRDCT (NZ,B(IZ),NM1,B(IM1),NP1,B(IP1),0,DUM,W1,W1,M,AM,
- 1 BM,CM,WD,WW,WU)
- 113 CONTINUE
- DO 118 LL=2,K
- L = K-LL+1
- IR = L-1
- I2 = 2**IR
- I1 = I2/2
- I4 = I2+I2
- IFD = IF-I2
- DO 117 I=I2,IFD,I4
- IF (I-I2-IZR) 117,114,117
- 114 IF (I-NM) 115,115,118
- 115 CALL INXCA (I,IR,IDXA,NA)
- CALL INXCB (I,IR,IZ,NZ)
- CALL INXCB (I-I1,IR-1,IM1,NM1)
- CALL INXCB (I+I1,IR-1,IP1,NP1)
- CALL PRDCT (NM1,B(IM1),0,DUM,0,DUM,NA,AN(IDXA),W2,W2,M,AM,
- 1 BM,CM,WD,WW,WU)
- DO 116 J=1,M
- W2(J) = Y(J,I)+W2(J)
- 116 CONTINUE
- CALL PRDCT (NZ,B(IZ),NM1,B(IM1),NP1,B(IP1),0,DUM,W2,W2,M,
- 1 AM,BM,CM,WD,WW,WU)
- IZR = I
- IF (I-NM) 117,119,117
- 117 CONTINUE
- 118 CONTINUE
- 119 DO 120 J=1,M
- Y(J,NM+1) = Y(J,NM+1)-CN(NM+1)*W1(J)-AN(NM+1)*W2(J)
- 120 CONTINUE
- CALL INXCB (IF/2,K-1,IM1,NM1)
- CALL INXCB (IF,K-1,IP,NP)
- IF (NCMPLX) 121,122,121
- 121 CALL CPRDCT (NM+1,B(IP),NM1,B(IM1),0,DUM,0,DUM,Y(1,NM+1),
- 1 Y(1,NM+1),M,AM,BM,CM,W1,W3,WW)
- GO TO 123
- 122 CALL PRDCT (NM+1,B(IP),NM1,B(IM1),0,DUM,0,DUM,Y(1,NM+1),
- 1 Y(1,NM+1),M,AM,BM,CM,WD,WW,WU)
- 123 DO 124 J=1,M
- W1(J) = AN(1)*Y(J,NM+1)
- W2(J) = CN(NM)*Y(J,NM+1)
- Y(J,1) = Y(J,1)-W1(J)
- Y(J,NM) = Y(J,NM)-W2(J)
- 124 CONTINUE
- DO 126 L=1,KDO
- IR = L-1
- I2 = 2**IR
- I4 = I2+I2
- I1 = I2/2
- I = I4
- CALL INXCA (I,IR,IDXA,NA)
- CALL INXCB (I-I2,IR,IM2,NM2)
- CALL INXCB (I-I2-I1,IR-1,IM3,NM3)
- CALL INXCB (I-I1,IR-1,IM1,NM1)
- CALL PRDCT (NM2,B(IM2),NM3,B(IM3),NM1,B(IM1),0,DUM,W1,W1,M,AM,
- 1 BM,CM,WD,WW,WU)
- CALL PRDCT (NM1,B(IM1),0,DUM,0,DUM,NA,AN(IDXA),W1,W1,M,AM,BM,
- 1 CM,WD,WW,WU)
- DO 125 J=1,M
- Y(J,I) = Y(J,I)-W1(J)
- 125 CONTINUE
- 126 CONTINUE
- C
- IZR = NM
- DO 131 L=1,KDO
- IR = L-1
- I2 = 2**IR
- I1 = I2/2
- I3 = I2+I1
- I4 = I2+I2
- IRM1 = IR-1
- DO 130 I=I4,IF,I4
- IPI1 = I+I1
- IPI2 = I+I2
- IPI3 = I+I3
- IF (IPI2-IZR) 127,128,127
- 127 IF (I-IZR) 130,131,130
- 128 CALL INXCC (I,IR,IDXC,NC)
- CALL INXCB (IPI2,IR,IP2,NP2)
- CALL INXCB (IPI1,IRM1,IP1,NP1)
- CALL INXCB (IPI3,IRM1,IP3,NP3)
- CALL PRDCT (NP2,B(IP2),NP1,B(IP1),NP3,B(IP3),0,DUM,W2,W2,M,
- 1 AM,BM,CM,WD,WW,WU)
- CALL PRDCT (NP1,B(IP1),0,DUM,0,DUM,NC,CN(IDXC),W2,W2,M,AM,
- 1 BM,CM,WD,WW,WU)
- DO 129 J=1,M
- Y(J,I) = Y(J,I)-W2(J)
- 129 CONTINUE
- IZR = I
- GO TO 131
- 130 CONTINUE
- 131 CONTINUE
- C
- C BEGIN BACK SUBSTITUTION PHASE
- C
- 132 DO 144 LL=1,K
- L = K-LL+1
- IR = L-1
- IRM1 = IR-1
- I2 = 2**IR
- I1 = I2/2
- I4 = I2+I2
- IFD = IF-I2
- DO 143 I=I2,IFD,I4
- IF (I-NM) 133,133,143
- 133 IMI1 = I-I1
- IMI2 = I-I2
- IPI1 = I+I1
- IPI2 = I+I2
- CALL INXCA (I,IR,IDXA,NA)
- CALL INXCC (I,IR,IDXC,NC)
- CALL INXCB (I,IR,IZ,NZ)
- CALL INXCB (IMI1,IRM1,IM1,NM1)
- CALL INXCB (IPI1,IRM1,IP1,NP1)
- IF (I-I2) 134,134,136
- 134 DO 135 J=1,M
- W1(J) = (0.,0.)
- 135 CONTINUE
- GO TO 137
- 136 CALL PRDCT (NM1,B(IM1),0,DUM,0,DUM,NA,AN(IDXA),Y(1,IMI2),
- 1 W1,M,AM,BM,CM,WD,WW,WU)
- 137 IF (IPI2-NM) 140,140,138
- 138 DO 139 J=1,M
- W2(J) = (0.,0.)
- 139 CONTINUE
- GO TO 141
- 140 CALL PRDCT (NP1,B(IP1),0,DUM,0,DUM,NC,CN(IDXC),Y(1,IPI2),
- 1 W2,M,AM,BM,CM,WD,WW,WU)
- 141 DO 142 J=1,M
- W1(J) = Y(J,I)+W1(J)+W2(J)
- 142 CONTINUE
- CALL PRDCT (NZ,B(IZ),NM1,B(IM1),NP1,B(IP1),0,DUM,W1,Y(1,I),
- 1 M,AM,BM,CM,WD,WW,WU)
- 143 CONTINUE
- 144 CONTINUE
- RETURN
- END
- *DECK CBLKTR
- SUBROUTINE CBLKTR (IFLG, NP, N, AN, BN, CN, MP, M, AM, BM, CM,
- + IDIMY, Y, IERROR, W)
- C***BEGIN PROLOGUE CBLKTR
- C***PURPOSE Solve a block tridiagonal system of linear equations
- C (usually resulting from the discretization of separable
- C two-dimensional elliptic equations).
- C***LIBRARY SLATEC (FISHPACK)
- C***CATEGORY I2B4B
- C***TYPE COMPLEX (BLKTRI-S, CBLKTR-C)
- C***KEYWORDS ELLIPTIC PDE, FISHPACK, TRIDIAGONAL LINEAR SYSTEM
- C***AUTHOR Adams, J., (NCAR)
- C Swarztrauber, P. N., (NCAR)
- C Sweet, R., (NCAR)
- C***DESCRIPTION
- C
- C Subroutine CBLKTR is a complex version of subroutine BLKTRI.
- C Both subroutines solve a system of linear equations of the form
- C
- C AN(J)*X(I,J-1) + AM(I)*X(I-1,J) + (BN(J)+BM(I))*X(I,J)
- C
- C + CN(J)*X(I,J+1) + CM(I)*X(I+1,J) = Y(I,J)
- C
- C For I = 1,2,...,M and J = 1,2,...,N.
- C
- C I+1 and I-1 are evaluated modulo M and J+1 and J-1 modulo N, i.e.,
- C
- C X(I,0) = X(I,N), X(I,N+1) = X(I,1),
- C X(0,J) = X(M,J), X(M+1,J) = X(1,J).
- C
- C These equations usually result from the discretization of
- C separable elliptic equations. Boundary conditions may be
- C Dirichlet, Neumann, or periodic.
- C
- C
- C * * * * * * * * * * On INPUT * * * * * * * * * *
- C
- C IFLG
- C = 0 Initialization only. Certain quantities that depend on NP,
- C N, AN, BN, and CN are computed and stored in the work
- C array W.
- C = 1 The quantities that were computed in the initialization are
- C used to obtain the solution X(I,J).
- C
- C NOTE A call with IFLG=0 takes approximately one half the time
- C time as a call with IFLG = 1. However, the
- C initialization does not have to be repeated unless NP, N,
- C AN, BN, or CN change.
- C
- C NP
- C = 0 If AN(1) and CN(N) are not zero, which corresponds to
- C periodic boundary conditions.
- C = 1 If AN(1) and CN(N) are zero.
- C
- C N
- C The number of unknowns in the J-direction. N must be greater
- C than 4. The operation count is proportional to MNlog2(N), hence
- C N should be selected less than or equal to M.
- C
- C AN,BN,CN
- C Real one-dimensional arrays of length N that specify the
- C coefficients in the linear equations given above.
- C
- C MP
- C = 0 If AM(1) and CM(M) are not zero, which corresponds to
- C periodic boundary conditions.
- C = 1 If AM(1) = CM(M) = 0 .
- C
- C M
- C The number of unknowns in the I-direction. M must be greater
- C than 4.
- C
- C AM,BM,CM
- C Complex one-dimensional arrays of length M that specify the
- C coefficients in the linear equations given above.
- C
- C IDIMY
- C The row (or first) dimension of the two-dimensional array Y as
- C it appears in the program calling BLKTRI. This parameter is
- C used to specify the variable dimension of Y. IDIMY must be at
- C least M.
- C
- C Y
- C A complex two-dimensional array that specifies the values of
- C the right side of the linear system of equations given above.
- C Y must be dimensioned Y(IDIMY,N) with IDIMY .GE. M.
- C
- C W
- C A one-dimensional array that must be provided by the user for
- C work space.
- C If NP=1 define K=INT(log2(N))+1 and set L=2**(K+1) then
- C W must have dimension (K-2)*L+K+5+MAX(2N,12M)
- C
- C If NP=0 define K=INT(log2(N-1))+1 and set L=2**(K+1) then
- C W must have dimension (K-2)*L+K+5+2N+MAX(2N,12M)
- C
- C **IMPORTANT** For purposes of checking, the required dimension
- C of W is computed by BLKTRI and stored in W(1)
- C in floating point format.
- C
- C * * * * * * * * * * On Output * * * * * * * * * *
- C
- C Y
- C Contains the solution X.
- C
- C IERROR
- C An error flag that indicates invalid input parameters. Except
- C for number zero, a solution is not attempted.
- C
- C = 0 No error.
- C = 1 M is less than 5.
- C = 2 N is less than 5.
- C = 3 IDIMY is less than M.
- C = 4 BLKTRI failed while computing results that depend on the
- C coefficient arrays AN, BN, CN. Check these arrays.
- C = 5 AN(J)*CN(J-1) is less than 0 for some J. Possible reasons
- C for this condition are
- C 1. The arrays AN and CN are not correct.
- C 2. Too large a grid spacing was used in the discretization
- C of the elliptic equation.
- C 3. The linear equations resulted from a partial
- C differential equation which was not elliptic.
- C
- C W
- C Contains intermediate values that must not be destroyed if
- C CBLKTR will be called again with IFLG=1. W(1) contains the
- C number of locations required by W in floating point format.
- C
- C *Long Description:
- C
- C * * * * * * * Program Specifications * * * * * * * * * * * *
- C
- C Dimension of AN(N),BN(N),CN(N),AM(M),BM(M),CM(M),Y(IDIMY,N)
- C Arguments W(see argument list)
- C
- C Latest June 1979
- C Revision
- C
- C Required CBLKTR,CBLKT1,PROC,PROCP,CPROC,CPROCP,CCMPB,INXCA,
- C Subprograms INXCB,INXCC,CPADD,PGSF,PPGSF,PPPSF,BCRH,TEVLC,
- C R1MACH
- C
- C Special The algorithm may fail if ABS(BM(I)+BN(J)) is less
- C Conditions than ABS(AM(I))+ABS(AN(J))+ABS(CM(I))+ABS(CN(J))
- C for some I and J. The algorithm will also fail if
- C AN(J)*CN(J-1) is less than zero for some J.
- C See the description of the output parameter IERROR.
- C
- C Common CCBLK
- C Blocks
- C
- C I/O NONE
- C
- C Precision Single
- C
- C Specialist Paul Swarztrauber
- C
- C Language FORTRAN
- C
- C History CBLKTR is a complex version of BLKTRI (version 3)
- C
- C Algorithm Generalized Cyclic Reduction (see reference below)
- C
- C Space
- C Required CONTROL DATA 7600
- C
- C Portability American National Standards Institute FORTRAN.
- C The machine accuracy is set using function R1MACH.
- C
- C Required NONE
- C Resident
- C Routines
- C
- C References Swarztrauber,P. and R. SWEET, 'Efficient Fortran
- C Subprograms for the solution of elliptic equations'
- C NCAR TN/IA-109, July, 1975, 138 PP.
- C
- C SWARZTRAUBER P. ,'A Direct Method for The Discrete
- C Solution of Separable Elliptic Equations', SIAM
- C J. Numer. Anal.,11(1974) PP. 1136-1150.
- C
- C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- C
- C***REFERENCES P. N. Swarztrauber and R. Sweet, Efficient Fortran
- C subprograms for the solution of elliptic equations,
- C NCAR TN/IA-109, July 1975, 138 pp.
- C P. N. Swarztrauber, A direct method for the discrete
- C solution of separable elliptic equations, SIAM Journal
- C on Numerical Analysis 11, (1974), pp. 1136-1150.
- C***ROUTINES CALLED CBLKT1, CCMPB, CPROC, CPROCP, PROC, PROCP
- C***COMMON BLOCKS CCBLK
- C***REVISION HISTORY (YYMMDD)
- C 801001 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CBLKTR
- C
- DIMENSION AN(*) ,BN(*) ,CN(*) ,AM(*) ,
- 1 BM(*) ,CM(*) ,Y(IDIMY,*) ,W(*)
- EXTERNAL PROC ,PROCP ,CPROC ,CPROCP
- COMMON /CCBLK/ NPP ,K ,EPS ,CNV ,
- 1 NM ,NCMPLX ,IK
- COMPLEX AM ,BM ,CM ,Y
- C***FIRST EXECUTABLE STATEMENT CBLKTR
- NM = N
- M2 = M+M
- IERROR = 0
- IF (M-5) 101,102,102
- 101 IERROR = 1
- GO TO 119
- 102 IF (NM-3) 103,104,104
- 103 IERROR = 2
- GO TO 119
- 104 IF (IDIMY-M) 105,106,106
- 105 IERROR = 3
- GO TO 119
- 106 NH = N
- NPP = NP
- IF (NPP) 107,108,107
- 107 NH = NH+1
- 108 IK = 2
- K = 1
- 109 IK = IK+IK
- K = K+1
- IF (NH-IK) 110,110,109
- 110 NL = IK
- IK = IK+IK
- NL = NL-1
- IWAH = (K-2)*IK+K+6
- IF (NPP) 111,112,111
- C
- C DIVIDE W INTO WORKING SUB ARRAYS
- C
- 111 IW1 = IWAH
- IWBH = IW1+NM
- W(1) = IW1-1+MAX(2*NM,12*M)
- GO TO 113
- 112 IWBH = IWAH+NM+NM
- IW1 = IWBH
- W(1) = IW1-1+MAX(2*NM,12*M)
- NM = NM-1
- C
- C SUBROUTINE CCMPB COMPUTES THE ROOTS OF THE B POLYNOMIALS
- C
- 113 IF (IERROR) 119,114,119
- 114 IW2 = IW1+M2
- IW3 = IW2+M2
- IWD = IW3+M2
- IWW = IWD+M2
- IWU = IWW+M2
- IF (IFLG) 116,115,116
- 115 CALL CCMPB (NL,IERROR,AN,BN,CN,W(2),W(IWAH),W(IWBH))
- GO TO 119
- 116 IF (MP) 117,118,117
- C
- C SUBROUTINE CBLKT1 SOLVES THE LINEAR SYSTEM
- C
- 117 CALL CBLKT1 (NL,AN,BN,CN,M,AM,BM,CM,IDIMY,Y,W(2),W(IW1),W(IW2),
- 1 W(IW3),W(IWD),W(IWW),W(IWU),PROC,CPROC)
- GO TO 119
- 118 CALL CBLKT1 (NL,AN,BN,CN,M,AM,BM,CM,IDIMY,Y,W(2),W(IW1),W(IW2),
- 1 W(IW3),W(IWD),W(IWW),W(IWU),PROCP,CPROCP)
- 119 CONTINUE
- RETURN
- END
- *DECK CBRT
- FUNCTION CBRT (X)
- C***BEGIN PROLOGUE CBRT
- C***PURPOSE Compute the cube root.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C2
- C***TYPE SINGLE PRECISION (CBRT-S, DCBRT-D, CCBRT-C)
- C***KEYWORDS CUBE ROOT, ELEMENTARY FUNCTIONS, FNLIB, ROOTS
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C CBRT(X) calculates the cube root of X.
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED R1MACH, R9PAK, R9UPAK
- C***REVISION HISTORY (YYMMDD)
- C 770601 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C***END PROLOGUE CBRT
- DIMENSION CBRT2(5)
- SAVE CBRT2, NITER
- DATA CBRT2(1) / 0.6299605249 4743658E0 /
- DATA CBRT2(2) / 0.7937005259 8409974E0 /
- DATA CBRT2(3) / 1.0E0 /
- DATA CBRT2(4) / 1.2599210498 9487316E0 /
- DATA CBRT2(5) / 1.5874010519 6819947E0 /
- DATA NITER / 0 /
- C***FIRST EXECUTABLE STATEMENT CBRT
- IF (NITER.EQ.0) NITER = 1.443*LOG(-.106*LOG(0.1*R1MACH(3))) + 1.
- C
- CBRT = 0.0
- IF (X.EQ.0.) RETURN
- C
- CALL R9UPAK (ABS(X), Y, N)
- IXPNT = N/3
- IREM = N - 3*IXPNT + 3
- C
- C THE APPROXIMATION BELOW IS A GENERALIZED CHEBYSHEV SERIES CONVERTED
- C TO POLYNOMIAL FORM. THE APPROX IS NEARLY BEST IN THE SENSE OF
- C RELATIVE ERROR WITH 4.085 DIGITS ACCURACY.
- C
- CBRT = .439581E0 + Y*(.928549E0 + Y*(-.512653E0 + Y*.144586E0))
- C
- DO 10 ITER=1,NITER
- CBRTSQ = CBRT*CBRT
- CBRT = CBRT + (Y-CBRT*CBRTSQ)/(3.0*CBRTSQ)
- 10 CONTINUE
- C
- CBRT = R9PAK (CBRT2(IREM)*SIGN(CBRT,X), IXPNT)
- RETURN
- C
- END
- *DECK CCBRT
- COMPLEX FUNCTION CCBRT (Z)
- C***BEGIN PROLOGUE CCBRT
- C***PURPOSE Compute the cube root.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C2
- C***TYPE COMPLEX (CBRT-S, DCBRT-D, CCBRT-C)
- C***KEYWORDS CUBE ROOT, ELEMENTARY FUNCTIONS, FNLIB, ROOTS
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C CCBRT(Z) calculates the complex cube root of Z. The principal root
- C for which -PI .LT. arg(Z) .LE. +PI is returned.
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED CARG, CBRT
- C***REVISION HISTORY (YYMMDD)
- C 770401 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C***END PROLOGUE CCBRT
- COMPLEX Z
- C***FIRST EXECUTABLE STATEMENT CCBRT
- THETA = CARG(Z) / 3.0
- R = CBRT (ABS(Z))
- C
- CCBRT = CMPLX (R*COS(THETA), R*SIN(THETA))
- C
- RETURN
- END
- *DECK CCHDC
- SUBROUTINE CCHDC (A, LDA, P, WORK, JPVT, JOB, INFO)
- C***BEGIN PROLOGUE CCHDC
- C***PURPOSE Compute the Cholesky decomposition of a positive definite
- C matrix. A pivoting option allows the user to estimate the
- C condition number of a positive definite matrix or determine
- C the rank of a positive semidefinite matrix.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D2D1B
- C***TYPE COMPLEX (SCHDC-S, DCHDC-D, CCHDC-C)
- C***KEYWORDS CHOLESKY DECOMPOSITION, LINEAR ALGEBRA, LINPACK, MATRIX,
- C POSITIVE DEFINITE
- C***AUTHOR Dongarra, J., (ANL)
- C Stewart, G. W., (U. of Maryland)
- C***DESCRIPTION
- C
- C CCHDC computes the Cholesky decomposition of a positive definite
- C matrix. A pivoting option allows the user to estimate the
- C condition of a positive definite matrix or determine the rank
- C of a positive semidefinite matrix.
- C
- C On Entry
- C
- C A COMPLEX(LDA,P).
- C A contains the matrix whose decomposition is to
- C be computed. Only the upper half of A need be stored.
- C The lower part of The array A is not referenced.
- C
- C LDA INTEGER.
- C LDA is the leading dimension of the array A.
- C
- C P INTEGER.
- C P is the order of the matrix.
- C
- C WORK COMPLEX.
- C WORK is a work array.
- C
- C JPVT INTEGER(P).
- C JPVT contains integers that control the selection
- C of the pivot elements, if pivoting has been requested.
- C Each diagonal element A(K,K)
- C is placed in one of three classes according to the
- C value of JPVT(K)).
- C
- C If JPVT(K)) .GT. 0, then X(K) is an initial
- C element.
- C
- C If JPVT(K)) .EQ. 0, then X(K) is a free element.
- C
- C If JPVT(K)) .LT. 0, then X(K) is a final element.
- C
- C Before the decomposition is computed, initial elements
- C are moved by symmetric row and column interchanges to
- C the beginning of the array A and final
- C elements to the end. Both initial and final elements
- C are frozen in place during the computation and only
- C free elements are moved. At the K-th stage of the
- C reduction, if A(K,K) is occupied by a free element
- C it is interchanged with the largest free element
- C A(L,L) with L .GE. K. JPVT is not referenced if
- C JOB .EQ. 0.
- C
- C JOB INTEGER.
- C JOB is an integer that initiates column pivoting.
- C IF JOB .EQ. 0, no pivoting is done.
- C IF JOB .NE. 0, pivoting is done.
- C
- C On Return
- C
- C A A contains in its upper half the Cholesky factor
- C of the matrix A as it has been permuted by pivoting.
- C
- C JPVT JPVT(J) contains the index of the diagonal element
- C of A that was moved into the J-th position,
- C provided pivoting was requested.
- C
- C INFO contains the index of the last positive diagonal
- C element of the Cholesky factor.
- C
- C For positive definite matrices INFO = P is the normal return.
- C For pivoting with positive semidefinite matrices INFO will
- C in general be less than P. However, INFO may be greater than
- C the rank of A, since rounding error can cause an otherwise zero
- C element to be positive. Indefinite systems will always cause
- C INFO to be less than P.
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CAXPY, CSWAP
- C***REVISION HISTORY (YYMMDD)
- C 790319 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CCHDC
- INTEGER LDA,P,JPVT(*),JOB,INFO
- COMPLEX A(LDA,*),WORK(*)
- C
- INTEGER PU,PL,PLP1,J,JP,JT,K,KB,KM1,KP1,L,MAXL
- COMPLEX TEMP
- REAL MAXDIA
- LOGICAL SWAPK,NEGK
- C***FIRST EXECUTABLE STATEMENT CCHDC
- PL = 1
- PU = 0
- INFO = P
- IF (JOB .EQ. 0) GO TO 160
- C
- C PIVOTING HAS BEEN REQUESTED. REARRANGE THE
- C THE ELEMENTS ACCORDING TO JPVT.
- C
- DO 70 K = 1, P
- SWAPK = JPVT(K) .GT. 0
- NEGK = JPVT(K) .LT. 0
- JPVT(K) = K
- IF (NEGK) JPVT(K) = -JPVT(K)
- IF (.NOT.SWAPK) GO TO 60
- IF (K .EQ. PL) GO TO 50
- CALL CSWAP(PL-1,A(1,K),1,A(1,PL),1)
- TEMP = A(K,K)
- A(K,K) = A(PL,PL)
- A(PL,PL) = TEMP
- A(PL,K) = CONJG(A(PL,K))
- PLP1 = PL + 1
- IF (P .LT. PLP1) GO TO 40
- DO 30 J = PLP1, P
- IF (J .GE. K) GO TO 10
- TEMP = CONJG(A(PL,J))
- A(PL,J) = CONJG(A(J,K))
- A(J,K) = TEMP
- GO TO 20
- 10 CONTINUE
- IF (J .EQ. K) GO TO 20
- TEMP = A(K,J)
- A(K,J) = A(PL,J)
- A(PL,J) = TEMP
- 20 CONTINUE
- 30 CONTINUE
- 40 CONTINUE
- JPVT(K) = JPVT(PL)
- JPVT(PL) = K
- 50 CONTINUE
- PL = PL + 1
- 60 CONTINUE
- 70 CONTINUE
- PU = P
- IF (P .LT. PL) GO TO 150
- DO 140 KB = PL, P
- K = P - KB + PL
- IF (JPVT(K) .GE. 0) GO TO 130
- JPVT(K) = -JPVT(K)
- IF (PU .EQ. K) GO TO 120
- CALL CSWAP(K-1,A(1,K),1,A(1,PU),1)
- TEMP = A(K,K)
- A(K,K) = A(PU,PU)
- A(PU,PU) = TEMP
- A(K,PU) = CONJG(A(K,PU))
- KP1 = K + 1
- IF (P .LT. KP1) GO TO 110
- DO 100 J = KP1, P
- IF (J .GE. PU) GO TO 80
- TEMP = CONJG(A(K,J))
- A(K,J) = CONJG(A(J,PU))
- A(J,PU) = TEMP
- GO TO 90
- 80 CONTINUE
- IF (J .EQ. PU) GO TO 90
- TEMP = A(K,J)
- A(K,J) = A(PU,J)
- A(PU,J) = TEMP
- 90 CONTINUE
- 100 CONTINUE
- 110 CONTINUE
- JT = JPVT(K)
- JPVT(K) = JPVT(PU)
- JPVT(PU) = JT
- 120 CONTINUE
- PU = PU - 1
- 130 CONTINUE
- 140 CONTINUE
- 150 CONTINUE
- 160 CONTINUE
- DO 270 K = 1, P
- C
- C REDUCTION LOOP.
- C
- MAXDIA = REAL(A(K,K))
- KP1 = K + 1
- MAXL = K
- C
- C DETERMINE THE PIVOT ELEMENT.
- C
- IF (K .LT. PL .OR. K .GE. PU) GO TO 190
- DO 180 L = KP1, PU
- IF (REAL(A(L,L)) .LE. MAXDIA) GO TO 170
- MAXDIA = REAL(A(L,L))
- MAXL = L
- 170 CONTINUE
- 180 CONTINUE
- 190 CONTINUE
- C
- C QUIT IF THE PIVOT ELEMENT IS NOT POSITIVE.
- C
- IF (MAXDIA .GT. 0.0E0) GO TO 200
- INFO = K - 1
- GO TO 280
- 200 CONTINUE
- IF (K .EQ. MAXL) GO TO 210
- C
- C START THE PIVOTING AND UPDATE JPVT.
- C
- KM1 = K - 1
- CALL CSWAP(KM1,A(1,K),1,A(1,MAXL),1)
- A(MAXL,MAXL) = A(K,K)
- A(K,K) = CMPLX(MAXDIA,0.0E0)
- JP = JPVT(MAXL)
- JPVT(MAXL) = JPVT(K)
- JPVT(K) = JP
- A(K,MAXL) = CONJG(A(K,MAXL))
- 210 CONTINUE
- C
- C REDUCTION STEP. PIVOTING IS CONTAINED ACROSS THE ROWS.
- C
- WORK(K) = CMPLX(SQRT(REAL(A(K,K))),0.0E0)
- A(K,K) = WORK(K)
- IF (P .LT. KP1) GO TO 260
- DO 250 J = KP1, P
- IF (K .EQ. MAXL) GO TO 240
- IF (J .GE. MAXL) GO TO 220
- TEMP = CONJG(A(K,J))
- A(K,J) = CONJG(A(J,MAXL))
- A(J,MAXL) = TEMP
- GO TO 230
- 220 CONTINUE
- IF (J .EQ. MAXL) GO TO 230
- TEMP = A(K,J)
- A(K,J) = A(MAXL,J)
- A(MAXL,J) = TEMP
- 230 CONTINUE
- 240 CONTINUE
- A(K,J) = A(K,J)/WORK(K)
- WORK(J) = CONJG(A(K,J))
- TEMP = -A(K,J)
- CALL CAXPY(J-K,TEMP,WORK(KP1),1,A(KP1,J),1)
- 250 CONTINUE
- 260 CONTINUE
- 270 CONTINUE
- 280 CONTINUE
- RETURN
- END
- *DECK CCHDD
- SUBROUTINE CCHDD (R, LDR, P, X, Z, LDZ, NZ, Y, RHO, C, S, INFO)
- C***BEGIN PROLOGUE CCHDD
- C***PURPOSE Downdate an augmented Cholesky decomposition or the
- C triangular factor of an augmented QR decomposition.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D7B
- C***TYPE COMPLEX (SCHDD-S, DCHDD-D, CCHDD-C)
- C***KEYWORDS CHOLESKY DECOMPOSITION, DOWNDATE, LINEAR ALGEBRA, LINPACK,
- C MATRIX
- C***AUTHOR Stewart, G. W., (U. of Maryland)
- C***DESCRIPTION
- C
- C CCHDD downdates an augmented Cholesky decomposition or the
- C triangular factor of an augmented QR decomposition.
- C Specifically, given an upper triangular matrix R of order P, a
- C row vector X, a column vector Z, and a scalar Y, CCHDD
- C determines a unitary matrix U and a scalar ZETA such that
- C
- C (R Z ) (RR ZZ)
- C U * ( ) = ( ) ,
- C (0 ZETA) ( X Y)
- C
- C where RR is upper triangular. If R and Z have been obtained
- C from the factorization of a least squares problem, then
- C RR and ZZ are the factors corresponding to the problem
- C with the observation (X,Y) removed. In this case, if RHO
- C is the norm of the residual vector, then the norm of
- C the residual vector of the downdated problem is
- C SQRT(RHO**2 - ZETA**2). CCHDD will simultaneously downdate
- C several triplets (Z,Y,RHO) along with R.
- C For a less terse description of what CCHDD does and how
- C it may be applied, see the LINPACK Guide.
- C
- C The matrix U is determined as the product U(1)*...*U(P)
- C where U(I) is a rotation in the (P+1,I)-plane of the
- C form
- C
- C ( C(I) -CONJG(S(I)) )
- C ( ) .
- C ( S(I) C(I) )
- C
- C the rotations are chosen so that C(I) is real.
- C
- C The user is warned that a given downdating problem may
- C be impossible to accomplish or may produce
- C inaccurate results. For example, this can happen
- C if X is near a vector whose removal will reduce the
- C rank of R. Beware.
- C
- C On Entry
- C
- C R COMPLEX(LDR,P), where LDR .GE. P.
- C R contains the upper triangular matrix
- C that is to be downdated. The part of R
- C below the diagonal is not referenced.
- C
- C LDR INTEGER.
- C LDR is the leading dimension of the array R.
- C
- C p INTEGER.
- C P is the order of the matrix R.
- C
- C X COMPLEX(P).
- C X contains the row vector that is to
- C be removed from R. X is not altered by CCHDD.
- C
- C Z COMPLEX(LDZ,NZ), where LDZ .GE. P.
- C Z is an array of NZ P-vectors which
- C are to be downdated along with R.
- C
- C LDZ INTEGER.
- C LDZ is the leading dimension of the array Z.
- C
- C NZ INTEGER.
- C NZ is the number of vectors to be downdated
- C NZ may be zero, in which case Z, Y, and RHO
- C are not referenced.
- C
- C Y COMPLEX(NZ).
- C Y contains the scalars for the downdating
- C of the vectors Z. Y is not altered by CCHDD.
- C
- C RHO REAL(NZ).
- C RHO contains the norms of the residual
- C vectors that are to be downdated.
- C
- C On Return
- C
- C R
- C Z contain the downdated quantities.
- C RHO
- C
- C C REAL(P).
- C C contains the cosines of the transforming
- C rotations.
- C
- C S COMPLEX(P).
- C S contains the sines of the transforming
- C rotations.
- C
- C INFO INTEGER.
- C INFO is set as follows.
- C
- C INFO = 0 if the entire downdating
- C was successful.
- C
- C INFO =-1 if R could not be downdated.
- C in this case, all quantities
- C are left unaltered.
- C
- C INFO = 1 if some RHO could not be
- C downdated. The offending RHO's are
- C set to -1.
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CDOTC, SCNRM2
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CCHDD
- INTEGER LDR,P,LDZ,NZ,INFO
- COMPLEX R(LDR,*),X(*),Z(LDZ,*),Y(*),S(*)
- REAL RHO(*),C(*)
- C
- INTEGER I,II,J
- REAL A,ALPHA,AZETA,NORM,SCNRM2
- COMPLEX CDOTC,T,ZETA,B,XX
- C
- C SOLVE THE SYSTEM CTRANS(R)*A = X, PLACING THE RESULT
- C IN THE ARRAY S.
- C
- C***FIRST EXECUTABLE STATEMENT CCHDD
- INFO = 0
- S(1) = CONJG(X(1))/CONJG(R(1,1))
- IF (P .LT. 2) GO TO 20
- DO 10 J = 2, P
- S(J) = CONJG(X(J)) - CDOTC(J-1,R(1,J),1,S,1)
- S(J) = S(J)/CONJG(R(J,J))
- 10 CONTINUE
- 20 CONTINUE
- NORM = SCNRM2(P,S,1)
- IF (NORM .LT. 1.0E0) GO TO 30
- INFO = -1
- GO TO 120
- 30 CONTINUE
- ALPHA = SQRT(1.0E0-NORM**2)
- C
- C DETERMINE THE TRANSFORMATIONS.
- C
- DO 40 II = 1, P
- I = P - II + 1
- SCALE = ALPHA + ABS(S(I))
- A = ALPHA/SCALE
- B = S(I)/SCALE
- NORM = SQRT(A**2+REAL(B)**2+AIMAG(B)**2)
- C(I) = A/NORM
- S(I) = CONJG(B)/NORM
- ALPHA = SCALE*NORM
- 40 CONTINUE
- C
- C APPLY THE TRANSFORMATIONS TO R.
- C
- DO 60 J = 1, P
- XX = (0.0E0,0.0E0)
- DO 50 II = 1, J
- I = J - II + 1
- T = C(I)*XX + S(I)*R(I,J)
- R(I,J) = C(I)*R(I,J) - CONJG(S(I))*XX
- XX = T
- 50 CONTINUE
- 60 CONTINUE
- C
- C IF REQUIRED, DOWNDATE Z AND RHO.
- C
- IF (NZ .LT. 1) GO TO 110
- DO 100 J = 1, NZ
- ZETA = Y(J)
- DO 70 I = 1, P
- Z(I,J) = (Z(I,J) - CONJG(S(I))*ZETA)/C(I)
- ZETA = C(I)*ZETA - S(I)*Z(I,J)
- 70 CONTINUE
- AZETA = ABS(ZETA)
- IF (AZETA .LE. RHO(J)) GO TO 80
- INFO = 1
- RHO(J) = -1.0E0
- GO TO 90
- 80 CONTINUE
- RHO(J) = RHO(J)*SQRT(1.0E0-(AZETA/RHO(J))**2)
- 90 CONTINUE
- 100 CONTINUE
- 110 CONTINUE
- 120 CONTINUE
- RETURN
- END
- *DECK CCHEX
- SUBROUTINE CCHEX (R, LDR, P, K, L, Z, LDZ, NZ, C, S, JOB)
- C***BEGIN PROLOGUE CCHEX
- C***PURPOSE Update the Cholesky factorization A=TRANS(R)*R of a
- C positive definite matrix A of order P under diagonal
- C permutations of the form TRANS(E)*A*E, where E is a
- C permutation matrix.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D7B
- C***TYPE COMPLEX (SCHEX-S, DCHEX-D, CCHEX-C)
- C***KEYWORDS CHOLESKY DECOMPOSITION, EXCHANGE, LINEAR ALGEBRA, LINPACK,
- C MATRIX, POSITIVE DEFINITE
- C***AUTHOR Stewart, G. W., (U. of Maryland)
- C***DESCRIPTION
- C
- C CCHEX updates the Cholesky factorization
- C
- C A = CTRANS(R)*R
- C
- C of a positive definite matrix A of order P under diagonal
- C permutations of the form
- C
- C TRANS(E)*A*E
- C
- C where E is a permutation matrix. Specifically, given
- C an upper triangular matrix R and a permutation matrix
- C E (which is specified by K, L, and JOB), CCHEX determines
- C a unitary matrix U such that
- C
- C U*R*E = RR,
- C
- C where RR is upper triangular. At the users option, the
- C transformation U will be multiplied into the array Z.
- C If A = CTRANS(X)*X, so that R is the triangular part of the
- C QR factorization of X, then RR is the triangular part of the
- C QR factorization of X*E, i.e. X with its columns permuted.
- C For a less terse description of what CCHEX does and how
- C it may be applied, see the LINPACK Guide.
- C
- C The matrix Q is determined as the product U(L-K)*...*U(1)
- C of plane rotations of the form
- C
- C ( C(I) S(I) )
- C ( ) ,
- C ( -CONJG(S(I)) C(I) )
- C
- C where C(I) is real. The rows these rotations operate on
- C are described below.
- C
- C There are two types of permutations, which are determined
- C by the value of JOB.
- C
- C 1. Right circular shift (JOB = 1).
- C
- C The columns are rearranged in the following order.
- C
- C 1,...,K-1,L,K,K+1,...,L-1,L+1,...,P.
- C
- C U is the product of L-K rotations U(I), where U(I)
- C acts in the (L-I,L-I+1)-plane.
- C
- C 2. Left circular shift (JOB = 2).
- C The columns are rearranged in the following order
- C
- C 1,...,K-1,K+1,K+2,...,L,K,L+1,...,P.
- C
- C U is the product of L-K rotations U(I), where U(I)
- C acts in the (K+I-1,K+I)-plane.
- C
- C On Entry
- C
- C R COMPLEX(LDR,P), where LDR .GE. P.
- C R contains the upper triangular factor
- C that is to be updated. Elements of R
- C below the diagonal are not referenced.
- C
- C LDR INTEGER.
- C LDR is the leading dimension of the array R.
- C
- C P INTEGER.
- C P is the order of the matrix R.
- C
- C K INTEGER.
- C K is the first column to be permuted.
- C
- C L INTEGER.
- C L is the last column to be permuted.
- C L must be strictly greater than K.
- C
- C Z COMPLEX(LDZ,NZ), where LDZ .GE. P.
- C Z is an array of NZ P-vectors into which the
- C transformation U is multiplied. Z is
- C not referenced if NZ = 0.
- C
- C LDZ INTEGER.
- C LDZ is the leading dimension of the array Z.
- C
- C NZ INTEGER.
- C NZ is the number of columns of the matrix Z.
- C
- C JOB INTEGER.
- C JOB determines the type of permutation.
- C JOB = 1 right circular shift.
- C JOB = 2 left circular shift.
- C
- C On Return
- C
- C R contains the updated factor.
- C
- C Z contains the updated matrix Z.
- C
- C C REAL(P).
- C C contains the cosines of the transforming rotations.
- C
- C S COMPLEX(P).
- C S contains the sines of the transforming rotations.
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CROTG
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CCHEX
- INTEGER LDR,P,K,L,LDZ,NZ,JOB
- COMPLEX R(LDR,*),Z(LDZ,*),S(*)
- REAL C(*)
- C
- INTEGER I,II,IL,IU,J,JJ,KM1,KP1,LMK,LM1
- COMPLEX T
- C
- C INITIALIZE
- C
- C***FIRST EXECUTABLE STATEMENT CCHEX
- KM1 = K - 1
- KP1 = K + 1
- LMK = L - K
- LM1 = L - 1
- C
- C PERFORM THE APPROPRIATE TASK.
- C
- GO TO (10,130), JOB
- C
- C RIGHT CIRCULAR SHIFT.
- C
- 10 CONTINUE
- C
- C REORDER THE COLUMNS.
- C
- DO 20 I = 1, L
- II = L - I + 1
- S(I) = R(II,L)
- 20 CONTINUE
- DO 40 JJ = K, LM1
- J = LM1 - JJ + K
- DO 30 I = 1, J
- R(I,J+1) = R(I,J)
- 30 CONTINUE
- R(J+1,J+1) = (0.0E0,0.0E0)
- 40 CONTINUE
- IF (K .EQ. 1) GO TO 60
- DO 50 I = 1, KM1
- II = L - I + 1
- R(I,K) = S(II)
- 50 CONTINUE
- 60 CONTINUE
- C
- C CALCULATE THE ROTATIONS.
- C
- T = S(1)
- DO 70 I = 1, LMK
- CALL CROTG(S(I+1),T,C(I),S(I))
- T = S(I+1)
- 70 CONTINUE
- R(K,K) = T
- DO 90 J = KP1, P
- IL = MAX(1,L-J+1)
- DO 80 II = IL, LMK
- I = L - II
- T = C(II)*R(I,J) + S(II)*R(I+1,J)
- R(I+1,J) = C(II)*R(I+1,J) - CONJG(S(II))*R(I,J)
- R(I,J) = T
- 80 CONTINUE
- 90 CONTINUE
- C
- C IF REQUIRED, APPLY THE TRANSFORMATIONS TO Z.
- C
- IF (NZ .LT. 1) GO TO 120
- DO 110 J = 1, NZ
- DO 100 II = 1, LMK
- I = L - II
- T = C(II)*Z(I,J) + S(II)*Z(I+1,J)
- Z(I+1,J) = C(II)*Z(I+1,J) - CONJG(S(II))*Z(I,J)
- Z(I,J) = T
- 100 CONTINUE
- 110 CONTINUE
- 120 CONTINUE
- GO TO 260
- C
- C LEFT CIRCULAR SHIFT
- C
- 130 CONTINUE
- C
- C REORDER THE COLUMNS
- C
- DO 140 I = 1, K
- II = LMK + I
- S(II) = R(I,K)
- 140 CONTINUE
- DO 160 J = K, LM1
- DO 150 I = 1, J
- R(I,J) = R(I,J+1)
- 150 CONTINUE
- JJ = J - KM1
- S(JJ) = R(J+1,J+1)
- 160 CONTINUE
- DO 170 I = 1, K
- II = LMK + I
- R(I,L) = S(II)
- 170 CONTINUE
- DO 180 I = KP1, L
- R(I,L) = (0.0E0,0.0E0)
- 180 CONTINUE
- C
- C REDUCTION LOOP.
- C
- DO 220 J = K, P
- IF (J .EQ. K) GO TO 200
- C
- C APPLY THE ROTATIONS.
- C
- IU = MIN(J-1,L-1)
- DO 190 I = K, IU
- II = I - K + 1
- T = C(II)*R(I,J) + S(II)*R(I+1,J)
- R(I+1,J) = C(II)*R(I+1,J) - CONJG(S(II))*R(I,J)
- R(I,J) = T
- 190 CONTINUE
- 200 CONTINUE
- IF (J .GE. L) GO TO 210
- JJ = J - K + 1
- T = S(JJ)
- CALL CROTG(R(J,J),T,C(JJ),S(JJ))
- 210 CONTINUE
- 220 CONTINUE
- C
- C APPLY THE ROTATIONS TO Z.
- C
- IF (NZ .LT. 1) GO TO 250
- DO 240 J = 1, NZ
- DO 230 I = K, LM1
- II = I - KM1
- T = C(II)*Z(I,J) + S(II)*Z(I+1,J)
- Z(I+1,J) = C(II)*Z(I+1,J) - CONJG(S(II))*Z(I,J)
- Z(I,J) = T
- 230 CONTINUE
- 240 CONTINUE
- 250 CONTINUE
- 260 CONTINUE
- RETURN
- END
- *DECK CCHUD
- SUBROUTINE CCHUD (R, LDR, P, X, Z, LDZ, NZ, Y, RHO, C, S)
- C***BEGIN PROLOGUE CCHUD
- C***PURPOSE Update an augmented Cholesky decomposition of the
- C triangular part of an augmented QR decomposition.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D7B
- C***TYPE COMPLEX (SCHUD-S, DCHUD-D, CCHUD-C)
- C***KEYWORDS CHOLESKY DECOMPOSITION, LINEAR ALGEBRA, LINPACK, MATRIX,
- C UPDATE
- C***AUTHOR Stewart, G. W., (U. of Maryland)
- C***DESCRIPTION
- C
- C CCHUD updates an augmented Cholesky decomposition of the
- C triangular part of an augmented QR decomposition. Specifically,
- C given an upper triangular matrix R of order P, a row vector
- C X, a column vector Z, and a scalar Y, CCHUD determines a
- C unitary matrix U and a scalar ZETA such that
- C
- C
- C (R Z) (RR ZZ )
- C U * ( ) = ( ) ,
- C (X Y) ( 0 ZETA)
- C
- C where RR is upper triangular. If R and Z have been
- C obtained from the factorization of a least squares
- C problem, then RR and ZZ are the factors corresponding to
- C the problem with the observation (X,Y) appended. In this
- C case, if RHO is the norm of the residual vector, then the
- C norm of the residual vector of the updated problem is
- C SQRT(RHO**2 + ZETA**2). CCHUD will simultaneously update
- C several triplets (Z,Y,RHO).
- C
- C For a less terse description of what CCHUD does and how
- C it may be applied see the LINPACK Guide.
- C
- C The matrix U is determined as the product U(P)*...*U(1),
- C where U(I) is a rotation in the (I,P+1) plane of the
- C form
- C
- C ( (CI) S(I) )
- C ( ) .
- C ( -CONJG(S(I)) (CI) )
- C
- C The rotations are chosen so that C(I) is real.
- C
- C On Entry
- C
- C R COMPLEX(LDR,P), where LDR .GE. P.
- C R contains the upper triangular matrix
- C that is to be updated. The part of R
- C below the diagonal is not referenced.
- C
- C LDR INTEGER.
- C LDR is the leading dimension of the array R.
- C
- C P INTEGER.
- C P is the order of the matrix R.
- C
- C X COMPLEX(P).
- C X contains the row to be added to R. X is
- C not altered by CCHUD.
- C
- C Z COMPLEX(LDZ,NZ), where LDZ .GE. P.
- C Z is an array containing NZ P-vectors to
- C be updated with R.
- C
- C LDZ INTEGER.
- C LDZ is the leading dimension of the array Z.
- C
- C NZ INTEGER.
- C NZ is the number of vectors to be updated
- C NZ may be zero, in which case Z, Y, and RHO
- C are not referenced.
- C
- C Y COMPLEX(NZ).
- C Y contains the scalars for updating the vectors
- C Z. Y is not altered by CCHUD.
- C
- C RHO REAL(NZ).
- C RHO contains the norms of the residual
- C vectors that are to be updated. If RHO(J)
- C is negative, it is left unaltered.
- C
- C On Return
- C
- C RC
- C RHO contain the updated quantities.
- C Z
- C
- C C REAL(P).
- C C contains the cosines of the transforming
- C rotations.
- C
- C S COMPLEX(P).
- C S contains the sines of the transforming
- C rotations.
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CROTG
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CCHUD
- INTEGER LDR,P,LDZ,NZ
- REAL RHO(*),C(*)
- COMPLEX R(LDR,*),X(*),Z(LDZ,*),Y(*),S(*)
- C
- INTEGER I,J,JM1
- REAL AZETA,SCALE
- COMPLEX T,XJ,ZETA
- C
- C UPDATE R.
- C
- C***FIRST EXECUTABLE STATEMENT CCHUD
- DO 30 J = 1, P
- XJ = X(J)
- C
- C APPLY THE PREVIOUS ROTATIONS.
- C
- JM1 = J - 1
- IF (JM1 .LT. 1) GO TO 20
- DO 10 I = 1, JM1
- T = C(I)*R(I,J) + S(I)*XJ
- XJ = C(I)*XJ - CONJG(S(I))*R(I,J)
- R(I,J) = T
- 10 CONTINUE
- 20 CONTINUE
- C
- C COMPUTE THE NEXT ROTATION.
- C
- CALL CROTG(R(J,J),XJ,C(J),S(J))
- 30 CONTINUE
- C
- C IF REQUIRED, UPDATE Z AND RHO.
- C
- IF (NZ .LT. 1) GO TO 70
- DO 60 J = 1, NZ
- ZETA = Y(J)
- DO 40 I = 1, P
- T = C(I)*Z(I,J) + S(I)*ZETA
- ZETA = C(I)*ZETA - CONJG(S(I))*Z(I,J)
- Z(I,J) = T
- 40 CONTINUE
- AZETA = ABS(ZETA)
- IF (AZETA .EQ. 0.0E0 .OR. RHO(J) .LT. 0.0E0) GO TO 50
- SCALE = AZETA + RHO(J)
- RHO(J) = SCALE*SQRT((AZETA/SCALE)**2+(RHO(J)/SCALE)**2)
- 50 CONTINUE
- 60 CONTINUE
- 70 CONTINUE
- RETURN
- END
- *DECK CCMPB
- SUBROUTINE CCMPB (N, IERROR, AN, BN, CN, B, AH, BH)
- C***BEGIN PROLOGUE CCMPB
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to CBLKTR
- C***LIBRARY SLATEC
- C***TYPE COMPLEX (COMPB-S, CCMPB-C)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C CCMPB computes the roots of the B polynomials using subroutine
- C TEVLC which is a modification the EISPACK program TQLRAT.
- C IERROR is set to 4 if either TEVLC fails or if A(J+1)*C(J) is
- C less than zero for some J. AH,BH are temporary work arrays.
- C
- C***SEE ALSO CBLKTR
- C***ROUTINES CALLED CPADD, INXCB, R1MACH, TEVLC
- C***COMMON BLOCKS CCBLK
- C***REVISION HISTORY (YYMMDD)
- C 801001 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900402 Added TYPE section. (WRB)
- C***END PROLOGUE CCMPB
- C
- DIMENSION AN(*) ,BN(*) ,CN(*) ,B(*) ,
- 1 AH(*) ,BH(*)
- COMMON /CCBLK/ NPP ,K ,EPS ,CNV ,
- 1 NM ,NCMPLX ,IK
- C***FIRST EXECUTABLE STATEMENT CCMPB
- EPS = R1MACH(4)
- BNORM = ABS(BN(1))
- DO 102 J=2,NM
- BNORM = MAX(BNORM,ABS(BN(J)))
- ARG = AN(J)*CN(J-1)
- IF (ARG) 119,101,101
- 101 B(J) = SIGN(SQRT(ARG),AN(J))
- 102 CONTINUE
- CNV = EPS*BNORM
- IF = 2**K
- KDO = K-1
- DO 108 L=1,KDO
- IR = L-1
- I2 = 2**IR
- I4 = I2+I2
- IPL = I4-1
- IFD = IF-I4
- DO 107 I=I4,IFD,I4
- CALL INXCB (I,L,IB,NB)
- IF (NB) 108,108,103
- 103 JS = I-IPL
- JF = JS+NB-1
- LS = 0
- DO 104 J=JS,JF
- LS = LS+1
- BH(LS) = BN(J)
- AH(LS) = B(J)
- 104 CONTINUE
- CALL TEVLC (NB,BH,AH,IERROR)
- IF (IERROR) 118,105,118
- 105 LH = IB-1
- DO 106 J=1,NB
- LH = LH+1
- B(LH) = -BH(J)
- 106 CONTINUE
- 107 CONTINUE
- 108 CONTINUE
- DO 109 J=1,NM
- B(J) = -BN(J)
- 109 CONTINUE
- IF (NPP) 117,110,117
- 110 NMP = NM+1
- NB = NM+NMP
- DO 112 J=1,NB
- L1 = MOD(J-1,NMP)+1
- L2 = MOD(J+NM-1,NMP)+1
- ARG = AN(L1)*CN(L2)
- IF (ARG) 119,111,111
- 111 BH(J) = SIGN(SQRT(ARG),-AN(L1))
- AH(J) = -BN(L1)
- 112 CONTINUE
- CALL TEVLC (NB,AH,BH,IERROR)
- IF (IERROR) 118,113,118
- 113 CALL INXCB (IF,K-1,J2,LH)
- CALL INXCB (IF/2,K-1,J1,LH)
- J2 = J2+1
- LH = J2
- N2M2 = J2+NM+NM-2
- 114 D1 = ABS(B(J1)-B(J2-1))
- D2 = ABS(B(J1)-B(J2))
- D3 = ABS(B(J1)-B(J2+1))
- IF ((D2 .LT. D1) .AND. (D2 .LT. D3)) GO TO 115
- B(LH) = B(J2)
- J2 = J2+1
- LH = LH+1
- IF (J2-N2M2) 114,114,116
- 115 J2 = J2+1
- J1 = J1+1
- IF (J2-N2M2) 114,114,116
- 116 B(LH) = B(N2M2+1)
- CALL INXCB (IF,K-1,J1,J2)
- J2 = J1+NMP+NMP
- CALL CPADD (NM+1,IERROR,AN,CN,B(J1),B(J1),B(J2))
- 117 RETURN
- 118 IERROR = 4
- RETURN
- 119 IERROR = 5
- RETURN
- END
- *DECK CCOPY
- SUBROUTINE CCOPY (N, CX, INCX, CY, INCY)
- C***BEGIN PROLOGUE CCOPY
- C***PURPOSE Copy a vector.
- C***LIBRARY SLATEC (BLAS)
- C***CATEGORY D1A5
- C***TYPE COMPLEX (SCOPY-S, DCOPY-D, CCOPY-C)
- C***KEYWORDS BLAS, COPY, LINEAR ALGEBRA, VECTOR
- C***AUTHOR Lawson, C. L., (JPL)
- C Hanson, R. J., (SNLA)
- C Kincaid, D. R., (U. of Texas)
- C Krogh, F. T., (JPL)
- C***DESCRIPTION
- C
- C B L A S Subprogram
- C Description of Parameters
- C
- C --Input--
- C N number of elements in input vector(s)
- C CX complex vector with N elements
- C INCX storage spacing between elements of CX
- C CY complex vector with N elements
- C INCY storage spacing between elements of CY
- C
- C --Output--
- C CY copy of vector CX (unchanged if N .LE. 0)
- C
- C Copy complex CX to complex CY.
- C For I = 0 to N-1, copy CX(LX+I*INCX) to CY(LY+I*INCY),
- C where LX = 1 if INCX .GE. 0, else LX = 1+(1-N)*INCX, and LY is
- C defined in a similar way using INCY.
- C
- C***REFERENCES C. L. Lawson, R. J. Hanson, D. R. Kincaid and F. T.
- C Krogh, Basic linear algebra subprograms for Fortran
- C usage, Algorithm No. 539, Transactions on Mathematical
- C Software 5, 3 (September 1979), pp. 308-323.
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 791001 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920310 Corrected definition of LX in DESCRIPTION. (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CCOPY
- COMPLEX CX(*),CY(*)
- C***FIRST EXECUTABLE STATEMENT CCOPY
- IF (N .LE. 0) RETURN
- IF (INCX.EQ.INCY .AND. INCX.GT.0) GO TO 20
- C
- C Code for unequal or nonpositive increments.
- C
- KX = 1
- KY = 1
- IF (INCX .LT. 0) KX = 1+(1-N)*INCX
- IF (INCY .LT. 0) KY = 1+(1-N)*INCY
- DO 10 I = 1,N
- CY(KY) = CX(KX)
- KX = KX + INCX
- KY = KY + INCY
- 10 CONTINUE
- RETURN
- C
- C Code for equal, positive increments.
- C
- 20 NS = N*INCX
- DO 30 I = 1,NS,INCX
- CY(I) = CX(I)
- 30 CONTINUE
- RETURN
- END
- *DECK CCOSH
- COMPLEX FUNCTION CCOSH (Z)
- C***BEGIN PROLOGUE CCOSH
- C***PURPOSE Compute the complex hyperbolic cosine.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C4C
- C***TYPE COMPLEX (CCOSH-C)
- C***KEYWORDS ELEMENTARY FUNCTIONS, FNLIB, HYPERBOLIC COSINE
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C CCOSH(Z) calculates the complex hyperbolic cosine of Z.
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 770401 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C***END PROLOGUE CCOSH
- COMPLEX Z, CI
- SAVE CI
- DATA CI /(0.,1.)/
- C***FIRST EXECUTABLE STATEMENT CCOSH
- CCOSH = COS (CI*Z)
- C
- RETURN
- END
- *DECK CCOT
- COMPLEX FUNCTION CCOT (Z)
- C***BEGIN PROLOGUE CCOT
- C***PURPOSE Compute the cotangent.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C4A
- C***TYPE COMPLEX (COT-S, DCOT-D, CCOT-C)
- C***KEYWORDS COTANGENT, ELEMENTARY FUNCTIONS, FNLIB, TRIGONOMETRIC
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C CCOT(Z) calculates the complex trigonometric cotangent of Z.
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED R1MACH, XERCLR, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770401 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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***END PROLOGUE CCOT
- COMPLEX Z
- SAVE SQEPS
- DATA SQEPS /0./
- C***FIRST EXECUTABLE STATEMENT CCOT
- IF (SQEPS.EQ.0.) SQEPS = SQRT (R1MACH(4))
- C
- X2 = 2.0*REAL(Z)
- Y2 = 2.0*AIMAG(Z)
- C
- SN2X = SIN (X2)
- CALL XERCLR
- C
- DEN = COSH(Y2) - COS(X2)
- IF (DEN .EQ. 0.) CALL XERMSG ('SLATEC', 'CCOT',
- + 'COT IS SINGULAR FOR INPUT Z (X IS 0 OR PI AND Y IS 0)', 2, 2)
- C
- IF (ABS(DEN).GT.MAX(ABS(X2),1.)*SQEPS) GO TO 10
- CALL XERCLR
- CALL XERMSG ('SLATEC', 'CCOT',
- + 'ANSWER LT HALF PRECISION, ABS(X) TOO BIG OR X TOO NEAR ' //
- + '0 OR PI', 1, 1)
- C
- 10 CCOT = CMPLX (SN2X/DEN, -SINH(Y2)/DEN)
- C
- RETURN
- END
- *DECK CDCDOT
- COMPLEX FUNCTION CDCDOT (N, CB, CX, INCX, CY, INCY)
- C***BEGIN PROLOGUE CDCDOT
- C***PURPOSE Compute the inner product of two vectors with extended
- C precision accumulation.
- C***LIBRARY SLATEC (BLAS)
- C***CATEGORY D1A4
- C***TYPE COMPLEX (SDSDOT-S, CDCDOT-C)
- C***KEYWORDS BLAS, DOT PRODUCT, INNER PRODUCT, LINEAR ALGEBRA, VECTOR
- C***AUTHOR Lawson, C. L., (JPL)
- C Hanson, R. J., (SNLA)
- C Kincaid, D. R., (U. of Texas)
- C Krogh, F. T., (JPL)
- C***DESCRIPTION
- C
- C B L A S Subprogram
- C Description of Parameters
- C
- C --Input--
- C N number of elements in input vector(s)
- C CB complex scalar to be added to inner product
- C CX complex vector with N elements
- C INCX storage spacing between elements of CX
- C CY complex vector with N elements
- C INCY storage spacing between elements of CY
- C
- C --Output--
- C CDCDOT complex dot product (CB if N .LE. 0)
- C
- C Returns complex result with dot product accumulated in D.P.
- C CDCDOT = CB + sum for I = 0 to N-1 of CX(LX+I*INCY)*CY(LY+I*INCY)
- C where LX = 1 if INCX .GE. 0, else LX = 1+(1-N)*INCX, and LY is
- C defined in a similar way using INCY.
- C
- C***REFERENCES C. L. Lawson, R. J. Hanson, D. R. Kincaid and F. T.
- C Krogh, Basic linear algebra subprograms for Fortran
- C usage, Algorithm No. 539, Transactions on Mathematical
- C Software 5, 3 (September 1979), pp. 308-323.
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 791001 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920310 Corrected definition of LX in DESCRIPTION. (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CDCDOT
- INTEGER N, INCX, INCY, I, KX, KY
- COMPLEX CX(*), CY(*), CB
- DOUBLE PRECISION DSDOTR, DSDOTI, DT1, DT2, DT3, DT4
- C***FIRST EXECUTABLE STATEMENT CDCDOT
- DSDOTR = DBLE(REAL(CB))
- DSDOTI = DBLE(AIMAG(CB))
- IF (N .LE. 0) GO TO 10
- KX = 1
- KY = 1
- IF(INCX.LT.0) KX = 1+(1-N)*INCX
- IF(INCY.LT.0) KY = 1+(1-N)*INCY
- DO 5 I = 1,N
- DT1 = DBLE(REAL(CX(KX)))
- DT2 = DBLE(REAL(CY(KY)))
- DT3 = DBLE(AIMAG(CX(KX)))
- DT4 = DBLE(AIMAG(CY(KY)))
- DSDOTR = DSDOTR+(DT1*DT2)-(DT3*DT4)
- DSDOTI = DSDOTI+(DT1*DT4)+(DT3*DT2)
- KX = KX+INCX
- KY = KY+INCY
- 5 CONTINUE
- 10 CDCDOT = CMPLX(REAL(DSDOTR),REAL(DSDOTI))
- RETURN
- END
- *DECK CDIV
- SUBROUTINE CDIV (AR, AI, BR, BI, CR, CI)
- C***BEGIN PROLOGUE CDIV
- C***SUBSIDIARY
- C***PURPOSE Compute the complex quotient of two complex numbers.
- C***LIBRARY SLATEC
- C***TYPE COMPLEX (CDIV-C)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C Complex division, (CR,CI) = (AR,AI)/(BR,BI)
- C
- C***SEE ALSO EISDOC
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 811101 DATE WRITTEN
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900402 Added TYPE section. (WRB)
- C***END PROLOGUE CDIV
- REAL AR,AI,BR,BI,CR,CI
- C
- REAL S,ARS,AIS,BRS,BIS
- C***FIRST EXECUTABLE STATEMENT CDIV
- S = ABS(BR) + ABS(BI)
- ARS = AR/S
- AIS = AI/S
- BRS = BR/S
- BIS = BI/S
- S = BRS**2 + BIS**2
- CR = (ARS*BRS + AIS*BIS)/S
- CI = (AIS*BRS - ARS*BIS)/S
- RETURN
- END
- *DECK CDOTC
- COMPLEX FUNCTION CDOTC (N, CX, INCX, CY, INCY)
- C***BEGIN PROLOGUE CDOTC
- C***PURPOSE Dot product of two complex vectors using the complex
- C conjugate of the first vector.
- C***LIBRARY SLATEC (BLAS)
- C***CATEGORY D1A4
- C***TYPE COMPLEX (CDOTC-C)
- C***KEYWORDS BLAS, INNER PRODUCT, LINEAR ALGEBRA, VECTOR
- C***AUTHOR Lawson, C. L., (JPL)
- C Hanson, R. J., (SNLA)
- C Kincaid, D. R., (U. of Texas)
- C Krogh, F. T., (JPL)
- C***DESCRIPTION
- C
- C B L A S Subprogram
- C Description of Parameters
- C
- C --Input--
- C N number of elements in input vector(s)
- C CX complex vector with N elements
- C INCX storage spacing between elements of CX
- C CY complex vector with N elements
- C INCY storage spacing between elements of CY
- C
- C --Output--
- C CDOTC complex result (zero if N .LE. 0)
- C
- C Returns the dot product of complex CX and CY, using CONJUGATE(CX)
- C CDOTC = SUM for I = 0 to N-1 of CONJ(CX(LX+I*INCX))*CY(LY+I*INCY),
- C where LX = 1 if INCX .GE. 0, else LX = 1+(1-N)*INCX, and LY is
- C defined in a similar way using INCY.
- C
- C***REFERENCES C. L. Lawson, R. J. Hanson, D. R. Kincaid and F. T.
- C Krogh, Basic linear algebra subprograms for Fortran
- C usage, Algorithm No. 539, Transactions on Mathematical
- C Software 5, 3 (September 1979), pp. 308-323.
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 791001 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920310 Corrected definition of LX in DESCRIPTION. (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CDOTC
- COMPLEX CX(*),CY(*)
- C***FIRST EXECUTABLE STATEMENT CDOTC
- CDOTC = (0.0,0.0)
- IF (N .LE. 0) RETURN
- IF (INCX.EQ.INCY .AND. INCX.GT.0) GO TO 20
- C
- C Code for unequal or nonpositive increments.
- C
- KX = 1
- KY = 1
- IF (INCX .LT. 0) KX = 1+(1-N)*INCX
- IF (INCY .LT. 0) KY = 1+(1-N)*INCY
- DO 10 I = 1,N
- CDOTC = CDOTC + CONJG(CX(KX))*CY(KY)
- KX = KX + INCX
- KY = KY + INCY
- 10 CONTINUE
- RETURN
- C
- C Code for equal, positive increments.
- C
- 20 NS = N*INCX
- DO 30 I = 1,NS,INCX
- CDOTC = CDOTC + CONJG(CX(I))*CY(I)
- 30 CONTINUE
- RETURN
- END
- *DECK CDOTU
- COMPLEX FUNCTION CDOTU (N, CX, INCX, CY, INCY)
- C***BEGIN PROLOGUE CDOTU
- C***PURPOSE Compute the inner product of two vectors.
- C***LIBRARY SLATEC (BLAS)
- C***CATEGORY D1A4
- C***TYPE COMPLEX (SDOT-S, DDOT-D, CDOTU-C)
- C***KEYWORDS BLAS, INNER PRODUCT, LINEAR ALGEBRA, VECTOR
- C***AUTHOR Lawson, C. L., (JPL)
- C Hanson, R. J., (SNLA)
- C Kincaid, D. R., (U. of Texas)
- C Krogh, F. T., (JPL)
- C***DESCRIPTION
- C
- C B L A S Subprogram
- C Description of parameters
- C
- C --Input--
- C N number of elements in input vector(s)
- C CX complex vector with N elements
- C INCX storage spacing between elements of CX
- C CY complex vector with N elements
- C INCY storage spacing between elements of CY
- C
- C --Output--
- C CDOTU complex result (zero if N .LE. 0)
- C
- C Returns the dot product of complex CX and CY, no conjugation
- C CDOTU = SUM for I = 0 to N-1 of CX(LX+I*INCX) * CY(LY+I*INCY),
- C where LX = 1 if INCX .GE. 0, else LX = 1+(1-N)*INCX, and LY is
- C defined in a similar way using INCY.
- C
- C***REFERENCES C. L. Lawson, R. J. Hanson, D. R. Kincaid and F. T.
- C Krogh, Basic linear algebra subprograms for Fortran
- C usage, Algorithm No. 539, Transactions on Mathematical
- C Software 5, 3 (September 1979), pp. 308-323.
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 791001 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920310 Corrected definition of LX in DESCRIPTION. (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CDOTU
- COMPLEX CX(*),CY(*)
- C***FIRST EXECUTABLE STATEMENT CDOTU
- CDOTU = (0.0,0.0)
- IF (N .LE. 0) RETURN
- IF (INCX.EQ.INCY .AND. INCX.GT.0) GO TO 20
- C
- C Code for unequal or nonpositive increments.
- C
- KX = 1
- KY = 1
- IF (INCX .LT. 0) KX = 1+(1-N)*INCX
- IF (INCY .LT. 0) KY = 1+(1-N)*INCY
- DO 10 I = 1,N
- CDOTU = CDOTU + CX(KX)*CY(KY)
- KX = KX + INCX
- KY = KY + INCY
- 10 CONTINUE
- RETURN
- C
- C Code for equal, positive increments.
- C
- 20 NS = N*INCX
- DO 30 I = 1,NS,INCX
- CDOTU = CDOTU + CX(I)*CY(I)
- 30 CONTINUE
- RETURN
- END
- *DECK CEXPRL
- COMPLEX FUNCTION CEXPRL (Z)
- C***BEGIN PROLOGUE CEXPRL
- C***PURPOSE Calculate the relative error exponential (EXP(X)-1)/X.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C4B
- C***TYPE COMPLEX (EXPREL-S, DEXPRL-D, CEXPRL-C)
- C***KEYWORDS ELEMENTARY FUNCTIONS, EXPONENTIAL, FIRST ORDER, FNLIB
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C Evaluate (EXP(Z)-1)/Z . For small ABS(Z), we use the Taylor
- C series. We could instead use the expression
- C CEXPRL(Z) = (EXP(X)*EXP(I*Y)-1)/Z
- C = (X*EXPREL(X) * (1 - 2*SIN(Y/2)**2) - 2*SIN(Y/2)**2
- C + I*SIN(Y)*(1+X*EXPREL(X))) / Z
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED R1MACH
- C***REVISION HISTORY (YYMMDD)
- C 770801 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C***END PROLOGUE CEXPRL
- COMPLEX Z
- LOGICAL FIRST
- SAVE NTERMS, RBND, FIRST
- DATA FIRST / .TRUE. /
- C***FIRST EXECUTABLE STATEMENT CEXPRL
- IF (FIRST) THEN
- ALNEPS = LOG(R1MACH(3))
- XN = 3.72 - 0.3*ALNEPS
- XLN = LOG((XN+1.0)/1.36)
- NTERMS = XN - (XN*XLN+ALNEPS)/(XLN+1.36) + 1.5
- RBND = R1MACH(3)
- ENDIF
- FIRST = .FALSE.
- C
- R = ABS(Z)
- IF (R.GT.0.5) CEXPRL = (EXP(Z) - 1.0) / Z
- IF (R.GT.0.5) RETURN
- C
- CEXPRL = (1.0, 0.0)
- IF (R.LT.RBND) RETURN
- C
- CEXPRL = (0.0, 0.0)
- DO 20 I=1,NTERMS
- CEXPRL = 1.0 + CEXPRL*Z/(NTERMS+2-I)
- 20 CONTINUE
- C
- RETURN
- END
- *DECK CFFTB
- SUBROUTINE CFFTB (N, C, WSAVE)
- C***BEGIN PROLOGUE CFFTB
- C***SUBSIDIARY
- C***PURPOSE Compute the unnormalized inverse of CFFTF.
- C***LIBRARY SLATEC (FFTPACK)
- C***CATEGORY J1A2
- C***TYPE COMPLEX (RFFTB-S, CFFTB-C)
- C***KEYWORDS FFTPACK, FOURIER TRANSFORM
- C***AUTHOR Swarztrauber, P. N., (NCAR)
- C***DESCRIPTION
- C
- C ********************************************************************
- C * NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE *
- C ********************************************************************
- C * *
- C * This routine uses non-standard Fortran 77 constructs and will *
- C * be removed from the library at a future date. You are *
- C * requested to use CFFTB1. *
- C * *
- C ********************************************************************
- C
- C Subroutine CFFTB computes the backward complex discrete Fourier
- C transform (the Fourier synthesis). Equivalently, CFFTB computes
- C a complex periodic sequence from its Fourier coefficients.
- C The transform is defined below at output parameter C.
- C
- C A call of CFFTF followed by a call of CFFTB will multiply the
- C sequence by N.
- C
- C The array WSAVE which is used by subroutine CFFTB must be
- C initialized by calling subroutine CFFTI(N,WSAVE).
- C
- C Input Parameters
- C
- C N the length of the complex sequence C. The method is
- C more efficient when N is the product of small primes.
- C
- C C a complex array of length N which contains the sequence
- C
- C WSAVE a real work array which must be dimensioned at least 4*N+15
- C in the program that calls CFFTB. The WSAVE array must be
- C initialized by calling subroutine CFFTI(N,WSAVE), and a
- C different WSAVE array must be used for each different
- C value of N. This initialization does not have to be
- C repeated so long as N remains unchanged. Thus subsequent
- C transforms can be obtained faster than the first.
- C The same WSAVE array can be used by CFFTF and CFFTB.
- C
- C Output Parameters
- C
- C C For J=1,...,N
- C
- C C(J)=the sum from K=1,...,N of
- C
- C C(K)*EXP(I*(J-1)*(K-1)*2*PI/N)
- C
- C where I=SQRT(-1)
- C
- C WSAVE contains initialization calculations which must not be
- C destroyed between calls of subroutine CFFTF or CFFTB
- C
- C***REFERENCES P. N. Swarztrauber, Vectorizing the FFTs, in Parallel
- C Computations (G. Rodrigue, ed.), Academic Press,
- C 1982, pp. 51-83.
- C***ROUTINES CALLED CFFTB1
- C***REVISION HISTORY (YYMMDD)
- C 790601 DATE WRITTEN
- C 830401 Modified to use SLATEC library source file format.
- C 860115 Modified by Ron Boisvert to adhere to Fortran 77 by
- C changing dummy array size declarations (1) to (*).
- C 861211 REVISION DATE from Version 3.2
- C 881128 Modified by Dick Valent to meet prologue standards.
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900131 Routine changed from user-callable to subsidiary
- C because of non-standard Fortran 77 arguments in the
- C call to CFFTB1. (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CFFTB
- COMPLEX C
- DIMENSION C(*), WSAVE(*)
- C***FIRST EXECUTABLE STATEMENT CFFTB
- IF (N .EQ. 1) RETURN
- IW1 = N+N+1
- IW2 = IW1+N+N
- CALL CFFTB1 (N,C,WSAVE,WSAVE(IW1),WSAVE(IW2))
- RETURN
- END
- *DECK CFFTB1
- SUBROUTINE CFFTB1 (N, C, CH, WA, IFAC)
- C***BEGIN PROLOGUE CFFTB1
- C***PURPOSE Compute the unnormalized inverse of CFFTF1.
- C***LIBRARY SLATEC (FFTPACK)
- C***CATEGORY J1A2
- C***TYPE COMPLEX (RFFTB1-S, CFFTB1-C)
- C***KEYWORDS FFTPACK, FOURIER TRANSFORM
- C***AUTHOR Swarztrauber, P. N., (NCAR)
- C***DESCRIPTION
- C
- C Subroutine CFFTB1 computes the backward complex discrete Fourier
- C transform (the Fourier synthesis). Equivalently, CFFTB1 computes
- C a complex periodic sequence from its Fourier coefficients.
- C The transform is defined below at output parameter C.
- C
- C A call of CFFTF1 followed by a call of CFFTB1 will multiply the
- C sequence by N.
- C
- C The arrays WA and IFAC which are used by subroutine CFFTB1 must be
- C initialized by calling subroutine CFFTI1 (N, WA, IFAC).
- C
- C Input Parameters
- C
- C N the length of the complex sequence C. The method is
- C more efficient when N is the product of small primes.
- C
- C C a complex array of length N which contains the sequence
- C
- C CH a real work array of length at least 2*N
- C
- C WA a real work array which must be dimensioned at least 2*N.
- C
- C IFAC an integer work array which must be dimensioned at least 15.
- C
- C The WA and IFAC arrays must be initialized by calling
- C subroutine CFFTI1 (N, WA, IFAC), and different WA and IFAC
- C arrays must be used for each different value of N. This
- C initialization does not have to be repeated so long as N
- C remains unchanged. Thus subsequent transforms can be
- C obtained faster than the first. The same WA and IFAC arrays
- C can be used by CFFTF1 and CFFTB1.
- C
- C Output Parameters
- C
- C C For J=1,...,N
- C
- C C(J)=the sum from K=1,...,N of
- C
- C C(K)*EXP(I*(J-1)*(K-1)*2*PI/N)
- C
- C where I=SQRT(-1)
- C
- C NOTE: WA and IFAC contain initialization calculations which must
- C not be destroyed between calls of subroutine CFFTF1 or CFFTB1
- C
- C***REFERENCES P. N. Swarztrauber, Vectorizing the FFTs, in Parallel
- C Computations (G. Rodrigue, ed.), Academic Press,
- C 1982, pp. 51-83.
- C***ROUTINES CALLED PASSB, PASSB2, PASSB3, PASSB4, PASSB5
- C***REVISION HISTORY (YYMMDD)
- C 790601 DATE WRITTEN
- C 830401 Modified to use SLATEC library source file format.
- C 860115 Modified by Ron Boisvert to adhere to Fortran 77 by
- C changing dummy array size declarations (1) to (*).
- C 881128 Modified by Dick Valent to meet prologue standards.
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900131 Routine changed from subsidiary to user-callable. (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CFFTB1
- DIMENSION CH(*), C(*), WA(*), IFAC(*)
- C***FIRST EXECUTABLE STATEMENT CFFTB1
- NF = IFAC(2)
- NA = 0
- L1 = 1
- IW = 1
- DO 116 K1=1,NF
- IP = IFAC(K1+2)
- L2 = IP*L1
- IDO = N/L2
- IDOT = IDO+IDO
- IDL1 = IDOT*L1
- IF (IP .NE. 4) GO TO 103
- IX2 = IW+IDOT
- IX3 = IX2+IDOT
- IF (NA .NE. 0) GO TO 101
- CALL PASSB4 (IDOT,L1,C,CH,WA(IW),WA(IX2),WA(IX3))
- GO TO 102
- 101 CALL PASSB4 (IDOT,L1,CH,C,WA(IW),WA(IX2),WA(IX3))
- 102 NA = 1-NA
- GO TO 115
- 103 IF (IP .NE. 2) GO TO 106
- IF (NA .NE. 0) GO TO 104
- CALL PASSB2 (IDOT,L1,C,CH,WA(IW))
- GO TO 105
- 104 CALL PASSB2 (IDOT,L1,CH,C,WA(IW))
- 105 NA = 1-NA
- GO TO 115
- 106 IF (IP .NE. 3) GO TO 109
- IX2 = IW+IDOT
- IF (NA .NE. 0) GO TO 107
- CALL PASSB3 (IDOT,L1,C,CH,WA(IW),WA(IX2))
- GO TO 108
- 107 CALL PASSB3 (IDOT,L1,CH,C,WA(IW),WA(IX2))
- 108 NA = 1-NA
- GO TO 115
- 109 IF (IP .NE. 5) GO TO 112
- IX2 = IW+IDOT
- IX3 = IX2+IDOT
- IX4 = IX3+IDOT
- IF (NA .NE. 0) GO TO 110
- CALL PASSB5 (IDOT,L1,C,CH,WA(IW),WA(IX2),WA(IX3),WA(IX4))
- GO TO 111
- 110 CALL PASSB5 (IDOT,L1,CH,C,WA(IW),WA(IX2),WA(IX3),WA(IX4))
- 111 NA = 1-NA
- GO TO 115
- 112 IF (NA .NE. 0) GO TO 113
- CALL PASSB (NAC,IDOT,IP,L1,IDL1,C,C,C,CH,CH,WA(IW))
- GO TO 114
- 113 CALL PASSB (NAC,IDOT,IP,L1,IDL1,CH,CH,CH,C,C,WA(IW))
- 114 IF (NAC .NE. 0) NA = 1-NA
- 115 L1 = L2
- IW = IW+(IP-1)*IDOT
- 116 CONTINUE
- IF (NA .EQ. 0) RETURN
- N2 = N+N
- DO 117 I=1,N2
- C(I) = CH(I)
- 117 CONTINUE
- RETURN
- END
- *DECK CFFTF
- SUBROUTINE CFFTF (N, C, WSAVE)
- C***BEGIN PROLOGUE CFFTF
- C***SUBSIDIARY
- C***PURPOSE Compute the forward transform of a complex, periodic
- C sequence.
- C***LIBRARY SLATEC (FFTPACK)
- C***CATEGORY J1A2
- C***TYPE COMPLEX (RFFTF-S, CFFTF-C)
- C***KEYWORDS FFTPACK, FOURIER TRANSFORM
- C***AUTHOR Swarztrauber, P. N., (NCAR)
- C***DESCRIPTION
- C
- C ********************************************************************
- C * NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE *
- C ********************************************************************
- C * *
- C * This routine uses non-standard Fortran 77 constructs and will *
- C * be removed from the library at a future date. You are *
- C * requested to use CFFTF1. *
- C * *
- C ********************************************************************
- C
- C Subroutine CFFTF computes the forward complex discrete Fourier
- C transform (the Fourier analysis). Equivalently, CFFTF computes
- C the Fourier coefficients of a complex periodic sequence.
- C The transform is defined below at output parameter C.
- C
- C The transform is not normalized. To obtain a normalized transform
- C the output must be divided by N. Otherwise a call of CFFTF
- C followed by a call of CFFTB will multiply the sequence by N.
- C
- C The array WSAVE which is used by subroutine CFFTF must be
- C initialized by calling subroutine CFFTI(N,WSAVE).
- C
- C Input Parameters
- C
- C N the length of the complex sequence C. The method is
- C more efficient when N is the product of small primes.
- C
- C C a complex array of length N which contains the sequence
- C
- C WSAVE a real work array which must be dimensioned at least 4*N+15
- C in the program that calls CFFTF. The WSAVE array must be
- C initialized by calling subroutine CFFTI(N,WSAVE), and a
- C different WSAVE array must be used for each different
- C value of N. This initialization does not have to be
- C repeated so long as N remains unchanged. Thus subsequent
- C transforms can be obtained faster than the first.
- C The same WSAVE array can be used by CFFTF and CFFTB.
- C
- C Output Parameters
- C
- C C For J=1,...,N
- C
- C C(J)=the sum from K=1,...,N of
- C
- C C(K)*EXP(-I*(J-1)*(K-1)*2*PI/N)
- C
- C where I=SQRT(-1)
- C
- C WSAVE contains initialization calculations which must not be
- C destroyed between calls of subroutine CFFTF or CFFTB
- C
- C***REFERENCES P. N. Swarztrauber, Vectorizing the FFTs, in Parallel
- C Computations (G. Rodrigue, ed.), Academic Press,
- C 1982, pp. 51-83.
- C***ROUTINES CALLED CFFTF1
- C***REVISION HISTORY (YYMMDD)
- C 790601 DATE WRITTEN
- C 830401 Modified to use SLATEC library source file format.
- C 860115 Modified by Ron Boisvert to adhere to Fortran 77 by
- C changing dummy array size declarations (1) to (*).
- C 861211 REVISION DATE from Version 3.2
- C 881128 Modified by Dick Valent to meet prologue standards.
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900131 Routine changed from user-callable to subsidiary
- C because of non-standard Fortran 77 arguments in the
- C call to CFFTB1. (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CFFTF
- COMPLEX C
- DIMENSION C(*), WSAVE(*)
- C***FIRST EXECUTABLE STATEMENT CFFTF
- IF (N .EQ. 1) RETURN
- IW1 = N+N+1
- IW2 = IW1+N+N
- CALL CFFTF1 (N,C,WSAVE,WSAVE(IW1),WSAVE(IW2))
- RETURN
- END
- *DECK CFFTF1
- SUBROUTINE CFFTF1 (N, C, CH, WA, IFAC)
- C***BEGIN PROLOGUE CFFTF1
- C***PURPOSE Compute the forward transform of a complex, periodic
- C sequence.
- C***LIBRARY SLATEC (FFTPACK)
- C***CATEGORY J1A2
- C***TYPE COMPLEX (RFFTF1-S, CFFTF1-C)
- C***KEYWORDS FFTPACK, FOURIER TRANSFORM
- C***AUTHOR Swarztrauber, P. N., (NCAR)
- C***DESCRIPTION
- C
- C Subroutine CFFTF1 computes the forward complex discrete Fourier
- C transform (the Fourier analysis). Equivalently, CFFTF1 computes
- C the Fourier coefficients of a complex periodic sequence.
- C The transform is defined below at output parameter C.
- C
- C The transform is not normalized. To obtain a normalized transform
- C the output must be divided by N. Otherwise a call of CFFTF1
- C followed by a call of CFFTB1 will multiply the sequence by N.
- C
- C The arrays WA and IFAC which are used by subroutine CFFTB1 must be
- C initialized by calling subroutine CFFTI1 (N, WA, IFAC).
- C
- C Input Parameters
- C
- C N the length of the complex sequence C. The method is
- C more efficient when N is the product of small primes.
- C
- C C a complex array of length N which contains the sequence
- C
- C CH a real work array of length at least 2*N
- C
- C WA a real work array which must be dimensioned at least 2*N.
- C
- C IFAC an integer work array which must be dimensioned at least 15.
- C
- C The WA and IFAC arrays must be initialized by calling
- C subroutine CFFTI1 (N, WA, IFAC), and different WA and IFAC
- C arrays must be used for each different value of N. This
- C initialization does not have to be repeated so long as N
- C remains unchanged. Thus subsequent transforms can be
- C obtained faster than the first. The same WA and IFAC arrays
- C can be used by CFFTF1 and CFFTB1.
- C
- C Output Parameters
- C
- C C For J=1,...,N
- C
- C C(J)=the sum from K=1,...,N of
- C
- C C(K)*EXP(-I*(J-1)*(K-1)*2*PI/N)
- C
- C where I=SQRT(-1)
- C
- C NOTE: WA and IFAC contain initialization calculations which must
- C not be destroyed between calls of subroutine CFFTF1 or CFFTB1
- C
- C***REFERENCES P. N. Swarztrauber, Vectorizing the FFTs, in Parallel
- C Computations (G. Rodrigue, ed.), Academic Press,
- C 1982, pp. 51-83.
- C***ROUTINES CALLED PASSF, PASSF2, PASSF3, PASSF4, PASSF5
- C***REVISION HISTORY (YYMMDD)
- C 790601 DATE WRITTEN
- C 830401 Modified to use SLATEC library source file format.
- C 860115 Modified by Ron Boisvert to adhere to Fortran 77 by
- C changing dummy array size declarations (1) to (*).
- C 881128 Modified by Dick Valent to meet prologue standards.
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900131 Routine changed from subsidiary to user-callable. (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CFFTF1
- DIMENSION CH(*), C(*), WA(*), IFAC(*)
- C***FIRST EXECUTABLE STATEMENT CFFTF1
- NF = IFAC(2)
- NA = 0
- L1 = 1
- IW = 1
- DO 116 K1=1,NF
- IP = IFAC(K1+2)
- L2 = IP*L1
- IDO = N/L2
- IDOT = IDO+IDO
- IDL1 = IDOT*L1
- IF (IP .NE. 4) GO TO 103
- IX2 = IW+IDOT
- IX3 = IX2+IDOT
- IF (NA .NE. 0) GO TO 101
- CALL PASSF4 (IDOT,L1,C,CH,WA(IW),WA(IX2),WA(IX3))
- GO TO 102
- 101 CALL PASSF4 (IDOT,L1,CH,C,WA(IW),WA(IX2),WA(IX3))
- 102 NA = 1-NA
- GO TO 115
- 103 IF (IP .NE. 2) GO TO 106
- IF (NA .NE. 0) GO TO 104
- CALL PASSF2 (IDOT,L1,C,CH,WA(IW))
- GO TO 105
- 104 CALL PASSF2 (IDOT,L1,CH,C,WA(IW))
- 105 NA = 1-NA
- GO TO 115
- 106 IF (IP .NE. 3) GO TO 109
- IX2 = IW+IDOT
- IF (NA .NE. 0) GO TO 107
- CALL PASSF3 (IDOT,L1,C,CH,WA(IW),WA(IX2))
- GO TO 108
- 107 CALL PASSF3 (IDOT,L1,CH,C,WA(IW),WA(IX2))
- 108 NA = 1-NA
- GO TO 115
- 109 IF (IP .NE. 5) GO TO 112
- IX2 = IW+IDOT
- IX3 = IX2+IDOT
- IX4 = IX3+IDOT
- IF (NA .NE. 0) GO TO 110
- CALL PASSF5 (IDOT,L1,C,CH,WA(IW),WA(IX2),WA(IX3),WA(IX4))
- GO TO 111
- 110 CALL PASSF5 (IDOT,L1,CH,C,WA(IW),WA(IX2),WA(IX3),WA(IX4))
- 111 NA = 1-NA
- GO TO 115
- 112 IF (NA .NE. 0) GO TO 113
- CALL PASSF (NAC,IDOT,IP,L1,IDL1,C,C,C,CH,CH,WA(IW))
- GO TO 114
- 113 CALL PASSF (NAC,IDOT,IP,L1,IDL1,CH,CH,CH,C,C,WA(IW))
- 114 IF (NAC .NE. 0) NA = 1-NA
- 115 L1 = L2
- IW = IW+(IP-1)*IDOT
- 116 CONTINUE
- IF (NA .EQ. 0) RETURN
- N2 = N+N
- DO 117 I=1,N2
- C(I) = CH(I)
- 117 CONTINUE
- RETURN
- END
- *DECK CFFTI
- SUBROUTINE CFFTI (N, WSAVE)
- C***BEGIN PROLOGUE CFFTI
- C***SUBSIDIARY
- C***PURPOSE Initialize a work array for CFFTF and CFFTB.
- C***LIBRARY SLATEC (FFTPACK)
- C***CATEGORY J1A2
- C***TYPE COMPLEX (RFFTI-S, CFFTI-C)
- C***KEYWORDS FFTPACK, FOURIER TRANSFORM
- C***AUTHOR Swarztrauber, P. N., (NCAR)
- C***DESCRIPTION
- C
- C ********************************************************************
- C * NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE *
- C ********************************************************************
- C * *
- C * This routine uses non-standard Fortran 77 constructs and will *
- C * be removed from the library at a future date. You are *
- C * requested to use CFFTI1. *
- C * *
- C ********************************************************************
- C
- C Subroutine CFFTI initializes the array WSAVE which is used in
- C both CFFTF and CFFTB. The prime factorization of N together with
- C a tabulation of the trigonometric functions are computed and
- C stored in WSAVE.
- C
- C Input Parameter
- C
- C N the length of the sequence to be transformed
- C
- C Output Parameter
- C
- C WSAVE a work array which must be dimensioned at least 4*N+15.
- C The same work array can be used for both CFFTF and CFFTB
- C as long as N remains unchanged. Different WSAVE arrays
- C are required for different values of N. The contents of
- C WSAVE must not be changed between calls of CFFTF or CFFTB.
- C
- C***REFERENCES P. N. Swarztrauber, Vectorizing the FFTs, in Parallel
- C Computations (G. Rodrigue, ed.), Academic Press,
- C 1982, pp. 51-83.
- C***ROUTINES CALLED CFFTI1
- C***REVISION HISTORY (YYMMDD)
- C 790601 DATE WRITTEN
- C 830401 Modified to use SLATEC library source file format.
- C 860115 Modified by Ron Boisvert to adhere to Fortran 77 by
- C changing dummy array size declarations (1) to (*).
- C 861211 REVISION DATE from Version 3.2
- C 881128 Modified by Dick Valent to meet prologue standards.
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900131 Routine changed from user-callable to subsidiary
- C because of non-standard Fortran 77 arguments in the
- C call to CFFTB1. (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CFFTI
- DIMENSION WSAVE(*)
- C***FIRST EXECUTABLE STATEMENT CFFTI
- IF (N .EQ. 1) RETURN
- IW1 = N+N+1
- IW2 = IW1+N+N
- CALL CFFTI1 (N,WSAVE(IW1),WSAVE(IW2))
- RETURN
- END
- *DECK CFFTI1
- SUBROUTINE CFFTI1 (N, WA, IFAC)
- C***BEGIN PROLOGUE CFFTI1
- C***PURPOSE Initialize a real and an integer work array for CFFTF1 and
- C CFFTB1.
- C***LIBRARY SLATEC (FFTPACK)
- C***CATEGORY J1A2
- C***TYPE COMPLEX (RFFTI1-S, CFFTI1-C)
- C***KEYWORDS FFTPACK, FOURIER TRANSFORM
- C***AUTHOR Swarztrauber, P. N., (NCAR)
- C***DESCRIPTION
- C
- C Subroutine CFFTI1 initializes the work arrays WA and IFAC which are
- C used in both CFFTF1 and CFFTB1. The prime factorization of N and a
- C tabulation of the trigonometric functions are computed and stored in
- C IFAC and WA, respectively.
- C
- C Input Parameter
- C
- C N the length of the sequence to be transformed
- C
- C Output Parameters
- C
- C WA a real work array which must be dimensioned at least 2*N.
- C
- C IFAC an integer work array which must be dimensioned at least 15.
- C
- C The same work arrays can be used for both CFFTF1 and CFFTB1
- C as long as N remains unchanged. Different WA and IFAC arrays
- C are required for different values of N. The contents of
- C WA and IFAC must not be changed between calls of CFFTF1 or
- C CFFTB1.
- C
- C***REFERENCES P. N. Swarztrauber, Vectorizing the FFTs, in Parallel
- C Computations (G. Rodrigue, ed.), Academic Press,
- C 1982, pp. 51-83.
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 790601 DATE WRITTEN
- C 830401 Modified to use SLATEC library source file format.
- C 860115 Modified by Ron Boisvert to adhere to Fortran 77 by
- C (a) changing dummy array size declarations (1) to (*),
- C (b) changing references to intrinsic function FLOAT
- C to REAL, and
- C (c) changing definition of variable TPI by using
- C FORTRAN intrinsic function ATAN instead of a DATA
- C statement.
- C 881128 Modified by Dick Valent to meet prologue standards.
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900131 Routine changed from subsidiary to user-callable. (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CFFTI1
- DIMENSION WA(*), IFAC(*), NTRYH(4)
- SAVE NTRYH
- DATA NTRYH(1),NTRYH(2),NTRYH(3),NTRYH(4)/3,4,2,5/
- C***FIRST EXECUTABLE STATEMENT CFFTI1
- NL = N
- NF = 0
- J = 0
- 101 J = J+1
- IF (J-4) 102,102,103
- 102 NTRY = NTRYH(J)
- GO TO 104
- 103 NTRY = NTRY+2
- 104 NQ = NL/NTRY
- NR = NL-NTRY*NQ
- IF (NR) 101,105,101
- 105 NF = NF+1
- IFAC(NF+2) = NTRY
- NL = NQ
- IF (NTRY .NE. 2) GO TO 107
- IF (NF .EQ. 1) GO TO 107
- DO 106 I=2,NF
- IB = NF-I+2
- IFAC(IB+2) = IFAC(IB+1)
- 106 CONTINUE
- IFAC(3) = 2
- 107 IF (NL .NE. 1) GO TO 104
- IFAC(1) = N
- IFAC(2) = NF
- TPI = 8.*ATAN(1.)
- ARGH = TPI/N
- I = 2
- L1 = 1
- DO 110 K1=1,NF
- IP = IFAC(K1+2)
- LD = 0
- L2 = L1*IP
- IDO = N/L2
- IDOT = IDO+IDO+2
- IPM = IP-1
- DO 109 J=1,IPM
- I1 = I
- WA(I-1) = 1.
- WA(I) = 0.
- LD = LD+L1
- FI = 0.
- ARGLD = LD*ARGH
- DO 108 II=4,IDOT,2
- I = I+2
- FI = FI+1.
- ARG = FI*ARGLD
- WA(I-1) = COS(ARG)
- WA(I) = SIN(ARG)
- 108 CONTINUE
- IF (IP .LE. 5) GO TO 109
- WA(I1-1) = WA(I-1)
- WA(I1) = WA(I)
- 109 CONTINUE
- L1 = L2
- 110 CONTINUE
- RETURN
- END
- *DECK CFOD
- SUBROUTINE CFOD (METH, ELCO, TESCO)
- C***BEGIN PROLOGUE CFOD
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to DEBDF
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (CFOD-S, DCFOD-D)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C CFOD defines coefficients needed in the integrator package DEBDF
- C
- C***SEE ALSO DEBDF
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 800901 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900328 Added TYPE section. (WRB)
- C***END PROLOGUE CFOD
- C
- C
- CLLL. OPTIMIZE
- INTEGER METH, I, IB, NQ, NQM1, NQP1
- REAL ELCO, TESCO, AGAMQ, FNQ, FNQM1, PC, PINT, RAGQ,
- 1 RQFAC, RQ1FAC, TSIGN, XPIN
- DIMENSION ELCO(13,12), TESCO(3,12)
- C-----------------------------------------------------------------------
- C CFOD IS CALLED BY THE INTEGRATOR ROUTINE TO SET COEFFICIENTS
- C NEEDED THERE. THE COEFFICIENTS FOR THE CURRENT METHOD, AS
- C GIVEN BY THE VALUE OF METH, ARE SET FOR ALL ORDERS AND SAVED.
- C THE MAXIMUM ORDER ASSUMED HERE IS 12 IF METH = 1 AND 5 IF METH = 2.
- C (A SMALLER VALUE OF THE MAXIMUM ORDER IS ALSO ALLOWED.)
- C CFOD IS CALLED ONCE AT THE BEGINNING OF THE PROBLEM,
- C AND IS NOT CALLED AGAIN UNLESS AND UNTIL METH IS CHANGED.
- C
- C THE ELCO ARRAY CONTAINS THE BASIC METHOD COEFFICIENTS.
- C THE COEFFICIENTS EL(I), 1 .LE. I .LE. NQ+1, FOR THE METHOD OF
- C ORDER NQ ARE STORED IN ELCO(I,NQ). THEY ARE GIVEN BY A GENERATING
- C POLYNOMIAL, I.E.,
- C L(X) = EL(1) + EL(2)*X + ... + EL(NQ+1)*X**NQ.
- C FOR THE IMPLICIT ADAMS METHODS, L(X) IS GIVEN BY
- C DL/DX = (X+1)*(X+2)*...*(X+NQ-1)/FACTORIAL(NQ-1), L(-1) = 0.
- C FOR THE BDF METHODS, L(X) IS GIVEN BY
- C L(X) = (X+1)*(X+2)* ... *(X+NQ)/K,
- C WHERE K = FACTORIAL(NQ)*(1 + 1/2 + ... + 1/NQ).
- C
- C THE TESCO ARRAY CONTAINS TEST CONSTANTS USED FOR THE
- C LOCAL ERROR TEST AND THE SELECTION OF STEP SIZE AND/OR ORDER.
- C AT ORDER NQ, TESCO(K,NQ) IS USED FOR THE SELECTION OF STEP
- C SIZE AT ORDER NQ - 1 IF K = 1, AT ORDER NQ IF K = 2, AND AT ORDER
- C NQ + 1 IF K = 3.
- C-----------------------------------------------------------------------
- DIMENSION PC(12)
- C
- C***FIRST EXECUTABLE STATEMENT CFOD
- GO TO (100, 200), METH
- C
- 100 ELCO(1,1) = 1.0E0
- ELCO(2,1) = 1.0E0
- TESCO(1,1) = 0.0E0
- TESCO(2,1) = 2.0E0
- TESCO(1,2) = 1.0E0
- TESCO(3,12) = 0.0E0
- PC(1) = 1.0E0
- RQFAC = 1.0E0
- DO 140 NQ = 2,12
- C-----------------------------------------------------------------------
- C THE PC ARRAY WILL CONTAIN THE COEFFICIENTS OF THE POLYNOMIAL
- C P(X) = (X+1)*(X+2)*...*(X+NQ-1).
- C INITIALLY, P(X) = 1.
- C-----------------------------------------------------------------------
- RQ1FAC = RQFAC
- RQFAC = RQFAC/NQ
- NQM1 = NQ - 1
- FNQM1 = NQM1
- NQP1 = NQ + 1
- C FORM COEFFICIENTS OF P(X)*(X+NQ-1). ----------------------------------
- PC(NQ) = 0.0E0
- DO 110 IB = 1,NQM1
- I = NQP1 - IB
- 110 PC(I) = PC(I-1) + FNQM1*PC(I)
- PC(1) = FNQM1*PC(1)
- C COMPUTE INTEGRAL, -1 TO 0, OF P(X) AND X*P(X). -----------------------
- PINT = PC(1)
- XPIN = PC(1)/2.0E0
- TSIGN = 1.0E0
- DO 120 I = 2,NQ
- TSIGN = -TSIGN
- PINT = PINT + TSIGN*PC(I)/I
- 120 XPIN = XPIN + TSIGN*PC(I)/(I+1)
- C STORE COEFFICIENTS IN ELCO AND TESCO. --------------------------------
- ELCO(1,NQ) = PINT*RQ1FAC
- ELCO(2,NQ) = 1.0E0
- DO 130 I = 2,NQ
- 130 ELCO(I+1,NQ) = RQ1FAC*PC(I)/I
- AGAMQ = RQFAC*XPIN
- RAGQ = 1.0E0/AGAMQ
- TESCO(2,NQ) = RAGQ
- IF(NQ.LT.12)TESCO(1,NQP1)=RAGQ*RQFAC/NQP1
- TESCO(3,NQM1) = RAGQ
- 140 CONTINUE
- RETURN
- C
- 200 PC(1) = 1.0E0
- RQ1FAC = 1.0E0
- DO 230 NQ = 1,5
- C-----------------------------------------------------------------------
- C THE PC ARRAY WILL CONTAIN THE COEFFICIENTS OF THE POLYNOMIAL
- C P(X) = (X+1)*(X+2)*...*(X+NQ).
- C INITIALLY, P(X) = 1.
- C-----------------------------------------------------------------------
- FNQ = NQ
- NQP1 = NQ + 1
- C FORM COEFFICIENTS OF P(X)*(X+NQ). ------------------------------------
- PC(NQP1) = 0.0E0
- DO 210 IB = 1,NQ
- I = NQ + 2 - IB
- 210 PC(I) = PC(I-1) + FNQ*PC(I)
- PC(1) = FNQ*PC(1)
- C STORE COEFFICIENTS IN ELCO AND TESCO. --------------------------------
- DO 220 I = 1,NQP1
- 220 ELCO(I,NQ) = PC(I)/PC(2)
- ELCO(2,NQ) = 1.0E0
- TESCO(1,NQ) = RQ1FAC
- TESCO(2,NQ) = NQP1/ELCO(1,NQ)
- TESCO(3,NQ) = (NQ+2)/ELCO(1,NQ)
- RQ1FAC = RQ1FAC/FNQ
- 230 CONTINUE
- RETURN
- C----------------------- END OF SUBROUTINE CFOD -----------------------
- END
- *DECK CG
- SUBROUTINE CG (NM, N, AR, AI, WR, WI, MATZ, ZR, ZI, FV1, FV2, FV3,
- + IERR)
- C***BEGIN PROLOGUE CG
- C***PURPOSE Compute the eigenvalues and, optionally, the eigenvectors
- C of a complex general matrix.
- C***LIBRARY SLATEC (EISPACK)
- C***CATEGORY D4A4
- C***TYPE COMPLEX (RG-S, CG-C)
- C***KEYWORDS EIGENVALUES, EIGENVECTORS, EISPACK
- C***AUTHOR Smith, B. T., et al.
- C***DESCRIPTION
- C
- C This subroutine calls the recommended sequence of
- C subroutines from the eigensystem subroutine package (EISPACK)
- C to find the eigenvalues and eigenvectors (if desired)
- C of a COMPLEX GENERAL matrix.
- C
- C On INPUT
- C
- C NM must be set to the row dimension of the two-dimensional
- C array parameters, AR, AI, ZR and ZI, as declared in the
- C calling program dimension statement. NM is an INTEGER
- C variable.
- C
- C N is the order of the matrix A=(AR,AI). N is an INTEGER
- C variable. N must be less than or equal to NM.
- C
- C AR and AI contain the real and imaginary parts, respectively,
- C of the complex general matrix. AR and AI are two-dimensional
- C REAL arrays, dimensioned AR(NM,N) and AI(NM,N).
- C
- C MATZ is an INTEGER variable set equal to zero if only
- C eigenvalues are desired. Otherwise, it is set to any
- C non-zero integer for both eigenvalues and eigenvectors.
- C
- C On OUTPUT
- C
- C WR and WI contain the real and imaginary parts, respectively,
- C of the eigenvalues. WR and WI are one-dimensional REAL
- C arrays, dimensioned WR(N) and WI(N).
- C
- C ZR and ZI contain the real and imaginary parts, respectively,
- C of the eigenvectors if MATZ is not zero. ZR and ZI are
- C two-dimensional REAL arrays, dimensioned ZR(NM,N) and
- C ZI(NM,N).
- C
- C IERR is an INTEGER flag set to
- C Zero for normal return,
- C 10*N if N is greater than NM,
- C J if the J-th eigenvalue has not been
- C determined after a total of 30 iterations.
- C The eigenvalues should be correct for indices
- C IERR+1, IERR+2, ..., N, but no eigenvectors are
- C computed.
- C
- C FV1, FV2, and FV3 are one-dimensional REAL arrays used for
- C temporary storage, dimensioned FV1(N), FV2(N), and FV3(N).
- C
- C Questions and comments should be directed to B. S. Garbow,
- C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY
- C ------------------------------------------------------------------
- C
- C***REFERENCES B. T. Smith, J. M. Boyle, J. J. Dongarra, B. S. Garbow,
- C Y. Ikebe, V. C. Klema and C. B. Moler, Matrix Eigen-
- C system Routines - EISPACK Guide, Springer-Verlag,
- C 1976.
- C***ROUTINES CALLED CBABK2, CBAL, COMQR, COMQR2, CORTH
- C***REVISION HISTORY (YYMMDD)
- C 760101 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CG
- C
- INTEGER N,NM,IS1,IS2,IERR,MATZ
- REAL AR(NM,*),AI(NM,*),WR(*),WI(*),ZR(NM,*),ZI(NM,*)
- REAL FV1(*),FV2(*),FV3(*)
- C
- C***FIRST EXECUTABLE STATEMENT CG
- IF (N .LE. NM) GO TO 10
- IERR = 10 * N
- GO TO 50
- C
- 10 CALL CBAL(NM,N,AR,AI,IS1,IS2,FV1)
- CALL CORTH(NM,N,IS1,IS2,AR,AI,FV2,FV3)
- IF (MATZ .NE. 0) GO TO 20
- C .......... FIND EIGENVALUES ONLY ..........
- CALL COMQR(NM,N,IS1,IS2,AR,AI,WR,WI,IERR)
- GO TO 50
- C .......... FIND BOTH EIGENVALUES AND EIGENVECTORS ..........
- 20 CALL COMQR2(NM,N,IS1,IS2,FV2,FV3,AR,AI,WR,WI,ZR,ZI,IERR)
- IF (IERR .NE. 0) GO TO 50
- CALL CBABK2(NM,N,IS1,IS2,FV1,N,ZR,ZI)
- 50 RETURN
- END
- *DECK CGAMMA
- COMPLEX FUNCTION CGAMMA (Z)
- C***BEGIN PROLOGUE CGAMMA
- C***PURPOSE Compute the complete Gamma function.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C7A
- C***TYPE COMPLEX (GAMMA-S, DGAMMA-D, CGAMMA-C)
- C***KEYWORDS COMPLETE GAMMA FUNCTION, FNLIB, SPECIAL FUNCTIONS
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C CGAMMA(Z) calculates the complete gamma function for COMPLEX
- C argument Z. This is a preliminary version that is portable
- C but not accurate.
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED CLNGAM
- C***REVISION HISTORY (YYMMDD)
- C 770701 DATE WRITTEN
- C 861211 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C***END PROLOGUE CGAMMA
- COMPLEX Z, CLNGAM
- C***FIRST EXECUTABLE STATEMENT CGAMMA
- CGAMMA = EXP (CLNGAM(Z))
- C
- RETURN
- END
- *DECK CGAMR
- COMPLEX FUNCTION CGAMR (Z)
- C***BEGIN PROLOGUE CGAMR
- C***PURPOSE Compute the reciprocal of the Gamma function.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C7A
- C***TYPE COMPLEX (GAMR-S, DGAMR-D, CGAMR-C)
- C***KEYWORDS FNLIB, RECIPROCAL GAMMA FUNCTION, SPECIAL FUNCTIONS
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C CGAMR(Z) calculates the reciprocal gamma function for COMPLEX
- C argument Z. This is a preliminary version that is not accurate.
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED CLNGAM, XERCLR, XGETF, XSETF
- C***REVISION HISTORY (YYMMDD)
- C 770701 DATE WRITTEN
- C 861211 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C***END PROLOGUE CGAMR
- COMPLEX Z, CLNGAM
- C***FIRST EXECUTABLE STATEMENT CGAMR
- CGAMR = (0.0, 0.0)
- X = REAL (Z)
- IF (X.LE.0.0 .AND. AINT(X).EQ.X .AND. AIMAG(Z).EQ.0.0) RETURN
- C
- CALL XGETF (IROLD)
- CALL XSETF (1)
- CGAMR = CLNGAM(Z)
- CALL XERCLR
- CALL XSETF (IROLD)
- CGAMR = EXP (-CGAMR)
- C
- RETURN
- END
- *DECK CGBCO
- SUBROUTINE CGBCO (ABD, LDA, N, ML, MU, IPVT, RCOND, Z)
- C***BEGIN PROLOGUE CGBCO
- C***PURPOSE Factor a band matrix by Gaussian elimination and
- C estimate the condition number of the matrix.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D2C2
- C***TYPE COMPLEX (SGBCO-S, DGBCO-D, CGBCO-C)
- C***KEYWORDS BANDED, CONDITION NUMBER, LINEAR ALGEBRA, LINPACK,
- C MATRIX FACTORIZATION
- C***AUTHOR Moler, C. B., (U. of New Mexico)
- C***DESCRIPTION
- C
- C CGBCO factors a complex band matrix by Gaussian
- C elimination and estimates the condition of the matrix.
- C
- C If RCOND is not needed, CGBFA is slightly faster.
- C To solve A*X = B , follow CGBCO by CGBSL.
- C To compute INVERSE(A)*C , follow CGBCO by CGBSL.
- C To compute DETERMINANT(A) , follow CGBCO by CGBDI.
- C
- C On Entry
- C
- C ABD COMPLEX(LDA, N)
- C contains the matrix in band storage. The columns
- C of the matrix are stored in the columns of ABD and
- C the diagonals of the matrix are stored in rows
- C ML+1 through 2*ML+MU+1 of ABD .
- C See the comments below for details.
- C
- C LDA INTEGER
- C the leading dimension of the array ABD .
- C LDA must be .GE. 2*ML + MU + 1 .
- C
- C N INTEGER
- C the order of the original matrix.
- C
- C ML INTEGER
- C number of diagonals below the main diagonal.
- C 0 .LE. ML .LT. N .
- C
- C MU INTEGER
- C number of diagonals above the main diagonal.
- C 0 .LE. MU .LT. N .
- C More efficient if ML .LE. MU .
- C
- C On Return
- C
- C ABD an upper triangular matrix in band storage and
- C the multipliers which were used to obtain it.
- C The factorization can be written A = L*U where
- C L is a product of permutation and unit lower
- C triangular matrices and U is upper triangular.
- C
- C IPVT INTEGER(N)
- C an integer vector of pivot indices.
- C
- C RCOND REAL
- C an estimate of the reciprocal condition of A .
- C For the system A*X = B , relative perturbations
- C in A And B of size EPSILON may cause
- C relative perturbations in X of size EPSILON/RCOND .
- C If RCOND is so small that the logical expression
- C 1.0 + RCOND .EQ. 1.0
- C is true, then A may be singular to working
- C precision. In particular, RCOND is zero if
- C exact singularity is detected or the estimate
- C underflows.
- C
- C Z COMPLEX(N)
- C a work vector whose contents are usually unimportant.
- C If A is close to a singular matrix, then Z is
- C an approximate null vector in the sense that
- C NORM(A*Z) = RCOND*NORM(A)*NORM(Z) .
- C
- C Band Storage
- C
- C if A is a band matrix, the following program segment
- C will set up the input.
- C
- C ML = (band width below the diagonal)
- C MU = (band width above the diagonal)
- C M = ML + MU + 1
- C DO 20 J = 1, N
- C I1 = MAX(1, J-MU)
- C I2 = MIN(N, J+Ml)
- C DO 10 I = I1, I2
- C K = I - J + M
- C ABD(K,J) = A(I,J)
- C 10 CONTINUE
- C 20 CONTINUE
- C
- C This uses rows ML+1 through 2*ML+MU+1 of ABD .
- C In addition, the first ML rows in ABD are used for
- C elements generated during the triangularization.
- C The total number of rows needed in ABD is 2*ML+MU+1 .
- C The ML+MU by ML+MU upper left triangle and the
- C ML by ML lower right triangle are not referenced.
- C
- C Example: If the original matrix is
- C
- C 11 12 13 0 0 0
- C 21 22 23 24 0 0
- C 0 32 33 34 35 0
- C 0 0 43 44 45 46
- C 0 0 0 54 55 56
- C 0 0 0 0 65 66
- C
- C then N = 6, ML = 1, MU = 2, LDA .GE. 5 and ABD should contain
- C
- C * * * + + + , * = not used
- C * * 13 24 35 46 , + = used for pivoting
- C * 12 23 34 45 56
- C 11 22 33 44 55 66
- C 21 32 43 54 65 *
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CAXPY, CDOTC, CGBFA, CSSCAL, SCASUM
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CGBCO
- INTEGER LDA,N,ML,MU,IPVT(*)
- COMPLEX ABD(LDA,*),Z(*)
- REAL RCOND
- C
- COMPLEX CDOTC,EK,T,WK,WKM
- REAL ANORM,S,SCASUM,SM,YNORM
- INTEGER IS,INFO,J,JU,K,KB,KP1,L,LA,LM,LZ,M,MM
- COMPLEX ZDUM,ZDUM1,ZDUM2,CSIGN1
- REAL CABS1
- CABS1(ZDUM) = ABS(REAL(ZDUM)) + ABS(AIMAG(ZDUM))
- CSIGN1(ZDUM1,ZDUM2) = CABS1(ZDUM1)*(ZDUM2/CABS1(ZDUM2))
- C
- C COMPUTE 1-NORM OF A
- C
- C***FIRST EXECUTABLE STATEMENT CGBCO
- ANORM = 0.0E0
- L = ML + 1
- IS = L + MU
- DO 10 J = 1, N
- ANORM = MAX(ANORM,SCASUM(L,ABD(IS,J),1))
- IF (IS .GT. ML + 1) IS = IS - 1
- IF (J .LE. MU) L = L + 1
- IF (J .GE. N - ML) L = L - 1
- 10 CONTINUE
- C
- C FACTOR
- C
- CALL CGBFA(ABD,LDA,N,ML,MU,IPVT,INFO)
- C
- C RCOND = 1/(NORM(A)*(ESTIMATE OF NORM(INVERSE(A)))) .
- C ESTIMATE = NORM(Z)/NORM(Y) WHERE A*Z = Y AND CTRANS(A)*Y = E .
- C CTRANS(A) IS THE CONJUGATE TRANSPOSE OF A .
- C THE COMPONENTS OF E ARE CHOSEN TO CAUSE MAXIMUM LOCAL
- C GROWTH IN THE ELEMENTS OF W WHERE CTRANS(U)*W = E .
- C THE VECTORS ARE FREQUENTLY RESCALED TO AVOID OVERFLOW.
- C
- C SOLVE CTRANS(U)*W = E
- C
- EK = (1.0E0,0.0E0)
- DO 20 J = 1, N
- Z(J) = (0.0E0,0.0E0)
- 20 CONTINUE
- M = ML + MU + 1
- JU = 0
- DO 100 K = 1, N
- IF (CABS1(Z(K)) .NE. 0.0E0) EK = CSIGN1(EK,-Z(K))
- IF (CABS1(EK-Z(K)) .LE. CABS1(ABD(M,K))) GO TO 30
- S = CABS1(ABD(M,K))/CABS1(EK-Z(K))
- CALL CSSCAL(N,S,Z,1)
- EK = CMPLX(S,0.0E0)*EK
- 30 CONTINUE
- WK = EK - Z(K)
- WKM = -EK - Z(K)
- S = CABS1(WK)
- SM = CABS1(WKM)
- IF (CABS1(ABD(M,K)) .EQ. 0.0E0) GO TO 40
- WK = WK/CONJG(ABD(M,K))
- WKM = WKM/CONJG(ABD(M,K))
- GO TO 50
- 40 CONTINUE
- WK = (1.0E0,0.0E0)
- WKM = (1.0E0,0.0E0)
- 50 CONTINUE
- KP1 = K + 1
- JU = MIN(MAX(JU,MU+IPVT(K)),N)
- MM = M
- IF (KP1 .GT. JU) GO TO 90
- DO 60 J = KP1, JU
- MM = MM - 1
- SM = SM + CABS1(Z(J)+WKM*CONJG(ABD(MM,J)))
- Z(J) = Z(J) + WK*CONJG(ABD(MM,J))
- S = S + CABS1(Z(J))
- 60 CONTINUE
- IF (S .GE. SM) GO TO 80
- T = WKM - WK
- WK = WKM
- MM = M
- DO 70 J = KP1, JU
- MM = MM - 1
- Z(J) = Z(J) + T*CONJG(ABD(MM,J))
- 70 CONTINUE
- 80 CONTINUE
- 90 CONTINUE
- Z(K) = WK
- 100 CONTINUE
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- C
- C SOLVE CTRANS(L)*Y = W
- C
- DO 120 KB = 1, N
- K = N + 1 - KB
- LM = MIN(ML,N-K)
- IF (K .LT. N) Z(K) = Z(K) + CDOTC(LM,ABD(M+1,K),1,Z(K+1),1)
- IF (CABS1(Z(K)) .LE. 1.0E0) GO TO 110
- S = 1.0E0/CABS1(Z(K))
- CALL CSSCAL(N,S,Z,1)
- 110 CONTINUE
- L = IPVT(K)
- T = Z(L)
- Z(L) = Z(K)
- Z(K) = T
- 120 CONTINUE
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- C
- YNORM = 1.0E0
- C
- C SOLVE L*V = Y
- C
- DO 140 K = 1, N
- L = IPVT(K)
- T = Z(L)
- Z(L) = Z(K)
- Z(K) = T
- LM = MIN(ML,N-K)
- IF (K .LT. N) CALL CAXPY(LM,T,ABD(M+1,K),1,Z(K+1),1)
- IF (CABS1(Z(K)) .LE. 1.0E0) GO TO 130
- S = 1.0E0/CABS1(Z(K))
- CALL CSSCAL(N,S,Z,1)
- YNORM = S*YNORM
- 130 CONTINUE
- 140 CONTINUE
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- YNORM = S*YNORM
- C
- C SOLVE U*Z = W
- C
- DO 160 KB = 1, N
- K = N + 1 - KB
- IF (CABS1(Z(K)) .LE. CABS1(ABD(M,K))) GO TO 150
- S = CABS1(ABD(M,K))/CABS1(Z(K))
- CALL CSSCAL(N,S,Z,1)
- YNORM = S*YNORM
- 150 CONTINUE
- IF (CABS1(ABD(M,K)) .NE. 0.0E0) Z(K) = Z(K)/ABD(M,K)
- IF (CABS1(ABD(M,K)) .EQ. 0.0E0) Z(K) = (1.0E0,0.0E0)
- LM = MIN(K,M) - 1
- LA = M - LM
- LZ = K - LM
- T = -Z(K)
- CALL CAXPY(LM,T,ABD(LA,K),1,Z(LZ),1)
- 160 CONTINUE
- C MAKE ZNORM = 1.0
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- YNORM = S*YNORM
- C
- IF (ANORM .NE. 0.0E0) RCOND = YNORM/ANORM
- IF (ANORM .EQ. 0.0E0) RCOND = 0.0E0
- RETURN
- END
- *DECK CGBDI
- SUBROUTINE CGBDI (ABD, LDA, N, ML, MU, IPVT, DET)
- C***BEGIN PROLOGUE CGBDI
- C***PURPOSE Compute the determinant of a complex band matrix using the
- C factors from CGBCO or CGBFA.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D3C2
- C***TYPE COMPLEX (SGBDI-S, DGBDI-D, CGBDI-C)
- C***KEYWORDS BANDED, DETERMINANT, INVERSE, LINEAR ALGEBRA, LINPACK,
- C MATRIX
- C***AUTHOR Moler, C. B., (U. of New Mexico)
- C***DESCRIPTION
- C
- C CGBDI computes the determinant of a band matrix
- C using the factors computed by CGBCO or CGBFA.
- C If the inverse is needed, use CGBSL N times.
- C
- C On Entry
- C
- C ABD COMPLEX(LDA, N)
- C the output from CGBCO or CGBFA.
- C
- C LDA INTEGER
- C the leading dimension of the array ABD .
- C
- C N INTEGER
- C the order of the original matrix.
- C
- C ML INTEGER
- C number of diagonals below the main diagonal.
- C
- C MU INTEGER
- C number of diagonals above the main diagonal.
- C
- C IPVT INTEGER(N)
- C the pivot vector from CGBCO or CGBFA.
- C
- C On Return
- C
- C DET COMPLEX(2)
- C determinant of original matrix.
- C Determinant = DET(1) * 10.0**DET(2)
- C with 1.0 .LE. CABS1(DET(1)) .LT. 10.0
- C or DET(1) = 0.0 .
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CGBDI
- INTEGER LDA,N,ML,MU,IPVT(*)
- COMPLEX ABD(LDA,*),DET(2)
- C
- REAL TEN
- INTEGER I,M
- COMPLEX ZDUM
- REAL CABS1
- C
- CABS1(ZDUM) = ABS(REAL(ZDUM)) + ABS(AIMAG(ZDUM))
- C***FIRST EXECUTABLE STATEMENT CGBDI
- M = ML + MU + 1
- DET(1) = (1.0E0,0.0E0)
- DET(2) = (0.0E0,0.0E0)
- TEN = 10.0E0
- DO 50 I = 1, N
- IF (IPVT(I) .NE. I) DET(1) = -DET(1)
- DET(1) = ABD(M,I)*DET(1)
- IF (CABS1(DET(1)) .EQ. 0.0E0) GO TO 60
- 10 IF (CABS1(DET(1)) .GE. 1.0E0) GO TO 20
- DET(1) = CMPLX(TEN,0.0E0)*DET(1)
- DET(2) = DET(2) - (1.0E0,0.0E0)
- GO TO 10
- 20 CONTINUE
- 30 IF (CABS1(DET(1)) .LT. TEN) GO TO 40
- DET(1) = DET(1)/CMPLX(TEN,0.0E0)
- DET(2) = DET(2) + (1.0E0,0.0E0)
- GO TO 30
- 40 CONTINUE
- 50 CONTINUE
- 60 CONTINUE
- RETURN
- END
- *DECK CGBFA
- SUBROUTINE CGBFA (ABD, LDA, N, ML, MU, IPVT, INFO)
- C***BEGIN PROLOGUE CGBFA
- C***PURPOSE Factor a band matrix using Gaussian elimination.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D2C2
- C***TYPE COMPLEX (SGBFA-S, DGBFA-D, CGBFA-C)
- C***KEYWORDS BANDED, LINEAR ALGEBRA, LINPACK, MATRIX FACTORIZATION
- C***AUTHOR Moler, C. B., (U. of New Mexico)
- C***DESCRIPTION
- C
- C CGBFA factors a complex band matrix by elimination.
- C
- C CGBFA is usually called by CGBCO, but it can be called
- C directly with a saving in time if RCOND is not needed.
- C
- C On Entry
- C
- C ABD COMPLEX(LDA, N)
- C contains the matrix in band storage. The columns
- C of the matrix are stored in the columns of ABD and
- C the diagonals of the matrix are stored in rows
- C ML+1 through 2*ML+MU+1 of ABD .
- C See the comments below for details.
- C
- C LDA INTEGER
- C the leading dimension of the array ABD .
- C LDA must be .GE. 2*ML + MU + 1 .
- C
- C N INTEGER
- C the order of the original matrix.
- C
- C ML INTEGER
- C number of diagonals below the main diagonal.
- C 0 .LE. ML .LT. N .
- C
- C MU INTEGER
- C number of diagonals above the main diagonal.
- C 0 .LE. MU .LT. N .
- C More efficient if ML .LE. MU .
- C On Return
- C
- C ABD an upper triangular matrix in band storage and
- C the multipliers which were used to obtain it.
- C The factorization can be written A = L*U where
- C L is a product of permutation and unit lower
- C triangular matrices and U is upper triangular.
- C
- C IPVT INTEGER(N)
- C an integer vector of pivot indices.
- C
- C INFO INTEGER
- C = 0 normal value.
- C = K if U(K,K) .EQ. 0.0 . This is not an error
- C condition for this subroutine, but it does
- C indicate that CGBSL will divide by zero if
- C called. Use RCOND in CGBCO for a reliable
- C indication of singularity.
- C
- C Band Storage
- C
- C If A is a band matrix, the following program segment
- C will set up the input.
- C
- C ML = (band width below the diagonal)
- C MU = (band width above the diagonal)
- C M = ML + MU + 1
- C DO 20 J = 1, N
- C I1 = MAX(1, J-MU)
- C I2 = MIN(N, J+ML)
- C DO 10 I = I1, I2
- C K = I - J + M
- C ABD(K,J) = A(I,J)
- C 10 CONTINUE
- C 20 CONTINUE
- C
- C This uses rows ML+1 through 2*ML+MU+1 of ABD .
- C In addition, the first ML rows in ABD are used for
- C elements generated during the triangularization.
- C The total number of rows needed in ABD is 2*ML+MU+1 .
- C The ML+MU by ML+MU upper left triangle and the
- C ML by ML lower right triangle are not referenced.
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CAXPY, CSCAL, ICAMAX
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CGBFA
- INTEGER LDA,N,ML,MU,IPVT(*),INFO
- COMPLEX ABD(LDA,*)
- C
- COMPLEX T
- INTEGER I,ICAMAX,I0,J,JU,JZ,J0,J1,K,KP1,L,LM,M,MM,NM1
- COMPLEX ZDUM
- REAL CABS1
- CABS1(ZDUM) = ABS(REAL(ZDUM)) + ABS(AIMAG(ZDUM))
- C
- C***FIRST EXECUTABLE STATEMENT CGBFA
- M = ML + MU + 1
- INFO = 0
- C
- C ZERO INITIAL FILL-IN COLUMNS
- C
- J0 = MU + 2
- J1 = MIN(N,M) - 1
- IF (J1 .LT. J0) GO TO 30
- DO 20 JZ = J0, J1
- I0 = M + 1 - JZ
- DO 10 I = I0, ML
- ABD(I,JZ) = (0.0E0,0.0E0)
- 10 CONTINUE
- 20 CONTINUE
- 30 CONTINUE
- JZ = J1
- JU = 0
- C
- C GAUSSIAN ELIMINATION WITH PARTIAL PIVOTING
- C
- NM1 = N - 1
- IF (NM1 .LT. 1) GO TO 130
- DO 120 K = 1, NM1
- KP1 = K + 1
- C
- C ZERO NEXT FILL-IN COLUMN
- C
- JZ = JZ + 1
- IF (JZ .GT. N) GO TO 50
- IF (ML .LT. 1) GO TO 50
- DO 40 I = 1, ML
- ABD(I,JZ) = (0.0E0,0.0E0)
- 40 CONTINUE
- 50 CONTINUE
- C
- C FIND L = PIVOT INDEX
- C
- LM = MIN(ML,N-K)
- L = ICAMAX(LM+1,ABD(M,K),1) + M - 1
- IPVT(K) = L + K - M
- C
- C ZERO PIVOT IMPLIES THIS COLUMN ALREADY TRIANGULARIZED
- C
- IF (CABS1(ABD(L,K)) .EQ. 0.0E0) GO TO 100
- C
- C INTERCHANGE IF NECESSARY
- C
- IF (L .EQ. M) GO TO 60
- T = ABD(L,K)
- ABD(L,K) = ABD(M,K)
- ABD(M,K) = T
- 60 CONTINUE
- C
- C COMPUTE MULTIPLIERS
- C
- T = -(1.0E0,0.0E0)/ABD(M,K)
- CALL CSCAL(LM,T,ABD(M+1,K),1)
- C
- C ROW ELIMINATION WITH COLUMN INDEXING
- C
- JU = MIN(MAX(JU,MU+IPVT(K)),N)
- MM = M
- IF (JU .LT. KP1) GO TO 90
- DO 80 J = KP1, JU
- L = L - 1
- MM = MM - 1
- T = ABD(L,J)
- IF (L .EQ. MM) GO TO 70
- ABD(L,J) = ABD(MM,J)
- ABD(MM,J) = T
- 70 CONTINUE
- CALL CAXPY(LM,T,ABD(M+1,K),1,ABD(MM+1,J),1)
- 80 CONTINUE
- 90 CONTINUE
- GO TO 110
- 100 CONTINUE
- INFO = K
- 110 CONTINUE
- 120 CONTINUE
- 130 CONTINUE
- IPVT(N) = N
- IF (CABS1(ABD(M,N)) .EQ. 0.0E0) INFO = N
- RETURN
- END
- *DECK CGBSL
- SUBROUTINE CGBSL (ABD, LDA, N, ML, MU, IPVT, B, JOB)
- C***BEGIN PROLOGUE CGBSL
- C***PURPOSE Solve the complex band system A*X=B or CTRANS(A)*X=B using
- C the factors computed by CGBCO or CGBFA.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D2C2
- C***TYPE COMPLEX (SGBSL-S, DGBSL-D, CGBSL-C)
- C***KEYWORDS BANDED, LINEAR ALGEBRA, LINPACK, MATRIX, SOLVE
- C***AUTHOR Moler, C. B., (U. of New Mexico)
- C***DESCRIPTION
- C
- C CGBSL solves the complex band system
- C A * X = B or CTRANS(A) * X = B
- C using the factors computed by CGBCO or CGBFA.
- C
- C On Entry
- C
- C ABD COMPLEX(LDA, N)
- C the output from CGBCO or CGBFA.
- C
- C LDA INTEGER
- C the leading dimension of the array ABD .
- C
- C N INTEGER
- C the order of the original matrix.
- C
- C ML INTEGER
- C number of diagonals below the main diagonal.
- C
- C MU INTEGER
- C number of diagonals above the main diagonal.
- C
- C IPVT INTEGER(N)
- C the pivot vector from CGBCO or CGBFA.
- C
- C B COMPLEX(N)
- C the right hand side vector.
- C
- C JOB INTEGER
- C = 0 to solve A*X = B ,
- C = nonzero to solve CTRANS(A)*X = B , where
- C CTRANS(A) is the conjugate transpose.
- C
- C On Return
- C
- C B the solution vector X .
- C
- C Error Condition
- C
- C A division by zero will occur if the input factor contains a
- C zero on the diagonal. Technically this indicates singularity
- C but it is often caused by improper arguments or improper
- C setting of LDA . It will not occur if the subroutines are
- C called correctly and if CGBCO has set RCOND .GT. 0.0
- C or CGBFA has set INFO .EQ. 0 .
- C
- C To compute INVERSE(A) * C where C is a matrix
- C with P columns
- C CALL CGBCO(ABD,LDA,N,ML,MU,IPVT,RCOND,Z)
- C IF (RCOND is too small) GO TO ...
- C DO 10 J = 1, P
- C CALL CGBSL(ABD,LDA,N,ML,MU,IPVT,C(1,J),0)
- C 10 CONTINUE
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CAXPY, CDOTC
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CGBSL
- INTEGER LDA,N,ML,MU,IPVT(*),JOB
- COMPLEX ABD(LDA,*),B(*)
- C
- COMPLEX CDOTC,T
- INTEGER K,KB,L,LA,LB,LM,M,NM1
- C***FIRST EXECUTABLE STATEMENT CGBSL
- M = MU + ML + 1
- NM1 = N - 1
- IF (JOB .NE. 0) GO TO 50
- C
- C JOB = 0 , SOLVE A * X = B
- C FIRST SOLVE L*Y = B
- C
- IF (ML .EQ. 0) GO TO 30
- IF (NM1 .LT. 1) GO TO 30
- DO 20 K = 1, NM1
- LM = MIN(ML,N-K)
- L = IPVT(K)
- T = B(L)
- IF (L .EQ. K) GO TO 10
- B(L) = B(K)
- B(K) = T
- 10 CONTINUE
- CALL CAXPY(LM,T,ABD(M+1,K),1,B(K+1),1)
- 20 CONTINUE
- 30 CONTINUE
- C
- C NOW SOLVE U*X = Y
- C
- DO 40 KB = 1, N
- K = N + 1 - KB
- B(K) = B(K)/ABD(M,K)
- LM = MIN(K,M) - 1
- LA = M - LM
- LB = K - LM
- T = -B(K)
- CALL CAXPY(LM,T,ABD(LA,K),1,B(LB),1)
- 40 CONTINUE
- GO TO 100
- 50 CONTINUE
- C
- C JOB = NONZERO, SOLVE CTRANS(A) * X = B
- C FIRST SOLVE CTRANS(U)*Y = B
- C
- DO 60 K = 1, N
- LM = MIN(K,M) - 1
- LA = M - LM
- LB = K - LM
- T = CDOTC(LM,ABD(LA,K),1,B(LB),1)
- B(K) = (B(K) - T)/CONJG(ABD(M,K))
- 60 CONTINUE
- C
- C NOW SOLVE CTRANS(L)*X = Y
- C
- IF (ML .EQ. 0) GO TO 90
- IF (NM1 .LT. 1) GO TO 90
- DO 80 KB = 1, NM1
- K = N - KB
- LM = MIN(ML,N-K)
- B(K) = B(K) + CDOTC(LM,ABD(M+1,K),1,B(K+1),1)
- L = IPVT(K)
- IF (L .EQ. K) GO TO 70
- T = B(L)
- B(L) = B(K)
- B(K) = T
- 70 CONTINUE
- 80 CONTINUE
- 90 CONTINUE
- 100 CONTINUE
- RETURN
- END
- *DECK CGECO
- SUBROUTINE CGECO (A, LDA, N, IPVT, RCOND, Z)
- C***BEGIN PROLOGUE CGECO
- C***PURPOSE Factor a matrix using Gaussian elimination and estimate
- C the condition number of the matrix.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D2C1
- C***TYPE COMPLEX (SGECO-S, DGECO-D, CGECO-C)
- C***KEYWORDS CONDITION NUMBER, GENERAL MATRIX, LINEAR ALGEBRA, LINPACK,
- C MATRIX FACTORIZATION
- C***AUTHOR Moler, C. B., (U. of New Mexico)
- C***DESCRIPTION
- C
- C CGECO factors a complex matrix by Gaussian elimination
- C and estimates the condition of the matrix.
- C
- C If RCOND is not needed, CGEFA is slightly faster.
- C To solve A*X = B , follow CGECO By CGESL.
- C To Compute INVERSE(A)*C , follow CGECO by CGESL.
- C To compute DETERMINANT(A) , follow CGECO by CGEDI.
- C To compute INVERSE(A) , follow CGECO by CGEDI.
- C
- C On Entry
- C
- C A COMPLEX(LDA, N)
- C the matrix to be factored.
- C
- C LDA INTEGER
- C the leading dimension of the array A .
- C
- C N INTEGER
- C the order of the matrix A .
- C
- C On Return
- C
- C A an upper triangular matrix and the multipliers
- C which were used to obtain it.
- C The factorization can be written A = L*U where
- C L is a product of permutation and unit lower
- C triangular matrices and U is upper triangular.
- C
- C IPVT INTEGER(N)
- C an integer vector of pivot indices.
- C
- C RCOND REAL
- C an estimate of the reciprocal condition of A .
- C For the system A*X = B , relative perturbations
- C in A and B of size EPSILON may cause
- C relative perturbations in X of size EPSILON/RCOND .
- C If RCOND is so small that the logical expression
- C 1.0 + RCOND .EQ. 1.0
- C is true, then A may be singular to working
- C precision. In particular, RCOND is zero if
- C exact singularity is detected or the estimate
- C underflows.
- C
- C Z COMPLEX(N)
- C a work vector whose contents are usually unimportant.
- C If A is close to a singular matrix, then Z is
- C an approximate null vector in the sense that
- C NORM(A*Z) = RCOND*NORM(A)*NORM(Z) .
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CAXPY, CDOTC, CGEFA, CSSCAL, SCASUM
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CGECO
- INTEGER LDA,N,IPVT(*)
- COMPLEX A(LDA,*),Z(*)
- REAL RCOND
- C
- COMPLEX CDOTC,EK,T,WK,WKM
- REAL ANORM,S,SCASUM,SM,YNORM
- INTEGER INFO,J,K,KB,KP1,L
- COMPLEX ZDUM,ZDUM1,ZDUM2,CSIGN1
- REAL CABS1
- CABS1(ZDUM) = ABS(REAL(ZDUM)) + ABS(AIMAG(ZDUM))
- CSIGN1(ZDUM1,ZDUM2) = CABS1(ZDUM1)*(ZDUM2/CABS1(ZDUM2))
- C
- C COMPUTE 1-NORM OF A
- C
- C***FIRST EXECUTABLE STATEMENT CGECO
- ANORM = 0.0E0
- DO 10 J = 1, N
- ANORM = MAX(ANORM,SCASUM(N,A(1,J),1))
- 10 CONTINUE
- C
- C FACTOR
- C
- CALL CGEFA(A,LDA,N,IPVT,INFO)
- C
- C RCOND = 1/(NORM(A)*(ESTIMATE OF NORM(INVERSE(A)))) .
- C ESTIMATE = NORM(Z)/NORM(Y) WHERE A*Z = Y AND CTRANS(A)*Y = E .
- C CTRANS(A) IS THE CONJUGATE TRANSPOSE OF A .
- C THE COMPONENTS OF E ARE CHOSEN TO CAUSE MAXIMUM LOCAL
- C GROWTH IN THE ELEMENTS OF W WHERE CTRANS(U)*W = E .
- C THE VECTORS ARE FREQUENTLY RESCALED TO AVOID OVERFLOW.
- C
- C SOLVE CTRANS(U)*W = E
- C
- EK = (1.0E0,0.0E0)
- DO 20 J = 1, N
- Z(J) = (0.0E0,0.0E0)
- 20 CONTINUE
- DO 100 K = 1, N
- IF (CABS1(Z(K)) .NE. 0.0E0) EK = CSIGN1(EK,-Z(K))
- IF (CABS1(EK-Z(K)) .LE. CABS1(A(K,K))) GO TO 30
- S = CABS1(A(K,K))/CABS1(EK-Z(K))
- CALL CSSCAL(N,S,Z,1)
- EK = CMPLX(S,0.0E0)*EK
- 30 CONTINUE
- WK = EK - Z(K)
- WKM = -EK - Z(K)
- S = CABS1(WK)
- SM = CABS1(WKM)
- IF (CABS1(A(K,K)) .EQ. 0.0E0) GO TO 40
- WK = WK/CONJG(A(K,K))
- WKM = WKM/CONJG(A(K,K))
- GO TO 50
- 40 CONTINUE
- WK = (1.0E0,0.0E0)
- WKM = (1.0E0,0.0E0)
- 50 CONTINUE
- KP1 = K + 1
- IF (KP1 .GT. N) GO TO 90
- DO 60 J = KP1, N
- SM = SM + CABS1(Z(J)+WKM*CONJG(A(K,J)))
- Z(J) = Z(J) + WK*CONJG(A(K,J))
- S = S + CABS1(Z(J))
- 60 CONTINUE
- IF (S .GE. SM) GO TO 80
- T = WKM - WK
- WK = WKM
- DO 70 J = KP1, N
- Z(J) = Z(J) + T*CONJG(A(K,J))
- 70 CONTINUE
- 80 CONTINUE
- 90 CONTINUE
- Z(K) = WK
- 100 CONTINUE
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- C
- C SOLVE CTRANS(L)*Y = W
- C
- DO 120 KB = 1, N
- K = N + 1 - KB
- IF (K .LT. N) Z(K) = Z(K) + CDOTC(N-K,A(K+1,K),1,Z(K+1),1)
- IF (CABS1(Z(K)) .LE. 1.0E0) GO TO 110
- S = 1.0E0/CABS1(Z(K))
- CALL CSSCAL(N,S,Z,1)
- 110 CONTINUE
- L = IPVT(K)
- T = Z(L)
- Z(L) = Z(K)
- Z(K) = T
- 120 CONTINUE
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- C
- YNORM = 1.0E0
- C
- C SOLVE L*V = Y
- C
- DO 140 K = 1, N
- L = IPVT(K)
- T = Z(L)
- Z(L) = Z(K)
- Z(K) = T
- IF (K .LT. N) CALL CAXPY(N-K,T,A(K+1,K),1,Z(K+1),1)
- IF (CABS1(Z(K)) .LE. 1.0E0) GO TO 130
- S = 1.0E0/CABS1(Z(K))
- CALL CSSCAL(N,S,Z,1)
- YNORM = S*YNORM
- 130 CONTINUE
- 140 CONTINUE
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- YNORM = S*YNORM
- C
- C SOLVE U*Z = V
- C
- DO 160 KB = 1, N
- K = N + 1 - KB
- IF (CABS1(Z(K)) .LE. CABS1(A(K,K))) GO TO 150
- S = CABS1(A(K,K))/CABS1(Z(K))
- CALL CSSCAL(N,S,Z,1)
- YNORM = S*YNORM
- 150 CONTINUE
- IF (CABS1(A(K,K)) .NE. 0.0E0) Z(K) = Z(K)/A(K,K)
- IF (CABS1(A(K,K)) .EQ. 0.0E0) Z(K) = (1.0E0,0.0E0)
- T = -Z(K)
- CALL CAXPY(K-1,T,A(1,K),1,Z(1),1)
- 160 CONTINUE
- C MAKE ZNORM = 1.0
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- YNORM = S*YNORM
- C
- IF (ANORM .NE. 0.0E0) RCOND = YNORM/ANORM
- IF (ANORM .EQ. 0.0E0) RCOND = 0.0E0
- RETURN
- END
- *DECK CGEDI
- SUBROUTINE CGEDI (A, LDA, N, IPVT, DET, WORK, JOB)
- C***BEGIN PROLOGUE CGEDI
- C***PURPOSE Compute the determinant and inverse of a matrix using the
- C factors computed by CGECO or CGEFA.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D2C1, D3C1
- C***TYPE COMPLEX (SGEDI-S, DGEDI-D, CGEDI-C)
- C***KEYWORDS DETERMINANT, INVERSE, LINEAR ALGEBRA, LINPACK, MATRIX
- C***AUTHOR Moler, C. B., (U. of New Mexico)
- C***DESCRIPTION
- C
- C CGEDI computes the determinant and inverse of a matrix
- C using the factors computed by CGECO or CGEFA.
- C
- C On Entry
- C
- C A COMPLEX(LDA, N)
- C the output from CGECO or CGEFA.
- C
- C LDA INTEGER
- C the leading dimension of the array A .
- C
- C N INTEGER
- C the order of the matrix A .
- C
- C IPVT INTEGER(N)
- C the pivot vector from CGECO or CGEFA.
- C
- C WORK COMPLEX(N)
- C work vector. Contents destroyed.
- C
- C JOB INTEGER
- C = 11 both determinant and inverse.
- C = 01 inverse only.
- C = 10 determinant only.
- C
- C On Return
- C
- C A inverse of original matrix if requested.
- C Otherwise unchanged.
- C
- C DET COMPLEX(2)
- C determinant of original matrix if requested.
- C Otherwise not referenced.
- C Determinant = DET(1) * 10.0**DET(2)
- C with 1.0 .LE. CABS1(DET(1)) .LT. 10.0
- C or DET(1) .EQ. 0.0 .
- C
- C Error Condition
- C
- C A division by zero will occur if the input factor contains
- C a zero on the diagonal and the inverse is requested.
- C It will not occur if the subroutines are called correctly
- C and if CGECO has set RCOND .GT. 0.0 or CGEFA has set
- C INFO .EQ. 0 .
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CAXPY, CSCAL, CSWAP
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CGEDI
- INTEGER LDA,N,IPVT(*),JOB
- COMPLEX A(LDA,*),DET(2),WORK(*)
- C
- COMPLEX T
- REAL TEN
- INTEGER I,J,K,KB,KP1,L,NM1
- COMPLEX ZDUM
- REAL CABS1
- CABS1(ZDUM) = ABS(REAL(ZDUM)) + ABS(AIMAG(ZDUM))
- C***FIRST EXECUTABLE STATEMENT CGEDI
- C
- C COMPUTE DETERMINANT
- C
- IF (JOB/10 .EQ. 0) GO TO 70
- DET(1) = (1.0E0,0.0E0)
- DET(2) = (0.0E0,0.0E0)
- TEN = 10.0E0
- DO 50 I = 1, N
- IF (IPVT(I) .NE. I) DET(1) = -DET(1)
- DET(1) = A(I,I)*DET(1)
- IF (CABS1(DET(1)) .EQ. 0.0E0) GO TO 60
- 10 IF (CABS1(DET(1)) .GE. 1.0E0) GO TO 20
- DET(1) = CMPLX(TEN,0.0E0)*DET(1)
- DET(2) = DET(2) - (1.0E0,0.0E0)
- GO TO 10
- 20 CONTINUE
- 30 IF (CABS1(DET(1)) .LT. TEN) GO TO 40
- DET(1) = DET(1)/CMPLX(TEN,0.0E0)
- DET(2) = DET(2) + (1.0E0,0.0E0)
- GO TO 30
- 40 CONTINUE
- 50 CONTINUE
- 60 CONTINUE
- 70 CONTINUE
- C
- C COMPUTE INVERSE(U)
- C
- IF (MOD(JOB,10) .EQ. 0) GO TO 150
- DO 100 K = 1, N
- A(K,K) = (1.0E0,0.0E0)/A(K,K)
- T = -A(K,K)
- CALL CSCAL(K-1,T,A(1,K),1)
- KP1 = K + 1
- IF (N .LT. KP1) GO TO 90
- DO 80 J = KP1, N
- T = A(K,J)
- A(K,J) = (0.0E0,0.0E0)
- CALL CAXPY(K,T,A(1,K),1,A(1,J),1)
- 80 CONTINUE
- 90 CONTINUE
- 100 CONTINUE
- C
- C FORM INVERSE(U)*INVERSE(L)
- C
- NM1 = N - 1
- IF (NM1 .LT. 1) GO TO 140
- DO 130 KB = 1, NM1
- K = N - KB
- KP1 = K + 1
- DO 110 I = KP1, N
- WORK(I) = A(I,K)
- A(I,K) = (0.0E0,0.0E0)
- 110 CONTINUE
- DO 120 J = KP1, N
- T = WORK(J)
- CALL CAXPY(N,T,A(1,J),1,A(1,K),1)
- 120 CONTINUE
- L = IPVT(K)
- IF (L .NE. K) CALL CSWAP(N,A(1,K),1,A(1,L),1)
- 130 CONTINUE
- 140 CONTINUE
- 150 CONTINUE
- RETURN
- END
- *DECK CGEEV
- SUBROUTINE CGEEV (A, LDA, N, E, V, LDV, WORK, JOB, INFO)
- C***BEGIN PROLOGUE CGEEV
- C***PURPOSE Compute the eigenvalues and, optionally, the eigenvectors
- C of a complex general matrix.
- C***LIBRARY SLATEC
- C***CATEGORY D4A4
- C***TYPE COMPLEX (SGEEV-S, CGEEV-C)
- C***KEYWORDS EIGENVALUES, EIGENVECTORS, GENERAL MATRIX
- C***AUTHOR Kahaner, D. K., (NBS)
- C Moler, C. B., (U. of New Mexico)
- C Stewart, G. W., (U. of Maryland)
- C***DESCRIPTION
- C
- C Abstract
- C CGEEV computes the eigenvalues and, optionally,
- C the eigenvectors of a general complex matrix.
- C
- C Call Sequence Parameters-
- C (The values of parameters marked with * (star) will be changed
- C by CGEEV.)
- C
- C A* COMPLEX(LDA,N)
- C complex nonsymmetric input matrix.
- C
- C LDA INTEGER
- C set by the user to
- C the leading dimension of the complex array A.
- C
- C N INTEGER
- C set by the user to
- C the order of the matrices A and V, and
- C the number of elements in E.
- C
- C E* COMPLEX(N)
- C on return from CGEEV E contains the eigenvalues of A.
- C See also INFO below.
- C
- C V* COMPLEX(LDV,N)
- C on return from CGEEV if the user has set JOB
- C = 0 V is not referenced.
- C = nonzero the N eigenvectors of A are stored in the
- C first N columns of V. See also INFO below.
- C (If the input matrix A is nearly degenerate, V
- C will be badly conditioned, i.e. have nearly
- C dependent columns.)
- C
- C LDV INTEGER
- C set by the user to
- C the leading dimension of the array V if JOB is also
- C set nonzero. In that case N must be .LE. LDV.
- C If JOB is set to zero LDV is not referenced.
- C
- C WORK* REAL(3N)
- C temporary storage vector. Contents changed by CGEEV.
- C
- C JOB INTEGER
- C set by the user to
- C = 0 eigenvalues only to be calculated by CGEEV.
- C neither V nor LDV are referenced.
- C = nonzero eigenvalues and vectors to be calculated.
- C In this case A & V must be distinct arrays.
- C Also, if LDA > LDV, CGEEV changes all the
- C elements of A thru column N. If LDA < LDV,
- C CGEEV changes all the elements of V through
- C column N. If LDA = LDV only A(I,J) and V(I,
- C J) for I,J = 1,...,N are changed by CGEEV.
- C
- C INFO* INTEGER
- C on return from CGEEV the value of INFO is
- C = 0 normal return, calculation successful.
- C = K if the eigenvalue iteration fails to converge,
- C eigenvalues K+1 through N are correct, but
- C no eigenvectors were computed even if they were
- C requested (JOB nonzero).
- C
- C Error Messages
- C No. 1 recoverable N is greater than LDA
- C No. 2 recoverable N is less than one.
- C No. 3 recoverable JOB is nonzero and N is greater than LDV
- C No. 4 warning LDA > LDV, elements of A other than the
- C N by N input elements have been changed
- C No. 5 warning LDA < LDV, elements of V other than the
- C N by N output elements have been changed
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED CBABK2, CBAL, COMQR, COMQR2, CORTH, SCOPY, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 800808 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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***END PROLOGUE CGEEV
- INTEGER I,IHI,ILO,INFO,J,K,L,LDA,LDV,MDIM,N
- REAL A(*),E(*),WORK(*),V(*)
- C***FIRST EXECUTABLE STATEMENT CGEEV
- IF (N .GT. LDA) CALL XERMSG ('SLATEC', 'CGEEV', 'N .GT. LDA.', 1,
- + 1)
- IF(N .GT. LDA) RETURN
- IF (N .LT. 1) CALL XERMSG ('SLATEC', 'CGEEV', 'N .LT. 1', 2, 1)
- IF(N .LT. 1) RETURN
- IF(N .EQ. 1 .AND. JOB .EQ. 0) GO TO 35
- MDIM = 2 * LDA
- IF(JOB .EQ. 0) GO TO 5
- IF (N .GT. LDV) CALL XERMSG ('SLATEC', 'CGEEV',
- + 'JOB .NE. 0 AND N .GT. LDV.', 3, 1)
- IF(N .GT. LDV) RETURN
- IF(N .EQ. 1) GO TO 35
- C
- C REARRANGE A IF NECESSARY WHEN LDA.GT.LDV AND JOB .NE.0
- C
- MDIM = MIN(MDIM,2 * LDV)
- IF (LDA .LT. LDV) CALL XERMSG ('SLATEC', 'CGEEV',
- + 'LDA.LT.LDV, ELEMENTS OF V OTHER THAN THE N BY N OUTPUT ' //
- + 'ELEMENTS HAVE BEEN CHANGED.', 5, 0)
- IF(LDA.LE.LDV) GO TO 5
- CALL XERMSG ('SLATEC', 'CGEEV',
- + 'LDA.GT.LDV, ELEMENTS OF A OTHER THAN THE N BY N INPUT ' //
- + 'ELEMENTS HAVE BEEN CHANGED.', 4, 0)
- L = N - 1
- DO 4 J=1,L
- I = 2 * N
- M = 1+J*2*LDV
- K = 1+J*2*LDA
- CALL SCOPY(I,A(K),1,A(M),1)
- 4 CONTINUE
- 5 CONTINUE
- C
- C SEPARATE REAL AND IMAGINARY PARTS
- C
- DO 6 J = 1, N
- K = (J-1) * MDIM +1
- L = K + N
- CALL SCOPY(N,A(K+1),2,WORK(1),1)
- CALL SCOPY(N,A(K),2,A(K),1)
- CALL SCOPY(N,WORK(1),1,A(L),1)
- 6 CONTINUE
- C
- C SCALE AND ORTHOGONAL REDUCTION TO HESSENBERG.
- C
- CALL CBAL(MDIM,N,A(1),A(N+1),ILO,IHI,WORK(1))
- CALL CORTH(MDIM,N,ILO,IHI,A(1),A(N+1),WORK(N+1),WORK(2*N+1))
- IF(JOB .NE. 0) GO TO 10
- C
- C EIGENVALUES ONLY
- C
- CALL COMQR(MDIM,N,ILO,IHI,A(1),A(N+1),E(1),E(N+1),INFO)
- GO TO 30
- C
- C EIGENVALUES AND EIGENVECTORS.
- C
- 10 CALL COMQR2(MDIM,N,ILO,IHI,WORK(N+1),WORK(2*N+1),A(1),A(N+1),
- 1 E(1),E(N+1),V(1),V(N+1),INFO)
- IF (INFO .NE. 0) GO TO 30
- CALL CBABK2(MDIM,N,ILO,IHI,WORK(1),N,V(1),V(N+1))
- C
- C CONVERT EIGENVECTORS TO COMPLEX STORAGE.
- C
- DO 20 J = 1,N
- K = (J-1) * MDIM + 1
- I = (J-1) * 2 * LDV + 1
- L = K + N
- CALL SCOPY(N,V(K),1,WORK(1),1)
- CALL SCOPY(N,V(L),1,V(I+1),2)
- CALL SCOPY(N,WORK(1),1,V(I),2)
- 20 CONTINUE
- C
- C CONVERT EIGENVALUES TO COMPLEX STORAGE.
- C
- 30 CALL SCOPY(N,E(1),1,WORK(1),1)
- CALL SCOPY(N,E(N+1),1,E(2),2)
- CALL SCOPY(N,WORK(1),1,E(1),2)
- RETURN
- C
- C TAKE CARE OF N=1 CASE
- C
- 35 E(1) = A(1)
- E(2) = A(2)
- INFO = 0
- IF(JOB .EQ. 0) RETURN
- V(1) = A(1)
- V(2) = A(2)
- RETURN
- END
- *DECK CGEFA
- SUBROUTINE CGEFA (A, LDA, N, IPVT, INFO)
- C***BEGIN PROLOGUE CGEFA
- C***PURPOSE Factor a matrix using Gaussian elimination.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D2C1
- C***TYPE COMPLEX (SGEFA-S, DGEFA-D, CGEFA-C)
- C***KEYWORDS GENERAL MATRIX, LINEAR ALGEBRA, LINPACK,
- C MATRIX FACTORIZATION
- C***AUTHOR Moler, C. B., (U. of New Mexico)
- C***DESCRIPTION
- C
- C CGEFA factors a complex matrix by Gaussian elimination.
- C
- C CGEFA is usually called by CGECO, but it can be called
- C directly with a saving in time if RCOND is not needed.
- C (Time for CGECO) = (1 + 9/N)*(Time for CGEFA) .
- C
- C On Entry
- C
- C A COMPLEX(LDA, N)
- C the matrix to be factored.
- C
- C LDA INTEGER
- C the leading dimension of the array A .
- C
- C N INTEGER
- C the order of the matrix A .
- C
- C On Return
- C
- C A an upper triangular matrix and the multipliers
- C which were used to obtain it.
- C The factorization can be written A = L*U where
- C L is a product of permutation and unit lower
- C triangular matrices and U is upper triangular.
- C
- C IPVT INTEGER(N)
- C an integer vector of pivot indices.
- C
- C INFO INTEGER
- C = 0 normal value.
- C = K if U(K,K) .EQ. 0.0 . This is not an error
- C condition for this subroutine, but it does
- C indicate that CGESL or CGEDI will divide by zero
- C if called. Use RCOND in CGECO for a reliable
- C indication of singularity.
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CAXPY, CSCAL, ICAMAX
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CGEFA
- INTEGER LDA,N,IPVT(*),INFO
- COMPLEX A(LDA,*)
- C
- COMPLEX T
- INTEGER ICAMAX,J,K,KP1,L,NM1
- COMPLEX ZDUM
- REAL CABS1
- CABS1(ZDUM) = ABS(REAL(ZDUM)) + ABS(AIMAG(ZDUM))
- C
- C GAUSSIAN ELIMINATION WITH PARTIAL PIVOTING
- C
- C***FIRST EXECUTABLE STATEMENT CGEFA
- INFO = 0
- NM1 = N - 1
- IF (NM1 .LT. 1) GO TO 70
- DO 60 K = 1, NM1
- KP1 = K + 1
- C
- C FIND L = PIVOT INDEX
- C
- L = ICAMAX(N-K+1,A(K,K),1) + K - 1
- IPVT(K) = L
- C
- C ZERO PIVOT IMPLIES THIS COLUMN ALREADY TRIANGULARIZED
- C
- IF (CABS1(A(L,K)) .EQ. 0.0E0) GO TO 40
- C
- C INTERCHANGE IF NECESSARY
- C
- IF (L .EQ. K) GO TO 10
- T = A(L,K)
- A(L,K) = A(K,K)
- A(K,K) = T
- 10 CONTINUE
- C
- C COMPUTE MULTIPLIERS
- C
- T = -(1.0E0,0.0E0)/A(K,K)
- CALL CSCAL(N-K,T,A(K+1,K),1)
- C
- C ROW ELIMINATION WITH COLUMN INDEXING
- C
- DO 30 J = KP1, N
- T = A(L,J)
- IF (L .EQ. K) GO TO 20
- A(L,J) = A(K,J)
- A(K,J) = T
- 20 CONTINUE
- CALL CAXPY(N-K,T,A(K+1,K),1,A(K+1,J),1)
- 30 CONTINUE
- GO TO 50
- 40 CONTINUE
- INFO = K
- 50 CONTINUE
- 60 CONTINUE
- 70 CONTINUE
- IPVT(N) = N
- IF (CABS1(A(N,N)) .EQ. 0.0E0) INFO = N
- RETURN
- END
- *DECK CGEFS
- SUBROUTINE CGEFS (A, LDA, N, V, ITASK, IND, WORK, IWORK)
- C***BEGIN PROLOGUE CGEFS
- C***PURPOSE Solve a general system of linear equations.
- C***LIBRARY SLATEC
- C***CATEGORY D2C1
- C***TYPE COMPLEX (SGEFS-S, DGEFS-D, CGEFS-C)
- C***KEYWORDS COMPLEX LINEAR EQUATIONS, GENERAL MATRIX,
- C GENERAL SYSTEM OF LINEAR EQUATIONS
- C***AUTHOR Voorhees, E. A., (LANL)
- C***DESCRIPTION
- C
- C Subroutine CGEFS solves A general NxN system of complex
- C linear equations using LINPACK subroutines CGECO
- C and CGESL. That is, if A is an NxN complex matrix
- C and if X and B are complex N-vectors, then CGEFS
- C solves the equation
- C
- C A*X=B.
- C
- C The matrix A is first factored into upper and lower tri-
- C angular matrices U and L using partial pivoting. These
- C factors and the pivoting information are used to find the
- C solution vector X. An approximate condition number is
- C calculated to provide a rough estimate of the number of
- C digits of accuracy in the computed solution.
- C
- C If the equation A*X=B is to be solved for more than one vector
- C B, the factoring of A does not need to be performed again and
- C the option to only solve (ITASK .GT. 1) will be faster for
- C the succeeding solutions. In this case, the contents of A,
- C LDA, N and IWORK must not have been altered by the user follow-
- C ing factorization (ITASK=1). IND will not be changed by CGEFS
- C in this case.
- C
- C Argument Description ***
- C
- C A COMPLEX(LDA,N)
- C on entry, the doubly subscripted array with dimension
- C (LDA,N) which contains the coefficient matrix.
- C on return, an upper triangular matrix U and the
- C multipliers necessary to construct a matrix L
- C so that A=L*U.
- C LDA INTEGER
- C the leading dimension of the array A. LDA must be great-
- C er than or equal to N. (Terminal error message IND=-1)
- C N INTEGER
- C the order of the matrix A. The first N elements of
- C the array A are the elements of the first column of
- C the matrix A. N must be greater than or equal to 1.
- C (Terminal error message IND=-2)
- C V COMPLEX(N)
- C on entry, the singly subscripted array(vector) of di-
- C mension N which contains the right hand side B of a
- C system of simultaneous linear equations A*X=B.
- C on return, V contains the solution vector, X .
- C ITASK INTEGER
- C if ITASK=1, the matrix A is factored and then the
- C linear equation is solved.
- C if ITASK .GT. 1, the equation is solved using the existing
- C factored matrix A and IWORK.
- C if ITASK .LT. 1, then terminal error message IND=-3 is
- C printed.
- C IND INTEGER
- C GT.0 IND is a rough estimate of the number of digits
- C of accuracy in the solution, X.
- C LT.0 see error message corresponding to IND below.
- C WORK COMPLEX(N)
- C a singly subscripted array of dimension at least N.
- C IWORK INTEGER(N)
- C a singly subscripted array of dimension at least N.
- C
- C Error Messages Printed ***
- C
- C IND=-1 terminal N is greater than LDA.
- C IND=-2 terminal N is less than 1.
- C IND=-3 terminal ITASK is less than 1.
- C IND=-4 terminal The matrix A is computationally singular.
- C A solution has not been computed.
- C IND=-10 warning The solution has no apparent significance.
- C The solution may be inaccurate or the matrix
- C A may be poorly scaled.
- C
- C NOTE- The above terminal(*fatal*) error messages are
- C designed to be handled by XERMSG in which
- C LEVEL=1 (recoverable) and IFLAG=2 . LEVEL=0
- C for warning error messages from XERMSG. Unless
- C the user provides otherwise, an error message
- C will be printed followed by an abort.
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CGECO, CGESL, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 800328 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 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 900510 Convert XERRWV calls to XERMSG calls, cvt GOTO's to
- C IF-THEN-ELSE. (RWC)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CGEFS
- C
- INTEGER LDA,N,ITASK,IND,IWORK(*)
- COMPLEX A(LDA,*),V(*),WORK(*)
- REAL R1MACH
- REAL RCOND
- CHARACTER*8 XERN1, XERN2
- C***FIRST EXECUTABLE STATEMENT CGEFS
- IF (LDA.LT.N) THEN
- IND = -1
- WRITE (XERN1, '(I8)') LDA
- WRITE (XERN2, '(I8)') N
- CALL XERMSG ('SLATEC', 'CGEFS', 'LDA = ' // XERN1 //
- * ' IS LESS THAN N = ' // XERN2, -1, 1)
- RETURN
- ENDIF
- C
- IF (N.LE.0) THEN
- IND = -2
- WRITE (XERN1, '(I8)') N
- CALL XERMSG ('SLATEC', 'CGEFS', 'N = ' // XERN1 //
- * ' IS LESS THAN 1', -2, 1)
- RETURN
- ENDIF
- C
- IF (ITASK.LT.1) THEN
- IND = -3
- WRITE (XERN1, '(I8)') ITASK
- CALL XERMSG ('SLATEC', 'CGEFS', 'ITASK = ' // XERN1 //
- * ' IS LESS THAN 1', -3, 1)
- RETURN
- ENDIF
- C
- C FACTOR MATRIX A INTO LU
- C
- IF (ITASK.EQ.1) THEN
- CALL CGECO(A,LDA,N,IWORK,RCOND,WORK)
- C
- C CHECK FOR COMPUTATIONALLY SINGULAR MATRIX
- C
- IF (RCOND.EQ.0.0) THEN
- IND = -4
- CALL XERMSG ('SLATEC', 'CGEFS',
- * 'SINGULAR MATRIX A - NO SOLUTION', -4, 1)
- RETURN
- ENDIF
- C
- C COMPUTE IND (ESTIMATE OF NO. OF SIGNIFICANT DIGITS)
- C
- IND = -LOG10(R1MACH(4)/RCOND)
- C
- C CHECK FOR IND GREATER THAN ZERO
- C
- IF (IND.LE.0) THEN
- IND = -10
- CALL XERMSG ('SLATEC', 'CGEFS',
- * 'SOLUTION MAY HAVE NO SIGNIFICANCE', -10, 0)
- ENDIF
- ENDIF
- C
- C SOLVE AFTER FACTORING
- C
- CALL CGESL(A,LDA,N,IWORK,V,0)
- RETURN
- END
- *DECK CGEIR
- SUBROUTINE CGEIR (A, LDA, N, V, ITASK, IND, WORK, IWORK)
- C***BEGIN PROLOGUE CGEIR
- C***PURPOSE Solve a general system of linear equations. Iterative
- C refinement is used to obtain an error estimate.
- C***LIBRARY SLATEC
- C***CATEGORY D2C1
- C***TYPE COMPLEX (SGEIR-S, CGEIR-C)
- C***KEYWORDS COMPLEX LINEAR EQUATIONS, GENERAL MATRIX,
- C GENERAL SYSTEM OF LINEAR EQUATIONS
- C***AUTHOR Voorhees, E. A., (LANL)
- C***DESCRIPTION
- C
- C Subroutine CGEIR solves a general NxN system of complex
- C linear equations using LINPACK subroutines CGEFA and CGESL.
- C One pass of iterative refinement is used only to obtain an
- C estimate of the accuracy. That is, if A is an NxN complex
- C matrix and if X and B are complex N-vectors, then CGEIR solves
- C the equation
- C
- C A*X=B.
- C
- C The matrix A is first factored into upper and lower tri-
- C angular matrices U and L using partial pivoting. These
- C factors and the pivoting information are used to calculate
- C the solution, X. Then the residual vector is found and
- C used to calculate an estimate of the relative error, IND.
- C IND estimates the accuracy of the solution only when the
- C input matrix and the right hand side are represented
- C exactly in the computer and does not take into
- C account any errors in the input data.
- C
- C If the equation A*X=B is to be solved for more than one vector
- C B, the factoring of A does not need to be performed again and
- C the option to only solve (ITASK .GT. 1) will be faster for
- C the succeeding solutions. In this case, the contents of A,
- C LDA, N, WORK, and IWORK must not have been altered by the
- C user following factorization (ITASK=1). IND will not be
- C changed by CGEIR in this case.
- C
- C Argument Description ***
- C
- C A COMPLEX(LDA,N)
- C the doubly subscripted array with dimension (LDA,N)
- C which contains the coefficient matrix. A is not
- C altered by the routine.
- C LDA INTEGER
- C the leading dimension of the array A. LDA must be great-
- C er than or equal to N. (Terminal error message IND=-1)
- C N INTEGER
- C the order of the matrix A. The first N elements of
- C the array A are the elements of the first column of
- C matrix A. N must be greater than or equal to 1.
- C (Terminal error message IND=-2)
- C V COMPLEX(N)
- C on entry, the singly subscripted array(vector) of di-
- C mension N which contains the right hand side B of a
- C system of simultaneous linear equations A*X=B.
- C on return, V contains the solution vector, X .
- C ITASK INTEGER
- C if ITASK=1, the matrix A is factored and then the
- C linear equation is solved.
- C if ITASK .GT. 1, the equation is solved using the existing
- C factored matrix A (stored in work).
- C if ITASK .LT. 1, then terminal error message IND=-3 is
- C printed.
- C IND INTEGER
- C GT.0 IND is a rough estimate of the number of digits
- C of accuracy in the solution, X. IND=75 means
- C that the solution vector X is zero.
- C LT.0 see error message corresponding to IND below.
- C WORK COMPLEX(N*(N+1))
- C a singly subscripted array of dimension at least N*(N+1).
- C IWORK INTEGER(N)
- C a singly subscripted array of dimension at least N.
- C
- C Error Messages Printed ***
- C
- C IND=-1 terminal N is greater than LDA.
- C IND=-2 terminal N is less than one.
- C IND=-3 terminal ITASK is less than one.
- C IND=-4 terminal The matrix A is computationally singular.
- C A solution has not been computed.
- C IND=-10 warning The solution has no apparent significance.
- C The solution may be inaccurate or the matrix
- C A may be poorly scaled.
- C
- C NOTE- The above terminal(*fatal*) error messages are
- C designed to be handled by XERMSG in which
- C LEVEL=1 (recoverable) and IFLAG=2 . LEVEL=0
- C for warning error messages from XERMSG. Unless
- C the user provides otherwise, an error message
- C will be printed followed by an abort.
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CCOPY, CDCDOT, CGEFA, CGESL, R1MACH, SCASUM, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 800502 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 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 900510 Convert XERRWV calls to XERMSG calls, cvt GOTO's to
- C IF-THEN-ELSE. (RWC)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CGEIR
- C
- INTEGER LDA,N,ITASK,IND,IWORK(*),INFO,J
- COMPLEX A(LDA,*),V(*),WORK(N,*),CDCDOT
- REAL SCASUM,XNORM,DNORM,R1MACH
- CHARACTER*8 XERN1, XERN2
- C***FIRST EXECUTABLE STATEMENT CGEIR
- IF (LDA.LT.N) THEN
- IND = -1
- WRITE (XERN1, '(I8)') LDA
- WRITE (XERN2, '(I8)') N
- CALL XERMSG ('SLATEC', 'CGEIR', 'LDA = ' // XERN1 //
- * ' IS LESS THAN N = ' // XERN2, -1, 1)
- RETURN
- ENDIF
- C
- IF (N.LE.0) THEN
- IND = -2
- WRITE (XERN1, '(I8)') N
- CALL XERMSG ('SLATEC', 'CGEIR', 'N = ' // XERN1 //
- * ' IS LESS THAN 1', -2, 1)
- RETURN
- ENDIF
- C
- IF (ITASK.LT.1) THEN
- IND = -3
- WRITE (XERN1, '(I8)') ITASK
- CALL XERMSG ('SLATEC', 'CGEIR', 'ITASK = ' // XERN1 //
- * ' IS LESS THAN 1', -3, 1)
- RETURN
- ENDIF
- C
- IF (ITASK.EQ.1) THEN
- C MOVE MATRIX A TO WORK
- DO 10 J=1,N
- CALL CCOPY(N,A(1,J),1,WORK(1,J),1)
- 10 CONTINUE
- C
- C FACTOR MATRIX A INTO LU
- C
- CALL CGEFA(WORK,N,N,IWORK,INFO)
- C
- C CHECK FOR COMPUTATIONALLY SINGULAR MATRIX
- C
- IF (INFO.NE.0) THEN
- IND = -4
- CALL XERMSG ('SLATEC', 'CGEIR',
- * 'SINGULAR MATRIX A - NO SOLUTION', -4, 1)
- RETURN
- ENDIF
- ENDIF
- C
- C SOLVE WHEN FACTORING COMPLETE
- C MOVE VECTOR B TO WORK
- C
- CALL CCOPY(N,V(1),1,WORK(1,N+1),1)
- CALL CGESL(WORK,N,N,IWORK,V,0)
- C
- C FORM NORM OF X0
- C
- XNORM = SCASUM(N,V(1),1)
- IF (XNORM.EQ.0.0) THEN
- IND = 75
- RETURN
- ENDIF
- C
- C COMPUTE RESIDUAL
- C
- DO 40 J=1,N
- WORK(J,N+1) = CDCDOT(N,-WORK(J,N+1),A(J,1),LDA,V,1)
- 40 CONTINUE
- C
- C SOLVE A*DELTA=R
- C
- CALL CGESL(WORK,N,N,IWORK,WORK(1,N+1),0)
- C
- C FORM NORM OF DELTA
- C
- DNORM = SCASUM(N,WORK(1,N+1),1)
- C
- C COMPUTE IND (ESTIMATE OF NO. OF SIGNIFICANT DIGITS)
- C AND CHECK FOR IND GREATER THAN ZERO
- C
- IND = -LOG10(MAX(R1MACH(4),DNORM/XNORM))
- IF (IND.LE.0) THEN
- IND = -10
- CALL XERMSG ('SLATEC', 'CGEIR',
- * 'SOLUTION MAY HAVE NO SIGNIFICANCE', -10, 0)
- ENDIF
- RETURN
- END
- *DECK CGESL
- SUBROUTINE CGESL (A, LDA, N, IPVT, B, JOB)
- C***BEGIN PROLOGUE CGESL
- C***PURPOSE Solve the complex system A*X=B or CTRANS(A)*X=B using the
- C factors computed by CGECO or CGEFA.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D2C1
- C***TYPE COMPLEX (SGESL-S, DGESL-D, CGESL-C)
- C***KEYWORDS LINEAR ALGEBRA, LINPACK, MATRIX, SOLVE
- C***AUTHOR Moler, C. B., (U. of New Mexico)
- C***DESCRIPTION
- C
- C CGESL solves the complex system
- C A * X = B or CTRANS(A) * X = B
- C using the factors computed by CGECO or CGEFA.
- C
- C On Entry
- C
- C A COMPLEX(LDA, N)
- C the output from CGECO or CGEFA.
- C
- C LDA INTEGER
- C the leading dimension of the array A .
- C
- C N INTEGER
- C the order of the matrix A .
- C
- C IPVT INTEGER(N)
- C the pivot vector from CGECO or CGEFA.
- C
- C B COMPLEX(N)
- C the right hand side vector.
- C
- C JOB INTEGER
- C = 0 to solve A*X = B ,
- C = nonzero to solve CTRANS(A)*X = B where
- C CTRANS(A) is the conjugate transpose.
- C
- C On Return
- C
- C B the solution vector X .
- C
- C Error Condition
- C
- C A division by zero will occur if the input factor contains a
- C zero on the diagonal. Technically this indicates singularity
- C but it is often caused by improper arguments or improper
- C setting of LDA . It will not occur if the subroutines are
- C called correctly and if CGECO has set RCOND .GT. 0.0
- C or CGEFA has set INFO .EQ. 0 .
- C
- C To compute INVERSE(A) * C where C is a matrix
- C with P columns
- C CALL CGECO(A,LDA,N,IPVT,RCOND,Z)
- C IF (RCOND is too small) GO TO ...
- C DO 10 J = 1, P
- C CALL CGESL(A,LDA,N,IPVT,C(1,J),0)
- C 10 CONTINUE
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CAXPY, CDOTC
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CGESL
- INTEGER LDA,N,IPVT(*),JOB
- COMPLEX A(LDA,*),B(*)
- C
- COMPLEX CDOTC,T
- INTEGER K,KB,L,NM1
- C***FIRST EXECUTABLE STATEMENT CGESL
- NM1 = N - 1
- IF (JOB .NE. 0) GO TO 50
- C
- C JOB = 0 , SOLVE A * X = B
- C FIRST SOLVE L*Y = B
- C
- IF (NM1 .LT. 1) GO TO 30
- DO 20 K = 1, NM1
- L = IPVT(K)
- T = B(L)
- IF (L .EQ. K) GO TO 10
- B(L) = B(K)
- B(K) = T
- 10 CONTINUE
- CALL CAXPY(N-K,T,A(K+1,K),1,B(K+1),1)
- 20 CONTINUE
- 30 CONTINUE
- C
- C NOW SOLVE U*X = Y
- C
- DO 40 KB = 1, N
- K = N + 1 - KB
- B(K) = B(K)/A(K,K)
- T = -B(K)
- CALL CAXPY(K-1,T,A(1,K),1,B(1),1)
- 40 CONTINUE
- GO TO 100
- 50 CONTINUE
- C
- C JOB = NONZERO, SOLVE CTRANS(A) * X = B
- C FIRST SOLVE CTRANS(U)*Y = B
- C
- DO 60 K = 1, N
- T = CDOTC(K-1,A(1,K),1,B(1),1)
- B(K) = (B(K) - T)/CONJG(A(K,K))
- 60 CONTINUE
- C
- C NOW SOLVE CTRANS(L)*X = Y
- C
- IF (NM1 .LT. 1) GO TO 90
- DO 80 KB = 1, NM1
- K = N - KB
- B(K) = B(K) + CDOTC(N-K,A(K+1,K),1,B(K+1),1)
- L = IPVT(K)
- IF (L .EQ. K) GO TO 70
- T = B(L)
- B(L) = B(K)
- B(K) = T
- 70 CONTINUE
- 80 CONTINUE
- 90 CONTINUE
- 100 CONTINUE
- RETURN
- END
- *DECK CGTSL
- SUBROUTINE CGTSL (N, C, D, E, B, INFO)
- C***BEGIN PROLOGUE CGTSL
- C***PURPOSE Solve a tridiagonal linear system.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D2C2A
- C***TYPE COMPLEX (SGTSL-S, DGTSL-D, CGTSL-C)
- C***KEYWORDS LINEAR ALGEBRA, LINPACK, MATRIX, SOLVE, TRIDIAGONAL
- C***AUTHOR Dongarra, J., (ANL)
- C***DESCRIPTION
- C
- C CGTSL given a general tridiagonal matrix and a right hand
- C side will find the solution.
- C
- C On Entry
- C
- C N INTEGER
- C is the order of the tridiagonal matrix.
- C
- C C COMPLEX(N)
- C is the subdiagonal of the tridiagonal matrix.
- C C(2) through C(N) should contain the subdiagonal.
- C On output C is destroyed.
- C
- C D COMPLEX(N)
- C is the diagonal of the tridiagonal matrix.
- C On output D is destroyed.
- C
- C E COMPLEX(N)
- C is the superdiagonal of the tridiagonal matrix.
- C E(1) through E(N-1) should contain the superdiagonal.
- C On output E is destroyed.
- C
- C B COMPLEX(N)
- C is the right hand side vector.
- C
- C On Return
- C
- C B is the solution vector.
- C
- C INFO INTEGER
- C = 0 normal value.
- C = K if the K-th element of the diagonal becomes
- C exactly zero. The subroutine returns when
- C this is detected.
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CGTSL
- INTEGER N,INFO
- COMPLEX C(*),D(*),E(*),B(*)
- C
- INTEGER K,KB,KP1,NM1,NM2
- COMPLEX T
- COMPLEX ZDUM
- REAL CABS1
- CABS1(ZDUM) = ABS(REAL(ZDUM)) + ABS(AIMAG(ZDUM))
- C***FIRST EXECUTABLE STATEMENT CGTSL
- INFO = 0
- C(1) = D(1)
- NM1 = N - 1
- IF (NM1 .LT. 1) GO TO 40
- D(1) = E(1)
- E(1) = (0.0E0,0.0E0)
- E(N) = (0.0E0,0.0E0)
- C
- DO 30 K = 1, NM1
- KP1 = K + 1
- C
- C FIND THE LARGEST OF THE TWO ROWS
- C
- IF (CABS1(C(KP1)) .LT. CABS1(C(K))) GO TO 10
- C
- C INTERCHANGE ROW
- C
- T = C(KP1)
- C(KP1) = C(K)
- C(K) = T
- T = D(KP1)
- D(KP1) = D(K)
- D(K) = T
- T = E(KP1)
- E(KP1) = E(K)
- E(K) = T
- T = B(KP1)
- B(KP1) = B(K)
- B(K) = T
- 10 CONTINUE
- C
- C ZERO ELEMENTS
- C
- IF (CABS1(C(K)) .NE. 0.0E0) GO TO 20
- INFO = K
- GO TO 100
- 20 CONTINUE
- T = -C(KP1)/C(K)
- C(KP1) = D(KP1) + T*D(K)
- D(KP1) = E(KP1) + T*E(K)
- E(KP1) = (0.0E0,0.0E0)
- B(KP1) = B(KP1) + T*B(K)
- 30 CONTINUE
- 40 CONTINUE
- IF (CABS1(C(N)) .NE. 0.0E0) GO TO 50
- INFO = N
- GO TO 90
- 50 CONTINUE
- C
- C BACK SOLVE
- C
- NM2 = N - 2
- B(N) = B(N)/C(N)
- IF (N .EQ. 1) GO TO 80
- B(NM1) = (B(NM1) - D(NM1)*B(N))/C(NM1)
- IF (NM2 .LT. 1) GO TO 70
- DO 60 KB = 1, NM2
- K = NM2 - KB + 1
- B(K) = (B(K) - D(K)*B(K+1) - E(K)*B(K+2))/C(K)
- 60 CONTINUE
- 70 CONTINUE
- 80 CONTINUE
- 90 CONTINUE
- 100 CONTINUE
- C
- RETURN
- END
- *DECK CH
- SUBROUTINE CH (NM, N, AR, AI, W, MATZ, ZR, ZI, FV1, FV2, FM1,
- + IERR)
- C***BEGIN PROLOGUE CH
- C***PURPOSE Compute the eigenvalues and, optionally, the eigenvectors
- C of a complex Hermitian matrix.
- C***LIBRARY SLATEC (EISPACK)
- C***CATEGORY D4A3
- C***TYPE COMPLEX (RS-S, CH-C)
- C***KEYWORDS EIGENVALUES, EIGENVECTORS, EISPACK
- C***AUTHOR Smith, B. T., et al.
- C***DESCRIPTION
- C
- C This subroutine calls the recommended sequence of
- C subroutines from the eigensystem subroutine package (EISPACK)
- C to find the eigenvalues and eigenvectors (if desired)
- C of a COMPLEX HERMITIAN matrix.
- C
- C On INPUT
- C
- C NM must be set to the row dimension of the two-dimensional
- C array parameters, AR, AI, ZR and ZI, as declared in the
- C calling program dimension statement. NM is an INTEGER
- C variable.
- C
- C N is the order of the matrix A=(AR,AI). N is an INTEGER
- C variable. N must be less than or equal to NM.
- C
- C AR and AI contain the real and imaginary parts, respectively,
- C of the complex Hermitian matrix. AR and AI are
- C two-dimensional REAL arrays, dimensioned AR(NM,N)
- C and AI(NM,N).
- C
- C MATZ is an INTEGER variable set equal to zero if only
- C eigenvalues are desired. Otherwise, it is set to any
- C non-zero integer for both eigenvalues and eigenvectors.
- C
- C On OUTPUT
- C
- C W contains the eigenvalues in ascending order.
- C W is a one-dimensional REAL array, dimensioned W(N).
- C
- C ZR and ZI contain the real and imaginary parts, respectively,
- C of the eigenvectors if MATZ is not zero. ZR and ZI are
- C two-dimensional REAL arrays, dimensioned ZR(NM,N) and
- C ZI(NM,N).
- C
- C IERR is an INTEGER flag set to
- C Zero for normal return,
- C 10*N if N is greater than NM,
- C J if the J-th eigenvalue has not been
- C determined after a total of 30 iterations.
- C The eigenvalues should be correct for indices
- C 1, 2, ..., IERR-1, but no eigenvectors are
- C computed.
- C
- C FV1 and FV2 are one-dimensional REAL arrays used for
- C temporary storage, dimensioned FV1(N) and FV2(N).
- C
- C FM1 is a two-dimensional REAL array used for temporary
- C storage, dimensioned FM1(2,N).
- C
- C Questions and comments should be directed to B. S. Garbow,
- C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY
- C ------------------------------------------------------------------
- C
- C***REFERENCES B. T. Smith, J. M. Boyle, J. J. Dongarra, B. S. Garbow,
- C Y. Ikebe, V. C. Klema and C. B. Moler, Matrix Eigen-
- C system Routines - EISPACK Guide, Springer-Verlag,
- C 1976.
- C***ROUTINES CALLED HTRIBK, HTRIDI, TQL2, TQLRAT
- C***REVISION HISTORY (YYMMDD)
- C 760101 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CH
- C
- INTEGER I,J,N,NM,IERR,MATZ
- REAL AR(NM,*),AI(NM,*),W(*),ZR(NM,*),ZI(NM,*)
- REAL FV1(*),FV2(*),FM1(2,*)
- C
- C***FIRST EXECUTABLE STATEMENT CH
- IF (N .LE. NM) GO TO 10
- IERR = 10 * N
- GO TO 50
- C
- 10 CALL HTRIDI(NM,N,AR,AI,W,FV1,FV2,FM1)
- IF (MATZ .NE. 0) GO TO 20
- C .......... FIND EIGENVALUES ONLY ..........
- CALL TQLRAT(N,W,FV2,IERR)
- GO TO 50
- C .......... FIND BOTH EIGENVALUES AND EIGENVECTORS ..........
- 20 DO 40 I = 1, N
- C
- DO 30 J = 1, N
- ZR(J,I) = 0.0E0
- 30 CONTINUE
- C
- ZR(I,I) = 1.0E0
- 40 CONTINUE
- C
- CALL TQL2(NM,N,W,FV1,ZR,IERR)
- IF (IERR .NE. 0) GO TO 50
- CALL HTRIBK(NM,N,AR,AI,FM1,N,ZR,ZI)
- 50 RETURN
- END
- *DECK CHFCM
- INTEGER FUNCTION CHFCM (D1, D2, DELTA)
- C***BEGIN PROLOGUE CHFCM
- C***SUBSIDIARY
- C***PURPOSE Check a single cubic for monotonicity.
- C***LIBRARY SLATEC (PCHIP)
- C***TYPE SINGLE PRECISION (CHFCM-S, DCHFCM-D)
- C***AUTHOR Fritsch, F. N., (LLNL)
- C***DESCRIPTION
- C
- C *Usage:
- C
- C REAL D1, D2, DELTA
- C INTEGER ISMON, CHFCM
- C
- C ISMON = CHFCM (D1, D2, DELTA)
- C
- C *Arguments:
- C
- C D1,D2:IN are the derivative values at the ends of an interval.
- C
- C DELTA:IN is the data slope over that interval.
- C
- C *Function Return Values:
- C ISMON : indicates the monotonicity of the cubic segment:
- C ISMON = -3 if function is probably decreasing;
- C ISMON = -1 if function is strictly decreasing;
- C ISMON = 0 if function is constant;
- C ISMON = 1 if function is strictly increasing;
- C ISMON = 2 if function is non-monotonic;
- C ISMON = 3 if function is probably increasing.
- C If ABS(ISMON)=3, the derivative values are too close to the
- C boundary of the monotonicity region to declare monotonicity
- C in the presence of roundoff error.
- C
- C *Description:
- C
- C CHFCM: Cubic Hermite Function -- Check Monotonicity.
- C
- C Called by PCHCM to determine the monotonicity properties of the
- C cubic with boundary derivative values D1,D2 and chord slope DELTA.
- C
- C *Cautions:
- C This is essentially the same as old CHFMC, except that a
- C new output value, -3, was added February 1989. (Formerly, -3
- C and +3 were lumped together in the single value 3.) Codes that
- C flag nonmonotonicity by "IF (ISMON.EQ.2)" need not be changed.
- C Codes that check via "IF (ISMON.GE.3)" should change the test to
- C "IF (IABS(ISMON).GE.3)". Codes that declare monotonicity via
- C "IF (ISMON.LE.1)" should change to "IF (IABS(ISMON).LE.1)".
- C
- C REFER TO PCHCM
- C
- C***ROUTINES CALLED R1MACH
- C***REVISION HISTORY (YYMMDD)
- C 820518 DATE WRITTEN
- C 820805 Converted to SLATEC library version.
- C 831201 Changed from ISIGN to SIGN to correct bug that
- C produced wrong sign when -1 .LT. DELTA .LT. 0 .
- C 890206 Added SAVE statements.
- C 890207 Added sign to returned value ISMON=3 and corrected
- C argument description accordingly.
- C 890306 Added caution about changed output.
- C 890407 Changed name from CHFMC to CHFCM, as requested at the
- C March 1989 SLATEC CML meeting, and made a few other
- C minor modifications necessitated by this change.
- C 890407 Converted to new SLATEC format.
- C 890407 Modified DESCRIPTION to LDOC format.
- C 891214 Moved SAVE statements. (WRB)
- C***END PROLOGUE CHFCM
- C
- C Fortran intrinsics used: SIGN.
- C Other routines used: R1MACH.
- C
- C ----------------------------------------------------------------------
- C
- C Programming notes:
- C
- C TEN is actually a tuning parameter, which determines the width of
- C the fuzz around the elliptical boundary.
- C
- C To produce a double precision version, simply:
- C a. Change CHFCM to DCHFCM wherever it occurs,
- C b. Change the real declarations to double precision, and
- C c. Change the constants ZERO, ONE, ... to double precision.
- C
- C DECLARE ARGUMENTS.
- C
- REAL D1, D2, DELTA
- C
- C DECLARE LOCAL VARIABLES.
- C
- INTEGER ISMON, ITRUE
- REAL A, B, EPS, FOUR, ONE, PHI, TEN, THREE, TWO, ZERO
- SAVE ZERO, ONE, TWO, THREE, FOUR
- SAVE TEN
- C
- C INITIALIZE.
- C
- DATA ZERO /0./, ONE /1.0/, TWO /2./, THREE /3./, FOUR /4./,
- 1 TEN /10./
- C
- C MACHINE-DEPENDENT PARAMETER -- SHOULD BE ABOUT 10*UROUND.
- C***FIRST EXECUTABLE STATEMENT CHFCM
- EPS = TEN*R1MACH(4)
- C
- C MAKE THE CHECK.
- C
- IF (DELTA .EQ. ZERO) THEN
- C CASE OF CONSTANT DATA.
- IF ((D1.EQ.ZERO) .AND. (D2.EQ.ZERO)) THEN
- ISMON = 0
- ELSE
- ISMON = 2
- ENDIF
- ELSE
- C DATA IS NOT CONSTANT -- PICK UP SIGN.
- ITRUE = SIGN (ONE, DELTA)
- A = D1/DELTA
- B = D2/DELTA
- IF ((A.LT.ZERO) .OR. (B.LT.ZERO)) THEN
- ISMON = 2
- ELSE IF ((A.LE.THREE-EPS) .AND. (B.LE.THREE-EPS)) THEN
- C INSIDE SQUARE (0,3)X(0,3) IMPLIES OK.
- ISMON = ITRUE
- ELSE IF ((A.GT.FOUR+EPS) .AND. (B.GT.FOUR+EPS)) THEN
- C OUTSIDE SQUARE (0,4)X(0,4) IMPLIES NONMONOTONIC.
- ISMON = 2
- ELSE
- C MUST CHECK AGAINST BOUNDARY OF ELLIPSE.
- A = A - TWO
- B = B - TWO
- PHI = ((A*A + B*B) + A*B) - THREE
- IF (PHI .LT. -EPS) THEN
- ISMON = ITRUE
- ELSE IF (PHI .GT. EPS) THEN
- ISMON = 2
- ELSE
- C TO CLOSE TO BOUNDARY TO TELL,
- C IN THE PRESENCE OF ROUND-OFF ERRORS.
- ISMON = 3*ITRUE
- ENDIF
- ENDIF
- ENDIF
- C
- C RETURN VALUE.
- C
- CHFCM = ISMON
- RETURN
- C------------- LAST LINE OF CHFCM FOLLOWS ------------------------------
- END
- *DECK CHFDV
- SUBROUTINE CHFDV (X1, X2, F1, F2, D1, D2, NE, XE, FE, DE, NEXT,
- + IERR)
- C***BEGIN PROLOGUE CHFDV
- C***PURPOSE Evaluate a cubic polynomial given in Hermite form and its
- C first derivative at an array of points. While designed for
- C use by PCHFD, it may be useful directly as an evaluator
- C for a piecewise cubic Hermite function in applications,
- C such as graphing, where the interval is known in advance.
- C If only function values are required, use CHFEV instead.
- C***LIBRARY SLATEC (PCHIP)
- C***CATEGORY E3, H1
- C***TYPE SINGLE PRECISION (CHFDV-S, DCHFDV-D)
- C***KEYWORDS CUBIC HERMITE DIFFERENTIATION, CUBIC HERMITE EVALUATION,
- C CUBIC POLYNOMIAL EVALUATION, PCHIP
- C***AUTHOR Fritsch, F. N., (LLNL)
- C Lawrence Livermore National Laboratory
- C P.O. Box 808 (L-316)
- C Livermore, CA 94550
- C FTS 532-4275, (510) 422-4275
- C***DESCRIPTION
- C
- C CHFDV: Cubic Hermite Function and Derivative Evaluator
- C
- C Evaluates the cubic polynomial determined by function values
- C F1,F2 and derivatives D1,D2 on interval (X1,X2), together with
- C its first derivative, at the points XE(J), J=1(1)NE.
- C
- C If only function values are required, use CHFEV, instead.
- C
- C ----------------------------------------------------------------------
- C
- C Calling sequence:
- C
- C INTEGER NE, NEXT(2), IERR
- C REAL X1, X2, F1, F2, D1, D2, XE(NE), FE(NE), DE(NE)
- C
- C CALL CHFDV (X1,X2, F1,F2, D1,D2, NE, XE, FE, DE, NEXT, IERR)
- C
- C Parameters:
- C
- C X1,X2 -- (input) endpoints of interval of definition of cubic.
- C (Error return if X1.EQ.X2 .)
- C
- C F1,F2 -- (input) values of function at X1 and X2, respectively.
- C
- C D1,D2 -- (input) values of derivative at X1 and X2, respectively.
- C
- C NE -- (input) number of evaluation points. (Error return if
- C NE.LT.1 .)
- C
- C XE -- (input) real array of points at which the functions are to
- C be evaluated. If any of the XE are outside the interval
- C [X1,X2], a warning error is returned in NEXT.
- C
- C FE -- (output) real array of values of the cubic function defined
- C by X1,X2, F1,F2, D1,D2 at the points XE.
- C
- C DE -- (output) real array of values of the first derivative of
- C the same function at the points XE.
- C
- C NEXT -- (output) integer array indicating number of extrapolation
- C points:
- C NEXT(1) = number of evaluation points to left of interval.
- C NEXT(2) = number of evaluation points to right of interval.
- C
- C IERR -- (output) error flag.
- C Normal return:
- C IERR = 0 (no errors).
- C "Recoverable" errors:
- C IERR = -1 if NE.LT.1 .
- C IERR = -2 if X1.EQ.X2 .
- C (Output arrays have not been changed in either case.)
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 811019 DATE WRITTEN
- C 820803 Minor cosmetic changes for release 1.
- C 890411 Added SAVE statements (Vers. 3.2).
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 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***END PROLOGUE CHFDV
- C Programming notes:
- C
- C To produce a double precision version, simply:
- C a. Change CHFDV to DCHFDV wherever it occurs,
- C b. Change the real declaration to double precision, and
- C c. Change the constant ZERO to double precision.
- C
- C DECLARE ARGUMENTS.
- C
- INTEGER NE, NEXT(2), IERR
- REAL X1, X2, F1, F2, D1, D2, XE(*), FE(*), DE(*)
- C
- C DECLARE LOCAL VARIABLES.
- C
- INTEGER I
- REAL C2, C2T2, C3, C3T3, DEL1, DEL2, DELTA, H, X, XMI, XMA, ZERO
- SAVE ZERO
- DATA ZERO /0./
- C
- C VALIDITY-CHECK ARGUMENTS.
- C
- C***FIRST EXECUTABLE STATEMENT CHFDV
- IF (NE .LT. 1) GO TO 5001
- H = X2 - X1
- IF (H .EQ. ZERO) GO TO 5002
- C
- C INITIALIZE.
- C
- IERR = 0
- NEXT(1) = 0
- NEXT(2) = 0
- XMI = MIN(ZERO, H)
- XMA = MAX(ZERO, H)
- C
- C COMPUTE CUBIC COEFFICIENTS (EXPANDED ABOUT X1).
- C
- DELTA = (F2 - F1)/H
- DEL1 = (D1 - DELTA)/H
- DEL2 = (D2 - DELTA)/H
- C (DELTA IS NO LONGER NEEDED.)
- C2 = -(DEL1+DEL1 + DEL2)
- C2T2 = C2 + C2
- C3 = (DEL1 + DEL2)/H
- C (H, DEL1 AND DEL2 ARE NO LONGER NEEDED.)
- C3T3 = C3+C3+C3
- C
- C EVALUATION LOOP.
- C
- DO 500 I = 1, NE
- X = XE(I) - X1
- FE(I) = F1 + X*(D1 + X*(C2 + X*C3))
- DE(I) = D1 + X*(C2T2 + X*C3T3)
- C COUNT EXTRAPOLATION POINTS.
- IF ( X.LT.XMI ) NEXT(1) = NEXT(1) + 1
- IF ( X.GT.XMA ) NEXT(2) = NEXT(2) + 1
- C (NOTE REDUNDANCY--IF EITHER CONDITION IS TRUE, OTHER IS FALSE.)
- 500 CONTINUE
- C
- C NORMAL RETURN.
- C
- RETURN
- C
- C ERROR RETURNS.
- C
- 5001 CONTINUE
- C NE.LT.1 RETURN.
- IERR = -1
- CALL XERMSG ('SLATEC', 'CHFDV',
- + 'NUMBER OF EVALUATION POINTS LESS THAN ONE', IERR, 1)
- RETURN
- C
- 5002 CONTINUE
- C X1.EQ.X2 RETURN.
- IERR = -2
- CALL XERMSG ('SLATEC', 'CHFDV', 'INTERVAL ENDPOINTS EQUAL', IERR,
- + 1)
- RETURN
- C------------- LAST LINE OF CHFDV FOLLOWS ------------------------------
- END
- *DECK CHFEV
- SUBROUTINE CHFEV (X1, X2, F1, F2, D1, D2, NE, XE, FE, NEXT, IERR)
- C***BEGIN PROLOGUE CHFEV
- C***PURPOSE Evaluate a cubic polynomial given in Hermite form at an
- C array of points. While designed for use by PCHFE, it may
- C be useful directly as an evaluator for a piecewise cubic
- C Hermite function in applications, such as graphing, where
- C the interval is known in advance.
- C***LIBRARY SLATEC (PCHIP)
- C***CATEGORY E3
- C***TYPE SINGLE PRECISION (CHFEV-S, DCHFEV-D)
- C***KEYWORDS CUBIC HERMITE EVALUATION, CUBIC POLYNOMIAL EVALUATION,
- C PCHIP
- C***AUTHOR Fritsch, F. N., (LLNL)
- C Lawrence Livermore National Laboratory
- C P.O. Box 808 (L-316)
- C Livermore, CA 94550
- C FTS 532-4275, (510) 422-4275
- C***DESCRIPTION
- C
- C CHFEV: Cubic Hermite Function EValuator
- C
- C Evaluates the cubic polynomial determined by function values
- C F1,F2 and derivatives D1,D2 on interval (X1,X2) at the points
- C XE(J), J=1(1)NE.
- C
- C ----------------------------------------------------------------------
- C
- C Calling sequence:
- C
- C INTEGER NE, NEXT(2), IERR
- C REAL X1, X2, F1, F2, D1, D2, XE(NE), FE(NE)
- C
- C CALL CHFEV (X1,X2, F1,F2, D1,D2, NE, XE, FE, NEXT, IERR)
- C
- C Parameters:
- C
- C X1,X2 -- (input) endpoints of interval of definition of cubic.
- C (Error return if X1.EQ.X2 .)
- C
- C F1,F2 -- (input) values of function at X1 and X2, respectively.
- C
- C D1,D2 -- (input) values of derivative at X1 and X2, respectively.
- C
- C NE -- (input) number of evaluation points. (Error return if
- C NE.LT.1 .)
- C
- C XE -- (input) real array of points at which the function is to be
- C evaluated. If any of the XE are outside the interval
- C [X1,X2], a warning error is returned in NEXT.
- C
- C FE -- (output) real array of values of the cubic function defined
- C by X1,X2, F1,F2, D1,D2 at the points XE.
- C
- C NEXT -- (output) integer array indicating number of extrapolation
- C points:
- C NEXT(1) = number of evaluation points to left of interval.
- C NEXT(2) = number of evaluation points to right of interval.
- C
- C IERR -- (output) error flag.
- C Normal return:
- C IERR = 0 (no errors).
- C "Recoverable" errors:
- C IERR = -1 if NE.LT.1 .
- C IERR = -2 if X1.EQ.X2 .
- C (The FE-array has not been changed in either case.)
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 811019 DATE WRITTEN
- C 820803 Minor cosmetic changes for release 1.
- C 890411 Added SAVE statements (Vers. 3.2).
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890703 Corrected category record. (WRB)
- C 890703 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***END PROLOGUE CHFEV
- C Programming notes:
- C
- C To produce a double precision version, simply:
- C a. Change CHFEV to DCHFEV wherever it occurs,
- C b. Change the real declaration to double precision, and
- C c. Change the constant ZERO to double precision.
- C
- C DECLARE ARGUMENTS.
- C
- INTEGER NE, NEXT(2), IERR
- REAL X1, X2, F1, F2, D1, D2, XE(*), FE(*)
- C
- C DECLARE LOCAL VARIABLES.
- C
- INTEGER I
- REAL C2, C3, DEL1, DEL2, DELTA, H, X, XMI, XMA, ZERO
- SAVE ZERO
- DATA ZERO /0./
- C
- C VALIDITY-CHECK ARGUMENTS.
- C
- C***FIRST EXECUTABLE STATEMENT CHFEV
- IF (NE .LT. 1) GO TO 5001
- H = X2 - X1
- IF (H .EQ. ZERO) GO TO 5002
- C
- C INITIALIZE.
- C
- IERR = 0
- NEXT(1) = 0
- NEXT(2) = 0
- XMI = MIN(ZERO, H)
- XMA = MAX(ZERO, H)
- C
- C COMPUTE CUBIC COEFFICIENTS (EXPANDED ABOUT X1).
- C
- DELTA = (F2 - F1)/H
- DEL1 = (D1 - DELTA)/H
- DEL2 = (D2 - DELTA)/H
- C (DELTA IS NO LONGER NEEDED.)
- C2 = -(DEL1+DEL1 + DEL2)
- C3 = (DEL1 + DEL2)/H
- C (H, DEL1 AND DEL2 ARE NO LONGER NEEDED.)
- C
- C EVALUATION LOOP.
- C
- DO 500 I = 1, NE
- X = XE(I) - X1
- FE(I) = F1 + X*(D1 + X*(C2 + X*C3))
- C COUNT EXTRAPOLATION POINTS.
- IF ( X.LT.XMI ) NEXT(1) = NEXT(1) + 1
- IF ( X.GT.XMA ) NEXT(2) = NEXT(2) + 1
- C (NOTE REDUNDANCY--IF EITHER CONDITION IS TRUE, OTHER IS FALSE.)
- 500 CONTINUE
- C
- C NORMAL RETURN.
- C
- RETURN
- C
- C ERROR RETURNS.
- C
- 5001 CONTINUE
- C NE.LT.1 RETURN.
- IERR = -1
- CALL XERMSG ('SLATEC', 'CHFEV',
- + 'NUMBER OF EVALUATION POINTS LESS THAN ONE', IERR, 1)
- RETURN
- C
- 5002 CONTINUE
- C X1.EQ.X2 RETURN.
- IERR = -2
- CALL XERMSG ('SLATEC', 'CHFEV', 'INTERVAL ENDPOINTS EQUAL', IERR,
- + 1)
- RETURN
- C------------- LAST LINE OF CHFEV FOLLOWS ------------------------------
- END
- *DECK CHFIV
- REAL FUNCTION CHFIV (X1, X2, F1, F2, D1, D2, A, B, IERR)
- C***BEGIN PROLOGUE CHFIV
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to PCHIA
- C***LIBRARY SLATEC (PCHIP)
- C***TYPE SINGLE PRECISION (CHFIV-S, DCHFIV-D)
- C***AUTHOR Fritsch, F. N., (LLNL)
- C***DESCRIPTION
- C
- C CHFIV: Cubic Hermite Function Integral Evaluator.
- C
- C Called by PCHIA to evaluate the integral of a single cubic (in
- C Hermite form) over an arbitrary interval (A,B).
- C
- C ----------------------------------------------------------------------
- C
- C Calling sequence:
- C
- C INTEGER IERR
- C REAL X1, X2, F1, F2, D1, D2, A, B
- C REAL VALUE, CHFIV
- C
- C VALUE = CHFIV (X1, X2, F1, F2, D1, D2, A, B, IERR)
- C
- C Parameters:
- C
- C VALUE -- (output) value of the requested integral.
- C
- C X1,X2 -- (input) endpoints if interval of definition of cubic.
- C (Must be distinct. Error return if not.)
- C
- C F1,F2 -- (input) function values at the ends of the interval.
- C
- C D1,D2 -- (input) derivative values at the ends of the interval.
- C
- C A,B -- (input) endpoints of interval of integration.
- C
- C IERR -- (output) error flag.
- C Normal return:
- C IERR = 0 (no errors).
- C "Recoverable errors":
- C IERR = -1 if X1.EQ.X2 .
- C (VALUE has not been set in this case.)
- C
- C***SEE ALSO PCHIA
- C***ROUTINES CALLED XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 820730 DATE WRITTEN
- C 820805 Converted to SLATEC library version.
- C 870813 Minor cosmetic changes.
- C 890411 1. Added SAVE statements (Vers. 3.2).
- C 2. Added SIX to REAL declaration.
- C 890411 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 900328 Added TYPE section. (WRB)
- C 910408 Updated AUTHOR section in prologue. (WRB)
- C***END PROLOGUE CHFIV
- C Programming notes:
- C
- C To produce a double precision version, simply:
- C a. Change CHFIV to DCHFIV wherever it occurs,
- C b. Change the real declarations to double precision, and
- C c. Change the constants HALF, TWO, ... to double precision.
- C
- C DECLARE ARGUMENTS.
- C
- INTEGER IERR
- REAL X1, X2, F1, F2, D1, D2, A, B
- C
- C DECLARE LOCAL VARIABLES.
- C
- REAL DTERM, FOUR, FTERM, H, HALF, PHIA1, PHIA2, PHIB1, PHIB2,
- * PSIA1, PSIA2, PSIB1, PSIB2, SIX, TA1, TA2, TB1, TB2, THREE,
- * TWO, UA1, UA2, UB1, UB2
- SAVE HALF, TWO, THREE, FOUR, SIX
- C
- C INITIALIZE.
- C
- DATA HALF /0.5/, TWO /2./, THREE /3./, FOUR /4./, SIX /6./
- C
- C VALIDITY CHECK INPUT.
- C
- C***FIRST EXECUTABLE STATEMENT CHFIV
- IF (X1 .EQ. X2) GO TO 5001
- IERR = 0
- C
- C COMPUTE INTEGRAL.
- C
- H = X2 - X1
- TA1 = (A - X1) / H
- TA2 = (X2 - A) / H
- TB1 = (B - X1) / H
- TB2 = (X2 - B) / H
- C
- UA1 = TA1**3
- PHIA1 = UA1 * (TWO - TA1)
- PSIA1 = UA1 * (THREE*TA1 - FOUR)
- UA2 = TA2**3
- PHIA2 = UA2 * (TWO - TA2)
- PSIA2 = -UA2 * (THREE*TA2 - FOUR)
- C
- UB1 = TB1**3
- PHIB1 = UB1 * (TWO - TB1)
- PSIB1 = UB1 * (THREE*TB1 - FOUR)
- UB2 = TB2**3
- PHIB2 = UB2 * (TWO - TB2)
- PSIB2 = -UB2 * (THREE*TB2 - FOUR)
- C
- FTERM = F1*(PHIA2 - PHIB2) + F2*(PHIB1 - PHIA1)
- DTERM = ( D1*(PSIA2 - PSIB2) + D2*(PSIB1 - PSIA1) )*(H/SIX)
- C
- C RETURN VALUE.
- C
- CHFIV = (HALF*H) * (FTERM + DTERM)
- RETURN
- C
- C ERROR RETURN.
- C
- 5001 CONTINUE
- IERR = -1
- CALL XERMSG ('SLATEC', 'CHFIV', 'X1 EQUAL TO X2', IERR, 1)
- RETURN
- C------------- LAST LINE OF CHFIV FOLLOWS ------------------------------
- END
- *DECK CHICO
- SUBROUTINE CHICO (A, LDA, N, KPVT, RCOND, Z)
- C***BEGIN PROLOGUE CHICO
- C***PURPOSE Factor a complex Hermitian matrix by elimination with sym-
- C metric pivoting and estimate the condition of the matrix.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D2D1A
- C***TYPE COMPLEX (SSICO-S, DSICO-D, CHICO-C, CSICO-C)
- C***KEYWORDS CONDITION NUMBER, HERMITIAN, LINEAR ALGEBRA, LINPACK,
- C MATRIX FACTORIZATION
- C***AUTHOR Moler, C. B., (U. of New Mexico)
- C***DESCRIPTION
- C
- C CHICO factors a complex Hermitian matrix by elimination with
- C symmetric pivoting and estimates the condition of the matrix.
- C
- C If RCOND is not needed, CHIFA is slightly faster.
- C To solve A*X = B , follow CHICO by CHISL.
- C To compute INVERSE(A)*C , follow CHICO by CHISL.
- C To compute INVERSE(A) , follow CHICO by CHIDI.
- C To compute DETERMINANT(A) , follow CHICO by CHIDI.
- C To compute INERTIA(A), follow CHICO by CHIDI.
- C
- C On Entry
- C
- C A COMPLEX(LDA, N)
- C the Hermitian matrix to be factored.
- C Only the diagonal and upper triangle are used.
- C
- C LDA INTEGER
- C the leading dimension of the array A .
- C
- C N INTEGER
- C the order of the matrix A .
- C
- C Output
- C
- C A a block diagonal matrix and the multipliers which
- C were used to obtain it.
- C The factorization can be written A = U*D*CTRANS(U)
- C where U is a product of permutation and unit
- C upper triangular matrices , CTRANS(U) is the
- C conjugate transpose of U , and D is block diagonal
- C with 1 by 1 and 2 by 2 blocks.
- C
- C KVPT INTEGER(N)
- C an integer vector of pivot indices.
- C
- C RCOND REAL
- C an estimate of the reciprocal condition of A .
- C For the system A*X = B , relative perturbations
- C in A and B of size EPSILON may cause
- C relative perturbations in X of size EPSILON/RCOND .
- C If RCOND is so small that the logical expression
- C 1.0 + RCOND .EQ. 1.0
- C is true, then A may be singular to working
- C precision. In particular, RCOND is zero if
- C exact singularity is detected or the estimate
- C underflows.
- C
- C Z COMPLEX(N)
- C a work vector whose contents are usually unimportant.
- C If A is close to a singular matrix, then Z is
- C an approximate null vector in the sense that
- C NORM(A*Z) = RCOND*NORM(A)*NORM(Z) .
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CAXPY, CDOTC, CHIFA, CSSCAL, SCASUM
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 891107 Modified routine equivalence list. (WRB)
- C 891107 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CHICO
- INTEGER LDA,N,KPVT(*)
- COMPLEX A(LDA,*),Z(*)
- REAL RCOND
- C
- COMPLEX AK,AKM1,BK,BKM1,CDOTC,DENOM,EK,T
- REAL ANORM,S,SCASUM,YNORM
- INTEGER I,INFO,J,JM1,K,KP,KPS,KS
- COMPLEX ZDUM,ZDUM2,CSIGN1
- REAL CABS1
- CABS1(ZDUM) = ABS(REAL(ZDUM)) + ABS(AIMAG(ZDUM))
- CSIGN1(ZDUM,ZDUM2) = CABS1(ZDUM)*(ZDUM2/CABS1(ZDUM2))
- C
- C FIND NORM OF A USING ONLY UPPER HALF
- C
- C***FIRST EXECUTABLE STATEMENT CHICO
- DO 30 J = 1, N
- Z(J) = CMPLX(SCASUM(J,A(1,J),1),0.0E0)
- JM1 = J - 1
- IF (JM1 .LT. 1) GO TO 20
- DO 10 I = 1, JM1
- Z(I) = CMPLX(REAL(Z(I))+CABS1(A(I,J)),0.0E0)
- 10 CONTINUE
- 20 CONTINUE
- 30 CONTINUE
- ANORM = 0.0E0
- DO 40 J = 1, N
- ANORM = MAX(ANORM,REAL(Z(J)))
- 40 CONTINUE
- C
- C FACTOR
- C
- CALL CHIFA(A,LDA,N,KPVT,INFO)
- C
- C RCOND = 1/(NORM(A)*(ESTIMATE OF NORM(INVERSE(A)))) .
- C ESTIMATE = NORM(Z)/NORM(Y) WHERE A*Z = Y AND A*Y = E .
- C THE COMPONENTS OF E ARE CHOSEN TO CAUSE MAXIMUM LOCAL
- C GROWTH IN THE ELEMENTS OF W WHERE U*D*W = E .
- C THE VECTORS ARE FREQUENTLY RESCALED TO AVOID OVERFLOW.
- C
- C SOLVE U*D*W = E
- C
- EK = (1.0E0,0.0E0)
- DO 50 J = 1, N
- Z(J) = (0.0E0,0.0E0)
- 50 CONTINUE
- K = N
- 60 IF (K .EQ. 0) GO TO 120
- KS = 1
- IF (KPVT(K) .LT. 0) KS = 2
- KP = ABS(KPVT(K))
- KPS = K + 1 - KS
- IF (KP .EQ. KPS) GO TO 70
- T = Z(KPS)
- Z(KPS) = Z(KP)
- Z(KP) = T
- 70 CONTINUE
- IF (CABS1(Z(K)) .NE. 0.0E0) EK = CSIGN1(EK,Z(K))
- Z(K) = Z(K) + EK
- CALL CAXPY(K-KS,Z(K),A(1,K),1,Z(1),1)
- IF (KS .EQ. 1) GO TO 80
- IF (CABS1(Z(K-1)) .NE. 0.0E0) EK = CSIGN1(EK,Z(K-1))
- Z(K-1) = Z(K-1) + EK
- CALL CAXPY(K-KS,Z(K-1),A(1,K-1),1,Z(1),1)
- 80 CONTINUE
- IF (KS .EQ. 2) GO TO 100
- IF (CABS1(Z(K)) .LE. CABS1(A(K,K))) GO TO 90
- S = CABS1(A(K,K))/CABS1(Z(K))
- CALL CSSCAL(N,S,Z,1)
- EK = CMPLX(S,0.0E0)*EK
- 90 CONTINUE
- IF (CABS1(A(K,K)) .NE. 0.0E0) Z(K) = Z(K)/A(K,K)
- IF (CABS1(A(K,K)) .EQ. 0.0E0) Z(K) = (1.0E0,0.0E0)
- GO TO 110
- 100 CONTINUE
- AK = A(K,K)/CONJG(A(K-1,K))
- AKM1 = A(K-1,K-1)/A(K-1,K)
- BK = Z(K)/CONJG(A(K-1,K))
- BKM1 = Z(K-1)/A(K-1,K)
- DENOM = AK*AKM1 - 1.0E0
- Z(K) = (AKM1*BK - BKM1)/DENOM
- Z(K-1) = (AK*BKM1 - BK)/DENOM
- 110 CONTINUE
- K = K - KS
- GO TO 60
- 120 CONTINUE
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- C
- C SOLVE CTRANS(U)*Y = W
- C
- K = 1
- 130 IF (K .GT. N) GO TO 160
- KS = 1
- IF (KPVT(K) .LT. 0) KS = 2
- IF (K .EQ. 1) GO TO 150
- Z(K) = Z(K) + CDOTC(K-1,A(1,K),1,Z(1),1)
- IF (KS .EQ. 2)
- 1 Z(K+1) = Z(K+1) + CDOTC(K-1,A(1,K+1),1,Z(1),1)
- KP = ABS(KPVT(K))
- IF (KP .EQ. K) GO TO 140
- T = Z(K)
- Z(K) = Z(KP)
- Z(KP) = T
- 140 CONTINUE
- 150 CONTINUE
- K = K + KS
- GO TO 130
- 160 CONTINUE
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- C
- YNORM = 1.0E0
- C
- C SOLVE U*D*V = Y
- C
- K = N
- 170 IF (K .EQ. 0) GO TO 230
- KS = 1
- IF (KPVT(K) .LT. 0) KS = 2
- IF (K .EQ. KS) GO TO 190
- KP = ABS(KPVT(K))
- KPS = K + 1 - KS
- IF (KP .EQ. KPS) GO TO 180
- T = Z(KPS)
- Z(KPS) = Z(KP)
- Z(KP) = T
- 180 CONTINUE
- CALL CAXPY(K-KS,Z(K),A(1,K),1,Z(1),1)
- IF (KS .EQ. 2) CALL CAXPY(K-KS,Z(K-1),A(1,K-1),1,Z(1),1)
- 190 CONTINUE
- IF (KS .EQ. 2) GO TO 210
- IF (CABS1(Z(K)) .LE. CABS1(A(K,K))) GO TO 200
- S = CABS1(A(K,K))/CABS1(Z(K))
- CALL CSSCAL(N,S,Z,1)
- YNORM = S*YNORM
- 200 CONTINUE
- IF (CABS1(A(K,K)) .NE. 0.0E0) Z(K) = Z(K)/A(K,K)
- IF (CABS1(A(K,K)) .EQ. 0.0E0) Z(K) = (1.0E0,0.0E0)
- GO TO 220
- 210 CONTINUE
- AK = A(K,K)/CONJG(A(K-1,K))
- AKM1 = A(K-1,K-1)/A(K-1,K)
- BK = Z(K)/CONJG(A(K-1,K))
- BKM1 = Z(K-1)/A(K-1,K)
- DENOM = AK*AKM1 - 1.0E0
- Z(K) = (AKM1*BK - BKM1)/DENOM
- Z(K-1) = (AK*BKM1 - BK)/DENOM
- 220 CONTINUE
- K = K - KS
- GO TO 170
- 230 CONTINUE
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- YNORM = S*YNORM
- C
- C SOLVE CTRANS(U)*Z = V
- C
- K = 1
- 240 IF (K .GT. N) GO TO 270
- KS = 1
- IF (KPVT(K) .LT. 0) KS = 2
- IF (K .EQ. 1) GO TO 260
- Z(K) = Z(K) + CDOTC(K-1,A(1,K),1,Z(1),1)
- IF (KS .EQ. 2)
- 1 Z(K+1) = Z(K+1) + CDOTC(K-1,A(1,K+1),1,Z(1),1)
- KP = ABS(KPVT(K))
- IF (KP .EQ. K) GO TO 250
- T = Z(K)
- Z(K) = Z(KP)
- Z(KP) = T
- 250 CONTINUE
- 260 CONTINUE
- K = K + KS
- GO TO 240
- 270 CONTINUE
- C MAKE ZNORM = 1.0
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- YNORM = S*YNORM
- C
- IF (ANORM .NE. 0.0E0) RCOND = YNORM/ANORM
- IF (ANORM .EQ. 0.0E0) RCOND = 0.0E0
- RETURN
- END
- *DECK CHIDI
- SUBROUTINE CHIDI (A, LDA, N, KPVT, DET, INERT, WORK, JOB)
- C***BEGIN PROLOGUE CHIDI
- C***PURPOSE Compute the determinant, inertia and inverse of a complex
- C Hermitian matrix using the factors obtained from CHIFA.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D2D1A, D3D1A
- C***TYPE COMPLEX (SSIDI-S, DSISI-D, CHIDI-C, CSIDI-C)
- C***KEYWORDS DETERMINANT, HERMITIAN, INVERSE, LINEAR ALGEBRA, LINPACK,
- C MATRIX
- C***AUTHOR Bunch, J., (UCSD)
- C***DESCRIPTION
- C
- C CHIDI computes the determinant, inertia and inverse
- C of a complex Hermitian matrix using the factors from CHIFA.
- C
- C On Entry
- C
- C A COMPLEX(LDA,N)
- C the output from CHIFA.
- C
- C LDA INTEGER
- C the leading dimension of the array A.
- C
- C N INTEGER
- C the order of the matrix A.
- C
- C KVPT INTEGER(N)
- C the pivot vector from CHIFA.
- C
- C WORK COMPLEX(N)
- C work vector. Contents destroyed.
- C
- C JOB INTEGER
- C JOB has the decimal expansion ABC where
- C if C .NE. 0, the inverse is computed,
- C if B .NE. 0, the determinant is computed,
- C if A .NE. 0, the inertia is computed.
- C
- C For example, JOB = 111 gives all three.
- C
- C On Return
- C
- C Variables not requested by JOB are not used.
- C
- C A contains the upper triangle of the inverse of
- C the original matrix. The strict lower triangle
- C is never referenced.
- C
- C DET REAL(2)
- C determinant of original matrix.
- C Determinant = DET(1) * 10.0**DET(2)
- C with 1.0 .LE. ABS(DET(1)) .LT. 10.0
- C or DET(1) = 0.0.
- C
- C INERT INTEGER(3)
- C the inertia of the original matrix.
- C INERT(1) = number of positive eigenvalues.
- C INERT(2) = number of negative eigenvalues.
- C INERT(3) = number of zero eigenvalues.
- C
- C Error Condition
- C
- C A division by zero may occur if the inverse is requested
- C and CHICO has set RCOND .EQ. 0.0
- C or CHIFA has set INFO .NE. 0 .
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CAXPY, CCOPY, CDOTC, CSWAP
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 891107 Modified routine equivalence list. (WRB)
- C 891107 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CHIDI
- INTEGER LDA,N,JOB
- COMPLEX A(LDA,*),WORK(*)
- REAL DET(2)
- INTEGER KPVT(*),INERT(3)
- C
- COMPLEX AKKP1,CDOTC,TEMP
- REAL TEN,D,T,AK,AKP1
- INTEGER J,JB,K,KM1,KS,KSTEP
- LOGICAL NOINV,NODET,NOERT
- C***FIRST EXECUTABLE STATEMENT CHIDI
- NOINV = MOD(JOB,10) .EQ. 0
- NODET = MOD(JOB,100)/10 .EQ. 0
- NOERT = MOD(JOB,1000)/100 .EQ. 0
- C
- IF (NODET .AND. NOERT) GO TO 140
- IF (NOERT) GO TO 10
- INERT(1) = 0
- INERT(2) = 0
- INERT(3) = 0
- 10 CONTINUE
- IF (NODET) GO TO 20
- DET(1) = 1.0E0
- DET(2) = 0.0E0
- TEN = 10.0E0
- 20 CONTINUE
- T = 0.0E0
- DO 130 K = 1, N
- D = REAL(A(K,K))
- C
- C CHECK IF 1 BY 1
- C
- IF (KPVT(K) .GT. 0) GO TO 50
- C
- C 2 BY 2 BLOCK
- C USE DET (D S) = (D/T * C - T) * T , T = ABS(S)
- C (S C)
- C TO AVOID UNDERFLOW/OVERFLOW TROUBLES.
- C TAKE TWO PASSES THROUGH SCALING. USE T FOR FLAG.
- C
- IF (T .NE. 0.0E0) GO TO 30
- T = ABS(A(K,K+1))
- D = (D/T)*REAL(A(K+1,K+1)) - T
- GO TO 40
- 30 CONTINUE
- D = T
- T = 0.0E0
- 40 CONTINUE
- 50 CONTINUE
- C
- IF (NOERT) GO TO 60
- IF (D .GT. 0.0E0) INERT(1) = INERT(1) + 1
- IF (D .LT. 0.0E0) INERT(2) = INERT(2) + 1
- IF (D .EQ. 0.0E0) INERT(3) = INERT(3) + 1
- 60 CONTINUE
- C
- IF (NODET) GO TO 120
- DET(1) = D*DET(1)
- IF (DET(1) .EQ. 0.0E0) GO TO 110
- 70 IF (ABS(DET(1)) .GE. 1.0E0) GO TO 80
- DET(1) = TEN*DET(1)
- DET(2) = DET(2) - 1.0E0
- GO TO 70
- 80 CONTINUE
- 90 IF (ABS(DET(1)) .LT. TEN) GO TO 100
- DET(1) = DET(1)/TEN
- DET(2) = DET(2) + 1.0E0
- GO TO 90
- 100 CONTINUE
- 110 CONTINUE
- 120 CONTINUE
- 130 CONTINUE
- 140 CONTINUE
- C
- C COMPUTE INVERSE(A)
- C
- IF (NOINV) GO TO 270
- K = 1
- 150 IF (K .GT. N) GO TO 260
- KM1 = K - 1
- IF (KPVT(K) .LT. 0) GO TO 180
- C
- C 1 BY 1
- C
- A(K,K) = CMPLX(1.0E0/REAL(A(K,K)),0.0E0)
- IF (KM1 .LT. 1) GO TO 170
- CALL CCOPY(KM1,A(1,K),1,WORK,1)
- DO 160 J = 1, KM1
- A(J,K) = CDOTC(J,A(1,J),1,WORK,1)
- CALL CAXPY(J-1,WORK(J),A(1,J),1,A(1,K),1)
- 160 CONTINUE
- A(K,K) = A(K,K)
- 1 + CMPLX(REAL(CDOTC(KM1,WORK,1,A(1,K),1)),
- 2 0.0E0)
- 170 CONTINUE
- KSTEP = 1
- GO TO 220
- 180 CONTINUE
- C
- C 2 BY 2
- C
- T = ABS(A(K,K+1))
- AK = REAL(A(K,K))/T
- AKP1 = REAL(A(K+1,K+1))/T
- AKKP1 = A(K,K+1)/T
- D = T*(AK*AKP1 - 1.0E0)
- A(K,K) = CMPLX(AKP1/D,0.0E0)
- A(K+1,K+1) = CMPLX(AK/D,0.0E0)
- A(K,K+1) = -AKKP1/D
- IF (KM1 .LT. 1) GO TO 210
- CALL CCOPY(KM1,A(1,K+1),1,WORK,1)
- DO 190 J = 1, KM1
- A(J,K+1) = CDOTC(J,A(1,J),1,WORK,1)
- CALL CAXPY(J-1,WORK(J),A(1,J),1,A(1,K+1),1)
- 190 CONTINUE
- A(K+1,K+1) = A(K+1,K+1)
- 1 + CMPLX(REAL(CDOTC(KM1,WORK,1,A(1,K+1),
- 2 1)),0.0E0)
- A(K,K+1) = A(K,K+1) + CDOTC(KM1,A(1,K),1,A(1,K+1),1)
- CALL CCOPY(KM1,A(1,K),1,WORK,1)
- DO 200 J = 1, KM1
- A(J,K) = CDOTC(J,A(1,J),1,WORK,1)
- CALL CAXPY(J-1,WORK(J),A(1,J),1,A(1,K),1)
- 200 CONTINUE
- A(K,K) = A(K,K)
- 1 + CMPLX(REAL(CDOTC(KM1,WORK,1,A(1,K),1)),
- 2 0.0E0)
- 210 CONTINUE
- KSTEP = 2
- 220 CONTINUE
- C
- C SWAP
- C
- KS = ABS(KPVT(K))
- IF (KS .EQ. K) GO TO 250
- CALL CSWAP(KS,A(1,KS),1,A(1,K),1)
- DO 230 JB = KS, K
- J = K + KS - JB
- TEMP = CONJG(A(J,K))
- A(J,K) = CONJG(A(KS,J))
- A(KS,J) = TEMP
- 230 CONTINUE
- IF (KSTEP .EQ. 1) GO TO 240
- TEMP = A(KS,K+1)
- A(KS,K+1) = A(K,K+1)
- A(K,K+1) = TEMP
- 240 CONTINUE
- 250 CONTINUE
- K = K + KSTEP
- GO TO 150
- 260 CONTINUE
- 270 CONTINUE
- RETURN
- END
- *DECK CHIEV
- SUBROUTINE CHIEV (A, LDA, N, E, V, LDV, WORK, JOB, INFO)
- C***BEGIN PROLOGUE CHIEV
- C***PURPOSE Compute the eigenvalues and, optionally, the eigenvectors
- C of a complex Hermitian matrix.
- C***LIBRARY SLATEC
- C***CATEGORY D4A3
- C***TYPE COMPLEX (SSIEV-S, CHIEV-C)
- C***KEYWORDS COMPLEX HERMITIAN, EIGENVALUES, EIGENVECTORS, MATRIX,
- C SYMMETRIC
- C***AUTHOR Kahaner, D. K., (NBS)
- C Moler, C. B., (U. of New Mexico)
- C Stewart, G. W., (U. of Maryland)
- C***DESCRIPTION
- C
- C David Kahaner, Cleve Moler, G. W. Stewart,
- C N.B.S. U.N.M. N.B.S./U.MD.
- C
- C Abstract
- C CHIEV computes the eigenvalues and, optionally,
- C the eigenvectors of a complex Hermitian matrix.
- C
- C Call Sequence Parameters-
- C (the values of parameters marked with * (star) will be changed
- C by CHIEV.)
- C
- C A* COMPLEX(LDA,N)
- C complex Hermitian input matrix.
- C Only the upper triangle of A need be
- C filled in. Elements on diagonal must be real.
- C
- C LDA INTEGER
- C set by the user to
- C the leading dimension of the complex array A.
- C
- C N INTEGER
- C set by the user to
- C the order of the matrices A and V, and
- C the number of elements in E.
- C
- C E* REAL(N)
- C on return from CHIEV E contains the eigenvalues of A.
- C See also INFO below.
- C
- C V* COMPLEX(LDV,N)
- C on return from CHIEV if the user has set JOB
- C = 0 V is not referenced.
- C = nonzero the N eigenvectors of A are stored in the
- C first N columns of V. See also INFO below.
- C
- C LDV INTEGER
- C set by the user to
- C the leading dimension of the array V if JOB is also
- C set nonzero. In that case N must be .LE. LDV.
- C If JOB is set to zero LDV is not referenced.
- C
- C WORK* REAL(4N)
- C temporary storage vector. Contents changed by CHIEV.
- C
- C JOB INTEGER
- C set by the user to
- C = 0 eigenvalues only to be calculated by CHIEV.
- C Neither V nor LDV are referenced.
- C = nonzero eigenvalues and vectors to be calculated.
- C In this case A and V must be distinct arrays
- C also if LDA .GT. LDV CHIEV changes all the
- C elements of A thru column N. If LDA < LDV
- C CHIEV changes all the elements of V through
- C column N. If LDA = LDV only A(I,J) and V(I,
- C J) for I,J = 1,...,N are changed by CHIEV.
- C
- C INFO* INTEGER
- C on return from CHIEV the value of INFO is
- C = 0 normal return, calculation successful.
- C = K if the eigenvalue iteration fails to converge,
- C eigenvalues (and eigenvectors if requested)
- C 1 through K-1 are correct.
- C
- C Error Messages
- C No. 1 recoverable N is greater than LDA
- C No. 2 recoverable N is less than one.
- C No. 3 recoverable JOB is nonzero and N is greater than LDV
- C No. 4 warning LDA > LDV, elements of A other than the
- C N by N input elements have been changed
- C No. 5 warning LDA < LDV, elements of V other than the
- C N by N output elements have been changed
- C No. 6 recoverable nonreal element on diagonal of A.
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED HTRIBK, HTRIDI, IMTQL2, SCOPY, SCOPYM, TQLRAT,
- C XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 800808 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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***END PROLOGUE CHIEV
- INTEGER I,INFO,J,JOB,K,L,LDA,LDV,M,MDIM,N
- REAL A(*),E(*),WORK(*),V(*)
- C***FIRST EXECUTABLE STATEMENT CHIEV
- IF (N .GT. LDA) CALL XERMSG ('SLATEC', 'CHIEV', 'N .GT. LDA.', 1,
- + 1)
- IF(N .GT. LDA) RETURN
- IF (N .LT. 1) CALL XERMSG ('SLATEC', 'CHIEV', 'N .LT. 1', 2, 1)
- IF(N .LT. 1) RETURN
- IF(N .EQ. 1 .AND. JOB .EQ. 0) GO TO 35
- MDIM = 2 * LDA
- IF(JOB .EQ. 0) GO TO 5
- IF (N .GT. LDV) CALL XERMSG ('SLATEC', 'CHIEV',
- + 'JOB .NE. 0 AND N .GT. LDV.', 3, 1)
- IF(N .GT. LDV) RETURN
- IF(N .EQ. 1) GO TO 35
- C
- C REARRANGE A IF NECESSARY WHEN LDA.GT.LDV AND JOB .NE.0
- C
- MDIM = MIN(MDIM,2 * LDV)
- IF (LDA .LT. LDV) CALL XERMSG ('SLATEC', 'CHIEV',
- + 'LDA.LT.LDV, ELEMENTS OF V OTHER THAN THE N BY N OUTPUT ' //
- + 'ELEMENTS HAVE BEEN CHANGED.', 5, 0)
- IF(LDA.LE.LDV) GO TO 5
- CALL XERMSG ('SLATEC', 'CHIEV',
- + 'LDA.GT.LDV, ELEMENTS OF A OTHER THAN THE N BY N INPUT ' //
- + 'ELEMENTS HAVE BEEN CHANGED.', 4, 0)
- L = N - 1
- DO 4 J=1,L
- M = 1+J*2*LDV
- K = 1+J*2*LDA
- CALL SCOPY(2*N,A(K),1,A(M),1)
- 4 CONTINUE
- 5 CONTINUE
- C
- C FILL IN LOWER TRIANGLE OF A, COLUMN BY COLUMN.
- C
- DO 6 J = 1,N
- K = (J-1)*(MDIM+2)+1
- IF (A(K+1) .NE. 0.0) CALL XERMSG ('SLATEC', 'CHIEV',
- + 'NONREAL ELEMENT ON DIAGONAL OF A', 6, 1)
- IF(A(K+1) .NE.0.0) RETURN
- CALL SCOPY(N-J+1,A(K),MDIM,A(K),2)
- CALL SCOPYM(N-J+1,A(K+1),MDIM,A(K+1),2)
- 6 CONTINUE
- C
- C SEPARATE REAL AND IMAGINARY PARTS
- C
- DO 10 J = 1, N
- K = (J-1) * MDIM +1
- L = K + N
- CALL SCOPY(N,A(K+1),2,WORK(1),1)
- CALL SCOPY(N,A(K),2,A(K),1)
- CALL SCOPY(N,WORK(1),1,A(L),1)
- 10 CONTINUE
- C
- C REDUCE A TO TRIDIAGONAL MATRIX.
- C
- CALL HTRIDI(MDIM,N,A(1),A(N+1),E,WORK(1),WORK(N+1),
- 1 WORK(2*N+1))
- IF(JOB .NE. 0) GOTO 15
- C
- C EIGENVALUES ONLY.
- C
- CALL TQLRAT(N,E,WORK(N+1),INFO)
- RETURN
- C
- C EIGENVALUES AND EIGENVECTORS.
- C
- 15 DO 17 J = 1,N
- K = (J-1) * MDIM + 1
- M = K + N - 1
- DO 16 I = K,M
- 16 V(I) = 0.
- I = K + J - 1
- V(I) = 1.
- 17 CONTINUE
- CALL IMTQL2(MDIM,N,E,WORK(1),V,INFO)
- IF(INFO .NE. 0) RETURN
- CALL HTRIBK(MDIM,N,A(1),A(N+1),WORK(2*N+1),N,V(1),V(N+1))
- C
- C CONVERT EIGENVECTORS TO COMPLEX STORAGE.
- C
- DO 20 J = 1,N
- K = (J-1) * MDIM + 1
- I = (J-1) * 2 * LDV + 1
- L = K + N
- CALL SCOPY(N,V(K),1,WORK(1),1)
- CALL SCOPY(N,V(L),1,V(I+1),2)
- CALL SCOPY(N,WORK(1),1,V(I),2)
- 20 CONTINUE
- RETURN
- C
- C TAKE CARE OF N=1 CASE.
- C
- 35 IF (A(2) .NE. 0.) CALL XERMSG ('SLATEC', 'CHIEV',
- + 'NONREAL ELEMENT ON DIAGONAL OF A', 6, 1)
- IF(A(2) .NE. 0.) RETURN
- E(1) = A(1)
- INFO = 0
- IF(JOB .EQ. 0) RETURN
- V(1) = A(1)
- V(2) = 0.
- RETURN
- END
- *DECK CHIFA
- SUBROUTINE CHIFA (A, LDA, N, KPVT, INFO)
- C***BEGIN PROLOGUE CHIFA
- C***PURPOSE Factor a complex Hermitian matrix by elimination
- C (symmetric pivoting).
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D2D1A
- C***TYPE COMPLEX (SSIFA-S, DSIFA-D, CHIFA-C, CSIFA-C)
- C***KEYWORDS HERMITIAN, LINEAR ALGEBRA, LINPACK, MATRIX FACTORIZATION
- C***AUTHOR Bunch, J., (UCSD)
- C***DESCRIPTION
- C
- C CHIFA factors a complex Hermitian matrix by elimination
- C with symmetric pivoting.
- C
- C To solve A*X = B , follow CHIFA by CHISL.
- C To compute INVERSE(A)*C , follow CHIFA by CHISL.
- C To compute DETERMINANT(A) , follow CHIFA by CHIDI.
- C To compute INERTIA(A) , follow CHIFA by CHIDI.
- C To compute INVERSE(A) , follow CHIFA by CHIDI.
- C
- C On Entry
- C
- C A COMPLEX(LDA,N)
- C the Hermitian matrix to be factored.
- C Only the diagonal and upper triangle are used.
- C
- C LDA INTEGER
- C the leading dimension of the array A .
- C
- C N INTEGER
- C the order of the matrix A .
- C
- C On Return
- C
- C A a block diagonal matrix and the multipliers which
- C were used to obtain it.
- C The factorization can be written A = U*D*CTRANS(U)
- C where U is a product of permutation and unit
- C upper triangular matrices , CTRANS(U) is the
- C conjugate transpose of U , and D is block diagonal
- C with 1 by 1 and 2 by 2 blocks.
- C
- C KVPT INTEGER(N)
- C an integer vector of pivot indices.
- C
- C INFO INTEGER
- C = 0 normal value.
- C = K if the K-th pivot block is singular. This is
- C not an error condition for this subroutine,
- C but it does indicate that CHISL or CHIDI may
- C divide by zero if called.
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CAXPY, CSWAP, ICAMAX
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 891107 Modified routine equivalence list. (WRB)
- C 891107 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CHIFA
- INTEGER LDA,N,KPVT(*),INFO
- COMPLEX A(LDA,*)
- C
- COMPLEX AK,AKM1,BK,BKM1,DENOM,MULK,MULKM1,T
- REAL ABSAKK,ALPHA,COLMAX,ROWMAX
- INTEGER IMAX,IMAXP1,J,JJ,JMAX,K,KM1,KM2,KSTEP,ICAMAX
- LOGICAL SWAP
- COMPLEX ZDUM
- REAL CABS1
- CABS1(ZDUM) = ABS(REAL(ZDUM)) + ABS(AIMAG(ZDUM))
- C***FIRST EXECUTABLE STATEMENT CHIFA
- C
- C INITIALIZE
- C
- C ALPHA IS USED IN CHOOSING PIVOT BLOCK SIZE.
- C
- ALPHA = (1.0E0 + SQRT(17.0E0))/8.0E0
- C
- INFO = 0
- C
- C MAIN LOOP ON K, WHICH GOES FROM N TO 1.
- C
- K = N
- 10 CONTINUE
- C
- C LEAVE THE LOOP IF K=0 OR K=1.
- C
- IF (K .EQ. 0) GO TO 200
- IF (K .GT. 1) GO TO 20
- KPVT(1) = 1
- IF (CABS1(A(1,1)) .EQ. 0.0E0) INFO = 1
- GO TO 200
- 20 CONTINUE
- C
- C THIS SECTION OF CODE DETERMINES THE KIND OF
- C ELIMINATION TO BE PERFORMED. WHEN IT IS COMPLETED,
- C KSTEP WILL BE SET TO THE SIZE OF THE PIVOT BLOCK, AND
- C SWAP WILL BE SET TO .TRUE. IF AN INTERCHANGE IS
- C REQUIRED.
- C
- KM1 = K - 1
- ABSAKK = CABS1(A(K,K))
- C
- C DETERMINE THE LARGEST OFF-DIAGONAL ELEMENT IN
- C COLUMN K.
- C
- IMAX = ICAMAX(K-1,A(1,K),1)
- COLMAX = CABS1(A(IMAX,K))
- IF (ABSAKK .LT. ALPHA*COLMAX) GO TO 30
- KSTEP = 1
- SWAP = .FALSE.
- GO TO 90
- 30 CONTINUE
- C
- C DETERMINE THE LARGEST OFF-DIAGONAL ELEMENT IN
- C ROW IMAX.
- C
- ROWMAX = 0.0E0
- IMAXP1 = IMAX + 1
- DO 40 J = IMAXP1, K
- ROWMAX = MAX(ROWMAX,CABS1(A(IMAX,J)))
- 40 CONTINUE
- IF (IMAX .EQ. 1) GO TO 50
- JMAX = ICAMAX(IMAX-1,A(1,IMAX),1)
- ROWMAX = MAX(ROWMAX,CABS1(A(JMAX,IMAX)))
- 50 CONTINUE
- IF (CABS1(A(IMAX,IMAX)) .LT. ALPHA*ROWMAX) GO TO 60
- KSTEP = 1
- SWAP = .TRUE.
- GO TO 80
- 60 CONTINUE
- IF (ABSAKK .LT. ALPHA*COLMAX*(COLMAX/ROWMAX)) GO TO 70
- KSTEP = 1
- SWAP = .FALSE.
- GO TO 80
- 70 CONTINUE
- KSTEP = 2
- SWAP = IMAX .NE. KM1
- 80 CONTINUE
- 90 CONTINUE
- IF (MAX(ABSAKK,COLMAX) .NE. 0.0E0) GO TO 100
- C
- C COLUMN K IS ZERO. SET INFO AND ITERATE THE LOOP.
- C
- KPVT(K) = K
- INFO = K
- GO TO 190
- 100 CONTINUE
- IF (KSTEP .EQ. 2) GO TO 140
- C
- C 1 X 1 PIVOT BLOCK.
- C
- IF (.NOT.SWAP) GO TO 120
- C
- C PERFORM AN INTERCHANGE.
- C
- CALL CSWAP(IMAX,A(1,IMAX),1,A(1,K),1)
- DO 110 JJ = IMAX, K
- J = K + IMAX - JJ
- T = CONJG(A(J,K))
- A(J,K) = CONJG(A(IMAX,J))
- A(IMAX,J) = T
- 110 CONTINUE
- 120 CONTINUE
- C
- C PERFORM THE ELIMINATION.
- C
- DO 130 JJ = 1, KM1
- J = K - JJ
- MULK = -A(J,K)/A(K,K)
- T = CONJG(MULK)
- CALL CAXPY(J,T,A(1,K),1,A(1,J),1)
- A(J,J) = CMPLX(REAL(A(J,J)),0.0E0)
- A(J,K) = MULK
- 130 CONTINUE
- C
- C SET THE PIVOT ARRAY.
- C
- KPVT(K) = K
- IF (SWAP) KPVT(K) = IMAX
- GO TO 190
- 140 CONTINUE
- C
- C 2 X 2 PIVOT BLOCK.
- C
- IF (.NOT.SWAP) GO TO 160
- C
- C PERFORM AN INTERCHANGE.
- C
- CALL CSWAP(IMAX,A(1,IMAX),1,A(1,K-1),1)
- DO 150 JJ = IMAX, KM1
- J = KM1 + IMAX - JJ
- T = CONJG(A(J,K-1))
- A(J,K-1) = CONJG(A(IMAX,J))
- A(IMAX,J) = T
- 150 CONTINUE
- T = A(K-1,K)
- A(K-1,K) = A(IMAX,K)
- A(IMAX,K) = T
- 160 CONTINUE
- C
- C PERFORM THE ELIMINATION.
- C
- KM2 = K - 2
- IF (KM2 .EQ. 0) GO TO 180
- AK = A(K,K)/A(K-1,K)
- AKM1 = A(K-1,K-1)/CONJG(A(K-1,K))
- DENOM = 1.0E0 - AK*AKM1
- DO 170 JJ = 1, KM2
- J = KM1 - JJ
- BK = A(J,K)/A(K-1,K)
- BKM1 = A(J,K-1)/CONJG(A(K-1,K))
- MULK = (AKM1*BK - BKM1)/DENOM
- MULKM1 = (AK*BKM1 - BK)/DENOM
- T = CONJG(MULK)
- CALL CAXPY(J,T,A(1,K),1,A(1,J),1)
- T = CONJG(MULKM1)
- CALL CAXPY(J,T,A(1,K-1),1,A(1,J),1)
- A(J,K) = MULK
- A(J,K-1) = MULKM1
- A(J,J) = CMPLX(REAL(A(J,J)),0.0E0)
- 170 CONTINUE
- 180 CONTINUE
- C
- C SET THE PIVOT ARRAY.
- C
- KPVT(K) = 1 - K
- IF (SWAP) KPVT(K) = -IMAX
- KPVT(K-1) = KPVT(K)
- 190 CONTINUE
- K = K - KSTEP
- GO TO 10
- 200 CONTINUE
- RETURN
- END
- *DECK CHISL
- SUBROUTINE CHISL (A, LDA, N, KPVT, B)
- C***BEGIN PROLOGUE CHISL
- C***PURPOSE Solve the complex Hermitian system using factors obtained
- C from CHIFA.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D2D1A
- C***TYPE COMPLEX (SSISL-S, DSISL-D, CHISL-C, CSISL-C)
- C***KEYWORDS HERMITIAN, LINEAR ALGEBRA, LINPACK, MATRIX, SOLVE
- C***AUTHOR Bunch, J., (UCSD)
- C***DESCRIPTION
- C
- C CHISL solves the complex Hermitian system
- C A * X = B
- C using the factors computed by CHIFA.
- C
- C On Entry
- C
- C A COMPLEX(LDA,N)
- C the output from CHIFA.
- C
- C LDA INTEGER
- C the leading dimension of the array A .
- C
- C N INTEGER
- C the order of the matrix A .
- C
- C KVPT INTEGER(N)
- C the pivot vector from CHIFA.
- C
- C B COMPLEX(N)
- C the right hand side vector.
- C
- C On Return
- C
- C B the solution vector X .
- C
- C Error Condition
- C
- C A division by zero may occur if CHICO has set RCOND .EQ. 0.0
- C or CHIFA has set INFO .NE. 0 .
- C
- C To compute INVERSE(A) * C where C is a matrix
- C with P columns
- C CALL CHIFA(A,LDA,N,KVPT,INFO)
- C IF (INFO .NE. 0) GO TO ...
- C DO 10 J = 1, p
- C CALL CHISL(A,LDA,N,KVPT,C(1,J))
- C 10 CONTINUE
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CAXPY, CDOTC
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 891107 Modified routine equivalence list. (WRB)
- C 891107 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CHISL
- INTEGER LDA,N,KPVT(*)
- COMPLEX A(LDA,*),B(*)
- C
- COMPLEX AK,AKM1,BK,BKM1,CDOTC,DENOM,TEMP
- INTEGER K,KP
- C
- C LOOP BACKWARD APPLYING THE TRANSFORMATIONS AND
- C D INVERSE TO B.
- C
- C***FIRST EXECUTABLE STATEMENT CHISL
- K = N
- 10 IF (K .EQ. 0) GO TO 80
- IF (KPVT(K) .LT. 0) GO TO 40
- C
- C 1 X 1 PIVOT BLOCK.
- C
- IF (K .EQ. 1) GO TO 30
- KP = KPVT(K)
- IF (KP .EQ. K) GO TO 20
- C
- C INTERCHANGE.
- C
- TEMP = B(K)
- B(K) = B(KP)
- B(KP) = TEMP
- 20 CONTINUE
- C
- C APPLY THE TRANSFORMATION.
- C
- CALL CAXPY(K-1,B(K),A(1,K),1,B(1),1)
- 30 CONTINUE
- C
- C APPLY D INVERSE.
- C
- B(K) = B(K)/A(K,K)
- K = K - 1
- GO TO 70
- 40 CONTINUE
- C
- C 2 X 2 PIVOT BLOCK.
- C
- IF (K .EQ. 2) GO TO 60
- KP = ABS(KPVT(K))
- IF (KP .EQ. K - 1) GO TO 50
- C
- C INTERCHANGE.
- C
- TEMP = B(K-1)
- B(K-1) = B(KP)
- B(KP) = TEMP
- 50 CONTINUE
- C
- C APPLY THE TRANSFORMATION.
- C
- CALL CAXPY(K-2,B(K),A(1,K),1,B(1),1)
- CALL CAXPY(K-2,B(K-1),A(1,K-1),1,B(1),1)
- 60 CONTINUE
- C
- C APPLY D INVERSE.
- C
- AK = A(K,K)/CONJG(A(K-1,K))
- AKM1 = A(K-1,K-1)/A(K-1,K)
- BK = B(K)/CONJG(A(K-1,K))
- BKM1 = B(K-1)/A(K-1,K)
- DENOM = AK*AKM1 - 1.0E0
- B(K) = (AKM1*BK - BKM1)/DENOM
- B(K-1) = (AK*BKM1 - BK)/DENOM
- K = K - 2
- 70 CONTINUE
- GO TO 10
- 80 CONTINUE
- C
- C LOOP FORWARD APPLYING THE TRANSFORMATIONS.
- C
- K = 1
- 90 IF (K .GT. N) GO TO 160
- IF (KPVT(K) .LT. 0) GO TO 120
- C
- C 1 X 1 PIVOT BLOCK.
- C
- IF (K .EQ. 1) GO TO 110
- C
- C APPLY THE TRANSFORMATION.
- C
- B(K) = B(K) + CDOTC(K-1,A(1,K),1,B(1),1)
- KP = KPVT(K)
- IF (KP .EQ. K) GO TO 100
- C
- C INTERCHANGE.
- C
- TEMP = B(K)
- B(K) = B(KP)
- B(KP) = TEMP
- 100 CONTINUE
- 110 CONTINUE
- K = K + 1
- GO TO 150
- 120 CONTINUE
- C
- C 2 X 2 PIVOT BLOCK.
- C
- IF (K .EQ. 1) GO TO 140
- C
- C APPLY THE TRANSFORMATION.
- C
- B(K) = B(K) + CDOTC(K-1,A(1,K),1,B(1),1)
- B(K+1) = B(K+1) + CDOTC(K-1,A(1,K+1),1,B(1),1)
- KP = ABS(KPVT(K))
- IF (KP .EQ. K) GO TO 130
- C
- C INTERCHANGE.
- C
- TEMP = B(K)
- B(K) = B(KP)
- B(KP) = TEMP
- 130 CONTINUE
- 140 CONTINUE
- K = K + 2
- 150 CONTINUE
- GO TO 90
- 160 CONTINUE
- RETURN
- END
- *DECK CHKDER
- SUBROUTINE CHKDER (M, N, X, FVEC, FJAC, LDFJAC, XP, FVECP, MODE,
- + ERR)
- C***BEGIN PROLOGUE CHKDER
- C***PURPOSE Check the gradients of M nonlinear functions in N
- C variables, evaluated at a point X, for consistency
- C with the functions themselves.
- C***LIBRARY SLATEC
- C***CATEGORY F3, G4C
- C***TYPE SINGLE PRECISION (CHKDER-S, DCKDER-D)
- C***KEYWORDS GRADIENTS, JACOBIAN, MINPACK, NONLINEAR
- C***AUTHOR Hiebert, K. L. (SNLA)
- C***DESCRIPTION
- C
- C This subroutine is a companion routine to SNLS1,SNLS1E,SNSQ,and
- C SNSQE which may be used to check the calculation of the Jacobian.
- C
- C SUBROUTINE CHKDER
- C
- C This subroutine checks the gradients of M nonlinear functions
- C in N variables, evaluated at a point X, for consistency with
- C the functions themselves. The user must call CKDER twice,
- C first with MODE = 1 and then with MODE = 2.
- C
- C MODE = 1. On input, X must contain the point of evaluation.
- C On output, XP is set to a neighboring point.
- C
- C MODE = 2. On input, FVEC must contain the functions and the
- C rows of FJAC must contain the gradients
- C of the respective functions each evaluated
- C at X, and FVECP must contain the functions
- C evaluated at XP.
- C On output, ERR contains measures of correctness of
- C the respective gradients.
- C
- C The subroutine does not perform reliably if cancellation or
- C rounding errors cause a severe loss of significance in the
- C evaluation of a function. Therefore, none of the components
- C of X should be unusually small (in particular, zero) or any
- C other value which may cause loss of significance.
- C
- C The SUBROUTINE statement is
- C
- C SUBROUTINE CHKDER(M,N,X,FVEC,FJAC,LDFJAC,XP,FVECP,MODE,ERR)
- C
- C where
- C
- C M is a positive integer input variable set to the number
- C of functions.
- C
- C N is a positive integer input variable set to the number
- C of variables.
- C
- C X is an input array of length N.
- C
- C FVEC is an array of length M. On input when MODE = 2,
- C FVEC must contain the functions evaluated at X.
- C
- C FJAC is an M by N array. On input when MODE = 2,
- C the rows of FJAC must contain the gradients of
- C the respective functions evaluated at X.
- C
- C LDFJAC is a positive integer input parameter not less than M
- C which specifies the leading dimension of the array FJAC.
- C
- C XP is an array of length N. On output when MODE = 1,
- C XP is set to a neighboring point of X.
- C
- C FVECP is an array of length M. On input when MODE = 2,
- C FVECP must contain the functions evaluated at XP.
- C
- C MODE is an integer input variable set to 1 on the first call
- C and 2 on the second. Other values of MODE are equivalent
- C to MODE = 1.
- C
- C ERR is an array of length M. On output when MODE = 2,
- C ERR contains measures of correctness of the respective
- C gradients. If there is no severe loss of significance,
- C then if ERR(I) is 1.0 the I-th gradient is correct,
- C while if ERR(I) is 0.0 the I-th gradient is incorrect.
- C For values of ERR between 0.0 and 1.0, the categorization
- C is less certain. In general, a value of ERR(I) greater
- C than 0.5 indicates that the I-th gradient is probably
- C correct, while a value of ERR(I) less than 0.5 indicates
- C that the I-th gradient is probably incorrect.
- C
- C***REFERENCES M. J. D. Powell, A hybrid method for nonlinear equa-
- C tions. In Numerical Methods for Nonlinear Algebraic
- C Equations, P. Rabinowitz, Editor. Gordon and Breach,
- C 1988.
- C***ROUTINES CALLED R1MACH
- C***REVISION HISTORY (YYMMDD)
- C 800301 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CHKDER
- INTEGER M,N,LDFJAC,MODE
- REAL X(*),FVEC(*),FJAC(LDFJAC,*),XP(*),FVECP(*),ERR(*)
- INTEGER I,J
- REAL EPS,EPSF,EPSLOG,EPSMCH,FACTOR,ONE,TEMP,ZERO
- REAL R1MACH
- SAVE FACTOR, ONE, ZERO
- C
- DATA FACTOR,ONE,ZERO /1.0E2,1.0E0,0.0E0/
- C***FIRST EXECUTABLE STATEMENT CHKDER
- EPSMCH = R1MACH(4)
- C
- EPS = SQRT(EPSMCH)
- C
- IF (MODE .EQ. 2) GO TO 20
- C
- C MODE = 1.
- C
- DO 10 J = 1, N
- TEMP = EPS*ABS(X(J))
- IF (TEMP .EQ. ZERO) TEMP = EPS
- XP(J) = X(J) + TEMP
- 10 CONTINUE
- GO TO 70
- 20 CONTINUE
- C
- C MODE = 2.
- C
- EPSF = FACTOR*EPSMCH
- EPSLOG = LOG10(EPS)
- DO 30 I = 1, M
- ERR(I) = ZERO
- 30 CONTINUE
- DO 50 J = 1, N
- TEMP = ABS(X(J))
- IF (TEMP .EQ. ZERO) TEMP = ONE
- DO 40 I = 1, M
- ERR(I) = ERR(I) + TEMP*FJAC(I,J)
- 40 CONTINUE
- 50 CONTINUE
- DO 60 I = 1, M
- TEMP = ONE
- IF (FVEC(I) .NE. ZERO .AND. FVECP(I) .NE. ZERO
- 1 .AND. ABS(FVECP(I)-FVEC(I)) .GE. EPSF*ABS(FVEC(I)))
- 2 TEMP = EPS*ABS((FVECP(I)-FVEC(I))/EPS-ERR(I))
- 3 /(ABS(FVEC(I)) + ABS(FVECP(I)))
- ERR(I) = ONE
- IF (TEMP .GT. EPSMCH .AND. TEMP .LT. EPS)
- 1 ERR(I) = (LOG10(TEMP) - EPSLOG)/EPSLOG
- IF (TEMP .GE. EPS) ERR(I) = ZERO
- 60 CONTINUE
- 70 CONTINUE
- C
- RETURN
- C
- C LAST CARD OF SUBROUTINE CHKDER.
- C
- END
- *DECK CHKPR4
- SUBROUTINE CHKPR4 (IORDER, A, B, M, MBDCND, C, D, N, NBDCND, COFX,
- + IDMN, IERROR)
- C***BEGIN PROLOGUE CHKPR4
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to SEPX4
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (CHKPR4-S)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C This program checks the input parameters for errors.
- C
- C***SEE ALSO SEPX4
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 801001 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900402 Added TYPE section. (WRB)
- C***END PROLOGUE CHKPR4
- EXTERNAL COFX
- C***FIRST EXECUTABLE STATEMENT CHKPR4
- IERROR = 1
- IF (A.GE.B .OR. C.GE.D) RETURN
- C
- C CHECK BOUNDARY SWITCHES
- C
- IERROR = 2
- IF (MBDCND.LT.0 .OR. MBDCND.GT.4) RETURN
- IERROR = 3
- IF (NBDCND.LT.0 .OR. NBDCND.GT.4) RETURN
- C
- C CHECK FIRST DIMENSION IN CALLING ROUTINE
- C
- IERROR = 5
- IF (IDMN .LT. 7) RETURN
- C
- C CHECK M
- C
- IERROR = 6
- IF (M.GT.(IDMN-1) .OR. M.LT.6) RETURN
- C
- C CHECK N
- C
- IERROR = 7
- IF (N .LT. 5) RETURN
- C
- C CHECK IORDER
- C
- IERROR = 8
- IF (IORDER.NE.2 .AND. IORDER.NE.4) RETURN
- C
- C CHECK THAT EQUATION IS ELLIPTIC
- C
- DLX = (B-A)/M
- DO 30 I=2,M
- XI = A+(I-1)*DLX
- CALL COFX (XI,AI,BI,CI)
- IF (AI.GT.0.0) GO TO 10
- IERROR=10
- RETURN
- 10 CONTINUE
- 30 CONTINUE
- C
- C NO ERROR FOUND
- C
- IERROR = 0
- RETURN
- END
- *DECK CHKPRM
- SUBROUTINE CHKPRM (INTL, IORDER, A, B, M, MBDCND, C, D, N, NBDCND,
- + COFX, COFY, IDMN, IERROR)
- C***BEGIN PROLOGUE CHKPRM
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to SEPELI
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (CHKPRM-S)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C This program checks the input parameters for errors.
- C
- C***SEE ALSO SEPELI
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 801001 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900402 Added TYPE section. (WRB)
- C***END PROLOGUE CHKPRM
- C
- EXTERNAL COFX ,COFY
- C***FIRST EXECUTABLE STATEMENT CHKPRM
- IERROR = 1
- IF (A.GE.B .OR. C.GE.D) RETURN
- C
- C CHECK BOUNDARY SWITCHES
- C
- IERROR = 2
- IF (MBDCND.LT.0 .OR. MBDCND.GT.4) RETURN
- IERROR = 3
- IF (NBDCND.LT.0 .OR. NBDCND.GT.4) RETURN
- C
- C CHECK FIRST DIMENSION IN CALLING ROUTINE
- C
- IERROR = 5
- IF (IDMN .LT. 7) RETURN
- C
- C CHECK M
- C
- IERROR = 6
- IF (M.GT.(IDMN-1) .OR. M.LT.6) RETURN
- C
- C CHECK N
- C
- IERROR = 7
- IF (N .LT. 5) RETURN
- C
- C CHECK IORDER
- C
- IERROR = 8
- IF (IORDER.NE.2 .AND. IORDER.NE.4) RETURN
- C
- C CHECK INTL
- C
- IERROR = 9
- IF (INTL.NE.0 .AND. INTL.NE.1) RETURN
- C
- C CHECK THAT EQUATION IS ELLIPTIC
- C
- DLX = (B-A)/M
- DLY = (D-C)/N
- DO 30 I=2,M
- XI = A+(I-1)*DLX
- CALL COFX (XI,AI,BI,CI)
- DO 20 J=2,N
- YJ = C+(J-1)*DLY
- CALL COFY (YJ,DJ,EJ,FJ)
- IF (AI*DJ .GT. 0.0) GO TO 10
- IERROR = 10
- RETURN
- 10 CONTINUE
- 20 CONTINUE
- 30 CONTINUE
- C
- C NO ERROR FOUND
- C
- IERROR = 0
- RETURN
- END
- *DECK CHKSN4
- SUBROUTINE CHKSN4 (MBDCND, NBDCND, ALPHA, BETA, COFX, SINGLR)
- C***BEGIN PROLOGUE CHKSN4
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to SEPX4
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (CHKSN4-S)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C This subroutine checks if the PDE SEPX4
- C must solve is a singular operator.
- C
- C***SEE ALSO SEPX4
- C***ROUTINES CALLED (NONE)
- C***COMMON BLOCKS SPL4
- C***REVISION HISTORY (YYMMDD)
- C 801001 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900402 Added TYPE section. (WRB)
- C***END PROLOGUE CHKSN4
- C
- COMMON /SPL4/ KSWX ,KSWY ,K ,L ,
- 1 AIT ,BIT ,CIT ,DIT ,
- 2 MIT ,NIT ,IS ,MS ,
- 3 JS ,NS ,DLX ,DLY ,
- 4 TDLX3 ,TDLY3 ,DLX4 ,DLY4
- LOGICAL SINGLR
- EXTERNAL COFX
- C***FIRST EXECUTABLE STATEMENT CHKSN4
- SINGLR = .FALSE.
- C
- C CHECK IF THE BOUNDARY CONDITIONS ARE
- C ENTIRELY PERIODIC AND/OR MIXED
- C
- IF ((MBDCND.NE.0 .AND. MBDCND.NE.3) .OR.
- 1 (NBDCND.NE.0 .AND. NBDCND.NE.3)) RETURN
- C
- C CHECK THAT MIXED CONDITIONS ARE PURE NEUMAN
- C
- IF (MBDCND .NE. 3) GO TO 10
- IF (ALPHA.NE.0.0 .OR. BETA.NE.0.0) RETURN
- 10 CONTINUE
- C
- C CHECK THAT NON-DERIVATIVE COEFFICIENT FUNCTIONS
- C ARE ZERO
- C
- DO 30 I=IS,MS
- XI = AIT+(I-1)*DLX
- CALL COFX (XI,AI,BI,CI)
- IF (CI .NE. 0.0) RETURN
- 30 CONTINUE
- C
- C THE OPERATOR MUST BE SINGULAR IF THIS POINT IS REACHED
- C
- SINGLR = .TRUE.
- RETURN
- END
- *DECK CHKSNG
- SUBROUTINE CHKSNG (MBDCND, NBDCND, ALPHA, BETA, GAMA, XNU, COFX,
- + COFY, SINGLR)
- C***BEGIN PROLOGUE CHKSNG
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to SEPELI
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (CHKSNG-S)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C This subroutine checks if the PDE SEPELI
- C must solve is a singular operator.
- C
- C***SEE ALSO SEPELI
- C***ROUTINES CALLED (NONE)
- C***COMMON BLOCKS SPLPCM
- C***REVISION HISTORY (YYMMDD)
- C 801001 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900402 Added TYPE section. (WRB)
- C***END PROLOGUE CHKSNG
- C
- COMMON /SPLPCM/ KSWX ,KSWY ,K ,L ,
- 1 AIT ,BIT ,CIT ,DIT ,
- 2 MIT ,NIT ,IS ,MS ,
- 3 JS ,NS ,DLX ,DLY ,
- 4 TDLX3 ,TDLY3 ,DLX4 ,DLY4
- LOGICAL SINGLR
- C***FIRST EXECUTABLE STATEMENT CHKSNG
- SINGLR = .FALSE.
- C
- C CHECK IF THE BOUNDARY CONDITIONS ARE
- C ENTIRELY PERIODIC AND/OR MIXED
- C
- IF ((MBDCND.NE.0 .AND. MBDCND.NE.3) .OR.
- 1 (NBDCND.NE.0 .AND. NBDCND.NE.3)) RETURN
- C
- C CHECK THAT MIXED CONDITIONS ARE PURE NEUMAN
- C
- IF (MBDCND .NE. 3) GO TO 10
- IF (ALPHA.NE.0.0 .OR. BETA.NE.0.0) RETURN
- 10 IF (NBDCND .NE. 3) GO TO 20
- IF (GAMA.NE.0.0 .OR. XNU.NE.0.0) RETURN
- 20 CONTINUE
- C
- C CHECK THAT NON-DERIVATIVE COEFFICIENT FUNCTIONS
- C ARE ZERO
- C
- DO 30 I=IS,MS
- XI = AIT+(I-1)*DLX
- CALL COFX (XI,AI,BI,CI)
- IF (CI .NE. 0.0) RETURN
- 30 CONTINUE
- DO 40 J=JS,NS
- YJ = CIT+(J-1)*DLY
- CALL COFY (YJ,DJ,EJ,FJ)
- IF (FJ .NE. 0.0) RETURN
- 40 CONTINUE
- C
- C THE OPERATOR MUST BE SINGULAR IF THIS POINT IS REACHED
- C
- SINGLR = .TRUE.
- RETURN
- END
- *DECK CHPCO
- SUBROUTINE CHPCO (AP, N, KPVT, RCOND, Z)
- C***BEGIN PROLOGUE CHPCO
- C***PURPOSE Factor a complex Hermitian matrix stored in packed form by
- C elimination with symmetric pivoting and estimate the
- C condition number of the matrix.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D2D1A
- C***TYPE COMPLEX (SSPCO-S, DSPCO-D, CHPCO-C, CSPCO-C)
- C***KEYWORDS CONDITION NUMBER, HERMITIAN, LINEAR ALGEBRA, LINPACK,
- C MATRIX FACTORIZATION, PACKED
- C***AUTHOR Moler, C. B., (U. of New Mexico)
- C***DESCRIPTION
- C
- C CHPCO factors a complex Hermitian matrix stored in packed
- C form by elimination with symmetric pivoting and estimates
- C the condition of the matrix.
- C
- C if RCOND is not needed, CHPFA is slightly faster.
- C To solve A*X = B , follow CHPCO by CHPSL.
- C To compute INVERSE(A)*C , follow CHPCO by CHPSL.
- C To compute INVERSE(A) , follow CHPCO by CHPDI.
- C To compute DETERMINANT(A) , follow CHPCO by CHPDI.
- C To compute INERTIA(A), follow CHPCO by CHPDI.
- C
- C On Entry
- C
- C AP COMPLEX (N*(N+1)/2)
- C the packed form of a Hermitian matrix A . The
- C columns of the upper triangle are stored sequentially
- C in a one-dimensional array of length N*(N+1)/2 .
- C See comments below for details.
- C
- C N INTEGER
- C the order of the matrix A .
- C
- C Output
- C
- C AP a block diagonal matrix and the multipliers which
- C were used to obtain it stored in packed form.
- C The factorization can be written A = U*D*CTRANS(U)
- C where U is a product of permutation and unit
- C upper triangular matrices , CTRANS(U) is the
- C conjugate transpose of U , and D is block diagonal
- C with 1 by 1 and 2 by 2 blocks.
- C
- C KVPT INTEGER(N)
- C an integer vector of pivot indices.
- C
- C RCOND REAL
- C an estimate of the reciprocal condition of A .
- C For the system A*X = B , relative perturbations
- C in A and B of size EPSILON may cause
- C relative perturbations in X of size EPSILON/RCOND .
- C If RCOND is so small that the logical expression
- C 1.0 + RCOND .EQ. 1.0
- C is true, then A may be singular to working
- C precision. In particular, RCOND is zero if
- C exact singularity is detected or the estimate
- C underflows.
- C
- C Z COMPLEX(N)
- C a work vector whose contents are usually unimportant.
- C If A is close to a singular matrix, then Z is
- C an approximate null vector in the sense that
- C NORM(A*Z) = RCOND*NORM(A)*NORM(Z) .
- C
- C Packed Storage
- C
- C The following program segment will pack the upper
- C triangle of a Hermitian matrix.
- C
- C K = 0
- C DO 20 J = 1, N
- C DO 10 I = 1, J
- C K = K + 1
- C AP(K) = A(I,J)
- C 10 CONTINUE
- C 20 CONTINUE
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CAXPY, CDOTC, CHPFA, CSSCAL, SCASUM
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 891107 Modified routine equivalence list. (WRB)
- C 891107 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CHPCO
- INTEGER N,KPVT(*)
- COMPLEX AP(*),Z(*)
- REAL RCOND
- C
- COMPLEX AK,AKM1,BK,BKM1,CDOTC,DENOM,EK,T
- REAL ANORM,S,SCASUM,YNORM
- INTEGER I,IJ,IK,IKM1,IKP1,INFO,J,JM1,J1
- INTEGER K,KK,KM1K,KM1KM1,KP,KPS,KS
- COMPLEX ZDUM,ZDUM2,CSIGN1
- REAL CABS1
- CABS1(ZDUM) = ABS(REAL(ZDUM)) + ABS(AIMAG(ZDUM))
- CSIGN1(ZDUM,ZDUM2) = CABS1(ZDUM)*(ZDUM2/CABS1(ZDUM2))
- C
- C FIND NORM OF A USING ONLY UPPER HALF
- C
- C***FIRST EXECUTABLE STATEMENT CHPCO
- J1 = 1
- DO 30 J = 1, N
- Z(J) = CMPLX(SCASUM(J,AP(J1),1),0.0E0)
- IJ = J1
- J1 = J1 + J
- JM1 = J - 1
- IF (JM1 .LT. 1) GO TO 20
- DO 10 I = 1, JM1
- Z(I) = CMPLX(REAL(Z(I))+CABS1(AP(IJ)),0.0E0)
- IJ = IJ + 1
- 10 CONTINUE
- 20 CONTINUE
- 30 CONTINUE
- ANORM = 0.0E0
- DO 40 J = 1, N
- ANORM = MAX(ANORM,REAL(Z(J)))
- 40 CONTINUE
- C
- C FACTOR
- C
- CALL CHPFA(AP,N,KPVT,INFO)
- C
- C RCOND = 1/(NORM(A)*(ESTIMATE OF NORM(INVERSE(A)))) .
- C ESTIMATE = NORM(Z)/NORM(Y) WHERE A*Z = Y AND A*Y = E .
- C THE COMPONENTS OF E ARE CHOSEN TO CAUSE MAXIMUM LOCAL
- C GROWTH IN THE ELEMENTS OF W WHERE U*D*W = E .
- C THE VECTORS ARE FREQUENTLY RESCALED TO AVOID OVERFLOW.
- C
- C SOLVE U*D*W = E
- C
- EK = (1.0E0,0.0E0)
- DO 50 J = 1, N
- Z(J) = (0.0E0,0.0E0)
- 50 CONTINUE
- K = N
- IK = (N*(N - 1))/2
- 60 IF (K .EQ. 0) GO TO 120
- KK = IK + K
- IKM1 = IK - (K - 1)
- KS = 1
- IF (KPVT(K) .LT. 0) KS = 2
- KP = ABS(KPVT(K))
- KPS = K + 1 - KS
- IF (KP .EQ. KPS) GO TO 70
- T = Z(KPS)
- Z(KPS) = Z(KP)
- Z(KP) = T
- 70 CONTINUE
- IF (CABS1(Z(K)) .NE. 0.0E0) EK = CSIGN1(EK,Z(K))
- Z(K) = Z(K) + EK
- CALL CAXPY(K-KS,Z(K),AP(IK+1),1,Z(1),1)
- IF (KS .EQ. 1) GO TO 80
- IF (CABS1(Z(K-1)) .NE. 0.0E0) EK = CSIGN1(EK,Z(K-1))
- Z(K-1) = Z(K-1) + EK
- CALL CAXPY(K-KS,Z(K-1),AP(IKM1+1),1,Z(1),1)
- 80 CONTINUE
- IF (KS .EQ. 2) GO TO 100
- IF (CABS1(Z(K)) .LE. CABS1(AP(KK))) GO TO 90
- S = CABS1(AP(KK))/CABS1(Z(K))
- CALL CSSCAL(N,S,Z,1)
- EK = CMPLX(S,0.0E0)*EK
- 90 CONTINUE
- IF (CABS1(AP(KK)) .NE. 0.0E0) Z(K) = Z(K)/AP(KK)
- IF (CABS1(AP(KK)) .EQ. 0.0E0) Z(K) = (1.0E0,0.0E0)
- GO TO 110
- 100 CONTINUE
- KM1K = IK + K - 1
- KM1KM1 = IKM1 + K - 1
- AK = AP(KK)/CONJG(AP(KM1K))
- AKM1 = AP(KM1KM1)/AP(KM1K)
- BK = Z(K)/CONJG(AP(KM1K))
- BKM1 = Z(K-1)/AP(KM1K)
- DENOM = AK*AKM1 - 1.0E0
- Z(K) = (AKM1*BK - BKM1)/DENOM
- Z(K-1) = (AK*BKM1 - BK)/DENOM
- 110 CONTINUE
- K = K - KS
- IK = IK - K
- IF (KS .EQ. 2) IK = IK - (K + 1)
- GO TO 60
- 120 CONTINUE
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- C
- C SOLVE CTRANS(U)*Y = W
- C
- K = 1
- IK = 0
- 130 IF (K .GT. N) GO TO 160
- KS = 1
- IF (KPVT(K) .LT. 0) KS = 2
- IF (K .EQ. 1) GO TO 150
- Z(K) = Z(K) + CDOTC(K-1,AP(IK+1),1,Z(1),1)
- IKP1 = IK + K
- IF (KS .EQ. 2)
- 1 Z(K+1) = Z(K+1) + CDOTC(K-1,AP(IKP1+1),1,Z(1),1)
- KP = ABS(KPVT(K))
- IF (KP .EQ. K) GO TO 140
- T = Z(K)
- Z(K) = Z(KP)
- Z(KP) = T
- 140 CONTINUE
- 150 CONTINUE
- IK = IK + K
- IF (KS .EQ. 2) IK = IK + (K + 1)
- K = K + KS
- GO TO 130
- 160 CONTINUE
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- C
- YNORM = 1.0E0
- C
- C SOLVE U*D*V = Y
- C
- K = N
- IK = N*(N - 1)/2
- 170 IF (K .EQ. 0) GO TO 230
- KK = IK + K
- IKM1 = IK - (K - 1)
- KS = 1
- IF (KPVT(K) .LT. 0) KS = 2
- IF (K .EQ. KS) GO TO 190
- KP = ABS(KPVT(K))
- KPS = K + 1 - KS
- IF (KP .EQ. KPS) GO TO 180
- T = Z(KPS)
- Z(KPS) = Z(KP)
- Z(KP) = T
- 180 CONTINUE
- CALL CAXPY(K-KS,Z(K),AP(IK+1),1,Z(1),1)
- IF (KS .EQ. 2) CALL CAXPY(K-KS,Z(K-1),AP(IKM1+1),1,Z(1),1)
- 190 CONTINUE
- IF (KS .EQ. 2) GO TO 210
- IF (CABS1(Z(K)) .LE. CABS1(AP(KK))) GO TO 200
- S = CABS1(AP(KK))/CABS1(Z(K))
- CALL CSSCAL(N,S,Z,1)
- YNORM = S*YNORM
- 200 CONTINUE
- IF (CABS1(AP(KK)) .NE. 0.0E0) Z(K) = Z(K)/AP(KK)
- IF (CABS1(AP(KK)) .EQ. 0.0E0) Z(K) = (1.0E0,0.0E0)
- GO TO 220
- 210 CONTINUE
- KM1K = IK + K - 1
- KM1KM1 = IKM1 + K - 1
- AK = AP(KK)/CONJG(AP(KM1K))
- AKM1 = AP(KM1KM1)/AP(KM1K)
- BK = Z(K)/CONJG(AP(KM1K))
- BKM1 = Z(K-1)/AP(KM1K)
- DENOM = AK*AKM1 - 1.0E0
- Z(K) = (AKM1*BK - BKM1)/DENOM
- Z(K-1) = (AK*BKM1 - BK)/DENOM
- 220 CONTINUE
- K = K - KS
- IK = IK - K
- IF (KS .EQ. 2) IK = IK - (K + 1)
- GO TO 170
- 230 CONTINUE
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- YNORM = S*YNORM
- C
- C SOLVE CTRANS(U)*Z = V
- C
- K = 1
- IK = 0
- 240 IF (K .GT. N) GO TO 270
- KS = 1
- IF (KPVT(K) .LT. 0) KS = 2
- IF (K .EQ. 1) GO TO 260
- Z(K) = Z(K) + CDOTC(K-1,AP(IK+1),1,Z(1),1)
- IKP1 = IK + K
- IF (KS .EQ. 2)
- 1 Z(K+1) = Z(K+1) + CDOTC(K-1,AP(IKP1+1),1,Z(1),1)
- KP = ABS(KPVT(K))
- IF (KP .EQ. K) GO TO 250
- T = Z(K)
- Z(K) = Z(KP)
- Z(KP) = T
- 250 CONTINUE
- 260 CONTINUE
- IK = IK + K
- IF (KS .EQ. 2) IK = IK + (K + 1)
- K = K + KS
- GO TO 240
- 270 CONTINUE
- C MAKE ZNORM = 1.0
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- YNORM = S*YNORM
- C
- IF (ANORM .NE. 0.0E0) RCOND = YNORM/ANORM
- IF (ANORM .EQ. 0.0E0) RCOND = 0.0E0
- RETURN
- END
- *DECK CHPDI
- SUBROUTINE CHPDI (AP, N, KPVT, DET, INERT, WORK, JOB)
- C***BEGIN PROLOGUE CHPDI
- C***PURPOSE Compute the determinant, inertia and inverse of a complex
- C Hermitian matrix stored in packed form using the factors
- C obtained from CHPFA.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D2D1A, D3D1A
- C***TYPE COMPLEX (SSPDI-S, DSPDI-D, CHPDI-C, DSPDI-C)
- C***KEYWORDS DETERMINANT, HERMITIAN, INVERSE, LINEAR ALGEBRA, LINPACK,
- C MATRIX, PACKED
- C***AUTHOR Bunch, J., (UCSD)
- C***DESCRIPTION
- C
- C CHPDI computes the determinant, inertia and inverse
- C of a complex Hermitian matrix using the factors from CHPFA,
- C where the matrix is stored in packed form.
- C
- C On Entry
- C
- C AP COMPLEX (N*(N+1)/2)
- C the output from CHPFA.
- C
- C N INTEGER
- C the order of the matrix A.
- C
- C KVPT INTEGER(N)
- C the pivot vector from CHPFA.
- C
- C WORK COMPLEX(N)
- C work vector. Contents ignored.
- C
- C JOB INTEGER
- C JOB has the decimal expansion ABC where
- C if C .NE. 0, the inverse is computed,
- C if B .NE. 0, the determinant is computed,
- C if A .NE. 0, the inertia is computed.
- C
- C For example, JOB = 111 gives all three.
- C
- C On Return
- C
- C Variables not requested by JOB are not used.
- C
- C AP contains the upper triangle of the inverse of
- C the original matrix, stored in packed form.
- C The columns of the upper triangle are stored
- C sequentially in a one-dimensional array.
- C
- C DET REAL(2)
- C determinant of original matrix.
- C Determinant = DET(1) * 10.0**DET(2)
- C with 1.0 .LE. ABS(DET(1)) .LT. 10.0
- C or DET(1) = 0.0.
- C
- C INERT INTEGER(3)
- C the inertia of the original matrix.
- C INERT(1) = number of positive eigenvalues.
- C INERT(2) = number of negative eigenvalues.
- C INERT(3) = number of zero eigenvalues.
- C
- C Error Condition
- C
- C A division by zero will occur if the inverse is requested
- C and CHPCO has set RCOND .EQ. 0.0
- C or CHPFA has set INFO .NE. 0 .
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CAXPY, CCOPY, CDOTC, CSWAP
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 891107 Modified routine equivalence list. (WRB)
- C 891107 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CHPDI
- INTEGER N,JOB
- COMPLEX AP(*),WORK(*)
- REAL DET(2)
- INTEGER KPVT(*),INERT(3)
- C
- COMPLEX AKKP1,CDOTC,TEMP
- REAL TEN,D,T,AK,AKP1
- INTEGER IJ,IK,IKP1,IKS,J,JB,JK,JKP1
- INTEGER K,KK,KKP1,KM1,KS,KSJ,KSKP1,KSTEP
- LOGICAL NOINV,NODET,NOERT
- C***FIRST EXECUTABLE STATEMENT CHPDI
- NOINV = MOD(JOB,10) .EQ. 0
- NODET = MOD(JOB,100)/10 .EQ. 0
- NOERT = MOD(JOB,1000)/100 .EQ. 0
- C
- IF (NODET .AND. NOERT) GO TO 140
- IF (NOERT) GO TO 10
- INERT(1) = 0
- INERT(2) = 0
- INERT(3) = 0
- 10 CONTINUE
- IF (NODET) GO TO 20
- DET(1) = 1.0E0
- DET(2) = 0.0E0
- TEN = 10.0E0
- 20 CONTINUE
- T = 0.0E0
- IK = 0
- DO 130 K = 1, N
- KK = IK + K
- D = REAL(AP(KK))
- C
- C CHECK IF 1 BY 1
- C
- IF (KPVT(K) .GT. 0) GO TO 50
- C
- C 2 BY 2 BLOCK
- C USE DET (D S) = (D/T * C - T) * T , T = ABS(S)
- C (S C)
- C TO AVOID UNDERFLOW/OVERFLOW TROUBLES.
- C TAKE TWO PASSES THROUGH SCALING. USE T FOR FLAG.
- C
- IF (T .NE. 0.0E0) GO TO 30
- IKP1 = IK + K
- KKP1 = IKP1 + K
- T = ABS(AP(KKP1))
- D = (D/T)*REAL(AP(KKP1+1)) - T
- GO TO 40
- 30 CONTINUE
- D = T
- T = 0.0E0
- 40 CONTINUE
- 50 CONTINUE
- C
- IF (NOERT) GO TO 60
- IF (D .GT. 0.0E0) INERT(1) = INERT(1) + 1
- IF (D .LT. 0.0E0) INERT(2) = INERT(2) + 1
- IF (D .EQ. 0.0E0) INERT(3) = INERT(3) + 1
- 60 CONTINUE
- C
- IF (NODET) GO TO 120
- DET(1) = D*DET(1)
- IF (DET(1) .EQ. 0.0E0) GO TO 110
- 70 IF (ABS(DET(1)) .GE. 1.0E0) GO TO 80
- DET(1) = TEN*DET(1)
- DET(2) = DET(2) - 1.0E0
- GO TO 70
- 80 CONTINUE
- 90 IF (ABS(DET(1)) .LT. TEN) GO TO 100
- DET(1) = DET(1)/TEN
- DET(2) = DET(2) + 1.0E0
- GO TO 90
- 100 CONTINUE
- 110 CONTINUE
- 120 CONTINUE
- IK = IK + K
- 130 CONTINUE
- 140 CONTINUE
- C
- C COMPUTE INVERSE(A)
- C
- IF (NOINV) GO TO 270
- K = 1
- IK = 0
- 150 IF (K .GT. N) GO TO 260
- KM1 = K - 1
- KK = IK + K
- IKP1 = IK + K
- KKP1 = IKP1 + K
- IF (KPVT(K) .LT. 0) GO TO 180
- C
- C 1 BY 1
- C
- AP(KK) = CMPLX(1.0E0/REAL(AP(KK)),0.0E0)
- IF (KM1 .LT. 1) GO TO 170
- CALL CCOPY(KM1,AP(IK+1),1,WORK,1)
- IJ = 0
- DO 160 J = 1, KM1
- JK = IK + J
- AP(JK) = CDOTC(J,AP(IJ+1),1,WORK,1)
- CALL CAXPY(J-1,WORK(J),AP(IJ+1),1,AP(IK+1),1)
- IJ = IJ + J
- 160 CONTINUE
- AP(KK) = AP(KK)
- 1 + CMPLX(REAL(CDOTC(KM1,WORK,1,AP(IK+1),1)),
- 2 0.0E0)
- 170 CONTINUE
- KSTEP = 1
- GO TO 220
- 180 CONTINUE
- C
- C 2 BY 2
- C
- T = ABS(AP(KKP1))
- AK = REAL(AP(KK))/T
- AKP1 = REAL(AP(KKP1+1))/T
- AKKP1 = AP(KKP1)/T
- D = T*(AK*AKP1 - 1.0E0)
- AP(KK) = CMPLX(AKP1/D,0.0E0)
- AP(KKP1+1) = CMPLX(AK/D,0.0E0)
- AP(KKP1) = -AKKP1/D
- IF (KM1 .LT. 1) GO TO 210
- CALL CCOPY(KM1,AP(IKP1+1),1,WORK,1)
- IJ = 0
- DO 190 J = 1, KM1
- JKP1 = IKP1 + J
- AP(JKP1) = CDOTC(J,AP(IJ+1),1,WORK,1)
- CALL CAXPY(J-1,WORK(J),AP(IJ+1),1,AP(IKP1+1),1)
- IJ = IJ + J
- 190 CONTINUE
- AP(KKP1+1) = AP(KKP1+1)
- 1 + CMPLX(REAL(CDOTC(KM1,WORK,1,
- 2 AP(IKP1+1),1)),0.0E0)
- AP(KKP1) = AP(KKP1)
- 1 + CDOTC(KM1,AP(IK+1),1,AP(IKP1+1),1)
- CALL CCOPY(KM1,AP(IK+1),1,WORK,1)
- IJ = 0
- DO 200 J = 1, KM1
- JK = IK + J
- AP(JK) = CDOTC(J,AP(IJ+1),1,WORK,1)
- CALL CAXPY(J-1,WORK(J),AP(IJ+1),1,AP(IK+1),1)
- IJ = IJ + J
- 200 CONTINUE
- AP(KK) = AP(KK)
- 1 + CMPLX(REAL(CDOTC(KM1,WORK,1,AP(IK+1),1)),
- 2 0.0E0)
- 210 CONTINUE
- KSTEP = 2
- 220 CONTINUE
- C
- C SWAP
- C
- KS = ABS(KPVT(K))
- IF (KS .EQ. K) GO TO 250
- IKS = (KS*(KS - 1))/2
- CALL CSWAP(KS,AP(IKS+1),1,AP(IK+1),1)
- KSJ = IK + KS
- DO 230 JB = KS, K
- J = K + KS - JB
- JK = IK + J
- TEMP = CONJG(AP(JK))
- AP(JK) = CONJG(AP(KSJ))
- AP(KSJ) = TEMP
- KSJ = KSJ - (J - 1)
- 230 CONTINUE
- IF (KSTEP .EQ. 1) GO TO 240
- KSKP1 = IKP1 + KS
- TEMP = AP(KSKP1)
- AP(KSKP1) = AP(KKP1)
- AP(KKP1) = TEMP
- 240 CONTINUE
- 250 CONTINUE
- IK = IK + K
- IF (KSTEP .EQ. 2) IK = IK + K + 1
- K = K + KSTEP
- GO TO 150
- 260 CONTINUE
- 270 CONTINUE
- RETURN
- END
- *DECK CHPFA
- SUBROUTINE CHPFA (AP, N, KPVT, INFO)
- C***BEGIN PROLOGUE CHPFA
- C***PURPOSE Factor a complex Hermitian matrix stored in packed form by
- C elimination with symmetric pivoting.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D2D1A
- C***TYPE COMPLEX (SSPFA-S, DSPFA-D, CHPFA-C, DSPFA-C)
- C***KEYWORDS HERMITIAN, LINEAR ALGEBRA, LINPACK, MATRIX FACTORIZATION,
- C PACKED
- C***AUTHOR Bunch, J., (UCSD)
- C***DESCRIPTION
- C
- C CHPFA factors a complex Hermitian matrix stored in
- C packed form by elimination with symmetric pivoting.
- C
- C To solve A*X = B , follow CHPFA by CHPSL.
- C To compute INVERSE(A)*C , follow CHPFA by CHPSL.
- C To compute DETERMINANT(A) , follow CHPFA by CHPDI.
- C To compute INERTIA(A) , follow CHPFA by CHPDI.
- C To compute INVERSE(A) , follow CHPFA by CHPDI.
- C
- C On Entry
- C
- C AP COMPLEX (N*(N+1)/2)
- C the packed form of a Hermitian matrix A . The
- C columns of the upper triangle are stored sequentially
- C in a one-dimensional array of length N*(N+1)/2 .
- C See comments below for details.
- C
- C N INTEGER
- C the order of the matrix A .
- C
- C Output
- C
- C AP A block diagonal matrix and the multipliers which
- C were used to obtain it stored in packed form.
- C The factorization can be written A = U*D*CTRANS(U)
- C where U is a product of permutation and unit
- C upper triangular matrices , CTRANS(U) is the
- C conjugate transpose of U , and D is block diagonal
- C with 1 by 1 and 2 by 2 blocks.
- C
- C KVPT INTEGER(N)
- C an integer vector of pivot indices.
- C
- C INFO INTEGER
- C = 0 normal value.
- C = K if the K-th pivot block is singular. This is
- C not an error condition for this subroutine,
- C but it does indicate that CHPSL or CHPDI may
- C divide by zero if called.
- C
- C Packed Storage
- C
- C The following program segment will pack the upper
- C triangle of a Hermitian matrix.
- C
- C K = 0
- C DO 20 J = 1, N
- C DO 10 I = 1, J
- C K = K + 1
- C AP(K) = A(I,J)
- C 10 CONTINUE
- C 20 CONTINUE
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CAXPY, CSWAP, ICAMAX
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 891107 Modified routine equivalence list. (WRB)
- C 891107 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CHPFA
- INTEGER N,KPVT(*),INFO
- COMPLEX AP(*)
- C
- COMPLEX AK,AKM1,BK,BKM1,DENOM,MULK,MULKM1,T
- REAL ABSAKK,ALPHA,COLMAX,ROWMAX
- INTEGER ICAMAX,IJ,IJJ,IK,IKM1,IM,IMAX,IMAXP1,IMIM,IMJ,IMK
- INTEGER J,JJ,JK,JKM1,JMAX,JMIM,K,KK,KM1,KM1K,KM1KM1,KM2,KSTEP
- LOGICAL SWAP
- COMPLEX ZDUM
- REAL CABS1
- CABS1(ZDUM) = ABS(REAL(ZDUM)) + ABS(AIMAG(ZDUM))
- C***FIRST EXECUTABLE STATEMENT CHPFA
- C
- C INITIALIZE
- C
- C ALPHA IS USED IN CHOOSING PIVOT BLOCK SIZE.
- C
- ALPHA = (1.0E0 + SQRT(17.0E0))/8.0E0
- C
- INFO = 0
- C
- C MAIN LOOP ON K, WHICH GOES FROM N TO 1.
- C
- K = N
- IK = (N*(N - 1))/2
- 10 CONTINUE
- C
- C LEAVE THE LOOP IF K=0 OR K=1.
- C
- IF (K .EQ. 0) GO TO 200
- IF (K .GT. 1) GO TO 20
- KPVT(1) = 1
- IF (CABS1(AP(1)) .EQ. 0.0E0) INFO = 1
- GO TO 200
- 20 CONTINUE
- C
- C THIS SECTION OF CODE DETERMINES THE KIND OF
- C ELIMINATION TO BE PERFORMED. WHEN IT IS COMPLETED,
- C KSTEP WILL BE SET TO THE SIZE OF THE PIVOT BLOCK, AND
- C SWAP WILL BE SET TO .TRUE. IF AN INTERCHANGE IS
- C REQUIRED.
- C
- KM1 = K - 1
- KK = IK + K
- ABSAKK = CABS1(AP(KK))
- C
- C DETERMINE THE LARGEST OFF-DIAGONAL ELEMENT IN
- C COLUMN K.
- C
- IMAX = ICAMAX(K-1,AP(IK+1),1)
- IMK = IK + IMAX
- COLMAX = CABS1(AP(IMK))
- IF (ABSAKK .LT. ALPHA*COLMAX) GO TO 30
- KSTEP = 1
- SWAP = .FALSE.
- GO TO 90
- 30 CONTINUE
- C
- C DETERMINE THE LARGEST OFF-DIAGONAL ELEMENT IN
- C ROW IMAX.
- C
- ROWMAX = 0.0E0
- IMAXP1 = IMAX + 1
- IM = IMAX*(IMAX - 1)/2
- IMJ = IM + 2*IMAX
- DO 40 J = IMAXP1, K
- ROWMAX = MAX(ROWMAX,CABS1(AP(IMJ)))
- IMJ = IMJ + J
- 40 CONTINUE
- IF (IMAX .EQ. 1) GO TO 50
- JMAX = ICAMAX(IMAX-1,AP(IM+1),1)
- JMIM = JMAX + IM
- ROWMAX = MAX(ROWMAX,CABS1(AP(JMIM)))
- 50 CONTINUE
- IMIM = IMAX + IM
- IF (CABS1(AP(IMIM)) .LT. ALPHA*ROWMAX) GO TO 60
- KSTEP = 1
- SWAP = .TRUE.
- GO TO 80
- 60 CONTINUE
- IF (ABSAKK .LT. ALPHA*COLMAX*(COLMAX/ROWMAX)) GO TO 70
- KSTEP = 1
- SWAP = .FALSE.
- GO TO 80
- 70 CONTINUE
- KSTEP = 2
- SWAP = IMAX .NE. KM1
- 80 CONTINUE
- 90 CONTINUE
- IF (MAX(ABSAKK,COLMAX) .NE. 0.0E0) GO TO 100
- C
- C COLUMN K IS ZERO. SET INFO AND ITERATE THE LOOP.
- C
- KPVT(K) = K
- INFO = K
- GO TO 190
- 100 CONTINUE
- IF (KSTEP .EQ. 2) GO TO 140
- C
- C 1 X 1 PIVOT BLOCK.
- C
- IF (.NOT.SWAP) GO TO 120
- C
- C PERFORM AN INTERCHANGE.
- C
- CALL CSWAP(IMAX,AP(IM+1),1,AP(IK+1),1)
- IMJ = IK + IMAX
- DO 110 JJ = IMAX, K
- J = K + IMAX - JJ
- JK = IK + J
- T = CONJG(AP(JK))
- AP(JK) = CONJG(AP(IMJ))
- AP(IMJ) = T
- IMJ = IMJ - (J - 1)
- 110 CONTINUE
- 120 CONTINUE
- C
- C PERFORM THE ELIMINATION.
- C
- IJ = IK - (K - 1)
- DO 130 JJ = 1, KM1
- J = K - JJ
- JK = IK + J
- MULK = -AP(JK)/AP(KK)
- T = CONJG(MULK)
- CALL CAXPY(J,T,AP(IK+1),1,AP(IJ+1),1)
- IJJ = IJ + J
- AP(IJJ) = CMPLX(REAL(AP(IJJ)),0.0E0)
- AP(JK) = MULK
- IJ = IJ - (J - 1)
- 130 CONTINUE
- C
- C SET THE PIVOT ARRAY.
- C
- KPVT(K) = K
- IF (SWAP) KPVT(K) = IMAX
- GO TO 190
- 140 CONTINUE
- C
- C 2 X 2 PIVOT BLOCK.
- C
- KM1K = IK + K - 1
- IKM1 = IK - (K - 1)
- IF (.NOT.SWAP) GO TO 160
- C
- C PERFORM AN INTERCHANGE.
- C
- CALL CSWAP(IMAX,AP(IM+1),1,AP(IKM1+1),1)
- IMJ = IKM1 + IMAX
- DO 150 JJ = IMAX, KM1
- J = KM1 + IMAX - JJ
- JKM1 = IKM1 + J
- T = CONJG(AP(JKM1))
- AP(JKM1) = CONJG(AP(IMJ))
- AP(IMJ) = T
- IMJ = IMJ - (J - 1)
- 150 CONTINUE
- T = AP(KM1K)
- AP(KM1K) = AP(IMK)
- AP(IMK) = T
- 160 CONTINUE
- C
- C PERFORM THE ELIMINATION.
- C
- KM2 = K - 2
- IF (KM2 .EQ. 0) GO TO 180
- AK = AP(KK)/AP(KM1K)
- KM1KM1 = IKM1 + K - 1
- AKM1 = AP(KM1KM1)/CONJG(AP(KM1K))
- DENOM = 1.0E0 - AK*AKM1
- IJ = IK - (K - 1) - (K - 2)
- DO 170 JJ = 1, KM2
- J = KM1 - JJ
- JK = IK + J
- BK = AP(JK)/AP(KM1K)
- JKM1 = IKM1 + J
- BKM1 = AP(JKM1)/CONJG(AP(KM1K))
- MULK = (AKM1*BK - BKM1)/DENOM
- MULKM1 = (AK*BKM1 - BK)/DENOM
- T = CONJG(MULK)
- CALL CAXPY(J,T,AP(IK+1),1,AP(IJ+1),1)
- T = CONJG(MULKM1)
- CALL CAXPY(J,T,AP(IKM1+1),1,AP(IJ+1),1)
- AP(JK) = MULK
- AP(JKM1) = MULKM1
- IJJ = IJ + J
- AP(IJJ) = CMPLX(REAL(AP(IJJ)),0.0E0)
- IJ = IJ - (J - 1)
- 170 CONTINUE
- 180 CONTINUE
- C
- C SET THE PIVOT ARRAY.
- C
- KPVT(K) = 1 - K
- IF (SWAP) KPVT(K) = -IMAX
- KPVT(K-1) = KPVT(K)
- 190 CONTINUE
- IK = IK - (K - 1)
- IF (KSTEP .EQ. 2) IK = IK - (K - 2)
- K = K - KSTEP
- GO TO 10
- 200 CONTINUE
- RETURN
- END
- *DECK CHPSL
- SUBROUTINE CHPSL (AP, N, KPVT, B)
- C***BEGIN PROLOGUE CHPSL
- C***PURPOSE Solve a complex Hermitian system using factors obtained
- C from CHPFA.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D2D1A
- C***TYPE COMPLEX (SSPSL-S, DSPSL-D, CHPSL-C, CSPSL-C)
- C***KEYWORDS HERMITIAN, LINEAR ALGEBRA, LINPACK, MATRIX, PACKED, SOLVE
- C***AUTHOR Bunch, J., (UCSD)
- C***DESCRIPTION
- C
- C CHISL solves the complex Hermitian system
- C A * X = B
- C using the factors computed by CHPFA.
- C
- C On Entry
- C
- C AP COMPLEX(N*(N+1)/2)
- C the output from CHPFA.
- C
- C N INTEGER
- C the order of the matrix A .
- C
- C KVPT INTEGER(N)
- C the pivot vector from CHPFA.
- C
- C B COMPLEX(N)
- C the right hand side vector.
- C
- C On Return
- C
- C B the solution vector X .
- C
- C Error Condition
- C
- C A division by zero may occur if CHPCO has set RCOND .EQ. 0.0
- C or CHPFA has set INFO .NE. 0 .
- C
- C To compute INVERSE(A) * C where C is a matrix
- C with P columns
- C CALL CHPFA(AP,N,KVPT,INFO)
- C IF (INFO .NE. 0) GO TO ...
- C DO 10 J = 1, P
- C CALL CHPSL(AP,N,KVPT,C(1,J))
- C 10 CONTINUE
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CAXPY, CDOTC
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 891107 Modified routine equivalence list. (WRB)
- C 891107 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CHPSL
- INTEGER N,KPVT(*)
- COMPLEX AP(*),B(*)
- C
- COMPLEX AK,AKM1,BK,BKM1,CDOTC,DENOM,TEMP
- INTEGER IK,IKM1,IKP1,K,KK,KM1K,KM1KM1,KP
- C
- C LOOP BACKWARD APPLYING THE TRANSFORMATIONS AND
- C D INVERSE TO B.
- C
- C***FIRST EXECUTABLE STATEMENT CHPSL
- K = N
- IK = (N*(N - 1))/2
- 10 IF (K .EQ. 0) GO TO 80
- KK = IK + K
- IF (KPVT(K) .LT. 0) GO TO 40
- C
- C 1 X 1 PIVOT BLOCK.
- C
- IF (K .EQ. 1) GO TO 30
- KP = KPVT(K)
- IF (KP .EQ. K) GO TO 20
- C
- C INTERCHANGE.
- C
- TEMP = B(K)
- B(K) = B(KP)
- B(KP) = TEMP
- 20 CONTINUE
- C
- C APPLY THE TRANSFORMATION.
- C
- CALL CAXPY(K-1,B(K),AP(IK+1),1,B(1),1)
- 30 CONTINUE
- C
- C APPLY D INVERSE.
- C
- B(K) = B(K)/AP(KK)
- K = K - 1
- IK = IK - K
- GO TO 70
- 40 CONTINUE
- C
- C 2 X 2 PIVOT BLOCK.
- C
- IKM1 = IK - (K - 1)
- IF (K .EQ. 2) GO TO 60
- KP = ABS(KPVT(K))
- IF (KP .EQ. K - 1) GO TO 50
- C
- C INTERCHANGE.
- C
- TEMP = B(K-1)
- B(K-1) = B(KP)
- B(KP) = TEMP
- 50 CONTINUE
- C
- C APPLY THE TRANSFORMATION.
- C
- CALL CAXPY(K-2,B(K),AP(IK+1),1,B(1),1)
- CALL CAXPY(K-2,B(K-1),AP(IKM1+1),1,B(1),1)
- 60 CONTINUE
- C
- C APPLY D INVERSE.
- C
- KM1K = IK + K - 1
- KK = IK + K
- AK = AP(KK)/CONJG(AP(KM1K))
- KM1KM1 = IKM1 + K - 1
- AKM1 = AP(KM1KM1)/AP(KM1K)
- BK = B(K)/CONJG(AP(KM1K))
- BKM1 = B(K-1)/AP(KM1K)
- DENOM = AK*AKM1 - 1.0E0
- B(K) = (AKM1*BK - BKM1)/DENOM
- B(K-1) = (AK*BKM1 - BK)/DENOM
- K = K - 2
- IK = IK - (K + 1) - K
- 70 CONTINUE
- GO TO 10
- 80 CONTINUE
- C
- C LOOP FORWARD APPLYING THE TRANSFORMATIONS.
- C
- K = 1
- IK = 0
- 90 IF (K .GT. N) GO TO 160
- IF (KPVT(K) .LT. 0) GO TO 120
- C
- C 1 X 1 PIVOT BLOCK.
- C
- IF (K .EQ. 1) GO TO 110
- C
- C APPLY THE TRANSFORMATION.
- C
- B(K) = B(K) + CDOTC(K-1,AP(IK+1),1,B(1),1)
- KP = KPVT(K)
- IF (KP .EQ. K) GO TO 100
- C
- C INTERCHANGE.
- C
- TEMP = B(K)
- B(K) = B(KP)
- B(KP) = TEMP
- 100 CONTINUE
- 110 CONTINUE
- IK = IK + K
- K = K + 1
- GO TO 150
- 120 CONTINUE
- C
- C 2 X 2 PIVOT BLOCK.
- C
- IF (K .EQ. 1) GO TO 140
- C
- C APPLY THE TRANSFORMATION.
- C
- B(K) = B(K) + CDOTC(K-1,AP(IK+1),1,B(1),1)
- IKP1 = IK + K
- B(K+1) = B(K+1) + CDOTC(K-1,AP(IKP1+1),1,B(1),1)
- KP = ABS(KPVT(K))
- IF (KP .EQ. K) GO TO 130
- C
- C INTERCHANGE.
- C
- TEMP = B(K)
- B(K) = B(KP)
- B(KP) = TEMP
- 130 CONTINUE
- 140 CONTINUE
- IK = IK + K + K + 1
- K = K + 2
- 150 CONTINUE
- GO TO 90
- 160 CONTINUE
- RETURN
- END
- *DECK CHU
- FUNCTION CHU (A, B, X)
- C***BEGIN PROLOGUE CHU
- C***PURPOSE Compute the logarithmic confluent hypergeometric function.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C11
- C***TYPE SINGLE PRECISION (CHU-S, DCHU-D)
- C***KEYWORDS FNLIB, LOGARITHMIC CONFLUENT HYPERGEOMETRIC FUNCTION,
- C SPECIAL FUNCTIONS
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C CHU computes the logarithmic confluent hypergeometric function,
- C U(A,B,X).
- C
- C Input Parameters:
- C A real
- C B real
- C X real and positive
- C
- C This routine is not valid when 1+A-B is close to zero if X is small.
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED EXPREL, GAMMA, GAMR, POCH, POCH1, R1MACH, R9CHU,
- C XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770801 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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 900727 Added EXTERNAL statement. (WRB)
- C***END PROLOGUE CHU
- EXTERNAL GAMMA
- SAVE PI, EPS
- DATA PI / 3.1415926535 8979324 E0 /
- DATA EPS / 0.0 /
- C***FIRST EXECUTABLE STATEMENT CHU
- IF (EPS.EQ.0.0) EPS = R1MACH(3)
- C
- IF (X .EQ. 0.0) CALL XERMSG ('SLATEC', 'CHU',
- + 'X IS ZERO SO CHU IS INFINITE', 1, 2)
- IF (X .LT. 0.0) CALL XERMSG ('SLATEC', 'CHU',
- + 'X IS NEGATIVE, USE CCHU', 2, 2)
- C
- IF (MAX(ABS(A),1.0)*MAX(ABS(1.0+A-B),1.0).LT.0.99*ABS(X))
- 1 GO TO 120
- C
- C THE ASCENDING SERIES WILL BE USED, BECAUSE THE DESCENDING RATIONAL
- C APPROXIMATION (WHICH IS BASED ON THE ASYMPTOTIC SERIES) IS UNSTABLE.
- C
- IF (ABS(1.0+A-B) .LT. SQRT(EPS)) CALL XERMSG ('SLATEC', 'CHU',
- + 'ALGORITHM IS BAD WHEN 1+A-B IS NEAR ZERO FOR SMALL X', 10, 2)
- C
- AINTB = AINT(B+0.5)
- IF (B.LT.0.0) AINTB = AINT(B-0.5)
- BEPS = B - AINTB
- N = AINTB
- C
- ALNX = LOG(X)
- XTOEPS = EXP(-BEPS*ALNX)
- C
- C EVALUATE THE FINITE SUM. -----------------------------------------
- C
- IF (N.GE.1) GO TO 40
- C
- C CONSIDER THE CASE B .LT. 1.0 FIRST.
- C
- SUM = 1.0
- IF (N.EQ.0) GO TO 30
- C
- T = 1.0
- M = -N
- DO 20 I=1,M
- XI1 = I - 1
- T = T*(A+XI1)*X/((B+XI1)*(XI1+1.0))
- SUM = SUM + T
- 20 CONTINUE
- C
- 30 SUM = POCH(1.0+A-B, -A) * SUM
- GO TO 70
- C
- C NOW CONSIDER THE CASE B .GE. 1.0.
- C
- 40 SUM = 0.0
- M = N - 2
- IF (M.LT.0) GO TO 70
- T = 1.0
- SUM = 1.0
- IF (M.EQ.0) GO TO 60
- C
- DO 50 I=1,M
- XI = I
- T = T * (A-B+XI)*X/((1.0-B+XI)*XI)
- SUM = SUM + T
- 50 CONTINUE
- C
- 60 SUM = GAMMA(B-1.0) * GAMR(A) * X**(1-N) * XTOEPS * SUM
- C
- C NOW EVALUATE THE INFINITE SUM. -----------------------------------
- C
- 70 ISTRT = 0
- IF (N.LT.1) ISTRT = 1 - N
- XI = ISTRT
- C
- FACTOR = (-1.0)**N * GAMR(1.0+A-B) * X**ISTRT
- IF (BEPS.NE.0.0) FACTOR = FACTOR * BEPS*PI/SIN(BEPS*PI)
- C
- POCHAI = POCH (A, XI)
- GAMRI1 = GAMR (XI+1.0)
- GAMRNI = GAMR (AINTB+XI)
- B0 = FACTOR * POCH(A,XI-BEPS) * GAMRNI * GAMR(XI+1.0-BEPS)
- C
- IF (ABS(XTOEPS-1.0).GT.0.5) GO TO 90
- C
- C X**(-BEPS) IS CLOSE TO 1.0, SO WE MUST BE CAREFUL IN EVALUATING
- C THE DIFFERENCES
- C
- PCH1AI = POCH1 (A+XI, -BEPS)
- PCH1I = POCH1 (XI+1.0-BEPS, BEPS)
- C0 = FACTOR * POCHAI * GAMRNI * GAMRI1 * (
- 1 -POCH1(B+XI, -BEPS) + PCH1AI - PCH1I + BEPS*PCH1AI*PCH1I )
- C
- C XEPS1 = (1.0 - X**(-BEPS)) / BEPS
- XEPS1 = ALNX * EXPREL(-BEPS*ALNX)
- C
- CHU = SUM + C0 + XEPS1*B0
- XN = N
- DO 80 I=1,1000
- XI = ISTRT + I
- XI1 = ISTRT + I - 1
- B0 = (A+XI1-BEPS)*B0*X/((XN+XI1)*(XI-BEPS))
- C0 = (A+XI1)*C0*X/((B+XI1)*XI) - ((A-1.0)*(XN+2.*XI-1.0)
- 1 + XI*(XI-BEPS)) * B0/(XI*(B+XI1)*(A+XI1-BEPS))
- T = C0 + XEPS1*B0
- CHU = CHU + T
- IF (ABS(T).LT.EPS*ABS(CHU)) GO TO 130
- 80 CONTINUE
- CALL XERMSG ('SLATEC', 'CHU',
- + 'NO CONVERGENCE IN 1000 TERMS OF THE ASCENDING SERIES', 3, 2)
- C
- C X**(-BEPS) IS VERY DIFFERENT FROM 1.0, SO THE STRAIGHTFORWARD
- C FORMULATION IS STABLE.
- C
- 90 A0 = FACTOR * POCHAI * GAMR(B+XI) * GAMRI1 / BEPS
- B0 = XTOEPS*B0/BEPS
- C
- CHU = SUM + A0 - B0
- DO 100 I=1,1000
- XI = ISTRT + I
- XI1 = ISTRT + I - 1
- A0 = (A+XI1)*A0*X/((B+XI1)*XI)
- B0 = (A+XI1-BEPS)*B0*X/((AINTB+XI1)*(XI-BEPS))
- T = A0 - B0
- CHU = CHU + T
- IF (ABS(T).LT.EPS*ABS(CHU)) GO TO 130
- 100 CONTINUE
- CALL XERMSG ('SLATEC', 'CHU',
- + 'NO CONVERGENCE IN 1000 TERMS OF THE ASCENDING SERIES', 3, 2)
- C
- C USE LUKE-S RATIONAL APPROX IN THE ASYMPTOTIC REGION.
- C
- 120 CHU = X**(-A) * R9CHU(A, B, X)
- C
- 130 RETURN
- END
- *DECK CINVIT
- SUBROUTINE CINVIT (NM, N, AR, AI, WR, WI, SELECT, MM, M, ZR, ZI,
- + IERR, RM1, RM2, RV1, RV2)
- C***BEGIN PROLOGUE CINVIT
- C***PURPOSE Compute the eigenvectors of a complex upper Hessenberg
- C associated with specified eigenvalues using inverse
- C iteration.
- C***LIBRARY SLATEC (EISPACK)
- C***CATEGORY D4C2B
- C***TYPE COMPLEX (INVIT-S, CINVIT-C)
- C***KEYWORDS EIGENVALUES, EIGENVECTORS, EISPACK
- C***AUTHOR Smith, B. T., et al.
- C***DESCRIPTION
- C
- C This subroutine is a translation of the ALGOL procedure CXINVIT
- C by Peters and Wilkinson.
- C HANDBOOK FOR AUTO. COMP. VOL.II-LINEAR ALGEBRA, 418-439(1971).
- C
- C This subroutine finds those eigenvectors of A COMPLEX UPPER
- C Hessenberg matrix corresponding to specified eigenvalues,
- C using inverse iteration.
- C
- C On INPUT
- C
- C NM must be set to the row dimension of the two-dimensional
- C array parameters, AR, AI, ZR and ZI, as declared in the
- C calling program dimension statement. NM is an INTEGER
- C variable.
- C
- C N is the order of the matrix A=(AR,AI). N is an INTEGER
- C variable. N must be less than or equal to NM.
- C
- C AR and AI contain the real and imaginary parts, respectively,
- C of the complex upper Hessenberg matrix. AR and AI are
- C two-dimensional REAL arrays, dimensioned AR(NM,N)
- C and AI(NM,N).
- C
- C WR and WI contain the real and imaginary parts, respectively,
- C of the eigenvalues of the matrix. The eigenvalues must be
- C stored in a manner identical to that of subroutine COMLR,
- C which recognizes possible splitting of the matrix. WR and
- C WI are one-dimensional REAL arrays, dimensioned WR(N) and
- C WI(N).
- C
- C SELECT specifies the eigenvectors to be found. The
- C eigenvector corresponding to the J-th eigenvalue is
- C specified by setting SELECT(J) to .TRUE. SELECT is a
- C one-dimensional LOGICAL array, dimensioned SELECT(N).
- C
- C MM should be set to an upper bound for the number of
- C eigenvectors to be found. MM is an INTEGER variable.
- C
- C On OUTPUT
- C
- C AR, AI, WI, and SELECT are unaltered.
- C
- C WR may have been altered since close eigenvalues are perturbed
- C slightly in searching for independent eigenvectors.
- C
- C M is the number of eigenvectors actually found. M is an
- C INTEGER variable.
- C
- C ZR and ZI contain the real and imaginary parts, respectively,
- C of the eigenvectors corresponding to the flagged eigenvalues.
- C The eigenvectors are normalized so that the component of
- C largest magnitude is 1. Any vector which fails the
- C acceptance test is set to zero. ZR and ZI are
- C two-dimensional REAL arrays, dimensioned ZR(NM,MM) and
- C ZI(NM,MM).
- C
- C IERR is an INTEGER flag set to
- C Zero for normal return,
- C -(2*N+1) if more than MM eigenvectors have been requested
- C (the MM eigenvectors calculated to this point are
- C in ZR and ZI),
- C -K if the iteration corresponding to the K-th
- C value fails (if this occurs more than once, K
- C is the index of the last occurrence); the
- C corresponding columns of ZR and ZI are set to
- C zero vectors,
- C -(N+K) if both error situations occur.
- C
- C RV1 and RV2 are one-dimensional REAL arrays used for
- C temporary storage, dimensioned RV1(N) and RV2(N).
- C They hold the approximate eigenvectors during the inverse
- C iteration process.
- C
- C RM1 and RM2 are two-dimensional REAL arrays used for
- C temporary storage, dimensioned RM1(N,N) and RM2(N,N).
- C These arrays hold the triangularized form of the upper
- C Hessenberg matrix used in the inverse iteration process.
- C
- C The ALGOL procedure GUESSVEC appears in CINVIT in-line.
- C
- C Calls PYTHAG(A,B) for sqrt(A**2 + B**2).
- C Calls CDIV for complex division.
- C
- C Questions and comments should be directed to B. S. Garbow,
- C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY
- C ------------------------------------------------------------------
- C
- C***REFERENCES B. T. Smith, J. M. Boyle, J. J. Dongarra, B. S. Garbow,
- C Y. Ikebe, V. C. Klema and C. B. Moler, Matrix Eigen-
- C system Routines - EISPACK Guide, Springer-Verlag,
- C 1976.
- C***ROUTINES CALLED CDIV, PYTHAG
- C***REVISION HISTORY (YYMMDD)
- C 760101 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CINVIT
- C
- INTEGER I,J,K,M,N,S,II,MM,MP,NM,UK,IP1,ITS,KM1,IERR
- REAL AR(NM,*),AI(NM,*),WR(*),WI(*),ZR(NM,*),ZI(NM,*)
- REAL RM1(N,*),RM2(N,*),RV1(*),RV2(*)
- REAL X,Y,EPS3,NORM,NORMV,GROWTO,ILAMBD,RLAMBD,UKROOT
- REAL PYTHAG
- LOGICAL SELECT(N)
- C
- C***FIRST EXECUTABLE STATEMENT CINVIT
- IERR = 0
- UK = 0
- S = 1
- C
- DO 980 K = 1, N
- IF (.NOT. SELECT(K)) GO TO 980
- IF (S .GT. MM) GO TO 1000
- IF (UK .GE. K) GO TO 200
- C .......... CHECK FOR POSSIBLE SPLITTING ..........
- DO 120 UK = K, N
- IF (UK .EQ. N) GO TO 140
- IF (AR(UK+1,UK) .EQ. 0.0E0 .AND. AI(UK+1,UK) .EQ. 0.0E0)
- 1 GO TO 140
- 120 CONTINUE
- C .......... COMPUTE INFINITY NORM OF LEADING UK BY UK
- C (HESSENBERG) MATRIX ..........
- 140 NORM = 0.0E0
- MP = 1
- C
- DO 180 I = 1, UK
- X = 0.0E0
- C
- DO 160 J = MP, UK
- 160 X = X + PYTHAG(AR(I,J),AI(I,J))
- C
- IF (X .GT. NORM) NORM = X
- MP = I
- 180 CONTINUE
- C .......... EPS3 REPLACES ZERO PIVOT IN DECOMPOSITION
- C AND CLOSE ROOTS ARE MODIFIED BY EPS3 ..........
- IF (NORM .EQ. 0.0E0) NORM = 1.0E0
- EPS3 = NORM
- 190 EPS3 = 0.5E0*EPS3
- IF (NORM + EPS3 .GT. NORM) GO TO 190
- EPS3 = 2.0E0*EPS3
- C .......... GROWTO IS THE CRITERION FOR GROWTH ..........
- UKROOT = SQRT(REAL(UK))
- GROWTO = 0.1E0 / UKROOT
- 200 RLAMBD = WR(K)
- ILAMBD = WI(K)
- IF (K .EQ. 1) GO TO 280
- KM1 = K - 1
- GO TO 240
- C .......... PERTURB EIGENVALUE IF IT IS CLOSE
- C TO ANY PREVIOUS EIGENVALUE ..........
- 220 RLAMBD = RLAMBD + EPS3
- C .......... FOR I=K-1 STEP -1 UNTIL 1 DO -- ..........
- 240 DO 260 II = 1, KM1
- I = K - II
- IF (SELECT(I) .AND. ABS(WR(I)-RLAMBD) .LT. EPS3 .AND.
- 1 ABS(WI(I)-ILAMBD) .LT. EPS3) GO TO 220
- 260 CONTINUE
- C
- WR(K) = RLAMBD
- C .......... FORM UPPER HESSENBERG (AR,AI)-(RLAMBD,ILAMBD)*I
- C AND INITIAL COMPLEX VECTOR ..........
- 280 MP = 1
- C
- DO 320 I = 1, UK
- C
- DO 300 J = MP, UK
- RM1(I,J) = AR(I,J)
- RM2(I,J) = AI(I,J)
- 300 CONTINUE
- C
- RM1(I,I) = RM1(I,I) - RLAMBD
- RM2(I,I) = RM2(I,I) - ILAMBD
- MP = I
- RV1(I) = EPS3
- 320 CONTINUE
- C .......... TRIANGULAR DECOMPOSITION WITH INTERCHANGES,
- C REPLACING ZERO PIVOTS BY EPS3 ..........
- IF (UK .EQ. 1) GO TO 420
- C
- DO 400 I = 2, UK
- MP = I - 1
- IF (PYTHAG(RM1(I,MP),RM2(I,MP)) .LE.
- 1 PYTHAG(RM1(MP,MP),RM2(MP,MP))) GO TO 360
- C
- DO 340 J = MP, UK
- Y = RM1(I,J)
- RM1(I,J) = RM1(MP,J)
- RM1(MP,J) = Y
- Y = RM2(I,J)
- RM2(I,J) = RM2(MP,J)
- RM2(MP,J) = Y
- 340 CONTINUE
- C
- 360 IF (RM1(MP,MP) .EQ. 0.0E0 .AND. RM2(MP,MP) .EQ. 0.0E0)
- 1 RM1(MP,MP) = EPS3
- CALL CDIV(RM1(I,MP),RM2(I,MP),RM1(MP,MP),RM2(MP,MP),X,Y)
- IF (X .EQ. 0.0E0 .AND. Y .EQ. 0.0E0) GO TO 400
- C
- DO 380 J = I, UK
- RM1(I,J) = RM1(I,J) - X * RM1(MP,J) + Y * RM2(MP,J)
- RM2(I,J) = RM2(I,J) - X * RM2(MP,J) - Y * RM1(MP,J)
- 380 CONTINUE
- C
- 400 CONTINUE
- C
- 420 IF (RM1(UK,UK) .EQ. 0.0E0 .AND. RM2(UK,UK) .EQ. 0.0E0)
- 1 RM1(UK,UK) = EPS3
- ITS = 0
- C .......... BACK SUBSTITUTION
- C FOR I=UK STEP -1 UNTIL 1 DO -- ..........
- 660 DO 720 II = 1, UK
- I = UK + 1 - II
- X = RV1(I)
- Y = 0.0E0
- IF (I .EQ. UK) GO TO 700
- IP1 = I + 1
- C
- DO 680 J = IP1, UK
- X = X - RM1(I,J) * RV1(J) + RM2(I,J) * RV2(J)
- Y = Y - RM1(I,J) * RV2(J) - RM2(I,J) * RV1(J)
- 680 CONTINUE
- C
- 700 CALL CDIV(X,Y,RM1(I,I),RM2(I,I),RV1(I),RV2(I))
- 720 CONTINUE
- C .......... ACCEPTANCE TEST FOR EIGENVECTOR
- C AND NORMALIZATION ..........
- ITS = ITS + 1
- NORM = 0.0E0
- NORMV = 0.0E0
- C
- DO 780 I = 1, UK
- X = PYTHAG(RV1(I),RV2(I))
- IF (NORMV .GE. X) GO TO 760
- NORMV = X
- J = I
- 760 NORM = NORM + X
- 780 CONTINUE
- C
- IF (NORM .LT. GROWTO) GO TO 840
- C .......... ACCEPT VECTOR ..........
- X = RV1(J)
- Y = RV2(J)
- C
- DO 820 I = 1, UK
- CALL CDIV(RV1(I),RV2(I),X,Y,ZR(I,S),ZI(I,S))
- 820 CONTINUE
- C
- IF (UK .EQ. N) GO TO 940
- J = UK + 1
- GO TO 900
- C .......... IN-LINE PROCEDURE FOR CHOOSING
- C A NEW STARTING VECTOR ..........
- 840 IF (ITS .GE. UK) GO TO 880
- X = UKROOT
- Y = EPS3 / (X + 1.0E0)
- RV1(1) = EPS3
- C
- DO 860 I = 2, UK
- 860 RV1(I) = Y
- C
- J = UK - ITS + 1
- RV1(J) = RV1(J) - EPS3 * X
- GO TO 660
- C .......... SET ERROR -- UNACCEPTED EIGENVECTOR ..........
- 880 J = 1
- IERR = -K
- C .......... SET REMAINING VECTOR COMPONENTS TO ZERO ..........
- 900 DO 920 I = J, N
- ZR(I,S) = 0.0E0
- ZI(I,S) = 0.0E0
- 920 CONTINUE
- C
- 940 S = S + 1
- 980 CONTINUE
- C
- GO TO 1001
- C .......... SET ERROR -- UNDERESTIMATE OF EIGENVECTOR
- C SPACE REQUIRED ..........
- 1000 IF (IERR .NE. 0) IERR = IERR - N
- IF (IERR .EQ. 0) IERR = -(2 * N + 1)
- 1001 M = S - 1
- RETURN
- END
- *DECK CLBETA
- COMPLEX FUNCTION CLBETA (A, B)
- C***BEGIN PROLOGUE CLBETA
- C***PURPOSE Compute the natural logarithm of the complete Beta
- C function.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C7B
- C***TYPE COMPLEX (ALBETA-S, DLBETA-D, CLBETA-C)
- C***KEYWORDS FNLIB, LOGARITHM OF THE COMPLETE BETA FUNCTION,
- C SPECIAL FUNCTIONS
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C CLBETA computes the natural log of the complex valued complete beta
- C function of complex parameters A and B. This is a preliminary version
- C which is not accurate.
- C
- C Input Parameters:
- C A complex and the real part of A positive
- C B complex and the real part of B positive
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED CLNGAM, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770701 DATE WRITTEN
- C 861211 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***END PROLOGUE CLBETA
- COMPLEX A, B, CLNGAM
- C***FIRST EXECUTABLE STATEMENT CLBETA
- IF (REAL(A) .LE. 0.0 .OR. REAL(B) .LE. 0.0) CALL XERMSG ('SLATEC',
- + 'CLBETA', 'REAL PART OF BOTH ARGUMENTS MUST BE GT 0', 1, 2)
- C
- CLBETA = CLNGAM(A) + CLNGAM(B) - CLNGAM(A+B)
- C
- RETURN
- END
- *DECK CLNGAM
- COMPLEX FUNCTION CLNGAM (ZIN)
- C***BEGIN PROLOGUE CLNGAM
- C***PURPOSE Compute the logarithm of the absolute value of the Gamma
- C function.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C7A
- C***TYPE COMPLEX (ALNGAM-S, DLNGAM-D, CLNGAM-C)
- C***KEYWORDS ABSOLUTE VALUE, COMPLETE GAMMA FUNCTION, FNLIB, LOGARITHM,
- C SPECIAL FUNCTIONS
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C CLNGAM computes the natural log of the complex valued gamma function
- C at ZIN, where ZIN is a complex number. This is a preliminary version,
- C which is not accurate.
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED C9LGMC, CARG, CLNREL, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 780401 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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***END PROLOGUE CLNGAM
- COMPLEX ZIN, Z, CORR, CLNREL, C9LGMC
- LOGICAL FIRST
- SAVE PI, SQ2PIL, BOUND, DXREL, FIRST
- DATA PI / 3.1415926535 8979324E0 /
- DATA SQ2PIL / 0.9189385332 0467274E0 /
- DATA FIRST /.TRUE./
- C***FIRST EXECUTABLE STATEMENT CLNGAM
- IF (FIRST) THEN
- N = -0.30*LOG(R1MACH(3))
- C BOUND = N*(0.1*EPS)**(-1/(2*N-1))/(PI*EXP(1))
- BOUND = 0.1171*N*(0.1*R1MACH(3))**(-1./(2*N-1))
- DXREL = SQRT (R1MACH(4))
- ENDIF
- FIRST = .FALSE.
- C
- Z = ZIN
- X = REAL(ZIN)
- Y = AIMAG(ZIN)
- C
- CORR = (0.0, 0.0)
- CABSZ = ABS(Z)
- IF (X.GE.0.0 .AND. CABSZ.GT.BOUND) GO TO 50
- IF (X.LT.0.0 .AND. ABS(Y).GT.BOUND) GO TO 50
- C
- IF (CABSZ.LT.BOUND) GO TO 20
- C
- C USE THE REFLECTION FORMULA FOR REAL(Z) NEGATIVE, ABS(Z) LARGE, AND
- C ABS(AIMAG(Y)) SMALL.
- C
- IF (Y.GT.0.0) Z = CONJG (Z)
- CORR = EXP (-CMPLX(0.0,2.0*PI)*Z)
- IF (REAL(CORR) .EQ. 1.0 .AND. AIMAG(CORR) .EQ. 0.0) CALL XERMSG
- + ('SLATEC', 'CLNGAM', 'Z IS A NEGATIVE INTEGER', 3, 2)
- C
- CLNGAM = SQ2PIL + 1.0 - CMPLX(0.0,PI)*(Z-0.5) - CLNREL(-CORR)
- 1 + (Z-0.5)*LOG(1.0-Z) - Z - C9LGMC(1.0-Z)
- IF (Y.GT.0.0) CLNGAM = CONJG (CLNGAM)
- RETURN
- C
- C USE THE RECURSION RELATION FOR ABS(Z) SMALL.
- C
- 20 IF (X.GE.(-0.5) .OR. ABS(Y).GT.DXREL) GO TO 30
- IF (ABS((Z-AINT(X-0.5))/X) .LT. DXREL) CALL XERMSG ('SLATEC',
- + 'CLNGAM',
- + 'ANSWER LT HALF PRECISION BECAUSE Z TOO NEAR NEGATIVE INTEGER',
- + 1, 1)
- C
- 30 N = SQRT (BOUND**2 - Y**2) - X + 1.0
- ARGSUM = 0.0
- CORR = (1.0, 0.0)
- DO 40 I=1,N
- ARGSUM = ARGSUM + CARG(Z)
- CORR = Z*CORR
- Z = 1.0 + Z
- 40 CONTINUE
- C
- IF (REAL(CORR) .EQ. 0.0 .AND. AIMAG(CORR) .EQ. 0.0) CALL XERMSG
- + ('SLATEC', 'CLNGAM', 'Z IS A NEGATIVE INTEGER', 3, 2)
- CORR = -CMPLX (LOG(ABS(CORR)), ARGSUM)
- C
- C USE STIRLING-S APPROXIMATION FOR LARGE Z.
- C
- 50 CLNGAM = SQ2PIL + (Z-0.5)*LOG(Z) - Z + CORR + C9LGMC(Z)
- RETURN
- C
- END
- *DECK CLNREL
- COMPLEX FUNCTION CLNREL (Z)
- C***BEGIN PROLOGUE CLNREL
- C***PURPOSE Evaluate ln(1+X) accurate in the sense of relative error.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C4B
- C***TYPE COMPLEX (ALNREL-S, DLNREL-D, CLNREL-C)
- C***KEYWORDS ELEMENTARY FUNCTIONS, FNLIB, LOGARITHM
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C CLNREL(Z) = LOG(1+Z) with relative error accuracy near Z = 0.
- C Let RHO = ABS(Z) and
- C R**2 = ABS(1+Z)**2 = (1+X)**2 + Y**2 = 1 + 2*X + RHO**2 .
- C Now if RHO is small we may evaluate CLNREL(Z) accurately by
- C LOG(1+Z) = CMPLX (LOG(R), CARG(1+Z))
- C = CMPLX (0.5*LOG(R**2), CARG(1+Z))
- C = CMPLX (0.5*ALNREL(2*X+RHO**2), CARG(1+Z))
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED ALNREL, CARG, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770401 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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***END PROLOGUE CLNREL
- COMPLEX Z
- SAVE SQEPS
- DATA SQEPS /0.0/
- C***FIRST EXECUTABLE STATEMENT CLNREL
- IF (SQEPS.EQ.0.) SQEPS = SQRT (R1MACH(4))
- C
- IF (ABS(1.+Z) .LT. SQEPS) CALL XERMSG ('SLATEC', 'CLNREL',
- + 'ANSWER LT HALF PRECISION BECAUSE Z TOO NEAR -1', 1, 1)
- C
- RHO = ABS(Z)
- IF (RHO.GT.0.375) CLNREL = LOG (1.0+Z)
- IF (RHO.GT.0.375) RETURN
- C
- X = REAL(Z)
- CLNREL = CMPLX (0.5*ALNREL(2.*X+RHO**2), CARG(1.0+Z))
- C
- RETURN
- END
- *DECK CLOG10
- COMPLEX FUNCTION CLOG10 (Z)
- C***BEGIN PROLOGUE CLOG10
- C***PURPOSE Compute the principal value of the complex base 10
- C logarithm.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C4B
- C***TYPE COMPLEX (CLOG10-C)
- C***KEYWORDS BASE TEN LOGARITHM, ELEMENTARY FUNCTIONS, FNLIB
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C CLOG10(Z) calculates the principal value of the complex common
- C or base 10 logarithm of Z for -PI .LT. arg(Z) .LE. +PI.
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 770401 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C***END PROLOGUE CLOG10
- COMPLEX Z
- SAVE ALOGE
- DATA ALOGE / 0.4342944819 0325182765E0 /
- C***FIRST EXECUTABLE STATEMENT CLOG10
- CLOG10 = ALOGE * LOG(Z)
- C
- RETURN
- END
- *DECK CMGNBN
- SUBROUTINE CMGNBN (NPEROD, N, MPEROD, M, A, B, C, IDIMY, Y,
- + IERROR, W)
- C***BEGIN PROLOGUE CMGNBN
- C***PURPOSE Solve a complex block tridiagonal linear system of
- C equations by a cyclic reduction algorithm.
- C***LIBRARY SLATEC (FISHPACK)
- C***CATEGORY I2B4B
- C***TYPE COMPLEX (GENBUN-S, CMGNBN-C)
- C***KEYWORDS CYCLIC REDUCTION, ELLIPTIC PDE, FISHPACK,
- C TRIDIAGONAL LINEAR SYSTEM
- C***AUTHOR Adams, J., (NCAR)
- C Swarztrauber, P. N., (NCAR)
- C Sweet, R., (NCAR)
- C***DESCRIPTION
- C
- C Subroutine CMGNBN solves the complex linear system of equations
- C
- C A(I)*X(I-1,J) + B(I)*X(I,J) + C(I)*X(I+1,J)
- C
- C + X(I,J-1) - 2.*X(I,J) + X(I,J+1) = Y(I,J)
- C
- C For I = 1,2,...,M and J = 1,2,...,N.
- C
- C The indices I+1 and I-1 are evaluated modulo M, i.e.,
- C X(0,J) = X(M,J) and X(M+1,J) = X(1,J), and X(I,0) may be equal to
- C 0, X(I,2), or X(I,N) and X(I,N+1) may be equal to 0, X(I,N-1), or
- C X(I,1) depending on an input parameter.
- C
- C
- C * * * * * * * * Parameter Description * * * * * * * * * *
- C
- C * * * * * * On Input * * * * * *
- C
- C NPEROD
- C Indicates the values that X(I,0) and X(I,N+1) are assumed to
- C have.
- C
- C = 0 If X(I,0) = X(I,N) and X(I,N+1) = X(I,1).
- C = 1 If X(I,0) = X(I,N+1) = 0 .
- C = 2 If X(I,0) = 0 and X(I,N+1) = X(I,N-1).
- C = 3 If X(I,0) = X(I,2) and X(I,N+1) = X(I,N-1).
- C = 4 If X(I,0) = X(I,2) and X(I,N+1) = 0.
- C
- C N
- C The number of unknowns in the J-direction. N must be greater
- C than 2.
- C
- C MPEROD
- C = 0 If A(1) and C(M) are not zero
- C = 1 If A(1) = C(M) = 0
- C
- C M
- C The number of unknowns in the I-direction. N must be greater
- C than 2.
- C
- C A,B,C
- C One-dimensional complex arrays of length M that specify the
- C coefficients in the linear equations given above. If MPEROD = 0
- C the array elements must not depend upon the index I, but must be
- C constant. Specifically, the subroutine checks the following
- C condition
- C
- C A(I) = C(1)
- C C(I) = C(1)
- C B(I) = B(1)
- C
- C For I=1,2,...,M.
- C
- C IDIMY
- C The row (or first) dimension of the two-dimensional array Y as
- C it appears in the program calling CMGNBN. This parameter is
- C used to specify the variable dimension of Y. IDIMY must be at
- C least M.
- C
- C Y
- C A two-dimensional complex array that specifies the values of the
- C right side of the linear system of equations given above. Y
- C must be dimensioned at least M*N.
- C
- C W
- C A one-dimensional complex array that must be provided by the
- C user for work space. W may require up to 4*N +
- C (10 + INT(log2(N)))*M LOCATIONS. The actual number of locations
- C used is computed by CMGNBN and is returned in location W(1).
- C
- C
- C * * * * * * On Output * * * * * *
- C
- C Y
- C Contains the solution X.
- C
- C IERROR
- C An error flag which indicates invalid input parameters. Except
- C for number zero, a solution is not attempted.
- C
- C = 0 No error.
- C = 1 M .LE. 2
- C = 2 N .LE. 2
- C = 3 IDIMY .LT. M
- C = 4 NPEROD .LT. 0 or NPEROD .GT. 4
- C = 5 MPEROD .LT. 0 or MPEROD .GT. 1
- C = 6 A(I) .NE. C(1) or C(I) .NE. C(1) or B(I) .NE. B(1) for
- C some I=1,2,...,M.
- C = 7 A(1) .NE. 0 or C(M) .NE. 0 and MPEROD = 1
- C
- C W
- C W(1) contains the required length of W.
- C
- C *Long Description:
- C
- C * * * * * * * Program Specifications * * * * * * * * * * * *
- C
- C Dimension of A(M),B(M),C(M),Y(IDIMY,N),W(see parameter list)
- C Arguments
- C
- C Latest June 1979
- C Revision
- C
- C Subprograms CMGNBN,CMPOSD,CMPOSN,CMPOSP,CMPCSG,CMPMRG,
- C Required CMPTRX,CMPTR3,PIMACH
- C
- C Special None
- C Conditions
- C
- C Common None
- C Blocks
- C
- C I/O None
- C
- C Precision Single
- C
- C Specialist Roland Sweet
- C
- C Language FORTRAN
- C
- C History Written by Roland Sweet at NCAR in June, 1977
- C
- C Algorithm The linear system is solved by a cyclic reduction
- C algorithm described in the reference.
- C
- C Space 4944(DECIMAL) = 11520(octal) locations on the NCAR
- C Required Control Data 7600
- C
- C Timing and The execution time T on the NCAR Control Data
- C Accuracy 7600 for subroutine CMGNBN is roughly proportional
- C to M*N*log2(N), but also depends on the input
- C parameter NPEROD. Some typical values are listed
- C in the table below.
- C To measure the accuracy of the algorithm a
- C uniform random number generator was used to create
- C a solution array X for the system given in the
- C 'PURPOSE' with
- C
- C A(I) = C(I) = -0.5*B(I) = 1, I=1,2,...,M
- C
- C and, when MPEROD = 1
- C
- C A(1) = C(M) = 0
- C A(M) = C(1) = 2.
- C
- C The solution X was substituted into the given sys-
- C tem and a right side Y was computed. Using this
- C array Y subroutine CMGNBN was called to produce an
- C approximate solution Z. Then the relative error,
- C defined as
- C
- C E = MAX(ABS(Z(I,J)-X(I,J)))/MAX(ABS(X(I,J)))
- C
- C where the two maxima are taken over all I=1,2,...,M
- C and J=1,2,...,N, was computed. The value of E is
- C given in the table below for some typical values of
- C M and N.
- C
- C
- C M (=N) MPEROD NPEROD T(MSECS) E
- C ------ ------ ------ -------- ------
- C
- C 31 0 0 77 1.E-12
- C 31 1 1 45 4.E-13
- C 31 1 3 91 2.E-12
- C 32 0 0 59 7.E-14
- C 32 1 1 65 5.E-13
- C 32 1 3 97 2.E-13
- C 33 0 0 80 6.E-13
- C 33 1 1 67 5.E-13
- C 33 1 3 76 3.E-12
- C 63 0 0 350 5.E-12
- C 63 1 1 215 6.E-13
- C 63 1 3 412 1.E-11
- C 64 0 0 264 1.E-13
- C 64 1 1 287 3.E-12
- C 64 1 3 421 3.E-13
- C 65 0 0 338 2.E-12
- C 65 1 1 292 5.E-13
- C 65 1 3 329 1.E-11
- C
- C Portability American National Standards Institute Fortran.
- C The machine dependent constant PI is defined in
- C function PIMACH.
- C
- C Required COS
- C Resident
- C Routines
- C
- C Reference Sweet, R., 'A Cyclic Reduction Algorithm for
- C Solving Block Tridiagonal Systems Of Arbitrary
- C Dimensions,' SIAM J. on Numer. Anal.,
- C 14(SEPT., 1977), PP. 706-720.
- C
- C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- C
- C***REFERENCES R. Sweet, A cyclic reduction algorithm for solving
- C block tridiagonal systems of arbitrary dimensions,
- C SIAM Journal on Numerical Analysis 14, (September
- C 1977), pp. 706-720.
- C***ROUTINES CALLED CMPOSD, CMPOSN, CMPOSP
- C***REVISION HISTORY (YYMMDD)
- C 801001 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CMGNBN
- C
- C
- COMPLEX A ,B ,C ,Y ,
- 1 W ,A1
- DIMENSION Y(IDIMY,*)
- DIMENSION W(*) ,B(*) ,A(*) ,C(*)
- C***FIRST EXECUTABLE STATEMENT CMGNBN
- IERROR = 0
- IF (M .LE. 2) IERROR = 1
- IF (N .LE. 2) IERROR = 2
- IF (IDIMY .LT. M) IERROR = 3
- IF (NPEROD.LT.0 .OR. NPEROD.GT.4) IERROR = 4
- IF (MPEROD.LT.0 .OR. MPEROD.GT.1) IERROR = 5
- IF (MPEROD .EQ. 1) GO TO 102
- DO 101 I=2,M
- IF (ABS(A(I)-C(1)) .NE. 0.) GO TO 103
- IF (ABS(C(I)-C(1)) .NE. 0.) GO TO 103
- IF (ABS(B(I)-B(1)) .NE. 0.) GO TO 103
- 101 CONTINUE
- GO TO 104
- 102 IF (ABS(A(1)).NE.0. .AND. ABS(C(M)).NE.0.) IERROR = 7
- GO TO 104
- 103 IERROR = 6
- 104 IF (IERROR .NE. 0) RETURN
- IWBA = M+1
- IWBB = IWBA+M
- IWBC = IWBB+M
- IWB2 = IWBC+M
- IWB3 = IWB2+M
- IWW1 = IWB3+M
- IWW2 = IWW1+M
- IWW3 = IWW2+M
- IWD = IWW3+M
- IWTCOS = IWD+M
- IWP = IWTCOS+4*N
- DO 106 I=1,M
- K = IWBA+I-1
- W(K) = -A(I)
- K = IWBC+I-1
- W(K) = -C(I)
- K = IWBB+I-1
- W(K) = 2.-B(I)
- DO 105 J=1,N
- Y(I,J) = -Y(I,J)
- 105 CONTINUE
- 106 CONTINUE
- MP = MPEROD+1
- NP = NPEROD+1
- GO TO (114,107),MP
- 107 GO TO (108,109,110,111,123),NP
- 108 CALL CMPOSP (M,N,W(IWBA),W(IWBB),W(IWBC),Y,IDIMY,W,W(IWB2),
- 1 W(IWB3),W(IWW1),W(IWW2),W(IWW3),W(IWD),W(IWTCOS),
- 2 W(IWP))
- GO TO 112
- 109 CALL CMPOSD (M,N,1,W(IWBA),W(IWBB),W(IWBC),Y,IDIMY,W,W(IWW1),
- 1 W(IWD),W(IWTCOS),W(IWP))
- GO TO 112
- 110 CALL CMPOSN (M,N,1,2,W(IWBA),W(IWBB),W(IWBC),Y,IDIMY,W,W(IWB2),
- 1 W(IWB3),W(IWW1),W(IWW2),W(IWW3),W(IWD),W(IWTCOS),
- 2 W(IWP))
- GO TO 112
- 111 CALL CMPOSN (M,N,1,1,W(IWBA),W(IWBB),W(IWBC),Y,IDIMY,W,W(IWB2),
- 1 W(IWB3),W(IWW1),W(IWW2),W(IWW3),W(IWD),W(IWTCOS),
- 2 W(IWP))
- 112 IPSTOR = REAL(W(IWW1))
- IREV = 2
- IF (NPEROD .EQ. 4) GO TO 124
- 113 GO TO (127,133),MP
- 114 CONTINUE
- C
- C REORDER UNKNOWNS WHEN MP =0
- C
- MH = (M+1)/2
- MHM1 = MH-1
- MODD = 1
- IF (MH*2 .EQ. M) MODD = 2
- DO 119 J=1,N
- DO 115 I=1,MHM1
- MHPI = MH+I
- MHMI = MH-I
- W(I) = Y(MHMI,J)-Y(MHPI,J)
- W(MHPI) = Y(MHMI,J)+Y(MHPI,J)
- 115 CONTINUE
- W(MH) = 2.*Y(MH,J)
- GO TO (117,116),MODD
- 116 W(M) = 2.*Y(M,J)
- 117 CONTINUE
- DO 118 I=1,M
- Y(I,J) = W(I)
- 118 CONTINUE
- 119 CONTINUE
- K = IWBC+MHM1-1
- I = IWBA+MHM1
- W(K) = (0.,0.)
- W(I) = (0.,0.)
- W(K+1) = 2.*W(K+1)
- GO TO (120,121),MODD
- 120 CONTINUE
- K = IWBB+MHM1-1
- W(K) = W(K)-W(I-1)
- W(IWBC-1) = W(IWBC-1)+W(IWBB-1)
- GO TO 122
- 121 W(IWBB-1) = W(K+1)
- 122 CONTINUE
- GO TO 107
- C
- C REVERSE COLUMNS WHEN NPEROD = 4
- C
- 123 IREV = 1
- NBY2 = N/2
- 124 DO 126 J=1,NBY2
- MSKIP = N+1-J
- DO 125 I=1,M
- A1 = Y(I,J)
- Y(I,J) = Y(I,MSKIP)
- Y(I,MSKIP) = A1
- 125 CONTINUE
- 126 CONTINUE
- GO TO (110,113),IREV
- 127 CONTINUE
- DO 132 J=1,N
- DO 128 I=1,MHM1
- MHMI = MH-I
- MHPI = MH+I
- W(MHMI) = .5*(Y(MHPI,J)+Y(I,J))
- W(MHPI) = .5*(Y(MHPI,J)-Y(I,J))
- 128 CONTINUE
- W(MH) = .5*Y(MH,J)
- GO TO (130,129),MODD
- 129 W(M) = .5*Y(M,J)
- 130 CONTINUE
- DO 131 I=1,M
- Y(I,J) = W(I)
- 131 CONTINUE
- 132 CONTINUE
- 133 CONTINUE
- C
- C RETURN STORAGE REQUIREMENTS FOR W ARRAY.
- C
- W(1) = CMPLX(REAL(IPSTOR+IWP-1),0.)
- RETURN
- END
- *DECK CMPCSG
- SUBROUTINE CMPCSG (N, IJUMP, FNUM, FDEN, A)
- C***BEGIN PROLOGUE CMPCSG
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to CMGNBN
- C***LIBRARY SLATEC
- C***TYPE COMPLEX (COSGEN-S, CMPCSG-C)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C This subroutine computes required cosine values in ascending
- C order. When IJUMP .GT. 1 the routine computes values
- C
- C 2*COS(J*PI/L) , J=1,2,...,L and J .NE. 0(MOD N/IJUMP+1)
- C
- C where L = IJUMP*(N/IJUMP+1).
- C
- C
- C when IJUMP = 1 it computes
- C
- C 2*COS((J-FNUM)*PI/(N+FDEN)) , J=1, 2, ... ,N
- C
- C where
- C FNUM = 0.5, FDEN = 0.0, for regular reduction values.
- C FNUM = 0.0, FDEN = 1.0, for B-R and C-R when ISTAG = 1
- C FNUM = 0.0, FDEN = 0.5, for B-R and C-R when ISTAG = 2
- C FNUM = 0.5, FDEN = 0.5, for B-R and C-R when ISTAG = 2
- C in CMPOSN only.
- C
- C***SEE ALSO CMGNBN
- C***ROUTINES CALLED PIMACH
- C***REVISION HISTORY (YYMMDD)
- C 801001 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900402 Added TYPE section. (WRB)
- C***END PROLOGUE CMPCSG
- COMPLEX A
- DIMENSION A(*)
- C
- C
- C***FIRST EXECUTABLE STATEMENT CMPCSG
- PI = PIMACH(DUM)
- IF (N .EQ. 0) GO TO 105
- IF (IJUMP .EQ. 1) GO TO 103
- K3 = N/IJUMP+1
- K4 = K3-1
- PIBYN = PI/(N+IJUMP)
- DO 102 K=1,IJUMP
- K1 = (K-1)*K3
- K5 = (K-1)*K4
- DO 101 I=1,K4
- X = K1+I
- K2 = K5+I
- A(K2) = CMPLX(-2.*COS(X*PIBYN),0.)
- 101 CONTINUE
- 102 CONTINUE
- GO TO 105
- 103 CONTINUE
- NP1 = N+1
- Y = PI/(N+FDEN)
- DO 104 I=1,N
- X = NP1-I-FNUM
- A(I) = CMPLX(2.*COS(X*Y),0.)
- 104 CONTINUE
- 105 CONTINUE
- RETURN
- END
- *DECK CMPOSD
- SUBROUTINE CMPOSD (MR, NR, ISTAG, BA, BB, BC, Q, IDIMQ, B, W, D,
- + TCOS, P)
- C***BEGIN PROLOGUE CMPOSD
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to CMGNBN
- C***LIBRARY SLATEC
- C***TYPE COMPLEX (POISD2-S, CMPOSD-C)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C Subroutine to solve Poisson's equation for Dirichlet boundary
- C conditions.
- C
- C ISTAG = 1 if the last diagonal block is the matrix A.
- C ISTAG = 2 if the last diagonal block is the matrix A+I.
- C
- C***SEE ALSO CMGNBN
- C***ROUTINES CALLED C1MERG, CMPCSG, CMPTRX
- C***REVISION HISTORY (YYMMDD)
- C 801001 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900402 Added TYPE section. (WRB)
- C 920130 Modified to use merge routine C1MERG rather than deleted
- C routine CMPMRG. (WRB)
- C***END PROLOGUE CMPOSD
- C
- COMPLEX BA ,BB ,BC ,Q ,
- 1 B ,W ,D ,TCOS ,
- 2 P ,T
- DIMENSION Q(IDIMQ,*) ,BA(*) ,BB(*) ,BC(*) ,
- 1 TCOS(*) ,B(*) ,D(*) ,W(*) ,
- 2 P(*)
- C***FIRST EXECUTABLE STATEMENT CMPOSD
- M = MR
- N = NR
- FI = 1./ISTAG
- IP = -M
- IPSTOR = 0
- JSH = 0
- GO TO (101,102),ISTAG
- 101 KR = 0
- IRREG = 1
- IF (N .GT. 1) GO TO 106
- TCOS(1) = (0.,0.)
- GO TO 103
- 102 KR = 1
- JSTSAV = 1
- IRREG = 2
- IF (N .GT. 1) GO TO 106
- TCOS(1) = CMPLX(-1.,0.)
- 103 DO 104 I=1,M
- B(I) = Q(I,1)
- 104 CONTINUE
- CALL CMPTRX (1,0,M,BA,BB,BC,B,TCOS,D,W)
- DO 105 I=1,M
- Q(I,1) = B(I)
- 105 CONTINUE
- GO TO 183
- 106 LR = 0
- DO 107 I=1,M
- P(I) = CMPLX(0.,0.)
- 107 CONTINUE
- NUN = N
- JST = 1
- JSP = N
- C
- C IRREG = 1 WHEN NO IRREGULARITIES HAVE OCCURRED, OTHERWISE IT IS 2.
- C
- 108 L = 2*JST
- NODD = 2-2*((NUN+1)/2)+NUN
- C
- C NODD = 1 WHEN NUN IS ODD, OTHERWISE IT IS 2.
- C
- GO TO (110,109),NODD
- 109 JSP = JSP-L
- GO TO 111
- 110 JSP = JSP-JST
- IF (IRREG .NE. 1) JSP = JSP-L
- 111 CONTINUE
- C
- C REGULAR REDUCTION
- C
- CALL CMPCSG (JST,1,0.5,0.0,TCOS)
- IF (L .GT. JSP) GO TO 118
- DO 117 J=L,JSP,L
- JM1 = J-JSH
- JP1 = J+JSH
- JM2 = J-JST
- JP2 = J+JST
- JM3 = JM2-JSH
- JP3 = JP2+JSH
- IF (JST .NE. 1) GO TO 113
- DO 112 I=1,M
- B(I) = 2.*Q(I,J)
- Q(I,J) = Q(I,JM2)+Q(I,JP2)
- 112 CONTINUE
- GO TO 115
- 113 DO 114 I=1,M
- T = Q(I,J)-Q(I,JM1)-Q(I,JP1)+Q(I,JM2)+Q(I,JP2)
- B(I) = T+Q(I,J)-Q(I,JM3)-Q(I,JP3)
- Q(I,J) = T
- 114 CONTINUE
- 115 CONTINUE
- CALL CMPTRX (JST,0,M,BA,BB,BC,B,TCOS,D,W)
- DO 116 I=1,M
- Q(I,J) = Q(I,J)+B(I)
- 116 CONTINUE
- 117 CONTINUE
- C
- C REDUCTION FOR LAST UNKNOWN
- C
- 118 GO TO (119,136),NODD
- 119 GO TO (152,120),IRREG
- C
- C ODD NUMBER OF UNKNOWNS
- C
- 120 JSP = JSP+L
- J = JSP
- JM1 = J-JSH
- JP1 = J+JSH
- JM2 = J-JST
- JP2 = J+JST
- JM3 = JM2-JSH
- GO TO (123,121),ISTAG
- 121 CONTINUE
- IF (JST .NE. 1) GO TO 123
- DO 122 I=1,M
- B(I) = Q(I,J)
- Q(I,J) = CMPLX(0.,0.)
- 122 CONTINUE
- GO TO 130
- 123 GO TO (124,126),NODDPR
- 124 DO 125 I=1,M
- IP1 = IP+I
- B(I) = .5*(Q(I,JM2)-Q(I,JM1)-Q(I,JM3))+P(IP1)+Q(I,J)
- 125 CONTINUE
- GO TO 128
- 126 DO 127 I=1,M
- B(I) = .5*(Q(I,JM2)-Q(I,JM1)-Q(I,JM3))+Q(I,JP2)-Q(I,JP1)+Q(I,J)
- 127 CONTINUE
- 128 DO 129 I=1,M
- Q(I,J) = .5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))
- 129 CONTINUE
- 130 CALL CMPTRX (JST,0,M,BA,BB,BC,B,TCOS,D,W)
- IP = IP+M
- IPSTOR = MAX(IPSTOR,IP+M)
- DO 131 I=1,M
- IP1 = IP+I
- P(IP1) = Q(I,J)+B(I)
- B(I) = Q(I,JP2)+P(IP1)
- 131 CONTINUE
- IF (LR .NE. 0) GO TO 133
- DO 132 I=1,JST
- KRPI = KR+I
- TCOS(KRPI) = TCOS(I)
- 132 CONTINUE
- GO TO 134
- 133 CONTINUE
- CALL CMPCSG (LR,JSTSAV,0.,FI,TCOS(JST+1))
- CALL C1MERG (TCOS,0,JST,JST,LR,KR)
- 134 CONTINUE
- CALL CMPCSG (KR,JSTSAV,0.0,FI,TCOS)
- CALL CMPTRX (KR,KR,M,BA,BB,BC,B,TCOS,D,W)
- DO 135 I=1,M
- IP1 = IP+I
- Q(I,J) = Q(I,JM2)+B(I)+P(IP1)
- 135 CONTINUE
- LR = KR
- KR = KR+L
- GO TO 152
- C
- C EVEN NUMBER OF UNKNOWNS
- C
- 136 JSP = JSP+L
- J = JSP
- JM1 = J-JSH
- JP1 = J+JSH
- JM2 = J-JST
- JP2 = J+JST
- JM3 = JM2-JSH
- GO TO (137,138),IRREG
- 137 CONTINUE
- JSTSAV = JST
- IDEG = JST
- KR = L
- GO TO 139
- 138 CALL CMPCSG (KR,JSTSAV,0.0,FI,TCOS)
- CALL CMPCSG (LR,JSTSAV,0.0,FI,TCOS(KR+1))
- IDEG = KR
- KR = KR+JST
- 139 IF (JST .NE. 1) GO TO 141
- IRREG = 2
- DO 140 I=1,M
- B(I) = Q(I,J)
- Q(I,J) = Q(I,JM2)
- 140 CONTINUE
- GO TO 150
- 141 DO 142 I=1,M
- B(I) = Q(I,J)+.5*(Q(I,JM2)-Q(I,JM1)-Q(I,JM3))
- 142 CONTINUE
- GO TO (143,145),IRREG
- 143 DO 144 I=1,M
- Q(I,J) = Q(I,JM2)+.5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))
- 144 CONTINUE
- IRREG = 2
- GO TO 150
- 145 CONTINUE
- GO TO (146,148),NODDPR
- 146 DO 147 I=1,M
- IP1 = IP+I
- Q(I,J) = Q(I,JM2)+P(IP1)
- 147 CONTINUE
- IP = IP-M
- GO TO 150
- 148 DO 149 I=1,M
- Q(I,J) = Q(I,JM2)+Q(I,J)-Q(I,JM1)
- 149 CONTINUE
- 150 CALL CMPTRX (IDEG,LR,M,BA,BB,BC,B,TCOS,D,W)
- DO 151 I=1,M
- Q(I,J) = Q(I,J)+B(I)
- 151 CONTINUE
- 152 NUN = NUN/2
- NODDPR = NODD
- JSH = JST
- JST = 2*JST
- IF (NUN .GE. 2) GO TO 108
- C
- C START SOLUTION.
- C
- J = JSP
- DO 153 I=1,M
- B(I) = Q(I,J)
- 153 CONTINUE
- GO TO (154,155),IRREG
- 154 CONTINUE
- CALL CMPCSG (JST,1,0.5,0.0,TCOS)
- IDEG = JST
- GO TO 156
- 155 KR = LR+JST
- CALL CMPCSG (KR,JSTSAV,0.0,FI,TCOS)
- CALL CMPCSG (LR,JSTSAV,0.0,FI,TCOS(KR+1))
- IDEG = KR
- 156 CONTINUE
- CALL CMPTRX (IDEG,LR,M,BA,BB,BC,B,TCOS,D,W)
- JM1 = J-JSH
- JP1 = J+JSH
- GO TO (157,159),IRREG
- 157 DO 158 I=1,M
- Q(I,J) = .5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))+B(I)
- 158 CONTINUE
- GO TO 164
- 159 GO TO (160,162),NODDPR
- 160 DO 161 I=1,M
- IP1 = IP+I
- Q(I,J) = P(IP1)+B(I)
- 161 CONTINUE
- IP = IP-M
- GO TO 164
- 162 DO 163 I=1,M
- Q(I,J) = Q(I,J)-Q(I,JM1)+B(I)
- 163 CONTINUE
- 164 CONTINUE
- C
- C START BACK SUBSTITUTION.
- C
- JST = JST/2
- JSH = JST/2
- NUN = 2*NUN
- IF (NUN .GT. N) GO TO 183
- DO 182 J=JST,N,L
- JM1 = J-JSH
- JP1 = J+JSH
- JM2 = J-JST
- JP2 = J+JST
- IF (J .GT. JST) GO TO 166
- DO 165 I=1,M
- B(I) = Q(I,J)+Q(I,JP2)
- 165 CONTINUE
- GO TO 170
- 166 IF (JP2 .LE. N) GO TO 168
- DO 167 I=1,M
- B(I) = Q(I,J)+Q(I,JM2)
- 167 CONTINUE
- IF (JST .LT. JSTSAV) IRREG = 1
- GO TO (170,171),IRREG
- 168 DO 169 I=1,M
- B(I) = Q(I,J)+Q(I,JM2)+Q(I,JP2)
- 169 CONTINUE
- 170 CONTINUE
- CALL CMPCSG (JST,1,0.5,0.0,TCOS)
- IDEG = JST
- JDEG = 0
- GO TO 172
- 171 IF (J+L .GT. N) LR = LR-JST
- KR = JST+LR
- CALL CMPCSG (KR,JSTSAV,0.0,FI,TCOS)
- CALL CMPCSG (LR,JSTSAV,0.0,FI,TCOS(KR+1))
- IDEG = KR
- JDEG = LR
- 172 CONTINUE
- CALL CMPTRX (IDEG,JDEG,M,BA,BB,BC,B,TCOS,D,W)
- IF (JST .GT. 1) GO TO 174
- DO 173 I=1,M
- Q(I,J) = B(I)
- 173 CONTINUE
- GO TO 182
- 174 IF (JP2 .GT. N) GO TO 177
- 175 DO 176 I=1,M
- Q(I,J) = .5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))+B(I)
- 176 CONTINUE
- GO TO 182
- 177 GO TO (175,178),IRREG
- 178 IF (J+JSH .GT. N) GO TO 180
- DO 179 I=1,M
- IP1 = IP+I
- Q(I,J) = B(I)+P(IP1)
- 179 CONTINUE
- IP = IP-M
- GO TO 182
- 180 DO 181 I=1,M
- Q(I,J) = B(I)+Q(I,J)-Q(I,JM1)
- 181 CONTINUE
- 182 CONTINUE
- L = L/2
- GO TO 164
- 183 CONTINUE
- C
- C RETURN STORAGE REQUIREMENTS FOR P VECTORS.
- C
- W(1) = CMPLX(REAL(IPSTOR),0.)
- RETURN
- END
- *DECK CMPOSN
- SUBROUTINE CMPOSN (M, N, ISTAG, MIXBND, A, BB, C, Q, IDIMQ, B, B2,
- + B3, W, W2, W3, D, TCOS, P)
- C***BEGIN PROLOGUE CMPOSN
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to CMGNBN
- C***LIBRARY SLATEC
- C***TYPE COMPLEX (POISN2-S, CMPOSN-C)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C Subroutine to solve Poisson's equation with Neumann boundary
- C conditions.
- C
- C ISTAG = 1 if the last diagonal block is A.
- C ISTAG = 2 if the last diagonal block is A-I.
- C MIXBND = 1 if have Neumann boundary conditions at both boundaries.
- C MIXBND = 2 if have Neumann boundary conditions at bottom and
- C Dirichlet condition at top. (For this case, must have ISTAG = 1)
- C
- C***SEE ALSO CMGNBN
- C***ROUTINES CALLED C1MERG, CMPCSG, CMPTR3, CMPTRX
- C***REVISION HISTORY (YYMMDD)
- C 801001 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900402 Added TYPE section. (WRB)
- C 920130 Modified to use merge routine C1MERG rather than deleted
- C routine CMPMRG. (WRB)
- C***END PROLOGUE CMPOSN
- C
- COMPLEX A ,BB ,C ,Q ,
- 1 B ,B2 ,B3 ,W ,
- 2 W2 ,W3 ,D ,TCOS ,
- 3 P ,FI ,T
- DIMENSION A(*) ,BB(*) ,C(*) ,Q(IDIMQ,*) ,
- 1 B(*) ,B2(*) ,B3(*) ,W(*) ,
- 2 W2(*) ,W3(*) ,D(*) ,TCOS(*) ,
- 3 K(4) ,P(*)
- EQUIVALENCE (K(1),K1) ,(K(2),K2) ,(K(3),K3) ,(K(4),K4)
- C***FIRST EXECUTABLE STATEMENT CMPOSN
- FISTAG = 3-ISTAG
- FNUM = 1./ISTAG
- FDEN = 0.5*(ISTAG-1)
- MR = M
- IP = -MR
- IPSTOR = 0
- I2R = 1
- JR = 2
- NR = N
- NLAST = N
- KR = 1
- LR = 0
- GO TO (101,103),ISTAG
- 101 CONTINUE
- DO 102 I=1,MR
- Q(I,N) = .5*Q(I,N)
- 102 CONTINUE
- GO TO (103,104),MIXBND
- 103 IF (N .LE. 3) GO TO 155
- 104 CONTINUE
- JR = 2*I2R
- NROD = 1
- IF ((NR/2)*2 .EQ. NR) NROD = 0
- GO TO (105,106),MIXBND
- 105 JSTART = 1
- GO TO 107
- 106 JSTART = JR
- NROD = 1-NROD
- 107 CONTINUE
- JSTOP = NLAST-JR
- IF (NROD .EQ. 0) JSTOP = JSTOP-I2R
- CALL CMPCSG (I2R,1,0.5,0.0,TCOS)
- I2RBY2 = I2R/2
- IF (JSTOP .GE. JSTART) GO TO 108
- J = JR
- GO TO 116
- 108 CONTINUE
- C
- C REGULAR REDUCTION.
- C
- DO 115 J=JSTART,JSTOP,JR
- JP1 = J+I2RBY2
- JP2 = J+I2R
- JP3 = JP2+I2RBY2
- JM1 = J-I2RBY2
- JM2 = J-I2R
- JM3 = JM2-I2RBY2
- IF (J .NE. 1) GO TO 109
- JM1 = JP1
- JM2 = JP2
- JM3 = JP3
- 109 CONTINUE
- IF (I2R .NE. 1) GO TO 111
- IF (J .EQ. 1) JM2 = JP2
- DO 110 I=1,MR
- B(I) = 2.*Q(I,J)
- Q(I,J) = Q(I,JM2)+Q(I,JP2)
- 110 CONTINUE
- GO TO 113
- 111 CONTINUE
- DO 112 I=1,MR
- FI = Q(I,J)
- Q(I,J) = Q(I,J)-Q(I,JM1)-Q(I,JP1)+Q(I,JM2)+Q(I,JP2)
- B(I) = FI+Q(I,J)-Q(I,JM3)-Q(I,JP3)
- 112 CONTINUE
- 113 CONTINUE
- CALL CMPTRX (I2R,0,MR,A,BB,C,B,TCOS,D,W)
- DO 114 I=1,MR
- Q(I,J) = Q(I,J)+B(I)
- 114 CONTINUE
- C
- C END OF REDUCTION FOR REGULAR UNKNOWNS.
- C
- 115 CONTINUE
- C
- C BEGIN SPECIAL REDUCTION FOR LAST UNKNOWN.
- C
- J = JSTOP+JR
- 116 NLAST = J
- JM1 = J-I2RBY2
- JM2 = J-I2R
- JM3 = JM2-I2RBY2
- IF (NROD .EQ. 0) GO TO 128
- C
- C ODD NUMBER OF UNKNOWNS
- C
- IF (I2R .NE. 1) GO TO 118
- DO 117 I=1,MR
- B(I) = FISTAG*Q(I,J)
- Q(I,J) = Q(I,JM2)
- 117 CONTINUE
- GO TO 126
- 118 DO 119 I=1,MR
- B(I) = Q(I,J)+.5*(Q(I,JM2)-Q(I,JM1)-Q(I,JM3))
- 119 CONTINUE
- IF (NRODPR .NE. 0) GO TO 121
- DO 120 I=1,MR
- II = IP+I
- Q(I,J) = Q(I,JM2)+P(II)
- 120 CONTINUE
- IP = IP-MR
- GO TO 123
- 121 CONTINUE
- DO 122 I=1,MR
- Q(I,J) = Q(I,J)-Q(I,JM1)+Q(I,JM2)
- 122 CONTINUE
- 123 IF (LR .EQ. 0) GO TO 124
- CALL CMPCSG (LR,1,0.5,FDEN,TCOS(KR+1))
- GO TO 126
- 124 CONTINUE
- DO 125 I=1,MR
- B(I) = FISTAG*B(I)
- 125 CONTINUE
- 126 CONTINUE
- CALL CMPCSG (KR,1,0.5,FDEN,TCOS)
- CALL CMPTRX (KR,LR,MR,A,BB,C,B,TCOS,D,W)
- DO 127 I=1,MR
- Q(I,J) = Q(I,J)+B(I)
- 127 CONTINUE
- KR = KR+I2R
- GO TO 151
- 128 CONTINUE
- C
- C EVEN NUMBER OF UNKNOWNS
- C
- JP1 = J+I2RBY2
- JP2 = J+I2R
- IF (I2R .NE. 1) GO TO 135
- DO 129 I=1,MR
- B(I) = Q(I,J)
- 129 CONTINUE
- CALL CMPTRX (1,0,MR,A,BB,C,B,TCOS,D,W)
- IP = 0
- IPSTOR = MR
- GO TO (133,130),ISTAG
- 130 DO 131 I=1,MR
- P(I) = B(I)
- B(I) = B(I)+Q(I,N)
- 131 CONTINUE
- TCOS(1) = CMPLX(1.,0.)
- TCOS(2) = CMPLX(0.,0.)
- CALL CMPTRX (1,1,MR,A,BB,C,B,TCOS,D,W)
- DO 132 I=1,MR
- Q(I,J) = Q(I,JM2)+P(I)+B(I)
- 132 CONTINUE
- GO TO 150
- 133 CONTINUE
- DO 134 I=1,MR
- P(I) = B(I)
- Q(I,J) = Q(I,JM2)+2.*Q(I,JP2)+3.*B(I)
- 134 CONTINUE
- GO TO 150
- 135 CONTINUE
- DO 136 I=1,MR
- B(I) = Q(I,J)+.5*(Q(I,JM2)-Q(I,JM1)-Q(I,JM3))
- 136 CONTINUE
- IF (NRODPR .NE. 0) GO TO 138
- DO 137 I=1,MR
- II = IP+I
- B(I) = B(I)+P(II)
- 137 CONTINUE
- GO TO 140
- 138 CONTINUE
- DO 139 I=1,MR
- B(I) = B(I)+Q(I,JP2)-Q(I,JP1)
- 139 CONTINUE
- 140 CONTINUE
- CALL CMPTRX (I2R,0,MR,A,BB,C,B,TCOS,D,W)
- IP = IP+MR
- IPSTOR = MAX(IPSTOR,IP+MR)
- DO 141 I=1,MR
- II = IP+I
- P(II) = B(I)+.5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))
- B(I) = P(II)+Q(I,JP2)
- 141 CONTINUE
- IF (LR .EQ. 0) GO TO 142
- CALL CMPCSG (LR,1,0.5,FDEN,TCOS(I2R+1))
- CALL C1MERG (TCOS,0,I2R,I2R,LR,KR)
- GO TO 144
- 142 DO 143 I=1,I2R
- II = KR+I
- TCOS(II) = TCOS(I)
- 143 CONTINUE
- 144 CALL CMPCSG (KR,1,0.5,FDEN,TCOS)
- IF (LR .NE. 0) GO TO 145
- GO TO (146,145),ISTAG
- 145 CONTINUE
- CALL CMPTRX (KR,KR,MR,A,BB,C,B,TCOS,D,W)
- GO TO 148
- 146 CONTINUE
- DO 147 I=1,MR
- B(I) = FISTAG*B(I)
- 147 CONTINUE
- 148 CONTINUE
- DO 149 I=1,MR
- II = IP+I
- Q(I,J) = Q(I,JM2)+P(II)+B(I)
- 149 CONTINUE
- 150 CONTINUE
- LR = KR
- KR = KR+JR
- 151 CONTINUE
- GO TO (152,153),MIXBND
- 152 NR = (NLAST-1)/JR+1
- IF (NR .LE. 3) GO TO 155
- GO TO 154
- 153 NR = NLAST/JR
- IF (NR .LE. 1) GO TO 192
- 154 I2R = JR
- NRODPR = NROD
- GO TO 104
- 155 CONTINUE
- C
- C BEGIN SOLUTION
- C
- J = 1+JR
- JM1 = J-I2R
- JP1 = J+I2R
- JM2 = NLAST-I2R
- IF (NR .EQ. 2) GO TO 184
- IF (LR .NE. 0) GO TO 170
- IF (N .NE. 3) GO TO 161
- C
- C CASE N = 3.
- C
- GO TO (156,168),ISTAG
- 156 CONTINUE
- DO 157 I=1,MR
- B(I) = Q(I,2)
- 157 CONTINUE
- TCOS(1) = CMPLX(0.,0.)
- CALL CMPTRX (1,0,MR,A,BB,C,B,TCOS,D,W)
- DO 158 I=1,MR
- Q(I,2) = B(I)
- B(I) = 4.*B(I)+Q(I,1)+2.*Q(I,3)
- 158 CONTINUE
- TCOS(1) = CMPLX(-2.,0.)
- TCOS(2) = CMPLX(2.,0.)
- I1 = 2
- I2 = 0
- CALL CMPTRX (I1,I2,MR,A,BB,C,B,TCOS,D,W)
- DO 159 I=1,MR
- Q(I,2) = Q(I,2)+B(I)
- B(I) = Q(I,1)+2.*Q(I,2)
- 159 CONTINUE
- TCOS(1) = (0.,0.)
- CALL CMPTRX (1,0,MR,A,BB,C,B,TCOS,D,W)
- DO 160 I=1,MR
- Q(I,1) = B(I)
- 160 CONTINUE
- JR = 1
- I2R = 0
- GO TO 194
- C
- C CASE N = 2**P+1
- C
- 161 CONTINUE
- GO TO (162,170),ISTAG
- 162 CONTINUE
- DO 163 I=1,MR
- B(I) = Q(I,J)+.5*Q(I,1)-Q(I,JM1)+Q(I,NLAST)-Q(I,JM2)
- 163 CONTINUE
- CALL CMPCSG (JR,1,0.5,0.0,TCOS)
- CALL CMPTRX (JR,0,MR,A,BB,C,B,TCOS,D,W)
- DO 164 I=1,MR
- Q(I,J) = .5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))+B(I)
- B(I) = Q(I,1)+2.*Q(I,NLAST)+4.*Q(I,J)
- 164 CONTINUE
- JR2 = 2*JR
- CALL CMPCSG (JR,1,0.0,0.0,TCOS)
- DO 165 I=1,JR
- I1 = JR+I
- I2 = JR+1-I
- TCOS(I1) = -TCOS(I2)
- 165 CONTINUE
- CALL CMPTRX (JR2,0,MR,A,BB,C,B,TCOS,D,W)
- DO 166 I=1,MR
- Q(I,J) = Q(I,J)+B(I)
- B(I) = Q(I,1)+2.*Q(I,J)
- 166 CONTINUE
- CALL CMPCSG (JR,1,0.5,0.0,TCOS)
- CALL CMPTRX (JR,0,MR,A,BB,C,B,TCOS,D,W)
- DO 167 I=1,MR
- Q(I,1) = .5*Q(I,1)-Q(I,JM1)+B(I)
- 167 CONTINUE
- GO TO 194
- C
- C CASE OF GENERAL N WITH NR = 3 .
- C
- 168 DO 169 I=1,MR
- B(I) = Q(I,2)
- Q(I,2) = (0.,0.)
- B2(I) = Q(I,3)
- B3(I) = Q(I,1)
- 169 CONTINUE
- JR = 1
- I2R = 0
- J = 2
- GO TO 177
- 170 CONTINUE
- DO 171 I=1,MR
- B(I) = .5*Q(I,1)-Q(I,JM1)+Q(I,J)
- 171 CONTINUE
- IF (NROD .NE. 0) GO TO 173
- DO 172 I=1,MR
- II = IP+I
- B(I) = B(I)+P(II)
- 172 CONTINUE
- GO TO 175
- 173 DO 174 I=1,MR
- B(I) = B(I)+Q(I,NLAST)-Q(I,JM2)
- 174 CONTINUE
- 175 CONTINUE
- DO 176 I=1,MR
- T = .5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))
- Q(I,J) = T
- B2(I) = Q(I,NLAST)+T
- B3(I) = Q(I,1)+2.*T
- 176 CONTINUE
- 177 CONTINUE
- K1 = KR+2*JR-1
- K2 = KR+JR
- TCOS(K1+1) = (-2.,0.)
- K4 = K1+3-ISTAG
- CALL CMPCSG (K2+ISTAG-2,1,0.0,FNUM,TCOS(K4))
- K4 = K1+K2+1
- CALL CMPCSG (JR-1,1,0.0,1.0,TCOS(K4))
- CALL C1MERG (TCOS,K1,K2,K1+K2,JR-1,0)
- K3 = K1+K2+LR
- CALL CMPCSG (JR,1,0.5,0.0,TCOS(K3+1))
- K4 = K3+JR+1
- CALL CMPCSG (KR,1,0.5,FDEN,TCOS(K4))
- CALL C1MERG (TCOS,K3,JR,K3+JR,KR,K1)
- IF (LR .EQ. 0) GO TO 178
- CALL CMPCSG (LR,1,0.5,FDEN,TCOS(K4))
- CALL C1MERG (TCOS,K3,JR,K3+JR,LR,K3-LR)
- CALL CMPCSG (KR,1,0.5,FDEN,TCOS(K4))
- 178 K3 = KR
- K4 = KR
- CALL CMPTR3 (MR,A,BB,C,K,B,B2,B3,TCOS,D,W,W2,W3)
- DO 179 I=1,MR
- B(I) = B(I)+B2(I)+B3(I)
- 179 CONTINUE
- TCOS(1) = (2.,0.)
- CALL CMPTRX (1,0,MR,A,BB,C,B,TCOS,D,W)
- DO 180 I=1,MR
- Q(I,J) = Q(I,J)+B(I)
- B(I) = Q(I,1)+2.*Q(I,J)
- 180 CONTINUE
- CALL CMPCSG (JR,1,0.5,0.0,TCOS)
- CALL CMPTRX (JR,0,MR,A,BB,C,B,TCOS,D,W)
- IF (JR .NE. 1) GO TO 182
- DO 181 I=1,MR
- Q(I,1) = B(I)
- 181 CONTINUE
- GO TO 194
- 182 CONTINUE
- DO 183 I=1,MR
- Q(I,1) = .5*Q(I,1)-Q(I,JM1)+B(I)
- 183 CONTINUE
- GO TO 194
- 184 CONTINUE
- IF (N .NE. 2) GO TO 188
- C
- C CASE N = 2
- C
- DO 185 I=1,MR
- B(I) = Q(I,1)
- 185 CONTINUE
- TCOS(1) = (0.,0.)
- CALL CMPTRX (1,0,MR,A,BB,C,B,TCOS,D,W)
- DO 186 I=1,MR
- Q(I,1) = B(I)
- B(I) = 2.*(Q(I,2)+B(I))*FISTAG
- 186 CONTINUE
- TCOS(1) = CMPLX(-FISTAG,0.)
- TCOS(2) = CMPLX(2.,0.)
- CALL CMPTRX (2,0,MR,A,BB,C,B,TCOS,D,W)
- DO 187 I=1,MR
- Q(I,1) = Q(I,1)+B(I)
- 187 CONTINUE
- JR = 1
- I2R = 0
- GO TO 194
- 188 CONTINUE
- C
- C CASE OF GENERAL N AND NR = 2 .
- C
- DO 189 I=1,MR
- II = IP+I
- B3(I) = (0.,0.)
- B(I) = Q(I,1)+2.*P(II)
- Q(I,1) = .5*Q(I,1)-Q(I,JM1)
- B2(I) = 2.*(Q(I,1)+Q(I,NLAST))
- 189 CONTINUE
- K1 = KR+JR-1
- TCOS(K1+1) = (-2.,0.)
- K4 = K1+3-ISTAG
- CALL CMPCSG (KR+ISTAG-2,1,0.0,FNUM,TCOS(K4))
- K4 = K1+KR+1
- CALL CMPCSG (JR-1,1,0.0,1.0,TCOS(K4))
- CALL C1MERG (TCOS,K1,KR,K1+KR,JR-1,0)
- CALL CMPCSG (KR,1,0.5,FDEN,TCOS(K1+1))
- K2 = KR
- K4 = K1+K2+1
- CALL CMPCSG (LR,1,0.5,FDEN,TCOS(K4))
- K3 = LR
- K4 = 0
- CALL CMPTR3 (MR,A,BB,C,K,B,B2,B3,TCOS,D,W,W2,W3)
- DO 190 I=1,MR
- B(I) = B(I)+B2(I)
- 190 CONTINUE
- TCOS(1) = (2.,0.)
- CALL CMPTRX (1,0,MR,A,BB,C,B,TCOS,D,W)
- DO 191 I=1,MR
- Q(I,1) = Q(I,1)+B(I)
- 191 CONTINUE
- GO TO 194
- 192 DO 193 I=1,MR
- B(I) = Q(I,NLAST)
- 193 CONTINUE
- GO TO 196
- 194 CONTINUE
- C
- C START BACK SUBSTITUTION.
- C
- J = NLAST-JR
- DO 195 I=1,MR
- B(I) = Q(I,NLAST)+Q(I,J)
- 195 CONTINUE
- 196 JM2 = NLAST-I2R
- IF (JR .NE. 1) GO TO 198
- DO 197 I=1,MR
- Q(I,NLAST) = (0.,0.)
- 197 CONTINUE
- GO TO 202
- 198 CONTINUE
- IF (NROD .NE. 0) GO TO 200
- DO 199 I=1,MR
- II = IP+I
- Q(I,NLAST) = P(II)
- 199 CONTINUE
- IP = IP-MR
- GO TO 202
- 200 DO 201 I=1,MR
- Q(I,NLAST) = Q(I,NLAST)-Q(I,JM2)
- 201 CONTINUE
- 202 CONTINUE
- CALL CMPCSG (KR,1,0.5,FDEN,TCOS)
- CALL CMPCSG (LR,1,0.5,FDEN,TCOS(KR+1))
- IF (LR .NE. 0) GO TO 204
- DO 203 I=1,MR
- B(I) = FISTAG*B(I)
- 203 CONTINUE
- 204 CONTINUE
- CALL CMPTRX (KR,LR,MR,A,BB,C,B,TCOS,D,W)
- DO 205 I=1,MR
- Q(I,NLAST) = Q(I,NLAST)+B(I)
- 205 CONTINUE
- NLASTP = NLAST
- 206 CONTINUE
- JSTEP = JR
- JR = I2R
- I2R = I2R/2
- IF (JR .EQ. 0) GO TO 222
- GO TO (207,208),MIXBND
- 207 JSTART = 1+JR
- GO TO 209
- 208 JSTART = JR
- 209 CONTINUE
- KR = KR-JR
- IF (NLAST+JR .GT. N) GO TO 210
- KR = KR-JR
- NLAST = NLAST+JR
- JSTOP = NLAST-JSTEP
- GO TO 211
- 210 CONTINUE
- JSTOP = NLAST-JR
- 211 CONTINUE
- LR = KR-JR
- CALL CMPCSG (JR,1,0.5,0.0,TCOS)
- DO 221 J=JSTART,JSTOP,JSTEP
- JM2 = J-JR
- JP2 = J+JR
- IF (J .NE. JR) GO TO 213
- DO 212 I=1,MR
- B(I) = Q(I,J)+Q(I,JP2)
- 212 CONTINUE
- GO TO 215
- 213 CONTINUE
- DO 214 I=1,MR
- B(I) = Q(I,J)+Q(I,JM2)+Q(I,JP2)
- 214 CONTINUE
- 215 CONTINUE
- IF (JR .NE. 1) GO TO 217
- DO 216 I=1,MR
- Q(I,J) = (0.,0.)
- 216 CONTINUE
- GO TO 219
- 217 CONTINUE
- JM1 = J-I2R
- JP1 = J+I2R
- DO 218 I=1,MR
- Q(I,J) = .5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))
- 218 CONTINUE
- 219 CONTINUE
- CALL CMPTRX (JR,0,MR,A,BB,C,B,TCOS,D,W)
- DO 220 I=1,MR
- Q(I,J) = Q(I,J)+B(I)
- 220 CONTINUE
- 221 CONTINUE
- NROD = 1
- IF (NLAST+I2R .LE. N) NROD = 0
- IF (NLASTP .NE. NLAST) GO TO 194
- GO TO 206
- 222 CONTINUE
- C
- C RETURN STORAGE REQUIREMENTS FOR P VECTORS.
- C
- W(1) = CMPLX(REAL(IPSTOR),0.)
- RETURN
- END
- *DECK CMPOSP
- SUBROUTINE CMPOSP (M, N, A, BB, C, Q, IDIMQ, B, B2, B3, W, W2, W3,
- + D, TCOS, P)
- C***BEGIN PROLOGUE CMPOSP
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to CMGNBN
- C***LIBRARY SLATEC
- C***TYPE COMPLEX (POISP2-S, CMPOSP-C)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C Subroutine to solve Poisson's equation with periodic boundary
- C conditions.
- C
- C***SEE ALSO CMGNBN
- C***ROUTINES CALLED CMPOSD, CMPOSN
- C***REVISION HISTORY (YYMMDD)
- C 801001 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900402 Added TYPE section. (WRB)
- C***END PROLOGUE CMPOSP
- C
- COMPLEX A ,BB ,C ,Q ,
- 1 B ,B2 ,B3 ,W ,
- 2 W2 ,W3 ,D ,TCOS ,
- 3 P ,S ,T
- DIMENSION A(*) ,BB(*) ,C(*) ,Q(IDIMQ,*) ,
- 1 B(*) ,B2(*) ,B3(*) ,W(*) ,
- 2 W2(*) ,W3(*) ,D(*) ,TCOS(*) ,
- 3 P(*)
- C***FIRST EXECUTABLE STATEMENT CMPOSP
- MR = M
- NR = (N+1)/2
- NRM1 = NR-1
- IF (2*NR .NE. N) GO TO 107
- C
- C EVEN NUMBER OF UNKNOWNS
- C
- DO 102 J=1,NRM1
- NRMJ = NR-J
- NRPJ = NR+J
- DO 101 I=1,MR
- S = Q(I,NRMJ)-Q(I,NRPJ)
- T = Q(I,NRMJ)+Q(I,NRPJ)
- Q(I,NRMJ) = S
- Q(I,NRPJ) = T
- 101 CONTINUE
- 102 CONTINUE
- DO 103 I=1,MR
- Q(I,NR) = 2.*Q(I,NR)
- Q(I,N) = 2.*Q(I,N)
- 103 CONTINUE
- CALL CMPOSD (MR,NRM1,1,A,BB,C,Q,IDIMQ,B,W,D,TCOS,P)
- IPSTOR = REAL(W(1))
- CALL CMPOSN (MR,NR+1,1,1,A,BB,C,Q(1,NR),IDIMQ,B,B2,B3,W,W2,W3,D,
- 1 TCOS,P)
- IPSTOR = MAX(IPSTOR,INT(REAL(W(1))))
- DO 105 J=1,NRM1
- NRMJ = NR-J
- NRPJ = NR+J
- DO 104 I=1,MR
- S = .5*(Q(I,NRPJ)+Q(I,NRMJ))
- T = .5*(Q(I,NRPJ)-Q(I,NRMJ))
- Q(I,NRMJ) = S
- Q(I,NRPJ) = T
- 104 CONTINUE
- 105 CONTINUE
- DO 106 I=1,MR
- Q(I,NR) = .5*Q(I,NR)
- Q(I,N) = .5*Q(I,N)
- 106 CONTINUE
- GO TO 118
- 107 CONTINUE
- C
- C ODD NUMBER OF UNKNOWNS
- C
- DO 109 J=1,NRM1
- NRPJ = N+1-J
- DO 108 I=1,MR
- S = Q(I,J)-Q(I,NRPJ)
- T = Q(I,J)+Q(I,NRPJ)
- Q(I,J) = S
- Q(I,NRPJ) = T
- 108 CONTINUE
- 109 CONTINUE
- DO 110 I=1,MR
- Q(I,NR) = 2.*Q(I,NR)
- 110 CONTINUE
- LH = NRM1/2
- DO 112 J=1,LH
- NRMJ = NR-J
- DO 111 I=1,MR
- S = Q(I,J)
- Q(I,J) = Q(I,NRMJ)
- Q(I,NRMJ) = S
- 111 CONTINUE
- 112 CONTINUE
- CALL CMPOSD (MR,NRM1,2,A,BB,C,Q,IDIMQ,B,W,D,TCOS,P)
- IPSTOR = REAL(W(1))
- CALL CMPOSN (MR,NR,2,1,A,BB,C,Q(1,NR),IDIMQ,B,B2,B3,W,W2,W3,D,
- 1 TCOS,P)
- IPSTOR = MAX(IPSTOR,INT(REAL(W(1))))
- DO 114 J=1,NRM1
- NRPJ = NR+J
- DO 113 I=1,MR
- S = .5*(Q(I,NRPJ)+Q(I,J))
- T = .5*(Q(I,NRPJ)-Q(I,J))
- Q(I,NRPJ) = T
- Q(I,J) = S
- 113 CONTINUE
- 114 CONTINUE
- DO 115 I=1,MR
- Q(I,NR) = .5*Q(I,NR)
- 115 CONTINUE
- DO 117 J=1,LH
- NRMJ = NR-J
- DO 116 I=1,MR
- S = Q(I,J)
- Q(I,J) = Q(I,NRMJ)
- Q(I,NRMJ) = S
- 116 CONTINUE
- 117 CONTINUE
- 118 CONTINUE
- C
- C RETURN STORAGE REQUIREMENTS FOR P VECTORS.
- C
- W(1) = CMPLX(REAL(IPSTOR),0.)
- RETURN
- END
- *DECK CMPTR3
- SUBROUTINE CMPTR3 (M, A, B, C, K, Y1, Y2, Y3, TCOS, D, W1, W2, W3)
- C***BEGIN PROLOGUE CMPTR3
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to CMGNBN
- C***LIBRARY SLATEC
- C***TYPE COMPLEX (TRI3-S, CMPTR3-C)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C Subroutine to solve tridiagonal systems.
- C
- C***SEE ALSO CMGNBN
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 801001 DATE WRITTEN
- C 890206 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900402 Added TYPE section. (WRB)
- C***END PROLOGUE CMPTR3
- COMPLEX A ,B ,C ,Y1 ,
- 1 Y2 ,Y3 ,TCOS ,D ,
- 2 W1 ,W2 ,W3 ,X ,
- 3 XX ,Z
- DIMENSION A(*) ,B(*) ,C(*) ,K(4) ,
- 1 TCOS(*) ,Y1(*) ,Y2(*) ,Y3(*) ,
- 2 D(*) ,W1(*) ,W2(*) ,W3(*)
- INTEGER K1P1, K2P1, K3P1, K4P1
- C
- C***FIRST EXECUTABLE STATEMENT CMPTR3
- MM1 = M-1
- K1 = K(1)
- K2 = K(2)
- K3 = K(3)
- K4 = K(4)
- K1P1 = K1+1
- K2P1 = K2+1
- K3P1 = K3+1
- K4P1 = K4+1
- K2K3K4 = K2+K3+K4
- IF (K2K3K4 .EQ. 0) GO TO 101
- L1 = K1P1/K2P1
- L2 = K1P1/K3P1
- L3 = K1P1/K4P1
- LINT1 = 1
- LINT2 = 1
- LINT3 = 1
- KINT1 = K1
- KINT2 = KINT1+K2
- KINT3 = KINT2+K3
- 101 CONTINUE
- DO 115 N=1,K1
- X = TCOS(N)
- IF (K2K3K4 .EQ. 0) GO TO 107
- IF (N .NE. L1) GO TO 103
- DO 102 I=1,M
- W1(I) = Y1(I)
- 102 CONTINUE
- 103 IF (N .NE. L2) GO TO 105
- DO 104 I=1,M
- W2(I) = Y2(I)
- 104 CONTINUE
- 105 IF (N .NE. L3) GO TO 107
- DO 106 I=1,M
- W3(I) = Y3(I)
- 106 CONTINUE
- 107 CONTINUE
- Z = 1./(B(1)-X)
- D(1) = C(1)*Z
- Y1(1) = Y1(1)*Z
- Y2(1) = Y2(1)*Z
- Y3(1) = Y3(1)*Z
- DO 108 I=2,M
- Z = 1./(B(I)-X-A(I)*D(I-1))
- D(I) = C(I)*Z
- Y1(I) = (Y1(I)-A(I)*Y1(I-1))*Z
- Y2(I) = (Y2(I)-A(I)*Y2(I-1))*Z
- Y3(I) = (Y3(I)-A(I)*Y3(I-1))*Z
- 108 CONTINUE
- DO 109 IP=1,MM1
- I = M-IP
- Y1(I) = Y1(I)-D(I)*Y1(I+1)
- Y2(I) = Y2(I)-D(I)*Y2(I+1)
- Y3(I) = Y3(I)-D(I)*Y3(I+1)
- 109 CONTINUE
- IF (K2K3K4 .EQ. 0) GO TO 115
- IF (N .NE. L1) GO TO 111
- I = LINT1+KINT1
- XX = X-TCOS(I)
- DO 110 I=1,M
- Y1(I) = XX*Y1(I)+W1(I)
- 110 CONTINUE
- LINT1 = LINT1+1
- L1 = (LINT1*K1P1)/K2P1
- 111 IF (N .NE. L2) GO TO 113
- I = LINT2+KINT2
- XX = X-TCOS(I)
- DO 112 I=1,M
- Y2(I) = XX*Y2(I)+W2(I)
- 112 CONTINUE
- LINT2 = LINT2+1
- L2 = (LINT2*K1P1)/K3P1
- 113 IF (N .NE. L3) GO TO 115
- I = LINT3+KINT3
- XX = X-TCOS(I)
- DO 114 I=1,M
- Y3(I) = XX*Y3(I)+W3(I)
- 114 CONTINUE
- LINT3 = LINT3+1
- L3 = (LINT3*K1P1)/K4P1
- 115 CONTINUE
- RETURN
- END
- *DECK CMPTRX
- SUBROUTINE CMPTRX (IDEGBR, IDEGCR, M, A, B, C, Y, TCOS, D, W)
- C***BEGIN PROLOGUE CMPTRX
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to CMGNBN
- C***LIBRARY SLATEC
- C***TYPE COMPLEX (TRIX-S, CMPTRX-C)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C Subroutine to solve a system of linear equations where the
- C coefficient matrix is a rational function in the matrix given by
- C tridiagonal ( . . . , A(I), B(I), C(I), . . . ).
- C
- C***SEE ALSO CMGNBN
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 801001 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900402 Added TYPE section. (WRB)
- C***END PROLOGUE CMPTRX
- C
- COMPLEX A ,B ,C ,Y ,
- 1 TCOS ,D ,W ,X ,
- 2 XX ,Z
- DIMENSION A(*) ,B(*) ,C(*) ,Y(*) ,
- 1 TCOS(*) ,D(*) ,W(*)
- INTEGER KB, KC
- C***FIRST EXECUTABLE STATEMENT CMPTRX
- MM1 = M-1
- KB = IDEGBR+1
- KC = IDEGCR+1
- L = KB/KC
- LINT = 1
- DO 108 K=1,IDEGBR
- X = TCOS(K)
- IF (K .NE. L) GO TO 102
- I = IDEGBR+LINT
- XX = X-TCOS(I)
- DO 101 I=1,M
- W(I) = Y(I)
- Y(I) = XX*Y(I)
- 101 CONTINUE
- 102 CONTINUE
- Z = 1./(B(1)-X)
- D(1) = C(1)*Z
- Y(1) = Y(1)*Z
- DO 103 I=2,MM1
- Z = 1./(B(I)-X-A(I)*D(I-1))
- D(I) = C(I)*Z
- Y(I) = (Y(I)-A(I)*Y(I-1))*Z
- 103 CONTINUE
- Z = B(M)-X-A(M)*D(MM1)
- IF (ABS(Z) .NE. 0.) GO TO 104
- Y(M) = (0.,0.)
- GO TO 105
- 104 Y(M) = (Y(M)-A(M)*Y(MM1))/Z
- 105 CONTINUE
- DO 106 IP=1,MM1
- I = M-IP
- Y(I) = Y(I)-D(I)*Y(I+1)
- 106 CONTINUE
- IF (K .NE. L) GO TO 108
- DO 107 I=1,M
- Y(I) = Y(I)+W(I)
- 107 CONTINUE
- LINT = LINT+1
- L = (LINT*KB)/KC
- 108 CONTINUE
- RETURN
- END
- *DECK CNBCO
- SUBROUTINE CNBCO (ABE, LDA, N, ML, MU, IPVT, RCOND, Z)
- C***BEGIN PROLOGUE CNBCO
- C***PURPOSE Factor a band matrix using Gaussian elimination and
- C estimate the condition number.
- C***LIBRARY SLATEC
- C***CATEGORY D2C2
- C***TYPE COMPLEX (SNBCO-S, DNBCO-D, CNBCO-C)
- C***KEYWORDS BANDED, LINEAR EQUATIONS, MATRIX FACTORIZATION,
- C NONSYMMETRIC
- C***AUTHOR Voorhees, E. A., (LANL)
- C***DESCRIPTION
- C
- C CNBCO factors a complex band matrix by Gaussian
- C elimination and estimates the condition of the matrix.
- C
- C If RCOND is not needed, CNBFA is slightly faster.
- C To solve A*X = B , follow CNBCO by CNBSL.
- C To compute INVERSE(A)*C , follow CNBCO by CNBSL.
- C To compute DETERMINANT(A) , follow CNBCO by CNBDI.
- C
- C On Entry
- C
- C ABE COMPLEX(LDA, NC)
- C contains the matrix in band storage. The rows
- C of the original matrix are stored in the rows
- C of ABE and the diagonals of the original matrix
- C are stored in columns 1 through ML+MU+1 of ABE.
- C NC must be .GE. 2*ML+MU+1 .
- C See the comments below for details.
- C
- C LDA INTEGER
- C the leading dimension of the array ABE.
- C LDA must be .GE. N .
- C
- C N INTEGER
- C the order of the original matrix.
- C
- C ML INTEGER
- C number of diagonals below the main diagonal.
- C 0 .LE. ML .LT. N .
- C
- C MU INTEGER
- C number of diagonals above the main diagonal.
- C 0 .LE. MU .LT. N .
- C More efficient if ML .LE. MU .
- C
- C On Return
- C
- C ABE an upper triangular matrix in band storage
- C and the multipliers which were used to obtain it.
- C The factorization can be written A = L*U where
- C L is a product of permutation and unit lower
- C triangular matrices and U is upper triangular.
- C
- C IPVT INTEGER(N)
- C an integer vector of pivot indices.
- C
- C RCOND REAL
- C an estimate of the reciprocal condition of A .
- C For the system A*X = B , relative perturbations
- C in A and B of size EPSILON may cause
- C relative perturbations in X of size EPSILON/RCOND .
- C If RCOND is so small that the logical expression
- C 1.0 + RCOND .EQ. 1.0
- C is true, then A may be singular to working
- C precision. In particular, RCOND is zero if
- C exact singularity is detected or the estimate
- C underflows.
- C
- C Z COMPLEX(N)
- C a work vector whose contents are usually unimportant.
- C If A is close to a singular matrix, then Z is
- C an approximate null vector in the sense that
- C NORM(A*Z) = RCOND*NORM(A)*NORM(Z) .
- C
- C Band Storage
- C
- C If A is a band matrix, the following program segment
- C will set up the input.
- C
- C ML = (band width below the diagonal)
- C MU = (band width above the diagonal)
- C DO 20 I = 1, N
- C J1 = MAX(1, I-ML)
- C J2 = MIN(N, I+MU)
- C DO 10 J = J1, J2
- C K = J - I + ML + 1
- C ABE(I,K) = A(I,J)
- C 10 CONTINUE
- C 20 CONTINUE
- C
- C This uses columns 1 through ML+MU+1 of ABE .
- C Furthermore, ML additional columns are needed in
- C ABE starting with column ML+MU+2 for elements
- C generated during the triangularization. The total
- C number of columns needed in ABE is 2*ML+MU+1 .
- C
- C Example: If the original matrix is
- C
- C 11 12 13 0 0 0
- C 21 22 23 24 0 0
- C 0 32 33 34 35 0
- C 0 0 43 44 45 46
- C 0 0 0 54 55 56
- C 0 0 0 0 65 66
- C
- C then N = 6, ML = 1, MU = 2, LDA .GE. 5 and ABE should contain
- C
- C * 11 12 13 + , * = not used
- C 21 22 23 24 + , + = used for pivoting
- C 32 33 34 35 +
- C 43 44 45 46 +
- C 54 55 56 * +
- C 65 66 * * +
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CAXPY, CDOTC, CNBFA, CSSCAL, SCASUM
- C***REVISION HISTORY (YYMMDD)
- C 800730 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CNBCO
- INTEGER LDA,N,ML,MU,IPVT(*)
- COMPLEX ABE(LDA,*),Z(*)
- REAL RCOND
- C
- COMPLEX CDOTC,EK,T,WK,WKM
- REAL ANORM,S,SCASUM,SM,YNORM
- INTEGER I,INFO,J,JU,K,KB,KP1,L,LDB,LM,LZ,M,ML1,MM,NL,NU
- COMPLEX ZDUM,ZDUM1,ZDUM2,CSIGN1
- REAL CABS1
- CABS1(ZDUM) = ABS(REAL(ZDUM)) + ABS(AIMAG(ZDUM))
- CSIGN1(ZDUM1,ZDUM2) = CABS1(ZDUM1)*(ZDUM2/CABS1(ZDUM2))
- C
- C COMPUTE 1-NORM OF A
- C
- C***FIRST EXECUTABLE STATEMENT CNBCO
- ML1=ML+1
- LDB = LDA - 1
- ANORM = 0.0E0
- DO 10 J = 1, N
- NU = MIN(MU,J-1)
- NL = MIN(ML,N-J)
- L = 1 + NU + NL
- ANORM = MAX(ANORM,SCASUM(L,ABE(J+NL,ML1-NL),LDB))
- 10 CONTINUE
- C
- C FACTOR
- C
- CALL CNBFA(ABE,LDA,N,ML,MU,IPVT,INFO)
- C
- C RCOND = 1/(NORM(A)*(ESTIMATE OF NORM(INVERSE(A)))) .
- C ESTIMATE = NORM(Z)/NORM(Y) WHERE A*Z = Y AND CTRANS(A)*Y = E .
- C CTRANS(A) IS THE CONJUGATE TRANSPOSE OF A .
- C THE COMPONENTS OF E ARE CHOSEN TO CAUSE MAXIMUM LOCAL
- C GROWTH IN THE ELEMENTS OF W WHERE CTRANS(U)*W = E .
- C THE VECTORS ARE FREQUENTLY RESCALED TO AVOID OVERFLOW.
- C
- C SOLVE CTRANS(U)*W = E
- C
- EK = (1.0E0,0.0E0)
- DO 20 J = 1, N
- Z(J) = (0.0E0,0.0E0)
- 20 CONTINUE
- M = ML + MU + 1
- JU = 0
- DO 100 K = 1, N
- IF (CABS1(Z(K)) .NE. 0.0E0) EK = CSIGN1(EK,-Z(K))
- IF (CABS1(EK-Z(K)) .LE. CABS1(ABE(K,ML1))) GO TO 30
- S = CABS1(ABE(K,ML1))/CABS1(EK-Z(K))
- CALL CSSCAL(N,S,Z,1)
- EK = CMPLX(S,0.0E0)*EK
- 30 CONTINUE
- WK = EK - Z(K)
- WKM = -EK - Z(K)
- S = CABS1(WK)
- SM = CABS1(WKM)
- IF (CABS1(ABE(K,ML1)) .EQ. 0.0E0) GO TO 40
- WK = WK/CONJG(ABE(K,ML1))
- WKM = WKM/CONJG(ABE(K,ML1))
- GO TO 50
- 40 CONTINUE
- WK = (1.0E0,0.0E0)
- WKM = (1.0E0,0.0E0)
- 50 CONTINUE
- KP1 = K + 1
- JU = MIN(MAX(JU,MU+IPVT(K)),N)
- MM = ML1
- IF (KP1 .GT. JU) GO TO 90
- DO 60 I = KP1, JU
- MM = MM + 1
- SM = SM + CABS1(Z(I)+WKM*CONJG(ABE(K,MM)))
- Z(I) = Z(I) + WK*CONJG(ABE(K,MM))
- S = S + CABS1(Z(I))
- 60 CONTINUE
- IF (S .GE. SM) GO TO 80
- T = WKM -WK
- WK = WKM
- MM = ML1
- DO 70 I = KP1, JU
- MM = MM + 1
- Z(I) = Z(I) + T*CONJG(ABE(K,MM))
- 70 CONTINUE
- 80 CONTINUE
- 90 CONTINUE
- Z(K) = WK
- 100 CONTINUE
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- C
- C SOLVE CTRANS(L)*Y = W
- C
- DO 120 KB = 1, N
- K = N + 1 - KB
- NL = MIN(ML,N-K)
- IF (K .LT. N) Z(K) = Z(K) + CDOTC(NL,ABE(K+NL,ML1-NL),-LDB,
- 1 Z(K+1),1)
- IF (CABS1(Z(K)) .LE. 1.0E0) GO TO 110
- S = 1.0E0/CABS1(Z(K))
- CALL CSSCAL(N,S,Z,1)
- 110 CONTINUE
- L = IPVT(K)
- T = Z(L)
- Z(L) = Z(K)
- Z(K) = T
- 120 CONTINUE
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- C
- YNORM = 1.0E0
- C
- C SOLVE L*V = Y
- C
- DO 140 K = 1, N
- L = IPVT(K)
- T = Z(L)
- Z(L) = Z(K)
- Z(K) = T
- NL = MIN(ML,N-K)
- IF (K .LT. N) CALL CAXPY(NL,T,ABE(K+NL,ML1-NL),-LDB,Z(K+1),1)
- IF (CABS1(Z(K)) .LE. 1.0E0) GO TO 130
- S = 1.0E0/CABS1(Z(K))
- CALL CSSCAL(N,S,Z,1)
- YNORM = S*YNORM
- 130 CONTINUE
- 140 CONTINUE
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- YNORM = S*YNORM
- C
- C SOLVE U*Z = V
- C
- DO 160 KB = 1, N
- K = N + 1 - KB
- IF (CABS1(Z(K)) .LE. CABS1(ABE(K,ML1))) GO TO 150
- S = CABS1(ABE(K,ML1))/CABS1(Z(K))
- CALL CSSCAL(N,S,Z,1)
- YNORM = S*YNORM
- 150 CONTINUE
- IF (CABS1(ABE(K,ML1)) .NE. 0.0E0) Z(K) = Z(K)/ABE(K,ML1)
- IF (CABS1(ABE(K,ML1)) .EQ. 0.0E0) Z(K) = 1.0E0
- LM = MIN(K,M) - 1
- LZ = K - LM
- T = -Z(K)
- CALL CAXPY(LM,T,ABE(K-1,ML+2),-LDB,Z(LZ),1)
- 160 CONTINUE
- C MAKE ZNORM = 1.0E0
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- YNORM = S*YNORM
- C
- IF (ANORM .NE. 0.0E0) RCOND = YNORM/ANORM
- IF (ANORM .EQ. 0.0E0) RCOND = 0.0E0
- RETURN
- END
- *DECK CNBDI
- SUBROUTINE CNBDI (ABE, LDA, N, ML, MU, IPVT, DET)
- C***BEGIN PROLOGUE CNBDI
- C***PURPOSE Compute the determinant of a band matrix using the factors
- C computed by CNBCO or CNBFA.
- C***LIBRARY SLATEC
- C***CATEGORY D3C2
- C***TYPE COMPLEX (SNBDI-S, DNBDI-D, CNBDI-C)
- C***KEYWORDS BANDED, DETERMINANT, LINEAR EQUATIONS, NONSYMMETRIC
- C***AUTHOR Voorhees, E. A., (LANL)
- C***DESCRIPTION
- C
- C CNBDI computes the determinant of a band matrix
- C using the factors computed by CNBCO or CNBFA.
- C If the inverse is needed, use CNBSL N times.
- C
- C On Entry
- C
- C ABE COMPLEX(LDA, NC)
- C the output from CNBCO or CNBFA.
- C NC must be .GE. 2*ML+MU+1 .
- C
- C LDA INTEGER
- C the leading dimension of the array ABE .
- C
- C N INTEGER
- C the order of the original matrix.
- C
- C ML INTEGER
- C number of diagonals below the main diagonal.
- C
- C MU INTEGER
- C number of diagonals above the main diagonal.
- C
- C IPVT INTEGER(N)
- C the pivot vector from CNBCO or CNBFA.
- C
- C On Return
- C
- C DET COMPLEX(2)
- C determinant of original matrix.
- C Determinant = DET(1) * 10.0**DET(2)
- C with 1.0 .LE. CABS1(DET(1)) .LT. 10.0
- C or DET(1) = 0.0 .
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 800730 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CNBDI
- INTEGER LDA,N,ML,MU,IPVT(*)
- COMPLEX ABE(LDA,*),DET(2)
- C
- REAL TEN
- INTEGER I
- COMPLEX ZDUM
- REAL CABS1
- CABS1(ZDUM) = ABS(REAL(ZDUM)) + ABS(AIMAG(ZDUM))
- C
- C***FIRST EXECUTABLE STATEMENT CNBDI
- DET(1) = (1.0E0,0.0E0)
- DET(2) = (0.0E0,0.0E0)
- TEN = 10.0E0
- DO 50 I = 1, N
- IF (IPVT(I) .NE. I) DET(1) = -DET(1)
- DET(1) = ABE(I,ML+1)*DET(1)
- IF (CABS1(DET(1)) .EQ. 0.0E0) GO TO 60
- 10 IF (CABS1(DET(1)) .GE. 1.0E0) GO TO 20
- DET(1) = CMPLX(TEN,0.0E0)*DET(1)
- DET(2) = DET(2) - (1.0E0,0.0E0)
- GO TO 10
- 20 CONTINUE
- 30 IF (CABS1(DET(1)) .LT. TEN) GO TO 40
- DET(1) = DET(1)/CMPLX(TEN,0.0E0)
- DET(2) = DET(2) + (1.0E0,0.0E0)
- GO TO 30
- 40 CONTINUE
- 50 CONTINUE
- 60 CONTINUE
- RETURN
- END
- *DECK CNBFA
- SUBROUTINE CNBFA (ABE, LDA, N, ML, MU, IPVT, INFO)
- C***BEGIN PROLOGUE CNBFA
- C***PURPOSE Factor a band matrix by elimination.
- C***LIBRARY SLATEC
- C***CATEGORY D2C2
- C***TYPE COMPLEX (SNBFA-S, DNBFA-D, CNBFA-C)
- C***KEYWORDS BANDED, LINEAR EQUATIONS, MATRIX FACTORIZATION,
- C NONSYMMETRIC
- C***AUTHOR Voorhees, E. A., (LANL)
- C***DESCRIPTION
- C
- C CNBFA factors a complex band matrix by elimination.
- C
- C CNBFA is usually called by CNBCO, but it can be called
- C directly with a saving in time if RCOND is not needed.
- C
- C On Entry
- C
- C ABE COMPLEX(LDA, NC)
- C contains the matrix in band storage. The rows
- C of the original matrix are stored in the rows
- C of ABE and the diagonals of the original matrix
- C are stored in columns 1 through ML+MU+1 of ABE.
- C NC must be .GE. 2*ML+MU+1 .
- C See the comments below for details.
- C
- C LDA INTEGER
- C the leading dimension of the array ABE.
- C LDA must be .GE. N .
- C
- C N INTEGER
- C the order of the original matrix.
- C
- C ML INTEGER
- C number of diagonals below the main diagonal.
- C 0 .LE. ML .LT. N .
- C
- C MU INTEGER
- C number of diagonals above the main diagonal.
- C 0 .LE. MU .LT. N .
- C More efficient if ML .LE. MU .
- C
- C On Return
- C
- C ABE an upper triangular matrix in band storage
- C and the multipliers which were used to obtain it.
- C the factorization can be written A = L*U where
- C L is a product of permutation and unit lower
- C triangular matrices and U is upper triangular.
- C
- C IPVT INTEGER(N)
- C an integer vector of pivot indices.
- C
- C INFO INTEGER
- C =0 normal value
- C =K if U(K,K) .EQ. 0.0 . This is not an error
- C condition for this subroutine, but it does
- C indicate that CNBSL will divide by zero if
- C called. Use RCOND in CNBCO for a reliable
- C indication of singularity.
- C
- C Band Storage
- C
- C If A is a band matrix, the following program segment
- C will set up the input.
- C
- C ML = (band width below the diagonal)
- C MU = (band width above the diagonal)
- C DO 20 I = 1, N
- C J1 = MAX(1, I-ML)
- C J2 = MIN(N, I+MU)
- C DO 10 J = J1, J2
- C K = J - I + ML + 1
- C ABE(I,K) = A(I,J)
- C 10 CONTINUE
- C 20 CONTINUE
- C
- C This uses columns 1 through ML+MU+1 of ABE .
- C Furthermore, ML additional columns are needed in
- C ABE starting with column ML+MU+2 for elements
- C generated during the triangularization. The total
- C number of columns needed in ABE is 2*ML+MU+1 .
- C
- C Example: If the original matrix is
- C
- C 11 12 13 0 0 0
- C 21 22 23 24 0 0
- C 0 32 33 34 35 0
- C 0 0 43 44 45 46
- C 0 0 0 54 55 56
- C 0 0 0 0 65 66
- C
- C then N = 6, ML = 1, MU = 2, LDA .GE. 5 and ABE should contain
- C
- C * 11 12 13 + , * = not used
- C 21 22 23 24 + , + = used for pivoting
- C 32 33 34 35 +
- C 43 44 45 46 +
- C 54 55 56 * +
- C 65 66 * * +
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CAXPY, CSCAL, CSWAP, ICAMAX
- C***REVISION HISTORY (YYMMDD)
- C 800730 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CNBFA
- INTEGER LDA,N,ML,MU,IPVT(*),INFO
- COMPLEX ABE(LDA,*)
- C
- INTEGER ML1,MB,M,N1,LDB,I,J,K,L,LM,LM1,LM2,MP,ICAMAX
- COMPLEX T
- COMPLEX ZDUM
- REAL CABS1
- CABS1(ZDUM) = ABS(REAL(ZDUM)) + ABS(AIMAG(ZDUM))
- C
- C***FIRST EXECUTABLE STATEMENT CNBFA
- ML1=ML+1
- MB=ML+MU
- M=ML+MU+1
- N1=N-1
- LDB=LDA-1
- INFO=0
- C
- C SET FILL-IN COLUMNS TO ZERO
- C
- IF(N.LE.1)GO TO 50
- IF(ML.LE.0)GO TO 7
- DO 6 J=1,ML
- DO 5 I=1,N
- ABE(I,M+J)=(0.0E0,0.0E0)
- 5 CONTINUE
- 6 CONTINUE
- 7 CONTINUE
- C
- C GAUSSIAN ELIMINATION WITH PARTIAL ELIMINATION
- C
- DO 40 K=1,N1
- LM=MIN(N-K,ML)
- LM1=LM+1
- LM2=ML1-LM
- C
- C SEARCH FOR PIVOT INDEX
- C
- L=-ICAMAX(LM1,ABE(LM+K,LM2),LDB)+LM1+K
- IPVT(K)=L
- MP=MIN(MB,N-K)
- C
- C SWAP ROWS IF NECESSARY
- C
- IF(L.NE.K)CALL CSWAP(MP+1,ABE(K,ML1),LDA,ABE(L,ML1+K-L),LDA)
- C
- C SKIP COLUMN REDUCTION IF PIVOT IS ZERO
- C
- IF(CABS1(ABE(K,ML1)).EQ.0.0E0) GO TO 20
- C
- C COMPUTE MULTIPLIERS
- C
- T=-(1.0E0,0.0E0)/ABE(K,ML1)
- CALL CSCAL(LM,T,ABE(LM+K,LM2),LDB)
- C
- C ROW ELIMINATION WITH COLUMN INDEXING
- C
- DO 10 J=1,MP
- CALL CAXPY (LM,ABE(K,ML1+J),ABE(LM+K,LM2),LDB,ABE(LM+K,LM2+J),
- 1 LDB)
- 10 CONTINUE
- GO TO 30
- 20 CONTINUE
- INFO=K
- 30 CONTINUE
- 40 CONTINUE
- 50 CONTINUE
- IPVT(N)=N
- IF(CABS1(ABE(N,ML1)).EQ.0.0E0) INFO=N
- RETURN
- END
- *DECK CNBFS
- SUBROUTINE CNBFS (ABE, LDA, N, ML, MU, V, ITASK, IND, WORK, IWORK)
- C***BEGIN PROLOGUE CNBFS
- C***PURPOSE Solve a general nonsymmetric banded system of linear
- C equations.
- C***LIBRARY SLATEC
- C***CATEGORY D2C2
- C***TYPE COMPLEX (SNBFS-S, DNBFS-D, CNBFS-C)
- C***KEYWORDS BANDED, LINEAR EQUATIONS, NONSYMMETRIC
- C***AUTHOR Voorhees, E. A., (LANL)
- C***DESCRIPTION
- C
- C Subroutine CNBFS solves a general nonsymmetric banded NxN
- C system of single precision complex linear equations using
- C SLATEC subroutines CNBCO and CNBSL. These are adaptations
- C of the LINPACK subroutines CGBCO and CGBSL which require
- C a different format for storing the matrix elements. If
- C A is an NxN complex matrix and if X and B are complex
- C N-vectors, then CNBFS solves the equation
- C
- C A*X=B.
- C
- C A band matrix is a matrix whose nonzero elements are all
- C fairly near the main diagonal, specifically A(I,J) = 0
- C if I-J is greater than ML or J-I is greater than
- C MU . The integers ML and MU are called the lower and upper
- C band widths and M = ML+MU+1 is the total band width.
- C CNBFS uses less time and storage than the corresponding
- C program for general matrices (CGEFS) if 2*ML+MU .LT. N .
- C
- C The matrix A is first factored into upper and lower tri-
- C angular matrices U and L using partial pivoting. These
- C factors and the pivoting information are used to find the
- C solution vector X. An approximate condition number is
- C calculated to provide a rough estimate of the number of
- C digits of accuracy in the computed solution.
- C
- C If the equation A*X=B is to be solved for more than one vector
- C B, the factoring of A does not need to be performed again and
- C the option to only solve (ITASK .GT. 1) will be faster for
- C the succeeding solutions. In this case, the contents of A,
- C LDA, N and IWORK must not have been altered by the user follow-
- C ing factorization (ITASK=1). IND will not be changed by CNBFS
- C in this case.
- C
- C
- C Band Storage
- C
- C If A is a band matrix, the following program segment
- C will set up the input.
- C
- C ML = (band width below the diagonal)
- C MU = (band width above the diagonal)
- C DO 20 I = 1, N
- C J1 = MAX(1, I-ML)
- C J2 = MIN(N, I+MU)
- C DO 10 J = J1, J2
- C K = J - I + ML + 1
- C ABE(I,K) = A(I,J)
- C 10 CONTINUE
- C 20 CONTINUE
- C
- C This uses columns 1 through ML+MU+1 of ABE .
- C Furthermore, ML additional columns are needed in
- C ABE starting with column ML+MU+2 for elements
- C generated during the triangularization. The total
- C number of columns needed in ABE is 2*ML+MU+1 .
- C
- C Example: If the original matrix is
- C
- C 11 12 13 0 0 0
- C 21 22 23 24 0 0
- C 0 32 33 34 35 0
- C 0 0 43 44 45 46
- C 0 0 0 54 55 56
- C 0 0 0 0 65 66
- C
- C then N = 6, ML = 1, MU = 2, LDA .GE. 5 and ABE should contain
- C
- C * 11 12 13 + , * = not used
- C 21 22 23 24 + , + = used for pivoting
- C 32 33 34 35 +
- C 43 44 45 46 +
- C 54 55 56 * +
- C 65 66 * * +
- C
- C
- C Argument Description ***
- C
- C ABE COMPLEX(LDA,NC)
- C on entry, contains the matrix in band storage as
- C described above. NC must not be less than
- C 2*ML+MU+1 . The user is cautioned to specify NC
- C with care since it is not an argument and cannot
- C be checked by CNBFS. The rows of the original
- C matrix are stored in the rows of ABE and the
- C diagonals of the original matrix are stored in
- C columns 1 through ML+MU+1 of ABE .
- C on return, contains an upper triangular matrix U and
- C the multipliers necessary to construct a matrix L
- C so that A=L*U.
- C LDA INTEGER
- C the leading dimension of array ABE. LDA must be great-
- C er than or equal to N. (terminal error message IND=-1)
- C N INTEGER
- C the order of the matrix A. N must be greater
- C than or equal to 1 . (terminal error message IND=-2)
- C ML INTEGER
- C the number of diagonals below the main diagonal.
- C ML must not be less than zero nor greater than or
- C equal to N . (terminal error message IND=-5)
- C MU INTEGER
- C the number of diagonals above the main diagonal.
- C MU must not be less than zero nor greater than or
- C equal to N . (terminal error message IND=-6)
- C V COMPLEX(N)
- C on entry, the singly subscripted array(vector) of di-
- C mension N which contains the right hand side B of a
- C system of simultaneous linear equations A*X=B.
- C on return, V contains the solution vector, X .
- C ITASK INTEGER
- C if ITASK = 1, the matrix A is factored and then the
- C linear equation is solved.
- C if ITASK .GT. 1, the equation is solved using the existing
- C factored matrix A and IWORK.
- C if ITASK .LT. 1, then terminal error message IND=-3 is
- C printed.
- C IND INTEGER
- C GT. 0 IND is a rough estimate of the number of digits
- C of accuracy in the solution, X.
- C LT. 0 see error message corresponding to IND below.
- C WORK COMPLEX(N)
- C a singly subscripted array of dimension at least N.
- C IWORK INTEGER(N)
- C a singly subscripted array of dimension at least N.
- C
- C Error Messages Printed ***
- C
- C IND=-1 terminal N is greater than LDA.
- C IND=-2 terminal N is less than 1.
- C IND=-3 terminal ITASK is less than 1.
- C IND=-4 terminal The matrix A is computationally singular.
- C A solution has not been computed.
- C IND=-5 terminal ML is less than zero or is greater than
- C or equal to N .
- C IND=-6 terminal MU is less than zero or is greater than
- C or equal to N .
- C IND=-10 warning The solution has no apparent significance.
- C The solution may be inaccurate or the matrix
- C A may be poorly scaled.
- C
- C NOTE- The above terminal(*fatal*) error messages are
- C designed to be handled by XERMSG in which
- C LEVEL=1 (recoverable) and IFLAG=2 . LEVEL=0
- C for warning error messages from XERMSG. Unless
- C the user provides otherwise, an error message
- C will be printed followed by an abort.
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CNBCO, CNBSL, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 800813 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 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 900510 Convert XERRWV calls to XERMSG calls, cvt GOTO's to
- C IF-THEN-ELSE. (RWC)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CNBFS
- C
- INTEGER LDA,N,ITASK,IND,IWORK(*),ML,MU
- COMPLEX ABE(LDA,*),V(*),WORK(*)
- REAL RCOND
- REAL R1MACH
- CHARACTER*8 XERN1, XERN2
- C***FIRST EXECUTABLE STATEMENT CNBFS
- IF (LDA.LT.N) THEN
- IND = -1
- WRITE (XERN1, '(I8)') LDA
- WRITE (XERN2, '(I8)') N
- CALL XERMSG ('SLATEC', 'CNBFS', 'LDA = ' // XERN1 //
- * ' IS LESS THAN N = ' // XERN2, -1, 1)
- RETURN
- ENDIF
- C
- IF (N.LE.0) THEN
- IND = -2
- WRITE (XERN1, '(I8)') N
- CALL XERMSG ('SLATEC', 'CNBFS', 'N = ' // XERN1 //
- * ' IS LESS THAN 1', -2, 1)
- RETURN
- ENDIF
- C
- IF (ITASK.LT.1) THEN
- IND = -3
- WRITE (XERN1, '(I8)') ITASK
- CALL XERMSG ('SLATEC', 'CNBFS', 'ITASK = ' // XERN1 //
- * ' IS LESS THAN 1', -3, 1)
- RETURN
- ENDIF
- C
- IF (ML.LT.0 .OR. ML.GE.N) THEN
- IND = -5
- WRITE (XERN1, '(I8)') ML
- CALL XERMSG ('SLATEC', 'CNBFS',
- * 'ML = ' // XERN1 // ' IS OUT OF RANGE', -5, 1)
- RETURN
- ENDIF
- C
- IF (MU.LT.0 .OR. MU.GE.N) THEN
- IND = -6
- WRITE (XERN1, '(I8)') MU
- CALL XERMSG ('SLATEC', 'CNBFS',
- * 'MU = ' // XERN1 // ' IS OUT OF RANGE', -6, 1)
- RETURN
- ENDIF
- C
- IF (ITASK.EQ.1) THEN
- C
- C FACTOR MATRIX A INTO LU
- C
- CALL CNBCO(ABE,LDA,N,ML,MU,IWORK,RCOND,WORK)
- C
- C CHECK FOR COMPUTATIONALLY SINGULAR MATRIX
- C
- IF (RCOND.EQ.0.0) THEN
- IND = -4
- CALL XERMSG ('SLATEC', 'CNBFS',
- * 'SINGULAR MATRIX A - NO SOLUTION', -4, 1)
- RETURN
- ENDIF
- C
- C COMPUTE IND (ESTIMATE OF NO. OF SIGNIFICANT DIGITS)
- C AND CHECK FOR IND GREATER THAN ZERO
- C
- IND = -LOG10(R1MACH(4)/RCOND)
- IF (IND.LE.0) THEN
- IND = -10
- CALL XERMSG ('SLATEC', 'CNBFS',
- * 'SOLUTION MAY HAVE NO SIGNIFICANCE', -10, 0)
- ENDIF
- ENDIF
- C
- C SOLVE AFTER FACTORING
- C
- CALL CNBSL(ABE,LDA,N,ML,MU,IWORK,V,0)
- RETURN
- END
- *DECK CNBIR
- SUBROUTINE CNBIR (ABE, LDA, N, ML, MU, V, ITASK, IND, WORK, IWORK)
- C***BEGIN PROLOGUE CNBIR
- C***PURPOSE Solve a general nonsymmetric banded system of linear
- C equations. Iterative refinement is used to obtain an error
- C estimate.
- C***LIBRARY SLATEC
- C***CATEGORY D2C2
- C***TYPE COMPLEX (SNBIR-S, CNBIR-C)
- C***KEYWORDS BANDED, LINEAR EQUATIONS, NONSYMMETRIC
- C***AUTHOR Voorhees, E. A., (LANL)
- C***DESCRIPTION
- C
- C Subroutine CNBIR solves a general nonsymmetric banded NxN
- C system of single precision complex linear equations using
- C SLATEC subroutines CNBFA and CNBSL. These are adaptations
- C of the LINPACK subroutines CGBFA and CGBSL which require
- C a different format for storing the matrix elements.
- C One pass of iterative refinement is used only to obtain an
- C estimate of the accuracy. If A is an NxN complex banded
- C matrix and if X and B are complex N-vectors, then CNBIR
- C solves the equation
- C
- C A*X=B.
- C
- C A band matrix is a matrix whose nonzero elements are all
- C fairly near the main diagonal, specifically A(I,J) = 0
- C if I-J is greater than ML or J-I is greater than
- C MU . The integers ML and MU are called the lower and upper
- C band widths and M = ML+MU+1 is the total band width.
- C CNBIR uses less time and storage than the corresponding
- C program for general matrices (CGEIR) if 2*ML+MU .LT. N .
- C
- C The matrix A is first factored into upper and lower tri-
- C angular matrices U and L using partial pivoting. These
- C factors and the pivoting information are used to find the
- C solution vector X . Then the residual vector is found and used
- C to calculate an estimate of the relative error, IND . IND esti-
- C mates the accuracy of the solution only when the input matrix
- C and the right hand side are represented exactly in the computer
- C and does not take into account any errors in the input data.
- C
- C If the equation A*X=B is to be solved for more than one vector
- C B, the factoring of A does not need to be performed again and
- C the option to only solve (ITASK .GT. 1) will be faster for
- C the succeeding solutions. In this case, the contents of A, LDA,
- C N, WORK and IWORK must not have been altered by the user follow-
- C ing factorization (ITASK=1). IND will not be changed by CNBIR
- C in this case.
- C
- C
- C Band Storage
- C
- C If A is a band matrix, the following program segment
- C will set up the input.
- C
- C ML = (band width below the diagonal)
- C MU = (band width above the diagonal)
- C DO 20 I = 1, N
- C J1 = MAX(1, I-ML)
- C J2 = MIN(N, I+MU)
- C DO 10 J = J1, J2
- C K = J - I + ML + 1
- C ABE(I,K) = A(I,J)
- C 10 CONTINUE
- C 20 CONTINUE
- C
- C This uses columns 1 through ML+MU+1 of ABE .
- C
- C Example: If the original matrix is
- C
- C 11 12 13 0 0 0
- C 21 22 23 24 0 0
- C 0 32 33 34 35 0
- C 0 0 43 44 45 46
- C 0 0 0 54 55 56
- C 0 0 0 0 65 66
- C
- C then N = 6, ML = 1, MU = 2, LDA .GE. 5 and ABE should contain
- C
- C * 11 12 13 , * = not used
- C 21 22 23 24
- C 32 33 34 35
- C 43 44 45 46
- C 54 55 56 *
- C 65 66 * *
- C
- C
- C Argument Description ***
- C
- C ABE COMPLEX(LDA,MM)
- C on entry, contains the matrix in band storage as
- C described above. MM must not be less than M =
- C ML+MU+1 . The user is cautioned to dimension ABE
- C with care since MM is not an argument and cannot
- C be checked by CNBIR. The rows of the original
- C matrix are stored in the rows of ABE and the
- C diagonals of the original matrix are stored in
- C columns 1 through ML+MU+1 of ABE . ABE is
- C not altered by the program.
- C LDA INTEGER
- C the leading dimension of array ABE. LDA must be great-
- C er than or equal to N. (terminal error message IND=-1)
- C N INTEGER
- C the order of the matrix A. N must be greater
- C than or equal to 1 . (terminal error message IND=-2)
- C ML INTEGER
- C the number of diagonals below the main diagonal.
- C ML must not be less than zero nor greater than or
- C equal to N . (terminal error message IND=-5)
- C MU INTEGER
- C the number of diagonals above the main diagonal.
- C MU must not be less than zero nor greater than or
- C equal to N . (terminal error message IND=-6)
- C V COMPLEX(N)
- C on entry, the singly subscripted array(vector) of di-
- C mension N which contains the right hand side B of a
- C system of simultaneous linear equations A*X=B.
- C on return, V contains the solution vector, X .
- C ITASK INTEGER
- C if ITASK=1, the matrix A is factored and then the
- C linear equation is solved.
- C if ITASK .GT. 1, the equation is solved using the existing
- C factored matrix A and IWORK.
- C if ITASK .LT. 1, then terminal error message IND=-3 is
- C printed.
- C IND INTEGER
- C GT. 0 IND is a rough estimate of the number of digits
- C of accuracy in the solution, X . IND=75 means
- C that the solution vector X is zero.
- C LT. 0 see error message corresponding to IND below.
- C WORK COMPLEX(N*(NC+1))
- C a singly subscripted array of dimension at least
- C N*(NC+1) where NC = 2*ML+MU+1 .
- C IWORK INTEGER(N)
- C a singly subscripted array of dimension at least N.
- C
- C Error Messages Printed ***
- C
- C IND=-1 terminal N is greater than LDA.
- C IND=-2 terminal N is less than 1.
- C IND=-3 terminal ITASK is less than 1.
- C IND=-4 terminal The matrix A is computationally singular.
- C A solution has not been computed.
- C IND=-5 terminal ML is less than zero or is greater than
- C or equal to N .
- C IND=-6 terminal MU is less than zero or is greater than
- C or equal to N .
- C IND=-10 warning The solution has no apparent significance.
- C The solution may be inaccurate or the matrix
- C A may be poorly scaled.
- C
- C NOTE- The above terminal(*fatal*) error messages are
- C designed to be handled by XERMSG in which
- C LEVEL=1 (recoverable) and IFLAG=2 . LEVEL=0
- C for warning error messages from XERMSG. Unless
- C the user provides otherwise, an error message
- C will be printed followed by an abort.
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CCOPY, CDCDOT, CNBFA, CNBSL, R1MACH, SCASUM, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 800819 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 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 900510 Convert XERRWV calls to XERMSG calls, cvt GOTO's to
- C IF-THEN-ELSE. (RWC)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CNBIR
- C
- INTEGER LDA,N,ITASK,IND,IWORK(*),INFO,J,K,KK,L,M,ML,MU,NC
- COMPLEX ABE(LDA,*),V(*),WORK(N,*),CDCDOT
- REAL XNORM,DNORM,SCASUM,R1MACH
- CHARACTER*8 XERN1, XERN2
- C***FIRST EXECUTABLE STATEMENT CNBIR
- IF (LDA.LT.N) THEN
- IND = -1
- WRITE (XERN1, '(I8)') LDA
- WRITE (XERN2, '(I8)') N
- CALL XERMSG ('SLATEC', 'CNBIR', 'LDA = ' // XERN1 //
- * ' IS LESS THAN N = ' // XERN2, -1, 1)
- RETURN
- ENDIF
- C
- IF (N.LE.0) THEN
- IND = -2
- WRITE (XERN1, '(I8)') N
- CALL XERMSG ('SLATEC', 'CNBIR', 'N = ' // XERN1 //
- * ' IS LESS THAN 1', -2, 1)
- RETURN
- ENDIF
- C
- IF (ITASK.LT.1) THEN
- IND = -3
- WRITE (XERN1, '(I8)') ITASK
- CALL XERMSG ('SLATEC', 'CNBIR', 'ITASK = ' // XERN1 //
- * ' IS LESS THAN 1', -3, 1)
- RETURN
- ENDIF
- C
- IF (ML.LT.0 .OR. ML.GE.N) THEN
- IND = -5
- WRITE (XERN1, '(I8)') ML
- CALL XERMSG ('SLATEC', 'CNBIR',
- * 'ML = ' // XERN1 // ' IS OUT OF RANGE', -5, 1)
- RETURN
- ENDIF
- C
- IF (MU.LT.0 .OR. MU.GE.N) THEN
- IND = -6
- WRITE (XERN1, '(I8)') MU
- CALL XERMSG ('SLATEC', 'CNBIR',
- * 'MU = ' // XERN1 // ' IS OUT OF RANGE', -6, 1)
- RETURN
- ENDIF
- C
- NC = 2*ML+MU+1
- IF (ITASK.EQ.1) THEN
- C
- C MOVE MATRIX ABE TO WORK
- C
- M=ML+MU+1
- DO 10 J=1,M
- CALL CCOPY(N,ABE(1,J),1,WORK(1,J),1)
- 10 CONTINUE
- C
- C FACTOR MATRIX A INTO LU
- CALL CNBFA(WORK,N,N,ML,MU,IWORK,INFO)
- C
- C CHECK FOR COMPUTATIONALLY SINGULAR MATRIX
- IF (INFO.NE.0) THEN
- IND=-4
- CALL XERMSG ('SLATEC', 'CNBIR',
- * 'SINGULAR MATRIX A - NO SOLUTION', -4, 1)
- RETURN
- ENDIF
- ENDIF
- C
- C SOLVE WHEN FACTORING COMPLETE
- C MOVE VECTOR B TO WORK
- C
- CALL CCOPY(N,V(1),1,WORK(1,NC+1),1)
- CALL CNBSL(WORK,N,N,ML,MU,IWORK,V,0)
- C
- C FORM NORM OF X0
- C
- XNORM = SCASUM(N,V(1),1)
- IF (XNORM.EQ.0.0) THEN
- IND = 75
- RETURN
- ENDIF
- C
- C COMPUTE RESIDUAL
- C
- DO 40 J=1,N
- K = MAX(1,ML+2-J)
- KK = MAX(1,J-ML)
- L = MIN(J-1,ML)+MIN(N-J,MU)+1
- WORK(J,NC+1) = CDCDOT(L,-WORK(J,NC+1),ABE(J,K),LDA,V(KK),1)
- 40 CONTINUE
- C
- C SOLVE A*DELTA=R
- C
- CALL CNBSL(WORK,N,N,ML,MU,IWORK,WORK(1,NC+1),0)
- C
- C FORM NORM OF DELTA
- C
- DNORM = SCASUM(N,WORK(1,NC+1),1)
- C
- C COMPUTE IND (ESTIMATE OF NO. OF SIGNIFICANT DIGITS)
- C AND CHECK FOR IND GREATER THAN ZERO
- C
- IND = -LOG10(MAX(R1MACH(4),DNORM/XNORM))
- IF (IND.LE.0) THEN
- IND = -10
- CALL XERMSG ('SLATEC', 'CNBIR',
- * 'SOLUTION MAY HAVE NO SIGNIFICANCE', -10, 0)
- ENDIF
- RETURN
- END
- *DECK CNBSL
- SUBROUTINE CNBSL (ABE, LDA, N, ML, MU, IPVT, B, JOB)
- C***BEGIN PROLOGUE CNBSL
- C***PURPOSE Solve a complex band system using the factors computed by
- C CNBCO or CNBFA.
- C***LIBRARY SLATEC
- C***CATEGORY D2C2
- C***TYPE COMPLEX (SNBSL-S, DNBSL-D, CNBSL-C)
- C***KEYWORDS BANDED, LINEAR EQUATIONS, NONSYMMETRIC, SOLVE
- C***AUTHOR Voorhees, E. A., (LANL)
- C***DESCRIPTION
- C
- C CNBSL solves the complex band system
- C A * X = B or CTRANS(A) * X = B
- C using the factors computed by CNBCO or CNBFA.
- C
- C On Entry
- C
- C ABE COMPLEX(LDA, NC)
- C the output from CNBCO or CNBFA.
- C NC must be .GE. 2*ML+MU+1 .
- C
- C LDA INTEGER
- C the leading dimension of the array ABE .
- C
- C N INTEGER
- C the order of the original matrix.
- C
- C ML INTEGER
- C number of diagonals below the main diagonal.
- C
- C MU INTEGER
- C number of diagonals above the main diagonal.
- C
- C IPVT INTEGER(N)
- C the pivot vector from CNBCO or CNBFA.
- C
- C B COMPLEX(N)
- C the right hand side vector.
- C
- C JOB INTEGER
- C = 0 to solve A*X = B .
- C = nonzero to solve CTRANS(A)*X = B , where
- C CTRANS(A) is the conjugate transpose.
- C
- C On Return
- C
- C B the solution vector X .
- C
- C Error Condition
- C
- C A division by zero will occur if the input factor contains a
- C zero on the diagonal. Technically this indicates singularity
- C but it is often caused by improper arguments or improper
- C setting of LDA. It will not occur if the subroutines are
- C called correctly and if CNBCO has set RCOND .GT. 0.0
- C or CNBFA has set INFO .EQ. 0 .
- C
- C To compute INVERSE(A) * C where C is a matrix
- C with P columns
- C CALL CNBCO(ABE,LDA,N,ML,MU,IPVT,RCOND,Z)
- C IF (RCOND is too small) GO TO ...
- C DO 10 J = 1, P
- C CALL CNBSL(ABE,LDA,N,ML,MU,IPVT,C(1,J),0)
- C 10 CONTINUE
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CAXPY, CDOTC
- C***REVISION HISTORY (YYMMDD)
- C 800730 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CNBSL
- INTEGER LDA,N,ML,MU,IPVT(*),JOB
- COMPLEX ABE(LDA,*),B(*)
- C
- COMPLEX CDOTC,T
- INTEGER K,KB,L,LB,LDB,LM,M,MLM,NM1
- C***FIRST EXECUTABLE STATEMENT CNBSL
- M=MU+ML+1
- NM1=N-1
- LDB=1-LDA
- IF(JOB.NE.0)GO TO 50
- C
- C JOB = 0 , SOLVE A * X = B
- C FIRST SOLVE L*Y = B
- C
- IF(ML.EQ.0)GO TO 30
- IF(NM1.LT.1)GO TO 30
- DO 20 K=1,NM1
- LM=MIN(ML,N-K)
- L=IPVT(K)
- T=B(L)
- IF(L.EQ.K)GO TO 10
- B(L)=B(K)
- B(K)=T
- 10 CONTINUE
- MLM=ML-(LM-1)
- CALL CAXPY(LM,T,ABE(K+LM,MLM),LDB,B(K+1),1)
- 20 CONTINUE
- 30 CONTINUE
- C
- C NOW SOLVE U*X = Y
- C
- DO 40 KB=1,N
- K=N+1-KB
- B(K)=B(K)/ABE(K,ML+1)
- LM=MIN(K,M)-1
- LB=K-LM
- T=-B(K)
- CALL CAXPY(LM,T,ABE(K-1,ML+2),LDB,B(LB),1)
- 40 CONTINUE
- GO TO 100
- 50 CONTINUE
- C
- C JOB = NONZERO, SOLVE CTRANS(A) * X = B
- C FIRST SOLVE CTRANS(U)*Y = B
- C
- DO 60 K = 1, N
- LM = MIN(K,M) - 1
- LB = K - LM
- T = CDOTC(LM,ABE(K-1,ML+2),LDB,B(LB),1)
- B(K) = (B(K) - T)/CONJG(ABE(K,ML+1))
- 60 CONTINUE
- C
- C NOW SOLVE CTRANS(L)*X = Y
- C
- IF (ML .EQ. 0) GO TO 90
- IF (NM1 .LT. 1) GO TO 90
- DO 80 KB = 1, NM1
- K = N - KB
- LM = MIN(ML,N-K)
- MLM = ML - (LM - 1)
- B(K) = B(K) + CDOTC(LM,ABE(K+LM,MLM),LDB,B(K+1),1)
- L = IPVT(K)
- IF (L .EQ. K) GO TO 70
- T = B(L)
- B(L) = B(K)
- B(K) = T
- 70 CONTINUE
- 80 CONTINUE
- 90 CONTINUE
- 100 CONTINUE
- RETURN
- END
- *DECK COMBAK
- SUBROUTINE COMBAK (NM, LOW, IGH, AR, AI, INT, M, ZR, ZI)
- C***BEGIN PROLOGUE COMBAK
- C***PURPOSE Form the eigenvectors of a complex general matrix from the
- C eigenvectors of a upper Hessenberg matrix output from
- C COMHES.
- C***LIBRARY SLATEC (EISPACK)
- C***CATEGORY D4C4
- C***TYPE COMPLEX (ELMBAK-S, COMBAK-C)
- C***KEYWORDS EIGENVALUES, EIGENVECTORS, EISPACK
- C***AUTHOR Smith, B. T., et al.
- C***DESCRIPTION
- C
- C This subroutine is a translation of the ALGOL procedure COMBAK,
- C NUM. MATH. 12, 349-368(1968) by Martin and Wilkinson.
- C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 339-358(1971).
- C
- C This subroutine forms the eigenvectors of a COMPLEX GENERAL
- C matrix by back transforming those of the corresponding
- C upper Hessenberg matrix determined by COMHES.
- C
- C On INPUT
- C
- C NM must be set to the row dimension of the two-dimensional
- C array parameters, AR, AI, ZR and ZI, as declared in the
- C calling program dimension statement. NM is an INTEGER
- C variable.
- C
- C LOW and IGH are two INTEGER variables determined by the
- C balancing subroutine CBAL. If CBAL has not been used,
- C set LOW=1 and IGH equal to the order of the matrix.
- C
- C AR and AI contain the multipliers which were used in the
- C reduction by COMHES in their lower triangles below
- C the subdiagonal. AR and AI are two-dimensional REAL
- C arrays, dimensioned AR(NM,IGH) and AI(NM,IGH).
- C
- C INT contains information on the rows and columns
- C interchanged in the reduction by COMHES. Only
- C elements LOW through IGH are used. INT is a
- C one-dimensional INTEGER array, dimensioned INT(IGH).
- C
- C M is the number of eigenvectors to be back transformed.
- C M is an INTEGER variable.
- C
- C ZR and ZI contain the real and imaginary parts, respectively,
- C of the eigenvectors to be back transformed in their first M
- C columns. ZR and ZI are two-dimensional REAL arrays,
- C dimensioned ZR(NM,M) and ZI(NM,M).
- C
- C On OUTPUT
- C
- C ZR and ZI contain the real and imaginary parts, respectively,
- C of the transformed eigenvectors in their first M columns.
- C
- C Questions and comments should be directed to B. S. Garbow,
- C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY
- C ------------------------------------------------------------------
- C
- C***REFERENCES B. T. Smith, J. M. Boyle, J. J. Dongarra, B. S. Garbow,
- C Y. Ikebe, V. C. Klema and C. B. Moler, Matrix Eigen-
- C system Routines - EISPACK Guide, Springer-Verlag,
- C 1976.
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 760101 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE COMBAK
- C
- INTEGER I,J,M,LA,MM,MP,NM,IGH,KP1,LOW,MP1
- REAL AR(NM,*),AI(NM,*),ZR(NM,*),ZI(NM,*)
- REAL XR,XI
- INTEGER INT(*)
- C
- C***FIRST EXECUTABLE STATEMENT COMBAK
- IF (M .EQ. 0) GO TO 200
- LA = IGH - 1
- KP1 = LOW + 1
- IF (LA .LT. KP1) GO TO 200
- C .......... FOR MP=IGH-1 STEP -1 UNTIL LOW+1 DO -- ..........
- DO 140 MM = KP1, LA
- MP = LOW + IGH - MM
- MP1 = MP + 1
- C
- DO 110 I = MP1, IGH
- XR = AR(I,MP-1)
- XI = AI(I,MP-1)
- IF (XR .EQ. 0.0E0 .AND. XI .EQ. 0.0E0) GO TO 110
- C
- DO 100 J = 1, M
- ZR(I,J) = ZR(I,J) + XR * ZR(MP,J) - XI * ZI(MP,J)
- ZI(I,J) = ZI(I,J) + XR * ZI(MP,J) + XI * ZR(MP,J)
- 100 CONTINUE
- C
- 110 CONTINUE
- C
- I = INT(MP)
- IF (I .EQ. MP) GO TO 140
- C
- DO 130 J = 1, M
- XR = ZR(I,J)
- ZR(I,J) = ZR(MP,J)
- ZR(MP,J) = XR
- XI = ZI(I,J)
- ZI(I,J) = ZI(MP,J)
- ZI(MP,J) = XI
- 130 CONTINUE
- C
- 140 CONTINUE
- C
- 200 RETURN
- END
- *DECK COMHES
- SUBROUTINE COMHES (NM, N, LOW, IGH, AR, AI, INT)
- C***BEGIN PROLOGUE COMHES
- C***PURPOSE Reduce a complex general matrix to complex upper Hessenberg
- C form using stabilized elementary similarity
- C transformations.
- C***LIBRARY SLATEC (EISPACK)
- C***CATEGORY D4C1B2
- C***TYPE COMPLEX (ELMHES-S, COMHES-C)
- C***KEYWORDS EIGENVALUES, EIGENVECTORS, EISPACK
- C***AUTHOR Smith, B. T., et al.
- C***DESCRIPTION
- C
- C This subroutine is a translation of the ALGOL procedure COMHES,
- C NUM. MATH. 12, 349-368(1968) by Martin and Wilkinson.
- C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 339-358(1971).
- C
- C Given a COMPLEX GENERAL matrix, this subroutine
- C reduces a submatrix situated in rows and columns
- C LOW through IGH to upper Hessenberg form by
- C stabilized elementary similarity transformations.
- C
- C On INPUT
- C
- C NM must be set to the row dimension of the two-dimensional
- C array parameters, AR and AI, as declared in the calling
- C program dimension statement. NM is an INTEGER variable.
- C
- C N is the order of the matrix A=(AR,AI). N is an INTEGER
- C variable. N must be less than or equal to NM.
- C
- C LOW and IGH are two INTEGER variables determined by the
- C balancing subroutine CBAL. If CBAL has not been used,
- C set LOW=1 and IGH equal to the order of the matrix, N.
- C
- C AR and AI contain the real and imaginary parts, respectively,
- C of the complex input matrix. AR and AI are two-dimensional
- C REAL arrays, dimensioned AR(NM,N) and AI(NM,N).
- C
- C On OUTPUT
- C
- C AR and AI contain the real and imaginary parts, respectively,
- C of the upper Hessenberg matrix. The multipliers which
- C were used in the reduction are stored in the remaining
- C triangles under the Hessenberg matrix.
- C
- C INT contains information on the rows and columns
- C interchanged in the reduction. Only elements LOW through
- C IGH are used. INT is a one-dimensional INTEGER array,
- C dimensioned INT(IGH).
- C
- C Calls CDIV for complex division.
- C
- C Questions and comments should be directed to B. S. Garbow,
- C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY
- C ------------------------------------------------------------------
- C
- C***REFERENCES B. T. Smith, J. M. Boyle, J. J. Dongarra, B. S. Garbow,
- C Y. Ikebe, V. C. Klema and C. B. Moler, Matrix Eigen-
- C system Routines - EISPACK Guide, Springer-Verlag,
- C 1976.
- C***ROUTINES CALLED CDIV
- C***REVISION HISTORY (YYMMDD)
- C 760101 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE COMHES
- C
- INTEGER I,J,M,N,LA,NM,IGH,KP1,LOW,MM1,MP1
- REAL AR(NM,*),AI(NM,*)
- REAL XR,XI,YR,YI
- INTEGER INT(*)
- C
- C***FIRST EXECUTABLE STATEMENT COMHES
- LA = IGH - 1
- KP1 = LOW + 1
- IF (LA .LT. KP1) GO TO 200
- C
- DO 180 M = KP1, LA
- MM1 = M - 1
- XR = 0.0E0
- XI = 0.0E0
- I = M
- C
- DO 100 J = M, IGH
- IF (ABS(AR(J,MM1)) + ABS(AI(J,MM1))
- 1 .LE. ABS(XR) + ABS(XI)) GO TO 100
- XR = AR(J,MM1)
- XI = AI(J,MM1)
- I = J
- 100 CONTINUE
- C
- INT(M) = I
- IF (I .EQ. M) GO TO 130
- C .......... INTERCHANGE ROWS AND COLUMNS OF AR AND AI ..........
- DO 110 J = MM1, N
- YR = AR(I,J)
- AR(I,J) = AR(M,J)
- AR(M,J) = YR
- YI = AI(I,J)
- AI(I,J) = AI(M,J)
- AI(M,J) = YI
- 110 CONTINUE
- C
- DO 120 J = 1, IGH
- YR = AR(J,I)
- AR(J,I) = AR(J,M)
- AR(J,M) = YR
- YI = AI(J,I)
- AI(J,I) = AI(J,M)
- AI(J,M) = YI
- 120 CONTINUE
- C .......... END INTERCHANGE ..........
- 130 IF (XR .EQ. 0.0E0 .AND. XI .EQ. 0.0E0) GO TO 180
- MP1 = M + 1
- C
- DO 160 I = MP1, IGH
- YR = AR(I,MM1)
- YI = AI(I,MM1)
- IF (YR .EQ. 0.0E0 .AND. YI .EQ. 0.0E0) GO TO 160
- CALL CDIV(YR,YI,XR,XI,YR,YI)
- AR(I,MM1) = YR
- AI(I,MM1) = YI
- C
- DO 140 J = M, N
- AR(I,J) = AR(I,J) - YR * AR(M,J) + YI * AI(M,J)
- AI(I,J) = AI(I,J) - YR * AI(M,J) - YI * AR(M,J)
- 140 CONTINUE
- C
- DO 150 J = 1, IGH
- AR(J,M) = AR(J,M) + YR * AR(J,I) - YI * AI(J,I)
- AI(J,M) = AI(J,M) + YR * AI(J,I) + YI * AR(J,I)
- 150 CONTINUE
- C
- 160 CONTINUE
- C
- 180 CONTINUE
- C
- 200 RETURN
- END
- *DECK COMLR
- SUBROUTINE COMLR (NM, N, LOW, IGH, HR, HI, WR, WI, IERR)
- C***BEGIN PROLOGUE COMLR
- C***PURPOSE Compute the eigenvalues of a complex upper Hessenberg
- C matrix using the modified LR method.
- C***LIBRARY SLATEC (EISPACK)
- C***CATEGORY D4C2B
- C***TYPE COMPLEX (COMLR-C)
- C***KEYWORDS EIGENVALUES, EISPACK, LR METHOD
- C***AUTHOR Smith, B. T., et al.
- C***DESCRIPTION
- C
- C This subroutine is a translation of the ALGOL procedure COMLR,
- C NUM. MATH. 12, 369-376(1968) by Martin and Wilkinson.
- C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 396-403(1971).
- C
- C This subroutine finds the eigenvalues of a COMPLEX
- C UPPER Hessenberg matrix by the modified LR method.
- C
- C On INPUT
- C
- C NM must be set to the row dimension of the two-dimensional
- C array parameters, HR and HI, as declared in the calling
- C program dimension statement. NM is an INTEGER variable.
- C
- C N is the order of the matrix H=(HR,HI). N is an INTEGER
- C variable. N must be less than or equal to NM.
- C
- C LOW and IGH are two INTEGER variables determined by the
- C balancing subroutine CBAL. If CBAL has not been used,
- C set LOW=1 and IGH equal to the order of the matrix, N.
- C
- C HR and HI contain the real and imaginary parts, respectively,
- C of the complex upper Hessenberg matrix. Their lower
- C triangles below the subdiagonal contain the multipliers
- C which were used in the reduction by COMHES, if performed.
- C HR and HI are two-dimensional REAL arrays, dimensioned
- C HR(NM,N) and HI(NM,N).
- C
- C On OUTPUT
- C
- C The upper Hessenberg portions of HR and HI have been
- C destroyed. Therefore, they must be saved before calling
- C COMLR if subsequent calculation of eigenvectors is to
- C be performed.
- C
- C WR and WI contain the real and imaginary parts, respectively,
- C of the eigenvalues of the upper Hessenberg matrix. If an
- C error exit is made, the eigenvalues should be correct for
- C indices IERR+1, IERR+2, ..., N. WR and WI are one-
- C dimensional REAL arrays, dimensioned WR(N) and WI(N).
- C
- C IERR is an INTEGER flag set to
- C Zero for normal return,
- C J if the J-th eigenvalue has not been
- C determined after a total of 30*N iterations.
- C The eigenvalues should be correct for indices
- C IERR+1, IERR+2, ..., N.
- C
- C Calls CSROOT for complex square root.
- C Calls CDIV for complex division.
- C
- C Questions and comments should be directed to B. S. Garbow,
- C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY
- C ------------------------------------------------------------------
- C
- C***REFERENCES B. T. Smith, J. M. Boyle, J. J. Dongarra, B. S. Garbow,
- C Y. Ikebe, V. C. Klema and C. B. Moler, Matrix Eigen-
- C system Routines - EISPACK Guide, Springer-Verlag,
- C 1976.
- C***ROUTINES CALLED CDIV, CSROOT
- C***REVISION HISTORY (YYMMDD)
- C 760101 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE COMLR
- C
- INTEGER I,J,L,M,N,EN,LL,MM,NM,IGH,IM1,ITN,ITS,LOW,MP1,ENM1,IERR
- REAL HR(NM,*),HI(NM,*),WR(*),WI(*)
- REAL SI,SR,TI,TR,XI,XR,YI,YR,ZZI,ZZR,S1,S2
- C
- C***FIRST EXECUTABLE STATEMENT COMLR
- IERR = 0
- C .......... STORE ROOTS ISOLATED BY CBAL ..........
- DO 200 I = 1, N
- IF (I .GE. LOW .AND. I .LE. IGH) GO TO 200
- WR(I) = HR(I,I)
- WI(I) = HI(I,I)
- 200 CONTINUE
- C
- EN = IGH
- TR = 0.0E0
- TI = 0.0E0
- ITN = 30*N
- C .......... SEARCH FOR NEXT EIGENVALUE ..........
- 220 IF (EN .LT. LOW) GO TO 1001
- ITS = 0
- ENM1 = EN - 1
- C .......... LOOK FOR SINGLE SMALL SUB-DIAGONAL ELEMENT
- C FOR L=EN STEP -1 UNTIL LOW E0 -- ..........
- 240 DO 260 LL = LOW, EN
- L = EN + LOW - LL
- IF (L .EQ. LOW) GO TO 300
- S1 = ABS(HR(L-1,L-1)) + ABS(HI(L-1,L-1))
- 1 + ABS(HR(L,L)) + ABS(HI(L,L))
- S2 = S1 + ABS(HR(L,L-1)) + ABS(HI(L,L-1))
- IF (S2 .EQ. S1) GO TO 300
- 260 CONTINUE
- C .......... FORM SHIFT ..........
- 300 IF (L .EQ. EN) GO TO 660
- IF (ITN .EQ. 0) GO TO 1000
- IF (ITS .EQ. 10 .OR. ITS .EQ. 20) GO TO 320
- SR = HR(EN,EN)
- SI = HI(EN,EN)
- XR = HR(ENM1,EN) * HR(EN,ENM1) - HI(ENM1,EN) * HI(EN,ENM1)
- XI = HR(ENM1,EN) * HI(EN,ENM1) + HI(ENM1,EN) * HR(EN,ENM1)
- IF (XR .EQ. 0.0E0 .AND. XI .EQ. 0.0E0) GO TO 340
- YR = (HR(ENM1,ENM1) - SR) / 2.0E0
- YI = (HI(ENM1,ENM1) - SI) / 2.0E0
- CALL CSROOT(YR**2-YI**2+XR,2.0E0*YR*YI+XI,ZZR,ZZI)
- IF (YR * ZZR + YI * ZZI .GE. 0.0E0) GO TO 310
- ZZR = -ZZR
- ZZI = -ZZI
- 310 CALL CDIV(XR,XI,YR+ZZR,YI+ZZI,XR,XI)
- SR = SR - XR
- SI = SI - XI
- GO TO 340
- C .......... FORM EXCEPTIONAL SHIFT ..........
- 320 SR = ABS(HR(EN,ENM1)) + ABS(HR(ENM1,EN-2))
- SI = ABS(HI(EN,ENM1)) + ABS(HI(ENM1,EN-2))
- C
- 340 DO 360 I = LOW, EN
- HR(I,I) = HR(I,I) - SR
- HI(I,I) = HI(I,I) - SI
- 360 CONTINUE
- C
- TR = TR + SR
- TI = TI + SI
- ITS = ITS + 1
- ITN = ITN - 1
- C .......... LOOK FOR TWO CONSECUTIVE SMALL
- C SUB-DIAGONAL ELEMENTS ..........
- XR = ABS(HR(ENM1,ENM1)) + ABS(HI(ENM1,ENM1))
- YR = ABS(HR(EN,ENM1)) + ABS(HI(EN,ENM1))
- ZZR = ABS(HR(EN,EN)) + ABS(HI(EN,EN))
- C .......... FOR M=EN-1 STEP -1 UNTIL L DO -- ..........
- DO 380 MM = L, ENM1
- M = ENM1 + L - MM
- IF (M .EQ. L) GO TO 420
- YI = YR
- YR = ABS(HR(M,M-1)) + ABS(HI(M,M-1))
- XI = ZZR
- ZZR = XR
- XR = ABS(HR(M-1,M-1)) + ABS(HI(M-1,M-1))
- S1 = ZZR / YI * (ZZR + XR + XI)
- S2 = S1 + YR
- IF (S2 .EQ. S1) GO TO 420
- 380 CONTINUE
- C .......... TRIANGULAR DECOMPOSITION H=L*R ..........
- 420 MP1 = M + 1
- C
- DO 520 I = MP1, EN
- IM1 = I - 1
- XR = HR(IM1,IM1)
- XI = HI(IM1,IM1)
- YR = HR(I,IM1)
- YI = HI(I,IM1)
- IF (ABS(XR) + ABS(XI) .GE. ABS(YR) + ABS(YI)) GO TO 460
- C .......... INTERCHANGE ROWS OF HR AND HI ..........
- DO 440 J = IM1, EN
- ZZR = HR(IM1,J)
- HR(IM1,J) = HR(I,J)
- HR(I,J) = ZZR
- ZZI = HI(IM1,J)
- HI(IM1,J) = HI(I,J)
- HI(I,J) = ZZI
- 440 CONTINUE
- C
- CALL CDIV(XR,XI,YR,YI,ZZR,ZZI)
- WR(I) = 1.0E0
- GO TO 480
- 460 CALL CDIV(YR,YI,XR,XI,ZZR,ZZI)
- WR(I) = -1.0E0
- 480 HR(I,IM1) = ZZR
- HI(I,IM1) = ZZI
- C
- DO 500 J = I, EN
- HR(I,J) = HR(I,J) - ZZR * HR(IM1,J) + ZZI * HI(IM1,J)
- HI(I,J) = HI(I,J) - ZZR * HI(IM1,J) - ZZI * HR(IM1,J)
- 500 CONTINUE
- C
- 520 CONTINUE
- C .......... COMPOSITION R*L=H ..........
- DO 640 J = MP1, EN
- XR = HR(J,J-1)
- XI = HI(J,J-1)
- HR(J,J-1) = 0.0E0
- HI(J,J-1) = 0.0E0
- C .......... INTERCHANGE COLUMNS OF HR AND HI,
- C IF NECESSARY ..........
- IF (WR(J) .LE. 0.0E0) GO TO 580
- C
- DO 540 I = L, J
- ZZR = HR(I,J-1)
- HR(I,J-1) = HR(I,J)
- HR(I,J) = ZZR
- ZZI = HI(I,J-1)
- HI(I,J-1) = HI(I,J)
- HI(I,J) = ZZI
- 540 CONTINUE
- C
- 580 DO 600 I = L, J
- HR(I,J-1) = HR(I,J-1) + XR * HR(I,J) - XI * HI(I,J)
- HI(I,J-1) = HI(I,J-1) + XR * HI(I,J) + XI * HR(I,J)
- 600 CONTINUE
- C
- 640 CONTINUE
- C
- GO TO 240
- C .......... A ROOT FOUND ..........
- 660 WR(EN) = HR(EN,EN) + TR
- WI(EN) = HI(EN,EN) + TI
- EN = ENM1
- GO TO 220
- C .......... SET ERROR -- NO CONVERGENCE TO AN
- C EIGENVALUE AFTER 30*N ITERATIONS ..........
- 1000 IERR = EN
- 1001 RETURN
- END
- *DECK COMLR2
- SUBROUTINE COMLR2 (NM, N, LOW, IGH, INT, HR, HI, WR, WI, ZR, ZI,
- + IERR)
- C***BEGIN PROLOGUE COMLR2
- C***PURPOSE Compute the eigenvalues and eigenvectors of a complex upper
- C Hessenberg matrix using the modified LR method.
- C***LIBRARY SLATEC (EISPACK)
- C***CATEGORY D4C2B
- C***TYPE COMPLEX (COMLR2-C)
- C***KEYWORDS EIGENVALUES, EIGENVECTORS, EISPACK, LR METHOD
- C***AUTHOR Smith, B. T., et al.
- C***DESCRIPTION
- C
- C This subroutine is a translation of the ALGOL procedure COMLR2,
- C NUM. MATH. 16, 181-204(1970) by Peters and Wilkinson.
- C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 372-395(1971).
- C
- C This subroutine finds the eigenvalues and eigenvectors
- C of a COMPLEX UPPER Hessenberg matrix by the modified LR
- C method. The eigenvectors of a COMPLEX GENERAL matrix
- C can also be found if COMHES has been used to reduce
- C this general matrix to Hessenberg form.
- C
- C On INPUT
- C
- C NM must be set to the row dimension of the two-dimensional
- C array parameters, HR, HI, ZR and ZI, as declared in the
- C calling program dimension statement. NM is an INTEGER
- C variable.
- C
- C N is the order of the matrix H=(HR,HI). N is an INTEGER
- C variable. N must be less than or equal to NM.
- C
- C LOW and IGH are two INTEGER variables determined by the
- C balancing subroutine CBAL. If CBAL has not been used,
- C set LOW=1 and IGH equal to the order of the matrix, N.
- C
- C INT contains information on the rows and columns
- C interchanged in the reduction by COMHES, if performed.
- C Only elements LOW through IGH are used. If you want the
- C eigenvectors of a complex general matrix, leave INT as it
- C came from COMHES. If the eigenvectors of the Hessenberg
- C matrix are desired, set INT(J)=J for these elements. INT
- C is a one-dimensional INTEGER array, dimensioned INT(IGH).
- C
- C HR and HI contain the real and imaginary parts, respectively,
- C of the complex upper Hessenberg matrix. Their lower
- C triangles below the subdiagonal contain the multipliers
- C which were used in the reduction by COMHES, if performed.
- C If the eigenvectors of a complex general matrix are
- C desired, leave these multipliers in the lower triangles.
- C If the eigenvectors of the Hessenberg matrix are desired,
- C these elements must be set to zero. HR and HI are
- C two-dimensional REAL arrays, dimensioned HR(NM,N) and
- C HI(NM,N).
- C
- C On OUTPUT
- C
- C The upper Hessenberg portions of HR and HI have been
- C destroyed, but the location HR(1,1) contains the norm
- C of the triangularized matrix.
- C
- C WR and WI contain the real and imaginary parts, respectively,
- C of the eigenvalues of the upper Hessenberg matrix. If an
- C error exit is made, the eigenvalues should be correct for
- C indices IERR+1, IERR+2, ..., N. WR and WI are one-
- C dimensional REAL arrays, dimensioned WR(N) and WI(N).
- C
- C ZR and ZI contain the real and imaginary parts, respectively,
- C of the eigenvectors. The eigenvectors are unnormalized.
- C If an error exit is made, none of the eigenvectors has been
- C found. ZR and ZI are two-dimensional REAL arrays,
- C dimensioned ZR(NM,N) and ZI(NM,N).
- C
- C IERR is an INTEGER flag set to
- C Zero for normal return,
- C J if the J-th eigenvalue has not been
- C determined after a total of 30*N iterations.
- C The eigenvalues should be correct for indices
- C IERR+1, IERR+2, ..., N, but no eigenvectors are
- C computed.
- C
- C Calls CSROOT for complex square root.
- C Calls CDIV for complex division.
- C
- C Questions and comments should be directed to B. S. Garbow,
- C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY
- C ------------------------------------------------------------------
- C
- C***REFERENCES B. T. Smith, J. M. Boyle, J. J. Dongarra, B. S. Garbow,
- C Y. Ikebe, V. C. Klema and C. B. Moler, Matrix Eigen-
- C system Routines - EISPACK Guide, Springer-Verlag,
- C 1976.
- C***ROUTINES CALLED CDIV, CSROOT
- C***REVISION HISTORY (YYMMDD)
- C 760101 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE COMLR2
- C
- INTEGER I,J,K,L,M,N,EN,II,JJ,LL,MM,NM,NN,IGH,IM1,IP1
- INTEGER ITN,ITS,LOW,MP1,ENM1,IEND,IERR
- REAL HR(NM,*),HI(NM,*),WR(*),WI(*),ZR(NM,*),ZI(NM,*)
- REAL SI,SR,TI,TR,XI,XR,YI,YR,ZZI,ZZR,NORM,S1,S2
- INTEGER INT(*)
- C
- C***FIRST EXECUTABLE STATEMENT COMLR2
- IERR = 0
- C .......... INITIALIZE EIGENVECTOR MATRIX ..........
- DO 100 I = 1, N
- C
- DO 100 J = 1, N
- ZR(I,J) = 0.0E0
- ZI(I,J) = 0.0E0
- IF (I .EQ. J) ZR(I,J) = 1.0E0
- 100 CONTINUE
- C .......... FORM THE MATRIX OF ACCUMULATED TRANSFORMATIONS
- C FROM THE INFORMATION LEFT BY COMHES ..........
- IEND = IGH - LOW - 1
- IF (IEND .LE. 0) GO TO 180
- C .......... FOR I=IGH-1 STEP -1 UNTIL LOW+1 DO -- ..........
- DO 160 II = 1, IEND
- I = IGH - II
- IP1 = I + 1
- C
- DO 120 K = IP1, IGH
- ZR(K,I) = HR(K,I-1)
- ZI(K,I) = HI(K,I-1)
- 120 CONTINUE
- C
- J = INT(I)
- IF (I .EQ. J) GO TO 160
- C
- DO 140 K = I, IGH
- ZR(I,K) = ZR(J,K)
- ZI(I,K) = ZI(J,K)
- ZR(J,K) = 0.0E0
- ZI(J,K) = 0.0E0
- 140 CONTINUE
- C
- ZR(J,I) = 1.0E0
- 160 CONTINUE
- C .......... STORE ROOTS ISOLATED BY CBAL ..........
- 180 DO 200 I = 1, N
- IF (I .GE. LOW .AND. I .LE. IGH) GO TO 200
- WR(I) = HR(I,I)
- WI(I) = HI(I,I)
- 200 CONTINUE
- C
- EN = IGH
- TR = 0.0E0
- TI = 0.0E0
- ITN = 30*N
- C .......... SEARCH FOR NEXT EIGENVALUE ..........
- 220 IF (EN .LT. LOW) GO TO 680
- ITS = 0
- ENM1 = EN - 1
- C .......... LOOK FOR SINGLE SMALL SUB-DIAGONAL ELEMENT
- C FOR L=EN STEP -1 UNTIL LOW DO -- ..........
- 240 DO 260 LL = LOW, EN
- L = EN + LOW - LL
- IF (L .EQ. LOW) GO TO 300
- S1 = ABS(HR(L-1,L-1)) + ABS(HI(L-1,L-1))
- 1 + ABS(HR(L,L)) + ABS(HI(L,L))
- S2 = S1 + ABS(HR(L,L-1)) + ABS(HI(L,L-1))
- IF (S2 .EQ. S1) GO TO 300
- 260 CONTINUE
- C .......... FORM SHIFT ..........
- 300 IF (L .EQ. EN) GO TO 660
- IF (ITN .EQ. 0) GO TO 1000
- IF (ITS .EQ. 10 .OR. ITS .EQ. 20) GO TO 320
- SR = HR(EN,EN)
- SI = HI(EN,EN)
- XR = HR(ENM1,EN) * HR(EN,ENM1) - HI(ENM1,EN) * HI(EN,ENM1)
- XI = HR(ENM1,EN) * HI(EN,ENM1) + HI(ENM1,EN) * HR(EN,ENM1)
- IF (XR .EQ. 0.0E0 .AND. XI .EQ. 0.0E0) GO TO 340
- YR = (HR(ENM1,ENM1) - SR) / 2.0E0
- YI = (HI(ENM1,ENM1) - SI) / 2.0E0
- CALL CSROOT(YR**2-YI**2+XR,2.0E0*YR*YI+XI,ZZR,ZZI)
- IF (YR * ZZR + YI * ZZI .GE. 0.0E0) GO TO 310
- ZZR = -ZZR
- ZZI = -ZZI
- 310 CALL CDIV(XR,XI,YR+ZZR,YI+ZZI,XR,XI)
- SR = SR - XR
- SI = SI - XI
- GO TO 340
- C .......... FORM EXCEPTIONAL SHIFT ..........
- 320 SR = ABS(HR(EN,ENM1)) + ABS(HR(ENM1,EN-2))
- SI = ABS(HI(EN,ENM1)) + ABS(HI(ENM1,EN-2))
- C
- 340 DO 360 I = LOW, EN
- HR(I,I) = HR(I,I) - SR
- HI(I,I) = HI(I,I) - SI
- 360 CONTINUE
- C
- TR = TR + SR
- TI = TI + SI
- ITS = ITS + 1
- ITN = ITN - 1
- C .......... LOOK FOR TWO CONSECUTIVE SMALL
- C SUB-DIAGONAL ELEMENTS ..........
- XR = ABS(HR(ENM1,ENM1)) + ABS(HI(ENM1,ENM1))
- YR = ABS(HR(EN,ENM1)) + ABS(HI(EN,ENM1))
- ZZR = ABS(HR(EN,EN)) + ABS(HI(EN,EN))
- C .......... FOR M=EN-1 STEP -1 UNTIL L DO -- ..........
- DO 380 MM = L, ENM1
- M = ENM1 + L - MM
- IF (M .EQ. L) GO TO 420
- YI = YR
- YR = ABS(HR(M,M-1)) + ABS(HI(M,M-1))
- XI = ZZR
- ZZR = XR
- XR = ABS(HR(M-1,M-1)) + ABS(HI(M-1,M-1))
- S1 = ZZR / YI * (ZZR + XR + XI)
- S2 = S1 + YR
- IF (S2 .EQ. S1) GO TO 420
- 380 CONTINUE
- C .......... TRIANGULAR DECOMPOSITION H=L*R ..........
- 420 MP1 = M + 1
- C
- DO 520 I = MP1, EN
- IM1 = I - 1
- XR = HR(IM1,IM1)
- XI = HI(IM1,IM1)
- YR = HR(I,IM1)
- YI = HI(I,IM1)
- IF (ABS(XR) + ABS(XI) .GE. ABS(YR) + ABS(YI)) GO TO 460
- C .......... INTERCHANGE ROWS OF HR AND HI ..........
- DO 440 J = IM1, N
- ZZR = HR(IM1,J)
- HR(IM1,J) = HR(I,J)
- HR(I,J) = ZZR
- ZZI = HI(IM1,J)
- HI(IM1,J) = HI(I,J)
- HI(I,J) = ZZI
- 440 CONTINUE
- C
- CALL CDIV(XR,XI,YR,YI,ZZR,ZZI)
- WR(I) = 1.0E0
- GO TO 480
- 460 CALL CDIV(YR,YI,XR,XI,ZZR,ZZI)
- WR(I) = -1.0E0
- 480 HR(I,IM1) = ZZR
- HI(I,IM1) = ZZI
- C
- DO 500 J = I, N
- HR(I,J) = HR(I,J) - ZZR * HR(IM1,J) + ZZI * HI(IM1,J)
- HI(I,J) = HI(I,J) - ZZR * HI(IM1,J) - ZZI * HR(IM1,J)
- 500 CONTINUE
- C
- 520 CONTINUE
- C .......... COMPOSITION R*L=H ..........
- DO 640 J = MP1, EN
- XR = HR(J,J-1)
- XI = HI(J,J-1)
- HR(J,J-1) = 0.0E0
- HI(J,J-1) = 0.0E0
- C .......... INTERCHANGE COLUMNS OF HR, HI, ZR, AND ZI,
- C IF NECESSARY ..........
- IF (WR(J) .LE. 0.0E0) GO TO 580
- C
- DO 540 I = 1, J
- ZZR = HR(I,J-1)
- HR(I,J-1) = HR(I,J)
- HR(I,J) = ZZR
- ZZI = HI(I,J-1)
- HI(I,J-1) = HI(I,J)
- HI(I,J) = ZZI
- 540 CONTINUE
- C
- DO 560 I = LOW, IGH
- ZZR = ZR(I,J-1)
- ZR(I,J-1) = ZR(I,J)
- ZR(I,J) = ZZR
- ZZI = ZI(I,J-1)
- ZI(I,J-1) = ZI(I,J)
- ZI(I,J) = ZZI
- 560 CONTINUE
- C
- 580 DO 600 I = 1, J
- HR(I,J-1) = HR(I,J-1) + XR * HR(I,J) - XI * HI(I,J)
- HI(I,J-1) = HI(I,J-1) + XR * HI(I,J) + XI * HR(I,J)
- 600 CONTINUE
- C .......... ACCUMULATE TRANSFORMATIONS ..........
- DO 620 I = LOW, IGH
- ZR(I,J-1) = ZR(I,J-1) + XR * ZR(I,J) - XI * ZI(I,J)
- ZI(I,J-1) = ZI(I,J-1) + XR * ZI(I,J) + XI * ZR(I,J)
- 620 CONTINUE
- C
- 640 CONTINUE
- C
- GO TO 240
- C .......... A ROOT FOUND ..........
- 660 HR(EN,EN) = HR(EN,EN) + TR
- WR(EN) = HR(EN,EN)
- HI(EN,EN) = HI(EN,EN) + TI
- WI(EN) = HI(EN,EN)
- EN = ENM1
- GO TO 220
- C .......... ALL ROOTS FOUND. BACKSUBSTITUTE TO FIND
- C VECTORS OF UPPER TRIANGULAR FORM ..........
- 680 NORM = 0.0E0
- C
- DO 720 I = 1, N
- C
- DO 720 J = I, N
- NORM = NORM + ABS(HR(I,J)) + ABS(HI(I,J))
- 720 CONTINUE
- C
- HR(1,1) = NORM
- IF (N .EQ. 1 .OR. NORM .EQ. 0.0E0) GO TO 1001
- C .......... FOR EN=N STEP -1 UNTIL 2 DO -- ..........
- DO 800 NN = 2, N
- EN = N + 2 - NN
- XR = WR(EN)
- XI = WI(EN)
- ENM1 = EN - 1
- C .......... FOR I=EN-1 STEP -1 UNTIL 1 DO -- ..........
- DO 780 II = 1, ENM1
- I = EN - II
- ZZR = HR(I,EN)
- ZZI = HI(I,EN)
- IF (I .EQ. ENM1) GO TO 760
- IP1 = I + 1
- C
- DO 740 J = IP1, ENM1
- ZZR = ZZR + HR(I,J) * HR(J,EN) - HI(I,J) * HI(J,EN)
- ZZI = ZZI + HR(I,J) * HI(J,EN) + HI(I,J) * HR(J,EN)
- 740 CONTINUE
- C
- 760 YR = XR - WR(I)
- YI = XI - WI(I)
- IF (YR .NE. 0.0E0 .OR. YI .NE. 0.0E0) GO TO 775
- YR = NORM
- 770 YR = 0.5E0*YR
- IF (NORM + YR .GT. NORM) GO TO 770
- YR = 2.0E0*YR
- 775 CALL CDIV(ZZR,ZZI,YR,YI,HR(I,EN),HI(I,EN))
- 780 CONTINUE
- C
- 800 CONTINUE
- C .......... END BACKSUBSTITUTION ..........
- ENM1 = N - 1
- C .......... VECTORS OF ISOLATED ROOTS ..........
- DO 840 I = 1, ENM1
- IF (I .GE. LOW .AND. I .LE. IGH) GO TO 840
- IP1 = I + 1
- C
- DO 820 J = IP1, N
- ZR(I,J) = HR(I,J)
- ZI(I,J) = HI(I,J)
- 820 CONTINUE
- C
- 840 CONTINUE
- C .......... MULTIPLY BY TRANSFORMATION MATRIX TO GIVE
- C VECTORS OF ORIGINAL FULL MATRIX.
- C FOR J=N STEP -1 UNTIL LOW+1 DO -- ..........
- DO 880 JJ = LOW, ENM1
- J = N + LOW - JJ
- M = MIN(J-1,IGH)
- C
- DO 880 I = LOW, IGH
- ZZR = ZR(I,J)
- ZZI = ZI(I,J)
- C
- DO 860 K = LOW, M
- ZZR = ZZR + ZR(I,K) * HR(K,J) - ZI(I,K) * HI(K,J)
- ZZI = ZZI + ZR(I,K) * HI(K,J) + ZI(I,K) * HR(K,J)
- 860 CONTINUE
- C
- ZR(I,J) = ZZR
- ZI(I,J) = ZZI
- 880 CONTINUE
- C
- GO TO 1001
- C .......... SET ERROR -- NO CONVERGENCE TO AN
- C EIGENVALUE AFTER 30*N ITERATIONS ..........
- 1000 IERR = EN
- 1001 RETURN
- END
- *DECK COMPB
- SUBROUTINE COMPB (N, IERROR, AN, BN, CN, B, AH, BH)
- C***BEGIN PROLOGUE COMPB
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to BLKTRI
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (COMPB-S, CCMPB-C)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C COMPB computes the roots of the B polynomials using subroutine
- C TEVLS which is a modification the EISPACK program TQLRAT.
- C IERROR is set to 4 if either TEVLS fails or if A(J+1)*C(J) is
- C less than zero for some J. AH,BH are temporary work arrays.
- C
- C***SEE ALSO BLKTRI
- C***ROUTINES CALLED INDXB, PPADD, R1MACH, TEVLS
- C***COMMON BLOCKS CBLKT
- C***REVISION HISTORY (YYMMDD)
- C 801001 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900402 Added TYPE section. (WRB)
- C***END PROLOGUE COMPB
- C
- DIMENSION AN(*) ,BN(*) ,CN(*) ,B(*) ,
- 1 AH(*) ,BH(*)
- COMMON /CBLKT/ NPP ,K ,EPS ,CNV ,
- 1 NM ,NCMPLX ,IK
- C***FIRST EXECUTABLE STATEMENT COMPB
- EPS = R1MACH(4)
- BNORM = ABS(BN(1))
- DO 102 J=2,NM
- BNORM = MAX(BNORM,ABS(BN(J)))
- ARG = AN(J)*CN(J-1)
- IF (ARG) 119,101,101
- 101 B(J) = SIGN(SQRT(ARG),AN(J))
- 102 CONTINUE
- CNV = EPS*BNORM
- IF = 2**K
- KDO = K-1
- DO 108 L=1,KDO
- IR = L-1
- I2 = 2**IR
- I4 = I2+I2
- IPL = I4-1
- IFD = IF-I4
- DO 107 I=I4,IFD,I4
- CALL INDXB (I,L,IB,NB)
- IF (NB) 108,108,103
- 103 JS = I-IPL
- JF = JS+NB-1
- LS = 0
- DO 104 J=JS,JF
- LS = LS+1
- BH(LS) = BN(J)
- AH(LS) = B(J)
- 104 CONTINUE
- CALL TEVLS (NB,BH,AH,IERROR)
- IF (IERROR) 118,105,118
- 105 LH = IB-1
- DO 106 J=1,NB
- LH = LH+1
- B(LH) = -BH(J)
- 106 CONTINUE
- 107 CONTINUE
- 108 CONTINUE
- DO 109 J=1,NM
- B(J) = -BN(J)
- 109 CONTINUE
- IF (NPP) 117,110,117
- 110 NMP = NM+1
- NB = NM+NMP
- DO 112 J=1,NB
- L1 = MOD(J-1,NMP)+1
- L2 = MOD(J+NM-1,NMP)+1
- ARG = AN(L1)*CN(L2)
- IF (ARG) 119,111,111
- 111 BH(J) = SIGN(SQRT(ARG),-AN(L1))
- AH(J) = -BN(L1)
- 112 CONTINUE
- CALL TEVLS (NB,AH,BH,IERROR)
- IF (IERROR) 118,113,118
- 113 CALL INDXB (IF,K-1,J2,LH)
- CALL INDXB (IF/2,K-1,J1,LH)
- J2 = J2+1
- LH = J2
- N2M2 = J2+NM+NM-2
- 114 D1 = ABS(B(J1)-B(J2-1))
- D2 = ABS(B(J1)-B(J2))
- D3 = ABS(B(J1)-B(J2+1))
- IF ((D2 .LT. D1) .AND. (D2 .LT. D3)) GO TO 115
- B(LH) = B(J2)
- J2 = J2+1
- LH = LH+1
- IF (J2-N2M2) 114,114,116
- 115 J2 = J2+1
- J1 = J1+1
- IF (J2-N2M2) 114,114,116
- 116 B(LH) = B(N2M2+1)
- CALL INDXB (IF,K-1,J1,J2)
- J2 = J1+NMP+NMP
- CALL PPADD (NM+1,IERROR,AN,CN,B(J1),B(J1),B(J2))
- 117 RETURN
- 118 IERROR = 4
- RETURN
- 119 IERROR = 5
- RETURN
- END
- *DECK COMQR
- SUBROUTINE COMQR (NM, N, LOW, IGH, HR, HI, WR, WI, IERR)
- C***BEGIN PROLOGUE COMQR
- C***PURPOSE Compute the eigenvalues of complex upper Hessenberg matrix
- C using the QR method.
- C***LIBRARY SLATEC (EISPACK)
- C***CATEGORY D4C2B
- C***TYPE COMPLEX (HQR-S, COMQR-C)
- C***KEYWORDS EIGENVALUES, EIGENVECTORS, EISPACK
- C***AUTHOR Smith, B. T., et al.
- C***DESCRIPTION
- C
- C This subroutine is a translation of a unitary analogue of the
- C ALGOL procedure COMLR, NUM. MATH. 12, 369-376(1968) by Martin
- C and Wilkinson.
- C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 396-403(1971).
- C The unitary analogue substitutes the QR algorithm of Francis
- C (COMP. JOUR. 4, 332-345(1962)) for the LR algorithm.
- C
- C This subroutine finds the eigenvalues of a COMPLEX
- C upper Hessenberg matrix by the QR method.
- C
- C On INPUT
- C
- C NM must be set to the row dimension of the two-dimensional
- C array parameters, HR and HI, as declared in the calling
- C program dimension statement. NM is an INTEGER variable.
- C
- C N is the order of the matrix H=(HR,HI). N is an INTEGER
- C variable. N must be less than or equal to NM.
- C
- C LOW and IGH are two INTEGER variables determined by the
- C balancing subroutine CBAL. If CBAL has not been used,
- C set LOW=1 and IGH equal to the order of the matrix, N.
- C
- C HR and HI contain the real and imaginary parts, respectively,
- C of the complex upper Hessenberg matrix. Their lower
- C triangles below the subdiagonal contain information about
- C the unitary transformations used in the reduction by CORTH,
- C if performed. HR and HI are two-dimensional REAL arrays,
- C dimensioned HR(NM,N) and HI(NM,N).
- C
- C On OUTPUT
- C
- C The upper Hessenberg portions of HR and HI have been
- C destroyed. Therefore, they must be saved before calling
- C COMQR if subsequent calculation of eigenvectors is to
- C be performed.
- C
- C WR and WI contain the real and imaginary parts, respectively,
- C of the eigenvalues of the upper Hessenberg matrix. If an
- C error exit is made, the eigenvalues should be correct for
- C indices IERR+1, IERR+2, ..., N. WR and WI are one-
- C dimensional REAL arrays, dimensioned WR(N) and WI(N).
- C
- C IERR is an INTEGER flag set to
- C Zero for normal return,
- C J if the J-th eigenvalue has not been
- C determined after a total of 30*N iterations.
- C The eigenvalues should be correct for indices
- C IERR+1, IERR+2, ..., N.
- C
- C Calls CSROOT for complex square root.
- C Calls PYTHAG(A,B) for sqrt(A**2 + B**2).
- C Calls CDIV for complex division.
- C
- C Questions and comments should be directed to B. S. Garbow,
- C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY
- C ------------------------------------------------------------------
- C
- C***REFERENCES B. T. Smith, J. M. Boyle, J. J. Dongarra, B. S. Garbow,
- C Y. Ikebe, V. C. Klema and C. B. Moler, Matrix Eigen-
- C system Routines - EISPACK Guide, Springer-Verlag,
- C 1976.
- C***ROUTINES CALLED CDIV, CSROOT, PYTHAG
- C***REVISION HISTORY (YYMMDD)
- C 760101 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE COMQR
- C
- INTEGER I,J,L,N,EN,LL,NM,IGH,ITN,ITS,LOW,LP1,ENM1,IERR
- REAL HR(NM,*),HI(NM,*),WR(*),WI(*)
- REAL SI,SR,TI,TR,XI,XR,YI,YR,ZZI,ZZR,NORM,S1,S2
- REAL PYTHAG
- C
- C***FIRST EXECUTABLE STATEMENT COMQR
- IERR = 0
- IF (LOW .EQ. IGH) GO TO 180
- C .......... CREATE REAL SUBDIAGONAL ELEMENTS ..........
- L = LOW + 1
- C
- DO 170 I = L, IGH
- LL = MIN(I+1,IGH)
- IF (HI(I,I-1) .EQ. 0.0E0) GO TO 170
- NORM = PYTHAG(HR(I,I-1),HI(I,I-1))
- YR = HR(I,I-1) / NORM
- YI = HI(I,I-1) / NORM
- HR(I,I-1) = NORM
- HI(I,I-1) = 0.0E0
- C
- DO 155 J = I, IGH
- SI = YR * HI(I,J) - YI * HR(I,J)
- HR(I,J) = YR * HR(I,J) + YI * HI(I,J)
- HI(I,J) = SI
- 155 CONTINUE
- C
- DO 160 J = LOW, LL
- SI = YR * HI(J,I) + YI * HR(J,I)
- HR(J,I) = YR * HR(J,I) - YI * HI(J,I)
- HI(J,I) = SI
- 160 CONTINUE
- C
- 170 CONTINUE
- C .......... STORE ROOTS ISOLATED BY CBAL ..........
- 180 DO 200 I = 1, N
- IF (I .GE. LOW .AND. I .LE. IGH) GO TO 200
- WR(I) = HR(I,I)
- WI(I) = HI(I,I)
- 200 CONTINUE
- C
- EN = IGH
- TR = 0.0E0
- TI = 0.0E0
- ITN = 30*N
- C .......... SEARCH FOR NEXT EIGENVALUE ..........
- 220 IF (EN .LT. LOW) GO TO 1001
- ITS = 0
- ENM1 = EN - 1
- C .......... LOOK FOR SINGLE SMALL SUB-DIAGONAL ELEMENT
- C FOR L=EN STEP -1 UNTIL LOW E0 -- ..........
- 240 DO 260 LL = LOW, EN
- L = EN + LOW - LL
- IF (L .EQ. LOW) GO TO 300
- S1 = ABS(HR(L-1,L-1)) + ABS(HI(L-1,L-1))
- 1 + ABS(HR(L,L)) +ABS(HI(L,L))
- S2 = S1 + ABS(HR(L,L-1))
- IF (S2 .EQ. S1) GO TO 300
- 260 CONTINUE
- C .......... FORM SHIFT ..........
- 300 IF (L .EQ. EN) GO TO 660
- IF (ITN .EQ. 0) GO TO 1000
- IF (ITS .EQ. 10 .OR. ITS .EQ. 20) GO TO 320
- SR = HR(EN,EN)
- SI = HI(EN,EN)
- XR = HR(ENM1,EN) * HR(EN,ENM1)
- XI = HI(ENM1,EN) * HR(EN,ENM1)
- IF (XR .EQ. 0.0E0 .AND. XI .EQ. 0.0E0) GO TO 340
- YR = (HR(ENM1,ENM1) - SR) / 2.0E0
- YI = (HI(ENM1,ENM1) - SI) / 2.0E0
- CALL CSROOT(YR**2-YI**2+XR,2.0E0*YR*YI+XI,ZZR,ZZI)
- IF (YR * ZZR + YI * ZZI .GE. 0.0E0) GO TO 310
- ZZR = -ZZR
- ZZI = -ZZI
- 310 CALL CDIV(XR,XI,YR+ZZR,YI+ZZI,XR,XI)
- SR = SR - XR
- SI = SI - XI
- GO TO 340
- C .......... FORM EXCEPTIONAL SHIFT ..........
- 320 SR = ABS(HR(EN,ENM1)) + ABS(HR(ENM1,EN-2))
- SI = 0.0E0
- C
- 340 DO 360 I = LOW, EN
- HR(I,I) = HR(I,I) - SR
- HI(I,I) = HI(I,I) - SI
- 360 CONTINUE
- C
- TR = TR + SR
- TI = TI + SI
- ITS = ITS + 1
- ITN = ITN - 1
- C .......... REDUCE TO TRIANGLE (ROWS) ..........
- LP1 = L + 1
- C
- DO 500 I = LP1, EN
- SR = HR(I,I-1)
- HR(I,I-1) = 0.0E0
- NORM = PYTHAG(PYTHAG(HR(I-1,I-1),HI(I-1,I-1)),SR)
- XR = HR(I-1,I-1) / NORM
- WR(I-1) = XR
- XI = HI(I-1,I-1) / NORM
- WI(I-1) = XI
- HR(I-1,I-1) = NORM
- HI(I-1,I-1) = 0.0E0
- HI(I,I-1) = SR / NORM
- C
- DO 490 J = I, EN
- YR = HR(I-1,J)
- YI = HI(I-1,J)
- ZZR = HR(I,J)
- ZZI = HI(I,J)
- HR(I-1,J) = XR * YR + XI * YI + HI(I,I-1) * ZZR
- HI(I-1,J) = XR * YI - XI * YR + HI(I,I-1) * ZZI
- HR(I,J) = XR * ZZR - XI * ZZI - HI(I,I-1) * YR
- HI(I,J) = XR * ZZI + XI * ZZR - HI(I,I-1) * YI
- 490 CONTINUE
- C
- 500 CONTINUE
- C
- SI = HI(EN,EN)
- IF (SI .EQ. 0.0E0) GO TO 540
- NORM = PYTHAG(HR(EN,EN),SI)
- SR = HR(EN,EN) / NORM
- SI = SI / NORM
- HR(EN,EN) = NORM
- HI(EN,EN) = 0.0E0
- C .......... INVERSE OPERATION (COLUMNS) ..........
- 540 DO 600 J = LP1, EN
- XR = WR(J-1)
- XI = WI(J-1)
- C
- DO 580 I = L, J
- YR = HR(I,J-1)
- YI = 0.0E0
- ZZR = HR(I,J)
- ZZI = HI(I,J)
- IF (I .EQ. J) GO TO 560
- YI = HI(I,J-1)
- HI(I,J-1) = XR * YI + XI * YR + HI(J,J-1) * ZZI
- 560 HR(I,J-1) = XR * YR - XI * YI + HI(J,J-1) * ZZR
- HR(I,J) = XR * ZZR + XI * ZZI - HI(J,J-1) * YR
- HI(I,J) = XR * ZZI - XI * ZZR - HI(J,J-1) * YI
- 580 CONTINUE
- C
- 600 CONTINUE
- C
- IF (SI .EQ. 0.0E0) GO TO 240
- C
- DO 630 I = L, EN
- YR = HR(I,EN)
- YI = HI(I,EN)
- HR(I,EN) = SR * YR - SI * YI
- HI(I,EN) = SR * YI + SI * YR
- 630 CONTINUE
- C
- GO TO 240
- C .......... A ROOT FOUND ..........
- 660 WR(EN) = HR(EN,EN) + TR
- WI(EN) = HI(EN,EN) + TI
- EN = ENM1
- GO TO 220
- C .......... SET ERROR -- NO CONVERGENCE TO AN
- C EIGENVALUE AFTER 30*N ITERATIONS ..........
- 1000 IERR = EN
- 1001 RETURN
- END
- *DECK COMQR2
- SUBROUTINE COMQR2 (NM, N, LOW, IGH, ORTR, ORTI, HR, HI, WR, WI,
- + ZR, ZI, IERR)
- C***BEGIN PROLOGUE COMQR2
- C***PURPOSE Compute the eigenvalues and eigenvectors of a complex upper
- C Hessenberg matrix.
- C***LIBRARY SLATEC (EISPACK)
- C***CATEGORY D4C2B
- C***TYPE COMPLEX (HQR2-S, COMQR2-C)
- C***KEYWORDS EIGENVALUES, EIGENVECTORS, EISPACK
- C***AUTHOR Smith, B. T., et al.
- C***DESCRIPTION
- C
- C This subroutine is a translation of a unitary analogue of the
- C ALGOL procedure COMLR2, NUM. MATH. 16, 181-204(1970) by Peters
- C and Wilkinson.
- C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 372-395(1971).
- C The unitary analogue substitutes the QR algorithm of Francis
- C (COMP. JOUR. 4, 332-345(1962)) for the LR algorithm.
- C
- C This subroutine finds the eigenvalues and eigenvectors
- C of a COMPLEX UPPER Hessenberg matrix by the QR
- C method. The eigenvectors of a COMPLEX GENERAL matrix
- C can also be found if CORTH has been used to reduce
- C this general matrix to Hessenberg form.
- C
- C On INPUT
- C
- C NM must be set to the row dimension of the two-dimensional
- C array parameters, HR, HI, ZR, and ZI, as declared in the
- C calling program dimension statement. NM is an INTEGER
- C variable.
- C
- C N is the order of the matrix H=(HR,HI). N is an INTEGER
- C variable. N must be less than or equal to NM.
- C
- C LOW and IGH are two INTEGER variables determined by the
- C balancing subroutine CBAL. If CBAL has not been used,
- C set LOW=1 and IGH equal to the order of the matrix, N.
- C
- C ORTR and ORTI contain information about the unitary trans-
- C formations used in the reduction by CORTH, if performed.
- C Only elements LOW through IGH are used. If the eigenvectors
- C of the Hessenberg matrix are desired, set ORTR(J) and
- C ORTI(J) to 0.0E0 for these elements. ORTR and ORTI are
- C one-dimensional REAL arrays, dimensioned ORTR(IGH) and
- C ORTI(IGH).
- C
- C HR and HI contain the real and imaginary parts, respectively,
- C of the complex upper Hessenberg matrix. Their lower
- C triangles below the subdiagonal contain information about
- C the unitary transformations used in the reduction by CORTH,
- C if performed. If the eigenvectors of the Hessenberg matrix
- C are desired, these elements may be arbitrary. HR and HI
- C are two-dimensional REAL arrays, dimensioned HR(NM,N) and
- C HI(NM,N).
- C
- C On OUTPUT
- C
- C ORTR, ORTI, and the upper Hessenberg portions of HR and HI
- C have been destroyed.
- C
- C WR and WI contain the real and imaginary parts, respectively,
- C of the eigenvalues of the upper Hessenberg matrix. If an
- C error exit is made, the eigenvalues should be correct for
- C indices IERR+1, IERR+2, ..., N. WR and WI are one-
- C dimensional REAL arrays, dimensioned WR(N) and WI(N).
- C
- C ZR and ZI contain the real and imaginary parts, respectively,
- C of the eigenvectors. The eigenvectors are unnormalized.
- C If an error exit is made, none of the eigenvectors has been
- C found. ZR and ZI are two-dimensional REAL arrays,
- C dimensioned ZR(NM,N) and ZI(NM,N).
- C
- C IERR is an INTEGER flag set to
- C Zero for normal return,
- C J if the J-th eigenvalue has not been
- C determined after a total of 30*N iterations.
- C The eigenvalues should be correct for indices
- C IERR+1, IERR+2, ..., N, but no eigenvectors are
- C computed.
- C
- C Calls CSROOT for complex square root.
- C Calls PYTHAG(A,B) for sqrt(A**2 + B**2).
- C Calls CDIV for complex division.
- C
- C Questions and comments should be directed to B. S. Garbow,
- C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY
- C ------------------------------------------------------------------
- C
- C***REFERENCES B. T. Smith, J. M. Boyle, J. J. Dongarra, B. S. Garbow,
- C Y. Ikebe, V. C. Klema and C. B. Moler, Matrix Eigen-
- C system Routines - EISPACK Guide, Springer-Verlag,
- C 1976.
- C***ROUTINES CALLED CDIV, CSROOT, PYTHAG
- C***REVISION HISTORY (YYMMDD)
- C 760101 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE COMQR2
- C
- INTEGER I,J,K,L,M,N,EN,II,JJ,LL,NM,NN,IGH,IP1
- INTEGER ITN,ITS,LOW,LP1,ENM1,IEND,IERR
- REAL HR(NM,*),HI(NM,*),WR(*),WI(*),ZR(NM,*),ZI(NM,*)
- REAL ORTR(*),ORTI(*)
- REAL SI,SR,TI,TR,XI,XR,YI,YR,ZZI,ZZR,NORM,S1,S2
- REAL PYTHAG
- C
- C***FIRST EXECUTABLE STATEMENT COMQR2
- IERR = 0
- C .......... INITIALIZE EIGENVECTOR MATRIX ..........
- DO 100 I = 1, N
- C
- DO 100 J = 1, N
- ZR(I,J) = 0.0E0
- ZI(I,J) = 0.0E0
- IF (I .EQ. J) ZR(I,J) = 1.0E0
- 100 CONTINUE
- C .......... FORM THE MATRIX OF ACCUMULATED TRANSFORMATIONS
- C FROM THE INFORMATION LEFT BY CORTH ..........
- IEND = IGH - LOW - 1
- IF (IEND) 180, 150, 105
- C .......... FOR I=IGH-1 STEP -1 UNTIL LOW+1 DO -- ..........
- 105 DO 140 II = 1, IEND
- I = IGH - II
- IF (ORTR(I) .EQ. 0.0E0 .AND. ORTI(I) .EQ. 0.0E0) GO TO 140
- IF (HR(I,I-1) .EQ. 0.0E0 .AND. HI(I,I-1) .EQ. 0.0E0) GO TO 140
- C .......... NORM BELOW IS NEGATIVE OF H FORMED IN CORTH ..........
- NORM = HR(I,I-1) * ORTR(I) + HI(I,I-1) * ORTI(I)
- IP1 = I + 1
- C
- DO 110 K = IP1, IGH
- ORTR(K) = HR(K,I-1)
- ORTI(K) = HI(K,I-1)
- 110 CONTINUE
- C
- DO 130 J = I, IGH
- SR = 0.0E0
- SI = 0.0E0
- C
- DO 115 K = I, IGH
- SR = SR + ORTR(K) * ZR(K,J) + ORTI(K) * ZI(K,J)
- SI = SI + ORTR(K) * ZI(K,J) - ORTI(K) * ZR(K,J)
- 115 CONTINUE
- C
- SR = SR / NORM
- SI = SI / NORM
- C
- DO 120 K = I, IGH
- ZR(K,J) = ZR(K,J) + SR * ORTR(K) - SI * ORTI(K)
- ZI(K,J) = ZI(K,J) + SR * ORTI(K) + SI * ORTR(K)
- 120 CONTINUE
- C
- 130 CONTINUE
- C
- 140 CONTINUE
- C .......... CREATE REAL SUBDIAGONAL ELEMENTS ..........
- 150 L = LOW + 1
- C
- DO 170 I = L, IGH
- LL = MIN(I+1,IGH)
- IF (HI(I,I-1) .EQ. 0.0E0) GO TO 170
- NORM = PYTHAG(HR(I,I-1),HI(I,I-1))
- YR = HR(I,I-1) / NORM
- YI = HI(I,I-1) / NORM
- HR(I,I-1) = NORM
- HI(I,I-1) = 0.0E0
- C
- DO 155 J = I, N
- SI = YR * HI(I,J) - YI * HR(I,J)
- HR(I,J) = YR * HR(I,J) + YI * HI(I,J)
- HI(I,J) = SI
- 155 CONTINUE
- C
- DO 160 J = 1, LL
- SI = YR * HI(J,I) + YI * HR(J,I)
- HR(J,I) = YR * HR(J,I) - YI * HI(J,I)
- HI(J,I) = SI
- 160 CONTINUE
- C
- DO 165 J = LOW, IGH
- SI = YR * ZI(J,I) + YI * ZR(J,I)
- ZR(J,I) = YR * ZR(J,I) - YI * ZI(J,I)
- ZI(J,I) = SI
- 165 CONTINUE
- C
- 170 CONTINUE
- C .......... STORE ROOTS ISOLATED BY CBAL ..........
- 180 DO 200 I = 1, N
- IF (I .GE. LOW .AND. I .LE. IGH) GO TO 200
- WR(I) = HR(I,I)
- WI(I) = HI(I,I)
- 200 CONTINUE
- C
- EN = IGH
- TR = 0.0E0
- TI = 0.0E0
- ITN = 30*N
- C .......... SEARCH FOR NEXT EIGENVALUE ..........
- 220 IF (EN .LT. LOW) GO TO 680
- ITS = 0
- ENM1 = EN - 1
- C .......... LOOK FOR SINGLE SMALL SUB-DIAGONAL ELEMENT
- C FOR L=EN STEP -1 UNTIL LOW DO -- ..........
- 240 DO 260 LL = LOW, EN
- L = EN + LOW - LL
- IF (L .EQ. LOW) GO TO 300
- S1 = ABS(HR(L-1,L-1)) + ABS(HI(L-1,L-1))
- 1 + ABS(HR(L,L)) +ABS(HI(L,L))
- S2 = S1 + ABS(HR(L,L-1))
- IF (S2 .EQ. S1) GO TO 300
- 260 CONTINUE
- C .......... FORM SHIFT ..........
- 300 IF (L .EQ. EN) GO TO 660
- IF (ITN .EQ. 0) GO TO 1000
- IF (ITS .EQ. 10 .OR. ITS .EQ. 20) GO TO 320
- SR = HR(EN,EN)
- SI = HI(EN,EN)
- XR = HR(ENM1,EN) * HR(EN,ENM1)
- XI = HI(ENM1,EN) * HR(EN,ENM1)
- IF (XR .EQ. 0.0E0 .AND. XI .EQ. 0.0E0) GO TO 340
- YR = (HR(ENM1,ENM1) - SR) / 2.0E0
- YI = (HI(ENM1,ENM1) - SI) / 2.0E0
- CALL CSROOT(YR**2-YI**2+XR,2.0E0*YR*YI+XI,ZZR,ZZI)
- IF (YR * ZZR + YI * ZZI .GE. 0.0E0) GO TO 310
- ZZR = -ZZR
- ZZI = -ZZI
- 310 CALL CDIV(XR,XI,YR+ZZR,YI+ZZI,XR,XI)
- SR = SR - XR
- SI = SI - XI
- GO TO 340
- C .......... FORM EXCEPTIONAL SHIFT ..........
- 320 SR = ABS(HR(EN,ENM1)) + ABS(HR(ENM1,EN-2))
- SI = 0.0E0
- C
- 340 DO 360 I = LOW, EN
- HR(I,I) = HR(I,I) - SR
- HI(I,I) = HI(I,I) - SI
- 360 CONTINUE
- C
- TR = TR + SR
- TI = TI + SI
- ITS = ITS + 1
- ITN = ITN - 1
- C .......... REDUCE TO TRIANGLE (ROWS) ..........
- LP1 = L + 1
- C
- DO 500 I = LP1, EN
- SR = HR(I,I-1)
- HR(I,I-1) = 0.0E0
- NORM = PYTHAG(PYTHAG(HR(I-1,I-1),HI(I-1,I-1)),SR)
- XR = HR(I-1,I-1) / NORM
- WR(I-1) = XR
- XI = HI(I-1,I-1) / NORM
- WI(I-1) = XI
- HR(I-1,I-1) = NORM
- HI(I-1,I-1) = 0.0E0
- HI(I,I-1) = SR / NORM
- C
- DO 490 J = I, N
- YR = HR(I-1,J)
- YI = HI(I-1,J)
- ZZR = HR(I,J)
- ZZI = HI(I,J)
- HR(I-1,J) = XR * YR + XI * YI + HI(I,I-1) * ZZR
- HI(I-1,J) = XR * YI - XI * YR + HI(I,I-1) * ZZI
- HR(I,J) = XR * ZZR - XI * ZZI - HI(I,I-1) * YR
- HI(I,J) = XR * ZZI + XI * ZZR - HI(I,I-1) * YI
- 490 CONTINUE
- C
- 500 CONTINUE
- C
- SI = HI(EN,EN)
- IF (SI .EQ. 0.0E0) GO TO 540
- NORM = PYTHAG(HR(EN,EN),SI)
- SR = HR(EN,EN) / NORM
- SI = SI / NORM
- HR(EN,EN) = NORM
- HI(EN,EN) = 0.0E0
- IF (EN .EQ. N) GO TO 540
- IP1 = EN + 1
- C
- DO 520 J = IP1, N
- YR = HR(EN,J)
- YI = HI(EN,J)
- HR(EN,J) = SR * YR + SI * YI
- HI(EN,J) = SR * YI - SI * YR
- 520 CONTINUE
- C .......... INVERSE OPERATION (COLUMNS) ..........
- 540 DO 600 J = LP1, EN
- XR = WR(J-1)
- XI = WI(J-1)
- C
- DO 580 I = 1, J
- YR = HR(I,J-1)
- YI = 0.0E0
- ZZR = HR(I,J)
- ZZI = HI(I,J)
- IF (I .EQ. J) GO TO 560
- YI = HI(I,J-1)
- HI(I,J-1) = XR * YI + XI * YR + HI(J,J-1) * ZZI
- 560 HR(I,J-1) = XR * YR - XI * YI + HI(J,J-1) * ZZR
- HR(I,J) = XR * ZZR + XI * ZZI - HI(J,J-1) * YR
- HI(I,J) = XR * ZZI - XI * ZZR - HI(J,J-1) * YI
- 580 CONTINUE
- C
- DO 590 I = LOW, IGH
- YR = ZR(I,J-1)
- YI = ZI(I,J-1)
- ZZR = ZR(I,J)
- ZZI = ZI(I,J)
- ZR(I,J-1) = XR * YR - XI * YI + HI(J,J-1) * ZZR
- ZI(I,J-1) = XR * YI + XI * YR + HI(J,J-1) * ZZI
- ZR(I,J) = XR * ZZR + XI * ZZI - HI(J,J-1) * YR
- ZI(I,J) = XR * ZZI - XI * ZZR - HI(J,J-1) * YI
- 590 CONTINUE
- C
- 600 CONTINUE
- C
- IF (SI .EQ. 0.0E0) GO TO 240
- C
- DO 630 I = 1, EN
- YR = HR(I,EN)
- YI = HI(I,EN)
- HR(I,EN) = SR * YR - SI * YI
- HI(I,EN) = SR * YI + SI * YR
- 630 CONTINUE
- C
- DO 640 I = LOW, IGH
- YR = ZR(I,EN)
- YI = ZI(I,EN)
- ZR(I,EN) = SR * YR - SI * YI
- ZI(I,EN) = SR * YI + SI * YR
- 640 CONTINUE
- C
- GO TO 240
- C .......... A ROOT FOUND ..........
- 660 HR(EN,EN) = HR(EN,EN) + TR
- WR(EN) = HR(EN,EN)
- HI(EN,EN) = HI(EN,EN) + TI
- WI(EN) = HI(EN,EN)
- EN = ENM1
- GO TO 220
- C .......... ALL ROOTS FOUND. BACKSUBSTITUTE TO FIND
- C VECTORS OF UPPER TRIANGULAR FORM ..........
- 680 NORM = 0.0E0
- C
- DO 720 I = 1, N
- C
- DO 720 J = I, N
- NORM = NORM + ABS(HR(I,J)) + ABS(HI(I,J))
- 720 CONTINUE
- C
- IF (N .EQ. 1 .OR. NORM .EQ. 0.0E0) GO TO 1001
- C .......... FOR EN=N STEP -1 UNTIL 2 DO -- ..........
- DO 800 NN = 2, N
- EN = N + 2 - NN
- XR = WR(EN)
- XI = WI(EN)
- ENM1 = EN - 1
- C .......... FOR I=EN-1 STEP -1 UNTIL 1 DO -- ..........
- DO 780 II = 1, ENM1
- I = EN - II
- ZZR = HR(I,EN)
- ZZI = HI(I,EN)
- IF (I .EQ. ENM1) GO TO 760
- IP1 = I + 1
- C
- DO 740 J = IP1, ENM1
- ZZR = ZZR + HR(I,J) * HR(J,EN) - HI(I,J) * HI(J,EN)
- ZZI = ZZI + HR(I,J) * HI(J,EN) + HI(I,J) * HR(J,EN)
- 740 CONTINUE
- C
- 760 YR = XR - WR(I)
- YI = XI - WI(I)
- IF (YR .NE. 0.0E0 .OR. YI .NE. 0.0E0) GO TO 775
- YR = NORM
- 770 YR = 0.5E0*YR
- IF (NORM + YR .GT. NORM) GO TO 770
- YR = 2.0E0*YR
- 775 CALL CDIV(ZZR,ZZI,YR,YI,HR(I,EN),HI(I,EN))
- 780 CONTINUE
- C
- 800 CONTINUE
- C .......... END BACKSUBSTITUTION ..........
- ENM1 = N - 1
- C .......... VECTORS OF ISOLATED ROOTS ..........
- DO 840 I = 1, ENM1
- IF (I .GE. LOW .AND. I .LE. IGH) GO TO 840
- IP1 = I + 1
- C
- DO 820 J = IP1, N
- ZR(I,J) = HR(I,J)
- ZI(I,J) = HI(I,J)
- 820 CONTINUE
- C
- 840 CONTINUE
- C .......... MULTIPLY BY TRANSFORMATION MATRIX TO GIVE
- C VECTORS OF ORIGINAL FULL MATRIX.
- C FOR J=N STEP -1 UNTIL LOW+1 DO -- ..........
- DO 880 JJ = LOW, ENM1
- J = N + LOW - JJ
- M = MIN(J-1,IGH)
- C
- DO 880 I = LOW, IGH
- ZZR = ZR(I,J)
- ZZI = ZI(I,J)
- C
- DO 860 K = LOW, M
- ZZR = ZZR + ZR(I,K) * HR(K,J) - ZI(I,K) * HI(K,J)
- ZZI = ZZI + ZR(I,K) * HI(K,J) + ZI(I,K) * HR(K,J)
- 860 CONTINUE
- C
- ZR(I,J) = ZZR
- ZI(I,J) = ZZI
- 880 CONTINUE
- C
- GO TO 1001
- C .......... SET ERROR -- NO CONVERGENCE TO AN
- C EIGENVALUE AFTER 30*N ITERATIONS ..........
- 1000 IERR = EN
- 1001 RETURN
- END
- *DECK CORTB
- SUBROUTINE CORTB (NM, LOW, IGH, AR, AI, ORTR, ORTI, M, ZR, ZI)
- C***BEGIN PROLOGUE CORTB
- C***PURPOSE Form the eigenvectors of a complex general matrix from
- C eigenvectors of upper Hessenberg matrix output from
- C CORTH.
- C***LIBRARY SLATEC (EISPACK)
- C***CATEGORY D4C4
- C***TYPE COMPLEX (ORTBAK-S, CORTB-C)
- C***KEYWORDS EIGENVALUES, EIGENVECTORS, EISPACK
- C***AUTHOR Smith, B. T., et al.
- C***DESCRIPTION
- C
- C This subroutine is a translation of a complex analogue of
- C the ALGOL procedure ORTBAK, NUM. MATH. 12, 349-368(1968)
- C by Martin and Wilkinson.
- C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 339-358(1971).
- C
- C This subroutine forms the eigenvectors of a COMPLEX GENERAL
- C matrix by back transforming those of the corresponding
- C upper Hessenberg matrix determined by CORTH.
- C
- C On INPUT
- C
- C NM must be set to the row dimension of the two-dimensional
- C array parameters, AR, AI, ZR, and ZI, as declared in the
- C calling program dimension statement. NM is an INTEGER
- C variable.
- C
- C LOW and IGH are two INTEGER variables determined by the
- C balancing subroutine CBAL. If CBAL has not been used,
- C set LOW=1 and IGH equal to the order of the matrix.
- C
- C AR and AI contain information about the unitary trans-
- C formations used in the reduction by CORTH in their
- C strict lower triangles. AR and AI are two-dimensional
- C REAL arrays, dimensioned AR(NM,IGH) and AI(NM,IGH).
- C
- C ORTR and ORTI contain further information about the unitary
- C transformations used in the reduction by CORTH. Only
- C elements LOW through IGH are used. ORTR and ORTI are
- C one-dimensional REAL arrays, dimensioned ORTR(IGH) and
- C ORTI(IGH).
- C
- C M is the number of columns of Z=(ZR,ZI) to be back transformed.
- C M is an INTEGER variable.
- C
- C ZR and ZI contain the real and imaginary parts, respectively,
- C of the eigenvectors to be back transformed in their first
- C M columns. ZR and ZI are two-dimensional REAL arrays,
- C dimensioned ZR(NM,M) and ZI(NM,M).
- C
- C On OUTPUT
- C
- C ZR and ZI contain the real and imaginary parts, respectively,
- C of the transformed eigenvectors in their first M columns.
- C
- C ORTR and ORTI have been altered.
- C
- C Note that CORTB preserves vector Euclidean norms.
- C
- C Questions and comments should be directed to B. S. Garbow,
- C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY
- C ------------------------------------------------------------------
- C
- C***REFERENCES B. T. Smith, J. M. Boyle, J. J. Dongarra, B. S. Garbow,
- C Y. Ikebe, V. C. Klema and C. B. Moler, Matrix Eigen-
- C system Routines - EISPACK Guide, Springer-Verlag,
- C 1976.
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 760101 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CORTB
- C
- INTEGER I,J,M,LA,MM,MP,NM,IGH,KP1,LOW,MP1
- REAL AR(NM,*),AI(NM,*),ORTR(*),ORTI(*)
- REAL ZR(NM,*),ZI(NM,*)
- REAL H,GI,GR
- C
- C***FIRST EXECUTABLE STATEMENT CORTB
- IF (M .EQ. 0) GO TO 200
- LA = IGH - 1
- KP1 = LOW + 1
- IF (LA .LT. KP1) GO TO 200
- C .......... FOR MP=IGH-1 STEP -1 UNTIL LOW+1 DO -- ..........
- DO 140 MM = KP1, LA
- MP = LOW + IGH - MM
- IF (AR(MP,MP-1) .EQ. 0.0E0 .AND. AI(MP,MP-1) .EQ. 0.0E0)
- 1 GO TO 140
- C .......... H BELOW IS NEGATIVE OF H FORMED IN CORTH ..........
- H = AR(MP,MP-1) * ORTR(MP) + AI(MP,MP-1) * ORTI(MP)
- MP1 = MP + 1
- C
- DO 100 I = MP1, IGH
- ORTR(I) = AR(I,MP-1)
- ORTI(I) = AI(I,MP-1)
- 100 CONTINUE
- C
- DO 130 J = 1, M
- GR = 0.0E0
- GI = 0.0E0
- C
- DO 110 I = MP, IGH
- GR = GR + ORTR(I) * ZR(I,J) + ORTI(I) * ZI(I,J)
- GI = GI + ORTR(I) * ZI(I,J) - ORTI(I) * ZR(I,J)
- 110 CONTINUE
- C
- GR = GR / H
- GI = GI / H
- C
- DO 120 I = MP, IGH
- ZR(I,J) = ZR(I,J) + GR * ORTR(I) - GI * ORTI(I)
- ZI(I,J) = ZI(I,J) + GR * ORTI(I) + GI * ORTR(I)
- 120 CONTINUE
- C
- 130 CONTINUE
- C
- 140 CONTINUE
- C
- 200 RETURN
- END
- *DECK CORTH
- SUBROUTINE CORTH (NM, N, LOW, IGH, AR, AI, ORTR, ORTI)
- C***BEGIN PROLOGUE CORTH
- C***PURPOSE Reduce a complex general matrix to complex upper Hessenberg
- C form using unitary similarity transformations.
- C***LIBRARY SLATEC (EISPACK)
- C***CATEGORY D4C1B2
- C***TYPE COMPLEX (ORTHES-S, CORTH-C)
- C***KEYWORDS EIGENVALUES, EIGENVECTORS, EISPACK
- C***AUTHOR Smith, B. T., et al.
- C***DESCRIPTION
- C
- C This subroutine is a translation of a complex analogue of
- C the ALGOL procedure ORTHES, NUM. MATH. 12, 349-368(1968)
- C by Martin and Wilkinson.
- C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 339-358(1971).
- C
- C Given a COMPLEX GENERAL matrix, this subroutine
- C reduces a submatrix situated in rows and columns
- C LOW through IGH to upper Hessenberg form by
- C unitary similarity transformations.
- C
- C On INPUT
- C
- C NM must be set to the row dimension of the two-dimensional
- C array parameters, AR and AI, as declared in the calling
- C program dimension statement. NM is an INTEGER variable.
- C
- C N is the order of the matrix A=(AR,AI). N is an INTEGER
- C variable. N must be less than or equal to NM.
- C
- C LOW and IGH are two INTEGER variables determined by the
- C balancing subroutine CBAL. If CBAL has not been used,
- C set LOW=1 and IGH equal to the order of the matrix, N.
- C
- C AR and AI contain the real and imaginary parts, respectively,
- C of the complex input matrix. AR and AI are two-dimensional
- C REAL arrays, dimensioned AR(NM,N) and AI(NM,N).
- C
- C On OUTPUT
- C
- C AR and AI contain the real and imaginary parts, respectively,
- C of the Hessenberg matrix. Information about the unitary
- C transformations used in the reduction is stored in the
- C remaining triangles under the Hessenberg matrix.
- C
- C ORTR and ORTI contain further information about the unitary
- C transformations. Only elements LOW through IGH are used.
- C ORTR and ORTI are one-dimensional REAL arrays, dimensioned
- C ORTR(IGH) and ORTI(IGH).
- C
- C Calls PYTHAG(A,B) for sqrt(A**2 + B**2).
- C
- C Questions and comments should be directed to B. S. Garbow,
- C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY
- C ------------------------------------------------------------------
- C
- C***REFERENCES B. T. Smith, J. M. Boyle, J. J. Dongarra, B. S. Garbow,
- C Y. Ikebe, V. C. Klema and C. B. Moler, Matrix Eigen-
- C system Routines - EISPACK Guide, Springer-Verlag,
- C 1976.
- C***ROUTINES CALLED PYTHAG
- C***REVISION HISTORY (YYMMDD)
- C 760101 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CORTH
- C
- INTEGER I,J,M,N,II,JJ,LA,MP,NM,IGH,KP1,LOW
- REAL AR(NM,*),AI(NM,*),ORTR(*),ORTI(*)
- REAL F,G,H,FI,FR,SCALE
- REAL PYTHAG
- C
- C***FIRST EXECUTABLE STATEMENT CORTH
- LA = IGH - 1
- KP1 = LOW + 1
- IF (LA .LT. KP1) GO TO 200
- C
- DO 180 M = KP1, LA
- H = 0.0E0
- ORTR(M) = 0.0E0
- ORTI(M) = 0.0E0
- SCALE = 0.0E0
- C .......... SCALE COLUMN (ALGOL TOL THEN NOT NEEDED) ..........
- DO 90 I = M, IGH
- 90 SCALE = SCALE + ABS(AR(I,M-1)) + ABS(AI(I,M-1))
- C
- IF (SCALE .EQ. 0.0E0) GO TO 180
- MP = M + IGH
- C .......... FOR I=IGH STEP -1 UNTIL M DO -- ..........
- DO 100 II = M, IGH
- I = MP - II
- ORTR(I) = AR(I,M-1) / SCALE
- ORTI(I) = AI(I,M-1) / SCALE
- H = H + ORTR(I) * ORTR(I) + ORTI(I) * ORTI(I)
- 100 CONTINUE
- C
- G = SQRT(H)
- F = PYTHAG(ORTR(M),ORTI(M))
- IF (F .EQ. 0.0E0) GO TO 103
- H = H + F * G
- G = G / F
- ORTR(M) = (1.0E0 + G) * ORTR(M)
- ORTI(M) = (1.0E0 + G) * ORTI(M)
- GO TO 105
- C
- 103 ORTR(M) = G
- AR(M,M-1) = SCALE
- C .......... FORM (I-(U*UT)/H) * A ..........
- 105 DO 130 J = M, N
- FR = 0.0E0
- FI = 0.0E0
- C .......... FOR I=IGH STEP -1 UNTIL M DO -- ..........
- DO 110 II = M, IGH
- I = MP - II
- FR = FR + ORTR(I) * AR(I,J) + ORTI(I) * AI(I,J)
- FI = FI + ORTR(I) * AI(I,J) - ORTI(I) * AR(I,J)
- 110 CONTINUE
- C
- FR = FR / H
- FI = FI / H
- C
- DO 120 I = M, IGH
- AR(I,J) = AR(I,J) - FR * ORTR(I) + FI * ORTI(I)
- AI(I,J) = AI(I,J) - FR * ORTI(I) - FI * ORTR(I)
- 120 CONTINUE
- C
- 130 CONTINUE
- C .......... FORM (I-(U*UT)/H)*A*(I-(U*UT)/H) ..........
- DO 160 I = 1, IGH
- FR = 0.0E0
- FI = 0.0E0
- C .......... FOR J=IGH STEP -1 UNTIL M DO -- ..........
- DO 140 JJ = M, IGH
- J = MP - JJ
- FR = FR + ORTR(J) * AR(I,J) - ORTI(J) * AI(I,J)
- FI = FI + ORTR(J) * AI(I,J) + ORTI(J) * AR(I,J)
- 140 CONTINUE
- C
- FR = FR / H
- FI = FI / H
- C
- DO 150 J = M, IGH
- AR(I,J) = AR(I,J) - FR * ORTR(J) - FI * ORTI(J)
- AI(I,J) = AI(I,J) + FR * ORTI(J) - FI * ORTR(J)
- 150 CONTINUE
- C
- 160 CONTINUE
- C
- ORTR(M) = SCALE * ORTR(M)
- ORTI(M) = SCALE * ORTI(M)
- AR(M,M-1) = -G * AR(M,M-1)
- AI(M,M-1) = -G * AI(M,M-1)
- 180 CONTINUE
- C
- 200 RETURN
- END
- *DECK COSDG
- FUNCTION COSDG (X)
- C***BEGIN PROLOGUE COSDG
- C***PURPOSE Compute the cosine of an argument in degrees.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C4A
- C***TYPE SINGLE PRECISION (COSDG-S, DCOSDG-D)
- C***KEYWORDS COSINE, DEGREES, ELEMENTARY FUNCTIONS, FNLIB,
- C TRIGONOMETRIC
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C COSDG(X) evaluates the cosine for real X in degrees.
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 770601 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C***END PROLOGUE COSDG
- C JUNE 1977 EDITION. W. FULLERTON, C3, LOS ALAMOS SCIENTIFIC LAB.
- SAVE RADDEG
- DATA RADDEG / .017453292519943296E0 /
- C
- C***FIRST EXECUTABLE STATEMENT COSDG
- COSDG = COS (RADDEG*X)
- C
- IF (MOD(X,90.).NE.0.) RETURN
- N = ABS(X)/90.0 + 0.5
- N = MOD (N, 2)
- IF (N.EQ.0) COSDG = SIGN (1.0, COSDG)
- IF (N.EQ.1) COSDG = 0.0
- C
- RETURN
- END
- *DECK COSGEN
- SUBROUTINE COSGEN (N, IJUMP, FNUM, FDEN, A)
- C***BEGIN PROLOGUE COSGEN
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to GENBUN
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (COSGEN-S, CMPCSG-C)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C This subroutine computes required cosine values in ascending
- C order. When IJUMP .GT. 1 the routine computes values
- C
- C 2*COS(J*PI/L) , J=1,2,...,L and J .NE. 0(MOD N/IJUMP+1)
- C
- C where L = IJUMP*(N/IJUMP+1).
- C
- C
- C when IJUMP = 1 it computes
- C
- C 2*COS((J-FNUM)*PI/(N+FDEN)) , J=1, 2, ... ,N
- C
- C where
- C FNUM = 0.5, FDEN = 0.0, for regular reduction values.
- C FNUM = 0.0, FDEN = 1.0, for B-R and C-R when ISTAG = 1
- C FNUM = 0.0, FDEN = 0.5, for B-R and C-R when ISTAG = 2
- C FNUM = 0.5, FDEN = 0.5, for B-R and C-R when ISTAG = 2
- C in POISN2 only.
- C
- C***SEE ALSO GENBUN
- C***ROUTINES CALLED PIMACH
- C***REVISION HISTORY (YYMMDD)
- C 801001 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900402 Added TYPE section. (WRB)
- C***END PROLOGUE COSGEN
- DIMENSION A(*)
- C
- C
- C***FIRST EXECUTABLE STATEMENT COSGEN
- PI = PIMACH(DUM)
- IF (N .EQ. 0) GO TO 105
- IF (IJUMP .EQ. 1) GO TO 103
- K3 = N/IJUMP+1
- K4 = K3-1
- PIBYN = PI/(N+IJUMP)
- DO 102 K=1,IJUMP
- K1 = (K-1)*K3
- K5 = (K-1)*K4
- DO 101 I=1,K4
- X = K1+I
- K2 = K5+I
- A(K2) = -2.*COS(X*PIBYN)
- 101 CONTINUE
- 102 CONTINUE
- GO TO 105
- 103 CONTINUE
- NP1 = N+1
- Y = PI/(N+FDEN)
- DO 104 I=1,N
- X = NP1-I-FNUM
- A(I) = 2.*COS(X*Y)
- 104 CONTINUE
- 105 CONTINUE
- RETURN
- END
- *DECK COSQB
- SUBROUTINE COSQB (N, X, WSAVE)
- C***BEGIN PROLOGUE COSQB
- C***PURPOSE Compute the unnormalized inverse cosine transform.
- C***LIBRARY SLATEC (FFTPACK)
- C***CATEGORY J1A3
- C***TYPE SINGLE PRECISION (COSQB-S)
- C***KEYWORDS FFTPACK, INVERSE COSINE FOURIER TRANSFORM
- C***AUTHOR Swarztrauber, P. N., (NCAR)
- C***DESCRIPTION
- C
- C Subroutine COSQB computes the fast Fourier transform of quarter
- C wave data. That is, COSQB computes a sequence from its
- C representation in terms of a cosine series with odd wave numbers.
- C The transform is defined below at output parameter X.
- C
- C COSQB is the unnormalized inverse of COSQF since a call of COSQB
- C followed by a call of COSQF will multiply the input sequence X
- C by 4*N.
- C
- C The array WSAVE which is used by subroutine COSQB must be
- C initialized by calling subroutine COSQI(N,WSAVE).
- C
- C
- C Input Parameters
- C
- C N the length of the array X to be transformed. The method
- C is most efficient when N is a product of small primes.
- C
- C X an array which contains the sequence to be transformed
- C
- C WSAVE a work array which must be dimensioned at least 3*N+15
- C in the program that calls COSQB. The WSAVE array must be
- C initialized by calling subroutine COSQI(N,WSAVE), and a
- C different WSAVE array must be used for each different
- C value of N. This initialization does not have to be
- C repeated so long as N remains unchanged. Thus subsequent
- C transforms can be obtained faster than the first.
- C
- C Output Parameters
- C
- C X For I=1,...,N
- C
- C X(I)= the sum from K=1 to K=N of
- C
- C 2*X(K)*COS((2*K-1)*(I-1)*PI/(2*N))
- C
- C A call of COSQB followed by a call of
- C COSQF will multiply the sequence X by 4*N.
- C Therefore COSQF is the unnormalized inverse
- C of COSQB.
- C
- C WSAVE contains initialization calculations which must not
- C be destroyed between calls of COSQB or COSQF.
- C
- C***REFERENCES P. N. Swarztrauber, Vectorizing the FFTs, in Parallel
- C Computations (G. Rodrigue, ed.), Academic Press,
- C 1982, pp. 51-83.
- C***ROUTINES CALLED COSQB1
- C***REVISION HISTORY (YYMMDD)
- C 790601 DATE WRITTEN
- C 830401 Modified to use SLATEC library source file format.
- C 860115 Modified by Ron Boisvert to adhere to Fortran 77 by
- C (a) changing dummy array size declarations (1) to (*),
- C (b) changing definition of variable TSQRT2 by using
- C FORTRAN intrinsic function SQRT instead of a DATA
- C statement.
- C 861211 REVISION DATE from Version 3.2
- C 881128 Modified by Dick Valent to meet prologue standards.
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE COSQB
- DIMENSION X(*), WSAVE(*)
- C***FIRST EXECUTABLE STATEMENT COSQB
- TSQRT2 = 2.*SQRT(2.)
- IF (N-2) 101,102,103
- 101 X(1) = 4.*X(1)
- RETURN
- 102 X1 = 4.*(X(1)+X(2))
- X(2) = TSQRT2*(X(1)-X(2))
- X(1) = X1
- RETURN
- 103 CALL COSQB1 (N,X,WSAVE,WSAVE(N+1))
- RETURN
- END
- *DECK COSQB1
- SUBROUTINE COSQB1 (N, X, W, XH)
- C***BEGIN PROLOGUE COSQB1
- C***SUBSIDIARY
- C***PURPOSE Compute the unnormalized inverse of COSQF1.
- C***LIBRARY SLATEC (FFTPACK)
- C***CATEGORY J1A3
- C***TYPE SINGLE PRECISION (COSQB1-S)
- C***KEYWORDS FFTPACK, FOURIER TRANSFORM
- C***AUTHOR Swarztrauber, P. N., (NCAR)
- C***DESCRIPTION
- C
- C Subroutine COSQB1 computes the fast Fourier transform of quarter
- C wave data. That is, COSQB1 computes a sequence from its
- C representation in terms of a cosine series with odd wave numbers.
- C The transform is defined below at output parameter X.
- C
- C***REFERENCES P. N. Swarztrauber, Vectorizing the FFTs, in Parallel
- C Computations (G. Rodrigue, ed.), Academic Press,
- C 1982, pp. 51-83.
- C***ROUTINES CALLED RFFTB
- C***REVISION HISTORY (YYMMDD)
- C 790601 DATE WRITTEN
- C 830401 Modified to use SLATEC library source file format.
- C 860115 Modified by Ron Boisvert to adhere to Fortran 77 by
- C changing dummy array size declarations (1) to (*).
- C 881128 Modified by Dick Valent to meet prologue standards.
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE COSQB1
- DIMENSION X(*), W(*), XH(*)
- C***FIRST EXECUTABLE STATEMENT COSQB1
- NS2 = (N+1)/2
- NP2 = N+2
- DO 101 I=3,N,2
- XIM1 = X(I-1)+X(I)
- X(I) = X(I)-X(I-1)
- X(I-1) = XIM1
- 101 CONTINUE
- X(1) = X(1)+X(1)
- MODN = MOD(N,2)
- IF (MODN .EQ. 0) X(N) = X(N)+X(N)
- CALL RFFTB (N,X,XH)
- DO 102 K=2,NS2
- KC = NP2-K
- XH(K) = W(K-1)*X(KC)+W(KC-1)*X(K)
- XH(KC) = W(K-1)*X(K)-W(KC-1)*X(KC)
- 102 CONTINUE
- IF (MODN .EQ. 0) X(NS2+1) = W(NS2)*(X(NS2+1)+X(NS2+1))
- DO 103 K=2,NS2
- KC = NP2-K
- X(K) = XH(K)+XH(KC)
- X(KC) = XH(K)-XH(KC)
- 103 CONTINUE
- X(1) = X(1)+X(1)
- RETURN
- END
- *DECK COSQF
- SUBROUTINE COSQF (N, X, WSAVE)
- C***BEGIN PROLOGUE COSQF
- C***PURPOSE Compute the forward cosine transform with odd wave numbers.
- C***LIBRARY SLATEC (FFTPACK)
- C***CATEGORY J1A3
- C***TYPE SINGLE PRECISION (COSQF-S)
- C***KEYWORDS COSINE FOURIER TRANSFORM, FFTPACK
- C***AUTHOR Swarztrauber, P. N., (NCAR)
- C***DESCRIPTION
- C
- C Subroutine COSQF computes the fast Fourier transform of quarter
- C wave data. That is, COSQF computes the coefficients in a cosine
- C series representation with only odd wave numbers. The transform
- C is defined below at Output Parameter X
- C
- C COSQF is the unnormalized inverse of COSQB since a call of COSQF
- C followed by a call of COSQB will multiply the input sequence X
- C by 4*N.
- C
- C The array WSAVE which is used by subroutine COSQF must be
- C initialized by calling subroutine COSQI(N,WSAVE).
- C
- C
- C Input Parameters
- C
- C N the length of the array X to be transformed. The method
- C is most efficient when N is a product of small primes.
- C
- C X an array which contains the sequence to be transformed
- C
- C WSAVE a work array which must be dimensioned at least 3*N+15
- C in the program that calls COSQF. The WSAVE array must be
- C initialized by calling subroutine COSQI(N,WSAVE), and a
- C different WSAVE array must be used for each different
- C value of N. This initialization does not have to be
- C repeated so long as N remains unchanged. Thus subsequent
- C transforms can be obtained faster than the first.
- C
- C Output Parameters
- C
- C X For I=1,...,N
- C
- C X(I) = X(1) plus the sum from K=2 to K=N of
- C
- C 2*X(K)*COS((2*I-1)*(K-1)*PI/(2*N))
- C
- C A call of COSQF followed by a call of
- C COSQB will multiply the sequence X by 4*N.
- C Therefore COSQB is the unnormalized inverse
- C of COSQF.
- C
- C WSAVE contains initialization calculations which must not
- C be destroyed between calls of COSQF or COSQB.
- C
- C***REFERENCES P. N. Swarztrauber, Vectorizing the FFTs, in Parallel
- C Computations (G. Rodrigue, ed.), Academic Press,
- C 1982, pp. 51-83.
- C***ROUTINES CALLED COSQF1
- C***REVISION HISTORY (YYMMDD)
- C 790601 DATE WRITTEN
- C 830401 Modified to use SLATEC library source file format.
- C 860115 Modified by Ron Boisvert to adhere to Fortran 77 by
- C (a) changing dummy array size declarations (1) to (*),
- C (b) changing definition of variable SQRT2 by using
- C FORTRAN intrinsic function SQRT instead of a DATA
- C statement.
- C 861211 REVISION DATE from Version 3.2
- C 881128 Modified by Dick Valent to meet prologue standards.
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE COSQF
- DIMENSION X(*), WSAVE(*)
- C***FIRST EXECUTABLE STATEMENT COSQF
- SQRT2 = SQRT(2.)
- IF (N-2) 102,101,103
- 101 TSQX = SQRT2*X(2)
- X(2) = X(1)-TSQX
- X(1) = X(1)+TSQX
- 102 RETURN
- 103 CALL COSQF1 (N,X,WSAVE,WSAVE(N+1))
- RETURN
- END
- *DECK COSQF1
- SUBROUTINE COSQF1 (N, X, W, XH)
- C***BEGIN PROLOGUE COSQF1
- C***SUBSIDIARY
- C***PURPOSE Compute the forward cosine transform with odd wave numbers.
- C***LIBRARY SLATEC (FFTPACK)
- C***CATEGORY J1A3
- C***TYPE SINGLE PRECISION (COSQF1-S)
- C***KEYWORDS FFTPACK, FOURIER TRANSFORM
- C***AUTHOR Swarztrauber, P. N., (NCAR)
- C***DESCRIPTION
- C
- C Subroutine COSQF1 computes the fast Fourier transform of quarter
- C wave data. That is, COSQF1 computes the coefficients in a cosine
- C series representation with only odd wave numbers. The transform
- C is defined below at Output Parameter X
- C
- C***REFERENCES P. N. Swarztrauber, Vectorizing the FFTs, in Parallel
- C Computations (G. Rodrigue, ed.), Academic Press,
- C 1982, pp. 51-83.
- C***ROUTINES CALLED RFFTF
- C***REVISION HISTORY (YYMMDD)
- C 790601 DATE WRITTEN
- C 830401 Modified to use SLATEC library source file format.
- C 860115 Modified by Ron Boisvert to adhere to Fortran 77 by
- C changing dummy array size declarations (1) to (*).
- C 881128 Modified by Dick Valent to meet prologue standards.
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE COSQF1
- DIMENSION X(*), W(*), XH(*)
- C***FIRST EXECUTABLE STATEMENT COSQF1
- NS2 = (N+1)/2
- NP2 = N+2
- DO 101 K=2,NS2
- KC = NP2-K
- XH(K) = X(K)+X(KC)
- XH(KC) = X(K)-X(KC)
- 101 CONTINUE
- MODN = MOD(N,2)
- IF (MODN .EQ. 0) XH(NS2+1) = X(NS2+1)+X(NS2+1)
- DO 102 K=2,NS2
- KC = NP2-K
- X(K) = W(K-1)*XH(KC)+W(KC-1)*XH(K)
- X(KC) = W(K-1)*XH(K)-W(KC-1)*XH(KC)
- 102 CONTINUE
- IF (MODN .EQ. 0) X(NS2+1) = W(NS2)*XH(NS2+1)
- CALL RFFTF (N,X,XH)
- DO 103 I=3,N,2
- XIM1 = X(I-1)-X(I)
- X(I) = X(I-1)+X(I)
- X(I-1) = XIM1
- 103 CONTINUE
- RETURN
- END
- *DECK COSQI
- SUBROUTINE COSQI (N, WSAVE)
- C***BEGIN PROLOGUE COSQI
- C***PURPOSE Initialize a work array for COSQF and COSQB.
- C***LIBRARY SLATEC (FFTPACK)
- C***CATEGORY J1A3
- C***TYPE SINGLE PRECISION (COSQI-S)
- C***KEYWORDS COSINE FOURIER TRANSFORM, FFTPACK
- C***AUTHOR Swarztrauber, P. N., (NCAR)
- C***DESCRIPTION
- C
- C Subroutine COSQI initializes the work array WSAVE which is used in
- C both COSQF1 and COSQB1. The prime factorization of N together with
- C a tabulation of the trigonometric functions are computed and
- C stored in WSAVE.
- C
- C Input Parameter
- C
- C N the length of the array to be transformed. The method
- C is most efficient when N is a product of small primes.
- C
- C Output Parameter
- C
- C WSAVE a work array which must be dimensioned at least 3*N+15.
- C The same work array can be used for both COSQF1 and COSQB1
- C as long as N remains unchanged. Different WSAVE arrays
- C are required for different values of N. The contents of
- C WSAVE must not be changed between calls of COSQF1 or COSQB1.
- C
- C***REFERENCES P. N. Swarztrauber, Vectorizing the FFTs, in Parallel
- C Computations (G. Rodrigue, ed.), Academic Press,
- C 1982, pp. 51-83.
- C***ROUTINES CALLED RFFTI
- C***REVISION HISTORY (YYMMDD)
- C 790601 DATE WRITTEN
- C 830401 Modified to use SLATEC library source file format.
- C 860115 Modified by Ron Boisvert to adhere to Fortran 77 by
- C (a) changing dummy array size declarations (1) to (*),
- C (b) changing references to intrinsic function FLOAT
- C to REAL, and
- C (c) changing definition of variable PIH by using
- C FORTRAN intrinsic function ATAN instead of a DATA
- C statement.
- C 881128 Modified by Dick Valent to meet prologue standards.
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE COSQI
- DIMENSION WSAVE(*)
- C***FIRST EXECUTABLE STATEMENT COSQI
- PIH = 2.*ATAN(1.)
- DT = PIH/N
- FK = 0.
- DO 101 K=1,N
- FK = FK+1.
- WSAVE(K) = COS(FK*DT)
- 101 CONTINUE
- CALL RFFTI (N,WSAVE(N+1))
- RETURN
- END
- *DECK COST
- SUBROUTINE COST (N, X, WSAVE)
- C***BEGIN PROLOGUE COST
- C***PURPOSE Compute the cosine transform of a real, even sequence.
- C***LIBRARY SLATEC (FFTPACK)
- C***CATEGORY J1A3
- C***TYPE SINGLE PRECISION (COST-S)
- C***KEYWORDS COSINE FOURIER TRANSFORM, FFTPACK
- C***AUTHOR Swarztrauber, P. N., (NCAR)
- C***DESCRIPTION
- C
- C Subroutine COST computes the discrete Fourier cosine transform
- C of an even sequence X(I). The transform is defined below at output
- C parameter X.
- C
- C COST is the unnormalized inverse of itself since a call of COST
- C followed by another call of COST will multiply the input sequence
- C X by 2*(N-1). The transform is defined below at output parameter X.
- C
- C The array WSAVE which is used by subroutine COST must be
- C initialized by calling subroutine COSTI(N,WSAVE).
- C
- C Input Parameters
- C
- C N the length of the sequence X. N must be greater than 1.
- C The method is most efficient when N-1 is a product of
- C small primes.
- C
- C X an array which contains the sequence to be transformed
- C
- C WSAVE a work array which must be dimensioned at least 3*N+15
- C in the program that calls COST. The WSAVE array must be
- C initialized by calling subroutine COSTI(N,WSAVE), and a
- C different WSAVE array must be used for each different
- C value of N. This initialization does not have to be
- C repeated so long as N remains unchanged. Thus subsequent
- C transforms can be obtained faster than the first.
- C
- C Output Parameters
- C
- C X For I=1,...,N
- C
- C X(I) = X(1)+(-1)**(I-1)*X(N)
- C
- C + the sum from K=2 to K=N-1
- C
- C 2*X(K)*COS((K-1)*(I-1)*PI/(N-1))
- C
- C A call of COST followed by another call of
- C COST will multiply the sequence X by 2*(N-1).
- C Hence COST is the unnormalized inverse
- C of itself.
- C
- C WSAVE contains initialization calculations which must not be
- C destroyed between calls of COST.
- C
- C***REFERENCES P. N. Swarztrauber, Vectorizing the FFTs, in Parallel
- C Computations (G. Rodrigue, ed.), Academic Press,
- C 1982, pp. 51-83.
- C***ROUTINES CALLED RFFTF
- C***REVISION HISTORY (YYMMDD)
- C 790601 DATE WRITTEN
- C 830401 Modified to use SLATEC library source file format.
- C 860115 Modified by Ron Boisvert to adhere to Fortran 77 by
- C changing dummy array size declarations (1) to (*)
- C 861211 REVISION DATE from Version 3.2
- C 881128 Modified by Dick Valent to meet prologue standards.
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE COST
- DIMENSION X(*), WSAVE(*)
- C***FIRST EXECUTABLE STATEMENT COST
- NM1 = N-1
- NP1 = N+1
- NS2 = N/2
- IF (N-2) 106,101,102
- 101 X1H = X(1)+X(2)
- X(2) = X(1)-X(2)
- X(1) = X1H
- RETURN
- 102 IF (N .GT. 3) GO TO 103
- X1P3 = X(1)+X(3)
- TX2 = X(2)+X(2)
- X(2) = X(1)-X(3)
- X(1) = X1P3+TX2
- X(3) = X1P3-TX2
- RETURN
- 103 C1 = X(1)-X(N)
- X(1) = X(1)+X(N)
- DO 104 K=2,NS2
- KC = NP1-K
- T1 = X(K)+X(KC)
- T2 = X(K)-X(KC)
- C1 = C1+WSAVE(KC)*T2
- T2 = WSAVE(K)*T2
- X(K) = T1-T2
- X(KC) = T1+T2
- 104 CONTINUE
- MODN = MOD(N,2)
- IF (MODN .NE. 0) X(NS2+1) = X(NS2+1)+X(NS2+1)
- CALL RFFTF (NM1,X,WSAVE(N+1))
- XIM2 = X(2)
- X(2) = C1
- DO 105 I=4,N,2
- XI = X(I)
- X(I) = X(I-2)-X(I-1)
- X(I-1) = XIM2
- XIM2 = XI
- 105 CONTINUE
- IF (MODN .NE. 0) X(N) = XIM2
- 106 RETURN
- END
- *DECK COSTI
- SUBROUTINE COSTI (N, WSAVE)
- C***BEGIN PROLOGUE COSTI
- C***PURPOSE Initialize a work array for COST.
- C***LIBRARY SLATEC (FFTPACK)
- C***CATEGORY J1A3
- C***TYPE SINGLE PRECISION (COSTI-S)
- C***KEYWORDS COSINE FOURIER TRANSFORM, FFTPACK
- C***AUTHOR Swarztrauber, P. N., (NCAR)
- C***DESCRIPTION
- C
- C Subroutine COSTI initializes the array WSAVE which is used in
- C subroutine COST. The prime factorization of N together with
- C a tabulation of the trigonometric functions are computed and
- C stored in WSAVE.
- C
- C Input Parameter
- C
- C N the length of the sequence to be transformed. The method
- C is most efficient when N-1 is a product of small primes.
- C
- C Output Parameter
- C
- C WSAVE a work array which must be dimensioned at least 3*N+15.
- C Different WSAVE arrays are required for different values
- C of N. The contents of WSAVE must not be changed between
- C calls of COST.
- C
- C***REFERENCES P. N. Swarztrauber, Vectorizing the FFTs, in Parallel
- C Computations (G. Rodrigue, ed.), Academic Press,
- C 1982, pp. 51-83.
- C***ROUTINES CALLED RFFTI
- C***REVISION HISTORY (YYMMDD)
- C 790601 DATE WRITTEN
- C 830401 Modified to use SLATEC library source file format.
- C 860115 Modified by Ron Boisvert to adhere to Fortran 77 by
- C (a) changing dummy array size declarations (1) to (*),
- C (b) changing references to intrinsic function FLOAT
- C to REAL, and
- C (c) changing definition of variable PI by using
- C FORTRAN intrinsic function ATAN instead of a DATA
- C statement.
- C 881128 Modified by Dick Valent to meet prologue standards.
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE COSTI
- DIMENSION WSAVE(*)
- C***FIRST EXECUTABLE STATEMENT COSTI
- IF (N .LE. 3) RETURN
- PI = 4.*ATAN(1.)
- NM1 = N-1
- NP1 = N+1
- NS2 = N/2
- DT = PI/NM1
- FK = 0.
- DO 101 K=2,NS2
- KC = NP1-K
- FK = FK+1.
- WSAVE(K) = 2.*SIN(FK*DT)
- WSAVE(KC) = 2.*COS(FK*DT)
- 101 CONTINUE
- CALL RFFTI (NM1,WSAVE(N+1))
- RETURN
- END
- *DECK COT
- FUNCTION COT (X)
- C***BEGIN PROLOGUE COT
- C***PURPOSE Compute the cotangent.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C4A
- C***TYPE SINGLE PRECISION (COT-S, DCOT-D, CCOT-C)
- C***KEYWORDS COTANGENT, ELEMENTARY FUNCTIONS, FNLIB, TRIGONOMETRIC
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C COT(X) calculates the cotangent of the real argument X. X is in
- C units of radians.
- C
- C Series for COT on the interval 0. to 6.25000D-02
- C with weighted error 3.76E-17
- C log weighted error 16.42
- C significant figures required 15.51
- C decimal places required 16.88
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED CSEVL, INITS, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 770601 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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 920618 Removed space from variable names. (RWC, WRB)
- C***END PROLOGUE COT
- DIMENSION COTCS(8)
- LOGICAL FIRST
- SAVE COTCS, PI2REC, NTERMS, XMAX, XSML, XMIN, SQEPS, FIRST
- DATA COTCS( 1) / .2402591609 8295630E0 /
- DATA COTCS( 2) / -.0165330316 01500228E0 /
- DATA COTCS( 3) / -.0000429983 91931724E0 /
- DATA COTCS( 4) / -.0000001592 83223327E0 /
- DATA COTCS( 5) / -.0000000006 19109313E0 /
- DATA COTCS( 6) / -.0000000000 02430197E0 /
- DATA COTCS( 7) / -.0000000000 00009560E0 /
- DATA COTCS( 8) / -.0000000000 00000037E0 /
- DATA PI2REC / .01161977236 75813430 E0 /
- DATA FIRST /.TRUE./
- C***FIRST EXECUTABLE STATEMENT COT
- IF (FIRST) THEN
- NTERMS = INITS (COTCS, 8, 0.1*R1MACH(3))
- XMAX = 1.0/R1MACH(4)
- XSML = SQRT (3.0*R1MACH(3))
- XMIN = EXP ( MAX(LOG(R1MACH(1)), -LOG(R1MACH(2))) + 0.01)
- SQEPS = SQRT (R1MACH(4))
- ENDIF
- FIRST = .FALSE.
- C
- Y = ABS(X)
- IF (ABS(X) .LT. XMIN) CALL XERMSG ('SLATEC', 'COT',
- + 'ABS(X) IS ZERO OR SO SMALL COT OVERFLOWS', 2, 2)
- IF (Y .GT. XMAX) CALL XERMSG ('SLATEC', 'COT',
- + 'NO PRECISION BECAUSE ABS(X) IS TOO BIG', 3, 2)
- C
- C CAREFULLY COMPUTE Y * (2/PI) = (AINT(Y) + REM(Y)) * (.625 + PI2REC)
- C = AINT(.625*Y) + REM(.625*Y) + Y*PI2REC = AINT(.625*Y) + Z
- C = AINT(.625*Y) + AINT(Z) + REM(Z)
- C
- AINTY = AINT (Y)
- YREM = Y - AINTY
- PRODBG = 0.625*AINTY
- AINTY = AINT (PRODBG)
- Y = (PRODBG-AINTY) + 0.625*YREM + Y*PI2REC
- AINTY2 = AINT (Y)
- AINTY = AINTY + AINTY2
- Y = Y - AINTY2
- C
- IFN = MOD (AINTY, 2.)
- IF (IFN.EQ.1) Y = 1.0 - Y
- C
- IF (ABS(X) .GT. 0.5 .AND. Y .LT. ABS(X)*SQEPS) CALL XERMSG
- + ('SLATEC', 'COT',
- + 'ANSWER LT HALF PRECISION, ABS(X) TOO BIG OR X NEAR N*PI ' //
- + '(N.NE.0)' , 1, 1)
- C
- IF (Y.GT.0.25) GO TO 20
- COT = 1.0/X
- IF (Y.GT.XSML) COT = (0.5 + CSEVL (32.0*Y*Y-1., COTCS, NTERMS)) /Y
- GO TO 40
- C
- 20 IF (Y.GT.0.5) GO TO 30
- COT = (0.5 + CSEVL (8.0*Y*Y-1., COTCS, NTERMS)) / (0.5*Y)
- COT = (COT**2 - 1.0) * 0.5 / COT
- GO TO 40
- C
- 30 COT = (0.5 + CSEVL (2.0*Y*Y-1., COTCS, NTERMS)) / (0.25*Y)
- COT = (COT**2 - 1.0) * 0.5 / COT
- COT = (COT**2 - 1.0) * 0.5 / COT
- C
- 40 IF (X.NE.0.) COT = SIGN (COT, X)
- IF (IFN.EQ.1) COT = -COT
- C
- RETURN
- END
- *DECK CPADD
- SUBROUTINE CPADD (N, IERROR, A, C, CBP, BP, BH)
- C***BEGIN PROLOGUE CPADD
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to CBLKTR
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (CPADD-S)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C CPADD computes the eigenvalues of the periodic tridiagonal matrix
- C with coefficients AN,BN,CN.
- C
- C N is the order of the BH and BP polynomials.
- C BP contains the eigenvalues on output.
- C CBP is the same as BP except type complex.
- C BH is used to temporarily store the roots of the B HAT polynomial
- C which enters through BP.
- C
- C***SEE ALSO CBLKTR
- C***ROUTINES CALLED BCRH, PGSF, PPGSF, PPPSF
- C***COMMON BLOCKS CCBLK
- C***REVISION HISTORY (YYMMDD)
- C 801001 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900402 Added TYPE section. (WRB)
- C***END PROLOGUE CPADD
- C
- COMPLEX CX ,FSG ,HSG ,
- 1 DD ,F ,FP ,FPP ,
- 2 CDIS ,R1 ,R2 ,R3 ,
- 3 CBP
- DIMENSION A(*) ,C(*) ,BP(*) ,BH(*) ,
- 1 CBP(*)
- COMMON /CCBLK/ NPP ,K ,EPS ,CNV ,
- 1 NM ,NCMPLX ,IK
- EXTERNAL PGSF ,PPPSF ,PPGSF
- C***FIRST EXECUTABLE STATEMENT CPADD
- SCNV = SQRT(CNV)
- IZ = N
- IF (BP(N)-BP(1)) 101,142,103
- 101 DO 102 J=1,N
- NT = N-J
- BH(J) = BP(NT+1)
- 102 CONTINUE
- GO TO 105
- 103 DO 104 J=1,N
- BH(J) = BP(J)
- 104 CONTINUE
- 105 NCMPLX = 0
- MODIZ = MOD(IZ,2)
- IS = 1
- IF (MODIZ) 106,107,106
- 106 IF (A(1)) 110,142,107
- 107 XL = BH(1)
- DB = BH(3)-BH(1)
- 108 XL = XL-DB
- IF (PGSF(XL,IZ,C,A,BH)) 108,108,109
- 109 SGN = -1.
- CBP(1) = CMPLX(BCRH(XL,BH(1),IZ,C,A,BH,PGSF,SGN),0.)
- IS = 2
- 110 IF = IZ-1
- IF (MODIZ) 111,112,111
- 111 IF (A(1)) 112,142,115
- 112 XR = BH(IZ)
- DB = BH(IZ)-BH(IZ-2)
- 113 XR = XR+DB
- IF (PGSF(XR,IZ,C,A,BH)) 113,114,114
- 114 SGN = 1.
- CBP(IZ) = CMPLX(BCRH(BH(IZ),XR,IZ,C,A,BH,PGSF,SGN),0.)
- IF = IZ-2
- 115 DO 136 IG=IS,IF,2
- XL = BH(IG)
- XR = BH(IG+1)
- SGN = -1.
- XM = BCRH(XL,XR,IZ,C,A,BH,PPPSF,SGN)
- PSG = PGSF(XM,IZ,C,A,BH)
- IF (ABS(PSG)-EPS) 118,118,116
- 116 IF (PSG*PPGSF(XM,IZ,C,A,BH)) 117,118,119
- C
- C CASE OF A REAL ZERO
- C
- 117 SGN = 1.
- CBP(IG) = CMPLX(BCRH(BH(IG),XM,IZ,C,A,BH,PGSF,SGN),0.)
- SGN = -1.
- CBP(IG+1) = CMPLX(BCRH(XM,BH(IG+1),IZ,C,A,BH,PGSF,SGN),0.)
- GO TO 136
- C
- C CASE OF A MULTIPLE ZERO
- C
- 118 CBP(IG) = CMPLX(XM,0.)
- CBP(IG+1) = CMPLX(XM,0.)
- GO TO 136
- C
- C CASE OF A COMPLEX ZERO
- C
- 119 IT = 0
- ICV = 0
- CX = CMPLX(XM,0.)
- 120 FSG = (1.,0.)
- HSG = (1.,0.)
- FP = (0.,0.)
- FPP = (0.,0.)
- DO 121 J=1,IZ
- DD = 1./(CX-BH(J))
- FSG = FSG*A(J)*DD
- HSG = HSG*C(J)*DD
- FP = FP+DD
- FPP = FPP-DD*DD
- 121 CONTINUE
- IF (MODIZ) 123,122,123
- 122 F = (1.,0.)-FSG-HSG
- GO TO 124
- 123 F = (1.,0.)+FSG+HSG
- 124 I3 = 0
- IF (ABS(FP)) 126,126,125
- 125 I3 = 1
- R3 = -F/FP
- 126 IF (ABS(FPP)) 132,132,127
- 127 CDIS = SQRT(FP**2-2.*F*FPP)
- R1 = CDIS-FP
- R2 = -FP-CDIS
- IF (ABS(R1)-ABS(R2)) 129,129,128
- 128 R1 = R1/FPP
- GO TO 130
- 129 R1 = R2/FPP
- 130 R2 = 2.*F/FPP/R1
- IF (ABS(R2) .LT. ABS(R1)) R1 = R2
- IF (I3) 133,133,131
- 131 IF (ABS(R3) .LT. ABS(R1)) R1 = R3
- GO TO 133
- 132 R1 = R3
- 133 CX = CX+R1
- IT = IT+1
- IF (IT .GT. 50) GO TO 142
- IF (ABS(R1) .GT. SCNV) GO TO 120
- IF (ICV) 134,134,135
- 134 ICV = 1
- GO TO 120
- 135 CBP(IG) = CX
- CBP(IG+1) = CONJG(CX)
- 136 CONTINUE
- IF (ABS(CBP(N))-ABS(CBP(1))) 137,142,139
- 137 NHALF = N/2
- DO 138 J=1,NHALF
- NT = N-J
- CX = CBP(J)
- CBP(J) = CBP(NT+1)
- CBP(NT+1) = CX
- 138 CONTINUE
- 139 NCMPLX = 1
- DO 140 J=2,IZ
- IF (AIMAG(CBP(J))) 143,140,143
- 140 CONTINUE
- NCMPLX = 0
- DO 141 J=2,IZ
- BP(J) = REAL(CBP(J))
- 141 CONTINUE
- GO TO 143
- 142 IERROR = 4
- 143 CONTINUE
- RETURN
- END
- *DECK CPBCO
- SUBROUTINE CPBCO (ABD, LDA, N, M, RCOND, Z, INFO)
- C***BEGIN PROLOGUE CPBCO
- C***PURPOSE Factor a complex Hermitian positive definite matrix stored
- C in band form and estimate the condition number of the
- C matrix.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D2D2
- C***TYPE COMPLEX (SPBCO-S, DPBCO-D, CPBCO-C)
- C***KEYWORDS BANDED, CONDITION NUMBER, LINEAR ALGEBRA, LINPACK,
- C MATRIX FACTORIZATION, POSITIVE DEFINITE
- C***AUTHOR Moler, C. B., (U. of New Mexico)
- C***DESCRIPTION
- C
- C CPBCO factors a complex Hermitian positive definite matrix
- C stored in band form and estimates the condition of the matrix.
- C
- C If RCOND is not needed, CPBFA is slightly faster.
- C To solve A*X = B , follow CPBCO by CPBSL.
- C To compute INVERSE(A)*C , follow CPBCO by CPBSL.
- C To compute DETERMINANT(A) , follow CPBCO by CPBDI.
- C
- C On Entry
- C
- C ABD COMPLEX(LDA, N)
- C the matrix to be factored. The columns of the upper
- C triangle are stored in the columns of ABD and the
- C diagonals of the upper triangle are stored in the
- C rows of ABD . See the comments below for details.
- C
- C LDA INTEGER
- C the leading dimension of the array ABD .
- C LDA must be .GE. M + 1 .
- C
- C N INTEGER
- C the order of the matrix A .
- C
- C M INTEGER
- C the number of diagonals above the main diagonal.
- C 0 .LE. M .LT. N .
- C
- C On Return
- C
- C ABD an upper triangular matrix R , stored in band
- C form, so that A = CTRANS(R)*R .
- C If INFO .NE. 0 , the factorization is not complete.
- C
- C RCOND REAL
- C an estimate of the reciprocal condition of A .
- C For the system A*X = B , relative perturbations
- C in A and B of size EPSILON may cause
- C relative perturbations in X of size EPSILON/RCOND .
- C If RCOND is so small that the logical expression
- C 1.0 + RCOND .EQ. 1.0
- C is true, then A may be singular to working
- C precision. In particular, RCOND is zero if
- C exact singularity is detected or the estimate
- C underflows. If INFO .NE. 0 , RCOND is unchanged.
- C
- C Z COMPLEX(N)
- C a work vector whose contents are usually unimportant.
- C If A is singular to working precision, then Z is
- C an approximate null vector in the sense that
- C NORM(A*Z) = RCOND*NORM(A)*NORM(Z) .
- C If INFO .NE. 0 , Z is unchanged.
- C
- C INFO INTEGER
- C = 0 for normal return.
- C = K signals an error condition. The leading minor
- C of order K is not positive definite.
- C
- C Band Storage
- C
- C If A is a Hermitian positive definite band matrix,
- C the following program segment will set up the input.
- C
- C M = (band width above diagonal)
- C DO 20 J = 1, N
- C I1 = MAX(1, J-M)
- C DO 10 I = I1, J
- C K = I-J+M+1
- C ABD(K,J) = A(I,J)
- C 10 CONTINUE
- C 20 CONTINUE
- C
- C This uses M + 1 rows of A , except for the M by M
- C upper left triangle, which is ignored.
- C
- C Example: If the original matrix is
- C
- C 11 12 13 0 0 0
- C 12 22 23 24 0 0
- C 13 23 33 34 35 0
- C 0 24 34 44 45 46
- C 0 0 35 45 55 56
- C 0 0 0 46 56 66
- C
- C then N = 6 , M = 2 and ABD should contain
- C
- C * * 13 24 35 46
- C * 12 23 34 45 56
- C 11 22 33 44 55 66
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CAXPY, CDOTC, CPBFA, CSSCAL, SCASUM
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CPBCO
- INTEGER LDA,N,M,INFO
- COMPLEX ABD(LDA,*),Z(*)
- REAL RCOND
- C
- COMPLEX CDOTC,EK,T,WK,WKM
- REAL ANORM,S,SCASUM,SM,YNORM
- INTEGER I,J,J2,K,KB,KP1,L,LA,LB,LM,MU
- COMPLEX ZDUM,ZDUM2,CSIGN1
- REAL CABS1
- CABS1(ZDUM) = ABS(REAL(ZDUM)) + ABS(AIMAG(ZDUM))
- CSIGN1(ZDUM,ZDUM2) = CABS1(ZDUM)*(ZDUM2/CABS1(ZDUM2))
- C
- C FIND NORM OF A
- C
- C***FIRST EXECUTABLE STATEMENT CPBCO
- DO 30 J = 1, N
- L = MIN(J,M+1)
- MU = MAX(M+2-J,1)
- Z(J) = CMPLX(SCASUM(L,ABD(MU,J),1),0.0E0)
- K = J - L
- IF (M .LT. MU) GO TO 20
- DO 10 I = MU, M
- K = K + 1
- Z(K) = CMPLX(REAL(Z(K))+CABS1(ABD(I,J)),0.0E0)
- 10 CONTINUE
- 20 CONTINUE
- 30 CONTINUE
- ANORM = 0.0E0
- DO 40 J = 1, N
- ANORM = MAX(ANORM,REAL(Z(J)))
- 40 CONTINUE
- C
- C FACTOR
- C
- CALL CPBFA(ABD,LDA,N,M,INFO)
- IF (INFO .NE. 0) GO TO 180
- C
- C RCOND = 1/(NORM(A)*(ESTIMATE OF NORM(INVERSE(A)))) .
- C ESTIMATE = NORM(Z)/NORM(Y) WHERE A*Z = Y AND A*Y = E .
- C THE COMPONENTS OF E ARE CHOSEN TO CAUSE MAXIMUM LOCAL
- C GROWTH IN THE ELEMENTS OF W WHERE CTRANS(R)*W = E .
- C THE VECTORS ARE FREQUENTLY RESCALED TO AVOID OVERFLOW.
- C
- C SOLVE CTRANS(R)*W = E
- C
- EK = (1.0E0,0.0E0)
- DO 50 J = 1, N
- Z(J) = (0.0E0,0.0E0)
- 50 CONTINUE
- DO 110 K = 1, N
- IF (CABS1(Z(K)) .NE. 0.0E0) EK = CSIGN1(EK,-Z(K))
- IF (CABS1(EK-Z(K)) .LE. REAL(ABD(M+1,K))) GO TO 60
- S = REAL(ABD(M+1,K))/CABS1(EK-Z(K))
- CALL CSSCAL(N,S,Z,1)
- EK = CMPLX(S,0.0E0)*EK
- 60 CONTINUE
- WK = EK - Z(K)
- WKM = -EK - Z(K)
- S = CABS1(WK)
- SM = CABS1(WKM)
- WK = WK/ABD(M+1,K)
- WKM = WKM/ABD(M+1,K)
- KP1 = K + 1
- J2 = MIN(K+M,N)
- I = M + 1
- IF (KP1 .GT. J2) GO TO 100
- DO 70 J = KP1, J2
- I = I - 1
- SM = SM + CABS1(Z(J)+WKM*CONJG(ABD(I,J)))
- Z(J) = Z(J) + WK*CONJG(ABD(I,J))
- S = S + CABS1(Z(J))
- 70 CONTINUE
- IF (S .GE. SM) GO TO 90
- T = WKM - WK
- WK = WKM
- I = M + 1
- DO 80 J = KP1, J2
- I = I - 1
- Z(J) = Z(J) + T*CONJG(ABD(I,J))
- 80 CONTINUE
- 90 CONTINUE
- 100 CONTINUE
- Z(K) = WK
- 110 CONTINUE
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- C
- C SOLVE R*Y = W
- C
- DO 130 KB = 1, N
- K = N + 1 - KB
- IF (CABS1(Z(K)) .LE. REAL(ABD(M+1,K))) GO TO 120
- S = REAL(ABD(M+1,K))/CABS1(Z(K))
- CALL CSSCAL(N,S,Z,1)
- 120 CONTINUE
- Z(K) = Z(K)/ABD(M+1,K)
- LM = MIN(K-1,M)
- LA = M + 1 - LM
- LB = K - LM
- T = -Z(K)
- CALL CAXPY(LM,T,ABD(LA,K),1,Z(LB),1)
- 130 CONTINUE
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- C
- YNORM = 1.0E0
- C
- C SOLVE CTRANS(R)*V = Y
- C
- DO 150 K = 1, N
- LM = MIN(K-1,M)
- LA = M + 1 - LM
- LB = K - LM
- Z(K) = Z(K) - CDOTC(LM,ABD(LA,K),1,Z(LB),1)
- IF (CABS1(Z(K)) .LE. REAL(ABD(M+1,K))) GO TO 140
- S = REAL(ABD(M+1,K))/CABS1(Z(K))
- CALL CSSCAL(N,S,Z,1)
- YNORM = S*YNORM
- 140 CONTINUE
- Z(K) = Z(K)/ABD(M+1,K)
- 150 CONTINUE
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- YNORM = S*YNORM
- C
- C SOLVE R*Z = W
- C
- DO 170 KB = 1, N
- K = N + 1 - KB
- IF (CABS1(Z(K)) .LE. REAL(ABD(M+1,K))) GO TO 160
- S = REAL(ABD(M+1,K))/CABS1(Z(K))
- CALL CSSCAL(N,S,Z,1)
- YNORM = S*YNORM
- 160 CONTINUE
- Z(K) = Z(K)/ABD(M+1,K)
- LM = MIN(K-1,M)
- LA = M + 1 - LM
- LB = K - LM
- T = -Z(K)
- CALL CAXPY(LM,T,ABD(LA,K),1,Z(LB),1)
- 170 CONTINUE
- C MAKE ZNORM = 1.0
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- YNORM = S*YNORM
- C
- IF (ANORM .NE. 0.0E0) RCOND = YNORM/ANORM
- IF (ANORM .EQ. 0.0E0) RCOND = 0.0E0
- 180 CONTINUE
- RETURN
- END
- *DECK CPBDI
- SUBROUTINE CPBDI (ABD, LDA, N, M, DET)
- C***BEGIN PROLOGUE CPBDI
- C***PURPOSE Compute the determinant of a complex Hermitian positive
- C definite band matrix using the factors computed by CPBCO or
- C CPBFA.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D3D2
- C***TYPE COMPLEX (SPBDI-S, DPBDI-D, CPBDI-C)
- C***KEYWORDS BANDED, DETERMINANT, INVERSE, LINEAR ALGEBRA, LINPACK,
- C MATRIX, POSITIVE DEFINITE
- C***AUTHOR Moler, C. B., (U. of New Mexico)
- C***DESCRIPTION
- C
- C CPBDI computes the determinant
- C of a complex Hermitian positive definite band matrix
- C using the factors computed by CPBCO or CPBFA.
- C If the inverse is needed, use CPBSL N times.
- C
- C On Entry
- C
- C ABD COMPLEX(LDA, N)
- C the output from CPBCO or CPBFA.
- C
- C LDA INTEGER
- C the leading dimension of the array ABD .
- C
- C N INTEGER
- C the order of the matrix A .
- C
- C M INTEGER
- C the number of diagonals above the main diagonal.
- C
- C On Return
- C
- C DET REAL(2)
- C determinant of original matrix in the form
- C determinant = DET(1) * 10.0**DET(2)
- C with 1.0 .LE. DET(1) .LT. 10.0
- C or DET(1) .EQ. 0.0 .
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CPBDI
- INTEGER LDA,N,M
- COMPLEX ABD(LDA,*)
- REAL DET(2)
- C
- REAL S
- INTEGER I
- C***FIRST EXECUTABLE STATEMENT CPBDI
- C
- C COMPUTE DETERMINANT
- C
- DET(1) = 1.0E0
- DET(2) = 0.0E0
- S = 10.0E0
- DO 50 I = 1, N
- DET(1) = REAL(ABD(M+1,I))**2*DET(1)
- IF (DET(1) .EQ. 0.0E0) GO TO 60
- 10 IF (DET(1) .GE. 1.0E0) GO TO 20
- DET(1) = S*DET(1)
- DET(2) = DET(2) - 1.0E0
- GO TO 10
- 20 CONTINUE
- 30 IF (DET(1) .LT. S) GO TO 40
- DET(1) = DET(1)/S
- DET(2) = DET(2) + 1.0E0
- GO TO 30
- 40 CONTINUE
- 50 CONTINUE
- 60 CONTINUE
- RETURN
- END
- *DECK CPBFA
- SUBROUTINE CPBFA (ABD, LDA, N, M, INFO)
- C***BEGIN PROLOGUE CPBFA
- C***PURPOSE Factor a complex Hermitian positive definite matrix stored
- C in band form.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D2D2
- C***TYPE COMPLEX (SPBFA-S, DPBFA-D, CPBFA-C)
- C***KEYWORDS BANDED, LINEAR ALGEBRA, LINPACK, MATRIX FACTORIZATION,
- C POSITIVE DEFINITE
- C***AUTHOR Moler, C. B., (U. of New Mexico)
- C***DESCRIPTION
- C
- C CPBFA factors a complex Hermitian positive definite matrix
- C stored in band form.
- C
- C CPBFA is usually called by CPBCO, but it can be called
- C directly with a saving in time if RCOND is not needed.
- C
- C On Entry
- C
- C ABD COMPLEX(LDA, N)
- C the matrix to be factored. The columns of the upper
- C triangle are stored in the columns of ABD and the
- C diagonals of the upper triangle are stored in the
- C rows of ABD . See the comments below for details.
- C
- C LDA INTEGER
- C the leading dimension of the array ABD .
- C LDA must be .GE. M + 1 .
- C
- C N INTEGER
- C the order of the matrix A .
- C
- C M INTEGER
- C the number of diagonals above the main diagonal.
- C 0 .LE. M .LT. N .
- C
- C On Return
- C
- C ABD an upper triangular matrix R , stored in band
- C form, so that A = CTRANS(R)*R .
- C
- C INFO INTEGER
- C = 0 for normal return.
- C = K if the leading minor of order K is not
- C positive definite.
- C
- C Band Storage
- C
- C If A is a Hermitian positive definite band matrix,
- C the following program segment will set up the input.
- C
- C M = (band width above diagonal)
- C DO 20 J = 1, N
- C I1 = MAX(1, J-M)
- C DO 10 I = I1, J
- C K = I-J+M+1
- C ABD(K,J) = A(I,J)
- C 10 CONTINUE
- C 20 CONTINUE
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CDOTC
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CPBFA
- INTEGER LDA,N,M,INFO
- COMPLEX ABD(LDA,*)
- C
- COMPLEX CDOTC,T
- REAL S
- INTEGER IK,J,JK,K,MU
- C***FIRST EXECUTABLE STATEMENT CPBFA
- DO 30 J = 1, N
- INFO = J
- S = 0.0E0
- IK = M + 1
- JK = MAX(J-M,1)
- MU = MAX(M+2-J,1)
- IF (M .LT. MU) GO TO 20
- DO 10 K = MU, M
- T = ABD(K,J) - CDOTC(K-MU,ABD(IK,JK),1,ABD(MU,J),1)
- T = T/ABD(M+1,JK)
- ABD(K,J) = T
- S = S + REAL(T*CONJG(T))
- IK = IK - 1
- JK = JK + 1
- 10 CONTINUE
- 20 CONTINUE
- S = REAL(ABD(M+1,J)) - S
- IF (S .LE. 0.0E0 .OR. AIMAG(ABD(M+1,J)) .NE. 0.0E0)
- 1 GO TO 40
- ABD(M+1,J) = CMPLX(SQRT(S),0.0E0)
- 30 CONTINUE
- INFO = 0
- 40 CONTINUE
- RETURN
- END
- *DECK CPBSL
- SUBROUTINE CPBSL (ABD, LDA, N, M, B)
- C***BEGIN PROLOGUE CPBSL
- C***PURPOSE Solve the complex Hermitian positive definite band system
- C using the factors computed by CPBCO or CPBFA.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D2D2
- C***TYPE COMPLEX (SPBSL-S, DPBSL-D, CPBSL-C)
- C***KEYWORDS BANDED, LINEAR ALGEBRA, LINPACK, MATRIX,
- C POSITIVE DEFINITE, SOLVE
- C***AUTHOR Moler, C. B., (U. of New Mexico)
- C***DESCRIPTION
- C
- C CPBSL solves the complex Hermitian positive definite band
- C system A*X = B
- C using the factors computed by CPBCO or CPBFA.
- C
- C On Entry
- C
- C ABD COMPLEX(LDA, N)
- C the output from CPBCO or CPBFA.
- C
- C LDA INTEGER
- C the leading dimension of the array ABD .
- C
- C N INTEGER
- C the order of the matrix A .
- C
- C M INTEGER
- C the number of diagonals above the main diagonal.
- C
- C B COMPLEX(N)
- C the right hand side vector.
- C
- C On Return
- C
- C B the solution vector X .
- C
- C Error Condition
- C
- C A division by zero will occur if the input factor contains
- C a zero on the diagonal. Technically this indicates
- C singularity but it is usually caused by improper subroutine
- C arguments. It will not occur if the subroutines are called
- C correctly and INFO .EQ. 0 .
- C
- C To compute INVERSE(A) * C where C is a matrix
- C with P columns
- C CALL CPBCO(ABD,LDA,N,RCOND,Z,INFO)
- C IF (RCOND is too small .OR. INFO .NE. 0) GO TO ...
- C DO 10 J = 1, P
- C CALL CPBSL(ABD,LDA,N,C(1,J))
- C 10 CONTINUE
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CAXPY, CDOTC
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CPBSL
- INTEGER LDA,N,M
- COMPLEX ABD(LDA,*),B(*)
- C
- COMPLEX CDOTC,T
- INTEGER K,KB,LA,LB,LM
- C
- C SOLVE CTRANS(R)*Y = B
- C
- C***FIRST EXECUTABLE STATEMENT CPBSL
- DO 10 K = 1, N
- LM = MIN(K-1,M)
- LA = M + 1 - LM
- LB = K - LM
- T = CDOTC(LM,ABD(LA,K),1,B(LB),1)
- B(K) = (B(K) - T)/ABD(M+1,K)
- 10 CONTINUE
- C
- C SOLVE R*X = Y
- C
- DO 20 KB = 1, N
- K = N + 1 - KB
- LM = MIN(K-1,M)
- LA = M + 1 - LM
- LB = K - LM
- B(K) = B(K)/ABD(M+1,K)
- T = -B(K)
- CALL CAXPY(LM,T,ABD(LA,K),1,B(LB),1)
- 20 CONTINUE
- RETURN
- END
- *DECK CPEVL
- SUBROUTINE CPEVL (N, M, A, Z, C, B, KBD)
- C***BEGIN PROLOGUE CPEVL
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to CPZERO
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (CPEVL-S)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C Evaluate a complex polynomial and its derivatives.
- C Optionally compute error bounds for these values.
- C
- C INPUT...
- C N = Degree of the polynomial
- C M = Number of derivatives to be calculated,
- C M=0 evaluates only the function
- C M=1 evaluates the function and first derivative, etc.
- C if M .GT. N+1 function and all N derivatives will be
- C calculated.
- C A = Complex vector containing the N+1 coefficients of polynomial
- C A(I)= coefficient of Z**(N+1-I)
- C Z = Complex point at which the evaluation is to take place.
- C C = Array of 2(M+1) words into which values are placed.
- C B = Array of 2(M+1) words only needed if bounds are to be
- C calculated. It is not used otherwise.
- C KBD = A logical variable, e.g. .TRUE. or .FALSE. which is
- C to be set .TRUE. if bounds are to be computed.
- C
- C OUTPUT...
- C C = C(I+1) contains the complex value of the I-th
- C derivative at Z, I=0,...,M
- C B = B(I) contains the bounds on the real and imaginary parts
- C of C(I) if they were requested.
- C
- C***SEE ALSO CPZERO
- C***ROUTINES CALLED I1MACH
- C***REVISION HISTORY (YYMMDD)
- C 810223 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900402 Added TYPE section. (WRB)
- C***END PROLOGUE CPEVL
- C
- COMPLEX A(*),C(*),Z,CI,CIM1,B(*),BI,BIM1,T,ZA,Q
- LOGICAL KBD
- SAVE D1
- DATA D1 /0.0/
- ZA(Q)=CMPLX(ABS(REAL(Q)),ABS(AIMAG(Q)))
- C***FIRST EXECUTABLE STATEMENT CPEVL
- IF (D1 .EQ. 0.0) D1 = REAL(I1MACH(10))**(1-I1MACH(11))
- NP1=N+1
- DO 1 J=1,NP1
- CI=0.0
- CIM1=A(J)
- BI=0.0
- BIM1=0.0
- MINI=MIN(M+1,N+2-J)
- DO 1 I=1,MINI
- IF(J .NE. 1) CI=C(I)
- IF(I .NE. 1) CIM1=C(I-1)
- C(I)=CIM1+Z*CI
- IF(.NOT. KBD) GO TO 1
- IF(J .NE. 1) BI=B(I)
- IF(I .NE. 1) BIM1=B(I-1)
- T=BI+(3.*D1+4.*D1*D1)*ZA(CI)
- R=REAL(ZA(Z)*CMPLX(REAL(T),-AIMAG(T)))
- S=AIMAG(ZA(Z)*T)
- B(I)=(1.+8.*D1)*(BIM1+D1*ZA(CIM1)+CMPLX(R,S))
- IF(J .EQ. 1) B(I)=0.0
- 1 CONTINUE
- RETURN
- END
- *DECK CPEVLR
- SUBROUTINE CPEVLR (N, M, A, X, C)
- C***BEGIN PROLOGUE CPEVLR
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to CPZERO
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (CPEVLR-S)
- C***AUTHOR (UNKNOWN)
- C***SEE ALSO CPZERO
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 810223 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900402 Added TYPE section. (WRB)
- C***END PROLOGUE CPEVLR
- REAL A(*),C(*)
- C***FIRST EXECUTABLE STATEMENT CPEVLR
- NP1=N+1
- DO 1 J=1,NP1
- CI=0.0
- CIM1=A(J)
- MINI=MIN(M+1,N+2-J)
- DO 1 I=1,MINI
- IF(J .NE. 1) CI=C(I)
- IF(I .NE. 1) CIM1=C(I-1)
- C(I)=CIM1+X*CI
- 1 CONTINUE
- RETURN
- END
- *DECK CPOCO
- SUBROUTINE CPOCO (A, LDA, N, RCOND, Z, INFO)
- C***BEGIN PROLOGUE CPOCO
- C***PURPOSE Factor a complex Hermitian positive definite matrix
- C and estimate the condition number of the matrix.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D2D1B
- C***TYPE COMPLEX (SPOCO-S, DPOCO-D, CPOCO-C)
- C***KEYWORDS CONDITION NUMBER, LINEAR ALGEBRA, LINPACK,
- C MATRIX FACTORIZATION, POSITIVE DEFINITE
- C***AUTHOR Moler, C. B., (U. of New Mexico)
- C***DESCRIPTION
- C
- C CPOCO factors a complex Hermitian positive definite matrix
- C and estimates the condition of the matrix.
- C
- C If RCOND is not needed, CPOFA is slightly faster.
- C To solve A*X = B , follow CPOCO by CPOSL.
- C To compute INVERSE(A)*C , follow CPOCO by CPOSL.
- C To compute DETERMINANT(A) , follow CPOCO by CPODI.
- C To compute INVERSE(A) , follow CPOCO by CPODI.
- C
- C On Entry
- C
- C A COMPLEX(LDA, N)
- C the Hermitian matrix to be factored. Only the
- C diagonal and upper triangle are used.
- C
- C LDA INTEGER
- C the leading dimension of the array A .
- C
- C N INTEGER
- C the order of the matrix A .
- C
- C On Return
- C
- C A an upper triangular matrix R so that A =
- C CTRANS(R)*R where CTRANS(R) is the conjugate
- C transpose. The strict lower triangle is unaltered.
- C If INFO .NE. 0 , the factorization is not complete.
- C
- C RCOND REAL
- C an estimate of the reciprocal condition of A .
- C For the system A*X = B , relative perturbations
- C in A and B of size EPSILON may cause
- C relative perturbations in X of size EPSILON/RCOND .
- C If RCOND is so small that the logical expression
- C 1.0 + RCOND .EQ. 1.0
- C is true, then A may be singular to working
- C precision. In particular, RCOND is zero if
- C exact singularity is detected or the estimate
- C underflows. If INFO .NE. 0 , RCOND is unchanged.
- C
- C Z COMPLEX(N)
- C a work vector whose contents are usually unimportant.
- C If A is close to a singular matrix, then Z is
- C an approximate null vector in the sense that
- C NORM(A*Z) = RCOND*NORM(A)*NORM(Z) .
- C If INFO .NE. 0 , Z is unchanged.
- C
- C INFO INTEGER
- C = 0 for normal return.
- C = K signals an error condition. The leading minor
- C of order K is not positive definite.
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CAXPY, CDOTC, CPOFA, CSSCAL, SCASUM
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CPOCO
- INTEGER LDA,N,INFO
- COMPLEX A(LDA,*),Z(*)
- REAL RCOND
- C
- COMPLEX CDOTC,EK,T,WK,WKM
- REAL ANORM,S,SCASUM,SM,YNORM
- INTEGER I,J,JM1,K,KB,KP1
- COMPLEX ZDUM,ZDUM2,CSIGN1
- REAL CABS1
- CABS1(ZDUM) = ABS(REAL(ZDUM)) + ABS(AIMAG(ZDUM))
- CSIGN1(ZDUM,ZDUM2) = CABS1(ZDUM)*(ZDUM2/CABS1(ZDUM2))
- C
- C FIND NORM OF A USING ONLY UPPER HALF
- C
- C***FIRST EXECUTABLE STATEMENT CPOCO
- DO 30 J = 1, N
- Z(J) = CMPLX(SCASUM(J,A(1,J),1),0.0E0)
- JM1 = J - 1
- IF (JM1 .LT. 1) GO TO 20
- DO 10 I = 1, JM1
- Z(I) = CMPLX(REAL(Z(I))+CABS1(A(I,J)),0.0E0)
- 10 CONTINUE
- 20 CONTINUE
- 30 CONTINUE
- ANORM = 0.0E0
- DO 40 J = 1, N
- ANORM = MAX(ANORM,REAL(Z(J)))
- 40 CONTINUE
- C
- C FACTOR
- C
- CALL CPOFA(A,LDA,N,INFO)
- IF (INFO .NE. 0) GO TO 180
- C
- C RCOND = 1/(NORM(A)*(ESTIMATE OF NORM(INVERSE(A)))) .
- C ESTIMATE = NORM(Z)/NORM(Y) WHERE A*Z = Y AND A*Y = E .
- C THE COMPONENTS OF E ARE CHOSEN TO CAUSE MAXIMUM LOCAL
- C GROWTH IN THE ELEMENTS OF W WHERE CTRANS(R)*W = E .
- C THE VECTORS ARE FREQUENTLY RESCALED TO AVOID OVERFLOW.
- C
- C SOLVE CTRANS(R)*W = E
- C
- EK = (1.0E0,0.0E0)
- DO 50 J = 1, N
- Z(J) = (0.0E0,0.0E0)
- 50 CONTINUE
- DO 110 K = 1, N
- IF (CABS1(Z(K)) .NE. 0.0E0) EK = CSIGN1(EK,-Z(K))
- IF (CABS1(EK-Z(K)) .LE. REAL(A(K,K))) GO TO 60
- S = REAL(A(K,K))/CABS1(EK-Z(K))
- CALL CSSCAL(N,S,Z,1)
- EK = CMPLX(S,0.0E0)*EK
- 60 CONTINUE
- WK = EK - Z(K)
- WKM = -EK - Z(K)
- S = CABS1(WK)
- SM = CABS1(WKM)
- WK = WK/A(K,K)
- WKM = WKM/A(K,K)
- KP1 = K + 1
- IF (KP1 .GT. N) GO TO 100
- DO 70 J = KP1, N
- SM = SM + CABS1(Z(J)+WKM*CONJG(A(K,J)))
- Z(J) = Z(J) + WK*CONJG(A(K,J))
- S = S + CABS1(Z(J))
- 70 CONTINUE
- IF (S .GE. SM) GO TO 90
- T = WKM - WK
- WK = WKM
- DO 80 J = KP1, N
- Z(J) = Z(J) + T*CONJG(A(K,J))
- 80 CONTINUE
- 90 CONTINUE
- 100 CONTINUE
- Z(K) = WK
- 110 CONTINUE
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- C
- C SOLVE R*Y = W
- C
- DO 130 KB = 1, N
- K = N + 1 - KB
- IF (CABS1(Z(K)) .LE. REAL(A(K,K))) GO TO 120
- S = REAL(A(K,K))/CABS1(Z(K))
- CALL CSSCAL(N,S,Z,1)
- 120 CONTINUE
- Z(K) = Z(K)/A(K,K)
- T = -Z(K)
- CALL CAXPY(K-1,T,A(1,K),1,Z(1),1)
- 130 CONTINUE
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- C
- YNORM = 1.0E0
- C
- C SOLVE CTRANS(R)*V = Y
- C
- DO 150 K = 1, N
- Z(K) = Z(K) - CDOTC(K-1,A(1,K),1,Z(1),1)
- IF (CABS1(Z(K)) .LE. REAL(A(K,K))) GO TO 140
- S = REAL(A(K,K))/CABS1(Z(K))
- CALL CSSCAL(N,S,Z,1)
- YNORM = S*YNORM
- 140 CONTINUE
- Z(K) = Z(K)/A(K,K)
- 150 CONTINUE
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- YNORM = S*YNORM
- C
- C SOLVE R*Z = V
- C
- DO 170 KB = 1, N
- K = N + 1 - KB
- IF (CABS1(Z(K)) .LE. REAL(A(K,K))) GO TO 160
- S = REAL(A(K,K))/CABS1(Z(K))
- CALL CSSCAL(N,S,Z,1)
- YNORM = S*YNORM
- 160 CONTINUE
- Z(K) = Z(K)/A(K,K)
- T = -Z(K)
- CALL CAXPY(K-1,T,A(1,K),1,Z(1),1)
- 170 CONTINUE
- C MAKE ZNORM = 1.0
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- YNORM = S*YNORM
- C
- IF (ANORM .NE. 0.0E0) RCOND = YNORM/ANORM
- IF (ANORM .EQ. 0.0E0) RCOND = 0.0E0
- 180 CONTINUE
- RETURN
- END
- *DECK CPODI
- SUBROUTINE CPODI (A, LDA, N, DET, JOB)
- C***BEGIN PROLOGUE CPODI
- C***PURPOSE Compute the determinant and inverse of a certain complex
- C Hermitian positive definite matrix using the factors
- C computed by CPOCO, CPOFA, or CQRDC.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D2D1B, D3D1B
- C***TYPE COMPLEX (SPODI-S, DPODI-D, CPODI-C)
- C***KEYWORDS DETERMINANT, INVERSE, LINEAR ALGEBRA, LINPACK, MATRIX,
- C POSITIVE DEFINITE
- C***AUTHOR Moler, C. B., (U. of New Mexico)
- C***DESCRIPTION
- C
- C CPODI computes the determinant and inverse of a certain
- C complex Hermitian positive definite matrix (see below)
- C using the factors computed by CPOCO, CPOFA or CQRDC.
- C
- C On Entry
- C
- C A COMPLEX(LDA, N)
- C the output A from CPOCO or CPOFA
- C or the output X from CQRDC.
- C
- C LDA INTEGER
- C the leading dimension of the array A .
- C
- C N INTEGER
- C the order of the matrix A .
- C
- C JOB INTEGER
- C = 11 both determinant and inverse.
- C = 01 inverse only.
- C = 10 determinant only.
- C
- C On Return
- C
- C A If CPOCO or CPOFA was used to factor A then
- C CPODI produces the upper half of INVERSE(A) .
- C If CQRDC was used to decompose X then
- C CPODI produces the upper half of INVERSE(CTRANS(X)*X)
- C where CTRANS(X) is the conjugate transpose.
- C Elements of A below the diagonal are unchanged.
- C If the units digit of JOB is zero, A is unchanged.
- C
- C DET REAL(2)
- C determinant of A or of CTRANS(X)*X if requested.
- C Otherwise not referenced.
- C Determinant = DET(1) * 10.0**DET(2)
- C with 1.0 .LE. DET(1) .LT. 10.0
- C or DET(1) .EQ. 0.0 .
- C
- C Error Condition
- C
- C a division by zero will occur if the input factor contains
- C a zero on the diagonal and the inverse is requested.
- C It will not occur if the subroutines are called correctly
- C and if CPOCO or CPOFA has set INFO .EQ. 0 .
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CAXPY, CSCAL
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CPODI
- INTEGER LDA,N,JOB
- COMPLEX A(LDA,*)
- REAL DET(2)
- C
- COMPLEX T
- REAL S
- INTEGER I,J,JM1,K,KP1
- C***FIRST EXECUTABLE STATEMENT CPODI
- C
- C COMPUTE DETERMINANT
- C
- IF (JOB/10 .EQ. 0) GO TO 70
- DET(1) = 1.0E0
- DET(2) = 0.0E0
- S = 10.0E0
- DO 50 I = 1, N
- DET(1) = REAL(A(I,I))**2*DET(1)
- IF (DET(1) .EQ. 0.0E0) GO TO 60
- 10 IF (DET(1) .GE. 1.0E0) GO TO 20
- DET(1) = S*DET(1)
- DET(2) = DET(2) - 1.0E0
- GO TO 10
- 20 CONTINUE
- 30 IF (DET(1) .LT. S) GO TO 40
- DET(1) = DET(1)/S
- DET(2) = DET(2) + 1.0E0
- GO TO 30
- 40 CONTINUE
- 50 CONTINUE
- 60 CONTINUE
- 70 CONTINUE
- C
- C COMPUTE INVERSE(R)
- C
- IF (MOD(JOB,10) .EQ. 0) GO TO 140
- DO 100 K = 1, N
- A(K,K) = (1.0E0,0.0E0)/A(K,K)
- T = -A(K,K)
- CALL CSCAL(K-1,T,A(1,K),1)
- KP1 = K + 1
- IF (N .LT. KP1) GO TO 90
- DO 80 J = KP1, N
- T = A(K,J)
- A(K,J) = (0.0E0,0.0E0)
- CALL CAXPY(K,T,A(1,K),1,A(1,J),1)
- 80 CONTINUE
- 90 CONTINUE
- 100 CONTINUE
- C
- C FORM INVERSE(R) * CTRANS(INVERSE(R))
- C
- DO 130 J = 1, N
- JM1 = J - 1
- IF (JM1 .LT. 1) GO TO 120
- DO 110 K = 1, JM1
- T = CONJG(A(K,J))
- CALL CAXPY(K,T,A(1,J),1,A(1,K),1)
- 110 CONTINUE
- 120 CONTINUE
- T = CONJG(A(J,J))
- CALL CSCAL(J,T,A(1,J),1)
- 130 CONTINUE
- 140 CONTINUE
- RETURN
- END
- *DECK CPOFA
- SUBROUTINE CPOFA (A, LDA, N, INFO)
- C***BEGIN PROLOGUE CPOFA
- C***PURPOSE Factor a complex Hermitian positive definite matrix.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D2D1B
- C***TYPE COMPLEX (SPOFA-S, DPOFA-D, CPOFA-C)
- C***KEYWORDS LINEAR ALGEBRA, LINPACK, MATRIX FACTORIZATION,
- C POSITIVE DEFINITE
- C***AUTHOR Moler, C. B., (U. of New Mexico)
- C***DESCRIPTION
- C
- C CPOFA factors a complex Hermitian positive definite matrix.
- C
- C CPOFA is usually called by CPOCO, but it can be called
- C directly with a saving in time if RCOND is not needed.
- C (Time for CPOCO) = (1 + 18/N)*(Time for CPOFA) .
- C
- C On Entry
- C
- C A COMPLEX(LDA, N)
- C the Hermitian matrix to be factored. Only the
- C diagonal and upper triangle are used.
- C
- C LDA INTEGER
- C the leading dimension of the array A .
- C
- C N INTEGER
- C the order of the matrix A .
- C
- C On Return
- C
- C A an upper triangular matrix R so that A =
- C CTRANS(R)*R where CTRANS(R) is the conjugate
- C transpose. The strict lower triangle is unaltered.
- C If INFO .NE. 0 , the factorization is not complete.
- C
- C INFO INTEGER
- C = 0 for normal return.
- C = K signals an error condition. The leading minor
- C of order K is not positive definite.
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CDOTC
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CPOFA
- INTEGER LDA,N,INFO
- COMPLEX A(LDA,*)
- C
- COMPLEX CDOTC,T
- REAL S
- INTEGER J,JM1,K
- C***FIRST EXECUTABLE STATEMENT CPOFA
- DO 30 J = 1, N
- INFO = J
- S = 0.0E0
- JM1 = J - 1
- IF (JM1 .LT. 1) GO TO 20
- DO 10 K = 1, JM1
- T = A(K,J) - CDOTC(K-1,A(1,K),1,A(1,J),1)
- T = T/A(K,K)
- A(K,J) = T
- S = S + REAL(T*CONJG(T))
- 10 CONTINUE
- 20 CONTINUE
- S = REAL(A(J,J)) - S
- IF (S .LE. 0.0E0 .OR. AIMAG(A(J,J)) .NE. 0.0E0) GO TO 40
- A(J,J) = CMPLX(SQRT(S),0.0E0)
- 30 CONTINUE
- INFO = 0
- 40 CONTINUE
- RETURN
- END
- *DECK CPOFS
- SUBROUTINE CPOFS (A, LDA, N, V, ITASK, IND, WORK)
- C***BEGIN PROLOGUE CPOFS
- C***PURPOSE Solve a positive definite symmetric complex system of
- C linear equations.
- C***LIBRARY SLATEC
- C***CATEGORY D2D1B
- C***TYPE COMPLEX (SPOFS-S, DPOFS-D, CPOFS-C)
- C***KEYWORDS HERMITIAN, LINEAR EQUATIONS, POSITIVE DEFINITE, SYMMETRIC
- C***AUTHOR Voorhees, E. A., (LANL)
- C***DESCRIPTION
- C
- C Subroutine CPOFS solves a positive definite symmetric
- C NxN system of complex linear equations using LINPACK
- C subroutines CPOCO and CPOSL. That is, if A is an NxN
- C complex positive definite symmetric matrix and if X and B
- C are complex N-vectors, then CPOFS solves the equation
- C
- C A*X=B.
- C
- C Care should be taken not to use CPOFS with a non-Hermitian
- C matrix.
- C
- C The matrix A is first factored into upper and lower tri-
- C angular matrices R and R-TRANSPOSE. These factors are used to
- C find the solution vector X. An approximate condition number is
- C calculated to provide a rough estimate of the number of
- C digits of accuracy in the computed solution.
- C
- C If the equation A*X=B is to be solved for more than one vector
- C B, the factoring of a does not need to be performed again and
- C the option to only solve (ITASK .GT. 1) will be faster for
- C the succeeding solutions. In this case, the contents of A,
- C LDA, and N must not have been altered by the user following
- C factorization (ITASK=1). IND will not be changed by CPOFS
- C in this case.
- C
- C Argument Description ***
- C
- C A COMPLEX(LDA,N)
- C on entry, the doubly subscripted array with dimension
- C (LDA,N) which contains the coefficient matrix. Only
- C the upper triangle, including the diagonal, of the
- C coefficient matrix need be entered and will subse-
- C quently be referenced and changed by the routine.
- C on return, contains in its upper triangle an upper
- C triangular matrix R such that A = (R-TRANSPOSE) * R .
- C LDA INTEGER
- C the leading dimension of the array A. LDA must be great-
- C er than or equal to N. (terminal error message IND=-1)
- C N INTEGER
- C the order of the matrix A. N must be greater
- C than or equal to 1. (terminal error message IND=-2)
- C V COMPLEX(N)
- C on entry the singly subscripted array(vector) of di-
- C mension N which contains the right hand side B of a
- C system of simultaneous linear equations A*X=B.
- C on return, V contains the solution vector, X .
- C ITASK INTEGER
- C if ITASK = 1, the matrix A is factored and then the
- C linear equation is solved.
- C if ITASK .GT. 1, the equation is solved using the existing
- C factored matrix A.
- C if ITASK .LT. 1, then terminal error message IND=-3 is
- C printed.
- C IND INTEGER
- C GT. 0 IND is a rough estimate of the number of digits
- C of accuracy in the solution, X.
- C LT. 0 see error message corresponding to IND below.
- C WORK COMPLEX(N)
- C a singly subscripted array of dimension at least N.
- C
- C Error Messages Printed ***
- C
- C IND=-1 terminal N is greater than LDA.
- C IND=-2 terminal N is less than 1.
- C IND=-3 terminal ITASK is less than 1.
- C IND=-4 terminal The matrix A is computationally singular or
- C is not positive definite. A solution
- C has not been computed.
- C IND=-10 warning The solution has no apparent significance.
- C The solution may be inaccurate or the
- C matrix A may be poorly scaled.
- C
- C NOTE- The above terminal(*fatal*) error messages are
- C designed to be handled by XERMSG in which
- C LEVEL=1 (recoverable) and IFLAG=2 . LEVEL=0
- C for warning error messages from XERMSG. Unless
- C the user provides otherwise, an error message
- C will be printed followed by an abort.
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CPOCO, CPOSL, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 800516 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 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 900510 Convert XERRWV calls to XERMSG calls, cvt GOTO's to
- C IF-THEN-ELSE. (RWC)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CPOFS
- C
- INTEGER LDA,N,ITASK,IND,INFO
- COMPLEX A(LDA,*),V(*),WORK(*)
- REAL R1MACH
- REAL RCOND
- CHARACTER*8 XERN1, XERN2
- C***FIRST EXECUTABLE STATEMENT CPOFS
- IF (LDA.LT.N) THEN
- IND = -1
- WRITE (XERN1, '(I8)') LDA
- WRITE (XERN2, '(I8)') N
- CALL XERMSG ('SLATEC', 'CPOFS', 'LDA = ' // XERN1 //
- * ' IS LESS THAN N = ' // XERN2, -1, 1)
- RETURN
- ENDIF
- C
- IF (N.LE.0) THEN
- IND = -2
- WRITE (XERN1, '(I8)') N
- CALL XERMSG ('SLATEC', 'CPOFS', 'N = ' // XERN1 //
- * ' IS LESS THAN 1', -2, 1)
- RETURN
- ENDIF
- C
- IF (ITASK.LT.1) THEN
- IND = -3
- WRITE (XERN1, '(I8)') ITASK
- CALL XERMSG ('SLATEC', 'CPOFS', 'ITASK = ' // XERN1 //
- * ' IS LESS THAN 1', -3, 1)
- RETURN
- ENDIF
- C
- IF (ITASK.EQ.1) THEN
- C
- C FACTOR MATRIX A INTO R
- C
- CALL CPOCO(A,LDA,N,RCOND,WORK,INFO)
- C
- C CHECK FOR POSITIVE DEFINITE MATRIX
- C
- IF (INFO.NE.0) THEN
- IND = -4
- CALL XERMSG ('SLATEC', 'CPOFS',
- * 'SINGULAR OR NOT POSITIVE DEFINITE - NO SOLUTION', -4, 1)
- RETURN
- ENDIF
- C
- C COMPUTE IND (ESTIMATE OF NO. OF SIGNIFICANT DIGITS)
- C AND CHECK FOR IND GREATER THAN ZERO
- C
- IND = -LOG10(R1MACH(4)/RCOND)
- IF (IND.LE.0) THEN
- IND = -10
- CALL XERMSG ('SLATEC', 'CPOFS',
- * 'SOLUTION MAY HAVE NO SIGNIFICANCE', -10, 0)
- ENDIF
- ENDIF
- C
- C SOLVE AFTER FACTORING
- C
- CALL CPOSL(A,LDA,N,V)
- RETURN
- END
- *DECK CPOIR
- SUBROUTINE CPOIR (A, LDA, N, V, ITASK, IND, WORK)
- C***BEGIN PROLOGUE CPOIR
- C***PURPOSE Solve a positive definite Hermitian system of linear
- C equations. Iterative refinement is used to obtain an
- C error estimate.
- C***LIBRARY SLATEC
- C***CATEGORY D2D1B
- C***TYPE COMPLEX (SPOIR-S, CPOIR-C)
- C***KEYWORDS HERMITIAN, LINEAR EQUATIONS, POSITIVE DEFINITE, SYMMETRIC
- C***AUTHOR Voorhees, E. A., (LANL)
- C***DESCRIPTION
- C
- C Subroutine CPOIR solves a complex positive definite Hermitian
- C NxN system of single precision linear equations using LINPACK
- C subroutines CPOFA and CPOSL. One pass of iterative refine-
- C ment is used only to obtain an estimate of the accuracy. That
- C is, if A is an NxN complex positive definite Hermitian matrix
- C and if X and B are complex N-vectors, then CPOIR solves the
- C equation
- C
- C A*X=B.
- C
- C Care should be taken not to use CPOIR with a non-Hermitian
- C matrix.
- C
- C The matrix A is first factored into upper and lower
- C triangular matrices R and R-TRANSPOSE. These
- C factors are used to calculate the solution, X.
- C Then the residual vector is found and used
- C to calculate an estimate of the relative error, IND.
- C IND estimates the accuracy of the solution only when the
- C input matrix and the right hand side are represented
- C exactly in the computer and does not take into account
- C any errors in the input data.
- C
- C If the equation A*X=B is to be solved for more than one vector
- C B, the factoring of A does not need to be performed again and
- C the option to only solve (ITASK .GT. 1) will be faster for
- C the succeeding solutions. In this case, the contents of A,
- C LDA, N, and WORK must not have been altered by the user
- C following factorization (ITASK=1). IND will not be changed
- C by CPOIR in this case.
- C
- C Argument Description ***
- C A COMPLEX(LDA,N)
- C the doubly subscripted array with dimension (LDA,N)
- C which contains the coefficient matrix. Only the
- C upper triangle, including the diagonal, of the
- C coefficient matrix need be entered. A is not
- C altered by the routine.
- C LDA INTEGER
- C the leading dimension of the array A. LDA must be great-
- C er than or equal to N. (terminal error message IND=-1)
- C N INTEGER
- C the order of the matrix A. N must be greater than
- C or equal to one. (terminal error message IND=-2)
- C V COMPLEX(N)
- C on entry, the singly subscripted array(vector) of di-
- C mension N which contains the right hand side B of a
- C system of simultaneous linear equations A*X=B.
- C on return, V contains the solution vector, X .
- C ITASK INTEGER
- C if ITASK = 1, the matrix A is factored and then the
- C linear equation is solved.
- C if ITASK .GT. 1, the equation is solved using the existing
- C factored matrix A (stored in WORK).
- C if ITASK .LT. 1, then terminal terminal error IND=-3 is
- C printed.
- C IND INTEGER
- C GT. 0 IND is a rough estimate of the number of digits
- C of accuracy in the solution, X. IND=75 means
- C that the solution vector X is zero.
- C LT. 0 see error message corresponding to IND below.
- C WORK COMPLEX(N*(N+1))
- C a singly subscripted array of dimension at least N*(N+1).
- C
- C Error Messages Printed ***
- C
- C IND=-1 terminal N is greater than LDA.
- C IND=-2 terminal N is less than one.
- C IND=-3 terminal ITASK is less than one.
- C IND=-4 terminal The matrix A is computationally singular
- C or is not positive definite.
- C A solution has not been computed.
- C IND=-10 warning The solution has no apparent significance.
- C the solution may be inaccurate or the matrix
- C a may be poorly scaled.
- C
- C NOTE- the above terminal(*fatal*) error messages are
- C designed to be handled by XERMSG in which
- C LEVEL=1 (recoverable) and IFLAG=2 . LEVEL=0
- C for warning error messages from XERMSG. Unless
- C the user provides otherwise, an error message
- C will be printed followed by an abort.
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CCOPY, CPOFA, CPOSL, DCDOT, R1MACH, SCASUM, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 800530 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 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 900510 Convert XERRWV calls to XERMSG calls, cvt GOTO's to
- C IF-THEN-ELSE. (RWC)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CPOIR
- C
- INTEGER LDA,N,ITASK,IND,INFO,J
- COMPLEX A(LDA,*),V(*),WORK(N,*)
- REAL SCASUM,XNORM,DNORM,R1MACH
- DOUBLE PRECISION DR1,DI1,DR2,DI2
- CHARACTER*8 XERN1, XERN2
- C***FIRST EXECUTABLE STATEMENT CPOIR
- IF (LDA.LT.N) THEN
- IND = -1
- WRITE (XERN1, '(I8)') LDA
- WRITE (XERN2, '(I8)') N
- CALL XERMSG ('SLATEC', 'CPOIR', 'LDA = ' // XERN1 //
- * ' IS LESS THAN N = ' // XERN2, -1, 1)
- RETURN
- ENDIF
- C
- IF (N.LE.0) THEN
- IND = -2
- WRITE (XERN1, '(I8)') N
- CALL XERMSG ('SLATEC', 'CPOIR', 'N = ' // XERN1 //
- * ' IS LESS THAN 1', -2, 1)
- RETURN
- ENDIF
- C
- IF (ITASK.LT.1) THEN
- IND = -3
- WRITE (XERN1, '(I8)') ITASK
- CALL XERMSG ('SLATEC', 'CPOIR', 'ITASK = ' // XERN1 //
- * ' IS LESS THAN 1', -3, 1)
- RETURN
- ENDIF
- C
- IF (ITASK.EQ.1) THEN
- C
- C MOVE MATRIX A TO WORK
- C
- DO 10 J=1,N
- CALL CCOPY(N,A(1,J),1,WORK(1,J),1)
- 10 CONTINUE
- C
- C FACTOR MATRIX A INTO R
- C
- CALL CPOFA(WORK,N,N,INFO)
- C
- C CHECK FOR SINGULAR OR NOT POS.DEF. MATRIX
- C
- IF (INFO.NE.0) THEN
- IND = -4
- CALL XERMSG ('SLATEC', 'CPOIR',
- * 'SINGULAR OR NOT POSITIVE DEFINITE - NO SOLUTION', -4, 1)
- RETURN
- ENDIF
- ENDIF
- C
- C SOLVE AFTER FACTORING
- C MOVE VECTOR B TO WORK
- C
- CALL CCOPY(N,V(1),1,WORK(1,N+1),1)
- CALL CPOSL(WORK,N,N,V)
- C
- C FORM NORM OF X0
- C
- XNORM = SCASUM(N,V(1),1)
- IF (XNORM.EQ.0.0) THEN
- IND = 75
- RETURN
- ENDIF
- C
- C COMPUTE RESIDUAL
- C
- DO 40 J=1,N
- CALL DCDOT(J-1,-1.D0,A(1,J),1,V(1),1,DR1,DI1)
- CALL DCDOT(N-J+1,1.D0,A(J,J),LDA,V(J),1,DR2,DI2)
- DR1 = DR1+DR2-DBLE(REAL(WORK(J,N+1)))
- DI1 = DI1+DI2-DBLE(AIMAG(WORK(J,N+1)))
- WORK(J,N+1) = CMPLX(REAL(DR1),REAL(DI1))
- 40 CONTINUE
- C
- C SOLVE A*DELTA=R
- C
- CALL CPOSL(WORK,N,N,WORK(1,N+1))
- C
- C FORM NORM OF DELTA
- C
- DNORM = SCASUM(N,WORK(1,N+1),1)
- C
- C COMPUTE IND (ESTIMATE OF NO. OF SIGNIFICANT DIGITS)
- C AND CHECK FOR IND GREATER THAN ZERO
- C
- IND = -LOG10(MAX(R1MACH(4),DNORM/XNORM))
- IF (IND.LE.0) THEN
- IND = -10
- CALL XERMSG ('SLATEC', 'CPOIR',
- * 'SOLUTION MAY HAVE NO SIGNIFICANCE', -10, 0)
- ENDIF
- RETURN
- END
- *DECK CPOSL
- SUBROUTINE CPOSL (A, LDA, N, B)
- C***BEGIN PROLOGUE CPOSL
- C***PURPOSE Solve the complex Hermitian positive definite linear system
- C using the factors computed by CPOCO or CPOFA.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D2D1B
- C***TYPE COMPLEX (SPOSL-S, DPOSL-D, CPOSL-C)
- C***KEYWORDS LINEAR ALGEBRA, LINPACK, MATRIX, POSITIVE DEFINITE, SOLVE
- C***AUTHOR Moler, C. B., (U. of New Mexico)
- C***DESCRIPTION
- C
- C CPOSL solves the COMPLEX Hermitian positive definite system
- C A * X = B
- C using the factors computed by CPOCO or CPOFA.
- C
- C On Entry
- C
- C A COMPLEX(LDA, N)
- C the output from CPOCO or CPOFA.
- C
- C LDA INTEGER
- C the leading dimension of the array A .
- C
- C N INTEGER
- C the order of the matrix A .
- C
- C B COMPLEX(N)
- C the right hand side vector.
- C
- C On Return
- C
- C B the solution vector X .
- C
- C Error Condition
- C
- C A division by zero will occur if the input factor contains
- C a zero on the diagonal. Technically this indicates
- C singularity but it is usually caused by improper subroutine
- C arguments. It will not occur if the subroutines are called
- C correctly and INFO .EQ. 0 .
- C
- C To compute INVERSE(A) * C where C is a matrix
- C with P columns
- C CALL CPOCO(A,LDA,N,RCOND,Z,INFO)
- C IF (RCOND is too small .OR. INFO .NE. 0) GO TO ...
- C DO 10 J = 1, P
- C CALL CPOSL(A,LDA,N,C(1,J))
- C 10 CONTINUE
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CAXPY, CDOTC
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CPOSL
- INTEGER LDA,N
- COMPLEX A(LDA,*),B(*)
- C
- COMPLEX CDOTC,T
- INTEGER K,KB
- C
- C SOLVE CTRANS(R)*Y = B
- C
- C***FIRST EXECUTABLE STATEMENT CPOSL
- DO 10 K = 1, N
- T = CDOTC(K-1,A(1,K),1,B(1),1)
- B(K) = (B(K) - T)/A(K,K)
- 10 CONTINUE
- C
- C SOLVE R*X = Y
- C
- DO 20 KB = 1, N
- K = N + 1 - KB
- B(K) = B(K)/A(K,K)
- T = -B(K)
- CALL CAXPY(K-1,T,A(1,K),1,B(1),1)
- 20 CONTINUE
- RETURN
- END
- *DECK CPPCO
- SUBROUTINE CPPCO (AP, N, RCOND, Z, INFO)
- C***BEGIN PROLOGUE CPPCO
- C***PURPOSE Factor a complex Hermitian positive definite matrix stored
- C in packed form and estimate the condition number of the
- C matrix.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D2D1B
- C***TYPE COMPLEX (SPPCO-S, DPPCO-D, CPPCO-C)
- C***KEYWORDS CONDITION NUMBER, LINEAR ALGEBRA, LINPACK,
- C MATRIX FACTORIZATION, PACKED, POSITIVE DEFINITE
- C***AUTHOR Moler, C. B., (U. of New Mexico)
- C***DESCRIPTION
- C
- C CPPCO factors a complex Hermitian positive definite matrix
- C stored in packed form and estimates the condition of the matrix.
- C
- C If RCOND is not needed, CPPFA is slightly faster.
- C To solve A*X = B , follow CPPCO by CPPSL.
- C To compute INVERSE(A)*C , follow CPPCO by CPPSL.
- C To compute DETERMINANT(A) , follow CPPCO by CPPDI.
- C To compute INVERSE(A) , follow CPPCO by CPPDI.
- C
- C On Entry
- C
- C AP COMPLEX (N*(N+1)/2)
- C the packed form of a Hermitian matrix A . The
- C columns of the upper triangle are stored sequentially
- C in a one-dimensional array of length N*(N+1)/2 .
- C See comments below for details.
- C
- C N INTEGER
- C the order of the matrix A .
- C
- C On Return
- C
- C AP an upper triangular matrix R , stored in packed
- C form, so that A = CTRANS(R)*R .
- C If INFO .NE. 0 , the factorization is not complete.
- C
- C RCOND REAL
- C an estimate of the reciprocal condition of A .
- C For the system A*X = B , relative perturbations
- C in A and B of size EPSILON may cause
- C relative perturbations in X of size EPSILON/RCOND .
- C If RCOND is so small that the logical expression
- C 1.0 + RCOND .EQ. 1.0
- C is true, then A may be singular to working
- C precision. In particular, RCOND is zero if
- C exact singularity is detected or the estimate
- C underflows. If INFO .NE. 0 , RCOND is unchanged.
- C
- C Z COMPLEX(N)
- C a work vector whose contents are usually unimportant.
- C If A is singular to working precision, then Z is
- C an approximate null vector in the sense that
- C NORM(A*Z) = RCOND*NORM(A)*NORM(Z) .
- C If INFO .NE. 0 , Z is unchanged.
- C
- C INFO INTEGER
- C = 0 for normal return.
- C = K signals an error condition. The leading minor
- C of order K is not positive definite.
- C
- C Packed Storage
- C
- C The following program segment will pack the upper
- C triangle of a Hermitian matrix.
- C
- C K = 0
- C DO 20 J = 1, N
- C DO 10 I = 1, J
- C K = K + 1
- C AP(K) = A(I,J)
- C 10 CONTINUE
- C 20 CONTINUE
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CAXPY, CDOTC, CPPFA, CSSCAL, SCASUM
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CPPCO
- INTEGER N,INFO
- COMPLEX AP(*),Z(*)
- REAL RCOND
- C
- COMPLEX CDOTC,EK,T,WK,WKM
- REAL ANORM,S,SCASUM,SM,YNORM
- INTEGER I,IJ,J,JM1,J1,K,KB,KJ,KK,KP1
- COMPLEX ZDUM,ZDUM2,CSIGN1
- REAL CABS1
- CABS1(ZDUM) = ABS(REAL(ZDUM)) + ABS(AIMAG(ZDUM))
- CSIGN1(ZDUM,ZDUM2) = CABS1(ZDUM)*(ZDUM2/CABS1(ZDUM2))
- C
- C FIND NORM OF A
- C
- C***FIRST EXECUTABLE STATEMENT CPPCO
- J1 = 1
- DO 30 J = 1, N
- Z(J) = CMPLX(SCASUM(J,AP(J1),1),0.0E0)
- IJ = J1
- J1 = J1 + J
- JM1 = J - 1
- IF (JM1 .LT. 1) GO TO 20
- DO 10 I = 1, JM1
- Z(I) = CMPLX(REAL(Z(I))+CABS1(AP(IJ)),0.0E0)
- IJ = IJ + 1
- 10 CONTINUE
- 20 CONTINUE
- 30 CONTINUE
- ANORM = 0.0E0
- DO 40 J = 1, N
- ANORM = MAX(ANORM,REAL(Z(J)))
- 40 CONTINUE
- C
- C FACTOR
- C
- CALL CPPFA(AP,N,INFO)
- IF (INFO .NE. 0) GO TO 180
- C
- C RCOND = 1/(NORM(A)*(ESTIMATE OF NORM(INVERSE(A)))) .
- C ESTIMATE = NORM(Z)/NORM(Y) WHERE A*Z = Y AND A*Y = E .
- C THE COMPONENTS OF E ARE CHOSEN TO CAUSE MAXIMUM LOCAL
- C GROWTH IN THE ELEMENTS OF W WHERE CTRANS(R)*W = E .
- C THE VECTORS ARE FREQUENTLY RESCALED TO AVOID OVERFLOW.
- C
- C SOLVE CTRANS(R)*W = E
- C
- EK = (1.0E0,0.0E0)
- DO 50 J = 1, N
- Z(J) = (0.0E0,0.0E0)
- 50 CONTINUE
- KK = 0
- DO 110 K = 1, N
- KK = KK + K
- IF (CABS1(Z(K)) .NE. 0.0E0) EK = CSIGN1(EK,-Z(K))
- IF (CABS1(EK-Z(K)) .LE. REAL(AP(KK))) GO TO 60
- S = REAL(AP(KK))/CABS1(EK-Z(K))
- CALL CSSCAL(N,S,Z,1)
- EK = CMPLX(S,0.0E0)*EK
- 60 CONTINUE
- WK = EK - Z(K)
- WKM = -EK - Z(K)
- S = CABS1(WK)
- SM = CABS1(WKM)
- WK = WK/AP(KK)
- WKM = WKM/AP(KK)
- KP1 = K + 1
- KJ = KK + K
- IF (KP1 .GT. N) GO TO 100
- DO 70 J = KP1, N
- SM = SM + CABS1(Z(J)+WKM*CONJG(AP(KJ)))
- Z(J) = Z(J) + WK*CONJG(AP(KJ))
- S = S + CABS1(Z(J))
- KJ = KJ + J
- 70 CONTINUE
- IF (S .GE. SM) GO TO 90
- T = WKM - WK
- WK = WKM
- KJ = KK + K
- DO 80 J = KP1, N
- Z(J) = Z(J) + T*CONJG(AP(KJ))
- KJ = KJ + J
- 80 CONTINUE
- 90 CONTINUE
- 100 CONTINUE
- Z(K) = WK
- 110 CONTINUE
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- C
- C SOLVE R*Y = W
- C
- DO 130 KB = 1, N
- K = N + 1 - KB
- IF (CABS1(Z(K)) .LE. REAL(AP(KK))) GO TO 120
- S = REAL(AP(KK))/CABS1(Z(K))
- CALL CSSCAL(N,S,Z,1)
- 120 CONTINUE
- Z(K) = Z(K)/AP(KK)
- KK = KK - K
- T = -Z(K)
- CALL CAXPY(K-1,T,AP(KK+1),1,Z(1),1)
- 130 CONTINUE
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- C
- YNORM = 1.0E0
- C
- C SOLVE CTRANS(R)*V = Y
- C
- DO 150 K = 1, N
- Z(K) = Z(K) - CDOTC(K-1,AP(KK+1),1,Z(1),1)
- KK = KK + K
- IF (CABS1(Z(K)) .LE. REAL(AP(KK))) GO TO 140
- S = REAL(AP(KK))/CABS1(Z(K))
- CALL CSSCAL(N,S,Z,1)
- YNORM = S*YNORM
- 140 CONTINUE
- Z(K) = Z(K)/AP(KK)
- 150 CONTINUE
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- YNORM = S*YNORM
- C
- C SOLVE R*Z = V
- C
- DO 170 KB = 1, N
- K = N + 1 - KB
- IF (CABS1(Z(K)) .LE. REAL(AP(KK))) GO TO 160
- S = REAL(AP(KK))/CABS1(Z(K))
- CALL CSSCAL(N,S,Z,1)
- YNORM = S*YNORM
- 160 CONTINUE
- Z(K) = Z(K)/AP(KK)
- KK = KK - K
- T = -Z(K)
- CALL CAXPY(K-1,T,AP(KK+1),1,Z(1),1)
- 170 CONTINUE
- C MAKE ZNORM = 1.0
- S = 1.0E0/SCASUM(N,Z,1)
- CALL CSSCAL(N,S,Z,1)
- YNORM = S*YNORM
- C
- IF (ANORM .NE. 0.0E0) RCOND = YNORM/ANORM
- IF (ANORM .EQ. 0.0E0) RCOND = 0.0E0
- 180 CONTINUE
- RETURN
- END
- *DECK CPPDI
- SUBROUTINE CPPDI (AP, N, DET, JOB)
- C***BEGIN PROLOGUE CPPDI
- C***PURPOSE Compute the determinant and inverse of a complex Hermitian
- C positive definite matrix using factors from CPPCO or CPPFA.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D2D1B, D3D1B
- C***TYPE COMPLEX (SPPDI-S, DPPDI-D, CPPDI-C)
- C***KEYWORDS DETERMINANT, INVERSE, LINEAR ALGEBRA, LINPACK, MATRIX,
- C PACKED, POSITIVE DEFINITE
- C***AUTHOR Moler, C. B., (U. of New Mexico)
- C***DESCRIPTION
- C
- C CPPDI computes the determinant and inverse
- C of a complex Hermitian positive definite matrix
- C using the factors computed by CPPCO or CPPFA .
- C
- C On Entry
- C
- C AP COMPLEX (N*(N+1)/2)
- C the output from CPPCO or CPPFA.
- C
- C N INTEGER
- C the order of the matrix A .
- C
- C JOB INTEGER
- C = 11 both determinant and inverse.
- C = 01 inverse only.
- C = 10 determinant only.
- C
- C On Return
- C
- C AP the upper triangular half of the inverse .
- C The strict lower triangle is unaltered.
- C
- C DET REAL(2)
- C determinant of original matrix if requested.
- C Otherwise not referenced.
- C Determinant = DET(1) * 10.0**DET(2)
- C with 1.0 .LE. DET(1) .LT. 10.0
- C or DET(1) .EQ. 0.0 .
- C
- C Error Condition
- C
- C A division by zero will occur if the input factor contains
- C a zero on the diagonal and the inverse is requested.
- C It will not occur if the subroutines are called correctly
- C and if CPOCO or CPOFA has set INFO .EQ. 0 .
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CAXPY, CSCAL
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CPPDI
- INTEGER N,JOB
- COMPLEX AP(*)
- REAL DET(2)
- C
- COMPLEX T
- REAL S
- INTEGER I,II,J,JJ,JM1,J1,K,KJ,KK,KP1,K1
- C***FIRST EXECUTABLE STATEMENT CPPDI
- C
- C COMPUTE DETERMINANT
- C
- IF (JOB/10 .EQ. 0) GO TO 70
- DET(1) = 1.0E0
- DET(2) = 0.0E0
- S = 10.0E0
- II = 0
- DO 50 I = 1, N
- II = II + I
- DET(1) = REAL(AP(II))**2*DET(1)
- IF (DET(1) .EQ. 0.0E0) GO TO 60
- 10 IF (DET(1) .GE. 1.0E0) GO TO 20
- DET(1) = S*DET(1)
- DET(2) = DET(2) - 1.0E0
- GO TO 10
- 20 CONTINUE
- 30 IF (DET(1) .LT. S) GO TO 40
- DET(1) = DET(1)/S
- DET(2) = DET(2) + 1.0E0
- GO TO 30
- 40 CONTINUE
- 50 CONTINUE
- 60 CONTINUE
- 70 CONTINUE
- C
- C COMPUTE INVERSE(R)
- C
- IF (MOD(JOB,10) .EQ. 0) GO TO 140
- KK = 0
- DO 100 K = 1, N
- K1 = KK + 1
- KK = KK + K
- AP(KK) = (1.0E0,0.0E0)/AP(KK)
- T = -AP(KK)
- CALL CSCAL(K-1,T,AP(K1),1)
- KP1 = K + 1
- J1 = KK + 1
- KJ = KK + K
- IF (N .LT. KP1) GO TO 90
- DO 80 J = KP1, N
- T = AP(KJ)
- AP(KJ) = (0.0E0,0.0E0)
- CALL CAXPY(K,T,AP(K1),1,AP(J1),1)
- J1 = J1 + J
- KJ = KJ + J
- 80 CONTINUE
- 90 CONTINUE
- 100 CONTINUE
- C
- C FORM INVERSE(R) * CTRANS(INVERSE(R))
- C
- JJ = 0
- DO 130 J = 1, N
- J1 = JJ + 1
- JJ = JJ + J
- JM1 = J - 1
- K1 = 1
- KJ = J1
- IF (JM1 .LT. 1) GO TO 120
- DO 110 K = 1, JM1
- T = CONJG(AP(KJ))
- CALL CAXPY(K,T,AP(J1),1,AP(K1),1)
- K1 = K1 + K
- KJ = KJ + 1
- 110 CONTINUE
- 120 CONTINUE
- T = CONJG(AP(JJ))
- CALL CSCAL(J,T,AP(J1),1)
- 130 CONTINUE
- 140 CONTINUE
- RETURN
- END
- *DECK CPPFA
- SUBROUTINE CPPFA (AP, N, INFO)
- C***BEGIN PROLOGUE CPPFA
- C***PURPOSE Factor a complex Hermitian positive definite matrix stored
- C in packed form.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D2D1B
- C***TYPE COMPLEX (SPPFA-S, DPPFA-D, CPPFA-C)
- C***KEYWORDS LINEAR ALGEBRA, LINPACK, MATRIX FACTORIZATION, PACKED,
- C POSITIVE DEFINITE
- C***AUTHOR Moler, C. B., (U. of New Mexico)
- C***DESCRIPTION
- C
- C CPPFA factors a complex Hermitian positive definite matrix
- C stored in packed form.
- C
- C CPPFA is usually called by CPPCO, but it can be called
- C directly with a saving in time if RCOND is not needed.
- C (Time for CPPCO) = (1 + 18/N)*(Time for CPPFA) .
- C
- C On Entry
- C
- C AP COMPLEX (N*(N+1)/2)
- C the packed form of a Hermitian matrix A . The
- C columns of the upper triangle are stored sequentially
- C in a one-dimensional array of length N*(N+1)/2 .
- C See comments below for details.
- C
- C N INTEGER
- C the order of the matrix A .
- C
- C On Return
- C
- C AP an upper triangular matrix R , stored in packed
- C form, so that A = CTRANS(R)*R .
- C
- C INFO INTEGER
- C = 0 for normal return.
- C = K If the leading minor of order K is not
- C positive definite.
- C
- C
- C Packed Storage
- C
- C The following program segment will pack the upper
- C triangle of a Hermitian matrix.
- C
- C K = 0
- C DO 20 J = 1, N
- C DO 10 I = 1, J
- C K = K + 1
- C AP(K) = A(I,J)
- C 10 CONTINUE
- C 20 CONTINUE
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CDOTC
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CPPFA
- INTEGER N,INFO
- COMPLEX AP(*)
- C
- COMPLEX CDOTC,T
- REAL S
- INTEGER J,JJ,JM1,K,KJ,KK
- C***FIRST EXECUTABLE STATEMENT CPPFA
- JJ = 0
- DO 30 J = 1, N
- INFO = J
- S = 0.0E0
- JM1 = J - 1
- KJ = JJ
- KK = 0
- IF (JM1 .LT. 1) GO TO 20
- DO 10 K = 1, JM1
- KJ = KJ + 1
- T = AP(KJ) - CDOTC(K-1,AP(KK+1),1,AP(JJ+1),1)
- KK = KK + K
- T = T/AP(KK)
- AP(KJ) = T
- S = S + REAL(T*CONJG(T))
- 10 CONTINUE
- 20 CONTINUE
- JJ = JJ + J
- S = REAL(AP(JJ)) - S
- IF (S .LE. 0.0E0 .OR. AIMAG(AP(JJ)) .NE. 0.0E0) GO TO 40
- AP(JJ) = CMPLX(SQRT(S),0.0E0)
- 30 CONTINUE
- INFO = 0
- 40 CONTINUE
- RETURN
- END
- *DECK CPPSL
- SUBROUTINE CPPSL (AP, N, B)
- C***BEGIN PROLOGUE CPPSL
- C***PURPOSE Solve the complex Hermitian positive definite system using
- C the factors computed by CPPCO or CPPFA.
- C***LIBRARY SLATEC (LINPACK)
- C***CATEGORY D2D1B
- C***TYPE COMPLEX (SPPSL-S, DPPSL-D, CPPSL-C)
- C***KEYWORDS LINEAR ALGEBRA, LINPACK, MATRIX, PACKED,
- C POSITIVE DEFINITE, SOLVE
- C***AUTHOR Moler, C. B., (U. of New Mexico)
- C***DESCRIPTION
- C
- C CPPSL solves the complex Hermitian positive definite system
- C A * X = B
- C using the factors computed by CPPCO or CPPFA.
- C
- C On Entry
- C
- C AP COMPLEX (N*(N+1)/2)
- C the output from CPPCO or CPPFA.
- C
- C N INTEGER
- C the order of the matrix A .
- C
- C B COMPLEX(N)
- C the right hand side vector.
- C
- C On Return
- C
- C B the solution vector X .
- C
- C Error Condition
- C
- C A division by zero will occur if the input factor contains
- C a zero on the diagonal. Technically this indicates
- C singularity but it is usually caused by improper subroutine
- C arguments. It will not occur if the subroutines are called
- C correctly and INFO .EQ. 0 .
- C
- C To compute INVERSE(A) * C where C is a matrix
- C with P columns
- C CALL CPPCO(AP,N,RCOND,Z,INFO)
- C IF (RCOND is too small .OR. INFO .NE. 0) GO TO ...
- C DO 10 J = 1, P
- C CALL CPPSL(AP,N,C(1,J))
- C 10 CONTINUE
- C
- C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
- C Stewart, LINPACK Users' Guide, SIAM, 1979.
- C***ROUTINES CALLED CAXPY, CDOTC
- C***REVISION HISTORY (YYMMDD)
- C 780814 DATE WRITTEN
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE CPPSL
- INTEGER N
- COMPLEX AP(*),B(*)
- C
- COMPLEX CDOTC,T
- INTEGER K,KB,KK
- C***FIRST EXECUTABLE STATEMENT CPPSL
- KK = 0
- DO 10 K = 1, N
- T = CDOTC(K-1,AP(KK+1),1,B(1),1)
- KK = KK + K
- B(K) = (B(K) - T)/AP(KK)
- 10 CONTINUE
- DO 20 KB = 1, N
- K = N + 1 - KB
- B(K) = B(K)/AP(KK)
- KK = KK - K
- T = -B(K)
- CALL CAXPY(K-1,T,AP(KK+1),1,B(1),1)
- 20 CONTINUE
- RETURN
- END
- *DECK CPQR79
- SUBROUTINE CPQR79 (NDEG, COEFF, ROOT, IERR, WORK)
- C***BEGIN PROLOGUE CPQR79
- C***PURPOSE Find the zeros of a polynomial with complex coefficients.
- C***LIBRARY SLATEC
- C***CATEGORY F1A1B
- C***TYPE COMPLEX (RPQR79-S, CPQR79-C)
- C***KEYWORDS COMPLEX POLYNOMIAL, POLYNOMIAL ROOTS, POLYNOMIAL ZEROS
- C***AUTHOR Vandevender, W. H., (SNLA)
- C***DESCRIPTION
- C
- C Abstract
- C This routine computes all zeros of a polynomial of degree NDEG
- C with complex coefficients by computing the eigenvalues of the
- C companion matrix.
- C
- C Description of Parameters
- C The user must dimension all arrays appearing in the call list
- C COEFF(NDEG+1), ROOT(NDEG), WORK(2*NDEG*(NDEG+1))
- C
- C --Input--
- C NDEG degree of polynomial
- C
- C COEFF COMPLEX coefficients in descending order. i.e.,
- C P(Z)= COEFF(1)*(Z**NDEG) + COEFF(NDEG)*Z + COEFF(NDEG+1)
- C
- C WORK REAL work array of dimension at least 2*NDEG*(NDEG+1)
- C
- C --Output--
- C ROOT COMPLEX vector of roots
- C
- C IERR Output Error Code
- C - Normal Code
- C 0 means the roots were computed.
- C - Abnormal Codes
- C 1 more than 30 QR iterations on some eigenvalue of the
- C companion matrix
- C 2 COEFF(1)=0.0
- C 3 NDEG is invalid (less than or equal to 0)
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED COMQR, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 791201 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 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 911010 Code reworked and simplified. (RWC and WRB)
- C***END PROLOGUE CPQR79
- COMPLEX COEFF(*), ROOT(*), SCALE, C
- REAL WORK(*)
- INTEGER NDEG, IERR, K, KHR, KHI, KWR, KWI, KAD, KJ
- C***FIRST EXECUTABLE STATEMENT CPQR79
- IERR = 0
- IF (ABS(COEFF(1)) .EQ. 0.0) THEN
- IERR = 2
- CALL XERMSG ('SLATEC', 'CPQR79',
- + 'LEADING COEFFICIENT IS ZERO.', 2, 1)
- RETURN
- ENDIF
- C
- IF (NDEG .LE. 0) THEN
- IERR = 3
- CALL XERMSG ('SLATEC', 'CPQR79', 'DEGREE INVALID.', 3, 1)
- RETURN
- ENDIF
- C
- IF (NDEG .EQ. 1) THEN
- ROOT(1) = -COEFF(2)/COEFF(1)
- RETURN
- ENDIF
- C
- SCALE = 1.0E0/COEFF(1)
- KHR = 1
- KHI = KHR+NDEG*NDEG
- KWR = KHI+KHI-KHR
- KWI = KWR+NDEG
- C
- DO 10 K=1,KWR
- WORK(K) = 0.0E0
- 10 CONTINUE
- C
- DO 20 K=1,NDEG
- KAD = (K-1)*NDEG+1
- C = SCALE*COEFF(K+1)
- WORK(KAD) = -REAL(C)
- KJ = KHI+KAD-1
- WORK(KJ) = -AIMAG(C)
- IF (K .NE. NDEG) WORK(KAD+K) = 1.0E0
- 20 CONTINUE
- C
- CALL COMQR (NDEG,NDEG,1,NDEG,WORK(KHR),WORK(KHI),WORK(KWR),
- 1 WORK(KWI),IERR)
- C
- IF (IERR .NE. 0) THEN
- IERR = 1
- CALL XERMSG ('SLATEC', 'CPQR79',
- + 'NO CONVERGENCE IN 30 QR ITERATIONS.', 1, 1)
- RETURN
- ENDIF
- C
- DO 30 K=1,NDEG
- KM1 = K-1
- ROOT(K) = CMPLX(WORK(KWR+KM1),WORK(KWI+KM1))
- 30 CONTINUE
- RETURN
- END
- *DECK CPROC
- SUBROUTINE CPROC (ND, BD, NM1, BM1, NM2, BM2, NA, AA, X, Y, M, A,
- + B, C, D, W, YY)
- C***BEGIN PROLOGUE CPROC
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to CBLKTR
- C***LIBRARY SLATEC
- C***TYPE COMPLEX (CPROD-S, CPROC-C)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C PROC applies a sequence of matrix operations to the vector X and
- C stores the result in Y.
- C AA Array containing scalar multipliers of the vector X.
- C ND,NM1,NM2 are the lengths of the arrays BD,BM1,BM2 respectively.
- C BD,BM1,BM2 are arrays containing roots of certain B polynomials.
- C NA is the length of the array AA.
- C X,Y The matrix operations are applied to X and the result is Y.
- C A,B,C are arrays which contain the tridiagonal matrix.
- C M is the order of the matrix.
- C D,W are work arrays.
- C ISGN determines whether or not a change in sign is made.
- C
- C***SEE ALSO CBLKTR
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 801001 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900402 Added TYPE section. (WRB)
- C***END PROLOGUE CPROC
- C
- COMPLEX Y ,D ,W ,BD ,
- 1 CRT ,DEN ,Y1 ,Y2 ,
- 2 X ,A ,B ,C
- DIMENSION A(*) ,B(*) ,C(*) ,X(*) ,
- 1 Y(*) ,D(*) ,W(*) ,BD(*) ,
- 2 BM1(*) ,BM2(*) ,AA(*) ,YY(*)
- C***FIRST EXECUTABLE STATEMENT CPROC
- DO 101 J=1,M
- Y(J) = X(J)
- 101 CONTINUE
- MM = M-1
- ID = ND
- M1 = NM1
- M2 = NM2
- IA = NA
- 102 IFLG = 0
- IF (ID) 109,109,103
- 103 CRT = BD(ID)
- ID = ID-1
- C
- C BEGIN SOLUTION TO SYSTEM
- C
- D(M) = A(M)/(B(M)-CRT)
- W(M) = Y(M)/(B(M)-CRT)
- DO 104 J=2,MM
- K = M-J
- DEN = B(K+1)-CRT-C(K+1)*D(K+2)
- D(K+1) = A(K+1)/DEN
- W(K+1) = (Y(K+1)-C(K+1)*W(K+2))/DEN
- 104 CONTINUE
- DEN = B(1)-CRT-C(1)*D(2)
- IF (ABS(DEN)) 105,106,105
- 105 Y(1) = (Y(1)-C(1)*W(2))/DEN
- GO TO 107
- 106 Y(1) = (1.,0.)
- 107 DO 108 J=2,M
- Y(J) = W(J)-D(J)*Y(J-1)
- 108 CONTINUE
- 109 IF (M1) 110,110,112
- 110 IF (M2) 121,121,111
- 111 RT = BM2(M2)
- M2 = M2-1
- GO TO 117
- 112 IF (M2) 113,113,114
- 113 RT = BM1(M1)
- M1 = M1-1
- GO TO 117
- 114 IF (ABS(BM1(M1))-ABS(BM2(M2))) 116,116,115
- 115 RT = BM1(M1)
- M1 = M1-1
- GO TO 117
- 116 RT = BM2(M2)
- M2 = M2-1
- 117 Y1 = (B(1)-RT)*Y(1)+C(1)*Y(2)
- IF (MM-2) 120,118,118
- C
- C MATRIX MULTIPLICATION
- C
- 118 DO 119 J=2,MM
- Y2 = A(J)*Y(J-1)+(B(J)-RT)*Y(J)+C(J)*Y(J+1)
- Y(J-1) = Y1
- Y1 = Y2
- 119 CONTINUE
- 120 Y(M) = A(M)*Y(M-1)+(B(M)-RT)*Y(M)
- Y(M-1) = Y1
- IFLG = 1
- GO TO 102
- 121 IF (IA) 124,124,122
- 122 RT = AA(IA)
- IA = IA-1
- IFLG = 1
- C
- C SCALAR MULTIPLICATION
- C
- DO 123 J=1,M
- Y(J) = RT*Y(J)
- 123 CONTINUE
- 124 IF (IFLG) 125,125,102
- 125 RETURN
- END
- *DECK CPROCP
- SUBROUTINE CPROCP (ND, BD, NM1, BM1, NM2, BM2, NA, AA, X, Y, M, A,
- + B, C, D, U, YY)
- C***BEGIN PROLOGUE CPROCP
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to CBLKTR
- C***LIBRARY SLATEC
- C***TYPE COMPLEX (CPRODP-S, CPROCP-C)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C CPROCP applies a sequence of matrix operations to the vector X and
- C stores the result in Y.
- C
- C BD,BM1,BM2 are arrays containing roots of certain B polynomials.
- C ND,NM1,NM2 are the lengths of the arrays BD,BM1,BM2 respectively.
- C AA Array containing scalar multipliers of the vector X.
- C NA is the length of the array AA.
- C X,Y The matrix operations are applied to X and the result is Y.
- C A,B,C are arrays which contain the tridiagonal matrix.
- C M is the order of the matrix.
- C D,U are work arrays.
- C ISGN determines whether or not a change in sign is made.
- C
- C***SEE ALSO CBLKTR
- C***ROUTINES CALLED (NONE)
- C***REVISION HISTORY (YYMMDD)
- C 801001 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900402 Added TYPE section. (WRB)
- C***END PROLOGUE CPROCP
- C
- COMPLEX Y ,D ,U ,V ,
- 1 DEN ,BH ,YM ,AM ,
- 2 Y1 ,Y2 ,YH ,BD ,
- 3 CRT ,X ,A ,B ,C
- DIMENSION A(*) ,B(*) ,C(*) ,X(*) ,
- 1 Y(*) ,D(*) ,U(*) ,BD(*) ,
- 2 BM1(*) ,BM2(*) ,AA(*) ,YY(*)
- C***FIRST EXECUTABLE STATEMENT CPROCP
- DO 101 J=1,M
- Y(J) = X(J)
- 101 CONTINUE
- MM = M-1
- MM2 = M-2
- ID = ND
- M1 = NM1
- M2 = NM2
- IA = NA
- 102 IFLG = 0
- IF (ID) 111,111,103
- 103 CRT = BD(ID)
- ID = ID-1
- IFLG = 1
- C
- C BEGIN SOLUTION TO SYSTEM
- C
- BH = B(M)-CRT
- YM = Y(M)
- DEN = B(1)-CRT
- D(1) = C(1)/DEN
- U(1) = A(1)/DEN
- Y(1) = Y(1)/DEN
- V = C(M)
- IF (MM2-2) 106,104,104
- 104 DO 105 J=2,MM2
- DEN = B(J)-CRT-A(J)*D(J-1)
- D(J) = C(J)/DEN
- U(J) = -A(J)*U(J-1)/DEN
- Y(J) = (Y(J)-A(J)*Y(J-1))/DEN
- BH = BH-V*U(J-1)
- YM = YM-V*Y(J-1)
- V = -V*D(J-1)
- 105 CONTINUE
- 106 DEN = B(M-1)-CRT-A(M-1)*D(M-2)
- D(M-1) = (C(M-1)-A(M-1)*U(M-2))/DEN
- Y(M-1) = (Y(M-1)-A(M-1)*Y(M-2))/DEN
- AM = A(M)-V*D(M-2)
- BH = BH-V*U(M-2)
- YM = YM-V*Y(M-2)
- DEN = BH-AM*D(M-1)
- IF (ABS(DEN)) 107,108,107
- 107 Y(M) = (YM-AM*Y(M-1))/DEN
- GO TO 109
- 108 Y(M) = (1.,0.)
- 109 Y(M-1) = Y(M-1)-D(M-1)*Y(M)
- DO 110 J=2,MM
- K = M-J
- Y(K) = Y(K)-D(K)*Y(K+1)-U(K)*Y(M)
- 110 CONTINUE
- 111 IF (M1) 112,112,114
- 112 IF (M2) 123,123,113
- 113 RT = BM2(M2)
- M2 = M2-1
- GO TO 119
- 114 IF (M2) 115,115,116
- 115 RT = BM1(M1)
- M1 = M1-1
- GO TO 119
- 116 IF (ABS(BM1(M1))-ABS(BM2(M2))) 118,118,117
- 117 RT = BM1(M1)
- M1 = M1-1
- GO TO