C C*********************************************************************** C COPYRIGHT ATLANTIC RICHFIELD COMPANY 1991 * C*********************************************************************** CTITLESASYMIV -- PERFORM SYMMETRIC MATRIX INVERSE 00010001 CA AUTHOR B. S. BOK 00030001 CA DESIGNER B. S. BOK 00040001 CA LANGUAGE FORTRAN 00050001 CA SYSTEM IBM / CRAY 00060004 CA WRITTEN AUGUST, 1990 00070001 C REVISED 12-21-91 JJC - MODIFIED TO MEET EDP STANDARDS. C CA 00150001 CA CALL SASYMIV (A, NN, N, B, IERR) CA 00180000 CA INPUT A = COLUMN-WISE INPUT ARRAY (SIZE OF NN) R4 00190003 CA INPUT NN = NO. OF DATA IN ARRAYS I4 00200003 CA INPUT N = NO. OF COLUMNS OR ROWS I4 00210003 CA OUTPUT B = COLUMN-WISE OUTPUT ARRAY (SIZE OF NN) R4 00200003 CA OUTPUT IERR = ERROR CODE (0 => NORMAL RETURN I4 00210003 CA 9 => ABNORMAL RETURN ) CA 00350000 CA THIS ROUTINE PERFORMS SYMMETRIC MATRIX INVERSE 00360001 CA 00510000 C************************************************************** C * C SUBROUTINES AND FUNCTIONS CALLED FROM THIS ROUTINE * C * C NO SUBROUTINES OR FUNCTIONS CALLED FROM THIS PROGRAM UNIT * C * C************************************************************** C SUBROUTINE SASYMIV(A, NN, N, B, IERR) C IMPLICIT INTEGER (A-Z) C DIMENSION A(1), B(1) DOUBLE PRECISION EK C REAL A REAL B REAL ZERO C DATA ZERO /1.0E-30/ C C IERR = 0 DO 100 I = 1, NN B(I) = 0.0 100 CONTINUE IF (A(1) .GT. (-ZERO ) .AND. A(1) .LT. ZERO) THEN IERR = 9 RETURN ENDIF B(1) = 1. / A(1) IF (NN .EQ. 1) RETURN CC DO 4 I = 2, NN CC 4 B(I) = 0. MM = 1 KN = 0 DO 240 M = 2, N K = M - 1 MM = MM + N + 1 KN = KN + N EK = A(MM) MI = M - N DO 140 I = 1, K MI = MI + N IJ = I - N JM = KN DO 120 J = 1, K IJ = IJ + N JM = JM + 1 EK = EK - A(MI) * B(IJ) * A(JM) 120 CONTINUE 140 CONTINUE CC B(MM) = 1./EK IF (EK .NE. 0.0) B(MM) = 1. / EK IF (EK .EQ. 0.0) B(MM) = 0.000 MI = M - N IM = KN DO 180 I = 1, K IM = IM + 1 IJ = I - N JM = KN DO 160 J = 1, K IJ = IJ + N JM = JM + 1 B(IM) = B(IM) - B(IJ) * A(JM) * B(MM) 160 CONTINUE MI = MI + N B(MI) = B(IM) 180 CONTINUE IM = KN DO 220 I = 1, K IM = IM + 1 MJ = M - N IJ = I - N DO 200 J = 1, K MJ = MJ + N IJ = IJ + N B(IJ) = B(IJ) + B(IM) * B(MJ) * EK 200 CONTINUE 220 CONTINUE 240 CONTINUE C RETURN END