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)
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
979 subroutine nusol1_parent(dsln, diag, b, neqns)
986 real(kind=
kreal),
intent(in) :: dsln(:)
987 real(kind=
kreal),
intent(in) :: diag(:)
988 real(kind=
kreal),
intent(inout) :: b(:)
989 integer(kind=kint),
intent(in) :: neqns
991 integer(kind=kint) :: i,j,k,l,loc
996 b(i)=b(i)-dot_product(b(1:i-1),dsln(k:k+i-2))
1004 loc=(neqns-1)*neqns/2
1007 b(j)=b(j)-b(i)*dsln(loc)
1013 end subroutine nusol1_parent
1020 subroutine zpivot(neqns,neqnsz,nttbr,jcol,irow,zpiv,ir)
1024 integer(kind=kint),
intent(in) :: jcol(:),irow(:)
1025 integer(kind=kint),
intent(out) :: zpiv(:)
1026 integer(kind=kint),
intent(in) :: neqns,nttbr
1027 integer(kind=kint),
intent(out) :: neqnsz,ir
1029 integer(kind=kint) :: i,j,k,l
1039 if(i.le.0.or.j.le.0)
then
1042 elseif(i.gt.neqns.or.j.gt.neqns)
then
1046 if(i.eq.j) zpiv(i)=0
1050 if(zpiv(i).eq.0)
then
1057 if(ldbg)
write(idbg,*)
'# zpivot ########################'
1058 if(ldbg)
write(idbg,60) (zpiv(i),i=1,neqns)
1061 end subroutine zpivot
1065 subroutine stsmat(neqns,nttbr,irow,jcol,jcpt,jcolno)
1069 integer(kind=kint),
intent(in) :: irow(:), jcol(:)
1070 integer(kind=kint),
intent(out) :: jcpt(:), jcolno(:)
1071 integer(kind=kint),
intent(in) :: neqns, nttbr
1073 integer(kind=kint) :: i,j,k,l,loc,locr
1092 if(loc.eq.0)
goto 120
1093 if(jcolno(loc).eq.j)
then
1095 elseif(jcolno(loc).gt.j)
then
1115 if(loc.eq.0)
goto 170
1116 if(jcolno(loc).eq.i)
then
1118 elseif(jcolno(loc).gt.i)
then
1136 write(idbg,*)
'jcolno'
1137 write(idbg,60) (jcolno(i),i=1,k)
1138 write(idbg,*)
'jcpt'
1139 write(idbg,60) (jcpt(i),i=1,k)
1143 end subroutine stsmat
1146 subroutine stiaja(neqns,neqnsz,ia,ja,jcpt,jcolno)
1152 integer(kind=kint),
intent(in) :: jcpt(:),jcolno(:)
1153 integer(kind=kint),
intent(out) :: ia(:),ja(:)
1154 integer(kind=kint),
intent(in) :: neqns, neqnsz
1156 integer(kind=kint) :: i,j,k,l,ii,loc
1164 if(loc.eq.0)
goto 120
1166 if(ii.eq.k.or.ii.gt.neqnsz)
goto 130
1175 write(idbg,*)
'stiaja(): ia '
1176 write(idbg,60) (ia(i),i=1,neqns+1)
1177 write(idbg,*)
'stiaja(): ja '
1178 write(idbg,60) (ja(i),i=1,ia(neqns+1))
1182 end subroutine stiaja
1186 subroutine idntty(neqns,invp,iperm)
1190 integer(kind=kint),
intent(out) :: invp(:),iperm(:)
1191 integer(kind=kint),
intent(in) :: neqns
1193 integer(kind=kint) :: i
1200 end subroutine idntty
1204 subroutine genqmd(neqns,xadj,adj0,perm,invp,deg,marker,rchset,nbrhd,qsize,qlink,nofsub,adjncy)
1208 integer(kind=kint),
intent(in) :: adj0(:),xadj(:)
1209 integer(kind=kint),
intent(out) :: rchset(:),nbrhd(:),adjncy(:),perm(:),invp(:),deg(:),marker(:),qsize(:),qlink(:)
1210 integer(kind=kint),
intent(in) :: neqns
1211 integer(kind=kint),
intent(out) :: nofsub
1213 integer(kind=kint) :: inode,ip,irch,mindeg,nhdsze,node,np,num,nump1,nxnode,rchsze,search,thresh,ndeg
1214 integer(kind=kint) :: i,j,k,l
1218 do i=1,xadj(neqns+1)-1
1227 ndeg=xadj(node+1)-xadj(node)
1229 if(ndeg.lt.mindeg) mindeg=ndeg
1237 if(nump1.gt.search) search=nump1
1238 do 400 j=search,neqns
1240 if(marker(node).lt.0)
goto 400
1242 if(ndeg.le.thresh)
goto 500
1243 if(ndeg.lt.mindeg) mindeg=ndeg
1248 nofsub=nofsub+deg(node)
1250 call qmdrch(node,xadj,adjncy,deg,marker,rchsze,rchset,nhdsze,nbrhd)
1260 nxnode=qlink(nxnode)
1261 if(nxnode.gt.0)
goto 600
1262 if(rchsze.le.0)
goto 800
1264 call qmdupd(xadj,adjncy,rchsze,rchset,deg,qsize,qlink,marker,rchset(rchsze+1:),nbrhd(nhdsze+1:))
1266 do 700 irch=1,rchsze
1268 if(marker(inode).lt.0)
goto 700
1271 if(ndeg.lt.mindeg) mindeg=ndeg
1272 if(ndeg.gt.thresh)
goto 700
1277 if(nhdsze.gt.0)
call qmdot(node,xadj,adjncy,marker,rchsze,rchset,nbrhd)
1278 800
if(num.lt.neqns)
goto 300
1280 end subroutine genqmd
1284 subroutine genpaq(xadj,adjncy,invp,iperm,parent,neqns,ancstr)
1288 integer(kind=kint),
intent(in) :: xadj(:),adjncy(:),invp(:),iperm(:)
1289 integer(kind=kint),
intent(out) :: parent(:),ancstr(:)
1290 integer(kind=kint),
intent(in) :: neqns
1292 integer(kind=kint) :: i,j,k,l,ip,it
1298 do 110 k=xadj(ip),xadj(ip+1)-1
1302 if(ancstr(l).eq.0)
goto 111
1303 if(ancstr(l).eq.i)
goto 110
1314 if(parent(i).eq.0) parent(i)=neqns+1
1317 if(ldbg)
write(idbg,6010)
1318 if(ldbg)
write(idbg,6000) (i,parent(i),i=1,neqns)
1320 6010
format(
' parent')
1322 end subroutine genpaq
1326 subroutine genbtq(xadj,adjncy,invp,iperm,parent,btree,zpiv,izz,neqns)
1330 integer(kind=kint),
intent(in) :: xadj(:),adjncy(:),parent(:),invp(:),iperm(:),zpiv(:)
1331 integer(kind=kint),
intent(out) :: btree(:,:)
1332 integer(kind=kint),
intent(in) :: neqns
1333 integer(kind=kint),
intent(out) :: izz
1335 integer(kind=kint) :: i,j,k,l,ip,ib,inext
1343 if(ip.le.0)
goto 100
1362 if(zpiv(i).ne.0)
then
1363 if(btree(1,invp(i)).eq.0)
then
1371 if(ldbg)
write(idbg,6010)
1372 if(ldbg)
write(idbg,6000) (i,btree(1,i),btree(2,i),i=1,neqns)
1373 if(ldbg)
write(idbg,6020) izz
1376 6000
format(i6,
'(',2i6,
')')
1377 6010
format(
' binary tree')
1378 6020
format(
' the first zero pivot is ',i4)
1381 end subroutine genbtq
1385 subroutine rotate(xadj,adjncy,invp,iperm,parent,btree,izz,neqns,anc,adjt,irr)
1389 integer(kind=kint),
intent(in) :: xadj(:),adjncy(:),parent(:),btree(:,:)
1390 integer(kind=kint),
intent(out) :: anc(:),adjt(:),invp(:),iperm(:)
1391 integer(kind=kint),
intent(in) :: neqns,izz
1392 integer(kind=kint),
intent(out) :: irr
1394 integer(kind=kint) :: i,j,k,l,izzz,nanc,loc,locc,ll,kk,iy
1407 if(btree(1,izzz).ne.0)
then
1421 if(loc.ne.0)
goto 100
1435 if(locc.ne.0)
goto 220
1437 do k=xadj(iperm(loc)),xadj(iperm(loc)+1)-1
1438 adjt(invp(adjncy(k)))=1
1440 if(loc.ge.anc(l))
goto 250
1442 if(locc.ne.0)
goto 220
1447 if(adjt(anc(ll)).eq.0)
then
1467 if(adjt(ll).eq.0)
then
1481 if(locc.ne.0)
goto 350
1483 do kk=xadj(iperm(loc)),xadj(iperm(loc)+1)-1
1484 adjt(invp(adjncy(kk)))=1
1486 if(loc.ge.iy)
goto 380
1488 if(locc.ne.0)
goto 350
1493 if(adjt(anc(ll)).eq.0)
then
1495 invp(iperm(anc(ll)))=k
1500 if(adjt(anc(ll)).ne.0)
then
1502 invp(iperm(anc(ll)))=k
1512 if(i.eq.izzz)
goto 510
1516 invp(iperm(izzz))=neqns
1524 if(ldbg)
write(idbg,6000) (invp(i),i=1,neqns)
1527 end subroutine rotate
1531 subroutine bringu(zpiv,iperm,invp,parent,izz,neqns,irr)
1535 integer(kind=kint),
intent(in) :: zpiv(:),parent(:)
1536 integer(kind=kint),
intent(out) :: iperm(:),invp(:)
1537 integer(kind=kint),
intent(in) :: neqns,izz
1538 integer(kind=kint),
intent(out) :: irr
1540 integer(kind=kint) :: i,j,k,l,ib0,ib,ibp,izzp
1558 if(ib.le.0)
goto 1000
1561 if(zpiv(izzp).eq.0)
goto 110
1571 if(invp(iperm(i)).ne.i)
goto 210
1572 if(iperm(invp(i)).ne.i)
goto 210
1576 write(20,*)
'permutation error'
1583 end subroutine bringu
1587 subroutine posord(parent,btree,invp,iperm,pordr,nch,neqns,iw,qarent,mch)
1591 integer(kind=kint),
intent(in) :: btree(:,:),qarent(:)
1592 integer(kind=kint),
intent(out) :: pordr(:),invp(:),iperm(:),nch(:),iw(:),parent(:),mch(0:neqns+1)
1593 integer(kind=kint),
intent(in) :: neqns
1595 integer(kind=kint) :: i,j,k,l,locc,loc,locp,invpos,ipinv,ii
1606 if(locc.ne.0)
goto 10
1608 mch(locp)=mch(locp)+1
1611 if(l.ge.neqns)
goto 1000
1614 if(locc.ne.0)
goto 10
1617 mch(locp)=mch(locp)+mch(loc)+1
1621 ipinv=pordr(invp(i))
1630 if(ii.gt.0.and.ii.le.neqns)
then
1633 parent(i)=qarent(invpos)
1636 if(ldbg)
write(idbg,6020)
1637 if(ldbg)
write(idbg,6000) (pordr(i),i=1,neqns)
1638 if(ldbg)
write(idbg,6030)
1639 if(ldbg)
write(idbg,6050)
1640 if(ldbg)
write(idbg,6000) (parent(i),i=1,neqns)
1641 if(ldbg)
write(idbg,6000) (invp(i),i=1,neqns)
1642 if(ldbg)
write(idbg,6040)
1643 if(ldbg)
write(idbg,6000) (iperm(i),i=1,neqns)
1644 if(ldbg)
write(idbg,6010)
1645 if(ldbg)
write(idbg,6000) (nch(i),i=1,neqns)
1648 6020
format(
' post order')
1649 6030
format(/
' invp ')
1650 6040
format(/
' iperm ')
1651 6050
format(/
' parent')
1653 end subroutine posord
1657 subroutine gnleaf(xadj,adjncy,invp,iperm,pordr,nch,adjncp,xleaf,leaf,neqns,lnleaf)
1661 integer(kind=kint),
intent(in) :: xadj(:),adjncy(:),pordr(:),nch(:),invp(:),iperm(:)
1662 integer(kind=kint),
intent(out) :: xleaf(:),leaf(:),adjncp(:)
1663 integer(kind=kint),
intent(in) :: neqns
1665 integer(kind=kint) i,j,k,l,m,n,ik,istart,ip,iq,lnleaf,lc1,lc
1673 do k=xadj(ip),xadj(ip+1)-1
1682 call qqsort(adjncp(istart+1:),m)
1683 lc1=adjncp(istart+1)
1684 if(lc1.ge.i)
goto 100
1690 if(lc1.lt.lc-nch(lc))
then
1703 if(ldbg)
write(idbg,6020)
1704 if(ldbg)
write(idbg,6000) (xleaf(i),i=1,neqns+1)
1705 if(ldbg)
write(idbg,6010) lnleaf
1706 if(ldbg)
write(idbg,6000) (leaf(i),i=1,lnleaf)
1709 6010
format(
' leaf (len = ',i6,
')')
1710 6020
format(
' xleaf')
1711 end subroutine gnleaf
1715 subroutine countclno(parent,xleaf,leaf,neqns,nstop,lncol,ir)
1725 integer(kind=kint),
intent(in) :: parent(:),xleaf(:),leaf(:)
1726 integer(kind=kint),
intent(in) :: neqns, nstop
1727 integer(kind=kint),
intent(out) :: lncol, ir
1729 integer(kind=kint) :: i,j,k,l,nc,ks,ke,nxleaf
1737 if(ke.lt.ks)
goto 100
1743 if(j.ge.nxleaf)
goto 110
1753 if(j.ge.nstop)
goto 100
1754 if(j.ge.i.or.j.eq.0)
goto 100
1761 end subroutine countclno
1765 subroutine gnclno(parent,pordr,xleaf,leaf,xlnzr,colno,neqns,nstop,lncol,ir)
1769 integer(kind=kint),
intent(in) :: parent(:),pordr(:),xleaf(:),leaf(:)
1770 integer(kind=kint),
intent(out) :: colno(:),xlnzr(:)
1771 integer(kind=kint),
intent(in) :: neqns, nstop
1772 integer(kind=kint),
intent(out) :: lncol,ir
1774 integer(kind=kint) :: i,j,k,l,nc,ks,ke,nxleaf
1783 if(ke.lt.ks)
goto 100
1789 if(j.ge.nxleaf)
goto 110
1800 if(j.ge.nstop)
goto 100
1801 if(j.ge.i.or.j.eq.0)
goto 100
1809 if(ldbg)
write(idbg,6010)
1811 if(ldbg)
write(idbg,6020) lncol
1815 write(idbg,6000) (colno(i),i=xlnzr(k),xlnzr(k+1)-1)
1819 6010
format(
' xlnzr')
1820 6020
format(
' colno (lncol =',i10,
')')
1821 6100
format(/
' row = ',i6)
1823 end subroutine gnclno
1827 subroutine qmdrch(root,xadj,adjncy,deg,marker,rchsze,rchset,nhdsze,nbrhd)
1831 integer(kind=kint),
intent(in) :: deg(:),xadj(:),adjncy(:)
1832 integer(kind=kint),
intent(out) :: rchset(:),marker(:),nbrhd(:)
1833 integer(kind=kint),
intent(in) :: root
1834 integer(kind=kint),
intent(out) :: nhdsze,rchsze
1836 integer(kind=kint) :: i,j,k,l, istrt, istop, jstrt, jstop, nabor, node
1841 istop=xadj(root+1)-1
1842 if(istop.lt.istrt)
return
1843 do 600 i=istrt,istop
1845 if(nabor.eq.0)
return
1846 if(marker(nabor).ne.0)
goto 600
1847 if(deg(nabor).lt.0)
goto 200
1849 rchset(rchsze)=nabor
1852 200 marker(nabor)=-1
1855 300 jstrt=xadj(nabor)
1856 jstop=xadj(nabor+1)-1
1857 do 500 j=jstrt,jstop
1863 elseif(node==0)
then
1866 400
if(marker(node).ne.0)
goto 500
1873 end subroutine qmdrch
1877 subroutine qmdupd(xadj,adjncy,nlist,list,deg,qsize,qlink,marker,rchset,nbrhd)
1881 integer(kind=kint),
intent(in) :: adjncy(:),list(:),xadj(:)
1882 integer(kind=kint),
intent(out) :: marker(:),nbrhd(:),rchset(:),deg(:),qsize(:),qlink(:)
1883 integer(kind=kint),
intent(in) :: nlist
1885 integer(kind=kint) :: i,j,k,l, deg0,deg1,il,inhd,inode,irch,jstrt,jstop,mark,nabor,nhdsze,node,rchsze
1887 if(nlist.le.0)
return
1892 deg0=deg0+qsize(node)
1894 jstop=xadj(node+1)-1
1896 do 100 j=jstrt,jstop
1898 if(marker(nabor).ne.0.or.deg(nabor).ge.0)
goto 100
1905 if(nhdsze.gt.0)
call qmdmrg(xadj,adjncy,deg,qsize,qlink,marker,deg0,nhdsze,nbrhd,rchset,nbrhd(nhdsze+1:))
1909 if(mark.gt.1.or.mark.lt.0)
goto 600
1910 call qmdrch(node,xadj,adjncy,deg,marker,rchsze,rchset,nhdsze,nbrhd)
1912 if(rchsze.le.0)
goto 400
1915 deg1=deg1+qsize(inode)
1918 400 deg(node)=deg1-1
1919 if(nhdsze.le.0)
goto 600
1926 end subroutine qmdupd
1930 subroutine qmdot(root,xadj,adjncy,marker,rchsze,rchset,nbrhd)
1934 integer(kind=kint),
intent(in) :: marker(:),rchset(:),nbrhd(:),xadj(:)
1935 integer(kind=kint),
intent(out) :: adjncy(:)
1936 integer(kind=kint),
intent(in) :: rchsze,root
1938 integer(kind=kint) :: i,j,k,l,irch,inhd,node,jstrt,jstop,link,nabor
1943 100 jstrt=xadj(node)
1944 jstop=xadj(node+1)-2
1945 if(jstop.lt.jstrt)
goto 300
1948 adjncy(j)=rchset(irch)
1949 if(irch.ge.rchsze)
goto 400
1951 300 link=adjncy(jstop+1)
1953 if(link.lt.0)
goto 100
1956 adjncy(jstop+1)=-node
1959 do 600 irch=1,rchsze
1961 if(marker(node).lt.0)
goto 600
1963 jstop=xadj(node+1)-1
1964 do 500 j=jstrt,jstop
1966 if(marker(nabor).ge.0)
goto 500
1972 end subroutine qmdot
1976 subroutine qmdmrg(xadj,adjncy,deg,qsize,qlink,marker,deg0,nhdsze,nbrhd,rchset,ovrlp)
1980 integer(kind=kint),
intent(in) :: adjncy(:),nbrhd(:),xadj(:)
1981 integer(kind=kint),
intent(out) :: deg(:),marker(:),rchset(:),ovrlp(:),qsize(:),qlink(:)
1982 integer(kind=kint),
intent(in) :: nhdsze
1984 integer(kind=kint) :: i,j,k,l, deg0,deg1,head,inhd,iov,irch,jstrt,jstop,link,lnode,mark,mrgsze,nabor,node,novrlp,rchsze,root
1987 if(nhdsze.le.0)
return
1992 do 1400 inhd=1,nhdsze
1998 200 jstrt=xadj(root)
1999 jstop=xadj(root+1)-1
2000 do 600 j=jstrt,jstop
2006 elseif(nabor==0)
then
2009 300 mark=marker(nabor)
2017 rchset(rchsze)=nabor
2018 deg1=deg1+qsize(nabor)
2021 500
if(mark.gt.1)
goto 600
2028 do 1100 iov=1,novrlp
2031 jstop=xadj(node+1)-1
2032 do 800 j=jstrt,jstop
2034 if(marker(nabor).ne.0)
goto 800
2038 mrgsze=mrgsze+qsize(node)
2041 900 link=qlink(lnode)
2042 if(link.le.0)
goto 1000
2045 1000 qlink(lnode)=head
2048 if(head.le.0)
goto 1200
2050 deg(head)=deg0+deg1-1
2052 1200 root=nbrhd(inhd)
2054 if(rchsze.le.0)
goto 1400
2061 end subroutine qmdmrg
2065 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)
2071 integer(kind=kint),
intent(in) :: xlnzr_a(:)
2072 integer(kind=kint),
intent(in) :: colno_a(:)
2073 integer(kind=kint),
intent(in) :: iperm_a(:)
2074 integer(kind=kint),
intent(in) :: invp_a(:)
2075 integer(kind=kint),
intent(in) :: ndeg
2076 integer(kind=kint),
intent(in) :: nttbr_c
2077 integer(kind=kint),
intent(in) :: irow_c(:)
2078 integer(kind=kint),
intent(inout) :: jcol_c(:)
2079 integer(kind=kint),
intent(in) :: ncol
2080 integer(kind=kint),
intent(in) :: nrow
2083 integer(kind=kint),
pointer :: xlnzr_c(:)
2084 integer(kind=kint),
pointer :: colno_c(:)
2085 integer(kind=kint),
intent(out) :: lncol_c
2088 integer(kind=kint) :: i,j,k,l,m,n
2089 integer(kind=kint) :: ks, ke, ipass, ierr
2090 logical,
allocatable :: cnz(:)
2091 type(crs_matrix) :: crs_c
2095 jcol_c(i)=invp_a(jcol_c(i))
2102 allocate(cnz(ncol), stat=ierr)
2103 if(ierr .ne. 0)
then
2104 call errtrp(
'stop due to allocation error.')
2112 ke = crs_c%ia(k+1)-1
2113 if (ke .lt. ks)
then
2114 if (ipass .eq. 2)
then
2115 xlnzr_c(k+1)=lncol_c+1
2121 cnz(crs_c%ja(i)) = .true.
2128 if (ke .lt. ks)
then
2132 if (cnz(colno_a(j)))
then
2141 lncol_c = lncol_c + 1
2142 if (ipass .eq. 2)
then
2143 colno_c(lncol_c) = i
2147 if (ipass .eq. 2)
then
2148 xlnzr_c(k+1)=lncol_c + 1
2152 if (ipass .eq. 1)
then
2153 allocate(xlnzr_c(nrow+1),colno_c(lncol_c), stat=ierr)
2154 if(ierr .ne. 0)
then
2155 call errtrp(
'stop due to allocation error.')
2163 jcol_c(i)=iperm_a(jcol_c(i))
2168 end subroutine ldudecomposec
2176 integer(kind=kint),
intent(out) :: iw(:)
2177 integer(kind=kint),
intent(in) :: ik
2179 integer(kind=kint) :: l,m,itemp
2193 if(iw(l).lt.iw(m))
goto 110
2206 subroutine staij1(isw,i,j,aij,dsi,ir)
2230 real(kind=
kreal),
intent(out) :: aij(:)
2231 integer(kind=kint),
intent(in) :: isw, i, j
2232 integer(kind=kint),
intent(out) :: ir
2234 integer(kind=kint) :: ndeg, neqns, nstop, ndeg2, ndeg2l, ierr
2239 ndeg2l=ndeg*(ndeg+1)/2
2246 if(dsi%stage.ne.20)
then
2247 if(dsi%stage.eq.30)
write(ilog,*)
'Warning a matrix was build up but never solved.'
2251 allocate(dsi%diag(ndeg2l,neqns), stat=ierr)
2252 if(ierr .ne. 0)
then
2253 call errtrp(
'stop due to allocation error.')
2259 allocate(dsi%zln(ndeg2,dsi%lncol), stat=ierr)
2260 if(ierr .ne. 0)
then
2261 call errtrp(
'stop due to allocation error.')
2275 call addr0(isw,i,j,aij,dsi%invp,dsi%xlnzr,dsi%colno,dsi%diag,dsi%zln,dsi%dsln,nstop,dsi%ndeg,ir)
2276 elseif(ndeg.eq.3)
then
2277 write(idbg,*)
'ndeg=1 only'
2280 write(idbg,*)
'ndeg=1 only'
2285 end subroutine staij1
2294 subroutine sum(ic,xlnzr,colno,zln,diag,nch,par,neqns)
2298 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),par(:)
2299 integer(kind=kint),
intent(in) :: ic, neqns
2300 real(kind=
kreal),
intent(inout) :: zln(:),diag(:)
2301 integer(kind=kint),
intent(out) :: nch(:)
2303 real(kind=
kreal) :: s, t, zz, piv
2304 integer(kind=kint) :: ks, ke, kk, k, jc, jj, j, ierr
2305 integer(kind=kint) :: isem
2306 real(kind=
kreal),
allocatable :: temp(:)
2307 integer(kind=kint),
allocatable :: indx(:)
2308 allocate(temp(neqns),indx(neqns), stat=ierr)
2309 if(ierr .ne. 0)
then
2310 call errtrp(
'stop due to allocation error.')
2324 do jj=xlnzr(jc),xlnzr(jc+1)-1
2326 if(indx(j).eq.ic)
then
2340 if(dabs(piv).gt.rmin)
then
2359 subroutine sum1(ic,xlnzr,colno,zln,diag,par,neqns)
2363 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),par(:)
2364 integer(kind=kint),
intent(in) :: ic, neqns
2365 real(kind=
kreal),
intent(inout) :: zln(:),diag(:)
2367 real(kind=
kreal) :: s, t, zz
2368 integer(kind=kint) :: ks, ke, k, jc, j, jj, ierr
2369 real(kind=
kreal),
allocatable :: temp(:)
2370 integer(kind=kint),
allocatable :: indx(:)
2371 integer(kind=kint) :: i
2375 allocate(temp(neqns),indx(neqns), stat=ierr)
2376 if(ierr .ne. 0)
then
2377 call errtrp(
'stop due to allocation error.')
2394 do jj=xlnzr(jc),xlnzr(jc+1)-1
2396 if(indx(j).eq.ic)
then
2415 subroutine sum2_child(neqns,nstop,xlnzr,colno,zln,diag,spdslnidx,spdslnval,nspdsln)
2419 integer(kind=kint),
intent(in) :: neqns, nstop
2420 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:)
2421 real(kind=
kreal),
intent(inout) :: zln(:),diag(:)
2422 integer(kind=kint),
pointer :: spdslnidx(:)
2423 real(kind=
kreal),
pointer :: spdslnval(:,:)
2424 integer(kind=kint),
intent(out) :: nspdsln
2426 real(kind=
kreal) :: s, t
2427 integer(kind=kint) :: ks, ke, kk, k, jc, jj, j, j1,j2
2428 integer(kind=kint) :: ic, i, loc, ierr
2429 integer(kind=kint) :: ispdsln
2431 real(kind=
kreal),
allocatable :: temp(:)
2432 integer(kind=kint),
allocatable :: indx(:)
2434 allocate(temp(neqns),indx(neqns), stat=ierr)
2435 if(ierr .ne. 0)
then
2436 call errtrp(
'stop due to allocation error.')
2451 do jj=xlnzr(jc),xlnzr(jc+1)-1
2453 if(indx(j).eq.ic)
then
2460 allocate(spdslnidx(nspdsln),spdslnval(1,nspdsln), stat=ierr)
2461 if(ierr .ne. 0)
then
2462 call errtrp(
'stop due to allocation error.')
2478 zln(k)=temp(jj)*diag(jj)
2480 diag(ic)=diag(ic)-temp(jj)*zln(k)
2484 do jj=xlnzr(jc),xlnzr(jc+1)-1
2486 if(indx(j).eq.ic)
then
2491 spdslnidx(ispdsln)=loc
2492 spdslnval(1,ispdsln)=spdslnval(1,ispdsln)-temp(j)*zln(jj)
2502 end subroutine sum2_child
2506 subroutine sum3(n,dsln,diag)
2510 real(kind=
kreal),
intent(inout) :: dsln(:),diag(:)
2511 integer(kind=kint),
intent(in) :: n
2513 integer(kind=kint) :: i, j, loc, ierr
2514 real(kind=
kreal),
allocatable :: temp(:)
2515 integer(kind=kint),
allocatable :: indx(:)
2516 allocate(temp(n),indx(n), stat=ierr)
2517 if(ierr .ne. 0)
then
2518 call errtrp(
'stop due to allocation error.')
2521 if(n.le.0)
goto 1000
2524 diag(1)=1.0d0/diag(1)
2528 dsln(loc)=dsln(loc)-dot_product(dsln(indx(i):indx(i)+j-2),dsln(indx(j):indx(j)+j-2))
2531 temp(1:i-1)=dsln(indx(i):indx(i)+i-2)*diag(1:i-1)
2532 diag(i)=diag(i)-dot_product(temp(1:i-1),dsln(indx(i):indx(i)+i-2))
2533 dsln(indx(i):indx(i)+i-2)=temp(1:i-1)
2534 diag(i)=1.0d0/diag(i)
2543 real(kind=
kreal)
function spdot2(b,zln,colno,ks,ke)
2547 integer(kind=kint),
intent(in) :: colno(:)
2548 integer(kind=kint),
intent(in) :: ks,ke
2549 real(kind=
kreal),
intent(in) :: zln(:),b(:)
2551 integer(kind=kint) :: j,jj
2552 real(kind=
kreal) :: s
2573 real(kind=
kreal)
function ddot(a,b,n)
2577 real(kind=
kreal),
intent(in) :: a(n),b(n)
2578 integer(kind=kint),
intent(in) :: n
2580 real(kind=
kreal) :: s
2581 integer(kind=kint) :: i
2593 subroutine addr0(isw,i,j,aij,invp,xlnzr,colno,diag,zln,dsln,nstop,ndeg,ir)
2597 integer(kind=kint),
intent(in) :: isw
2598 integer(kind=kint),
intent(in) :: i,j,nstop, ndeg, invp(:),xlnzr(:),colno(:)
2599 real(kind=
kreal),
intent(inout) :: zln(:,:),diag(:,:),dsln(:,:),aij(:)
2600 integer(kind=kint),
intent(out) :: ir
2602 integer(kind=kint) :: ndeg2, ii, jj, itrans, k, i0, j0, l, ks, ke
2603 integer(kind=kint),
parameter :: idbg=0
2609 if(idbg.ne.0)
write(idbg,*)
'addr0',ii,jj,aij
2615 diag(1,ii)=diag(1,ii)+aij(1)
2617 elseif(ndeg2.eq.4)
then
2623 diag(1,ii)=diag(1,ii)+aij(1)
2624 diag(2,ii)=diag(2,ii)+aij(2)
2625 diag(3,ii)=diag(3,ii)+aij(4)
2637 if(jj.ge.nstop)
then
2644 elseif(ndeg2.eq.4)
then
2645 if(itrans.eq.0)
then
2662 if(colno(k).eq.jj)
then
2666 elseif(ndeg2.eq.4)
then
2667 if(itrans.eq.0)
then
2680 zln(1,k)=zln(1,k)+aij(1)
2681 elseif(ndeg2.eq.4)
then
2682 if(itrans.eq.0)
then
2684 zln(l,k)=zln(l,k)+aij(l)
2687 zln(1,k)=zln(1,k)+aij(1)
2688 zln(2,k)=zln(2,k)+aij(3)
2689 zln(3,k)=zln(3,k)+aij(2)
2690 zln(4,k)=zln(4,k)+aij(4)
2700 end subroutine addr0
2706 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)
2710 integer(kind=kint),
intent(in) :: ndeg
2712 integer(kind=kint),
intent(in) :: irow_a0(:),jcol_a0(:)
2713 integer(kind=kint),
intent(in) :: neqns_a0,nttbr_a0
2714 real(kind=
kreal),
intent(in) :: val_a0(:,:)
2715 integer(kind=kint),
intent(in) :: irow_l(:),jcol_l(:)
2716 integer(kind=kint),
intent(in) :: neqns_l,nttbr_l
2717 real(kind=
kreal),
intent(in) :: val_l(:,:)
2719 real(kind=
kreal),
intent(in) :: x(:,:)
2720 real(kind=
kreal),
intent(out) :: rhs(:,:)
2722 integer(kind=kint) :: i,j,k,l,m
2723 real(kind=
kreal) :: rel,err
2747 do i=1,neqns_a0+neqns_l
2749 rel=rel+dabs(rhs(l,i))
2759 rhs(l,i)=rhs(l,i)-val_a0(1,k)*x(m,j)
2760 if(i.ne.j) rhs(l,j)=rhs(l,j)-val_a0(1,k)*x(m,i)
2767 i=irow_l(k)+neqns_a0
2771 rhs(l,i)=rhs(l,i)-val_l(1,k)*x(m,j)
2772 if(i.ne.j) rhs(l,j)=rhs(l,j)-val_l(1,k)*x(m,i)
2778 do i=1,neqns_a0 + neqns_l
2780 err=err+dabs(rhs(l,i))
2784 write(imsg,6000) err,rel,err/rel
2785 6000
format(
' ***verification***(symmetric)'/&
2786 &
'norm(Ax-b) = ',1pd20.10/&
2787 &
'norm(b) = ',1pd20.10/&
2788 &
'norm(Ax-b)/norm(b) = ',1pd20.10)
2789 6010
format(1p4d15.7)
2791 end subroutine verif0
subroutine, public hecmw_solve_direct_serial_lag(nrows, ilag_sta, nttbr, pointers, indices, values, b)
subroutine qqsort(iw, ik)
subroutine, public symbolicirjctocrs(ndeg, nttbr, irow, jcol, ncols, nrows, c)
integer(kind=4), parameter kreal