Download choldc.eso

Back to the list

   1 : C CHOLDC    SOURCE    CHAT      06/03/29    21:16:29     5360           
   2 :       SUBROUTINE CHOLDC(NP,N,A,P,INVA,INVP,iarr)
   3 : C************************************************************************
   4 : C     
   5 : C PROJET            :  CASTEM 2000
   6 : C     
   7 : C NOM               :  CHOLDC 
   8 : C     
   9 : C DESCRIPTION       :  Appelle par RLECA1, RLENCF, RLENCO, RLEXCA.
  10 : C     
  11 : C LANGAGE           :  FORTRAN 77
  12 : C     
  13 : C AUTEUR            :  A. BECCANTINI
  14 : C     
  15 : C************************************************************************
  16 : C     
  17 : *
  18 : ***** CHOLESKY DECOMPOSITION OF A: A=L.TRANPOSE(L)
  19 : *     (FROM NUMERICAL RECIPIES)
  20 : *
  21 : *     INPUT 
  22 : *     A = SYMMETRIC AND POSITIVE DEFINITE MATRIX (ONLY THE UPPER
  23 : *         TRIANGLE IS NEEDED)
  24 : *     NP = PHYSICAL DIMENSION OF A
  25 : *     N  = DIMENSION OF THE SUBMATRIX TO DECOMPOSE
  26 : *     
  27 : *     OUTPUT
  28 : *     A = (LOWER TRIANGLE OF A CONTAIN L, EXCEPT THE DIAGONAL
  29 : *     P = IT STORES THE DIAGONAL OF L
  30 : *     INVA = UPPER TRIANGLE CONTAIN INV(A),
  31 : *            LOWER TRIANGLE CONTAIN INV(L), EXCEPT THE DIAGONAL
  32 : *     INVP = IT STORES THE DIAGONAL OF INV(L)
  33 : *     iarr = 0 NO PROBLEMS
  34 : *
  35 :       IMPLICIT INTEGER(I-N)
  36 :       INTEGER NP,N, iarr
  37 :       REAL*8 A(NP,NP),P(NP),INVA(NP,NP),INVP(NP)
  38 : *
  39 :       INTEGER I, J, K
  40 :       REAL*8 SUM
  41 :       iarr = 0 
  42 :       DO I = 1, N, 1
  43 :          DO J = I, N, 1
  44 :             SUM = A(I,J)
  45 :             DO K = I - 1, 1, -1
  46 :                SUM = SUM - A(I,K) * A (J,K)
  47 :             ENDDO
  48 :             IF ( I .EQ. J)THEN
  49 :                IF(SUM .LE. 0.00)THEN
  50 :                   iarr = 1
  51 :                   GOTO 9999
  52 :                ELSE
  53 :                   P(I) = SQRT(SUM)
  54 :                ENDIF
  55 :             ELSE
  56 :                A(J,I) = SUM / P(I)
  57 :             ENDIF
  58 :          ENDDO
  59 :       ENDDO
  60 : *
  61 : ***** WE COMPUTE INV(L) IN WE STORE IT INTO INVP AND ON THE
  62 : *     LOWER PART OF INVA
  63 : *
  64 :       DO J = 1, N, 1
  65 :          INVP(J) = 1.0D0 / P(J)
  66 :          DO I = J + 1, N, 1
  67 :             SUM = -1.0D0 * INVP(J) * A(I,J) 
  68 :             DO K = J+1, I-1, 1
  69 :                SUM = SUM - A(I,K) * INVA(K,J)
  70 :             ENDDO
  71 :             INVA(I,J) = SUM / P(I)
  72 :          ENDDO
  73 :       ENDDO
  74 : *
  75 : **** NOW WE COMPUTE INV(A)= TRANPOSE(INV(L)) . INV(L) 
  76 : *    AND WE STORE IT IN THE UPPER TRIANGLE OF INVA 
  77 : *     
  78 :       DO J = N, 1, -1
  79 :          SUM = INVP(J)**2
  80 :          DO K = J+1,N,1
  81 :             SUM = SUM + INVA(K,J)**2
  82 :          ENDDO
  83 :          INVA(J,J) = SUM
  84 :          DO I = J-1, 1, -1
  85 :             SUM = INVA(J,I) * INVP(J)
  86 :             DO K = J+1,N,1
  87 :                SUM = SUM + INVA(K,I) * INVA(K,J)
  88 :             ENDDO
  89 :             INVA(I,J) = SUM
  90 :          ENDDO
  91 :       ENDDO
  92 : *           
  93 :  9999 CONTINUE
  94 :       RETURN
  95 :       END
  96 :  
  97 :  
  98 :  
  99 :  

© Cast3M 2003 - All rights reserved.
Disclaimer