The TELEMAC-MASCARET system  trunk
sd_md.f
Go to the documentation of this file.
1 ! ****************
2  SUBROUTINE sd_md
3 ! ****************
4 !
5  &(n,ia,ja,maxu,v,l,head,last,next,mark,flag)
6 !
7 !***********************************************************************
8 ! BIEF V6P2 21/07/2011
9 !***********************************************************************
10 !
11 !brief MINIMUM DEGREE ALGORITHM (BASED ON ELEMENT MODEL).
12 !+
13 !+ MD FINDS A MINIMUM DEGREE ORDERING OF THE ROWS AND
14 !+ COLUMNS OF A SYMMETRICAL MATRIX M STORED IN (IA,JA,A) FORMAT.
15 !code
16 !+ PARAMETERS
17 !+
18 !+ MAX - DECLARED DIMENSION OF THE ONE-DIMENSIONAL ARRAYS V AND L;
19 !+ MAX MUST BE AT LEAST N+2K, WHERE K IS THE NUMBER OF
20 !+ NONZEROES IN THE STRICT UPPER TRIANGLE OF M
21 !+
22 !+ V - INTEGER ONE-DIMENSIONAL WORK ARRAY; DIMENSION = MAX
23 !+
24 !+ L - INTEGER ONE-DIMENSIONAL WORK ARRAY; DIMENSION = MAX
25 !+
26 !+ HEAD - INTEGER ONE-DIMENSIONAL WORK ARRAY; DIMENSION = N
27 !+
28 !+ LAST - INTEGER ONE-DIMENSIONAL ARRAY USED TO RETURN THE PERMUTATION
29 !+ OF THE ROWS AND COLUMNS OF M CORRESPONDING TO THE MINIMUM
30 !+ DEGREE ORDERING; DIMENSION = N
31 !+
32 !+ NEXT - INTEGER ONE-DIMENSIONAL ARRAY USED TO RETURN THE INVERSE OF
33 !+ THE PERMUTATION RETURNED IN LAST; DIMENSION = N
34 !+
35 !+ MARK - INTEGER ONE-DIMENSIONAL WORK ARRAY (MAY BE THE SAME AS V);
36 !+ DIMENSION = N
37 !+
38 !+ FLAG - INTEGER ERROR FLAG; VALUES AND THEIR MEANINGS ARE -
39 !+ 0 NO ERRORS DETECTED
40 !+ 11N+1 INSUFFICIENT STORAGE IN MD
41 !+
42 !+
43 !+ DEFINITIONS OF INTERNAL PARAMETERS
44 !+
45 !+ ---------+---------------------------------------------------------
46 !+ V(S) \ VALUE FIELD OF LIST ENTRY
47 !+ ---------+---------------------------------------------------------
48 !+ L(S) \ LINK FIELD OF LIST ENTRY (0 => END OF LIST)
49 !+ ---------+---------------------------------------------------------
50 !+ L(VI) \ POINTER TO ELEMENT LIST OF UNELIMINATED VERTEX VI
51 !+ ---------+---------------------------------------------------------
52 !+ L(EJ) \ POINTER TO BOUNDARY LIST OF ACTIVE ELEMENT EJ
53 !+ ---------+---------------------------------------------------------
54 !+ HEAD(D) \ VJ => VJ HEAD OF D-LIST D
55 !+ \ 0 => NO VERTEX IN D-LIST D
56 !+ \ VI UNELIMINATED VERTEX
57 !+ \ VI IN EK \ VI NOT IN EK
58 !+ ---------+-----------------------------+---------------------------
59 !+ NEXT(VI) \ UNDEFINED BUT NONNEGATIVE \ VJ => VJ NEXT IN D-LIST
60 !+ \ \ 0 => VI TAIL OF D-LIST
61 !+ ---------+-----------------------------+---------------------------
62 !+ LAST(VI) \ (NOT SET UNTIL MDP) \ -D => VI HEAD OF D-LIST D
63 !+ \-VK => COMPUTE DEGREE \ VJ => VJ LAST IN D-LIST
64 !+ \ EJ => VI PROTOTYPE OF EJ \ 0 => VI NOT IN ANY D-LIST
65 !+ \ 0 => DO NOT COMPUTE DEGREE \
66 !+ ---------+-----------------------------+---------------------------
67 !+ MARK(VI) \ MARK(VK) \ NONNEGATIVE TAG < MARK(VK)
68 !+
69 !+
70 !+ \ VI ELIMINATED VERTEX
71 !+ \ EI ACTIVE ELEMENT \ OTHERWISE
72 !+ ---------+-----------------------------+---------------------------
73 !+ NEXT(VI) \ -J => VI WAS J-TH VERTEX \ -J => VI WAS J-TH VERTEX
74 !+ \ TO BE ELIMINATED \ TO BE ELIMINATED
75 !+ ---------+-----------------------------+---------------------------
76 !+ LAST(VI) \ M => SIZE OF EI = M \ UNDEFINED
77 !+ ---------+-----------------------------+---------------------------
78 !+ MARK(VI) \ -M => OVERLAP COUNT OF EI \ UNDEFINED
79 !+ \ WITH EK = M \
80 !+ \ OTHERWISE NONNEGATIVE TAG \
81 !+ \ < MARK(VK) \
82 !
83 !note IMPORTANT : INSPIRED FROM PACKAGE CMLIB3 - YALE UNIVERSITE-YSMP
84 !
85 !history E. RAZAFINDRAKOTO (LNH)
86 !+ 20/11/06
87 !+ V5P7
88 !+
89 !
90 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
91 !+ 13/07/2010
92 !+ V6P0
93 !+ Translation of French comments within the FORTRAN sources into
94 !+ English comments
95 !
96 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
97 !+ 21/08/2010
98 !+ V6P0
99 !+ Creation of DOXYGEN tags for automated documentation and
100 !+ cross-referencing of the FORTRAN sources
101 !
102 !history U.H.MErkel
103 !+ 2012
104 !+ V6P2
105 !+ Changed MAX to MAXU for NAG Compiler
106 !
107 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
108 !| FLAG |<--| FLAG - INTEGER ERROR FLAG; VALUES AND THEIR
109 !| | | MEANINGS ARE : 0 NO ERRORS DETECTED
110 !| | | 11N+1 INSUFFICIENT STORAGE IN MD
111 !| HEAD |---| INTEGER ONE-DIMENSIONAL WORK ARRAY;DIMENSION=N
112 !| IA, JA |-->| SYMETRICAL COMPACT STORAGE OF MATRIX
113 !| L |---| INTEGER ONE-DIMENSIONAL WORK ARRAY;DIMENSION=MAX
114 !| LAST |---| INTEGER ONE-DIMENSIONAL ARRAY USED TO RETURN THE
115 !| | | PERMUTATION OF THE ROWS AND COLUMNS OF M
116 !| | | CORRESPONDING TO THE MINIMUM DEGREE ORDERING;
117 !| | | DIMENSION = N
118 !| MARK |---| INTEGER ONE-DIMENSIONAL WORK ARRAY;DIMENSION=N
119 !| MAXU |-->| DECLARED DIMENSION OF THE ONE-DIMENSIONAL ARRAYS
120 !| | | V AND L; MAX MUST BE AT LEAST N+2K, WHERE K IS
121 !| | | THE NUMBER OF NONZEROES IN THE STRICT UPPER
122 !| | | TRIANGLE OF M
123 !| N |-->| DIMENSION OF SYSTEM
124 !| NEXT |<--| INVERSE OF THE PERMUTATION RETURNED IN LAST
125 !| | | DIMENSION = N
126 !| V |---| INTEGER ONE-DIMENSIONAL WORK ARRAY;DIMENSION=MAX
127 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
128 !
129  USE bief, ex_sd_md => sd_md
130 !
132  IMPLICIT NONE
133 !
134 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
135 !
136  INTEGER, INTENT(IN) :: N,MAXU
137  INTEGER, INTENT(INOUT) :: IA(*),JA(*),V(maxu),L(maxu),HEAD(n)
138  INTEGER, INTENT(INOUT) :: LAST(n),NEXT(n),MARK(n),FLAG
139 !
140 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
141 !
142  INTEGER TAG,DMIN,VK,EK,TAIL,K
143  equivalence(vk,ek)
144 !
145 !-----------------------------------------------------------------------
146 !
147 !----INITIALISES
148 !
149  tag = 0
150  CALL sd_mdi(n,ia,ja,maxu,v,l,head,last,next,mark,tag,flag)
151  IF(flag.NE.0) RETURN
152 !
153  k = 0
154  dmin = 1
155 !
156 !----WHILE K
157 !
158 1 IF(k.GE.n) GO TO 4
159 !
160 !------SEARCHES FOR VERTEX OF MINIMUM DEGREE
161 !
162 2 IF(head(dmin).GT.0) GO TO 3
163  dmin = dmin + 1
164  GO TO 2
165 !
166 !------REMOVES VERTEX VK OF MINIMUM DEGREE FROM DEGREE LIST
167 !
168 3 vk = head(dmin)
169  head(dmin) = next(vk)
170  IF (head(dmin).GT.0) last(head(dmin)) = -dmin
171 !
172 !------NUMBERS VERTEX VK, ADJUSTS TAG, AND TAGS VK
173 !
174  k = k+1
175  next(vk) = -k
176  last(ek) = dmin - 1
177  tag = tag + last(ek)
178  mark(vk) = tag
179 !
180 !------FORMS ELEMENT EK FROM UNELIMINATED NEIGHBOURS OF VK
181 !
182  CALL sd_mdm(vk,tail,v,l,last,next,mark)
183 !
184 !------PURGES INACTIVE ELEMENTS AND DOES MASS ELIMINATION
185 !
186  CALL sd_mdp(k,ek,tail,v,l,head,last,next,mark)
187 !
188 !------UPDATES DEGREES OF UNELIMINATED VERTICES IN EK
189 !
190  CALL sd_mdu(ek,dmin,v,l,head,last,next,mark)
191 !
192  GO TO 1
193 !
194 !----GENERATES INVERSE PERMUTATION FROM PERMUTATION
195 !
196 4 DO k=1,n
197  next(k) = -next(k)
198  last(next(k)) = k
199  ENDDO ! K
200 !
201 !-----------------------------------------------------------------------
202 !
203  RETURN
204  END
subroutine sd_md(N, IA, JA, MAXU, V, L, HEAD, LAST, NEXT, MARK, FLAG)
Definition: sd_md.f:7
integer function next(ICOL, LIGNE)
Definition: next.f:7
subroutine sd_mdm(VK, TAIL, V, L, LAST, NEXT, MARK)
Definition: sd_mdm.f:7
subroutine sd_mdp(K, EK, TAIL, V, L, HEAD, LAST, NEXT, MARK)
Definition: sd_mdp.f:7
subroutine sd_mdi(N, IA, JA, MAXIMUM, V, L, HEAD, LAST, NEXT, MARK, TAG, FLAG)
Definition: sd_mdi.f:7
subroutine sd_mdu(EK, DMIN, V, L, HEAD, LAST, NEXT, MARK)
Definition: sd_mdu.f:7
Definition: bief.f:3