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.
87 integer(kind=kint),
intent(in) :: ii
91 logical,
save :: first_time = .true.
93 integer(kind=kint) :: ierr
102 if (hecmat%Iarray(24) .ge. 2)
then
109 hecmat%Iarray(97) = 0
110 hecmat%Iarray(98) = 0
114 if ((hecmat%Iarray(97) .ne. 0) .or. (hecmat%Iarray(98) .ne. 0))
then
115 write(ilog,*)
'Error: Recalculation of LDU decompose is currently not surported'
122 if (m_pds_procinfo%isparent)
then
123 call elapout(
'hecmw_solve_direct_parallel: entering sp_direct_parent')
124 call sp_direct_parent(hecmesh, hecmat)
125 else if (m_pds_procinfo%ischild)
then
126 call elapout(
'hecmw_solve_direct_parallel: entering sp_direct_child')
127 call sp_direct_child()
129 call elapout(
'hecmw_solve_direct_parallel: never come here')
133 call mpi_bcast(hecmat%x, hecmesh%n_dof*hecmat%NP, mpi_real8, m_pds_procinfo%imp, mpi_comm_world, ierr)
147 subroutine sp_direct_parent(hecMESH, hecMAT)
160 real(kind=
kreal),
allocatable :: b(:,:)
163 type(matrix_partition_info) :: pmi
164 integer(kind=kint),
pointer,
save :: iperm_rev(:)
165 integer(kind=kint),
pointer,
save :: iofst_dm(:)
167 integer(kind=kint),
save :: neqns_d
168 real(kind=
kreal),
pointer,
save :: dsln(:,:)
169 real(kind=
kreal),
pointer,
save :: diag(:,:)
170 integer(kind=kint),
pointer,
save :: part_all(:)
171 integer(kind=kint),
pointer,
save :: iperm_all(:)
174 real(kind=
kreal),
allocatable :: bd(:,:)
177 real(kind=
kreal),
allocatable :: oldb(:,:)
178 logical,
save :: nusol_ready = .false.
179 integer(kind=kint),
save :: ndeg, nndeg, ndegt
180 integer(kind=kint),
save :: ndm
183 integer(kind=kint) :: ierr
184 integer(kind=kint) :: i,j,k
185 integer(kind=kint) :: timelog
186 real(kind=
kreal) :: t1, t2, t3
189 integer(kind=kint) :: istatus(mpi_status_size)
190 integer(kind=kint) :: icp
191 real(kind=
kreal),
allocatable :: spdslnval(:,:), diagbuf(:,:), bdbuf(:,:)
192 integer(kind=kint),
allocatable :: spdslnidx(:)
193 integer(kind=kint) :: nspdsln
196 timelog = hecmat%Iarray(22)
198 call elapout(
'sp_direct_parent: entered')
201 if (.not. nusol_ready)
then
208 call geta0(hecmesh, hecmat, a0)
211 ndegt = (ndeg+1)*ndeg/2
213 call elapout(
'sp_direct_parent: make a0 done')
223 call elapout(
'sp_direct_parent: enter matrix partition')
225 call elapout(
'sp_direct_parent: end matrix partition')
226 neqns_d = pmi%neqns_d
229 part_all=>pmi%part_all
230 iperm_all=>pmi%iperm_all
235 allocate(iofst_dm(0:ndm), stat=ierr)
237 call errtrp(
'stop due to allocation error.')
242 iofst_dm(i)=iofst_dm(i-1)+dm(i-1)%a%neqns
245 iperm_all(i)=iperm_all(i)+iofst_dm(part_all(i))
248 allocate(iperm_rev(a0%neqns), stat=ierr)
250 call errtrp(
'stop due to allocation error.')
253 iperm_rev(iperm_all(i)) = i
264 call elapout(
'sp_direct_parent: send divided matrix to children')
265 do i=1,m_pds_procinfo%nchildren
266 icp = m_pds_procinfo%ichildren(i)
267 call mpi_send(dm(i)%a%ndeg, 1,mpi_integer,icp,1,mpi_comm_world,ierr)
268 call mpi_send(dm(i)%a%neqns, 1,mpi_integer,icp,1,mpi_comm_world,ierr)
269 call mpi_send(dm(i)%a%nttbr, 1,mpi_integer,icp,1,mpi_comm_world,ierr)
271 call mpi_send(dm(i)%a%irow, dm(i)%a%nttbr, mpi_integer,icp,1,mpi_comm_world,ierr)
272 call mpi_send(dm(i)%a%jcol, dm(i)%a%nttbr, mpi_integer,icp,1,mpi_comm_world,ierr)
273 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,ierr)
275 call mpi_send(dm(i)%c%ndeg, 1,mpi_integer,icp,1,mpi_comm_world,ierr)
276 call mpi_send(dm(i)%c%nttbr, 1,mpi_integer,icp,1,mpi_comm_world,ierr)
277 call mpi_send(dm(i)%c%nrows, 1,mpi_integer,icp,1,mpi_comm_world,ierr)
278 call mpi_send(dm(i)%c%ncols, 1,mpi_integer,icp,1,mpi_comm_world,ierr)
280 call mpi_send(dm(i)%c%irow, dm(i)%c%nttbr, mpi_integer,icp,1,mpi_comm_world,ierr)
281 call mpi_send(dm(i)%c%jcol, dm(i)%c%nttbr, mpi_integer,icp,1,mpi_comm_world,ierr)
282 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,ierr)
288 do i=1,m_pds_procinfo%nchildren
289 deallocate(dm(i)%a%irow,dm(i)%a%jcol,dm(i)%a%val)
290 deallocate(dm(i)%c%irow,dm(i)%c%jcol,dm(i)%c%val)
293 call elapout(
'sp_direct_parent: end send matrix')
302 call elapout(
'sp_direct_parent: receive D matrix element')
303 allocate(diagbuf(ndegt, neqns_d), stat=ierr)
305 call errtrp(
'stop due to allocation error.')
308 do k=1,m_pds_procinfo%nchildren
309 icp=m_pds_procinfo%ichildren(k)
310 call mpi_recv(nspdsln, 1,mpi_integer,icp,1,mpi_comm_world,istatus,ierr)
311 allocate(spdslnidx(nspdsln),spdslnval(nndeg,nspdsln),stat=ierr)
313 call errtrp(
'stop due to allocation error.')
315 call mpi_recv(spdslnidx, nspdsln, mpi_integer,icp,1,mpi_comm_world,istatus,ierr)
316 call mpi_recv(spdslnval, nspdsln*nndeg,mpi_real8,icp,1,mpi_comm_world,istatus,ierr)
317 call mpi_recv(diagbuf, neqns_d*ndegt,mpi_real8,icp,1,mpi_comm_world,istatus,ierr)
321 dsln(:,spdslnidx(i)) = dsln(:,spdslnidx(i)) + spdslnval(:,i)
327 diag(j,i) = diag(j,i) + diagbuf(j,i)
330 deallocate(spdslnidx, spdslnval)
333 call elapout(
'sp_direct_parent: end receive D matrix element')
339 call elapout(
'sp_direct_parent: LDU decompose of D. entering nufct0_parent')
340 call nufct0_parent(dsln, diag, neqns_d, ndeg)
341 call elapout(
'sp_direct_parent: exit nufct0_parent')
362 allocate(b(ndeg,a0%neqns), stat=ierr)
364 call errtrp(
'stop due to allocation error.')
368 b(j,i)=hecmat%b(ndeg*(i-1)+j)
373 allocate(oldb(ndeg,a0%neqns), stat=ierr)
375 call errtrp(
'stop due to allocation error.')
380 do i=1,m_pds_procinfo%nchildren
381 icp=m_pds_procinfo%ichildren(i)
382 call mpi_send(b(1,iofst_dm(i)+1), dm(i)%ndeg*dm(i)%a%neqns, mpi_real8, icp, 1,mpi_comm_world, ierr)
385 allocate(bd(ndeg,neqns_d), stat=ierr)
387 call errtrp(
'stop due to allocation error.')
389 bd(:,1:neqns_d) = b(:,1:neqns_d)
391 call elapout(
'sp_direct_parent: end send b')
401 call elapout(
'sp_direct_parent: begin receive bd')
402 allocate(bdbuf(ndeg,neqns_d), stat=ierr)
404 call errtrp(
'stop due to allocation error.')
407 do k=1,m_pds_procinfo%nchildren
408 icp=m_pds_procinfo%ichildren(k)
409 call mpi_recv(bdbuf, ndeg*neqns_d, mpi_real8, icp, 1,mpi_comm_world, istatus, ierr)
412 bd(j,i) = bd(j,i) + bdbuf(j,i)
417 call elapout(
'sp_direct_parent: end receive bd')
423 call elapout(
'sp_direct_parent: begin solve Ax_d=b_d')
424 call nusol0_parent(dsln, diag, bd, neqns_d, ndeg)
425 call elapout(
'sp_direct_parent: end solve Ax_d=b_d')
432 call elapout(
'sp_direct_parent: begin send Xd')
433 call mpi_bcast(bd, ndeg*neqns_d, mpi_real8, m_pds_procinfo%imp, mpi_comm_world, ierr)
434 call elapout(
'sp_direct_parent: end send Xd')
440 call elapout(
'sp_direct_parent: begin receive X')
441 do k=1,m_pds_procinfo%nchildren
442 icp=m_pds_procinfo%ichildren(k)
443 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)
445 b(:,1:neqns_d)=bd(:,:)
446 call elapout(
'sp_direct_parent: end receive X')
453 call elapout(
'sp_direct_parent: begin permutate X')
455 call elapout(
'sp_direct_parent: end permutate X')
458 call verif0(a0%neqns, ndeg, a0%nttbr, a0%irow, a0%jcol, a0%val, oldb, b)
463 hecmat%x(ndeg*(i-1)+j)=b(j,i)
467 call elapout(
'sp_direct_parent: end solve Ax=b')
469 if (timelog > 0)
then
470 write(*,*)
'setup time : ',t2-t1
471 write(*,*)
'solve time : ',t3-t2
473 deallocate(b, bd, bdbuf, oldb)
475 end subroutine sp_direct_parent
479 subroutine geta0(hecMESH,hecMAT, a0)
487 integer(kind=kint) :: i,j,k,ierr,numnp,ndof,kk,ntotal
488 integer(kind=kint) :: ndof2
497 a0%nttbr = hecmat%NP+hecmat%NPL
500 allocate(a0%irow(a0%nttbr),stat=ierr)
501 allocate(a0%jcol(a0%nttbr),stat=ierr)
502 allocate(a0%val(a0%ndeg*a0%ndeg, a0%nttbr),stat=ierr)
504 call errtrp(
'stop due to allocation error.')
514 call vlcpy(a0%val(:,kk),hecmat%D(ndof2*(j-1)+1:ndof2*j),ndof)
516 do k= hecmat%indexL(j-1)+1, hecmat%indexL(j)
521 call vlcpy(a0%val(:,kk),hecmat%AL(ndof2*(k-1)+1:ndof2*k),ndof)
529 subroutine vlcpy(a,b,n)
531 real(kind=
kreal),
intent(out) :: a(:)
532 real(kind=
kreal),
intent(in) :: b(:)
533 integer(kind=kint),
intent(in) :: n
535 integer(kind=kint) :: i,j
539 a((j-1)*n+i) = b((i-1)*n+j)
549 subroutine sp_direct_child()
556 real(kind=
kreal),
allocatable :: b(:,:)
558 logical,
save :: nusol_ready = .false.
561 integer(kind=kint) :: istatus(mpi_status_size)
562 integer(kind=kint) :: imp, ierr
563 integer(kind=kint) :: i
567 call elapout(
'sp_direct_child: entered')
569 imp=m_pds_procinfo%imp
571 if (.not. nusol_ready)
then
573 call elapout(
'sp_direct_child: waiting matrix from parent via MPI')
579 call mpi_recv(cm%a%ndeg, 1,mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
580 call mpi_recv(cm%a%neqns, 1,mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
581 call mpi_recv(cm%a%nttbr, 1,mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
582 allocate(cm%a%irow(cm%a%nttbr), stat=ierr)
584 call errtrp(
'stop due to allocation error.')
586 allocate(cm%a%jcol(cm%a%nttbr), stat=ierr)
588 call errtrp(
'stop due to allocation error.')
590 allocate(cm%a%val(cm%a%ndeg*cm%a%ndeg, cm%a%nttbr), stat=ierr)
592 call errtrp(
'stop due to allocation error.')
594 call mpi_recv(cm%a%irow, cm%a%nttbr, mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
595 call mpi_recv(cm%a%jcol, cm%a%nttbr, mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
596 call mpi_recv(cm%a%val, cm%a%nttbr*cm%a%ndeg*cm%a%ndeg, mpi_real8,imp,1,mpi_comm_world,istatus,ierr)
599 call mpi_recv(cm%c%ndeg, 1,mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
600 call mpi_recv(cm%c%nttbr, 1,mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
601 call mpi_recv(cm%c%nrows, 1,mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
602 call mpi_recv(cm%c%ncols, 1,mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
603 allocate(cm%c%irow(cm%c%nttbr), stat=ierr)
605 call errtrp(
'stop due to allocation error.')
607 allocate(cm%c%jcol(cm%c%nttbr), stat=ierr)
609 call errtrp(
'stop due to allocation error.')
611 allocate(cm%c%val(cm%c%ndeg*cm%c%ndeg, cm%c%nttbr), stat=ierr)
613 call errtrp(
'stop due to allocation error.')
615 call mpi_recv(cm%c%irow, cm%c%nttbr, mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
616 call mpi_recv(cm%c%jcol, cm%c%nttbr, mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
617 call mpi_recv(cm%c%val, cm%c%nttbr*cm%c%ndeg*cm%c%ndeg, mpi_real8,imp,1,mpi_comm_world,istatus,ierr)
620 cm%ista_c = cm%a%neqns+1
621 cm%neqns_t = cm%a%neqns + cm%c%nrows
622 call elapout(
'sp_direct_child: end get matrix from parent via MPI')
633 call elapout(
'sp_direct_child: entering matini_para')
634 call matini_para(cm, dsi, ierr)
635 call elapout(
'sp_direct_child: exit matini_para')
637 call elapout(
'sp_direct_child: entering staij1')
640 call staij1(0, cm%a%irow(i), cm%a%jcol(i), cm%a%val(:,i), dsi, ierr)
644 call staij1(0, cm%c%irow(i)+cm%a%neqns, cm%c%jcol(i), cm%c%val(:,i), dsi, ierr)
646 call elapout(
'sp_direct_child: end staij1')
656 call elapout(
'sp_direct_child: entering nufct0_child')
657 call nufct0_child(dsi, ierr)
658 call elapout(
'sp_direct_child: exit nufct0_child')
669 allocate(b(cm%ndeg, cm%neqns_t), stat=ierr)
671 call errtrp(
'stop due to allocation error.')
675 call mpi_recv(b, cm%ndeg*cm%a%neqns, mpi_real8, imp, 1,mpi_comm_world, istatus, ierr)
685 call elapout(
'sp_direct_child: enter nusol0_child')
686 call nusol0_child(b, dsi, ierr)
687 call elapout(
'sp_direct_child: exit nusol0_child')
693 call elapout(
'sp_direct_child: begin send result to parent')
694 call mpi_send(b, cm%ndeg*cm%a%neqns, mpi_real8, imp, 1,mpi_comm_world, ierr)
695 call elapout(
'sp_direct_child: end send result to parent')
699 end subroutine sp_direct_child
704 subroutine initproc()
707 integer(kind=kint) :: npe, myid
708 integer(kind=kint) :: ndiv
709 integer(kind=kint) :: ierr
710 integer(kind=kint) :: i
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, 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
1062 integer(kind=kint),
intent(inout) :: ir
1063 integer(kind=kint),
intent(inout) :: nch(:)
1064 real(kind=
kreal),
intent(inout) :: zln(:,:),diag(:,:)
1066 integer(kind=kint) :: neqns_c
1067 integer(kind=kint) :: i,l, ic,ierr,imp
1068 integer(kind=kint) :: nspdsln
1069 integer(kind=kint),
pointer :: spdslnidx(:)
1070 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(inout) :: nch(:)
1132 real(kind=
kreal),
intent(inout) :: zln(:,:), diag(:,:)
1133 integer(kind=kint),
intent(in) :: neqns, nstop
1134 integer(kind=kint),
intent(inout) :: ir
1136 integer(kind=kint) :: i,l, ic, imp, ierr, neqns_c
1137 integer(kind=kint) :: nspdsln
1138 integer(kind=kint),
pointer :: spdslnidx(:)
1139 real(kind=
kreal),
pointer :: spdslnval(:,:)
1166 call elapout(
'nufct2_child: begin phase I LDU decompose of A')
1167 if(nstop.gt.1)
call inv2(diag(:,1),ir)
1172 call s2um(ic,xlnzr,colno,zln,diag,nch,parent,neqns)
1178 call elapout(
'nufct2_child: begin phase II LDU decompose of C')
1180 call s2um1(ic,xlnzr,colno,zln,diag,nch,parent,neqns)
1188 call elapout(
'nufct2_child: begin phase III update D region')
1195 neqns_c = neqns - nstop + 1
1196 call s2um2_child(neqns,nstop,xlnzr,colno,zln,diag,spdslnidx,spdslnval,nspdsln)
1199 imp = m_pds_procinfo%imp
1200 call mpi_send(nspdsln, 1,mpi_integer,imp,1,mpi_comm_world,ierr)
1201 call mpi_send(spdslnidx, nspdsln,mpi_integer,imp,1,mpi_comm_world,ierr)
1202 call mpi_send(spdslnval, nspdsln*4,mpi_real8,imp,1,mpi_comm_world,ierr)
1203 call mpi_send(diag(1,nstop), neqns_c*3,mpi_real8,imp,1,mpi_comm_world,ierr)
1208 end subroutine nufct2_child
1212 subroutine nufct3_child(xlnzr,colno,zln,diag,neqns,parent,nch,nstop,ir)
1216 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),parent(:)
1217 integer(kind=kint),
intent(inout) :: nch(:)
1218 real(kind=
kreal),
intent(inout) :: zln(:,:),diag(:,:)
1219 integer(kind=kint),
intent(in) :: neqns, nstop
1220 integer(kind=kint),
intent(inout) :: ir
1222 integer(kind=kint) :: i,l, ic, imp, ierr, neqns_c
1223 integer(kind=kint) :: nspdsln
1224 integer(kind=kint),
pointer :: spdslnidx(:)
1225 real(kind=
kreal),
pointer :: spdslnval(:,:)
1253 call elapout(
'nufct3_child: begin phase I LDU decompose of A')
1254 if(nstop.gt.1)
call inv3(diag(:,1),ir)
1259 call s3um(ic,xlnzr,colno,zln,diag,nch,parent,neqns)
1265 call elapout(
'nufct3_child: begin phase II LDU decompose of C')
1266 do 200 ic=nstop,neqns
1267 call s3um1(ic,xlnzr,colno,zln,diag,nch,parent,neqns)
1275 call elapout(
'nufct3_child: begin phase III update D region')
1282 neqns_c = neqns - nstop + 1
1283 call s3um2_child(neqns,nstop,xlnzr,colno,zln,diag,spdslnidx,spdslnval,nspdsln)
1286 imp = m_pds_procinfo%imp
1287 call mpi_send(nspdsln, 1,mpi_integer,imp,1,mpi_comm_world,ierr)
1288 call mpi_send(spdslnidx, nspdsln,mpi_integer,imp,1,mpi_comm_world,ierr)
1289 call mpi_send(spdslnval, nspdsln*9,mpi_real8,imp,1,mpi_comm_world,ierr)
1290 call mpi_send(diag(1,nstop), neqns_c*6,mpi_real8,imp,1,mpi_comm_world,ierr)
1293 end subroutine nufct3_child
1361 subroutine nufctx_child(xlnzr,colno,zln,diag,neqns,parent,nch,nstop,ndeg,ir)
1365 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),parent(:)
1366 integer(kind=kint),
intent(inout) :: nch(:)
1367 real(kind=
kreal),
intent(inout) :: zln(:,:),diag(:,:)
1368 integer(kind=kint),
intent(in) :: neqns, nstop, ndeg
1369 integer(kind=kint),
intent(inout) :: ir
1371 integer(kind=kint) :: l, ic, neqns_c, ndeg2, ndegl, imp, ierr
1372 integer(kind=kint) :: nspdsln
1373 integer(kind=kint),
pointer :: spdslnidx(:)
1374 real(kind=
kreal),
pointer :: spdslnval(:,:)
1398 ndegl=(ndeg+1)*ndeg/2
1402 if(nstop.gt.1)
call invx(diag,ndeg,ir)
1407 call sxum(ic,xlnzr,colno,zln,diag,nch,parent,neqns,ndeg,ndegl)
1415 call sxum1(ic,xlnzr,colno,zln,diag,nch,parent,neqns,ndeg,ndegl)
1422 neqns_c = neqns - nstop + 1
1423 call sxum2_child(neqns,nstop,xlnzr,colno,zln,diag,spdslnidx,spdslnval,nspdsln,ndeg,ndegl)
1426 imp = m_pds_procinfo%imp
1427 call mpi_send(nspdsln, 1,mpi_integer,imp,1,mpi_comm_world,ierr)
1428 call mpi_send(spdslnidx, nspdsln,mpi_integer,imp,1,mpi_comm_world,ierr)
1429 call mpi_send(spdslnval, nspdsln*ndeg2,mpi_real8,imp,1,mpi_comm_world,ierr)
1430 call mpi_send(diag(1,nstop), neqns_c*ndegl,mpi_real8,imp,1,mpi_comm_world,ierr)
1432 end subroutine nufctx_child
1436 subroutine nusol0_child(b,dsi,ir)
1452 real(kind=
kreal),
intent(inout) :: b(:,:)
1453 type(dsinfo),
intent(inout) :: dsi
1454 integer(kind=kint),
intent(out) :: ir
1456 if(dsi%stage.ne.30 .and. dsi%stage.ne.40)
then
1462 if(dsi%ndeg.eq.1)
then
1463 call nusol1_child(dsi%xlnzr,dsi%colno,dsi%zln,dsi%diag,dsi%iperm,b,dsi%neqns,dsi%nstop)
1464 else if(dsi%ndeg .eq. 2)
then
1465 call nusol2_child(dsi%xlnzr,dsi%colno,dsi%zln,dsi%diag,dsi%iperm,b,dsi%neqns,dsi%nstop)
1466 else if(dsi%ndeg .eq. 3)
then
1467 call nusol3_child(dsi%xlnzr,dsi%colno,dsi%zln,dsi%diag,dsi%iperm,b,dsi%neqns,dsi%nstop)
1471 call nusolx_child(dsi%xlnzr,dsi%colno,dsi%zln,dsi%diag,dsi%iperm,b,dsi%neqns,dsi%nstop,dsi%ndeg)
1476 end subroutine nusol0_child
1480 subroutine nusol1_child(xlnzr,colno,zln,diag,iperm,b,neqns,nstop)
1484 integer(kind=kint),
intent(in) :: xlnzr(:), colno(:), iperm(:)
1485 real(kind=
kreal),
intent(in) :: zln(:,:), diag(:,:)
1486 real(kind=
kreal),
intent(inout) :: b(:,:)
1487 integer(kind=kint),
intent(in) :: neqns, nstop
1489 integer(kind=kint) :: neqns_a, neqns_c
1490 integer(kind=kint) :: k, ks, ke, i, j, imp, ierr
1491 real(kind=
kreal),
allocatable :: wk(:), wk_d(:)
1497 neqns_c = neqns - nstop + 1
1499 allocate(wk(neqns), stat=ierr)
1500 if(ierr .ne. 0)
then
1501 call errtrp(
'stop due to allocation error.')
1513 if(ke.lt.ks)
goto 110
1514 wk(i)=wk(i)-spdot2(wk,zln(1,:),colno,ks,ke)
1519 allocate(wk_d(nstop:neqns), stat=ierr)
1520 if(ierr .ne. 0)
then
1521 call errtrp(
'stop due to allocation error.')
1525 do 101 i=nstop,neqns
1528 if(ke.lt.ks)
goto 111
1529 wk_d(i)=wk_d(i)-spdot2(wk,zln(1,:),colno,ks,ke)
1532 imp = m_pds_procinfo%imp
1533 call mpi_send(wk_d, neqns_c, mpi_real8, imp, 1,mpi_comm_world, ierr)
1537 wk(i)=wk(i)*diag(1,i)
1541 call mpi_bcast(wk_d, neqns_c, mpi_real8, imp, mpi_comm_world, ierr)
1543 wk(nstop:neqns)=wk_d(nstop:neqns)
1548 if(ke.lt.ks)
goto 200
1552 wk(j)=wk(j)-wk(i)*zln(1,k)
1562 end subroutine nusol1_child
1566 subroutine nusol2_child(xlnzr, colno, zln, diag, iperm, b, neqns, nstop)
1575 integer(kind=kint),
intent(in) :: xlnzr(:), colno(:), iperm(:)
1576 real(kind=
kreal),
intent(in) :: zln(:,:), diag(:,:)
1577 real(kind=
kreal),
intent(inout) :: b(:,:)
1579 real(kind=
kreal),
allocatable :: wk(:,:), wk_d(:,:)
1580 integer(kind=kint) :: neqns_c, neqns_a, nstop, neqns, ks, ke
1581 integer(kind=kint) :: i, j, k, imp, ierr
1585 neqns_c = neqns - nstop + 1
1587 allocate(wk(2,neqns), stat=ierr)
1588 if(ierr .ne. 0)
then
1589 call errtrp(
'stop due to allocation error.')
1593 wk(1,i) = b(1,iperm(i))
1594 wk(2,i) = b(2,iperm(i))
1598 call elapout(
'nusol2_child: begin forward substitution for A')
1603 call s2pdot(wk(:,i),wk,zln,colno,ks,ke)
1608 call elapout(
'nusol2_child: begin forward substitution for C')
1609 allocate(wk_d(2,nstop:neqns), stat=ierr)
1610 if(ierr .ne. 0)
then
1611 call errtrp(
'stop due to allocation error.')
1619 call s2pdot(wk_d(:,i),wk,zln,colno,ks,ke)
1623 call elapout(
'nusol2_child: wait to send wk_d')
1624 imp = m_pds_procinfo%imp
1625 call mpi_send(wk_d, 2*neqns_c, mpi_real8, imp, 1,mpi_comm_world, ierr)
1629 wk(2,i)=wk(2,i)-wk(1,i)*diag(2,i)
1630 wk(1,i)=wk(1,i)*diag(1,i)
1631 wk(2,i)=wk(2,i)*diag(3,i)
1632 wk(1,i)=wk(1,i)-wk(2,i)*diag(2,i)
1636 call elapout(
'nusol2_child: wait until receive wk_d')
1637 call mpi_bcast(wk_d, 2*neqns_c, mpi_real8, imp, mpi_comm_world, ierr)
1638 call elapout(
'nusol2_child: end receive wk_d')
1639 call elapout(
'nusol2_child: begin backward substitution')
1641 wk(:,nstop:neqns)=wk_d(:,nstop:neqns)
1648 wk(1,j)=wk(1,j)-wk(1,i)*zln(1,k)-wk(2,i)*zln(2,k)
1649 wk(2,j)=wk(2,j)-wk(1,i)*zln(3,k)-wk(2,i)*zln(4,k)
1653 call elapout(
'nusol2_child: end backward substitution')
1657 b(1,iperm(i))=wk(1,i)
1658 b(2,iperm(i))=wk(2,i)
1661 call elapout(
'nusol2_child: end')
1664 end subroutine nusol2_child
1678 integer(kind=kint),
intent(in) :: xlnzr(:), colno(:), iperm(:)
1679 real(kind=
kreal),
intent(in) :: zln(:,:), diag(:,:)
1680 real(kind=
kreal),
intent(inout) :: b(:,:)
1682 real(kind=
kreal),
allocatable :: wk(:,:), wk_d(:,:)
1683 integer(kind=kint) :: neqns_c, neqns_a, nstop, neqns, ks, ke
1684 integer(kind=kint) :: i, j, k, imp, ierr
1689 neqns_c = neqns - nstop + 1
1691 call elapout(
'nusol3_child: entered')
1693 allocate(wk(3,neqns), stat=ierr)
1694 if(ierr .ne. 0)
then
1695 call errtrp(
'stop due to allocation error.')
1699 wk(1,i)=b(1,iperm(i))
1700 wk(2,i)=b(2,iperm(i))
1701 wk(3,i)=b(3,iperm(i))
1706 call elapout(
'nusol3_child: begin forward substitution for A')
1711 if(ke.lt.ks)
goto 110
1712 call s3pdot(wk(:,i),wk,zln,colno,ks,ke)
1718 call elapout(
'nusol3_child: begin forward substitution for C')
1719 allocate(wk_d(3,nstop:neqns), stat=ierr)
1720 if(ierr .ne. 0)
then
1721 call errtrp(
'stop due to allocation error.')
1725 do 101 i=nstop,neqns
1728 if(ke.lt.ks)
goto 111
1729 call s3pdot(wk_d(:,i),wk,zln,colno,ks,ke)
1733 call elapout(
'nusol3_child: wait to send wk_d')
1734 imp = m_pds_procinfo%imp
1735 call mpi_send(wk_d, 3*neqns_c, mpi_real8, imp, 1,mpi_comm_world, ierr)
1738 call elapout(
'nusol3_child: divide with diagonal matrix')
1740 wk(2,i)=wk(2,i)-wk(1,i)*diag(2,i)
1741 wk(3,i)=wk(3,i)-wk(1,i)*diag(4,i)-wk(2,i)*diag(5,i)
1742 wk(1,i)=wk(1,i)*diag(1,i)
1743 wk(2,i)=wk(2,i)*diag(3,i)
1744 wk(3,i)=wk(3,i)*diag(6,i)
1745 wk(2,i)=wk(2,i)-wk(3,i)*diag(5,i)
1746 wk(1,i)=wk(1,i)-wk(2,i)*diag(2,i)-wk(3,i)*diag(4,i)
1750 call elapout(
'nusol3_child: wait until receive wk_d')
1751 call mpi_bcast(wk_d, 3*neqns_c, mpi_real8, imp, mpi_comm_world, ierr)
1752 call elapout(
'nusol3_child: end receive wk_d')
1753 call elapout(
'nusol3_child: begin backward substitution')
1755 wk(:,nstop:neqns)=wk_d(:,nstop:neqns)
1760 if(ke.lt.ks)
goto 200
1765 wk(1,j)=wk(1,j)-wk(1,i)*zln(1,k)-wk(2,i)*zln(2,k)-wk(3,i)*zln(3,k)
1766 wk(2,j)=wk(2,j)-wk(1,i)*zln(4,k)-wk(2,i)*zln(5,k)-wk(3,i)*zln(6,k)
1767 wk(3,j)=wk(3,j)-wk(1,i)*zln(7,k)-wk(2,i)*zln(8,k)-wk(3,i)*zln(9,k)
1770 call elapout(
'nusol3_child: end backward substitution')
1775 b(1,iperm(i))=wk(1,i)
1776 b(2,iperm(i))=wk(2,i)
1777 b(3,iperm(i))=wk(3,i)
1780 call elapout(
'nusol3_child: end')
1785 subroutine nusolx_child(xlnzr, colno, zln, diag, iperm, b, neqns, nstop, ndeg)
1789 integer(kind=kint),
intent(in) :: xlnzr(:), colno(:), iperm(:)
1790 real(kind=
kreal),
intent(in) :: zln(:,:), diag(:,:)
1791 real(kind=
kreal),
intent(inout) :: b(:,:)
1792 integer(kind=kint),
intent(in) :: neqns, nstop, ndeg
1794 real(kind=
kreal),
allocatable :: wk(:,:), wk_d(:,:)
1795 integer(kind=kint) :: neqns_c, neqns_a, ks, ke, locd, loc1
1796 integer(kind=kint) :: i, j, k, l, m, n, imp, ierr
1800 neqns_c = neqns - nstop + 1
1802 allocate(wk(ndeg,neqns), stat=ierr)
1803 if(ierr .ne. 0)
then
1804 call errtrp(
'stop due to allocation error.')
1808 wk(1,i)=b(1,iperm(i))
1809 wk(2,i)=b(2,iperm(i))
1810 wk(3,i)=b(3,iperm(i))
1818 call sxpdot(ndeg,wk(1,i),wk,zln,colno,ks,ke)
1823 allocate(wk_d(ndeg,nstop:neqns), stat=ierr)
1824 if(ierr .ne. 0)
then
1825 call errtrp(
'stop due to allocation error.')
1832 call sxpdot(ndeg,wk_d(:,i),wk,zln,colno,ks,ke)
1836 imp = m_pds_procinfo%imp
1837 call mpi_send(wk_d, ndeg*neqns_c, mpi_real8, imp, 1,mpi_comm_world, ierr)
1847 wk(n,i)=wk(n,i)-wk(m,i)*diag(loc1,i)
1855 wk(m,i)=wk(m,i)*diag(locd,i)
1861 wk(m,i)=wk(m,i)-wk(n,i)*diag(locd,i)
1867 call mpi_bcast(wk_d, ndeg*neqns_c, mpi_real8, imp, mpi_comm_world, ierr)
1868 wk(:,nstop:neqns)=wk_d(:,nstop:neqns)
1879 wk(m,j)=wk(m,j)-wk(n,i)*zln(n+(m-1)*ndeg,k)
1889 b(l,iperm(i))=wk(l,i)
1897 subroutine nufct0_parent(dsln, diag, neqns, ndeg)
1902 real(kind=
kreal),
intent(inout) :: dsln(:,:)
1903 real(kind=
kreal),
intent(inout) :: diag(:,:)
1904 integer(kind=kint),
intent(in) :: neqns, ndeg
1906 integer(kind=kint) :: ndegl
1908 if (ndeg .eq. 1)
then
1909 call sum3(neqns, dsln(1,:), diag(1,:))
1910 else if (ndeg .eq. 3)
then
1911 call s3um3(neqns, dsln, diag)
1913 ndegl = (ndeg+1)*ndeg/2
1914 call sxum3(neqns, dsln, diag, ndeg, ndegl)
1918 end subroutine nufct0_parent
1922 subroutine nusol0_parent(dsln, diag, b, neqns, ndeg)
1927 real(kind=
kreal),
intent(in) :: dsln(:,:)
1928 real(kind=
kreal),
intent(in) :: diag(:,:)
1929 real(kind=
kreal),
intent(inout) :: b(:,:)
1931 integer(kind=kint),
intent(in) :: neqns, ndeg
1933 if (ndeg .eq. 1)
then
1934 call nusol1_parent(dsln(1,:), diag(1,:), b(1,:), neqns)
1935 else if (ndeg .eq. 3)
then
1936 call nusol3_parent(dsln, diag, b, neqns)
1938 call nusolx_parent(dsln, diag, b, neqns, ndeg)
1942 end subroutine nusol0_parent
1946 subroutine nusol1_parent(dsln, diag, b, neqns)
1953 real(kind=
kreal),
intent(in) :: dsln(:)
1954 real(kind=
kreal),
intent(in) :: diag(:)
1955 real(kind=
kreal),
intent(inout) :: b(:)
1956 integer(kind=kint),
intent(in) :: neqns
1958 integer(kind=kint) :: i,j,k,loc
1963 b(i)=b(i)-dot_product(b(1:i-1),dsln(k:k+i-2))
1971 loc=(neqns-1)*neqns/2
1974 b(j)=b(j)-b(i)*dsln(loc)
1980 end subroutine nusol1_parent
1987 subroutine nusol3_parent(dsln, diag, b, neqns)
1993 real(kind=
kreal),
intent(in) :: dsln(:,:)
1994 real(kind=
kreal),
intent(in) :: diag(:,:)
1995 real(kind=
kreal),
intent(inout) :: b(:,:)
1996 integer(kind=kint),
intent(in) :: neqns
1998 integer(kind=kint) :: i,j,k,loc
2006 call d3sdot(b(:,i),b,dsln(:, k:k+i-2),i-1)
2014 b(2,i)=b(2,i)-b(1,i)*diag(2,i)
2015 b(3,i)=b(3,i)-b(1,i)*diag(4,i)-b(2,i)*diag(5,i)
2016 b(1,i)=b(1,i)*diag(1,i)
2017 b(2,i)=b(2,i)*diag(3,i)
2018 b(3,i)=b(3,i)*diag(6,i)
2019 b(2,i)=b(2,i)-b(3,i)*diag(5,i)
2020 b(1,i)=b(1,i)-b(2,i)*diag(2,i)-b(3,i)*diag(4,i)
2028 loc=(neqns-1)*neqns/2
2031 b(1,j)=b(1,j)-b(1,i)*dsln(1,loc)-b(2,i)*dsln(2,loc)-b(3,i)*dsln(3,loc)
2032 b(2,j)=b(2,j)-b(1,i)*dsln(4,loc)-b(2,i)*dsln(5,loc)-b(3,i)*dsln(6,loc)
2033 b(3,j)=b(3,j)-b(1,i)*dsln(7,loc)-b(2,i)*dsln(8,loc)-b(3,i)*dsln(9,loc)
2039 end subroutine nusol3_parent
2043 subroutine nusolx_parent (dsln,diag,b,neqns,ndeg)
2047 real(kind=
kreal),
intent(in) :: diag(:,:), dsln(:,:)
2048 real(kind=
kreal),
intent(inout) :: b(:,:)
2049 integer(kind=kint),
intent(in) :: neqns, ndeg
2051 integer(kind=kint) :: i,j,k,m,n,loc, locd, loc1
2056 call dxsdot(ndeg,b(:,i),b,dsln(:,k:k+i-2),i-1)
2066 b(n,i)=b(n,i)-b(m,i)*diag(loc1,i)
2074 b(m,i)=b(m,i)*diag(locd,i)
2080 b(m,i)=b(m,i)-b(n,i)*diag(locd,i)
2086 loc=(neqns-1)*neqns/2
2091 b(m,j)=b(m,j)-b(n,i)*dsln((m-1)*ndeg+n,loc)
2098 end subroutine nusolx_parent
2102 subroutine s3um2_child(neqns,nstop,xlnzr,colno,zln,diag,spdslnidx,spdslnval,nspdsln)
2106 integer(kind=kint),
intent(in) :: neqns, nstop
2107 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:)
2108 real(kind=
kreal),
intent(inout) :: zln(:,:),diag(:,:)
2109 integer(kind=kint),
pointer :: spdslnidx(:)
2110 real(kind=
kreal),
pointer :: spdslnval(:,:)
2111 integer(kind=kint),
intent(out) :: nspdsln
2113 real(kind=
kreal),
allocatable :: temp(:,:)
2114 integer(kind=kint),
allocatable :: indx(:)
2116 integer(kind=kint) :: j,k, ic,ks,ke,jj,jc,j1,j2,loc,ispdsln, ierr
2118 allocate(temp(neqns,9),indx(neqns), stat=ierr)
2119 if(ierr .ne. 0)
then
2120 call errtrp(
'stop due to allocation error.')
2134 do jj=xlnzr(jc),xlnzr(jc+1)-1
2136 if(indx(j).eq.ic)
then
2143 allocate(spdslnidx(nspdsln), stat=ierr)
2144 if(ierr .ne. 0)
then
2145 call errtrp(
'stop due to allocation error.')
2147 allocate(spdslnval(9,nspdsln), stat=ierr)
2148 if(ierr .ne. 0)
then
2149 call errtrp(
'stop due to allocation error.')
2156 do 100 ic=nstop,neqns
2174 zln(4,k)=temp(jj,4)-temp(jj,1)*diag(2,jj)
2175 zln(7,k)=temp(jj,7)-temp(jj,1)*diag(4,jj)-zln(4,k)*diag(5,jj)
2176 zln(1,k)=temp(jj,1)*diag(1,jj)
2177 zln(4,k)=zln(4,k)*diag(3,jj)
2178 zln(7,k)=zln(7,k)*diag(6,jj)
2179 zln(4,k)=zln(4,k)-zln(7,k)*diag(5,jj)
2180 zln(1,k)=zln(1,k)-zln(4,k)*diag(2,jj)-zln(7,k)*diag(4,jj)
2182 zln(5,k)=temp(jj,5)-temp(jj,2)*diag(2,jj)
2183 zln(8,k)=temp(jj,8)-temp(jj,2)*diag(4,jj)-zln(5,k)*diag(5,jj)
2184 zln(2,k)=temp(jj,2)*diag(1,jj)
2185 zln(5,k)=zln(5,k)*diag(3,jj)
2186 zln(8,k)=zln(8,k)*diag(6,jj)
2187 zln(5,k)=zln(5,k)-zln(8,k)*diag(5,jj)
2188 zln(2,k)=zln(2,k)-zln(5,k)*diag(2,jj)-zln(8,k)*diag(4,jj)
2190 zln(6,k)=temp(jj,6)-temp(jj,3)*diag(2,jj)
2191 zln(9,k)=temp(jj,9)-temp(jj,3)*diag(4,jj)-zln(6,k)*diag(5,jj)
2192 zln(3,k)=temp(jj,3)*diag(1,jj)
2193 zln(6,k)=zln(6,k)*diag(3,jj)
2194 zln(9,k)=zln(9,k)*diag(6,jj)
2195 zln(6,k)=zln(6,k)-zln(9,k)*diag(5,jj)
2196 zln(3,k)=zln(3,k)-zln(6,k)*diag(2,jj)-zln(9,k)*diag(4,jj)
2203 diag(1,ic)=diag(1,ic)-temp(jj,1)*zln(1,k)-temp(jj,4)*zln(4,k)-temp(jj,7)*zln(7,k)
2204 diag(2,ic)=diag(2,ic)-temp(jj,1)*zln(2,k)-temp(jj,4)*zln(5,k)-temp(jj,7)*zln(8,k)
2205 diag(3,ic)=diag(3,ic)-temp(jj,2)*zln(2,k)-temp(jj,5)*zln(5,k)-temp(jj,8)*zln(8,k)
2206 diag(4,ic)=diag(4,ic)-temp(jj,1)*zln(3,k)-temp(jj,4)*zln(6,k)-temp(jj,7)*zln(9,k)
2207 diag(5,ic)=diag(5,ic)-temp(jj,2)*zln(3,k)-temp(jj,5)*zln(6,k)-temp(jj,8)*zln(9,k)
2208 diag(6,ic)=diag(6,ic)-temp(jj,3)*zln(3,k)-temp(jj,6)*zln(6,k)-temp(jj,9)*zln(9,k)
2210 do 120 jc=nstop,ic-1
2214 do 220 jj=xlnzr(jc),xlnzr(jc+1)-1
2216 if(indx(j).eq.ic)
then
2221 spdslnidx(ispdsln)=loc
2222 spdslnval(1,ispdsln)=spdslnval(1,ispdsln)-temp(j,1)*zln(1,jj)-temp(j,4)*zln(4,jj)-temp(j,7)*zln(7,jj)
2223 spdslnval(2,ispdsln)=spdslnval(2,ispdsln)-temp(j,2)*zln(1,jj)-temp(j,5)*zln(4,jj)-temp(j,8)*zln(7,jj)
2224 spdslnval(3,ispdsln)=spdslnval(3,ispdsln)-temp(j,3)*zln(1,jj)-temp(j,6)*zln(4,jj)-temp(j,9)*zln(7,jj)
2225 spdslnval(4,ispdsln)=spdslnval(4,ispdsln)-temp(j,1)*zln(2,jj)-temp(j,4)*zln(5,jj)-temp(j,7)*zln(8,jj)
2226 spdslnval(5,ispdsln)=spdslnval(5,ispdsln)-temp(j,2)*zln(2,jj)-temp(j,5)*zln(5,jj)-temp(j,8)*zln(8,jj)
2227 spdslnval(6,ispdsln)=spdslnval(6,ispdsln)-temp(j,3)*zln(2,jj)-temp(j,6)*zln(5,jj)-temp(j,9)*zln(8,jj)
2228 spdslnval(7,ispdsln)=spdslnval(7,ispdsln)-temp(j,1)*zln(3,jj)-temp(j,4)*zln(6,jj)-temp(j,7)*zln(9,jj)
2229 spdslnval(8,ispdsln)=spdslnval(8,ispdsln)-temp(j,2)*zln(3,jj)-temp(j,5)*zln(6,jj)-temp(j,8)*zln(9,jj)
2230 spdslnval(9,ispdsln)=spdslnval(9,ispdsln)-temp(j,3)*zln(3,jj)-temp(j,6)*zln(6,jj)-temp(j,9)*zln(9,jj)
2237 end subroutine s3um2_child
2241 subroutine zpivot(neqns,neqnsz,nttbr,jcol,irow,zpiv,ir)
2245 integer(kind=kint),
intent(in) :: jcol(:),irow(:)
2246 integer(kind=kint),
intent(out) :: zpiv(:)
2247 integer(kind=kint),
intent(in) :: neqns,nttbr
2248 integer(kind=kint),
intent(out) :: neqnsz,ir
2250 integer(kind=kint) :: i,j,l
2260 if(i.le.0.or.j.le.0)
then
2263 elseif(i.gt.neqns.or.j.gt.neqns)
then
2267 if(i.eq.j) zpiv(i)=0
2271 if(zpiv(i).eq.0)
then
2278 if(ldbg)
write(idbg,*)
'# zpivot ########################'
2279 if(ldbg)
write(idbg,60) (zpiv(i),i=1,neqns)
2282 end subroutine zpivot
2286 subroutine stsmat(neqns,nttbr,irow,jcol,jcpt,jcolno)
2290 integer(kind=kint),
intent(in) :: irow(:), jcol(:)
2291 integer(kind=kint),
intent(out) :: jcpt(:), jcolno(:)
2292 integer(kind=kint),
intent(in) :: neqns, nttbr
2294 integer(kind=kint) :: i,j,k,l,loc,locr
2313 if(loc.eq.0)
goto 120
2314 if(jcolno(loc).eq.j)
then
2316 elseif(jcolno(loc).gt.j)
then
2336 if(loc.eq.0)
goto 170
2337 if(jcolno(loc).eq.i)
then
2339 elseif(jcolno(loc).gt.i)
then
2357 write(idbg,*)
'jcolno'
2358 write(idbg,60) (jcolno(i),i=1,k)
2359 write(idbg,*)
'jcpt'
2360 write(idbg,60) (jcpt(i),i=1,k)
2364 end subroutine stsmat
2367 subroutine stiaja(neqns,neqnsz,ia,ja,jcpt,jcolno)
2373 integer(kind=kint),
intent(in) :: jcpt(:),jcolno(:)
2374 integer(kind=kint),
intent(out) :: ia(:),ja(:)
2375 integer(kind=kint),
intent(in) :: neqns, neqnsz
2377 integer(kind=kint) :: i,k,l,ii,loc
2385 if(loc.eq.0)
goto 120
2387 if(ii.eq.k.or.ii.gt.neqnsz)
goto 130
2396 write(idbg,*)
'stiaja(): ia '
2397 write(idbg,60) (ia(i),i=1,neqns+1)
2398 write(idbg,*)
'stiaja(): ja '
2399 write(idbg,60) (ja(i),i=1,ia(neqns+1))
2403 end subroutine stiaja
2407 subroutine idntty(neqns,invp,iperm)
2411 integer(kind=kint),
intent(out) :: invp(:),iperm(:)
2412 integer(kind=kint),
intent(in) :: neqns
2414 integer(kind=kint) :: i
2421 end subroutine idntty
2425 subroutine genqmd(neqns,xadj,adj0,perm,invp,deg,marker,rchset,nbrhd,qsize,qlink,nofsub,adjncy)
2429 integer(kind=kint),
intent(in) :: adj0(:),xadj(:)
2430 integer(kind=kint),
intent(out) :: rchset(:),nbrhd(:),adjncy(:),perm(:),invp(:),deg(:),marker(:),qsize(:),qlink(:)
2431 integer(kind=kint),
intent(in) :: neqns
2432 integer(kind=kint),
intent(out) :: nofsub
2434 integer(kind=kint) :: inode,ip,irch,mindeg,nhdsze,node,np,num,nump1,nxnode,rchsze,search,thresh,ndeg
2435 integer(kind=kint) :: i,j
2439 do 10 i=1,xadj(neqns+1)-1
2448 ndeg=xadj(node+1)-xadj(node)
2450 if(ndeg.lt.mindeg) mindeg=ndeg
2458 if(nump1.gt.search) search=nump1
2459 do 400 j=search,neqns
2461 if(marker(node).lt.0)
goto 400
2463 if(ndeg.le.thresh)
goto 500
2464 if(ndeg.lt.mindeg) mindeg=ndeg
2469 nofsub=nofsub+deg(node)
2471 call qmdrch(node,xadj,adjncy,deg,marker,rchsze,rchset,nhdsze,nbrhd)
2481 nxnode=qlink(nxnode)
2482 if(nxnode.gt.0)
goto 600
2483 if(rchsze.le.0)
goto 800
2485 call qmdupd(xadj,adjncy,rchsze,rchset,deg,qsize,qlink,marker,rchset(rchsze+1:),nbrhd(nhdsze+1:))
2487 do 700 irch=1,rchsze
2489 if(marker(inode).lt.0)
goto 700
2492 if(ndeg.lt.mindeg) mindeg=ndeg
2493 if(ndeg.gt.thresh)
goto 700
2498 if(nhdsze.gt.0)
call qmdot(node,xadj,adjncy,marker,rchsze,rchset,nbrhd)
2499 800
if(num.lt.neqns)
goto 300
2501 end subroutine genqmd
2505 subroutine genpaq(xadj,adjncy,invp,iperm,parent,neqns,ancstr)
2509 integer(kind=kint),
intent(in) :: xadj(:),adjncy(:),invp(:),iperm(:)
2510 integer(kind=kint),
intent(out) :: parent(:),ancstr(:)
2511 integer(kind=kint),
intent(in) :: neqns
2513 integer(kind=kint) :: i,k,l,ip,it
2519 do 110 k=xadj(ip),xadj(ip+1)-1
2523 if(ancstr(l).eq.0)
goto 111
2524 if(ancstr(l).eq.i)
goto 110
2535 if(parent(i).eq.0) parent(i)=neqns+1
2538 if(ldbg)
write(idbg,6010)
2539 if(ldbg)
write(idbg,6000) (i,parent(i),i=1,neqns)
2541 6010
format(
' parent')
2543 end subroutine genpaq
2547 subroutine genbtq(xadj,adjncy,invp,iperm,parent,btree,zpiv,izz,neqns)
2551 integer(kind=kint),
intent(in) :: xadj(:),adjncy(:),parent(:),invp(:),iperm(:),zpiv(:)
2552 integer(kind=kint),
intent(out) :: btree(:,:)
2553 integer(kind=kint),
intent(in) :: neqns
2554 integer(kind=kint),
intent(out) :: izz
2556 integer(kind=kint) :: i,ip,ib,inext
2564 if(ip.le.0)
goto 100
2583 if(zpiv(i).ne.0)
then
2584 if(btree(1,invp(i)).eq.0)
then
2592 if(ldbg)
write(idbg,6010)
2593 if(ldbg)
write(idbg,6000) (i,btree(1,i),btree(2,i),i=1,neqns)
2594 if(ldbg)
write(idbg,6020) izz
2597 6000
format(i6,
'(',2i6,
')')
2598 6010
format(
' binary tree')
2599 6020
format(
' the first zero pivot is ',i4)
2602 end subroutine genbtq
2606 subroutine rotate(xadj,adjncy,invp,iperm,parent,btree,izz,neqns,anc,adjt,irr)
2610 integer(kind=kint),
intent(in) :: xadj(:),adjncy(:),parent(:),btree(:,:)
2611 integer(kind=kint),
intent(out) :: anc(:),adjt(:)
2612 integer(kind=kint),
intent(inout) :: invp(:), iperm(:)
2613 integer(kind=kint),
intent(in) :: neqns,izz
2614 integer(kind=kint),
intent(out) :: irr
2616 integer(kind=kint) :: i,k,l,izzz,nanc,loc,locc,ll,kk,iy
2629 if(btree(1,izzz).ne.0)
then
2643 if(loc.ne.0)
goto 100
2657 if(locc.ne.0)
goto 220
2659 do 240 k=xadj(iperm(loc)),xadj(iperm(loc)+1)-1
2660 adjt(invp(adjncy(k)))=1
2662 if(loc.ge.anc(l))
goto 250
2664 if(locc.ne.0)
goto 220
2669 if(adjt(anc(ll)).eq.0)
then
2689 if(adjt(ll).eq.0)
then
2703 if(locc.ne.0)
goto 350
2705 do 370 kk=xadj(iperm(loc)),xadj(iperm(loc)+1)-1
2706 adjt(invp(adjncy(kk)))=1
2708 if(loc.ge.iy)
goto 380
2710 if(locc.ne.0)
goto 350
2715 if(adjt(anc(ll)).eq.0)
then
2717 invp(iperm(anc(ll)))=k
2722 if(adjt(anc(ll)).ne.0)
then
2724 invp(iperm(anc(ll)))=k
2734 if(i.eq.izzz)
goto 510
2738 invp(iperm(izzz))=neqns
2746 if(ldbg)
write(idbg,6000) (invp(i),i=1,neqns)
2749 end subroutine rotate
2753 subroutine bringu(zpiv,iperm,invp,parent,izz,neqns,irr)
2757 integer(kind=kint),
intent(in) :: zpiv(:),parent(:)
2758 integer(kind=kint),
intent(inout) :: iperm(:),invp(:)
2759 integer(kind=kint),
intent(in) :: neqns,izz
2760 integer(kind=kint),
intent(out) :: irr
2762 integer(kind=kint) :: i,ib0,ib,ibp,izzp
2780 if(ib.le.0)
goto 1000
2783 if(zpiv(izzp).eq.0)
goto 110
2793 if(invp(iperm(i)).ne.i)
goto 210
2794 if(iperm(invp(i)).ne.i)
goto 210
2798 write(20,*)
'permutation error'
2805 end subroutine bringu
2809 subroutine posord(parent,btree,invp,iperm,pordr,nch,neqns,iw,qarent,mch)
2813 integer(kind=kint),
intent(in) :: btree(:,:),qarent(:)
2814 integer(kind=kint),
intent(out) :: pordr(:),iperm(:),nch(:),iw(:),parent(:),mch(0:neqns+1)
2815 integer(kind=kint),
intent(inout) :: invp(:)
2816 integer(kind=kint),
intent(in) :: neqns
2818 integer(kind=kint) :: i,l,locc,loc,locp,invpos,ipinv,ii
2829 if(locc.ne.0)
goto 10
2831 mch(locp)=mch(locp)+1
2834 if(l.ge.neqns)
goto 1000
2837 if(locc.ne.0)
goto 10
2840 mch(locp)=mch(locp)+mch(loc)+1
2844 ipinv=pordr(invp(i))
2853 if(ii.gt.0.and.ii.le.neqns)
then
2856 parent(i)=qarent(invpos)
2859 if(ldbg)
write(idbg,6020)
2860 if(ldbg)
write(idbg,6000) (pordr(i),i=1,neqns)
2861 if(ldbg)
write(idbg,6030)
2862 if(ldbg)
write(idbg,6050)
2863 if(ldbg)
write(idbg,6000) (parent(i),i=1,neqns)
2864 if(ldbg)
write(idbg,6000) (invp(i),i=1,neqns)
2865 if(ldbg)
write(idbg,6040)
2866 if(ldbg)
write(idbg,6000) (iperm(i),i=1,neqns)
2867 if(ldbg)
write(idbg,6010)
2868 if(ldbg)
write(idbg,6000) (nch(i),i=1,neqns)
2871 6020
format(
' post order')
2872 6030
format(/
' invp ')
2873 6040
format(/
' iperm ')
2874 6050
format(/
' parent')
2876 end subroutine posord
2880 subroutine gnleaf(xadj,adjncy,invp,iperm,pordr,nch,adjncp,xleaf,leaf,neqns,lnleaf)
2884 integer(kind=kint),
intent(in) :: xadj(:),adjncy(:),pordr(:),nch(:),invp(:),iperm(:)
2885 integer(kind=kint),
intent(out) :: xleaf(:),leaf(:),adjncp(:)
2886 integer(kind=kint),
intent(in) :: neqns
2888 integer(kind=kint) i,k,l,m,ik,istart,ip,iq,lnleaf,lc1,lc
2896 do 105 k=xadj(ip),xadj(ip+1)-1
2905 call qqsort(adjncp(istart+1:),m)
2906 lc1=adjncp(istart+1)
2907 if(lc1.ge.i)
goto 100
2910 do 130 k=istart+2,ik
2913 if(lc1.lt.lc-nch(lc))
then
2926 if(ldbg)
write(idbg,6020)
2927 if(ldbg)
write(idbg,6000) (xleaf(i),i=1,neqns+1)
2928 if(ldbg)
write(idbg,6010) lnleaf
2929 if(ldbg)
write(idbg,6000) (leaf(i),i=1,lnleaf)
2932 6010
format(
' leaf (len = ',i6,
')')
2933 6020
format(
' xleaf')
2934 end subroutine gnleaf
2938 subroutine countclno(parent,xleaf,leaf,neqns,nstop,lncol,ir)
2948 integer(kind=kint),
intent(in) :: parent(:),xleaf(:),leaf(:)
2949 integer(kind=kint),
intent(in) :: neqns, nstop
2950 integer(kind=kint),
intent(out) :: lncol, ir
2952 integer(kind=kint) :: i,j,k,l,nc,ks,ke,nxleaf
2960 if(ke.lt.ks)
goto 100
2966 if(j.ge.nxleaf)
goto 110
2976 if(j.ge.nstop)
goto 100
2977 if(j.ge.i.or.j.eq.0)
goto 100
2984 end subroutine countclno
2988 subroutine gnclno(parent,pordr,xleaf,leaf,xlnzr,colno,neqns,nstop,lncol,ir)
2992 integer(kind=kint),
intent(in) :: parent(:),pordr(:),xleaf(:),leaf(:)
2993 integer(kind=kint),
intent(out) :: colno(:),xlnzr(:)
2994 integer(kind=kint),
intent(in) :: neqns, nstop
2995 integer(kind=kint),
intent(out) :: lncol,ir
2997 integer(kind=kint) :: i,j,k,l,nc,ks,ke,nxleaf
3006 if(ke.lt.ks)
goto 100
3012 if(j.ge.nxleaf)
goto 110
3023 if(j.ge.nstop)
goto 100
3024 if(j.ge.i.or.j.eq.0)
goto 100
3032 if(ldbg)
write(idbg,6010)
3034 if(ldbg)
write(idbg,6020) lncol
3038 write(idbg,6000) (colno(i),i=xlnzr(k),xlnzr(k+1)-1)
3042 6010
format(
' xlnzr')
3043 6020
format(
' colno (lncol =',i10,
')')
3044 6100
format(/
' row = ',i6)
3046 end subroutine gnclno
3050 subroutine qmdrch(root,xadj,adjncy,deg,marker,rchsze,rchset,nhdsze,nbrhd)
3054 integer(kind=kint),
intent(in) :: deg(:),xadj(:),adjncy(:)
3055 integer(kind=kint),
intent(out) :: rchset(:),nbrhd(:)
3056 integer(kind=kint),
intent(inout) :: marker(:)
3057 integer(kind=kint),
intent(in) :: root
3058 integer(kind=kint),
intent(out) :: nhdsze,rchsze
3060 integer(kind=kint) :: i,j, istrt, istop, jstrt, jstop, nabor, node
3065 istop=xadj(root+1)-1
3066 if(istop.lt.istrt)
return
3067 do 600 i=istrt,istop
3069 if(nabor.eq.0)
return
3070 if(marker(nabor).ne.0)
goto 600
3071 if(deg(nabor).lt.0)
goto 200
3073 rchset(rchsze)=nabor
3076 200 marker(nabor)=-1
3079 300 jstrt=xadj(nabor)
3080 jstop=xadj(nabor+1)-1
3081 do 500 j=jstrt,jstop
3087 elseif(node==0)
then
3090 400
if(marker(node).ne.0)
goto 500
3097 end subroutine qmdrch
3101 subroutine qmdupd(xadj,adjncy,nlist,list,deg,qsize,qlink,marker,rchset,nbrhd)
3105 integer(kind=kint),
intent(in) :: adjncy(:),list(:),xadj(:)
3106 integer(kind=kint),
intent(out) :: nbrhd(:),rchset(:)
3107 integer(kind=kint),
intent(inout) :: marker(:),deg(:),qsize(:),qlink(:)
3108 integer(kind=kint),
intent(in) :: nlist
3110 integer(kind=kint) :: j, deg0,deg1,il,inhd,inode,irch,jstrt,jstop,mark,nabor,nhdsze,node,rchsze
3112 if(nlist.le.0)
return
3117 deg0=deg0+qsize(node)
3119 jstop=xadj(node+1)-1
3121 do 100 j=jstrt,jstop
3123 if(marker(nabor).ne.0.or.deg(nabor).ge.0)
goto 100
3130 if(nhdsze.gt.0)
call qmdmrg(xadj,adjncy,deg,qsize,qlink,marker,deg0,nhdsze,nbrhd,rchset,nbrhd(nhdsze+1:))
3134 if(mark.gt.1.or.mark.lt.0)
goto 600
3135 call qmdrch(node,xadj,adjncy,deg,marker,rchsze,rchset,nhdsze,nbrhd)
3137 if(rchsze.le.0)
goto 400
3138 do 300 irch=1,rchsze
3140 deg1=deg1+qsize(inode)
3143 400 deg(node)=deg1-1
3144 if(nhdsze.le.0)
goto 600
3145 do 500 inhd=1,nhdsze
3151 endsubroutine qmdupd
3155 subroutine qmdot(root,xadj,adjncy,marker,rchsze,rchset,nbrhd)
3159 integer(kind=kint),
intent(in) :: marker(:),rchset(:),nbrhd(:),xadj(:)
3160 integer(kind=kint),
intent(inout) :: adjncy(:)
3161 integer(kind=kint),
intent(in) :: rchsze,root
3163 integer(kind=kint) :: j,irch,inhd,node,jstrt,jstop,link,nabor
3168 100 jstrt=xadj(node)
3169 jstop=xadj(node+1)-2
3170 if(jstop.lt.jstrt)
goto 300
3171 do 200 j=jstrt,jstop
3173 adjncy(j)=rchset(irch)
3174 if(irch.ge.rchsze)
goto 400
3176 300 link=adjncy(jstop+1)
3178 if(link.lt.0)
goto 100
3181 adjncy(jstop+1)=-node
3184 do 600 irch=1,rchsze
3186 if(marker(node).lt.0)
goto 600
3188 jstop=xadj(node+1)-1
3189 do 500 j=jstrt,jstop
3191 if(marker(nabor).ge.0)
goto 500
3197 end subroutine qmdot
3201 subroutine qmdmrg(xadj,adjncy,deg,qsize,qlink,marker,deg0,nhdsze,nbrhd,rchset,ovrlp)
3205 integer(kind=kint),
intent(in) :: adjncy(:),nbrhd(:),xadj(:)
3206 integer(kind=kint),
intent(out) :: rchset(:),ovrlp(:)
3207 integer(kind=kint),
intent(inout) :: deg(:),marker(:),qsize(:), qlink(:)
3208 integer(kind=kint),
intent(in) :: nhdsze
3210 integer(kind=kint) :: j, deg0,deg1,head,inhd,iov,irch,jstrt,jstop,link,lnode,mark,mrgsze,nabor,node,novrlp,rchsze,root
3213 if(nhdsze.le.0)
return
3214 do 100 inhd=1,nhdsze
3218 do 1400 inhd=1,nhdsze
3224 200 jstrt=xadj(root)
3225 jstop=xadj(root+1)-1
3226 do 600 j=jstrt,jstop
3232 elseif(nabor==0)
then
3235 300 mark=marker(nabor)
3243 rchset(rchsze)=nabor
3244 deg1=deg1+qsize(nabor)
3247 500
if(mark.gt.1)
goto 600
3254 do 1100 iov=1,novrlp
3257 jstop=xadj(node+1)-1
3258 do 800 j=jstrt,jstop
3260 if(marker(nabor).ne.0)
goto 800
3264 mrgsze=mrgsze+qsize(node)
3267 900 link=qlink(lnode)
3268 if(link.le.0)
goto 1000
3271 1000 qlink(lnode)=head
3274 if(head.le.0)
goto 1200
3276 deg(head)=deg0+deg1-1
3278 1200 root=nbrhd(inhd)
3280 if(rchsze.le.0)
goto 1400
3281 do 1300 irch=1,rchsze
3287 end subroutine qmdmrg
3291 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)
3297 integer(kind=kint),
intent(in) :: xlnzr_a(:)
3298 integer(kind=kint),
intent(in) :: colno_a(:)
3299 integer(kind=kint),
intent(in) :: iperm_a(:)
3300 integer(kind=kint),
intent(in) :: invp_a(:)
3301 integer(kind=kint),
intent(in) :: ndeg
3302 integer(kind=kint),
intent(in) :: nttbr_c
3303 integer(kind=kint),
intent(in) :: irow_c(:)
3304 integer(kind=kint),
intent(inout) :: jcol_c(:)
3305 integer(kind=kint),
intent(in) :: ncol
3306 integer(kind=kint),
intent(in) :: nrow
3309 integer(kind=kint),
pointer :: xlnzr_c(:)
3310 integer(kind=kint),
pointer :: colno_c(:)
3311 integer(kind=kint),
intent(out) :: lncol_c
3314 integer(kind=kint) :: i,j,k
3315 integer(kind=kint) :: ks, ke, ipass, ierr
3316 logical,
allocatable :: cnz(:)
3317 type(crs_matrix) :: crs_c
3321 jcol_c(i)=invp_a(jcol_c(i))
3328 allocate(cnz(ncol), stat=ierr)
3329 if(ierr .ne. 0)
then
3330 call errtrp(
'stop due to allocation error.')
3338 ke = crs_c%ia(k+1)-1
3339 if (ke .lt. ks)
then
3340 if (ipass .eq. 2)
then
3341 xlnzr_c(k+1)=lncol_c+1
3347 cnz(crs_c%ja(i)) = .true.
3354 if (ke .lt. ks)
then
3358 if (cnz(colno_a(j)))
then
3367 lncol_c = lncol_c + 1
3368 if (ipass .eq. 2)
then
3369 colno_c(lncol_c) = i
3373 if (ipass .eq. 2)
then
3374 xlnzr_c(k+1)=lncol_c + 1
3378 if (ipass .eq. 1)
then
3379 allocate(xlnzr_c(nrow+1),colno_c(lncol_c), stat=ierr)
3380 if(ierr .ne. 0)
then
3381 call errtrp(
'stop due to allocation error.')
3389 jcol_c(i)=iperm_a(jcol_c(i))
3394 end subroutine ldudecomposec
3402 integer(kind=kint),
intent(inout) :: iw(:)
3403 integer(kind=kint),
intent(in) :: ik
3405 integer(kind=kint) :: l,m,itemp
3419 if(iw(l).lt.iw(m))
goto 110
3432 subroutine staij1(isw,i,j,aij,dsi,ir)
3456 real(kind=
kreal),
intent(in) :: aij(:)
3457 integer(kind=kint),
intent(in) :: isw, i, j
3458 integer(kind=kint),
intent(out) :: ir
3460 integer(kind=kint) :: ndeg, neqns, nstop, ndeg2, ndeg2l, ierr
3465 ndeg2l=ndeg*(ndeg+1)/2
3472 if(dsi%stage.ne.20)
then
3473 if(dsi%stage.eq.30)
write(ilog,*)
'Warning a matrix was build up but never solved.'
3477 allocate(dsi%diag(ndeg2l,neqns), stat=ierr)
3478 if(ierr .ne. 0)
then
3479 call errtrp(
'stop due to allocation error.')
3485 allocate(dsi%zln(ndeg2,dsi%lncol), stat=ierr)
3486 if(ierr .ne. 0)
then
3487 call errtrp(
'stop due to allocation error.')
3501 call addr0(isw,i,j,aij,dsi%invp,dsi%xlnzr,dsi%colno,dsi%diag,dsi%zln,dsi%dsln,nstop,dsi%ndeg,ir)
3502 elseif(ndeg.eq.3)
then
3503 call addr3(isw,i,j,aij,dsi%invp,dsi%xlnzr,dsi%colno,dsi%diag,dsi%zln,dsi%dsln,nstop,ir)
3505 call addrx(isw,i,j,aij,dsi%invp,dsi%xlnzr,dsi%colno,dsi%diag,dsi%zln,dsi%dsln,nstop,ndeg,ndeg2,ndeg2l,ir)
3509 end subroutine staij1
3518 subroutine sum(ic,xlnzr,colno,zln,diag,nch,par,neqns)
3522 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),par(:)
3523 integer(kind=kint),
intent(in) :: ic, neqns
3524 real(kind=
kreal),
intent(inout) :: zln(:),diag(:)
3525 integer(kind=kint),
intent(inout) :: nch(:)
3527 real(kind=
kreal) :: s, t, zz, piv
3528 integer(kind=kint) :: ks, ke, kk, k, jc, jj, j, ierr
3529 integer(kind=kint) :: isem
3530 real(kind=
kreal),
allocatable :: temp(:)
3531 integer(kind=kint),
allocatable :: indx(:)
3532 allocate(temp(neqns),indx(neqns), stat=ierr)
3533 if(ierr .ne. 0)
then
3534 call errtrp(
'stop due to allocation error.')
3550 do 310 jj=xlnzr(jc),xlnzr(jc+1)-1
3552 if(indx(j).eq.ic)
then
3566 if(dabs(piv).gt.rmin)
then
3585 subroutine sum1(ic,xlnzr,colno,zln,diag,par,neqns)
3589 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),par(:)
3590 integer(kind=kint),
intent(in) :: ic, neqns
3591 real(kind=
kreal),
intent(inout) :: zln(:),diag(:)
3593 real(kind=
kreal) :: s, t, zz
3594 integer(kind=kint) :: ks, ke, k, jc, j, jj, ierr
3595 real(kind=
kreal),
allocatable :: temp(:)
3596 integer(kind=kint),
allocatable :: indx(:)
3600 allocate(temp(neqns),indx(neqns), stat=ierr)
3601 if(ierr .ne. 0)
then
3602 call errtrp(
'stop due to allocation error.')
3615 do 310 jj=xlnzr(jc),xlnzr(jc+1)-1
3617 if(indx(j).eq.ic)
then
3636 subroutine sum2_child(neqns,nstop,xlnzr,colno,zln,diag,spdslnidx,spdslnval,nspdsln)
3640 integer(kind=kint),
intent(in) :: neqns, nstop
3641 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:)
3642 real(kind=
kreal),
intent(inout) :: zln(:),diag(:)
3643 integer(kind=kint),
pointer :: spdslnidx(:)
3644 real(kind=
kreal),
pointer :: spdslnval(:,:)
3645 integer(kind=kint),
intent(out) :: nspdsln
3647 real(kind=
kreal) :: s
3648 integer(kind=kint) :: ks, ke, k, jc, jj, j, j1,j2
3649 integer(kind=kint) :: ic, i, loc, ierr
3650 integer(kind=kint) :: ispdsln
3652 real(kind=
kreal),
allocatable :: temp(:)
3653 integer(kind=kint),
allocatable :: indx(:)
3655 allocate(temp(neqns),indx(neqns), stat=ierr)
3656 if(ierr .ne. 0)
then
3657 call errtrp(
'stop due to allocation error.')
3671 do jj=xlnzr(jc),xlnzr(jc+1)-1
3673 if(indx(j).eq.ic)
then
3680 allocate(spdslnidx(nspdsln),spdslnval(1,nspdsln), stat=ierr)
3681 if(ierr .ne. 0)
then
3682 call errtrp(
'stop due to allocation error.')
3689 do 100 ic=nstop,neqns
3698 zln(k)=temp(jj)*diag(jj)
3700 diag(ic)=diag(ic)-temp(jj)*zln(k)
3702 do 120 jc=nstop,ic-1
3705 do 220 jj=xlnzr(jc),xlnzr(jc+1)-1
3707 if(indx(j).eq.ic)
then
3715 spdslnidx(ispdsln)=loc
3716 spdslnval(1,ispdsln)=spdslnval(1,ispdsln)-s
3724 end subroutine sum2_child
3728 subroutine sum3(n,dsln,diag)
3732 real(kind=
kreal),
intent(inout) :: dsln(:),diag(:)
3733 integer(kind=kint),
intent(in) :: n
3735 integer(kind=kint) :: i, j, loc, ierr
3736 real(kind=
kreal),
allocatable :: temp(:)
3737 integer(kind=kint),
allocatable :: indx(:)
3738 allocate(temp(n),indx(n), stat=ierr)
3739 if(ierr .ne. 0)
then
3740 call errtrp(
'stop due to allocation error.')
3743 if(n.le.0)
goto 1000
3746 diag(1)=1.0d0/diag(1)
3750 dsln(loc)=dsln(loc)-dot_product(dsln(indx(i):indx(i)+j-2),dsln(indx(j):indx(j)+j-2))
3753 temp(1:i-1)=dsln(indx(i):indx(i)+i-2)*diag(1:i-1)
3754 diag(i)=diag(i)-dot_product(temp(1:i-1),dsln(indx(i):indx(i)+i-2))
3755 dsln(indx(i):indx(i)+i-2)=temp(1:i-1)
3756 diag(i)=1.0d0/diag(i)
3764 real(kind=
kreal)
function spdot2(b,zln,colno,ks,ke)
3768 integer(kind=kint),
intent(in) :: colno(:)
3769 integer(kind=kint),
intent(in) :: ks,ke
3770 real(kind=
kreal),
intent(in) :: zln(:),b(:)
3772 integer(kind=kint) :: j,jj
3773 real(kind=
kreal) :: s
3794 real(kind=
kreal)
function ddot(a,b,n)
3798 real(kind=
kreal),
intent(in) :: a(n),b(n)
3799 integer(kind=kint),
intent(in) :: n
3801 real(kind=
kreal) :: s
3802 integer(kind=kint) :: i
3814 subroutine addr0(isw,i,j,aij,invp,xlnzr,colno,diag,zln,dsln,nstop,ndeg,ir)
3818 integer(kind=kint),
intent(in) :: isw
3819 integer(kind=kint),
intent(in) :: i,j,nstop, ndeg, invp(:),xlnzr(:),colno(:)
3820 real(kind=
kreal),
intent(inout) :: zln(:,:),diag(:,:),dsln(:,:)
3821 real(kind=
kreal),
intent(in) :: aij(:)
3822 integer(kind=kint),
intent(out) :: ir
3824 integer(kind=kint) :: ndeg2, ii, jj, itrans, k, i0, j0, l, ks, ke
3825 integer(kind=kint),
parameter :: idbg=0
3831 if(idbg.ne.0)
write(idbg,*)
'addr0',ii,jj,aij
3837 diag(1,ii)=diag(1,ii)+aij(1)
3839 elseif(ndeg2.eq.4)
then
3845 diag(1,ii)=diag(1,ii)+aij(1)
3846 diag(2,ii)=diag(2,ii)+aij(2)
3847 diag(3,ii)=diag(3,ii)+aij(4)
3859 if(jj.ge.nstop)
then
3866 elseif(ndeg2.eq.4)
then
3867 if(itrans.eq.0)
then
3884 if(colno(k).eq.jj)
then
3888 elseif(ndeg2.eq.4)
then
3889 if(itrans.eq.0)
then
3902 zln(1,k)=zln(1,k)+aij(1)
3903 elseif(ndeg2.eq.4)
then
3904 if(itrans.eq.0)
then
3906 zln(l,k)=zln(l,k)+aij(l)
3909 zln(1,k)=zln(1,k)+aij(1)
3910 zln(2,k)=zln(2,k)+aij(3)
3911 zln(3,k)=zln(3,k)+aij(2)
3912 zln(4,k)=zln(4,k)+aij(4)
3922 end subroutine addr0
3930 subroutine s3um(ic,xlnzr,colno,zln,diag,nch,par,neqns)
3934 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),par(:)
3935 integer(kind=kint),
intent(inout) :: nch(:)
3936 real(kind=
kreal),
intent(inout) :: zln(:,:), diag(:,:)
3937 integer(kind=kint),
intent(in) :: ic,neqns
3939 real(kind=
kreal),
allocatable :: temp(:,:)
3940 integer(kind=kint),
allocatable :: indx(:)
3941 real(kind=
kreal) :: zz(9),t(6)
3942 integer(kind=kint) :: j,k,l,ks,ke,kk,jc,jj,ir, ierr
3944 allocate(temp(9,neqns),indx(neqns), stat=ierr)
3945 if(ierr .ne. 0)
then
3946 call errtrp(
'stop due to allocation error.')
3962 do 310 jj=xlnzr(jc),xlnzr(jc+1)-1
3964 if(indx(j).eq.ic)
then
3965 zz(1)=zz(1)-temp(1,j)*zln(1,jj)-temp(4,j)*zln(4,jj)-temp(7,j)*zln(7,jj)
3966 zz(2)=zz(2)-temp(2,j)*zln(1,jj)-temp(5,j)*zln(4,jj)-temp(8,j)*zln(7,jj)
3967 zz(3)=zz(3)-temp(3,j)*zln(1,jj)-temp(6,j)*zln(4,jj)-temp(9,j)*zln(7,jj)
3968 zz(4)=zz(4)-temp(1,j)*zln(2,jj)-temp(4,j)*zln(5,jj)-temp(7,j)*zln(8,jj)
3969 zz(5)=zz(5)-temp(2,j)*zln(2,jj)-temp(5,j)*zln(5,jj)-temp(8,j)*zln(8,jj)
3970 zz(6)=zz(6)-temp(3,j)*zln(2,jj)-temp(6,j)*zln(5,jj)-temp(9,j)*zln(8,jj)
3971 zz(7)=zz(7)-temp(1,j)*zln(3,jj)-temp(4,j)*zln(6,jj)-temp(7,j)*zln(9,jj)
3972 zz(8)=zz(8)-temp(2,j)*zln(3,jj)-temp(5,j)*zln(6,jj)-temp(8,j)*zln(9,jj)
3973 zz(9)=zz(9)-temp(3,j)*zln(3,jj)-temp(6,j)*zln(6,jj)-temp(9,j)*zln(9,jj)
3977 call inv33(zln(:,k),zz,diag(:,jc))
3983 t(1)=t(1)+zz(1)*zln(1,k)+zz(4)*zln(4,k)+zz(7)*zln(7,k)
3984 t(2)=t(2)+zz(1)*zln(2,k)+zz(4)*zln(5,k)+zz(7)*zln(8,k)
3985 t(3)=t(3)+zz(2)*zln(2,k)+zz(5)*zln(5,k)+zz(8)*zln(8,k)
3986 t(4)=t(4)+zz(1)*zln(3,k)+zz(4)*zln(6,k)+zz(7)*zln(9,k)
3987 t(5)=t(5)+zz(2)*zln(3,k)+zz(5)*zln(6,k)+zz(8)*zln(9,k)
3988 t(6)=t(6)+zz(3)*zln(3,k)+zz(6)*zln(6,k)+zz(9)*zln(9,k)
3992 diag(l,ic)=diag(l,ic)-t(l)
3995 call inv3(diag(:,ic),ir)
4005 subroutine s3um1(ic,xlnzr,colno,zln,diag,nch,par,neqns)
4009 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),nch(:),par(:)
4010 real(kind=
kreal),
intent(in) :: diag(:,:)
4011 real(kind=
kreal),
intent(inout) :: zln(:,:)
4012 integer(kind=kint),
intent(in) :: ic,neqns
4014 integer(kind=kint) :: j,k,l,ks,ke,jc,jj,ierr
4015 real(kind=
kreal) :: s(9)
4016 real(kind=
kreal),
allocatable :: temp(:,:)
4017 integer(kind=kint),
allocatable :: indx(:)
4020 allocate(temp(9,neqns),indx(neqns), stat=ierr)
4034 do 310 jj=xlnzr(jc),xlnzr(jc+1)-1
4036 if(indx(j).eq.ic)
then
4037 s(1)=s(1)+temp(1,j)*zln(1,jj)+temp(4,j)*zln(4,jj)+temp(7,j)*zln(7,jj)
4038 s(2)=s(2)+temp(2,j)*zln(1,jj)+temp(5,j)*zln(4,jj)+temp(8,j)*zln(7,jj)
4039 s(3)=s(3)+temp(3,j)*zln(1,jj)+temp(6,j)*zln(4,jj)+temp(9,j)*zln(7,jj)
4040 s(4)=s(4)+temp(1,j)*zln(2,jj)+temp(4,j)*zln(5,jj)+temp(7,j)*zln(8,jj)
4041 s(5)=s(5)+temp(2,j)*zln(2,jj)+temp(5,j)*zln(5,jj)+temp(8,j)*zln(8,jj)
4042 s(6)=s(6)+temp(3,j)*zln(2,jj)+temp(6,j)*zln(5,jj)+temp(9,j)*zln(8,jj)
4043 s(7)=s(7)+temp(1,j)*zln(3,jj)+temp(4,j)*zln(6,jj)+temp(7,j)*zln(9,jj)
4044 s(8)=s(8)+temp(2,j)*zln(3,jj)+temp(5,j)*zln(6,jj)+temp(8,j)*zln(9,jj)
4045 s(9)=s(9)+temp(3,j)*zln(3,jj)+temp(6,j)*zln(6,jj)+temp(9,j)*zln(9,jj)
4050 temp(l,jc)=zln(l,k)-s(l)
4057 deallocate(temp,indx)
4058 end subroutine s3um1
4063 subroutine s3um3(n,dsln,diag)
4067 real(kind=
kreal),
intent(inout) :: dsln(:,:),diag(:,:)
4068 integer(kind=kint),
intent(in) :: n
4070 real(kind=
kreal) :: t(9)
4071 integer(kind=kint) :: i,j,loc,ir, ierr
4072 real(kind=
kreal),
allocatable :: temp(:,:)
4073 integer(kind=kint),
allocatable :: indx(:)
4075 allocate(temp(9,n),indx(n), stat=ierr)
4076 if(ierr .ne. 0)
then
4077 call errtrp(
'stop due to allocation error.')
4080 if(n.le.0)
goto 1000
4083 call inv3(diag(:,1),ir)
4087 call d3dot(t,dsln(:,indx(i):indx(i)+j-2), dsln(:,indx(j):indx(j)+j-2),j-1)
4089 dsln(:,loc)=dsln(:,loc)-t(:)
4092 call v3prod(dsln(:,indx(i):indx(i)+i-2), diag,temp,i-1)
4093 call d3dotl(t,temp,dsln(:,indx(i):indx(i)+i-2),i-1)
4095 diag(:,i)=diag(:,i)-t(1:6)
4096 dsln(:,indx(i):indx(i)+i-2)=temp(:,1:i-1)
4097 call inv3(diag(:,i),ir)
4101 end subroutine s3um3
4105 subroutine d3sdot(wi,a,b,n)
4109 real(kind=
kreal),
intent(in) :: a(:,:),b(:,:)
4110 real(kind=
kreal),
intent(inout) :: wi(:)
4111 integer(kind=kint),
intent(in) :: n
4113 integer(kind=kint) :: jj
4125 wi(1)=wi(1)-a(1,jj)*b(1,jj)-a(2,jj)*b(4,jj)-a(3,jj)*b(7,jj)
4126 wi(2)=wi(2)-a(1,jj)*b(2,jj)-a(2,jj)*b(5,jj)-a(3,jj)*b(8,jj)
4127 wi(3)=wi(3)-a(1,jj)*b(3,jj)-a(2,jj)*b(6,jj)-a(3,jj)*b(9,jj)
4130 end subroutine d3sdot
4134 subroutine s3pdot(bi,b,zln,colno,ks,ke)
4138 integer(kind=kint),
intent(in) :: colno(:)
4139 real(kind=
kreal),
intent(in) :: zln(:,:),b(:,:)
4140 real(kind=
kreal),
intent(inout) :: bi(:)
4141 integer(kind=kint),
intent(in) :: ks,ke
4143 integer(kind=kint) :: j,jj
4156 bi(1)=bi(1)-zln(1,jj)*b(1,j)-zln(4,jj)*b(2,j)-zln(7,jj)*b(3,j)
4157 bi(2)=bi(2)-zln(2,jj)*b(1,j)-zln(5,jj)*b(2,j)-zln(8,jj)*b(3,j)
4158 bi(3)=bi(3)-zln(3,jj)*b(1,j)-zln(6,jj)*b(2,j)-zln(9,jj)*b(3,j)
4161 end subroutine s3pdot
4165 subroutine inv33(zln,zz,diag)
4169 real(kind=
kreal),
intent(in) :: zz(9),diag(6)
4170 real(kind=
kreal),
intent(out) :: zln(9)
4172 zln(4)=zz(4)-zz(1)*diag(2)
4173 zln(7)=zz(7)-zz(1)*diag(4)-zln(4)*diag(5)
4174 zln(1)=zz(1)*diag(1)
4175 zln(4)=zln(4)*diag(3)
4176 zln(7)=zln(7)*diag(6)
4177 zln(4)=zln(4)-zln(7)*diag(5)
4178 zln(1)=zln(1)-zln(4)*diag(2)-zln(7)*diag(4)
4180 zln(5)=zz(5)-zz(2)*diag(2)
4181 zln(8)=zz(8)-zz(2)*diag(4)-zln(5)*diag(5)
4182 zln(2)=zz(2)*diag(1)
4183 zln(5)=zln(5)*diag(3)
4184 zln(8)=zln(8)*diag(6)
4185 zln(5)=zln(5)-zln(8)*diag(5)
4186 zln(2)=zln(2)-zln(5)*diag(2)-zln(8)*diag(4)
4188 zln(6)=zz(6)-zz(3)*diag(2)
4189 zln(9)=zz(9)-zz(3)*diag(4)-zln(6)*diag(5)
4190 zln(3)=zz(3)*diag(1)
4191 zln(6)=zln(6)*diag(3)
4192 zln(9)=zln(9)*diag(6)
4193 zln(6)=zln(6)-zln(9)*diag(5)
4194 zln(3)=zln(3)-zln(6)*diag(2)-zln(9)*diag(4)
4196 end subroutine inv33
4200 subroutine inv3(dsln,ir)
4204 real(kind=
kreal) :: dsln(6),t(2)
4205 integer(kind=kint) :: ir
4208 if(dabs(dsln(1)).lt.rmin)
then
4211 dsln(1)=1.0d0/dsln(1)
4212 t(1)=dsln(2)*dsln(1)
4213 dsln(3)=dsln(3)-t(1)*dsln(2)
4215 if(dabs(dsln(3)).lt.rmin)
then
4218 dsln(3)=1.0d0/dsln(3)
4219 t(1)=dsln(4)*dsln(1)
4220 dsln(5)=dsln(5)-dsln(2)*dsln(4)
4221 t(2)=dsln(5)*dsln(3)
4222 dsln(6)=dsln(6)-t(1)*dsln(4)-t(2)*dsln(5)
4225 if(dabs(dsln(6)).lt.rmin)
then
4228 dsln(6)=1.0d0/dsln(6)
4232 write(ilog,*)
"singular"
4244 subroutine d3dot(t,a,b,n)
4247 real(kind=
kreal),
intent(in) :: a(:,:),b(:,:)
4248 real(kind=
kreal),
intent(out) :: t(:)
4249 integer(kind=kint),
intent(in) :: n
4251 integer(kind=kint) :: l,jj
4271 t(1)=t(1)+a(1,jj)*b(1,jj)+a(4,jj)*b(4,jj)+a(7,jj)*b(7,jj)
4272 t(2)=t(2)+a(2,jj)*b(1,jj)+a(5,jj)*b(4,jj)+a(8,jj)*b(7,jj)
4273 t(3)=t(3)+a(3,jj)*b(1,jj)+a(6,jj)*b(4,jj)+a(9,jj)*b(7,jj)
4274 t(4)=t(4)+a(1,jj)*b(2,jj)+a(4,jj)*b(5,jj)+a(7,jj)*b(8,jj)
4275 t(5)=t(5)+a(2,jj)*b(2,jj)+a(5,jj)*b(5,jj)+a(8,jj)*b(8,jj)
4276 t(6)=t(6)+a(3,jj)*b(2,jj)+a(6,jj)*b(5,jj)+a(9,jj)*b(8,jj)
4277 t(7)=t(7)+a(1,jj)*b(3,jj)+a(4,jj)*b(6,jj)+a(7,jj)*b(9,jj)
4278 t(8)=t(8)+a(2,jj)*b(3,jj)+a(5,jj)*b(6,jj)+a(8,jj)*b(9,jj)
4279 t(9)=t(9)+a(3,jj)*b(3,jj)+a(6,jj)*b(6,jj)+a(9,jj)*b(9,jj)
4282 end subroutine d3dot
4286 subroutine v3prod(zln,diag,zz,n)
4290 real(kind=
kreal),
intent(in) :: zln(:,:),diag(:,:)
4291 real(kind=
kreal),
intent(out) :: zz(:,:)
4292 integer(kind=kint),
intent(in) :: n
4294 integer(kind=kint) :: i
4297 zz(4,i)=zln(4,i)-zln(1,i)*diag(2,i)
4298 zz(7,i)=zln(7,i)-zln(1,i)*diag(4,i)-zz(4,i)*diag(5,i)
4299 zz(1,i)=zln(1,i)*diag(1,i)
4300 zz(4,i)=zz(4,i)*diag(3,i)
4301 zz(7,i)=zz(7,i)*diag(6,i)
4302 zz(4,i)=zz(4,i)-zz(7,i)*diag(5,i)
4303 zz(1,i)=zz(1,i)-zz(4,i)*diag(2,i)-zz(7,i)*diag(4,i)
4305 zz(5,i)=zln(5,i)-zln(2,i)*diag(2,i)
4306 zz(8,i)=zln(8,i)-zln(2,i)*diag(4,i)-zz(5,i)*diag(5,i)
4307 zz(2,i)=zln(2,i)*diag(1,i)
4308 zz(5,i)=zz(5,i)*diag(3,i)
4309 zz(8,i)=zz(8,i)*diag(6,i)
4310 zz(5,i)=zz(5,i)-zz(8,i)*diag(5,i)
4311 zz(2,i)=zz(2,i)-zz(5,i)*diag(2,i)-zz(8,i)*diag(4,i)
4313 zz(6,i)=zln(6,i)-zln(3,i)*diag(2,i)
4314 zz(9,i)=zln(9,i)-zln(3,i)*diag(4,i)-zz(6,i)*diag(5,i)
4315 zz(3,i)=zln(3,i)*diag(1,i)
4316 zz(6,i)=zz(6,i)*diag(3,i)
4317 zz(9,i)=zz(9,i)*diag(6,i)
4318 zz(6,i)=zz(6,i)-zz(9,i)*diag(5,i)
4319 zz(3,i)=zz(3,i)-zz(6,i)*diag(2,i)-zz(9,i)*diag(4,i)
4322 end subroutine v3prod
4325 subroutine d3dotl(t,a,b,n)
4328 real(kind=
kreal),
intent(in) :: a(:,:),b(:,:)
4329 real(kind=
kreal),
intent(out) :: t(:)
4330 integer(kind=kint),
intent(in) :: n
4332 integer(kind=kint) :: l,jj
4349 t(1)=t(1)+a(1,jj)*b(1,jj)+a(4,jj)*b(4,jj)+a(7,jj)*b(7,jj)
4350 t(2)=t(2)+a(2,jj)*b(1,jj)+a(5,jj)*b(4,jj)+a(8,jj)*b(7,jj)
4351 t(3)=t(3)+a(2,jj)*b(2,jj)+a(5,jj)*b(5,jj)+a(8,jj)*b(8,jj)
4352 t(4)=t(4)+a(3,jj)*b(1,jj)+a(6,jj)*b(4,jj)+a(9,jj)*b(7,jj)
4353 t(5)=t(5)+a(3,jj)*b(2,jj)+a(6,jj)*b(5,jj)+a(9,jj)*b(8,jj)
4354 t(6)=t(6)+a(3,jj)*b(3,jj)+a(6,jj)*b(6,jj)+a(9,jj)*b(9,jj)
4357 end subroutine d3dotl
4361 subroutine addr3(isw,i,j,aij,invp,xlnzr,colno,diag,zln,dsln,nstop,ir)
4365 integer(kind=kint),
intent(in) :: invp(:),xlnzr(:),colno(:)
4366 real(kind=
kreal),
intent(in) :: aij(:)
4367 real(kind=
kreal),
intent(inout) :: zln(:,:),diag(:,:),dsln(:,:)
4368 integer(kind=kint),
intent(in) :: isw,i,j,nstop
4369 integer(kind=kint),
intent(out) :: ir
4371 integer(kind=kint),
parameter :: ndeg2=9
4372 integer(kind=kint),
parameter :: ndeg2l=6
4373 integer(kind=kint) :: k,l,ii,jj,itrans,i0,j0,ks,ke
4378 if(ldbg)
write(idbg,*)
'addr3',ii,jj,aij
4399 if(jj.ge.nstop)
then
4403 if(itrans.eq.0)
then
4426 if(colno(k).eq.jj)
then
4427 if(itrans.eq.0)
then
4448 end subroutine addr3
4452 subroutine s2um(ic,xlnzr,colno,zln,diag,nch,par,neqns)
4456 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),par(:)
4457 integer(kind=kint),
intent(inout) :: nch(:)
4458 real(kind=
kreal),
intent(inout) :: zln(:,:),diag(:,:)
4459 integer(kind=kint),
intent(in) :: ic,neqns
4461 integer(kind=kint) :: j,k,l,ks,ke,jj,jc,ir,kk, ierr
4462 real(kind=
kreal),
allocatable :: temp(:,:)
4463 integer(kind=kint),
allocatable :: indx(:)
4464 real(kind=
kreal) :: s(4),zz(4),t(3)
4466 allocate(temp(4,neqns),indx(neqns), stat=ierr)
4467 if(ierr .ne. 0)
then
4468 call errtrp(
'stop due to allocation error.')
4483 do 310 jj=xlnzr(jc),xlnzr(jc+1)-1
4485 if(indx(j).eq.ic)
then
4486 zz(1)=zz(1)-temp(1,j)*zln(1,jj)-temp(3,j)*zln(3,jj)
4487 zz(2)=zz(2)-temp(2,j)*zln(1,jj)-temp(4,j)*zln(3,jj)
4488 zz(3)=zz(3)-temp(1,j)*zln(2,jj)-temp(3,j)*zln(4,jj)
4489 zz(4)=zz(4)-temp(2,j)*zln(2,jj)-temp(4,j)*zln(4,jj)
4492 call inv22(zln(:,k),zz,diag(:,jc))
4496 t(1)=t(1)+zz(1)*zln(1,k)+zz(3)*zln(3,k)
4497 t(2)=t(2)+zz(2)*zln(1,k)+zz(4)*zln(3,k)
4498 t(3)=t(3)+zz(2)*zln(2,k)+zz(4)*zln(4,k)
4500 diag(1,ic)=diag(1,ic)-t(1)
4501 diag(2,ic)=diag(2,ic)-t(2)
4502 diag(3,ic)=diag(3,ic)-t(3)
4503 call inv2(diag(:,ic),ir)
4512 subroutine s2um1(ic,xlnzr,colno,zln,diag,nch,par,neqns)
4516 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),nch(:),par(:)
4517 real(kind=
kreal),
intent(in) :: diag(:,:)
4518 real(kind=
kreal),
intent(inout) :: zln(:,:)
4519 integer(kind=kint),
intent(in) :: ic,neqns
4521 integer(kind=kint) :: j,k,l,ks,ke,jc,jj, ierr
4522 real(kind=
kreal) :: s(4)
4523 real(kind=
kreal),
allocatable :: temp(:,:)
4524 integer(kind=kint),
allocatable :: indx(:)
4526 allocate(temp(4,neqns),indx(neqns), stat=ierr)
4527 if(ierr .ne. 0)
then
4528 call errtrp(
'stop due to allocation error.')
4539 do 310 jj=xlnzr(jc),xlnzr(jc+1)-1
4541 if(indx(j).eq.ic)
then
4542 s(1)=s(1)+temp(1,j)*zln(1,jj)+temp(3,j)*zln(3,jj)
4543 s(2)=s(2)+temp(2,j)*zln(1,jj)+temp(4,j)*zln(3,jj)
4544 s(3)=s(3)+temp(1,j)*zln(2,jj)+temp(3,j)*zln(4,jj)
4545 s(4)=s(4)+temp(2,j)*zln(2,jj)+temp(4,j)*zln(4,jj)
4549 temp(l,jc)=zln(l,k)-s(l)
4555 end subroutine s2um1
4559 subroutine s2um2_child(neqns,nstop,xlnzr,colno,zln,diag,spdslnidx,spdslnval,nspdsln)
4563 integer(kind=kint),
intent(in) :: neqns, nstop
4564 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:)
4565 real(kind=
kreal),
intent(inout) :: zln(:,:),diag(:,:)
4566 integer(kind=kint),
pointer :: spdslnidx(:)
4567 real(kind=
kreal),
pointer :: spdslnval(:,:)
4568 integer(kind=kint),
intent(out) :: nspdsln
4570 integer(kind=kint) :: j,k, ic,ks,ke,jj,jc,j1,j2,loc,ispdsln, ierr
4571 real(kind=
kreal),
allocatable :: temp(:,:)
4572 integer(kind=kint),
allocatable :: indx(:)
4575 allocate(temp(4,neqns),indx(neqns), stat=ierr)
4576 if(ierr .ne. 0)
then
4577 call errtrp(
'stop due to allocation error.')
4591 do jj=xlnzr(jc),xlnzr(jc+1)-1
4593 if(indx(j).eq.ic)
then
4600 allocate(spdslnidx(nspdsln),spdslnval(4,nspdsln), stat=ierr)
4601 if(ierr .ne. 0)
then
4602 call errtrp(
'stop due to allocation error.')
4609 do 100 ic=nstop,neqns
4619 zln(3,k)=temp(3,jj)-temp(1,jj)*diag(2,jj)
4620 zln(1,k)=temp(1,jj)*diag(1,jj)
4621 zln(3,k)=zln(3,k)*diag(3,jj)
4622 zln(1,k)=zln(1,k)-zln(3,k)*diag(2,jj)
4624 zln(4,k)=temp(4,jj)-temp(2,jj)*diag(2,jj)
4625 zln(2,k)=temp(2,jj)*diag(1,jj)
4626 zln(4,k)=zln(4,k)*diag(3,jj)
4627 zln(2,k)=zln(2,k)-zln(4,k)*diag(2,jj)
4629 diag(1,ic)=diag(1,ic)-(temp(1,jj)*zln(1,k)+temp(3,jj)*zln(3,k))
4630 diag(2,ic)=diag(2,ic)-(temp(1,jj)*zln(2,k)+temp(3,jj)*zln(4,k))
4631 diag(3,ic)=diag(3,ic)-(temp(2,jj)*zln(2,k)+temp(4,jj)*zln(4,k))
4634 do 120 jc=nstop,ic-1
4636 do 220 jj=xlnzr(jc),xlnzr(jc+1)-1
4638 if(indx(j).eq.ic)
then
4643 spdslnidx(ispdsln)=loc
4644 spdslnval(1,ispdsln)=spdslnval(1,ispdsln)-(temp(1,j)*zln(1,jj)+temp(3,j)*zln(3,jj))
4645 spdslnval(2,ispdsln)=spdslnval(2,ispdsln)-(temp(2,j)*zln(1,jj)+temp(4,j)*zln(3,jj))
4646 spdslnval(3,ispdsln)=spdslnval(3,ispdsln)-(temp(1,j)*zln(2,jj)+temp(3,j)*zln(4,jj))
4647 spdslnval(4,ispdsln)=spdslnval(4,ispdsln)-(temp(2,j)*zln(2,jj)+temp(4,j)*zln(4,jj))
4654 end subroutine s2um2_child
4658 subroutine inv22(zln,zz,diag)
4662 real(kind=
kreal),
intent(in) :: zz(4),diag(3)
4663 real(kind=
kreal),
intent(out) :: zln(4)
4665 zln(3)=zz(3)-zz(1)*diag(2)
4666 zln(1)=zz(1)*diag(1)
4667 zln(3)=zln(3)*diag(3)
4668 zln(1)=zln(1)-zln(3)*diag(2)
4670 zln(4)=zz(4)-zz(2)*diag(2)
4671 zln(2)=zz(2)*diag(1)
4672 zln(4)=zln(4)*diag(3)
4673 zln(2)=zln(2)-zln(4)*diag(2)
4676 end subroutine inv22
4680 subroutine inv2(dsln,ir)
4684 real(kind=
kreal),
intent(inout) :: dsln(3)
4685 integer(kind=kint),
intent(out) :: ir
4687 real(kind=
kreal) :: t
4690 if(dabs(dsln(1)).lt.rmin)
then
4694 dsln(1)=1.0d0/dsln(1)
4696 dsln(3)=dsln(3)-t*dsln(2)
4698 if(dabs(dsln(3)).lt.rmin)
then
4702 dsln(3)=1.0d0/dsln(3)
4711 subroutine s2pdot(bi,b,zln,colno,ks,ke)
4715 integer(kind=kint),
intent(in) :: colno(:)
4716 integer(kind=kint),
intent(in) :: ks,ke
4717 real(kind=
kreal),
intent(in) :: zln(:,:),b(:,:)
4718 real(kind=
kreal),
intent(inout) :: bi(:)
4720 integer(kind=kint) :: jj,j
4733 bi(1)=bi(1)-zln(1,jj)*b(1,j)-zln(3,jj)*b(2,j)
4734 bi(2)=bi(2)-zln(2,jj)*b(1,j)-zln(4,jj)*b(2,j)
4737 end subroutine s2pdot
4741 subroutine addrx(isw,i,j,aij,invp,xlnzr,colno,diag,zln,dsln,nstop,ndeg,ndeg2,ndeg2l,ir)
4745 integer(kind=kint),
intent(in) :: invp(*),xlnzr(*),colno(*)
4746 real(kind=
kreal),
intent(in) :: aij(ndeg,ndeg)
4747 real(kind=
kreal),
intent(inout) :: zln(ndeg,ndeg,*),diag(ndeg2l,*),dsln(ndeg,ndeg,*)
4748 integer(kind=kint),
intent(in) :: isw,i,j,nstop,ndeg,ndeg2,ndeg2l
4749 integer(kind=kint),
intent(out) :: ir
4751 integer(kind=kint) :: ii,jj,k,l,m,n,ks,ke,itrans,i0,j0
4756 if(ldbg)
write(idbg,*)
'addrx',ii,jj,aij
4774 if(jj.ge.nstop)
then
4778 if(itrans.eq.0)
then
4781 dsln(n,m,k)=aij(n,m)
4788 dsln(n,m,k)=aij(m,n)
4797 if(colno(k).eq.jj)
then
4798 if(itrans.eq.0)
then
4817 end subroutine addrx
4821 subroutine dxdot(ndeg,t,a,b,l)
4825 real(kind=
kreal),
intent(in) :: a(ndeg,ndeg,*),b(ndeg,ndeg,*)
4826 real(kind=
kreal),
intent(out) :: t(ndeg,ndeg)
4827 integer(kind=kint),
intent(in) :: ndeg,l
4829 integer(kind=kint) :: k,jj,n,m
4845 t(n,m)=t(n,m)+a(n,k,jj)*b(m,k,jj)
4851 end subroutine dxdot
4855 subroutine dxdotl(ndeg,t,a,b,l)
4859 real(kind=
kreal),
intent(in) :: a(ndeg,ndeg,*),b(ndeg,ndeg,*)
4860 real(kind=
kreal),
intent(out) :: t(ndeg,ndeg)
4861 integer(kind=kint),
intent(in) :: ndeg,l
4863 integer(kind=kint) :: n,m,jj,k
4879 t(n,m)=t(n,m)+a(n,k,jj)*b(m,k,jj)
4885 end subroutine dxdotl
4889 subroutine dxsdot(ndeg,wi,a,b,n)
4893 real(kind=
kreal),
intent(in) :: a(ndeg,*),b(ndeg,ndeg,*)
4894 real(kind=
kreal),
intent(inout) :: wi(ndeg)
4895 integer(kind=kint),
intent(in) :: ndeg, n
4897 integer(kind=kint) :: jj, k, l
4912 wi(l)=wi(l)-b(l,k,jj)*a(k,jj)
4917 end subroutine dxsdot
4921 subroutine invx(dsln,ndeg,ir)
4925 real(kind=
kreal),
intent(inout) :: dsln(*)
4926 integer(kind=kint),
intent(in) :: ndeg
4927 integer(kind=kint),
intent(out) :: ir
4929 integer(kind=kint) :: i,j,k,l,ld,l0,k0,ll
4930 real(kind=
kreal) :: tem,t
4934 dsln(1)=1.0d0/dsln(1)
4942 dsln(l)=dsln(l)-dsln(l0+k)*dsln(ld)
4952 tem=dsln(k)*dsln(k0)
4958 dsln(l)=1.0d0/dsln(l)
4965 subroutine invxx(zln,zz,diag,ndeg)
4969 real(kind=
kreal),
intent(in) :: zz(ndeg,ndeg),diag(*)
4970 real(kind=
kreal),
intent(out) :: zln(ndeg,ndeg)
4971 integer(kind=kint),
intent(in) :: ndeg
4973 integer(kind=kint) :: l,m,n,loc,loc1
4982 zln(l,n)=zln(l,n)-zln(l,m)*diag(loc1)
4989 zln(l,m)=zln(l,m)*diag(loc)
4994 zln(l,m)=zln(l,m)-zln(l,n)*diag(loc)
5000 end subroutine invxx
5004 subroutine sxpdot(ndeg,bi,b,zln,colno,ks,ke)
5008 integer(kind=kint),
intent(in) :: colno(*)
5009 real(kind=
kreal),
intent(in) :: zln(ndeg,ndeg,*),b(ndeg,*)
5010 real(kind=
kreal),
intent(inout) :: bi(ndeg)
5011 integer(kind=kint),
intent(in) :: ndeg,ks,ke
5013 integer(kind=kint) :: j,jj,m,n
5028 bi(n)=bi(n)-zln(n,m,jj)*b(m,j)
5033 end subroutine sxpdot
5037 subroutine sxum(ic,xlnzr,colno,zln,diag,nch,par,neqns,ndeg,ndegl)
5041 integer(kind=kint),
intent(in) :: xlnzr(*),colno(*),par(*)
5042 integer(kind=kint),
intent(inout) :: nch(*)
5043 real(kind=
kreal),
intent(inout) :: zln(ndeg,ndeg,*),diag(ndegl,*)
5044 integer(kind=kint),
intent(in) :: ic,neqns,ndeg,ndegl
5046 real(kind=
kreal) :: zz(ndeg,ndeg),t(ndegl)
5047 integer(kind=kint) :: j,k,m,n,ndeg22,ks,ke,jc,loc,jj,kk,ir, ierr
5048 real(kind=
kreal),
allocatable :: temp(:,:,:)
5049 integer(kind=kint),
allocatable :: indx(:)
5052 allocate(temp(ndeg,ndeg,neqns),indx(neqns), stat=ierr)
5053 if(ierr .ne. 0)
then
5054 call errtrp(
'stop due to allocation error.')
5065 do jj=xlnzr(jc),xlnzr(jc+1)-1
5067 if(indx(j).eq.ic)
then
5071 zz(n,m)=zz(n,m)-temp(n,kk,j)*zln(m,kk,jj)
5077 call invxx(zln(1,1,k),zz,diag(1,jc),ndeg)
5084 t(loc)=t(loc)+zz(n,kk)*zln(m,kk,k)
5089 diag(:,ic)=diag(:,ic)-t
5090 call invx(diag(1,ic),ndeg,ir)
5099 subroutine sxum1(ic,xlnzr,colno,zln,diag,nch,par,neqns,ndeg,ndegl)
5103 integer(kind=kint),
intent(in) :: xlnzr(*),colno(*),nch(*),par(*)
5104 real(kind=
kreal),
intent(in) :: diag(ndegl,*)
5105 real(kind=
kreal),
intent(inout) :: zln(ndeg,ndeg,*)
5106 integer(kind=kint),
intent(in) :: ic,neqns,ndeg,ndegl
5108 real(kind=
kreal) :: s(ndeg,ndeg)
5109 integer(kind=kint) :: j,k,m,n,ks,ke,jc,jj,kk, ierr
5110 real(kind=
kreal),
allocatable :: temp(:,:,:)
5111 integer(kind=kint),
allocatable :: indx(:)
5113 allocate(temp(ndeg,ndeg,neqns),indx(neqns), stat=ierr)
5114 if(ierr .ne. 0)
then
5115 call errtrp(
'stop due to allocation error.')
5127 do jj=xlnzr(jc),xlnzr(jc+1)-1
5129 if(indx(j).eq.ic)
then
5133 s(n,m)=s(n,m)+temp(n,kk,j)*zln(m,kk,jj)
5141 temp(n,m,jc)=zln(n,m,k)-s(n,m)
5142 zln(n,m,k)=temp(n,m,jc)
5148 end subroutine sxum1
5152 subroutine sxum2_child(neqns,nstop,xlnzr,colno,zln,diag,spdslnidx,spdslnval,nspdsln,ndeg,ndegl)
5156 integer(kind=kint),
intent(in) :: neqns, nstop
5157 integer(kind=kint),
intent(in) :: xlnzr(*),colno(*)
5158 real(kind=
kreal),
intent(inout) :: zln(ndeg,ndeg,*),diag(ndegl,*)
5159 integer(kind=kint),
pointer :: spdslnidx(:)
5160 real(kind=
kreal),
pointer :: spdslnval(:,:)
5161 integer(kind=kint),
intent(out) :: nspdsln
5162 integer(kind=kint),
intent(in) :: ndeg, ndegl
5164 integer(kind=kint) :: j,k,m,n, ic,ks,ke,jj,jc,j1,j2,loc,locd,kk, ierr
5165 integer(kind=kint) :: ispdsln
5166 real(kind=
kreal),
allocatable :: temp(:,:,:)
5167 integer(kind=kint),
allocatable :: indx(:)
5170 allocate(temp(ndeg,ndeg,neqns),indx(neqns), stat=ierr)
5171 if(ierr .ne. 0)
then
5172 call errtrp(
'stop due to allocation error.')
5186 do jj=xlnzr(jc),xlnzr(jc+1)-1
5188 if(indx(j).eq.ic)
then
5195 allocate(spdslnidx(nspdsln),spdslnval(ndeg*ndeg,nspdsln), stat=ierr)
5196 if(ierr .ne. 0)
then
5197 call errtrp(
'stop due to allocation error.')
5211 temp(n,m,jj)=zln(n,m,k)
5218 call invxx(zln(1,1,k),temp(1,1,jj),diag(1,jj),ndeg)
5228 diag(locd,ic)=diag(locd,ic)-temp(n,kk,jj)*zln(m,kk,k)
5237 do jj=xlnzr(jc),xlnzr(jc+1)-1
5239 if(indx(j).eq.ic)
then
5244 spdslnidx(ispdsln)=loc
5248 spdslnval(ndeg*(m-1)+n,ispdsln)=spdslnval(ndeg*(m-1)+n,ispdsln)-temp(n,k,j)*zln(m,k,jj)
5258 end subroutine sxum2_child
5262 subroutine sxum3(neqns,dsln,diag,ndeg,ndegl)
5266 real(kind=
kreal),
intent(inout):: dsln(ndeg,ndeg,*),diag(ndegl,*)
5267 integer(kind=kint),
intent(in) :: neqns, ndeg, ndegl
5269 integer(kind=kint) :: loc, locd, ir, i,j,n,m, ierr
5270 integer(kind=kint),
allocatable :: indx(:)
5271 real(kind=
kreal),
allocatable :: temp(:,:,:)
5272 real(kind=
kreal),
allocatable :: t(:,:)
5274 allocate(indx(neqns),temp(ndeg,ndeg,neqns),t(ndeg,ndeg), stat=ierr)
5275 if(ierr .ne. 0)
then
5276 call errtrp(
'stop due to allocation error.')
5279 if(neqns.le.0)
goto 1000
5282 call invx(diag(1,1),ndeg,ir)
5286 call dxdot(ndeg,t,dsln(1,1,indx(i)),dsln(1,1,indx(j)),j-1)
5289 dsln(n,m,loc)=dsln(n,m,loc)-t(n,m)
5294 call vxprod(ndeg,ndegl,dsln(1,1,indx(i)),diag,temp,i-1)
5295 call dxdotl(ndeg,t,temp,dsln(1,1,indx(i)),i-1)
5300 diag(locd,i)=diag(locd,i)-t(n,m)
5303 call vcopy(temp,dsln(1,1,indx(i)),ndeg*ndeg*(i-1))
5304 call invx(diag(1,i),ndeg,ir)
5308 end subroutine sxum3
5311 subroutine vcopy(a,c,n)
5314 integer(kind=kint) :: n
5315 real(kind=
kreal) :: a(n),c(n)
5321 end subroutine vcopy
5325 subroutine verif0(neqns,ndeg,nttbr,irow,jcol,val,rhs,x)
5329 integer(kind=kint),
intent(in) :: irow(*),jcol(*)
5330 integer(kind=kint),
intent(in) :: neqns,ndeg,nttbr
5331 real(kind=
kreal),
intent(in) :: val(ndeg,ndeg,*),x(ndeg,*)
5332 real(kind=
kreal),
intent(inout) :: rhs(ndeg,*)
5334 integer(kind=kint) :: i,j,k,l,m
5335 real(kind=
kreal) :: rel,err
5346 rel=rel+dabs(rhs(l,i))
5354 rhs(l,i)=rhs(l,i)-val(l,m,k)*x(m,j)
5355 if(i.ne.j) rhs(l,j)=rhs(l,j)-val(m,l,k)*x(m,i)
5362 err=err+dabs(rhs(l,i))
5365 if (m_pds_procinfo%myid .eq. 0)
then
5366 write(imsg,6000) err,rel,err/rel
5368 6000
format(
' ***verification***(symmetric)'/&
5369 &
'norm(Ax-b) = ',1pd20.10/&
5370 &
'norm(b) = ',1pd20.10/&
5371 &
'norm(Ax-b)/norm(b) = ',1pd20.10)
5372 6010
format(1p4d15.7)
5374 end subroutine verif0
5378 subroutine vxprod(ndeg,ndegl,zln,diag,zz,n)
5382 real(kind=
kreal),
intent(in) :: zln(ndeg*ndeg,n),diag(ndegl,n)
5383 real(kind=
kreal),
intent(out) :: zz(ndeg*ndeg,n)
5384 integer(kind=kint),
intent(in) :: ndeg,ndegl,n
5386 integer(kind=kint) :: i
5389 call invxx(zz(1,i),zln(1,i),diag(1,i),ndeg)
5392 end subroutine vxprod
subroutine, public hecmw_mat_dump(hecMAT, hecMESH)
subroutine, public hecmw_mat_dump_solution(hecMAT)
subroutine nusol3_child(xlnzr, colno, zln, diag, iperm, b, neqns, nstop)
subroutine qqsort(iw, ik)
subroutine nusolx_child(xlnzr, colno, zln, diag, iperm, b, neqns, nstop, ndeg)
subroutine, public hecmw_solve_direct_parallel(hecMESH, hecMAT, ii)
subroutine hecmw_abort(comm, code)
integer(kind=kint) function hecmw_comm_get_comm()
integer(kind=4), parameter kreal
real(kind=kreal) function hecmw_wtime()
subroutine, public symbolicirjctocrs(ndeg, nttbr, irow, jcol, ncols, nrows, c)
subroutine, public initelap(t, i)
subroutine, public elapout(mes)
subroutine, public reovec(r, iperm)
subroutine, public matrix_partition_recursive_bisection(a0, ndiv, pmi)