32 integer(kind=kint ),
intent(inout):: ITER, error
33 real (kind=
kreal),
intent(inout):: resid, tset, tsol, tcomm
35 integer(kind=kint ) :: N, NP, NDOF, NNDOF
36 integer(kind=kint ) :: my_rank
37 integer(kind=kint ) :: ITERlog, TIMElog
38 real(kind=
kreal),
pointer :: b(:), x(:)
40 real(kind=
kreal),
dimension(:,:),
allocatable :: ww
41 real(kind=
kreal),
dimension(2) :: cg
43 integer(kind=kint ) :: MAXIT
46 real (kind=
kreal):: tol
47 integer(kind=kint )::i
48 real (kind=
kreal)::s_time,s1_time,e_time,e1_time, start_time, end_time
49 real (kind=
kreal)::bnrm2,c2
50 real (kind=
kreal)::rho,rho1,beta,alpha,dnrm2
51 real (kind=
kreal)::omega
52 real (kind=
kreal)::t_max,t_min,t_avg,t_sd
54 integer(kind=kint),
parameter :: R = 1
55 integer(kind=kint),
parameter :: RT= 2
56 integer(kind=kint),
parameter :: P = 3
57 integer(kind=kint),
parameter :: PT= 4
58 integer(kind=kint),
parameter :: S = 5
59 integer(kind=kint),
parameter :: ST= 1
60 integer(kind=kint),
parameter :: T = 6
61 integer(kind=kint),
parameter :: V = 7
62 integer(kind=kint),
parameter :: WK= 8
64 integer(kind=kint),
parameter :: N_ITER_RECOMPUTE_R= 100
78 my_rank = hecmesh%my_rank
93 allocate (ww(ndof*np, 8))
121 if (bnrm2.eq.0.d0)
then
129 if (timelog.eq.2)
then
131 t_max, t_min, t_avg, t_sd)
132 if (hecmesh%my_rank.eq.0)
then
133 write(*,*)
'Time solver setup'
134 write(*,*)
' Max :',t_max
135 write(*,*)
' Min :',t_min
136 write(*,*)
' Avg :',t_avg
137 write(*,*)
' Std Dev :',t_sd
141 tset = e_time - s_time
165 if ( iter.gt.1 )
then
166 beta = (rho/rho1) * (alpha/omega)
168 ww(i,p) = ww(i,r) + beta * (ww(i,p) - omega * ww(i,v))
188 call hecmw_matvec(hecmesh, hecmat, ww(:,pt), ww(:,v), tcomm)
199 ww(i,s) = ww(i,r) - alpha * ww(i,v)
214 call hecmw_matvec(hecmesh, hecmat, ww(:,st), ww(:,t), tcomm)
226 tcomm = tcomm + e_time - s_time
228 omega = cg(1) / cg(2)
236 x(i) = x(i) + alpha * ww(i,pt) + omega * ww(i,st)
240 if ( mod(iter,n_iter_recompute_r)==0 )
then
244 ww(i,r) = ww(i,s) - omega * ww(i,t)
250 resid= dsqrt(dnrm2/bnrm2)
253 if (my_rank.eq.0.and.iterlog.eq.1)
write (*,
'(i7, 1pe16.6)') iter, resid
256 if ( resid.le.tol )
then
257 if ( mod(iter,n_iter_recompute_r)==0 )
exit
261 resid= dsqrt(dnrm2/bnrm2)
262 if ( resid.le.tol )
exit
280 tcomm = tcomm + end_time - start_time
286 if (timelog.eq.2)
then
288 t_max, t_min, t_avg, t_sd)
289 if (hecmesh%my_rank.eq.0)
then
290 write(*,*)
'Time solver iterations'
291 write(*,*)
' Max :',t_max
292 write(*,*)
' Min :',t_min
293 write(*,*)
' Avg :',t_avg
294 write(*,*)
' Std Dev :',t_sd
298 tsol = e1_time - s1_time