The TELEMAC-MASCARET system  trunk
dcpldu.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE dcpldu
3 ! *****************
4 !
5  &(b,a,mesh,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 !+
14 !+ (A CAN ALSO BE A BLOCK OF MATRICES, IN WHICH CASE
15 !+ THE DIAGONAL MATRICES OF THE BLOCK ARE TREATED).
16 !+
17 !+ REQUIRES THAT THE DIAGONAL OF A BE THE IDENTITY.
18 !code
19 !+ EACH ELEMENTARY MATRIX IS DECOMPOSED IN THE FORM:
20 !+
21 !+ LE X DE X UE
22 !+
23 !+ LE : LOWER TRIANGULAR WITH 1S ON THE DIAGONAL
24 !+ DE : DIAGONAL
25 !+ UE : UPPER TRIANGULAR WITH 1S ON THE DIAGONAL
26 !+
27 !+ T
28 !+ IF THE MATRIX IS SYMMETRICAL : LE = UE
29 !+
30 !+ "DE" MATRICES ARE CONSIDERED LIKE DIAGONALS OF SIZE
31 !+ NPOIN X NPOIN, WHICH ARE FILLED WITH 1S FOR THE POINTS
32 !+ WHICH DO NOT BELONG TO THE CONSIDERED ELEMENT
33 !+
34 !+ THEN PERFORMS THE PRODUCT OF ALL THESE DIAGONALS
35 !+ YIELDING DIAGONAL DB
36 !+
37 !+ |||||| FINALLY: DB IS INVERTED BECAUSE THAT'S HOW IT WILL BE
38 !+ USED IN DOWNUP.
39 !
40 !history J-M HERVOUET (LNH)
41 !+ 23/12/94
42 !+ V5P1
43 !+
44 !
45 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
46 !+ 13/07/2010
47 !+ V6P0
48 !+ Translation of French comments within the FORTRAN sources into
49 !+ English comments
50 !
51 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
52 !+ 21/08/2010
53 !+ V6P0
54 !+ Creation of DOXYGEN tags for automated documentation and
55 !+ cross-referencing of the FORTRAN sources
56 !
57 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
58 !| A |<--| MATRIX A.
59 !| B |<--| MATRICE B, THE RESULT.
60 !| COPY |-->| IF .TRUE. A IS COPIED INTO B.
61 !| | | IF .FALSE. B IS CONSIDERED ALREADY INITIALISED
62 !| LV |-->| VECTOR LENGTH OF THE COMPUTER
63 !| MESH |-->| MESH STRUCTURE
64 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
65 !
66  USE bief, ex_dcpldu => dcpldu
67 !
69  IMPLICIT NONE
70 !
71 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
72 !
73  TYPE(bief_obj) , INTENT(INOUT) :: B
74  TYPE(bief_obj) , INTENT(IN) :: A
75  TYPE(bief_mesh), INTENT(INOUT) :: MESH
76  LOGICAL , INTENT(IN) :: COPY
77  INTEGER , INTENT(IN) :: LV
78 !
79 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
80 !
81  INTEGER SA,SB,I
82 !
83 !-----------------------------------------------------------------------
84 !
85  IF(a%TYPE.EQ.3) THEN
86  sa = 0
87  ELSEIF(a%TYPE.EQ.4) THEN
88  sa = a%N
89  ELSE
90  WRITE(lu,400) a%TYPE
91 400 FORMAT(1x,'DCPLDU (BIEF) :',1i6,' UNEXPECTED TYPE FOR A.')
92  CALL plante(1)
93  stop
94  ENDIF
95 !
96  IF(b%TYPE.EQ.3) THEN
97  sb = 0
98  ELSEIF(b%TYPE.EQ.4) THEN
99  sb = b%N
100  ELSE
101  WRITE(lu,401) b%TYPE
102 401 FORMAT(1x,'DCPLDU (BIEF) :',1i6,' UNEXPECTED TYPE FOR B.')
103  CALL plante(1)
104  stop
105  ENDIF
106 !
107 !-----------------------------------------------------------------------
108 !
109  IF(sa.EQ.0.AND.sb.EQ.0) THEN
110 !
111  CALL decldu(b,a,mesh,copy,lv)
112 !
113  ELSEIF(sb.GT.0.AND.sa.GT.0) THEN
114 !
115 ! TAKES THE DIAGONALS OF BLOCK A
116 !
117  DO i=1,sb
118  CALL decldu(b%ADR(i)%P,a%ADR(1+(sb+1)*(i-1))%P,
119  & mesh,copy,lv)
120  ENDDO
121 !
122  ELSEIF(sa.NE.0.AND.sb.EQ.0) THEN
123 !
124 ! TAKES THE FIRST DIAGONAL OF BLOCK A
125 !
126  CALL decldu(b,a%ADR(1)%P,mesh,copy,lv)
127 !
128  ELSE
129 !
130  WRITE(lu,402)
131 402 FORMAT(1x,'DCPLDU (BIEF) : UNEXPECTED CASE')
132  CALL plante(1)
133  stop
134 !
135  ENDIF
136 !
137 !-----------------------------------------------------------------------
138 !
139  RETURN
140  END
subroutine dcpldu(B, A, MESH, COPY, LV)
Definition: dcpldu.f:7
subroutine decldu(B, A, MESH, COPY, LV)
Definition: decldu.f:7
Definition: bief.f:3