The TELEMAC-MASCARET system  trunk
cgstab.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE cgstab
3 ! *****************
4 !
5  &(x, a,b , mesh, p,q,r,s,t,v, cfg,infogr,aux)
6 !
7 !***********************************************************************
8 ! BIEF V7P1
9 !***********************************************************************
10 !
11 !brief SOLVES THE LINEAR SYSTEM A X = B
12 !+ USING THE SQUARED CONJUGATE GRADIENT METHOD STABILLISED.
13 !code
14 !+-----------------------------------------------------------------------
15 !+ PRECONDITIONING
16 !+ (ALSO SEE SOLV01)
17 !+-----------------------------------------------------------------------
18 !+ PRECON VALUE I MEANING
19 !+-----------------------------------------------------------------------
20 !+ 0 I NO PRECONDITIONING
21 !+ 2 I DIAGONAL PRECONDITIONING WITH THE MATRIX
22 !+ I DIAGONAL
23 !+ 3 I DIAGONAL PRECONDITIONING WITH THE CONDENSED
24 !+ I MATRIX
25 !+ 5 I DIAGONAL PRECONDITIONING BUT ACCEPTS 0 OR
26 !+ I NEGATIVE VALUES ON THE DIAGONAL
27 !+ 7 I CROUT
28 !+-----------------------------------------------------------------------
29 !
30 !history R RATKE (HANNOVER); A MALCHEREK (HANNOVER); J-M HERVOUET (LNH) ; F LEPEINTRE (LNH)
31 !+ 24/04/97
32 !+ V5P1
33 !+
34 !
35 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
36 !+ 13/07/2010
37 !+ V6P0
38 !+ Translation of French comments within the FORTRAN sources into
39 !+ English comments
40 !
41 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
42 !+ 21/08/2010
43 !+ V6P0
44 !+ Creation of DOXYGEN tags for automated documentation and
45 !+ cross-referencing of the FORTRAN sources
46 !
47 !history J-M HERVOUET (EDF LAB, LNHE)
48 !+ 10/06/2015
49 !+ V7P1
50 !+ CALL PARMOY removed, and stop if Crout preconditionning is asked
51 !+ in parallel.
52 !
53 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
54 !| A |-->| MATRIX OF THE SYSTEM
55 !| AUX |-->| PRECONDITIONING MATRIX
56 !| B |-->| RIGHT-HAND SIDE OF SYSTEM
57 !| CFG |-->| CFG(1): STORAGE OF MATRIX
58 !| | | CFG(2): MATRIX VECTOR PRODUCT
59 !| INFOGR |-->| IF YES, INFORMATION PRINTED
60 !| MESH |-->| MESH STRUCTURE
61 !| P |<->| WORK STRUCTURE
62 !| Q |<->| WORK STRUCTURE
63 !| R |<->| WORK STRUCTURE
64 !| S |<->| WORK STRUCTURE
65 !| T |<->| WORK STRUCTURE
66 !| V |<->| WORK STRUCTURE
67 !| X |<--| VALEUR INITIALE, PUIS SOLUTION
68 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
69 !
70  USE bief, ex_cgstab => cgstab
71 !
73  IMPLICIT NONE
74 !
75 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
76 !
77  TYPE(bief_obj) , INTENT(INOUT) :: X,P,Q,R,S,T,V
78  TYPE(bief_obj) , INTENT(IN) :: AUX,A,B
79  TYPE(bief_mesh) , INTENT(INOUT) :: MESH
80  TYPE(slvcfg) , INTENT(INOUT) :: CFG
81  LOGICAL , INTENT(IN) :: INFOGR
82 !
83 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
84 !
85  DOUBLE PRECISION ALFA,ALFA1,BETA,BETA1,OMEG,OMEG1,OMEG2
86  DOUBLE PRECISION XL,TESTL,RMRM,C
87 !
88  INTEGER M
89 !
90  LOGICAL RELAT,CROUT
91 !
92  DOUBLE PRECISION, PARAMETER :: RMIN = 1.d-15
93 !
94  INTRINSIC sqrt
95 !
96 !-----------------------------------------------------------------------
97 !
98 ! INITIALISES
99  crout=.false.
100  IF(7*(cfg%PRECON/7).EQ.cfg%PRECON) crout=.true.
101 !
102 !-----------------------------------------------------------------------
103 ! INITIALISES
104 !-----------------------------------------------------------------------
105 !
106  m = 0
107 !
108 ! NORM OF THE SECOND MEMBER TO COMPUTE THE RELATIVE ACCURACY:
109 !
110  xl = p_dots(b,b,mesh)
111  IF (xl.LT.1.d0) THEN
112  xl = 1.d0
113  relat = .false.
114  ELSE
115  relat = .true.
116  ENDIF
117 !
118 ! IF THE SECOND MEMBER IS 0, X=0 AND IT'S THE END
119 !
120  IF(sqrt(xl).LT.rmin) THEN
121  rmrm = 0.d0
122  CALL os( 'X=0 ' , x=x )
123  GOTO 900
124  ENDIF
125 !
126 ! COMPUTES THE INITIAL RESIDUAL AND EXITS IF RESIDUAL IS SMALL:
127 !
128  CALL matrbl( 'X=AY ',v,a,x,c, mesh)
129 !
130  CALL os( 'X=Y-Z ' , x=r , y=b , z=v )
131  rmrm = p_dots(r,r,mesh)
132 !
133  IF (rmrm.LT.cfg%EPS**2*xl) GO TO 900
134 !
135 !-----------------------------------------------------------------------
136 ! PRECONDITIONING :
137 !-----------------------------------------------------------------------
138 !
139  IF(crout) THEN
140 ! COMPUTES C R = B
141  IF(ncsize.GT.1) THEN
142  WRITE(lu,*) 'NO CROUT PRECONDITIONNING IN PARALLEL'
143  CALL plante(1)
144  stop
145  ENDIF
146  CALL downup(r, aux , b , 'D' , mesh)
147  ELSE
148  CALL os('X=Y ', x=r, y=b)
149  ENDIF
150 !
151 !-----------------------------------------------------------------------
152 ! RESUMES INITIALISATIONS
153 !-----------------------------------------------------------------------
154 !
155  IF(crout) THEN
156  IF(ncsize.GT.1) THEN
157  WRITE(lu,*) 'NO CROUT PRECONDITIONNING IN PARALLEL'
158  CALL plante(1)
159  stop
160  ENDIF
161  CALL downup(v, aux , v , 'D' , mesh)
162  ENDIF
163 !
164  CALL os('X=X-Y ', x=r, y=v)
165  CALL os('X=Y ', x=p, y=r)
166  CALL os('X=0 ', x=v )
167  CALL os('X=0 ', x=q )
168 !
169  alfa = 1.d0
170  beta = 1.d0
171  omeg1 = 1.d0
172 !
173 !-----------------------------------------------------------------------
174 ! ITERATIONS:
175 !-----------------------------------------------------------------------
176 !
177 2 CONTINUE
178  m = m + 1
179 !
180  beta1 = p_dots(r,p,mesh)
181  omeg2 = omeg1*beta1/beta
182  omeg = omeg2/alfa
183  beta = beta1
184 !
185  CALL os('X=Y+CZ ', x=q, y=r, z=q, c= omeg )
186  CALL os('X=X+CY ', x=q, y=v, z=v, c=-omeg2)
187 !
188  CALL matrbl( 'X=AY ',v,a,q,c, mesh)
189 !
190  IF(crout) THEN
191  IF(ncsize.GT.1) THEN
192  WRITE(lu,*) 'NO CROUT PRECONDITIONNING IN PARALLEL'
193  CALL plante(1)
194  stop
195  ENDIF
196  CALL downup(v, aux , v , 'D' , mesh)
197  ENDIF
198 !
199  omeg1 = p_dots(p,v,mesh)
200  omeg1 = beta1/omeg1
201 !
202  CALL os('X=Y+CZ ', x=s, y=r, z=v, c=-omeg1)
203 !
204  CALL matrbl( 'X=AY ',t,a,s,c, mesh)
205 !
206  IF(crout) THEN
207  IF(ncsize.GT.1) THEN
208  WRITE(lu,*) 'NO CROUT PRECONDITIONNING IN PARALLEL'
209  CALL plante(1)
210  stop
211  ENDIF
212  CALL downup(t, aux , t , 'D' , mesh)
213  ENDIF
214 !
215  alfa = p_dots(t,s,mesh)
216  alfa1 = p_dots(t,t,mesh)
217  alfa = alfa/alfa1
218 !
219  CALL os('X=X+CY ', x=x, y=q, c=omeg1)
220  CALL os('X=X+CY ', x=x, y=s, c=alfa )
221 !
222  CALL os('X=Y+CZ ', x=r, y=s, z=t, c=-alfa )
223 !
224  rmrm = p_dots(r,r,mesh)
225 !
226 ! TESTS CONVERGENCE :
227 !
228  IF (rmrm.LE.xl*cfg%EPS**2) GO TO 900
229 !
230  IF(m.LT.cfg%NITMAX) GO TO 2
231 !
232 !-----------------------------------------------------------------------
233 !
234 ! IF(INFOGR) THEN
235  testl = sqrt( rmrm / xl )
236  IF(relat) THEN
237  WRITE(lu,104) m,testl
238  ELSE
239  WRITE(lu,204) m,testl
240  ENDIF
241 ! ENDIF
242  GO TO 1000
243 !
244 !-----------------------------------------------------------------------
245 !
246 900 CONTINUE
247 !
248  IF(infogr) THEN
249  testl = sqrt( rmrm / xl )
250  IF(relat) THEN
251  WRITE(lu,103) m,testl
252  ELSE
253  WRITE(lu,203) m,testl
254  ENDIF
255  ENDIF
256 !
257 1000 RETURN
258 !
259 !-----------------------------------------------------------------------
260 !
261 ! FORMATS
262 !
263 103 FORMAT(1x,'CGSTAB (BIEF) : ',1i8,' ITERATIONS',
264  & ' RELATIVE PRECISION: ',g16.7)
265 203 FORMAT(1x,'CGSTAB (BIEF) : ',1i8,' ITERATIONS',
266  & ' ABSOLUTE PRECISION: ',g16.7)
267 104 FORMAT(1x,'CGSTAB (BIEF) : EXCEEDING MAXIMUM ITERATIONS ',1i8,
268  & ' RELATIVE PRECISION: ',g16.7)
269 204 FORMAT(1x,'CGSTAB (BIEF) : EXCEEDING MAXIMUM ITERATIONS',1i8,
270  & ' ABSOLUTE PRECISION:',g16.7)
271 !
272 !-----------------------------------------------------------------------
273 !
274  END
275 
subroutine downup(X, A, B, DITR, MESH)
Definition: downup.f:7
subroutine cgstab(X, A, B, MESH, P, Q, R, S, T, V, CFG, INFOGR, AUX)
Definition: cgstab.f:7
subroutine os(OP, X, Y, Z, C, IOPT, INFINI, ZERO)
Definition: os.f:7
double precision function q(I)
Definition: q.f:7
subroutine matrbl(OP, X, A, Y, C, MESH)
Definition: matrbl.f:7
double precision function p_dots(X, Y, MESH)
Definition: p_dots.f:7
Definition: bief.f:3