33 integer(kind=kint) :: myid
34 integer(kind=kint) :: imp
38 integer(kind=kint) :: nchildren
39 integer(kind=kint),
pointer :: ichildren(:)
41 integer(kind=kint) :: ndiv
45 integer(kind=kint) :: ndeg
46 integer(kind=kint) :: neqns
47 integer(kind=kint) :: nstop
48 integer(kind=kint) :: stage
49 integer(kind=kint) :: lncol
50 integer(kind=kint) :: lndsln
52 integer(kind=kint),
pointer :: zpiv(:)
53 integer(kind=kint),
pointer :: iperm(:)
54 integer(kind=kint),
pointer :: invp(:)
55 integer(kind=kint),
pointer :: parent(:)
56 integer(kind=kint),
pointer :: nch(:)
57 integer(kind=kint),
pointer :: xlnzr(:)
58 integer(kind=kint),
pointer :: colno(:)
60 real(kind=
kreal),
pointer :: diag(:,:)
61 real(kind=
kreal),
pointer :: zln(:,:)
62 real(kind=
kreal),
pointer :: dsln(:,:)
67 type(procinfo) :: m_pds_procinfo
68 real(kind=
kreal),
parameter :: rmin = 1.00d-200
72 integer,
parameter :: ilog = 16
73 logical,
parameter :: ldbg = .false.
74 integer,
parameter :: idbg = 52
75 logical :: lelap = .false.
91 integer(kind=kint),
intent(in) :: ii
95 logical,
save :: first_time = .true.
97 integer(kind=kint) :: ierr
106 if (hecmat%Iarray(22) .ge. 1)
then
113 hecmat%Iarray(97) = 0
114 hecmat%Iarray(98) = 0
118 if ((hecmat%Iarray(97) .ne. 0) .or. (hecmat%Iarray(98) .ne. 0))
then
119 write(ilog,*)
'Error: Recalculation of LDU decompose is currently not surported'
126 if (m_pds_procinfo%isparent)
then
127 call elapout(
'hecmw_solve_direct_parallel: entering sp_direct_parent')
128 call sp_direct_parent(hecmesh, hecmat)
129 else if (m_pds_procinfo%ischild)
then
130 call elapout(
'hecmw_solve_direct_parallel: entering sp_direct_child')
131 call sp_direct_child()
133 call elapout(
'hecmw_solve_direct_parallel: never come here')
137 call mpi_bcast(hecmat%x, hecmesh%n_dof*hecmat%NP, mpi_real8, m_pds_procinfo%imp, mpi_comm_world, ierr)
151 subroutine sp_direct_parent(hecMESH, hecMAT)
166 real(kind=
kreal),
allocatable :: b(:,:)
169 type(matrix_partition_info) :: pmi
170 integer(kind=kint),
pointer,
save :: iperm_rev(:)
171 integer(kind=kint),
pointer,
save :: iofst_dm(:)
173 integer(kind=kint),
save :: neqns_d
174 real(kind=
kreal),
pointer,
save :: dsln(:,:)
175 real(kind=
kreal),
pointer,
save :: diag(:,:)
176 integer(kind=kint),
pointer,
save :: part_all(:)
177 integer(kind=kint),
pointer,
save :: iperm_all(:)
180 real(kind=
kreal),
allocatable :: bd(:,:)
183 real(kind=
kreal),
allocatable :: oldb(:,:)
184 logical,
save :: nusol_ready = .false.
185 integer(kind=kint),
save :: ndeg, nndeg, ndegt
186 integer(kind=kint),
save :: neqns_c, iofst_a2, iofst_c, ndm
189 integer(kind=kint) :: ierr
190 integer(kind=kint) :: i,j,k,l,m,n
193 integer(kind=kint) :: istatus(mpi_status_size)
194 integer(kind=kint) :: icp
195 real(kind=
kreal),
allocatable :: spdslnval(:,:), diagbuf(:,:), bdbuf(:,:)
196 integer(kind=kint),
allocatable :: spdslnidx(:)
197 integer(kind=kint) :: nspdsln
200 call elapout(
'sp_direct_parent: entered')
203 if (.not. nusol_ready)
then
210 call geta0(hecmesh, hecmat, a0)
213 ndegt = (ndeg+1)*ndeg/2
215 call elapout(
'sp_direct_parent: make a0 done')
225 call elapout(
'sp_direct_parent: enter matrix partition')
227 call elapout(
'sp_direct_parent: end matrix partition')
228 neqns_d = pmi%neqns_d
231 part_all=>pmi%part_all
232 iperm_all=>pmi%iperm_all
237 allocate(iofst_dm(0:ndm), stat=ierr)
239 call errtrp(
'stop due to allocation error.')
244 iofst_dm(i)=iofst_dm(i-1)+dm(i-1)%a%neqns
247 iperm_all(i)=iperm_all(i)+iofst_dm(part_all(i))
250 allocate(iperm_rev(a0%neqns), stat=ierr)
252 call errtrp(
'stop due to allocation error.')
255 iperm_rev(iperm_all(i)) = i
266 call elapout(
'sp_direct_parent: send divided matrix to children')
267 do i=1,m_pds_procinfo%nchildren
268 icp = m_pds_procinfo%ichildren(i)
269 call mpi_send(dm(i)%a%ndeg, 1,mpi_integer,icp,1,mpi_comm_world,ierr)
270 call mpi_send(dm(i)%a%neqns, 1,mpi_integer,icp,1,mpi_comm_world,ierr)
271 call mpi_send(dm(i)%a%nttbr, 1,mpi_integer,icp,1,mpi_comm_world,ierr)
273 call mpi_send(dm(i)%a%irow, dm(i)%a%nttbr, mpi_integer,icp,1,mpi_comm_world,ierr)
274 call mpi_send(dm(i)%a%jcol, dm(i)%a%nttbr, mpi_integer,icp,1,mpi_comm_world,ierr)
275 call mpi_send(dm(i)%a%val, dm(i)%a%nttbr*dm(i)%a%ndeg*dm(i)%a%ndeg, mpi_real8,icp,1,mpi_comm_world,istatus,ierr)
277 call mpi_send(dm(i)%c%ndeg, 1,mpi_integer,icp,1,mpi_comm_world,ierr)
278 call mpi_send(dm(i)%c%nttbr, 1,mpi_integer,icp,1,mpi_comm_world,ierr)
279 call mpi_send(dm(i)%c%nrows, 1,mpi_integer,icp,1,mpi_comm_world,ierr)
280 call mpi_send(dm(i)%c%ncols, 1,mpi_integer,icp,1,mpi_comm_world,ierr)
282 call mpi_send(dm(i)%c%irow, dm(i)%c%nttbr, mpi_integer,icp,1,mpi_comm_world,ierr)
283 call mpi_send(dm(i)%c%jcol, dm(i)%c%nttbr, mpi_integer,icp,1,mpi_comm_world,ierr)
284 call mpi_send(dm(i)%c%val, dm(i)%c%nttbr*dm(i)%c%ndeg*dm(i)%c%ndeg, mpi_real8,icp,1,mpi_comm_world,istatus,ierr)
290 do i=1,m_pds_procinfo%nchildren
291 deallocate(dm(i)%a%irow,dm(i)%a%jcol,dm(i)%a%val)
292 deallocate(dm(i)%c%irow,dm(i)%c%jcol,dm(i)%c%val)
295 call elapout(
'sp_direct_parent: end send matrix')
304 call elapout(
'sp_direct_parent: receive D matrix element')
305 allocate(diagbuf(ndegt, neqns_d), stat=ierr)
307 call errtrp(
'stop due to allocation error.')
310 do k=1,m_pds_procinfo%nchildren
311 icp=m_pds_procinfo%ichildren(k)
312 call mpi_recv(nspdsln, 1,mpi_integer,icp,1,mpi_comm_world,istatus,ierr)
313 allocate(spdslnidx(nspdsln),spdslnval(nndeg,nspdsln),stat=ierr)
315 call errtrp(
'stop due to allocation error.')
317 call mpi_recv(spdslnidx, nspdsln, mpi_integer,icp,1,mpi_comm_world,istatus,ierr)
318 call mpi_recv(spdslnval, nspdsln*nndeg,mpi_real8,icp,1,mpi_comm_world,istatus,ierr)
319 call mpi_recv(diagbuf, neqns_d*ndegt,mpi_real8,icp,1,mpi_comm_world,istatus,ierr)
323 dsln(:,spdslnidx(i)) = dsln(:,spdslnidx(i)) + spdslnval(:,i)
329 diag(j,i) = diag(j,i) + diagbuf(j,i)
332 deallocate(spdslnidx, spdslnval)
335 call elapout(
'sp_direct_parent: end receive D matrix element')
341 call elapout(
'sp_direct_parent: LDU decompose of D. entering nufct0_parent')
342 call nufct0_parent(dsln, diag, neqns_d, ndeg)
343 call elapout(
'sp_direct_parent: exit nufct0_parent')
363 allocate(b(ndeg,a0%neqns), stat=ierr)
365 call errtrp(
'stop due to allocation error.')
369 b(j,i)=hecmat%b(ndeg*(i-1)+j)
374 allocate(oldb(ndeg,a0%neqns), stat=ierr)
376 call errtrp(
'stop due to allocation error.')
381 do i=1,m_pds_procinfo%nchildren
382 icp=m_pds_procinfo%ichildren(i)
383 call mpi_send(b(1,iofst_dm(i)+1), dm(i)%ndeg*dm(i)%a%neqns, mpi_real8, icp, 1,mpi_comm_world, ierr)
386 allocate(bd(ndeg,neqns_d), stat=ierr)
388 call errtrp(
'stop due to allocation error.')
390 bd(:,1:neqns_d) = b(:,1:neqns_d)
392 call elapout(
'sp_direct_parent: end send b')
402 call elapout(
'sp_direct_parent: begin receive bd')
403 allocate(bdbuf(ndeg,neqns_d), stat=ierr)
405 call errtrp(
'stop due to allocation error.')
408 do k=1,m_pds_procinfo%nchildren
409 icp=m_pds_procinfo%ichildren(k)
410 call mpi_recv(bdbuf, ndeg*neqns_d, mpi_real8, icp, 1,mpi_comm_world, istatus, ierr)
413 bd(j,i) = bd(j,i) + bdbuf(j,i)
418 call elapout(
'sp_direct_parent: end receive bd')
424 call elapout(
'sp_direct_parent: begin solve Ax_d=b_d')
425 call nusol0_parent(dsln, diag, bd, neqns_d, ndeg)
426 call elapout(
'sp_direct_parent: end solve Ax_d=b_d')
433 call elapout(
'sp_direct_parent: begin send Xd')
434 call mpi_bcast(bd, ndeg*neqns_d, mpi_real8, m_pds_procinfo%imp, mpi_comm_world, ierr)
435 call elapout(
'sp_direct_parent: end send Xd')
441 call elapout(
'sp_direct_parent: begin receive X')
442 do k=1,m_pds_procinfo%nchildren
443 icp=m_pds_procinfo%ichildren(k)
444 call mpi_recv(b(1,iofst_dm(k)+1), dm(k)%ndeg*dm(k)%a%neqns, mpi_real8, icp, 1,mpi_comm_world, istatus, ierr)
446 b(:,1:neqns_d)=bd(:,:)
447 call elapout(
'sp_direct_parent: end receive X')
454 call elapout(
'sp_direct_parent: begin permutate X')
456 call elapout(
'sp_direct_parent: end permutate X')
459 call verif0(a0%neqns, ndeg, a0%nttbr, a0%irow, a0%jcol, a0%val, oldb, b)
464 hecmat%x(ndeg*(i-1)+j)=b(j,i)
468 call elapout(
'sp_direct_parent: end solve Ax=b')
469 deallocate(b, bd, bdbuf, oldb)
471 end subroutine sp_direct_parent
475 subroutine geta0(hecMESH,hecMAT, a0)
483 integer(kind=kint) :: i,j,k,l,ierr,numnp,ndof,kk,ntotal
484 integer(kind=kint) :: iis,iie,kki,kkj,ndof2
493 a0%nttbr = hecmat%NP+hecmat%NPL
496 allocate(a0%irow(a0%nttbr),stat=ierr)
497 allocate(a0%jcol(a0%nttbr),stat=ierr)
498 allocate(a0%val(a0%ndeg*a0%ndeg, a0%nttbr),stat=ierr)
500 call errtrp(
'stop due to allocation error.')
510 call vlcpy(a0%val(:,kk),hecmat%D(ndof2*(j-1)+1:ndof2*j),ndof)
512 do k= hecmat%indexL(j-1)+1, hecmat%indexL(j)
517 call vlcpy(a0%val(:,kk),hecmat%AL(ndof2*(k-1)+1:ndof2*k),ndof)
525 subroutine vlcpy(a,b,n)
527 real(kind=
kreal),
intent(out) :: a(:)
528 real(kind=
kreal),
intent(in) :: b(:)
529 integer(kind=kint),
intent(in) :: n
531 integer(kind=kint) :: i,j
535 a((j-1)*n+i) = b((i-1)*n+j)
545 subroutine sp_direct_child()
554 real(kind=
kreal),
allocatable :: b(:,:)
556 logical,
save :: nusol_ready = .false.
559 integer(kind=kint) :: istatus(mpi_status_size)
560 integer(kind=kint) :: imp, ierr
561 integer(kind=kint) :: i,j,k,l,m,n
565 call elapout(
'sp_direct_child: entered')
567 imp=m_pds_procinfo%imp
569 if (.not. nusol_ready)
then
571 call elapout(
'sp_direct_child: waiting matrix from parent via MPI')
577 call mpi_recv(cm%a%ndeg, 1,mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
578 call mpi_recv(cm%a%neqns, 1,mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
579 call mpi_recv(cm%a%nttbr, 1,mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
580 allocate(cm%a%irow(cm%a%nttbr), stat=ierr)
582 call errtrp(
'stop due to allocation error.')
584 allocate(cm%a%jcol(cm%a%nttbr), stat=ierr)
586 call errtrp(
'stop due to allocation error.')
588 allocate(cm%a%val(cm%a%ndeg*cm%a%ndeg, cm%a%nttbr), stat=ierr)
590 call errtrp(
'stop due to allocation error.')
592 call mpi_recv(cm%a%irow, cm%a%nttbr, mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
593 call mpi_recv(cm%a%jcol, cm%a%nttbr, mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
594 call mpi_recv(cm%a%val, cm%a%nttbr*cm%a%ndeg*cm%a%ndeg, mpi_real8,imp,1,mpi_comm_world,istatus,ierr)
597 call mpi_recv(cm%c%ndeg, 1,mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
598 call mpi_recv(cm%c%nttbr, 1,mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
599 call mpi_recv(cm%c%nrows, 1,mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
600 call mpi_recv(cm%c%ncols, 1,mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
601 allocate(cm%c%irow(cm%c%nttbr), stat=ierr)
603 call errtrp(
'stop due to allocation error.')
605 allocate(cm%c%jcol(cm%c%nttbr), stat=ierr)
607 call errtrp(
'stop due to allocation error.')
609 allocate(cm%c%val(cm%c%ndeg*cm%c%ndeg, cm%c%nttbr), stat=ierr)
611 call errtrp(
'stop due to allocation error.')
613 call mpi_recv(cm%c%irow, cm%c%nttbr, mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
614 call mpi_recv(cm%c%jcol, cm%c%nttbr, mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
615 call mpi_recv(cm%c%val, cm%c%nttbr*cm%c%ndeg*cm%c%ndeg, mpi_real8,imp,1,mpi_comm_world,istatus,ierr)
618 cm%ista_c = cm%a%neqns+1
619 cm%neqns_t = cm%a%neqns + cm%c%nrows
620 call elapout(
'sp_direct_child: end get matrix from parent via MPI')
631 call elapout(
'sp_direct_child: entering matini_para')
632 call matini_para(cm, dsi, ierr)
633 call elapout(
'sp_direct_child: exit matini_para')
635 call elapout(
'sp_direct_child: entering staij1')
638 call staij1(0, cm%a%irow(i), cm%a%jcol(i), cm%a%val(:,i), dsi, ierr)
642 call staij1(0, cm%c%irow(i)+cm%a%neqns, cm%c%jcol(i), cm%c%val(:,i), dsi, ierr)
644 call elapout(
'sp_direct_child: end staij1')
654 call elapout(
'sp_direct_child: entering nufct0_child')
655 call nufct0_child(dsi, ierr)
656 call elapout(
'sp_direct_child: exit nufct0_child')
667 allocate(b(cm%ndeg, cm%neqns_t), stat=ierr)
669 call errtrp(
'stop due to allocation error.')
673 call mpi_recv(b, cm%ndeg*cm%a%neqns, mpi_real8, imp, 1,mpi_comm_world, istatus, ierr)
683 call elapout(
'sp_direct_child: enter nusol0_child')
684 call nusol0_child(b, dsi, ierr)
685 call elapout(
'sp_direct_child: exit nusol0_child')
691 call elapout(
'sp_direct_child: begin send result to parent')
692 call mpi_send(b, cm%ndeg*cm%a%neqns, mpi_real8, imp, 1,mpi_comm_world, ierr)
693 call elapout(
'sp_direct_child: end send result to parent')
697 end subroutine sp_direct_child
702 subroutine initproc()
707 integer(kind=kint) :: npe, myid
708 integer(kind=kint) :: ndiv
709 integer(kind=kint) :: ierr
710 integer(kind=kint) :: i,j,k,l
712 m_pds_procinfo%isparent=.false.
713 m_pds_procinfo%ischild=.false.
716 call mpi_comm_size(mpi_comm_world, npe, ierr)
717 call mpi_comm_rank(mpi_comm_world, myid, ierr)
719 m_pds_procinfo%myid = myid
723 if (2**(ndiv + 1) .gt. npe)
then
728 m_pds_procinfo%ndiv = ndiv
730 if (npe .ne. 2**ndiv + 1)
then
731 write(ilog,*)
'Error: please use 2**n+1 (3,5,9,17...) processes for parallel direct solver.'
732 write(6,*)
'Error: please use 2**n+1 (3,5,9,17...) processes for parallel direct solver.'
738 write(idbg,*)
'parent process.'
739 m_pds_procinfo%isparent=.true.
740 m_pds_procinfo%nchildren=2**ndiv
741 allocate(m_pds_procinfo%ichildren(m_pds_procinfo%nchildren))
743 m_pds_procinfo%ichildren(i)=i
746 write(idbg,*)
'child process.'
747 m_pds_procinfo%ischild=.true.
752 end subroutine initproc
755 subroutine errtrp(mes)
757 write(6,*)
'Error in : process ', m_pds_procinfo%myid
762 end subroutine errtrp
766 subroutine matini_para(cm,dsi,ir)
805 type(dsinfo),
intent(out) :: dsi
806 integer(kind=kint),
intent(out) :: ir
808 integer(kind=kint),
pointer :: irow_a(:), jcol_a(:)
809 integer(kind=kint),
pointer :: irow_c(:), jcol_c(:)
811 integer(kind=kint),
pointer :: ia(:)
812 integer(kind=kint),
pointer :: ja(:)
813 integer(kind=kint),
pointer :: jcpt(:)
814 integer(kind=kint),
pointer :: jcolno(:)
816 integer(kind=kint),
pointer :: iperm_a(:)
817 integer(kind=kint),
pointer :: invp_a(:)
819 integer(kind=kint),
pointer :: xlnzr_a(:)
820 integer(kind=kint),
pointer :: colno_a(:)
822 integer(kind=kint),
pointer :: xlnzr_c(:)
823 integer(kind=kint),
pointer :: colno_c(:)
826 integer(kind=kint),
pointer :: adjncy(:)
827 integer(kind=kint),
pointer :: qlink(:)
828 integer(kind=kint),
pointer :: qsize(:)
829 integer(kind=kint),
pointer :: nbrhd(:)
830 integer(kind=kint),
pointer :: rchset(:)
832 integer(kind=kint),
pointer :: cstr(:)
834 integer(kind=kint),
pointer :: adjt(:)
835 integer(kind=kint),
pointer :: anc(:)
837 integer(kind=kint),
pointer :: lwk3arr(:)
838 integer(kind=kint),
pointer :: lwk2arr(:)
839 integer(kind=kint),
pointer :: lwk1arr(:)
840 integer(kind=kint),
pointer :: lbtreearr(:,:)
841 integer(kind=kint),
pointer :: lleafarr(:)
842 integer(kind=kint),
pointer :: lxleafarr(:)
843 integer(kind=kint),
pointer :: ladparr(:)
844 integer(kind=kint),
pointer :: lpordrarr(:)
846 integer(kind=kint) :: neqns_a, nttbr_a, neqns_a1, nstop, neqns_t, neqns_d, nttbr_c, ndeg
847 integer(kind=kint) :: lncol_a, lncol_c
848 integer(kind=kint) :: neqnsz, nofsub, izz, izz0, lnleaf
849 integer(kind=kint) :: ir1
850 integer(kind=kint) :: i, j, k , ipass, ks, ke, ierr
876 allocate(dsi%zpiv(neqns_a), stat=ierr)
878 call errtrp(
'stop due to allocation error.')
880 call zpivot(neqns_a,neqnsz,nttbr_a,jcol_a,irow_a,dsi%zpiv,ir1)
888 allocate(jcpt(2*nttbr_a), jcolno(2*nttbr_a), stat=ierr)
890 call errtrp(
'stop due to allocation error.')
892 call stsmat(neqns_a,nttbr_a,irow_a,jcol_a,jcpt,jcolno)
896 allocate(ia(neqns_a1), ja(2*nttbr_a), stat=ierr)
898 call errtrp(
'stop due to allocation error.')
900 call stiaja(neqns_a, neqns_a,ia,ja,jcpt,jcolno)
906 allocate(iperm_a(neqns_a), invp_a(neqns_a), stat=ierr)
908 call errtrp(
'stop due to allocation error.')
910 call idntty(neqns_a,invp_a,iperm_a)
913 allocate(adjncy(2*nttbr_a),qlink(neqns_a1),qsize(neqns_a1),nbrhd(neqns_a1),rchset(neqns_a1), stat=ierr)
915 call errtrp(
'stop due to allocation error.')
917 allocate(lwk2arr(neqns_a1),lwk1arr(neqns_a1), stat=ierr)
919 call errtrp(
'stop due to allocation error.')
921 call genqmd(neqns_a,ia,ja,iperm_a,invp_a,lwk1arr,lwk2arr,rchset,nbrhd,qsize,qlink,nofsub,adjncy)
922 deallocate(adjncy, qlink, qsize, nbrhd, rchset)
925 call stiaja(neqns_a, neqns_a, ia, ja, jcpt,jcolno)
929 allocate(cstr(neqns_a1),adjt(neqns_a1), stat=ierr)
931 call errtrp(
'stop due to allocation error.')
934 call genpaq(ia,ja,invp_a,iperm_a,lwk2arr,neqns_a,cstr)
937 allocate (lbtreearr(2,neqns_a1), stat=ierr)
939 call errtrp(
'stop due to allocation error.')
941 call genbtq(ia, ja, invp_a, iperm_a,lwk2arr,lbtreearr,dsi%zpiv,izz,neqns_a)
945 if(izz0.eq.0) izz0=izz
946 if(izz0.ne.izz)
goto 30
947 call rotate(ia, ja, invp_a, iperm_a, lwk2arr,lbtreearr,izz,neqns_a,anc,adjt,ir1)
950 call bringu(dsi%zpiv,iperm_a, invp_a, lwk2arr,izz,neqns_a,ir1)
955 allocate(lwk3arr(0:neqns_a1),lpordrarr(neqns_a1),dsi%parent(neqns_a1), dsi%nch(neqns_a1), stat=ierr)
957 call errtrp(
'stop due to allocation error.')
959 call posord(dsi%parent,lbtreearr,invp_a,iperm_a,lpordrarr,dsi%nch,neqns_a,lwk1arr,lwk2arr,lwk3arr)
962 allocate(lleafarr(nttbr_a),lxleafarr(neqns_a1),ladparr(neqns_a1), stat=ierr)
964 call errtrp(
'stop due to allocation error.')
966 call gnleaf(ia, ja, invp_a, iperm_a, lpordrarr,dsi%nch,ladparr,lxleafarr,lleafarr,neqns_a,lnleaf)
970 call countclno(dsi%parent, lxleafarr, lleafarr, neqns_a, nstop, lncol_a, ir1)
971 allocate(colno_a(lncol_a),xlnzr_a(neqns_a1), stat=ierr)
973 call errtrp(
'stop due to allocation error.')
975 call gnclno(dsi%parent,lpordrarr,lxleafarr,lleafarr,xlnzr_a, colno_a, neqns_a, nstop,lncol_a,ir1)
982 call ldudecomposec(xlnzr_a,colno_a,invp_a,iperm_a, ndeg, nttbr_c, irow_c, &
983 jcol_c, cm%c%ncols, cm%c%nrows, xlnzr_c, colno_c, lncol_c)
986 allocate(dsi%xlnzr(neqns_t + 1), stat=ierr)
988 call errtrp(
'stop due to allocation error.')
990 dsi%xlnzr(1:neqns_a)=xlnzr_a(:)
991 dsi%xlnzr(neqns_a+1:neqns_t+1)=xlnzr_c(:)+xlnzr_a(neqns_a+1)-1
993 dsi%lncol=lncol_a + lncol_c
994 allocate(dsi%colno(lncol_a + lncol_c), stat=ierr)
996 call errtrp(
'stop due to allocation error.')
998 dsi%colno(1:lncol_a)=colno_a(:)
999 dsi%colno(lncol_a+1:lncol_a+lncol_c)=colno_c(:)
1001 allocate(dsi%invp(neqns_t), dsi%iperm(neqns_t), stat=ierr)
1002 if(ierr .ne. 0)
then
1003 call errtrp(
'stop due to allocation error.')
1005 dsi%invp(1:neqns_a)=invp_a(1:neqns_a)
1006 dsi%iperm(1:neqns_a)=iperm_a(1:neqns_a)
1007 do i=neqns_a+1,neqns_t
1012 deallocate(xlnzr_a, colno_a, xlnzr_c, colno_c, invp_a, iperm_a)
1019 end subroutine matini_para
1023 subroutine nufct0_child(dsi,ir)
1026 type(dsinfo),
intent(inout) :: dsi
1027 integer(kind=kint),
intent(out) :: ir
1032 if(dsi%stage.ne.20)
then
1038 if(dsi%ndeg.eq.1)
then
1039 call nufct1_child(dsi%xlnzr,dsi%colno,dsi%zln,dsi%diag,dsi%neqns,dsi%parent,dsi%nch,dsi%nstop,ir)
1040 else if(dsi%ndeg.eq.2)
then
1041 call nufct2_child(dsi%xlnzr,dsi%colno,dsi%zln,dsi%diag,dsi%neqns,dsi%parent,dsi%nch,dsi%nstop,ir)
1042 else if(dsi%ndeg.eq.3)
then
1043 call nufct3_child(dsi%xlnzr,dsi%colno,dsi%zln,dsi%diag,dsi%neqns,dsi%parent,dsi%nch,dsi%nstop,ir)
1047 call nufctx_child(dsi%xlnzr,dsi%colno,dsi%zln,dsi%diag,dsi%neqns,dsi%parent,dsi%nch,dsi%nstop,dsi%ndeg,ir)
1053 end subroutine nufct0_child
1057 subroutine nufct1_child(xlnzr,colno,zln,diag,neqns,parent,nch,nstop,ir)
1060 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),parent(:)
1061 integer(kind=kint),
intent(in) :: neqns, nstop, ir
1062 integer(kind=kint),
intent(out) :: nch(:)
1063 real(kind=
kreal),
intent(out) :: zln(:,:),diag(:,:)
1065 integer(kind=kint) :: neqns_c
1066 integer(kind=kint) :: i,j,k,l, ic,ierr,imp
1067 integer(kind=kint) :: nspdsln
1068 integer(kind=kint),
pointer :: spdslnidx(:)
1069 real(kind=
kreal),
pointer :: spdslnval(:,:)
1089 diag(1,1)=1.0d0/diag(1,1)
1094 call sum(ic,xlnzr,colno,zln(1,:),diag(1,:),nch,parent,neqns)
1100 do 200 ic=nstop,neqns
1101 call sum1(ic,xlnzr,colno,zln(1,:),diag(1,:),parent,neqns)
1113 neqns_c = neqns - nstop + 1
1114 call sum2_child(neqns,nstop,xlnzr,colno,zln(1,:),diag(1,:),spdslnidx,spdslnval,nspdsln)
1116 imp = m_pds_procinfo%imp
1117 call mpi_send(nspdsln, 1,mpi_integer,imp,1,mpi_comm_world,ierr)
1118 call mpi_send(spdslnidx, nspdsln,mpi_integer,imp,1,mpi_comm_world,ierr)
1119 call mpi_send(spdslnval, nspdsln,mpi_real8,imp,1,mpi_comm_world,ierr)
1120 call mpi_send(diag(1,nstop), neqns_c,mpi_real8,imp,1,mpi_comm_world,ierr)
1122 end subroutine nufct1_child
1126 subroutine nufct2_child(xlnzr, colno, zln, diag, neqns, parent, nch, nstop, ir)
1130 integer(kind=kint),
intent(in) :: xlnzr(:), colno(:), parent(:)
1131 integer(kind=kint),
intent(out) :: nch(:)
1132 real(kind=
kreal),
intent(out) :: zln(:,:), diag(:,:)
1133 integer(kind=kint),
intent(in) :: neqns, nstop
1134 integer(kind=kint),
intent(out) :: ir
1136 integer(kind=kint) :: i,j,k,l, ic, imp, ierr, neqns_c
1137 integer(kind=kint) :: nspdsln
1138 integer(kind=kint),
pointer :: spdslnidx(:)
1139 real(kind=
kreal),
pointer :: spdslnval(:,:)
1167 call elapout(
'nufct2_child: begin phase I LDU decompose of A')
1168 if(nstop.gt.1)
call inv2(diag(:,1),ir)
1173 call s2um(ic,xlnzr,colno,zln,diag,nch,parent,neqns)
1179 call elapout(
'nufct2_child: begin phase II LDU decompose of C')
1181 call s2um1(ic,xlnzr,colno,zln,diag,nch,parent,neqns)
1189 call elapout(
'nufct2_child: begin phase III update D region')
1196 neqns_c = neqns - nstop + 1
1197 call s2um2_child(neqns,nstop,xlnzr,colno,zln,diag,spdslnidx,spdslnval,nspdsln)
1200 imp = m_pds_procinfo%imp
1201 call mpi_send(nspdsln, 1,mpi_integer,imp,1,mpi_comm_world,ierr)
1202 call mpi_send(spdslnidx, nspdsln,mpi_integer,imp,1,mpi_comm_world,ierr)
1203 call mpi_send(spdslnval, nspdsln*4,mpi_real8,imp,1,mpi_comm_world,ierr)
1204 call mpi_send(diag(1,nstop), neqns_c*3,mpi_real8,imp,1,mpi_comm_world,ierr)
1209 end subroutine nufct2_child
1213 subroutine nufct3_child(xlnzr,colno,zln,diag,neqns,parent,nch,nstop,ir)
1217 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),parent(:)
1218 integer(kind=kint),
intent(out) :: nch(:)
1219 real(kind=
kreal),
intent(out) :: zln(:,:),diag(:,:)
1220 integer(kind=kint),
intent(in) :: neqns, nstop, ir
1222 integer(kind=kint) :: i,j,k,l, ic, imp, ierr, neqns_c
1223 integer(kind=kint) :: nspdsln
1224 integer(kind=kint),
pointer :: spdslnidx(:)
1225 real(kind=
kreal),
pointer :: spdslnval(:,:)
1254 call elapout(
'nufct3_child: begin phase I LDU decompose of A')
1255 if(nstop.gt.1)
call inv3(diag(:,1),ir)
1260 call s3um(ic,xlnzr,colno,zln,diag,nch,parent,neqns)
1266 call elapout(
'nufct3_child: begin phase II LDU decompose of C')
1267 do 200 ic=nstop,neqns
1268 call s3um1(ic,xlnzr,colno,zln,diag,nch,parent,neqns)
1276 call elapout(
'nufct3_child: begin phase III update D region')
1283 neqns_c = neqns - nstop + 1
1284 call s3um2_child(neqns,nstop,xlnzr,colno,zln,diag,spdslnidx,spdslnval,nspdsln)
1287 imp = m_pds_procinfo%imp
1288 call mpi_send(nspdsln, 1,mpi_integer,imp,1,mpi_comm_world,ierr)
1289 call mpi_send(spdslnidx, nspdsln,mpi_integer,imp,1,mpi_comm_world,ierr)
1290 call mpi_send(spdslnval, nspdsln*9,mpi_real8,imp,1,mpi_comm_world,ierr)
1291 call mpi_send(diag(1,nstop), neqns_c*6,mpi_real8,imp,1,mpi_comm_world,ierr)
1294 end subroutine nufct3_child
1362 subroutine nufctx_child(xlnzr,colno,zln,diag,neqns,parent,nch,nstop,ndeg,ir)
1366 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),parent(:)
1367 integer(kind=kint),
intent(out) :: nch(:)
1368 real(kind=
kreal),
intent(out) :: zln(:,:),diag(:,:)
1369 integer(kind=kint),
intent(in) :: neqns, nstop, ndeg
1370 integer(kind=kint),
intent(out) :: ir
1372 integer(kind=kint) :: i,j,k,l, ic, neqns_c, ndeg2, ndegl, imp, ierr
1373 integer(kind=kint) :: nspdsln
1374 integer(kind=kint),
pointer :: spdslnidx(:)
1375 real(kind=
kreal),
pointer :: spdslnval(:,:)
1400 ndegl=(ndeg+1)*ndeg/2
1404 if(nstop.gt.1)
call invx(diag,ndeg,ir)
1409 call sxum(ic,xlnzr,colno,zln,diag,nch,parent,neqns,ndeg,ndegl)
1417 call sxum1(ic,xlnzr,colno,zln,diag,nch,parent,neqns,ndeg,ndegl)
1424 neqns_c = neqns - nstop + 1
1425 call sxum2_child(neqns,nstop,xlnzr,colno,zln,diag,spdslnidx,spdslnval,nspdsln,ndeg,ndegl)
1428 imp = m_pds_procinfo%imp
1429 call mpi_send(nspdsln, 1,mpi_integer,imp,1,mpi_comm_world,ierr)
1430 call mpi_send(spdslnidx, nspdsln,mpi_integer,imp,1,mpi_comm_world,ierr)
1431 call mpi_send(spdslnval, nspdsln*ndeg2,mpi_real8,imp,1,mpi_comm_world,ierr)
1432 call mpi_send(diag(1,nstop), neqns_c*ndegl,mpi_real8,imp,1,mpi_comm_world,ierr)
1434 end subroutine nufctx_child
1438 subroutine nusol0_child(b,dsi,ir)
1454 real(kind=
kreal),
intent(inout) :: b(:,:)
1455 type(dsinfo),
intent(inout) :: dsi
1456 integer(kind=kint),
intent(out) :: ir
1458 integer(kind=kint) :: neqns, nstop, ndeg
1460 if(dsi%stage.ne.30 .and. dsi%stage.ne.40)
then
1466 if(dsi%ndeg.eq.1)
then
1467 call nusol1_child(dsi%xlnzr,dsi%colno,dsi%zln,dsi%diag,dsi%iperm,b,dsi%neqns,dsi%nstop)
1468 else if(dsi%ndeg .eq. 2)
then
1469 call nusol2_child(dsi%xlnzr,dsi%colno,dsi%zln,dsi%diag,dsi%iperm,b,dsi%neqns,dsi%nstop)
1470 else if(dsi%ndeg .eq. 3)
then
1471 call nusol3_child(dsi%xlnzr,dsi%colno,dsi%zln,dsi%diag,dsi%iperm,b,dsi%neqns,dsi%nstop)
1475 call nusolx_child(dsi%xlnzr,dsi%colno,dsi%zln,dsi%diag,dsi%iperm,b,dsi%neqns,dsi%nstop,dsi%ndeg)
1480 end subroutine nusol0_child
1484 subroutine nusol1_child(xlnzr,colno,zln,diag,iperm,b,neqns,nstop)
1488 integer(kind=kint),
intent(in) :: xlnzr(:), colno(:), iperm(:)
1489 real(kind=
kreal),
intent(in) :: zln(:,:), diag(:,:)
1490 real(kind=
kreal),
intent(inout) :: b(:,:)
1491 integer(kind=kint),
intent(in) :: neqns, nstop
1493 integer(kind=kint) :: neqns_a, neqns_c
1494 integer(kind=kint) :: k, ks, ke, i, j, imp, ierr
1495 real(kind=
kreal),
allocatable :: wk(:), wk_d(:)
1503 neqns_c = neqns - nstop + 1
1505 allocate(wk(neqns), stat=ierr)
1506 if(ierr .ne. 0)
then
1507 call errtrp(
'stop due to allocation error.')
1519 if(ke.lt.ks)
goto 110
1520 wk(i)=wk(i)-spdot2(wk,zln(1,:),colno,ks,ke)
1525 allocate(wk_d(nstop:neqns), stat=ierr)
1526 if(ierr .ne. 0)
then
1527 call errtrp(
'stop due to allocation error.')
1531 do 101 i=nstop,neqns
1534 if(ke.lt.ks)
goto 111
1535 wk_d(i)=wk_d(i)-spdot2(wk,zln(1,:),colno,ks,ke)
1538 imp = m_pds_procinfo%imp
1539 call mpi_send(wk_d, neqns_c, mpi_real8, imp, 1,mpi_comm_world, ierr)
1543 wk(i)=wk(i)*diag(1,i)
1547 call mpi_bcast(wk_d, neqns_c, mpi_real8, imp, mpi_comm_world, ierr)
1549 wk(nstop:neqns)=wk_d(nstop:neqns)
1554 if(ke.lt.ks)
goto 200
1558 wk(j)=wk(j)-wk(i)*zln(1,k)
1568 end subroutine nusol1_child
1572 subroutine nusol2_child(xlnzr, colno, zln, diag, iperm, b, neqns, nstop)
1581 integer(kind=kint),
intent(in) :: xlnzr(:), colno(:), iperm(:)
1582 real(kind=
kreal),
intent(in) :: zln(:,:), diag(:,:)
1583 real(kind=
kreal),
intent(inout) :: b(:,:)
1585 real(kind=
kreal),
allocatable :: wk(:,:), wk_d(:,:)
1586 integer(kind=kint) :: neqns_c, neqns_a, nstop, neqns, ks, ke
1587 integer(kind=kint) :: i, j, k, l, imp, ierr
1593 neqns_c = neqns - nstop + 1
1595 allocate(wk(2,neqns), stat=ierr)
1596 if(ierr .ne. 0)
then
1597 call errtrp(
'stop due to allocation error.')
1601 wk(1,i) = b(1,iperm(i))
1602 wk(2,i) = b(2,iperm(i))
1606 call elapout(
'nusol2_child: begin forward substitution for A')
1611 call s2pdot(wk(:,i),wk,zln,colno,ks,ke)
1616 call elapout(
'nusol2_child: begin forward substitution for C')
1617 allocate(wk_d(2,nstop:neqns), stat=ierr)
1618 if(ierr .ne. 0)
then
1619 call errtrp(
'stop due to allocation error.')
1627 call s2pdot(wk_d(:,i),wk,zln,colno,ks,ke)
1631 call elapout(
'nusol2_child: wait to send wk_d')
1632 imp = m_pds_procinfo%imp
1633 call mpi_send(wk_d, 2*neqns_c, mpi_real8, imp, 1,mpi_comm_world, ierr)
1637 wk(2,i)=wk(2,i)-wk(1,i)*diag(2,i)
1638 wk(1,i)=wk(1,i)*diag(1,i)
1639 wk(2,i)=wk(2,i)*diag(3,i)
1640 wk(1,i)=wk(1,i)-wk(2,i)*diag(2,i)
1644 call elapout(
'nusol2_child: wait until receive wk_d')
1645 call mpi_bcast(wk_d, 2*neqns_c, mpi_real8, imp, mpi_comm_world, ierr)
1646 call elapout(
'nusol2_child: end receive wk_d')
1647 call elapout(
'nusol2_child: begin backward substitution')
1649 wk(:,nstop:neqns)=wk_d(:,nstop:neqns)
1656 wk(1,j)=wk(1,j)-wk(1,i)*zln(1,k)-wk(2,i)*zln(2,k)
1657 wk(2,j)=wk(2,j)-wk(1,i)*zln(3,k)-wk(2,i)*zln(4,k)
1661 call elapout(
'nusol2_child: end backward substitution')
1665 b(1,iperm(i))=wk(1,i)
1666 b(2,iperm(i))=wk(2,i)
1669 call elapout(
'nusol2_child: end')
1672 end subroutine nusol2_child
1676 subroutine nusol3_child(xlnzr,colno,zln,diag,iperm,b,neqns, nstop)
1686 integer(kind=kint),
intent(in) :: xlnzr(:), colno(:), iperm(:)
1687 real(kind=
kreal),
intent(in) :: zln(:,:), diag(:,:)
1688 real(kind=
kreal),
intent(inout) :: b(:,:)
1690 real(kind=
kreal),
allocatable :: wk(:,:), wk_d(:,:)
1691 integer(kind=kint) :: neqns_c, neqns_a, nstop, neqns, ks, ke
1692 integer(kind=kint) :: i, j, k, l, imp, ierr
1699 neqns_c = neqns - nstop + 1
1701 call elapout(
'nusol3_child: entered')
1703 allocate(wk(3,neqns), stat=ierr)
1704 if(ierr .ne. 0)
then
1705 call errtrp(
'stop due to allocation error.')
1709 wk(1,i)=b(1,iperm(i))
1710 wk(2,i)=b(2,iperm(i))
1711 wk(3,i)=b(3,iperm(i))
1716 call elapout(
'nusol3_child: begin forward substitution for A')
1721 if(ke.lt.ks)
goto 110
1722 call s3pdot(wk(:,i),wk,zln,colno,ks,ke)
1728 call elapout(
'nusol3_child: begin forward substitution for C')
1729 allocate(wk_d(3,nstop:neqns), stat=ierr)
1730 if(ierr .ne. 0)
then
1731 call errtrp(
'stop due to allocation error.')
1735 do 101 i=nstop,neqns
1738 if(ke.lt.ks)
goto 111
1739 call s3pdot(wk_d(:,i),wk,zln,colno,ks,ke)
1743 call elapout(
'nusol3_child: wait to send wk_d')
1744 imp = m_pds_procinfo%imp
1745 call mpi_send(wk_d, 3*neqns_c, mpi_real8, imp, 1,mpi_comm_world, ierr)
1748 call elapout(
'nusol3_child: divide with diagonal matrix')
1750 wk(2,i)=wk(2,i)-wk(1,i)*diag(2,i)
1751 wk(3,i)=wk(3,i)-wk(1,i)*diag(4,i)-wk(2,i)*diag(5,i)
1752 wk(1,i)=wk(1,i)*diag(1,i)
1753 wk(2,i)=wk(2,i)*diag(3,i)
1754 wk(3,i)=wk(3,i)*diag(6,i)
1755 wk(2,i)=wk(2,i)-wk(3,i)*diag(5,i)
1756 wk(1,i)=wk(1,i)-wk(2,i)*diag(2,i)-wk(3,i)*diag(4,i)
1760 call elapout(
'nusol3_child: wait until receive wk_d')
1761 call mpi_bcast(wk_d, 3*neqns_c, mpi_real8, imp, mpi_comm_world, ierr)
1762 call elapout(
'nusol3_child: end receive wk_d')
1763 call elapout(
'nusol3_child: begin backward substitution')
1765 wk(:,nstop:neqns)=wk_d(:,nstop:neqns)
1770 if(ke.lt.ks)
goto 200
1775 wk(1,j)=wk(1,j)-wk(1,i)*zln(1,k)-wk(2,i)*zln(2,k)-wk(3,i)*zln(3,k)
1776 wk(2,j)=wk(2,j)-wk(1,i)*zln(4,k)-wk(2,i)*zln(5,k)-wk(3,i)*zln(6,k)
1777 wk(3,j)=wk(3,j)-wk(1,i)*zln(7,k)-wk(2,i)*zln(8,k)-wk(3,i)*zln(9,k)
1780 call elapout(
'nusol3_child: end backward substitution')
1785 b(1,iperm(i))=wk(1,i)
1786 b(2,iperm(i))=wk(2,i)
1787 b(3,iperm(i))=wk(3,i)
1790 call elapout(
'nusol3_child: end')
1795 subroutine nusolx_child(xlnzr, colno, zln, diag, iperm, b, neqns, nstop, ndeg)
1799 integer(kind=kint),
intent(in) :: xlnzr(:), colno(:), iperm(:)
1800 real(kind=
kreal),
intent(in) :: zln(:,:), diag(:,:)
1801 real(kind=
kreal),
intent(inout) :: b(:,:)
1802 integer(kind=kint),
intent(in) :: neqns, nstop, ndeg
1804 real(kind=
kreal),
allocatable :: wk(:,:), wk_d(:,:)
1805 integer(kind=kint) :: neqns_c, neqns_a, ks, ke, locd, loc1
1806 integer(kind=kint) :: i, j, k, l, m, n, imp, ierr
1812 neqns_c = neqns - nstop + 1
1814 allocate(wk(ndeg,neqns), stat=ierr)
1815 if(ierr .ne. 0)
then
1816 call errtrp(
'stop due to allocation error.')
1820 wk(1,i)=b(1,iperm(i))
1821 wk(2,i)=b(2,iperm(i))
1822 wk(3,i)=b(3,iperm(i))
1830 call sxpdot(ndeg,wk(1,i),wk,zln,colno,ks,ke)
1835 allocate(wk_d(ndeg,nstop:neqns), stat=ierr)
1836 if(ierr .ne. 0)
then
1837 call errtrp(
'stop due to allocation error.')
1844 call sxpdot(ndeg,wk_d(:,i),wk,zln,colno,ks,ke)
1848 imp = m_pds_procinfo%imp
1849 call mpi_send(wk_d, ndeg*neqns_c, mpi_real8, imp, 1,mpi_comm_world, ierr)
1859 wk(n,i)=wk(n,i)-wk(m,i)*diag(loc1,i)
1867 wk(m,i)=wk(m,i)*diag(locd,i)
1873 wk(m,i)=wk(m,i)-wk(n,i)*diag(locd,i)
1879 call mpi_bcast(wk_d, ndeg*neqns_c, mpi_real8, imp, mpi_comm_world, ierr)
1880 wk(:,nstop:neqns)=wk_d(:,nstop:neqns)
1891 wk(m,j)=wk(m,j)-wk(n,i)*zln(n+(m-1)*ndeg,k)
1901 b(l,iperm(i))=wk(l,i)
1909 subroutine nufct0_parent(dsln, diag, neqns, ndeg)
1914 real(kind=
kreal),
intent(inout) :: dsln(:,:)
1915 real(kind=
kreal),
intent(inout) :: diag(:,:)
1916 integer(kind=kint),
intent(in) :: neqns, ndeg
1918 integer(kind=kint) :: ndegl
1920 if (ndeg .eq. 1)
then
1921 call sum3(neqns, dsln(1,:), diag(1,:))
1922 else if (ndeg .eq. 3)
then
1923 call s3um3(neqns, dsln, diag)
1925 ndegl = (ndeg+1)*ndeg/2
1926 call sxum3(neqns, dsln, diag, ndeg, ndegl)
1930 end subroutine nufct0_parent
1934 subroutine nusol0_parent(dsln, diag, b, neqns, ndeg)
1939 real(kind=
kreal),
intent(in) :: dsln(:,:)
1940 real(kind=
kreal),
intent(in) :: diag(:,:)
1941 real(kind=
kreal),
intent(inout) :: b(:,:)
1943 integer(kind=kint),
intent(in) :: neqns, ndeg
1945 if (ndeg .eq. 1)
then
1946 call nusol1_parent(dsln(1,:), diag(1,:), b(1,:), neqns)
1947 else if (ndeg .eq. 3)
then
1948 call nusol3_parent(dsln, diag, b, neqns)
1950 call nusolx_parent(dsln, diag, b, neqns, ndeg)
1954 end subroutine nusol0_parent
1958 subroutine nusol1_parent(dsln, diag, b, neqns)
1965 real(kind=
kreal),
intent(in) :: dsln(:)
1966 real(kind=
kreal),
intent(in) :: diag(:)
1967 real(kind=
kreal),
intent(inout) :: b(:)
1968 integer(kind=kint),
intent(in) :: neqns
1970 integer(kind=kint) :: i,j,k,l,loc
1975 b(i)=b(i)-dot_product(b(1:i-1),dsln(k:k+i-2))
1983 loc=(neqns-1)*neqns/2
1986 b(j)=b(j)-b(i)*dsln(loc)
1992 end subroutine nusol1_parent
1996 subroutine nusol2_parent(dsln, diag, b, neqns)
2002 real(kind=
kreal),
intent(in) :: dsln(:,:)
2003 real(kind=
kreal),
intent(in) :: diag(:,:)
2004 real(kind=
kreal),
intent(inout) :: b(:,:)
2005 integer(kind=kint),
intent(in) :: neqns
2007 integer(kind=kint) :: i,j,k,l,loc
2015 call d2sdot(b(:,i),b,dsln(:, k:k+i-2),i-1)
2023 b(2,i)=b(2,i)-b(1,i)*diag(2,i)
2024 b(1,i)=b(1,i)*diag(1,i)
2025 b(2,i)=b(2,i)*diag(3,i)
2026 b(1,i)=b(1,i)-b(2,i)*diag(2,i)
2034 loc=(neqns-1)*neqns/2
2037 b(1,j)=b(1,j)-b(1,i)*dsln(1,loc)-b(2,i)*dsln(2,loc)
2038 b(2,j)=b(2,j)-b(1,i)*dsln(3,loc)-b(2,i)*dsln(4,loc)
2045 end subroutine nusol2_parent
2049 subroutine nusol3_parent(dsln, diag, b, neqns)
2055 real(kind=
kreal),
intent(in) :: dsln(:,:)
2056 real(kind=
kreal),
intent(in) :: diag(:,:)
2057 real(kind=
kreal),
intent(inout) :: b(:,:)
2058 integer(kind=kint),
intent(in) :: neqns
2060 integer(kind=kint) :: i,j,k,l,loc
2068 call d3sdot(b(:,i),b,dsln(:, k:k+i-2),i-1)
2076 b(2,i)=b(2,i)-b(1,i)*diag(2,i)
2077 b(3,i)=b(3,i)-b(1,i)*diag(4,i)-b(2,i)*diag(5,i)
2078 b(1,i)=b(1,i)*diag(1,i)
2079 b(2,i)=b(2,i)*diag(3,i)
2080 b(3,i)=b(3,i)*diag(6,i)
2081 b(2,i)=b(2,i)-b(3,i)*diag(5,i)
2082 b(1,i)=b(1,i)-b(2,i)*diag(2,i)-b(3,i)*diag(4,i)
2090 loc=(neqns-1)*neqns/2
2093 b(1,j)=b(1,j)-b(1,i)*dsln(1,loc)-b(2,i)*dsln(2,loc)-b(3,i)*dsln(3,loc)
2094 b(2,j)=b(2,j)-b(1,i)*dsln(4,loc)-b(2,i)*dsln(5,loc)-b(3,i)*dsln(6,loc)
2095 b(3,j)=b(3,j)-b(1,i)*dsln(7,loc)-b(2,i)*dsln(8,loc)-b(3,i)*dsln(9,loc)
2101 end subroutine nusol3_parent
2105 subroutine nusolx_parent (dsln,diag,b,neqns,ndeg)
2109 real(kind=
kreal),
intent(in) :: diag(:,:), dsln(:,:)
2110 real(kind=
kreal),
intent(inout) :: b(:,:)
2111 integer(kind=kint),
intent(in) :: neqns, ndeg
2113 integer(kind=kint) :: i,j,k,l,m,n,loc, locd, loc1
2118 call dxsdot(ndeg,b(:,i),b,dsln(:,k:k+i-2),i-1)
2128 b(n,i)=b(n,i)-b(m,i)*diag(loc1,i)
2136 b(m,i)=b(m,i)*diag(locd,i)
2142 b(m,i)=b(m,i)-b(n,i)*diag(locd,i)
2148 loc=(neqns-1)*neqns/2
2153 b(m,j)=b(m,j)-b(n,i)*dsln((m-1)*ndeg+n,loc)
2160 end subroutine nusolx_parent
2164 subroutine s3um2_child(neqns,nstop,xlnzr,colno,zln,diag,spdslnidx,spdslnval,nspdsln)
2168 integer(kind=kint),
intent(in) :: neqns, nstop
2169 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:)
2170 real(kind=
kreal),
intent(inout) :: zln(:,:),diag(:,:)
2171 integer(kind=kint),
pointer :: spdslnidx(:)
2172 real(kind=
kreal),
pointer :: spdslnval(:,:)
2173 integer(kind=kint),
intent(out) :: nspdsln
2175 real(kind=
kreal),
allocatable :: temp(:,:)
2176 integer(kind=kint),
allocatable :: indx(:)
2178 integer(kind=kint) :: i,j,k,l,m,n, ic,ks,ke,ii,jj,jc,j1,j2,loc,ispdsln, ierr
2180 allocate(temp(neqns,9),indx(neqns), stat=ierr)
2181 if(ierr .ne. 0)
then
2182 call errtrp(
'stop due to allocation error.')
2196 do jj=xlnzr(jc),xlnzr(jc+1)-1
2198 if(indx(j).eq.ic)
then
2205 allocate(spdslnidx(nspdsln), stat=ierr)
2206 if(ierr .ne. 0)
then
2207 call errtrp(
'stop due to allocation error.')
2209 allocate(spdslnval(9,nspdsln), stat=ierr)
2210 if(ierr .ne. 0)
then
2211 call errtrp(
'stop due to allocation error.')
2218 do 100 ic=nstop,neqns
2240 zln(4,k)=temp(jj,4)-temp(jj,1)*diag(2,jj)
2241 zln(7,k)=temp(jj,7)-temp(jj,1)*diag(4,jj)-zln(4,k)*diag(5,jj)
2242 zln(1,k)=temp(jj,1)*diag(1,jj)
2243 zln(4,k)=zln(4,k)*diag(3,jj)
2244 zln(7,k)=zln(7,k)*diag(6,jj)
2245 zln(4,k)=zln(4,k)-zln(7,k)*diag(5,jj)
2246 zln(1,k)=zln(1,k)-zln(4,k)*diag(2,jj)-zln(7,k)*diag(4,jj)
2248 zln(5,k)=temp(jj,5)-temp(jj,2)*diag(2,jj)
2249 zln(8,k)=temp(jj,8)-temp(jj,2)*diag(4,jj)-zln(5,k)*diag(5,jj)
2250 zln(2,k)=temp(jj,2)*diag(1,jj)
2251 zln(5,k)=zln(5,k)*diag(3,jj)
2252 zln(8,k)=zln(8,k)*diag(6,jj)
2253 zln(5,k)=zln(5,k)-zln(8,k)*diag(5,jj)
2254 zln(2,k)=zln(2,k)-zln(5,k)*diag(2,jj)-zln(8,k)*diag(4,jj)
2256 zln(6,k)=temp(jj,6)-temp(jj,3)*diag(2,jj)
2257 zln(9,k)=temp(jj,9)-temp(jj,3)*diag(4,jj)-zln(6,k)*diag(5,jj)
2258 zln(3,k)=temp(jj,3)*diag(1,jj)
2259 zln(6,k)=zln(6,k)*diag(3,jj)
2260 zln(9,k)=zln(9,k)*diag(6,jj)
2261 zln(6,k)=zln(6,k)-zln(9,k)*diag(5,jj)
2262 zln(3,k)=zln(3,k)-zln(6,k)*diag(2,jj)-zln(9,k)*diag(4,jj)
2269 diag(1,ic)=diag(1,ic)-temp(jj,1)*zln(1,k)-temp(jj,4)*zln(4,k)-temp(jj,7)*zln(7,k)
2270 diag(2,ic)=diag(2,ic)-temp(jj,1)*zln(2,k)-temp(jj,4)*zln(5,k)-temp(jj,7)*zln(8,k)
2271 diag(3,ic)=diag(3,ic)-temp(jj,2)*zln(2,k)-temp(jj,5)*zln(5,k)-temp(jj,8)*zln(8,k)
2272 diag(4,ic)=diag(4,ic)-temp(jj,1)*zln(3,k)-temp(jj,4)*zln(6,k)-temp(jj,7)*zln(9,k)
2273 diag(5,ic)=diag(5,ic)-temp(jj,2)*zln(3,k)-temp(jj,5)*zln(6,k)-temp(jj,8)*zln(9,k)
2274 diag(6,ic)=diag(6,ic)-temp(jj,3)*zln(3,k)-temp(jj,6)*zln(6,k)-temp(jj,9)*zln(9,k)
2276 do 120 jc=nstop,ic-1
2280 do 220 jj=xlnzr(jc),xlnzr(jc+1)-1
2282 if(indx(j).eq.ic)
then
2287 spdslnidx(ispdsln)=loc
2288 spdslnval(1,ispdsln)=spdslnval(1,ispdsln)-temp(j,1)*zln(1,jj)-temp(j,4)*zln(4,jj)-temp(j,7)*zln(7,jj)
2289 spdslnval(2,ispdsln)=spdslnval(2,ispdsln)-temp(j,2)*zln(1,jj)-temp(j,5)*zln(4,jj)-temp(j,8)*zln(7,jj)
2290 spdslnval(3,ispdsln)=spdslnval(3,ispdsln)-temp(j,3)*zln(1,jj)-temp(j,6)*zln(4,jj)-temp(j,9)*zln(7,jj)
2291 spdslnval(4,ispdsln)=spdslnval(4,ispdsln)-temp(j,1)*zln(2,jj)-temp(j,4)*zln(5,jj)-temp(j,7)*zln(8,jj)
2292 spdslnval(5,ispdsln)=spdslnval(5,ispdsln)-temp(j,2)*zln(2,jj)-temp(j,5)*zln(5,jj)-temp(j,8)*zln(8,jj)
2293 spdslnval(6,ispdsln)=spdslnval(6,ispdsln)-temp(j,3)*zln(2,jj)-temp(j,6)*zln(5,jj)-temp(j,9)*zln(8,jj)
2294 spdslnval(7,ispdsln)=spdslnval(7,ispdsln)-temp(j,1)*zln(3,jj)-temp(j,4)*zln(6,jj)-temp(j,7)*zln(9,jj)
2295 spdslnval(8,ispdsln)=spdslnval(8,ispdsln)-temp(j,2)*zln(3,jj)-temp(j,5)*zln(6,jj)-temp(j,8)*zln(9,jj)
2296 spdslnval(9,ispdsln)=spdslnval(9,ispdsln)-temp(j,3)*zln(3,jj)-temp(j,6)*zln(6,jj)-temp(j,9)*zln(9,jj)
2303 end subroutine s3um2_child
2307 subroutine zpivot(neqns,neqnsz,nttbr,jcol,irow,zpiv,ir)
2311 integer(kind=kint),
intent(in) :: jcol(:),irow(:)
2312 integer(kind=kint),
intent(out) :: zpiv(:)
2313 integer(kind=kint),
intent(in) :: neqns,nttbr
2314 integer(kind=kint),
intent(out) :: neqnsz,ir
2316 integer(kind=kint) :: i,j,k,l
2326 if(i.le.0.or.j.le.0)
then
2329 elseif(i.gt.neqns.or.j.gt.neqns)
then
2333 if(i.eq.j) zpiv(i)=0
2337 if(zpiv(i).eq.0)
then
2344 if(ldbg)
write(idbg,*)
'# zpivot ########################'
2345 if(ldbg)
write(idbg,60) (zpiv(i),i=1,neqns)
2348 end subroutine zpivot
2352 subroutine stsmat(neqns,nttbr,irow,jcol,jcpt,jcolno)
2356 integer(kind=kint),
intent(in) :: irow(:), jcol(:)
2357 integer(kind=kint),
intent(out) :: jcpt(:), jcolno(:)
2358 integer(kind=kint),
intent(in) :: neqns, nttbr
2360 integer(kind=kint) :: i,j,k,l,loc,locr
2379 if(loc.eq.0)
goto 120
2380 if(jcolno(loc).eq.j)
then
2382 elseif(jcolno(loc).gt.j)
then
2402 if(loc.eq.0)
goto 170
2403 if(jcolno(loc).eq.i)
then
2405 elseif(jcolno(loc).gt.i)
then
2423 write(idbg,*)
'jcolno'
2424 write(idbg,60) (jcolno(i),i=1,k)
2425 write(idbg,*)
'jcpt'
2426 write(idbg,60) (jcpt(i),i=1,k)
2430 end subroutine stsmat
2433 subroutine stiaja(neqns,neqnsz,ia,ja,jcpt,jcolno)
2439 integer(kind=kint),
intent(in) :: jcpt(:),jcolno(:)
2440 integer(kind=kint),
intent(out) :: ia(:),ja(:)
2441 integer(kind=kint),
intent(in) :: neqns, neqnsz
2443 integer(kind=kint) :: i,j,k,l,ii,loc
2451 if(loc.eq.0)
goto 120
2453 if(ii.eq.k.or.ii.gt.neqnsz)
goto 130
2462 write(idbg,*)
'stiaja(): ia '
2463 write(idbg,60) (ia(i),i=1,neqns+1)
2464 write(idbg,*)
'stiaja(): ja '
2465 write(idbg,60) (ja(i),i=1,ia(neqns+1))
2469 end subroutine stiaja
2473 subroutine idntty(neqns,invp,iperm)
2477 integer(kind=kint),
intent(out) :: invp(:),iperm(:)
2478 integer(kind=kint),
intent(in) :: neqns
2480 integer(kind=kint) :: i
2491 subroutine genqmd(neqns,xadj,adj0,perm,invp,deg,marker,rchset,nbrhd,qsize,qlink,nofsub,adjncy)
2495 integer(kind=kint),
intent(in) :: adj0(:),xadj(:)
2496 integer(kind=kint),
intent(out) :: rchset(:),nbrhd(:),adjncy(:),perm(:),invp(:),deg(:),marker(:),qsize(:),qlink(:)
2497 integer(kind=kint),
intent(in) :: neqns
2498 integer(kind=kint),
intent(out) :: nofsub
2500 integer(kind=kint) :: inode,ip,irch,mindeg,nhdsze,node,np,num,nump1,nxnode,rchsze,search,thresh,ndeg
2501 integer(kind=kint) :: i,j,k,l
2505 do 10 i=1,xadj(neqns+1)-1
2514 ndeg=xadj(node+1)-xadj(node)
2516 if(ndeg.lt.mindeg) mindeg=ndeg
2524 if(nump1.gt.search) search=nump1
2525 do 400 j=search,neqns
2527 if(marker(node).lt.0)
goto 400
2529 if(ndeg.le.thresh)
goto 500
2530 if(ndeg.lt.mindeg) mindeg=ndeg
2535 nofsub=nofsub+deg(node)
2537 call qmdrch(node,xadj,adjncy,deg,marker,rchsze,rchset,nhdsze,nbrhd)
2547 nxnode=qlink(nxnode)
2548 if(nxnode.gt.0)
goto 600
2549 if(rchsze.le.0)
goto 800
2551 call qmdupd(xadj,adjncy,rchsze,rchset,deg,qsize,qlink,marker,rchset(rchsze+1:),nbrhd(nhdsze+1:))
2553 do 700 irch=1,rchsze
2555 if(marker(inode).lt.0)
goto 700
2558 if(ndeg.lt.mindeg) mindeg=ndeg
2559 if(ndeg.gt.thresh)
goto 700
2564 if(nhdsze.gt.0)
call qmdot(node,xadj,adjncy,marker,rchsze,rchset,nbrhd)
2565 800
if(num.lt.neqns)
goto 300
2567 end subroutine genqmd
2571 subroutine genpaq(xadj,adjncy,invp,iperm,parent,neqns,ancstr)
2575 integer(kind=kint),
intent(in) :: xadj(:),adjncy(:),invp(:),iperm(:)
2576 integer(kind=kint),
intent(out) :: parent(:),ancstr(:)
2577 integer(kind=kint),
intent(in) :: neqns
2579 integer(kind=kint) :: i,j,k,l,ip,it
2585 do 110 k=xadj(ip),xadj(ip+1)-1
2589 if(ancstr(l).eq.0)
goto 111
2590 if(ancstr(l).eq.i)
goto 110
2601 if(parent(i).eq.0) parent(i)=neqns+1
2604 if(ldbg)
write(idbg,6010)
2605 if(ldbg)
write(idbg,6000) (i,parent(i),i=1,neqns)
2607 6010
format(
' parent')
2609 end subroutine genpaq
2613 subroutine genbtq(xadj,adjncy,invp,iperm,parent,btree,zpiv,izz,neqns)
2617 integer(kind=kint),
intent(in) :: xadj(:),adjncy(:),parent(:),invp(:),iperm(:),zpiv(:)
2618 integer(kind=kint),
intent(out) :: btree(:,:)
2619 integer(kind=kint),
intent(in) :: neqns
2620 integer(kind=kint),
intent(out) :: izz
2622 integer(kind=kint) :: i,j,k,l,ip,ib,inext
2630 if(ip.le.0)
goto 100
2649 if(zpiv(i).ne.0)
then
2650 if(btree(1,invp(i)).eq.0)
then
2658 if(ldbg)
write(idbg,6010)
2659 if(ldbg)
write(idbg,6000) (i,btree(1,i),btree(2,i),i=1,neqns)
2660 if(ldbg)
write(idbg,6020) izz
2663 6000
format(i6,
'(',2i6,
')')
2664 6010
format(
' binary tree')
2665 6020
format(
' the first zero pivot is ',i4)
2668 end subroutine genbtq
2672 subroutine rotate(xadj,adjncy,invp,iperm,parent,btree,izz,neqns,anc,adjt,irr)
2676 integer(kind=kint),
intent(in) :: xadj(:),adjncy(:),parent(:),btree(:,:)
2677 integer(kind=kint),
intent(out) :: anc(:),adjt(:),invp(:),iperm(:)
2678 integer(kind=kint),
intent(in) :: neqns,izz
2679 integer(kind=kint),
intent(out) :: irr
2681 integer(kind=kint) :: i,j,k,l,izzz,nanc,loc,locc,ll,kk,iy
2694 if(btree(1,izzz).ne.0)
then
2708 if(loc.ne.0)
goto 100
2722 if(locc.ne.0)
goto 220
2724 do 240 k=xadj(iperm(loc)),xadj(iperm(loc)+1)-1
2725 adjt(invp(adjncy(k)))=1
2727 if(loc.ge.anc(l))
goto 250
2729 if(locc.ne.0)
goto 220
2734 if(adjt(anc(ll)).eq.0)
then
2754 if(adjt(ll).eq.0)
then
2768 if(locc.ne.0)
goto 350
2770 do 370 kk=xadj(iperm(loc)),xadj(iperm(loc)+1)-1
2771 adjt(invp(adjncy(kk)))=1
2773 if(loc.ge.iy)
goto 380
2775 if(locc.ne.0)
goto 350
2780 if(adjt(anc(ll)).eq.0)
then
2782 invp(iperm(anc(ll)))=k
2787 if(adjt(anc(ll)).ne.0)
then
2789 invp(iperm(anc(ll)))=k
2799 if(i.eq.izzz)
goto 510
2803 invp(iperm(izzz))=neqns
2811 if(ldbg)
write(idbg,6000) (invp(i),i=1,neqns)
2814 end subroutine rotate
2818 subroutine bringu(zpiv,iperm,invp,parent,izz,neqns,irr)
2822 integer(kind=kint),
intent(in) :: zpiv(:),parent(:)
2823 integer(kind=kint),
intent(out) :: iperm(:),invp(:)
2824 integer(kind=kint),
intent(in) :: neqns,izz
2825 integer(kind=kint),
intent(out) :: irr
2827 integer(kind=kint) :: i,j,k,l,ib0,ib,ibp,izzp
2845 if(ib.le.0)
goto 1000
2848 if(zpiv(izzp).eq.0)
goto 110
2858 if(invp(iperm(i)).ne.i)
goto 210
2859 if(iperm(invp(i)).ne.i)
goto 210
2863 write(20,*)
'permutation error'
2870 end subroutine bringu
2874 subroutine posord(parent,btree,invp,iperm,pordr,nch,neqns,iw,qarent,mch)
2878 integer(kind=kint),
intent(in) :: btree(:,:),qarent(:)
2879 integer(kind=kint),
intent(out) :: pordr(:),invp(:),iperm(:),nch(:),iw(:),parent(:),mch(0:neqns+1)
2880 integer(kind=kint),
intent(in) :: neqns
2882 integer(kind=kint) :: i,j,k,l,locc,loc,locp,invpos,ipinv,ii
2893 if(locc.ne.0)
goto 10
2895 mch(locp)=mch(locp)+1
2898 if(l.ge.neqns)
goto 1000
2901 if(locc.ne.0)
goto 10
2904 mch(locp)=mch(locp)+mch(loc)+1
2908 ipinv=pordr(invp(i))
2917 if(ii.gt.0.and.ii.le.neqns)
then
2920 parent(i)=qarent(invpos)
2923 if(ldbg)
write(idbg,6020)
2924 if(ldbg)
write(idbg,6000) (pordr(i),i=1,neqns)
2925 if(ldbg)
write(idbg,6030)
2926 if(ldbg)
write(idbg,6050)
2927 if(ldbg)
write(idbg,6000) (parent(i),i=1,neqns)
2928 if(ldbg)
write(idbg,6000) (invp(i),i=1,neqns)
2929 if(ldbg)
write(idbg,6040)
2930 if(ldbg)
write(idbg,6000) (iperm(i),i=1,neqns)
2931 if(ldbg)
write(idbg,6010)
2932 if(ldbg)
write(idbg,6000) (nch(i),i=1,neqns)
2935 6020
format(
' post order')
2936 6030
format(/
' invp ')
2937 6040
format(/
' iperm ')
2938 6050
format(/
' parent')
2940 end subroutine posord
2944 subroutine gnleaf(xadj,adjncy,invp,iperm,pordr,nch,adjncp,xleaf,leaf,neqns,lnleaf)
2948 integer(kind=kint),
intent(in) :: xadj(:),adjncy(:),pordr(:),nch(:),invp(:),iperm(:)
2949 integer(kind=kint),
intent(out) :: xleaf(:),leaf(:),adjncp(:)
2950 integer(kind=kint),
intent(in) :: neqns
2952 integer(kind=kint) i,j,k,l,m,n,ik,istart,ip,iq,lnleaf,lc1,lc
2960 do 105 k=xadj(ip),xadj(ip+1)-1
2969 call qqsort(adjncp(istart+1:),m)
2970 lc1=adjncp(istart+1)
2971 if(lc1.ge.i)
goto 100
2974 do 130 k=istart+2,ik
2977 if(lc1.lt.lc-nch(lc))
then
2990 if(ldbg)
write(idbg,6020)
2991 if(ldbg)
write(idbg,6000) (xleaf(i),i=1,neqns+1)
2992 if(ldbg)
write(idbg,6010) lnleaf
2993 if(ldbg)
write(idbg,6000) (leaf(i),i=1,lnleaf)
2996 6010
format(
' leaf (len = ',i6,
')')
2997 6020
format(
' xleaf')
2998 end subroutine gnleaf
3002 subroutine countclno(parent,xleaf,leaf,neqns,nstop,lncol,ir)
3012 integer(kind=kint),
intent(in) :: parent(:),xleaf(:),leaf(:)
3013 integer(kind=kint),
intent(in) :: neqns, nstop
3014 integer(kind=kint),
intent(out) :: lncol, ir
3016 integer(kind=kint) :: i,j,k,l,nc,ks,ke,nxleaf
3024 if(ke.lt.ks)
goto 100
3030 if(j.ge.nxleaf)
goto 110
3040 if(j.ge.nstop)
goto 100
3041 if(j.ge.i.or.j.eq.0)
goto 100
3048 end subroutine countclno
3052 subroutine gnclno(parent,pordr,xleaf,leaf,xlnzr,colno,neqns,nstop,lncol,ir)
3056 integer(kind=kint),
intent(in) :: parent(:),pordr(:),xleaf(:),leaf(:)
3057 integer(kind=kint),
intent(out) :: colno(:),xlnzr(:)
3058 integer(kind=kint),
intent(in) :: neqns, nstop
3059 integer(kind=kint),
intent(out) :: lncol,ir
3061 integer(kind=kint) :: i,j,k,l,nc,ks,ke,nxleaf
3070 if(ke.lt.ks)
goto 100
3076 if(j.ge.nxleaf)
goto 110
3087 if(j.ge.nstop)
goto 100
3088 if(j.ge.i.or.j.eq.0)
goto 100
3096 if(ldbg)
write(idbg,6010)
3098 if(ldbg)
write(idbg,6020) lncol
3102 write(idbg,6000) (colno(i),i=xlnzr(k),xlnzr(k+1)-1)
3106 6010
format(
' xlnzr')
3107 6020
format(
' colno (lncol =',i10,
')')
3108 6100
format(/
' row = ',i6)
3110 end subroutine gnclno
3114 subroutine qmdrch(root,xadj,adjncy,deg,marker,rchsze,rchset,nhdsze,nbrhd)
3118 integer(kind=kint),
intent(in) :: deg(:),xadj(:),adjncy(:)
3119 integer(kind=kint),
intent(out) :: rchset(:),marker(:),nbrhd(:)
3120 integer(kind=kint),
intent(in) :: root
3121 integer(kind=kint),
intent(out) :: nhdsze,rchsze
3123 integer(kind=kint) :: i,j,k,l, istrt, istop, jstrt, jstop, nabor, node
3128 istop=xadj(root+1)-1
3129 if(istop.lt.istrt)
return
3130 do 600 i=istrt,istop
3132 if(nabor.eq.0)
return
3133 if(marker(nabor).ne.0)
goto 600
3134 if(deg(nabor).lt.0)
goto 200
3136 rchset(rchsze)=nabor
3139 200 marker(nabor)=-1
3142 300 jstrt=xadj(nabor)
3143 jstop=xadj(nabor+1)-1
3144 do 500 j=jstrt,jstop
3147 if(node) 300,600,400
3148 400
if(marker(node).ne.0)
goto 500
3155 end subroutine qmdrch
3159 subroutine qmdupd(xadj,adjncy,nlist,list,deg,qsize,qlink,marker,rchset,nbrhd)
3163 integer(kind=kint),
intent(in) :: adjncy(:),list(:),xadj(:)
3164 integer(kind=kint),
intent(out) :: marker(:),nbrhd(:),rchset(:),deg(:),qsize(:),qlink(:)
3165 integer(kind=kint),
intent(in) :: nlist
3167 integer(kind=kint) :: i,j,k,l, deg0,deg1,il,inhd,inode,irch,jstrt,jstop,mark,nabor,nhdsze,node,rchsze
3169 if(nlist.le.0)
return
3174 deg0=deg0+qsize(node)
3176 jstop=xadj(node+1)-1
3178 do 100 j=jstrt,jstop
3180 if(marker(nabor).ne.0.or.deg(nabor).ge.0)
goto 100
3187 if(nhdsze.gt.0)
call qmdmrg(xadj,adjncy,deg,qsize,qlink,marker,deg0,nhdsze,nbrhd,rchset,nbrhd(nhdsze+1:))
3191 if(mark.gt.1.or.mark.lt.0)
goto 600
3192 call qmdrch(node,xadj,adjncy,deg,marker,rchsze,rchset,nhdsze,nbrhd)
3194 if(rchsze.le.0)
goto 400
3195 do 300 irch=1,rchsze
3197 deg1=deg1+qsize(inode)
3200 400 deg(node)=deg1-1
3201 if(nhdsze.le.0)
goto 600
3202 do 500 inhd=1,nhdsze
3208 end subroutine qmdupd
3212 subroutine qmdot(root,xadj,adjncy,marker,rchsze,rchset,nbrhd)
3216 integer(kind=kint),
intent(in) :: marker(:),rchset(:),nbrhd(:),xadj(:)
3217 integer(kind=kint),
intent(out) :: adjncy(:)
3218 integer(kind=kint),
intent(in) :: rchsze,root
3220 integer(kind=kint) :: i,j,k,l,irch,inhd,node,jstrt,jstop,link,nabor
3225 100 jstrt=xadj(node)
3226 jstop=xadj(node+1)-2
3227 if(jstop.lt.jstrt)
goto 300
3228 do 200 j=jstrt,jstop
3230 adjncy(j)=rchset(irch)
3231 if(irch.ge.rchsze)
goto 400
3233 300 link=adjncy(jstop+1)
3235 if(link.lt.0)
goto 100
3238 adjncy(jstop+1)=-node
3241 do 600 irch=1,rchsze
3243 if(marker(node).lt.0)
goto 600
3245 jstop=xadj(node+1)-1
3246 do 500 j=jstrt,jstop
3248 if(marker(nabor).ge.0)
goto 500
3254 end subroutine qmdot
3258 subroutine qmdmrg(xadj,adjncy,deg,qsize,qlink,marker,deg0,nhdsze,nbrhd,rchset,ovrlp)
3262 integer(kind=kint),
intent(in) :: adjncy(:),nbrhd(:),xadj(:)
3263 integer(kind=kint),
intent(out) :: deg(:),marker(:),rchset(:),ovrlp(:),qsize(:),qlink(:)
3264 integer(kind=kint),
intent(in) :: nhdsze
3266 integer(kind=kint) :: i,j,k,l, deg0,deg1,head,inhd,iov,irch,jstrt,jstop,link,lnode,mark,mrgsze,nabor,node,novrlp,rchsze,root
3269 if(nhdsze.le.0)
return
3270 do 100 inhd=1,nhdsze
3274 do 1400 inhd=1,nhdsze
3280 200 jstrt=xadj(root)
3281 jstop=xadj(root+1)-1
3282 do 600 j=jstrt,jstop
3285 if(nabor) 200,700,300
3286 300 mark=marker(nabor)
3289 rchset(rchsze)=nabor
3290 deg1=deg1+qsize(nabor)
3293 500
if(mark.gt.1)
goto 600
3300 do 1100 iov=1,novrlp
3303 jstop=xadj(node+1)-1
3304 do 800 j=jstrt,jstop
3306 if(marker(nabor).ne.0)
goto 800
3310 mrgsze=mrgsze+qsize(node)
3313 900 link=qlink(lnode)
3314 if(link.le.0)
goto 1000
3317 1000 qlink(lnode)=head
3320 if(head.le.0)
goto 1200
3322 deg(head)=deg0+deg1-1
3324 1200 root=nbrhd(inhd)
3326 if(rchsze.le.0)
goto 1400
3327 do 1300 irch=1,rchsze
3333 end subroutine qmdmrg
3337 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)
3343 integer(kind=kint),
intent(in) :: xlnzr_a(:)
3344 integer(kind=kint),
intent(in) :: colno_a(:)
3345 integer(kind=kint),
intent(in) :: iperm_a(:)
3346 integer(kind=kint),
intent(in) :: invp_a(:)
3347 integer(kind=kint),
intent(in) :: ndeg
3348 integer(kind=kint),
intent(in) :: nttbr_c
3349 integer(kind=kint),
intent(in) :: irow_c(:)
3350 integer(kind=kint),
intent(inout) :: jcol_c(:)
3351 integer(kind=kint),
intent(in) :: ncol
3352 integer(kind=kint),
intent(in) :: nrow
3355 integer(kind=kint),
pointer :: xlnzr_c(:)
3356 integer(kind=kint),
pointer :: colno_c(:)
3357 integer(kind=kint),
intent(out) :: lncol_c
3360 integer(kind=kint) :: i,j,k,l,m,n
3361 integer(kind=kint) :: ks, ke, ipass, ierr
3362 logical,
allocatable :: cnz(:)
3363 type(crs_matrix) :: crs_c
3367 jcol_c(i)=invp_a(jcol_c(i))
3374 allocate(cnz(ncol), stat=ierr)
3375 if(ierr .ne. 0)
then
3376 call errtrp(
'stop due to allocation error.')
3384 ke = crs_c%ia(k+1)-1
3385 if (ke .lt. ks)
then
3386 if (ipass .eq. 2)
then
3387 xlnzr_c(k+1)=lncol_c+1
3393 cnz(crs_c%ja(i)) = .true.
3400 if (ke .lt. ks)
then
3404 if (cnz(colno_a(j)))
then
3413 lncol_c = lncol_c + 1
3414 if (ipass .eq. 2)
then
3415 colno_c(lncol_c) = i
3419 if (ipass .eq. 2)
then
3420 xlnzr_c(k+1)=lncol_c + 1
3424 if (ipass .eq. 1)
then
3425 allocate(xlnzr_c(nrow+1),colno_c(lncol_c), stat=ierr)
3426 if(ierr .ne. 0)
then
3427 call errtrp(
'stop due to allocation error.')
3435 jcol_c(i)=iperm_a(jcol_c(i))
3440 end subroutine ldudecomposec
3448 integer(kind=kint),
intent(out) :: iw(:)
3449 integer(kind=kint),
intent(in) :: ik
3451 integer(kind=kint) :: l,m,itemp
3465 if(iw(l).lt.iw(m))
goto 110
3478 subroutine staij1(isw,i,j,aij,dsi,ir)
3502 real(kind=
kreal),
intent(out) :: aij(:)
3503 integer(kind=kint),
intent(in) :: isw, i, j
3504 integer(kind=kint),
intent(out) :: ir
3506 integer(kind=kint) :: ndeg, neqns, nstop, ndeg2, ndeg2l, ierr
3511 ndeg2l=ndeg*(ndeg+1)/2
3518 if(dsi%stage.ne.20)
then
3519 if(dsi%stage.eq.30)
write(ilog,*)
'Warning a matrix was build up but never solved.'
3523 allocate(dsi%diag(ndeg2l,neqns), stat=ierr)
3524 if(ierr .ne. 0)
then
3525 call errtrp(
'stop due to allocation error.')
3531 allocate(dsi%zln(ndeg2,dsi%lncol), stat=ierr)
3532 if(ierr .ne. 0)
then
3533 call errtrp(
'stop due to allocation error.')
3547 call addr0(isw,i,j,aij,dsi%invp,dsi%xlnzr,dsi%colno,dsi%diag,dsi%zln,dsi%dsln,nstop,dsi%ndeg,ir)
3548 elseif(ndeg.eq.3)
then
3549 call addr3(isw,i,j,aij,dsi%invp,dsi%xlnzr,dsi%colno,dsi%diag,dsi%zln,dsi%dsln,nstop,ir)
3551 call addrx(isw,i,j,aij,dsi%invp,dsi%xlnzr,dsi%colno,dsi%diag,dsi%zln,dsi%dsln,nstop,ndeg,ndeg2,ndeg2l,ir)
3555 end subroutine staij1
3564 subroutine sum(ic,xlnzr,colno,zln,diag,nch,par,neqns)
3568 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),par(:)
3569 integer(kind=kint),
intent(in) :: ic, neqns
3570 real(kind=
kreal),
intent(inout) :: zln(:),diag(:)
3571 integer(kind=kint),
intent(out) :: nch(:)
3573 real(kind=
kreal) :: s, t, zz, piv
3574 integer(kind=kint) :: ks, ke, kk, k, jc, jj, j, ierr
3575 integer(kind=kint) :: isem
3576 real(kind=
kreal),
allocatable :: temp(:)
3577 integer(kind=kint),
allocatable :: indx(:)
3578 allocate(temp(neqns),indx(neqns), stat=ierr)
3579 if(ierr .ne. 0)
then
3580 call errtrp(
'stop due to allocation error.')
3596 do 310 jj=xlnzr(jc),xlnzr(jc+1)-1
3598 if(indx(j).eq.ic)
then
3612 if(dabs(piv).gt.rmin)
then
3631 subroutine sum1(ic,xlnzr,colno,zln,diag,par,neqns)
3635 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),par(:)
3636 integer(kind=kint),
intent(in) :: ic, neqns
3637 real(kind=
kreal),
intent(inout) :: zln(:),diag(:)
3639 real(kind=
kreal) :: s, t, zz
3640 integer(kind=kint) :: ks, ke, k, jc, j, jj, ierr
3641 real(kind=
kreal),
allocatable :: temp(:)
3642 integer(kind=kint),
allocatable :: indx(:)
3646 allocate(temp(neqns),indx(neqns), stat=ierr)
3647 if(ierr .ne. 0)
then
3648 call errtrp(
'stop due to allocation error.')
3661 do 310 jj=xlnzr(jc),xlnzr(jc+1)-1
3663 if(indx(j).eq.ic)
then
3682 subroutine sum2_child(neqns,nstop,xlnzr,colno,zln,diag,spdslnidx,spdslnval,nspdsln)
3686 integer(kind=kint),
intent(in) :: neqns, nstop
3687 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:)
3688 real(kind=
kreal),
intent(inout) :: zln(:),diag(:)
3689 integer(kind=kint),
pointer :: spdslnidx(:)
3690 real(kind=
kreal),
pointer :: spdslnval(:,:)
3691 integer(kind=kint),
intent(out) :: nspdsln
3693 real(kind=
kreal) :: s, t
3694 integer(kind=kint) :: ks, ke, kk, k, jc, jj, j, j1,j2
3695 integer(kind=kint) :: ic, i, loc, ierr
3696 integer(kind=kint) :: ispdsln
3698 real(kind=
kreal),
allocatable :: temp(:)
3699 integer(kind=kint),
allocatable :: indx(:)
3701 allocate(temp(neqns),indx(neqns), stat=ierr)
3702 if(ierr .ne. 0)
then
3703 call errtrp(
'stop due to allocation error.')
3717 do jj=xlnzr(jc),xlnzr(jc+1)-1
3719 if(indx(j).eq.ic)
then
3726 allocate(spdslnidx(nspdsln),spdslnval(1,nspdsln), stat=ierr)
3727 if(ierr .ne. 0)
then
3728 call errtrp(
'stop due to allocation error.')
3735 do 100 ic=nstop,neqns
3744 zln(k)=temp(jj)*diag(jj)
3746 diag(ic)=diag(ic)-temp(jj)*zln(k)
3748 do 120 jc=nstop,ic-1
3751 do 220 jj=xlnzr(jc),xlnzr(jc+1)-1
3753 if(indx(j).eq.ic)
then
3761 spdslnidx(ispdsln)=loc
3762 spdslnval(1,ispdsln)=spdslnval(1,ispdsln)-s
3770 end subroutine sum2_child
3774 subroutine sum3(n,dsln,diag)
3778 real(kind=
kreal),
intent(inout) :: dsln(:),diag(:)
3779 integer(kind=kint),
intent(in) :: n
3781 integer(kind=kint) :: i, j, loc, ierr
3782 real(kind=
kreal),
allocatable :: temp(:)
3783 integer(kind=kint),
allocatable :: indx(:)
3784 allocate(temp(n),indx(n), stat=ierr)
3785 if(ierr .ne. 0)
then
3786 call errtrp(
'stop due to allocation error.')
3789 if(n.le.0)
goto 1000
3792 diag(1)=1.0d0/diag(1)
3796 dsln(loc)=dsln(loc)-dot_product(dsln(indx(i):indx(i)+j-2),dsln(indx(j):indx(j)+j-2))
3799 temp(1:i-1)=dsln(indx(i):indx(i)+i-2)*diag(1:i-1)
3800 diag(i)=diag(i)-dot_product(temp(1:i-1),dsln(indx(i):indx(i)+i-2))
3801 dsln(indx(i):indx(i)+i-2)=temp(1:i-1)
3802 diag(i)=1.0d0/diag(i)
3810 real(kind=
kreal)
function spdot2(b,zln,colno,ks,ke)
3814 integer(kind=kint),
intent(in) :: colno(:)
3815 integer(kind=kint),
intent(in) :: ks,ke
3816 real(kind=
kreal),
intent(in) :: zln(:),b(:)
3818 integer(kind=kint) :: j,jj
3819 real(kind=
kreal) :: s
3840 real(kind=
kreal)
function ddot(a,b,n)
3844 real(kind=
kreal),
intent(in) :: a(n),b(n)
3845 integer(kind=kint),
intent(in) :: n
3847 real(kind=
kreal) :: s
3848 integer(kind=kint) :: i
3860 subroutine addr0(isw,i,j,aij,invp,xlnzr,colno,diag,zln,dsln,nstop,ndeg,ir)
3864 integer(kind=kint),
intent(in) :: isw
3865 integer(kind=kint),
intent(in) :: i,j,nstop, ndeg, invp(:),xlnzr(:),colno(:)
3866 real(kind=
kreal),
intent(inout) :: zln(:,:),diag(:,:),dsln(:,:),aij(:)
3867 integer(kind=kint),
intent(out) :: ir
3869 integer(kind=kint) :: ndeg2, ii, jj, itrans, k, i0, j0, l, ks, ke
3870 integer(kind=kint),
parameter :: idbg=0
3876 if(idbg.ne.0)
write(idbg,*)
'addr0',ii,jj,aij
3882 diag(1,ii)=diag(1,ii)+aij(1)
3884 elseif(ndeg2.eq.4)
then
3890 diag(1,ii)=diag(1,ii)+aij(1)
3891 diag(2,ii)=diag(2,ii)+aij(2)
3892 diag(3,ii)=diag(3,ii)+aij(4)
3904 if(jj.ge.nstop)
then
3911 elseif(ndeg2.eq.4)
then
3912 if(itrans.eq.0)
then
3929 if(colno(k).eq.jj)
then
3933 elseif(ndeg2.eq.4)
then
3934 if(itrans.eq.0)
then
3947 zln(1,k)=zln(1,k)+aij(1)
3948 elseif(ndeg2.eq.4)
then
3949 if(itrans.eq.0)
then
3951 zln(l,k)=zln(l,k)+aij(l)
3954 zln(1,k)=zln(1,k)+aij(1)
3955 zln(2,k)=zln(2,k)+aij(3)
3956 zln(3,k)=zln(3,k)+aij(2)
3957 zln(4,k)=zln(4,k)+aij(4)
3967 end subroutine addr0
3975 subroutine s3um(ic,xlnzr,colno,zln,diag,nch,par,neqns)
3979 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),par(:)
3980 integer(kind=kint),
intent(out) :: nch(:)
3981 real(kind=
kreal),
intent(out) :: zln(:,:), diag(:,:)
3982 integer(kind=kint),
intent(in) :: ic,neqns
3984 real(kind=
kreal),
allocatable :: temp(:,:)
3985 integer(kind=kint),
allocatable :: indx(:)
3986 real(kind=
kreal) :: zz(9),t(6)
3987 integer(kind=kint) :: i,j,k,l,ks,ke,kk,jc,jj,ir, ierr
3989 allocate(temp(9,neqns),indx(neqns), stat=ierr)
3990 if(ierr .ne. 0)
then
3991 call errtrp(
'stop due to allocation error.')
4007 do 310 jj=xlnzr(jc),xlnzr(jc+1)-1
4009 if(indx(j).eq.ic)
then
4010 zz(1)=zz(1)-temp(1,j)*zln(1,jj)-temp(4,j)*zln(4,jj)-temp(7,j)*zln(7,jj)
4011 zz(2)=zz(2)-temp(2,j)*zln(1,jj)-temp(5,j)*zln(4,jj)-temp(8,j)*zln(7,jj)
4012 zz(3)=zz(3)-temp(3,j)*zln(1,jj)-temp(6,j)*zln(4,jj)-temp(9,j)*zln(7,jj)
4013 zz(4)=zz(4)-temp(1,j)*zln(2,jj)-temp(4,j)*zln(5,jj)-temp(7,j)*zln(8,jj)
4014 zz(5)=zz(5)-temp(2,j)*zln(2,jj)-temp(5,j)*zln(5,jj)-temp(8,j)*zln(8,jj)
4015 zz(6)=zz(6)-temp(3,j)*zln(2,jj)-temp(6,j)*zln(5,jj)-temp(9,j)*zln(8,jj)
4016 zz(7)=zz(7)-temp(1,j)*zln(3,jj)-temp(4,j)*zln(6,jj)-temp(7,j)*zln(9,jj)
4017 zz(8)=zz(8)-temp(2,j)*zln(3,jj)-temp(5,j)*zln(6,jj)-temp(8,j)*zln(9,jj)
4018 zz(9)=zz(9)-temp(3,j)*zln(3,jj)-temp(6,j)*zln(6,jj)-temp(9,j)*zln(9,jj)
4022 call inv33(zln(:,k),zz,diag(:,jc))
4028 t(1)=t(1)+zz(1)*zln(1,k)+zz(4)*zln(4,k)+zz(7)*zln(7,k)
4029 t(2)=t(2)+zz(1)*zln(2,k)+zz(4)*zln(5,k)+zz(7)*zln(8,k)
4030 t(3)=t(3)+zz(2)*zln(2,k)+zz(5)*zln(5,k)+zz(8)*zln(8,k)
4031 t(4)=t(4)+zz(1)*zln(3,k)+zz(4)*zln(6,k)+zz(7)*zln(9,k)
4032 t(5)=t(5)+zz(2)*zln(3,k)+zz(5)*zln(6,k)+zz(8)*zln(9,k)
4033 t(6)=t(6)+zz(3)*zln(3,k)+zz(6)*zln(6,k)+zz(9)*zln(9,k)
4037 diag(l,ic)=diag(l,ic)-t(l)
4040 call inv3(diag(:,ic),ir)
4050 subroutine s3um1(ic,xlnzr,colno,zln,diag,nch,par,neqns)
4054 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),nch(:),par(:)
4055 real(kind=
kreal),
intent(in) :: diag(:,:)
4056 real(kind=
kreal),
intent(out) :: zln(:,:)
4057 integer(kind=kint),
intent(in) :: ic,neqns
4059 integer(kind=kint) :: i,j,k,l,ks,ke,jc,jj,ierr
4060 real(kind=
kreal) :: s(9),zz(9)
4061 real(kind=
kreal),
allocatable :: temp(:,:)
4062 integer(kind=kint),
allocatable :: indx(:)
4065 allocate(temp(9,neqns),indx(neqns), stat=ierr)
4079 do 310 jj=xlnzr(jc),xlnzr(jc+1)-1
4081 if(indx(j).eq.ic)
then
4082 s(1)=s(1)+temp(1,j)*zln(1,jj)+temp(4,j)*zln(4,jj)+temp(7,j)*zln(7,jj)
4083 s(2)=s(2)+temp(2,j)*zln(1,jj)+temp(5,j)*zln(4,jj)+temp(8,j)*zln(7,jj)
4084 s(3)=s(3)+temp(3,j)*zln(1,jj)+temp(6,j)*zln(4,jj)+temp(9,j)*zln(7,jj)
4085 s(4)=s(4)+temp(1,j)*zln(2,jj)+temp(4,j)*zln(5,jj)+temp(7,j)*zln(8,jj)
4086 s(5)=s(5)+temp(2,j)*zln(2,jj)+temp(5,j)*zln(5,jj)+temp(8,j)*zln(8,jj)
4087 s(6)=s(6)+temp(3,j)*zln(2,jj)+temp(6,j)*zln(5,jj)+temp(9,j)*zln(8,jj)
4088 s(7)=s(7)+temp(1,j)*zln(3,jj)+temp(4,j)*zln(6,jj)+temp(7,j)*zln(9,jj)
4089 s(8)=s(8)+temp(2,j)*zln(3,jj)+temp(5,j)*zln(6,jj)+temp(8,j)*zln(9,jj)
4090 s(9)=s(9)+temp(3,j)*zln(3,jj)+temp(6,j)*zln(6,jj)+temp(9,j)*zln(9,jj)
4095 temp(l,jc)=zln(l,k)-s(l)
4102 deallocate(temp,indx)
4103 end subroutine s3um1
4108 subroutine s3um3(n,dsln,diag)
4112 real(kind=
kreal),
intent(out) :: dsln(:,:),diag(:,:)
4113 integer(kind=kint),
intent(in) :: n
4115 real(kind=
kreal) :: t(9)
4116 integer(kind=kint) :: i,j,k,l,loc,ir, ierr
4117 real(kind=
kreal),
allocatable :: temp(:,:)
4118 integer(kind=kint),
allocatable :: indx(:)
4120 allocate(temp(9,n),indx(n), stat=ierr)
4121 if(ierr .ne. 0)
then
4122 call errtrp(
'stop due to allocation error.')
4125 if(n.le.0)
goto 1000
4128 call inv3(diag(:,1),ir)
4132 call d3dot(t,dsln(:,indx(i):indx(i)+j-2), dsln(:,indx(j):indx(j)+j-2),j-1)
4137 dsln(:,loc)=dsln(:,loc)-t(:)
4140 call v3prod(dsln(:,indx(i):indx(i)+i-2), diag,temp,i-1)
4141 call d3dotl(t,temp,dsln(:,indx(i):indx(i)+i-2),i-1)
4146 diag(:,i)=diag(:,i)-t(1:6)
4147 dsln(:,indx(i):indx(i)+i-2)=temp(:,1:i-1)
4148 call inv3(diag(:,i),ir)
4152 end subroutine s3um3
4156 subroutine d3sdot(wi,a,b,n)
4160 real(kind=
kreal),
intent(in) :: a(:,:),b(:,:)
4161 real(kind=
kreal),
intent(out) :: wi(:)
4162 integer(kind=kint),
intent(in) :: n
4164 integer(kind=kint) :: jj
4176 wi(1)=wi(1)-a(1,jj)*b(1,jj)-a(2,jj)*b(4,jj)-a(3,jj)*b(7,jj)
4177 wi(2)=wi(2)-a(1,jj)*b(2,jj)-a(2,jj)*b(5,jj)-a(3,jj)*b(8,jj)
4178 wi(3)=wi(3)-a(1,jj)*b(3,jj)-a(2,jj)*b(6,jj)-a(3,jj)*b(9,jj)
4181 end subroutine d3sdot
4185 subroutine s3pdot(bi,b,zln,colno,ks,ke)
4189 integer(kind=kint),
intent(in) :: colno(:)
4190 real(kind=
kreal),
intent(in) :: zln(:,:),b(:,:)
4191 real(kind=
kreal),
intent(out) :: bi(:)
4192 integer(kind=kint),
intent(in) :: ks,ke
4194 integer(kind=kint) :: j,jj
4207 bi(1)=bi(1)-zln(1,jj)*b(1,j)-zln(4,jj)*b(2,j)-zln(7,jj)*b(3,j)
4208 bi(2)=bi(2)-zln(2,jj)*b(1,j)-zln(5,jj)*b(2,j)-zln(8,jj)*b(3,j)
4209 bi(3)=bi(3)-zln(3,jj)*b(1,j)-zln(6,jj)*b(2,j)-zln(9,jj)*b(3,j)
4212 end subroutine s3pdot
4216 subroutine inv33(zln,zz,diag)
4220 real(kind=
kreal),
intent(in) :: zz(9),diag(6)
4221 real(kind=
kreal),
intent(out) :: zln(9)
4223 zln(4)=zz(4)-zz(1)*diag(2)
4224 zln(7)=zz(7)-zz(1)*diag(4)-zln(4)*diag(5)
4225 zln(1)=zz(1)*diag(1)
4226 zln(4)=zln(4)*diag(3)
4227 zln(7)=zln(7)*diag(6)
4228 zln(4)=zln(4)-zln(7)*diag(5)
4229 zln(1)=zln(1)-zln(4)*diag(2)-zln(7)*diag(4)
4231 zln(5)=zz(5)-zz(2)*diag(2)
4232 zln(8)=zz(8)-zz(2)*diag(4)-zln(5)*diag(5)
4233 zln(2)=zz(2)*diag(1)
4234 zln(5)=zln(5)*diag(3)
4235 zln(8)=zln(8)*diag(6)
4236 zln(5)=zln(5)-zln(8)*diag(5)
4237 zln(2)=zln(2)-zln(5)*diag(2)-zln(8)*diag(4)
4239 zln(6)=zz(6)-zz(3)*diag(2)
4240 zln(9)=zz(9)-zz(3)*diag(4)-zln(6)*diag(5)
4241 zln(3)=zz(3)*diag(1)
4242 zln(6)=zln(6)*diag(3)
4243 zln(9)=zln(9)*diag(6)
4244 zln(6)=zln(6)-zln(9)*diag(5)
4245 zln(3)=zln(3)-zln(6)*diag(2)-zln(9)*diag(4)
4247 end subroutine inv33
4251 subroutine inv3(dsln,ir)
4255 real(kind=
kreal) :: dsln(6),t(2)
4256 integer(kind=kint) :: ir
4259 if(dabs(dsln(1)).lt.rmin)
then
4262 dsln(1)=1.0d0/dsln(1)
4263 t(1)=dsln(2)*dsln(1)
4264 dsln(3)=dsln(3)-t(1)*dsln(2)
4266 if(dabs(dsln(3)).lt.rmin)
then
4269 dsln(3)=1.0d0/dsln(3)
4270 t(1)=dsln(4)*dsln(1)
4271 dsln(5)=dsln(5)-dsln(2)*dsln(4)
4272 t(2)=dsln(5)*dsln(3)
4273 dsln(6)=dsln(6)-t(1)*dsln(4)-t(2)*dsln(5)
4276 if(dabs(dsln(6)).lt.rmin)
then
4279 dsln(6)=1.0d0/dsln(6)
4283 write(ilog,*)
"singular"
4295 subroutine d3dot(t,a,b,n)
4298 real(kind=
kreal),
intent(in) :: a(:,:),b(:,:)
4299 real(kind=
kreal),
intent(out) :: t(:)
4300 integer(kind=kint),
intent(in) :: n
4302 integer(kind=kint) :: l,jj
4322 t(1)=t(1)+a(1,jj)*b(1,jj)+a(4,jj)*b(4,jj)+a(7,jj)*b(7,jj)
4323 t(2)=t(2)+a(2,jj)*b(1,jj)+a(5,jj)*b(4,jj)+a(8,jj)*b(7,jj)
4324 t(3)=t(3)+a(3,jj)*b(1,jj)+a(6,jj)*b(4,jj)+a(9,jj)*b(7,jj)
4325 t(4)=t(4)+a(1,jj)*b(2,jj)+a(4,jj)*b(5,jj)+a(7,jj)*b(8,jj)
4326 t(5)=t(5)+a(2,jj)*b(2,jj)+a(5,jj)*b(5,jj)+a(8,jj)*b(8,jj)
4327 t(6)=t(6)+a(3,jj)*b(2,jj)+a(6,jj)*b(5,jj)+a(9,jj)*b(8,jj)
4328 t(7)=t(7)+a(1,jj)*b(3,jj)+a(4,jj)*b(6,jj)+a(7,jj)*b(9,jj)
4329 t(8)=t(8)+a(2,jj)*b(3,jj)+a(5,jj)*b(6,jj)+a(8,jj)*b(9,jj)
4330 t(9)=t(9)+a(3,jj)*b(3,jj)+a(6,jj)*b(6,jj)+a(9,jj)*b(9,jj)
4333 end subroutine d3dot
4337 subroutine v3prod(zln,diag,zz,n)
4341 real(kind=
kreal),
intent(in) :: zln(:,:),diag(:,:)
4342 real(kind=
kreal),
intent(out) :: zz(:,:)
4343 integer(kind=kint),
intent(in) :: n
4345 integer(kind=kint) :: i
4348 zz(4,i)=zln(4,i)-zln(1,i)*diag(2,i)
4349 zz(7,i)=zln(7,i)-zln(1,i)*diag(4,i)-zz(4,i)*diag(5,i)
4350 zz(1,i)=zln(1,i)*diag(1,i)
4351 zz(4,i)=zz(4,i)*diag(3,i)
4352 zz(7,i)=zz(7,i)*diag(6,i)
4353 zz(4,i)=zz(4,i)-zz(7,i)*diag(5,i)
4354 zz(1,i)=zz(1,i)-zz(4,i)*diag(2,i)-zz(7,i)*diag(4,i)
4356 zz(5,i)=zln(5,i)-zln(2,i)*diag(2,i)
4357 zz(8,i)=zln(8,i)-zln(2,i)*diag(4,i)-zz(5,i)*diag(5,i)
4358 zz(2,i)=zln(2,i)*diag(1,i)
4359 zz(5,i)=zz(5,i)*diag(3,i)
4360 zz(8,i)=zz(8,i)*diag(6,i)
4361 zz(5,i)=zz(5,i)-zz(8,i)*diag(5,i)
4362 zz(2,i)=zz(2,i)-zz(5,i)*diag(2,i)-zz(8,i)*diag(4,i)
4364 zz(6,i)=zln(6,i)-zln(3,i)*diag(2,i)
4365 zz(9,i)=zln(9,i)-zln(3,i)*diag(4,i)-zz(6,i)*diag(5,i)
4366 zz(3,i)=zln(3,i)*diag(1,i)
4367 zz(6,i)=zz(6,i)*diag(3,i)
4368 zz(9,i)=zz(9,i)*diag(6,i)
4369 zz(6,i)=zz(6,i)-zz(9,i)*diag(5,i)
4370 zz(3,i)=zz(3,i)-zz(6,i)*diag(2,i)-zz(9,i)*diag(4,i)
4373 end subroutine v3prod
4376 subroutine d3dotl(t,a,b,n)
4379 real(kind=
kreal),
intent(in) :: a(:,:),b(:,:)
4380 real(kind=
kreal),
intent(out) :: t(:)
4381 integer(kind=kint),
intent(in) :: n
4383 integer(kind=kint) :: l,jj
4400 t(1)=t(1)+a(1,jj)*b(1,jj)+a(4,jj)*b(4,jj)+a(7,jj)*b(7,jj)
4401 t(2)=t(2)+a(2,jj)*b(1,jj)+a(5,jj)*b(4,jj)+a(8,jj)*b(7,jj)
4402 t(3)=t(3)+a(2,jj)*b(2,jj)+a(5,jj)*b(5,jj)+a(8,jj)*b(8,jj)
4403 t(4)=t(4)+a(3,jj)*b(1,jj)+a(6,jj)*b(4,jj)+a(9,jj)*b(7,jj)
4404 t(5)=t(5)+a(3,jj)*b(2,jj)+a(6,jj)*b(5,jj)+a(9,jj)*b(8,jj)
4405 t(6)=t(6)+a(3,jj)*b(3,jj)+a(6,jj)*b(6,jj)+a(9,jj)*b(9,jj)
4408 end subroutine d3dotl
4412 subroutine addr3(isw,i,j,aij,invp,xlnzr,colno,diag,zln,dsln,nstop,ir)
4416 integer(kind=kint),
intent(in) :: invp(:),xlnzr(:),colno(:)
4417 real(kind=
kreal),
intent(in) :: aij(:)
4418 real(kind=
kreal),
intent(out) :: zln(:,:),diag(:,:),dsln(:,:)
4419 integer(kind=kint),
intent(in) :: isw,i,j,nstop
4420 integer(kind=kint),
intent(out) :: ir
4422 integer(kind=kint),
parameter :: ndeg2=9
4423 integer(kind=kint),
parameter :: ndeg2l=6
4424 integer(kind=kint) :: k,l,ii,jj,itrans,i0,j0,ks,ke
4429 if(ldbg)
write(idbg,*)
'addr3',ii,jj,aij
4450 if(jj.ge.nstop)
then
4454 if(itrans.eq.0)
then
4477 if(colno(k).eq.jj)
then
4478 if(itrans.eq.0)
then
4499 end subroutine addr3
4503 subroutine s2um(ic,xlnzr,colno,zln,diag,nch,par,neqns)
4507 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),par(:)
4508 integer(kind=kint),
intent(out) :: nch(:)
4509 real(kind=
kreal),
intent(out) :: zln(:,:),diag(:,:)
4510 integer(kind=kint),
intent(in) :: ic,neqns
4512 integer(kind=kint) :: i,j,k,l,ks,ke,jj,jc,ir,kk, ierr
4513 real(kind=
kreal),
allocatable :: temp(:,:)
4514 integer(kind=kint),
allocatable :: indx(:)
4515 real(kind=
kreal) :: s(4),zz(4),t(3)
4517 allocate(temp(4,neqns),indx(neqns), stat=ierr)
4518 if(ierr .ne. 0)
then
4519 call errtrp(
'stop due to allocation error.')
4534 do 310 jj=xlnzr(jc),xlnzr(jc+1)-1
4536 if(indx(j).eq.ic)
then
4537 zz(1)=zz(1)-temp(1,j)*zln(1,jj)-temp(3,j)*zln(3,jj)
4538 zz(2)=zz(2)-temp(2,j)*zln(1,jj)-temp(4,j)*zln(3,jj)
4539 zz(3)=zz(3)-temp(1,j)*zln(2,jj)-temp(3,j)*zln(4,jj)
4540 zz(4)=zz(4)-temp(2,j)*zln(2,jj)-temp(4,j)*zln(4,jj)
4543 call inv22(zln(:,k),zz,diag(:,jc))
4547 t(1)=t(1)+zz(1)*zln(1,k)+zz(3)*zln(3,k)
4548 t(2)=t(2)+zz(2)*zln(1,k)+zz(4)*zln(3,k)
4549 t(3)=t(3)+zz(2)*zln(2,k)+zz(4)*zln(4,k)
4551 diag(1,ic)=diag(1,ic)-t(1)
4552 diag(2,ic)=diag(2,ic)-t(2)
4553 diag(3,ic)=diag(3,ic)-t(3)
4554 call inv2(diag(:,ic),ir)
4563 subroutine s2um1(ic,xlnzr,colno,zln,diag,nch,par,neqns)
4567 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),nch(:),par(:)
4568 real(kind=
kreal),
intent(in) :: diag(:,:)
4569 real(kind=
kreal),
intent(out) :: zln(:,:)
4570 integer(kind=kint),
intent(in) :: ic,neqns
4572 integer(kind=kint) :: i,j,k,l,ks,ke,jc,jj, ierr
4573 real(kind=
kreal) :: s(4),zz(4)
4574 real(kind=
kreal),
allocatable :: temp(:,:)
4575 integer(kind=kint),
allocatable :: indx(:)
4577 allocate(temp(4,neqns),indx(neqns), stat=ierr)
4578 if(ierr .ne. 0)
then
4579 call errtrp(
'stop due to allocation error.')
4590 do 310 jj=xlnzr(jc),xlnzr(jc+1)-1
4592 if(indx(j).eq.ic)
then
4593 s(1)=s(1)+temp(1,j)*zln(1,jj)+temp(3,j)*zln(3,jj)
4594 s(2)=s(2)+temp(2,j)*zln(1,jj)+temp(4,j)*zln(3,jj)
4595 s(3)=s(3)+temp(1,j)*zln(2,jj)+temp(3,j)*zln(4,jj)
4596 s(4)=s(4)+temp(2,j)*zln(2,jj)+temp(4,j)*zln(4,jj)
4600 temp(l,jc)=zln(l,k)-s(l)
4606 end subroutine s2um1
4610 subroutine s2um2_child(neqns,nstop,xlnzr,colno,zln,diag,spdslnidx,spdslnval,nspdsln)
4614 integer(kind=kint),
intent(in) :: neqns, nstop
4615 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:)
4616 real(kind=
kreal),
intent(inout) :: zln(:,:),diag(:,:)
4617 integer(kind=kint),
pointer :: spdslnidx(:)
4618 real(kind=
kreal),
pointer :: spdslnval(:,:)
4619 integer(kind=kint),
intent(out) :: nspdsln
4621 integer(kind=kint) :: i,j,k,l,m,n, ic,ks,ke,ii,jj,jc,j1,j2,loc,ispdsln, ierr
4622 real(kind=
kreal),
allocatable :: temp(:,:)
4623 integer(kind=kint),
allocatable :: indx(:)
4626 allocate(temp(4,neqns),indx(neqns), stat=ierr)
4627 if(ierr .ne. 0)
then
4628 call errtrp(
'stop due to allocation error.')
4642 do jj=xlnzr(jc),xlnzr(jc+1)-1
4644 if(indx(j).eq.ic)
then
4651 allocate(spdslnidx(nspdsln),spdslnval(4,nspdsln), stat=ierr)
4652 if(ierr .ne. 0)
then
4653 call errtrp(
'stop due to allocation error.')
4660 do 100 ic=nstop,neqns
4670 zln(3,k)=temp(3,jj)-temp(1,jj)*diag(2,jj)
4671 zln(1,k)=temp(1,jj)*diag(1,jj)
4672 zln(3,k)=zln(3,k)*diag(3,jj)
4673 zln(1,k)=zln(1,k)-zln(3,k)*diag(2,jj)
4675 zln(4,k)=temp(4,jj)-temp(2,jj)*diag(2,jj)
4676 zln(2,k)=temp(2,jj)*diag(1,jj)
4677 zln(4,k)=zln(4,k)*diag(3,jj)
4678 zln(2,k)=zln(2,k)-zln(4,k)*diag(2,jj)
4680 diag(1,ic)=diag(1,ic)-(temp(1,jj)*zln(1,k)+temp(3,jj)*zln(3,k))
4681 diag(2,ic)=diag(2,ic)-(temp(1,jj)*zln(2,k)+temp(3,jj)*zln(4,k))
4682 diag(3,ic)=diag(3,ic)-(temp(2,jj)*zln(2,k)+temp(4,jj)*zln(4,k))
4685 do 120 jc=nstop,ic-1
4687 do 220 jj=xlnzr(jc),xlnzr(jc+1)-1
4689 if(indx(j).eq.ic)
then
4694 spdslnidx(ispdsln)=loc
4695 spdslnval(1,ispdsln)=spdslnval(1,ispdsln)-(temp(1,j)*zln(1,jj)+temp(3,j)*zln(3,jj))
4696 spdslnval(2,ispdsln)=spdslnval(2,ispdsln)-(temp(2,j)*zln(1,jj)+temp(4,j)*zln(3,jj))
4697 spdslnval(3,ispdsln)=spdslnval(3,ispdsln)-(temp(1,j)*zln(2,jj)+temp(3,j)*zln(4,jj))
4698 spdslnval(4,ispdsln)=spdslnval(4,ispdsln)-(temp(2,j)*zln(2,jj)+temp(4,j)*zln(4,jj))
4705 end subroutine s2um2_child
4709 subroutine inv22(zln,zz,diag)
4713 real(kind=
kreal),
intent(in) :: zz(4),diag(3)
4714 real(kind=
kreal),
intent(out) :: zln(4)
4716 zln(3)=zz(3)-zz(1)*diag(2)
4717 zln(1)=zz(1)*diag(1)
4718 zln(3)=zln(3)*diag(3)
4719 zln(1)=zln(1)-zln(3)*diag(2)
4721 zln(4)=zz(4)-zz(2)*diag(2)
4722 zln(2)=zz(2)*diag(1)
4723 zln(4)=zln(4)*diag(3)
4724 zln(2)=zln(2)-zln(4)*diag(2)
4727 end subroutine inv22
4731 subroutine inv2(dsln,ir)
4735 real(kind=
kreal),
intent(out) :: dsln(3)
4736 integer(kind=kint),
intent(out) :: ir
4738 real(kind=
kreal) :: t
4741 if(dabs(dsln(1)).lt.rmin)
then
4745 dsln(1)=1.0d0/dsln(1)
4747 dsln(3)=dsln(3)-t*dsln(2)
4749 if(dabs(dsln(3)).lt.rmin)
then
4753 dsln(3)=1.0d0/dsln(3)
4759 subroutine d2sdot(wi,a,b,n)
4763 real(kind=
kreal),
intent(in) :: a(:,:),b(:,:)
4764 real(kind=
kreal),
intent(inout) :: wi(:)
4765 integer(kind=kint),
intent(in) :: n
4767 integer(kind=kint) :: jj
4779 wi(1)=wi(1)-a(1,jj)*b(1,jj)-a(2,jj)*b(3,jj)
4780 wi(2)=wi(2)-a(1,jj)*b(2,jj)-a(2,jj)*b(4,jj)
4783 end subroutine d2sdot
4787 subroutine s2pdot(bi,b,zln,colno,ks,ke)
4791 integer(kind=kint),
intent(in) :: colno(:)
4792 integer(kind=kint),
intent(in) :: ks,ke
4793 real(kind=
kreal),
intent(in) :: zln(:,:),b(:,:)
4794 real(kind=
kreal),
intent(out) :: bi(:)
4796 integer(kind=kint) :: jj,j
4809 bi(1)=bi(1)-zln(1,jj)*b(1,j)-zln(3,jj)*b(2,j)
4810 bi(2)=bi(2)-zln(2,jj)*b(1,j)-zln(4,jj)*b(2,j)
4813 end subroutine s2pdot
4817 subroutine addrx(isw,i,j,aij,invp,xlnzr,colno,diag,zln,dsln,nstop,ndeg,ndeg2,ndeg2l,ir)
4821 integer(kind=kint),
intent(in) :: invp(*),xlnzr(*),colno(*)
4822 real(kind=
kreal),
intent(in) :: aij(ndeg,ndeg)
4823 real(kind=
kreal),
intent(out) :: zln(ndeg,ndeg,*),diag(ndeg2l,*),dsln(ndeg,ndeg,*)
4824 integer(kind=kint),
intent(in) :: isw,i,j,nstop,ndeg,ndeg2,ndeg2l
4825 integer(kind=kint),
intent(out) :: ir
4827 integer(kind=kint) :: ii,jj,k,l,m,n,ks,ke,itrans,i0,j0
4832 if(ldbg)
write(idbg,*)
'addrx',ii,jj,aij
4850 if(jj.ge.nstop)
then
4854 if(itrans.eq.0)
then
4857 dsln(n,m,k)=aij(n,m)
4864 dsln(n,m,k)=aij(m,n)
4873 if(colno(k).eq.jj)
then
4874 if(itrans.eq.0)
then
4893 end subroutine addrx
4897 subroutine dxdot(ndeg,t,a,b,l)
4901 real(kind=
kreal),
intent(in) :: a(ndeg,ndeg,*),b(ndeg,ndeg,*)
4902 real(kind=
kreal),
intent(out) :: t(ndeg,ndeg)
4903 integer(kind=kint),
intent(in) :: ndeg,l
4905 integer(kind=kint) :: k,jj,n,m
4921 t(n,m)=t(n,m)+a(n,k,jj)*b(m,k,jj)
4925 end subroutine dxdot
4929 subroutine dxdotl(ndeg,t,a,b,l)
4933 real(kind=
kreal),
intent(in) :: a(ndeg,ndeg,*),b(ndeg,ndeg,*)
4934 real(kind=
kreal),
intent(out) :: t(ndeg,ndeg)
4935 integer(kind=kint),
intent(in) :: ndeg,l
4937 integer(kind=kint) :: n,m,jj,k
4953 t(n,m)=t(n,m)+a(n,k,jj)*b(m,k,jj)
4957 end subroutine dxdotl
4961 subroutine dxsdot(ndeg,wi,a,b,n)
4965 real(kind=
kreal),
intent(in) :: a(ndeg,*),b(ndeg,ndeg,*)
4966 real(kind=
kreal),
intent(out) :: wi(ndeg)
4967 integer(kind=kint),
intent(in) :: ndeg, n
4969 integer(kind=kint) :: jj, k, l
4984 wi(l)=wi(l)-b(l,k,jj)*a(k,jj)
4989 end subroutine dxsdot
4993 subroutine invx(dsln,ndeg,ir)
4997 real(kind=
kreal),
intent(inout) :: dsln(*)
4998 integer(kind=kint),
intent(in) :: ndeg
4999 integer(kind=kint),
intent(out) :: ir
5001 integer(kind=kint) :: i,j,k,l,ld,l0,k0,ll
5002 real(kind=
kreal) :: tem,t
5006 dsln(1)=1.0d0/dsln(1)
5014 dsln(l)=dsln(l)-dsln(l0+k)*dsln(ld)
5024 tem=dsln(k)*dsln(k0)
5030 dsln(l)=1.0d0/dsln(l)
5037 subroutine invxx(zln,zz,diag,ndeg)
5041 real(kind=
kreal),
intent(in) :: zz(ndeg,ndeg),diag(*)
5042 real(kind=
kreal),
intent(out) :: zln(ndeg,ndeg)
5043 integer(kind=kint),
intent(in) :: ndeg
5045 integer(kind=kint) :: i,j,k,l,m,n,loc,loc1
5054 zln(l,n)=zln(l,n)-zln(l,m)*diag(loc1)
5060 zln(l,m)=zln(l,m)*diag(loc)
5065 zln(l,m)=zln(l,m)-zln(l,n)*diag(loc)
5070 end subroutine invxx
5074 subroutine sxpdot(ndeg,bi,b,zln,colno,ks,ke)
5078 integer(kind=kint),
intent(in) :: colno(*)
5079 real(kind=
kreal),
intent(in) :: zln(ndeg,ndeg,*),b(ndeg,*)
5080 real(kind=
kreal),
intent(out) :: bi(ndeg)
5081 integer(kind=kint),
intent(in) :: ndeg,ks,ke
5083 integer(kind=kint) :: j,jj,m,n
5098 bi(n)=bi(n)-zln(n,m,jj)*b(m,j)
5101 end subroutine sxpdot
5105 subroutine sxum(ic,xlnzr,colno,zln,diag,nch,par,neqns,ndeg,ndegl)
5109 integer(kind=kint),
intent(in) :: xlnzr(*),colno(*),par(*)
5110 integer(kind=kint),
intent(out) :: nch(*)
5111 real(kind=
kreal),
intent(out) :: zln(ndeg,ndeg,*),diag(ndegl,*)
5112 integer(kind=kint),
intent(in) :: ic,neqns,ndeg,ndegl
5114 real(kind=
kreal) :: zz(ndeg,ndeg),t(ndegl)
5115 integer(kind=kint) :: i,j,k,l,m,n,ndeg22,ks,ke,jc,loc,jj,kk,ir, ierr
5116 real(kind=
kreal),
allocatable :: temp(:,:,:)
5117 integer(kind=kint),
allocatable :: indx(:)
5120 allocate(temp(ndeg,ndeg,neqns),indx(neqns), stat=ierr)
5121 if(ierr .ne. 0)
then
5122 call errtrp(
'stop due to allocation error.')
5133 do 310 jj=xlnzr(jc),xlnzr(jc+1)-1
5135 if(indx(j).eq.ic)
then
5139 zz(n,m)=zz(n,m)-temp(n,kk,j)*zln(m,kk,jj)
5144 call invxx(zln(1,1,k),zz,diag(1,jc),ndeg)
5151 t(loc)=t(loc)+zz(n,kk)*zln(m,kk,k)
5154 diag(:,ic)=diag(:,ic)-t
5155 call invx(diag(1,ic),ndeg,ir)
5164 subroutine sxum1(ic,xlnzr,colno,zln,diag,nch,par,neqns,ndeg,ndegl)
5168 integer(kind=kint),
intent(in) :: xlnzr(*),colno(*),nch(*),par(*)
5169 real(kind=
kreal),
intent(in) :: diag(ndegl,*)
5170 real(kind=
kreal),
intent(out) :: zln(ndeg,ndeg,*)
5171 integer(kind=kint),
intent(in) :: ic,neqns,ndeg,ndegl
5173 real(kind=
kreal) :: s(ndeg,ndeg)
5174 integer(kind=kint) :: i,j,k,l,m,n,ks,ke,jc,jj,kk, ierr
5175 real(kind=
kreal),
allocatable :: temp(:,:,:)
5176 integer(kind=kint),
allocatable :: indx(:)
5178 allocate(temp(ndeg,ndeg,neqns),indx(neqns), stat=ierr)
5179 if(ierr .ne. 0)
then
5180 call errtrp(
'stop due to allocation error.')
5191 do 310 jj=xlnzr(jc),xlnzr(jc+1)-1
5193 if(indx(j).eq.ic)
then
5197 s(n,m)=s(n,m)+temp(n,kk,j)*zln(m,kk,jj)
5203 temp(n,m,jc)=zln(n,m,k)-s(n,m)
5204 zln(n,m,k)=temp(n,m,jc)
5209 end subroutine sxum1
5213 subroutine sxum2_child(neqns,nstop,xlnzr,colno,zln,diag,spdslnidx,spdslnval,nspdsln,ndeg,ndegl)
5217 integer(kind=kint),
intent(in) :: neqns, nstop
5218 integer(kind=kint),
intent(in) :: xlnzr(*),colno(*)
5219 real(kind=
kreal),
intent(inout) :: zln(ndeg,ndeg,*),diag(ndegl,*)
5220 integer(kind=kint),
pointer :: spdslnidx(:)
5221 real(kind=
kreal),
pointer :: spdslnval(:,:)
5222 integer(kind=kint),
intent(out) :: nspdsln
5223 integer(kind=kint),
intent(in) :: ndeg, ndegl
5225 integer(kind=kint) :: i,j,k,l,m,n, ic,ks,ke,ii,jj,jc,j1,j2,loc,locd,kk, ierr
5226 integer(kind=kint) :: ispdsln
5227 real(kind=
kreal),
allocatable :: temp(:,:,:)
5228 integer(kind=kint),
allocatable :: indx(:)
5231 allocate(temp(ndeg,ndeg,neqns),indx(neqns), stat=ierr)
5232 if(ierr .ne. 0)
then
5233 call errtrp(
'stop due to allocation error.')
5247 do jj=xlnzr(jc),xlnzr(jc+1)-1
5249 if(indx(j).eq.ic)
then
5256 allocate(spdslnidx(nspdsln),spdslnval(ndeg*ndeg,nspdsln), stat=ierr)
5257 if(ierr .ne. 0)
then
5258 call errtrp(
'stop due to allocation error.')
5265 do 100 ic=nstop,neqns
5272 temp(n,m,jj)=zln(n,m,k)
5277 call invxx(zln(1,1,k),temp(1,1,jj),diag(1,jj),ndeg)
5287 diag(locd,ic)=diag(locd,ic)-temp(n,kk,jj)*zln(m,kk,k)
5289 do 120 jc=nstop,ic-1
5293 do 220 jj=xlnzr(jc),xlnzr(jc+1)-1
5295 if(indx(j).eq.ic)
then
5300 spdslnidx(ispdsln)=loc
5304 spdslnval(ndeg*(m-1)+n,ispdsln)=spdslnval(ndeg*(m-1)+n,ispdsln)-temp(n,k,j)*zln(m,k,jj)
5312 end subroutine sxum2_child
5316 subroutine sxum3(neqns,dsln,diag,ndeg,ndegl)
5320 real(kind=
kreal),
intent(inout):: dsln(ndeg,ndeg,*),diag(ndegl,*)
5321 integer(kind=kint),
intent(in) :: neqns, ndeg, ndegl
5323 integer(kind=kint) :: loc, locd, ir, i,j,n,m, ierr
5324 integer(kind=kint),
allocatable :: indx(:)
5325 real(kind=
kreal),
allocatable :: temp(:,:,:)
5326 real(kind=
kreal),
allocatable :: t(:,:)
5328 allocate(indx(neqns),temp(ndeg,ndeg,neqns),t(ndeg,ndeg), stat=ierr)
5329 if(ierr .ne. 0)
then
5330 call errtrp(
'stop due to allocation error.')
5333 if(neqns.le.0)
goto 1000
5336 call invx(diag(1,1),ndeg,ir)
5340 call dxdot(ndeg,t,dsln(1,1,indx(i)),dsln(1,1,indx(j)),j-1)
5343 dsln(n,m,loc)=dsln(n,m,loc)-t(n,m)
5347 call vxprod(ndeg,ndegl,dsln(1,1,indx(i)),diag,temp,i-1)
5348 call dxdotl(ndeg,t,temp,dsln(1,1,indx(i)),i-1)
5353 diag(locd,i)=diag(locd,i)-t(n,m)
5355 call vcopy(temp,dsln(1,1,indx(i)),ndeg*ndeg*(i-1))
5356 call invx(diag(1,i),ndeg,ir)
5360 end subroutine sxum3
5363 subroutine vcopy(a,c,n)
5366 integer(kind=kint) :: n
5367 real(kind=
kreal) :: a(n),c(n)
5373 end subroutine vcopy
5377 subroutine verif0(neqns,ndeg,nttbr,irow,jcol,val,rhs,x)
5381 integer(kind=kint),
intent(in) :: irow(*),jcol(*)
5382 integer(kind=kint),
intent(in) :: neqns,ndeg,nttbr
5383 real(kind=
kreal),
intent(in) :: val(ndeg,ndeg,*),x(ndeg,*)
5384 real(kind=
kreal),
intent(out) :: rhs(ndeg,*)
5386 integer(kind=kint) :: i,j,k,l,m
5387 real(kind=
kreal) :: rel,err
5398 rel=rel+dabs(rhs(l,i))
5405 rhs(l,i)=rhs(l,i)-val(l,m,k)*x(m,j)
5406 if(i.ne.j) rhs(l,j)=rhs(l,j)-val(m,l,k)*x(m,i)
5413 err=err+dabs(rhs(l,i))
5415 if (m_pds_procinfo%myid .eq. 0)
then
5416 write(imsg,6000) err,rel,err/rel
5418 6000
format(
' ***verification***(symmetric)'/&
5419 &
'norm(Ax-b) = ',1pd20.10/&
5420 &
'norm(b) = ',1pd20.10/&
5421 &
'norm(Ax-b)/norm(b) = ',1pd20.10)
5422 6010
format(1p4d15.7)
5428 subroutine vxprod(ndeg,ndegl,zln,diag,zz,n)
5432 real(kind=
kreal),
intent(in) :: zln(ndeg*ndeg,n),diag(ndegl,n)
5433 real(kind=
kreal),
intent(out) :: zz(ndeg*ndeg,n)
5434 integer(kind=kint),
intent(in) :: ndeg,ndegl,n
5436 integer(kind=kint) :: i
5439 call invxx(zz(1,i),zln(1,i),diag(1,i),ndeg)
5442 end subroutine vxprod