ILUSOLVDS Subroutine

subroutine ILUSOLVDS(NN, Q, LENQ, ROWPOSP, COLPOSP, B)

Uses

  • proc~~ilusolvds~~UsesGraph proc~ilusolvds ILUSOLVDS module~real_precision REAL_PRECISION proc~ilusolvds->module~real_precision

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: NN
real(kind=R8), intent(in) :: Q(LENQ)
integer, intent(in) :: LENQ
integer, intent(in) :: ROWPOSP(NN+1)
integer, intent(in) :: COLPOSP(LENQ)
real(kind=R8), intent(inout) :: B(NN)

Variables

Type Visibility Attributes Name Initial
integer, public :: DIAG(NN)
integer, public :: I
integer, public :: K
integer, public :: J

Source Code

      SUBROUTINE ILUSOLVDS(NN, Q, LENQ, ROWPOSP, COLPOSP, B)
C
C     Computes Q^{-1}*B -- returns result as B.
C---------------------------------------------------------------------
C
C     Input variables:
C
C       Q        triangular factors of preconditioning matrix, stored
C                in the general sparse row scheme.
C       ROWPOSP  indices of row-starts within B.
C       COLPOSP  column indices for matrix B stored in the general
C                sparse row scheme.
C       NN       logical row dimension of Q.
C       LENQ     number of data entries in Q.
C       B        right hand side -- should have dimension NN.
C
C     Output variables:
C
C       B        solution of Qx = B.
C
C---------------------------------------------------------------------
C
      USE REAL_PRECISION
      INTEGER, INTENT(IN) ::  NN, LENQ, ROWPOSP(NN+1), COLPOSP(LENQ)
      REAL (KIND=R8), INTENT(IN) :: Q(LENQ) 
      REAL (KIND=R8), INTENT(IN OUT) :: B(NN)
C 
C LOCAL VARIABLES
      INTEGER:: DIAG(NN), I, K, J
C------------------------------------------------ COMPUTE B = INV(L)*B
      B(1) = B(1)/Q(1)
      DIAG(1) = 1
      DO  I = 2, NN
        K = ROWPOSP(I)
 42     J = COLPOSP(K)
        IF (J .LT. I) THEN
          B(I) = B(I) - Q(K)*B(J)
          K = K + 1
          GOTO 42
        ELSE 
          DIAG(I) = K
          B(I) = B(I)/Q(K)
        ENDIF
      END DO
C------------------------------------------------ COMPUTE B = INV(U)*B
      DO  I = NN-1, 1, -1
        DO  K = DIAG(I)+1, ROWPOSP(I+1)-1
          B(I) = B(I) - Q(K)*B(COLPOSP(K))
        END DO
      END DO
      RETURN
      END SUBROUTINE ILUSOLVDS