The TELEMAC-MASCARET system  trunk
dldu11.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE dldu11
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 P1 TRIANGLES.
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 X DE X 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 !history J-M HERVOUET (LNH) ; F LEPEINTRE (LNH)
36 !+ 24/04/97
37 !+ V5P1
38 !+
39 !
40 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
41 !+ 13/07/2010
42 !+ V6P0
43 !+ Translation of French comments within the FORTRAN sources into
44 !+ English comments
45 !
46 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
47 !+ 21/08/2010
48 !+ V6P0
49 !+ Creation of DOXYGEN tags for automated documentation and
50 !+ cross-referencing of the FORTRAN sources
51 !
52 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
53 !| COPY |-->| IF .TRUE. A IS COPIED INTO B.
54 !| | | IF .FALSE. B IS CONSIDERED ALREADY INITIALISED
55 !| DB |<--| DIAGONAL OF MATRIX B
56 !| IKLE |-->| CONNECTIVITY TABLE
57 !| LV |-->| VECTOR LENGTH OF THE COMPUTER
58 !| NELEM |-->| NUMBER OF ELEMENTS
59 !| NELMAX |-->| MAXIMUM NUMBER OF ELEMENTS
60 !| NPOIN |-->| NUMBER OF POINTS
61 !| TYPDIA |<--| TYPE OF DIAGONAL ( 'Q', 'I' , OR '0' )
62 !| TYPEXA |<--| TYPE OF OFF-DIAGONAL TERMS ('Q','S',OR '0')
63 !| W |-->| WORK ARRAY OF DIMENSION (NELMAX,3)
64 !| XA |<--| OFF-DIAGONAL TERMS OF MATRIX A
65 !| XB |<--| OFF-DIAGONAL TERMS OF MATRIX B
66 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
67 !
68  USE bief, ex_dldu11 => dldu11
69 !
71  IMPLICIT NONE
72 !
73 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
74 !
75  INTEGER, INTENT(IN) :: NELEM,NELMAX,LV,NPOIN
76 ! NO DEFAULT INITIALISATION FOR USER TYPE COMPONENTS ALLOWED
77  DOUBLE PRECISION, INTENT(INOUT) :: DB(npoin),XB(nelmax,*)
78  DOUBLE PRECISION, INTENT(IN) :: XA(nelmax,*)
79  CHARACTER(LEN=1), INTENT(IN) :: TYPDIA,TYPEXA
80  INTEGER, INTENT(IN) :: IKLE(nelmax,*)
81  DOUBLE PRECISION, INTENT(OUT) :: W(nelmax,3)
82  LOGICAL, INTENT(IN) :: COPY
83 !
84 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
85 !
86  INTEGER IELEM
87 !
88 !-----------------------------------------------------------------------
89 !
90 ! REQUIRES THAT THE DIAGONAL OF A BE THE IDENTITY (EXCEPT IN PARALLEL MODE)
91 !
92  IF(typdia(1:1).NE.'I'.AND.ncsize.LE.1) THEN
93  WRITE(lu,101) typdia(1:1)
94 101 FORMAT(1x,'DLDU11 (BIEF) : DIAGONAL OF A NOT EQUAL TO I :',a1)
95  CALL plante(0)
96  stop
97  ENDIF
98 !
99 !-----------------------------------------------------------------------
100 !
101  IF(typexa(1:1).EQ.'S') THEN
102 !
103  IF(copy) CALL ov('X=Y ', x=xb, y=xa, dim1=nelmax*3)
104 !
105  DO ielem = 1 , nelem
106  w(ielem,2) = 1.d0 - xb(ielem,1)**2
107  xb(ielem,3) = (xb(ielem,3)-xb(ielem,1)*xb(ielem,2))/w(ielem,2)
108  w(ielem,3) = 1.d0 - xb(ielem,2)**2 -xb(ielem,3)**2
109  ENDDO ! IELEM
110 !
111 !-----------------------------------------------------------------------
112 !
113  ELSEIF(typexa(1:1).EQ.'Q') THEN
114 !
115  IF(copy) CALL ov('X=Y ', x=xb, y=xa, dim1=nelmax*6)
116 !
117  DO ielem = 1 , nelem
118 ! L U FACTORISATION
119  w(ielem,2)=1.d0 - xb(ielem,1)*xb(ielem,4)
120  xb(ielem,6) = (xb(ielem,6)-xb(ielem,1)*xb(ielem,5))/w(ielem,2)
121  xb(ielem,3) = xb(ielem,3)-xb(ielem,4)*xb(ielem,2)
122  w(ielem,3) = 1.d0-xb(ielem,2)*xb(ielem,5)
123  & - xb(ielem,3)*xb(ielem,6)
124 ! L D U FACTORISATION
125  xb(ielem,3) = xb(ielem,3) / w(ielem,2)
126  ENDDO ! IELEM
127 !
128 !-----------------------------------------------------------------------
129 !
130  ELSE
131  WRITE(lu,201) typexa(1:1)
132 201 FORMAT(1x,'DLDU11 (BIEF) : TYPE OF MATRIX NOT AVAILABLE :',a1)
133  CALL plante(0)
134  stop
135  ENDIF
136 !
137 !-----------------------------------------------------------------------
138 !
139 ! MULTIPLICATIVE ASSEMBLY OF THE DIAGONAL WITH INITIALISATION OF DB TO 1
140 ! SKIPS IKLE1 BECAUSE W1 = 1
141 !
142  CALL asmvec(db,ikle(1,2),npoin,nelem,nelmax,2,w(1,2),.true.,lv)
143 !
144 ! INVERTS DB
145 !
146  CALL ov('X=1/Y ', x=db, y=db, dim1=npoin)
147 !
148 !-----------------------------------------------------------------------
149 !
150  RETURN
151  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 dldu11(DB, XB, TYPDIA, XA, TYPEXA, IKLE, NELEM, NELMAX, NPOIN, W, COPY, LV)
Definition: dldu11.f:7
Definition: bief.f:3