27 integer(kind=kint) :: N
28 real(kind=
kreal),
pointer :: d(:) => null()
29 real(kind=
kreal),
pointer :: al(:) => null()
30 real(kind=
kreal),
pointer :: au(:) => null()
31 integer(kind=kint),
pointer :: indexL(:) => null()
32 integer(kind=kint),
pointer :: indexU(:) => null()
33 integer(kind=kint),
pointer :: itemL(:) => null()
34 integer(kind=kint),
pointer :: itemU(:) => null()
35 real(kind=
kreal),
pointer :: alu(:) => null()
37 integer(kind=kint) :: NColor
38 integer(kind=kint),
pointer :: COLORindex(:) => null()
39 integer(kind=kint),
pointer :: perm(:) => null()
40 integer(kind=kint),
pointer :: iperm(:) => null()
42 logical,
save :: isFirst = .true.
44 logical,
save :: INITIALIZED = .false.
50 real(kind=
kreal),
save :: omega = 1.d0
53 integer(kind=kint),
parameter :: numOfBlockPerThread = 100
54 integer(kind=kint),
save :: numOfThread = 1, numofblock
55 integer(kind=kint),
save,
allocatable :: icToBlockIndex(:)
56 integer(kind=kint),
save,
allocatable :: blockIndexToColorIndex(:)
57 integer(kind=kint),
save :: sectorCacheSize0, sectorCacheSize1
59 integer(kind=kint),
parameter :: SSOR_DEBUG = 0
66 integer(kind=kint ) :: npl, npu
67 integer(kind=kint ) :: ncolor_in
68 real (kind=
kreal) :: omega_inv
69 real (kind=
kreal) :: alutmp(6,6), pw(6)
70 integer(kind=kint ) :: ii, i, j, k
71 integer(kind=kint ) :: nthreads = 1
72 integer(kind=kint ),
allocatable :: perm_tmp(:)
73 real (kind=
kreal) :: t0
75 if (ssor_debug >= 1)
then
77 write(*,*)
'DEBUG: SSOR setup start',
hecmw_wtime()-t0
81 if (hecmat%Iarray(98) == 1)
then
83 else if (hecmat%Iarray(97) == 1)
then
98 omega_inv = 1.d0 / omega
101 allocate(colorindex(0:n), perm_tmp(n), perm(n), iperm(n))
103 hecmat%indexU, hecmat%itemU, perm_tmp, iperm)
104 if (ssor_debug >= 1)
write(*,*)
'DEBUG: RCM ordering done',
hecmw_wtime()-t0
106 hecmat%indexU, hecmat%itemU, perm_tmp, &
107 ncolor_in, ncolor, colorindex, perm, iperm)
108 if (ssor_debug >= 1)
write(*,*)
'DEBUG: MC ordering done',
hecmw_wtime()-t0
112 if (nthreads == 1)
then
114 allocate(colorindex(0:1), perm(n), iperm(n))
122 allocate(colorindex(0:n), perm_tmp(n), perm(n), iperm(n))
124 hecmat%indexU, hecmat%itemU, perm_tmp, iperm)
125 if (ssor_debug >= 1)
write(*,*)
'DEBUG: RCM ordering done',
hecmw_wtime()-t0
127 hecmat%indexU, hecmat%itemU, perm_tmp, &
128 ncolor_in, ncolor, colorindex, perm, iperm)
129 if (ssor_debug >= 1)
write(*,*)
'DEBUG: MC ordering done',
hecmw_wtime()-t0
137 do j=hecmat%indexU(i-1)+1,hecmat%indexU(i)
138 if( hecmat%itemU(j) > n )
exit
142 npl = max(hecmat%indexL(n),npl)
143 npu = hecmat%indexU(n)
144 allocate(indexl(0:n), indexu(0:n), iteml(npl), itemu(npu))
146 hecmat%indexL, hecmat%indexU, hecmat%itemL, hecmat%itemU, &
147 indexl, indexu, iteml, itemu)
148 if (ssor_debug >= 1)
write(*,*)
'DEBUG: reordering profile done',
hecmw_wtime()-t0
151 allocate(d(36*n), al(36*npl), au(36*npu))
153 hecmat%indexL, hecmat%indexU, hecmat%itemL, hecmat%itemU, &
154 hecmat%AL, hecmat%AU, hecmat%D, &
155 indexl, indexu, iteml, itemu, al, au, d)
156 if (ssor_debug >= 1)
write(*,*)
'DEBUG: reordering values done',
hecmw_wtime()-t0
176 alutmp(1,1)= alu(36*ii-35) * omega_inv
177 alutmp(1,2)= alu(36*ii-34) * omega_inv
178 alutmp(1,3)= alu(36*ii-33) * omega_inv
179 alutmp(1,4)= alu(36*ii-32) * omega_inv
180 alutmp(1,5)= alu(36*ii-31) * omega_inv
181 alutmp(1,6)= alu(36*ii-30) * omega_inv
183 alutmp(2,1)= alu(36*ii-29) * omega_inv
184 alutmp(2,2)= alu(36*ii-28) * omega_inv
185 alutmp(2,3)= alu(36*ii-27) * omega_inv
186 alutmp(2,4)= alu(36*ii-26) * omega_inv
187 alutmp(2,5)= alu(36*ii-25) * omega_inv
188 alutmp(2,6)= alu(36*ii-24) * omega_inv
190 alutmp(3,1)= alu(36*ii-23) * omega_inv
191 alutmp(3,2)= alu(36*ii-22) * omega_inv
192 alutmp(3,3)= alu(36*ii-21) * omega_inv
193 alutmp(3,4)= alu(36*ii-20) * omega_inv
194 alutmp(3,5)= alu(36*ii-19) * omega_inv
195 alutmp(3,6)= alu(36*ii-18) * omega_inv
197 alutmp(4,1)= alu(36*ii-17) * omega_inv
198 alutmp(4,2)= alu(36*ii-16) * omega_inv
199 alutmp(4,3)= alu(36*ii-15) * omega_inv
200 alutmp(4,4)= alu(36*ii-14) * omega_inv
201 alutmp(4,5)= alu(36*ii-13) * omega_inv
202 alutmp(4,6)= alu(36*ii-12) * omega_inv
204 alutmp(5,1)= alu(36*ii-11) * omega_inv
205 alutmp(5,2)= alu(36*ii-10) * omega_inv
206 alutmp(5,3)= alu(36*ii-9 ) * omega_inv
207 alutmp(5,4)= alu(36*ii-8 ) * omega_inv
208 alutmp(5,5)= alu(36*ii-7 ) * omega_inv
209 alutmp(5,6)= alu(36*ii-6 ) * omega_inv
211 alutmp(6,1)= alu(36*ii-5 ) * omega_inv
212 alutmp(6,2)= alu(36*ii-4 ) * omega_inv
213 alutmp(6,3)= alu(36*ii-3 ) * omega_inv
214 alutmp(6,4)= alu(36*ii-2 ) * omega_inv
215 alutmp(6,5)= alu(36*ii-1 ) * omega_inv
216 alutmp(6,6)= alu(36*ii ) * omega_inv
219 alutmp(k,k)= 1.d0/alutmp(k,k)
221 alutmp(i,k)= alutmp(i,k) * alutmp(k,k)
223 pw(j)= alutmp(i,j) - alutmp(i,k)*alutmp(k,j)
231 alu(36*ii-35)= alutmp(1,1)
232 alu(36*ii-34)= alutmp(1,2)
233 alu(36*ii-33)= alutmp(1,3)
234 alu(36*ii-32)= alutmp(1,4)
235 alu(36*ii-31)= alutmp(1,5)
236 alu(36*ii-30)= alutmp(1,6)
237 alu(36*ii-29)= alutmp(2,1)
238 alu(36*ii-28)= alutmp(2,2)
239 alu(36*ii-27)= alutmp(2,3)
240 alu(36*ii-26)= alutmp(2,4)
241 alu(36*ii-25)= alutmp(2,5)
242 alu(36*ii-24)= alutmp(2,6)
243 alu(36*ii-23)= alutmp(3,1)
244 alu(36*ii-22)= alutmp(3,2)
245 alu(36*ii-21)= alutmp(3,3)
246 alu(36*ii-20)= alutmp(3,4)
247 alu(36*ii-19)= alutmp(3,5)
248 alu(36*ii-18)= alutmp(3,6)
249 alu(36*ii-17)= alutmp(4,1)
250 alu(36*ii-16)= alutmp(4,2)
251 alu(36*ii-15)= alutmp(4,3)
252 alu(36*ii-14)= alutmp(4,4)
253 alu(36*ii-13)= alutmp(4,5)
254 alu(36*ii-12)= alutmp(4,6)
255 alu(36*ii-11)= alutmp(5,1)
256 alu(36*ii-10)= alutmp(5,2)
257 alu(36*ii-9 )= alutmp(5,3)
258 alu(36*ii-8 )= alutmp(5,4)
259 alu(36*ii-7 )= alutmp(5,5)
260 alu(36*ii-6 )= alutmp(5,6)
261 alu(36*ii-5 )= alutmp(6,1)
262 alu(36*ii-4 )= alutmp(6,2)
263 alu(36*ii-3 )= alutmp(6,3)
264 alu(36*ii-2 )= alutmp(6,4)
265 alu(36*ii-1 )= alutmp(6,5)
266 alu(36*ii )= alutmp(6,6)
278 hecmat%Iarray(98) = 0
279 hecmat%Iarray(97) = 0
281 if (ssor_debug >= 1)
write(*,*)
'DEBUG: SSOR setup done',
hecmw_wtime()-t0
285 subroutine setup_tuning_parameters
288 integer(kind=kint) :: blockindex, elementcount, numofelement, ii
289 real(kind=
kreal) :: numofelementperblock
290 integer(kind=kint) :: ic, i
291 if (ssor_debug >= 1)
write(*,*)
'DEBUG: setting up tuning parameters for SSOR'
296 numofblock = numofthread * numofblockperthread
297 if (
allocated(ictoblockindex))
deallocate(ictoblockindex)
298 if (
allocated(blockindextocolorindex))
deallocate(blockindextocolorindex)
299 allocate (ictoblockindex(0:ncolor), &
300 blockindextocolorindex(0:numofblock + ncolor))
301 numofelement = n + indexl(n) + indexu(n)
302 numofelementperblock = dble(numofelement) / numofblock
305 ictoblockindex(0) = 0
306 blockindextocolorindex = -1
307 blockindextocolorindex(0) = 0
311 do i = colorindex(ic-1)+1, colorindex(ic)
312 elementcount = elementcount + 1
313 elementcount = elementcount + (indexl(i) - indexl(i-1))
314 elementcount = elementcount + (indexu(i) - indexu(i-1))
315 if (elementcount > ii * numofelementperblock &
316 .or. i == colorindex(ic))
then
318 blockindex = blockindex + 1
319 blockindextocolorindex(blockindex) = i
322 ictoblockindex(ic) = blockindex
324 numofblock = blockindex
327 sectorcachesize0, sectorcachesize1 )
328 end subroutine setup_tuning_parameters
332 real(kind=
kreal),
intent(inout) :: zp(:)
333 integer(kind=kint) :: ic, i, iold, j, isl, iel, isu, ieu, k
334 real(kind=
kreal) :: x1, x2, x3, x4, x5, x6
335 real(kind=
kreal) :: sw1, sw2, sw3, sw4, sw5, sw6
337 real(kind=
kreal) :: omega_fac
340 integer(kind=kint) :: blockindex
344 call setup_tuning_parameters
350 omega_fac = 2.d0 - omega
369 do i = colorindex(ic-1)+1, colorindex(ic)
372 do blockindex = ictoblockindex(ic-1)+1, ictoblockindex(ic)
373 do i = blockindextocolorindex(blockindex-1)+1, &
374 blockindextocolorindex(blockindex)
378 sw1= omega_fac * zp(6*iold-5)
379 sw2= omega_fac * zp(6*iold-4)
380 sw3= omega_fac * zp(6*iold-3)
381 sw4= omega_fac * zp(6*iold-2)
382 sw5= omega_fac * zp(6*iold-1)
383 sw6= omega_fac * zp(6*iold )
395 sw1= sw1 -al(36*j-35)*x1 -al(36*j-34)*x2 -al(36*j-33)*x3 -al(36*j-32)*x4 -al(36*j-31)*x5 -al(36*j-30)*x6
396 sw2= sw2 -al(36*j-29)*x1 -al(36*j-28)*x2 -al(36*j-27)*x3 -al(36*j-26)*x4 -al(36*j-25)*x5 -al(36*j-24)*x6
397 sw3= sw3 -al(36*j-23)*x1 -al(36*j-22)*x2 -al(36*j-21)*x3 -al(36*j-20)*x4 -al(36*j-19)*x5 -al(36*j-18)*x6
398 sw4= sw4 -al(36*j-17)*x1 -al(36*j-16)*x2 -al(36*j-15)*x3 -al(36*j-14)*x4 -al(36*j-13)*x5 -al(36*j-12)*x6
399 sw5= sw5 -al(36*j-11)*x1 -al(36*j-10)*x2 -al(36*j-9 )*x3 -al(36*j-8 )*x4 -al(36*j-7 )*x5 -al(36*j-6 )*x6
400 sw6= sw6 -al(36*j-5 )*x1 -al(36*j-4 )*x2 -al(36*j-3 )*x3 -al(36*j-2 )*x4 -al(36*j-1 )*x5 -al(36*j )*x6
409 x2= x2 -alu(36*i-29)*x1
410 x3= x3 -alu(36*i-23)*x1 -alu(36*i-22)*x2
411 x4= x4 -alu(36*i-17)*x1 -alu(36*i-16)*x2 -alu(36*i-5)*x3
412 x5= x5 -alu(36*i-11)*x1 -alu(36*i-10)*x2 -alu(36*i-9)*x3 -alu(36*i-8)*x4
413 x6= x6 -alu(36*i-5 )*x1 -alu(36*i-4 )*x2 -alu(36*i-3)*x3 -alu(36*i-2)*x4 -alu(36*i-1)*x5
415 x5= alu(36*i-7 )*( x5 -alu(36*i-6)*x6 )
416 x4= alu(36*i-14)*( x4 -alu(36*i-12)*x6 -alu(36*i-13)*x5)
417 x3= alu(36*i-21)*( x3 -alu(36*i-18)*x6 -alu(36*i-19)*x5 -alu(36*i-20)*x4)
418 x2= alu(36*i-28)*( x2 -alu(36*i-24)*x6 -alu(36*i-25)*x5 -alu(36*i-26)*x4 -alu(36*i-27)*x3)
419 x1= alu(36*i-35)*( x1 -alu(36*i-30)*x6 -alu(36*i-31)*x5 -alu(36*i-32)*x4 -alu(36*i-33)*x3 -alu(36*i-34)*x2)
441 do i = colorindex(ic-1)+1, colorindex(ic)
444 do blockindex = ictoblockindex(ic), ictoblockindex(ic-1)+1, -1
445 do i = blockindextocolorindex(blockindex), &
446 blockindextocolorindex(blockindex-1)+1, -1
469 sw1= sw1 +au(36*j-35)*x1 +au(36*j-34)*x2 +au(36*j-33)*x3 +au(36*j-32)*x4 +au(36*j-31)*x5 +au(36*j-30)*x6
470 sw2= sw2 +au(36*j-29)*x1 +au(36*j-28)*x2 +au(36*j-27)*x3 +au(36*j-26)*x4 +au(36*j-25)*x5 +au(36*j-24)*x6
471 sw3= sw3 +au(36*j-23)*x1 +au(36*j-22)*x2 +au(36*j-21)*x3 +au(36*j-20)*x4 +au(36*j-19)*x5 +au(36*j-18)*x6
472 sw4= sw4 +au(36*j-17)*x1 +au(36*j-16)*x2 +au(36*j-15)*x3 +au(36*j-14)*x4 +au(36*j-13)*x5 +au(36*j-12)*x6
473 sw5= sw5 +au(36*j-11)*x1 +au(36*j-10)*x2 +au(36*j-9 )*x3 +au(36*j-8 )*x4 +au(36*j-7 )*x5 +au(36*j-6 )*x6
474 sw6= sw6 +au(36*j-5 )*x1 +au(36*j-4 )*x2 +au(36*j-3 )*x3 +au(36*j-2 )*x4 +au(36*j-1 )*x5 +au(36*j )*x6
483 x2= x2 -alu(36*i-29)*x1
484 x3= x3 -alu(36*i-23)*x1 -alu(36*i-22)*x2
485 x4= x4 -alu(36*i-17)*x1 -alu(36*i-16)*x2 -alu(36*i-5)*x3
486 x5= x5 -alu(36*i-11)*x1 -alu(36*i-10)*x2 -alu(36*i-9)*x3 -alu(36*i-8)*x4
487 x6= x6 -alu(36*i-5 )*x1 -alu(36*i-4 )*x2 -alu(36*i-3)*x3 -alu(36*i-2)*x4 -alu(36*i-1)*x5
489 x5= alu(36*i-7 )*( x5 -alu(36*i-6)*x6 )
490 x4= alu(36*i-14)*( x4 -alu(36*i-12)*x6 -alu(36*i-13)*x5)
491 x3= alu(36*i-21)*( x3 -alu(36*i-18)*x6 -alu(36*i-19)*x5 -alu(36*i-20)*x4)
492 x2= alu(36*i-28)*( x2 -alu(36*i-24)*x6 -alu(36*i-25)*x5 -alu(36*i-26)*x4 -alu(36*i-27)*x3)
493 x1= alu(36*i-35)*( x1 -alu(36*i-30)*x6 -alu(36*i-31)*x5 -alu(36*i-32)*x4 -alu(36*i-33)*x3 -alu(36*i-34)*x2)
495 zp(6*iold-5)= zp(6*iold-5) -x1
496 zp(6*iold-4)= zp(6*iold-4) -x2
497 zp(6*iold-3)= zp(6*iold-3) -x3
498 zp(6*iold-2)= zp(6*iold-2) -x4
499 zp(6*iold-1)= zp(6*iold-1) -x5
500 zp(6*iold )= zp(6*iold ) -x6
524 if (
associated(colorindex))
deallocate(colorindex)
525 if (
associated(perm))
deallocate(perm)
526 if (
associated(iperm))
deallocate(iperm)
527 if (
associated(alu))
deallocate(alu)
528 if (
associated(d))
deallocate(d)
529 if (
associated(al))
deallocate(al)
530 if (
associated(au))
deallocate(au)
531 if (
associated(indexl))
deallocate(indexl)
532 if (
associated(indexu))
deallocate(indexu)
533 if (
associated(iteml))
deallocate(iteml)
534 if (
associated(itemu))
deallocate(itemu)
546 initialized = .false.
real(kind=kreal) function, public hecmw_mat_get_omega(hecMAT)
integer(kind=kint) function, public hecmw_mat_get_ncolor_in(hecMAT)
subroutine, public hecmw_matrix_reorder_values(N, NDOF, perm, iperm, indexL, indexU, itemL, itemU, AL, AU, D, indexLp, indexUp, itemLp, itemUp, ALp, AUp, Dp)
subroutine, public hecmw_matrix_reorder_renum_item(N, perm, indexXp, itemXp)
subroutine, public hecmw_matrix_reorder_profile(N, perm, iperm, indexL, indexU, itemL, itemU, indexLp, indexUp, itemLp, itemUp)
subroutine, public hecmw_precond_ssor_66_setup(hecMAT)
subroutine, public hecmw_precond_ssor_66_clear(hecMAT)
subroutine, public hecmw_precond_ssor_66_apply(ZP)
subroutine, public hecmw_tuning_fx_calc_sector_cache(N, NDOF, sectorCacheSize0, sectorCacheSize1)
integer(kind=4), parameter kreal
real(kind=kreal) function hecmw_wtime()
subroutine, public hecmw_matrix_ordering_rcm(N, indexL, itemL, indexU, itemU, perm, iperm)
subroutine, public hecmw_matrix_ordering_mc(N, indexL, itemL, indexU, itemU, perm_cur, ncolor_in, ncolor_out, COLORindex, perm, iperm)