The TELEMAC-MASCARET system  trunk
sd_odrv.f
Go to the documentation of this file.
1 ! ******************
2  SUBROUTINE sd_odrv
3 ! ******************
4 !
5  &(n,ia,ja,a,p,ip,nsp,isp,path,flag)
6 !
7 !***********************************************************************
8 ! BIEF V6P2 21/08/2010
9 !***********************************************************************
10 !
11 !brief DRIVER FOR SPARSE MATRIX REORDERING ROUTINE.
12 !code
13 !+ ODRV FINDS A MINIMUM DEGREE ORDERING OF THE ROWS AND COLUMNS OF A
14 !+ SYMMETRIC MATRIX M STORED IN (IA,JA,A) FORMAT (SEE BELOW). FOR THE
15 !+ REORDERED MATRIX, THE WORK AND STORAGE REQUIRED TO PERFORM GAUSSIAN
16 !+ ELIMINATION IS (USUALLY) SIGNIFICANTLY LESS.
17 !+
18 !+ IF ONLY THE NONZERO ENTRIES IN THE UPPER TRIANGLE OF M ARE BEING
19 !+ STORED, THEN ODRV SYMMETRICALLY REORDERS (IA,JA,A), (OPTIONALLY)
20 !+ WITH THE DIAGONAL ENTRIES PLACED FIRST IN EACH ROW. THIS IS TO
21 !+ ENSURE THAT IF M(I,J) WILL BE IN THE UPPER TRIANGLE OF M WITH
22 !+ RESPECT TO THE NEW ORDERING, THEN M(I,J) IS STORED IN ROW I (AND
23 !+ THUS M(J,I) IS NOT STORED); WHEREAS IF M(I,J) WILL BE IN THE
24 !+ STRICT LOWER TRIANGLE OF M, THEN M(J,I) IS STORED IN ROW J (AND
25 !+ THUS M(I,J) IS NOT STORED).
26 !+
27 !+
28 !+ STORAGE OF SPARSE MATRICES
29 !+
30 !+ THE NONZERO ENTRIES OF THE MATRIX M ARE STORED ROW-BY-ROW IN THE
31 !+ ARRAY A. TO IDENTIFY THE INDIVIDUAL NONZERO ENTRIES IN EACH ROW,
32 !+ WE NEED TO KNOW IN WHICH COLUMN EACH ENTRY LIES. THESE COLUMN
33 !+ INDICES ARE STORED IN THE ARRAY JA; I.E., IF A(K) = M(I,J), THEN
34 !+ JA(K) = J. TO IDENTIFY THE INDIVIDUAL ROWS, WE NEED TO KNOW WHERE
35 !+ EACH ROW STARTS. THESE ROW POINTERS ARE STORED IN THE ARRAY IA;
36 !+ I.E., IF M(I,J) IS THE FIRST NONZERO ENTRY (STORED) IN THE I-TH ROW
37 !+ AND A(K) = M(I,J), THEN IA(I) = K. MOREOVER, IA(N+1) POINTS TO
38 !+ THE FIRST LOCATION FOLLOWING THE LAST ELEMENT IN THE LAST ROW.
39 !+ THUS, THE NUMBER OF ENTRIES IN THE I-TH ROW IS IA(I+1) - IA(I),
40 !+ THE NONZERO ENTRIES IN THE I-TH ROW ARE STORED CONSECUTIVELY IN
41 !+
42 !+ A(IA(I)), A(IA(I)+1), ..., A(IA(I+1)-1),
43 !+
44 !+ AND THE CORRESPONDING COLUMN INDICES ARE STORED CONSECUTIVELY IN
45 !+
46 !+ JA(IA(I)), JA(IA(I)+1), ..., JA(IA(I+1)-1).
47 !+
48 !+ SINCE THE COEFFICIENT MATRIX IS SYMMETRIC, ONLY THE NONZERO ENTRIES
49 !+ IN THE UPPER TRIANGLE NEED BE STORED. FOR EXAMPLE, THE MATRIX
50 !+
51 !+ ( 1 0 2 3 0 )
52 !+ ( 0 4 0 0 0 )
53 !+ M = ( 2 0 5 6 0 )
54 !+ ( 3 0 6 7 8 )
55 !+ ( 0 0 0 8 9 )
56 !+
57 !+ COULD BE STORED AS
58 !+
59 !+ \ 1 2 3 4 5 6 7 8 9 10 11 12 13
60 !+ ---+--------------------------------------
61 !+ IA \ 1 4 5 8 12 14
62 !+ JA \ 1 3 4 2 1 3 4 1 3 4 5 4 5
63 !+ A \ 1 2 3 4 2 5 6 3 6 7 8 8 9
64 !+
65 !+ OR (SYMMETRICALLY) AS
66 !+
67 !+ \ 1 2 3 4 5 6 7 8 9
68 !+ ---+--------------------------
69 !+ IA \ 1 4 5 7 9 10
70 !+ JA \ 1 3 4 2 3 4 4 5 5
71 !+ A \ 1 2 3 4 5 6 7 8 9
72 !
73 !note IMPORTANT : INSPIRED FROM PACKAGE CMLIB3 - YALE UNIVERSITE-YSMP
74 !
75 !history E. RAZAFINDRAKOTO (LNH)
76 !+ 20/11/06
77 !+ V5P7
78 !+
79 !
80 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
81 !+ 13/07/2010
82 !+ V6P0
83 !+ Translation of French comments within the FORTRAN sources into
84 !+ English comments
85 !
86 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
87 !+ 21/08/2010
88 !+ V6P0
89 !+ Creation of DOXYGEN tags for automated documentation and
90 !+ cross-referencing of the FORTRAN sources
91 !
92 !history U.H.Merkel
93 !+ 2012
94 !+ V6P2
95 !+ Changed MAX to MAXU for NAG Compiler
96 !
97 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
98 !| A |<--| REAL ONE-DIMENSIONAL ARRAY CONTAINING THE
99 !| | | NONZERO ENTRIES IN (THE UPPER TRIANGLE OF) M,
100 !| | | STORED BY ROWS; DIMENSION =NUMBER OF NONZERO
101 !| | | ENTRIES IN (THE UPPER TRIANGLE OF) M
102 !| FLAG |<--| INTEGER ERROR FLAG; VALUES AND THEIR MEANINGS ARE -
103 !| | | 0 NO ERRORS DETECTED
104 !| | | 9N+K INSUFFICIENT STORAGE IN MD
105 !| | | 10N+1 INSUFFICIENT STORAGE IN ODRV
106 !| | | 11N+1 ILLEGAL PATH SPECIFICATION
107 !| IA |<--| INTEGER ONE-DIMENSIONAL ARRAY CONTAINING
108 !| | | POINTERS TO DELIMIT ROWS IN JA AND A;
109 !| | | DIMENSION = N+1
110 !| IP |<--| INTEGER ONE-DIMENSIONAL ARRAY USED TO RETURN
111 !| | | THE INVERSE OF THE PERMUTATION RETURNED IN P;
112 !| | | DIMENSION = N
113 !| ISP |<--| INTEGER ONE-DIMENSIONAL ARRAY USED FOR
114 !| | | WORKING STORAGE; DIMENSION = NSP
115 !| JA |<--| INTEGER ONE-DIMENSIONAL ARRAY CONTAINING THE
116 !| | | COLUMN INDICES CORRESPONDING TO THE ELEMENTS
117 !| | | OF A; DIMENSION = NUMBER OF NONZERO ENTRIES
118 !| | | IN (THE UPPER TRIANGLE OF) M
119 !| N |-->| ORDER OF THE MATRIX
120 !| NSP |-->| DECLARED DIMENSION OF THE ONE-DIMENSIONAL
121 !| | | ARRAY ISP; NSP MUST BE AT LEAST 3N+4K,
122 !| | | WHERE K IS THE NUMBER OF NONZEROES
123 !| | | IN THE STRICT UPPER TRIANGLE OF M
124 !| P |<--| INTEGER ONE-DIMENSIONAL ARRAY USED TO RETURN
125 !| | | THE PERMUTATION OF THE ROWS AND COLUMNS OF M
126 !| | | CORRESPONDING TO THE MINIMUM DEGREE ORDERING;
127 !| | | DIMENSION = N
128 !| PATH |-->| INTEGER PATH SPECIFICATION;
129 !| | | VALUES AND THEIR MEANINGS ARE -
130 !| | | 1 FIND MINIMUM DEGREE ORDERING ONLY
131 !| | | 2 FIND MINIMUM DEGREE ORDERING AND
132 !| | | REORDER SYMMETRICALLY
133 !| | | STORED MATRIX (USED WHEN ONLY THE NONZERO
134 !| | | ENTRIES IN THE UPPER TRIANGLE OF M ARE
135 !| | | BEING STORED)
136 !| | | 3 REORDER SYMMETRICALLY STORED MATRIX AS
137 !| | | SPECIFIED BY INPUT PERMUTATION (USED WHEN
138 !| | | AN ORDERING HAS ALREADY BEEN DETERMINED
139 !| | | AND ONLY THE NONZERO ENTRIES IN THE
140 !| | | UPPER TRIANGLE OF M ARE BEING STORED)
141 !| | | 4 SAME AS 2 BUT PUT DIAGONAL ENTRIES AT
142 !| | | START OF EACH ROW
143 !| | | 5 SAME AS 3 BUT PUT DIAGONAL ENTRIES AT
144 !| | | START OF EACH ROW
145 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
146 !
147  USE bief, ex_sd_odrv => sd_odrv
148 !
150  IMPLICIT NONE
151 !
152 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
153 !
154  INTEGER, INTENT(IN) :: N,NSP,PATH
155  INTEGER, INTENT(INOUT) :: FLAG
156  INTEGER, INTENT(INOUT) :: IA(n+1),JA(*),P(n)
157  INTEGER, INTENT(INOUT) :: IP(n),ISP(nsp)
158  DOUBLE PRECISION, INTENT(INOUT) :: A(*)
159 !
160 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
161 !
162  INTEGER V,L,HEAD,TMP,Q,NEXT,MAXU
163  LOGICAL DFLAG
164 !
165 !-----------------------------------------------------------------------
166 !
167 !----INITIALISES ERROR FLAG AND VALIDATES PATH SPECIFICATION
168 !
169  flag = 0
170  IF(path.LT.1.OR.5.LT.path) GO TO 111
171 !
172 !----ALLOCATES STORAGE AND FINDS MINIMUM DEGREE ORDERING
173 !
174  IF((path-1)*(path-2)*(path-4).NE.0) GO TO 1
175  maxu = (nsp-n)/2
176  v = 1
177  l = v + maxu
178  head = l + maxu
179  next = head + n
180  IF(maxu.LT.n) GO TO 110
181 !
182  CALL sd_md(n,ia,ja,maxu,isp(v),isp(l),isp(head),p,ip,isp(v),flag)
183 !
184  IF(flag.NE.0) GO TO 100
185 !
186 !----ALLOCATES STORAGE AND SYMMETRICALLY REORDERS MATRIX
187 !
188 1 IF ((path-2) * (path-3) * (path-4) * (path-5) .NE. 0) GO TO 2
189 !
190  tmp = (nsp+1) - n
191  q = tmp - (ia(n+1)-1)
192  IF (q.LT.1) GO TO 110
193 !
194  dflag = path.EQ.4 .OR. path.EQ.5
195  CALL sd_sro(n,ip,ia,ja,a,isp(tmp),isp(q),dflag)
196 !
197 2 RETURN
198 !
199 ! ** ERROR -- ERROR DETECTED IN MD
200 !
201 100 RETURN
202 !
203 ! ** ERROR -- INSUFFICIENT STORAGE
204 !
205 110 flag = 10*n + 1
206  RETURN
207 !
208 ! ** ERROR -- ILLEGAL PATH SPECIFIED
209 !
210 111 flag = 11*n + 1
211 !
212 !-----------------------------------------------------------------------
213 !
214  RETURN
215  END
subroutine sd_sro(N, IP, IA, JA, A, Q, R, DFLAG)
Definition: sd_sro.f:7
subroutine sd_md(N, IA, JA, MAXU, V, L, HEAD, LAST, NEXT, MARK, FLAG)
Definition: sd_md.f:7
subroutine sd_odrv(N, IA, JA, A, P, IP, NSP, ISP, PATH, FLAG)
Definition: sd_odrv.f:7
Definition: bief.f:3