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