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(22) .ge. 1)
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 :: neqns_c, iofst_a2, iofst_c, ndm
183 integer(kind=kint) :: ierr
184 integer(kind=kint) :: i,j,k,l,m,n
187 integer(kind=kint) :: istatus(mpi_status_size)
188 integer(kind=kint) :: icp
189 real(kind=
kreal),
allocatable :: spdslnval(:,:), diagbuf(:,:), bdbuf(:,:)
190 integer(kind=kint),
allocatable :: spdslnidx(:)
191 integer(kind=kint) :: nspdsln
194 call elapout(
'sp_direct_parent: entered')
197 if (.not. nusol_ready)
then
204 call geta0(hecmesh, hecmat, a0)
207 ndegt = (ndeg+1)*ndeg/2
209 call elapout(
'sp_direct_parent: make a0 done')
219 call elapout(
'sp_direct_parent: enter matrix partition')
221 call elapout(
'sp_direct_parent: end matrix partition')
222 neqns_d = pmi%neqns_d
225 part_all=>pmi%part_all
226 iperm_all=>pmi%iperm_all
231 allocate(iofst_dm(0:ndm), stat=ierr)
233 call errtrp(
'stop due to allocation error.')
238 iofst_dm(i)=iofst_dm(i-1)+dm(i-1)%a%neqns
241 iperm_all(i)=iperm_all(i)+iofst_dm(part_all(i))
244 allocate(iperm_rev(a0%neqns), stat=ierr)
246 call errtrp(
'stop due to allocation error.')
249 iperm_rev(iperm_all(i)) = i
260 call elapout(
'sp_direct_parent: send divided matrix to children')
261 do i=1,m_pds_procinfo%nchildren
262 icp = m_pds_procinfo%ichildren(i)
263 call mpi_send(dm(i)%a%ndeg, 1,mpi_integer,icp,1,mpi_comm_world,ierr)
264 call mpi_send(dm(i)%a%neqns, 1,mpi_integer,icp,1,mpi_comm_world,ierr)
265 call mpi_send(dm(i)%a%nttbr, 1,mpi_integer,icp,1,mpi_comm_world,ierr)
267 call mpi_send(dm(i)%a%irow, dm(i)%a%nttbr, mpi_integer,icp,1,mpi_comm_world,ierr)
268 call mpi_send(dm(i)%a%jcol, dm(i)%a%nttbr, mpi_integer,icp,1,mpi_comm_world,ierr)
269 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)
271 call mpi_send(dm(i)%c%ndeg, 1,mpi_integer,icp,1,mpi_comm_world,ierr)
272 call mpi_send(dm(i)%c%nttbr, 1,mpi_integer,icp,1,mpi_comm_world,ierr)
273 call mpi_send(dm(i)%c%nrows, 1,mpi_integer,icp,1,mpi_comm_world,ierr)
274 call mpi_send(dm(i)%c%ncols, 1,mpi_integer,icp,1,mpi_comm_world,ierr)
276 call mpi_send(dm(i)%c%irow, dm(i)%c%nttbr, mpi_integer,icp,1,mpi_comm_world,ierr)
277 call mpi_send(dm(i)%c%jcol, dm(i)%c%nttbr, mpi_integer,icp,1,mpi_comm_world,ierr)
278 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)
284 do i=1,m_pds_procinfo%nchildren
285 deallocate(dm(i)%a%irow,dm(i)%a%jcol,dm(i)%a%val)
286 deallocate(dm(i)%c%irow,dm(i)%c%jcol,dm(i)%c%val)
289 call elapout(
'sp_direct_parent: end send matrix')
298 call elapout(
'sp_direct_parent: receive D matrix element')
299 allocate(diagbuf(ndegt, neqns_d), stat=ierr)
301 call errtrp(
'stop due to allocation error.')
304 do k=1,m_pds_procinfo%nchildren
305 icp=m_pds_procinfo%ichildren(k)
306 call mpi_recv(nspdsln, 1,mpi_integer,icp,1,mpi_comm_world,istatus,ierr)
307 allocate(spdslnidx(nspdsln),spdslnval(nndeg,nspdsln),stat=ierr)
309 call errtrp(
'stop due to allocation error.')
311 call mpi_recv(spdslnidx, nspdsln, mpi_integer,icp,1,mpi_comm_world,istatus,ierr)
312 call mpi_recv(spdslnval, nspdsln*nndeg,mpi_real8,icp,1,mpi_comm_world,istatus,ierr)
313 call mpi_recv(diagbuf, neqns_d*ndegt,mpi_real8,icp,1,mpi_comm_world,istatus,ierr)
317 dsln(:,spdslnidx(i)) = dsln(:,spdslnidx(i)) + spdslnval(:,i)
323 diag(j,i) = diag(j,i) + diagbuf(j,i)
326 deallocate(spdslnidx, spdslnval)
329 call elapout(
'sp_direct_parent: end receive D matrix element')
335 call elapout(
'sp_direct_parent: LDU decompose of D. entering nufct0_parent')
336 call nufct0_parent(dsln, diag, neqns_d, ndeg)
337 call elapout(
'sp_direct_parent: exit nufct0_parent')
357 allocate(b(ndeg,a0%neqns), stat=ierr)
359 call errtrp(
'stop due to allocation error.')
363 b(j,i)=hecmat%b(ndeg*(i-1)+j)
368 allocate(oldb(ndeg,a0%neqns), stat=ierr)
370 call errtrp(
'stop due to allocation error.')
375 do i=1,m_pds_procinfo%nchildren
376 icp=m_pds_procinfo%ichildren(i)
377 call mpi_send(b(1,iofst_dm(i)+1), dm(i)%ndeg*dm(i)%a%neqns, mpi_real8, icp, 1,mpi_comm_world, ierr)
380 allocate(bd(ndeg,neqns_d), stat=ierr)
382 call errtrp(
'stop due to allocation error.')
384 bd(:,1:neqns_d) = b(:,1:neqns_d)
386 call elapout(
'sp_direct_parent: end send b')
396 call elapout(
'sp_direct_parent: begin receive bd')
397 allocate(bdbuf(ndeg,neqns_d), stat=ierr)
399 call errtrp(
'stop due to allocation error.')
402 do k=1,m_pds_procinfo%nchildren
403 icp=m_pds_procinfo%ichildren(k)
404 call mpi_recv(bdbuf, ndeg*neqns_d, mpi_real8, icp, 1,mpi_comm_world, istatus, ierr)
407 bd(j,i) = bd(j,i) + bdbuf(j,i)
412 call elapout(
'sp_direct_parent: end receive bd')
418 call elapout(
'sp_direct_parent: begin solve Ax_d=b_d')
419 call nusol0_parent(dsln, diag, bd, neqns_d, ndeg)
420 call elapout(
'sp_direct_parent: end solve Ax_d=b_d')
427 call elapout(
'sp_direct_parent: begin send Xd')
428 call mpi_bcast(bd, ndeg*neqns_d, mpi_real8, m_pds_procinfo%imp, mpi_comm_world, ierr)
429 call elapout(
'sp_direct_parent: end send Xd')
435 call elapout(
'sp_direct_parent: begin receive X')
436 do k=1,m_pds_procinfo%nchildren
437 icp=m_pds_procinfo%ichildren(k)
438 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)
440 b(:,1:neqns_d)=bd(:,:)
441 call elapout(
'sp_direct_parent: end receive X')
448 call elapout(
'sp_direct_parent: begin permutate X')
450 call elapout(
'sp_direct_parent: end permutate X')
453 call verif0(a0%neqns, ndeg, a0%nttbr, a0%irow, a0%jcol, a0%val, oldb, b)
458 hecmat%x(ndeg*(i-1)+j)=b(j,i)
462 call elapout(
'sp_direct_parent: end solve Ax=b')
463 deallocate(b, bd, bdbuf, oldb)
465 end subroutine sp_direct_parent
469 subroutine geta0(hecMESH,hecMAT, a0)
477 integer(kind=kint) :: i,j,k,l,ierr,numnp,ndof,kk,ntotal
478 integer(kind=kint) :: iis,iie,kki,kkj,ndof2
487 a0%nttbr = hecmat%NP+hecmat%NPL
490 allocate(a0%irow(a0%nttbr),stat=ierr)
491 allocate(a0%jcol(a0%nttbr),stat=ierr)
492 allocate(a0%val(a0%ndeg*a0%ndeg, a0%nttbr),stat=ierr)
494 call errtrp(
'stop due to allocation error.')
504 call vlcpy(a0%val(:,kk),hecmat%D(ndof2*(j-1)+1:ndof2*j),ndof)
506 do k= hecmat%indexL(j-1)+1, hecmat%indexL(j)
511 call vlcpy(a0%val(:,kk),hecmat%AL(ndof2*(k-1)+1:ndof2*k),ndof)
519 subroutine vlcpy(a,b,n)
521 real(kind=
kreal),
intent(out) :: a(:)
522 real(kind=
kreal),
intent(in) :: b(:)
523 integer(kind=kint),
intent(in) :: n
525 integer(kind=kint) :: i,j
529 a((j-1)*n+i) = b((i-1)*n+j)
539 subroutine sp_direct_child()
546 real(kind=
kreal),
allocatable :: b(:,:)
548 logical,
save :: nusol_ready = .false.
551 integer(kind=kint) :: istatus(mpi_status_size)
552 integer(kind=kint) :: imp, ierr
553 integer(kind=kint) :: i,j,k,l,m,n
557 call elapout(
'sp_direct_child: entered')
559 imp=m_pds_procinfo%imp
561 if (.not. nusol_ready)
then
563 call elapout(
'sp_direct_child: waiting matrix from parent via MPI')
569 call mpi_recv(cm%a%ndeg, 1,mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
570 call mpi_recv(cm%a%neqns, 1,mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
571 call mpi_recv(cm%a%nttbr, 1,mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
572 allocate(cm%a%irow(cm%a%nttbr), stat=ierr)
574 call errtrp(
'stop due to allocation error.')
576 allocate(cm%a%jcol(cm%a%nttbr), stat=ierr)
578 call errtrp(
'stop due to allocation error.')
580 allocate(cm%a%val(cm%a%ndeg*cm%a%ndeg, cm%a%nttbr), stat=ierr)
582 call errtrp(
'stop due to allocation error.')
584 call mpi_recv(cm%a%irow, cm%a%nttbr, mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
585 call mpi_recv(cm%a%jcol, cm%a%nttbr, mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
586 call mpi_recv(cm%a%val, cm%a%nttbr*cm%a%ndeg*cm%a%ndeg, mpi_real8,imp,1,mpi_comm_world,istatus,ierr)
589 call mpi_recv(cm%c%ndeg, 1,mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
590 call mpi_recv(cm%c%nttbr, 1,mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
591 call mpi_recv(cm%c%nrows, 1,mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
592 call mpi_recv(cm%c%ncols, 1,mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
593 allocate(cm%c%irow(cm%c%nttbr), stat=ierr)
595 call errtrp(
'stop due to allocation error.')
597 allocate(cm%c%jcol(cm%c%nttbr), stat=ierr)
599 call errtrp(
'stop due to allocation error.')
601 allocate(cm%c%val(cm%c%ndeg*cm%c%ndeg, cm%c%nttbr), stat=ierr)
603 call errtrp(
'stop due to allocation error.')
605 call mpi_recv(cm%c%irow, cm%c%nttbr, mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
606 call mpi_recv(cm%c%jcol, cm%c%nttbr, mpi_integer,imp,1,mpi_comm_world,istatus,ierr)
607 call mpi_recv(cm%c%val, cm%c%nttbr*cm%c%ndeg*cm%c%ndeg, mpi_real8,imp,1,mpi_comm_world,istatus,ierr)
610 cm%ista_c = cm%a%neqns+1
611 cm%neqns_t = cm%a%neqns + cm%c%nrows
612 call elapout(
'sp_direct_child: end get matrix from parent via MPI')
623 call elapout(
'sp_direct_child: entering matini_para')
624 call matini_para(cm, dsi, ierr)
625 call elapout(
'sp_direct_child: exit matini_para')
627 call elapout(
'sp_direct_child: entering staij1')
630 call staij1(0, cm%a%irow(i), cm%a%jcol(i), cm%a%val(:,i), dsi, ierr)
634 call staij1(0, cm%c%irow(i)+cm%a%neqns, cm%c%jcol(i), cm%c%val(:,i), dsi, ierr)
636 call elapout(
'sp_direct_child: end staij1')
646 call elapout(
'sp_direct_child: entering nufct0_child')
647 call nufct0_child(dsi, ierr)
648 call elapout(
'sp_direct_child: exit nufct0_child')
659 allocate(b(cm%ndeg, cm%neqns_t), stat=ierr)
661 call errtrp(
'stop due to allocation error.')
665 call mpi_recv(b, cm%ndeg*cm%a%neqns, mpi_real8, imp, 1,mpi_comm_world, istatus, ierr)
675 call elapout(
'sp_direct_child: enter nusol0_child')
676 call nusol0_child(b, dsi, ierr)
677 call elapout(
'sp_direct_child: exit nusol0_child')
683 call elapout(
'sp_direct_child: begin send result to parent')
684 call mpi_send(b, cm%ndeg*cm%a%neqns, mpi_real8, imp, 1,mpi_comm_world, ierr)
685 call elapout(
'sp_direct_child: end send result to parent')
689 end subroutine sp_direct_child
694 subroutine initproc()
697 integer(kind=kint) :: npe, myid
698 integer(kind=kint) :: ndiv
699 integer(kind=kint) :: ierr
700 integer(kind=kint) :: i,j,k,l
702 m_pds_procinfo%isparent=.false.
703 m_pds_procinfo%ischild=.false.
706 call mpi_comm_size(mpi_comm_world, npe, ierr)
707 call mpi_comm_rank(mpi_comm_world, myid, ierr)
709 m_pds_procinfo%myid = myid
713 if (2**(ndiv + 1) .gt. npe)
then
718 m_pds_procinfo%ndiv = ndiv
720 if (npe .ne. 2**ndiv + 1)
then
721 write(ilog,*)
'Error: please use 2**n+1 (3,5,9,17...) processes for parallel direct solver.'
722 write(6,*)
'Error: please use 2**n+1 (3,5,9,17...) processes for parallel direct solver.'
728 write(idbg,*)
'parent process.'
729 m_pds_procinfo%isparent=.true.
730 m_pds_procinfo%nchildren=2**ndiv
731 allocate(m_pds_procinfo%ichildren(m_pds_procinfo%nchildren))
733 m_pds_procinfo%ichildren(i)=i
736 write(idbg,*)
'child process.'
737 m_pds_procinfo%ischild=.true.
742 end subroutine initproc
745 subroutine errtrp(mes)
747 write(6,*)
'Error in : process ', m_pds_procinfo%myid
752 end subroutine errtrp
756 subroutine matini_para(cm,dsi,ir)
795 type(dsinfo),
intent(out) :: dsi
796 integer(kind=kint),
intent(out) :: ir
798 integer(kind=kint),
pointer :: irow_a(:), jcol_a(:)
799 integer(kind=kint),
pointer :: irow_c(:), jcol_c(:)
801 integer(kind=kint),
pointer :: ia(:)
802 integer(kind=kint),
pointer :: ja(:)
803 integer(kind=kint),
pointer :: jcpt(:)
804 integer(kind=kint),
pointer :: jcolno(:)
806 integer(kind=kint),
pointer :: iperm_a(:)
807 integer(kind=kint),
pointer :: invp_a(:)
809 integer(kind=kint),
pointer :: xlnzr_a(:)
810 integer(kind=kint),
pointer :: colno_a(:)
812 integer(kind=kint),
pointer :: xlnzr_c(:)
813 integer(kind=kint),
pointer :: colno_c(:)
816 integer(kind=kint),
pointer :: adjncy(:)
817 integer(kind=kint),
pointer :: qlink(:)
818 integer(kind=kint),
pointer :: qsize(:)
819 integer(kind=kint),
pointer :: nbrhd(:)
820 integer(kind=kint),
pointer :: rchset(:)
822 integer(kind=kint),
pointer :: cstr(:)
824 integer(kind=kint),
pointer :: adjt(:)
825 integer(kind=kint),
pointer :: anc(:)
827 integer(kind=kint),
pointer :: lwk3arr(:)
828 integer(kind=kint),
pointer :: lwk2arr(:)
829 integer(kind=kint),
pointer :: lwk1arr(:)
830 integer(kind=kint),
pointer :: lbtreearr(:,:)
831 integer(kind=kint),
pointer :: lleafarr(:)
832 integer(kind=kint),
pointer :: lxleafarr(:)
833 integer(kind=kint),
pointer :: ladparr(:)
834 integer(kind=kint),
pointer :: lpordrarr(:)
836 integer(kind=kint) :: neqns_a, nttbr_a, neqns_a1, nstop, neqns_t, neqns_d, nttbr_c, ndeg
837 integer(kind=kint) :: lncol_a, lncol_c
838 integer(kind=kint) :: neqnsz, nofsub, izz, izz0, lnleaf
839 integer(kind=kint) :: ir1
840 integer(kind=kint) :: i, j, k , ipass, ks, ke, ierr
866 allocate(dsi%zpiv(neqns_a), stat=ierr)
868 call errtrp(
'stop due to allocation error.')
870 call zpivot(neqns_a,neqnsz,nttbr_a,jcol_a,irow_a,dsi%zpiv,ir1)
878 allocate(jcpt(2*nttbr_a), jcolno(2*nttbr_a), stat=ierr)
880 call errtrp(
'stop due to allocation error.')
882 call stsmat(neqns_a,nttbr_a,irow_a,jcol_a,jcpt,jcolno)
886 allocate(ia(neqns_a1), ja(2*nttbr_a), stat=ierr)
888 call errtrp(
'stop due to allocation error.')
890 call stiaja(neqns_a, neqns_a,ia,ja,jcpt,jcolno)
896 allocate(iperm_a(neqns_a), invp_a(neqns_a), stat=ierr)
898 call errtrp(
'stop due to allocation error.')
900 call idntty(neqns_a,invp_a,iperm_a)
903 allocate(adjncy(2*nttbr_a),qlink(neqns_a1),qsize(neqns_a1),nbrhd(neqns_a1),rchset(neqns_a1), stat=ierr)
905 call errtrp(
'stop due to allocation error.')
907 allocate(lwk2arr(neqns_a1),lwk1arr(neqns_a1), stat=ierr)
909 call errtrp(
'stop due to allocation error.')
911 call genqmd(neqns_a,ia,ja,iperm_a,invp_a,lwk1arr,lwk2arr,rchset,nbrhd,qsize,qlink,nofsub,adjncy)
912 deallocate(adjncy, qlink, qsize, nbrhd, rchset)
915 call stiaja(neqns_a, neqns_a, ia, ja, jcpt,jcolno)
919 allocate(cstr(neqns_a1),adjt(neqns_a1), stat=ierr)
921 call errtrp(
'stop due to allocation error.')
924 call genpaq(ia,ja,invp_a,iperm_a,lwk2arr,neqns_a,cstr)
927 allocate (lbtreearr(2,neqns_a1), stat=ierr)
929 call errtrp(
'stop due to allocation error.')
931 call genbtq(ia, ja, invp_a, iperm_a,lwk2arr,lbtreearr,dsi%zpiv,izz,neqns_a)
935 if(izz0.eq.0) izz0=izz
936 if(izz0.ne.izz)
goto 30
937 call rotate(ia, ja, invp_a, iperm_a, lwk2arr,lbtreearr,izz,neqns_a,anc,adjt,ir1)
940 call bringu(dsi%zpiv,iperm_a, invp_a, lwk2arr,izz,neqns_a,ir1)
945 allocate(lwk3arr(0:neqns_a1),lpordrarr(neqns_a1),dsi%parent(neqns_a1), dsi%nch(neqns_a1), stat=ierr)
947 call errtrp(
'stop due to allocation error.')
949 call posord(dsi%parent,lbtreearr,invp_a,iperm_a,lpordrarr,dsi%nch,neqns_a,lwk1arr,lwk2arr,lwk3arr)
952 allocate(lleafarr(nttbr_a),lxleafarr(neqns_a1),ladparr(neqns_a1), stat=ierr)
954 call errtrp(
'stop due to allocation error.')
956 call gnleaf(ia, ja, invp_a, iperm_a, lpordrarr,dsi%nch,ladparr,lxleafarr,lleafarr,neqns_a,lnleaf)
960 call countclno(dsi%parent, lxleafarr, lleafarr, neqns_a, nstop, lncol_a, ir1)
961 allocate(colno_a(lncol_a),xlnzr_a(neqns_a1), stat=ierr)
963 call errtrp(
'stop due to allocation error.')
965 call gnclno(dsi%parent,lpordrarr,lxleafarr,lleafarr,xlnzr_a, colno_a, neqns_a, nstop,lncol_a,ir1)
972 call ldudecomposec(xlnzr_a,colno_a,invp_a,iperm_a, ndeg, nttbr_c, irow_c, &
973 jcol_c, cm%c%ncols, cm%c%nrows, xlnzr_c, colno_c, lncol_c)
976 allocate(dsi%xlnzr(neqns_t + 1), stat=ierr)
978 call errtrp(
'stop due to allocation error.')
980 dsi%xlnzr(1:neqns_a)=xlnzr_a(:)
981 dsi%xlnzr(neqns_a+1:neqns_t+1)=xlnzr_c(:)+xlnzr_a(neqns_a+1)-1
983 dsi%lncol=lncol_a + lncol_c
984 allocate(dsi%colno(lncol_a + lncol_c), stat=ierr)
986 call errtrp(
'stop due to allocation error.')
988 dsi%colno(1:lncol_a)=colno_a(:)
989 dsi%colno(lncol_a+1:lncol_a+lncol_c)=colno_c(:)
991 allocate(dsi%invp(neqns_t), dsi%iperm(neqns_t), stat=ierr)
993 call errtrp(
'stop due to allocation error.')
995 dsi%invp(1:neqns_a)=invp_a(1:neqns_a)
996 dsi%iperm(1:neqns_a)=iperm_a(1:neqns_a)
997 do i=neqns_a+1,neqns_t
1002 deallocate(xlnzr_a, colno_a, xlnzr_c, colno_c, invp_a, iperm_a)
1009 end subroutine matini_para
1013 subroutine nufct0_child(dsi,ir)
1016 type(dsinfo),
intent(inout) :: dsi
1017 integer(kind=kint),
intent(out) :: ir
1022 if(dsi%stage.ne.20)
then
1028 if(dsi%ndeg.eq.1)
then
1029 call nufct1_child(dsi%xlnzr,dsi%colno,dsi%zln,dsi%diag,dsi%neqns,dsi%parent,dsi%nch,dsi%nstop,ir)
1030 else if(dsi%ndeg.eq.2)
then
1031 call nufct2_child(dsi%xlnzr,dsi%colno,dsi%zln,dsi%diag,dsi%neqns,dsi%parent,dsi%nch,dsi%nstop,ir)
1032 else if(dsi%ndeg.eq.3)
then
1033 call nufct3_child(dsi%xlnzr,dsi%colno,dsi%zln,dsi%diag,dsi%neqns,dsi%parent,dsi%nch,dsi%nstop,ir)
1037 call nufctx_child(dsi%xlnzr,dsi%colno,dsi%zln,dsi%diag,dsi%neqns,dsi%parent,dsi%nch,dsi%nstop,dsi%ndeg,ir)
1043 end subroutine nufct0_child
1047 subroutine nufct1_child(xlnzr,colno,zln,diag,neqns,parent,nch,nstop,ir)
1050 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),parent(:)
1051 integer(kind=kint),
intent(in) :: neqns, nstop, ir
1052 integer(kind=kint),
intent(out) :: nch(:)
1053 real(kind=
kreal),
intent(out) :: zln(:,:),diag(:,:)
1055 integer(kind=kint) :: neqns_c
1056 integer(kind=kint) :: i,j,k,l, ic,ierr,imp
1057 integer(kind=kint) :: nspdsln
1058 integer(kind=kint),
pointer :: spdslnidx(:)
1059 real(kind=
kreal),
pointer :: spdslnval(:,:)
1078 diag(1,1)=1.0d0/diag(1,1)
1083 call sum(ic,xlnzr,colno,zln(1,:),diag(1,:),nch,parent,neqns)
1089 do 200 ic=nstop,neqns
1090 call sum1(ic,xlnzr,colno,zln(1,:),diag(1,:),parent,neqns)
1102 neqns_c = neqns - nstop + 1
1103 call sum2_child(neqns,nstop,xlnzr,colno,zln(1,:),diag(1,:),spdslnidx,spdslnval,nspdsln)
1105 imp = m_pds_procinfo%imp
1106 call mpi_send(nspdsln, 1,mpi_integer,imp,1,mpi_comm_world,ierr)
1107 call mpi_send(spdslnidx, nspdsln,mpi_integer,imp,1,mpi_comm_world,ierr)
1108 call mpi_send(spdslnval, nspdsln,mpi_real8,imp,1,mpi_comm_world,ierr)
1109 call mpi_send(diag(1,nstop), neqns_c,mpi_real8,imp,1,mpi_comm_world,ierr)
1111 end subroutine nufct1_child
1115 subroutine nufct2_child(xlnzr, colno, zln, diag, neqns, parent, nch, nstop, ir)
1119 integer(kind=kint),
intent(in) :: xlnzr(:), colno(:), parent(:)
1120 integer(kind=kint),
intent(out) :: nch(:)
1121 real(kind=
kreal),
intent(out) :: zln(:,:), diag(:,:)
1122 integer(kind=kint),
intent(in) :: neqns, nstop
1123 integer(kind=kint),
intent(out) :: ir
1125 integer(kind=kint) :: i,j,k,l, ic, imp, ierr, neqns_c
1126 integer(kind=kint) :: nspdsln
1127 integer(kind=kint),
pointer :: spdslnidx(:)
1128 real(kind=
kreal),
pointer :: spdslnval(:,:)
1155 call elapout(
'nufct2_child: begin phase I LDU decompose of A')
1156 if(nstop.gt.1)
call inv2(diag(:,1),ir)
1161 call s2um(ic,xlnzr,colno,zln,diag,nch,parent,neqns)
1167 call elapout(
'nufct2_child: begin phase II LDU decompose of C')
1169 call s2um1(ic,xlnzr,colno,zln,diag,nch,parent,neqns)
1177 call elapout(
'nufct2_child: begin phase III update D region')
1184 neqns_c = neqns - nstop + 1
1185 call s2um2_child(neqns,nstop,xlnzr,colno,zln,diag,spdslnidx,spdslnval,nspdsln)
1188 imp = m_pds_procinfo%imp
1189 call mpi_send(nspdsln, 1,mpi_integer,imp,1,mpi_comm_world,ierr)
1190 call mpi_send(spdslnidx, nspdsln,mpi_integer,imp,1,mpi_comm_world,ierr)
1191 call mpi_send(spdslnval, nspdsln*4,mpi_real8,imp,1,mpi_comm_world,ierr)
1192 call mpi_send(diag(1,nstop), neqns_c*3,mpi_real8,imp,1,mpi_comm_world,ierr)
1197 end subroutine nufct2_child
1201 subroutine nufct3_child(xlnzr,colno,zln,diag,neqns,parent,nch,nstop,ir)
1205 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),parent(:)
1206 integer(kind=kint),
intent(out) :: nch(:)
1207 real(kind=
kreal),
intent(out) :: zln(:,:),diag(:,:)
1208 integer(kind=kint),
intent(in) :: neqns, nstop, ir
1210 integer(kind=kint) :: i,j,k,l, ic, imp, ierr, neqns_c
1211 integer(kind=kint) :: nspdsln
1212 integer(kind=kint),
pointer :: spdslnidx(:)
1213 real(kind=
kreal),
pointer :: spdslnval(:,:)
1241 call elapout(
'nufct3_child: begin phase I LDU decompose of A')
1242 if(nstop.gt.1)
call inv3(diag(:,1),ir)
1247 call s3um(ic,xlnzr,colno,zln,diag,nch,parent,neqns)
1253 call elapout(
'nufct3_child: begin phase II LDU decompose of C')
1254 do 200 ic=nstop,neqns
1255 call s3um1(ic,xlnzr,colno,zln,diag,nch,parent,neqns)
1263 call elapout(
'nufct3_child: begin phase III update D region')
1270 neqns_c = neqns - nstop + 1
1271 call s3um2_child(neqns,nstop,xlnzr,colno,zln,diag,spdslnidx,spdslnval,nspdsln)
1274 imp = m_pds_procinfo%imp
1275 call mpi_send(nspdsln, 1,mpi_integer,imp,1,mpi_comm_world,ierr)
1276 call mpi_send(spdslnidx, nspdsln,mpi_integer,imp,1,mpi_comm_world,ierr)
1277 call mpi_send(spdslnval, nspdsln*9,mpi_real8,imp,1,mpi_comm_world,ierr)
1278 call mpi_send(diag(1,nstop), neqns_c*6,mpi_real8,imp,1,mpi_comm_world,ierr)
1281 end subroutine nufct3_child
1349 subroutine nufctx_child(xlnzr,colno,zln,diag,neqns,parent,nch,nstop,ndeg,ir)
1353 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),parent(:)
1354 integer(kind=kint),
intent(out) :: nch(:)
1355 real(kind=
kreal),
intent(out) :: zln(:,:),diag(:,:)
1356 integer(kind=kint),
intent(in) :: neqns, nstop, ndeg
1357 integer(kind=kint),
intent(out) :: ir
1359 integer(kind=kint) :: i,j,k,l, ic, neqns_c, ndeg2, ndegl, imp, ierr
1360 integer(kind=kint) :: nspdsln
1361 integer(kind=kint),
pointer :: spdslnidx(:)
1362 real(kind=
kreal),
pointer :: spdslnval(:,:)
1386 ndegl=(ndeg+1)*ndeg/2
1390 if(nstop.gt.1)
call invx(diag,ndeg,ir)
1395 call sxum(ic,xlnzr,colno,zln,diag,nch,parent,neqns,ndeg,ndegl)
1403 call sxum1(ic,xlnzr,colno,zln,diag,nch,parent,neqns,ndeg,ndegl)
1410 neqns_c = neqns - nstop + 1
1411 call sxum2_child(neqns,nstop,xlnzr,colno,zln,diag,spdslnidx,spdslnval,nspdsln,ndeg,ndegl)
1414 imp = m_pds_procinfo%imp
1415 call mpi_send(nspdsln, 1,mpi_integer,imp,1,mpi_comm_world,ierr)
1416 call mpi_send(spdslnidx, nspdsln,mpi_integer,imp,1,mpi_comm_world,ierr)
1417 call mpi_send(spdslnval, nspdsln*ndeg2,mpi_real8,imp,1,mpi_comm_world,ierr)
1418 call mpi_send(diag(1,nstop), neqns_c*ndegl,mpi_real8,imp,1,mpi_comm_world,ierr)
1420 end subroutine nufctx_child
1424 subroutine nusol0_child(b,dsi,ir)
1440 real(kind=
kreal),
intent(inout) :: b(:,:)
1441 type(dsinfo),
intent(inout) :: dsi
1442 integer(kind=kint),
intent(out) :: ir
1444 integer(kind=kint) :: neqns, nstop, ndeg
1446 if(dsi%stage.ne.30 .and. dsi%stage.ne.40)
then
1452 if(dsi%ndeg.eq.1)
then
1453 call nusol1_child(dsi%xlnzr,dsi%colno,dsi%zln,dsi%diag,dsi%iperm,b,dsi%neqns,dsi%nstop)
1454 else if(dsi%ndeg .eq. 2)
then
1455 call nusol2_child(dsi%xlnzr,dsi%colno,dsi%zln,dsi%diag,dsi%iperm,b,dsi%neqns,dsi%nstop)
1456 else if(dsi%ndeg .eq. 3)
then
1457 call nusol3_child(dsi%xlnzr,dsi%colno,dsi%zln,dsi%diag,dsi%iperm,b,dsi%neqns,dsi%nstop)
1461 call nusolx_child(dsi%xlnzr,dsi%colno,dsi%zln,dsi%diag,dsi%iperm,b,dsi%neqns,dsi%nstop,dsi%ndeg)
1466 end subroutine nusol0_child
1470 subroutine nusol1_child(xlnzr,colno,zln,diag,iperm,b,neqns,nstop)
1474 integer(kind=kint),
intent(in) :: xlnzr(:), colno(:), iperm(:)
1475 real(kind=
kreal),
intent(in) :: zln(:,:), diag(:,:)
1476 real(kind=
kreal),
intent(inout) :: b(:,:)
1477 integer(kind=kint),
intent(in) :: neqns, nstop
1479 integer(kind=kint) :: neqns_a, neqns_c
1480 integer(kind=kint) :: k, ks, ke, i, j, imp, ierr
1481 real(kind=
kreal),
allocatable :: wk(:), wk_d(:)
1487 neqns_c = neqns - nstop + 1
1489 allocate(wk(neqns), stat=ierr)
1490 if(ierr .ne. 0)
then
1491 call errtrp(
'stop due to allocation error.')
1503 if(ke.lt.ks)
goto 110
1504 wk(i)=wk(i)-spdot2(wk,zln(1,:),colno,ks,ke)
1509 allocate(wk_d(nstop:neqns), stat=ierr)
1510 if(ierr .ne. 0)
then
1511 call errtrp(
'stop due to allocation error.')
1515 do 101 i=nstop,neqns
1518 if(ke.lt.ks)
goto 111
1519 wk_d(i)=wk_d(i)-spdot2(wk,zln(1,:),colno,ks,ke)
1522 imp = m_pds_procinfo%imp
1523 call mpi_send(wk_d, neqns_c, mpi_real8, imp, 1,mpi_comm_world, ierr)
1527 wk(i)=wk(i)*diag(1,i)
1531 call mpi_bcast(wk_d, neqns_c, mpi_real8, imp, mpi_comm_world, ierr)
1533 wk(nstop:neqns)=wk_d(nstop:neqns)
1538 if(ke.lt.ks)
goto 200
1542 wk(j)=wk(j)-wk(i)*zln(1,k)
1552 end subroutine nusol1_child
1556 subroutine nusol2_child(xlnzr, colno, zln, diag, iperm, b, neqns, nstop)
1565 integer(kind=kint),
intent(in) :: xlnzr(:), colno(:), iperm(:)
1566 real(kind=
kreal),
intent(in) :: zln(:,:), diag(:,:)
1567 real(kind=
kreal),
intent(inout) :: b(:,:)
1569 real(kind=
kreal),
allocatable :: wk(:,:), wk_d(:,:)
1570 integer(kind=kint) :: neqns_c, neqns_a, nstop, neqns, ks, ke
1571 integer(kind=kint) :: i, j, k, l, imp, ierr
1575 neqns_c = neqns - nstop + 1
1577 allocate(wk(2,neqns), stat=ierr)
1578 if(ierr .ne. 0)
then
1579 call errtrp(
'stop due to allocation error.')
1583 wk(1,i) = b(1,iperm(i))
1584 wk(2,i) = b(2,iperm(i))
1588 call elapout(
'nusol2_child: begin forward substitution for A')
1593 call s2pdot(wk(:,i),wk,zln,colno,ks,ke)
1598 call elapout(
'nusol2_child: begin forward substitution for C')
1599 allocate(wk_d(2,nstop:neqns), stat=ierr)
1600 if(ierr .ne. 0)
then
1601 call errtrp(
'stop due to allocation error.')
1609 call s2pdot(wk_d(:,i),wk,zln,colno,ks,ke)
1613 call elapout(
'nusol2_child: wait to send wk_d')
1614 imp = m_pds_procinfo%imp
1615 call mpi_send(wk_d, 2*neqns_c, mpi_real8, imp, 1,mpi_comm_world, ierr)
1619 wk(2,i)=wk(2,i)-wk(1,i)*diag(2,i)
1620 wk(1,i)=wk(1,i)*diag(1,i)
1621 wk(2,i)=wk(2,i)*diag(3,i)
1622 wk(1,i)=wk(1,i)-wk(2,i)*diag(2,i)
1626 call elapout(
'nusol2_child: wait until receive wk_d')
1627 call mpi_bcast(wk_d, 2*neqns_c, mpi_real8, imp, mpi_comm_world, ierr)
1628 call elapout(
'nusol2_child: end receive wk_d')
1629 call elapout(
'nusol2_child: begin backward substitution')
1631 wk(:,nstop:neqns)=wk_d(:,nstop:neqns)
1638 wk(1,j)=wk(1,j)-wk(1,i)*zln(1,k)-wk(2,i)*zln(2,k)
1639 wk(2,j)=wk(2,j)-wk(1,i)*zln(3,k)-wk(2,i)*zln(4,k)
1643 call elapout(
'nusol2_child: end backward substitution')
1647 b(1,iperm(i))=wk(1,i)
1648 b(2,iperm(i))=wk(2,i)
1651 call elapout(
'nusol2_child: end')
1654 end subroutine nusol2_child
1668 integer(kind=kint),
intent(in) :: xlnzr(:), colno(:), iperm(:)
1669 real(kind=
kreal),
intent(in) :: zln(:,:), diag(:,:)
1670 real(kind=
kreal),
intent(inout) :: b(:,:)
1672 real(kind=
kreal),
allocatable :: wk(:,:), wk_d(:,:)
1673 integer(kind=kint) :: neqns_c, neqns_a, nstop, neqns, ks, ke
1674 integer(kind=kint) :: i, j, k, l, imp, ierr
1679 neqns_c = neqns - nstop + 1
1681 call elapout(
'nusol3_child: entered')
1683 allocate(wk(3,neqns), stat=ierr)
1684 if(ierr .ne. 0)
then
1685 call errtrp(
'stop due to allocation error.')
1689 wk(1,i)=b(1,iperm(i))
1690 wk(2,i)=b(2,iperm(i))
1691 wk(3,i)=b(3,iperm(i))
1696 call elapout(
'nusol3_child: begin forward substitution for A')
1701 if(ke.lt.ks)
goto 110
1702 call s3pdot(wk(:,i),wk,zln,colno,ks,ke)
1708 call elapout(
'nusol3_child: begin forward substitution for C')
1709 allocate(wk_d(3,nstop:neqns), stat=ierr)
1710 if(ierr .ne. 0)
then
1711 call errtrp(
'stop due to allocation error.')
1715 do 101 i=nstop,neqns
1718 if(ke.lt.ks)
goto 111
1719 call s3pdot(wk_d(:,i),wk,zln,colno,ks,ke)
1723 call elapout(
'nusol3_child: wait to send wk_d')
1724 imp = m_pds_procinfo%imp
1725 call mpi_send(wk_d, 3*neqns_c, mpi_real8, imp, 1,mpi_comm_world, ierr)
1728 call elapout(
'nusol3_child: divide with diagonal matrix')
1730 wk(2,i)=wk(2,i)-wk(1,i)*diag(2,i)
1731 wk(3,i)=wk(3,i)-wk(1,i)*diag(4,i)-wk(2,i)*diag(5,i)
1732 wk(1,i)=wk(1,i)*diag(1,i)
1733 wk(2,i)=wk(2,i)*diag(3,i)
1734 wk(3,i)=wk(3,i)*diag(6,i)
1735 wk(2,i)=wk(2,i)-wk(3,i)*diag(5,i)
1736 wk(1,i)=wk(1,i)-wk(2,i)*diag(2,i)-wk(3,i)*diag(4,i)
1740 call elapout(
'nusol3_child: wait until receive wk_d')
1741 call mpi_bcast(wk_d, 3*neqns_c, mpi_real8, imp, mpi_comm_world, ierr)
1742 call elapout(
'nusol3_child: end receive wk_d')
1743 call elapout(
'nusol3_child: begin backward substitution')
1745 wk(:,nstop:neqns)=wk_d(:,nstop:neqns)
1750 if(ke.lt.ks)
goto 200
1755 wk(1,j)=wk(1,j)-wk(1,i)*zln(1,k)-wk(2,i)*zln(2,k)-wk(3,i)*zln(3,k)
1756 wk(2,j)=wk(2,j)-wk(1,i)*zln(4,k)-wk(2,i)*zln(5,k)-wk(3,i)*zln(6,k)
1757 wk(3,j)=wk(3,j)-wk(1,i)*zln(7,k)-wk(2,i)*zln(8,k)-wk(3,i)*zln(9,k)
1760 call elapout(
'nusol3_child: end backward substitution')
1765 b(1,iperm(i))=wk(1,i)
1766 b(2,iperm(i))=wk(2,i)
1767 b(3,iperm(i))=wk(3,i)
1770 call elapout(
'nusol3_child: end')
1775 subroutine nusolx_child(xlnzr, colno, zln, diag, iperm, b, neqns, nstop, ndeg)
1779 integer(kind=kint),
intent(in) :: xlnzr(:), colno(:), iperm(:)
1780 real(kind=
kreal),
intent(in) :: zln(:,:), diag(:,:)
1781 real(kind=
kreal),
intent(inout) :: b(:,:)
1782 integer(kind=kint),
intent(in) :: neqns, nstop, ndeg
1784 real(kind=
kreal),
allocatable :: wk(:,:), wk_d(:,:)
1785 integer(kind=kint) :: neqns_c, neqns_a, ks, ke, locd, loc1
1786 integer(kind=kint) :: i, j, k, l, m, n, imp, ierr
1790 neqns_c = neqns - nstop + 1
1792 allocate(wk(ndeg,neqns), stat=ierr)
1793 if(ierr .ne. 0)
then
1794 call errtrp(
'stop due to allocation error.')
1798 wk(1,i)=b(1,iperm(i))
1799 wk(2,i)=b(2,iperm(i))
1800 wk(3,i)=b(3,iperm(i))
1808 call sxpdot(ndeg,wk(1,i),wk,zln,colno,ks,ke)
1813 allocate(wk_d(ndeg,nstop:neqns), stat=ierr)
1814 if(ierr .ne. 0)
then
1815 call errtrp(
'stop due to allocation error.')
1822 call sxpdot(ndeg,wk_d(:,i),wk,zln,colno,ks,ke)
1826 imp = m_pds_procinfo%imp
1827 call mpi_send(wk_d, ndeg*neqns_c, mpi_real8, imp, 1,mpi_comm_world, ierr)
1837 wk(n,i)=wk(n,i)-wk(m,i)*diag(loc1,i)
1845 wk(m,i)=wk(m,i)*diag(locd,i)
1851 wk(m,i)=wk(m,i)-wk(n,i)*diag(locd,i)
1857 call mpi_bcast(wk_d, ndeg*neqns_c, mpi_real8, imp, mpi_comm_world, ierr)
1858 wk(:,nstop:neqns)=wk_d(:,nstop:neqns)
1869 wk(m,j)=wk(m,j)-wk(n,i)*zln(n+(m-1)*ndeg,k)
1879 b(l,iperm(i))=wk(l,i)
1887 subroutine nufct0_parent(dsln, diag, neqns, ndeg)
1892 real(kind=
kreal),
intent(inout) :: dsln(:,:)
1893 real(kind=
kreal),
intent(inout) :: diag(:,:)
1894 integer(kind=kint),
intent(in) :: neqns, ndeg
1896 integer(kind=kint) :: ndegl
1898 if (ndeg .eq. 1)
then
1899 call sum3(neqns, dsln(1,:), diag(1,:))
1900 else if (ndeg .eq. 3)
then
1901 call s3um3(neqns, dsln, diag)
1903 ndegl = (ndeg+1)*ndeg/2
1904 call sxum3(neqns, dsln, diag, ndeg, ndegl)
1908 end subroutine nufct0_parent
1912 subroutine nusol0_parent(dsln, diag, b, neqns, ndeg)
1917 real(kind=
kreal),
intent(in) :: dsln(:,:)
1918 real(kind=
kreal),
intent(in) :: diag(:,:)
1919 real(kind=
kreal),
intent(inout) :: b(:,:)
1921 integer(kind=kint),
intent(in) :: neqns, ndeg
1923 if (ndeg .eq. 1)
then
1924 call nusol1_parent(dsln(1,:), diag(1,:), b(1,:), neqns)
1925 else if (ndeg .eq. 3)
then
1926 call nusol3_parent(dsln, diag, b, neqns)
1928 call nusolx_parent(dsln, diag, b, neqns, ndeg)
1932 end subroutine nusol0_parent
1936 subroutine nusol1_parent(dsln, diag, b, neqns)
1943 real(kind=
kreal),
intent(in) :: dsln(:)
1944 real(kind=
kreal),
intent(in) :: diag(:)
1945 real(kind=
kreal),
intent(inout) :: b(:)
1946 integer(kind=kint),
intent(in) :: neqns
1948 integer(kind=kint) :: i,j,k,l,loc
1953 b(i)=b(i)-dot_product(b(1:i-1),dsln(k:k+i-2))
1961 loc=(neqns-1)*neqns/2
1964 b(j)=b(j)-b(i)*dsln(loc)
1970 end subroutine nusol1_parent
1977 subroutine nusol3_parent(dsln, diag, b, neqns)
1983 real(kind=
kreal),
intent(in) :: dsln(:,:)
1984 real(kind=
kreal),
intent(in) :: diag(:,:)
1985 real(kind=
kreal),
intent(inout) :: b(:,:)
1986 integer(kind=kint),
intent(in) :: neqns
1988 integer(kind=kint) :: i,j,k,l,loc
1996 call d3sdot(b(:,i),b,dsln(:, k:k+i-2),i-1)
2004 b(2,i)=b(2,i)-b(1,i)*diag(2,i)
2005 b(3,i)=b(3,i)-b(1,i)*diag(4,i)-b(2,i)*diag(5,i)
2006 b(1,i)=b(1,i)*diag(1,i)
2007 b(2,i)=b(2,i)*diag(3,i)
2008 b(3,i)=b(3,i)*diag(6,i)
2009 b(2,i)=b(2,i)-b(3,i)*diag(5,i)
2010 b(1,i)=b(1,i)-b(2,i)*diag(2,i)-b(3,i)*diag(4,i)
2018 loc=(neqns-1)*neqns/2
2021 b(1,j)=b(1,j)-b(1,i)*dsln(1,loc)-b(2,i)*dsln(2,loc)-b(3,i)*dsln(3,loc)
2022 b(2,j)=b(2,j)-b(1,i)*dsln(4,loc)-b(2,i)*dsln(5,loc)-b(3,i)*dsln(6,loc)
2023 b(3,j)=b(3,j)-b(1,i)*dsln(7,loc)-b(2,i)*dsln(8,loc)-b(3,i)*dsln(9,loc)
2029 end subroutine nusol3_parent
2033 subroutine nusolx_parent (dsln,diag,b,neqns,ndeg)
2037 real(kind=
kreal),
intent(in) :: diag(:,:), dsln(:,:)
2038 real(kind=
kreal),
intent(inout) :: b(:,:)
2039 integer(kind=kint),
intent(in) :: neqns, ndeg
2041 integer(kind=kint) :: i,j,k,l,m,n,loc, locd, loc1
2046 call dxsdot(ndeg,b(:,i),b,dsln(:,k:k+i-2),i-1)
2056 b(n,i)=b(n,i)-b(m,i)*diag(loc1,i)
2064 b(m,i)=b(m,i)*diag(locd,i)
2070 b(m,i)=b(m,i)-b(n,i)*diag(locd,i)
2076 loc=(neqns-1)*neqns/2
2081 b(m,j)=b(m,j)-b(n,i)*dsln((m-1)*ndeg+n,loc)
2088 end subroutine nusolx_parent
2092 subroutine s3um2_child(neqns,nstop,xlnzr,colno,zln,diag,spdslnidx,spdslnval,nspdsln)
2096 integer(kind=kint),
intent(in) :: neqns, nstop
2097 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:)
2098 real(kind=
kreal),
intent(inout) :: zln(:,:),diag(:,:)
2099 integer(kind=kint),
pointer :: spdslnidx(:)
2100 real(kind=
kreal),
pointer :: spdslnval(:,:)
2101 integer(kind=kint),
intent(out) :: nspdsln
2103 real(kind=
kreal),
allocatable :: temp(:,:)
2104 integer(kind=kint),
allocatable :: indx(:)
2106 integer(kind=kint) :: i,j,k,l,m,n, ic,ks,ke,ii,jj,jc,j1,j2,loc,ispdsln, ierr
2108 allocate(temp(neqns,9),indx(neqns), stat=ierr)
2109 if(ierr .ne. 0)
then
2110 call errtrp(
'stop due to allocation error.')
2124 do jj=xlnzr(jc),xlnzr(jc+1)-1
2126 if(indx(j).eq.ic)
then
2133 allocate(spdslnidx(nspdsln), stat=ierr)
2134 if(ierr .ne. 0)
then
2135 call errtrp(
'stop due to allocation error.')
2137 allocate(spdslnval(9,nspdsln), stat=ierr)
2138 if(ierr .ne. 0)
then
2139 call errtrp(
'stop due to allocation error.')
2146 do 100 ic=nstop,neqns
2168 zln(4,k)=temp(jj,4)-temp(jj,1)*diag(2,jj)
2169 zln(7,k)=temp(jj,7)-temp(jj,1)*diag(4,jj)-zln(4,k)*diag(5,jj)
2170 zln(1,k)=temp(jj,1)*diag(1,jj)
2171 zln(4,k)=zln(4,k)*diag(3,jj)
2172 zln(7,k)=zln(7,k)*diag(6,jj)
2173 zln(4,k)=zln(4,k)-zln(7,k)*diag(5,jj)
2174 zln(1,k)=zln(1,k)-zln(4,k)*diag(2,jj)-zln(7,k)*diag(4,jj)
2176 zln(5,k)=temp(jj,5)-temp(jj,2)*diag(2,jj)
2177 zln(8,k)=temp(jj,8)-temp(jj,2)*diag(4,jj)-zln(5,k)*diag(5,jj)
2178 zln(2,k)=temp(jj,2)*diag(1,jj)
2179 zln(5,k)=zln(5,k)*diag(3,jj)
2180 zln(8,k)=zln(8,k)*diag(6,jj)
2181 zln(5,k)=zln(5,k)-zln(8,k)*diag(5,jj)
2182 zln(2,k)=zln(2,k)-zln(5,k)*diag(2,jj)-zln(8,k)*diag(4,jj)
2184 zln(6,k)=temp(jj,6)-temp(jj,3)*diag(2,jj)
2185 zln(9,k)=temp(jj,9)-temp(jj,3)*diag(4,jj)-zln(6,k)*diag(5,jj)
2186 zln(3,k)=temp(jj,3)*diag(1,jj)
2187 zln(6,k)=zln(6,k)*diag(3,jj)
2188 zln(9,k)=zln(9,k)*diag(6,jj)
2189 zln(6,k)=zln(6,k)-zln(9,k)*diag(5,jj)
2190 zln(3,k)=zln(3,k)-zln(6,k)*diag(2,jj)-zln(9,k)*diag(4,jj)
2197 diag(1,ic)=diag(1,ic)-temp(jj,1)*zln(1,k)-temp(jj,4)*zln(4,k)-temp(jj,7)*zln(7,k)
2198 diag(2,ic)=diag(2,ic)-temp(jj,1)*zln(2,k)-temp(jj,4)*zln(5,k)-temp(jj,7)*zln(8,k)
2199 diag(3,ic)=diag(3,ic)-temp(jj,2)*zln(2,k)-temp(jj,5)*zln(5,k)-temp(jj,8)*zln(8,k)
2200 diag(4,ic)=diag(4,ic)-temp(jj,1)*zln(3,k)-temp(jj,4)*zln(6,k)-temp(jj,7)*zln(9,k)
2201 diag(5,ic)=diag(5,ic)-temp(jj,2)*zln(3,k)-temp(jj,5)*zln(6,k)-temp(jj,8)*zln(9,k)
2202 diag(6,ic)=diag(6,ic)-temp(jj,3)*zln(3,k)-temp(jj,6)*zln(6,k)-temp(jj,9)*zln(9,k)
2204 do 120 jc=nstop,ic-1
2208 do 220 jj=xlnzr(jc),xlnzr(jc+1)-1
2210 if(indx(j).eq.ic)
then
2215 spdslnidx(ispdsln)=loc
2216 spdslnval(1,ispdsln)=spdslnval(1,ispdsln)-temp(j,1)*zln(1,jj)-temp(j,4)*zln(4,jj)-temp(j,7)*zln(7,jj)
2217 spdslnval(2,ispdsln)=spdslnval(2,ispdsln)-temp(j,2)*zln(1,jj)-temp(j,5)*zln(4,jj)-temp(j,8)*zln(7,jj)
2218 spdslnval(3,ispdsln)=spdslnval(3,ispdsln)-temp(j,3)*zln(1,jj)-temp(j,6)*zln(4,jj)-temp(j,9)*zln(7,jj)
2219 spdslnval(4,ispdsln)=spdslnval(4,ispdsln)-temp(j,1)*zln(2,jj)-temp(j,4)*zln(5,jj)-temp(j,7)*zln(8,jj)
2220 spdslnval(5,ispdsln)=spdslnval(5,ispdsln)-temp(j,2)*zln(2,jj)-temp(j,5)*zln(5,jj)-temp(j,8)*zln(8,jj)
2221 spdslnval(6,ispdsln)=spdslnval(6,ispdsln)-temp(j,3)*zln(2,jj)-temp(j,6)*zln(5,jj)-temp(j,9)*zln(8,jj)
2222 spdslnval(7,ispdsln)=spdslnval(7,ispdsln)-temp(j,1)*zln(3,jj)-temp(j,4)*zln(6,jj)-temp(j,7)*zln(9,jj)
2223 spdslnval(8,ispdsln)=spdslnval(8,ispdsln)-temp(j,2)*zln(3,jj)-temp(j,5)*zln(6,jj)-temp(j,8)*zln(9,jj)
2224 spdslnval(9,ispdsln)=spdslnval(9,ispdsln)-temp(j,3)*zln(3,jj)-temp(j,6)*zln(6,jj)-temp(j,9)*zln(9,jj)
2231 end subroutine s3um2_child
2235 subroutine zpivot(neqns,neqnsz,nttbr,jcol,irow,zpiv,ir)
2239 integer(kind=kint),
intent(in) :: jcol(:),irow(:)
2240 integer(kind=kint),
intent(out) :: zpiv(:)
2241 integer(kind=kint),
intent(in) :: neqns,nttbr
2242 integer(kind=kint),
intent(out) :: neqnsz,ir
2244 integer(kind=kint) :: i,j,k,l
2254 if(i.le.0.or.j.le.0)
then
2257 elseif(i.gt.neqns.or.j.gt.neqns)
then
2261 if(i.eq.j) zpiv(i)=0
2265 if(zpiv(i).eq.0)
then
2272 if(ldbg)
write(idbg,*)
'# zpivot ########################'
2273 if(ldbg)
write(idbg,60) (zpiv(i),i=1,neqns)
2276 end subroutine zpivot
2280 subroutine stsmat(neqns,nttbr,irow,jcol,jcpt,jcolno)
2284 integer(kind=kint),
intent(in) :: irow(:), jcol(:)
2285 integer(kind=kint),
intent(out) :: jcpt(:), jcolno(:)
2286 integer(kind=kint),
intent(in) :: neqns, nttbr
2288 integer(kind=kint) :: i,j,k,l,loc,locr
2307 if(loc.eq.0)
goto 120
2308 if(jcolno(loc).eq.j)
then
2310 elseif(jcolno(loc).gt.j)
then
2330 if(loc.eq.0)
goto 170
2331 if(jcolno(loc).eq.i)
then
2333 elseif(jcolno(loc).gt.i)
then
2351 write(idbg,*)
'jcolno'
2352 write(idbg,60) (jcolno(i),i=1,k)
2353 write(idbg,*)
'jcpt'
2354 write(idbg,60) (jcpt(i),i=1,k)
2358 end subroutine stsmat
2361 subroutine stiaja(neqns,neqnsz,ia,ja,jcpt,jcolno)
2367 integer(kind=kint),
intent(in) :: jcpt(:),jcolno(:)
2368 integer(kind=kint),
intent(out) :: ia(:),ja(:)
2369 integer(kind=kint),
intent(in) :: neqns, neqnsz
2371 integer(kind=kint) :: i,j,k,l,ii,loc
2379 if(loc.eq.0)
goto 120
2381 if(ii.eq.k.or.ii.gt.neqnsz)
goto 130
2390 write(idbg,*)
'stiaja(): ia '
2391 write(idbg,60) (ia(i),i=1,neqns+1)
2392 write(idbg,*)
'stiaja(): ja '
2393 write(idbg,60) (ja(i),i=1,ia(neqns+1))
2397 end subroutine stiaja
2401 subroutine idntty(neqns,invp,iperm)
2405 integer(kind=kint),
intent(out) :: invp(:),iperm(:)
2406 integer(kind=kint),
intent(in) :: neqns
2408 integer(kind=kint) :: i
2415 end subroutine idntty
2419 subroutine genqmd(neqns,xadj,adj0,perm,invp,deg,marker,rchset,nbrhd,qsize,qlink,nofsub,adjncy)
2423 integer(kind=kint),
intent(in) :: adj0(:),xadj(:)
2424 integer(kind=kint),
intent(out) :: rchset(:),nbrhd(:),adjncy(:),perm(:),invp(:),deg(:),marker(:),qsize(:),qlink(:)
2425 integer(kind=kint),
intent(in) :: neqns
2426 integer(kind=kint),
intent(out) :: nofsub
2428 integer(kind=kint) :: inode,ip,irch,mindeg,nhdsze,node,np,num,nump1,nxnode,rchsze,search,thresh,ndeg
2429 integer(kind=kint) :: i,j,k,l
2433 do 10 i=1,xadj(neqns+1)-1
2442 ndeg=xadj(node+1)-xadj(node)
2444 if(ndeg.lt.mindeg) mindeg=ndeg
2452 if(nump1.gt.search) search=nump1
2453 do 400 j=search,neqns
2455 if(marker(node).lt.0)
goto 400
2457 if(ndeg.le.thresh)
goto 500
2458 if(ndeg.lt.mindeg) mindeg=ndeg
2463 nofsub=nofsub+deg(node)
2465 call qmdrch(node,xadj,adjncy,deg,marker,rchsze,rchset,nhdsze,nbrhd)
2475 nxnode=qlink(nxnode)
2476 if(nxnode.gt.0)
goto 600
2477 if(rchsze.le.0)
goto 800
2479 call qmdupd(xadj,adjncy,rchsze,rchset,deg,qsize,qlink,marker,rchset(rchsze+1:),nbrhd(nhdsze+1:))
2481 do 700 irch=1,rchsze
2483 if(marker(inode).lt.0)
goto 700
2486 if(ndeg.lt.mindeg) mindeg=ndeg
2487 if(ndeg.gt.thresh)
goto 700
2492 if(nhdsze.gt.0)
call qmdot(node,xadj,adjncy,marker,rchsze,rchset,nbrhd)
2493 800
if(num.lt.neqns)
goto 300
2495 end subroutine genqmd
2499 subroutine genpaq(xadj,adjncy,invp,iperm,parent,neqns,ancstr)
2503 integer(kind=kint),
intent(in) :: xadj(:),adjncy(:),invp(:),iperm(:)
2504 integer(kind=kint),
intent(out) :: parent(:),ancstr(:)
2505 integer(kind=kint),
intent(in) :: neqns
2507 integer(kind=kint) :: i,j,k,l,ip,it
2513 do 110 k=xadj(ip),xadj(ip+1)-1
2517 if(ancstr(l).eq.0)
goto 111
2518 if(ancstr(l).eq.i)
goto 110
2529 if(parent(i).eq.0) parent(i)=neqns+1
2532 if(ldbg)
write(idbg,6010)
2533 if(ldbg)
write(idbg,6000) (i,parent(i),i=1,neqns)
2535 6010
format(
' parent')
2537 end subroutine genpaq
2541 subroutine genbtq(xadj,adjncy,invp,iperm,parent,btree,zpiv,izz,neqns)
2545 integer(kind=kint),
intent(in) :: xadj(:),adjncy(:),parent(:),invp(:),iperm(:),zpiv(:)
2546 integer(kind=kint),
intent(out) :: btree(:,:)
2547 integer(kind=kint),
intent(in) :: neqns
2548 integer(kind=kint),
intent(out) :: izz
2550 integer(kind=kint) :: i,j,k,l,ip,ib,inext
2558 if(ip.le.0)
goto 100
2577 if(zpiv(i).ne.0)
then
2578 if(btree(1,invp(i)).eq.0)
then
2586 if(ldbg)
write(idbg,6010)
2587 if(ldbg)
write(idbg,6000) (i,btree(1,i),btree(2,i),i=1,neqns)
2588 if(ldbg)
write(idbg,6020) izz
2591 6000
format(i6,
'(',2i6,
')')
2592 6010
format(
' binary tree')
2593 6020
format(
' the first zero pivot is ',i4)
2596 end subroutine genbtq
2600 subroutine rotate(xadj,adjncy,invp,iperm,parent,btree,izz,neqns,anc,adjt,irr)
2604 integer(kind=kint),
intent(in) :: xadj(:),adjncy(:),parent(:),btree(:,:)
2605 integer(kind=kint),
intent(out) :: anc(:),adjt(:),invp(:),iperm(:)
2606 integer(kind=kint),
intent(in) :: neqns,izz
2607 integer(kind=kint),
intent(out) :: irr
2609 integer(kind=kint) :: i,j,k,l,izzz,nanc,loc,locc,ll,kk,iy
2622 if(btree(1,izzz).ne.0)
then
2636 if(loc.ne.0)
goto 100
2650 if(locc.ne.0)
goto 220
2652 do 240 k=xadj(iperm(loc)),xadj(iperm(loc)+1)-1
2653 adjt(invp(adjncy(k)))=1
2655 if(loc.ge.anc(l))
goto 250
2657 if(locc.ne.0)
goto 220
2662 if(adjt(anc(ll)).eq.0)
then
2682 if(adjt(ll).eq.0)
then
2696 if(locc.ne.0)
goto 350
2698 do 370 kk=xadj(iperm(loc)),xadj(iperm(loc)+1)-1
2699 adjt(invp(adjncy(kk)))=1
2701 if(loc.ge.iy)
goto 380
2703 if(locc.ne.0)
goto 350
2708 if(adjt(anc(ll)).eq.0)
then
2710 invp(iperm(anc(ll)))=k
2715 if(adjt(anc(ll)).ne.0)
then
2717 invp(iperm(anc(ll)))=k
2727 if(i.eq.izzz)
goto 510
2731 invp(iperm(izzz))=neqns
2739 if(ldbg)
write(idbg,6000) (invp(i),i=1,neqns)
2742 end subroutine rotate
2746 subroutine bringu(zpiv,iperm,invp,parent,izz,neqns,irr)
2750 integer(kind=kint),
intent(in) :: zpiv(:),parent(:)
2751 integer(kind=kint),
intent(out) :: iperm(:),invp(:)
2752 integer(kind=kint),
intent(in) :: neqns,izz
2753 integer(kind=kint),
intent(out) :: irr
2755 integer(kind=kint) :: i,j,k,l,ib0,ib,ibp,izzp
2773 if(ib.le.0)
goto 1000
2776 if(zpiv(izzp).eq.0)
goto 110
2786 if(invp(iperm(i)).ne.i)
goto 210
2787 if(iperm(invp(i)).ne.i)
goto 210
2791 write(20,*)
'permutation error'
2798 end subroutine bringu
2802 subroutine posord(parent,btree,invp,iperm,pordr,nch,neqns,iw,qarent,mch)
2806 integer(kind=kint),
intent(in) :: btree(:,:),qarent(:)
2807 integer(kind=kint),
intent(out) :: pordr(:),invp(:),iperm(:),nch(:),iw(:),parent(:),mch(0:neqns+1)
2808 integer(kind=kint),
intent(in) :: neqns
2810 integer(kind=kint) :: i,j,k,l,locc,loc,locp,invpos,ipinv,ii
2821 if(locc.ne.0)
goto 10
2823 mch(locp)=mch(locp)+1
2826 if(l.ge.neqns)
goto 1000
2829 if(locc.ne.0)
goto 10
2832 mch(locp)=mch(locp)+mch(loc)+1
2836 ipinv=pordr(invp(i))
2845 if(ii.gt.0.and.ii.le.neqns)
then
2848 parent(i)=qarent(invpos)
2851 if(ldbg)
write(idbg,6020)
2852 if(ldbg)
write(idbg,6000) (pordr(i),i=1,neqns)
2853 if(ldbg)
write(idbg,6030)
2854 if(ldbg)
write(idbg,6050)
2855 if(ldbg)
write(idbg,6000) (parent(i),i=1,neqns)
2856 if(ldbg)
write(idbg,6000) (invp(i),i=1,neqns)
2857 if(ldbg)
write(idbg,6040)
2858 if(ldbg)
write(idbg,6000) (iperm(i),i=1,neqns)
2859 if(ldbg)
write(idbg,6010)
2860 if(ldbg)
write(idbg,6000) (nch(i),i=1,neqns)
2863 6020
format(
' post order')
2864 6030
format(/
' invp ')
2865 6040
format(/
' iperm ')
2866 6050
format(/
' parent')
2868 end subroutine posord
2872 subroutine gnleaf(xadj,adjncy,invp,iperm,pordr,nch,adjncp,xleaf,leaf,neqns,lnleaf)
2876 integer(kind=kint),
intent(in) :: xadj(:),adjncy(:),pordr(:),nch(:),invp(:),iperm(:)
2877 integer(kind=kint),
intent(out) :: xleaf(:),leaf(:),adjncp(:)
2878 integer(kind=kint),
intent(in) :: neqns
2880 integer(kind=kint) i,j,k,l,m,n,ik,istart,ip,iq,lnleaf,lc1,lc
2888 do 105 k=xadj(ip),xadj(ip+1)-1
2897 call qqsort(adjncp(istart+1:),m)
2898 lc1=adjncp(istart+1)
2899 if(lc1.ge.i)
goto 100
2902 do 130 k=istart+2,ik
2905 if(lc1.lt.lc-nch(lc))
then
2918 if(ldbg)
write(idbg,6020)
2919 if(ldbg)
write(idbg,6000) (xleaf(i),i=1,neqns+1)
2920 if(ldbg)
write(idbg,6010) lnleaf
2921 if(ldbg)
write(idbg,6000) (leaf(i),i=1,lnleaf)
2924 6010
format(
' leaf (len = ',i6,
')')
2925 6020
format(
' xleaf')
2926 end subroutine gnleaf
2930 subroutine countclno(parent,xleaf,leaf,neqns,nstop,lncol,ir)
2940 integer(kind=kint),
intent(in) :: parent(:),xleaf(:),leaf(:)
2941 integer(kind=kint),
intent(in) :: neqns, nstop
2942 integer(kind=kint),
intent(out) :: lncol, ir
2944 integer(kind=kint) :: i,j,k,l,nc,ks,ke,nxleaf
2952 if(ke.lt.ks)
goto 100
2958 if(j.ge.nxleaf)
goto 110
2968 if(j.ge.nstop)
goto 100
2969 if(j.ge.i.or.j.eq.0)
goto 100
2976 end subroutine countclno
2980 subroutine gnclno(parent,pordr,xleaf,leaf,xlnzr,colno,neqns,nstop,lncol,ir)
2984 integer(kind=kint),
intent(in) :: parent(:),pordr(:),xleaf(:),leaf(:)
2985 integer(kind=kint),
intent(out) :: colno(:),xlnzr(:)
2986 integer(kind=kint),
intent(in) :: neqns, nstop
2987 integer(kind=kint),
intent(out) :: lncol,ir
2989 integer(kind=kint) :: i,j,k,l,nc,ks,ke,nxleaf
2998 if(ke.lt.ks)
goto 100
3004 if(j.ge.nxleaf)
goto 110
3015 if(j.ge.nstop)
goto 100
3016 if(j.ge.i.or.j.eq.0)
goto 100
3024 if(ldbg)
write(idbg,6010)
3026 if(ldbg)
write(idbg,6020) lncol
3030 write(idbg,6000) (colno(i),i=xlnzr(k),xlnzr(k+1)-1)
3034 6010
format(
' xlnzr')
3035 6020
format(
' colno (lncol =',i10,
')')
3036 6100
format(/
' row = ',i6)
3038 end subroutine gnclno
3042 subroutine qmdrch(root,xadj,adjncy,deg,marker,rchsze,rchset,nhdsze,nbrhd)
3046 integer(kind=kint),
intent(in) :: deg(:),xadj(:),adjncy(:)
3047 integer(kind=kint),
intent(out) :: rchset(:),marker(:),nbrhd(:)
3048 integer(kind=kint),
intent(in) :: root
3049 integer(kind=kint),
intent(out) :: nhdsze,rchsze
3051 integer(kind=kint) :: i,j,k,l, istrt, istop, jstrt, jstop, nabor, node
3056 istop=xadj(root+1)-1
3057 if(istop.lt.istrt)
return
3058 do 600 i=istrt,istop
3060 if(nabor.eq.0)
return
3061 if(marker(nabor).ne.0)
goto 600
3062 if(deg(nabor).lt.0)
goto 200
3064 rchset(rchsze)=nabor
3067 200 marker(nabor)=-1
3070 300 jstrt=xadj(nabor)
3071 jstop=xadj(nabor+1)-1
3072 do 500 j=jstrt,jstop
3078 elseif(node==0)
then
3081 400
if(marker(node).ne.0)
goto 500
3088 end subroutine qmdrch
3092 subroutine qmdupd(xadj,adjncy,nlist,list,deg,qsize,qlink,marker,rchset,nbrhd)
3096 integer(kind=kint),
intent(in) :: adjncy(:),list(:),xadj(:)
3097 integer(kind=kint),
intent(out) :: marker(:),nbrhd(:),rchset(:),deg(:),qsize(:),qlink(:)
3098 integer(kind=kint),
intent(in) :: nlist
3100 integer(kind=kint) :: i,j,k,l, deg0,deg1,il,inhd,inode,irch,jstrt,jstop,mark,nabor,nhdsze,node,rchsze
3102 if(nlist.le.0)
return
3107 deg0=deg0+qsize(node)
3109 jstop=xadj(node+1)-1
3111 do 100 j=jstrt,jstop
3113 if(marker(nabor).ne.0.or.deg(nabor).ge.0)
goto 100
3120 if(nhdsze.gt.0)
call qmdmrg(xadj,adjncy,deg,qsize,qlink,marker,deg0,nhdsze,nbrhd,rchset,nbrhd(nhdsze+1:))
3124 if(mark.gt.1.or.mark.lt.0)
goto 600
3125 call qmdrch(node,xadj,adjncy,deg,marker,rchsze,rchset,nhdsze,nbrhd)
3127 if(rchsze.le.0)
goto 400
3128 do 300 irch=1,rchsze
3130 deg1=deg1+qsize(inode)
3133 400 deg(node)=deg1-1
3134 if(nhdsze.le.0)
goto 600
3135 do 500 inhd=1,nhdsze
3141 endsubroutine qmdupd
3145 subroutine qmdot(root,xadj,adjncy,marker,rchsze,rchset,nbrhd)
3149 integer(kind=kint),
intent(in) :: marker(:),rchset(:),nbrhd(:),xadj(:)
3150 integer(kind=kint),
intent(out) :: adjncy(:)
3151 integer(kind=kint),
intent(in) :: rchsze,root
3153 integer(kind=kint) :: i,j,k,l,irch,inhd,node,jstrt,jstop,link,nabor
3158 100 jstrt=xadj(node)
3159 jstop=xadj(node+1)-2
3160 if(jstop.lt.jstrt)
goto 300
3161 do 200 j=jstrt,jstop
3163 adjncy(j)=rchset(irch)
3164 if(irch.ge.rchsze)
goto 400
3166 300 link=adjncy(jstop+1)
3168 if(link.lt.0)
goto 100
3171 adjncy(jstop+1)=-node
3174 do 600 irch=1,rchsze
3176 if(marker(node).lt.0)
goto 600
3178 jstop=xadj(node+1)-1
3179 do 500 j=jstrt,jstop
3181 if(marker(nabor).ge.0)
goto 500
3187 end subroutine qmdot
3191 subroutine qmdmrg(xadj,adjncy,deg,qsize,qlink,marker,deg0,nhdsze,nbrhd,rchset,ovrlp)
3195 integer(kind=kint),
intent(in) :: adjncy(:),nbrhd(:),xadj(:)
3196 integer(kind=kint),
intent(out) :: deg(:),marker(:),rchset(:),ovrlp(:),qsize(:),qlink(:)
3197 integer(kind=kint),
intent(in) :: nhdsze
3199 integer(kind=kint) :: i,j,k,l, deg0,deg1,head,inhd,iov,irch,jstrt,jstop,link,lnode,mark,mrgsze,nabor,node,novrlp,rchsze,root
3202 if(nhdsze.le.0)
return
3203 do 100 inhd=1,nhdsze
3207 do 1400 inhd=1,nhdsze
3213 200 jstrt=xadj(root)
3214 jstop=xadj(root+1)-1
3215 do 600 j=jstrt,jstop
3221 elseif(nabor==0)
then
3224 300 mark=marker(nabor)
3232 rchset(rchsze)=nabor
3233 deg1=deg1+qsize(nabor)
3236 500
if(mark.gt.1)
goto 600
3243 do 1100 iov=1,novrlp
3246 jstop=xadj(node+1)-1
3247 do 800 j=jstrt,jstop
3249 if(marker(nabor).ne.0)
goto 800
3253 mrgsze=mrgsze+qsize(node)
3256 900 link=qlink(lnode)
3257 if(link.le.0)
goto 1000
3260 1000 qlink(lnode)=head
3263 if(head.le.0)
goto 1200
3265 deg(head)=deg0+deg1-1
3267 1200 root=nbrhd(inhd)
3269 if(rchsze.le.0)
goto 1400
3270 do 1300 irch=1,rchsze
3276 end subroutine qmdmrg
3280 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)
3286 integer(kind=kint),
intent(in) :: xlnzr_a(:)
3287 integer(kind=kint),
intent(in) :: colno_a(:)
3288 integer(kind=kint),
intent(in) :: iperm_a(:)
3289 integer(kind=kint),
intent(in) :: invp_a(:)
3290 integer(kind=kint),
intent(in) :: ndeg
3291 integer(kind=kint),
intent(in) :: nttbr_c
3292 integer(kind=kint),
intent(in) :: irow_c(:)
3293 integer(kind=kint),
intent(inout) :: jcol_c(:)
3294 integer(kind=kint),
intent(in) :: ncol
3295 integer(kind=kint),
intent(in) :: nrow
3298 integer(kind=kint),
pointer :: xlnzr_c(:)
3299 integer(kind=kint),
pointer :: colno_c(:)
3300 integer(kind=kint),
intent(out) :: lncol_c
3303 integer(kind=kint) :: i,j,k,l,m,n
3304 integer(kind=kint) :: ks, ke, ipass, ierr
3305 logical,
allocatable :: cnz(:)
3306 type(crs_matrix) :: crs_c
3310 jcol_c(i)=invp_a(jcol_c(i))
3317 allocate(cnz(ncol), stat=ierr)
3318 if(ierr .ne. 0)
then
3319 call errtrp(
'stop due to allocation error.')
3327 ke = crs_c%ia(k+1)-1
3328 if (ke .lt. ks)
then
3329 if (ipass .eq. 2)
then
3330 xlnzr_c(k+1)=lncol_c+1
3336 cnz(crs_c%ja(i)) = .true.
3343 if (ke .lt. ks)
then
3347 if (cnz(colno_a(j)))
then
3356 lncol_c = lncol_c + 1
3357 if (ipass .eq. 2)
then
3358 colno_c(lncol_c) = i
3362 if (ipass .eq. 2)
then
3363 xlnzr_c(k+1)=lncol_c + 1
3367 if (ipass .eq. 1)
then
3368 allocate(xlnzr_c(nrow+1),colno_c(lncol_c), stat=ierr)
3369 if(ierr .ne. 0)
then
3370 call errtrp(
'stop due to allocation error.')
3378 jcol_c(i)=iperm_a(jcol_c(i))
3383 end subroutine ldudecomposec
3391 integer(kind=kint),
intent(out) :: iw(:)
3392 integer(kind=kint),
intent(in) :: ik
3394 integer(kind=kint) :: l,m,itemp
3408 if(iw(l).lt.iw(m))
goto 110
3421 subroutine staij1(isw,i,j,aij,dsi,ir)
3445 real(kind=
kreal),
intent(out) :: aij(:)
3446 integer(kind=kint),
intent(in) :: isw, i, j
3447 integer(kind=kint),
intent(out) :: ir
3449 integer(kind=kint) :: ndeg, neqns, nstop, ndeg2, ndeg2l, ierr
3454 ndeg2l=ndeg*(ndeg+1)/2
3461 if(dsi%stage.ne.20)
then
3462 if(dsi%stage.eq.30)
write(ilog,*)
'Warning a matrix was build up but never solved.'
3466 allocate(dsi%diag(ndeg2l,neqns), stat=ierr)
3467 if(ierr .ne. 0)
then
3468 call errtrp(
'stop due to allocation error.')
3474 allocate(dsi%zln(ndeg2,dsi%lncol), stat=ierr)
3475 if(ierr .ne. 0)
then
3476 call errtrp(
'stop due to allocation error.')
3490 call addr0(isw,i,j,aij,dsi%invp,dsi%xlnzr,dsi%colno,dsi%diag,dsi%zln,dsi%dsln,nstop,dsi%ndeg,ir)
3491 elseif(ndeg.eq.3)
then
3492 call addr3(isw,i,j,aij,dsi%invp,dsi%xlnzr,dsi%colno,dsi%diag,dsi%zln,dsi%dsln,nstop,ir)
3494 call addrx(isw,i,j,aij,dsi%invp,dsi%xlnzr,dsi%colno,dsi%diag,dsi%zln,dsi%dsln,nstop,ndeg,ndeg2,ndeg2l,ir)
3498 end subroutine staij1
3507 subroutine sum(ic,xlnzr,colno,zln,diag,nch,par,neqns)
3511 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),par(:)
3512 integer(kind=kint),
intent(in) :: ic, neqns
3513 real(kind=
kreal),
intent(inout) :: zln(:),diag(:)
3514 integer(kind=kint),
intent(out) :: nch(:)
3516 real(kind=
kreal) :: s, t, zz, piv
3517 integer(kind=kint) :: ks, ke, kk, k, jc, jj, j, ierr
3518 integer(kind=kint) :: isem
3519 real(kind=
kreal),
allocatable :: temp(:)
3520 integer(kind=kint),
allocatable :: indx(:)
3521 allocate(temp(neqns),indx(neqns), stat=ierr)
3522 if(ierr .ne. 0)
then
3523 call errtrp(
'stop due to allocation error.')
3539 do 310 jj=xlnzr(jc),xlnzr(jc+1)-1
3541 if(indx(j).eq.ic)
then
3555 if(dabs(piv).gt.rmin)
then
3574 subroutine sum1(ic,xlnzr,colno,zln,diag,par,neqns)
3578 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),par(:)
3579 integer(kind=kint),
intent(in) :: ic, neqns
3580 real(kind=
kreal),
intent(inout) :: zln(:),diag(:)
3582 real(kind=
kreal) :: s, t, zz
3583 integer(kind=kint) :: ks, ke, k, jc, j, jj, ierr
3584 real(kind=
kreal),
allocatable :: temp(:)
3585 integer(kind=kint),
allocatable :: indx(:)
3589 allocate(temp(neqns),indx(neqns), stat=ierr)
3590 if(ierr .ne. 0)
then
3591 call errtrp(
'stop due to allocation error.')
3604 do 310 jj=xlnzr(jc),xlnzr(jc+1)-1
3606 if(indx(j).eq.ic)
then
3625 subroutine sum2_child(neqns,nstop,xlnzr,colno,zln,diag,spdslnidx,spdslnval,nspdsln)
3629 integer(kind=kint),
intent(in) :: neqns, nstop
3630 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:)
3631 real(kind=
kreal),
intent(inout) :: zln(:),diag(:)
3632 integer(kind=kint),
pointer :: spdslnidx(:)
3633 real(kind=
kreal),
pointer :: spdslnval(:,:)
3634 integer(kind=kint),
intent(out) :: nspdsln
3636 real(kind=
kreal) :: s, t
3637 integer(kind=kint) :: ks, ke, kk, k, jc, jj, j, j1,j2
3638 integer(kind=kint) :: ic, i, loc, ierr
3639 integer(kind=kint) :: ispdsln
3641 real(kind=
kreal),
allocatable :: temp(:)
3642 integer(kind=kint),
allocatable :: indx(:)
3644 allocate(temp(neqns),indx(neqns), stat=ierr)
3645 if(ierr .ne. 0)
then
3646 call errtrp(
'stop due to allocation error.')
3660 do jj=xlnzr(jc),xlnzr(jc+1)-1
3662 if(indx(j).eq.ic)
then
3669 allocate(spdslnidx(nspdsln),spdslnval(1,nspdsln), stat=ierr)
3670 if(ierr .ne. 0)
then
3671 call errtrp(
'stop due to allocation error.')
3678 do 100 ic=nstop,neqns
3687 zln(k)=temp(jj)*diag(jj)
3689 diag(ic)=diag(ic)-temp(jj)*zln(k)
3691 do 120 jc=nstop,ic-1
3694 do 220 jj=xlnzr(jc),xlnzr(jc+1)-1
3696 if(indx(j).eq.ic)
then
3704 spdslnidx(ispdsln)=loc
3705 spdslnval(1,ispdsln)=spdslnval(1,ispdsln)-s
3713 end subroutine sum2_child
3717 subroutine sum3(n,dsln,diag)
3721 real(kind=
kreal),
intent(inout) :: dsln(:),diag(:)
3722 integer(kind=kint),
intent(in) :: n
3724 integer(kind=kint) :: i, j, loc, ierr
3725 real(kind=
kreal),
allocatable :: temp(:)
3726 integer(kind=kint),
allocatable :: indx(:)
3727 allocate(temp(n),indx(n), stat=ierr)
3728 if(ierr .ne. 0)
then
3729 call errtrp(
'stop due to allocation error.')
3732 if(n.le.0)
goto 1000
3735 diag(1)=1.0d0/diag(1)
3739 dsln(loc)=dsln(loc)-dot_product(dsln(indx(i):indx(i)+j-2),dsln(indx(j):indx(j)+j-2))
3742 temp(1:i-1)=dsln(indx(i):indx(i)+i-2)*diag(1:i-1)
3743 diag(i)=diag(i)-dot_product(temp(1:i-1),dsln(indx(i):indx(i)+i-2))
3744 dsln(indx(i):indx(i)+i-2)=temp(1:i-1)
3745 diag(i)=1.0d0/diag(i)
3753 real(kind=
kreal)
function spdot2(b,zln,colno,ks,ke)
3757 integer(kind=kint),
intent(in) :: colno(:)
3758 integer(kind=kint),
intent(in) :: ks,ke
3759 real(kind=
kreal),
intent(in) :: zln(:),b(:)
3761 integer(kind=kint) :: j,jj
3762 real(kind=
kreal) :: s
3783 real(kind=
kreal)
function ddot(a,b,n)
3787 real(kind=
kreal),
intent(in) :: a(n),b(n)
3788 integer(kind=kint),
intent(in) :: n
3790 real(kind=
kreal) :: s
3791 integer(kind=kint) :: i
3803 subroutine addr0(isw,i,j,aij,invp,xlnzr,colno,diag,zln,dsln,nstop,ndeg,ir)
3807 integer(kind=kint),
intent(in) :: isw
3808 integer(kind=kint),
intent(in) :: i,j,nstop, ndeg, invp(:),xlnzr(:),colno(:)
3809 real(kind=
kreal),
intent(inout) :: zln(:,:),diag(:,:),dsln(:,:),aij(:)
3810 integer(kind=kint),
intent(out) :: ir
3812 integer(kind=kint) :: ndeg2, ii, jj, itrans, k, i0, j0, l, ks, ke
3813 integer(kind=kint),
parameter :: idbg=0
3819 if(idbg.ne.0)
write(idbg,*)
'addr0',ii,jj,aij
3825 diag(1,ii)=diag(1,ii)+aij(1)
3827 elseif(ndeg2.eq.4)
then
3833 diag(1,ii)=diag(1,ii)+aij(1)
3834 diag(2,ii)=diag(2,ii)+aij(2)
3835 diag(3,ii)=diag(3,ii)+aij(4)
3847 if(jj.ge.nstop)
then
3854 elseif(ndeg2.eq.4)
then
3855 if(itrans.eq.0)
then
3872 if(colno(k).eq.jj)
then
3876 elseif(ndeg2.eq.4)
then
3877 if(itrans.eq.0)
then
3890 zln(1,k)=zln(1,k)+aij(1)
3891 elseif(ndeg2.eq.4)
then
3892 if(itrans.eq.0)
then
3894 zln(l,k)=zln(l,k)+aij(l)
3897 zln(1,k)=zln(1,k)+aij(1)
3898 zln(2,k)=zln(2,k)+aij(3)
3899 zln(3,k)=zln(3,k)+aij(2)
3900 zln(4,k)=zln(4,k)+aij(4)
3910 end subroutine addr0
3918 subroutine s3um(ic,xlnzr,colno,zln,diag,nch,par,neqns)
3922 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),par(:)
3923 integer(kind=kint),
intent(out) :: nch(:)
3924 real(kind=
kreal),
intent(out) :: zln(:,:), diag(:,:)
3925 integer(kind=kint),
intent(in) :: ic,neqns
3927 real(kind=
kreal),
allocatable :: temp(:,:)
3928 integer(kind=kint),
allocatable :: indx(:)
3929 real(kind=
kreal) :: zz(9),t(6)
3930 integer(kind=kint) :: i,j,k,l,ks,ke,kk,jc,jj,ir, ierr
3932 allocate(temp(9,neqns),indx(neqns), stat=ierr)
3933 if(ierr .ne. 0)
then
3934 call errtrp(
'stop due to allocation error.')
3950 do 310 jj=xlnzr(jc),xlnzr(jc+1)-1
3952 if(indx(j).eq.ic)
then
3953 zz(1)=zz(1)-temp(1,j)*zln(1,jj)-temp(4,j)*zln(4,jj)-temp(7,j)*zln(7,jj)
3954 zz(2)=zz(2)-temp(2,j)*zln(1,jj)-temp(5,j)*zln(4,jj)-temp(8,j)*zln(7,jj)
3955 zz(3)=zz(3)-temp(3,j)*zln(1,jj)-temp(6,j)*zln(4,jj)-temp(9,j)*zln(7,jj)
3956 zz(4)=zz(4)-temp(1,j)*zln(2,jj)-temp(4,j)*zln(5,jj)-temp(7,j)*zln(8,jj)
3957 zz(5)=zz(5)-temp(2,j)*zln(2,jj)-temp(5,j)*zln(5,jj)-temp(8,j)*zln(8,jj)
3958 zz(6)=zz(6)-temp(3,j)*zln(2,jj)-temp(6,j)*zln(5,jj)-temp(9,j)*zln(8,jj)
3959 zz(7)=zz(7)-temp(1,j)*zln(3,jj)-temp(4,j)*zln(6,jj)-temp(7,j)*zln(9,jj)
3960 zz(8)=zz(8)-temp(2,j)*zln(3,jj)-temp(5,j)*zln(6,jj)-temp(8,j)*zln(9,jj)
3961 zz(9)=zz(9)-temp(3,j)*zln(3,jj)-temp(6,j)*zln(6,jj)-temp(9,j)*zln(9,jj)
3965 call inv33(zln(:,k),zz,diag(:,jc))
3971 t(1)=t(1)+zz(1)*zln(1,k)+zz(4)*zln(4,k)+zz(7)*zln(7,k)
3972 t(2)=t(2)+zz(1)*zln(2,k)+zz(4)*zln(5,k)+zz(7)*zln(8,k)
3973 t(3)=t(3)+zz(2)*zln(2,k)+zz(5)*zln(5,k)+zz(8)*zln(8,k)
3974 t(4)=t(4)+zz(1)*zln(3,k)+zz(4)*zln(6,k)+zz(7)*zln(9,k)
3975 t(5)=t(5)+zz(2)*zln(3,k)+zz(5)*zln(6,k)+zz(8)*zln(9,k)
3976 t(6)=t(6)+zz(3)*zln(3,k)+zz(6)*zln(6,k)+zz(9)*zln(9,k)
3980 diag(l,ic)=diag(l,ic)-t(l)
3983 call inv3(diag(:,ic),ir)
3993 subroutine s3um1(ic,xlnzr,colno,zln,diag,nch,par,neqns)
3997 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),nch(:),par(:)
3998 real(kind=
kreal),
intent(in) :: diag(:,:)
3999 real(kind=
kreal),
intent(out) :: zln(:,:)
4000 integer(kind=kint),
intent(in) :: ic,neqns
4002 integer(kind=kint) :: i,j,k,l,ks,ke,jc,jj,ierr
4003 real(kind=
kreal) :: s(9),zz(9)
4004 real(kind=
kreal),
allocatable :: temp(:,:)
4005 integer(kind=kint),
allocatable :: indx(:)
4008 allocate(temp(9,neqns),indx(neqns), stat=ierr)
4022 do 310 jj=xlnzr(jc),xlnzr(jc+1)-1
4024 if(indx(j).eq.ic)
then
4025 s(1)=s(1)+temp(1,j)*zln(1,jj)+temp(4,j)*zln(4,jj)+temp(7,j)*zln(7,jj)
4026 s(2)=s(2)+temp(2,j)*zln(1,jj)+temp(5,j)*zln(4,jj)+temp(8,j)*zln(7,jj)
4027 s(3)=s(3)+temp(3,j)*zln(1,jj)+temp(6,j)*zln(4,jj)+temp(9,j)*zln(7,jj)
4028 s(4)=s(4)+temp(1,j)*zln(2,jj)+temp(4,j)*zln(5,jj)+temp(7,j)*zln(8,jj)
4029 s(5)=s(5)+temp(2,j)*zln(2,jj)+temp(5,j)*zln(5,jj)+temp(8,j)*zln(8,jj)
4030 s(6)=s(6)+temp(3,j)*zln(2,jj)+temp(6,j)*zln(5,jj)+temp(9,j)*zln(8,jj)
4031 s(7)=s(7)+temp(1,j)*zln(3,jj)+temp(4,j)*zln(6,jj)+temp(7,j)*zln(9,jj)
4032 s(8)=s(8)+temp(2,j)*zln(3,jj)+temp(5,j)*zln(6,jj)+temp(8,j)*zln(9,jj)
4033 s(9)=s(9)+temp(3,j)*zln(3,jj)+temp(6,j)*zln(6,jj)+temp(9,j)*zln(9,jj)
4038 temp(l,jc)=zln(l,k)-s(l)
4045 deallocate(temp,indx)
4046 end subroutine s3um1
4051 subroutine s3um3(n,dsln,diag)
4055 real(kind=
kreal),
intent(out) :: dsln(:,:),diag(:,:)
4056 integer(kind=kint),
intent(in) :: n
4058 real(kind=
kreal) :: t(9)
4059 integer(kind=kint) :: i,j,k,l,loc,ir, ierr
4060 real(kind=
kreal),
allocatable :: temp(:,:)
4061 integer(kind=kint),
allocatable :: indx(:)
4063 allocate(temp(9,n),indx(n), stat=ierr)
4064 if(ierr .ne. 0)
then
4065 call errtrp(
'stop due to allocation error.')
4068 if(n.le.0)
goto 1000
4071 call inv3(diag(:,1),ir)
4075 call d3dot(t,dsln(:,indx(i):indx(i)+j-2), dsln(:,indx(j):indx(j)+j-2),j-1)
4080 dsln(:,loc)=dsln(:,loc)-t(:)
4083 call v3prod(dsln(:,indx(i):indx(i)+i-2), diag,temp,i-1)
4084 call d3dotl(t,temp,dsln(:,indx(i):indx(i)+i-2),i-1)
4089 diag(:,i)=diag(:,i)-t(1:6)
4090 dsln(:,indx(i):indx(i)+i-2)=temp(:,1:i-1)
4091 call inv3(diag(:,i),ir)
4095 end subroutine s3um3
4099 subroutine d3sdot(wi,a,b,n)
4103 real(kind=
kreal),
intent(in) :: a(:,:),b(:,:)
4104 real(kind=
kreal),
intent(out) :: wi(:)
4105 integer(kind=kint),
intent(in) :: n
4107 integer(kind=kint) :: jj
4119 wi(1)=wi(1)-a(1,jj)*b(1,jj)-a(2,jj)*b(4,jj)-a(3,jj)*b(7,jj)
4120 wi(2)=wi(2)-a(1,jj)*b(2,jj)-a(2,jj)*b(5,jj)-a(3,jj)*b(8,jj)
4121 wi(3)=wi(3)-a(1,jj)*b(3,jj)-a(2,jj)*b(6,jj)-a(3,jj)*b(9,jj)
4124 end subroutine d3sdot
4128 subroutine s3pdot(bi,b,zln,colno,ks,ke)
4132 integer(kind=kint),
intent(in) :: colno(:)
4133 real(kind=
kreal),
intent(in) :: zln(:,:),b(:,:)
4134 real(kind=
kreal),
intent(out) :: bi(:)
4135 integer(kind=kint),
intent(in) :: ks,ke
4137 integer(kind=kint) :: j,jj
4150 bi(1)=bi(1)-zln(1,jj)*b(1,j)-zln(4,jj)*b(2,j)-zln(7,jj)*b(3,j)
4151 bi(2)=bi(2)-zln(2,jj)*b(1,j)-zln(5,jj)*b(2,j)-zln(8,jj)*b(3,j)
4152 bi(3)=bi(3)-zln(3,jj)*b(1,j)-zln(6,jj)*b(2,j)-zln(9,jj)*b(3,j)
4155 end subroutine s3pdot
4159 subroutine inv33(zln,zz,diag)
4163 real(kind=
kreal),
intent(in) :: zz(9),diag(6)
4164 real(kind=
kreal),
intent(out) :: zln(9)
4166 zln(4)=zz(4)-zz(1)*diag(2)
4167 zln(7)=zz(7)-zz(1)*diag(4)-zln(4)*diag(5)
4168 zln(1)=zz(1)*diag(1)
4169 zln(4)=zln(4)*diag(3)
4170 zln(7)=zln(7)*diag(6)
4171 zln(4)=zln(4)-zln(7)*diag(5)
4172 zln(1)=zln(1)-zln(4)*diag(2)-zln(7)*diag(4)
4174 zln(5)=zz(5)-zz(2)*diag(2)
4175 zln(8)=zz(8)-zz(2)*diag(4)-zln(5)*diag(5)
4176 zln(2)=zz(2)*diag(1)
4177 zln(5)=zln(5)*diag(3)
4178 zln(8)=zln(8)*diag(6)
4179 zln(5)=zln(5)-zln(8)*diag(5)
4180 zln(2)=zln(2)-zln(5)*diag(2)-zln(8)*diag(4)
4182 zln(6)=zz(6)-zz(3)*diag(2)
4183 zln(9)=zz(9)-zz(3)*diag(4)-zln(6)*diag(5)
4184 zln(3)=zz(3)*diag(1)
4185 zln(6)=zln(6)*diag(3)
4186 zln(9)=zln(9)*diag(6)
4187 zln(6)=zln(6)-zln(9)*diag(5)
4188 zln(3)=zln(3)-zln(6)*diag(2)-zln(9)*diag(4)
4190 end subroutine inv33
4194 subroutine inv3(dsln,ir)
4198 real(kind=
kreal) :: dsln(6),t(2)
4199 integer(kind=kint) :: ir
4202 if(dabs(dsln(1)).lt.rmin)
then
4205 dsln(1)=1.0d0/dsln(1)
4206 t(1)=dsln(2)*dsln(1)
4207 dsln(3)=dsln(3)-t(1)*dsln(2)
4209 if(dabs(dsln(3)).lt.rmin)
then
4212 dsln(3)=1.0d0/dsln(3)
4213 t(1)=dsln(4)*dsln(1)
4214 dsln(5)=dsln(5)-dsln(2)*dsln(4)
4215 t(2)=dsln(5)*dsln(3)
4216 dsln(6)=dsln(6)-t(1)*dsln(4)-t(2)*dsln(5)
4219 if(dabs(dsln(6)).lt.rmin)
then
4222 dsln(6)=1.0d0/dsln(6)
4226 write(ilog,*)
"singular"
4238 subroutine d3dot(t,a,b,n)
4241 real(kind=
kreal),
intent(in) :: a(:,:),b(:,:)
4242 real(kind=
kreal),
intent(out) :: t(:)
4243 integer(kind=kint),
intent(in) :: n
4245 integer(kind=kint) :: l,jj
4265 t(1)=t(1)+a(1,jj)*b(1,jj)+a(4,jj)*b(4,jj)+a(7,jj)*b(7,jj)
4266 t(2)=t(2)+a(2,jj)*b(1,jj)+a(5,jj)*b(4,jj)+a(8,jj)*b(7,jj)
4267 t(3)=t(3)+a(3,jj)*b(1,jj)+a(6,jj)*b(4,jj)+a(9,jj)*b(7,jj)
4268 t(4)=t(4)+a(1,jj)*b(2,jj)+a(4,jj)*b(5,jj)+a(7,jj)*b(8,jj)
4269 t(5)=t(5)+a(2,jj)*b(2,jj)+a(5,jj)*b(5,jj)+a(8,jj)*b(8,jj)
4270 t(6)=t(6)+a(3,jj)*b(2,jj)+a(6,jj)*b(5,jj)+a(9,jj)*b(8,jj)
4271 t(7)=t(7)+a(1,jj)*b(3,jj)+a(4,jj)*b(6,jj)+a(7,jj)*b(9,jj)
4272 t(8)=t(8)+a(2,jj)*b(3,jj)+a(5,jj)*b(6,jj)+a(8,jj)*b(9,jj)
4273 t(9)=t(9)+a(3,jj)*b(3,jj)+a(6,jj)*b(6,jj)+a(9,jj)*b(9,jj)
4276 end subroutine d3dot
4280 subroutine v3prod(zln,diag,zz,n)
4284 real(kind=
kreal),
intent(in) :: zln(:,:),diag(:,:)
4285 real(kind=
kreal),
intent(out) :: zz(:,:)
4286 integer(kind=kint),
intent(in) :: n
4288 integer(kind=kint) :: i
4291 zz(4,i)=zln(4,i)-zln(1,i)*diag(2,i)
4292 zz(7,i)=zln(7,i)-zln(1,i)*diag(4,i)-zz(4,i)*diag(5,i)
4293 zz(1,i)=zln(1,i)*diag(1,i)
4294 zz(4,i)=zz(4,i)*diag(3,i)
4295 zz(7,i)=zz(7,i)*diag(6,i)
4296 zz(4,i)=zz(4,i)-zz(7,i)*diag(5,i)
4297 zz(1,i)=zz(1,i)-zz(4,i)*diag(2,i)-zz(7,i)*diag(4,i)
4299 zz(5,i)=zln(5,i)-zln(2,i)*diag(2,i)
4300 zz(8,i)=zln(8,i)-zln(2,i)*diag(4,i)-zz(5,i)*diag(5,i)
4301 zz(2,i)=zln(2,i)*diag(1,i)
4302 zz(5,i)=zz(5,i)*diag(3,i)
4303 zz(8,i)=zz(8,i)*diag(6,i)
4304 zz(5,i)=zz(5,i)-zz(8,i)*diag(5,i)
4305 zz(2,i)=zz(2,i)-zz(5,i)*diag(2,i)-zz(8,i)*diag(4,i)
4307 zz(6,i)=zln(6,i)-zln(3,i)*diag(2,i)
4308 zz(9,i)=zln(9,i)-zln(3,i)*diag(4,i)-zz(6,i)*diag(5,i)
4309 zz(3,i)=zln(3,i)*diag(1,i)
4310 zz(6,i)=zz(6,i)*diag(3,i)
4311 zz(9,i)=zz(9,i)*diag(6,i)
4312 zz(6,i)=zz(6,i)-zz(9,i)*diag(5,i)
4313 zz(3,i)=zz(3,i)-zz(6,i)*diag(2,i)-zz(9,i)*diag(4,i)
4316 end subroutine v3prod
4319 subroutine d3dotl(t,a,b,n)
4322 real(kind=
kreal),
intent(in) :: a(:,:),b(:,:)
4323 real(kind=
kreal),
intent(out) :: t(:)
4324 integer(kind=kint),
intent(in) :: n
4326 integer(kind=kint) :: l,jj
4343 t(1)=t(1)+a(1,jj)*b(1,jj)+a(4,jj)*b(4,jj)+a(7,jj)*b(7,jj)
4344 t(2)=t(2)+a(2,jj)*b(1,jj)+a(5,jj)*b(4,jj)+a(8,jj)*b(7,jj)
4345 t(3)=t(3)+a(2,jj)*b(2,jj)+a(5,jj)*b(5,jj)+a(8,jj)*b(8,jj)
4346 t(4)=t(4)+a(3,jj)*b(1,jj)+a(6,jj)*b(4,jj)+a(9,jj)*b(7,jj)
4347 t(5)=t(5)+a(3,jj)*b(2,jj)+a(6,jj)*b(5,jj)+a(9,jj)*b(8,jj)
4348 t(6)=t(6)+a(3,jj)*b(3,jj)+a(6,jj)*b(6,jj)+a(9,jj)*b(9,jj)
4351 end subroutine d3dotl
4355 subroutine addr3(isw,i,j,aij,invp,xlnzr,colno,diag,zln,dsln,nstop,ir)
4359 integer(kind=kint),
intent(in) :: invp(:),xlnzr(:),colno(:)
4360 real(kind=
kreal),
intent(in) :: aij(:)
4361 real(kind=
kreal),
intent(out) :: zln(:,:),diag(:,:),dsln(:,:)
4362 integer(kind=kint),
intent(in) :: isw,i,j,nstop
4363 integer(kind=kint),
intent(out) :: ir
4365 integer(kind=kint),
parameter :: ndeg2=9
4366 integer(kind=kint),
parameter :: ndeg2l=6
4367 integer(kind=kint) :: k,l,ii,jj,itrans,i0,j0,ks,ke
4372 if(ldbg)
write(idbg,*)
'addr3',ii,jj,aij
4393 if(jj.ge.nstop)
then
4397 if(itrans.eq.0)
then
4420 if(colno(k).eq.jj)
then
4421 if(itrans.eq.0)
then
4442 end subroutine addr3
4446 subroutine s2um(ic,xlnzr,colno,zln,diag,nch,par,neqns)
4450 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),par(:)
4451 integer(kind=kint),
intent(out) :: nch(:)
4452 real(kind=
kreal),
intent(out) :: zln(:,:),diag(:,:)
4453 integer(kind=kint),
intent(in) :: ic,neqns
4455 integer(kind=kint) :: i,j,k,l,ks,ke,jj,jc,ir,kk, ierr
4456 real(kind=
kreal),
allocatable :: temp(:,:)
4457 integer(kind=kint),
allocatable :: indx(:)
4458 real(kind=
kreal) :: s(4),zz(4),t(3)
4460 allocate(temp(4,neqns),indx(neqns), stat=ierr)
4461 if(ierr .ne. 0)
then
4462 call errtrp(
'stop due to allocation error.')
4477 do 310 jj=xlnzr(jc),xlnzr(jc+1)-1
4479 if(indx(j).eq.ic)
then
4480 zz(1)=zz(1)-temp(1,j)*zln(1,jj)-temp(3,j)*zln(3,jj)
4481 zz(2)=zz(2)-temp(2,j)*zln(1,jj)-temp(4,j)*zln(3,jj)
4482 zz(3)=zz(3)-temp(1,j)*zln(2,jj)-temp(3,j)*zln(4,jj)
4483 zz(4)=zz(4)-temp(2,j)*zln(2,jj)-temp(4,j)*zln(4,jj)
4486 call inv22(zln(:,k),zz,diag(:,jc))
4490 t(1)=t(1)+zz(1)*zln(1,k)+zz(3)*zln(3,k)
4491 t(2)=t(2)+zz(2)*zln(1,k)+zz(4)*zln(3,k)
4492 t(3)=t(3)+zz(2)*zln(2,k)+zz(4)*zln(4,k)
4494 diag(1,ic)=diag(1,ic)-t(1)
4495 diag(2,ic)=diag(2,ic)-t(2)
4496 diag(3,ic)=diag(3,ic)-t(3)
4497 call inv2(diag(:,ic),ir)
4506 subroutine s2um1(ic,xlnzr,colno,zln,diag,nch,par,neqns)
4510 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),nch(:),par(:)
4511 real(kind=
kreal),
intent(in) :: diag(:,:)
4512 real(kind=
kreal),
intent(out) :: zln(:,:)
4513 integer(kind=kint),
intent(in) :: ic,neqns
4515 integer(kind=kint) :: i,j,k,l,ks,ke,jc,jj, ierr
4516 real(kind=
kreal) :: s(4),zz(4)
4517 real(kind=
kreal),
allocatable :: temp(:,:)
4518 integer(kind=kint),
allocatable :: indx(:)
4520 allocate(temp(4,neqns),indx(neqns), stat=ierr)
4521 if(ierr .ne. 0)
then
4522 call errtrp(
'stop due to allocation error.')
4533 do 310 jj=xlnzr(jc),xlnzr(jc+1)-1
4535 if(indx(j).eq.ic)
then
4536 s(1)=s(1)+temp(1,j)*zln(1,jj)+temp(3,j)*zln(3,jj)
4537 s(2)=s(2)+temp(2,j)*zln(1,jj)+temp(4,j)*zln(3,jj)
4538 s(3)=s(3)+temp(1,j)*zln(2,jj)+temp(3,j)*zln(4,jj)
4539 s(4)=s(4)+temp(2,j)*zln(2,jj)+temp(4,j)*zln(4,jj)
4543 temp(l,jc)=zln(l,k)-s(l)
4549 end subroutine s2um1
4553 subroutine s2um2_child(neqns,nstop,xlnzr,colno,zln,diag,spdslnidx,spdslnval,nspdsln)
4557 integer(kind=kint),
intent(in) :: neqns, nstop
4558 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:)
4559 real(kind=
kreal),
intent(inout) :: zln(:,:),diag(:,:)
4560 integer(kind=kint),
pointer :: spdslnidx(:)
4561 real(kind=
kreal),
pointer :: spdslnval(:,:)
4562 integer(kind=kint),
intent(out) :: nspdsln
4564 integer(kind=kint) :: i,j,k,l,m,n, ic,ks,ke,ii,jj,jc,j1,j2,loc,ispdsln, ierr
4565 real(kind=
kreal),
allocatable :: temp(:,:)
4566 integer(kind=kint),
allocatable :: indx(:)
4569 allocate(temp(4,neqns),indx(neqns), stat=ierr)
4570 if(ierr .ne. 0)
then
4571 call errtrp(
'stop due to allocation error.')
4585 do jj=xlnzr(jc),xlnzr(jc+1)-1
4587 if(indx(j).eq.ic)
then
4594 allocate(spdslnidx(nspdsln),spdslnval(4,nspdsln), stat=ierr)
4595 if(ierr .ne. 0)
then
4596 call errtrp(
'stop due to allocation error.')
4603 do 100 ic=nstop,neqns
4613 zln(3,k)=temp(3,jj)-temp(1,jj)*diag(2,jj)
4614 zln(1,k)=temp(1,jj)*diag(1,jj)
4615 zln(3,k)=zln(3,k)*diag(3,jj)
4616 zln(1,k)=zln(1,k)-zln(3,k)*diag(2,jj)
4618 zln(4,k)=temp(4,jj)-temp(2,jj)*diag(2,jj)
4619 zln(2,k)=temp(2,jj)*diag(1,jj)
4620 zln(4,k)=zln(4,k)*diag(3,jj)
4621 zln(2,k)=zln(2,k)-zln(4,k)*diag(2,jj)
4623 diag(1,ic)=diag(1,ic)-(temp(1,jj)*zln(1,k)+temp(3,jj)*zln(3,k))
4624 diag(2,ic)=diag(2,ic)-(temp(1,jj)*zln(2,k)+temp(3,jj)*zln(4,k))
4625 diag(3,ic)=diag(3,ic)-(temp(2,jj)*zln(2,k)+temp(4,jj)*zln(4,k))
4628 do 120 jc=nstop,ic-1
4630 do 220 jj=xlnzr(jc),xlnzr(jc+1)-1
4632 if(indx(j).eq.ic)
then
4637 spdslnidx(ispdsln)=loc
4638 spdslnval(1,ispdsln)=spdslnval(1,ispdsln)-(temp(1,j)*zln(1,jj)+temp(3,j)*zln(3,jj))
4639 spdslnval(2,ispdsln)=spdslnval(2,ispdsln)-(temp(2,j)*zln(1,jj)+temp(4,j)*zln(3,jj))
4640 spdslnval(3,ispdsln)=spdslnval(3,ispdsln)-(temp(1,j)*zln(2,jj)+temp(3,j)*zln(4,jj))
4641 spdslnval(4,ispdsln)=spdslnval(4,ispdsln)-(temp(2,j)*zln(2,jj)+temp(4,j)*zln(4,jj))
4648 end subroutine s2um2_child
4652 subroutine inv22(zln,zz,diag)
4656 real(kind=
kreal),
intent(in) :: zz(4),diag(3)
4657 real(kind=
kreal),
intent(out) :: zln(4)
4659 zln(3)=zz(3)-zz(1)*diag(2)
4660 zln(1)=zz(1)*diag(1)
4661 zln(3)=zln(3)*diag(3)
4662 zln(1)=zln(1)-zln(3)*diag(2)
4664 zln(4)=zz(4)-zz(2)*diag(2)
4665 zln(2)=zz(2)*diag(1)
4666 zln(4)=zln(4)*diag(3)
4667 zln(2)=zln(2)-zln(4)*diag(2)
4670 end subroutine inv22
4674 subroutine inv2(dsln,ir)
4678 real(kind=
kreal),
intent(out) :: dsln(3)
4679 integer(kind=kint),
intent(out) :: ir
4681 real(kind=
kreal) :: t
4684 if(dabs(dsln(1)).lt.rmin)
then
4688 dsln(1)=1.0d0/dsln(1)
4690 dsln(3)=dsln(3)-t*dsln(2)
4692 if(dabs(dsln(3)).lt.rmin)
then
4696 dsln(3)=1.0d0/dsln(3)
4705 subroutine s2pdot(bi,b,zln,colno,ks,ke)
4709 integer(kind=kint),
intent(in) :: colno(:)
4710 integer(kind=kint),
intent(in) :: ks,ke
4711 real(kind=
kreal),
intent(in) :: zln(:,:),b(:,:)
4712 real(kind=
kreal),
intent(out) :: bi(:)
4714 integer(kind=kint) :: jj,j
4727 bi(1)=bi(1)-zln(1,jj)*b(1,j)-zln(3,jj)*b(2,j)
4728 bi(2)=bi(2)-zln(2,jj)*b(1,j)-zln(4,jj)*b(2,j)
4731 end subroutine s2pdot
4735 subroutine addrx(isw,i,j,aij,invp,xlnzr,colno,diag,zln,dsln,nstop,ndeg,ndeg2,ndeg2l,ir)
4739 integer(kind=kint),
intent(in) :: invp(*),xlnzr(*),colno(*)
4740 real(kind=
kreal),
intent(in) :: aij(ndeg,ndeg)
4741 real(kind=
kreal),
intent(out) :: zln(ndeg,ndeg,*),diag(ndeg2l,*),dsln(ndeg,ndeg,*)
4742 integer(kind=kint),
intent(in) :: isw,i,j,nstop,ndeg,ndeg2,ndeg2l
4743 integer(kind=kint),
intent(out) :: ir
4745 integer(kind=kint) :: ii,jj,k,l,m,n,ks,ke,itrans,i0,j0
4750 if(ldbg)
write(idbg,*)
'addrx',ii,jj,aij
4768 if(jj.ge.nstop)
then
4772 if(itrans.eq.0)
then
4775 dsln(n,m,k)=aij(n,m)
4782 dsln(n,m,k)=aij(m,n)
4791 if(colno(k).eq.jj)
then
4792 if(itrans.eq.0)
then
4811 end subroutine addrx
4815 subroutine dxdot(ndeg,t,a,b,l)
4819 real(kind=
kreal),
intent(in) :: a(ndeg,ndeg,*),b(ndeg,ndeg,*)
4820 real(kind=
kreal),
intent(out) :: t(ndeg,ndeg)
4821 integer(kind=kint),
intent(in) :: ndeg,l
4823 integer(kind=kint) :: k,jj,n,m
4839 t(n,m)=t(n,m)+a(n,k,jj)*b(m,k,jj)
4845 end subroutine dxdot
4849 subroutine dxdotl(ndeg,t,a,b,l)
4853 real(kind=
kreal),
intent(in) :: a(ndeg,ndeg,*),b(ndeg,ndeg,*)
4854 real(kind=
kreal),
intent(out) :: t(ndeg,ndeg)
4855 integer(kind=kint),
intent(in) :: ndeg,l
4857 integer(kind=kint) :: n,m,jj,k
4873 t(n,m)=t(n,m)+a(n,k,jj)*b(m,k,jj)
4879 end subroutine dxdotl
4883 subroutine dxsdot(ndeg,wi,a,b,n)
4887 real(kind=
kreal),
intent(in) :: a(ndeg,*),b(ndeg,ndeg,*)
4888 real(kind=
kreal),
intent(out) :: wi(ndeg)
4889 integer(kind=kint),
intent(in) :: ndeg, n
4891 integer(kind=kint) :: jj, k, l
4906 wi(l)=wi(l)-b(l,k,jj)*a(k,jj)
4911 end subroutine dxsdot
4915 subroutine invx(dsln,ndeg,ir)
4919 real(kind=
kreal),
intent(inout) :: dsln(*)
4920 integer(kind=kint),
intent(in) :: ndeg
4921 integer(kind=kint),
intent(out) :: ir
4923 integer(kind=kint) :: i,j,k,l,ld,l0,k0,ll
4924 real(kind=
kreal) :: tem,t
4928 dsln(1)=1.0d0/dsln(1)
4936 dsln(l)=dsln(l)-dsln(l0+k)*dsln(ld)
4946 tem=dsln(k)*dsln(k0)
4952 dsln(l)=1.0d0/dsln(l)
4959 subroutine invxx(zln,zz,diag,ndeg)
4963 real(kind=
kreal),
intent(in) :: zz(ndeg,ndeg),diag(*)
4964 real(kind=
kreal),
intent(out) :: zln(ndeg,ndeg)
4965 integer(kind=kint),
intent(in) :: ndeg
4967 integer(kind=kint) :: i,j,k,l,m,n,loc,loc1
4976 zln(l,n)=zln(l,n)-zln(l,m)*diag(loc1)
4983 zln(l,m)=zln(l,m)*diag(loc)
4988 zln(l,m)=zln(l,m)-zln(l,n)*diag(loc)
4994 end subroutine invxx
4998 subroutine sxpdot(ndeg,bi,b,zln,colno,ks,ke)
5002 integer(kind=kint),
intent(in) :: colno(*)
5003 real(kind=
kreal),
intent(in) :: zln(ndeg,ndeg,*),b(ndeg,*)
5004 real(kind=
kreal),
intent(out) :: bi(ndeg)
5005 integer(kind=kint),
intent(in) :: ndeg,ks,ke
5007 integer(kind=kint) :: j,jj,m,n
5022 bi(n)=bi(n)-zln(n,m,jj)*b(m,j)
5027 end subroutine sxpdot
5031 subroutine sxum(ic,xlnzr,colno,zln,diag,nch,par,neqns,ndeg,ndegl)
5035 integer(kind=kint),
intent(in) :: xlnzr(*),colno(*),par(*)
5036 integer(kind=kint),
intent(out) :: nch(*)
5037 real(kind=
kreal),
intent(out) :: zln(ndeg,ndeg,*),diag(ndegl,*)
5038 integer(kind=kint),
intent(in) :: ic,neqns,ndeg,ndegl
5040 real(kind=
kreal) :: zz(ndeg,ndeg),t(ndegl)
5041 integer(kind=kint) :: i,j,k,l,m,n,ndeg22,ks,ke,jc,loc,jj,kk,ir, ierr
5042 real(kind=
kreal),
allocatable :: temp(:,:,:)
5043 integer(kind=kint),
allocatable :: indx(:)
5046 allocate(temp(ndeg,ndeg,neqns),indx(neqns), stat=ierr)
5047 if(ierr .ne. 0)
then
5048 call errtrp(
'stop due to allocation error.')
5059 do jj=xlnzr(jc),xlnzr(jc+1)-1
5061 if(indx(j).eq.ic)
then
5065 zz(n,m)=zz(n,m)-temp(n,kk,j)*zln(m,kk,jj)
5071 call invxx(zln(1,1,k),zz,diag(1,jc),ndeg)
5078 t(loc)=t(loc)+zz(n,kk)*zln(m,kk,k)
5083 diag(:,ic)=diag(:,ic)-t
5084 call invx(diag(1,ic),ndeg,ir)
5093 subroutine sxum1(ic,xlnzr,colno,zln,diag,nch,par,neqns,ndeg,ndegl)
5097 integer(kind=kint),
intent(in) :: xlnzr(*),colno(*),nch(*),par(*)
5098 real(kind=
kreal),
intent(in) :: diag(ndegl,*)
5099 real(kind=
kreal),
intent(out) :: zln(ndeg,ndeg,*)
5100 integer(kind=kint),
intent(in) :: ic,neqns,ndeg,ndegl
5102 real(kind=
kreal) :: s(ndeg,ndeg)
5103 integer(kind=kint) :: i,j,k,l,m,n,ks,ke,jc,jj,kk, ierr
5104 real(kind=
kreal),
allocatable :: temp(:,:,:)
5105 integer(kind=kint),
allocatable :: indx(:)
5107 allocate(temp(ndeg,ndeg,neqns),indx(neqns), stat=ierr)
5108 if(ierr .ne. 0)
then
5109 call errtrp(
'stop due to allocation error.')
5121 do jj=xlnzr(jc),xlnzr(jc+1)-1
5123 if(indx(j).eq.ic)
then
5127 s(n,m)=s(n,m)+temp(n,kk,j)*zln(m,kk,jj)
5135 temp(n,m,jc)=zln(n,m,k)-s(n,m)
5136 zln(n,m,k)=temp(n,m,jc)
5142 end subroutine sxum1
5146 subroutine sxum2_child(neqns,nstop,xlnzr,colno,zln,diag,spdslnidx,spdslnval,nspdsln,ndeg,ndegl)
5150 integer(kind=kint),
intent(in) :: neqns, nstop
5151 integer(kind=kint),
intent(in) :: xlnzr(*),colno(*)
5152 real(kind=
kreal),
intent(inout) :: zln(ndeg,ndeg,*),diag(ndegl,*)
5153 integer(kind=kint),
pointer :: spdslnidx(:)
5154 real(kind=
kreal),
pointer :: spdslnval(:,:)
5155 integer(kind=kint),
intent(out) :: nspdsln
5156 integer(kind=kint),
intent(in) :: ndeg, ndegl
5158 integer(kind=kint) :: i,j,k,l,m,n, ic,ks,ke,ii,jj,jc,j1,j2,loc,locd,kk, ierr
5159 integer(kind=kint) :: ispdsln
5160 real(kind=
kreal),
allocatable :: temp(:,:,:)
5161 integer(kind=kint),
allocatable :: indx(:)
5164 allocate(temp(ndeg,ndeg,neqns),indx(neqns), stat=ierr)
5165 if(ierr .ne. 0)
then
5166 call errtrp(
'stop due to allocation error.')
5180 do jj=xlnzr(jc),xlnzr(jc+1)-1
5182 if(indx(j).eq.ic)
then
5189 allocate(spdslnidx(nspdsln),spdslnval(ndeg*ndeg,nspdsln), stat=ierr)
5190 if(ierr .ne. 0)
then
5191 call errtrp(
'stop due to allocation error.')
5205 temp(n,m,jj)=zln(n,m,k)
5212 call invxx(zln(1,1,k),temp(1,1,jj),diag(1,jj),ndeg)
5222 diag(locd,ic)=diag(locd,ic)-temp(n,kk,jj)*zln(m,kk,k)
5231 do jj=xlnzr(jc),xlnzr(jc+1)-1
5233 if(indx(j).eq.ic)
then
5238 spdslnidx(ispdsln)=loc
5242 spdslnval(ndeg*(m-1)+n,ispdsln)=spdslnval(ndeg*(m-1)+n,ispdsln)-temp(n,k,j)*zln(m,k,jj)
5252 end subroutine sxum2_child
5256 subroutine sxum3(neqns,dsln,diag,ndeg,ndegl)
5260 real(kind=
kreal),
intent(inout):: dsln(ndeg,ndeg,*),diag(ndegl,*)
5261 integer(kind=kint),
intent(in) :: neqns, ndeg, ndegl
5263 integer(kind=kint) :: loc, locd, ir, i,j,n,m, ierr
5264 integer(kind=kint),
allocatable :: indx(:)
5265 real(kind=
kreal),
allocatable :: temp(:,:,:)
5266 real(kind=
kreal),
allocatable :: t(:,:)
5268 allocate(indx(neqns),temp(ndeg,ndeg,neqns),t(ndeg,ndeg), stat=ierr)
5269 if(ierr .ne. 0)
then
5270 call errtrp(
'stop due to allocation error.')
5273 if(neqns.le.0)
goto 1000
5276 call invx(diag(1,1),ndeg,ir)
5280 call dxdot(ndeg,t,dsln(1,1,indx(i)),dsln(1,1,indx(j)),j-1)
5283 dsln(n,m,loc)=dsln(n,m,loc)-t(n,m)
5288 call vxprod(ndeg,ndegl,dsln(1,1,indx(i)),diag,temp,i-1)
5289 call dxdotl(ndeg,t,temp,dsln(1,1,indx(i)),i-1)
5294 diag(locd,i)=diag(locd,i)-t(n,m)
5297 call vcopy(temp,dsln(1,1,indx(i)),ndeg*ndeg*(i-1))
5298 call invx(diag(1,i),ndeg,ir)
5302 end subroutine sxum3
5305 subroutine vcopy(a,c,n)
5308 integer(kind=kint) :: n
5309 real(kind=
kreal) :: a(n),c(n)
5315 end subroutine vcopy
5319 subroutine verif0(neqns,ndeg,nttbr,irow,jcol,val,rhs,x)
5323 integer(kind=kint),
intent(in) :: irow(*),jcol(*)
5324 integer(kind=kint),
intent(in) :: neqns,ndeg,nttbr
5325 real(kind=
kreal),
intent(in) :: val(ndeg,ndeg,*),x(ndeg,*)
5326 real(kind=
kreal),
intent(out) :: rhs(ndeg,*)
5328 integer(kind=kint) :: i,j,k,l,m
5329 real(kind=
kreal) :: rel,err
5340 rel=rel+dabs(rhs(l,i))
5348 rhs(l,i)=rhs(l,i)-val(l,m,k)*x(m,j)
5349 if(i.ne.j) rhs(l,j)=rhs(l,j)-val(m,l,k)*x(m,i)
5356 err=err+dabs(rhs(l,i))
5359 if (m_pds_procinfo%myid .eq. 0)
then
5360 write(imsg,6000) err,rel,err/rel
5362 6000
format(
' ***verification***(symmetric)'/&
5363 &
'norm(Ax-b) = ',1pd20.10/&
5364 &
'norm(b) = ',1pd20.10/&
5365 &
'norm(Ax-b)/norm(b) = ',1pd20.10)
5366 6010
format(1p4d15.7)
5368 end subroutine verif0
5372 subroutine vxprod(ndeg,ndegl,zln,diag,zz,n)
5376 real(kind=
kreal),
intent(in) :: zln(ndeg*ndeg,n),diag(ndegl,n)
5377 real(kind=
kreal),
intent(out) :: zz(ndeg*ndeg,n)
5378 integer(kind=kint),
intent(in) :: ndeg,ndegl,n
5380 integer(kind=kint) :: i
5383 call invxx(zz(1,i),zln(1,i),diag(1,i),ndeg)
5386 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
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)