18 subroutine hecmw_solve_cr(hecMESH, hecMAT, ITER, RESID, error, Tset, Tsol, Tcomm)
33 integer(kind=kint ),
intent(inout):: iter, error
34 real (kind=
kreal),
intent(inout):: resid, tset, tsol, tcomm
36 integer(kind=kint ) :: n, np, ndof, nndof
37 integer(kind=kint ) :: my_rank
38 integer(kind=kint ) :: iterlog, timelog
39 real(kind=
kreal),
pointer :: b(:), x(:)
41 real(kind=
kreal),
dimension(:,:),
allocatable :: ww
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, rtar, rtar_old, aptap
50 real (kind=
kreal)::alpha, beta, dnrm2, dnrm2_true
51 real (kind=
kreal)::resid_rec, resid_true
52 real (kind=
kreal)::t_max, t_min, t_avg, t_sd
53 logical :: true_checked
56 integer(kind=kint),
parameter :: r = 1
57 integer(kind=kint),
parameter :: p = 2
58 integer(kind=kint),
parameter :: ap = 3
59 integer(kind=kint),
parameter :: az = 4
60 integer(kind=kint),
parameter :: wk = 4
61 integer(kind=kint),
parameter :: map = 5
62 integer(kind=kint),
parameter :: rt = 6
64 integer(kind=kint),
parameter :: n_iter_check_true_r = 100
78 my_rank = hecmesh%my_rank
90 allocate (ww(ndof*np, 6))
118 if (bnrm2.eq.0.d0)
then
126 resid = dsqrt(dnrm2/bnrm2)
127 if (resid.le.tol)
then
138 call hecmw_matvec(hecmesh, hecmat, ww(:,r), ww(:,az), tcomm)
143 if (rtar_old /= rtar_old)
then
147 elseif (rtar_old <= 0.0d0)
then
156 if (timelog.eq.2)
then
158 if (hecmesh%my_rank.eq.0)
then
159 write(*,*)
'Time solver setup'
160 write(*,*)
' Max :',t_max
161 write(*,*)
' Min :',t_min
162 write(*,*)
' Avg :',t_avg
163 write(*,*)
' Std Dev :',t_sd
167 tset = e_time - s_time
194 if (aptap /= aptap)
then
197 elseif (aptap <= 0.0d0)
then
202 alpha = rtar_old / aptap
221 resid_rec = dsqrt(dnrm2/bnrm2)
232 true_checked = .false.
233 if (resid_rec.le.tol .or. mod(iter,n_iter_check_true_r)==0 .or. iter.eq.maxit)
then
237 resid_true = dsqrt(dnrm2_true/bnrm2)
238 true_checked = .true.
243 if (true_checked)
then
250 if (my_rank.eq.0.and.iterlog.eq.1)
write (*,
'(i7, 1pe16.6)') iter, resid
253 if (true_checked)
then
254 if (resid_true.le.tol)
exit
255 if (iter.eq.maxit)
then
266 call hecmw_matvec(hecmesh, hecmat, ww(:,r), ww(:,az), tcomm)
276 if (rtar /= rtar)
then
279 elseif (rtar <= 0.0d0)
then
284 beta = rtar / rtar_old
297 if (maxit.eq.0) iter = 0
309 tcomm = tcomm + end_time - start_time
319 if (timelog.eq.2)
then
321 if (hecmesh%my_rank.eq.0)
then
322 write(*,*)
'Time solver iterations'
323 write(*,*)
' Max :',t_max
324 write(*,*)
' Min :',t_min
325 write(*,*)
' Avg :',t_avg
326 write(*,*)
' Std Dev :',t_sd
330 tsol = e1_time - s1_time
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)
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_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_cr(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_innerproduct_r(hecMESH, ndof, X, Y, sum, COMMtime)
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=4), parameter kreal
real(kind=kreal) function hecmw_wtime()
subroutine hecmw_update_r(hecMESH, val, n, m)
subroutine hecmw_barrier(hecMESH)
integer(kind=kint), parameter hecmw_solver_error_diverge_pc
integer(kind=kint), parameter hecmw_solver_error_diverge_nan
integer(kind=kint), parameter hecmw_solver_error_noconv_maxit
integer(kind=kint), parameter hecmw_solver_error_diverge_mat