*DECK SPPFA SUBROUTINE SPPFA (AP, N, INFO) C***BEGIN PROLOGUE SPPFA C***PURPOSE Factor a real symmetric positive definite matrix stored in C packed form. C***LIBRARY SLATEC (LINPACK) C***CATEGORY D2B1B C***TYPE SINGLE PRECISION (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 SPPFA factors a real symmetric positive definite matrix C stored in packed form. C C SPPFA is usually called by SPPCO, but it can be called C directly with a saving in time if RCOND is not needed. C (Time for SPPCO) = (1 + 18/N)*(Time for SPPFA) . C C On Entry C C AP REAL (N*(N+1)/2) C the packed form of a symmetric 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 = TRANS(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 symmetric 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 SDOT 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 SPPFA INTEGER N,INFO REAL AP(*) C REAL SDOT,T REAL S INTEGER J,JJ,JM1,K,KJ,KK C***FIRST EXECUTABLE STATEMENT SPPFA 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) - SDOT(K-1,AP(KK+1),1,AP(JJ+1),1) KK = KK + K T = T/AP(KK) AP(KJ) = T S = S + T*T 10 CONTINUE 20 CONTINUE JJ = JJ + J S = AP(JJ) - S IF (S .LE. 0.0E0) GO TO 40 AP(JJ) = SQRT(S) 30 CONTINUE INFO = 0 40 CONTINUE RETURN END