21 integer(kind=kint) :: N
22 real(kind=
kreal),
pointer :: dlu0(:) => null()
23 real(kind=
kreal),
pointer :: allu0(:) => null()
24 real(kind=
kreal),
pointer :: aulu0(:) => null()
25 integer(kind=kint),
pointer :: inumFI1L(:) => null()
26 integer(kind=kint),
pointer :: inumFI1U(:) => null()
27 integer(kind=kint),
pointer :: FI1L(:) => null()
28 integer(kind=kint),
pointer :: FI1U(:) => null()
30 logical,
save :: INITIALIZED = .false.
37 integer(kind=kint ) :: ndof, np, npu, npl
38 integer(kind=kint ) :: precond
39 real (kind=
kreal) :: sigma_diag
41 real(kind=
kreal),
pointer :: d(:)
42 real(kind=
kreal),
pointer :: al(:)
43 real(kind=
kreal),
pointer :: au(:)
45 integer(kind=kint ),
pointer :: inl(:), inu(:)
46 integer(kind=kint ),
pointer :: ial(:)
47 integer(kind=kint ),
pointer :: iau(:)
50 if (hecmat%Iarray(98) == 1)
then
52 else if (hecmat%Iarray(97) == 1)
then
73 if (precond.eq.10)
call form_ilu0_nn &
74 & (n, ndof, np, npl, npu, d, al, inl, ial, au, inu, iau, &
76 if (precond.eq.11)
call form_ilu1_nn &
77 & (n, ndof, np, npl, npu, d, al, inl, ial, au, inu, iau, &
79 if (precond.eq.12)
call form_ilu2_nn &
80 & (n, ndof, np, npl, npu, d, al, inl, ial, au, inu, iau, &
91 real(kind=
kreal),
intent(inout) :: ww(:)
92 integer(kind=kint) :: i, j, ii, ij, isl, iel, isu, ieu, k, ndof
93 real(kind=
kreal) :: sw(ndof), x(ndof)
99 sw(ii)= ww(ndof*(i-1)+ii)
106 x(ii)= ww(ndof*(k-1)+ii)
110 sw(ii)= sw(ii) - allu0(ndof*ndof*(j-1)+ndof*(ii-1)+ij)*x(ij)
118 x(ii)=x(ii)-dlu0(ndof*ndof*(i-1)+ndof*(ii-1)+ij )*x(ij)
123 x(ii)=x(ii)-dlu0(ndof*ndof*(i-1)+ndof*(ii-1)+ij )*x(ij)
125 x(ii)=dlu0(ndof*ndof*(i-1)+(ndof+1)*(ii-1)+1 )*x(ii)
128 ww(ndof*(i-1)+ii)=x(ii)
136 isu= inumfi1u(i-1) + 1
143 x(ii)= ww(ndof*(k-1)+ii)
147 sw(ii)= sw(ii) + aulu0(ndof*ndof*(j-1)+ndof*(ii-1)+ij)*x(ij)
154 x(ii)=x(ii)-dlu0(ndof*ndof*(i-1)+ndof*(ii-1)+ij )*x(ij)
159 x(ii)=x(ii)-dlu0(ndof*ndof*(i-1)+ndof*(ii-1)+ij )*x(ij)
161 x(ii)=dlu0(ndof*ndof*(i-1)+(ndof+1)*(ii-1)+1 )*x(ii)
164 ww(ndof*(i-1)+ii)= ww(ndof*(i-1)+ii)-x(ii)
171 if (
associated(dlu0))
deallocate(dlu0)
172 if (
associated(allu0))
deallocate(allu0)
173 if (
associated(aulu0))
deallocate(aulu0)
174 if (
associated(inumfi1l))
deallocate(inumfi1l)
175 if (
associated(inumfi1u))
deallocate(inumfi1u)
176 if (
associated(fi1l))
deallocate(fi1l)
177 if (
associated(fi1u))
deallocate(fi1u)
185 initialized = .false.
195 subroutine form_ilu0_nn &
196 & (n, ndof, np, npl, npu, d, al, inl, ial, au, inu, iau, &
199 integer(kind=kint ),
intent(in):: n, ndof, np, npu, npl
200 real (kind=
kreal),
intent(in):: sigma_diag
202 real(kind=
kreal),
dimension(NDOF*NDOF*NPL),
intent(in):: al
203 real(kind=
kreal),
dimension(NDOF*NDOF*NPU),
intent(in):: au
204 real(kind=
kreal),
dimension(NDOF*NDOF*NP ),
intent(in):: d
206 integer(kind=kint ),
dimension(0:NP) ,
intent(in) :: inu, inl
207 integer(kind=kint ),
dimension( NPL),
intent(in) :: ial
208 integer(kind=kint ),
dimension( NPU),
intent(in) :: iau
210 integer(kind=kint),
dimension(:),
allocatable :: iw1, iw2
211 real (kind=
kreal),
dimension(NDOF,NDOF) :: rhs_aij, dkinv, aik, akj
212 integer(kind=kint) :: i,jj,ij0,kk,ndof2
213 integer(kind=kint) :: j,k,ii,ij
215 allocate (iw1(np) , iw2(np))
216 allocate(dlu0(ndof2*np), allu0(ndof2*npl), aulu0(ndof2*npu))
217 allocate(inumfi1l(0:np), inumfi1u(0:np), fi1l(npl), fi1u(npu))
246 dlu0(ndof2*(i-1)+(ii-1)*ndof+ii)=dlu0(ndof2*(i-1)+(ii-1)*ndof+ii)*sigma_diag
251 call ilu1ann (dkinv, dlu0(ndof2*(i-1)+1:ndof2*ndof2),ndof)
254 dlu0(ndof2*(i-1)+ndof*(ii-1)+ij)= dkinv(ii,ij)
262 do k= inumfi1l(i-1)+1, inumfi1l(i)
266 do k= inumfi1u(i-1)+1, inumfi1u(i)
270 do kk= inl(i-1)+1, inl(i)
274 dkinv(ii,ij) = dlu0(ndof2*(k-1)+ndof*(ii-1)+ij)
279 aik(ii,ij) = allu0(ndof2*(kk-1)+ndof*(ii-1)+ij)
283 do jj= inu(k-1)+1, inu(k)
285 if (iw1(j).eq.0.and.iw2(j).eq.0) cycle
288 akj(ii,ij) = aulu0(ndof2*(jj-1)+ndof*(ii-1)+ij)
292 call ilu1bnn (rhs_aij, dkinv, aik, akj,ndof)
297 dlu0(ndof2*(i-1)+ndof*(ii-1)+ij) = dlu0(ndof2*(i-1)+ndof*(ii-1)+ij) - rhs_aij(ii,ij)
306 allu0(ndof2*(ij0-1)+ndof*(ii-1)+ij) = allu0(ndof2*(ij0-1)+ndof*(ii-1)+ij) - rhs_aij(ii,ij)
315 aulu0(ndof2*(ij0-1)+ndof*(ii-1)+ij) = aulu0(ndof2*(ij0-1)+ndof*(ii-1)+ij) - rhs_aij(ii,ij)
322 call ilu1ann (dkinv, dlu0(ndof2*(i-1)+1:ndof2*ndof2),ndof)
326 dlu0(ndof2*(i-1)+ndof*(ii-1)+ij) = dkinv(ii,ij)
331 deallocate (iw1, iw2)
332 end subroutine form_ilu0_nn
341 subroutine form_ilu1_nn &
342 & (n, ndof, np, npl, npu, d, al, inl, ial, au, inu, iau, &
345 integer(kind=kint ),
intent(in):: n, ndof, np, npu, npl
346 real (kind=
kreal),
intent(in):: sigma_diag
348 real(kind=
kreal),
dimension(9*NPL),
intent(in):: al
349 real(kind=
kreal),
dimension(9*NPU),
intent(in):: au
350 real(kind=
kreal),
dimension(9*NP ),
intent(in):: d
352 integer(kind=kint ),
dimension(0:NP) ,
intent(in) :: inu, inl
353 integer(kind=kint ),
dimension( NPL),
intent(in) :: ial
354 integer(kind=kint ),
dimension( NPU),
intent(in) :: iau
356 integer(kind=kint),
dimension(:),
allocatable :: iw1, iw2
357 integer(kind=kint),
dimension(:),
allocatable :: iwsl, iwsu
358 real (kind=
kreal),
dimension(3,3) :: rhs_aij, dkinv, aik, akj
359 integer(kind=kint) :: nplf1,npuf1,ndof2
360 integer(kind=kint) :: i,jj,jj1,ij0,kk,ik,kk1,kk2,l,isk,iek,isj,iej
361 integer(kind=kint) :: icou,icou0,icouu,icouu1,icouu2,icouu3,icoul,icoul1,icoul2,icoul3
362 integer(kind=kint) :: j,k,isl,isu
371 allocate (iw1(np) , iw2(np))
372 allocate (inumfi1l(0:np), inumfi1u(0:np))
383 do l= inl(i-1)+1, inl(i)
386 do l= inu(i-1)+1, inu(i)
398 if (iw1(jj).eq.0 .and. jj.lt.i)
then
399 inumfi1l(i)= inumfi1l(i)+1
402 if (iw1(jj).eq.0 .and. jj.gt.i)
then
403 inumfi1u(i)= inumfi1u(i)+1
408 nplf1= nplf1 + inumfi1l(i)
409 npuf1= npuf1 + inumfi1u(i)
414 allocate (iwsl(0:np), iwsu(0:np))
415 allocate (fi1l(npl+nplf1), fi1u(npu+npuf1))
416 allocate (allu0(9*(npl+nplf1)), aulu0(9*(npu+npuf1)))
424 iwsl(i)= inl(i)-inl(i-1) + inumfi1l(i) + iwsl(i-1)
425 iwsu(i)= inu(i)-inu(i-1) + inumfi1u(i) + iwsu(i-1)
431 inumfi1l(i)= inumfi1l(i-1) + inumfi1l(i)
432 inumfi1u(i)= inumfi1u(i-1) + inumfi1u(i)
436 do l= inl(i-1)+1, inl(i)
439 do l= inu(i-1)+1, inu(i)
451 if (iw1(jj).eq.0 .and. jj.lt.i)
then
453 fi1l(icoul+iwsl(i-1)+inl(i)-inl(i-1))= jj
456 if (iw1(jj).eq.0 .and. jj.gt.i)
then
458 fi1u(icouu+iwsu(i-1)+inu(i)-inu(i-1))= jj
476 icoul1= inl(i) - inl(i-1)
477 icoul2= inumfi1l(i) - inumfi1l(i-1)
478 icoul3= icoul1 + icoul2
479 icouu1= inu(i) - inu(i-1)
480 icouu2= inumfi1u(i) - inumfi1u(i-1)
481 icouu3= icouu1 + icouu2
485 do k= inl(i-1)+1, inl(i)
490 do k= inumfi1l(i-1)+1, inumfi1l(i)
492 iw1(icou0)= fi1l(icou0+iwsl(i-1))
498 call fill_in_s33_sort (iw1, iw2, icoul3, np)
503 if (ik.le.inl(i)-inl(i-1))
then
506 allu0(kk1-8)= al(kk2-8)
507 allu0(kk1-7)= al(kk2-7)
508 allu0(kk1-6)= al(kk2-6)
509 allu0(kk1-5)= al(kk2-5)
510 allu0(kk1-4)= al(kk2-4)
511 allu0(kk1-3)= al(kk2-3)
512 allu0(kk1-2)= al(kk2-2)
513 allu0(kk1-1)= al(kk2-1)
514 allu0(kk1 )= al(kk2 )
520 do k= inu(i-1)+1, inu(i)
525 do k= inumfi1u(i-1)+1, inumfi1u(i)
527 iw1(icou0)= fi1u(icou0+iwsu(i-1))
533 call fill_in_s33_sort (iw1, iw2, icouu3, np)
538 if (ik.le.inu(i)-inu(i-1))
then
541 aulu0(kk1-8)= au(kk2-8)
542 aulu0(kk1-7)= au(kk2-7)
543 aulu0(kk1-6)= au(kk2-6)
544 aulu0(kk1-5)= au(kk2-5)
545 aulu0(kk1-4)= au(kk2-4)
546 aulu0(kk1-3)= au(kk2-3)
547 aulu0(kk1-2)= au(kk2-2)
548 aulu0(kk1-1)= au(kk2-1)
549 aulu0(kk1 )= au(kk2 )
562 deallocate (iwsl, iwsu)
569 allocate (dlu0(9*np))
572 dlu0(9*i-8)=dlu0(9*i-8)*sigma_diag
573 dlu0(9*i-4)=dlu0(9*i-4)*sigma_diag
574 dlu0(9*i )=dlu0(9*i )*sigma_diag
579 dlu0(9*i-8), dlu0(9*i-7), dlu0(9*i-6), &
580 dlu0(9*i-5), dlu0(9*i-4), dlu0(9*i-3), &
581 dlu0(9*i-2), dlu0(9*i-1), dlu0(9*i ))
582 dlu0(9*i-8)= dkinv(1,1)
583 dlu0(9*i-7)= dkinv(1,2)
584 dlu0(9*i-6)= dkinv(1,3)
585 dlu0(9*i-5)= dkinv(2,1)
586 dlu0(9*i-4)= dkinv(2,2)
587 dlu0(9*i-3)= dkinv(2,3)
588 dlu0(9*i-2)= dkinv(3,1)
589 dlu0(9*i-1)= dkinv(3,2)
590 dlu0(9*i )= dkinv(3,3)
596 do k= inumfi1l(i-1)+1, inumfi1l(i)
600 do k= inumfi1u(i-1)+1, inumfi1u(i)
604 do kk= inl(i-1)+1, inl(i)
607 dkinv(1,1)= dlu0(9*k-8)
608 dkinv(1,2)= dlu0(9*k-7)
609 dkinv(1,3)= dlu0(9*k-6)
610 dkinv(2,1)= dlu0(9*k-5)
611 dkinv(2,2)= dlu0(9*k-4)
612 dkinv(2,3)= dlu0(9*k-3)
613 dkinv(3,1)= dlu0(9*k-2)
614 dkinv(3,2)= dlu0(9*k-1)
615 dkinv(3,3)= dlu0(9*k )
617 do kk1= inumfi1l(i-1)+1, inumfi1l(i)
618 if (k.eq.fi1l(kk1))
then
619 aik(1,1)= allu0(9*kk1-8)
620 aik(1,2)= allu0(9*kk1-7)
621 aik(1,3)= allu0(9*kk1-6)
622 aik(2,1)= allu0(9*kk1-5)
623 aik(2,2)= allu0(9*kk1-4)
624 aik(2,3)= allu0(9*kk1-3)
625 aik(3,1)= allu0(9*kk1-2)
626 aik(3,2)= allu0(9*kk1-1)
627 aik(3,3)= allu0(9*kk1 )
632 do jj= inu(k-1)+1, inu(k)
634 do jj1= inumfi1u(k-1)+1, inumfi1u(k)
635 if (j.eq.fi1u(jj1))
then
636 akj(1,1)= aulu0(9*jj1-8)
637 akj(1,2)= aulu0(9*jj1-7)
638 akj(1,3)= aulu0(9*jj1-6)
639 akj(2,1)= aulu0(9*jj1-5)
640 akj(2,2)= aulu0(9*jj1-4)
641 akj(2,3)= aulu0(9*jj1-3)
642 akj(3,1)= aulu0(9*jj1-2)
643 akj(3,2)= aulu0(9*jj1-1)
644 akj(3,3)= aulu0(9*jj1 )
649 call ilu1bnn (rhs_aij, dkinv, aik, akj,3)
652 dlu0(9*i-8)= dlu0(9*i-8) - rhs_aij(1,1)
653 dlu0(9*i-7)= dlu0(9*i-7) - rhs_aij(1,2)
654 dlu0(9*i-6)= dlu0(9*i-6) - rhs_aij(1,3)
655 dlu0(9*i-5)= dlu0(9*i-5) - rhs_aij(2,1)
656 dlu0(9*i-4)= dlu0(9*i-4) - rhs_aij(2,2)
657 dlu0(9*i-3)= dlu0(9*i-3) - rhs_aij(2,3)
658 dlu0(9*i-2)= dlu0(9*i-2) - rhs_aij(3,1)
659 dlu0(9*i-1)= dlu0(9*i-1) - rhs_aij(3,2)
660 dlu0(9*i )= dlu0(9*i ) - rhs_aij(3,3)
665 allu0(9*ij0-8)= allu0(9*ij0-8) - rhs_aij(1,1)
666 allu0(9*ij0-7)= allu0(9*ij0-7) - rhs_aij(1,2)
667 allu0(9*ij0-6)= allu0(9*ij0-6) - rhs_aij(1,3)
668 allu0(9*ij0-5)= allu0(9*ij0-5) - rhs_aij(2,1)
669 allu0(9*ij0-4)= allu0(9*ij0-4) - rhs_aij(2,2)
670 allu0(9*ij0-3)= allu0(9*ij0-3) - rhs_aij(2,3)
671 allu0(9*ij0-2)= allu0(9*ij0-2) - rhs_aij(3,1)
672 allu0(9*ij0-1)= allu0(9*ij0-1) - rhs_aij(3,2)
673 allu0(9*ij0 )= allu0(9*ij0 ) - rhs_aij(3,3)
678 aulu0(9*ij0-8)= aulu0(9*ij0-8) - rhs_aij(1,1)
679 aulu0(9*ij0-7)= aulu0(9*ij0-7) - rhs_aij(1,2)
680 aulu0(9*ij0-6)= aulu0(9*ij0-6) - rhs_aij(1,3)
681 aulu0(9*ij0-5)= aulu0(9*ij0-5) - rhs_aij(2,1)
682 aulu0(9*ij0-4)= aulu0(9*ij0-4) - rhs_aij(2,2)
683 aulu0(9*ij0-3)= aulu0(9*ij0-3) - rhs_aij(2,3)
684 aulu0(9*ij0-2)= aulu0(9*ij0-2) - rhs_aij(3,1)
685 aulu0(9*ij0-1)= aulu0(9*ij0-1) - rhs_aij(3,2)
686 aulu0(9*ij0 )= aulu0(9*ij0 ) - rhs_aij(3,3)
693 dlu0(9*i-8), dlu0(9*i-7), dlu0(9*i-6), &
694 dlu0(9*i-5), dlu0(9*i-4), dlu0(9*i-3), &
695 dlu0(9*i-2), dlu0(9*i-1), dlu0(9*i ))
696 dlu0(9*i-8)= dkinv(1,1)
697 dlu0(9*i-7)= dkinv(1,2)
698 dlu0(9*i-6)= dkinv(1,3)
699 dlu0(9*i-5)= dkinv(2,1)
700 dlu0(9*i-4)= dkinv(2,2)
701 dlu0(9*i-3)= dkinv(2,3)
702 dlu0(9*i-2)= dkinv(3,1)
703 dlu0(9*i-1)= dkinv(3,2)
704 dlu0(9*i )= dkinv(3,3)
707 deallocate (iw1, iw2)
709 end subroutine form_ilu1_nn
718 subroutine form_ilu2_nn &
719 & (n, ndof, np, npl, npu, d, al, inl, ial, au, inu, iau, &
722 integer(kind=kint ),
intent(in):: n, ndof, np, npu, npl
723 real (kind=
kreal),
intent(in):: sigma_diag
725 real(kind=
kreal),
dimension(9*NPL),
intent(in):: al
726 real(kind=
kreal),
dimension(9*NPU),
intent(in):: au
727 real(kind=
kreal),
dimension(9*NP ),
intent(in):: d
729 integer(kind=kint ),
dimension(0:NP) ,
intent(in) :: inu, inl
730 integer(kind=kint ),
dimension( NPL),
intent(in) :: ial
731 integer(kind=kint ),
dimension( NPU),
intent(in) :: iau
733 integer(kind=kint),
dimension(:),
allocatable:: iw1 , iw2
734 integer(kind=kint),
dimension(:),
allocatable:: iwsl, iwsu
735 integer(kind=kint),
dimension(:),
allocatable:: iconfi1l, iconfi1u
736 integer(kind=kint),
dimension(:),
allocatable:: inumfi2l, inumfi2u
737 integer(kind=kint),
dimension(:),
allocatable:: fi2l, fi2u
738 real (kind=
kreal),
dimension(3,3) :: rhs_aij, dkinv, aik, akj
739 integer(kind=kint) :: nplf1,nplf2,npuf1,npuf2,ias,iconik,iconkj,ndof2
740 integer(kind=kint) :: i,jj,ij0,kk,ik,kk1,kk2,l,isk,iek,isj,iej
741 integer(kind=kint) :: icou,icouu,icouu1,icouu2,icouu3,icoul,icoul1,icoul2,icoul3
742 integer(kind=kint) :: j,k,isl,isu
752 allocate (iw1(np) , iw2(np))
753 allocate (inumfi2l(0:np), inumfi2u(0:np))
764 do l= inl(i-1)+1, inl(i)
767 do l= inu(i-1)+1, inu(i)
779 if (iw1(jj).eq.0 .and. jj.lt.i)
then
780 inumfi2l(i)= inumfi2l(i)+1
783 if (iw1(jj).eq.0 .and. jj.gt.i)
then
784 inumfi2u(i)= inumfi2u(i)+1
789 nplf1= nplf1 + inumfi2l(i)
790 npuf1= npuf1 + inumfi2u(i)
795 allocate (iwsl(0:np), iwsu(0:np))
796 allocate (fi2l(nplf1), fi2u(npuf1))
804 inumfi2l(i)= inumfi2l(i-1) + inumfi2l(i)
805 inumfi2u(i)= inumfi2u(i-1) + inumfi2u(i)
809 do l= inl(i-1)+1, inl(i)
812 do l= inu(i-1)+1, inu(i)
824 if (iw1(jj).eq.0 .and. jj.lt.i)
then
826 fi2l(icoul+inumfi2l(i-1))= jj
829 if (iw1(jj).eq.0 .and. jj.gt.i)
then
831 fi2u(icouu+inumfi2u(i-1))= jj
844 allocate (inumfi1l(0:np), inumfi1u(0:np))
855 do l= inl(i-1)+1, inl(i)
858 do l= inu(i-1)+1, inu(i)
862 do l= inumfi2l(i-1)+1, inumfi2l(i)
866 do l= inumfi2u(i-1)+1, inumfi2u(i)
874 isj= inumfi2u(kk-1) + 1
878 if (iw1(jj).eq.0 .and. jj.lt.i)
then
879 inumfi1l(i)= inumfi1l(i) + 1
882 if (iw1(jj).eq.0 .and. jj.gt.i)
then
883 inumfi1u(i)= inumfi1u(i) + 1
897 if (iw1(jj).eq.0 .and. jj.lt.i)
then
898 inumfi1l(i)= inumfi1l(i) + 1
901 if (iw1(jj).eq.0 .and. jj.gt.i)
then
902 inumfi1u(i)= inumfi1u(i) + 1
907 nplf2= nplf2 + inumfi1l(i)
908 npuf2= npuf2 + inumfi1u(i)
913 allocate (fi1l(npl+nplf1+nplf2))
914 allocate (fi1u(npu+npuf1+npuf2))
916 allocate (iconfi1l(npl+nplf1+nplf2))
917 allocate (iconfi1u(npu+npuf1+npuf2))
922 iwsl(i)= inl(i)-inl(i-1) + inumfi2l(i)-inumfi2l(i-1) + &
923 & inumfi1l(i) + iwsl(i-1)
924 iwsu(i)= inu(i)-inu(i-1) + inumfi2u(i)-inumfi2u(i-1) + &
925 & inumfi1u(i) + iwsu(i-1)
931 inumfi1l(i)= inumfi1l(i-1) + inumfi1l(i)
932 inumfi1u(i)= inumfi1u(i-1) + inumfi1u(i)
936 do l= inl(i-1)+1, inl(i)
939 do l= inu(i-1)+1, inu(i)
943 do l= inumfi2l(i-1)+1, inumfi2l(i)
947 do l= inumfi2u(i-1)+1, inumfi2u(i)
955 isj= inumfi2u(kk-1) + 1
959 if (iw1(jj).eq.0 .and. jj.lt.i)
then
960 ias= inl(i)-inl(i-1)+inumfi2l(i)-inumfi2l(i-1)+iwsl(i-1)
965 if (iw1(jj).eq.0 .and. jj.gt.i)
then
966 ias= inu(i)-inu(i-1)+inumfi2u(i)-inumfi2u(i-1)+iwsu(i-1)
974 isk= inumfi2l(i-1) + 1
982 if (iw1(jj).eq.0 .and. jj.lt.i)
then
983 ias= inl(i)-inl(i-1)+inumfi2l(i)-inumfi2l(i-1)+iwsl(i-1)
988 if (iw1(jj).eq.0 .and. jj.gt.i)
then
989 ias= inu(i)-inu(i-1)+inumfi2u(i)-inumfi2u(i-1)+iwsu(i-1)
1004 allocate (allu0(9*(npl+nplf1+nplf2)))
1005 allocate (aulu0(9*(npu+npuf1+npuf2)))
1016 icoul1= inl(i) - inl(i-1)
1017 icoul2= inumfi2l(i) - inumfi2l(i-1) + icoul1
1018 icoul3= inumfi1l(i) - inumfi1l(i-1) + icoul2
1020 icouu1= inu(i) - inu(i-1)
1021 icouu2= inumfi2u(i) - inumfi2u(i-1) + icouu1
1022 icouu3= inumfi1u(i) - inumfi1u(i-1) + icouu2
1027 do k= inl(i-1)+1, inl(i)
1033 do k= inumfi2l(i-1)+1, inumfi2l(i)
1035 iw1(icou+icoul1)= fi2l(k)
1039 do k= inumfi1l(i-1)+1, inumfi1l(i)
1041 iw1(icou+icoul2)= fi1l(icou+icoul2+isl)
1048 call fill_in_s33_sort (iw1, iw2, icoul3, np)
1053 if (ik.le.inl(i)-inl(i-1))
then
1055 kk2= 9*(ik+inl(i-1))
1056 allu0(kk1-8)= al(kk2-8)
1057 allu0(kk1-7)= al(kk2-7)
1058 allu0(kk1-6)= al(kk2-6)
1059 allu0(kk1-5)= al(kk2-5)
1060 allu0(kk1-4)= al(kk2-4)
1061 allu0(kk1-3)= al(kk2-3)
1062 allu0(kk1-2)= al(kk2-2)
1063 allu0(kk1-1)= al(kk2-1)
1064 allu0(kk1 )= al(kk2 )
1069 do k= inl(i-1)+1, inl(i)
1075 do k= inumfi2l(i-1)+1, inumfi2l(i)
1081 do k= inumfi1l(i-1)+1, inumfi1l(i)
1087 iconfi1l(k+isl)= iw1(iw2(k))
1092 do k= inu(i-1)+1, inu(i)
1098 do k= inumfi2u(i-1)+1, inumfi2u(i)
1100 iw1(icou+icouu1)= fi2u(k)
1104 do k= inumfi1u(i-1)+1, inumfi1u(i)
1106 iw1(icou+icouu2)= fi1u(icou+icouu2+isu)
1112 call fill_in_s33_sort (iw1, iw2, icouu3, np)
1117 if (ik.le.inu(i)-inu(i-1))
then
1119 kk2= 9*(ik+inu(i-1))
1120 aulu0(kk1-8)= au(kk2-8)
1121 aulu0(kk1-7)= au(kk2-7)
1122 aulu0(kk1-6)= au(kk2-6)
1123 aulu0(kk1-5)= au(kk2-5)
1124 aulu0(kk1-4)= au(kk2-4)
1125 aulu0(kk1-3)= au(kk2-3)
1126 aulu0(kk1-2)= au(kk2-2)
1127 aulu0(kk1-1)= au(kk2-1)
1128 aulu0(kk1 )= au(kk2 )
1133 do k= inu(i-1)+1, inu(i)
1139 do k= inumfi2u(i-1)+1, inumfi2u(i)
1145 do k= inumfi1u(i-1)+1, inumfi1u(i)
1151 iconfi1u(k+isu)= iw1(iw2(k))
1159 inumfi1l(i)= iwsl(i)
1160 inumfi1u(i)= iwsu(i)
1163 deallocate (iwsl, iwsu)
1164 deallocate (inumfi2l, inumfi2u)
1165 deallocate ( fi2l, fi2u)
1172 allocate (dlu0(9*np))
1175 dlu0(9*i-8)=dlu0(9*i-8)*sigma_diag
1176 dlu0(9*i-4)=dlu0(9*i-4)*sigma_diag
1177 dlu0(9*i )=dlu0(9*i )*sigma_diag
1182 dlu0(9*i-8), dlu0(9*i-7), dlu0(9*i-6), &
1183 dlu0(9*i-5), dlu0(9*i-4), dlu0(9*i-3), &
1184 dlu0(9*i-2), dlu0(9*i-1), dlu0(9*i ))
1185 dlu0(9*i-8)= dkinv(1,1)
1186 dlu0(9*i-7)= dkinv(1,2)
1187 dlu0(9*i-6)= dkinv(1,3)
1188 dlu0(9*i-5)= dkinv(2,1)
1189 dlu0(9*i-4)= dkinv(2,2)
1190 dlu0(9*i-3)= dkinv(2,3)
1191 dlu0(9*i-2)= dkinv(3,1)
1192 dlu0(9*i-1)= dkinv(3,2)
1193 dlu0(9*i )= dkinv(3,3)
1199 do k= inumfi1l(i-1)+1, inumfi1l(i)
1203 do k= inumfi1u(i-1)+1, inumfi1u(i)
1207 do kk= inumfi1l(i-1)+1, inumfi1l(i)
1209 iconik= iconfi1l(kk)
1211 dkinv(1,1)= dlu0(9*k-8)
1212 dkinv(1,2)= dlu0(9*k-7)
1213 dkinv(1,3)= dlu0(9*k-6)
1214 dkinv(2,1)= dlu0(9*k-5)
1215 dkinv(2,2)= dlu0(9*k-4)
1216 dkinv(2,3)= dlu0(9*k-3)
1217 dkinv(3,1)= dlu0(9*k-2)
1218 dkinv(3,2)= dlu0(9*k-1)
1219 dkinv(3,3)= dlu0(9*k )
1221 aik(1,1)= allu0(9*kk-8)
1222 aik(1,2)= allu0(9*kk-7)
1223 aik(1,3)= allu0(9*kk-6)
1224 aik(2,1)= allu0(9*kk-5)
1225 aik(2,2)= allu0(9*kk-4)
1226 aik(2,3)= allu0(9*kk-3)
1227 aik(3,1)= allu0(9*kk-2)
1228 aik(3,2)= allu0(9*kk-1)
1229 aik(3,3)= allu0(9*kk )
1231 do jj= inumfi1u(k-1)+1, inumfi1u(k)
1233 iconkj= iconfi1u(jj)
1235 if ((iconik+iconkj).lt.2)
then
1236 akj(1,1)= aulu0(9*jj-8)
1237 akj(1,2)= aulu0(9*jj-7)
1238 akj(1,3)= aulu0(9*jj-6)
1239 akj(2,1)= aulu0(9*jj-5)
1240 akj(2,2)= aulu0(9*jj-4)
1241 akj(2,3)= aulu0(9*jj-3)
1242 akj(3,1)= aulu0(9*jj-2)
1243 akj(3,2)= aulu0(9*jj-1)
1244 akj(3,3)= aulu0(9*jj )
1246 call ilu1bnn (rhs_aij, dkinv, aik, akj,3)
1249 dlu0(9*i-8)= dlu0(9*i-8) - rhs_aij(1,1)
1250 dlu0(9*i-7)= dlu0(9*i-7) - rhs_aij(1,2)
1251 dlu0(9*i-6)= dlu0(9*i-6) - rhs_aij(1,3)
1252 dlu0(9*i-5)= dlu0(9*i-5) - rhs_aij(2,1)
1253 dlu0(9*i-4)= dlu0(9*i-4) - rhs_aij(2,2)
1254 dlu0(9*i-3)= dlu0(9*i-3) - rhs_aij(2,3)
1255 dlu0(9*i-2)= dlu0(9*i-2) - rhs_aij(3,1)
1256 dlu0(9*i-1)= dlu0(9*i-1) - rhs_aij(3,2)
1257 dlu0(9*i )= dlu0(9*i ) - rhs_aij(3,3)
1262 allu0(9*ij0-8)= allu0(9*ij0-8) - rhs_aij(1,1)
1263 allu0(9*ij0-7)= allu0(9*ij0-7) - rhs_aij(1,2)
1264 allu0(9*ij0-6)= allu0(9*ij0-6) - rhs_aij(1,3)
1265 allu0(9*ij0-5)= allu0(9*ij0-5) - rhs_aij(2,1)
1266 allu0(9*ij0-4)= allu0(9*ij0-4) - rhs_aij(2,2)
1267 allu0(9*ij0-3)= allu0(9*ij0-3) - rhs_aij(2,3)
1268 allu0(9*ij0-2)= allu0(9*ij0-2) - rhs_aij(3,1)
1269 allu0(9*ij0-1)= allu0(9*ij0-1) - rhs_aij(3,2)
1270 allu0(9*ij0 )= allu0(9*ij0 ) - rhs_aij(3,3)
1275 aulu0(9*ij0-8)= aulu0(9*ij0-8) - rhs_aij(1,1)
1276 aulu0(9*ij0-7)= aulu0(9*ij0-7) - rhs_aij(1,2)
1277 aulu0(9*ij0-6)= aulu0(9*ij0-6) - rhs_aij(1,3)
1278 aulu0(9*ij0-5)= aulu0(9*ij0-5) - rhs_aij(2,1)
1279 aulu0(9*ij0-4)= aulu0(9*ij0-4) - rhs_aij(2,2)
1280 aulu0(9*ij0-3)= aulu0(9*ij0-3) - rhs_aij(2,3)
1281 aulu0(9*ij0-2)= aulu0(9*ij0-2) - rhs_aij(3,1)
1282 aulu0(9*ij0-1)= aulu0(9*ij0-1) - rhs_aij(3,2)
1283 aulu0(9*ij0 )= aulu0(9*ij0 ) - rhs_aij(3,3)
1290 dlu0(9*i-8), dlu0(9*i-7), dlu0(9*i-6), &
1291 dlu0(9*i-5), dlu0(9*i-4), dlu0(9*i-3), &
1292 dlu0(9*i-2), dlu0(9*i-1), dlu0(9*i ))
1293 dlu0(9*i-8)= dkinv(1,1)
1294 dlu0(9*i-7)= dkinv(1,2)
1295 dlu0(9*i-6)= dkinv(1,3)
1296 dlu0(9*i-5)= dkinv(2,1)
1297 dlu0(9*i-4)= dkinv(2,2)
1298 dlu0(9*i-3)= dkinv(2,3)
1299 dlu0(9*i-2)= dkinv(3,1)
1300 dlu0(9*i-1)= dkinv(3,2)
1301 dlu0(9*i )= dkinv(3,3)
1304 deallocate (iw1, iw2)
1305 deallocate (iconfi1l, iconfi1u)
1307 end subroutine form_ilu2_nn
1315 subroutine fill_in_s33_sort (STEM, INUM, N, NP)
1318 integer(kind=kint) :: n, np
1319 integer(kind=kint),
dimension(NP) :: stem
1320 integer(kind=kint),
dimension(NP) :: inum
1321 integer(kind=kint),
dimension(:),
allocatable :: istack
1322 integer(kind=kint) :: m,nstack,jstack,l,ir,ip,i,j,k,ss,ii,temp,it
1324 allocate (istack(-np:+np))
1343 if (stem(i).le.ss)
goto 2
1354 if (jstack.eq.0)
then
1360 l = istack(jstack-1)
1373 if (stem(l+1).gt.stem(ir))
then
1382 if (stem(l).gt.stem(ir))
then
1391 if (stem(l+1).gt.stem(l))
then
1408 if (stem(i).lt.ss)
goto 3
1412 if (stem(j).gt.ss)
goto 4
1435 if (jstack.gt.nstack)
then
1436 write (*,*)
'NSTACK overflow'
1440 if (ir-i+1.ge.j-1)
then
1445 istack(jstack )= j-1
1454 end subroutine fill_in_s33_sort
1463 subroutine ilu1a33 (ALU, D11,D12,D13,D21,D22,D23,D31,D32,D33)
1466 real(kind=
kreal) :: alu(3,3), pw(3)
1467 real(kind=
kreal) :: d11,d12,d13,d21,d22,d23,d31,d32,d33
1468 integer(kind=kint) :: i,j,k
1481 if (alu(k,k) == 0.d0)
then
1483 stop
'ERROR: Divide by zero in ILU setup'
1485 alu(k,k)= 1.d0/alu(k,k)
1487 alu(i,k)= alu(i,k) * alu(k,k)
1489 pw(j)= alu(i,j) - alu(i,k)*alu(k,j)
1502 real(kind=
kreal) :: alu(ndof,ndof), d(ndof*ndof), pw(ndof)
1503 integer(kind=kint) :: NDOF, i,j,k
1507 alu(i,j) = d(ndof*(i-1)+j)
1512 if (alu(k,k) == 0.d0)
then
1513 stop
'ERROR: Divide by zero in ILU setup'
1515 alu(k,k)= 1.d0/alu(k,k)
1517 alu(i,k)= alu(i,k) * alu(k,k)
1519 pw(j)= alu(i,j) - alu(i,k)*alu(k,j)
1537 subroutine ilu1bnn (RHS_Aij, DkINV, Aik, Akj, NDOF)
1540 real(kind=
kreal) :: rhs_aij(ndof,ndof), dkinv(ndof,ndof), aik(ndof,ndof), akj(ndof,ndof)
1541 real(kind=
kreal) :: x(ndof)
1542 integer(kind=kint) :: NDOF,i,j,k
1545 x(1:ndof)= akj(1:ndof,k)
1548 x(i)=x(i)-dkinv(i,j)*x(j)
1553 x(i)=x(i)-dkinv(i,j)*x(j)
1555 x(i)=dkinv(i,i)*x(i)
1560 rhs_aij(i,k) = rhs_aij(i,k)+aik(i,j)*x(j)
real(kind=kreal) function, public hecmw_mat_get_sigma_diag(hecMAT)
integer(kind=kint) function, public hecmw_mat_get_precond(hecMAT)
subroutine ilu1a33(ALU, D11, D12, D13, D21, D22, D23, D31, D32, D33)
subroutine ilu1bnn(RHS_Aij, DkINV, Aik, Akj, NDOF)
subroutine, public hecmw_precond_bilu_nn_setup(hecMAT)
subroutine ilu1ann(ALU, D, NDOF)
subroutine, public hecmw_precond_bilu_nn_apply(WW, NDOF)
subroutine, public hecmw_precond_bilu_nn_clear()
integer(kind=4), parameter kreal