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, ndof, ndof2
51 real(kind=krealp) :: filter
61 indexl => hecmat%indexL
62 indexu => hecmat%indexU
66 if (precond.eq.21)
call form_ilu1_rif_nn(hecmat)
68 allocate (sainvd(ndof2*hecmat%NP))
69 allocate (sainvl(ndof2*npfiu))
70 allocate (rifd(ndof2*hecmat%NP))
71 allocate (rifu(ndof2*npfiu))
77 filter= hecmat%Rarray(5)
79 write(*,
"(a,F15.8)")
"### RIF FILTER :",filter
81 call hecmw_rif_nn(hecmat)
83 allocate (rifl(ndof2*npfiu))
86 call hecmw_rif_make_u_nn(hecmat)
92 real(kind=
kreal),
intent(inout) :: zp(:)
93 integer(kind=kint) :: in, i, j, isl, iel,ndof,ndof2,idof,jdof
94 real(kind=
kreal) :: sw(ndof),x(ndof)
99 sw(idof) = zp(ndof*(i-1)+idof)
106 x(idof) = zp(ndof*(in-1)+idof)
110 sw(idof) = sw(idof) - rifl(ndof2*(j-1)+ndof*(idof-1)+jdof)*x(jdof)
117 x(idof) = x(idof) - rifd(ndof2*(i-1)+ndof*(idof-1)+jdof )*x(jdof)
120 zp(ndof*(i-1)+1:ndof*(i-1)+ndof) = x(1:ndof)
125 zp(ndof*(i-1)+idof)= zp(ndof*(i-1)+idof)*rifd(ndof2*(i-1)+(idof-1)*ndof+idof)
131 sw(idof) = zp(ndof*(i-1)+idof)
133 isl= inumfi1u(i-1) + 1
138 x(idof) = zp(ndof*(in-1)+idof)
142 sw(idof) = sw(idof) - rifu(ndof2*(j-1)+ndof*(idof-1)+jdof)*x(jdof)
147 do idof = ndof, 1, -1
148 do jdof = ndof, idof+1, -1
149 x(idof) = x(idof) - rifd(ndof*ndof*(i-1)+ndof*(jdof-1)+idof)*x(jdof)
153 zp(ndof*(i-1)+idof) = x(idof)
162 subroutine hecmw_rif_nn(hecMAT)
165 integer(kind=kint) :: i, j, k, js, je, in, itr, np, ndof, ndof2, idof, jdof, iitr
166 real(kind=krealp) :: dd, dtmp(hecmat%NDOF), x(hecmat%NDOF)
167 real(kind=krealp) :: filter
168 real(kind=krealp),
allocatable :: zz(:), vv(:)
170 filter= hecmat%Rarray(5)
175 allocate(vv(ndof*np))
176 allocate(zz(ndof*np))
184 zz(ndof*(itr-1)+idof)= sainvd(ndof2*(itr-1)+ndof*(idof-1)+iitr)
186 zz(ndof*(itr-1)+iitr)= 1.0d0
188 js= inumfi1l(itr-1) + 1
193 zz(ndof*(in-1)+idof)=sainvl(ndof2*(j-1)+ndof*(iitr-1)+idof)
199 x(idof)=zz(ndof*(i-1)+idof)
203 vv(ndof*(i-1)+idof) = vv(ndof*(i-1)+idof) + d(ndof2*(i-1)+ndof*(idof-1)+jdof)*x(jdof)
213 vv(ndof*(in-1)+idof) = vv(ndof*(in-1)+idof) + al(ndof2*(j-1)+ndof*(jdof-1)+idof)*x(jdof)
223 vv(ndof*(in-1)+idof) = vv(ndof*(in-1)+idof) + au(ndof2*(j-1)+ndof*(jdof-1)+idof)*x(jdof)
231 dtmp(idof)= sainvd(ndof2*(itr-1)+ndof*(idof-1)+idof)
236 sainvd(ndof2*(i-1)+ndof*(idof-1)+idof) = vv(ndof*(i-1)+idof)
238 sainvd(ndof2*(i-1)+ndof*(idof-1)+idof) = sainvd(ndof2*(i-1)+ndof*(idof-1)+idof) + &
239 & sainvd(ndof2*(i-1)+ndof*(jdof-1)+idof)*vv(ndof*(i-1)+jdof)
242 js= inumfi1l(i-1) + 1
247 x(idof)=vv(ndof*(in-1)+idof)
251 sainvd(ndof2*(i-1)+ndof*(idof-1)+idof) = sainvd(ndof2*(i-1)+ndof*(idof-1)+idof) + &
252 & sainvl(ndof2*(j-1)+ndof*(idof-1)+jdof)*x(jdof)
259 dd = 1.0d0/sainvd(ndof2*(itr-1)+ndof*(iitr-1)+iitr)
261 sainvd(ndof2*(itr-1)+ndof*(idof-1)+idof) = dtmp(idof)
263 sainvd(ndof2*(itr-1)+ndof*(iitr-1)+iitr)=dd
264 do idof = iitr+1, ndof
265 sainvd(ndof2*(itr-1)+ndof*(idof-1)+idof) = sainvd(ndof2*(itr-1)+ndof*(idof-1)+idof)*dd
270 sainvd(ndof2*(i-1)+ndof*(idof-1)+idof) = sainvd(ndof2*(i-1)+ndof*(idof-1)+idof)*dd
275 rifd(ndof2*(itr-1)+ndof*(idof-1)+iitr) = sainvd(ndof2*(itr-1)+ndof*(idof-1)+idof)
278 js= inumfi1u(itr-1) + 1
282 rifu(ndof2*(j-1)+ndof*(iitr-1)+idof) = sainvd(ndof2*(fi1u(j)-1)+ndof*(idof-1)+idof)
288 dd = sainvd(ndof2*(itr-1)+ndof*(k-1)+k)
289 if(abs(dd) > filter)
then
291 sainvd(ndof2*(itr-1)+ndof*(jdof-1)+k)= sainvd(ndof2*(itr-1)+ndof*(jdof-1)+k) - dd*zz(ndof*(itr-1)+jdof)
293 js= inumfi1l(itr-1) + 1
298 sainvl(ndof2*(j-1)+ndof*(k-1)+idof) = sainvl(ndof2*(j-1)+ndof*(k-1)+idof)-dd*zz(ndof*(in-1)+idof)
305 js= inumfi1l(i-1) + 1
308 dd = sainvd(ndof2*(i-1)+ndof*(idof-1)+idof)
309 if(abs(dd) > filter)
then
314 sainvl(ndof2*(j-1)+ndof*(idof-1)+jdof)=sainvl(ndof2*(j-1)+ndof*(idof-1)+jdof)-dd*zz(ndof*(in-1)+jdof)
325 end subroutine hecmw_rif_nn
327 subroutine hecmw_rif_make_u_nn(hecMAT)
330 integer(kind=kint) i,j,k,n,m,o,idof,jdof,ndof,ndof2
331 integer(kind=kint) is,ie,js,je
347 rifl(ndof2*(n-1)+ndof*(idof-1)+jdof)=rifu(ndof2*(j-1)+ndof*(jdof-1)+idof)
356 end subroutine hecmw_rif_make_u_nn
361 subroutine form_ilu0_rif_nn(hecMAT)
365 allocate (inumfi1l(0:hecmat%NP), inumfi1u(0:hecmat%NP))
366 allocate (fi1l(hecmat%NPL), fi1u(hecmat%NPU))
373 inumfi1l(:) = hecmat%indexL(:)
374 inumfi1u(:) = hecmat%indexU(:)
375 fi1l(:) = hecmat%itemL(:)
376 fi1u(:) = hecmat%itemU(:)
381 end subroutine form_ilu0_rif_nn
386 subroutine form_ilu1_rif_nn(hecMAT)
390 integer(kind=kint),
allocatable :: iwsl(:), iwsu(:), iw1(:), iw2(:)
391 integer(kind=kint) :: nplf1,npuf1
392 integer(kind=kint) :: i,jj,kk,l,isk,iek,isj,iej
393 integer(kind=kint) :: icou,icou0,icouu,icouu1,icouu2,icouu3,icoul,icoul1,icoul2,icoul3
394 integer(kind=kint) :: j,k,isl,isu
403 allocate (iw1(hecmat%NP) , iw2(hecmat%NP))
404 allocate (inumfi1l(0:hecmat%NP), inumfi1u(0:hecmat%NP))
415 do l= indexl(i-1)+1, indexl(i)
418 do l= indexu(i-1)+1, indexu(i)
426 isj= indexu(kk-1) + 1
430 if (iw1(jj).eq.0 .and. jj.lt.i)
then
431 inumfi1l(i)= inumfi1l(i)+1
434 if (iw1(jj).eq.0 .and. jj.gt.i)
then
435 inumfi1u(i)= inumfi1u(i)+1
440 nplf1= nplf1 + inumfi1l(i)
441 npuf1= npuf1 + inumfi1u(i)
446 allocate (iwsl(0:hecmat%NP), iwsu(0:hecmat%NP))
447 allocate (fi1l(hecmat%NPL+nplf1), fi1u(hecmat%NPU+npuf1))
449 npfiu = hecmat%NPU+npuf1
450 npfil = hecmat%NPL+nplf1
458 iwsl(i)= indexl(i)-indexl(i-1) + inumfi1l(i) + iwsl(i-1)
459 iwsu(i)= indexu(i)-indexu(i-1) + inumfi1u(i) + iwsu(i-1)
465 inumfi1l(i)= inumfi1l(i-1) + inumfi1l(i)
466 inumfi1u(i)= inumfi1u(i-1) + inumfi1u(i)
470 do l= indexl(i-1)+1, indexl(i)
473 do l= indexu(i-1)+1, indexu(i)
481 isj= indexu(kk-1) + 1
485 if (iw1(jj).eq.0 .and. jj.lt.i)
then
487 fi1l(icoul+iwsl(i-1)+indexl(i)-indexl(i-1))= jj
490 if (iw1(jj).eq.0 .and. jj.gt.i)
then
492 fi1u(icouu+iwsu(i-1)+indexu(i)-indexu(i-1))= jj
502 icoul1= indexl(i) - indexl(i-1)
503 icoul2= inumfi1l(i) - inumfi1l(i-1)
504 icoul3= icoul1 + icoul2
505 icouu1= indexu(i) - indexu(i-1)
506 icouu2= inumfi1u(i) - inumfi1u(i-1)
507 icouu3= icouu1 + icouu2
511 do k= indexl(i-1)+1, indexl(i)
516 do k= inumfi1l(i-1)+1, inumfi1l(i)
518 iw1(icou0)= fi1l(icou0+iwsl(i-1))
524 call rif_sort_nn (iw1, iw2, icoul3, hecmat%NP)
532 do k= indexu(i-1)+1, indexu(i)
537 do k= inumfi1u(i-1)+1, inumfi1u(i)
539 iw1(icou0)= fi1u(icou0+iwsu(i-1))
545 call rif_sort_nn (iw1, iw2, icouu3, hecmat%NP)
561 deallocate (iw1, iw2)
562 deallocate (iwsl, iwsu)
564 end subroutine form_ilu1_rif_nn
571 subroutine rif_sort_nn(STEM, INUM, N, NP)
574 integer(kind=kint) :: n, np
575 integer(kind=kint),
dimension(NP) :: stem
576 integer(kind=kint),
dimension(NP) :: inum
577 integer(kind=kint),
dimension(:),
allocatable :: istack
578 integer(kind=kint) :: m,nstack,jstack,l,ir,ip,i,j,k,ss,ii,temp,it
580 allocate (istack(-np:+np))
599 if (stem(i).le.ss)
goto 2
610 if (jstack.eq.0)
then
629 if (stem(l+1).gt.stem(ir))
then
638 if (stem(l).gt.stem(ir))
then
647 if (stem(l+1).gt.stem(l))
then
664 if (stem(i).lt.ss)
goto 3
668 if (stem(j).gt.ss)
goto 4
691 if (jstack.gt.nstack)
then
692 write (*,*)
'NSTACK overflow'
696 if (ir-i+1.ge.j-1)
then
710 end subroutine rif_sort_nn
715 if (
associated(sainvd))
deallocate(sainvd)
716 if (
associated(sainvl))
deallocate(sainvl)
717 if (
associated(rifd))
deallocate(rifd)
718 if (
associated(rifu))
deallocate(rifu)
719 if (
associated(rifl))
deallocate(rifl)
720 if (
associated(inumfi1l))
deallocate(inumfi1l)
721 if (
associated(inumfi1u))
deallocate(inumfi1u)
722 if (
associated(fi1l))
deallocate(fi1l)
723 if (
associated(fi1u))
deallocate(fi1u)