17 integer(4),
parameter :: krealp = 8
19 integer(kind=kint) :: NPFIU, NPFIL
20 integer(kind=kint) :: N
21 integer(kind=kint),
pointer :: inumFI1L(:) => null()
22 integer(kind=kint),
pointer :: inumFI1U(:) => null()
23 integer(kind=kint),
pointer :: FI1L(:) => null()
24 integer(kind=kint),
pointer :: FI1U(:) => null()
26 integer(kind=kint),
pointer :: indexL(:) => null()
27 integer(kind=kint),
pointer :: indexU(:) => null()
28 integer(kind=kint),
pointer :: itemL(:) => null()
29 integer(kind=kint),
pointer :: itemU(:) => null()
30 real(kind=
kreal),
pointer :: d(:) => null()
31 real(kind=
kreal),
pointer :: al(:) => null()
32 real(kind=
kreal),
pointer :: au(:) => null()
34 real(kind=krealp),
pointer :: sainvl(:) => null()
35 real(kind=krealp),
pointer :: sainvd(:) => null()
36 real(kind=krealp),
pointer :: rifu(:) => null()
37 real(kind=krealp),
pointer :: rifl(:) => null()
38 real(kind=krealp),
pointer :: rifd(:) => null()
49 integer(kind=kint ) :: precond
51 real(kind=krealp) :: filter
59 indexl => hecmat%indexL
60 indexu => hecmat%indexU
64 if (precond.eq.21)
call form_ilu1_rif_33(hecmat)
66 allocate (sainvd(9*hecmat%NP))
67 allocate (sainvl(9*npfiu))
68 allocate (rifd(9*hecmat%NP))
69 allocate (rifu(9*npfiu))
75 filter= hecmat%Rarray(5)
77 write(*,
"(a,F15.8)")
"### RIF FILTER :",filter
79 call hecmw_rif_33(hecmat)
81 allocate (rifl(9*npfiu))
84 call hecmw_rif_make_u_33(hecmat)
90 real(kind=
kreal),
intent(inout) :: zp(:)
91 integer(kind=kint) :: in, i, j, isl, iel
92 real(kind=
kreal) :: sw1, sw2, sw3, x1, x2, x3
107 sw1= sw1 - rifl(9*j-8)*x1 - rifl(9*j-7)*x2 - rifl(9*j-6)*x3
108 sw2= sw2 - rifl(9*j-5)*x1 - rifl(9*j-4)*x2 - rifl(9*j-3)*x3
109 sw3= sw3 - rifl(9*j-2)*x1 - rifl(9*j-1)*x2 - rifl(9*j )*x3
114 x2= x2 - rifd(9*i-5)*x1
115 x3= x3 - rifd(9*i-2)*x1 - rifd(9*i-1)*x2
122 zp(3*i-2)= zp(3*i-2)*rifd(9*i-8)
123 zp(3*i-1)= zp(3*i-1)*rifd(9*i-4)
124 zp(3*i )= zp(3*i )*rifd(9*i )
133 isl= inumfi1u(i-1) + 1
140 sw1= sw1 - rifu(9*j-8)*x1 - rifu(9*j-7)*x2 - rifu(9*j-6)*x3
141 sw2= sw2 - rifu(9*j-5)*x1 - rifu(9*j-4)*x2 - rifu(9*j-3)*x3
142 sw3= sw3 - rifu(9*j-2)*x1 - rifu(9*j-1)*x2 - rifu(9*j )*x3
148 x2= x2 - rifd(9*i-1)*x3
149 x1= x1 - rifd(9*i-2)*x3 - rifd(9*i-5)*x2
160 subroutine hecmw_rif_33(hecMAT)
163 integer(kind=kint) :: i, j, js, je, in, itr, np
164 real(kind=krealp) :: x1, x2, x3, dd, dd1, dd2, dd3, dtemp(3)
165 real(kind=krealp) :: filter
166 real(kind=krealp),
allocatable :: zz(:), vv(:)
168 filter= hecmat%Rarray(5)
183 zz(3*itr-2)= sainvd(9*itr-8)
184 zz(3*itr-1)= sainvd(9*itr-5)
185 zz(3*itr )= sainvd(9*itr-2)
189 js= inumfi1l(itr-1) + 1
193 zz(3*in-2)= sainvl(9*j-8)
194 zz(3*in-1)= sainvl(9*j-7)
195 zz(3*in )= sainvl(9*j-6)
202 vv(3*i-2) = vv(3*i-2) + d(9*i-8)*x1 + d(9*i-7)*x2 + d(9*i-6)*x3
203 vv(3*i-1) = vv(3*i-1) + d(9*i-5)*x1 + d(9*i-4)*x2 + d(9*i-3)*x3
204 vv(3*i ) = vv(3*i ) + d(9*i-2)*x1 + d(9*i-1)*x2 + d(9*i )*x3
210 vv(3*in-2)= vv(3*in-2) + al(9*j-8)*x1 + al(9*j-5)*x2 + al(9*j-2)*x3
211 vv(3*in-1)= vv(3*in-1) + al(9*j-7)*x1 + al(9*j-4)*x2 + al(9*j-1)*x3
212 vv(3*in )= vv(3*in ) + al(9*j-6)*x1 + al(9*j-3)*x2 + al(9*j )*x3
219 vv(3*in-2)= vv(3*in-2) + au(9*j-8)*x1 + au(9*j-5)*x2 + au(9*j-2)*x3
220 vv(3*in-1)= vv(3*in-1) + au(9*j-7)*x1 + au(9*j-4)*x2 + au(9*j-1)*x3
221 vv(3*in )= vv(3*in ) + au(9*j-6)*x1 + au(9*j-3)*x2 + au(9*j )*x3
227 sainvd(9*i-8) = vv(3*i-2)
228 sainvd(9*i-4) = vv(3*i-2)*sainvd(9*i-7) + vv(3*i-1)
229 sainvd(9*i ) = vv(3*i-2)*sainvd(9*i-6) + vv(3*i-1)*sainvd(9*i-3) + vv(3*i)
230 js= inumfi1l(i-1) + 1
237 sainvd(9*i-8)= sainvd(9*i-8) + x1*sainvl(9*j-8) + x2*sainvl(9*j-7) + x3*sainvl(9*j-6)
238 sainvd(9*i-4)= sainvd(9*i-4) + x1*sainvl(9*j-5) + x2*sainvl(9*j-4) + x3*sainvl(9*j-3)
239 sainvd(9*i )= sainvd(9*i ) + x1*sainvl(9*j-2) + x2*sainvl(9*j-1) + x3*sainvl(9*j )
244 dd = 1.0d0/sainvd(9*itr-8)
246 sainvd(9*itr-4) =sainvd(9*itr-4)*dd
247 sainvd(9*itr ) =sainvd(9*itr )*dd
250 sainvd(9*i-8) = sainvd(9*i-8)*dd
251 sainvd(9*i-4) = sainvd(9*i-4)*dd
252 sainvd(9*i ) = sainvd(9*i )*dd
256 rifd(9*itr-5) = sainvd(9*itr-4)
257 rifd(9*itr-2) = sainvd(9*itr )
259 js= inumfi1u(itr-1) + 1
262 rifu(9*j-8) = sainvd(9*fi1u(j)-8)
263 rifu(9*j-7) = sainvd(9*fi1u(j)-4)
264 rifu(9*j-6) = sainvd(9*fi1u(j) )
270 if(abs(dd2) > filter)
then
271 sainvd(9*itr-7)= sainvd(9*itr-7) - dd2*zz(3*itr-2)
272 js= inumfi1l(itr-1) + 1
276 sainvl(9*j-5) = sainvl(9*j-5)-dd2*zz(3*in-2)
277 sainvl(9*j-4) = sainvl(9*j-4)-dd2*zz(3*in-1)
278 sainvl(9*j-3) = sainvl(9*j-3)-dd2*zz(3*in )
283 if(abs(dd3) > filter)
then
284 sainvd(9*itr-6)= sainvd(9*itr-6) - dd3*zz(3*itr-2)
285 js= inumfi1l(itr-1) + 1
289 sainvl(9*j-2) = sainvl(9*j-2)-dd3*zz(3*in-2)
290 sainvl(9*j-1) = sainvl(9*j-1)-dd3*zz(3*in-1)
291 sainvl(9*j ) = sainvl(9*j )-dd3*zz(3*in )
296 js= inumfi1l(i-1) + 1
299 if(abs(dd1) > filter)
then
303 sainvl(9*j-8) = sainvl(9*j-8)-dd1*zz(3*in-2)
304 sainvl(9*j-7) = sainvl(9*j-7)-dd1*zz(3*in-1)
305 sainvl(9*j-6) = sainvl(9*j-6)-dd1*zz(3*in )
309 if(abs(dd2) > filter)
then
313 sainvl(9*j-5) = sainvl(9*j-5)-dd2*zz(3*in-2)
314 sainvl(9*j-4) = sainvl(9*j-4)-dd2*zz(3*in-1)
315 sainvl(9*j-3) = sainvl(9*j-3)-dd2*zz(3*in )
319 if(abs(dd3) > filter)
then
323 sainvl(9*j-2) = sainvl(9*j-2)-dd3*zz(3*in-2)
324 sainvl(9*j-1) = sainvl(9*j-1)-dd3*zz(3*in-1)
325 sainvl(9*j ) = sainvl(9*j )-dd3*zz(3*in )
337 zz(3*itr-2)= sainvd(9*itr-7)
338 zz(3*itr-1)= sainvd(9*itr-4)
339 zz(3*itr )= sainvd(9*itr-1)
343 js= inumfi1l(itr-1) + 1
347 zz(3*in-2)= sainvl(9*j-5)
348 zz(3*in-1)= sainvl(9*j-4)
349 zz(3*in )= sainvl(9*j-3)
356 vv(3*i-2) = vv(3*i-2) + d(9*i-8)*x1 + d(9*i-7)*x2 + d(9*i-6)*x3
357 vv(3*i-1) = vv(3*i-1) + d(9*i-5)*x1 + d(9*i-4)*x2 + d(9*i-3)*x3
358 vv(3*i ) = vv(3*i ) + d(9*i-2)*x1 + d(9*i-1)*x2 + d(9*i )*x3
364 vv(3*in-2)= vv(3*in-2) + al(9*j-8)*x1 + al(9*j-5)*x2 + al(9*j-2)*x3
365 vv(3*in-1)= vv(3*in-1) + al(9*j-7)*x1 + al(9*j-4)*x2 + al(9*j-1)*x3
366 vv(3*in )= vv(3*in ) + al(9*j-6)*x1 + al(9*j-3)*x2 + al(9*j )*x3
373 vv(3*in-2)= vv(3*in-2) + au(9*j-8)*x1 + au(9*j-5)*x2 + au(9*j-2)*x3
374 vv(3*in-1)= vv(3*in-1) + au(9*j-7)*x1 + au(9*j-4)*x2 + au(9*j-1)*x3
375 vv(3*in )= vv(3*in ) + au(9*j-6)*x1 + au(9*j-3)*x2 + au(9*j )*x3
380 dtemp(1) = sainvd(9*itr-8)
383 sainvd(9*i-8) = vv(3*i-2)
384 sainvd(9*i-4) = vv(3*i-2)*sainvd(9*i-7) + vv(3*i-1)
385 sainvd(9*i ) = vv(3*i-2)*sainvd(9*i-6) + vv(3*i-1)*sainvd(9*i-3) + vv(3*i)
386 js= inumfi1l(i-1) + 1
393 sainvd(9*i-8)= sainvd(9*i-8) + x1*sainvl(9*j-8) + x2*sainvl(9*j-7) + x3*sainvl(9*j-6)
394 sainvd(9*i-4)= sainvd(9*i-4) + x1*sainvl(9*j-5) + x2*sainvl(9*j-4) + x3*sainvl(9*j-3)
395 sainvd(9*i )= sainvd(9*i ) + x1*sainvl(9*j-2) + x2*sainvl(9*j-1) + x3*sainvl(9*j )
400 dd = 1.0d0/sainvd(9*itr-4)
402 sainvd(9*itr-8) = dtemp(1)
403 sainvd(9*itr ) =sainvd(9*itr )*dd
406 sainvd(9*i-8) = sainvd(9*i-8)*dd
407 sainvd(9*i-4) = sainvd(9*i-4)*dd
408 sainvd(9*i ) = sainvd(9*i )*dd
412 rifd(9*itr-1) = sainvd(9*itr )
414 js= inumfi1u(itr-1) + 1
417 rifu(9*j-5) = sainvd(9*fi1u(j)-8)
418 rifu(9*j-4) = sainvd(9*fi1u(j)-4)
419 rifu(9*j-3) = sainvd(9*fi1u(j) )
425 if(abs(dd3) > filter)
then
426 sainvd(9*itr-6)= sainvd(9*itr-6) - dd3*zz(3*itr-2)
427 sainvd(9*itr-3)= sainvd(9*itr-3) - dd3*zz(3*itr-1)
429 js= inumfi1l(itr-1) + 1
433 sainvl(9*j-2) = sainvl(9*j-2)-dd3*zz(3*in-2)
434 sainvl(9*j-1) = sainvl(9*j-1)-dd3*zz(3*in-1)
435 sainvl(9*j ) = sainvl(9*j )-dd3*zz(3*in )
440 js= inumfi1l(i-1) + 1
443 if(abs(dd1) > filter)
then
447 sainvl(9*j-8) = sainvl(9*j-8)-dd1*zz(3*in-2)
448 sainvl(9*j-7) = sainvl(9*j-7)-dd1*zz(3*in-1)
449 sainvl(9*j-6) = sainvl(9*j-6)-dd1*zz(3*in )
453 if(abs(dd2) > filter)
then
457 sainvl(9*j-5) = sainvl(9*j-5)-dd2*zz(3*in-2)
458 sainvl(9*j-4) = sainvl(9*j-4)-dd2*zz(3*in-1)
459 sainvl(9*j-3) = sainvl(9*j-3)-dd2*zz(3*in )
463 if(abs(dd3) > filter)
then
467 sainvl(9*j-2) = sainvl(9*j-2)-dd3*zz(3*in-2)
468 sainvl(9*j-1) = sainvl(9*j-1)-dd3*zz(3*in-1)
469 sainvl(9*j ) = sainvl(9*j )-dd3*zz(3*in )
482 zz(3*itr-2)= sainvd(9*itr-6)
483 zz(3*itr-1)= sainvd(9*itr-3)
484 zz(3*itr )= sainvd(9*itr )
488 js= inumfi1l(itr-1) + 1
492 zz(3*in-2)= sainvl(9*j-2)
493 zz(3*in-1)= sainvl(9*j-1)
494 zz(3*in )= sainvl(9*j )
501 vv(3*i-2) = vv(3*i-2) + d(9*i-8)*x1 + d(9*i-7)*x2 + d(9*i-6)*x3
502 vv(3*i-1) = vv(3*i-1) + d(9*i-5)*x1 + d(9*i-4)*x2 + d(9*i-3)*x3
503 vv(3*i ) = vv(3*i ) + d(9*i-2)*x1 + d(9*i-1)*x2 + d(9*i )*x3
509 vv(3*in-2)= vv(3*in-2) + al(9*j-8)*x1 + al(9*j-5)*x2 + al(9*j-2)*x3
510 vv(3*in-1)= vv(3*in-1) + al(9*j-7)*x1 + al(9*j-4)*x2 + al(9*j-1)*x3
511 vv(3*in )= vv(3*in ) + al(9*j-6)*x1 + al(9*j-3)*x2 + al(9*j )*x3
518 vv(3*in-2)= vv(3*in-2) + au(9*j-8)*x1 + au(9*j-5)*x2 + au(9*j-2)*x3
519 vv(3*in-1)= vv(3*in-1) + au(9*j-7)*x1 + au(9*j-4)*x2 + au(9*j-1)*x3
520 vv(3*in )= vv(3*in ) + au(9*j-6)*x1 + au(9*j-3)*x2 + au(9*j )*x3
526 dtemp(1) = sainvd(9*itr-8)
527 dtemp(2) = sainvd(9*itr-4)
530 sainvd(9*i-8) = vv(3*i-2)
531 sainvd(9*i-4) = vv(3*i-2)*sainvd(9*i-7) + vv(3*i-1)
532 sainvd(9*i ) = vv(3*i-2)*sainvd(9*i-6) + vv(3*i-1)*sainvd(9*i-3) + vv(3*i)
533 js= inumfi1l(i-1) + 1
540 sainvd(9*i-8)= sainvd(9*i-8) + x1*sainvl(9*j-8) + x2*sainvl(9*j-7) + x3*sainvl(9*j-6)
541 sainvd(9*i-4)= sainvd(9*i-4) + x1*sainvl(9*j-5) + x2*sainvl(9*j-4) + x3*sainvl(9*j-3)
542 sainvd(9*i )= sainvd(9*i ) + x1*sainvl(9*j-2) + x2*sainvl(9*j-1) + x3*sainvl(9*j )
547 dd = 1.0d0/sainvd(9*itr )
549 sainvd(9*itr-8) = dtemp(1)
550 sainvd(9*itr-4) = dtemp(2)
553 sainvd(9*i-8) = sainvd(9*i-8)*dd
554 sainvd(9*i-4) = sainvd(9*i-4)*dd
555 sainvd(9*i ) = sainvd(9*i )*dd
560 js= inumfi1u(itr-1) + 1
563 rifu(9*j-2) = sainvd(9*fi1u(j)-8)
564 rifu(9*j-1) = sainvd(9*fi1u(j)-4)
565 rifu(9*j ) = sainvd(9*fi1u(j) )
571 js= inumfi1l(i-1) + 1
574 if(abs(dd1) > filter)
then
578 sainvl(9*j-8) = sainvl(9*j-8)-dd1*zz(3*in-2)
579 sainvl(9*j-7) = sainvl(9*j-7)-dd1*zz(3*in-1)
580 sainvl(9*j-6) = sainvl(9*j-6)-dd1*zz(3*in )
584 if(abs(dd2) > filter)
then
588 sainvl(9*j-5) = sainvl(9*j-5)-dd2*zz(3*in-2)
589 sainvl(9*j-4) = sainvl(9*j-4)-dd2*zz(3*in-1)
590 sainvl(9*j-3) = sainvl(9*j-3)-dd2*zz(3*in )
594 if(abs(dd3) > filter)
then
598 sainvl(9*j-2) = sainvl(9*j-2)-dd3*zz(3*in-2)
599 sainvl(9*j-1) = sainvl(9*j-1)-dd3*zz(3*in-1)
600 sainvl(9*j ) = sainvl(9*j )-dd3*zz(3*in )
608 end subroutine hecmw_rif_33
610 subroutine hecmw_rif_make_u_33(hecMAT)
613 integer(kind=kint) i,j,k,n,m,o
614 integer(kind=kint) is,ie,js,je
627 rifl(9*n-8)=rifu(9*j-8)
628 rifl(9*n-7)=rifu(9*j-5)
629 rifl(9*n-6)=rifu(9*j-2)
630 rifl(9*n-5)=rifu(9*j-7)
631 rifl(9*n-4)=rifu(9*j-4)
632 rifl(9*n-3)=rifu(9*j-1)
633 rifl(9*n-2)=rifu(9*j-6)
634 rifl(9*n-1)=rifu(9*j-3)
635 rifl(9*n )=rifu(9*j )
642 end subroutine hecmw_rif_make_u_33
647 subroutine form_ilu0_rif_33(hecMAT)
651 allocate (inumfi1l(0:hecmat%NP), inumfi1u(0:hecmat%NP))
652 allocate (fi1l(hecmat%NPL), fi1u(hecmat%NPU))
659 inumfi1l(:) = hecmat%indexL(:)
660 inumfi1u(:) = hecmat%indexU(:)
661 fi1l(:) = hecmat%itemL(:)
662 fi1u(:) = hecmat%itemU(:)
667 end subroutine form_ilu0_rif_33
672 subroutine form_ilu1_rif_33(hecMAT)
676 integer(kind=kint),
allocatable :: iwsl(:), iwsu(:), iw1(:), iw2(:)
677 integer(kind=kint) :: nplf1,npuf1
678 integer(kind=kint) :: i,jj,kk,l,isk,iek,isj,iej
679 integer(kind=kint) :: icou,icou0,icouu,icouu1,icouu2,icouu3,icoul,icoul1,icoul2,icoul3
680 integer(kind=kint) :: j,k,isl,isu
689 allocate (iw1(hecmat%NP) , iw2(hecmat%NP))
690 allocate (inumfi1l(0:hecmat%NP), inumfi1u(0:hecmat%NP))
701 do l= indexl(i-1)+1, indexl(i)
704 do l= indexu(i-1)+1, indexu(i)
712 isj= indexu(kk-1) + 1
716 if (iw1(jj).eq.0 .and. jj.lt.i)
then
717 inumfi1l(i)= inumfi1l(i)+1
720 if (iw1(jj).eq.0 .and. jj.gt.i)
then
721 inumfi1u(i)= inumfi1u(i)+1
726 nplf1= nplf1 + inumfi1l(i)
727 npuf1= npuf1 + inumfi1u(i)
732 allocate (iwsl(0:hecmat%NP), iwsu(0:hecmat%NP))
733 allocate (fi1l(hecmat%NPL+nplf1), fi1u(hecmat%NPU+npuf1))
735 npfiu = hecmat%NPU+npuf1
736 npfil = hecmat%NPL+nplf1
744 iwsl(i)= indexl(i)-indexl(i-1) + inumfi1l(i) + iwsl(i-1)
745 iwsu(i)= indexu(i)-indexu(i-1) + inumfi1u(i) + iwsu(i-1)
751 inumfi1l(i)= inumfi1l(i-1) + inumfi1l(i)
752 inumfi1u(i)= inumfi1u(i-1) + inumfi1u(i)
756 do l= indexl(i-1)+1, indexl(i)
759 do l= indexu(i-1)+1, indexu(i)
767 isj= indexu(kk-1) + 1
771 if (iw1(jj).eq.0 .and. jj.lt.i)
then
773 fi1l(icoul+iwsl(i-1)+indexl(i)-indexl(i-1))= jj
776 if (iw1(jj).eq.0 .and. jj.gt.i)
then
778 fi1u(icouu+iwsu(i-1)+indexu(i)-indexu(i-1))= jj
788 icoul1= indexl(i) - indexl(i-1)
789 icoul2= inumfi1l(i) - inumfi1l(i-1)
790 icoul3= icoul1 + icoul2
791 icouu1= indexu(i) - indexu(i-1)
792 icouu2= inumfi1u(i) - inumfi1u(i-1)
793 icouu3= icouu1 + icouu2
797 do k= indexl(i-1)+1, indexl(i)
802 do k= inumfi1l(i-1)+1, inumfi1l(i)
804 iw1(icou0)= fi1l(icou0+iwsl(i-1))
810 call rif_sort_33 (iw1, iw2, icoul3, hecmat%NP)
818 do k= indexu(i-1)+1, indexu(i)
823 do k= inumfi1u(i-1)+1, inumfi1u(i)
825 iw1(icou0)= fi1u(icou0+iwsu(i-1))
831 call rif_sort_33 (iw1, iw2, icouu3, hecmat%NP)
847 deallocate (iw1, iw2)
848 deallocate (iwsl, iwsu)
850 end subroutine form_ilu1_rif_33
857 subroutine rif_sort_33(STEM, INUM, N, NP)
860 integer(kind=kint) :: n, np
861 integer(kind=kint),
dimension(NP) :: stem
862 integer(kind=kint),
dimension(NP) :: inum
863 integer(kind=kint),
dimension(:),
allocatable :: istack
864 integer(kind=kint) :: m,nstack,jstack,l,ir,ip,i,j,k,ss,ii,temp,it
866 allocate (istack(-np:+np))
885 if (stem(i).le.ss)
goto 2
896 if (jstack.eq.0)
then
915 if (stem(l+1).gt.stem(ir))
then
924 if (stem(l).gt.stem(ir))
then
933 if (stem(l+1).gt.stem(l))
then
950 if (stem(i).lt.ss)
goto 3
954 if (stem(j).gt.ss)
goto 4
977 if (jstack.gt.nstack)
then
978 write (*,*)
'NSTACK overflow'
982 if (ir-i+1.ge.j-1)
then
996 end subroutine rif_sort_33
1001 if (
associated(sainvd))
deallocate(sainvd)
1002 if (
associated(sainvl))
deallocate(sainvl)
1003 if (
associated(rifd))
deallocate(rifd)
1004 if (
associated(rifu))
deallocate(rifu)
1005 if (
associated(rifl))
deallocate(rifl)
1006 if (
associated(inumfi1l))
deallocate(inumfi1l)
1007 if (
associated(inumfi1u))
deallocate(inumfi1u)
1008 if (
associated(fi1l))
deallocate(fi1l)
1009 if (
associated(fi1u))
deallocate(fi1u)