22 integer(kind=kint) :: ndeg
23 integer(kind=kint) :: neqns
24 integer(kind=kint) :: nstop
25 integer(kind=kint) :: stage
26 integer(kind=kint) :: lncol
27 integer(kind=kint) :: lndsln
29 integer(kind=kint),
pointer :: zpiv(:)
30 integer(kind=kint),
pointer :: iperm(:)
31 integer(kind=kint),
pointer :: invp(:)
32 integer(kind=kint),
pointer :: parent(:)
33 integer(kind=kint),
pointer :: nch(:)
34 integer(kind=kint),
pointer :: xlnzr(:)
35 integer(kind=kint),
pointer :: colno(:)
37 real(kind=
kreal),
pointer :: diag(:,:)
38 real(kind=
kreal),
pointer :: zln(:,:)
39 real(kind=
kreal),
pointer :: dsln(:,:)
44 real(kind=
kreal),
parameter :: rmin = 1.00d-200
48 integer,
parameter :: ilog = 16
49 logical,
parameter :: ldbg = .false.
52 logical :: lelap = .false.
66 integer(kind=kint),
intent(in) :: nrows
67 integer(kind=kint),
intent(in) :: ilag_sta
68 integer(kind=kint),
intent(in) :: nttbr
69 integer(kind=kint),
intent(in) :: pointers(:)
70 integer(kind=kint),
intent(in) :: indices(:)
71 real(kind=
kreal),
intent(in) :: values(:)
74 real(kind=
kreal),
intent(inout) :: b(:)
86 integer(kind=kint),
parameter :: ndeg_prm = 1
93 integer(kind=kint) :: i,j,k,l,ii,jj,kk,ll
98 a0%neqns = ilag_sta - 1
104 do l= pointers(i), pointers(i+1)-1
106 if (j .le. a0%neqns)
then
107 a0%nttbr = a0%nttbr+1
112 allocate( a0%irow(a0%nttbr), a0%jcol(a0%nttbr), a0%val(ndeg_prm,a0%nttbr))
113 allocate( a0tmp%irow(a0%nttbr), a0tmp%jcol(a0%nttbr), a0tmp%val(ndeg_prm,a0%nttbr))
117 do l= pointers(i), pointers(i+1)-1
119 if (j .le. a0%neqns)
then
124 a0tmp%val(1,kk)=values(l)
133 if (a0tmp%jcol(k) == i)
then
135 a0%irow(kk)=a0tmp%jcol(k)
136 a0%jcol(kk)=a0tmp%irow(k)
137 a0%val(1,kk)=a0tmp%val(1,k)
143 lag%nrows = nrows - ilag_sta + 1
144 lag%ncols = ilag_sta - 1
150 do l= pointers(i), pointers(i+1)-1
152 if ((j .ge. ilag_sta) .and. (i .lt. ilag_sta) )
then
153 lag%nttbr = lag%nttbr+1
158 allocate( lag%irow(lag%nttbr), lag%jcol(lag%nttbr), lag%val(ndeg_prm,lag%nttbr))
159 allocate( lagtmp%irow(lag%nttbr), lagtmp%jcol(lag%nttbr), lagtmp%val(ndeg_prm,lag%nttbr))
163 do l= pointers(i), pointers(i+1)-1
165 if ((j .ge. ilag_sta) .and. (i .lt. ilag_sta) )
then
168 lagtmp%jcol(kk) = j - ilag_sta +1
169 lagtmp%val(1,kk)=values(l)
178 if (lagtmp%jcol(k) == i)
then
180 lag%irow(kk)=lagtmp%jcol(k)
181 lag%jcol(kk)=lagtmp%irow(k)
182 lag%val(1,kk)=lagtmp%val(1,k)
186 call hecmw_solve_direct_serial_lag_in(a0,lag, b)
193 subroutine hecmw_solve_direct_serial_lag_in(a0,lag, b)
200 real(kind=
kreal),
intent(inout) :: b(:)
202 logical,
save :: first_time = .true.
204 integer(kind=kint) :: ierr
211 call sp_direct_parent(a0,lag,b)
214 end subroutine hecmw_solve_direct_serial_lag_in
218 subroutine sp_direct_parent(a0, lag, b_in)
227 real(kind=
kreal),
intent(inout) :: b_in(:)
237 integer(kind=kint) :: neqns_a
238 integer(kind=kint) :: neqns_lag
239 real(kind=
kreal),
pointer :: dsln(:,:)
240 real(kind=
kreal),
pointer :: diag(:,:)
243 real(kind=
kreal),
allocatable :: bd(:,:)
246 real(kind=
kreal),
allocatable :: b(:,:)
247 real(kind=
kreal),
allocatable :: oldb(:,:)
248 real(kind=
kreal),
allocatable :: b_a(:)
249 real(kind=
kreal),
allocatable :: b_lag(:)
253 logical,
save :: nusol_ready = .false.
254 integer(kind=kint),
save :: ndeg, nndeg, ndegt
255 integer(kind=kint),
save :: neqns_c, iofst_a2, iofst_c, ndm
258 integer(kind=kint) :: ierr
259 integer(kind=kint) :: i,j,k,l,m,n
262 real(kind=
kreal),
pointer :: spdslnval(:,:), bdbuf(:,:)
263 integer(kind=kint),
pointer :: spdslnidx(:)
264 integer(kind=kint) :: nspdsln
268 integer(kind=kint),
pointer :: iperm_all_inc_lag(:), part_all_inc_lag(:), iperm_rev_inc_lag(:)
269 integer(kind=kint) :: child_lag_nrows, child_lag_ncols, child_lag_nttbr, offset_irow
270 integer(kind=kint) :: ii, jj
271 real(kind=
kreal),
pointer :: dsln_lag(:,:)
272 real(kind=
kreal),
pointer :: diag_lag(:,:)
273 real(kind=
kreal),
allocatable :: wk(:), wk_d(:)
274 integer(kind=kint) :: ks, ke
287 ndegt = (ndeg+1)*ndeg/2
301 neqns_lag = lag%nrows
302 allocate(dsln_lag(1,neqns_lag*(neqns_lag - 1)/2))
303 allocate(diag_lag(1,neqns_lag))
312 cm%a%neqns = a0%neqns
313 cm%a%nttbr = a0%nttbr
314 allocate(cm%a%irow(cm%a%nttbr), cm%a%jcol(cm%a%nttbr), cm%a%val(1, cm%a%nttbr))
315 cm%a%irow(:) = a0%irow(:)
316 cm%a%jcol(:) = a0%jcol(:)
317 cm%a%val(1,:) = a0%val(1,:)
321 cm%c%nttbr = lag%nttbr
322 cm%c%nrows = lag%nrows
323 cm%c%ncols = lag%ncols
324 allocate(cm%c%irow(cm%c%nttbr), cm%c%jcol(cm%c%nttbr), cm%c%val(1, cm%c%nttbr))
325 cm%c%irow(:) = lag%irow(:)
326 cm%c%jcol(:) = lag%jcol(:)
327 cm%c%val(1,:) = lag%val(1,:)
330 cm%ista_c = cm%a%neqns+1
331 cm%neqns_t = cm%a%neqns + cm%c%nrows
340 call matini_para(cm, dsi, ierr)
344 call staij1(0, cm%a%irow(i), cm%a%jcol(i), cm%a%val(:,i), dsi, ierr)
348 call staij1(0, cm%c%irow(i)+cm%a%neqns, cm%c%jcol(i), cm%c%val(:,i), dsi, ierr)
360 call nufct0_child(dsi, ierr, nspdsln, spdslnidx, spdslnval, diag_lag)
371 dsln_lag(:,spdslnidx(i)) = dsln_lag(:,spdslnidx(i)) + spdslnval(:,i)
378 call nufct0_parent(dsln_lag, diag_lag, neqns_lag, ndeg)
390 allocate(b(ndeg,a0%neqns+lag%nrows), stat=ierr)
392 call errtrp(
'stop due to allocation error.')
394 do i=1,a0%neqns+lag%nrows
399 allocate(oldb(ndeg,a0%neqns+lag%nrows), stat=ierr)
401 call errtrp(
'stop due to allocation error.')
404 oldb(ndeg,i)=b(ndeg,i)
406 do i=a0%neqns+1, a0%neqns+lag%nrows
407 oldb(ndeg,i)=b(ndeg,i)
410 allocate(b_a(neqns_a))
415 allocate(b_lag(neqns_lag))
417 b_lag(i)=b_in(neqns_a + i)
422 allocate(wk(neqns_a+neqns_lag), stat=ierr)
424 call errtrp(
'stop due to allocation error.')
429 wk(i)=b_a(dsi%iperm(i))
439 wk(i)=wk(i)-spdot2(wk,dsi%zln(1,:),dsi%colno,ks,ke)
443 allocate(wk_d(dsi%nstop:dsi%neqns), stat=ierr)
445 call errtrp(
'stop due to allocation error.')
449 do i=dsi%nstop,dsi%neqns
455 wk_d(i)=wk_d(i)-spdot2(wk,dsi%zln(1,:),dsi%colno,ks,ke)
473 b_lag(i)=b_lag(i) + wk_d(neqns_a + i)
480 call nusol1_parent(dsln_lag(1,:), diag_lag(1,:), b_lag, neqns_lag)
491 wk(i)=wk(i)*dsi%diag(1,i)
496 wk(neqns_a + i)=b_lag(i)
507 wk(j)=wk(j)-wk(i)*dsi%zln(1,k)
512 b(1,dsi%iperm(i))=wk(i)
515 b(1,neqns_a +i )=b_lag(i)
525 call verif0(ndeg, a0%neqns, a0%nttbr, a0%irow, a0%jcol, a0%val, lag%nrows, lag%nttbr, lag%irow, lag%jcol, lag%val, oldb, b)
527 do i=1,a0%neqns+lag%nrows
532 deallocate(spdslnidx, spdslnval)
533 deallocate(dsln_lag, diag_lag)
535 deallocate(b, oldb, b_a, b_lag)
537 deallocate(cm%a%irow, cm%a%jcol, cm%a%val)
538 deallocate(cm%c%irow, cm%c%jcol, cm%c%val)
540 deallocate(dsi%iperm)
542 deallocate(dsi%parent)
544 deallocate(dsi%xlnzr)
545 deallocate(dsi%colno)
551 end subroutine sp_direct_parent
555 subroutine errtrp(mes)
560 end subroutine errtrp
564 subroutine matini_para(cm,dsi,ir)
603 type(dsinfo),
intent(out) :: dsi
604 integer(kind=kint),
intent(out) :: ir
606 integer(kind=kint),
pointer :: irow_a(:), jcol_a(:)
607 integer(kind=kint),
pointer :: irow_c(:), jcol_c(:)
609 integer(kind=kint),
pointer :: ia(:)
610 integer(kind=kint),
pointer :: ja(:)
611 integer(kind=kint),
pointer :: jcpt(:)
612 integer(kind=kint),
pointer :: jcolno(:)
614 integer(kind=kint),
pointer :: iperm_a(:)
615 integer(kind=kint),
pointer :: invp_a(:)
617 integer(kind=kint),
pointer :: xlnzr_a(:)
618 integer(kind=kint),
pointer :: colno_a(:)
620 integer(kind=kint),
pointer :: xlnzr_c(:)
621 integer(kind=kint),
pointer :: colno_c(:)
624 integer(kind=kint),
pointer :: adjncy(:)
625 integer(kind=kint),
pointer :: qlink(:)
626 integer(kind=kint),
pointer :: qsize(:)
627 integer(kind=kint),
pointer :: nbrhd(:)
628 integer(kind=kint),
pointer :: rchset(:)
630 integer(kind=kint),
pointer :: cstr(:)
632 integer(kind=kint),
pointer :: adjt(:)
633 integer(kind=kint),
pointer :: anc(:)
635 integer(kind=kint),
pointer :: lwk3arr(:)
636 integer(kind=kint),
pointer :: lwk2arr(:)
637 integer(kind=kint),
pointer :: lwk1arr(:)
638 integer(kind=kint),
pointer :: lbtreearr(:,:)
639 integer(kind=kint),
pointer :: lleafarr(:)
640 integer(kind=kint),
pointer :: lxleafarr(:)
641 integer(kind=kint),
pointer :: ladparr(:)
642 integer(kind=kint),
pointer :: lpordrarr(:)
644 integer(kind=kint) :: neqns_a, nttbr_a, neqns_a1, nstop, neqns_t, neqns_d, nttbr_c, ndeg
645 integer(kind=kint) :: lncol_a, lncol_c
646 integer(kind=kint) :: neqnsz, nofsub, izz, izz0, lnleaf
647 integer(kind=kint) :: ir1
648 integer(kind=kint) :: i, j, k , ipass, ks, ke, ierr
674 allocate(dsi%zpiv(neqns_a), stat=ierr)
676 call errtrp(
'stop due to allocation error.')
678 call zpivot(neqns_a,neqnsz,nttbr_a,jcol_a,irow_a,dsi%zpiv,ir1)
686 allocate(jcpt(2*nttbr_a), jcolno(2*nttbr_a), stat=ierr)
688 call errtrp(
'stop due to allocation error.')
690 call stsmat(neqns_a,nttbr_a,irow_a,jcol_a,jcpt,jcolno)
694 allocate(ia(neqns_a1), ja(2*nttbr_a), stat=ierr)
696 call errtrp(
'stop due to allocation error.')
698 call stiaja(neqns_a, neqns_a,ia,ja,jcpt,jcolno)
704 allocate(iperm_a(neqns_a), invp_a(neqns_a), stat=ierr)
706 call errtrp(
'stop due to allocation error.')
708 call idntty(neqns_a,invp_a,iperm_a)
711 allocate(adjncy(2*nttbr_a),qlink(neqns_a1),qsize(neqns_a1),nbrhd(neqns_a1),rchset(neqns_a1), stat=ierr)
713 call errtrp(
'stop due to allocation error.')
715 allocate(lwk2arr(neqns_a1),lwk1arr(neqns_a1), stat=ierr)
717 call errtrp(
'stop due to allocation error.')
719 call genqmd(neqns_a,ia,ja,iperm_a,invp_a,lwk1arr,lwk2arr,rchset,nbrhd,qsize,qlink,nofsub,adjncy)
720 deallocate(adjncy, qlink, qsize, nbrhd, rchset)
723 call stiaja(neqns_a, neqns_a, ia, ja, jcpt,jcolno)
727 allocate(cstr(neqns_a1),adjt(neqns_a1), stat=ierr)
729 call errtrp(
'stop due to allocation error.')
732 call genpaq(ia,ja,invp_a,iperm_a,lwk2arr,neqns_a,cstr)
735 allocate (lbtreearr(2,neqns_a1), stat=ierr)
737 call errtrp(
'stop due to allocation error.')
739 call genbtq(ia, ja, invp_a, iperm_a,lwk2arr,lbtreearr,dsi%zpiv,izz,neqns_a)
743 if(izz0.eq.0) izz0=izz
744 if(izz0.ne.izz)
goto 30
745 call rotate(ia, ja, invp_a, iperm_a, lwk2arr,lbtreearr,izz,neqns_a,anc,adjt,ir1)
748 call bringu(dsi%zpiv,iperm_a, invp_a, lwk2arr,izz,neqns_a,ir1)
753 allocate(lwk3arr(0:neqns_a1),lpordrarr(neqns_a1),dsi%parent(neqns_a1), dsi%nch(neqns_a1), stat=ierr)
755 call errtrp(
'stop due to allocation error.')
757 call posord(dsi%parent,lbtreearr,invp_a,iperm_a,lpordrarr,dsi%nch,neqns_a,lwk1arr,lwk2arr,lwk3arr)
760 allocate(lleafarr(nttbr_a),lxleafarr(neqns_a1),ladparr(neqns_a1), stat=ierr)
762 call errtrp(
'stop due to allocation error.')
764 call gnleaf(ia, ja, invp_a, iperm_a, lpordrarr,dsi%nch,ladparr,lxleafarr,lleafarr,neqns_a,lnleaf)
768 call countclno(dsi%parent, lxleafarr, lleafarr, neqns_a, nstop, lncol_a, ir1)
769 allocate(colno_a(lncol_a),xlnzr_a(neqns_a1), stat=ierr)
771 call errtrp(
'stop due to allocation error.')
773 call gnclno(dsi%parent,lpordrarr,lxleafarr,lleafarr,xlnzr_a, colno_a, neqns_a, nstop,lncol_a,ir1)
780 call ldudecomposec(xlnzr_a,colno_a,invp_a,iperm_a, ndeg, nttbr_c, irow_c, &
781 jcol_c, cm%c%ncols, cm%c%nrows, xlnzr_c, colno_c, lncol_c)
784 allocate(dsi%xlnzr(neqns_t + 1), stat=ierr)
786 call errtrp(
'stop due to allocation error.')
788 dsi%xlnzr(1:neqns_a)=xlnzr_a(:)
789 dsi%xlnzr(neqns_a+1:neqns_t+1)=xlnzr_c(:)+xlnzr_a(neqns_a+1)-1
791 dsi%lncol=lncol_a + lncol_c
792 allocate(dsi%colno(lncol_a + lncol_c), stat=ierr)
794 call errtrp(
'stop due to allocation error.')
798 dsi%colno(i)=colno_a(i)
801 dsi%colno(lncol_a + i)=colno_c(i)
804 allocate(dsi%invp(neqns_t), dsi%iperm(neqns_t), stat=ierr)
806 call errtrp(
'stop due to allocation error.')
808 dsi%invp(1:neqns_a)=invp_a(1:neqns_a)
809 dsi%iperm(1:neqns_a)=iperm_a(1:neqns_a)
810 do i=neqns_a+1,neqns_t
815 deallocate(xlnzr_a, colno_a, xlnzr_c, colno_c, invp_a, iperm_a)
822 end subroutine matini_para
826 subroutine nufct0_child(dsi,ir, nspdsln, spdslnidx, spdslnval, diag_lag)
829 type(dsinfo),
intent(inout) :: dsi
830 integer(kind=kint),
intent(out) :: ir
832 integer(kind=kint),
intent(inout) :: nspdsln
833 real(kind=
kreal),
pointer :: spdslnval(:,:), bdbuf(:,:)
834 integer(kind=kint),
pointer :: spdslnidx(:)
836 real(kind=
kreal),
intent(inout) :: diag_lag(:,:)
842 if(dsi%stage.ne.20)
then
848 if(dsi%ndeg.eq.1)
then
849 call nufct1_child(dsi%xlnzr,dsi%colno,dsi%zln,dsi%diag,dsi%neqns,dsi%parent,dsi%nch,dsi%nstop,ir, &
850 nspdsln, spdslnidx, spdslnval, diag_lag)
851 else if(dsi%ndeg.eq.2)
then
852 write(idbg,*)
'ndeg=1 only'
854 else if(dsi%ndeg.eq.3)
then
855 write(idbg,*)
'ndeg=1 only'
857 else if(dsi%ndeg.eq.6)
then
858 write(idbg,*)
'ndeg=1 only'
861 write(idbg,*)
'ndeg=1 only'
868 end subroutine nufct0_child
872 subroutine nufct1_child(xlnzr,colno,zln,diag,neqns,parent,nch,nstop,ir, nspdsln, spdslnidx, spdslnval, diag_lag)
875 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),parent(:)
876 integer(kind=kint),
intent(in) :: neqns, nstop, ir
877 integer(kind=kint),
intent(out) :: nch(:)
878 real(kind=
kreal),
intent(out) :: zln(:,:),diag(:,:)
880 integer(kind=kint) :: neqns_c
881 integer(kind=kint) :: i,j,k,l, ic,ierr,imp
882 integer(kind=kint) :: nspdsln
883 integer(kind=kint),
pointer :: spdslnidx(:)
884 real(kind=
kreal),
pointer :: spdslnval(:,:)
885 real(kind=
kreal),
intent(out) :: diag_lag(:,:)
904 diag(1,1)=1.0d0/diag(1,1)
909 call sum(ic,xlnzr,colno,zln(1,:),diag(1,:),nch,parent,neqns)
916 do 200 ic=nstop,neqns
917 call sum1(ic,xlnzr,colno,zln(1,:),diag(1,:),parent,neqns)
930 neqns_c = neqns - nstop + 1
931 call sum2_child(neqns,nstop,xlnzr,colno,zln(1,:),diag(1,:),spdslnidx,spdslnval,nspdsln)
940 diag_lag(1,i) = diag(1,nstop+i-1)
944 end subroutine nufct1_child
950 subroutine nufct0_parent(dsln, diag, neqns, ndeg)
955 real(kind=
kreal),
intent(inout) :: dsln(:,:)
956 real(kind=
kreal),
intent(inout) :: diag(:,:)
957 integer(kind=kint),
intent(in) :: neqns, ndeg
959 integer(kind=kint) :: ndegl
961 if (ndeg .eq. 1)
then
962 call sum3(neqns, dsln(1,:), diag(1,:))
963 else if (ndeg .eq. 3)
then
964 write(idbg,*)
'ndeg=1 only'
967 write(idbg,*)
'ndeg=1 only'
972 end subroutine nufct0_parent
976 subroutine nusol0_parent(dsln, diag, b, neqns, ndeg)
981 real(kind=
kreal),
intent(in) :: dsln(:,:)
982 real(kind=
kreal),
intent(in) :: diag(:,:)
983 real(kind=
kreal),
intent(inout) :: b(:,:)
985 integer(kind=kint),
intent(in) :: neqns, ndeg
987 if (ndeg .eq. 1)
then
988 call nusol1_parent(dsln(1,:), diag(1,:), b(1,:), neqns)
989 else if (ndeg .eq. 3)
then
990 write(idbg,*)
'ndeg=1 only'
993 write(idbg,*)
'ndeg=1 only'
998 end subroutine nusol0_parent
1002 subroutine nusol1_parent(dsln, diag, b, neqns)
1009 real(kind=
kreal),
intent(in) :: dsln(:)
1010 real(kind=
kreal),
intent(in) :: diag(:)
1011 real(kind=
kreal),
intent(inout) :: b(:)
1012 integer(kind=kint),
intent(in) :: neqns
1014 integer(kind=kint) :: i,j,k,l,loc
1019 b(i)=b(i)-dot_product(b(1:i-1),dsln(k:k+i-2))
1027 loc=(neqns-1)*neqns/2
1030 b(j)=b(j)-b(i)*dsln(loc)
1036 end subroutine nusol1_parent
1043 subroutine zpivot(neqns,neqnsz,nttbr,jcol,irow,zpiv,ir)
1047 integer(kind=kint),
intent(in) :: jcol(:),irow(:)
1048 integer(kind=kint),
intent(out) :: zpiv(:)
1049 integer(kind=kint),
intent(in) :: neqns,nttbr
1050 integer(kind=kint),
intent(out) :: neqnsz,ir
1052 integer(kind=kint) :: i,j,k,l
1062 if(i.le.0.or.j.le.0)
then
1065 elseif(i.gt.neqns.or.j.gt.neqns)
then
1069 if(i.eq.j) zpiv(i)=0
1073 if(zpiv(i).eq.0)
then
1080 if(ldbg)
write(idbg,*)
'# zpivot ########################'
1081 if(ldbg)
write(idbg,60) (zpiv(i),i=1,neqns)
1084 end subroutine zpivot
1088 subroutine stsmat(neqns,nttbr,irow,jcol,jcpt,jcolno)
1092 integer(kind=kint),
intent(in) :: irow(:), jcol(:)
1093 integer(kind=kint),
intent(out) :: jcpt(:), jcolno(:)
1094 integer(kind=kint),
intent(in) :: neqns, nttbr
1096 integer(kind=kint) :: i,j,k,l,loc,locr
1115 if(loc.eq.0)
goto 120
1116 if(jcolno(loc).eq.j)
then
1118 elseif(jcolno(loc).gt.j)
then
1138 if(loc.eq.0)
goto 170
1139 if(jcolno(loc).eq.i)
then
1141 elseif(jcolno(loc).gt.i)
then
1159 write(idbg,*)
'jcolno'
1160 write(idbg,60) (jcolno(i),i=1,k)
1161 write(idbg,*)
'jcpt'
1162 write(idbg,60) (jcpt(i),i=1,k)
1166 end subroutine stsmat
1169 subroutine stiaja(neqns,neqnsz,ia,ja,jcpt,jcolno)
1175 integer(kind=kint),
intent(in) :: jcpt(:),jcolno(:)
1176 integer(kind=kint),
intent(out) :: ia(:),ja(:)
1177 integer(kind=kint),
intent(in) :: neqns, neqnsz
1179 integer(kind=kint) :: i,j,k,l,ii,loc
1187 if(loc.eq.0)
goto 120
1189 if(ii.eq.k.or.ii.gt.neqnsz)
goto 130
1198 write(idbg,*)
'stiaja(): ia '
1199 write(idbg,60) (ia(i),i=1,neqns+1)
1200 write(idbg,*)
'stiaja(): ja '
1201 write(idbg,60) (ja(i),i=1,ia(neqns+1))
1205 end subroutine stiaja
1209 subroutine idntty(neqns,invp,iperm)
1213 integer(kind=kint),
intent(out) :: invp(:),iperm(:)
1214 integer(kind=kint),
intent(in) :: neqns
1216 integer(kind=kint) :: i
1227 subroutine genqmd(neqns,xadj,adj0,perm,invp,deg,marker,rchset,nbrhd,qsize,qlink,nofsub,adjncy)
1231 integer(kind=kint),
intent(in) :: adj0(:),xadj(:)
1232 integer(kind=kint),
intent(out) :: rchset(:),nbrhd(:),adjncy(:),perm(:),invp(:),deg(:),marker(:),qsize(:),qlink(:)
1233 integer(kind=kint),
intent(in) :: neqns
1234 integer(kind=kint),
intent(out) :: nofsub
1236 integer(kind=kint) :: inode,ip,irch,mindeg,nhdsze,node,np,num,nump1,nxnode,rchsze,search,thresh,ndeg
1237 integer(kind=kint) :: i,j,k,l
1241 do 10 i=1,xadj(neqns+1)-1
1250 ndeg=xadj(node+1)-xadj(node)
1252 if(ndeg.lt.mindeg) mindeg=ndeg
1260 if(nump1.gt.search) search=nump1
1261 do 400 j=search,neqns
1263 if(marker(node).lt.0)
goto 400
1265 if(ndeg.le.thresh)
goto 500
1266 if(ndeg.lt.mindeg) mindeg=ndeg
1271 nofsub=nofsub+deg(node)
1273 call qmdrch(node,xadj,adjncy,deg,marker,rchsze,rchset,nhdsze,nbrhd)
1283 nxnode=qlink(nxnode)
1284 if(nxnode.gt.0)
goto 600
1285 if(rchsze.le.0)
goto 800
1287 call qmdupd(xadj,adjncy,rchsze,rchset,deg,qsize,qlink,marker,rchset(rchsze+1:),nbrhd(nhdsze+1:))
1289 do 700 irch=1,rchsze
1291 if(marker(inode).lt.0)
goto 700
1294 if(ndeg.lt.mindeg) mindeg=ndeg
1295 if(ndeg.gt.thresh)
goto 700
1300 if(nhdsze.gt.0)
call qmdot(node,xadj,adjncy,marker,rchsze,rchset,nbrhd)
1301 800
if(num.lt.neqns)
goto 300
1303 end subroutine genqmd
1307 subroutine genpaq(xadj,adjncy,invp,iperm,parent,neqns,ancstr)
1311 integer(kind=kint),
intent(in) :: xadj(:),adjncy(:),invp(:),iperm(:)
1312 integer(kind=kint),
intent(out) :: parent(:),ancstr(:)
1313 integer(kind=kint),
intent(in) :: neqns
1315 integer(kind=kint) :: i,j,k,l,ip,it
1321 do 110 k=xadj(ip),xadj(ip+1)-1
1325 if(ancstr(l).eq.0)
goto 111
1326 if(ancstr(l).eq.i)
goto 110
1337 if(parent(i).eq.0) parent(i)=neqns+1
1340 if(ldbg)
write(idbg,6010)
1341 if(ldbg)
write(idbg,6000) (i,parent(i),i=1,neqns)
1343 6010
format(
' parent')
1345 end subroutine genpaq
1349 subroutine genbtq(xadj,adjncy,invp,iperm,parent,btree,zpiv,izz,neqns)
1353 integer(kind=kint),
intent(in) :: xadj(:),adjncy(:),parent(:),invp(:),iperm(:),zpiv(:)
1354 integer(kind=kint),
intent(out) :: btree(:,:)
1355 integer(kind=kint),
intent(in) :: neqns
1356 integer(kind=kint),
intent(out) :: izz
1358 integer(kind=kint) :: i,j,k,l,ip,ib,inext
1366 if(ip.le.0)
goto 100
1385 if(zpiv(i).ne.0)
then
1386 if(btree(1,invp(i)).eq.0)
then
1394 if(ldbg)
write(idbg,6010)
1395 if(ldbg)
write(idbg,6000) (i,btree(1,i),btree(2,i),i=1,neqns)
1396 if(ldbg)
write(idbg,6020) izz
1399 6000
format(i6,
'(',2i6,
')')
1400 6010
format(
' binary tree')
1401 6020
format(
' the first zero pivot is ',i4)
1404 end subroutine genbtq
1408 subroutine rotate(xadj,adjncy,invp,iperm,parent,btree,izz,neqns,anc,adjt,irr)
1412 integer(kind=kint),
intent(in) :: xadj(:),adjncy(:),parent(:),btree(:,:)
1413 integer(kind=kint),
intent(out) :: anc(:),adjt(:),invp(:),iperm(:)
1414 integer(kind=kint),
intent(in) :: neqns,izz
1415 integer(kind=kint),
intent(out) :: irr
1417 integer(kind=kint) :: i,j,k,l,izzz,nanc,loc,locc,ll,kk,iy
1430 if(btree(1,izzz).ne.0)
then
1444 if(loc.ne.0)
goto 100
1458 if(locc.ne.0)
goto 220
1460 do 240 k=xadj(iperm(loc)),xadj(iperm(loc)+1)-1
1461 adjt(invp(adjncy(k)))=1
1463 if(loc.ge.anc(l))
goto 250
1465 if(locc.ne.0)
goto 220
1470 if(adjt(anc(ll)).eq.0)
then
1490 if(adjt(ll).eq.0)
then
1504 if(locc.ne.0)
goto 350
1506 do 370 kk=xadj(iperm(loc)),xadj(iperm(loc)+1)-1
1507 adjt(invp(adjncy(kk)))=1
1509 if(loc.ge.iy)
goto 380
1511 if(locc.ne.0)
goto 350
1516 if(adjt(anc(ll)).eq.0)
then
1518 invp(iperm(anc(ll)))=k
1523 if(adjt(anc(ll)).ne.0)
then
1525 invp(iperm(anc(ll)))=k
1535 if(i.eq.izzz)
goto 510
1539 invp(iperm(izzz))=neqns
1547 if(ldbg)
write(idbg,6000) (invp(i),i=1,neqns)
1550 end subroutine rotate
1554 subroutine bringu(zpiv,iperm,invp,parent,izz,neqns,irr)
1558 integer(kind=kint),
intent(in) :: zpiv(:),parent(:)
1559 integer(kind=kint),
intent(out) :: iperm(:),invp(:)
1560 integer(kind=kint),
intent(in) :: neqns,izz
1561 integer(kind=kint),
intent(out) :: irr
1563 integer(kind=kint) :: i,j,k,l,ib0,ib,ibp,izzp
1581 if(ib.le.0)
goto 1000
1584 if(zpiv(izzp).eq.0)
goto 110
1594 if(invp(iperm(i)).ne.i)
goto 210
1595 if(iperm(invp(i)).ne.i)
goto 210
1599 write(20,*)
'permutation error'
1606 end subroutine bringu
1610 subroutine posord(parent,btree,invp,iperm,pordr,nch,neqns,iw,qarent,mch)
1614 integer(kind=kint),
intent(in) :: btree(:,:),qarent(:)
1615 integer(kind=kint),
intent(out) :: pordr(:),invp(:),iperm(:),nch(:),iw(:),parent(:),mch(0:neqns+1)
1616 integer(kind=kint),
intent(in) :: neqns
1618 integer(kind=kint) :: i,j,k,l,locc,loc,locp,invpos,ipinv,ii
1629 if(locc.ne.0)
goto 10
1631 mch(locp)=mch(locp)+1
1634 if(l.ge.neqns)
goto 1000
1637 if(locc.ne.0)
goto 10
1640 mch(locp)=mch(locp)+mch(loc)+1
1644 ipinv=pordr(invp(i))
1653 if(ii.gt.0.and.ii.le.neqns)
then
1656 parent(i)=qarent(invpos)
1659 if(ldbg)
write(idbg,6020)
1660 if(ldbg)
write(idbg,6000) (pordr(i),i=1,neqns)
1661 if(ldbg)
write(idbg,6030)
1662 if(ldbg)
write(idbg,6050)
1663 if(ldbg)
write(idbg,6000) (parent(i),i=1,neqns)
1664 if(ldbg)
write(idbg,6000) (invp(i),i=1,neqns)
1665 if(ldbg)
write(idbg,6040)
1666 if(ldbg)
write(idbg,6000) (iperm(i),i=1,neqns)
1667 if(ldbg)
write(idbg,6010)
1668 if(ldbg)
write(idbg,6000) (nch(i),i=1,neqns)
1671 6020
format(
' post order')
1672 6030
format(/
' invp ')
1673 6040
format(/
' iperm ')
1674 6050
format(/
' parent')
1676 end subroutine posord
1680 subroutine gnleaf(xadj,adjncy,invp,iperm,pordr,nch,adjncp,xleaf,leaf,neqns,lnleaf)
1684 integer(kind=kint),
intent(in) :: xadj(:),adjncy(:),pordr(:),nch(:),invp(:),iperm(:)
1685 integer(kind=kint),
intent(out) :: xleaf(:),leaf(:),adjncp(:)
1686 integer(kind=kint),
intent(in) :: neqns
1688 integer(kind=kint) i,j,k,l,m,n,ik,istart,ip,iq,lnleaf,lc1,lc
1696 do 105 k=xadj(ip),xadj(ip+1)-1
1705 call qqsort(adjncp(istart+1:),m)
1706 lc1=adjncp(istart+1)
1707 if(lc1.ge.i)
goto 100
1710 do 130 k=istart+2,ik
1713 if(lc1.lt.lc-nch(lc))
then
1726 if(ldbg)
write(idbg,6020)
1727 if(ldbg)
write(idbg,6000) (xleaf(i),i=1,neqns+1)
1728 if(ldbg)
write(idbg,6010) lnleaf
1729 if(ldbg)
write(idbg,6000) (leaf(i),i=1,lnleaf)
1732 6010
format(
' leaf (len = ',i6,
')')
1733 6020
format(
' xleaf')
1734 end subroutine gnleaf
1738 subroutine countclno(parent,xleaf,leaf,neqns,nstop,lncol,ir)
1748 integer(kind=kint),
intent(in) :: parent(:),xleaf(:),leaf(:)
1749 integer(kind=kint),
intent(in) :: neqns, nstop
1750 integer(kind=kint),
intent(out) :: lncol, ir
1752 integer(kind=kint) :: i,j,k,l,nc,ks,ke,nxleaf
1760 if(ke.lt.ks)
goto 100
1766 if(j.ge.nxleaf)
goto 110
1776 if(j.ge.nstop)
goto 100
1777 if(j.ge.i.or.j.eq.0)
goto 100
1784 end subroutine countclno
1788 subroutine gnclno(parent,pordr,xleaf,leaf,xlnzr,colno,neqns,nstop,lncol,ir)
1792 integer(kind=kint),
intent(in) :: parent(:),pordr(:),xleaf(:),leaf(:)
1793 integer(kind=kint),
intent(out) :: colno(:),xlnzr(:)
1794 integer(kind=kint),
intent(in) :: neqns, nstop
1795 integer(kind=kint),
intent(out) :: lncol,ir
1797 integer(kind=kint) :: i,j,k,l,nc,ks,ke,nxleaf
1806 if(ke.lt.ks)
goto 100
1812 if(j.ge.nxleaf)
goto 110
1823 if(j.ge.nstop)
goto 100
1824 if(j.ge.i.or.j.eq.0)
goto 100
1832 if(ldbg)
write(idbg,6010)
1834 if(ldbg)
write(idbg,6020) lncol
1838 write(idbg,6000) (colno(i),i=xlnzr(k),xlnzr(k+1)-1)
1842 6010
format(
' xlnzr')
1843 6020
format(
' colno (lncol =',i10,
')')
1844 6100
format(/
' row = ',i6)
1846 end subroutine gnclno
1850 subroutine qmdrch(root,xadj,adjncy,deg,marker,rchsze,rchset,nhdsze,nbrhd)
1854 integer(kind=kint),
intent(in) :: deg(:),xadj(:),adjncy(:)
1855 integer(kind=kint),
intent(out) :: rchset(:),marker(:),nbrhd(:)
1856 integer(kind=kint),
intent(in) :: root
1857 integer(kind=kint),
intent(out) :: nhdsze,rchsze
1859 integer(kind=kint) :: i,j,k,l, istrt, istop, jstrt, jstop, nabor, node
1864 istop=xadj(root+1)-1
1865 if(istop.lt.istrt)
return
1866 do 600 i=istrt,istop
1868 if(nabor.eq.0)
return
1869 if(marker(nabor).ne.0)
goto 600
1870 if(deg(nabor).lt.0)
goto 200
1872 rchset(rchsze)=nabor
1875 200 marker(nabor)=-1
1878 300 jstrt=xadj(nabor)
1879 jstop=xadj(nabor+1)-1
1880 do 500 j=jstrt,jstop
1883 if(node) 300,600,400
1884 400
if(marker(node).ne.0)
goto 500
1891 end subroutine qmdrch
1895 subroutine qmdupd(xadj,adjncy,nlist,list,deg,qsize,qlink,marker,rchset,nbrhd)
1899 integer(kind=kint),
intent(in) :: adjncy(:),list(:),xadj(:)
1900 integer(kind=kint),
intent(out) :: marker(:),nbrhd(:),rchset(:),deg(:),qsize(:),qlink(:)
1901 integer(kind=kint),
intent(in) :: nlist
1903 integer(kind=kint) :: i,j,k,l, deg0,deg1,il,inhd,inode,irch,jstrt,jstop,mark,nabor,nhdsze,node,rchsze
1905 if(nlist.le.0)
return
1910 deg0=deg0+qsize(node)
1912 jstop=xadj(node+1)-1
1914 do 100 j=jstrt,jstop
1916 if(marker(nabor).ne.0.or.deg(nabor).ge.0)
goto 100
1923 if(nhdsze.gt.0)
call qmdmrg(xadj,adjncy,deg,qsize,qlink,marker,deg0,nhdsze,nbrhd,rchset,nbrhd(nhdsze+1:))
1927 if(mark.gt.1.or.mark.lt.0)
goto 600
1928 call qmdrch(node,xadj,adjncy,deg,marker,rchsze,rchset,nhdsze,nbrhd)
1930 if(rchsze.le.0)
goto 400
1931 do 300 irch=1,rchsze
1933 deg1=deg1+qsize(inode)
1936 400 deg(node)=deg1-1
1937 if(nhdsze.le.0)
goto 600
1938 do 500 inhd=1,nhdsze
1944 end subroutine qmdupd
1948 subroutine qmdot(root,xadj,adjncy,marker,rchsze,rchset,nbrhd)
1952 integer(kind=kint),
intent(in) :: marker(:),rchset(:),nbrhd(:),xadj(:)
1953 integer(kind=kint),
intent(out) :: adjncy(:)
1954 integer(kind=kint),
intent(in) :: rchsze,root
1956 integer(kind=kint) :: i,j,k,l,irch,inhd,node,jstrt,jstop,link,nabor
1961 100 jstrt=xadj(node)
1962 jstop=xadj(node+1)-2
1963 if(jstop.lt.jstrt)
goto 300
1964 do 200 j=jstrt,jstop
1966 adjncy(j)=rchset(irch)
1967 if(irch.ge.rchsze)
goto 400
1969 300 link=adjncy(jstop+1)
1971 if(link.lt.0)
goto 100
1974 adjncy(jstop+1)=-node
1977 do 600 irch=1,rchsze
1979 if(marker(node).lt.0)
goto 600
1981 jstop=xadj(node+1)-1
1982 do 500 j=jstrt,jstop
1984 if(marker(nabor).ge.0)
goto 500
1990 end subroutine qmdot
1994 subroutine qmdmrg(xadj,adjncy,deg,qsize,qlink,marker,deg0,nhdsze,nbrhd,rchset,ovrlp)
1998 integer(kind=kint),
intent(in) :: adjncy(:),nbrhd(:),xadj(:)
1999 integer(kind=kint),
intent(out) :: deg(:),marker(:),rchset(:),ovrlp(:),qsize(:),qlink(:)
2000 integer(kind=kint),
intent(in) :: nhdsze
2002 integer(kind=kint) :: i,j,k,l, deg0,deg1,head,inhd,iov,irch,jstrt,jstop,link,lnode,mark,mrgsze,nabor,node,novrlp,rchsze,root
2005 if(nhdsze.le.0)
return
2006 do 100 inhd=1,nhdsze
2010 do 1400 inhd=1,nhdsze
2016 200 jstrt=xadj(root)
2017 jstop=xadj(root+1)-1
2018 do 600 j=jstrt,jstop
2021 if(nabor) 200,700,300
2022 300 mark=marker(nabor)
2025 rchset(rchsze)=nabor
2026 deg1=deg1+qsize(nabor)
2029 500
if(mark.gt.1)
goto 600
2036 do 1100 iov=1,novrlp
2039 jstop=xadj(node+1)-1
2040 do 800 j=jstrt,jstop
2042 if(marker(nabor).ne.0)
goto 800
2046 mrgsze=mrgsze+qsize(node)
2049 900 link=qlink(lnode)
2050 if(link.le.0)
goto 1000
2053 1000 qlink(lnode)=head
2056 if(head.le.0)
goto 1200
2058 deg(head)=deg0+deg1-1
2060 1200 root=nbrhd(inhd)
2062 if(rchsze.le.0)
goto 1400
2063 do 1300 irch=1,rchsze
2069 end subroutine qmdmrg
2073 subroutine ldudecomposec(xlnzr_a,colno_a,invp_a,iperm_a,ndeg,nttbr_c,irow_c,jcol_c,ncol,nrow,xlnzr_c,colno_c,lncol_c)
2079 integer(kind=kint),
intent(in) :: xlnzr_a(:)
2080 integer(kind=kint),
intent(in) :: colno_a(:)
2081 integer(kind=kint),
intent(in) :: iperm_a(:)
2082 integer(kind=kint),
intent(in) :: invp_a(:)
2083 integer(kind=kint),
intent(in) :: ndeg
2084 integer(kind=kint),
intent(in) :: nttbr_c
2085 integer(kind=kint),
intent(in) :: irow_c(:)
2086 integer(kind=kint),
intent(inout) :: jcol_c(:)
2087 integer(kind=kint),
intent(in) :: ncol
2088 integer(kind=kint),
intent(in) :: nrow
2091 integer(kind=kint),
pointer :: xlnzr_c(:)
2092 integer(kind=kint),
pointer :: colno_c(:)
2093 integer(kind=kint),
intent(out) :: lncol_c
2096 integer(kind=kint) :: i,j,k,l,m,n
2097 integer(kind=kint) :: ks, ke, ipass, ierr
2098 logical,
allocatable :: cnz(:)
2099 type(crs_matrix) :: crs_c
2103 jcol_c(i)=invp_a(jcol_c(i))
2110 allocate(cnz(ncol), stat=ierr)
2111 if(ierr .ne. 0)
then
2112 call errtrp(
'stop due to allocation error.')
2120 ke = crs_c%ia(k+1)-1
2121 if (ke .lt. ks)
then
2122 if (ipass .eq. 2)
then
2123 xlnzr_c(k+1)=lncol_c+1
2129 cnz(crs_c%ja(i)) = .true.
2136 if (ke .lt. ks)
then
2140 if (cnz(colno_a(j)))
then
2149 lncol_c = lncol_c + 1
2150 if (ipass .eq. 2)
then
2151 colno_c(lncol_c) = i
2155 if (ipass .eq. 2)
then
2156 xlnzr_c(k+1)=lncol_c + 1
2160 if (ipass .eq. 1)
then
2161 allocate(xlnzr_c(nrow+1),colno_c(lncol_c), stat=ierr)
2162 if(ierr .ne. 0)
then
2163 call errtrp(
'stop due to allocation error.')
2171 jcol_c(i)=iperm_a(jcol_c(i))
2176 end subroutine ldudecomposec
2184 integer(kind=kint),
intent(out) :: iw(:)
2185 integer(kind=kint),
intent(in) :: ik
2187 integer(kind=kint) :: l,m,itemp
2201 if(iw(l).lt.iw(m))
goto 110
2214 subroutine staij1(isw,i,j,aij,dsi,ir)
2238 real(kind=
kreal),
intent(out) :: aij(:)
2239 integer(kind=kint),
intent(in) :: isw, i, j
2240 integer(kind=kint),
intent(out) :: ir
2242 integer(kind=kint) :: ndeg, neqns, nstop, ndeg2, ndeg2l, ierr
2247 ndeg2l=ndeg*(ndeg+1)/2
2254 if(dsi%stage.ne.20)
then
2255 if(dsi%stage.eq.30)
write(ilog,*)
'Warning a matrix was build up but never solved.'
2259 allocate(dsi%diag(ndeg2l,neqns), stat=ierr)
2260 if(ierr .ne. 0)
then
2261 call errtrp(
'stop due to allocation error.')
2267 allocate(dsi%zln(ndeg2,dsi%lncol), stat=ierr)
2268 if(ierr .ne. 0)
then
2269 call errtrp(
'stop due to allocation error.')
2283 call addr0(isw,i,j,aij,dsi%invp,dsi%xlnzr,dsi%colno,dsi%diag,dsi%zln,dsi%dsln,nstop,dsi%ndeg,ir)
2284 elseif(ndeg.eq.3)
then
2285 write(idbg,*)
'ndeg=1 only'
2288 write(idbg,*)
'ndeg=1 only'
2293 end subroutine staij1
2302 subroutine sum(ic,xlnzr,colno,zln,diag,nch,par,neqns)
2306 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),par(:)
2307 integer(kind=kint),
intent(in) :: ic, neqns
2308 real(kind=
kreal),
intent(inout) :: zln(:),diag(:)
2309 integer(kind=kint),
intent(out) :: nch(:)
2311 real(kind=
kreal) :: s, t, zz, piv
2312 integer(kind=kint) :: ks, ke, kk, k, jc, jj, j, ierr
2313 integer(kind=kint) :: isem
2314 real(kind=
kreal),
allocatable :: temp(:)
2315 integer(kind=kint),
allocatable :: indx(:)
2316 allocate(temp(neqns),indx(neqns), stat=ierr)
2317 if(ierr .ne. 0)
then
2318 call errtrp(
'stop due to allocation error.')
2332 do 310 jj=xlnzr(jc),xlnzr(jc+1)-1
2334 if(indx(j).eq.ic)
then
2348 if(dabs(piv).gt.rmin)
then
2367 subroutine sum1(ic,xlnzr,colno,zln,diag,par,neqns)
2371 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),par(:)
2372 integer(kind=kint),
intent(in) :: ic, neqns
2373 real(kind=
kreal),
intent(inout) :: zln(:),diag(:)
2375 real(kind=
kreal) :: s, t, zz
2376 integer(kind=kint) :: ks, ke, k, jc, j, jj, ierr
2377 real(kind=
kreal),
allocatable :: temp(:)
2378 integer(kind=kint),
allocatable :: indx(:)
2379 integer(kind=kint) :: i
2383 allocate(temp(neqns),indx(neqns), stat=ierr)
2384 if(ierr .ne. 0)
then
2385 call errtrp(
'stop due to allocation error.')
2402 do 310 jj=xlnzr(jc),xlnzr(jc+1)-1
2404 if(indx(j).eq.ic)
then
2423 subroutine sum2_child(neqns,nstop,xlnzr,colno,zln,diag,spdslnidx,spdslnval,nspdsln)
2427 integer(kind=kint),
intent(in) :: neqns, nstop
2428 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:)
2429 real(kind=
kreal),
intent(inout) :: zln(:),diag(:)
2430 integer(kind=kint),
pointer :: spdslnidx(:)
2431 real(kind=
kreal),
pointer :: spdslnval(:,:)
2432 integer(kind=kint),
intent(out) :: nspdsln
2434 real(kind=
kreal) :: s, t
2435 integer(kind=kint) :: ks, ke, kk, k, jc, jj, j, j1,j2
2436 integer(kind=kint) :: ic, i, loc, ierr
2437 integer(kind=kint) :: ispdsln
2439 real(kind=
kreal),
allocatable :: temp(:)
2440 integer(kind=kint),
allocatable :: indx(:)
2442 allocate(temp(neqns),indx(neqns), stat=ierr)
2443 if(ierr .ne. 0)
then
2444 call errtrp(
'stop due to allocation error.')
2459 do jj=xlnzr(jc),xlnzr(jc+1)-1
2461 if(indx(j).eq.ic)
then
2468 allocate(spdslnidx(nspdsln),spdslnval(1,nspdsln), stat=ierr)
2469 if(ierr .ne. 0)
then
2470 call errtrp(
'stop due to allocation error.')
2477 do 100 ic=nstop,neqns
2486 zln(k)=temp(jj)*diag(jj)
2488 diag(ic)=diag(ic)-temp(jj)*zln(k)
2490 do 120 jc=nstop,ic-1
2492 do 220 jj=xlnzr(jc),xlnzr(jc+1)-1
2494 if(indx(j).eq.ic)
then
2499 spdslnidx(ispdsln)=loc
2500 spdslnval(1,ispdsln)=spdslnval(1,ispdsln)-temp(j)*zln(jj)
2510 end subroutine sum2_child
2514 subroutine sum3(n,dsln,diag)
2518 real(kind=
kreal),
intent(inout) :: dsln(:),diag(:)
2519 integer(kind=kint),
intent(in) :: n
2521 integer(kind=kint) :: i, j, loc, ierr
2522 real(kind=
kreal),
allocatable :: temp(:)
2523 integer(kind=kint),
allocatable :: indx(:)
2524 allocate(temp(n),indx(n), stat=ierr)
2525 if(ierr .ne. 0)
then
2526 call errtrp(
'stop due to allocation error.')
2529 if(n.le.0)
goto 1000
2532 diag(1)=1.0d0/diag(1)
2536 dsln(loc)=dsln(loc)-dot_product(dsln(indx(i):indx(i)+j-2),dsln(indx(j):indx(j)+j-2))
2539 temp(1:i-1)=dsln(indx(i):indx(i)+i-2)*diag(1:i-1)
2540 diag(i)=diag(i)-dot_product(temp(1:i-1),dsln(indx(i):indx(i)+i-2))
2541 dsln(indx(i):indx(i)+i-2)=temp(1:i-1)
2542 diag(i)=1.0d0/diag(i)
2551 real(kind=
kreal)
function spdot2(b,zln,colno,ks,ke)
2555 integer(kind=kint),
intent(in) :: colno(:)
2556 integer(kind=kint),
intent(in) :: ks,ke
2557 real(kind=
kreal),
intent(in) :: zln(:),b(:)
2559 integer(kind=kint) :: j,jj
2560 real(kind=
kreal) :: s
2581 real(kind=
kreal)
function ddot(a,b,n)
2585 real(kind=
kreal),
intent(in) :: a(n),b(n)
2586 integer(kind=kint),
intent(in) :: n
2588 real(kind=
kreal) :: s
2589 integer(kind=kint) :: i
2601 subroutine addr0(isw,i,j,aij,invp,xlnzr,colno,diag,zln,dsln,nstop,ndeg,ir)
2605 integer(kind=kint),
intent(in) :: isw
2606 integer(kind=kint),
intent(in) :: i,j,nstop, ndeg, invp(:),xlnzr(:),colno(:)
2607 real(kind=
kreal),
intent(inout) :: zln(:,:),diag(:,:),dsln(:,:),aij(:)
2608 integer(kind=kint),
intent(out) :: ir
2610 integer(kind=kint) :: ndeg2, ii, jj, itrans, k, i0, j0, l, ks, ke
2611 integer(kind=kint),
parameter :: idbg=0
2617 if(idbg.ne.0)
write(idbg,*)
'addr0',ii,jj,aij
2623 diag(1,ii)=diag(1,ii)+aij(1)
2625 elseif(ndeg2.eq.4)
then
2631 diag(1,ii)=diag(1,ii)+aij(1)
2632 diag(2,ii)=diag(2,ii)+aij(2)
2633 diag(3,ii)=diag(3,ii)+aij(4)
2645 if(jj.ge.nstop)
then
2652 elseif(ndeg2.eq.4)
then
2653 if(itrans.eq.0)
then
2670 if(colno(k).eq.jj)
then
2674 elseif(ndeg2.eq.4)
then
2675 if(itrans.eq.0)
then
2688 zln(1,k)=zln(1,k)+aij(1)
2689 elseif(ndeg2.eq.4)
then
2690 if(itrans.eq.0)
then
2692 zln(l,k)=zln(l,k)+aij(l)
2695 zln(1,k)=zln(1,k)+aij(1)
2696 zln(2,k)=zln(2,k)+aij(3)
2697 zln(3,k)=zln(3,k)+aij(2)
2698 zln(4,k)=zln(4,k)+aij(4)
2708 end subroutine addr0
2711 subroutine vcopy(a,c,n)
2714 integer(kind=kint) :: n
2715 real(kind=
kreal) :: a(n),c(n)
2721 end subroutine vcopy
2725 subroutine verif0(ndeg,neqns_a0,nttbr_a0,irow_a0,jcol_a0,val_a0,neqns_l,nttbr_l,irow_l,jcol_l,val_l,rhs,x)
2729 integer(kind=kint),
intent(in) :: ndeg
2731 integer(kind=kint),
intent(in) :: irow_a0(:),jcol_a0(:)
2732 integer(kind=kint),
intent(in) :: neqns_a0,nttbr_a0
2733 real(kind=
kreal),
intent(in) :: val_a0(:,:)
2734 integer(kind=kint),
intent(in) :: irow_l(:),jcol_l(:)
2735 integer(kind=kint),
intent(in) :: neqns_l,nttbr_l
2736 real(kind=
kreal),
intent(in) :: val_l(:,:)
2738 real(kind=
kreal),
intent(in) :: x(:,:)
2739 real(kind=
kreal),
intent(out) :: rhs(:,:)
2741 integer(kind=kint) :: i,j,k,l,m
2742 real(kind=
kreal) :: rel,err
2766 do 10 i=1,neqns_a0+neqns_l
2768 rel=rel+dabs(rhs(l,i))
2777 rhs(l,i)=rhs(l,i)-val_a0(1,k)*x(m,j)
2778 if(i.ne.j) rhs(l,j)=rhs(l,j)-val_a0(1,k)*x(m,i)
2785 i=irow_l(k)+neqns_a0
2789 rhs(l,i)=rhs(l,i)-val_l(1,k)*x(m,j)
2790 if(i.ne.j) rhs(l,j)=rhs(l,j)-val_l(1,k)*x(m,i)
2796 do 200 i=1,neqns_a0 + neqns_l
2798 err=err+dabs(rhs(l,i))
2801 write(imsg,6000) err,rel,err/rel
2802 6000
format(
' ***verification***(symmetric)'/&
2803 &
'norm(Ax-b) = ',1pd20.10/&
2804 &
'norm(b) = ',1pd20.10/&
2805 &
'norm(Ax-b)/norm(b) = ',1pd20.10)
2806 6010
format(1p4d15.7)