The TELEMAC-MASCARET system  trunk
sd_sro.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE sd_sro
3 ! *****************
4 !
5  &(n,ip,ia,ja,a,q,r,dflag)
6 !
7 !***********************************************************************
8 ! BIEF V6P1 21/07/2011
9 !***********************************************************************
10 !
11 !brief SYMMETRIC REORDERING OF SPARSE SYMMETRIC MATRIX.
12 !code
13 !+ THE NONZERO ENTRIES OF THE MATRIX M ARE ASSUMED TO BE STORED
14 !+ SYMMETRICALLY IN (IA,JA,A) FORMAT (I.E., NOT BOTH M(I,J) AND M(J,I)
15 !+ ARE STORED IF I NE J).
16 !+
17 !+ SRO DOES NOT REARRANGE THE ORDER OF THE ROWS, BUT DOES MOVE
18 !+ NONZEROES FROM ONE ROW TO ANOTHER TO ENSURE THAT IF M(I,J) WILL BE
19 !+ IN THE UPPER TRIANGLE OF M WITH RESPECT TO THE NEW ORDERING, THEN
20 !+ M(I,J) IS STORED IN ROW I (AND THUS M(J,I) IS NOT STORED); WHEREAS
21 !+ IF M(I,J) WILL BE IN THE STRICT LOWER TRIANGLE OF M, THEN M(J,I) IS
22 !+ STORED IN ROW J (AND THUS M(I,J) IS NOT STORED).
23 !
24 !note IMPORTANT: INSPIRED FROM PACKAGE CMLIB3 - YALE UNIVERSITE-YSMP
25 !
26 !history E. RAZAFINDRAKOTO (LNH)
27 !+ 20/11/06
28 !+ V5P7
29 !+
30 !
31 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
32 !+ 13/07/2010
33 !+ V6P0
34 !+ Translation of French comments within the FORTRAN sources into
35 !+ English comments
36 !
37 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
38 !+ 21/08/2010
39 !+ V6P0
40 !+ Creation of DOXYGEN tags for automated documentation and
41 !+ cross-referencing of the FORTRAN sources
42 !
43 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
44 !| A |---| NONZERO ELEMENT OF MATRIX
45 !| DFLAG |-->| LOGICAL VARIABLE; IF DFLAG = .TRUE., THEN
46 !| | | STORE NONZERO DIAGONAL ELEMENTS AT THE
47 !| | | BEGINNING OF THE ROW
48 !| IA |---| INTEGER ONE-DIMENSIONAL ARRAY CONTAINING
49 !| | | POINTERS TO DELIMIT ROWS IN JA AND A;
50 !| | | DIMENSION = N+1
51 !! IP |-->| INTEGER ONE-DIMENSIONAL ARRAY USED TO RETURN
52 !| | | THE INVERSE OF THE PERMUTATION RETURNED IN IP;
53 !| | | DIMENSION = N
54 !| JA |---| INTEGER ONE-DIMENSIONAL ARRAY CONTAINING THE
55 !| | | COLUMN INDICES CORRESPONDING TO THE ELEMENTS
56 !| | | OF A;
57 !| N |-->| DIMENSION = NUMBER OF
58 !| | | NONZERO ENTRIES IN THE UPPER TRIANGLE OF M
59 !| Q |<--| INTEGER ONE-DIMENSIONAL WORK ARRAY
60 !| R |<--| INTEGER ONE-DIMENSIONAL WORK ARRAY
61 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
62 !
63  USE bief, ex_sd_sro => sd_sro
64 !
66  IMPLICIT NONE
67 !
68 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
69 !
70  INTEGER, INTENT(IN) :: N
71  INTEGER, INTENT(IN) :: IP(*)
72  INTEGER, INTENT(INOUT) :: JA(*),R(*),Q(n),IA(*)
73  DOUBLE PRECISION, INTENT(INOUT) :: A(*)
74  LOGICAL, INTENT(IN) :: DFLAG
75 !
76 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
77 !
78  INTEGER I,J,K,JMIN,JMAX,ILAST,JDUMMY,JAK
79  DOUBLE PRECISION AK
80 !
81 !-----------------------------------------------------------------------
82 !
83 !--PHASE 1 -- FINDS ROW IN WHICH TO STORE EACH NONZERO
84 !----INITIALISES COUNT OF NONZEROES TO BE STORED IN EACH ROW
85 !
86  DO i=1,n
87  q(i) = 0
88  ENDDO
89 !
90 !----FOR EACH NONZERO ELEMENT A(J)
91 !
92  DO 3 i=1,n
93  jmin = ia(i)
94  jmax = ia(i+1) - 1
95  IF(jmin.GT.jmax) GO TO 3
96  DO 2 j=jmin,jmax
97 !
98 !--------FINDS ROW (=R(J)) AND COLUMN (=JA(J)) IN WHICH TO STORE A(J)
99 !
100  k = ja(j)
101  IF (ip(k).LT.ip(i)) ja(j) = i
102  IF (ip(k).GE.ip(i)) k = i
103  r(j) = k
104 !
105 !--------AND INCREMENTS COUNT OF NONZEROES (=Q(R(J)) IN THAT ROW
106 !
107  q(k) = q(k) + 1
108 2 CONTINUE
109 3 CONTINUE
110 !
111 !--PHASE 2 -- FINDS NEW IA AND PERMUTATION TO APPLY TO (JA,A)
112 !----DETERMINES POINTERS TO DELIMIT ROWS IN PERMUTED (JA,A)
113 !
114  DO 4 i=1,n
115  ia(i+1) = ia(i) + q(i)
116  q(i) = ia(i+1)
117 4 CONTINUE
118 !
119 !----DETERMINES WHERE EACH (JA(J),A(J)) IS STORED IN PERMUTED (JA,A)
120 !----FOR EACH NONZERO ELEMENT (IN REVERSE ORDER)
121 !
122  ilast = 0
123  jmin = ia(1)
124  jmax = ia(n+1) - 1
125  j = jmax
126  DO 6 jdummy=jmin,jmax
127  i = r(j)
128  IF(.NOT.dflag .OR. ja(j).NE.i .OR. i.EQ.ilast) GO TO 5
129 !
130 !------IF DFLAG, THEN PUTS DIAGONAL NONZERO AT BEGINNING OF ROW
131 !
132  r(j) = ia(i)
133  ilast = i
134  GO TO 6
135 !
136 !------PUTS (OFF-DIAGONAL) NONZERO IN LAST UNUSED LOCATION IN ROW
137 !
138 5 q(i) = q(i) - 1
139  r(j) = q(i)
140 !
141  j = j-1
142 6 CONTINUE
143 !
144 !--PHASE 3 -- PERMUTES (JA,A) TO UPPER TRIANGULAR FORM (WRT NEW ORDERING)
145 !
146  DO 8 j=jmin,jmax
147 7 IF (r(j).EQ.j) GO TO 8
148  k = r(j)
149  r(j) = r(k)
150  r(k) = k
151  jak = ja(k)
152  ja(k) = ja(j)
153  ja(j) = jak
154  ak = a(k)
155  a(k) = a(j)
156  a(j) = ak
157  GO TO 7
158 8 CONTINUE
159 !
160 !-----------------------------------------------------------------------
161 !
162  RETURN
163  END
subroutine sd_sro(N, IP, IA, JA, A, Q, R, DFLAG)
Definition: sd_sro.f:7
double precision function q(I)
Definition: q.f:7
Definition: bief.f:3