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.
51 integer(kind=kint ) :: npl, npu
52 integer(kind=kint ) :: ncolor_in
53 real (kind=
kreal) :: sigma_diag
54 real (kind=
kreal) :: alutmp(1,1), pw(1)
55 integer(kind=kint ) :: ii, i, j, k
56 integer(kind=kint ) :: nthreads = 1
57 integer(kind=kint ),
allocatable :: perm_tmp(:)
64 if (hecmat%Iarray(98) == 1)
then
66 else if (hecmat%Iarray(97) == 1)
then
83 allocate(colorindex(0:n), perm_tmp(n), perm(n), iperm(n))
85 hecmat%indexU, hecmat%itemU, perm_tmp, iperm)
88 hecmat%indexU, hecmat%itemU, perm_tmp, &
89 ncolor_in, ncolor, colorindex, perm, iperm)
95 if (nthreads == 1)
then
97 allocate(colorindex(0:1), perm(n), iperm(n))
105 allocate(colorindex(0:n), perm_tmp(n), perm(n), iperm(n))
107 hecmat%indexU, hecmat%itemU, perm_tmp, iperm)
110 hecmat%indexU, hecmat%itemU, perm_tmp, &
111 ncolor_in, ncolor, colorindex, perm, iperm)
119 npl = hecmat%indexL(n)
120 npu = hecmat%indexU(n)
121 allocate(indexl(0:n), indexu(0:n), iteml(npl), itemu(npu))
123 hecmat%indexL, hecmat%indexU, hecmat%itemL, hecmat%itemU, &
124 indexl, indexu, iteml, itemu)
129 allocate(d(n), al(npl), au(npu))
131 hecmat%indexL, hecmat%indexU, hecmat%itemL, hecmat%itemU, &
132 hecmat%AL, hecmat%AU, hecmat%D, &
133 indexl, indexu, iteml, itemu, al, au, d)
154 alutmp(1,1)= alu(ii) * sigma_diag
155 alutmp(1,1)= 1.d0/alutmp(1,1)
168 hecmat%Iarray(98) = 0
169 hecmat%Iarray(97) = 0
178 real(kind=
kreal),
intent(inout) :: zp(:)
179 integer(kind=kint) :: ic, i, iold, j, isl, iel, isu, ieu, k
180 real(kind=
kreal) :: sw(1), x(1)
183 integer(kind=kint),
parameter :: numofblockperthread = 100
184 integer(kind=kint),
save :: numofthread = 1, numofblock
185 integer(kind=kint),
save,
allocatable :: ictoblockindex(:)
186 integer(kind=kint),
save,
allocatable :: blockindextocolorindex(:)
187 integer(kind=kint),
save :: sectorcachesize0, sectorcachesize1
188 integer(kind=kint) :: blockindex, elementcount, numofelement, ii
189 real(kind=
kreal) :: numofelementperblock
190 integer(kind=kint) :: my_rank
195 numofblock = numofthread * numofblockperthread
196 if (
allocated(ictoblockindex))
deallocate(ictoblockindex)
197 if (
allocated(blockindextocolorindex))
deallocate(blockindextocolorindex)
198 allocate (ictoblockindex(0:ncolor), &
199 blockindextocolorindex(0:numofblock + ncolor))
200 numofelement = n + indexl(n) + indexu(n)
201 numofelementperblock = dble(numofelement) / numofblock
204 ictoblockindex(0) = 0
205 blockindextocolorindex = -1
206 blockindextocolorindex(0) = 0
215 do i = colorindex(ic-1)+1, colorindex(ic)
216 elementcount = elementcount + 1
217 elementcount = elementcount + (indexl(i) - indexl(i-1))
218 elementcount = elementcount + (indexu(i) - indexu(i-1))
219 if (elementcount > ii * numofelementperblock &
220 .or. i == colorindex(ic))
then
222 blockindex = blockindex + 1
223 blockindextocolorindex(blockindex) = i
228 ictoblockindex(ic) = blockindex
230 numofblock = blockindex
233 sectorcachesize0, sectorcachesize1 )
257 do i = colorindex(ic-1)+1, colorindex(ic)
260 do blockindex = ictoblockindex(ic-1)+1, ictoblockindex(ic)
261 do i = blockindextocolorindex(blockindex-1)+1, &
262 blockindextocolorindex(blockindex)
271 sw(1)= sw(1) - al(j)*x(1)
292 do i = colorindex(ic-1)+1, colorindex(ic)
295 do blockindex = ictoblockindex(ic), ictoblockindex(ic-1)+1, -1
296 do i = blockindextocolorindex(blockindex), &
297 blockindextocolorindex(blockindex-1)+1, -1
309 sw(1)= sw(1) + au(j)*x(1)
316 zp(iold)= zp(iold) - x(1)
340 integer(kind=kint ) :: nthreads = 1
344 if (
associated(colorindex))
deallocate(colorindex)
345 if (
associated(perm))
deallocate(perm)
346 if (
associated(iperm))
deallocate(iperm)
347 if (
associated(alu))
deallocate(alu)
348 if (nthreads >= 1)
then
349 if (
associated(d))
deallocate(d)
350 if (
associated(al))
deallocate(al)
351 if (
associated(au))
deallocate(au)
352 if (
associated(indexl))
deallocate(indexl)
353 if (
associated(indexu))
deallocate(indexu)
354 if (
associated(iteml))
deallocate(iteml)
355 if (
associated(itemu))
deallocate(itemu)
368 initialized = .false.
371 subroutine write_debug_info
373 integer(kind=kint) :: my_rank, ic, in
376 if (my_rank.eq.0)
then
377 write(*,*)
'DEBUG: Output fort.19000+myrank and fort.29000+myrank for coloring information'
379 write(19000+my_rank,
'(a)')
'#NCOLORTot'
380 write(19000+my_rank,*) ncolor
381 write(19000+my_rank,
'(a)')
'#ic COLORindex(ic-1)+1 COLORindex(ic)'
383 write(19000+my_rank,*) ic, colorindex(ic-1)+1,colorindex(ic)
385 write(29000+my_rank,
'(a)')
'#n_node'
386 write(29000+my_rank,*) n
387 write(29000+my_rank,
'(a)')
'#in OLDtoNEW(in) NEWtoOLD(in)'
389 write(29000+my_rank,*) in, iperm(in), perm(in)
390 if (perm(iperm(in)) .ne. in)
then
391 write(29000+my_rank,*)
'** WARNING **: NEWtoOLD and OLDtoNEW: ',in
394 end subroutine write_debug_info
396 subroutine check_ordering
398 integer(kind=kint) :: ic, i, j, k
399 integer(kind=kint),
allocatable :: iicolor(:)
401 if (ncolor.gt.1)
then
404 do i= colorindex(ic-1)+1, colorindex(ic)
410 do i= colorindex(ic-1)+1, colorindex(ic)
411 do j= indexl(i-1)+1, indexl(i)
413 if (iicolor(i).eq.iicolor(k))
then
414 write(*,*) .eq.
'** ERROR **: L-part: iicolor(i)iicolor(k)',i,k,iicolor(i)
421 do i= colorindex(ic), colorindex(ic-1)+1, -1
422 do j= indexu(i-1)+1, indexu(i)
424 if (iicolor(i).eq.iicolor(k))
then
425 write(*,*) .eq.
'** ERROR **: U-part: iicolor(i)iicolor(k)',i,k,iicolor(i)
433 end subroutine check_ordering
real(kind=kreal) function, public hecmw_mat_get_sigma_diag(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_11_setup(hecMAT)
subroutine, public hecmw_precond_ssor_11_clear(hecMAT)
subroutine, public hecmw_precond_ssor_11_apply(ZP)
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()
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)