FrontISTR  5.9.0
Large-scale structural analysis program with finit element method
hecmw_precond_SSOR_66.F90
Go to the documentation of this file.
1 !-------------------------------------------------------------------------------
2 ! Copyright (c) 2019 FrontISTR Commons
3 ! This software is released under the MIT License, see LICENSE.txt
4 !-------------------------------------------------------------------------------
5 
6 !C
7 !C***
8 !C*** module hecmw_precond_SSOR_66
9 !C***
10 !C
12  use hecmw_util
17 #ifndef _OPENACC
18  !$ use omp_lib
19 #endif
20 
21  private
22 
26 
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()
36 
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()
41 
42  logical, save :: isFirst = .true.
43 
44 contains
45 
46  subroutine hecmw_precond_ssor_66_setup(hecMAT)
47  implicit none
48  type(hecmwst_matrix), intent(in) :: hecmat
49  integer(kind=kint ) :: npl, npu
50  integer(kind=kint ) :: ncolor_in
51  real (kind=kreal) :: sigma_diag
52  real (kind=kreal) :: alutmp(6,6), pw(6)
53  integer(kind=kint ) :: ii, i, j, k
54  integer(kind=kint ) :: nthreads = 1
55  integer(kind=kint ), allocatable :: perm_tmp(:)
56  !real (kind=kreal) :: t0
57 
58  !t0 = hecmw_Wtime()
59  !write(*,*) 'DEBUG: SSOR setup start', hecmw_Wtime()-t0
60 
61 #ifndef _OPENACC
62  !$ nthreads = omp_get_max_threads()
63 #endif
64 
65  n = hecmat%N
66  ! N = hecMAT%NP
67  ncolor_in = hecmw_mat_get_ncolor_in(hecmat)
68  sigma_diag = hecmw_mat_get_sigma_diag(hecmat)
69 
70 #ifdef _OPENACC
71  allocate(colorindex(0:n), perm_tmp(n), perm(n), iperm(n))
72  call hecmw_matrix_ordering_rcm(n, hecmat%indexL, hecmat%itemL, &
73  hecmat%indexU, hecmat%itemU, perm_tmp, iperm)
74  !write(*,*) 'DEBUG: RCM ordering done', hecmw_Wtime()-t0
75  call hecmw_matrix_ordering_mc(n, hecmat%indexL, hecmat%itemL, &
76  hecmat%indexU, hecmat%itemU, perm_tmp, &
77  ncolor_in, ncolor, colorindex, perm, iperm)
78  !write(*,*) 'DEBUG: MC ordering done', hecmw_Wtime()-t0
79  deallocate(perm_tmp)
80 
81 
82  npl = hecmat%indexL(n)
83  npu = hecmat%indexU(n)
84  allocate(indexl(0:n), indexu(0:n), iteml(npl), itemu(npu))
85  call hecmw_matrix_reorder_profile(n, perm, iperm, &
86  hecmat%indexL, hecmat%indexU, hecmat%itemL, hecmat%itemU, &
87  indexl, indexu, iteml, itemu)
88  !write(*,*) 'DEBUG: reordering profile done', hecmw_Wtime()-t0
89 
90  call check_ordering
91 
92  allocate(d(36*n), al(36*npl), au(36*npu))
93  call hecmw_matrix_reorder_values(n, 6, perm, iperm, &
94  hecmat%indexL, hecmat%indexU, hecmat%itemL, hecmat%itemU, &
95  hecmat%AL, hecmat%AU, hecmat%D, &
96  indexl, indexu, iteml, itemu, al, au, d)
97  !write(*,*) 'DEBUG: reordering values done', hecmw_Wtime()-t0
98 
99  call hecmw_matrix_reorder_renum_item(n, perm, indexl, iteml)
100  call hecmw_matrix_reorder_renum_item(n, perm, indexu, itemu)
101 #else
102  if (nthreads == 1) then
103  ncolor = 1
104  allocate(colorindex(0:1), perm(n), iperm(n))
105  colorindex(0) = 0
106  colorindex(1) = n
107  do i=1,n
108  perm(i) = i
109  iperm(i) = i
110  end do
111 
112  d => hecmat%D
113  al => hecmat%AL
114  au => hecmat%AU
115  indexl => hecmat%indexL
116  indexu => hecmat%indexU
117  iteml => hecmat%itemL
118  itemu => hecmat%itemU
119  else
120  allocate(colorindex(0:n), perm_tmp(n), perm(n), iperm(n))
121  call hecmw_matrix_ordering_rcm(n, hecmat%indexL, hecmat%itemL, &
122  hecmat%indexU, hecmat%itemU, perm_tmp, iperm)
123  !write(*,*) 'DEBUG: RCM ordering done', hecmw_Wtime()-t0
124  call hecmw_matrix_ordering_mc(n, hecmat%indexL, hecmat%itemL, &
125  hecmat%indexU, hecmat%itemU, perm_tmp, &
126  ncolor_in, ncolor, colorindex, perm, iperm)
127  !write(*,*) 'DEBUG: MC ordering done', hecmw_Wtime()-t0
128  deallocate(perm_tmp)
129 
130 
131  npl = hecmat%indexL(n)
132  npu = hecmat%indexU(n)
133  allocate(indexl(0:n), indexu(0:n), iteml(npl), itemu(npu))
134  call hecmw_matrix_reorder_profile(n, perm, iperm, &
135  hecmat%indexL, hecmat%indexU, hecmat%itemL, hecmat%itemU, &
136  indexl, indexu, iteml, itemu)
137  !write(*,*) 'DEBUG: reordering profile done', hecmw_Wtime()-t0
138 
139  call check_ordering
140 
141  allocate(d(36*n), al(36*npl), au(36*npu))
142  call hecmw_matrix_reorder_values(n, 6, perm, iperm, &
143  hecmat%indexL, hecmat%indexU, hecmat%itemL, hecmat%itemU, &
144  hecmat%AL, hecmat%AU, hecmat%D, &
145  indexl, indexu, iteml, itemu, al, au, d)
146  !write(*,*) 'DEBUG: reordering values done', hecmw_Wtime()-t0
147 
148  call hecmw_matrix_reorder_renum_item(n, perm, indexl, iteml)
149  call hecmw_matrix_reorder_renum_item(n, perm, indexu, itemu)
150  end if
151 #endif
152 
153  allocate(alu(36*n))
154  alu = 0.d0
155 
156  do ii= 1, 36*n
157  alu(ii) = d(ii)
158  enddo
159 
160 #ifdef _OPENACC
161  !$acc kernels
162  !$acc loop independent private(ALUtmp,PW)
163 #else
164  !$omp parallel default(none),private(ii,ALUtmp,k,i,j,PW),shared(N,ALU,SIGMA_DIAG)
165  !$omp do
166 #endif
167  do ii= 1, n
168  alutmp(1,1)= alu(36*ii-35) * sigma_diag
169  alutmp(1,2)= alu(36*ii-34)
170  alutmp(1,3)= alu(36*ii-33)
171  alutmp(1,4)= alu(36*ii-32)
172  alutmp(1,5)= alu(36*ii-31)
173  alutmp(1,6)= alu(36*ii-30)
174 
175  alutmp(2,1)= alu(36*ii-29)
176  alutmp(2,2)= alu(36*ii-28) * sigma_diag
177  alutmp(2,3)= alu(36*ii-27)
178  alutmp(2,4)= alu(36*ii-26)
179  alutmp(2,5)= alu(36*ii-25)
180  alutmp(2,6)= alu(36*ii-24)
181 
182  alutmp(3,1)= alu(36*ii-23)
183  alutmp(3,2)= alu(36*ii-22)
184  alutmp(3,3)= alu(36*ii-21) * sigma_diag
185  alutmp(3,4)= alu(36*ii-20)
186  alutmp(3,5)= alu(36*ii-19)
187  alutmp(3,6)= alu(36*ii-18)
188 
189  alutmp(4,1)= alu(36*ii-17)
190  alutmp(4,2)= alu(36*ii-16)
191  alutmp(4,3)= alu(36*ii-15)
192  alutmp(4,4)= alu(36*ii-14) * sigma_diag
193  alutmp(4,5)= alu(36*ii-13)
194  alutmp(4,6)= alu(36*ii-12)
195 
196  alutmp(5,1)= alu(36*ii-11)
197  alutmp(5,2)= alu(36*ii-10)
198  alutmp(5,3)= alu(36*ii-9 )
199  alutmp(5,4)= alu(36*ii-8 )
200  alutmp(5,5)= alu(36*ii-7 ) * sigma_diag
201  alutmp(5,6)= alu(36*ii-6 )
202 
203  alutmp(6,1)= alu(36*ii-5 )
204  alutmp(6,2)= alu(36*ii-4 )
205  alutmp(6,3)= alu(36*ii-3 )
206  alutmp(6,4)= alu(36*ii-2 )
207  alutmp(6,5)= alu(36*ii-1 )
208  alutmp(6,6)= alu(36*ii ) * sigma_diag
209 
210  do k= 1, 6
211  alutmp(k,k)= 1.d0/alutmp(k,k)
212  do i= k+1, 6
213  alutmp(i,k)= alutmp(i,k) * alutmp(k,k)
214  do j= k+1, 6
215  pw(j)= alutmp(i,j) - alutmp(i,k)*alutmp(k,j)
216  enddo
217  do j= k+1, 6
218  alutmp(i,j)= pw(j)
219  enddo
220  enddo
221  enddo
222 
223  alu(36*ii-35)= alutmp(1,1)
224  alu(36*ii-34)= alutmp(1,2)
225  alu(36*ii-33)= alutmp(1,3)
226  alu(36*ii-32)= alutmp(1,4)
227  alu(36*ii-31)= alutmp(1,5)
228  alu(36*ii-30)= alutmp(1,6)
229  alu(36*ii-29)= alutmp(2,1)
230  alu(36*ii-28)= alutmp(2,2)
231  alu(36*ii-27)= alutmp(2,3)
232  alu(36*ii-26)= alutmp(2,4)
233  alu(36*ii-25)= alutmp(2,5)
234  alu(36*ii-24)= alutmp(2,6)
235  alu(36*ii-23)= alutmp(3,1)
236  alu(36*ii-22)= alutmp(3,2)
237  alu(36*ii-21)= alutmp(3,3)
238  alu(36*ii-20)= alutmp(3,4)
239  alu(36*ii-19)= alutmp(3,5)
240  alu(36*ii-18)= alutmp(3,6)
241  alu(36*ii-17)= alutmp(4,1)
242  alu(36*ii-16)= alutmp(4,2)
243  alu(36*ii-15)= alutmp(4,3)
244  alu(36*ii-14)= alutmp(4,4)
245  alu(36*ii-13)= alutmp(4,5)
246  alu(36*ii-12)= alutmp(4,6)
247  alu(36*ii-11)= alutmp(5,1)
248  alu(36*ii-10)= alutmp(5,2)
249  alu(36*ii-9 )= alutmp(5,3)
250  alu(36*ii-8 )= alutmp(5,4)
251  alu(36*ii-7 )= alutmp(5,5)
252  alu(36*ii-6 )= alutmp(5,6)
253  alu(36*ii-5 )= alutmp(6,1)
254  alu(36*ii-4 )= alutmp(6,2)
255  alu(36*ii-3 )= alutmp(6,3)
256  alu(36*ii-2 )= alutmp(6,4)
257  alu(36*ii-1 )= alutmp(6,5)
258  alu(36*ii )= alutmp(6,6)
259  enddo
260 #ifdef _OPENACC
261  !$acc end kernels
262 #else
263  !$omp end do
264  !$omp end parallel
265 #endif
266 
267  isfirst = .true.
268 
269  !write(*,*) 'DEBUG: SSOR setup done', hecmw_Wtime()-t0
270 
271  end subroutine hecmw_precond_ssor_66_setup
272 
274  use hecmw_tuning_fx
275  implicit none
276  real(kind=kreal), intent(inout) :: zp(:)
277  integer(kind=kint) :: ic, i, iold, j, isl, iel, isu, ieu, k
278  real(kind=kreal) :: x1, x2, x3, x4, x5, x6
279  real(kind=kreal) :: sw1, sw2, sw3, sw4, sw5, sw6
280 
281  ! added for tuning >>>
282  integer(kind=kint), parameter :: numofblockperthread = 100
283  integer(kind=kint), save :: numofthread = 1, numofblock
284  integer(kind=kint), save, allocatable :: ictoblockindex(:)
285  integer(kind=kint), save, allocatable :: blockindextocolorindex(:)
286  integer(kind=kint), save :: sectorcachesize0, sectorcachesize1
287  integer(kind=kint) :: blockindex, elementcount, numofelement, ii
288  real(kind=kreal) :: numofelementperblock
289  integer(kind=kint) :: my_rank
290 
291 #ifndef _OPENACC
292  if (isfirst) then
293  !$ numOfThread = omp_get_max_threads()
294  numofblock = numofthread * numofblockperthread
295  if (allocated(ictoblockindex)) deallocate(ictoblockindex)
296  if (allocated(blockindextocolorindex)) deallocate(blockindextocolorindex)
297  allocate (ictoblockindex(0:ncolor), &
298  blockindextocolorindex(0:numofblock + ncolor))
299  numofelement = n + indexl(n) + indexu(n)
300  numofelementperblock = dble(numofelement) / numofblock
301  blockindex = 0
302  ictoblockindex = -1
303  ictoblockindex(0) = 0
304  blockindextocolorindex = -1
305  blockindextocolorindex(0) = 0
306  my_rank = hecmw_comm_get_rank()
307  ! write(9000+my_rank,*) &
308  ! '# numOfElementPerBlock =', numOfElementPerBlock
309  ! write(9000+my_rank,*) &
310  ! '# ic, blockIndex, colorIndex, elementCount'
311  do ic = 1, ncolor
312  elementcount = 0
313  ii = 1
314  do i = colorindex(ic-1)+1, colorindex(ic)
315  elementcount = elementcount + 1
316  elementcount = elementcount + (indexl(i) - indexl(i-1))
317  elementcount = elementcount + (indexu(i) - indexu(i-1))
318  if (elementcount > ii * numofelementperblock &
319  .or. i == colorindex(ic)) then
320  ii = ii + 1
321  blockindex = blockindex + 1
322  blockindextocolorindex(blockindex) = i
323  ! write(9000+my_rank,*) ic, blockIndex, &
324  ! blockIndexToColorIndex(blockIndex), elementCount
325  endif
326  enddo
327  ictoblockindex(ic) = blockindex
328  enddo
329  numofblock = blockindex
330 
332  sectorcachesize0, sectorcachesize1 )
333 
334  isfirst = .false.
335  endif
336 #endif
337  ! <<< added for tuning
338 
339 #ifndef _OPENACC
340  !call start_collection("loopInPrecond66")
341 
342  !OCL CACHE_SECTOR_SIZE(sectorCacheSize0,sectorCacheSize1)
343  !OCL CACHE_SUBSECTOR_ASSIGN(ZP)
344 
345  !$omp parallel default(none) &
346  !$omp&shared(NColor,indexL,itemL,indexU,itemU,AL,AU,D,ALU,perm,&
347  !$omp& ZP,icToBlockIndex,blockIndexToColorIndex) &
348  !$omp&private(SW1,SW2,SW3,SW4,SW5,SW6,X1,X2,X3,X4,X5,X6,ic,i,iold,isL,ieL,isU,ieU,j,k,blockIndex)
349 #endif
350 
351  !C-- FORWARD
352  do ic=1,ncolor
353 #ifdef _OPENACC
354  !$acc kernels
355  !$acc loop independent
356  do i = colorindex(ic-1)+1, colorindex(ic)
357 #else
358  !$omp do schedule (static, 1)
359  do blockindex = ictoblockindex(ic-1)+1, ictoblockindex(ic)
360  do i = blockindextocolorindex(blockindex-1)+1, &
361  blockindextocolorindex(blockindex)
362 #endif
363  ! do i = startPos(threadNum, ic), endPos(threadNum, ic)
364  iold = perm(i)
365  sw1= zp(6*iold-5)
366  sw2= zp(6*iold-4)
367  sw3= zp(6*iold-3)
368  sw4= zp(6*iold-2)
369  sw5= zp(6*iold-1)
370  sw6= zp(6*iold )
371  isl= indexl(i-1)+1
372  iel= indexl(i)
373  do j= isl, iel
374  !k= perm(itemL(j))
375  k= iteml(j)
376  x1= zp(6*k-5)
377  x2= zp(6*k-4)
378  x3= zp(6*k-3)
379  x4= zp(6*k-2)
380  x5= zp(6*k-1)
381  x6= zp(6*k )
382  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
383  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
384  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
385  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
386  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
387  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
388  enddo ! j
389 
390  x1= sw1
391  x2= sw2
392  x3= sw3
393  x4= sw4
394  x5= sw5
395  x6= sw6
396  x2= x2 -alu(36*i-29)*x1
397  x3= x3 -alu(36*i-23)*x1 -alu(36*i-22)*x2
398  x4= x4 -alu(36*i-17)*x1 -alu(36*i-16)*x2 -alu(36*i-5)*x3
399  x5= x5 -alu(36*i-11)*x1 -alu(36*i-10)*x2 -alu(36*i-9)*x3 -alu(36*i-8)*x4
400  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
401  x6= alu(36*i )* x6
402  x5= alu(36*i-7 )*( x5 -alu(36*i-6)*x6 )
403  x4= alu(36*i-14)*( x4 -alu(36*i-12)*x6 -alu(36*i-13)*x5)
404  x3= alu(36*i-21)*( x3 -alu(36*i-18)*x6 -alu(36*i-19)*x5 -alu(36*i-20)*x4)
405  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)
406  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)
407  zp(6*iold-5)= x1
408  zp(6*iold-4)= x2
409  zp(6*iold-3)= x3
410  zp(6*iold-2)= x4
411  zp(6*iold-1)= x5
412  zp(6*iold )= x6
413 #ifdef _OPENACC
414  enddo
415  !$acc end kernels
416 #else
417  enddo ! i
418  enddo ! blockIndex
419  !$omp end do
420 #endif
421  enddo ! ic
422 
423  !C-- BACKWARD
424  do ic=ncolor, 1, -1
425 #ifdef _OPENACC
426  !$acc kernels
427  !$acc loop independent
428  do i = colorindex(ic-1)+1, colorindex(ic)
429 #else
430  !$omp do schedule (static, 1)
431  do blockindex = ictoblockindex(ic), ictoblockindex(ic-1)+1, -1
432  do i = blockindextocolorindex(blockindex), &
433  blockindextocolorindex(blockindex-1)+1, -1
434 #endif
435  ! do blockIndex = icToBlockIndex(ic-1)+1, icToBlockIndex(ic)
436  ! do i = blockIndexToColorIndex(blockIndex-1)+1, &
437  ! blockIndexToColorIndex(blockIndex)
438  ! do i = endPos(threadNum, ic), startPos(threadNum, ic), -1
439  sw1= 0.d0
440  sw2= 0.d0
441  sw3= 0.d0
442  sw4= 0.d0
443  sw5= 0.d0
444  sw6= 0.d0
445  isu= indexu(i-1) + 1
446  ieu= indexu(i)
447  do j= ieu, isu, -1
448  !k= perm(itemU(j))
449  k= itemu(j)
450  x1= zp(6*k-5)
451  x2= zp(6*k-4)
452  x3= zp(6*k-3)
453  x4= zp(6*k-2)
454  x5= zp(6*k-1)
455  x6= zp(6*k )
456  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
457  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
458  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
459  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
460  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
461  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
462  enddo ! j
463 
464  x1= sw1
465  x2= sw2
466  x3= sw3
467  x4= sw4
468  x5= sw5
469  x6= sw6
470  x2= x2 -alu(36*i-29)*x1
471  x3= x3 -alu(36*i-23)*x1 -alu(36*i-22)*x2
472  x4= x4 -alu(36*i-17)*x1 -alu(36*i-16)*x2 -alu(36*i-5)*x3
473  x5= x5 -alu(36*i-11)*x1 -alu(36*i-10)*x2 -alu(36*i-9)*x3 -alu(36*i-8)*x4
474  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
475  x6= alu(36*i )* x6
476  x5= alu(36*i-7 )*( x5 -alu(36*i-6)*x6 )
477  x4= alu(36*i-14)*( x4 -alu(36*i-12)*x6 -alu(36*i-13)*x5)
478  x3= alu(36*i-21)*( x3 -alu(36*i-18)*x6 -alu(36*i-19)*x5 -alu(36*i-20)*x4)
479  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)
480  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)
481  iold = perm(i)
482  zp(6*iold-5)= zp(6*iold-5) -x1
483  zp(6*iold-4)= zp(6*iold-4) -x2
484  zp(6*iold-3)= zp(6*iold-3) -x3
485  zp(6*iold-2)= zp(6*iold-2) -x4
486  zp(6*iold-1)= zp(6*iold-1) -x5
487  zp(6*iold )= zp(6*iold ) -x6
488 #ifdef _OPENACC
489  enddo
490  !$acc end kernels
491 #else
492  enddo ! i
493  enddo ! blockIndex
494  !$omp end do
495 #endif
496  enddo ! ic
497 #ifndef _OPENACC
498  !$omp end parallel
499 
500  !OCL END_CACHE_SUBSECTOR
501  !OCL END_CACHE_SECTOR_SIZE
502 
503  !call stop_collection("loopInPrecond66")
504 #endif
505 
506  end subroutine hecmw_precond_ssor_66_apply
507 
508  subroutine hecmw_precond_ssor_66_clear(hecMAT)
509  implicit none
510  type(hecmwst_matrix), intent(inout) :: hecmat
511  integer(kind=kint ) :: nthreads = 1
512 #ifndef _OPENACC
513  !$ nthreads = omp_get_max_threads()
514 #endif
515  if (associated(colorindex)) deallocate(colorindex)
516  if (associated(perm)) deallocate(perm)
517  if (associated(iperm)) deallocate(iperm)
518  if (associated(alu)) deallocate(alu)
519  if (nthreads >= 1) then
520  if (associated(d)) deallocate(d)
521  if (associated(al)) deallocate(al)
522  if (associated(au)) deallocate(au)
523  if (associated(indexl)) deallocate(indexl)
524  if (associated(indexu)) deallocate(indexu)
525  if (associated(iteml)) deallocate(iteml)
526  if (associated(itemu)) deallocate(itemu)
527  end if
528  nullify(colorindex)
529  nullify(perm)
530  nullify(iperm)
531  nullify(alu)
532  nullify(d)
533  nullify(al)
534  nullify(au)
535  nullify(indexl)
536  nullify(indexu)
537  nullify(iteml)
538  nullify(itemu)
539  end subroutine hecmw_precond_ssor_66_clear
540 
541 
542  subroutine check_ordering
543  implicit none
544  integer(kind=kint) :: ic, i, j, k
545  integer(kind=kint), allocatable :: iicolor(:)
546  ! check color dependence of neighbouring nodes
547  if (ncolor.gt.1) then
548  allocate(iicolor(n))
549  do ic=1,ncolor
550  do i= colorindex(ic-1)+1, colorindex(ic)
551  iicolor(i) = ic
552  enddo ! i
553  enddo ! ic
554  ! FORWARD: L-part
555  do ic=1,ncolor
556  do i= colorindex(ic-1)+1, colorindex(ic)
557  do j= indexl(i-1)+1, indexl(i)
558  k= iteml(j)
559  if (iicolor(i).eq.iicolor(k)) then
560  write(*,*) .eq.'** ERROR **: L-part: iicolor(i)iicolor(k)',i,k,iicolor(i)
561  endif
562  enddo ! j
563  enddo ! i
564  enddo ! ic
565  ! BACKWARD: U-part
566  do ic=ncolor, 1, -1
567  do i= colorindex(ic), colorindex(ic-1)+1, -1
568  do j= indexu(i-1)+1, indexu(i)
569  k= itemu(j)
570  if (iicolor(i).eq.iicolor(k)) then
571  write(*,*) .eq.'** ERROR **: U-part: iicolor(i)iicolor(k)',i,k,iicolor(i)
572  endif
573  enddo ! j
574  enddo ! i
575  enddo ! ic
576  deallocate(iicolor)
577  endif ! if (NColor.gt.1)
578  !--------------------< debug: shizawa
579  end subroutine check_ordering
580 
581 end module hecmw_precond_ssor_66
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_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)
I/O and Utility.
Definition: hecmw_util_f.F90:7
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)