The TELEMAC-MASCARET system  trunk
prebd4.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE prebd4
3 ! *****************
4 !
5  &(x1,x2,a11,a12,a21,a22,b1,b2,d11,d12,d21,d22,
6  & mesh,prexsm,diadon)
7 !
8 !***********************************************************************
9 ! BIEF V6P1 21/08/2010
10 !***********************************************************************
11 !
12 !brief BLOCK-DIAGONAL PRECONDITIONING OF A SYSTEM A X = B.
13 !
14 !history J.M. HERVOUET (LNH)
15 !+ 23/12/94
16 !+ V5P1
17 !+
18 !
19 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
20 !+ 13/07/2010
21 !+ V6P0
22 !+ Translation of French comments within the FORTRAN sources into
23 !+ English comments
24 !
25 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
26 !+ 21/08/2010
27 !+ V6P0
28 !+ Creation of DOXYGEN tags for automated documentation and
29 !+ cross-referencing of the FORTRAN sources
30 !
31 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
32 !| A11 |<->| TERM (1,1) OF MATRIX
33 !| A12 |<->| TERM (1,2) OF MATRIX
34 !| A21 |<->| TERM (2,1) OF MATRIX
35 !| A22 |<->| TERM (2,2) OF MATRIX
36 !| B1 |<->| FIRST RIGHT-HAND SIDE
37 !| B2 |<->| SECOND RIGHT-HAND SIDE
38 !| D11 |<--| DIAGONAL MATRIX
39 !| D12 |<--| DIAGONAL MATRIX
40 !| D21 |<--| DIAGONAL MATRIX
41 !| D22 |<--| 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 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
48 !
49  USE bief, ex_prebd4 => prebd4
50 !
52  IMPLICIT NONE
53 !
54 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
55 !
56  LOGICAL, INTENT(IN) :: PREXSM,DIADON
57 !
58 !-----------------------------------------------------------------------
59 !
60 ! VECTOR STRUCTURES
61 !
62  TYPE(bief_obj), INTENT(INOUT) :: X1,B2,D11,D12,D21,D22
63  TYPE(bief_obj), INTENT(IN) :: X2,B1
64 !
65 !-----------------------------------------------------------------------
66 !
67 ! MATRIX STRUCTURES
68 !
69  TYPE(bief_obj), INTENT(INOUT) :: A11,A12,A21,A22
70 !
71 !-----------------------------------------------------------------------
72 !
73 ! MESH STRUCTURE
74 !
75  TYPE(bief_mesh), INTENT(INOUT) :: MESH
76 !
77 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
78 !
79  INTEGER I,NPOIN1,NPOIN2
80 !
81 !-----------------------------------------------------------------------
82 !
83  npoin1 = x1%DIM1
84  npoin2 = x2%DIM1
85 !
86  IF(npoin2.NE.npoin1) THEN
87  WRITE(lu,200)
88 200 FORMAT(1x,'PREBD4 (BIEF) : RECTANGULAR MATRICES',/,1x,
89  & 'BLOCK-DIAGONAL PRECONDITIONING IMPOSSIBLE IN THIS CASE')
90  CALL plante(1)
91  stop
92  ENDIF
93 !
94 !-----------------------------------------------------------------------
95 !
96 ! PREPARES THE DIAGONALS:
97 !
98  IF(.NOT.diadon) THEN
99 !
100  CALL os('X=Y ', x=d11, y=a11%D)
101  CALL os('X=Y ', x=d12, y=a12%D)
102  CALL os('X=Y ', x=d21, y=a21%D)
103  CALL os('X=Y ', x=d22, y=a22%D)
104 !
105  ENDIF
106 !
107 !-----------------------------------------------------------------------
108 !
109 ! L D U FACTORISATION OF THE DIAGONAL BLOCK:
110 !
111 ! ONLY D11 INVERTED IS NOW USED
112  CALL os('X=1/Y ', x=d11, y=d11)
113 !
114  DO i = 1,npoin1
115 !
116  d21%R(i) = d21%R(i) * d11%R(i)
117  d22%R(i) = d22%R(i) - d21%R(i) * d12%R(i)
118  d12%R(i) = d12%R(i) * d11%R(i)
119 !
120  ENDDO
121 !
122 !-----------------------------------------------------------------------
123 !
124 ! CHANGE OF VARIABLES:
125 !
126  IF(prexsm) THEN
127 !
128  CALL os('X=X+YZ ', x=x1, y=x2, z=d12)
129 !
130  ENDIF
131 !
132 ! COMPUTES THE SQUARE ROOT
133 ! INVERTS D11,D22,D33
134 ! (THEY ARE ONLY USED IN THIS FORM FROM NOW ON)
135 !
136 ! INVERSION OF D11 ALREADY PERFORMED
137  CALL os('X=1/Y ', x=d22, y=d22)
138  CALL os('X=SQR(Y)', x=d11, y=d11)
139  CALL os('X=SQR(Y)', x=d22, y=d22)
140 !
141 !=======================================================================
142 ! MULTIPLIES A ON THE LEFT BY L INVERTED
143 !=======================================================================
144 !
145 ! A21 :
146  CALL om('M=M-DN ', m=a21, n=a11, d=d21, mesh=mesh)
147 ! A22 :
148  CALL om('M=M-DN ', m=a22, n=a12, d=d21, mesh=mesh)
149 !
150 !=======================================================================
151 ! MULTIPLIES A ON THE RIGHT BY U INVERTED
152 !=======================================================================
153 !
154 ! A12 :
155  CALL om('M=M-ND ', m=a12, n=a11, d=d12, mesh=mesh)
156 ! A22 :
157  CALL om('M=M-ND ', m=a22, n=a21, d=d12, mesh=mesh)
158 !
159 !-----------------------------------------------------------------------
160 !
161 ! NEW SECOND MEMBER
162 !
163  IF(prexsm) THEN
164 !
165  DO i = 1,npoin1
166  b2%R(i) = b2%R(i) - d21%R(i) * b1%R(i)
167  ENDDO
168 !
169  ENDIF
170 !
171 !-----------------------------------------------------------------------
172 !
173  RETURN
174  END
subroutine om(OP, M, N, D, C, MESH)
Definition: om.f:7
subroutine prebd4(X1, X2, A11, A12, A21, A22, B1, B2, D11, D12, D21, D22, MESH, PREXSM, DIADON)
Definition: prebd4.f:8
subroutine os(OP, X, Y, Z, C, IOPT, INFINI, ZERO)
Definition: os.f:7
Definition: bief.f:3