5 &(x, a,b , mesh, d,ad,g,r, cfg,infogr,aux)
81 TYPE(slvcfg),
INTENT(INOUT) :: CFG
82 TYPE(bief_obj),
INTENT(INOUT) :: B
83 TYPE(bief_obj),
INTENT(INOUT) :: D,AD,G,R,X
84 TYPE(bief_mesh),
INTENT(INOUT) :: MESH
85 TYPE(bief_obj),
INTENT(IN) :: A
86 TYPE(bief_obj),
INTENT(INOUT) :: AUX
87 LOGICAL,
INTENT(IN) :: INFOGR
93 DOUBLE PRECISION XL,RMRM,RMDM,RMGM,TESTL
94 DOUBLE PRECISION BETA,RO,DAD,RM1GM1,STO1,C
96 LOGICAL RELAT,PREC,CROUT,GSEB,PRE3D,PREBE
98 DOUBLE PRECISION,
PARAMETER :: RMIN = 1.d-15
104 #if defined COMPAD_DCO_T1S || COMPAD_DCO_T1V 106 DOUBLE PRECISION :: DRV_ERR
107 DOUBLE PRECISION,
DIMENSION(:),
ALLOCATABLE :: DRV0, DRV1
109 #if defined COMPAD_DCO_T1V 122 #if defined COMPAD_DCO_T1S || COMPAD_DCO_T1V 132 # if defined COMPAD_DCO_T1S 133 CALL dco_t1s_set( x%ADR(1)%P%R, 0.d0, 1 )
135 # if defined COMPAD_DCO_T1V 136 t1v_nod = dco_t1v_get_nod()
139 CALL dco_t1v_set( x%ADR(1)%P%R, 0.d0, 1, i )
151 drv_elms = x%ADR(1)%P%DIM1
152 ALLOCATE( drv0(drv_elms), drv1(drv_elms))
155 # if defined COMPAD_DCO_T1S 156 CALL dco_t1s_get( x%ADR(1)%P%R, drv0, 1 )
158 # if defined COMPAD_DCO_T1V 159 CALL dco_t1v_get( x%ADR(1)%P%R, drv0, 1, 1 )
167 IF(07*(cfg%PRECON/07).EQ.cfg%PRECON) crout=.true.
169 IF(11*(cfg%PRECON/11).EQ.cfg%PRECON) gseb=.true.
171 IF(13*(cfg%PRECON/13).EQ.cfg%PRECON) prebe=.true.
173 IF(17*(cfg%PRECON/17).EQ.cfg%PRECON) pre3d=.true.
175 IF(crout.OR.gseb.OR.prebe.OR.pre3d) prec=.true.
191 IF(testl.LT.rmin)
THEN 208 CALL matrbl(
'X=AY ',r,a,x, c,mesh)
210 CALL os(
'X=X-Y ', x=r, y=b)
214 IF (rmrm.LT.cfg%EPS**2*xl)
GO TO 900
222 IF(crout.OR.gseb.OR.prebe)
THEN 224 WRITE(
lu,*)
'NO CROUT PRECONDITIONNING IN PARALLEL' 228 CALL downup( g, aux , r ,
'D' , mesh )
230 CALL cpstvc(r%ADR(1)%P,g%ADR(1)%P)
231 CALL trid3d(aux%X%R,g%ADR(1)%P%R,r%ADR(1)%P%R,
243 CALL os(
'X=Y ', x=d, y=g)
249 CALL matrbl(
'X=AY ',ad,a,d,c,mesh)
263 CALL os(
'X=X+CY ',x=x,y=d,c=-ro)
267 #if defined COMPAD_DCO_T1S 268 CALL dco_t1s_get( x%ADR(1)%P%R, drv1, 1 )
270 #if defined COMPAD_DCO_T1V 271 CALL dco_t1v_get( x%ADR(1)%P%R, drv1, 1, 1 )
284 CALL os(
'X=X+CY ',x=r,y=ad,c=-ro)
296 finish = rmrm.LE.xl*cfg%EPS**2
297 #if defined COMPAD_DCO_T1S || COMPAD_DCO_T1V 302 drv_err = sum( drv1 - drv0 )**2
310 finish = finish .AND. (drv_err .LE. cfg%EPS**2 )
320 IF ( finish )
GO TO 900
329 IF(crout.OR.gseb.OR.prebe)
THEN 331 WRITE(
lu,*)
'NO CROUT PRECONDITIONNING IN PARALLEL' 335 CALL downup( g, aux , r ,
'D' , mesh )
337 CALL cpstvc(r%ADR(1)%P,g%ADR(1)%P)
338 CALL trid3d(aux%X%R,g%ADR(1)%P%R,r%ADR(1)%P%R,
354 CALL os(
'X=Y+CZ ' , x=d , y=g , z=d , c=beta )
369 CALL matrbl(
'X=AY ',ad,a,d,c,mesh)
380 CALL os(
'X=X+CY ',x=x,y=d,c=-ro)
383 #if defined COMPAD_DCO_T1S || COMPAD_DCO_T1V 388 # if defined COMPAD_DCO_T1S 389 CALL dco_t1s_get( x%ADR(1)%P%R, drv1, 1 )
391 # if defined COMPAD_DCO_T1V 392 CALL dco_t1v_get( x%ADR(1)%P%R, drv1, 1, 1 )
397 IF(m.LT.cfg%NITMAX)
GO TO 2
402 testl = sqrt( rmrm / xl )
404 WRITE(
lu,104) m,testl
406 WRITE(
lu,204) m,testl
416 testl = sqrt( rmrm / xl )
418 WRITE(
lu,102) m,testl
420 WRITE(
lu,202) m,testl
428 #if defined COMPAD_DCO_T1S || COMPAD_DCO_T1V 442 102
FORMAT(1x,
'GRACJG (BIEF) : ',
443 & 1i8,
' ITERATIONS, RELATIVE PRECISION:',g16.7)
444 202
FORMAT(1x,
'GRACJG (BIEF) : ',
445 & 1i8,
' ITERATIONS, ABSOLUTE PRECISION:',g16.7)
446 104
FORMAT(1x,
'GRACJG (BIEF) : EXCEEDING MAXIMUM ITERATIONS:',
447 & 1i8,
' RELATIVE PRECISION:',g16.7)
448 106
FORMAT(1x,
'GRACJG (BIEF) : ',
449 &
' SOLUTION X=0 BECAUSE L2-NORM OF B VERY SMALL:',g16.7)
450 204
FORMAT(1x,
'GRACJG (BIEF) : EXCEEDING MAXIMUM ITERATIONS:',
451 & 1i8,
' ABSOLUTE PRECISION:',g16.7)
integer function bief_nbpts(IELM, MESH)
subroutine trid3d(XAUX, X, B, NPOIN, NPOIN2)
subroutine downup(X, A, B, DITR, MESH)
subroutine gracjg(X, A, B, MESH, D, AD, G, R, CFG, INFOGR, AUX)
logical ad_linsolv_resetderiv
subroutine os(OP, X, Y, Z, C, IOPT, INFINI, ZERO)
subroutine matrbl(OP, X, A, Y, C, MESH)
logical ad_linsolv_derivative_convergence
double precision function p_dots(X, Y, MESH)