mirror of
https://git.planet-casio.com/Lephenixnoir/OpenLibm.git
synced 2025-01-01 06:23:39 +01:00
c977aa998f
Replace amos with slatec
270 lines
10 KiB
Fortran
270 lines
10 KiB
Fortran
*DECK DBNDAC
|
|
SUBROUTINE DBNDAC (G, MDG, NB, IP, IR, MT, JT)
|
|
C***BEGIN PROLOGUE DBNDAC
|
|
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 DOUBLE 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 DBNDAC 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 DBNDSL(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 DBNDAC 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 DBNDAC(...) Introduce new blocks of data.
|
|
C
|
|
C CALL DBNDSL(1,...)Compute solution vector and length of
|
|
C residual vector.
|
|
C
|
|
C CALL DBNDSL(2,...)Given any row vector H solve YR = H for the
|
|
C row vector Y.
|
|
C
|
|
C CALL DBNDSL(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 DBNDAC..
|
|
C
|
|
C The entire set of parameters for DBNDAC are
|
|
C
|
|
C Input.. All Type REAL variables are DOUBLE PRECISION
|
|
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 DBNDAC. Its subsequent value
|
|
C is controlled by DBNDAC to set up for the
|
|
C next call to DBNDAC.
|
|
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 DBNDAC. Its subsequent value is controlled
|
|
C by DBNDAC. 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.. All Type REAL variables are DOUBLE PRECISION
|
|
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 DBNDAC.
|
|
C
|
|
C IP,IR The values of these arguments are advanced by
|
|
C DBNDAC to be ready for storing and processing
|
|
C a new block of data in G(*,*).
|
|
C
|
|
C Description of calling sequence for DBNDSL..
|
|
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 DBNDSL are
|
|
C
|
|
C Input.. All Type REAL variables are DOUBLE PRECISION
|
|
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 DBNDAC.
|
|
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 DBNDSL prints an
|
|
C appropriate message. This condition is
|
|
C considered an error.
|
|
C
|
|
C Output.. All Type REAL variables are DOUBLE PRECISION
|
|
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 DBNDAC(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 DH12, 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 920501 Reformatted the REFERENCES section. (WRB)
|
|
C***END PROLOGUE DBNDAC
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
DIMENSION G(MDG,*)
|
|
C***FIRST EXECUTABLE STATEMENT DBNDAC
|
|
ZERO=0.D0
|
|
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', 'DBNDAC', '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 DH12 (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
|