The TELEMAC-MASCARET system  trunk
sd_nnfc.f
Go to the documentation of this file.
1 ! ******************
2  SUBROUTINE sd_nnfc
3 ! ******************
4 !
5  &(n,r,c,ic,ia,ja,a,z,b,lmax,il,jl,ijl,l,d,umax,iu,ju,iju,u,
6  & row,tmp,irl,jrl,flag)
7 !
8 !***********************************************************************
9 ! BIEF V6P3 30/06/2013
10 !***********************************************************************
11 !
12 !brief NUMERICAL LDU-FACTORIZATION OF SPARSE NONSYMMETRIC MATRIX AND
13 !+ SOLUTION OF SYSTEM OF LINEAR EQUATIONS (COMPRESSED POINTER
14 !+ STORAGE)
15 !+
16 !+
17 !+ INPUT VARIABLES.. N, R, C, IC, IA, JA, A, B,
18 !+ IL, JL, IJL, LMAX, IU, JU, IJU, UMAX
19 !+ OUTPUT VARIABLES.. Z, L, D, U, FLAG
20 !+
21 !+ FIA \ ROW - HOLDS INTERMEDIATE VALUES IN CALCULATION OF U AND L.
22 !+ \ SIZE = N.
23 !+ FIA \ TMP - HOLDS NEW RIGHT-HAND SIDE B* FOR SOLUTION OF THE
24 !+ \ EQUATION UX = B*.
25 !+ \ SIZE = N.
26 !+
27 !+
28 !note IMPORTANT : INSPIRED FROM PACKAGE CMLIB3 - YALE UNIVERSITE-YSMP
29 !
30 ! DON'T HESITATE TO CHANGE IN/OUTPUT VARIABLES COMMENTS
31 ! FOR CLARITY
32 !
33 !history C. PEYRARD (LNHE)
34 !+ 30/06/13
35 !+ V6P3
36 !+
37 !
38 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
39 !| A |-->| NONZERO ENTRIES OF THE COEFFICIENT MATRIX M,
40 !| | | STORED BY ROWS
41 !| B |-->| RIGHT-HAND SIDE B ;
42 !| C |-->| ORDERING OF THE COLUMNS OF MATRIX
43 !| D |<--| DIAGONAL FACTORIZED OF MATRIX
44 !| FLAG |<--| INDICATOR ERROR :
45 !| | |= 4*N + 1:INSUFFICIENT STORAGE FOR L
46 !| | |= 7*N + 1:INSUFFICIENT STORAGE FOR U
47 !| IA, JA |-->| STRUCTURE OF A NONSYMMETRICAL MATRIX
48 !| IA, JA |-->| STRUCTURE OF A NONSYMMETRICAL MATRIX
49 !| IC |-->| INVERSE OF THE ORDERING OF THE COLUMNS OF MATRIX
50 !| IL, JL |-->| STRUCTURE OF LOWER FACTORISED TRIANGULAR MATRIX
51 !| IU, JU |-->| STRUCTURE OF UPPER FACTORISED TRIANGULAR MATRIX
52 !| IJU,IJL |-->| USED TO COMPRESS STORAGE OF JU and JL
53 !| IRL,JRL |-->| VECTORS USED TO FINDTHE ROWS OF L, AT THE kth STEP
54 !| L |<--| LOWER FACTORIZED TRIANGULAR MATRIX
55 !| LMAX |-->| PREVISIONAL MAXIMUM DIMENSION OF JL
56 !| N |-->| RANK OF MATRIX
57 !| R |-->| ORDERING OF THE ROWS OF MATRIX
58 !| ROW |---| REAL ONE-DIMENSIONAL WORK ARRAY
59 !| TMP |---| REAL ONE-DIMENSIONAL WORK ARRAY
60 !| U |<--| UPPER FACTORIZED TRIANGULAR MATRIX
61 !| UMAX |-->| PREVISIONAL MAXIMUM DIMENSION OF JU
62 !| Z |<--| SOLUTION X
63 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
64 !
66  IMPLICIT NONE
67 !
68 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
69 !
70 !
71 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
72 !
73  INTEGER RK,UMAX
74  INTEGER R(*), C(*), IC(*), IA(*), JA(*), IL(*), JL(*), IJL(*)
75  INTEGER IU(*), JU(*), IJU(*), IRL(*), JRL(*), FLAG
76  INTEGER N,K,I1,I,I2,JMIN,JMAX,J,MU,IJLB,LMAX
77  DOUBLE PRECISION A(*), L(*), D(*), U(*), Z(*), B(*), ROW(*)
78  DOUBLE PRECISION TMP(*), LKI, SOMME, DK
79 !
80 ! ****** INITIALIZE POINTERS AND TEST STORAGE ***********************
81 !
82  IF(il(n+1)-1 .GT. lmax) GO TO 104
83  IF(iu(n+1)-1 .GT. umax) GO TO 107
84  DO 1 k=1,n
85  irl(k) = il(k)
86  jrl(k) = 0
87  1 CONTINUE
88 !
89 ! ****** FOR EACH ROW ***********************************************
90  DO 19 k=1,n
91 ! ****** REVERSE JRL AND ZERO ROW WHERE KTH ROW OF L WILL FILL IN ***
92  row(k) = 0
93  i1 = 0
94  IF (jrl(k) .EQ. 0) GO TO 3
95  i = jrl(k)
96  2 i2 = jrl(i)
97  jrl(i) = i1
98  i1 = i
99  row(i) = 0
100  i = i2
101  IF (i .NE. 0) GO TO 2
102 ! ****** SET ROW TO ZERO WHERE U WILL FILL IN ***********************
103  3 jmin = iju(k)
104  jmax = jmin + iu(k+1) - iu(k) - 1
105  IF (jmin .GT. jmax) GO TO 5
106  DO 4 j=jmin,jmax
107  4 row(ju(j)) = 0
108 ! ****** PLACE KTH ROW OF A IN ROW **********************************
109  5 rk = r(k)
110  jmin = ia(rk)
111  jmax = ia(rk+1) - 1
112  DO 6 j=jmin,jmax
113  row(ic(ja(j))) = a(j)
114  6 CONTINUE
115 ! ****** INITIALIZE SOMME, AND LINK THROUGH JRL *********************
116  somme = b(rk)
117  i = i1
118  IF (i .EQ. 0) GO TO 10
119 ! ****** ASSIGN THE KTH ROW OF L AND ADJUST ROW, SOMME **************
120  7 lki = -row(i)
121 ! ****** IF L IS NOT REQUIRED, THEN COMMENT OUT THE FOLLOWING LINE **
122  l(irl(i)) = -lki
123  somme = somme + lki * tmp(i)
124  jmin = iu(i)
125  jmax = iu(i+1) - 1
126  IF (jmin .GT. jmax) GO TO 9
127  mu = iju(i) - jmin
128  DO 8 j=jmin,jmax
129  8 row(ju(mu+j)) = row(ju(mu+j)) + lki * u(j)
130  9 i = jrl(i)
131  IF (i .NE. 0) GO TO 7
132 !
133 ! ****** ASSIGN KTH ROW OF U AND DIAGONAL D, SET TMP(K) *************
134  10 IF (row(k) .EQ. 0.0d0) GO TO 108
135  dk = 1.0d0 / row(k)
136  d(k) = dk
137  tmp(k) = somme * dk
138  IF (k .EQ. n) GO TO 19
139  jmin = iu(k)
140  jmax = iu(k+1) - 1
141  IF (jmin .GT. jmax) GO TO 12
142  mu = iju(k) - jmin
143  DO 11 j=jmin,jmax
144  11 u(j) = row(ju(mu+j)) * dk
145  12 CONTINUE
146 !
147 ! ****** UPDATE IRL AND JRL, KEEPING JRL IN DECREASING ORDER ********
148  i = i1
149  IF (i .EQ. 0) GO TO 18
150  14 irl(i) = irl(i) + 1
151  i1 = jrl(i)
152  IF (irl(i) .GE. il(i+1)) GO TO 17
153  ijlb = irl(i) - il(i) + ijl(i)
154  j = jl(ijlb)
155  15 IF (i .GT. jrl(j)) GO TO 16
156  j = jrl(j)
157  GO TO 15
158  16 jrl(i) = jrl(j)
159  jrl(j) = i
160  17 i = i1
161  IF (i .NE. 0) GO TO 14
162  18 IF (irl(k) .GE. il(k+1)) GO TO 19
163  j = jl(ijl(k))
164  jrl(k) = jrl(j)
165  jrl(j) = k
166  19 CONTINUE
167 !
168 ! ****** SOLVE UX = TMP BY BACK SUBSTITUTION **********************
169  k = n
170  DO 22 i=1,n
171  somme = tmp(k)
172  jmin = iu(k)
173  jmax = iu(k+1) - 1
174  IF (jmin .GT. jmax) GO TO 21
175  mu = iju(k) - jmin
176  DO 20 j=jmin,jmax
177  20 somme = somme - u(j) * tmp(ju(mu+j))
178  21 tmp(k) = somme
179  z(c(k)) = somme
180  22 k = k-1
181  flag = 0
182  RETURN
183 !
184 ! ** ERROR.. INSUFFICIENT STORAGE FOR L
185  104 flag = 4*n + 1
186  RETURN
187 ! ** ERROR.. INSUFFICIENT STORAGE FOR U
188  107 flag = 7*n + 1
189  RETURN
190 ! ** ERROR.. ZERO PIVOT
191  108 flag = 8*n + k
192  RETURN
193  END
subroutine sd_nnfc(N, R, C, IC, IA, JA, A, Z, B, LMAX, IL, JL, IJL, L, D, UMAX, IU, JU, IJU, U, ROW, TMP, IRL, JRL, FLAG)
Definition: sd_nnfc.f:8