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(2,2), pw(2)
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)
94 if (nthreads == 1)
then
96 allocate(colorindex(0:1), perm(n), iperm(n))
104 allocate(colorindex(0:n), perm_tmp(n), perm(n), iperm(n))
106 hecmat%indexU, hecmat%itemU, perm_tmp, iperm)
109 hecmat%indexU, hecmat%itemU, perm_tmp, &
110 ncolor_in, ncolor, colorindex, perm, iperm)
117 npl = hecmat%indexL(n)
118 npu = hecmat%indexU(n)
119 allocate(indexl(0:n), indexu(0:n), iteml(npl), itemu(npu))
121 hecmat%indexL, hecmat%indexU, hecmat%itemL, hecmat%itemU, &
122 indexl, indexu, iteml, itemu)
126 allocate(d(4*n), al(4*npl), au(4*npu))
128 hecmat%indexL, hecmat%indexU, hecmat%itemL, hecmat%itemU, &
129 hecmat%AL, hecmat%AU, hecmat%D, &
130 indexl, indexu, iteml, itemu, al, au, d)
151 alutmp(1,1)= alu(4*ii-3) * sigma_diag
152 alutmp(1,2)= alu(4*ii-2)
153 alutmp(2,1)= alu(4*ii-1)
154 alutmp(2,2)= alu(4*ii-0) * sigma_diag
156 alutmp(k,k)= 1.d0/alutmp(k,k)
158 alutmp(i,k)= alutmp(i,k) * alutmp(k,k)
160 pw(j)= alutmp(i,j) - alutmp(i,k)*alutmp(k,j)
167 alu(4*ii-3)= alutmp(1,1)
168 alu(4*ii-2)= alutmp(1,2)
169 alu(4*ii-1)= alutmp(2,1)
170 alu(4*ii-0)= alutmp(2,2)
182 hecmat%Iarray(98) = 0
183 hecmat%Iarray(97) = 0
192 real(kind=
kreal),
intent(inout) :: zp(:)
193 integer(kind=kint) :: ic, i, iold, j, isl, iel, isu, ieu, k
194 real(kind=
kreal) :: sw(2), x(2)
197 integer(kind=kint),
parameter :: numofblockperthread = 100
198 integer(kind=kint),
save :: numofthread = 1, numofblock
199 integer(kind=kint),
save,
allocatable :: ictoblockindex(:)
200 integer(kind=kint),
save,
allocatable :: blockindextocolorindex(:)
201 integer(kind=kint),
save :: sectorcachesize0, sectorcachesize1
202 integer(kind=kint) :: blockindex, elementcount, numofelement, ii
203 real(kind=
kreal) :: numofelementperblock
204 integer(kind=kint) :: my_rank
209 numofblock = numofthread * numofblockperthread
210 if (
allocated(ictoblockindex))
deallocate(ictoblockindex)
211 if (
allocated(blockindextocolorindex))
deallocate(blockindextocolorindex)
212 allocate (ictoblockindex(0:ncolor), &
213 blockindextocolorindex(0:numofblock + ncolor))
214 numofelement = n + indexl(n) + indexu(n)
215 numofelementperblock = dble(numofelement) / numofblock
218 ictoblockindex(0) = 0
219 blockindextocolorindex = -1
220 blockindextocolorindex(0) = 0
229 do i = colorindex(ic-1)+1, colorindex(ic)
230 elementcount = elementcount + 1
231 elementcount = elementcount + (indexl(i) - indexl(i-1))
232 elementcount = elementcount + (indexu(i) - indexu(i-1))
233 if (elementcount > ii * numofelementperblock &
234 .or. i == colorindex(ic))
then
236 blockindex = blockindex + 1
237 blockindextocolorindex(blockindex) = i
242 ictoblockindex(ic) = blockindex
244 numofblock = blockindex
247 sectorcachesize0, sectorcachesize1 )
271 do i = colorindex(ic-1)+1, colorindex(ic)
274 do blockindex = ictoblockindex(ic-1)+1, ictoblockindex(ic)
275 do i = blockindextocolorindex(blockindex-1)+1, &
276 blockindextocolorindex(blockindex)
287 sw(1)= sw(1) - al(4*j-3)*x(1) - al(4*j-2)*x(2)
288 sw(2)= sw(2) - al(4*j-1)*x(1) - al(4*j-0)*x(2)
292 x(2)= x(2) - alu(4*i-1)*x(1)
293 x(2)= alu(4*i )* x(2)
294 x(1)= alu(4*i-3)*( x(1) - alu(4*i-2)*x(2))
312 do i = colorindex(ic-1)+1, colorindex(ic)
315 do blockindex = ictoblockindex(ic), ictoblockindex(ic-1)+1, -1
316 do i = blockindextocolorindex(blockindex), &
317 blockindextocolorindex(blockindex-1)+1, -1
330 sw(1)= sw(1) + au(4*j-3)*x(1) + au(4*j-2)*x(2)
331 sw(2)= sw(2) + au(4*j-1)*x(1) + au(4*j-0)*x(2)
335 x(2)= x(2) - alu(4*i-1)*x(1)
338 x(2)= alu(4*i )* x(2)
339 x(1)= alu(4*i-3)*( x(1) - alu(4*i-2)*x(2) )
342 zp(2*iold-1)= zp(2*iold-1) - x(1)
343 zp(2*iold )= zp(2*iold ) - x(2)
367 integer(kind=kint ) :: nthreads = 1
371 if (
associated(colorindex))
deallocate(colorindex)
372 if (
associated(perm))
deallocate(perm)
373 if (
associated(iperm))
deallocate(iperm)
374 if (
associated(alu))
deallocate(alu)
375 if (nthreads >= 1)
then
376 if (
associated(d))
deallocate(d)
377 if (
associated(al))
deallocate(al)
378 if (
associated(au))
deallocate(au)
379 if (
associated(indexl))
deallocate(indexl)
380 if (
associated(indexu))
deallocate(indexu)
381 if (
associated(iteml))
deallocate(iteml)
382 if (
associated(itemu))
deallocate(itemu)
395 initialized = .false.
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_22_apply(ZP)
subroutine, public hecmw_precond_ssor_22_setup(hecMAT)
subroutine, public hecmw_precond_ssor_22_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()
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)