27 integer(kind=kint) :: N
28 #ifdef HECMW_ARCH_FX64
29 integer(kind=kint) :: NP
31 real(kind=
kreal),
pointer :: d(:) => null()
32 real(kind=
kreal),
pointer :: al(:) => null()
33 real(kind=
kreal),
pointer :: au(:) => null()
34 integer(kind=kint),
pointer :: indexL(:) => null()
35 integer(kind=kint),
pointer :: indexU(:) => null()
36 integer(kind=kint),
pointer :: itemL(:) => null()
37 integer(kind=kint),
pointer :: itemU(:) => null()
38 real(kind=
kreal),
pointer :: alu(:) => null()
40 integer(kind=kint) :: NColor
41 integer(kind=kint),
pointer :: COLORindex(:) => null()
42 integer(kind=kint),
pointer :: perm(:) => null()
43 integer(kind=kint),
pointer :: iperm(:) => null()
50 logical,
save :: precond_impl_missing_reported = .false.
52 logical,
save :: isFirst = .true.
54 logical,
save :: INITIALIZED = .false.
60 real(kind=
kreal),
save :: omega = 1.d0
63 integer(kind=kint),
parameter :: numOfBlockPerThread = 100
64 integer(kind=kint),
save :: numOfThread = 1, numofblock
65 integer(kind=kint),
save,
allocatable :: icToBlockIndex(:)
66 integer(kind=kint),
save,
allocatable :: blockIndexToColorIndex(:)
67 integer(kind=kint),
save :: sectorCacheSize0, sectorCacheSize1
69 integer(kind=kint),
parameter :: SSOR_DEBUG = 0
76 integer(kind=kint ) :: npl, npu
77 integer(kind=kint ) :: ncolor_in
78 real (kind=
kreal) :: omega_inv
79 real (kind=
kreal) :: alutmp(3,3), pw(3)
80 integer(kind=kint ) :: ii, i, j, k
81 integer(kind=kint ) :: nthreads = 1
82 integer(kind=kint ),
allocatable :: perm_tmp(:)
83 real (kind=
kreal) :: t0
85 if (ssor_debug >= 1)
then
87 write(*,*)
'DEBUG: SSOR setup start',
hecmw_wtime()-t0
91 if (hecmat%Iarray(98) == 1)
then
93 else if (hecmat%Iarray(97) == 1)
then
108 omega_inv = 1.d0 / omega
112 allocate(colorindex(0:n), perm_tmp(n), perm(n), iperm(n))
114 hecmat%indexU, hecmat%itemU, perm_tmp, iperm)
115 if (ssor_debug >= 1)
write(*,*)
'DEBUG: RCM ordering done',
hecmw_wtime()-t0
117 hecmat%indexU, hecmat%itemU, perm_tmp, &
118 ncolor_in, ncolor, colorindex, perm, iperm)
119 if (ssor_debug >= 1)
write(*,*)
'DEBUG: MC ordering done',
hecmw_wtime()-t0
123 if (nthreads == 1)
then
125 allocate(colorindex(0:1), perm(n), iperm(n))
133 allocate(colorindex(0:n), perm_tmp(n), perm(n), iperm(n))
135 hecmat%indexU, hecmat%itemU, perm_tmp, iperm)
136 if (ssor_debug >= 1)
write(*,*)
'DEBUG: RCM ordering done',
hecmw_wtime()-t0
138 hecmat%indexU, hecmat%itemU, perm_tmp, &
139 ncolor_in, ncolor, colorindex, perm, iperm)
140 if (ssor_debug >= 1)
write(*,*)
'DEBUG: MC ordering done',
hecmw_wtime()-t0
148 do j=hecmat%indexU(i-1)+1,hecmat%indexU(i)
149 if( hecmat%itemU(j) > n )
exit
153 npl = max(hecmat%indexL(n),npl)
154 npu = hecmat%indexU(n)
155 allocate(indexl(0:n), indexu(0:n), iteml(npl), itemu(npu))
157 hecmat%indexL, hecmat%indexU, hecmat%itemL, hecmat%itemU, &
158 indexl, indexu, iteml, itemu)
159 if (ssor_debug >= 1)
write(*,*)
'DEBUG: reordering profile done',
hecmw_wtime()-t0
162 allocate(d(9*n), al(9*npl), au(9*npu))
164 hecmat%indexL, hecmat%indexU, hecmat%itemL, hecmat%itemU, &
165 hecmat%AL, hecmat%AU, hecmat%D, &
166 indexl, indexu, iteml, itemu, al, au, d)
167 if (ssor_debug >= 1)
write(*,*)
'DEBUG: reordering values done',
hecmw_wtime()-t0
187 alutmp(1,1)= alu(9*ii-8) * omega_inv
188 alutmp(1,2)= alu(9*ii-7) * omega_inv
189 alutmp(1,3)= alu(9*ii-6) * omega_inv
190 alutmp(2,1)= alu(9*ii-5) * omega_inv
191 alutmp(2,2)= alu(9*ii-4) * omega_inv
192 alutmp(2,3)= alu(9*ii-3) * omega_inv
193 alutmp(3,1)= alu(9*ii-2) * omega_inv
194 alutmp(3,2)= alu(9*ii-1) * omega_inv
195 alutmp(3,3)= alu(9*ii ) * omega_inv
197 alutmp(k,k)= 1.d0/alutmp(k,k)
199 alutmp(i,k)= alutmp(i,k) * alutmp(k,k)
201 pw(j)= alutmp(i,j) - alutmp(i,k)*alutmp(k,j)
208 alu(9*ii-8)= alutmp(1,1)
209 alu(9*ii-7)= alutmp(1,2)
210 alu(9*ii-6)= alutmp(1,3)
211 alu(9*ii-5)= alutmp(2,1)
212 alu(9*ii-4)= alutmp(2,2)
213 alu(9*ii-3)= alutmp(2,3)
214 alu(9*ii-2)= alutmp(3,1)
215 alu(9*ii-1)= alutmp(3,2)
216 alu(9*ii )= alutmp(3,3)
228 hecmat%Iarray(98) = 0
229 hecmat%Iarray(97) = 0
231 if (ssor_debug >= 1)
write(*,*)
'DEBUG: SSOR setup done',
hecmw_wtime()-t0
237 subroutine hecmw_precond_ssor_33_setup_csr(hecMAT)
240 #ifdef HECMW_ARCH_FX64
241 integer(kind=kint ) :: npl, npu
242 real (kind=
kreal) :: atmp(9)
243 integer(kind=kint ) :: ii
244 integer(kind=kint ),
pointer :: item_tmp(:)
262 alu(9*ii-1)= -atmp(8)*atmp(9)
263 alu(9*ii-2)= (atmp(4)*atmp(8)-atmp(7))*atmp(9)
264 alu(9*ii-3)= -atmp(5)*atmp(6)*alu(9*ii)
265 alu(9*ii-4)= atmp(5)*(1.d0-atmp(6)*alu(9*ii-1))
266 alu(9*ii-5)= -atmp(5)*(atmp(4)+atmp(6)*alu(9*ii-2))
267 alu(9*ii-6)= -atmp(1)*(atmp(3)*alu(9*ii)+atmp(2)*alu(9*ii-3))
268 alu(9*ii-7)= -atmp(1)*(atmp(3)*alu(9*ii-1)+atmp(2)*alu(9*ii-4))
269 alu(9*ii-8)= atmp(1)*(1.d0-atmp(3)*alu(9*ii-2)-atmp(2)*alu(9*ii-5))
277 allocate(item_tmp(3*npl))
278 item_tmp(1:npl) = iteml(1:npl)
281 allocate(item_tmp(3*npu))
282 item_tmp(1:npu) = itemu(1:npu)
287 indexl(ii) = 3*indexl(ii)
288 indexu(ii) = 3*indexu(ii)
291 iteml(3*ii ) = 3*iteml(ii)
292 iteml(3*ii-1) = 3*iteml(ii)-1
293 iteml(3*ii-2) = 3*iteml(ii)-2
296 itemu(3*ii ) = 3*itemu(ii)
297 itemu(3*ii-1) = 3*itemu(ii)-1
298 itemu(3*ii-2) = 3*itemu(ii)-2
317 end subroutine hecmw_precond_ssor_33_setup_csr
319 subroutine setup_tuning_parameters
322 integer(kind=kint) :: blockindex, elementcount, numofelement, ii
323 real(kind=
kreal) :: numofelementperblock
324 integer(kind=kint) :: my_rank
325 integer(kind=kint) :: ic, i
326 if (ssor_debug >= 1)
write(*,*)
'DEBUG: setting up tuning parameters for SSOR'
331 numofblock = numofthread * numofblockperthread
332 if (
allocated(ictoblockindex))
deallocate(ictoblockindex)
333 if (
allocated(blockindextocolorindex))
deallocate(blockindextocolorindex)
334 allocate (ictoblockindex(0:ncolor), &
335 blockindextocolorindex(0:numofblock + ncolor))
336 numofelement = n + indexl(n) + indexu(n)
337 numofelementperblock = dble(numofelement) / numofblock
340 ictoblockindex(0) = 0
341 blockindextocolorindex = -1
342 blockindextocolorindex(0) = 0
351 do i = colorindex(ic-1)+1, colorindex(ic)
352 elementcount = elementcount + 1
353 elementcount = elementcount + (indexl(i) - indexl(i-1))
354 elementcount = elementcount + (indexu(i) - indexu(i-1))
355 if (elementcount > ii * numofelementperblock &
356 .or. i == colorindex(ic))
then
358 blockindex = blockindex + 1
359 blockindextocolorindex(blockindex) = i
364 ictoblockindex(ic) = blockindex
366 numofblock = blockindex
369 sectorcachesize0, sectorcachesize1 )
370 end subroutine setup_tuning_parameters
375 real(kind=
kreal),
intent(inout) :: zp(:)
377 select case (precond_impl)
380 #ifdef HECMW_ARCH_FX64
382 call hecmw_precond_ssor_33_apply_csr(zp)
385 if (.not. precond_impl_missing_reported)
then
386 precond_impl_missing_reported = .true.
388 '#### MATRIXFORMAT: this build has no SSOR preconditioner for the selected '// &
389 'format -- running the BSR implementation'
397 real(kind=
kreal),
intent(inout) :: zp(:)
398 integer(kind=kint) :: ic, i, iold, j, isL, ieL, isU, ieU, k
399 real(kind=
kreal) :: sw1, sw2, sw3, x1, x2, x3
401 real(kind=
kreal) :: omega_fac
404 integer(kind=kint) :: blockIndex
408 call setup_tuning_parameters
414 omega_fac = 2.d0 - omega
433 do i = colorindex(ic-1)+1, colorindex(ic)
436 do blockindex = ictoblockindex(ic-1)+1, ictoblockindex(ic)
437 do i = blockindextocolorindex(blockindex-1)+1, &
438 blockindextocolorindex(blockindex)
442 sw1= omega_fac * zp(3*iold-2)
443 sw2= omega_fac * zp(3*iold-1)
444 sw3= omega_fac * zp(3*iold )
453 sw1= sw1 - al(9*j-8)*x1 - al(9*j-7)*x2 - al(9*j-6)*x3
454 sw2= sw2 - al(9*j-5)*x1 - al(9*j-4)*x2 - al(9*j-3)*x3
455 sw3= sw3 - al(9*j-2)*x1 - al(9*j-1)*x2 - al(9*j )*x3
461 x2= x2 - alu(9*i-5)*x1
462 x3= x3 - alu(9*i-2)*x1 - alu(9*i-1)*x2
464 x2= alu(9*i-4)*( x2 - alu(9*i-3)*x3 )
465 x1= alu(9*i-8)*( x1 - alu(9*i-6)*x3 - alu(9*i-7)*x2)
484 do i = colorindex(ic-1)+1, colorindex(ic)
487 do blockindex = ictoblockindex(ic), ictoblockindex(ic-1)+1, -1
488 do i = blockindextocolorindex(blockindex), &
489 blockindextocolorindex(blockindex-1)+1, -1
506 sw1= sw1 + au(9*j-8)*x1 + au(9*j-7)*x2 + au(9*j-6)*x3
507 sw2= sw2 + au(9*j-5)*x1 + au(9*j-4)*x2 + au(9*j-3)*x3
508 sw3= sw3 + au(9*j-2)*x1 + au(9*j-1)*x2 + au(9*j )*x3
514 x2= x2 - alu(9*i-5)*x1
515 x3= x3 - alu(9*i-2)*x1 - alu(9*i-1)*x2
517 x2= alu(9*i-4)*( x2 - alu(9*i-3)*x3 )
518 x1= alu(9*i-8)*( x1 - alu(9*i-6)*x3 - alu(9*i-7)*x2)
520 zp(3*iold-2)= zp(3*iold-2) - x1
521 zp(3*iold-1)= zp(3*iold-1) - x2
522 zp(3*iold )= zp(3*iold ) - x3
543 subroutine hecmw_precond_ssor_33_apply_csr(ZP)
546 real(kind=
kreal),
intent(inout) :: zp(:)
547 #ifdef HECMW_ARCH_FX64
548 integer(kind=kint) :: ic, i
550 real(kind=
kreal) :: omega_fac
553 integer(kind=kint) :: blockIndex
556 call setup_tuning_parameters
561 omega_fac = 2.d0 - omega
564 n,np,zp,al,au,d,alu,iteml,itemu,indexl,indexu,perm,ictoblockindex,blockindextocolorindex, &
565 indexl(n),indexu(n),ncolor,numofblock,omega_fac)
568 end subroutine hecmw_precond_ssor_33_apply_csr
571 N,NP,ZP,AL,AU,D,ALU,itemL,itemU,indexL,indexU,perm,icToBlockIndex,blockIndexToColorIndex, &
572 NPL,NPU,NColor,numOfBlock,OMEGA_FAC)
573 integer(kind=kint),
intent(in) :: N
574 integer(kind=kint),
intent(in) :: NP
575 real(kind=
kreal),
intent(inout) :: zp(3*np)
576 real(kind=
kreal),
intent(in) :: al(3*npl)
577 real(kind=
kreal),
intent(in) :: au(3*npu)
578 real(kind=
kreal),
intent(in) :: d(9*n)
579 real(kind=
kreal),
intent(in) :: alu(9*n)
580 integer(kind=kint),
intent(in) :: itemL(NPL)
581 integer(kind=kint),
intent(in) :: itemU(NPU)
582 integer(kind=kint),
intent(in) :: indexL(0:N)
583 integer(kind=kint),
intent(in) :: indexU(0:N)
584 integer(kind=kint),
intent(in) :: perm(N)
585 integer(kind=kint),
intent(in) :: icToBlockIndex(0:NColor)
586 integer(kind=kint),
intent(in) :: blockIndexToColorIndex(0:numOfBlock+NColor)
587 integer(kind=kint),
intent(in) :: NPL
588 integer(kind=kint),
intent(in) :: NPU
589 integer(kind=kint),
intent(in) :: NColor
590 integer(kind=kint),
intent(in) :: numOfBlock
591 real(kind=
kreal),
intent(in) :: omega_fac
592 #ifdef HECMW_ARCH_FX64
594 integer(kind=kint) :: ic, i, iold, j, isL, ieL, isU, ieU, k
595 integer(kind=kint) :: blockIndex
596 real(kind=
kreal) :: sw1, sw2, sw3, x1, x2, x3
603 if( ncolor > 1 )
then
613 do blockindex = ictoblockindex(ic-1)+1, ictoblockindex(ic)
614 do i = blockindextocolorindex(blockindex-1)+1, &
615 blockindextocolorindex(blockindex)
618 sw1= omega_fac * zp(3*iold-2)
619 sw2= omega_fac * zp(3*iold-1)
620 sw3= omega_fac * zp(3*iold )
626 sw1= sw1 - al(3*j-2)*x1
627 sw2= sw2 - al(3*j-1)*x1
628 sw3= sw3 - al(3*j )*x1
631 zp(3*iold-2)= alu(9*i-8)*sw1+alu(9*i-7)*sw2+alu(9*i-6)*sw3
632 zp(3*iold-1)= alu(9*i-5)*sw1+alu(9*i-4)*sw2+alu(9*i-3)*sw3
633 zp(3*iold )= alu(9*i-2)*sw1+alu(9*i-1)*sw2+alu(9*i )*sw3
642 do blockindex = ictoblockindex(ic), ictoblockindex(ic-1)+1, -1
643 do i = blockindextocolorindex(blockindex), &
644 blockindextocolorindex(blockindex-1)+1, -1
657 sw1= sw1 + au(3*j-2)*x1
658 sw2= sw2 + au(3*j-1)*x1
659 sw3= sw3 + au(3*j )*x1
663 zp(3*iold-2)= zp(3*iold-2) - alu(9*i-8)*sw1 - alu(9*i-7)*sw2 - alu(9*i-6)*sw3
664 zp(3*iold-1)= zp(3*iold-1) - alu(9*i-5)*sw1 - alu(9*i-4)*sw2 - alu(9*i-3)*sw3
665 zp(3*iold )= zp(3*iold ) - alu(9*i-2)*sw1 - alu(9*i-1)*sw2 - alu(9*i )*sw3
677 sw1= omega_fac * zp(3*iold-2)
678 sw2= omega_fac * zp(3*iold-1)
679 sw3= omega_fac * zp(3*iold )
685 sw1= sw1 - al(3*j-2)*x1
686 sw2= sw2 - al(3*j-1)*x1
687 sw3= sw3 - al(3*j )*x1
690 zp(3*iold-2)= alu(9*i-8)*sw1+alu(9*i-7)*sw2+alu(9*i-6)*sw3
691 zp(3*iold-1)= alu(9*i-5)*sw1+alu(9*i-4)*sw2+alu(9*i-3)*sw3
692 zp(3*iold )= alu(9*i-2)*sw1+alu(9*i-1)*sw2+alu(9*i )*sw3
704 sw1= sw1 + au(3*j-2)*x1
705 sw2= sw2 + au(3*j-1)*x1
706 sw3= sw3 + au(3*j )*x1
710 zp(3*iold-2)= zp(3*iold-2) - alu(9*i-8)*sw1 - alu(9*i-7)*sw2 - alu(9*i-6)*sw3
711 zp(3*iold-1)= zp(3*iold-1) - alu(9*i-5)*sw1 - alu(9*i-4)*sw2 - alu(9*i-3)*sw3
712 zp(3*iold )= zp(3*iold ) - alu(9*i-2)*sw1 - alu(9*i-1)*sw2 - alu(9*i )*sw3
728 if (
associated(colorindex))
deallocate(colorindex)
729 if (
associated(perm))
deallocate(perm)
730 if (
associated(iperm))
deallocate(iperm)
731 if (
associated(alu))
deallocate(alu)
732 if (
associated(d))
deallocate(d)
733 if (
associated(al))
deallocate(al)
734 if (
associated(au))
deallocate(au)
735 if (
associated(indexl))
deallocate(indexl)
736 if (
associated(indexu))
deallocate(indexu)
737 if (
associated(iteml))
deallocate(iteml)
738 if (
associated(itemu))
deallocate(itemu)
750 initialized = .false.
real(kind=kreal) function, public hecmw_mat_get_omega(hecMAT)
integer(kind=kint), parameter, public hecmw_precond_impl_csr
subroutine, public hecmw_mat_block_transpose_33(mat)
integer(kind=kint) function, public hecmw_mat_get_precond_impl(hecMAT)
integer(kind=kint), parameter, public hecmw_precond_impl_bsr
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 hecmw_precond_ssor_33_apply_inner(N, NP, ZP, AL, AU, D, ALU, itemL, itemU, indexL, indexU, perm, icToBlockIndex, blockIndexToColorIndex, NPL, NPU, NColor, numOfBlock, OMEGA_FAC)
subroutine, public hecmw_precond_ssor_33_apply(ZP)
subroutine hecmw_precond_ssor_33_apply_generic(ZP)
subroutine, public hecmw_precond_ssor_33_setup(hecMAT)
subroutine, public hecmw_precond_ssor_33_clear(hecMAT)
subroutine, public hecmw_tuning_fx_calc_sector_cache(N, NDOF, sectorCacheSize0, sectorCacheSize1)
integer(kind=4), parameter kreal
integer(kind=kint) function hecmw_comm_get_rank()
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)