PROGRAM SIMULTANEOUS_EQ_BY_LDL_DECOMPOSITION
C==================================================================
C SOLVE SIMULTANEOUS EQUATIONS [A]{X}={B} BY
C [A]=[L][D][L]TRANSPOSE DECOMPSITION
C SYMMETRY [A] NON-POSITIVE DIFINITE
C INPUT [A] ------------------------- SQUARE MATRIX
C OUTPUT [A] = UPPER TRIANGLE
C DIAGONAL OF [A] IS [D]
C [A]t-[D] = [L]TRANSPOSE
C MARCH 25, 2011 EIJI FUKUMORI
C==================================================================
IMPLICIT REAL*8(A-H,O-Z)
PARAMETER ( MXN=100 )
DIMENSION A(MXN,MXN), B(MXN)
C----------------------------------------------------------------
CALL INPUT( MXN, NNODE, A, B )
C----------------------------------------------------------------
OPEN ( 2, FILE='SOLUTION-BY-LDL.OUT', STATUS='UNKNOWN' )
C----------------------------------------------------------------
WRITE (2,*) 'SOLUTION OF SIMULTANEOUS EQUATIONS BY LDL'
WRITE (2,*) 'NUMBER OF DIMENSIONS=', NNODE
WRITE (2,*) 'MATRIX OF SIMULTANEOUS EQUATIONS'
WRITE (2,*) 'GIVEN MATRIX: FULL MATRIX [A]'
DO I = 1 , NNODE
WRITE (2,*) (A(I,J), J= 1 , NNODE)
END DO
WRITE (2,*)
WRITE (2,*) 'RIGHT HAND SIDE EQUATIONS {B}'
DO J = 1 , NNODE
WRITE(2,*) B(J)
END DO
C----------------------------------------------------------------
C------------- SOLUTION OF [A]{X}={B} BY [L][D][L]T DECOMP. ----
CALL DECOMPSQ ( MXN, NNODE, A )
CALL SYSDCPSQ ( MXN, NNODE, A, B )
C
WRITE (2,*)
WRITE (2,*) 'SOLUTION OF {X} BY [L][D][L]T DECOMPOSITION'
WRITE (2,*) 'FULL MATRIX CASE'
DO I = 1 , NNODE
WRITE (2,*) B(I)
END DO
C----------------------------------------------------------------
CLOSE (2)
STOP 'NORMAL TERMINATION'
END
C
C
SUBROUTINE SYSDCPSQ ( MXN, NNODE, A, B )
IMPLICIT REAL*8(A-H,O-Z)
DIMENSION A(MXN,MXN), B(MXN)
C
C======= STEP 1: SOLUTION OF [L]{X"}={B} [L]=LOWER [L]
C B(1) = B(1)
DO I = 2 , NNODE
SUM = 0.D0
DO J = 1, I-1
SUM = SUM + A(I,J)*B(J)
END DO
B(I) = B(I) - SUM
END DO
C
C======= STEP 2: [D]{X"'}={X"}
DO I = 1 , NNODE
B(I) = B(I) / A(I,I)
END DO
C
C======= STEP 3: [L]TRANSPOSE{X}={X"'} [L]TRANSPOSE = UPPER [L]
C B(NNODE) = B(NNODE)
DO I = NNODE-1, 1, -1
SUM = 0.D0
DO J = I+1 , NNODE
SUM = SUM + A(I,J)*B(J)
END DO
B(I) = B(I) - SUM
END DO
RETURN
END
C
C
SUBROUTINE DECOMPSQ ( MXN, NNODE, A )
IMPLICIT REAL*8(A-H,O-Z)
DIMENSION A(MXN,MXN)
C------- COMPUTATION OF UPPER L(I,J) --------
C-------I = 1
DO J = 2, NNODE
A(1,J) = A(1,J)/A(1,1)
END DO
C------ I >= 2
DO I = 2 , NNODE
SUM = 0.D0
DO M = 1, I-1
SUM = SUM + A(M,I)**2*A(M,M)
END DO
A(I,I) = A(I,I) - SUM
DO J = I+1, NNODE
SUM = 0.D0
DO M = 1, I-1
SUM = SUM + A(M,I)*A(M,J)*A(M,M)
END DO
A(I,J) = (A(I,J)-SUM)/A(I,I)
END DO
END DO
C ----------- MAKE LOWER [L] -----------
DO I = 1 , NNODE
DO J = I+1, NNODE
A(J,I) = A(I,J)
END DO
END DO
RETURN
END
C
C
SUBROUTINE INPUT( MXN, NNODE , A , B )
IMPLICIT REAL*8 ( A-H , O-Z )
DIMENSION A(MXN,MXN), B(MXN)
OPEN ( 1, FILE='SYSFULL.DAT', STATUS='UNKNOWN' )
READ (1,*) NNODE
DO I = 1 , NNODE
READ (1,*) (A(I,J),J=1,NNODE), B(I)
END DO
CLOSE (1)
RETURN
END