The TELEMAC-MASCARET system  trunk
errmin.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE errmin
3 ! *****************
4 !
5  &(x, a,b , mesh, d,ad,g,r, cfg,infogr,aux)
6 !
7 !***********************************************************************
8 ! BIEF V6P1 21/08/2010
9 !***********************************************************************
10 !
11 !brief SOLVES THE LINEAR SYSTEM A X = B
12 !+ USING METHODS OF THE TYPE CONJUGATE GRADIENT.
13 !code
14 !+-----------------------------------------------------------------------
15 !+ PRECONDITIONING
16 !+-----------------------------------------------------------------------
17 !+ PRECON VALUE I MEANING
18 !+-----------------------------------------------------------------------
19 !+ I
20 !+ 0 OR 1 I NO PRECONDITIONING
21 !+ I
22 !+ 2 I DIAGONAL PRECONDITIONING USING THE MATRIX
23 !+ I DIAGONAL
24 !+ 3 I BLOCK-DIAGONAL PRECONDITIONING
25 !+ I
26 !+ 5 I DIAGONAL PRECONDITIONING USING THE ABSOLUTE
27 !+ I VALUE OF THE MATRIX DIAGONAL
28 !+ I
29 !+ 7 I CROUT EBE PRECONDITIONING
30 !+ I
31 !+ 11 I GAUSS-SEIDEL EBE PRECONDITIONING
32 !+ I
33 !+-----------------------------------------------------------------------
34 !
35 !history J-M HERVOUET (LNH)
36 !+ 24/04/97
37 !+ V5P6
38 !+
39 !
40 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
41 !+ 13/07/2010
42 !+ V6P0
43 !+ Translation of French comments within the FORTRAN sources into
44 !+ English comments
45 !
46 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
47 !+ 21/08/2010
48 !+ V6P0
49 !+ Creation of DOXYGEN tags for automated documentation and
50 !+ cross-referencing of the FORTRAN sources
51 !
52 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
53 !| A |-->| MATRIX OF THE SYSTEM
54 !| AD |<->| WORK ARRAY: MATRICE A MULTIPLIED BY D.
55 !| AUX |-->| MATRIX FOR PRECONDITIONING.
56 !| B |-->| RIGHT-HAND SIDE OF THE SYSTEM
57 !| CFG |-->| STRUCTURE OF SOLVER CONFIGURATION
58 !| D |<->| WORK ARRAY: DIRECTION OF DESCENT.
59 !| G |<->| DESCENT GRADIENT.
60 !| INFOGR |-->| IF YES, PRINT A LOG.
61 !| MESH |-->| MESH STRUCTURE.
62 !| R |<->| RESIDUAL (MAY BE IN THE SAME MEMORY SPACE AS
63 !| | | GRADIENT DEPENDING ON CONDITIONING)
64 !| X |<->| INITIAL VALUE, THEN SOLUTION
65 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
66 !
67  USE bief, ex_errmin => errmin
68 !
70  IMPLICIT NONE
71 !
72 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
73 !
74  TYPE(slvcfg), INTENT(INOUT) :: CFG
75  TYPE(bief_obj), INTENT(INOUT) :: B
76  TYPE(bief_obj), INTENT(INOUT) :: D,AD,G,R,X
77  TYPE(bief_mesh), INTENT(INOUT) :: MESH
78  TYPE(bief_obj), INTENT(IN) :: A
79  TYPE(bief_obj), INTENT(INOUT) :: AUX
80  LOGICAL, INTENT(IN) :: INFOGR
81 !
82 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
83 !
84  INTEGER M
85 !
86  DOUBLE PRECISION XL,RMRM,TESTL,DD
87  DOUBLE PRECISION BETA,RO,GMGM,GM1GM1
88  DOUBLE PRECISION STO2,TGMTGM,C
89 !
90  LOGICAL RELAT,PREC,CROUT,GSEB
91 !
92 !-----------------------------------------------------------------------
93 !
94  INTRINSIC sqrt
95 !
96 !-----------------------------------------------------------------------
97 !
98 ! INITIALISES
99 ! STO2 AVOIDS A WARNING WITH CRAY COMPILERS
100  sto2 =0.d0
101  crout =.false.
102  IF(7*(cfg%PRECON/7).EQ.cfg%PRECON) crout=.true.
103  gseb=.false.
104  IF(11*(cfg%PRECON/11).EQ.cfg%PRECON) gseb=.true.
105  prec=.false.
106  IF(crout.OR.gseb.OR.13*(cfg%PRECON/13).EQ.cfg%PRECON) prec=.true.
107 !
108 !-----------------------------------------------------------------------
109 ! INITIALISES
110 !-----------------------------------------------------------------------
111 !
112  m = 0
113 !
114 ! NORMALISES THE SECOND MEMBER TO COMPUTE THE RELATIVE PRECISION:
115 !
116  xl = p_dots(b,b,mesh)
117  IF(xl.LT.1.d0) THEN
118  xl = 1.d0
119  relat = .false.
120  ELSE
121  relat = .true.
122  ENDIF
123 !
124 ! COMPUTES THE INITIAL RESIDUAL AND POSSIBLY EXITS:
125 !
126  CALL matrbl( 'X=AY ',r,a,x, c,mesh)
127 !
128  CALL os('X=X-Y ', x=r, y=b)
129  rmrm = p_dots(r,r,mesh)
130  gmgm = rmrm
131 !
132  IF (rmrm.LT.cfg%EPS**2*xl) GO TO 900
133 !
134 !-----------------------------------------------------------------------
135 ! PRECONDITIONING :
136 !-----------------------------------------------------------------------
137 !
138  IF(prec) THEN
139 !
140 ! COMPUTES C G0 = R
141  CALL downup(g, aux , r , 'D' , mesh)
142 !
143 ! C IS HERE CONSIDERED SYMMETRICAL,
144 ! SHOULD OTHERWISE SOLVE TC GPRIM = G
145 !
146 ! T -1
147 ! C G IS PUT IN B
148  CALL downup(b , aux , g , 'T' , mesh)
149  gmgm = p_dots(g,g,mesh)
150  sto2 = gmgm
151 !
152  ENDIF
153 !
154 !-----------------------------------------------------------------------
155 ! COMPUTES THE DIRECTION OF INITIAL DESCENT:
156 !-----------------------------------------------------------------------
157 !
158  IF(prec) THEN
159  CALL matrbl( 'X=TAY ',d,a,b, c,mesh)
160  ELSE
161  CALL matrbl( 'X=TAY ',d,a,g, c,mesh)
162  ENDIF
163 !
164  tgmtgm = p_dots(d,d,mesh)
165 !
166 !-----------------------------------------------------------------------
167 ! COMPUTES THE INITIAL PRODUCT A D:
168 !-----------------------------------------------------------------------
169 !
170  CALL matrbl( 'X=AY ',ad,a,d, c,mesh)
171 !
172 !-----------------------------------------------------------------------
173 ! COMPUTES INITIAL RO:
174 !-----------------------------------------------------------------------
175 !
176  ro = gmgm/tgmtgm
177 !
178 !-----------------------------------------------------------------------
179 !
180 ! COMPUTES X1 = X0 - RO * D
181 !
182  CALL os('X=X+CY ', x=x, y=d, c=-ro)
183 !
184 !-----------------------------------------------------------------------
185 ! ITERATIONS LOOP:
186 !-----------------------------------------------------------------------
187 !
188 2 m = m + 1
189 !
190 !-----------------------------------------------------------------------
191 ! COMPUTES THE RESIDUAL : R(M) = R(M-1) - RO(M-1) A D(M-1)
192 !-----------------------------------------------------------------------
193 !
194  CALL os('X=X+CY ', x=r, y=ad, c=-ro)
195 !
196 ! SOME VALUES WILL CHANGE IN CASE OF PRECONDITIONING
197 !
198  gm1gm1 = gmgm
199  rmrm = p_dots(r,r,mesh)
200  gmgm = rmrm
201 !
202 ! CHECKS END :
203 !
204  IF (rmrm.LE.xl*cfg%EPS**2) GO TO 900
205 !
206 !-----------------------------------------------------------------------
207 ! PRECONDITIONING : SOLVES C G = R
208 !-----------------------------------------------------------------------
209 !
210  IF(prec) THEN
211 !
212 ! SOLVES C G = R
213  CALL downup(g, aux , r , 'D' , mesh)
214 !
215  CALL downup(b , aux , g , 'T' , mesh)
216  gm1gm1 = sto2
217  gmgm = p_dots(g,g,mesh)
218  sto2 = gmgm
219 !
220  ENDIF
221 !
222 !-----------------------------------------------------------------------
223 ! COMPUTES D BY RECURRENCE:
224 !-----------------------------------------------------------------------
225 !
226  IF(prec) THEN
227 ! T T -1 T -1
228 ! AD IS HERE A C G B IS C G
229  CALL matrbl( 'X=TAY ',ad,a,b, c,mesh)
230  ELSE
231 ! AD IS HERE TAG
232  CALL matrbl( 'X=TAY ',ad,a,g, c,mesh)
233  ENDIF
234 !
235  beta = gmgm/gm1gm1
236 !
237  CALL os('X=CX ', x=d, c=beta)
238 !
239 ! AD IS HERE TAG
240  CALL os('X=X+Y ', x=d, y=ad)
241 !
242 !-----------------------------------------------------------------------
243 ! COMPUTES A D :
244 !-----------------------------------------------------------------------
245 !
246  CALL matrbl( 'X=AY ',ad,a,d, c,mesh)
247 !
248 !-----------------------------------------------------------------------
249 ! COMPUTES RO
250 !-----------------------------------------------------------------------
251 !
252  dd = p_dots(d,d,mesh)
253  ro = gmgm/dd
254 !
255 ! COMPUTES X(M) = X(M-1) - RO * D
256 !
257  CALL os('X=X+CY ', x=x, y=d, c=-ro)
258 !
259  IF(m.LT.cfg%NITMAX) GO TO 2
260 !
261 !-----------------------------------------------------------------------
262 !
263 ! IF(INFOGR) THEN
264  testl = sqrt( rmrm / xl )
265  IF (relat) THEN
266  WRITE(lu,104) m,testl
267  ELSE
268  WRITE(lu,204) m,testl
269  ENDIF
270 ! ENDIF
271  GO TO 1000
272 !
273 !-----------------------------------------------------------------------
274 !
275 900 CONTINUE
276 !
277  IF(infogr) THEN
278  testl = sqrt( rmrm / xl )
279  IF (relat) THEN
280  WRITE(lu,102) m,testl
281  ELSE
282  WRITE(lu,202) m,testl
283  ENDIF
284  ENDIF
285 !
286 1000 RETURN
287 !
288 !-----------------------------------------------------------------------
289 !
290 ! FORMATS
291 !
292 102 FORMAT(1x,'ERRMIN (BIEF) : ',
293  & 1i8,' ITERATIONS, RELATIVE PRECISION:',g16.7)
294 202 FORMAT(1x,'ERRMIN (BIEF) : ',
295  & 1i8,' ITERATIONS, ABSOLUTE PRECISION:',g16.7)
296 104 FORMAT(1x,'ERRMIN (BIEF) : EXCEEDING MAXIMUM ITERATIONS:',
297  & 1i8,' RELATIVE PRECISION:',g16.7)
298 204 FORMAT(1x,'ERRMIN (BIEF) : EXCEEDING MAXIMUM ITERATIONS:',
299  & 1i8,' ABSOLUTE PRECISON:',g16.7)
300 !
301 !-----------------------------------------------------------------------
302 !
303  END
subroutine downup(X, A, B, DITR, MESH)
Definition: downup.f:7
subroutine os(OP, X, Y, Z, C, IOPT, INFINI, ZERO)
Definition: os.f:7
subroutine errmin(X, A, B, MESH, D, AD, G, R, CFG, INFOGR, AUX)
Definition: errmin.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