The TELEMAC-MASCARET system
trunk
sources
utils
bief
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
!
48
USE
declarations_special
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
declarations_special
Definition:
declarations_special.F:3
lubksb
subroutine lubksb(A, N, NP, INDX, B)
Definition:
lubksb.f:7