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, 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
74 if (precond.eq.10)
call form_ilu0_nn &
75 & (n, ndof, np, npl, npu, d, al, inl, ial, au, inu, iau, &
77 if (precond.eq.11)
call form_ilu1_nn &
78 & (n, ndof, np, npl, npu, d, al, inl, ial, au, inu, iau, &
80 if (precond.eq.12)
call form_ilu2_nn &
81 & (n, ndof, np, npl, npu, d, al, inl, ial, au, inu, iau, &
92 real(kind=
kreal),
intent(inout) :: ww(:)
93 integer(kind=kint) :: i, j, ii, ij, isl, iel, isu, ieu, k, ndof
94 real(kind=
kreal) :: sw(ndof), x(ndof)
100 sw(ii)= ww(ndof*(i-1)+ii)
107 x(ii)= ww(ndof*(k-1)+ii)
111 sw(ii)= sw(ii) - allu0(ndof*ndof*(j-1)+ndof*(ii-1)+ij)*x(ij)
119 x(ii)=x(ii)-dlu0(ndof*ndof*(i-1)+ndof*(ii-1)+ij )*x(ij)
124 x(ii)=x(ii)-dlu0(ndof*ndof*(i-1)+ndof*(ii-1)+ij )*x(ij)
126 x(ii)=dlu0(ndof*ndof*(i-1)+(ndof+1)*(ii-1)+1 )*x(ii)
129 ww(ndof*(i-1)+ii)=x(ii)
137 isu= inumfi1u(i-1) + 1
144 x(ii)= ww(ndof*(k-1)+ii)
148 sw(ii)= sw(ii) + aulu0(ndof*ndof*(j-1)+ndof*(ii-1)+ij)*x(ij)
155 x(ii)=x(ii)-dlu0(ndof*ndof*(i-1)+ndof*(ii-1)+ij )*x(ij)
160 x(ii)=x(ii)-dlu0(ndof*ndof*(i-1)+ndof*(ii-1)+ij )*x(ij)
162 x(ii)=dlu0(ndof*ndof*(i-1)+(ndof+1)*(ii-1)+1 )*x(ii)
165 ww(ndof*(i-1)+ii)= ww(ndof*(i-1)+ii)-x(ii)
172 if (
associated(dlu0))
deallocate(dlu0)
173 if (
associated(allu0))
deallocate(allu0)
174 if (
associated(aulu0))
deallocate(aulu0)
175 if (
associated(inumfi1l))
deallocate(inumfi1l)
176 if (
associated(inumfi1u))
deallocate(inumfi1u)
177 if (
associated(fi1l))
deallocate(fi1l)
178 if (
associated(fi1u))
deallocate(fi1u)
186 initialized = .false.
196 subroutine form_ilu0_nn &
197 & (n, ndof, np, npl, npu, d, al, inl, ial, au, inu, iau, &
200 integer(kind=kint ),
intent(in):: n, ndof, np, npu, npl
201 real (kind=
kreal),
intent(in):: sigma, sigma_diag
203 real(kind=
kreal),
dimension(NDOF*NDOF*NPL),
intent(in):: al
204 real(kind=
kreal),
dimension(NDOF*NDOF*NPU),
intent(in):: au
205 real(kind=
kreal),
dimension(NDOF*NDOF*NP ),
intent(in):: d
207 integer(kind=kint ),
dimension(0:NP) ,
intent(in) :: inu, inl
208 integer(kind=kint ),
dimension( NPL),
intent(in) :: ial
209 integer(kind=kint ),
dimension( NPU),
intent(in) :: iau
211 integer(kind=kint),
dimension(:),
allocatable :: iw1, iw2
212 real (kind=
kreal),
dimension(NDOF,NDOF) :: rhs_aij, dkinv, aik, akj
213 integer(kind=kint) :: i,jj,ij0,kk,ndof2
214 integer(kind=kint) :: j,k,ii,ij
216 allocate (iw1(np) , iw2(np))
217 allocate(dlu0(ndof2*np), allu0(ndof2*npl), aulu0(ndof2*npu))
218 allocate(inumfi1l(0:np), inumfi1u(0:np), fi1l(npl), fi1u(npu))
247 dlu0(ndof2*(i-1)+(ii-1)*ndof+ii)=dlu0(ndof2*(i-1)+(ii-1)*ndof+ii)*sigma_diag
252 call ilu1ann (dkinv, dlu0(ndof2*(i-1)+1:ndof2*ndof2),ndof)
255 dlu0(ndof2*(i-1)+ndof*(ii-1)+ij)= dkinv(ii,ij)
263 do k= inumfi1l(i-1)+1, inumfi1l(i)
267 do k= inumfi1u(i-1)+1, inumfi1u(i)
271 do kk= inl(i-1)+1, inl(i)
275 dkinv(ii,ij) = dlu0(ndof2*(k-1)+ndof*(ii-1)+ij)
280 aik(ii,ij) = allu0(ndof2*(kk-1)+ndof*(ii-1)+ij)
284 do jj= inu(k-1)+1, inu(k)
286 if (iw1(j).eq.0.and.iw2(j).eq.0) cycle
289 akj(ii,ij) = aulu0(ndof2*(jj-1)+ndof*(ii-1)+ij)
293 call ilu1bnn (rhs_aij, dkinv, aik, akj,ndof)
298 dlu0(ndof2*(i-1)+ndof*(ii-1)+ij) = dlu0(ndof2*(i-1)+ndof*(ii-1)+ij) - rhs_aij(ii,ij)
307 allu0(ndof2*(ij0-1)+ndof*(ii-1)+ij) = allu0(ndof2*(ij0-1)+ndof*(ii-1)+ij) - rhs_aij(ii,ij)
316 aulu0(ndof2*(ij0-1)+ndof*(ii-1)+ij) = aulu0(ndof2*(ij0-1)+ndof*(ii-1)+ij) - rhs_aij(ii,ij)
323 call ilu1ann (dkinv, dlu0(ndof2*(i-1)+1:ndof2*ndof2),ndof)
327 dlu0(ndof2*(i-1)+ndof*(ii-1)+ij) = dkinv(ii,ij)
332 deallocate (iw1, iw2)
333 end subroutine form_ilu0_nn
342 subroutine form_ilu1_nn &
343 & (n, ndof, np, npl, npu, d, al, inl, ial, au, inu, iau, &
346 integer(kind=kint ),
intent(in):: n, ndof, np, npu, npl
347 real (kind=
kreal),
intent(in):: sigma, sigma_diag
349 real(kind=
kreal),
dimension(9*NPL),
intent(in):: al
350 real(kind=
kreal),
dimension(9*NPU),
intent(in):: au
351 real(kind=
kreal),
dimension(9*NP ),
intent(in):: d
353 integer(kind=kint ),
dimension(0:NP) ,
intent(in) :: inu, inl
354 integer(kind=kint ),
dimension( NPL),
intent(in) :: ial
355 integer(kind=kint ),
dimension( NPU),
intent(in) :: iau
357 integer(kind=kint),
dimension(:),
allocatable :: iw1, iw2
358 integer(kind=kint),
dimension(:),
allocatable :: iwsl, iwsu
359 real (kind=
kreal),
dimension(3,3) :: rhs_aij, dkinv, aik, akj
360 integer(kind=kint) :: nplf1,npuf1,ndof2
361 integer(kind=kint) :: i,jj,jj1,ij0,kk,ik,kk1,kk2,l,isk,iek,isj,iej
362 integer(kind=kint) :: icou,icou0,icouu,icouu1,icouu2,icouu3,icoul,icoul1,icoul2,icoul3
363 integer(kind=kint) :: j,k,isl,isu
372 allocate (iw1(np) , iw2(np))
373 allocate (inumfi1l(0:np), inumfi1u(0:np))
384 do l= inl(i-1)+1, inl(i)
387 do l= inu(i-1)+1, inu(i)
399 if (iw1(jj).eq.0 .and. jj.lt.i)
then
400 inumfi1l(i)= inumfi1l(i)+1
403 if (iw1(jj).eq.0 .and. jj.gt.i)
then
404 inumfi1u(i)= inumfi1u(i)+1
409 nplf1= nplf1 + inumfi1l(i)
410 npuf1= npuf1 + inumfi1u(i)
415 allocate (iwsl(0:np), iwsu(0:np))
416 allocate (fi1l(npl+nplf1), fi1u(npu+npuf1))
417 allocate (allu0(9*(npl+nplf1)), aulu0(9*(npu+npuf1)))
425 iwsl(i)= inl(i)-inl(i-1) + inumfi1l(i) + iwsl(i-1)
426 iwsu(i)= inu(i)-inu(i-1) + inumfi1u(i) + iwsu(i-1)
432 inumfi1l(i)= inumfi1l(i-1) + inumfi1l(i)
433 inumfi1u(i)= inumfi1u(i-1) + inumfi1u(i)
437 do l= inl(i-1)+1, inl(i)
440 do l= inu(i-1)+1, inu(i)
452 if (iw1(jj).eq.0 .and. jj.lt.i)
then
454 fi1l(icoul+iwsl(i-1)+inl(i)-inl(i-1))= jj
457 if (iw1(jj).eq.0 .and. jj.gt.i)
then
459 fi1u(icouu+iwsu(i-1)+inu(i)-inu(i-1))= jj
477 icoul1= inl(i) - inl(i-1)
478 icoul2= inumfi1l(i) - inumfi1l(i-1)
479 icoul3= icoul1 + icoul2
480 icouu1= inu(i) - inu(i-1)
481 icouu2= inumfi1u(i) - inumfi1u(i-1)
482 icouu3= icouu1 + icouu2
486 do k= inl(i-1)+1, inl(i)
491 do k= inumfi1l(i-1)+1, inumfi1l(i)
493 iw1(icou0)= fi1l(icou0+iwsl(i-1))
499 call fill_in_s33_sort (iw1, iw2, icoul3, np)
504 if (ik.le.inl(i)-inl(i-1))
then
507 allu0(kk1-8)= al(kk2-8)
508 allu0(kk1-7)= al(kk2-7)
509 allu0(kk1-6)= al(kk2-6)
510 allu0(kk1-5)= al(kk2-5)
511 allu0(kk1-4)= al(kk2-4)
512 allu0(kk1-3)= al(kk2-3)
513 allu0(kk1-2)= al(kk2-2)
514 allu0(kk1-1)= al(kk2-1)
515 allu0(kk1 )= al(kk2 )
521 do k= inu(i-1)+1, inu(i)
526 do k= inumfi1u(i-1)+1, inumfi1u(i)
528 iw1(icou0)= fi1u(icou0+iwsu(i-1))
534 call fill_in_s33_sort (iw1, iw2, icouu3, np)
539 if (ik.le.inu(i)-inu(i-1))
then
542 aulu0(kk1-8)= au(kk2-8)
543 aulu0(kk1-7)= au(kk2-7)
544 aulu0(kk1-6)= au(kk2-6)
545 aulu0(kk1-5)= au(kk2-5)
546 aulu0(kk1-4)= au(kk2-4)
547 aulu0(kk1-3)= au(kk2-3)
548 aulu0(kk1-2)= au(kk2-2)
549 aulu0(kk1-1)= au(kk2-1)
550 aulu0(kk1 )= au(kk2 )
563 deallocate (iwsl, iwsu)
570 allocate (dlu0(9*np))
573 dlu0(9*i-8)=dlu0(9*i-8)*sigma_diag
574 dlu0(9*i-4)=dlu0(9*i-4)*sigma_diag
575 dlu0(9*i )=dlu0(9*i )*sigma_diag
580 dlu0(9*i-8), dlu0(9*i-7), dlu0(9*i-6), &
581 dlu0(9*i-5), dlu0(9*i-4), dlu0(9*i-3), &
582 dlu0(9*i-2), dlu0(9*i-1), dlu0(9*i ))
583 dlu0(9*i-8)= dkinv(1,1)
584 dlu0(9*i-7)= dkinv(1,2)
585 dlu0(9*i-6)= dkinv(1,3)
586 dlu0(9*i-5)= dkinv(2,1)
587 dlu0(9*i-4)= dkinv(2,2)
588 dlu0(9*i-3)= dkinv(2,3)
589 dlu0(9*i-2)= dkinv(3,1)
590 dlu0(9*i-1)= dkinv(3,2)
591 dlu0(9*i )= dkinv(3,3)
597 do k= inumfi1l(i-1)+1, inumfi1l(i)
601 do k= inumfi1u(i-1)+1, inumfi1u(i)
605 do kk= inl(i-1)+1, inl(i)
608 dkinv(1,1)= dlu0(9*k-8)
609 dkinv(1,2)= dlu0(9*k-7)
610 dkinv(1,3)= dlu0(9*k-6)
611 dkinv(2,1)= dlu0(9*k-5)
612 dkinv(2,2)= dlu0(9*k-4)
613 dkinv(2,3)= dlu0(9*k-3)
614 dkinv(3,1)= dlu0(9*k-2)
615 dkinv(3,2)= dlu0(9*k-1)
616 dkinv(3,3)= dlu0(9*k )
618 do kk1= inumfi1l(i-1)+1, inumfi1l(i)
619 if (k.eq.fi1l(kk1))
then
620 aik(1,1)= allu0(9*kk1-8)
621 aik(1,2)= allu0(9*kk1-7)
622 aik(1,3)= allu0(9*kk1-6)
623 aik(2,1)= allu0(9*kk1-5)
624 aik(2,2)= allu0(9*kk1-4)
625 aik(2,3)= allu0(9*kk1-3)
626 aik(3,1)= allu0(9*kk1-2)
627 aik(3,2)= allu0(9*kk1-1)
628 aik(3,3)= allu0(9*kk1 )
633 do jj= inu(k-1)+1, inu(k)
635 do jj1= inumfi1u(k-1)+1, inumfi1u(k)
636 if (j.eq.fi1u(jj1))
then
637 akj(1,1)= aulu0(9*jj1-8)
638 akj(1,2)= aulu0(9*jj1-7)
639 akj(1,3)= aulu0(9*jj1-6)
640 akj(2,1)= aulu0(9*jj1-5)
641 akj(2,2)= aulu0(9*jj1-4)
642 akj(2,3)= aulu0(9*jj1-3)
643 akj(3,1)= aulu0(9*jj1-2)
644 akj(3,2)= aulu0(9*jj1-1)
645 akj(3,3)= aulu0(9*jj1 )
650 call ilu1bnn (rhs_aij, dkinv, aik, akj,3)
653 dlu0(9*i-8)= dlu0(9*i-8) - rhs_aij(1,1)
654 dlu0(9*i-7)= dlu0(9*i-7) - rhs_aij(1,2)
655 dlu0(9*i-6)= dlu0(9*i-6) - rhs_aij(1,3)
656 dlu0(9*i-5)= dlu0(9*i-5) - rhs_aij(2,1)
657 dlu0(9*i-4)= dlu0(9*i-4) - rhs_aij(2,2)
658 dlu0(9*i-3)= dlu0(9*i-3) - rhs_aij(2,3)
659 dlu0(9*i-2)= dlu0(9*i-2) - rhs_aij(3,1)
660 dlu0(9*i-1)= dlu0(9*i-1) - rhs_aij(3,2)
661 dlu0(9*i )= dlu0(9*i ) - rhs_aij(3,3)
666 allu0(9*ij0-8)= allu0(9*ij0-8) - rhs_aij(1,1)
667 allu0(9*ij0-7)= allu0(9*ij0-7) - rhs_aij(1,2)
668 allu0(9*ij0-6)= allu0(9*ij0-6) - rhs_aij(1,3)
669 allu0(9*ij0-5)= allu0(9*ij0-5) - rhs_aij(2,1)
670 allu0(9*ij0-4)= allu0(9*ij0-4) - rhs_aij(2,2)
671 allu0(9*ij0-3)= allu0(9*ij0-3) - rhs_aij(2,3)
672 allu0(9*ij0-2)= allu0(9*ij0-2) - rhs_aij(3,1)
673 allu0(9*ij0-1)= allu0(9*ij0-1) - rhs_aij(3,2)
674 allu0(9*ij0 )= allu0(9*ij0 ) - rhs_aij(3,3)
679 aulu0(9*ij0-8)= aulu0(9*ij0-8) - rhs_aij(1,1)
680 aulu0(9*ij0-7)= aulu0(9*ij0-7) - rhs_aij(1,2)
681 aulu0(9*ij0-6)= aulu0(9*ij0-6) - rhs_aij(1,3)
682 aulu0(9*ij0-5)= aulu0(9*ij0-5) - rhs_aij(2,1)
683 aulu0(9*ij0-4)= aulu0(9*ij0-4) - rhs_aij(2,2)
684 aulu0(9*ij0-3)= aulu0(9*ij0-3) - rhs_aij(2,3)
685 aulu0(9*ij0-2)= aulu0(9*ij0-2) - rhs_aij(3,1)
686 aulu0(9*ij0-1)= aulu0(9*ij0-1) - rhs_aij(3,2)
687 aulu0(9*ij0 )= aulu0(9*ij0 ) - rhs_aij(3,3)
694 dlu0(9*i-8), dlu0(9*i-7), dlu0(9*i-6), &
695 dlu0(9*i-5), dlu0(9*i-4), dlu0(9*i-3), &
696 dlu0(9*i-2), dlu0(9*i-1), dlu0(9*i ))
697 dlu0(9*i-8)= dkinv(1,1)
698 dlu0(9*i-7)= dkinv(1,2)
699 dlu0(9*i-6)= dkinv(1,3)
700 dlu0(9*i-5)= dkinv(2,1)
701 dlu0(9*i-4)= dkinv(2,2)
702 dlu0(9*i-3)= dkinv(2,3)
703 dlu0(9*i-2)= dkinv(3,1)
704 dlu0(9*i-1)= dkinv(3,2)
705 dlu0(9*i )= dkinv(3,3)
708 deallocate (iw1, iw2)
710 end subroutine form_ilu1_nn
719 subroutine form_ilu2_nn &
720 & (n, ndof, np, npl, npu, d, al, inl, ial, au, inu, iau, &
723 integer(kind=kint ),
intent(in):: n, ndof, np, npu, npl
724 real (kind=
kreal),
intent(in):: sigma, sigma_diag
726 real(kind=
kreal),
dimension(9*NPL),
intent(in):: al
727 real(kind=
kreal),
dimension(9*NPU),
intent(in):: au
728 real(kind=
kreal),
dimension(9*NP ),
intent(in):: d
730 integer(kind=kint ),
dimension(0:NP) ,
intent(in) :: inu, inl
731 integer(kind=kint ),
dimension( NPL),
intent(in) :: ial
732 integer(kind=kint ),
dimension( NPU),
intent(in) :: iau
734 integer(kind=kint),
dimension(:),
allocatable:: iw1 , iw2
735 integer(kind=kint),
dimension(:),
allocatable:: iwsl, iwsu
736 integer(kind=kint),
dimension(:),
allocatable:: iconfi1l, iconfi1u
737 integer(kind=kint),
dimension(:),
allocatable:: inumfi2l, inumfi2u
738 integer(kind=kint),
dimension(:),
allocatable:: fi2l, fi2u
739 real (kind=
kreal),
dimension(3,3) :: rhs_aij, dkinv, aik, akj
740 integer(kind=kint) :: nplf1,nplf2,npuf1,npuf2,ias,iconik,iconkj,ndof2
741 integer(kind=kint) :: i,jj,ij0,kk,ik,kk1,kk2,l,isk,iek,isj,iej
742 integer(kind=kint) :: icou,icouu,icouu1,icouu2,icouu3,icoul,icoul1,icoul2,icoul3
743 integer(kind=kint) :: j,k,isl,isu
753 allocate (iw1(np) , iw2(np))
754 allocate (inumfi2l(0:np), inumfi2u(0:np))
765 do l= inl(i-1)+1, inl(i)
768 do l= inu(i-1)+1, inu(i)
780 if (iw1(jj).eq.0 .and. jj.lt.i)
then
781 inumfi2l(i)= inumfi2l(i)+1
784 if (iw1(jj).eq.0 .and. jj.gt.i)
then
785 inumfi2u(i)= inumfi2u(i)+1
790 nplf1= nplf1 + inumfi2l(i)
791 npuf1= npuf1 + inumfi2u(i)
796 allocate (iwsl(0:np), iwsu(0:np))
797 allocate (fi2l(nplf1), fi2u(npuf1))
805 inumfi2l(i)= inumfi2l(i-1) + inumfi2l(i)
806 inumfi2u(i)= inumfi2u(i-1) + inumfi2u(i)
810 do l= inl(i-1)+1, inl(i)
813 do l= inu(i-1)+1, inu(i)
825 if (iw1(jj).eq.0 .and. jj.lt.i)
then
827 fi2l(icoul+inumfi2l(i-1))= jj
830 if (iw1(jj).eq.0 .and. jj.gt.i)
then
832 fi2u(icouu+inumfi2u(i-1))= jj
845 allocate (inumfi1l(0:np), inumfi1u(0:np))
856 do l= inl(i-1)+1, inl(i)
859 do l= inu(i-1)+1, inu(i)
863 do l= inumfi2l(i-1)+1, inumfi2l(i)
867 do l= inumfi2u(i-1)+1, inumfi2u(i)
875 isj= inumfi2u(kk-1) + 1
879 if (iw1(jj).eq.0 .and. jj.lt.i)
then
880 inumfi1l(i)= inumfi1l(i) + 1
883 if (iw1(jj).eq.0 .and. jj.gt.i)
then
884 inumfi1u(i)= inumfi1u(i) + 1
898 if (iw1(jj).eq.0 .and. jj.lt.i)
then
899 inumfi1l(i)= inumfi1l(i) + 1
902 if (iw1(jj).eq.0 .and. jj.gt.i)
then
903 inumfi1u(i)= inumfi1u(i) + 1
908 nplf2= nplf2 + inumfi1l(i)
909 npuf2= npuf2 + inumfi1u(i)
914 allocate (fi1l(npl+nplf1+nplf2))
915 allocate (fi1u(npu+npuf1+npuf2))
917 allocate (iconfi1l(npl+nplf1+nplf2))
918 allocate (iconfi1u(npu+npuf1+npuf2))
923 iwsl(i)= inl(i)-inl(i-1) + inumfi2l(i)-inumfi2l(i-1) + &
924 & inumfi1l(i) + iwsl(i-1)
925 iwsu(i)= inu(i)-inu(i-1) + inumfi2u(i)-inumfi2u(i-1) + &
926 & inumfi1u(i) + iwsu(i-1)
932 inumfi1l(i)= inumfi1l(i-1) + inumfi1l(i)
933 inumfi1u(i)= inumfi1u(i-1) + inumfi1u(i)
937 do l= inl(i-1)+1, inl(i)
940 do l= inu(i-1)+1, inu(i)
944 do l= inumfi2l(i-1)+1, inumfi2l(i)
948 do l= inumfi2u(i-1)+1, inumfi2u(i)
956 isj= inumfi2u(kk-1) + 1
960 if (iw1(jj).eq.0 .and. jj.lt.i)
then
961 ias= inl(i)-inl(i-1)+inumfi2l(i)-inumfi2l(i-1)+iwsl(i-1)
966 if (iw1(jj).eq.0 .and. jj.gt.i)
then
967 ias= inu(i)-inu(i-1)+inumfi2u(i)-inumfi2u(i-1)+iwsu(i-1)
975 isk= inumfi2l(i-1) + 1
983 if (iw1(jj).eq.0 .and. jj.lt.i)
then
984 ias= inl(i)-inl(i-1)+inumfi2l(i)-inumfi2l(i-1)+iwsl(i-1)
989 if (iw1(jj).eq.0 .and. jj.gt.i)
then
990 ias= inu(i)-inu(i-1)+inumfi2u(i)-inumfi2u(i-1)+iwsu(i-1)
1005 allocate (allu0(9*(npl+nplf1+nplf2)))
1006 allocate (aulu0(9*(npu+npuf1+npuf2)))
1017 icoul1= inl(i) - inl(i-1)
1018 icoul2= inumfi2l(i) - inumfi2l(i-1) + icoul1
1019 icoul3= inumfi1l(i) - inumfi1l(i-1) + icoul2
1021 icouu1= inu(i) - inu(i-1)
1022 icouu2= inumfi2u(i) - inumfi2u(i-1) + icouu1
1023 icouu3= inumfi1u(i) - inumfi1u(i-1) + icouu2
1028 do k= inl(i-1)+1, inl(i)
1034 do k= inumfi2l(i-1)+1, inumfi2l(i)
1036 iw1(icou+icoul1)= fi2l(k)
1040 do k= inumfi1l(i-1)+1, inumfi1l(i)
1042 iw1(icou+icoul2)= fi1l(icou+icoul2+isl)
1049 call fill_in_s33_sort (iw1, iw2, icoul3, np)
1054 if (ik.le.inl(i)-inl(i-1))
then
1056 kk2= 9*(ik+inl(i-1))
1057 allu0(kk1-8)= al(kk2-8)
1058 allu0(kk1-7)= al(kk2-7)
1059 allu0(kk1-6)= al(kk2-6)
1060 allu0(kk1-5)= al(kk2-5)
1061 allu0(kk1-4)= al(kk2-4)
1062 allu0(kk1-3)= al(kk2-3)
1063 allu0(kk1-2)= al(kk2-2)
1064 allu0(kk1-1)= al(kk2-1)
1065 allu0(kk1 )= al(kk2 )
1070 do k= inl(i-1)+1, inl(i)
1076 do k= inumfi2l(i-1)+1, inumfi2l(i)
1082 do k= inumfi1l(i-1)+1, inumfi1l(i)
1088 iconfi1l(k+isl)= iw1(iw2(k))
1093 do k= inu(i-1)+1, inu(i)
1099 do k= inumfi2u(i-1)+1, inumfi2u(i)
1101 iw1(icou+icouu1)= fi2u(k)
1105 do k= inumfi1u(i-1)+1, inumfi1u(i)
1107 iw1(icou+icouu2)= fi1u(icou+icouu2+isu)
1113 call fill_in_s33_sort (iw1, iw2, icouu3, np)
1118 if (ik.le.inu(i)-inu(i-1))
then
1120 kk2= 9*(ik+inu(i-1))
1121 aulu0(kk1-8)= au(kk2-8)
1122 aulu0(kk1-7)= au(kk2-7)
1123 aulu0(kk1-6)= au(kk2-6)
1124 aulu0(kk1-5)= au(kk2-5)
1125 aulu0(kk1-4)= au(kk2-4)
1126 aulu0(kk1-3)= au(kk2-3)
1127 aulu0(kk1-2)= au(kk2-2)
1128 aulu0(kk1-1)= au(kk2-1)
1129 aulu0(kk1 )= au(kk2 )
1134 do k= inu(i-1)+1, inu(i)
1140 do k= inumfi2u(i-1)+1, inumfi2u(i)
1146 do k= inumfi1u(i-1)+1, inumfi1u(i)
1152 iconfi1u(k+isu)= iw1(iw2(k))
1160 inumfi1l(i)= iwsl(i)
1161 inumfi1u(i)= iwsu(i)
1164 deallocate (iwsl, iwsu)
1165 deallocate (inumfi2l, inumfi2u)
1166 deallocate ( fi2l, fi2u)
1173 allocate (dlu0(9*np))
1176 dlu0(9*i-8)=dlu0(9*i-8)*sigma_diag
1177 dlu0(9*i-4)=dlu0(9*i-4)*sigma_diag
1178 dlu0(9*i )=dlu0(9*i )*sigma_diag
1183 dlu0(9*i-8), dlu0(9*i-7), dlu0(9*i-6), &
1184 dlu0(9*i-5), dlu0(9*i-4), dlu0(9*i-3), &
1185 dlu0(9*i-2), dlu0(9*i-1), dlu0(9*i ))
1186 dlu0(9*i-8)= dkinv(1,1)
1187 dlu0(9*i-7)= dkinv(1,2)
1188 dlu0(9*i-6)= dkinv(1,3)
1189 dlu0(9*i-5)= dkinv(2,1)
1190 dlu0(9*i-4)= dkinv(2,2)
1191 dlu0(9*i-3)= dkinv(2,3)
1192 dlu0(9*i-2)= dkinv(3,1)
1193 dlu0(9*i-1)= dkinv(3,2)
1194 dlu0(9*i )= dkinv(3,3)
1200 do k= inumfi1l(i-1)+1, inumfi1l(i)
1204 do k= inumfi1u(i-1)+1, inumfi1u(i)
1208 do kk= inumfi1l(i-1)+1, inumfi1l(i)
1210 iconik= iconfi1l(kk)
1212 dkinv(1,1)= dlu0(9*k-8)
1213 dkinv(1,2)= dlu0(9*k-7)
1214 dkinv(1,3)= dlu0(9*k-6)
1215 dkinv(2,1)= dlu0(9*k-5)
1216 dkinv(2,2)= dlu0(9*k-4)
1217 dkinv(2,3)= dlu0(9*k-3)
1218 dkinv(3,1)= dlu0(9*k-2)
1219 dkinv(3,2)= dlu0(9*k-1)
1220 dkinv(3,3)= dlu0(9*k )
1222 aik(1,1)= allu0(9*kk-8)
1223 aik(1,2)= allu0(9*kk-7)
1224 aik(1,3)= allu0(9*kk-6)
1225 aik(2,1)= allu0(9*kk-5)
1226 aik(2,2)= allu0(9*kk-4)
1227 aik(2,3)= allu0(9*kk-3)
1228 aik(3,1)= allu0(9*kk-2)
1229 aik(3,2)= allu0(9*kk-1)
1230 aik(3,3)= allu0(9*kk )
1232 do jj= inumfi1u(k-1)+1, inumfi1u(k)
1234 iconkj= iconfi1u(jj)
1236 if ((iconik+iconkj).lt.2)
then
1237 akj(1,1)= aulu0(9*jj-8)
1238 akj(1,2)= aulu0(9*jj-7)
1239 akj(1,3)= aulu0(9*jj-6)
1240 akj(2,1)= aulu0(9*jj-5)
1241 akj(2,2)= aulu0(9*jj-4)
1242 akj(2,3)= aulu0(9*jj-3)
1243 akj(3,1)= aulu0(9*jj-2)
1244 akj(3,2)= aulu0(9*jj-1)
1245 akj(3,3)= aulu0(9*jj )
1247 call ilu1bnn (rhs_aij, dkinv, aik, akj,3)
1250 dlu0(9*i-8)= dlu0(9*i-8) - rhs_aij(1,1)
1251 dlu0(9*i-7)= dlu0(9*i-7) - rhs_aij(1,2)
1252 dlu0(9*i-6)= dlu0(9*i-6) - rhs_aij(1,3)
1253 dlu0(9*i-5)= dlu0(9*i-5) - rhs_aij(2,1)
1254 dlu0(9*i-4)= dlu0(9*i-4) - rhs_aij(2,2)
1255 dlu0(9*i-3)= dlu0(9*i-3) - rhs_aij(2,3)
1256 dlu0(9*i-2)= dlu0(9*i-2) - rhs_aij(3,1)
1257 dlu0(9*i-1)= dlu0(9*i-1) - rhs_aij(3,2)
1258 dlu0(9*i )= dlu0(9*i ) - rhs_aij(3,3)
1263 allu0(9*ij0-8)= allu0(9*ij0-8) - rhs_aij(1,1)
1264 allu0(9*ij0-7)= allu0(9*ij0-7) - rhs_aij(1,2)
1265 allu0(9*ij0-6)= allu0(9*ij0-6) - rhs_aij(1,3)
1266 allu0(9*ij0-5)= allu0(9*ij0-5) - rhs_aij(2,1)
1267 allu0(9*ij0-4)= allu0(9*ij0-4) - rhs_aij(2,2)
1268 allu0(9*ij0-3)= allu0(9*ij0-3) - rhs_aij(2,3)
1269 allu0(9*ij0-2)= allu0(9*ij0-2) - rhs_aij(3,1)
1270 allu0(9*ij0-1)= allu0(9*ij0-1) - rhs_aij(3,2)
1271 allu0(9*ij0 )= allu0(9*ij0 ) - rhs_aij(3,3)
1276 aulu0(9*ij0-8)= aulu0(9*ij0-8) - rhs_aij(1,1)
1277 aulu0(9*ij0-7)= aulu0(9*ij0-7) - rhs_aij(1,2)
1278 aulu0(9*ij0-6)= aulu0(9*ij0-6) - rhs_aij(1,3)
1279 aulu0(9*ij0-5)= aulu0(9*ij0-5) - rhs_aij(2,1)
1280 aulu0(9*ij0-4)= aulu0(9*ij0-4) - rhs_aij(2,2)
1281 aulu0(9*ij0-3)= aulu0(9*ij0-3) - rhs_aij(2,3)
1282 aulu0(9*ij0-2)= aulu0(9*ij0-2) - rhs_aij(3,1)
1283 aulu0(9*ij0-1)= aulu0(9*ij0-1) - rhs_aij(3,2)
1284 aulu0(9*ij0 )= aulu0(9*ij0 ) - rhs_aij(3,3)
1291 dlu0(9*i-8), dlu0(9*i-7), dlu0(9*i-6), &
1292 dlu0(9*i-5), dlu0(9*i-4), dlu0(9*i-3), &
1293 dlu0(9*i-2), dlu0(9*i-1), dlu0(9*i ))
1294 dlu0(9*i-8)= dkinv(1,1)
1295 dlu0(9*i-7)= dkinv(1,2)
1296 dlu0(9*i-6)= dkinv(1,3)
1297 dlu0(9*i-5)= dkinv(2,1)
1298 dlu0(9*i-4)= dkinv(2,2)
1299 dlu0(9*i-3)= dkinv(2,3)
1300 dlu0(9*i-2)= dkinv(3,1)
1301 dlu0(9*i-1)= dkinv(3,2)
1302 dlu0(9*i )= dkinv(3,3)
1305 deallocate (iw1, iw2)
1306 deallocate (iconfi1l, iconfi1u)
1308 end subroutine form_ilu2_nn
1316 subroutine fill_in_s33_sort (STEM, INUM, N, NP)
1319 integer(kind=kint) :: n, np
1320 integer(kind=kint),
dimension(NP) :: stem
1321 integer(kind=kint),
dimension(NP) :: inum
1322 integer(kind=kint),
dimension(:),
allocatable :: istack
1323 integer(kind=kint) :: m,nstack,jstack,l,ir,ip,i,j,k,ss,ii,temp,it
1325 allocate (istack(-np:+np))
1344 if (stem(i).le.ss)
goto 2
1355 if (jstack.eq.0)
then
1361 l = istack(jstack-1)
1374 if (stem(l+1).gt.stem(ir))
then
1383 if (stem(l).gt.stem(ir))
then
1392 if (stem(l+1).gt.stem(l))
then
1409 if (stem(i).lt.ss)
goto 3
1413 if (stem(j).gt.ss)
goto 4
1436 if (jstack.gt.nstack)
then
1437 write (*,*)
'NSTACK overflow'
1441 if (ir-i+1.ge.j-1)
then
1446 istack(jstack )= j-1
1455 end subroutine fill_in_s33_sort
1464 subroutine ilu1a33 (ALU, D11,D12,D13,D21,D22,D23,D31,D32,D33)
1467 real(kind=
kreal) :: alu(3,3), pw(3)
1468 real(kind=
kreal) :: d11,d12,d13,d21,d22,d23,d31,d32,d33
1469 integer(kind=kint) :: i,j,k
1482 if (alu(k,k) == 0.d0)
then
1484 stop
'ERROR: Divide by zero in ILU setup'
1486 alu(k,k)= 1.d0/alu(k,k)
1488 alu(i,k)= alu(i,k) * alu(k,k)
1490 pw(j)= alu(i,j) - alu(i,k)*alu(k,j)
1500 subroutine ilu1ann (ALU, D, NDOF)
1503 real(kind=
kreal) :: alu(ndof,ndof), d(ndof*ndof), pw(ndof)
1504 integer(kind=kint) :: NDOF, i,j,k
1508 alu(i,j) = d(ndof*(i-1)+j)
1513 if (alu(k,k) == 0.d0)
then
1514 stop
'ERROR: Divide by zero in ILU setup'
1516 alu(k,k)= 1.d0/alu(k,k)
1518 alu(i,k)= alu(i,k) * alu(k,k)
1520 pw(j)= alu(i,j) - alu(i,k)*alu(k,j)
1538 subroutine ilu1bnn (RHS_Aij, DkINV, Aik, Akj, NDOF)
1541 real(kind=
kreal) :: rhs_aij(ndof,ndof), dkinv(ndof,ndof), aik(ndof,ndof), akj(ndof,ndof)
1542 real(kind=
kreal) :: x(ndof)
1543 integer(kind=kint) :: NDOF,i,j,k
1546 x(1:ndof)= akj(1:ndof,k)
1549 x(i)=x(i)-dkinv(i,j)*x(j)
1554 x(i)=x(i)-dkinv(i,j)*x(j)
1556 x(i)=dkinv(i,i)*x(i)
1561 rhs_aij(i,k) = rhs_aij(i,k)+aik(i,j)*x(j)