The TELEMAC-MASCARET system  trunk
lubksb.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE lubksb
3 ! *****************
4 !
5  &(a,n,np,indx,b)
6 !
7 !***********************************************************************
8 ! BIEF V6P1 21/08/2010
9 !***********************************************************************
10 !
11 !brief SOLVES THE SET OF N LINEAR EQUATIONS A \ DELTA X = B
12 !+ HERE A IS INPUT, NOT AS THE MATRIX A BUT AS ITS LU
13 !+ FACTORISATION, GIVEN BY THE SUBROUTINE LUDCMP. INDX
14 !+ IS INPUT AS THE PERMUTATION VECTOR RETURNED BY LUDCMP.
15 !+ B(1:N) IS INPUT AS THE RIGHT-HAND SIDE VECTOR B, AND
16 !+ RETURNS WITH THE SOLUTION VECTOR X. A, N, NP, AND
17 !+ INDX ARE NOT MODIFIED BY THIS SUBROUTINE AND CAN BE LEFT
18 !+ IN PLACE FOR SUCCESSIVE CALLS WITH DIFFERENT RIGHT-HAND
19 !+ SIDES B. THIS ROUTINE TAKES INTO ACCOUNT THE POSSIBILITY
20 !+ THAT B WILL BEGIN WITH A LOT OF 0 ELEMENTS, SO IT IS
21 !+ EFFICIENT FOR USE IN MATRIX INVERSION.
22 !
23 !history CHUN WANG
24 !+ 28/07/2006
25 !+ V5P7
26 !+
27 !
28 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
29 !+ 13/07/2010
30 !+ V6P0
31 !+ Translation of French comments within the FORTRAN sources into
32 !+ English comments
33 !
34 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
35 !+ 21/08/2010
36 !+ V6P0
37 !+ Creation of DOXYGEN tags for automated documentation and
38 !+ cross-referencing of the FORTRAN sources
39 !
40 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
41 !| A |-->| MATRIX OF THE SYSTEM
42 !| B |<->| RIGHT-HAND SIDE, THEN SOLUTION
43 !| INDX |-->| ADDRESS IN RIGHT-HAND SIDE
44 !| N |-->| SIZE OF B
45 !| NP |-->| RANK OF MATRIX A
46 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
47 !
49  IMPLICIT NONE
50 !
51 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
52 !
53  INTEGER, INTENT(IN) :: N,NP
54  INTEGER, INTENT(IN) :: INDX(n)
55  DOUBLE PRECISION, INTENT(INOUT) :: B(n)
56  DOUBLE PRECISION, INTENT(IN) :: A(np,np)
57 !
58 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
59 !
60  INTEGER I,II,J,LL
61  DOUBLE PRECISION XSOM
62 !
63 !-----------------------------------------------------------------------
64 !
65  ii=0
66  ! WHEN II HAS A POSITIVE VALUE, IT WILL BECOME THE INDEX
67  ! OF THE FIRST NONVANISHING ELEMENT OF B.
68  ! DOES THE FORWARD SUBSTITUTION, EQUATION (2.3.6). THE ONLY
69  ! NEW WRINKLE IS TO UNSCRAMBLE THE PERMUTATION AS WE GO.
70 !
71  DO i=1,n
72  ll=indx(i)
73  xsom=b(ll)
74  b(ll)=b(i)
75  IF(ii.NE.0) THEN
76  DO j=ii,i-1
77  xsom=xsom-a(i,j)*b(j)
78  ENDDO
79  ELSEIF(xsom.NE.0.d0) THEN
80  ii=i
81  ! A NONZERO ELEMENT WAS ENCOUNTERED, SO FROM NOW ON
82  ! WILL HAVE TO DO THE SUMS IN THE ABOVE LOOP
83  ENDIF
84  b(i)=xsom
85  ENDDO
86  DO i=n,1,-1 ! DOES THE BACKSUBSTITUTION, EQUATION (2.3.7)
87  xsom=b(i)
88  DO j=i+1,n
89  xsom=xsom-a(i,j)*b(j)
90  ENDDO
91  b(i)=xsom/a(i,i) ! STORES A COMPONENT OF THE SOLUTION VECTOR X
92  ENDDO
93 !
94 !-----------------------------------------------------------------------
95 !
96  RETURN
97  END
subroutine lubksb(A, N, NP, INDX, B)
Definition: lubksb.f:7