The TELEMAC-MASCARET system  trunk
sd_mdi.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE sd_mdi
3 ! *****************
4 !
5  &(n,ia,ja,maximum,v,l,head,last,next,mark,tag,flag)
6 !
7 !***********************************************************************
8 ! BIEF V6P2 21/08/2010
9 !***********************************************************************
10 !
11 !brief INITIALISES.
12 !
13 !note IMPORTANT: INSPIRED FROM PACKAGE CMLIB3 - YALE UNIVERSITE-YSMP
14 !
15 !history E. RAZAFINDRAKOTO (LNHE)
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 !history U.H.MErkel
33 !+ 2012
34 !+ V6P2
35 !+ Changed MAX to MAXIMUM for NAG Compiler
36 !
37 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
38 !| FLAG |<--| FLAG - INTEGER ERROR FLAG; VALUES AND THEIR
39 !| | | MEANINGS ARE : 0 NO ERRORS DETECTED
40 !| | | 9*N + VI INSUFFICIENT STORAGE IN MDI
41 !| HEAD |<--| INTEGER ONE-DIMENSIONAL WORK ARRAY;DIMENSION=N
42 !| IA, JA |-->| COMPACT STORAGE STRUCTURE OF MATRIX
43 !| L |---| INTEGER ONE-DIMENSIONAL WORK ARRAY;DIMENSION=MAX
44 !| LAST |---| INTEGER ONE-DIMENSIONAL ARRAY USED TO RETURN THE
45 !| | | PERMUTATION OF THE ROWS AND COLUMNS OF M
46 !| | | CORRESPONDING TO THE MINIMUM DEGREE ORDERING;
47 !| | | DIMENSION = N
48 !| MARK |---| INTEGER ONE-DIMENSIONAL WORK ARRAY;DIMENSION=N
49 !| MAXIMUM |-->| DECLARED DIMENSION OF THE ONE-DIMENSIONAL ARRAYS
50 !| | | V AND L;
51 !| N |-->| RANK OF MATRIX
52 !| NEXT |<--| INVERSE OF THE PERMUTATION RETURNED IN LAST
53 !| | | DIMENSION = N
54 !| TAG |-->| SEE DEFINITION IN INTERNAL PARAMATERS OF SD_MD.f
55 !| V |---| INTEGER ONE-DIMENSIONAL WORK ARRAY;DIMENSION=MAX
56 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
57 !
58  USE bief, ex_sd_mdi => sd_mdi
59 !
61  IMPLICIT NONE
62 !
63 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
64 !
65  INTEGER, INTENT(IN) :: N,MAXIMUM,IA(*),JA(*)
66  INTEGER, INTENT(INOUT) :: V(*),L(*),HEAD(*),LAST(*)
67  INTEGER, INTENT(INOUT) :: NEXT(*),MARK(*),TAG,FLAG
68 !
69 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
70 !
71  INTEGER SFS,VI,DVI,VJ,JMIN,JMAX,J
72 !
73 !----INITIALISES DEGREES, ELEMENT LISTS, AND DEGREE LISTS
74 !
75  DO vi=1,n
76  mark(vi) = 1
77  l(vi) = 0
78  head(vi) = 0
79  ENDDO ! VI
80  sfs = n+1
81 !
82 !----CREATES NONZERO STRUCTURE
83 !----FOR EACH NONZERO ENTRY A(VI,VJ) IN STRICT UPPER TRIANGLE
84 !
85  DO vi=1,n
86  jmin = ia(vi)
87  jmax = ia(vi+1) - 1
88  IF(jmin.GT.jmax) cycle
89  DO j=jmin,jmax
90  vj = ja(j)
91  IF(vi.GE.vj) cycle
92  IF(sfs.GE.maximum) GO TO 101
93 !
94 !------ENTERS VJ IN ELEMENT LIST FOR VI
95 !
96  mark(vi) = mark(vi) + 1
97  v(sfs) = vj
98  l(sfs) = l(vi)
99  l(vi) = sfs
100  sfs = sfs+1
101 !
102 !------ENTERS VI IN ELEMENT LIST FOR VJ
103 !
104  mark(vj) = mark(vj) + 1
105  v(sfs) = vi
106  l(sfs) = l(vj)
107  l(vj) = sfs
108  sfs = sfs+1
109  ENDDO ! J
110  ENDDO ! VI
111 !
112 !----CREATES DEGREE LISTS AND INITIALISES MARK VECTOR
113 !
114  DO vi=1,n
115  dvi = mark(vi)
116  next(vi) = head(dvi)
117  head(dvi) = vi
118  last(vi) = -dvi
119  IF(next(vi).GT.0) last(next(vi)) = vi
120  mark(vi) = tag
121  ENDDO ! VI
122 !
123  RETURN
124 !
125 ! ** ERROR -- INSUFFICIENT STORAGE
126 !
127 101 flag = 9*n + vi
128 !
129 !-----------------------------------------------------------------------
130 !
131  RETURN
132  END
integer function next(ICOL, LIGNE)
Definition: next.f:7
subroutine sd_mdi(N, IA, JA, MAXIMUM, V, L, HEAD, LAST, NEXT, MARK, TAG, FLAG)
Definition: sd_mdi.f:7
Definition: bief.f:3