The TELEMAC-MASCARET system  trunk
downup.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE downup
3 ! *****************
4 !
5  &(x, a,b ,ditr,mesh)
6 !
7 !***********************************************************************
8 ! BIEF V6P1 21/08/2010
9 !***********************************************************************
10 !
11 !brief SOLVES THE SYSTEM A X = B.
12 !+
13 !+ THE MATRIX A IS HERE THE RESULT OF A DECOMPOSITION
14 !+ DONE IN SUBROUTINE DECLDU.
15 !code
16 !+ EACH ELEMENTARY MATRIX WAS FACTORISED IN THE FORM :
17 !+
18 !+ LE X DE X UE
19 !+
20 !+ LE : LOWER TRIANGULAR WITH 1S ON THE DIAGONAL
21 !+ DE : DIAGONAL
22 !+ UE : UPPER TRIANGULAR WITH 1S ON THE DIAGONAL
23 !+
24 !+ T
25 !+ IF THE MATRIX IS SYMMETRICAL : LE = UE
26 !+
27 !+ "DE" MATRICES ARE CONSIDERED LIKE DIAGONALS OF SIZE
28 !+ NPOIN X NPOIN, WHICH ARE FILLED WITH 1S FOR THE POINTS
29 !+ WHICH DO NOT BELONG TO THE CONSIDERED ELEMENT
30 !+
31 !+ THEN PERFORMS THE PRODUCT OF ALL THESE DIAGONALS
32 !+ YIELDING DIAGONAL DB
33 !+
34 !+
35 !+ !!!!!!!!! FINALLY: DB HAS BEEN INVERTED BECAUSE THAT'S HOW
36 !+ IT IS USED IN THIS SUBROUTINE
37 !+
38 !+ MATRIX A IS HERE :
39 !+
40 !+ THE PRODUCT FROM 1 TO NELEM OF ALL THE MATRICES: LE
41 !+
42 !+ MULTIPLIED BY :
43 !+
44 !+ THE DIAGONAL: DB
45 !+
46 !+ MULTIPLIED BY :
47 !+
48 !+ THE PRODUCT FROM NELEM TO 1 OF ALL THE MATRICES: UE
49 !
50 !code
51 !+-----------------------------------------------------------------------
52 !+ MEANING OF IELM :
53 !+
54 !+ TYPE OF ELEMENT NUMBER OF POINTS CODED IN THIS SUBROUTINE
55 !+
56 !+ 11 : P1 TRIANGLE 3 YES
57 !+ 12 : QUASI-BUBBLE TRIANGLE 4 YES
58 !+ 21 : Q1 QUADRILATERAL 4 YES
59 !+ 41 : TELEMAC-3D PRISMS 6 YES
60 !+
61 !+-----------------------------------------------------------------------
62 !
63 !history J-M HERVOUET (LNH)
64 !+ 24/04/97
65 !+ V5P1
66 !+
67 !
68 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
69 !+ 13/07/2010
70 !+ V6P0
71 !+ Translation of French comments within the FORTRAN sources into
72 !+ English comments
73 !
74 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
75 !+ 21/08/2010
76 !+ V6P0
77 !+ Creation of DOXYGEN tags for automated documentation and
78 !+ cross-referencing of the FORTRAN sources
79 !
80 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
81 !| A |-->| MATRIX A
82 !| B |<--| RIGHT-HAND SIDE OF THE SYSTEM
83 !| DITR |-->| OPTION 'D' : MATRIX A IS TAKEN
84 !| | | 'T' : MATRIX TRANSPOSED(A)
85 !| MESH |-->| MESH STRUCTURE
86 !| X |<--| SOLUTION OF SYSTEM AX = B
87 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
88 !
89  USE bief, ex_doxnup => downup
90 !
92  IMPLICIT NONE
93 !
94 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
95 !
96  TYPE(bief_obj), INTENT(INOUT) :: X
97  TYPE(bief_obj), INTENT(IN) :: A,B
98  TYPE(bief_mesh), INTENT(IN) :: MESH
99  CHARACTER(LEN=1), INTENT(IN) :: DITR
100 !
101 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
102 !
103  INTEGER S,SA,I
104 !
105 !-----------------------------------------------------------------------
106 !
107  IF(x%TYPE.EQ.4) THEN
108  s = x%N
109  ELSE
110  s = 0
111  ENDIF
112 !
113 ! COVERS THE CASE WHERE THE SYSTEM IS A BLOCK BUT WHERE ONLY ONE OF
114 ! PRECONDITIONING MATRICES IS USED
115 !
116  IF(a%TYPE.EQ.3) THEN
117  sa = 0
118  ELSEIF(a%TYPE.EQ.4) THEN
119  sa = a%N
120  ELSE
121  WRITE(lu,400) a%TYPE
122 400 FORMAT(1x,'DOWNUP (BIEF) :',1i6,' UNEXPECTED TYPE FOR A.')
123  CALL plante(1)
124  stop
125  ENDIF
126 !
127 !-----------------------------------------------------------------------
128 !
129  IF(s.EQ.0.AND.sa.EQ.0) THEN
130 !
131 ! CASE WHERE A IS A SIMPLE MATRIX AND X A SIMPLE VECTOR
132 !
133  CALL dwnup1(x, a,b ,ditr,mesh)
134 !
135  ELSEIF(s.GT.0.AND.s.EQ.sa) THEN
136 !
137 ! CASE WHERE BLOCK A ONLY CONTAINS THE DIAGONALS
138 !
139  DO i=1,s
140  CALL dwnup1(x%ADR(i)%P,
141  & a%ADR(i)%P,
142  & b%ADR(i)%P,
143  & ditr,mesh)
144  ENDDO ! I
145 !
146  ELSEIF(s.GT.0.AND.s**2.EQ.sa) THEN
147 !
148 ! CASE WHERE BLOCK A CONTAINS AS MANY MATRICES AS THERE ARE IN
149 ! THE COMPLETE SYSTEM: ONLY CONSIDERS THE DIAGONALS
150 !
151  DO i=1,s
152  CALL dwnup1(x%ADR(i)%P,
153  & a%ADR(1+(s+1)*(i-1))%P,
154  & b%ADR(i)%P,
155  & ditr,mesh)
156  ENDDO ! I
157 !
158 ! CASE WHERE A IS A SINGLE MATRIX AND X IS A BLOCK
159 !
160  ELSEIF(s.GT.0.AND.sa.EQ.0) THEN
161 !
162  DO i=1,s
163  CALL dwnup1(x%ADR(i)%P,
164  & a,
165  & b%ADR(i)%P,
166  & ditr,mesh)
167  ENDDO ! I
168 !
169  ELSE
170  WRITE(lu,401)
171 401 FORMAT(1x,'DOWNUP (BIEF) : UNEXPECTED CASE')
172  CALL plante(1)
173  stop
174  ENDIF
175 !
176 !-----------------------------------------------------------------------
177 !
178  RETURN
179  END
subroutine downup(X, A, B, DITR, MESH)
Definition: downup.f:7
subroutine dwnup1(X, A, B, DITR, MESH)
Definition: dwnup1.f:7
Definition: bief.f:3