5 & (x,a,b,mesh,r0,v,av,cfg,infogr,aux)
159 TYPE(slvcfg),
INTENT(INOUT) :: CFG
160 TYPE(bief_obj),
INTENT(INOUT) :: B
161 TYPE(bief_obj),
INTENT(INOUT) :: X,V,AV,R0
162 TYPE(bief_mesh),
INTENT(INOUT) :: MESH
163 TYPE(bief_obj),
INTENT(IN) :: A
164 TYPE(bief_obj),
INTENT(INOUT) :: AUX
165 LOGICAL,
INTENT(IN) :: INFOGR
171 DOUBLE PRECISION H(21,20),C(20),S(20),E(21),BID
173 DOUBLE PRECISION R,ZZ,NB,PREC,NR0
177 LOGICAL RELAT,CROUT,GSEB,PRECO
184 IF(mod(cfg%PRECON,7).EQ.0) crout=.true.
186 IF(mod(cfg%PRECON,11).EQ.0) gseb=.true.
188 IF(crout.OR.gseb.OR.mod(cfg%PRECON,13).EQ.0) preco=.true.
193 CALL godown(b, aux,b,
'D',mesh,.false.)
211 CALL matrbl(
'X=AY ',r0,a,x,bid,mesh)
214 CALL godown(r0, aux,r0,
'D',mesh,.false.)
215 CALL puog(x,aux,x,
'D',mesh,.false.)
218 CALL os(
'X=X-Y ', x=r0, y=b)
226 IF(prec.LE.cfg%EPS)
GO TO 3000
243 CALL os(
'X=CY ', x=v%ADR(1)%P, y=r0, c=-1.d0/nr0)
254 CALL goup(b , aux , v%ADR(j)%P ,
'D',mesh,.true.)
255 CALL matrbl(
'X=AY ',av%ADR(j)%P,a,b,bid,mesh)
256 CALL godown(av%ADR(j)%P,aux,av%ADR(j)%P,
'D',mesh,.false.)
258 CALL matrbl(
'X=AY ',av%ADR(j)%P,a,v%ADR(j)%P,bid,mesh)
263 CALL os(
'X=Y ',x=v%ADR(j+1)%P,y=av%ADR(j)%P)
268 h(i,j) =
p_dots( v%ADR(j+1)%P , v%ADR(i)%P , mesh )
269 CALL os(
'X=X+CY ',x=v%ADR(j+1)%P,y=v%ADR(i)%P,c=-h(i,j))
272 h(j+1,j)=sqrt(
p_dots(v%ADR(j+1)%P,v%ADR(j+1)%P,mesh))
274 IF(h(j+1,j).LT.1.d-20)
THEN 276 WRITE(
lu,*)
'GMRES: NORM OF VECTOR ',j+1
277 WRITE(
lu,*)
'IN THE BASIS EQUALS ',h(j+1,j)
278 WRITE(
lu,*)
'SIZE OF KRYLOV SPACE REDUCED TO ',j
284 CALL os(
'X=CX ', x=v%ADR(j+1)%P, c=1.d0/h(j+1,j))
293 CALL goup(b , aux , v%ADR(k)%P ,
'D' ,mesh,.true.)
294 CALL matrbl(
'X=AY ',av%ADR(k)%P,a,b,bid,mesh)
295 CALL godown(av%ADR(k)%P,aux,av%ADR(k)%P,
'D',mesh,.false.)
297 CALL matrbl(
'X=AY ',av%ADR(k)%P,a,v%ADR(k)%P,bid,mesh)
300 h(k+1,k) =
p_dots( av%ADR(k)%P , av%ADR(k)%P , mesh )
303 h(i,k) =
p_dots( av%ADR(k)%P , v%ADR(i)%P , mesh )
304 h(k+1,k) = h(k+1,k) - h(i,k)**2
309 h(k+1,k) = sqrt( max(h(k+1,k),0.d0) )
325 zz = c(j) * h(j,i) + s(j) * h(j+1,i)
326 h(j+1,i) = -s(j) * h(j,i) + c(j) * h(j+1,i)
331 r = sqrt( h(i,i)**2 + h(i+1,i)**2 )
332 IF(abs(r).LT.1.d-6)
THEN 343 e(i+1) = -s(i) * e(i)
358 e(j) = e(j) - h(j,l) * e(l)
371 CALL os(
'X=X+CY ', x=x , y=v%ADR(l)%P , c=e(l))
375 CALL os(
'X=X+CY ', x=r0, y=av%ADR(l)%P, c= e(l))
386 IF (prec.GE.cfg%EPS.AND.m.LT.cfg%NITMAX)
GOTO 20
393 CALL goup( x,aux,x,
'D',mesh,.false.)
399 IF(m.LT.cfg%NITMAX)
THEN 420 92
FORMAT(1x,
'GMRES (BIEF) : ALGORITHM FAILED R=',g16.7,/,
421 & 1x,
' IF THE MATRIX IS DIAGONAL, CHOOSE',/,
422 & 1x,
' THE CONJUGATE GRADIENT SOLVER.')
423 102
FORMAT(1x,
'GMRES (BIEF) : ',
424 & 1i8,
' ITERATIONS, RELATIVE PRECISION:',g16.7)
425 202
FORMAT(1x,
'GMRES (BIEF) : ',
426 & 1i8,
' ITERATIONS, ABSOLUTE PRECISION:',g16.7)
427 104
FORMAT(1x,
'GMRES (BIEF) : EXCEEDING MAXIMUM ITERATIONS:',
428 & 1i8,
' RELATIVE PRECISION:',g16.7)
429 204
FORMAT(1x,
'GMRES (BIEF) : EXCEEDING MAXIMUM ITERATIONS:',
430 & 1i8,
' ABSOLUTE PRECISION:',g16.7)
subroutine godown(X, A, B, DITR, MESH, COPY)
subroutine goup(X, A, B, DITR, MESH, COPY)
subroutine gmres(X, A, B, MESH, R0, V, AV, CFG, INFOGR, AUX)
subroutine puog(X, A, B, DITR, MESH, COPY)
subroutine os(OP, X, Y, Z, C, IOPT, INFINI, ZERO)
subroutine matrbl(OP, X, A, Y, C, MESH)
double precision function p_dots(X, Y, MESH)