37 integer(kind=kint ),
intent(inout):: iter, error
38 real (kind=
kreal),
intent(inout):: resid, tset, tsol, tcomm
40 integer(kind=kint ) :: n, np, ndof, nndof
41 integer(kind=kint ) :: my_rank
42 integer(kind=kint ) :: iterlog, timelog
43 real(kind=
kreal),
pointer :: b(:), x(:)
45 real(kind=
kreal),
dimension(:,:),
allocatable :: ww
47 integer(kind=kint),
parameter :: r= 1
48 integer(kind=kint),
parameter :: z= 2
49 integer(kind=kint),
parameter :: q= 2
50 integer(kind=kint),
parameter :: p= 3
51 integer(kind=kint),
parameter :: wk= 4
53 integer(kind=kint ) :: maxit
56 real (kind=
kreal) :: tol
57 integer(kind=kint )::i
58 real (kind=
kreal)::s_time,s1_time,e_time,e1_time, start_time, end_time
59 real (kind=
kreal)::bnrm2
60 real (kind=
kreal)::rho,rho1,beta,c1,alpha,dnrm2
61 real (kind=
kreal)::t_max,t_min,t_avg,t_sd
62 integer(kind=kint) ::estcond
63 real (kind=
kreal),
allocatable::d(:),e(:)
64 real (kind=
kreal)::alpha1
65 integer(kind=kint) :: n_indef_precond
67 integer(kind=kint),
parameter :: n_iter_recompute_r= 50
81 my_rank = hecmesh%my_rank
97 allocate (ww(ndof*np, 4))
108 if (estcond /= 0 .and. hecmesh%my_rank == 0)
then
109 allocate(d(maxit),e(maxit-1))
127 if (bnrm2.eq.0.d0)
then
135 if (timelog.eq.2)
then
137 t_max, t_min, t_avg, t_sd)
138 if (hecmesh%my_rank.eq.0)
then
139 write(*,*)
'Time solver setup'
140 write(*,*)
' Max :',t_max
141 write(*,*)
' Min :',t_min
142 write(*,*)
' Avg :',t_avg
143 write(*,*)
' Std Dev :',t_sd
147 tset = e_time - s_time
173 if (rho == 0.d0)
then
176 elseif (iter > 1 .and. rho*rho1 <= 0)
then
177 n_indef_precond = n_indef_precond + 1
178 if (n_indef_precond >= 3)
then
183 elseif (rho /= rho)
then
194 if ( iter.eq.1 )
then
198 call hecmw_xpay_r(hecmesh, ndof, beta, ww(:,z), ww(:,p))
206 call hecmw_matvec(hecmesh, hecmat, ww(:,p), ww(:,q), tcomm)
219 elseif (c1 /= c1)
then
234 if ( mod(iter,n_iter_recompute_r)==0 )
then
237 call hecmw_axpy_r(hecmesh, ndof, -alpha, ww(:,q), ww(:,r))
242 resid= dsqrt(dnrm2/bnrm2)
245 if (my_rank.eq.0.and.iterlog.eq.1)
write (*,
'(i7, 1pe16.6)') iter, resid
248 if (estcond /= 0 .and. hecmesh%my_rank == 0)
then
252 d(iter) = 1.d0 / alpha + beta / alpha1
253 e(iter-1) = sqrt(beta) / alpha1
259 if ( resid.le.tol )
then
260 if ( mod(iter,n_iter_recompute_r)==0 )
exit
264 resid= dsqrt(dnrm2/bnrm2)
265 if ( resid.le.tol )
exit
282 tcomm = tcomm + end_time - start_time
291 if (estcond /= 0 .and. error == 0 .and. hecmesh%my_rank == 0)
then
297 if (timelog.eq.2)
then
299 t_max, t_min, t_avg, t_sd)
300 if (hecmesh%my_rank.eq.0)
then
301 write(*,*)
'Time solver iterations'
302 write(*,*)
' Max :',t_max
303 write(*,*)
' Min :',t_min
304 write(*,*)
' Avg :',t_avg
305 write(*,*)
' Std Dev :',t_sd
309 tsol = e1_time - s1_time