35 integer(kind=kint ),
intent(inout):: iter, error
36 real (kind=
kreal),
intent(inout):: resid, tset, tsol, tcomm
38 integer(kind=kint ) :: n, np, ndof, nndof
39 integer(kind=kint ) :: my_rank
41 real (kind=
kreal),
pointer :: b(:)
42 real (kind=
kreal),
pointer :: x(:)
44 integer(kind=kint ) :: iterlog, timelog
46 real(kind=
kreal),
dimension(:,:),
allocatable :: ww
48 real(kind=
kreal),
dimension(2) :: rr
50 integer(kind=kint ) :: maxit
51 real (kind=
kreal) :: tol
52 integer(kind=kint ) :: i,j
53 real (kind=
kreal) :: s_time,s1_time,e_time,e1_time
54 real (kind=
kreal) :: bnrm2
55 real (kind=
kreal) :: rho,rho1,beta,alpha,dnrm2
56 real (kind=
kreal) :: qsi,eta,coef1
57 real (kind=
kreal) :: t_max,t_min,t_avg,t_sd
59 integer(kind=kint),
parameter :: r= 1
60 integer(kind=kint),
parameter ::rt= 2
61 integer(kind=kint),
parameter :: t= 3
62 integer(kind=kint),
parameter ::tt= 4
63 integer(kind=kint),
parameter ::t0= 5
64 integer(kind=kint),
parameter :: p= 6
65 integer(kind=kint),
parameter ::pt= 7
66 integer(kind=kint),
parameter :: u= 8
67 integer(kind=kint),
parameter ::w1= 9
68 integer(kind=kint),
parameter :: y=10
69 integer(kind=kint),
parameter :: z=11
70 integer(kind=kint),
parameter ::wk=12
71 integer(kind=kint),
parameter ::w2=13
72 integer(kind=kint),
parameter ::zq=14
74 integer(kind=kint) :: n_iter_recompute_r
75 integer(kind=kint),
parameter :: n_iter_recompute_r_default= 20
85 my_rank = hecmesh%my_rank
95 if (n_iter_recompute_r == 0) n_iter_recompute_r = n_iter_recompute_r_default
97 if (n_iter_recompute_r < 0) n_iter_recompute_r = maxit + 1
102 allocate (ww(ndof*np,14))
139 if (bnrm2.eq.0.d0)
then
149 if (timelog.eq.2)
then
151 t_max, t_min, t_avg, t_sd)
152 if (hecmesh%my_rank.eq.0)
then
153 write(*,*)
'Time solver setup'
154 write(*,*)
' Max :',t_max
155 write(*,*)
' Min :',t_min
156 write(*,*)
' Avg :',t_avg
157 write(*,*)
' Std Dev :',t_sd
161 tset = e_time - s_time
202 call hecmw_matvec(hecmesh, hecmat, ww(:,p), ww(:,pt), tcomm)
217 call hecmw_axpyz_r(nndof, -1.0d0, ww(:,w1), ww(:,pt), ww(:,y))
220 call hecmw_axpyz_r(nndof, -alpha, ww(:,pt), ww(:,wk), ww(:,t))
242 call hecmw_matvec(hecmesh, hecmat, ww(:,tt), ww(:,wk), tcomm)
272 call hecmw_axpyz_r(nndof, -1.0d0, ww(:,r), ww(:,t0), ww(:,u))
289 if ( mod(iter,n_iter_recompute_r)==0 )
then
301 tcomm = tcomm + e_time - s_time
305 beta = alpha*coef1 / (qsi*rho)
306 call hecmw_axpyz_r(nndof, beta, ww(:,pt), ww(:,tt), ww(:,w1))
308 resid= dsqrt(dnrm2/bnrm2)
312 if (my_rank.eq.0 .and. iterlog.eq.1) &
313 &
write (*, 1000) iter, resid
314 1000
format (i5, 1pe16.6)
317 if (resid.le.tol )
then
318 if ( mod(iter,n_iter_recompute_r)==0 )
exit
322 resid= dsqrt(dnrm2/bnrm2)
323 if (resid.le.tol)
exit
336 tcomm = tcomm + e_time - s_time
347 if (timelog.eq.2)
then
349 t_max, t_min, t_avg, t_sd)
350 if (hecmesh%my_rank.eq.0)
then
351 write(*,*)
'Time solver iterations'
352 write(*,*)
' Max :',t_max
353 write(*,*)
' Min :',t_min
354 write(*,*)
' Avg :',t_avg
355 write(*,*)
' Std Dev :',t_sd
359 tsol = e1_time - s1_time
369 integer(kind=kint),
intent(in) :: iter
370 real(kind=
kreal),
intent(inout) :: ww(:,:)
371 integer(kind=kint),
intent(in) :: T, TT, Y
372 real(kind=
kreal),
intent(out) :: qsi, eta
374 real(kind=
kreal),
dimension(6) :: cg
375 real(kind=
kreal) :: gamma1, gamma2
376 real(kind=
kreal) :: c, c_abs
378 real(kind=
kreal),
parameter :: omega = 0.707106781d0
391 tcomm = tcomm + e_time - s_time
398 tcomm = tcomm + e_time - s_time
403 c = cg(3) / dsqrt(cg(1)*cg(2))
405 if (c_abs > omega)
then
406 qsi = c * dsqrt(cg(1)/cg(2))
409 qsi = omega * dsqrt(cg(1)/cg(2))
411 qsi = -omega * dsqrt(cg(1)/cg(2))
414 eta = gamma1 - qsi*gamma2
subroutine pol_coef_vanilla2(iter, WW, T, TT, Y, QSI, ETA)
Jagged Diagonal Matrix storage for vector processors. Original code was provided by JAMSTEC.
subroutine, public hecmw_jad_init(hecMAT)
subroutine, public hecmw_jad_finalize(hecMAT)
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_recompute_residual(hecMAT)
integer(kind=kint) function, public hecmw_mat_get_usejad(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_matvec_teardown(hecMAT)
subroutine, public hecmw_matvec_setup(hecMESH, hecMAT)
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