34 integer(kind=kint ),
intent(inout):: iter, error
35 real (kind=
kreal),
intent(inout):: resid, tset, tsol, tcomm
37 integer(kind=kint ) :: n, np, ndof, nndof
38 integer(kind=kint ) :: my_rank
40 real (kind=
kreal),
pointer :: b(:)
41 real (kind=
kreal),
pointer :: x(:)
43 integer(kind=kint ) :: iterlog, timelog
45 real(kind=
kreal),
dimension(:,:),
allocatable :: ww
47 real(kind=
kreal),
dimension(2) :: rr
49 integer(kind=kint ) :: maxit
50 real (kind=
kreal) :: tol
51 integer(kind=kint ) :: i,j
52 real (kind=
kreal) :: s_time,s1_time,e_time,e1_time
53 real (kind=
kreal) :: bnrm2
54 real (kind=
kreal) :: rho,rho1,beta,alpha,dnrm2
55 real (kind=
kreal) :: qsi,eta,coef1
56 real (kind=
kreal) :: t_max,t_min,t_avg,t_sd
58 integer(kind=kint),
parameter :: r= 1
59 integer(kind=kint),
parameter ::rt= 2
60 integer(kind=kint),
parameter :: t= 3
61 integer(kind=kint),
parameter ::tt= 4
62 integer(kind=kint),
parameter ::t0= 5
63 integer(kind=kint),
parameter :: p= 6
64 integer(kind=kint),
parameter ::pt= 7
65 integer(kind=kint),
parameter :: u= 8
66 integer(kind=kint),
parameter ::w1= 9
67 integer(kind=kint),
parameter :: y=10
68 integer(kind=kint),
parameter :: z=11
69 integer(kind=kint),
parameter ::wk=12
70 integer(kind=kint),
parameter ::w2=13
71 integer(kind=kint),
parameter ::zq=14
73 integer(kind=kint),
parameter :: n_iter_recompute_r= 20
83 my_rank = hecmesh%my_rank
95 allocate (ww(ndof*np,14))
127 if (bnrm2.eq.0.d0)
then
137 if (timelog.eq.2)
then
139 t_max, t_min, t_avg, t_sd)
140 if (hecmesh%my_rank.eq.0)
then
141 write(*,*)
'Time solver setup'
142 write(*,*)
' Max :',t_max
143 write(*,*)
' Min :',t_min
144 write(*,*)
' Avg :',t_avg
145 write(*,*)
' Std Dev :',t_sd
149 tset = e_time - s_time
190 call hecmw_matvec(hecmesh, hecmat, ww(:,p), ww(:,pt), tcomm)
205 call hecmw_axpyz_r(nndof, -1.0d0, ww(:,w1), ww(:,pt), ww(:,y))
208 call hecmw_axpyz_r(nndof, -alpha, ww(:,pt), ww(:,wk), ww(:,t))
230 call hecmw_matvec(hecmesh, hecmat, ww(:,tt), ww(:,wk), tcomm)
242 call pol_coef_vanilla2(iter, ww, t, tt, y, qsi, eta)
262 call hecmw_axpyz_r(nndof, -1.0d0, ww(:,r), ww(:,t0), ww(:,u))
279 if ( mod(iter,n_iter_recompute_r)==0 )
then
291 tcomm = tcomm + e_time - s_time
295 beta = alpha*coef1 / (qsi*rho)
296 call hecmw_axpyz_r(nndof, beta, ww(:,pt), ww(:,tt), ww(:,w1))
298 resid= dsqrt(dnrm2/bnrm2)
302 if (my_rank.eq.0 .and. iterlog.eq.1) &
303 &
write (*, 1000) iter, resid
304 1000
format (i5, 1pe16.6)
307 if (resid.le.tol )
then
308 if ( mod(iter,n_iter_recompute_r)==0 )
exit
312 resid= dsqrt(dnrm2/bnrm2)
313 if (resid.le.tol)
exit
326 tcomm = tcomm + e_time - s_time
332 if (timelog.eq.2)
then
334 t_max, t_min, t_avg, t_sd)
335 if (hecmesh%my_rank.eq.0)
then
336 write(*,*)
'Time solver iterations'
337 write(*,*)
' Max :',t_max
338 write(*,*)
' Min :',t_min
339 write(*,*)
' Avg :',t_avg
340 write(*,*)
' Std Dev :',t_sd
344 tsol = e1_time - s1_time
354 integer(kind=kint),
intent(in) :: iter
355 real(kind=
kreal),
intent(in) :: ww(:,:)
356 integer(kind=kint),
intent(in) :: T, TT, Y
357 real(kind=
kreal),
intent(out) :: qsi, eta
359 real(kind=
kreal),
dimension(5) :: cg
360 real(kind=
kreal),
dimension(2) :: eq
361 real(kind=
kreal) :: delta
371 tcomm = tcomm + e_time - s_time
377 delta= (cg(5)*cg(1)-cg(4)*cg(4))
378 eq(1)= (cg(1)*cg(2)-cg(3)*cg(4)) / delta
379 eq(2)= (cg(5)*cg(3)-cg(4)*cg(2)) / delta
390 subroutine pol_coef_vanilla(iter, WW, T, TT, Y, QSI, ETA)
392 integer(kind=kint),
intent(in) :: iter
393 real(kind=
kreal),
intent(inout) :: ww(:,:)
394 integer(kind=kint),
intent(in) :: T, TT, Y
395 real(kind=
kreal),
intent(out) :: qsi, eta
397 real(kind=
kreal),
dimension(3) :: cg
398 real(kind=
kreal) :: gamma1, gamma2
399 real(kind=
kreal) :: c, c_abs
401 real(kind=
kreal),
parameter :: omega = 0.707106781d0
413 tcomm = tcomm + e_time - s_time
429 tcomm = tcomm + e_time - s_time
431 c = cg(3) / dsqrt(cg(1)*cg(2))
433 if (c_abs > omega)
then
434 qsi = c * dsqrt(cg(1)/cg(2))
438 qsi = omega * dsqrt(cg(1)/cg(2))
440 qsi = -omega * dsqrt(cg(1)/cg(2))
443 eta = gamma1 - qsi*gamma2
444 end subroutine pol_coef_vanilla
449 subroutine pol_coef_vanilla2(iter, WW, T, TT, Y, QSI, ETA)
451 integer(kind=kint),
intent(in) :: iter
452 real(kind=
kreal),
intent(inout) :: ww(:,:)
453 integer(kind=kint),
intent(in) :: T, TT, Y
454 real(kind=
kreal),
intent(out) :: qsi, eta
456 real(kind=
kreal),
dimension(6) :: cg
457 real(kind=
kreal) :: gamma1, gamma2
458 real(kind=
kreal) :: c, c_abs
460 real(kind=
kreal),
parameter :: omega = 0.707106781d0
473 tcomm = tcomm + e_time - s_time
480 tcomm = tcomm + e_time - s_time
485 c = cg(3) / dsqrt(cg(1)*cg(2))
487 if (c_abs > omega)
then
488 qsi = c * dsqrt(cg(1)/cg(2))
491 qsi = omega * dsqrt(cg(1)/cg(2))
493 qsi = -omega * dsqrt(cg(1)/cg(2))
496 eta = gamma1 - qsi*gamma2
497 end subroutine pol_coef_vanilla2
subroutine pol_coef(iter, WW, T, TT, Y, QSI, ETA)
subroutine, public hecmw_mat_integrate(hecMAT)
Integrate matrix components into a single array for efficient access.
real(kind=kreal) function, public hecmw_mat_get_resid(hecMAT)
integer(kind=kint) function, public hecmw_mat_get_iterlog(hecMAT)
integer(kind=kint) function, public hecmw_mat_get_timelog(hecMAT)
integer(kind=kint) function, public hecmw_mat_get_iter(hecMAT)
subroutine, public hecmw_precond_setup(hecMAT, hecMESH, sym)
subroutine, public hecmw_precond_apply(hecMESH, hecMAT, R, Z, ZP, COMMtime)
subroutine, public hecmw_solve_gpbicg(hecMESH, hecMAT, ITER, RESID, error, Tset, Tsol, Tcomm)
subroutine, public hecmw_matresid(hecMESH, hecMAT, X, B, R, COMMtime)
subroutine, public hecmw_matvec(hecMESH, hecMAT, X, Y, COMMtime)
subroutine hecmw_xpay_r(n, alpha, X, Y)
subroutine hecmw_axpyz_r(n, alpha, X, Y, Z)
subroutine hecmw_innerproduct_r_nocomm(hecMESH, ndof, X, Y, sum)
subroutine hecmw_innerproduct_r(hecMESH, ndof, X, Y, sum, COMMtime)
subroutine hecmw_axpby_r(n, alpha, beta, X, Y)
subroutine hecmw_axpy_r(n, alpha, X, Y)
subroutine hecmw_copy_r(n, X, Y)
subroutine hecmw_time_statistics(hecMESH, time, t_max, t_min, t_avg, t_sd)
subroutine, public hecmw_solver_scaling_fw(hecMESH, hecMAT, COMMtime)
subroutine, public hecmw_solver_scaling_bk(hecMAT)
integer(kind=kint), parameter hecmw_sum
integer(kind=4), parameter kreal
real(kind=kreal) function hecmw_wtime()
subroutine hecmw_update_r(hecMESH, val, n, m)
subroutine hecmw_allreduce_r(hecMESH, val, n, ntag)
subroutine hecmw_barrier(hecMESH)
integer(kind=kint), parameter hecmw_solver_error_noconv_maxit