The TELEMAC-MASCARET system  trunk
prebd9.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE prebd9
3 ! *****************
4 !
5  &(x1,x2,x3,a11,a12,a13,a21,a22,a23,a31,a32,a33,
6  & b1,b2,b3,d11,d12,d13,d21,d22,d23,d31,d32,d33,
7  & mesh,prexsm,diadon)
8 !
9 !***********************************************************************
10 ! BIEF V6P1 21/08/2010
11 !***********************************************************************
12 !
13 !brief BLOCK-DIAGONAL PRECONDITIONING OF A SYSTEM A X = B.
14 !
15 !history J.M. HERVOUET (LNH)
16 !+ 23/12/94
17 !+ V5P1
18 !+
19 !
20 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
21 !+ 13/07/2010
22 !+ V6P0
23 !+ Translation of French comments within the FORTRAN sources into
24 !+ English comments
25 !
26 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
27 !+ 21/08/2010
28 !+ V6P0
29 !+ Creation of DOXYGEN tags for automated documentation and
30 !+ cross-referencing of the FORTRAN sources
31 !
32 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
33 !| A11 |<->| TERM (1,1) OF MATRIX
34 !| ... |<->| ...
35 !| A33 |<->| TERM (3,3) OF MATRIX
36 !| B1 |<->| FIRST RIGHT-HAND SIDE
37 !| B2 |<->| SECOND RIGHT-HAND SIDE
38 !| B3 |<->| THIRD RIGHT-HAND SIDE
39 !| D11 |<--| DIAGONAL MATRIX
40 !| ... |<--| ...
41 !| D33 |<--| DIAGONAL MATRIX
42 !| DIADON |-->| .TRUE. : DIAGONALS ARE GIVEN
43 !| MESH |-->| MESH STRUCTURE
44 !| PREXSM |-->| .TRUE. : PRECONDITIONING X1,X2 AND B1,B2
45 !| X1 |<->| FIRST INITIAL GUESS
46 !| X2 |-->| SECOND INITIAL GUESS
47 !| X3 |-->| THIRD INITIAL GUESS
48 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
49 !
50  USE bief, ex_prebd9 => prebd9
51 !
53  IMPLICIT NONE
54 !
55 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
56 !
57  LOGICAL, INTENT(IN) :: PREXSM,DIADON
58 !
59 !-----------------------------------------------------------------------
60 !
61 ! VECTOR STRUCTURES
62 !
63  TYPE(bief_obj), INTENT(IN) :: X3,B1
64  TYPE(bief_obj), INTENT(INOUT) :: X1,X2,B2,B3
65  TYPE(bief_obj), INTENT(INOUT) :: D11,D12,D13,D21,D22,D23
66  TYPE(bief_obj), INTENT(INOUT) :: D31,D32,D33
67 !
68 !-----------------------------------------------------------------------
69 !
70 ! MATRIX STRUCTURES
71 !
72  TYPE(bief_obj), INTENT(INOUT) :: A11,A12,A13,A21,A22
73  TYPE(bief_obj), INTENT(INOUT) :: A23,A31,A32,A33
74 !
75 !-----------------------------------------------------------------------
76 !
77 ! MESH STRUCTURE
78 !
79  TYPE(bief_mesh), INTENT(INOUT) :: MESH
80 !
81 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
82 !
83  INTEGER I,NPOIN1,NPOIN2,NPOIN3
84 !
85 !-----------------------------------------------------------------------
86 !
87  npoin1 = x1%DIM1
88  npoin2 = x2%DIM1
89  npoin3 = x3%DIM1
90 !
91  IF(npoin2.NE.npoin1.AND.npoin3.NE.npoin1) THEN
92  WRITE(lu,200)
93 200 FORMAT(1x,'PREBD9 (BIEF) : RECTANGULAR MATRICES',/,1x,
94  & 'BLOCK-DIAGONAL PRECONDITIONING IMPOSSIBLE IN THIS CASE')
95  CALL plante(1)
96  stop
97  ENDIF
98 !
99 !-----------------------------------------------------------------------
100 !
101 ! PREPARES THE DIAGONALS:
102 !
103  IF(.NOT.diadon) THEN
104 !
105  CALL os('X=Y ', x=d11, y=a11%D)
106  CALL os('X=Y ', x=d12, y=a12%D)
107  CALL os('X=Y ', x=d13, y=a13%D)
108  CALL os('X=Y ', x=d21, y=a21%D)
109  CALL os('X=Y ', x=d22, y=a22%D)
110  CALL os('X=Y ', x=d23, y=a23%D)
111  CALL os('X=Y ', x=d31, y=a31%D)
112  CALL os('X=Y ', x=d32, y=a32%D)
113  CALL os('X=Y ', x=d33, y=a33%D)
114 !
115  ENDIF
116 !
117 !-----------------------------------------------------------------------
118 !
119 ! L D U FACTORISATION OF THE DIAGONAL BLOCK:
120 !
121 ! ONLY D11 INVERTED IS NOW USED
122  CALL os('X=1/Y ', x=d11, y=d11)
123 !
124  DO i = 1,npoin1
125 !
126  d21%R(i) = d21%R(i) * d11%R(i)
127  d31%R(i) = d31%R(i) * d11%R(i)
128  d22%R(i) = d22%R(i) - d21%R(i) * d12%R(i)
129 !
130  ENDDO
131 !
132 ! ONLY D22 INVERTED IS NOW USED
133  CALL os('X=1/Y ', x=d22, y=d22)
134 !
135  DO i = 1,npoin1
136 !
137  d32%R(i) = (d32%R(i) - d31%R(i) * d12%R(i)) * d22%R(i)
138  d23%R(i) = d23%R(i) - d21%R(i) * d13%R(i)
139  d33%R(i) = d33%R(i)
140  & -d31%R(i)*d13%R(i)-d32%R(i)*d23%R(i)
141  d12%R(i) = d12%R(i) * d11%R(i)
142  d13%R(i) = d13%R(i) * d11%R(i)
143  d23%R(i) = d23%R(i) * d22%R(i)
144 !
145  ENDDO
146 !
147 !-----------------------------------------------------------------------
148 !
149 ! CHANGE OF VARIABLES:
150 !
151  IF(prexsm) THEN
152 !
153  CALL os('X=X+YZ ', x=x1, y=x2, z=d12)
154  CALL os('X=X+YZ ', x=x1, y=x3, z=d13)
155  CALL os('X=X+YZ ', x=x2, y=x3, z=d23)
156 !
157  ENDIF
158 !
159 ! COMPUTES THE SQUARE ROOT
160 ! INVERTS D11,D22,D33
161 ! (THEY ARE ONLY USED IN THIS FORM FROM NOW ON)
162 !
163 ! INVERSION OF D11 ALREADY PERFORMED
164 ! INVERSION OF D22 ALREADY PERFORMED
165  CALL os('X=1/Y ', x=d33, y=d33)
166  CALL os('X=SQR(Y)', x=d11, y=d11)
167  CALL os('X=SQR(Y)', x=d22, y=d22)
168  CALL os('X=SQR(Y)', x=d33, y=d33)
169 !
170 !=======================================================================
171 ! MULTIPLIES A ON THE LEFT BY L INVERTED
172 !=======================================================================
173 !
174 ! A21 :
175  CALL om('M=M-DN ', m=a21, n=a11, d=d21, mesh=mesh)
176 ! A22 :
177  CALL om('M=M-DN ', m=a22, n=a12, d=d21, mesh=mesh)
178 ! A23 :
179  CALL om('M=M-DN ', m=a23, n=a13, d=d21, mesh=mesh)
180 ! A31 :
181  CALL om('M=M-DN ', m=a31, n=a11, d=d31, mesh=mesh)
182  CALL om('M=M-DN ', m=a31, n=a21, d=d32, mesh=mesh)
183 ! A32 :
184  CALL om('M=M-DN ', m=a32, n=a12, d=d31, mesh=mesh)
185  CALL om('M=M-DN ', m=a32, n=a22, d=d32, mesh=mesh)
186 ! A33 :
187  CALL om('M=M-DN ', m=a33, n=a13, d=d31, mesh=mesh)
188  CALL om('M=M-DN ', m=a33, n=a23, d=d32, mesh=mesh)
189 !
190 !=======================================================================
191 ! MULTIPLIES A ON THE RIGHT BY U INVERTED
192 !=======================================================================
193 !
194 ! A12 :
195  CALL om('M=M-ND ', m=a12, n=a11, d=d12, mesh=mesh)
196 ! A22 :
197  CALL om('M=M-ND ', m=a22, n=a21, d=d12, mesh=mesh)
198 ! A32 :
199  CALL om('M=M-ND ', m=a32, n=a31, d=d12, mesh=mesh)
200 ! A13 :
201  CALL om('M=M-ND ', m=a13, n=a11, d=d13, mesh=mesh)
202  CALL om('M=M-ND ', m=a13, n=a12, d=d23, mesh=mesh)
203 ! A23 :
204  CALL om('M=M-ND ', m=a23, n=a21, d=d13, mesh=mesh)
205  CALL om('M=M-ND ', m=a23, n=a22, d=d23, mesh=mesh)
206 ! A33 :
207  CALL om('M=M-ND ', m=a33, n=a31, d=d13, mesh=mesh)
208  CALL om('M=M-ND ', m=a33, n=a32, d=d23, mesh=mesh)
209 !
210 !-----------------------------------------------------------------------
211 !
212 ! NEW SECOND MEMBER
213 !
214  IF(prexsm) THEN
215 !
216  DO i = 1,npoin1
217  b2%R(i) = b2%R(i)-d21%R(i)*b1%R(i)
218  b3%R(i) = b3%R(i)-d31%R(i)*b1%R(i)-d32%R(i)*b2%R(i)
219  ENDDO
220 !
221  ENDIF
222 !
223 !-----------------------------------------------------------------------
224 !
225  RETURN
226  END
subroutine prebd9(X1, X2, X3, A11, A12, A13, A21, A22, A23, A31, A32, A33, B1, B2, B3, D11, D12, D13, D21, D22, D23, D31, D32, D33, MESH, PREXSM, DIADON)
Definition: prebd9.f:9
subroutine om(OP, M, N, D, C, MESH)
Definition: om.f:7
subroutine os(OP, X, Y, Z, C, IOPT, INFINI, ZERO)
Definition: os.f:7
Definition: bief.f:3