The TELEMAC-MASCARET system  trunk
sd_sdrv.f
Go to the documentation of this file.
1 ! ******************
2  SUBROUTINE sd_sdrv
3 ! ******************
4 !
5  &(n,p,ip,ia,ja,a,b,z,nsp,isp,rsp,esp,path,flag)
6 !
7 !***********************************************************************
8 ! BIEF V6P2 21/08/2010
9 !***********************************************************************
10 !
11 !brief DRIVER FOR SPARSE MATRIX REORDERING ROUTINE.
12 !code
13 !+ SDRV SOLVES SPARSE SYMMETRIC POSITIVE DEFINITE SYSTEMS OF LINEAR
14 !+ EQUATIONS. THE SOLUTION PROCESS IS DIVIDED INTO THREE STAGES --
15 !+
16 !+ SSF - THE COEFFICIENT MATRIX M IS FACTORED SYMBOLICALLY TO
17 !+ DETERMINE WHERE FILLIN WILL OCCUR DURING THE NUMERIC
18 !+ FACTORIZATION.
19 !+
20 !+ SNF - M IS FACTORED NUMERICALLY INTO THE PRODUCT UT-D-U, WHERE
21 !+ D IS DIAGONAL AND U IS UNIT UPPER TRIANGULAR.
22 !+
23 !+ SNS - THE LINEAR SYSTEM MX = B IS SOLVED USING THE UT-D-U
24 !+ FACTORIZATION FROM SNF.
25 !+
26 !+ FOR SEVERAL SYSTEMS WITH THE SAME COEFFICIENT MATRIX, SSF AND SNF
27 !+ NEED BE DONE ONLY ONCE (FOR THE FIRST SYSTEM); THEN SNS IS DONE
28 !+ ONCE FOR EACH ADDITIONAL RIGHT-HAND SIDE. FOR SEVERAL SYSTEMS
29 !+ WHOSE COEFFICIENT MATRICES HAVE THE SAME NONZERO STRUCTURE, SSF
30 !+ NEED BE DONE ONLY ONCE (FOR THE FIRST SYSTEM); THEN SNF AND SNS
31 !+ ARE DONE ONCE FOR EACH ADDITIONAL SYSTEM.
32 !+
33 !+
34 !+ STORAGE OF SPARSE MATRICES
35 !+
36 !+ THE NONZERO ENTRIES OF THE MATRIX M ARE STORED ROW-BY-ROW IN THE
37 !+ ARRAY A. TO IDENTIFY THE INDIVIDUAL NONZERO ENTRIES IN EACH ROW,
38 !+ WE NEED TO KNOW IN WHICH COLUMN EACH ENTRY LIES. THESE COLUMN
39 !+ INDICES ARE STORED IN THE ARRAY JA; I.E., IF A(K) = M(I,J), THEN
40 !+ JA(K) = J. TO IDENTIFY THE INDIVIDUAL ROWS, WE NEED TO KNOW WHERE
41 !+ EACH ROW STARTS. THESE ROW POINTERS ARE STORED IN THE ARRAY IA;
42 !+ I.E., IF M(I,J) IS THE FIRST NONZERO ENTRY (STORED) IN THE I-TH ROW
43 !+ AND A(K) = M(I,J), THEN IA(I) = K. MOREOVER, IA(N+1) POINTS TO
44 !+ THE FIRST LOCATION FOLLOWING THE LAST ELEMENT IN THE LAST ROW.
45 !+ THUS, THE NUMBER OF ENTRIES IN THE I-TH ROW IS IA(I+1) - IA(I),
46 !+ THE NONZERO ENTRIES IN THE I-TH ROW ARE STORED CONSECUTIVELY IN
47 !+
48 !+ A(IA(I)), A(IA(I)+1), ..., A(IA(I+1)-1),
49 !+
50 !+ AND THE CORRESPONDING COLUMN INDICES ARE STORED CONSECUTIVELY IN
51 !+
52 !+ JA(IA(I)), JA(IA(I)+1), ..., JA(IA(I+1)-1).
53 !+
54 !+ SINCE THE COEFFICIENT MATRIX IS SYMMETRIC, ONLY THE NONZERO ENTRIES
55 !+ IN THE UPPER TRIANGLE NEED BE STORED, FOR EXAMPLE, THE MATRIX
56 !+
57 !+ ( 1 0 2 3 0 )
58 !+ ( 0 4 0 0 0 )
59 !+ M = ( 2 0 5 6 0 )
60 !+ ( 3 0 6 7 8 )
61 !+ ( 0 0 0 8 9 )
62 !+
63 !+ COULD BE STORED AS
64 !+
65 !+ \ 1 2 3 4 5 6 7 8 9 10 11 12 13
66 !+ ---+--------------------------------------
67 !+ IA \ 1 4 5 8 12 14
68 !+ JA \ 1 3 4 2 1 3 4 1 3 4 5 4 5
69 !+ A \ 1 2 3 4 2 5 6 3 6 7 8 8 9
70 !+
71 !+ OR (SYMMETRICALLY) AS
72 !+
73 !+ \ 1 2 3 4 5 6 7 8 9
74 !+ ---+--------------------------
75 !+ IA \ 1 4 5 7 9 10
76 !+ JA \ 1 3 4 2 3 4 4 5 5
77 !+ A \ 1 2 3 4 5 6 7 8 9 .
78 !+
79 !+
80 !+ REORDERING THE ROWS AND COLUMNS OF M
81 !+
82 !+ A SYMMETRIC PERMUTATION OF THE ROWS AND COLUMNS OF THE COEFFICIENT
83 !+ MATRIX M (E.G., WHICH REDUCES FILLIN OR ENHANCES NUMERICAL
84 !+ STABILITY) MUST BE SPECIFIED. THE SOLUTION Z IS RETURNED IN THE
85 !+ ORIGINAL ORDER.
86 !+
87 !+ TO SPECIFY THE TRIVIAL ORDERING (I.E., THE IDENTITY PERMUTATION),
88 !+ SET P(I) = IP(I) = I, I=1,...,N. IN THIS CASE, P AND IP CAN BE
89 !+ THE SAME ARRAY.
90 !+
91 !+ IF A NONTRIVIAL ORDERING (I.E., NOT THE IDENTITY PERMUTATION) IS
92 !+ SPECIFIED AND M IS STORED SYMMETRICALLY (I.E., NOT BOTH M(I,J) AND
93 !+ M(J,I) ARE STORED FOR I NE J), THEN ODRV SHOULD BE CALLED (WITH
94 !+ PATH = 3 OR 5) TO SYMMETRICALLY REORDER (IA,JA,A) BEFORE CALLING
95 !+ SDRV. THIS IS TO ENSURE THAT IF M(I,J) WILL BE IN THE UPPER
96 !+ TRIANGLE OF M WITH RESPECT TO THE NEW ORDERING, THEN M(I,J) IS
97 !+ STORED IN ROW I (AND THUS M(J,I) IS NOT STORED); WHEREAS IF M(I,J)
98 !+ WILL BE IN THE STRICT LOWER TRIANGLE OF M, THEN M(J,I) IS STORED IN
99 !+ ROW J (AND THUS M(I,J) IS NOT STORED).
100 !
101 !note IMPORTANT : INSPIRED FROM PACKAGE CMLIB3 - YALE UNIVERSITE-YSMP
102 !
103 !history E. RAZAFINDRAKOTO (LNH)
104 !+ 20/11/06
105 !+ V5P7
106 !+
107 !
108 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
109 !+ 13/07/2010
110 !+ V6P0
111 !+ Translation of French comments within the FORTRAN sources into
112 !+ English comments
113 !
114 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
115 !+ 21/08/2010
116 !+ V6P0
117 !+ Creation of DOXYGEN tags for automated documentation and
118 !+ cross-referencing of the FORTRAN sources
119 !
120 !history J-M HERVOUET (LNHE)
121 !+ 10/08/2012
122 !+ V6P2
123 !+ RATIO set to 1 and removed.
124 !+
125 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
126 !| A |<--| REAL ONE-DIMENSIONAL ARRAY CONTAINING THE
127 !| | | NONZERO ENTRIES IN (THE UPPER TRIANGLE OF) M,
128 !| | | STORED BY ROWS; DIMENSION =NUMBER OF NONZERO
129 !| | | ENTRIES IN (THE UPPER TRIANGLE OF) M
130 !| B |-->| REAL ONE-DIMENSIONAL ARRAY CONTAINING THE
131 !| | | RIGHT-HAND SIDE B; B AND Z CAN BE THE SAME ARRAY;
132 !| | | DIMENSION = N
133 !| ESP |<--| INTEGER VARIABLE; IF SUFFICIENT STORAGE WAS
134 !| | | AVAILABLE TO PERFORM THE SYMBOLIC
135 !| | | FACTORIZATION (SSF), THEN ESP IS SET TO
136 !| | | THE AMOUNT OF EXCESS STORAGE PROVIDED
137 !| | | (NEGATIVE IF INSUFFICIENT STORAGE WAS
138 !| | | AVAILABLE TO PERFORM THE NUMERIC
139 !| | | FACTORIZATION (SNF))
140 !| FLAG |<--| INTEGER ERROR FLAG; VALUES AND THEIR MEANINGS:
141 !| | | 0 NO ERRORS DETECTED
142 !| | | 2N+K DUPLICATE ENTRY IN A -- ROW = K
143 !| | | 6N+K INSUFFICIENT STORAGE IN SSF -- ROW = K
144 !| | | 7N+1 INSUFFICIENT STORAGE IN SNF
145 !| | | 8N+K ZERO PIVOT -- ROW = K
146 !| | | 10N+1 INSUFFICIENT STORAGE IN SDRV
147 !| | | 11N+1 ILLEGAL PATH SPECIFICATION
148 !| IA |<--| INTEGER ONE-DIMENSIONAL ARRAY CONTAINING
149 !| | | POINTERS TO DELIMIT ROWS IN JA AND A;
150 !| | | DIMENSION = N+1
151 !| IP |<--| INTEGER ONE-DIMENSIONAL ARRAY USED TO RETURN
152 !| | | THE INVERSE OF THE PERMUTATION RETURNED IN P;
153 !| | | DIMENSION = N
154 !| ISP |<--| INTEGER ONE-DIMENSIONAL ARRAY USED FOR
155 !| | | WORKING STORAGE; DIMENSION = NSP
156 !| JA |<--| INTEGER ONE-DIMENSIONAL ARRAY CONTAINING THE
157 !| | | COLUMN INDICES CORRESPONDING TO THE ELEMENTS
158 !| | | OF A; DIMENSION = NUMBER OF NONZERO ENTRIES
159 !| | | IN (THE UPPER TRIANGLE OF) M
160 !| N |-->| ORDER OF THE MATRIX
161 !| NSP |-->| DECLARED DIMENSION OF THE ONE-DIMENSIONAL
162 !| | | ARRAY ISP; NSP MUST BE AT LEAST 3N+4K,
163 !| | | WHERE K IS THE NUMBER OF NONZEROES
164 !| | | IN THE STRICT UPPER TRIANGLE OF M
165 !| P |<--| INTEGER ONE-DIMENSIONAL ARRAY USED TO RETURN
166 !| | | THE PERMUTATION OF THE ROWS AND COLUMNS OF M
167 !| | | CORRESPONDING TO THE MINIMUM DEGREE ORDERING;
168 !| | | DIMENSION = N
169 !| PATH |-->| INTEGER PATH SPECIFICATION;
170 !| | | VALUES AND THEIR MEANINGS ARE -
171 !| | | 1 PERFORM SSF, SNF, AND SNS
172 !| | | 2 PERFORM SNF AND SNS (ISP/RSP IS ASSUMED
173 !| | | TO HAVE BEEN SET UP IN AN EARLIER CALL
174 !| | | TO SDRV (FOR SSF))
175 !| | | 3 PERFORM SNS ONLY (ISP/RSP IS ASSUMED
176 !| | | TO HAVE BEEN SET UP IN AN EARLIER CALL
177 !| | | TO SDRV (FOR SSF AND SNF))
178 !| | | 4 PERFORM SSF
179 !| | | 5 PERFORM SSF AND SNF
180 !| | | 6 PERFORM SNF ONLY (ISP/RSP IS ASSUMED TO
181 !| | | HAVE BEEN SET UP IN AN EARLIER CALL TO
182 !| | | SDRV (FOR SSF))
183 !| RSP |<--| REAL ONE-DIMENSIONAL ARRAY USED FOR WORKING
184 !| | | STORAGE; RSP AND ISP SHOULD BE EQUIVALENCED;
185 !| | | DIMENSION = NSP
186 !| Z |<--| REAL ONE-DIMENSIONAL ARRAY CONTAINING THE
187 !| | | SOLUTION X; Z AND B CAN BE THE SAME ARRAY;
188 !| | | DIMENSION = N
189 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
190 !
191  USE bief, ex_sd_sdrv => sd_sdrv
192 !
194  IMPLICIT NONE
195 !
196 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
197 !
198  INTEGER, INTENT(IN) :: N,NSP,PATH
199  INTEGER, INTENT(INOUT) :: FLAG,P(n),IP(*),IA(*),JA(*),ISP(*),ESP
200  DOUBLE PRECISION, INTENT(IN) :: B(n)
201  DOUBLE PRECISION, INTENT(INOUT) :: A(*),Z(n),RSP(nsp)
202 !
203 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
204 !
205  INTEGER Q,MARK,D,U,UMAX,IJU,IU,IL,JL,JU,JUMAX
206 !
207 !-----------------------------------------------------------------------
208 !
209 !----VALIDATES PATH SPECIFICATION
210 !
211  IF(path.LT.1.OR.6.LT.path) GO TO 111
212 !
213 !----ALLOCATES STORAGE AND FACTORS M SYMBOLICALLY TO DETERMINE FILL-IN
214 !
215  iju = 1
216  iu = iju + n
217  jl = iu + n+1
218  ju = jl + n
219  q = nsp+1 - n
220  mark = q - n
221  jumax = mark - ju
222 !
223  IF((path-1) * (path-4) * (path-5) .NE. 0) GO TO 1
224  IF(jumax.LE.0) GO TO 110
225  CALL sd_ssf(n,p,ip,ia,ja,isp(iju),isp(ju),isp(iu),jumax,
226  & isp(q),isp(mark),isp(jl),flag)
227  IF (flag.NE.0) GO TO 100
228 !
229 !----ALLOCATES STORAGE AND FACTORS M NUMERICALLY
230 !
231 1 CONTINUE
232  il = ju + isp(iju+n-1)
233  d = il + n
234  u = d + n
235  umax = (nsp+1) - u
236  esp = umax - (isp(iu+n)-1)
237 !
238  IF(path.NE.1.AND.path.NE.2.AND.
239  & path.NE.5.AND.path.NE.6) GO TO 2
240  IF (umax.LE.0) GO TO 110
241  CALL sd_snf(n,p,ip,ia,ja,a,
242  & rsp(d),isp(iju),isp(ju),isp(iu),rsp(u),umax,
243  & isp(il),isp(jl),flag)
244  IF(flag.NE.0) GO TO 100
245 !
246 !----SOLVES SYSTEM OF LINEAR EQUATIONS MX = B
247 !
248 2 IF((path-1) * (path-2) * (path-3) .NE. 0) GO TO 3
249  IF (umax.LE.0) GO TO 110
250  CALL sd_sns(n,p,rsp(d),isp(iju),isp(ju),
251  & isp(iu),rsp(u),z,b,rsp(il))
252 !
253 3 RETURN
254 !
255 ! ** ERROR -- ERROR DETECTED IN SSF, SNF, OR SNS
256 !
257 100 RETURN
258 !
259 ! ** ERROR -- INSUFFICIENT STORAGE
260 !
261 110 flag = 10*n + 1
262  RETURN
263 !
264 ! ** ERROR -- ILLEGAL PATH SPECIFICATION
265 !
266 111 flag = 11*n + 1
267 !
268 !-----------------------------------------------------------------------
269 !
270  RETURN
271  END
subroutine sd_snf(N, P, IP, IA, JA, A, D, IJU, JU, IU, U, UMAX, IL, JL, FLAG)
Definition: sd_snf.f:7
subroutine sd_sdrv(N, P, IP, IA, JA, A, B, Z, NSP, ISP, RSP, ESP, PATH, FLAG)
Definition: sd_sdrv.f:7
subroutine sd_sns(N, P, D, IJU, JU, IU, U, Z, B, TMP)
Definition: sd_sns.f:7
subroutine sd_ssf(N, P, IP, IA, JA, IJU, JU, IU, JUMAX, Q, MARK, JL, FLAG)
Definition: sd_ssf.f:7
Definition: bief.f:3