The TELEMAC-MASCARET system  trunk
dldu21.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE dldu21
3 ! *****************
4 !
5  &(db,xb,typdia,xa,typexa,ikle,nelem,nelmax,npoin,w,copy,lv)
6 !
7 !***********************************************************************
8 ! BIEF V6P1 21/08/2010
9 !***********************************************************************
10 !
11 !brief L D U FACTORISATION OF THE ELEMENTARY MATRICES
12 !+ IN MATRIX A
13 !+ FOR Q1 QUADRILATERALS.
14 !+
15 !+ REQUIRES THAT THE DIAGONAL OF A BE THE IDENTITY.
16 !code
17 !+ EACH ELEMENTARY MATRIX IS DECOMPOSED IN THE FORM:
18 !+
19 !+ LE * DE * UE
20 !+
21 !+ LE : LOWER TRIANGULAR WITH 1S ON THE DIAGONAL
22 !+ DE : DIAGONAL
23 !+ UE : UPPER TRIANGULAR WITH 1S ON THE DIAGONAL
24 !+
25 !+ T
26 !+ IF THE MATRIX IS SYMMETRICAL : LE = UE
27 !+
28 !+ "DE" MATRICES ARE CONSIDERED LIKE DIAGONALS OF SIZE
29 !+ NPOIN X NPOIN, WHICH ARE FILLED WITH 1S FOR THE POINTS
30 !+ WHICH DO NOT BELONG TO THE CONSIDERED ELEMENT
31 !+
32 !+ THEN PERFORMS THE PRODUCT OF ALL THESE DIAGONALS
33 !+ YIELDING DIAGONAL DB
34 !
35 !warning FOR NONSYMMETRICAL MATRICES: UE LE
36 !+
37 !+ UE (THE BETAS) IS STORED IN XB (. , 1 TO 6)
38 !+
39 !+ LE (THE ALFAS) IS STORED IN XB (. , 7 TO 12)
40 !
41 !history J-M HERVOUET (LNH) ; F LEPEINTRE (LNH)
42 !+ 24/04/97
43 !+ V5P1
44 !+
45 !
46 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
47 !+ 13/07/2010
48 !+ V6P0
49 !+ Translation of French comments within the FORTRAN sources into
50 !+ English comments
51 !
52 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
53 !+ 21/08/2010
54 !+ V6P0
55 !+ Creation of DOXYGEN tags for automated documentation and
56 !+ cross-referencing of the FORTRAN sources
57 !
58 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
59 !| COPY |-->| IF .TRUE. A IS COPIED INTO B.
60 !| | | IF .FALSE. B IS CONSIDERED ALREADY INITIALISED
61 !| DB |<--| DIAGONAL OF MATRIX B
62 !| IKLE |-->| CONNECTIVITY TABLE
63 !| LV |-->| VECTOR LENGTH OF THE COMPUTER
64 !| NELEM |-->| NUMBER OF ELEMENTS
65 !| NELMAX |-->| MAXIMUM NUMBER OF ELEMENTS
66 !| NPOIN |-->| NUMBER OF POINTS
67 !| TYPDIA |<--| TYPE OF DIAGONAL ( 'Q', 'I' , OR '0' )
68 !| TYPEXA |<--| TYPE OF OFF-DIAGONAL TERMS ('Q','S',OR '0')
69 !| W |-->| WORK ARRAY OF DIMENSION (NELMAX,3)
70 !| XA |<--| OFF-DIAGONAL TERMS OF MATRIX A
71 !| XB |<--| OFF-DIAGONAL TERMS OF MATRIX B
72 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
73 !
74  USE bief, ex_dldu21 => dldu21
75 !
77  IMPLICIT NONE
78 !
79 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
80 !
81  INTEGER, INTENT(IN) :: NELEM,NELMAX,LV,NPOIN
82  DOUBLE PRECISION, INTENT(INOUT) :: DB(npoin),XB(nelmax,*)
83  DOUBLE PRECISION, INTENT(IN) :: XA(nelmax,*)
84  CHARACTER(LEN=1), INTENT(IN) :: TYPDIA,TYPEXA
85  INTEGER, INTENT(IN) :: IKLE(nelmax,*)
86  DOUBLE PRECISION, INTENT(OUT) :: W(nelmax,4)
87  LOGICAL, INTENT(IN) :: COPY
88 !
89 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
90 !
91  INTEGER IELEM
92 !
93  DOUBLE PRECISION A12,A13,A14
94  DOUBLE PRECISION A21,A22,A23,A24
95  DOUBLE PRECISION A31,A32,A33,A34
96  DOUBLE PRECISION A41,A42,A43,A44
97  DOUBLE PRECISION BETA12,BETA13,BETA14
98  DOUBLE PRECISION ALFA21,BETA22,BETA23,BETA24
99  DOUBLE PRECISION ALFA31,ALFA32,BETA33,BETA34
100  DOUBLE PRECISION ALFA41,ALFA42,ALFA43,BETA44
101 !
102 !-----------------------------------------------------------------------
103 !
104 ! REQUIRES THAT THE DIAGONAL OF A BE THE IDENTITY
105 !
106  IF(typdia(1:1).NE.'I'.AND.ncsize.LE.1) THEN
107  WRITE(lu,1001) typdia(1:1)
108 1001 FORMAT(1x,'DLDU21 (BIEF) : DIAGONAL OF A NOT EQUAL TO I :',a1)
109  CALL plante(0)
110  stop
111  ENDIF
112 !
113 !-----------------------------------------------------------------------
114 !
115  IF(typexa(1:1).EQ.'S') THEN
116 !
117  IF(copy) CALL ov('X=Y ', x=xb, y=xa, dim1=nelmax*6)
118 !
119  DO ielem=1,nelem
120 !
121 ! MATRIX TO FACTORISE (SYMMETRICAL WITH 1S ON THE DIAGONAL)
122 !
123 ! LINE 1
124 ! A11 = 1.D0
125  a12 = xa(ielem,1)
126  a13 = xa(ielem,2)
127  a14 = xa(ielem,3)
128 ! LINE 2
129  a22 = 1.d0
130  a23 = xa(ielem,4)
131  a24 = xa(ielem,5)
132 ! LINE 3
133  a33 = 1.d0
134  a34 = xa(ielem,6)
135 ! LINE 4
136  a44 = 1.d0
137 !
138 ! CROUT L*U FACTORISATION
139 !
140  alfa21 = a12
141  alfa31 = a13
142  alfa41 = a14
143 !
144  beta12 = a12
145  beta22 = a22 - alfa21*beta12
146  alfa32 = (a23 - alfa31*beta12)/beta22
147  alfa42 = (a24 - alfa41*beta12)/beta22
148 !
149  beta13 = a13
150  beta23 = a23 - alfa21*beta13
151  beta33 = a33 - alfa31*beta13 - alfa32*beta23
152  alfa43 = (a34 - alfa41*beta13 - alfa42*beta23)/beta33
153 !
154  beta14 = a14
155  beta24 = a24 - alfa21*beta14
156  beta34 = a34 - alfa31*beta14 - alfa32*beta24
157  beta44 = a44 - alfa41*beta14 - alfa42*beta24 - alfa43*beta34
158 !
159 ! STORES IN XB AND W2,...,W4
160 !
161  xb(ielem,1 ) = alfa21
162  xb(ielem,2 ) = alfa31
163  xb(ielem,3 ) = alfa41
164  xb(ielem,4 ) = alfa32
165  xb(ielem,5 ) = alfa42
166  xb(ielem,6 ) = alfa43
167 !
168  w(ielem,2) = beta22
169  w(ielem,3) = beta33
170  w(ielem,4) = beta44
171 !
172  ENDDO ! IELEM
173 !
174 !-----------------------------------------------------------------------
175 !
176  ELSEIF(typexa(1:1).EQ.'Q') THEN
177 !
178  IF(copy) CALL ov('X=Y ', x=xb, y=xa, dim1=nelmax*12)
179 !
180  DO ielem=1,nelem
181 !
182 ! MATRIX TO FACTORISE (WITH 1S ON THE DIAGONAL)
183 !
184 ! A11 = 1.D0
185  a22 = 1.d0
186  a33 = 1.d0
187  a44 = 1.d0
188 !
189  a12 = xa(ielem,1 )
190  a13 = xa(ielem,2 )
191  a14 = xa(ielem,3 )
192  a23 = xa(ielem,4 )
193  a24 = xa(ielem,5 )
194  a34 = xa(ielem,6 )
195 !
196  a21 = xa(ielem,7 )
197  a31 = xa(ielem,8 )
198  a41 = xa(ielem,9 )
199  a32 = xa(ielem,10)
200  a42 = xa(ielem,11)
201  a43 = xa(ielem,12)
202 !
203 ! CROUT L*U FACTORISATION
204 !
205  alfa21 = a21
206  alfa31 = a31
207  alfa41 = a41
208 !
209  beta12 = a12
210  beta22 = a22 - alfa21*beta12
211  alfa32 = (a32 - alfa31*beta12)/beta22
212  alfa42 = (a42 - alfa41*beta12)/beta22
213 !
214  beta13 = a13
215  beta23 = a23 - alfa21*beta13
216  beta33 = a33 - alfa31*beta13 - alfa32*beta23
217  alfa43 = (a43 - alfa41*beta13 - alfa42*beta23)/beta33
218 !
219  beta14 = a14
220  beta24 = a24 - alfa21*beta14
221  beta34 = a34 - alfa31*beta14 - alfa32*beta24
222  beta44 = a44 - alfa41*beta14 - alfa42*beta24 - alfa43*beta34
223 !
224 ! STORES IN XB AND W2,...,W4
225 ! L D U FACTORISATION AT THE SAME TIME
226 !
227  xb(ielem,1 ) = beta12
228  xb(ielem,2 ) = beta13
229  xb(ielem,3 ) = beta14
230  xb(ielem,4 ) = beta23/beta22
231  xb(ielem,5 ) = beta24/beta22
232  xb(ielem,6 ) = beta34/beta33
233 !
234  xb(ielem,07) = alfa21
235  xb(ielem,08) = alfa31
236  xb(ielem,09) = alfa41
237  xb(ielem,10) = alfa32
238  xb(ielem,11) = alfa42
239  xb(ielem,12) = alfa43
240 !
241  w(ielem,2) = beta22
242  w(ielem,3) = beta33
243  w(ielem,4) = beta44
244 !
245  ENDDO ! IELEM
246 !
247 !-----------------------------------------------------------------------
248 !
249  ELSE
250  WRITE(lu,2001) typexa(1:1)
251 2001 FORMAT(1x,'DLDU21 (BIEF) : TYPE OF MATRIX NOT AVAILABLE :',a1)
252  CALL plante(0)
253  stop
254  ENDIF
255 !
256 !-----------------------------------------------------------------------
257 !
258 ! MULTIPLICATIVE ASSEMBLY OF THE DIAGONAL WITH INITIALISATION OF DB TO 1
259 ! SKIPS IKLE1 BECAUSE W1 = 1
260 !
261  CALL asmvec(db,ikle(1,2),npoin,nelem,nelmax,3,w(1,2),.true.,lv)
262 !
263 ! INVERTS DB
264 !
265  CALL ov('X=1/Y ', x=db, y=db, dim1=npoin)
266 !
267 !-----------------------------------------------------------------------
268 !
269  RETURN
270  END
subroutine ov(OP, X, Y, Z, C, DIM1)
Definition: ov.f:7
subroutine asmvec(X, IKLE, NPOIN, NELEM, NELMAX, NDP, W, INIT, LV)
Definition: asmvec.f:7
subroutine dldu21(DB, XB, TYPDIA, XA, TYPEXA, IKLE, NELEM, NELMAX, NPOIN, W, COPY, LV)
Definition: dldu21.f:7
Definition: bief.f:3