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))
121 if (bnrm2.eq.0.d0)
then
131 if (timelog.eq.2)
then
133 t_max, t_min, t_avg, t_sd)
134 if (hecmesh%my_rank.eq.0)
then
135 write(*,*)
'Time solver setup'
136 write(*,*)
' Max :',t_max
137 write(*,*)
' Min :',t_min
138 write(*,*)
' Avg :',t_avg
139 write(*,*)
' Std Dev :',t_sd
143 tset = e_time - s_time
172 ww(j,p)= ww(j,r) + beta*( ww(j,p)-ww(j,u))
189 call hecmw_matvec(hecmesh, hecmat, ww(:,p), ww(:,pt), tcomm)
205 ww(j,y)= ww(j,t) - ww(j,wk) + alpha*(-ww(j,w1) + ww(j,pt))
206 ww(j,t)= ww(j,wk) - alpha*ww(j,pt)
231 call hecmw_matvec(hecmesh, hecmat, ww(:,tt), ww(:,wk), tcomm)
245 call pol_coef_vanilla2(iter, ww, t, tt, y, qsi, eta)
260 ww(j,u)= qsi* ww(j,w2) + eta*(ww(j,t0) - ww(j,r) + beta*ww(j,u))
261 ww(j,z)= qsi* ww(j, r) + eta* ww(j, z) - alpha*ww(j,u)
265 ww(j,u)= qsi* ww(j,w2) + eta*(ww(j,t0) - ww(j,r))
266 ww(j,z)= qsi* ww(j, r) + eta* ww(j, z) - alpha*ww(j,u)
277 x(j)= x(j) + alpha*ww(j,p) + ww(j,z)
283 if ( mod(iter,n_iter_recompute_r)==0 )
then
287 ww(j,r)= ww(j,t) - eta*ww(j,y) - qsi*ww(j,tt)
296 tcomm = tcomm + e_time - s_time
300 beta = alpha*coef1 / (qsi*rho)
302 ww(j,w1)= ww(j,tt) + beta*ww(j,pt)
305 resid= dsqrt(dnrm2/bnrm2)
309 if (my_rank.eq.0 .and. iterlog.eq.1) &
310 &
write (*, 1000) iter, resid
311 1000
format (i5, 1pe16.6)
314 if (resid.le.tol )
then
315 if ( mod(iter,n_iter_recompute_r)==0 )
exit
319 resid= dsqrt(dnrm2/bnrm2)
320 if (resid.le.tol)
exit
333 tcomm = tcomm + e_time - s_time
339 if (timelog.eq.2)
then
341 t_max, t_min, t_avg, t_sd)
342 if (hecmesh%my_rank.eq.0)
then
343 write(*,*)
'Time solver iterations'
344 write(*,*)
' Max :',t_max
345 write(*,*)
' Min :',t_min
346 write(*,*)
' Avg :',t_avg
347 write(*,*)
' Std Dev :',t_sd
351 tsol = e1_time - s1_time
359 subroutine pol_coef(iter, WW, T, TT, Y, QSI, ETA)
361 integer(kind=kint),
intent(in) :: iter
362 real(kind=
kreal),
intent(in) :: ww(:,:)
363 integer(kind=kint),
intent(in) :: T, TT, Y
364 real(kind=
kreal),
intent(out) :: qsi, eta
366 real(kind=
kreal),
dimension(5) :: cg
367 real(kind=
kreal),
dimension(2) :: eq
368 real(kind=
kreal) :: delta
378 tcomm = tcomm + e_time - s_time
384 delta= (cg(5)*cg(1)-cg(4)*cg(4))
385 eq(1)= (cg(1)*cg(2)-cg(3)*cg(4)) / delta
386 eq(2)= (cg(5)*cg(3)-cg(4)*cg(2)) / delta
397 subroutine pol_coef_vanilla(iter, WW, T, TT, Y, QSI, ETA)
399 integer(kind=kint),
intent(in) :: iter
400 real(kind=
kreal),
intent(inout) :: ww(:,:)
401 integer(kind=kint),
intent(in) :: T, TT, Y
402 real(kind=
kreal),
intent(out) :: qsi, eta
404 real(kind=
kreal),
dimension(3) :: cg
405 real(kind=
kreal) :: gamma1, gamma2
406 real(kind=
kreal) :: c, c_abs
408 real(kind=
kreal),
parameter :: omega = 0.707106781d0
420 tcomm = tcomm + e_time - s_time
436 tcomm = tcomm + e_time - s_time
438 c = cg(3) / dsqrt(cg(1)*cg(2))
440 if (c_abs > omega)
then
441 qsi = c * dsqrt(cg(1)/cg(2))
445 qsi = omega * dsqrt(cg(1)/cg(2))
447 qsi = -omega * dsqrt(cg(1)/cg(2))
450 eta = gamma1 - qsi*gamma2
451 end subroutine pol_coef_vanilla
456 subroutine pol_coef_vanilla2(iter, WW, T, TT, Y, QSI, ETA)
458 integer(kind=kint),
intent(in) :: iter
459 real(kind=
kreal),
intent(inout) :: ww(:,:)
460 integer(kind=kint),
intent(in) :: T, TT, Y
461 real(kind=
kreal),
intent(out) :: qsi, eta
463 real(kind=
kreal),
dimension(6) :: cg
464 real(kind=
kreal) :: gamma1, gamma2
465 real(kind=
kreal) :: c, c_abs
467 real(kind=
kreal),
parameter :: omega = 0.707106781d0
480 tcomm = tcomm + e_time - s_time
487 tcomm = tcomm + e_time - s_time
492 c = cg(3) / dsqrt(cg(1)*cg(2))
494 if (c_abs > omega)
then
495 qsi = c * dsqrt(cg(1)/cg(2))
498 qsi = omega * dsqrt(cg(1)/cg(2))
500 qsi = -omega * dsqrt(cg(1)/cg(2))
503 eta = gamma1 - qsi*gamma2
504 end subroutine pol_coef_vanilla2