The TELEMAC-MASCARET system  trunk
sd_mdp.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE sd_mdp
3 ! *****************
4 !
5  &(k,ek,tail,v,l,head,last,next,mark)
6 !
7 !***********************************************************************
8 ! BIEF V6P1 21/07/2011
9 !***********************************************************************
10 !
11 !brief PURGES INACTIVE ELEMENTS AND DOES MASS ELIMINATION.
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 !| EK |-->|
34 !| HEAD |---| INTEGER ONE-DIMENSIONAL WORK ARRAY;DIMENSION=N
35 !| K |-->|
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 !| TAIL |---|
45 !| V |---| INTEGER ONE-DIMENSIONAL WORK ARRAY;DIMENSION=MAX
46 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
47 !
48  USE bief, ex_sd_mdp => sd_mdp
49 !
51  IMPLICIT NONE
52 !
53 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
54 !
55  INTEGER, INTENT(IN) :: EK
56  INTEGER, INTENT(INOUT) :: K,TAIL,V(*),L(*),HEAD(*)
57  INTEGER, INTENT(INOUT) :: LAST(*),NEXT(*),MARK(*)
58 !
59 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
60 !
61  INTEGER TAG,FREE,ILI,VI,LVI,EVI,S,LS,ES,ILP,ILPMAX,I
62 !
63 !----INITIALISES TAG
64 !
65  tag = mark(ek)
66 !
67 !----FOR EACH VERTEX VI IN EK
68 !
69  ili = ek
70  ilpmax = last(ek)
71  IF(ilpmax.LE.0) GO TO 12
72  DO 11 ilp=1,ilpmax
73  i = ili
74  ili = l(i)
75  vi = v(ili)
76 !
77 !------REMOVES VI FROM DEGREE LIST
78 !
79  IF(last(vi).EQ.0) GO TO 3
80  IF(last(vi).GT.0) GO TO 1
81  head(-last(vi)) = next(vi)
82  GO TO 2
83 1 next(last(vi)) = next(vi)
84 2 IF(next(vi).GT.0) last(next(vi)) = last(vi)
85 !
86 !------REMOVES INACTIVE ITEMS FROM ELEMENT LIST OF VI
87 !
88 3 ls = vi
89 4 s = ls
90  ls = l(s)
91  IF(ls.EQ.0) GO TO 6
92  es = v(ls)
93  IF (mark(es).LT.tag) GO TO 5
94  free = ls
95  l(s) = l(ls)
96  ls = s
97 5 GO TO 4
98 !
99 !------IF VI IS INTERIOR VERTEX, THEN REMOVES FROM LIST AND ELIMINATES
100 !
101 6 lvi = l(vi)
102  IF(lvi.NE.0) GO TO 7
103  l(i) = l(ili)
104  ili = i
105 !
106  k = k+1
107  next(vi) = -k
108  last(ek) = last(ek) - 1
109  GO TO 11
110 !
111 !------ELSE ...
112 !--------CLASSIFIES VERTEX VI
113 !
114 7 IF (l(lvi).NE.0) GO TO 9
115  evi = v(lvi)
116  IF(next(evi).GE.0) GO TO 9
117  IF(mark(evi).LT.0) GO TO 8
118 !
119 !----------IF VI IS PROTOTYPE VERTEX, THEN MARKS AS SUCH, INITIALISES
120 !----------OVERLAP COUNT FOR CORRESPONDING ELEMENT, AND MOVES VI TO END
121 !----------OF BOUNDARY LIST
122 !
123  last(vi) = evi
124  mark(evi) = -1
125  l(tail) = ili
126  tail = ili
127  l(i) = l(ili)
128  ili = i
129  GO TO 10
130 !
131 !----------ELSE IF VI IS DUPLICATE VERTEX, THEN MARKS AS SUCH AND ADJUSTS
132 !----------OVERLAP COUNT FOR CORRESPONDING ELEMENT
133 !
134 8 last(vi) = 0
135  mark(evi) = mark(evi) - 1
136  GO TO 10
137 !
138 !----------ELSE MARKS VI TO COMPUTE DEGREE
139 !
140 9 last(vi) = -ek
141 !
142 !--------INSERTS EK IN ELEMENT LIST OF VI
143 !
144 10 v(free) = ek
145  l(free) = l(vi)
146  l(vi) = free
147 11 CONTINUE
148 !
149 !----TERMINATES BOUNDARY LIST
150 !
151 12 l(tail) = 0
152 !
153 !-----------------------------------------------------------------------
154 !
155  RETURN
156  END
integer function next(ICOL, LIGNE)
Definition: next.f:7
subroutine sd_mdp(K, EK, TAIL, V, L, HEAD, LAST, NEXT, MARK)
Definition: sd_mdp.f:7
Definition: bief.f:3