20 integer(4),
parameter :: krealp = 8
22 integer(kind=kint) :: NPFIU, NPFIL
23 integer(kind=kint) :: N
24 integer(kind=kint),
pointer :: inumFI1L(:) => null()
25 integer(kind=kint),
pointer :: inumFI1U(:) => null()
26 integer(kind=kint),
pointer :: FI1L(:) => null()
27 integer(kind=kint),
pointer :: FI1U(:) => null()
29 integer(kind=kint),
pointer :: indexL(:) => null()
30 integer(kind=kint),
pointer :: indexU(:) => null()
31 integer(kind=kint),
pointer :: itemL(:) => null()
32 integer(kind=kint),
pointer :: itemU(:) => null()
33 real(kind=
kreal),
pointer :: d(:) => null()
34 real(kind=
kreal),
pointer :: al(:) => null()
35 real(kind=
kreal),
pointer :: au(:) => null()
37 real(kind=krealp),
pointer :: sainvu(:) => null()
38 real(kind=krealp),
pointer :: sainvl(:) => null()
39 real(kind=krealp),
pointer :: sainvd(:) => null()
40 real(kind=
kreal),
pointer :: t(:) => null()
51 integer(kind=kint ) :: precond
53 real(kind=krealp) :: filter
61 indexl => hecmat%indexL
62 indexu => hecmat%indexU
66 if (precond.eq.20)
call form_ilu1_sainv_33(hecmat)
68 allocate (sainvd(9*hecmat%NP))
69 allocate (sainvl(9*npfiu))
70 allocate (t(3*hecmat%NP))
75 filter= hecmat%Rarray(5)
77 write(*,
"(a,F15.8)")
"### SAINV FILTER :",filter
79 call hecmw_sainv_33(hecmat)
81 allocate (sainvu(9*npfiu))
84 call hecmw_sainv_make_u_33(hecmat)
91 real(kind=
kreal),
intent(inout) :: zp(:)
92 real(kind=
kreal),
intent(in) :: r(:)
93 integer(kind=kint) :: in, i, j, isl, iel, isu, ieu
94 real(kind=
kreal) :: sw1, sw2, sw3, x1, x2, x3
120 sw1= sw1 + sainvl(9*j-8)*x1 + sainvl(9*j-7)*x2 + sainvl(9*j-6)*x3
121 sw2= sw2 + sainvl(9*j-5)*x1 + sainvl(9*j-4)*x2 + sainvl(9*j-3)*x3
122 sw3= sw3 + sainvl(9*j-2)*x1 + sainvl(9*j-1)*x2 + sainvl(9*j )*x3
129 t(3*i-2)= (x1 + sw1)*sainvd(9*i-8)
130 t(3*i-1)= (x2 + sainvd(9*i-7)*x1 + sw2)*sainvd(9*i-4)
131 t(3*i )= (x3 + sainvd(9*i-6)*x1 + sainvd(9*i-3)*x2 + sw3)*sainvd(9*i )
151 isu= inumfi1u(i-1) + 1
158 sw1= sw1 + sainvu(9*j-8)*x1 + sainvu(9*j-7)*x2 + sainvu(9*j-6)*x3
159 sw2= sw2 + sainvu(9*j-5)*x1 + sainvu(9*j-4)*x2 + sainvu(9*j-3)*x3
160 sw3= sw3 + sainvu(9*j-2)*x1 + sainvu(9*j-1)*x2 + sainvu(9*j )*x3
167 zp(3*i-2)= x1 + sw1 + sainvd(9*i-7)*x2 + sainvd(9*i-6)*x3
168 zp(3*i-1)= x2 + sw2 + sainvd(9*i-3)*x3
186 subroutine hecmw_sainv_33(hecMAT)
190 integer(kind=kint) :: i, j, js, je, in, itr, np
191 real(kind=krealp) :: x1, x2, x3, dd, dd1, dd2, dd3, dtemp(3)
192 real(kind=krealp) :: filter
193 real(kind=krealp),
allocatable :: zz(:), vv(:)
195 filter= hecmat%Rarray(5)
210 zz(3*itr-2)= sainvd(9*itr-8)
211 zz(3*itr-1)= sainvd(9*itr-5)
212 zz(3*itr )= sainvd(9*itr-2)
216 js= inumfi1l(itr-1) + 1
220 zz(3*in-2)= sainvl(9*j-8)
221 zz(3*in-1)= sainvl(9*j-7)
222 zz(3*in )= sainvl(9*j-6)
229 vv(3*i-2) = vv(3*i-2) + d(9*i-8)*x1 + d(9*i-7)*x2 + d(9*i-6)*x3
230 vv(3*i-1) = vv(3*i-1) + d(9*i-5)*x1 + d(9*i-4)*x2 + d(9*i-3)*x3
231 vv(3*i ) = vv(3*i ) + d(9*i-2)*x1 + d(9*i-1)*x2 + d(9*i )*x3
237 vv(3*in-2)= vv(3*in-2) + al(9*j-8)*x1 + al(9*j-5)*x2 + al(9*j-2)*x3
238 vv(3*in-1)= vv(3*in-1) + al(9*j-7)*x1 + al(9*j-4)*x2 + al(9*j-1)*x3
239 vv(3*in )= vv(3*in ) + al(9*j-6)*x1 + al(9*j-3)*x2 + al(9*j )*x3
246 vv(3*in-2)= vv(3*in-2) + au(9*j-8)*x1 + au(9*j-5)*x2 + au(9*j-2)*x3
247 vv(3*in-1)= vv(3*in-1) + au(9*j-7)*x1 + au(9*j-4)*x2 + au(9*j-1)*x3
248 vv(3*in )= vv(3*in ) + au(9*j-6)*x1 + au(9*j-3)*x2 + au(9*j )*x3
271 sainvd(9*i-8) = vv(3*i-2)
272 sainvd(9*i-4) = vv(3*i-2)*sainvd(9*i-7) + vv(3*i-1)
273 sainvd(9*i ) = vv(3*i-2)*sainvd(9*i-6) + vv(3*i-1)*sainvd(9*i-3) + vv(3*i)
274 js= inumfi1l(i-1) + 1
281 sainvd(9*i-8)= sainvd(9*i-8) + x1*sainvl(9*j-8) + x2*sainvl(9*j-7) + x3*sainvl(9*j-6)
282 sainvd(9*i-4)= sainvd(9*i-4) + x1*sainvl(9*j-5) + x2*sainvl(9*j-4) + x3*sainvl(9*j-3)
283 sainvd(9*i )= sainvd(9*i ) + x1*sainvl(9*j-2) + x2*sainvl(9*j-1) + x3*sainvl(9*j )
294 dd = 1.0d0/sainvd(9*itr-8)
296 sainvd(9*itr-4) =sainvd(9*itr-4)*dd
297 sainvd(9*itr ) =sainvd(9*itr )*dd
300 sainvd(9*i-8) = sainvd(9*i-8)*dd
301 sainvd(9*i-4) = sainvd(9*i-4)*dd
302 sainvd(9*i ) = sainvd(9*i )*dd
308 if(dabs(dd2) > filter)
then
309 sainvd(9*itr-7)= sainvd(9*itr-7) - dd2*zz(3*itr-2)
310 js= inumfi1l(itr-1) + 1
314 sainvl(9*j-5) = sainvl(9*j-5)-dd2*zz(3*in-2)
315 sainvl(9*j-4) = sainvl(9*j-4)-dd2*zz(3*in-1)
316 sainvl(9*j-3) = sainvl(9*j-3)-dd2*zz(3*in )
321 if(dabs(dd3) > filter)
then
322 sainvd(9*itr-6)= sainvd(9*itr-6) - dd3*zz(3*itr-2)
323 js= inumfi1l(itr-1) + 1
327 sainvl(9*j-2) = sainvl(9*j-2)-dd3*zz(3*in-2)
328 sainvl(9*j-1) = sainvl(9*j-1)-dd3*zz(3*in-1)
329 sainvl(9*j ) = sainvl(9*j )-dd3*zz(3*in )
334 js= inumfi1l(i-1) + 1
337 if(dabs(dd1) > filter)
then
341 sainvl(9*j-8) = sainvl(9*j-8)-dd1*zz(3*in-2)
342 sainvl(9*j-7) = sainvl(9*j-7)-dd1*zz(3*in-1)
343 sainvl(9*j-6) = sainvl(9*j-6)-dd1*zz(3*in )
347 if(dabs(dd2) > filter)
then
351 sainvl(9*j-5) = sainvl(9*j-5)-dd2*zz(3*in-2)
352 sainvl(9*j-4) = sainvl(9*j-4)-dd2*zz(3*in-1)
353 sainvl(9*j-3) = sainvl(9*j-3)-dd2*zz(3*in )
357 if(dabs(dd3) > filter)
then
361 sainvl(9*j-2) = sainvl(9*j-2)-dd3*zz(3*in-2)
362 sainvl(9*j-1) = sainvl(9*j-1)-dd3*zz(3*in-1)
363 sainvl(9*j ) = sainvl(9*j )-dd3*zz(3*in )
375 zz(3*itr-2)= sainvd(9*itr-7)
376 zz(3*itr-1)= sainvd(9*itr-4)
377 zz(3*itr )= sainvd(9*itr-1)
381 js= inumfi1l(itr-1) + 1
385 zz(3*in-2)= sainvl(9*j-5)
386 zz(3*in-1)= sainvl(9*j-4)
387 zz(3*in )= sainvl(9*j-3)
394 vv(3*i-2) = vv(3*i-2) + d(9*i-8)*x1 + d(9*i-7)*x2 + d(9*i-6)*x3
395 vv(3*i-1) = vv(3*i-1) + d(9*i-5)*x1 + d(9*i-4)*x2 + d(9*i-3)*x3
396 vv(3*i ) = vv(3*i ) + d(9*i-2)*x1 + d(9*i-1)*x2 + d(9*i )*x3
402 vv(3*in-2)= vv(3*in-2) + al(9*j-8)*x1 + al(9*j-5)*x2 + al(9*j-2)*x3
403 vv(3*in-1)= vv(3*in-1) + al(9*j-7)*x1 + al(9*j-4)*x2 + al(9*j-1)*x3
404 vv(3*in )= vv(3*in ) + al(9*j-6)*x1 + al(9*j-3)*x2 + al(9*j )*x3
411 vv(3*in-2)= vv(3*in-2) + au(9*j-8)*x1 + au(9*j-5)*x2 + au(9*j-2)*x3
412 vv(3*in-1)= vv(3*in-1) + au(9*j-7)*x1 + au(9*j-4)*x2 + au(9*j-1)*x3
413 vv(3*in )= vv(3*in ) + au(9*j-6)*x1 + au(9*j-3)*x2 + au(9*j )*x3
418 dtemp(1) = sainvd(9*itr-8)
434 sainvd(9*i-8) = vv(3*i-2)
435 sainvd(9*i-4) = vv(3*i-2)*sainvd(9*i-7) + vv(3*i-1)
436 sainvd(9*i ) = vv(3*i-2)*sainvd(9*i-6) + vv(3*i-1)*sainvd(9*i-3) + vv(3*i)
437 js= inumfi1l(i-1) + 1
444 sainvd(9*i-8)= sainvd(9*i-8) + x1*sainvl(9*j-8) + x2*sainvl(9*j-7) + x3*sainvl(9*j-6)
445 sainvd(9*i-4)= sainvd(9*i-4) + x1*sainvl(9*j-5) + x2*sainvl(9*j-4) + x3*sainvl(9*j-3)
446 sainvd(9*i )= sainvd(9*i ) + x1*sainvl(9*j-2) + x2*sainvl(9*j-1) + x3*sainvl(9*j )
457 dd = 1.0d0/sainvd(9*itr-4)
459 sainvd(9*itr-8) = dtemp(1)
460 sainvd(9*itr ) =sainvd(9*itr )*dd
463 sainvd(9*i-8) = sainvd(9*i-8)*dd
464 sainvd(9*i-4) = sainvd(9*i-4)*dd
465 sainvd(9*i ) = sainvd(9*i )*dd
470 if(dabs(dd3) > filter)
then
471 sainvd(9*itr-6)= sainvd(9*itr-6) - dd3*zz(3*itr-2)
472 sainvd(9*itr-3)= sainvd(9*itr-3) - dd3*zz(3*itr-1)
474 js= inumfi1l(itr-1) + 1
478 sainvl(9*j-2) = sainvl(9*j-2)-dd3*zz(3*in-2)
479 sainvl(9*j-1) = sainvl(9*j-1)-dd3*zz(3*in-1)
480 sainvl(9*j ) = sainvl(9*j )-dd3*zz(3*in )
485 js= inumfi1l(i-1) + 1
488 if(dabs(dd1) > filter)
then
492 sainvl(9*j-8) = sainvl(9*j-8)-dd1*zz(3*in-2)
493 sainvl(9*j-7) = sainvl(9*j-7)-dd1*zz(3*in-1)
494 sainvl(9*j-6) = sainvl(9*j-6)-dd1*zz(3*in )
498 if(dabs(dd2) > filter)
then
502 sainvl(9*j-5) = sainvl(9*j-5)-dd2*zz(3*in-2)
503 sainvl(9*j-4) = sainvl(9*j-4)-dd2*zz(3*in-1)
504 sainvl(9*j-3) = sainvl(9*j-3)-dd2*zz(3*in )
508 if(dabs(dd3) > filter)
then
512 sainvl(9*j-2) = sainvl(9*j-2)-dd3*zz(3*in-2)
513 sainvl(9*j-1) = sainvl(9*j-1)-dd3*zz(3*in-1)
514 sainvl(9*j ) = sainvl(9*j )-dd3*zz(3*in )
527 zz(3*itr-2)= sainvd(9*itr-6)
528 zz(3*itr-1)= sainvd(9*itr-3)
529 zz(3*itr )= sainvd(9*itr )
533 js= inumfi1l(itr-1) + 1
537 zz(3*in-2)= sainvl(9*j-2)
538 zz(3*in-1)= sainvl(9*j-1)
539 zz(3*in )= sainvl(9*j )
546 vv(3*i-2) = vv(3*i-2) + d(9*i-8)*x1 + d(9*i-7)*x2 + d(9*i-6)*x3
547 vv(3*i-1) = vv(3*i-1) + d(9*i-5)*x1 + d(9*i-4)*x2 + d(9*i-3)*x3
548 vv(3*i ) = vv(3*i ) + d(9*i-2)*x1 + d(9*i-1)*x2 + d(9*i )*x3
554 vv(3*in-2)= vv(3*in-2) + al(9*j-8)*x1 + al(9*j-5)*x2 + al(9*j-2)*x3
555 vv(3*in-1)= vv(3*in-1) + al(9*j-7)*x1 + al(9*j-4)*x2 + al(9*j-1)*x3
556 vv(3*in )= vv(3*in ) + al(9*j-6)*x1 + al(9*j-3)*x2 + al(9*j )*x3
563 vv(3*in-2)= vv(3*in-2) + au(9*j-8)*x1 + au(9*j-5)*x2 + au(9*j-2)*x3
564 vv(3*in-1)= vv(3*in-1) + au(9*j-7)*x1 + au(9*j-4)*x2 + au(9*j-1)*x3
565 vv(3*in )= vv(3*in ) + au(9*j-6)*x1 + au(9*j-3)*x2 + au(9*j )*x3
570 dtemp(1) = sainvd(9*itr-8)
571 dtemp(2) = sainvd(9*itr-4)
587 sainvd(9*i-8) = vv(3*i-2)
588 sainvd(9*i-4) = vv(3*i-2)*sainvd(9*i-7) + vv(3*i-1)
589 sainvd(9*i ) = vv(3*i-2)*sainvd(9*i-6) + vv(3*i-1)*sainvd(9*i-3) + vv(3*i)
590 js= inumfi1l(i-1) + 1
597 sainvd(9*i-8)= sainvd(9*i-8) + x1*sainvl(9*j-8) + x2*sainvl(9*j-7) + x3*sainvl(9*j-6)
598 sainvd(9*i-4)= sainvd(9*i-4) + x1*sainvl(9*j-5) + x2*sainvl(9*j-4) + x3*sainvl(9*j-3)
599 sainvd(9*i )= sainvd(9*i ) + x1*sainvl(9*j-2) + x2*sainvl(9*j-1) + x3*sainvl(9*j )
610 dd = 1.0d0/sainvd(9*itr )
612 sainvd(9*itr-8) = dtemp(1)
613 sainvd(9*itr-4) = dtemp(2)
616 sainvd(9*i-8) = sainvd(9*i-8)*dd
617 sainvd(9*i-4) = sainvd(9*i-4)*dd
618 sainvd(9*i ) = sainvd(9*i )*dd
623 js= inumfi1l(i-1) + 1
626 if(dabs(dd1) > filter)
then
630 sainvl(9*j-8) = sainvl(9*j-8)-dd1*zz(3*in-2)
631 sainvl(9*j-7) = sainvl(9*j-7)-dd1*zz(3*in-1)
632 sainvl(9*j-6) = sainvl(9*j-6)-dd1*zz(3*in )
636 if(dabs(dd2) > filter)
then
640 sainvl(9*j-5) = sainvl(9*j-5)-dd2*zz(3*in-2)
641 sainvl(9*j-4) = sainvl(9*j-4)-dd2*zz(3*in-1)
642 sainvl(9*j-3) = sainvl(9*j-3)-dd2*zz(3*in )
646 if(dabs(dd3) > filter)
then
650 sainvl(9*j-2) = sainvl(9*j-2)-dd3*zz(3*in-2)
651 sainvl(9*j-1) = sainvl(9*j-1)-dd3*zz(3*in-1)
652 sainvl(9*j ) = sainvl(9*j )-dd3*zz(3*in )
661 sainvd(9*i-8) = 1.0d0/sainvd(9*i-8)
662 sainvd(9*i-4) = 1.0d0/sainvd(9*i-4)
663 sainvd(9*i ) = 1.0d0/sainvd(9*i )
664 sainvd(9*i-5) = sainvd(9*i-7)
665 sainvd(9*i-2) = sainvd(9*i-6)
666 sainvd(9*i-1) = sainvd(9*i-3)
669 end subroutine hecmw_sainv_33
671 subroutine hecmw_sainv_make_u_33(hecMAT)
674 integer(kind=kint) i,j,k,n,m,o
675 integer(kind=kint) is,ie,js,je
688 sainvu(9*n-8)=sainvl(9*j-8)
689 sainvu(9*n-7)=sainvl(9*j-5)
690 sainvu(9*n-6)=sainvl(9*j-2)
691 sainvu(9*n-5)=sainvl(9*j-7)
692 sainvu(9*n-4)=sainvl(9*j-4)
693 sainvu(9*n-3)=sainvl(9*j-1)
694 sainvu(9*n-2)=sainvl(9*j-6)
695 sainvu(9*n-1)=sainvl(9*j-3)
696 sainvu(9*n )=sainvl(9*j )
703 end subroutine hecmw_sainv_make_u_33
712 subroutine form_ilu1_sainv_33(hecMAT)
716 integer(kind=kint),
allocatable :: iwsl(:), iwsu(:), iw1(:), iw2(:)
717 integer(kind=kint) :: nplf1,npuf1
718 integer(kind=kint) :: i,jj,kk,l,isk,iek,isj,iej
719 integer(kind=kint) :: icou,icou0,icouu,icouu1,icouu2,icouu3,icoul,icoul1,icoul2,icoul3
720 integer(kind=kint) :: j,k,isl,isu
729 allocate (iw1(hecmat%NP) , iw2(hecmat%NP))
730 allocate (inumfi1l(0:hecmat%NP), inumfi1u(0:hecmat%NP))
741 do l= indexl(i-1)+1, indexl(i)
744 do l= indexu(i-1)+1, indexu(i)
752 isj= indexu(kk-1) + 1
756 if (iw1(jj).eq.0 .and. jj.lt.i)
then
757 inumfi1l(i)= inumfi1l(i)+1
760 if (iw1(jj).eq.0 .and. jj.gt.i)
then
761 inumfi1u(i)= inumfi1u(i)+1
766 nplf1= nplf1 + inumfi1l(i)
767 npuf1= npuf1 + inumfi1u(i)
772 allocate (iwsl(0:hecmat%NP), iwsu(0:hecmat%NP))
773 allocate (fi1l(hecmat%NPL+nplf1), fi1u(hecmat%NPU+npuf1))
775 npfiu = hecmat%NPU+npuf1
776 npfil = hecmat%NPL+nplf1
784 iwsl(i)= indexl(i)-indexl(i-1) + inumfi1l(i) + iwsl(i-1)
785 iwsu(i)= indexu(i)-indexu(i-1) + inumfi1u(i) + iwsu(i-1)
791 inumfi1l(i)= inumfi1l(i-1) + inumfi1l(i)
792 inumfi1u(i)= inumfi1u(i-1) + inumfi1u(i)
796 do l= indexl(i-1)+1, indexl(i)
799 do l= indexu(i-1)+1, indexu(i)
807 isj= indexu(kk-1) + 1
811 if (iw1(jj).eq.0 .and. jj.lt.i)
then
813 fi1l(icoul+iwsl(i-1)+indexl(i)-indexl(i-1))= jj
816 if (iw1(jj).eq.0 .and. jj.gt.i)
then
818 fi1u(icouu+iwsu(i-1)+indexu(i)-indexu(i-1))= jj
828 icoul1= indexl(i) - indexl(i-1)
829 icoul2= inumfi1l(i) - inumfi1l(i-1)
830 icoul3= icoul1 + icoul2
831 icouu1= indexu(i) - indexu(i-1)
832 icouu2= inumfi1u(i) - inumfi1u(i-1)
833 icouu3= icouu1 + icouu2
837 do k= indexl(i-1)+1, indexl(i)
842 do k= inumfi1l(i-1)+1, inumfi1l(i)
844 iw1(icou0)= fi1l(icou0+iwsl(i-1))
850 call sainv_sort_33 (iw1, iw2, icoul3, hecmat%NP)
858 do k= indexu(i-1)+1, indexu(i)
863 do k= inumfi1u(i-1)+1, inumfi1u(i)
865 iw1(icou0)= fi1u(icou0+iwsu(i-1))
871 call sainv_sort_33 (iw1, iw2, icouu3, hecmat%NP)
887 deallocate (iw1, iw2)
888 deallocate (iwsl, iwsu)
890 end subroutine form_ilu1_sainv_33
897 subroutine sainv_sort_33(STEM, INUM, N, NP)
900 integer(kind=kint) :: n, np
901 integer(kind=kint),
dimension(NP) :: stem
902 integer(kind=kint),
dimension(NP) :: inum
903 integer(kind=kint),
dimension(:),
allocatable :: istack
904 integer(kind=kint) :: m,nstack,jstack,l,ir,ip,i,j,k,ss,ii,temp,it
906 allocate (istack(-np:+np))
925 if (stem(i).le.ss)
goto 2
936 if (jstack.eq.0)
then
955 if (stem(l+1).gt.stem(ir))
then
964 if (stem(l).gt.stem(ir))
then
973 if (stem(l+1).gt.stem(l))
then
990 if (stem(i).lt.ss)
goto 3
994 if (stem(j).gt.ss)
goto 4
1017 if (jstack.gt.nstack)
then
1018 write (*,*)
'NSTACK overflow'
1022 if (ir-i+1.ge.j-1)
then
1027 istack(jstack )= j-1
1036 end subroutine sainv_sort_33
1041 if (
associated(sainvd))
deallocate(sainvd)
1042 if (
associated(sainvl))
deallocate(sainvl)
1043 if (
associated(sainvu))
deallocate(sainvu)
1044 if (
associated(inumfi1l))
deallocate(inumfi1l)
1045 if (
associated(inumfi1u))
deallocate(inumfi1u)
1046 if (
associated(fi1l))
deallocate(fi1l)
1047 if (
associated(fi1u))
deallocate(fi1u)
integer(kind=kint) function, public hecmw_mat_get_precond(hecMAT)
subroutine, public hecmw_precond_sainv_33_apply(R, ZP)
subroutine, public hecmw_precond_sainv_33_clear()
subroutine, public hecmw_precond_sainv_33_setup(hecMAT)
integer(kind=4), parameter kreal