The TELEMAC-MASCARET system  trunk
sd_mdu.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE sd_mdu
3 ! *****************
4 !
5  &(ek,dmin,v,l,head,last,next,mark)
6 !
7 !***********************************************************************
8 ! BIEF V6P0 21/08/2010
9 !***********************************************************************
10 !
11 !brief UPDATES DEGREES OF UNELIMINATED VERTICES IN EK.
12 !
13 !note IMPORTANT : INSPIRED FROM PACKAGE CMLIB3 - YALE UNIVERSITE-YSMP
14 !
15 !history E. RAZAFINDRAKOTO (LNH)
16 !+ 20/11/06
17 !+ V5P7
18 !+
19 !
20 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
21 !+ 13/07/2010
22 !+ V6P0
23 !+ Translation of French comments within the FORTRAN sources into
24 !+ English comments
25 !
26 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
27 !+ 21/08/2010
28 !+ V6P0
29 !+ Creation of DOXYGEN tags for automated documentation and
30 !+ cross-referencing of the FORTRAN sources
31 !
32 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
33 !| DMIN |---|
34 !| EK |-->|
35 !| HEAD |---| INTEGER ONE-DIMENSIONAL WORK ARRAY;DIMENSION=N
36 !| L |<--| INTEGER ONE-DIMENSIONAL WORK ARRAY;DIMENSION=MAX
37 !| LAST |---| INTEGER ONE-DIMENSIONAL ARRAY USED TO RETURN THE
38 !| | | PERMUTATION OF THE ROWS AND COLUMNS OF M
39 !| | | CORRESPONDING TO THE MINIMUM DEGREE ORDERING;
40 !| | | DIMENSION = N
41 !| MARK |---| INTEGER ONE-DIMENSIONAL WORK ARRAY;DIMENSION=N
42 !| NEXT |---| INVERSE OF THE PERMUTATION RETURNED IN LAST
43 !| | | DIMENSION = N
44 !| V |-->| INTEGER ONE-DIMENSIONAL WORK ARRAY;DIMENSION=MAX
45 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
46 !
47  USE bief, ex_sd_mdu => sd_mdu
48 !
50  IMPLICIT NONE
51 !
52 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
53 !
54  INTEGER, INTENT(IN) :: EK,V(*),L(*)
55  INTEGER, INTENT(INOUT) :: DMIN,HEAD(*),LAST(*),NEXT(*),MARK(*)
56 !
57 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
58 !
59  INTEGER TAG,VI,EVI,DVI,S,VS,ES,B,VB,ILP,ILPMAX,BLP,BLPMAX,I
60  equivalence(vs,es)
61 !
62 !----INITIALISES TAG
63 !
64  tag = mark(ek) - last(ek)
65 !
66 !----FOR EACH VERTEX VI IN EK
67 !
68  i = ek
69  ilpmax = last(ek)
70  IF(ilpmax.LE.0) GO TO 11
71  DO 10 ilp=1,ilpmax
72  i = l(i)
73  vi = v(i)
74  IF (last(vi) < 0) GOTO 1
75  IF (last(vi) == 0) GOTO 10
76  IF (last(vi) > 0) GOTO 8
77 !
78 !------IF VI NEITHER PROTOTYPE NOR DUPLICATE VERTEX, THEN MERGES ELEMENTS
79 !------TO COMPUTE DEGREE
80 !
81 1 tag = tag + 1
82  dvi = last(ek)
83 !
84 !--------FOR EACH VERTEX/ELEMENT VS/ES IN ELEMENT LIST OF VI
85 !
86  s = l(vi)
87 2 s = l(s)
88  IF(s.EQ.0) GO TO 9
89  vs = v(s)
90  IF(next(vs).LT.0) GO TO 3
91 !
92 !----------IF VS IS UNELIMINATED VERTEX, THEN TAGS AND ADJUSTS DEGREE
93 !
94  mark(vs) = tag
95  dvi = dvi + 1
96  GO TO 5
97 !
98 !----------IF ES IS ACTIVE ELEMENT, THEN EXPANDS
99 !------------CHECK FOR OUTMATCHED VERTEX
100 !
101 3 IF(mark(es).LT.0) GO TO 6
102 !
103 !------------FOR EACH VERTEX VB IN ES
104 !
105  b = es
106  blpmax = last(es)
107  DO 4 blp=1,blpmax
108  b = l(b)
109  vb = v(b)
110 !
111 !--------------IF VB IS UNTAGGED, THEN TAGS AND ADJUSTS DEGREE
112 !
113  IF(mark(vb).GE.tag) GO TO 4
114  mark(vb) = tag
115  dvi = dvi + 1
116 4 CONTINUE
117 !
118 5 GO TO 2
119 !
120 !------ELSE IF VI IS OUTMATCHED VERTEX, THEN ADJUSTS OVERLAPS BUT DOES NOT
121 !------COMPUTE DEGREE
122 !
123 6 last(vi) = 0
124  mark(es) = mark(es) - 1
125 7 s = l(s)
126  IF(s.EQ.0) GO TO 10
127  es = v(s)
128  IF(mark(es).LT.0) mark(es) = mark(es) - 1
129  GO TO 7
130 !
131 !------ELSE IF VI IS PROTOTYPE VERTEX, THEN CALCULATES DEGREE BY
132 !------INCLUSION/EXCLUSION AND RESETS OVERLAP COUNT
133 !
134 8 evi = last(vi)
135  dvi = last(ek) + last(evi) + mark(evi)
136  mark(evi) = 0
137 !
138 !------INSERTS VI IN APPROPRIATE DEGREE LIST
139 !
140 9 next(vi) = head(dvi)
141  head(dvi) = vi
142  last(vi) = -dvi
143  IF(next(vi).GT.0) last(next(vi)) = vi
144  IF(dvi.LT.dmin) dmin = dvi
145 !
146 10 CONTINUE
147 !
148 11 CONTINUE
149 !
150 !-----------------------------------------------------------------------
151 !
152  RETURN
153  END
integer function next(ICOL, LIGNE)
Definition: next.f:7
subroutine sd_mdu(EK, DMIN, V, L, HEAD, LAST, NEXT, MARK)
Definition: sd_mdu.f:7
Definition: bief.f:3