The TELEMAC-MASCARET system  trunk
sd_sns.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE sd_sns
3 ! *****************
4 !
5  &(n,p,d,iju,ju,iu,u,z,b,tmp)
6 !
7 !***********************************************************************
8 ! BIEF V6P1 21/08/2010
9 !***********************************************************************
10 !
11 !brief SOLUTION OF SPARSE SYMMETRICAL POSITIVE
12 !+ DEFINITE SYSTEM OF LINEAR EQUATIONS MX = B
13 !+ GIVEN UT-D-U FACTORISATION OF M.
14 !code
15 !+ COMPRESSED STORAGE OF SPARSE MATRICES
16 !+
17 !+ THE STRICT UPPER TRIANGULAR PORTION OF THE MATRIX U IS STORED IN
18 !+ (IA,JA,A) FORMAT USING THE ARRAYS IU, JU, AND U, EXCEPT THAT AN
19 !+ ADDITIONAL ARRAY IJU IS USED TO REDUCE THE STORAGE REQUIRED FOR JU
20 !+ BY ALLOWING SOME SEQUENCES OF COLUMN INDICES TO CORRESPOND TO MORE
21 !+ THAN ONE ROW. FOR I < N, IJU(I) IS THE INDEX IN JU OF THE FIRST
22 !+ ENTRY FOR THE I-TH ROW; IJU(N) IS THE NUMBER OF ENTRIES IN JU.
23 !+ THUS, THE NUMBER OF ENTRIES IN THE I-TH ROW IS IU(I+1) - IU(I),
24 !+ THE NONZERO ENTRIES OF THE I-TH ROW ARE STORED CONSECUTIVELY IN
25 !+
26 !+ U(IU(I)), U(IU(I)+1), ..., U(IU(I+1)-1),
27 !+
28 !+ AND THE CORRESPONDING COLUMN INDICES ARE STORED CONSECUTIVELY IN
29 !+
30 !+ JU(IJU(I)), JU(IJU(I)+1), ..., JU(IJU(I)+IU(I+1)-IU(I)-1).
31 !+
32 !+ COMPRESSION IN JU OCCURS IN TWO WAYS. FIRST, IF A ROW I WAS MERGED
33 !+ INTO ROW K, AND THE NUMBER OF ELEMENTS MERGED IN FROM (THE TAIL
34 !+ PORTION OF) ROW I IS THE SAME AS THE FINAL LENGTH OF ROW K, THEN
35 !+ THE KTH ROW AND THE TAIL OF ROW I ARE IDENTICAL AND IJU(K) POINTS
36 !+ TO THE START OF THE TAIL. SECOND, IF SOME TAIL PORTION OF THE
37 !+ (K-1)ST ROW IS IDENTICAL TO THE HEAD OF THE KTH ROW, THEN IJU(K)
38 !+ POINTS TO THE START OF THAT TAIL PORTION. FOR EXAMPLE, THE NONZERO
39 !+ STRUCTURE OF THE STRICT UPPER TRIANGULAR PART OF THE MATRIX
40 !+
41 !+ ( D 0 0 0 X X X )
42 !+ ( 0 D 0 X X 0 0 )
43 !+ ( 0 0 D 0 X X 0 )
44 !+ U = ( 0 0 0 D X X 0 )
45 !+ ( 0 0 0 0 D X X )
46 !+ ( 0 0 0 0 0 D X )
47 !+ ( 0 0 0 0 0 0 D )
48 !+
49 !+ WOULD BE STORED AS
50 !+
51 !+ \ 1 2 3 4 5 6 7 8
52 !+ ----+------------------------
53 !+ IU \ 1 4 6 8 10 12 13 13
54 !+ JU \ 5 6 7 4 5 6
55 !+ IJU \ 1 4 5 5 2 3 6 .
56 !+
57 !+ THE DIAGONAL ENTRIES OF U ARE EQUAL TO ONE AND ARE NOT STORED.
58 !
59 !note IMPORTANT : INSPIRED FROM PACKAGE CMLIB3 - YALE UNIVERSITE-YSMP
60 !
61 !history E. RAZAFINDRAKOTO (LNH)
62 !+ 13/11/08
63 !+ V5P9
64 !+
65 !
66 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
67 !+ 13/07/2010
68 !+ V6P0
69 !+ Translation of French comments within the FORTRAN sources into
70 !+ English comments
71 !
72 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
73 !+ 21/08/2010
74 !+ V6P0
75 !+ Creation of DOXYGEN tags for automated documentation and
76 !+ cross-referencing of the FORTRAN sources
77 !
78 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
79 !| B |-->| REAL ONE-DIMENSIONAL ARRAY CONTAINING THE
80 !| | | RIGHT-HAND SIDE B; B AND Z CAN BE THE SAME ARRAY;
81 !| | | DIMENSION = N
82 !| D |<--| REAL ONE-DIMENSIONAL ARRAY CONTAINING THE
83 !| | | RECIPROCALS OF THE DIAGONAL ENTRIES OF THE
84 !| | | MATRIX D; DIMENSION = N
85 !| IJU |-->| INTEGER ONE-DIMENSIONAL ARRAY CONTAINING
86 !| | | POINTERS TO THE START OF EACH ROW IN JU; DIMENSION = N
87 !| IU |-->| INTEGER ONE-DIMENSIONAL ARRAY CONTAINING
88 !| | | POINTERS TO DELIMIT ROWS IN U; DIMENSION = N+1
89 !| JU |-->| INTEGER ONE-DIMENSIONAL ARRAY CONTAINING THE
90 !| | | COLUMN INDICES CORRESPONDING TO THE ELEMENTS
91 !| | | OF U; DIMENSION = JUMAX
92 !| N |-->| ORDER OF THE MATRIX
93 !| P |-->| INTEGER ONE-DIMENSIONAL ARRAY USED TO RETURN
94 !| | | THE PERMUTATION OF THE ROWS AND COLUMNS OF M
95 !| | | CORRESPONDING TO THE MINIMUM DEGREE ORDERING;
96 !| | | DIMENSION = N
97 !| TMP |<--| REAL ONE-DIMENSIONAL WORK ARRAY; DIMENSION N
98 !| U |<--| REAL ONE-DIMENSIONAL ARRAY CONTAINING THE
99 !| | | NONZERO ENTRIES IN THE STRICT UPPER TRIANGLE
100 !| | | OF U, STORED BY ROWS; DIMENSION = UMAX
101 !| Z |<--| REAL ONE-DIMENSIONAL ARRAY CONTAINING THE
102 !| | | SOLUTION X; Z AND B CAN BE THE SAME ARRAY;
103 !| | | DIMENSION = N
104 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
105 !
106  USE bief, ex_sd_sns => sd_sns
107 !
109  IMPLICIT NONE
110 !
111 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
112 !
113  INTEGER, INTENT(IN) :: N
114  INTEGER, INTENT(INOUT) :: P(n),IJU(*),JU(*),IU(n+1)
115  DOUBLE PRECISION, INTENT(IN) :: B(n)
116  DOUBLE PRECISION, INTENT(INOUT) :: TMP(n),Z(n),D(n),U(*)
117 ! UMAX
118 !
119 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
120 !
121  INTEGER I,J,K,JMIN,JMAX,MU
122  DOUBLE PRECISION TMPK,SU
123 !
124 !-----------------------------------------------------------------------
125 !
126 !----SETS TMP TO PERMUTED B
127 !
128  DO k=1,n
129  tmp(k) = b(p(k))
130  ENDDO
131 !
132 !----SOLVES UT D Y = B BY FORWARD SUBSTITUTION
133 !
134  DO k=1,n
135  tmpk = tmp(k)
136  jmin = iu(k)
137  jmax = iu(k+1) - 1
138  IF(jmin.GT.jmax) GO TO 3
139  mu = iju(k) - jmin
140  DO j=jmin,jmax
141  tmp(ju(mu+j)) = tmp(ju(mu+j)) + u(j) * tmpk
142  ENDDO
143 3 tmp(k) = tmpk * d(k)
144  ENDDO
145 !
146 !----SOLVES U X = Y BY BACK SUBSTITUTION
147 !
148  k = n
149  DO i=1,n
150  su = tmp(k)
151  jmin = iu(k)
152  jmax = iu(k+1) - 1
153  IF(jmin.GT.jmax) GO TO 5
154  mu = iju(k) - jmin
155  DO j=jmin,jmax
156  su = su + u(j) * tmp(ju(mu+j))
157  ENDDO
158 5 tmp(k) = su
159  z(p(k)) = su
160  k = k-1
161  ENDDO
162 !
163 !-----------------------------------------------------------------------
164 !
165  RETURN
166  END
subroutine sd_sns(N, P, D, IJU, JU, IU, U, Z, B, TMP)
Definition: sd_sns.f:7
Definition: bief.f:3