GMFADS Subroutine

subroutine GMFADS(NN, A, NWK, MAXA)

Uses

  • proc~~gmfads~~UsesGraph proc~gmfads GMFADS module~real_precision REAL_PRECISION proc~gmfads->module~real_precision

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: NN
real(kind=R8), intent(inout) :: A(NWK)
integer, intent(in) :: NWK
integer, intent(in) :: MAXA(NN+1)

Variables

Type Visibility Attributes Name Initial
integer, public :: I
integer, public :: I0
integer, public :: I1
integer, public :: I2
integer, public :: I3
integer, public :: I4
integer, public :: J
integer, public :: J1
integer, public :: K
integer, public :: K1
integer, public :: K2
integer, public :: KH
integer, public :: KL
integer, public :: KN
integer, public :: KU
integer, public :: KZ
integer, public :: L
integer, public :: L1
integer, public :: L2
integer, public :: L3
integer, public :: M
integer, public :: M1
integer, public :: N1
integer, public :: NNN
real(kind=R8), public :: BET
real(kind=R8), public :: DEL
real(kind=R8), public :: DJ
real(kind=R8), public :: G
real(kind=R8), public :: GAM
real(kind=R8), public :: GAM1
real(kind=R8), public :: PHI
real(kind=R8), public :: THE
real(kind=R8), public :: THE1
real(kind=R8), public :: XT1
real(kind=R8), public :: XT2
real(kind=R8), public :: ZET
real(kind=R8), public :: ZET1

Source Code

      SUBROUTINE GMFADS(NN,A,NWK,MAXA)
C
C     This subroutine computes the LDU decomposition of a symmetric positive
C     definite matrix B where only the upper triangular skyline structure
C     is stored.  The decomposition is done by the Gill-Murray
C     strategy from P.E. Gill and W. Murray, Newton type Methods
C     for Unconstrained and Linearly Constrained Optimization,
C     Mathematical Programming, 7, 311-350 (1974) and gives an
C     approximate decomposition in the case of a nonpositive
C     definite or ill-conditioned matrix.
C
C     Input variables:
C
C        NN -- dimension of B.
C
C        A -- one dimensional real array containing the upper 
C             triangular skyline portion of a symmetric matrix B in
C             packed skyline storage format.
C
C        NWK -- number of elements in A.
C
C        MAXA -- an integer array of dimension NN+1 containing the 
C                locations of the diagonal elements of B in A.  
C                By convention, MAXA(NN+1)=NWK+1.  
C
C     Output variables:
C
C        A -- the upper triangular skyline portion of the LDU 
C             decomposition of the symmetric matrix B (or B + E if B
C             was not sufficiently positive definite).
C
C
C     No working storage is required by this routine.
C
C
      USE REAL_PRECISION
      INTEGER, INTENT(IN):: NN,NWK,MAXA(NN+1)
      REAL (KIND=R8), INTENT(IN OUT):: A(NWK)
      INTEGER:: I,I0,I1,I2,I3,I4,J,J1,K,K1,K2,KH,KL,KN,KU,KZ,L,L1,
     &   L2,L3,M,M1,N1,NNN
      REAL (KIND=R8):: BET,DEL,DJ,G,GAM,GAM1,PHI,
     &   THE,THE1,XT1,XT2,ZET,ZET1
      G=0.0
      GAM=0.0
      DO I=1,NN
         K=MAXA(I)
         G=G+A(K)*A(K)
         GAM1=ABS(A(K))
         IF(GAM1.GT.GAM)GAM=GAM1
      END DO
      ZET=0.0
      DO I=1,NN
         K=MAXA(I)
         K1=MAXA(I+1)-1
         K2=K1-K
         IF (K2.EQ.0) CYCLE
         L=K+1
         DO J=L,K1
            G=G+2.0*A(J)*A(J)
            ZET1=ABS(A(J))
            IF(ZET1.GT.ZET)ZET=ZET1
         END DO
      END DO
      ZET=ZET/NN
      DEL=EPSILON(1.0_R8)
      BET=DEL
      IF (ZET .GT. BET) BET=ZET
      IF (GAM .GT. BET) BET=GAM
      G=SQRT(G)
      IF (G .GT. 1.0) DEL=DEL*G
      DO I=1,NN
         N1=I-1
         KN=MAXA(I)
         KL=KN+1
         KU=MAXA(I+1)-1
         KH=KU-KL
         PHI=A(KN)
         IF (KH .GE. 0) THEN
           K1=KN+1
           K2=I
           DO J=K1,KU
              K2=K2-1
              KZ=MAXA(K2)
              PHI=PHI-A(J)*A(J)*A(KZ)
           END DO
         END IF
         PHI=ABS(PHI)
         L=I+1
         THE=0.0
         NNN=NN+1
         IF (L .NE. NNN) THEN
           DO J=L,NN
              L1=MAXA(J)
              L2=MAXA(J+1)
              L3=L2-L1-1
              M=J-I
              IF (L3 .LT. M) CYCLE
              M1=L1+M
              IF (N1 .NE. 0) THEN
                DO J1=1,N1
                  I0=MAXA(J1)
                  I1=MAXA(L)
                  I2=I-J1
                  I3=I1-KN-1
                  I4=J-J1
                  IF (I3 .LT. I2) CYCLE
                  IF (L3 .LT. I4) CYCLE
                  XT1=A(KN+I2)
                  XT2=A(L1+I4)
                  A(M1)=A(M1)-XT1*XT2*A(I0)
                END DO
              END IF
            THE1=ABS(A(M1))
            IF (THE .LT. THE1) THE=THE1
            END DO
         END IF
         THE=THE*THE/BET
         DJ=DEL
         IF (PHI .GT. DJ) DJ=PHI
         IF (THE .GT. DJ) DJ=THE
         A(KN)=DJ
         IF (L .EQ. NNN) CYCLE
         DO J=L,NN
            L1=MAXA(J)
            L2=MAXA(J+1)
            L3=L2-L1-1
            M=J-I
            IF (L3 .LT. M) CYCLE
            M1=L1+M
            A(M1)=A(M1)/A(KN)
         END DO
      END DO
      RETURN
      END SUBROUTINE GMFADS