The TELEMAC-MASCARET system  trunk
precdt.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE precdt
3 ! *****************
4 !
5  &(x,a,b,d,mesh,precon,prexsm,diadon,s)
6 !
7 !***********************************************************************
8 ! BIEF V6P1 21/08/2010
9 !***********************************************************************
10 !
11 !brief DIAGONAL PRECONDITIONING OF A SYSTEM A X = B
12 !+
13 !+ (CAN BE MADE OF A SIMPLE MATRIX, 4-MATRIX OR
14 !+ 9-MATRIX BLOCKS).
15 !code
16 !+ IF DIADON=.TRUE. THE PRECONDITIONING DIAGONALS ARE GIVEN BY THE USER
17 !+
18 !+
19 !+ IF DIADON=.FALSE. :
20 !+
21 !+ IF PRECON IS A MULTIPLE OF 2 : DIAGONAL PRECONDITIONING USING
22 !+ THE DIAGONAL FROM A
23 !+ IF PRECON IS A MULTIPLE OF 3 : BLOCK-DIAGONAL PRECONDITIONING
24 !+ THIS PRECONDITIONING STARTS IN
25 !+ SUBROUTINE PREBDT, BUT ENDS WITH
26 !+ A STANDARD DIAGONAL PRECONDITIONING,
27 !+ PERFORMED HERE
28 !+ IF PRECON IS A MULTIPLE OF 5 : DIAGONAL PRECONDITIONING USING
29 !+ THE ABSOLUTE VALUE OF THE DIAGONAL
30 !+ FROM A
31 !
32 !warning SHOULD NOT FORGET TO REVERT THE CHANGE OF VARIABLE
33 !+ AFTER RESOLUTION
34 !code
35 !+-----------------------------------------------------------------------
36 !+
37 !+ EXAMPLE FOR A 4-MATRIX BLOCK:
38 !+
39 !+ ( A11 A12 ) ( X1 ) = ( B1 )
40 !+ ( ) ( ) ( )
41 !+ ( ) ( ) ( )
42 !+ ( A21 A22 ) ( X2 ) = ( B2 )
43 !+
44 !+ THE DIAGONAL PRECONDITIONING MATRICES ARE D1 AND D2
45 !+
46 !+ THESE DIAGONALS ARE GIVEN BY THE USER IF DIADON=.TRUE. OR
47 !+ ARE THE DIAGONALS FROM A11, A22 IF PRECON IS A MULTIPLE OF 2
48 !+
49 !+ -1
50 !+ CHANGE OF VARIABLE X1PRIME = D1 X1
51 !+ -1
52 !+ X2PRIME = D2 X2
53 !+
54 !+ THE WHOLE SYSTEM IS THEN MULTIPLIED BY D ON THE LEFT
55 !+
56 !+ PRODUCT:
57 !+
58 !+ ( D1 0 ) ( A11 A12 ) ( D1 0 )
59 !+ ( ) ( ) ( )
60 !+ ( ) X ( ) ( )
61 !+ ( 0 D2 ) ( A21 A22 ) X ( 0 D2 )
62 !+
63 !+
64 !+ WHICH GIVES :
65 !+
66 !+ ( D1 A11 D1 D1 A12 D2 )
67 !+ ( )
68 !+ ( )
69 !+ ( D2 A21 D1 D2 A22 D2 )
70 !+
71 !+
72 !+ BEWARE: ALL AIJ MATRICES ARE REMPLACED BY THEIR VALUE
73 !+ AFTER PRECONDITIONING
74 !+
75 !+ TREATS THE SECOND MEMBERS:
76 !+
77 !+ ( D1 0 ) ( B1 )
78 !+ ( ) X ( )
79 !+ ( 0 D2 ) ( B2 )
80 !+
81 !+-----------------------------------------------------------------------
82 !
83 !history J-M HERVOUET (LNH)
84 !+ 24/04/97
85 !+ V5P1
86 !+
87 !
88 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
89 !+ 13/07/2010
90 !+ V6P0
91 !+ Translation of French comments within the FORTRAN sources into
92 !+ English comments
93 !
94 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
95 !+ 21/08/2010
96 !+ V6P0
97 !+ Creation of DOXYGEN tags for automated documentation and
98 !+ cross-referencing of the FORTRAN sources
99 !
100 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
101 !| A |-->| BLOCK OF MATRICES
102 !| B |-->| BLOCK OF RIGHT-HAND SIZES
103 !| D |<--| BLOCK OF DIAGONALS
104 !| DIADON |-->| .TRUE. : DIAGONALS ARE GIVEN
105 !| MESH |-->| MESH STRUCTURE
106 !| PRECON |-->| CHOICE OF PRECONDITIONING
107 !| PREXSM |-->| .TRUE. : PRECONDITIONING X1,X2 AND B1,B2
108 !| S |-->| 0 : A NORMAL SYSTEM (FORBIDDEN HERE)
109 !| | | 1 : BLOCK OF ONE MATRIX (FORBIDDEN HERE)
110 !| | | 2 : BLOCK OF 4 MATRICES
111 !| | | 3 : BLOCK OF 9 MATRICES
112 !| X |<->| BLOCK OF UNKNOWN VECTORS
113 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
114 !
115  USE bief, ex_precdt => precdt
116 !
118  IMPLICIT NONE
119 !
120 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
121 !
122  INTEGER, INTENT(IN) :: PRECON,S
123 !
124  LOGICAL, INTENT(IN) :: PREXSM,DIADON
125 !
126 !-----------------------------------------------------------------------
127 !
128 ! VECTOR OR VECTOR BLOCK STRUCTURES
129 !
130  TYPE(bief_obj), INTENT(INOUT) :: X,B,D
131 !
132 !-----------------------------------------------------------------------
133 !
134 ! MATRIX OR MATRIX BLOCK STRUCTURES
135 !
136  TYPE(bief_obj), INTENT(INOUT) :: A
137 !
138 !-----------------------------------------------------------------------
139 !
140 ! MESH STRUCTURE
141 !
142  TYPE(bief_mesh), INTENT(INOUT) :: MESH
143 !
144 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
145 !
146 ! STANDARD CASE
147 !
148  IF(s.EQ.0) THEN
149 !
150  CALL precd1(x,a,b,d%ADR(1)%P,mesh,precon,prexsm,diadon)
151 !
152 !-----------------------------------------------------------------------
153 !
154 ! CASE WHERE A X, B AND D ARE BLOCKS OF 1 OBJECT
155 !
156  ELSEIF(s.EQ.1) THEN
157 !
158  CALL precd1(x%ADR(1)%P,a%ADR(1)%P,b%ADR(1)%P,d%ADR(1)%P,mesh,
159  & precon,prexsm,diadon)
160 !
161  ELSEIF(s.EQ.2) THEN
162 !
163  CALL precd4(x%ADR(1)%P,x%ADR(2)%P,
164  & a%ADR(1)%P,a%ADR(2)%P,a%ADR(3)%P,a%ADR(4)%P,
165  & b%ADR(1)%P,b%ADR(2)%P,
166  & d%ADR(1)%P,d%ADR(2)%P,
167  & mesh,precon,prexsm,diadon)
168 !
169  ELSEIF(s.EQ.3) THEN
170 !
171  CALL precd9(x%ADR(1)%P,x%ADR(2)%P,x%ADR(3)%P,
172  & a%ADR(1)%P,a%ADR(2)%P,a%ADR(3)%P,a%ADR(4)%P,
173  & a%ADR(5)%P,a%ADR(6)%P,a%ADR(7)%P,a%ADR(8)%P,
174  & a%ADR(9)%P,
175  & b%ADR(1)%P,b%ADR(2)%P,b%ADR(3)%P,
176  & d%ADR(1)%P,d%ADR(2)%P,d%ADR(3)%P,
177  & mesh,precon,prexsm,diadon)
178 !
179  ELSE
180 !
181 !-----------------------------------------------------------------------
182 !
183 ! ERROR
184 !
185  WRITE(lu,200) s
186 200 FORMAT(1x,'PRECDT (BIEF) : UNEXPECTED S :',1i6)
187  CALL plante(1)
188  stop
189 !
190  ENDIF
191 !
192 !-----------------------------------------------------------------------
193 !
194  RETURN
195  END
subroutine precd9(X1, X2, X3, A11, A12, A13, A21, A22, A23, A31, A32, A33, B1, B2, B3, D1, D2, D3, MESH, PRECON, PREXSM, DIADON)
Definition: precd9.f:8
subroutine precdt(X, A, B, D, MESH, PRECON, PREXSM, DIADON, S)
Definition: precdt.f:7
subroutine precd1(X, A, B, D, MESH, PRECON, PREXSM, DIADON)
Definition: precd1.f:7
subroutine precd4(X1, X2, A11, A12, A21, A22, B1, B2, D1, D2, MESH, PRECON, PREXSM, DIADON)
Definition: precd4.f:8
Definition: bief.f:3