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
1974 subroutine nusol2_parent(dsln, diag, b, neqns)
1980 real(kind=
kreal),
intent(in) :: dsln(:,:)
1981 real(kind=
kreal),
intent(in) :: diag(:,:)
1982 real(kind=
kreal),
intent(inout) :: b(:,:)
1983 integer(kind=kint),
intent(in) :: neqns
1985 integer(kind=kint) :: i,j,k,l,loc
1993 call d2sdot(b(:,i),b,dsln(:, k:k+i-2),i-1)
2001 b(2,i)=b(2,i)-b(1,i)*diag(2,i)
2002 b(1,i)=b(1,i)*diag(1,i)
2003 b(2,i)=b(2,i)*diag(3,i)
2004 b(1,i)=b(1,i)-b(2,i)*diag(2,i)
2012 loc=(neqns-1)*neqns/2
2015 b(1,j)=b(1,j)-b(1,i)*dsln(1,loc)-b(2,i)*dsln(2,loc)
2016 b(2,j)=b(2,j)-b(1,i)*dsln(3,loc)-b(2,i)*dsln(4,loc)
2023 end subroutine nusol2_parent
2027 subroutine nusol3_parent(dsln, diag, b, neqns)
2033 real(kind=
kreal),
intent(in) :: dsln(:,:)
2034 real(kind=
kreal),
intent(in) :: diag(:,:)
2035 real(kind=
kreal),
intent(inout) :: b(:,:)
2036 integer(kind=kint),
intent(in) :: neqns
2038 integer(kind=kint) :: i,j,k,l,loc
2046 call d3sdot(b(:,i),b,dsln(:, k:k+i-2),i-1)
2054 b(2,i)=b(2,i)-b(1,i)*diag(2,i)
2055 b(3,i)=b(3,i)-b(1,i)*diag(4,i)-b(2,i)*diag(5,i)
2056 b(1,i)=b(1,i)*diag(1,i)
2057 b(2,i)=b(2,i)*diag(3,i)
2058 b(3,i)=b(3,i)*diag(6,i)
2059 b(2,i)=b(2,i)-b(3,i)*diag(5,i)
2060 b(1,i)=b(1,i)-b(2,i)*diag(2,i)-b(3,i)*diag(4,i)
2068 loc=(neqns-1)*neqns/2
2071 b(1,j)=b(1,j)-b(1,i)*dsln(1,loc)-b(2,i)*dsln(2,loc)-b(3,i)*dsln(3,loc)
2072 b(2,j)=b(2,j)-b(1,i)*dsln(4,loc)-b(2,i)*dsln(5,loc)-b(3,i)*dsln(6,loc)
2073 b(3,j)=b(3,j)-b(1,i)*dsln(7,loc)-b(2,i)*dsln(8,loc)-b(3,i)*dsln(9,loc)
2079 end subroutine nusol3_parent
2083 subroutine nusolx_parent (dsln,diag,b,neqns,ndeg)
2087 real(kind=
kreal),
intent(in) :: diag(:,:), dsln(:,:)
2088 real(kind=
kreal),
intent(inout) :: b(:,:)
2089 integer(kind=kint),
intent(in) :: neqns, ndeg
2091 integer(kind=kint) :: i,j,k,l,m,n,loc, locd, loc1
2096 call dxsdot(ndeg,b(:,i),b,dsln(:,k:k+i-2),i-1)
2106 b(n,i)=b(n,i)-b(m,i)*diag(loc1,i)
2114 b(m,i)=b(m,i)*diag(locd,i)
2120 b(m,i)=b(m,i)-b(n,i)*diag(locd,i)
2126 loc=(neqns-1)*neqns/2
2131 b(m,j)=b(m,j)-b(n,i)*dsln((m-1)*ndeg+n,loc)
2138 end subroutine nusolx_parent
2142 subroutine s3um2_child(neqns,nstop,xlnzr,colno,zln,diag,spdslnidx,spdslnval,nspdsln)
2146 integer(kind=kint),
intent(in) :: neqns, nstop
2147 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:)
2148 real(kind=
kreal),
intent(inout) :: zln(:,:),diag(:,:)
2149 integer(kind=kint),
pointer :: spdslnidx(:)
2150 real(kind=
kreal),
pointer :: spdslnval(:,:)
2151 integer(kind=kint),
intent(out) :: nspdsln
2153 real(kind=
kreal),
allocatable :: temp(:,:)
2154 integer(kind=kint),
allocatable :: indx(:)
2156 integer(kind=kint) :: i,j,k,l,m,n, ic,ks,ke,ii,jj,jc,j1,j2,loc,ispdsln, ierr
2158 allocate(temp(neqns,9),indx(neqns), stat=ierr)
2159 if(ierr .ne. 0)
then
2160 call errtrp(
'stop due to allocation error.')
2174 do jj=xlnzr(jc),xlnzr(jc+1)-1
2176 if(indx(j).eq.ic)
then
2183 allocate(spdslnidx(nspdsln), stat=ierr)
2184 if(ierr .ne. 0)
then
2185 call errtrp(
'stop due to allocation error.')
2187 allocate(spdslnval(9,nspdsln), stat=ierr)
2188 if(ierr .ne. 0)
then
2189 call errtrp(
'stop due to allocation error.')
2196 do 100 ic=nstop,neqns
2218 zln(4,k)=temp(jj,4)-temp(jj,1)*diag(2,jj)
2219 zln(7,k)=temp(jj,7)-temp(jj,1)*diag(4,jj)-zln(4,k)*diag(5,jj)
2220 zln(1,k)=temp(jj,1)*diag(1,jj)
2221 zln(4,k)=zln(4,k)*diag(3,jj)
2222 zln(7,k)=zln(7,k)*diag(6,jj)
2223 zln(4,k)=zln(4,k)-zln(7,k)*diag(5,jj)
2224 zln(1,k)=zln(1,k)-zln(4,k)*diag(2,jj)-zln(7,k)*diag(4,jj)
2226 zln(5,k)=temp(jj,5)-temp(jj,2)*diag(2,jj)
2227 zln(8,k)=temp(jj,8)-temp(jj,2)*diag(4,jj)-zln(5,k)*diag(5,jj)
2228 zln(2,k)=temp(jj,2)*diag(1,jj)
2229 zln(5,k)=zln(5,k)*diag(3,jj)
2230 zln(8,k)=zln(8,k)*diag(6,jj)
2231 zln(5,k)=zln(5,k)-zln(8,k)*diag(5,jj)
2232 zln(2,k)=zln(2,k)-zln(5,k)*diag(2,jj)-zln(8,k)*diag(4,jj)
2234 zln(6,k)=temp(jj,6)-temp(jj,3)*diag(2,jj)
2235 zln(9,k)=temp(jj,9)-temp(jj,3)*diag(4,jj)-zln(6,k)*diag(5,jj)
2236 zln(3,k)=temp(jj,3)*diag(1,jj)
2237 zln(6,k)=zln(6,k)*diag(3,jj)
2238 zln(9,k)=zln(9,k)*diag(6,jj)
2239 zln(6,k)=zln(6,k)-zln(9,k)*diag(5,jj)
2240 zln(3,k)=zln(3,k)-zln(6,k)*diag(2,jj)-zln(9,k)*diag(4,jj)
2247 diag(1,ic)=diag(1,ic)-temp(jj,1)*zln(1,k)-temp(jj,4)*zln(4,k)-temp(jj,7)*zln(7,k)
2248 diag(2,ic)=diag(2,ic)-temp(jj,1)*zln(2,k)-temp(jj,4)*zln(5,k)-temp(jj,7)*zln(8,k)
2249 diag(3,ic)=diag(3,ic)-temp(jj,2)*zln(2,k)-temp(jj,5)*zln(5,k)-temp(jj,8)*zln(8,k)
2250 diag(4,ic)=diag(4,ic)-temp(jj,1)*zln(3,k)-temp(jj,4)*zln(6,k)-temp(jj,7)*zln(9,k)
2251 diag(5,ic)=diag(5,ic)-temp(jj,2)*zln(3,k)-temp(jj,5)*zln(6,k)-temp(jj,8)*zln(9,k)
2252 diag(6,ic)=diag(6,ic)-temp(jj,3)*zln(3,k)-temp(jj,6)*zln(6,k)-temp(jj,9)*zln(9,k)
2254 do 120 jc=nstop,ic-1
2258 do 220 jj=xlnzr(jc),xlnzr(jc+1)-1
2260 if(indx(j).eq.ic)
then
2265 spdslnidx(ispdsln)=loc
2266 spdslnval(1,ispdsln)=spdslnval(1,ispdsln)-temp(j,1)*zln(1,jj)-temp(j,4)*zln(4,jj)-temp(j,7)*zln(7,jj)
2267 spdslnval(2,ispdsln)=spdslnval(2,ispdsln)-temp(j,2)*zln(1,jj)-temp(j,5)*zln(4,jj)-temp(j,8)*zln(7,jj)
2268 spdslnval(3,ispdsln)=spdslnval(3,ispdsln)-temp(j,3)*zln(1,jj)-temp(j,6)*zln(4,jj)-temp(j,9)*zln(7,jj)
2269 spdslnval(4,ispdsln)=spdslnval(4,ispdsln)-temp(j,1)*zln(2,jj)-temp(j,4)*zln(5,jj)-temp(j,7)*zln(8,jj)
2270 spdslnval(5,ispdsln)=spdslnval(5,ispdsln)-temp(j,2)*zln(2,jj)-temp(j,5)*zln(5,jj)-temp(j,8)*zln(8,jj)
2271 spdslnval(6,ispdsln)=spdslnval(6,ispdsln)-temp(j,3)*zln(2,jj)-temp(j,6)*zln(5,jj)-temp(j,9)*zln(8,jj)
2272 spdslnval(7,ispdsln)=spdslnval(7,ispdsln)-temp(j,1)*zln(3,jj)-temp(j,4)*zln(6,jj)-temp(j,7)*zln(9,jj)
2273 spdslnval(8,ispdsln)=spdslnval(8,ispdsln)-temp(j,2)*zln(3,jj)-temp(j,5)*zln(6,jj)-temp(j,8)*zln(9,jj)
2274 spdslnval(9,ispdsln)=spdslnval(9,ispdsln)-temp(j,3)*zln(3,jj)-temp(j,6)*zln(6,jj)-temp(j,9)*zln(9,jj)
2281 end subroutine s3um2_child
2285 subroutine zpivot(neqns,neqnsz,nttbr,jcol,irow,zpiv,ir)
2289 integer(kind=kint),
intent(in) :: jcol(:),irow(:)
2290 integer(kind=kint),
intent(out) :: zpiv(:)
2291 integer(kind=kint),
intent(in) :: neqns,nttbr
2292 integer(kind=kint),
intent(out) :: neqnsz,ir
2294 integer(kind=kint) :: i,j,k,l
2304 if(i.le.0.or.j.le.0)
then
2307 elseif(i.gt.neqns.or.j.gt.neqns)
then
2311 if(i.eq.j) zpiv(i)=0
2315 if(zpiv(i).eq.0)
then
2322 if(ldbg)
write(idbg,*)
'# zpivot ########################'
2323 if(ldbg)
write(idbg,60) (zpiv(i),i=1,neqns)
2326 end subroutine zpivot
2330 subroutine stsmat(neqns,nttbr,irow,jcol,jcpt,jcolno)
2334 integer(kind=kint),
intent(in) :: irow(:), jcol(:)
2335 integer(kind=kint),
intent(out) :: jcpt(:), jcolno(:)
2336 integer(kind=kint),
intent(in) :: neqns, nttbr
2338 integer(kind=kint) :: i,j,k,l,loc,locr
2357 if(loc.eq.0)
goto 120
2358 if(jcolno(loc).eq.j)
then
2360 elseif(jcolno(loc).gt.j)
then
2380 if(loc.eq.0)
goto 170
2381 if(jcolno(loc).eq.i)
then
2383 elseif(jcolno(loc).gt.i)
then
2401 write(idbg,*)
'jcolno'
2402 write(idbg,60) (jcolno(i),i=1,k)
2403 write(idbg,*)
'jcpt'
2404 write(idbg,60) (jcpt(i),i=1,k)
2408 end subroutine stsmat
2411 subroutine stiaja(neqns,neqnsz,ia,ja,jcpt,jcolno)
2417 integer(kind=kint),
intent(in) :: jcpt(:),jcolno(:)
2418 integer(kind=kint),
intent(out) :: ia(:),ja(:)
2419 integer(kind=kint),
intent(in) :: neqns, neqnsz
2421 integer(kind=kint) :: i,j,k,l,ii,loc
2429 if(loc.eq.0)
goto 120
2431 if(ii.eq.k.or.ii.gt.neqnsz)
goto 130
2440 write(idbg,*)
'stiaja(): ia '
2441 write(idbg,60) (ia(i),i=1,neqns+1)
2442 write(idbg,*)
'stiaja(): ja '
2443 write(idbg,60) (ja(i),i=1,ia(neqns+1))
2447 end subroutine stiaja
2451 subroutine idntty(neqns,invp,iperm)
2455 integer(kind=kint),
intent(out) :: invp(:),iperm(:)
2456 integer(kind=kint),
intent(in) :: neqns
2458 integer(kind=kint) :: i
2469 subroutine genqmd(neqns,xadj,adj0,perm,invp,deg,marker,rchset,nbrhd,qsize,qlink,nofsub,adjncy)
2473 integer(kind=kint),
intent(in) :: adj0(:),xadj(:)
2474 integer(kind=kint),
intent(out) :: rchset(:),nbrhd(:),adjncy(:),perm(:),invp(:),deg(:),marker(:),qsize(:),qlink(:)
2475 integer(kind=kint),
intent(in) :: neqns
2476 integer(kind=kint),
intent(out) :: nofsub
2478 integer(kind=kint) :: inode,ip,irch,mindeg,nhdsze,node,np,num,nump1,nxnode,rchsze,search,thresh,ndeg
2479 integer(kind=kint) :: i,j,k,l
2483 do 10 i=1,xadj(neqns+1)-1
2492 ndeg=xadj(node+1)-xadj(node)
2494 if(ndeg.lt.mindeg) mindeg=ndeg
2502 if(nump1.gt.search) search=nump1
2503 do 400 j=search,neqns
2505 if(marker(node).lt.0)
goto 400
2507 if(ndeg.le.thresh)
goto 500
2508 if(ndeg.lt.mindeg) mindeg=ndeg
2513 nofsub=nofsub+deg(node)
2515 call qmdrch(node,xadj,adjncy,deg,marker,rchsze,rchset,nhdsze,nbrhd)
2525 nxnode=qlink(nxnode)
2526 if(nxnode.gt.0)
goto 600
2527 if(rchsze.le.0)
goto 800
2529 call qmdupd(xadj,adjncy,rchsze,rchset,deg,qsize,qlink,marker,rchset(rchsze+1:),nbrhd(nhdsze+1:))
2531 do 700 irch=1,rchsze
2533 if(marker(inode).lt.0)
goto 700
2536 if(ndeg.lt.mindeg) mindeg=ndeg
2537 if(ndeg.gt.thresh)
goto 700
2542 if(nhdsze.gt.0)
call qmdot(node,xadj,adjncy,marker,rchsze,rchset,nbrhd)
2543 800
if(num.lt.neqns)
goto 300
2545 end subroutine genqmd
2549 subroutine genpaq(xadj,adjncy,invp,iperm,parent,neqns,ancstr)
2553 integer(kind=kint),
intent(in) :: xadj(:),adjncy(:),invp(:),iperm(:)
2554 integer(kind=kint),
intent(out) :: parent(:),ancstr(:)
2555 integer(kind=kint),
intent(in) :: neqns
2557 integer(kind=kint) :: i,j,k,l,ip,it
2563 do 110 k=xadj(ip),xadj(ip+1)-1
2567 if(ancstr(l).eq.0)
goto 111
2568 if(ancstr(l).eq.i)
goto 110
2579 if(parent(i).eq.0) parent(i)=neqns+1
2582 if(ldbg)
write(idbg,6010)
2583 if(ldbg)
write(idbg,6000) (i,parent(i),i=1,neqns)
2585 6010
format(
' parent')
2587 end subroutine genpaq
2591 subroutine genbtq(xadj,adjncy,invp,iperm,parent,btree,zpiv,izz,neqns)
2595 integer(kind=kint),
intent(in) :: xadj(:),adjncy(:),parent(:),invp(:),iperm(:),zpiv(:)
2596 integer(kind=kint),
intent(out) :: btree(:,:)
2597 integer(kind=kint),
intent(in) :: neqns
2598 integer(kind=kint),
intent(out) :: izz
2600 integer(kind=kint) :: i,j,k,l,ip,ib,inext
2608 if(ip.le.0)
goto 100
2627 if(zpiv(i).ne.0)
then
2628 if(btree(1,invp(i)).eq.0)
then
2636 if(ldbg)
write(idbg,6010)
2637 if(ldbg)
write(idbg,6000) (i,btree(1,i),btree(2,i),i=1,neqns)
2638 if(ldbg)
write(idbg,6020) izz
2641 6000
format(i6,
'(',2i6,
')')
2642 6010
format(
' binary tree')
2643 6020
format(
' the first zero pivot is ',i4)
2646 end subroutine genbtq
2650 subroutine rotate(xadj,adjncy,invp,iperm,parent,btree,izz,neqns,anc,adjt,irr)
2654 integer(kind=kint),
intent(in) :: xadj(:),adjncy(:),parent(:),btree(:,:)
2655 integer(kind=kint),
intent(out) :: anc(:),adjt(:),invp(:),iperm(:)
2656 integer(kind=kint),
intent(in) :: neqns,izz
2657 integer(kind=kint),
intent(out) :: irr
2659 integer(kind=kint) :: i,j,k,l,izzz,nanc,loc,locc,ll,kk,iy
2672 if(btree(1,izzz).ne.0)
then
2686 if(loc.ne.0)
goto 100
2700 if(locc.ne.0)
goto 220
2702 do 240 k=xadj(iperm(loc)),xadj(iperm(loc)+1)-1
2703 adjt(invp(adjncy(k)))=1
2705 if(loc.ge.anc(l))
goto 250
2707 if(locc.ne.0)
goto 220
2712 if(adjt(anc(ll)).eq.0)
then
2732 if(adjt(ll).eq.0)
then
2746 if(locc.ne.0)
goto 350
2748 do 370 kk=xadj(iperm(loc)),xadj(iperm(loc)+1)-1
2749 adjt(invp(adjncy(kk)))=1
2751 if(loc.ge.iy)
goto 380
2753 if(locc.ne.0)
goto 350
2758 if(adjt(anc(ll)).eq.0)
then
2760 invp(iperm(anc(ll)))=k
2765 if(adjt(anc(ll)).ne.0)
then
2767 invp(iperm(anc(ll)))=k
2777 if(i.eq.izzz)
goto 510
2781 invp(iperm(izzz))=neqns
2789 if(ldbg)
write(idbg,6000) (invp(i),i=1,neqns)
2792 end subroutine rotate
2796 subroutine bringu(zpiv,iperm,invp,parent,izz,neqns,irr)
2800 integer(kind=kint),
intent(in) :: zpiv(:),parent(:)
2801 integer(kind=kint),
intent(out) :: iperm(:),invp(:)
2802 integer(kind=kint),
intent(in) :: neqns,izz
2803 integer(kind=kint),
intent(out) :: irr
2805 integer(kind=kint) :: i,j,k,l,ib0,ib,ibp,izzp
2823 if(ib.le.0)
goto 1000
2826 if(zpiv(izzp).eq.0)
goto 110
2836 if(invp(iperm(i)).ne.i)
goto 210
2837 if(iperm(invp(i)).ne.i)
goto 210
2841 write(20,*)
'permutation error'
2848 end subroutine bringu
2852 subroutine posord(parent,btree,invp,iperm,pordr,nch,neqns,iw,qarent,mch)
2856 integer(kind=kint),
intent(in) :: btree(:,:),qarent(:)
2857 integer(kind=kint),
intent(out) :: pordr(:),invp(:),iperm(:),nch(:),iw(:),parent(:),mch(0:neqns+1)
2858 integer(kind=kint),
intent(in) :: neqns
2860 integer(kind=kint) :: i,j,k,l,locc,loc,locp,invpos,ipinv,ii
2871 if(locc.ne.0)
goto 10
2873 mch(locp)=mch(locp)+1
2876 if(l.ge.neqns)
goto 1000
2879 if(locc.ne.0)
goto 10
2882 mch(locp)=mch(locp)+mch(loc)+1
2886 ipinv=pordr(invp(i))
2895 if(ii.gt.0.and.ii.le.neqns)
then
2898 parent(i)=qarent(invpos)
2901 if(ldbg)
write(idbg,6020)
2902 if(ldbg)
write(idbg,6000) (pordr(i),i=1,neqns)
2903 if(ldbg)
write(idbg,6030)
2904 if(ldbg)
write(idbg,6050)
2905 if(ldbg)
write(idbg,6000) (parent(i),i=1,neqns)
2906 if(ldbg)
write(idbg,6000) (invp(i),i=1,neqns)
2907 if(ldbg)
write(idbg,6040)
2908 if(ldbg)
write(idbg,6000) (iperm(i),i=1,neqns)
2909 if(ldbg)
write(idbg,6010)
2910 if(ldbg)
write(idbg,6000) (nch(i),i=1,neqns)
2913 6020
format(
' post order')
2914 6030
format(/
' invp ')
2915 6040
format(/
' iperm ')
2916 6050
format(/
' parent')
2918 end subroutine posord
2922 subroutine gnleaf(xadj,adjncy,invp,iperm,pordr,nch,adjncp,xleaf,leaf,neqns,lnleaf)
2926 integer(kind=kint),
intent(in) :: xadj(:),adjncy(:),pordr(:),nch(:),invp(:),iperm(:)
2927 integer(kind=kint),
intent(out) :: xleaf(:),leaf(:),adjncp(:)
2928 integer(kind=kint),
intent(in) :: neqns
2930 integer(kind=kint) i,j,k,l,m,n,ik,istart,ip,iq,lnleaf,lc1,lc
2938 do 105 k=xadj(ip),xadj(ip+1)-1
2947 call qqsort(adjncp(istart+1:),m)
2948 lc1=adjncp(istart+1)
2949 if(lc1.ge.i)
goto 100
2952 do 130 k=istart+2,ik
2955 if(lc1.lt.lc-nch(lc))
then
2968 if(ldbg)
write(idbg,6020)
2969 if(ldbg)
write(idbg,6000) (xleaf(i),i=1,neqns+1)
2970 if(ldbg)
write(idbg,6010) lnleaf
2971 if(ldbg)
write(idbg,6000) (leaf(i),i=1,lnleaf)
2974 6010
format(
' leaf (len = ',i6,
')')
2975 6020
format(
' xleaf')
2976 end subroutine gnleaf
2980 subroutine countclno(parent,xleaf,leaf,neqns,nstop,lncol,ir)
2990 integer(kind=kint),
intent(in) :: parent(:),xleaf(:),leaf(:)
2991 integer(kind=kint),
intent(in) :: neqns, nstop
2992 integer(kind=kint),
intent(out) :: lncol, ir
2994 integer(kind=kint) :: i,j,k,l,nc,ks,ke,nxleaf
3002 if(ke.lt.ks)
goto 100
3008 if(j.ge.nxleaf)
goto 110
3018 if(j.ge.nstop)
goto 100
3019 if(j.ge.i.or.j.eq.0)
goto 100
3026 end subroutine countclno
3030 subroutine gnclno(parent,pordr,xleaf,leaf,xlnzr,colno,neqns,nstop,lncol,ir)
3034 integer(kind=kint),
intent(in) :: parent(:),pordr(:),xleaf(:),leaf(:)
3035 integer(kind=kint),
intent(out) :: colno(:),xlnzr(:)
3036 integer(kind=kint),
intent(in) :: neqns, nstop
3037 integer(kind=kint),
intent(out) :: lncol,ir
3039 integer(kind=kint) :: i,j,k,l,nc,ks,ke,nxleaf
3048 if(ke.lt.ks)
goto 100
3054 if(j.ge.nxleaf)
goto 110
3065 if(j.ge.nstop)
goto 100
3066 if(j.ge.i.or.j.eq.0)
goto 100
3074 if(ldbg)
write(idbg,6010)
3076 if(ldbg)
write(idbg,6020) lncol
3080 write(idbg,6000) (colno(i),i=xlnzr(k),xlnzr(k+1)-1)
3084 6010
format(
' xlnzr')
3085 6020
format(
' colno (lncol =',i10,
')')
3086 6100
format(/
' row = ',i6)
3088 end subroutine gnclno
3092 subroutine qmdrch(root,xadj,adjncy,deg,marker,rchsze,rchset,nhdsze,nbrhd)
3096 integer(kind=kint),
intent(in) :: deg(:),xadj(:),adjncy(:)
3097 integer(kind=kint),
intent(out) :: rchset(:),marker(:),nbrhd(:)
3098 integer(kind=kint),
intent(in) :: root
3099 integer(kind=kint),
intent(out) :: nhdsze,rchsze
3101 integer(kind=kint) :: i,j,k,l, istrt, istop, jstrt, jstop, nabor, node
3106 istop=xadj(root+1)-1
3107 if(istop.lt.istrt)
return
3108 do 600 i=istrt,istop
3110 if(nabor.eq.0)
return
3111 if(marker(nabor).ne.0)
goto 600
3112 if(deg(nabor).lt.0)
goto 200
3114 rchset(rchsze)=nabor
3117 200 marker(nabor)=-1
3120 300 jstrt=xadj(nabor)
3121 jstop=xadj(nabor+1)-1
3122 do 500 j=jstrt,jstop
3128 elseif(node==0)
then
3131 400
if(marker(node).ne.0)
goto 500
3138 end subroutine qmdrch
3142 subroutine qmdupd(xadj,adjncy,nlist,list,deg,qsize,qlink,marker,rchset,nbrhd)
3146 integer(kind=kint),
intent(in) :: adjncy(:),list(:),xadj(:)
3147 integer(kind=kint),
intent(out) :: marker(:),nbrhd(:),rchset(:),deg(:),qsize(:),qlink(:)
3148 integer(kind=kint),
intent(in) :: nlist
3150 integer(kind=kint) :: i,j,k,l, deg0,deg1,il,inhd,inode,irch,jstrt,jstop,mark,nabor,nhdsze,node,rchsze
3152 if(nlist.le.0)
return
3157 deg0=deg0+qsize(node)
3159 jstop=xadj(node+1)-1
3161 do 100 j=jstrt,jstop
3163 if(marker(nabor).ne.0.or.deg(nabor).ge.0)
goto 100
3170 if(nhdsze.gt.0)
call qmdmrg(xadj,adjncy,deg,qsize,qlink,marker,deg0,nhdsze,nbrhd,rchset,nbrhd(nhdsze+1:))
3174 if(mark.gt.1.or.mark.lt.0)
goto 600
3175 call qmdrch(node,xadj,adjncy,deg,marker,rchsze,rchset,nhdsze,nbrhd)
3177 if(rchsze.le.0)
goto 400
3178 do 300 irch=1,rchsze
3180 deg1=deg1+qsize(inode)
3183 400 deg(node)=deg1-1
3184 if(nhdsze.le.0)
goto 600
3185 do 500 inhd=1,nhdsze
3191 endsubroutine qmdupd
3195 subroutine qmdot(root,xadj,adjncy,marker,rchsze,rchset,nbrhd)
3199 integer(kind=kint),
intent(in) :: marker(:),rchset(:),nbrhd(:),xadj(:)
3200 integer(kind=kint),
intent(out) :: adjncy(:)
3201 integer(kind=kint),
intent(in) :: rchsze,root
3203 integer(kind=kint) :: i,j,k,l,irch,inhd,node,jstrt,jstop,link,nabor
3208 100 jstrt=xadj(node)
3209 jstop=xadj(node+1)-2
3210 if(jstop.lt.jstrt)
goto 300
3211 do 200 j=jstrt,jstop
3213 adjncy(j)=rchset(irch)
3214 if(irch.ge.rchsze)
goto 400
3216 300 link=adjncy(jstop+1)
3218 if(link.lt.0)
goto 100
3221 adjncy(jstop+1)=-node
3224 do 600 irch=1,rchsze
3226 if(marker(node).lt.0)
goto 600
3228 jstop=xadj(node+1)-1
3229 do 500 j=jstrt,jstop
3231 if(marker(nabor).ge.0)
goto 500
3237 end subroutine qmdot
3241 subroutine qmdmrg(xadj,adjncy,deg,qsize,qlink,marker,deg0,nhdsze,nbrhd,rchset,ovrlp)
3245 integer(kind=kint),
intent(in) :: adjncy(:),nbrhd(:),xadj(:)
3246 integer(kind=kint),
intent(out) :: deg(:),marker(:),rchset(:),ovrlp(:),qsize(:),qlink(:)
3247 integer(kind=kint),
intent(in) :: nhdsze
3249 integer(kind=kint) :: i,j,k,l, deg0,deg1,head,inhd,iov,irch,jstrt,jstop,link,lnode,mark,mrgsze,nabor,node,novrlp,rchsze,root
3252 if(nhdsze.le.0)
return
3253 do 100 inhd=1,nhdsze
3257 do 1400 inhd=1,nhdsze
3263 200 jstrt=xadj(root)
3264 jstop=xadj(root+1)-1
3265 do 600 j=jstrt,jstop
3271 elseif(nabor==0)
then
3274 300 mark=marker(nabor)
3282 rchset(rchsze)=nabor
3283 deg1=deg1+qsize(nabor)
3286 500
if(mark.gt.1)
goto 600
3293 do 1100 iov=1,novrlp
3296 jstop=xadj(node+1)-1
3297 do 800 j=jstrt,jstop
3299 if(marker(nabor).ne.0)
goto 800
3303 mrgsze=mrgsze+qsize(node)
3306 900 link=qlink(lnode)
3307 if(link.le.0)
goto 1000
3310 1000 qlink(lnode)=head
3313 if(head.le.0)
goto 1200
3315 deg(head)=deg0+deg1-1
3317 1200 root=nbrhd(inhd)
3319 if(rchsze.le.0)
goto 1400
3320 do 1300 irch=1,rchsze
3326 end subroutine qmdmrg
3330 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)
3336 integer(kind=kint),
intent(in) :: xlnzr_a(:)
3337 integer(kind=kint),
intent(in) :: colno_a(:)
3338 integer(kind=kint),
intent(in) :: iperm_a(:)
3339 integer(kind=kint),
intent(in) :: invp_a(:)
3340 integer(kind=kint),
intent(in) :: ndeg
3341 integer(kind=kint),
intent(in) :: nttbr_c
3342 integer(kind=kint),
intent(in) :: irow_c(:)
3343 integer(kind=kint),
intent(inout) :: jcol_c(:)
3344 integer(kind=kint),
intent(in) :: ncol
3345 integer(kind=kint),
intent(in) :: nrow
3348 integer(kind=kint),
pointer :: xlnzr_c(:)
3349 integer(kind=kint),
pointer :: colno_c(:)
3350 integer(kind=kint),
intent(out) :: lncol_c
3353 integer(kind=kint) :: i,j,k,l,m,n
3354 integer(kind=kint) :: ks, ke, ipass, ierr
3355 logical,
allocatable :: cnz(:)
3356 type(crs_matrix) :: crs_c
3360 jcol_c(i)=invp_a(jcol_c(i))
3367 allocate(cnz(ncol), stat=ierr)
3368 if(ierr .ne. 0)
then
3369 call errtrp(
'stop due to allocation error.')
3377 ke = crs_c%ia(k+1)-1
3378 if (ke .lt. ks)
then
3379 if (ipass .eq. 2)
then
3380 xlnzr_c(k+1)=lncol_c+1
3386 cnz(crs_c%ja(i)) = .true.
3393 if (ke .lt. ks)
then
3397 if (cnz(colno_a(j)))
then
3406 lncol_c = lncol_c + 1
3407 if (ipass .eq. 2)
then
3408 colno_c(lncol_c) = i
3412 if (ipass .eq. 2)
then
3413 xlnzr_c(k+1)=lncol_c + 1
3417 if (ipass .eq. 1)
then
3418 allocate(xlnzr_c(nrow+1),colno_c(lncol_c), stat=ierr)
3419 if(ierr .ne. 0)
then
3420 call errtrp(
'stop due to allocation error.')
3428 jcol_c(i)=iperm_a(jcol_c(i))
3433 end subroutine ldudecomposec
3441 integer(kind=kint),
intent(out) :: iw(:)
3442 integer(kind=kint),
intent(in) :: ik
3444 integer(kind=kint) :: l,m,itemp
3458 if(iw(l).lt.iw(m))
goto 110
3471 subroutine staij1(isw,i,j,aij,dsi,ir)
3495 real(kind=
kreal),
intent(out) :: aij(:)
3496 integer(kind=kint),
intent(in) :: isw, i, j
3497 integer(kind=kint),
intent(out) :: ir
3499 integer(kind=kint) :: ndeg, neqns, nstop, ndeg2, ndeg2l, ierr
3504 ndeg2l=ndeg*(ndeg+1)/2
3511 if(dsi%stage.ne.20)
then
3512 if(dsi%stage.eq.30)
write(ilog,*)
'Warning a matrix was build up but never solved.'
3516 allocate(dsi%diag(ndeg2l,neqns), stat=ierr)
3517 if(ierr .ne. 0)
then
3518 call errtrp(
'stop due to allocation error.')
3524 allocate(dsi%zln(ndeg2,dsi%lncol), stat=ierr)
3525 if(ierr .ne. 0)
then
3526 call errtrp(
'stop due to allocation error.')
3540 call addr0(isw,i,j,aij,dsi%invp,dsi%xlnzr,dsi%colno,dsi%diag,dsi%zln,dsi%dsln,nstop,dsi%ndeg,ir)
3541 elseif(ndeg.eq.3)
then
3542 call addr3(isw,i,j,aij,dsi%invp,dsi%xlnzr,dsi%colno,dsi%diag,dsi%zln,dsi%dsln,nstop,ir)
3544 call addrx(isw,i,j,aij,dsi%invp,dsi%xlnzr,dsi%colno,dsi%diag,dsi%zln,dsi%dsln,nstop,ndeg,ndeg2,ndeg2l,ir)
3548 end subroutine staij1
3557 subroutine sum(ic,xlnzr,colno,zln,diag,nch,par,neqns)
3561 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),par(:)
3562 integer(kind=kint),
intent(in) :: ic, neqns
3563 real(kind=
kreal),
intent(inout) :: zln(:),diag(:)
3564 integer(kind=kint),
intent(out) :: nch(:)
3566 real(kind=
kreal) :: s, t, zz, piv
3567 integer(kind=kint) :: ks, ke, kk, k, jc, jj, j, ierr
3568 integer(kind=kint) :: isem
3569 real(kind=
kreal),
allocatable :: temp(:)
3570 integer(kind=kint),
allocatable :: indx(:)
3571 allocate(temp(neqns),indx(neqns), stat=ierr)
3572 if(ierr .ne. 0)
then
3573 call errtrp(
'stop due to allocation error.')
3589 do 310 jj=xlnzr(jc),xlnzr(jc+1)-1
3591 if(indx(j).eq.ic)
then
3605 if(dabs(piv).gt.rmin)
then
3624 subroutine sum1(ic,xlnzr,colno,zln,diag,par,neqns)
3628 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),par(:)
3629 integer(kind=kint),
intent(in) :: ic, neqns
3630 real(kind=
kreal),
intent(inout) :: zln(:),diag(:)
3632 real(kind=
kreal) :: s, t, zz
3633 integer(kind=kint) :: ks, ke, k, jc, j, jj, ierr
3634 real(kind=
kreal),
allocatable :: temp(:)
3635 integer(kind=kint),
allocatable :: indx(:)
3639 allocate(temp(neqns),indx(neqns), stat=ierr)
3640 if(ierr .ne. 0)
then
3641 call errtrp(
'stop due to allocation error.')
3654 do 310 jj=xlnzr(jc),xlnzr(jc+1)-1
3656 if(indx(j).eq.ic)
then
3675 subroutine sum2_child(neqns,nstop,xlnzr,colno,zln,diag,spdslnidx,spdslnval,nspdsln)
3679 integer(kind=kint),
intent(in) :: neqns, nstop
3680 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:)
3681 real(kind=
kreal),
intent(inout) :: zln(:),diag(:)
3682 integer(kind=kint),
pointer :: spdslnidx(:)
3683 real(kind=
kreal),
pointer :: spdslnval(:,:)
3684 integer(kind=kint),
intent(out) :: nspdsln
3686 real(kind=
kreal) :: s, t
3687 integer(kind=kint) :: ks, ke, kk, k, jc, jj, j, j1,j2
3688 integer(kind=kint) :: ic, i, loc, ierr
3689 integer(kind=kint) :: ispdsln
3691 real(kind=
kreal),
allocatable :: temp(:)
3692 integer(kind=kint),
allocatable :: indx(:)
3694 allocate(temp(neqns),indx(neqns), stat=ierr)
3695 if(ierr .ne. 0)
then
3696 call errtrp(
'stop due to allocation error.')
3710 do jj=xlnzr(jc),xlnzr(jc+1)-1
3712 if(indx(j).eq.ic)
then
3719 allocate(spdslnidx(nspdsln),spdslnval(1,nspdsln), stat=ierr)
3720 if(ierr .ne. 0)
then
3721 call errtrp(
'stop due to allocation error.')
3728 do 100 ic=nstop,neqns
3737 zln(k)=temp(jj)*diag(jj)
3739 diag(ic)=diag(ic)-temp(jj)*zln(k)
3741 do 120 jc=nstop,ic-1
3744 do 220 jj=xlnzr(jc),xlnzr(jc+1)-1
3746 if(indx(j).eq.ic)
then
3754 spdslnidx(ispdsln)=loc
3755 spdslnval(1,ispdsln)=spdslnval(1,ispdsln)-s
3763 end subroutine sum2_child
3767 subroutine sum3(n,dsln,diag)
3771 real(kind=
kreal),
intent(inout) :: dsln(:),diag(:)
3772 integer(kind=kint),
intent(in) :: n
3774 integer(kind=kint) :: i, j, loc, ierr
3775 real(kind=
kreal),
allocatable :: temp(:)
3776 integer(kind=kint),
allocatable :: indx(:)
3777 allocate(temp(n),indx(n), stat=ierr)
3778 if(ierr .ne. 0)
then
3779 call errtrp(
'stop due to allocation error.')
3782 if(n.le.0)
goto 1000
3785 diag(1)=1.0d0/diag(1)
3789 dsln(loc)=dsln(loc)-dot_product(dsln(indx(i):indx(i)+j-2),dsln(indx(j):indx(j)+j-2))
3792 temp(1:i-1)=dsln(indx(i):indx(i)+i-2)*diag(1:i-1)
3793 diag(i)=diag(i)-dot_product(temp(1:i-1),dsln(indx(i):indx(i)+i-2))
3794 dsln(indx(i):indx(i)+i-2)=temp(1:i-1)
3795 diag(i)=1.0d0/diag(i)
3803 real(kind=
kreal)
function spdot2(b,zln,colno,ks,ke)
3807 integer(kind=kint),
intent(in) :: colno(:)
3808 integer(kind=kint),
intent(in) :: ks,ke
3809 real(kind=
kreal),
intent(in) :: zln(:),b(:)
3811 integer(kind=kint) :: j,jj
3812 real(kind=
kreal) :: s
3833 real(kind=
kreal)
function ddot(a,b,n)
3837 real(kind=
kreal),
intent(in) :: a(n),b(n)
3838 integer(kind=kint),
intent(in) :: n
3840 real(kind=
kreal) :: s
3841 integer(kind=kint) :: i
3853 subroutine addr0(isw,i,j,aij,invp,xlnzr,colno,diag,zln,dsln,nstop,ndeg,ir)
3857 integer(kind=kint),
intent(in) :: isw
3858 integer(kind=kint),
intent(in) :: i,j,nstop, ndeg, invp(:),xlnzr(:),colno(:)
3859 real(kind=
kreal),
intent(inout) :: zln(:,:),diag(:,:),dsln(:,:),aij(:)
3860 integer(kind=kint),
intent(out) :: ir
3862 integer(kind=kint) :: ndeg2, ii, jj, itrans, k, i0, j0, l, ks, ke
3863 integer(kind=kint),
parameter :: idbg=0
3869 if(idbg.ne.0)
write(idbg,*)
'addr0',ii,jj,aij
3875 diag(1,ii)=diag(1,ii)+aij(1)
3877 elseif(ndeg2.eq.4)
then
3883 diag(1,ii)=diag(1,ii)+aij(1)
3884 diag(2,ii)=diag(2,ii)+aij(2)
3885 diag(3,ii)=diag(3,ii)+aij(4)
3897 if(jj.ge.nstop)
then
3904 elseif(ndeg2.eq.4)
then
3905 if(itrans.eq.0)
then
3922 if(colno(k).eq.jj)
then
3926 elseif(ndeg2.eq.4)
then
3927 if(itrans.eq.0)
then
3940 zln(1,k)=zln(1,k)+aij(1)
3941 elseif(ndeg2.eq.4)
then
3942 if(itrans.eq.0)
then
3944 zln(l,k)=zln(l,k)+aij(l)
3947 zln(1,k)=zln(1,k)+aij(1)
3948 zln(2,k)=zln(2,k)+aij(3)
3949 zln(3,k)=zln(3,k)+aij(2)
3950 zln(4,k)=zln(4,k)+aij(4)
3960 end subroutine addr0
3968 subroutine s3um(ic,xlnzr,colno,zln,diag,nch,par,neqns)
3972 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),par(:)
3973 integer(kind=kint),
intent(out) :: nch(:)
3974 real(kind=
kreal),
intent(out) :: zln(:,:), diag(:,:)
3975 integer(kind=kint),
intent(in) :: ic,neqns
3977 real(kind=
kreal),
allocatable :: temp(:,:)
3978 integer(kind=kint),
allocatable :: indx(:)
3979 real(kind=
kreal) :: zz(9),t(6)
3980 integer(kind=kint) :: i,j,k,l,ks,ke,kk,jc,jj,ir, ierr
3982 allocate(temp(9,neqns),indx(neqns), stat=ierr)
3983 if(ierr .ne. 0)
then
3984 call errtrp(
'stop due to allocation error.')
4000 do 310 jj=xlnzr(jc),xlnzr(jc+1)-1
4002 if(indx(j).eq.ic)
then
4003 zz(1)=zz(1)-temp(1,j)*zln(1,jj)-temp(4,j)*zln(4,jj)-temp(7,j)*zln(7,jj)
4004 zz(2)=zz(2)-temp(2,j)*zln(1,jj)-temp(5,j)*zln(4,jj)-temp(8,j)*zln(7,jj)
4005 zz(3)=zz(3)-temp(3,j)*zln(1,jj)-temp(6,j)*zln(4,jj)-temp(9,j)*zln(7,jj)
4006 zz(4)=zz(4)-temp(1,j)*zln(2,jj)-temp(4,j)*zln(5,jj)-temp(7,j)*zln(8,jj)
4007 zz(5)=zz(5)-temp(2,j)*zln(2,jj)-temp(5,j)*zln(5,jj)-temp(8,j)*zln(8,jj)
4008 zz(6)=zz(6)-temp(3,j)*zln(2,jj)-temp(6,j)*zln(5,jj)-temp(9,j)*zln(8,jj)
4009 zz(7)=zz(7)-temp(1,j)*zln(3,jj)-temp(4,j)*zln(6,jj)-temp(7,j)*zln(9,jj)
4010 zz(8)=zz(8)-temp(2,j)*zln(3,jj)-temp(5,j)*zln(6,jj)-temp(8,j)*zln(9,jj)
4011 zz(9)=zz(9)-temp(3,j)*zln(3,jj)-temp(6,j)*zln(6,jj)-temp(9,j)*zln(9,jj)
4015 call inv33(zln(:,k),zz,diag(:,jc))
4021 t(1)=t(1)+zz(1)*zln(1,k)+zz(4)*zln(4,k)+zz(7)*zln(7,k)
4022 t(2)=t(2)+zz(1)*zln(2,k)+zz(4)*zln(5,k)+zz(7)*zln(8,k)
4023 t(3)=t(3)+zz(2)*zln(2,k)+zz(5)*zln(5,k)+zz(8)*zln(8,k)
4024 t(4)=t(4)+zz(1)*zln(3,k)+zz(4)*zln(6,k)+zz(7)*zln(9,k)
4025 t(5)=t(5)+zz(2)*zln(3,k)+zz(5)*zln(6,k)+zz(8)*zln(9,k)
4026 t(6)=t(6)+zz(3)*zln(3,k)+zz(6)*zln(6,k)+zz(9)*zln(9,k)
4030 diag(l,ic)=diag(l,ic)-t(l)
4033 call inv3(diag(:,ic),ir)
4043 subroutine s3um1(ic,xlnzr,colno,zln,diag,nch,par,neqns)
4047 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),nch(:),par(:)
4048 real(kind=
kreal),
intent(in) :: diag(:,:)
4049 real(kind=
kreal),
intent(out) :: zln(:,:)
4050 integer(kind=kint),
intent(in) :: ic,neqns
4052 integer(kind=kint) :: i,j,k,l,ks,ke,jc,jj,ierr
4053 real(kind=
kreal) :: s(9),zz(9)
4054 real(kind=
kreal),
allocatable :: temp(:,:)
4055 integer(kind=kint),
allocatable :: indx(:)
4058 allocate(temp(9,neqns),indx(neqns), stat=ierr)
4072 do 310 jj=xlnzr(jc),xlnzr(jc+1)-1
4074 if(indx(j).eq.ic)
then
4075 s(1)=s(1)+temp(1,j)*zln(1,jj)+temp(4,j)*zln(4,jj)+temp(7,j)*zln(7,jj)
4076 s(2)=s(2)+temp(2,j)*zln(1,jj)+temp(5,j)*zln(4,jj)+temp(8,j)*zln(7,jj)
4077 s(3)=s(3)+temp(3,j)*zln(1,jj)+temp(6,j)*zln(4,jj)+temp(9,j)*zln(7,jj)
4078 s(4)=s(4)+temp(1,j)*zln(2,jj)+temp(4,j)*zln(5,jj)+temp(7,j)*zln(8,jj)
4079 s(5)=s(5)+temp(2,j)*zln(2,jj)+temp(5,j)*zln(5,jj)+temp(8,j)*zln(8,jj)
4080 s(6)=s(6)+temp(3,j)*zln(2,jj)+temp(6,j)*zln(5,jj)+temp(9,j)*zln(8,jj)
4081 s(7)=s(7)+temp(1,j)*zln(3,jj)+temp(4,j)*zln(6,jj)+temp(7,j)*zln(9,jj)
4082 s(8)=s(8)+temp(2,j)*zln(3,jj)+temp(5,j)*zln(6,jj)+temp(8,j)*zln(9,jj)
4083 s(9)=s(9)+temp(3,j)*zln(3,jj)+temp(6,j)*zln(6,jj)+temp(9,j)*zln(9,jj)
4088 temp(l,jc)=zln(l,k)-s(l)
4095 deallocate(temp,indx)
4096 end subroutine s3um1
4101 subroutine s3um3(n,dsln,diag)
4105 real(kind=
kreal),
intent(out) :: dsln(:,:),diag(:,:)
4106 integer(kind=kint),
intent(in) :: n
4108 real(kind=
kreal) :: t(9)
4109 integer(kind=kint) :: i,j,k,l,loc,ir, ierr
4110 real(kind=
kreal),
allocatable :: temp(:,:)
4111 integer(kind=kint),
allocatable :: indx(:)
4113 allocate(temp(9,n),indx(n), stat=ierr)
4114 if(ierr .ne. 0)
then
4115 call errtrp(
'stop due to allocation error.')
4118 if(n.le.0)
goto 1000
4121 call inv3(diag(:,1),ir)
4125 call d3dot(t,dsln(:,indx(i):indx(i)+j-2), dsln(:,indx(j):indx(j)+j-2),j-1)
4130 dsln(:,loc)=dsln(:,loc)-t(:)
4133 call v3prod(dsln(:,indx(i):indx(i)+i-2), diag,temp,i-1)
4134 call d3dotl(t,temp,dsln(:,indx(i):indx(i)+i-2),i-1)
4139 diag(:,i)=diag(:,i)-t(1:6)
4140 dsln(:,indx(i):indx(i)+i-2)=temp(:,1:i-1)
4141 call inv3(diag(:,i),ir)
4145 end subroutine s3um3
4149 subroutine d3sdot(wi,a,b,n)
4153 real(kind=
kreal),
intent(in) :: a(:,:),b(:,:)
4154 real(kind=
kreal),
intent(out) :: wi(:)
4155 integer(kind=kint),
intent(in) :: n
4157 integer(kind=kint) :: jj
4169 wi(1)=wi(1)-a(1,jj)*b(1,jj)-a(2,jj)*b(4,jj)-a(3,jj)*b(7,jj)
4170 wi(2)=wi(2)-a(1,jj)*b(2,jj)-a(2,jj)*b(5,jj)-a(3,jj)*b(8,jj)
4171 wi(3)=wi(3)-a(1,jj)*b(3,jj)-a(2,jj)*b(6,jj)-a(3,jj)*b(9,jj)
4174 end subroutine d3sdot
4178 subroutine s3pdot(bi,b,zln,colno,ks,ke)
4182 integer(kind=kint),
intent(in) :: colno(:)
4183 real(kind=
kreal),
intent(in) :: zln(:,:),b(:,:)
4184 real(kind=
kreal),
intent(out) :: bi(:)
4185 integer(kind=kint),
intent(in) :: ks,ke
4187 integer(kind=kint) :: j,jj
4200 bi(1)=bi(1)-zln(1,jj)*b(1,j)-zln(4,jj)*b(2,j)-zln(7,jj)*b(3,j)
4201 bi(2)=bi(2)-zln(2,jj)*b(1,j)-zln(5,jj)*b(2,j)-zln(8,jj)*b(3,j)
4202 bi(3)=bi(3)-zln(3,jj)*b(1,j)-zln(6,jj)*b(2,j)-zln(9,jj)*b(3,j)
4205 end subroutine s3pdot
4209 subroutine inv33(zln,zz,diag)
4213 real(kind=
kreal),
intent(in) :: zz(9),diag(6)
4214 real(kind=
kreal),
intent(out) :: zln(9)
4216 zln(4)=zz(4)-zz(1)*diag(2)
4217 zln(7)=zz(7)-zz(1)*diag(4)-zln(4)*diag(5)
4218 zln(1)=zz(1)*diag(1)
4219 zln(4)=zln(4)*diag(3)
4220 zln(7)=zln(7)*diag(6)
4221 zln(4)=zln(4)-zln(7)*diag(5)
4222 zln(1)=zln(1)-zln(4)*diag(2)-zln(7)*diag(4)
4224 zln(5)=zz(5)-zz(2)*diag(2)
4225 zln(8)=zz(8)-zz(2)*diag(4)-zln(5)*diag(5)
4226 zln(2)=zz(2)*diag(1)
4227 zln(5)=zln(5)*diag(3)
4228 zln(8)=zln(8)*diag(6)
4229 zln(5)=zln(5)-zln(8)*diag(5)
4230 zln(2)=zln(2)-zln(5)*diag(2)-zln(8)*diag(4)
4232 zln(6)=zz(6)-zz(3)*diag(2)
4233 zln(9)=zz(9)-zz(3)*diag(4)-zln(6)*diag(5)
4234 zln(3)=zz(3)*diag(1)
4235 zln(6)=zln(6)*diag(3)
4236 zln(9)=zln(9)*diag(6)
4237 zln(6)=zln(6)-zln(9)*diag(5)
4238 zln(3)=zln(3)-zln(6)*diag(2)-zln(9)*diag(4)
4240 end subroutine inv33
4244 subroutine inv3(dsln,ir)
4248 real(kind=
kreal) :: dsln(6),t(2)
4249 integer(kind=kint) :: ir
4252 if(dabs(dsln(1)).lt.rmin)
then
4255 dsln(1)=1.0d0/dsln(1)
4256 t(1)=dsln(2)*dsln(1)
4257 dsln(3)=dsln(3)-t(1)*dsln(2)
4259 if(dabs(dsln(3)).lt.rmin)
then
4262 dsln(3)=1.0d0/dsln(3)
4263 t(1)=dsln(4)*dsln(1)
4264 dsln(5)=dsln(5)-dsln(2)*dsln(4)
4265 t(2)=dsln(5)*dsln(3)
4266 dsln(6)=dsln(6)-t(1)*dsln(4)-t(2)*dsln(5)
4269 if(dabs(dsln(6)).lt.rmin)
then
4272 dsln(6)=1.0d0/dsln(6)
4276 write(ilog,*)
"singular"
4288 subroutine d3dot(t,a,b,n)
4291 real(kind=
kreal),
intent(in) :: a(:,:),b(:,:)
4292 real(kind=
kreal),
intent(out) :: t(:)
4293 integer(kind=kint),
intent(in) :: n
4295 integer(kind=kint) :: l,jj
4315 t(1)=t(1)+a(1,jj)*b(1,jj)+a(4,jj)*b(4,jj)+a(7,jj)*b(7,jj)
4316 t(2)=t(2)+a(2,jj)*b(1,jj)+a(5,jj)*b(4,jj)+a(8,jj)*b(7,jj)
4317 t(3)=t(3)+a(3,jj)*b(1,jj)+a(6,jj)*b(4,jj)+a(9,jj)*b(7,jj)
4318 t(4)=t(4)+a(1,jj)*b(2,jj)+a(4,jj)*b(5,jj)+a(7,jj)*b(8,jj)
4319 t(5)=t(5)+a(2,jj)*b(2,jj)+a(5,jj)*b(5,jj)+a(8,jj)*b(8,jj)
4320 t(6)=t(6)+a(3,jj)*b(2,jj)+a(6,jj)*b(5,jj)+a(9,jj)*b(8,jj)
4321 t(7)=t(7)+a(1,jj)*b(3,jj)+a(4,jj)*b(6,jj)+a(7,jj)*b(9,jj)
4322 t(8)=t(8)+a(2,jj)*b(3,jj)+a(5,jj)*b(6,jj)+a(8,jj)*b(9,jj)
4323 t(9)=t(9)+a(3,jj)*b(3,jj)+a(6,jj)*b(6,jj)+a(9,jj)*b(9,jj)
4326 end subroutine d3dot
4330 subroutine v3prod(zln,diag,zz,n)
4334 real(kind=
kreal),
intent(in) :: zln(:,:),diag(:,:)
4335 real(kind=
kreal),
intent(out) :: zz(:,:)
4336 integer(kind=kint),
intent(in) :: n
4338 integer(kind=kint) :: i
4341 zz(4,i)=zln(4,i)-zln(1,i)*diag(2,i)
4342 zz(7,i)=zln(7,i)-zln(1,i)*diag(4,i)-zz(4,i)*diag(5,i)
4343 zz(1,i)=zln(1,i)*diag(1,i)
4344 zz(4,i)=zz(4,i)*diag(3,i)
4345 zz(7,i)=zz(7,i)*diag(6,i)
4346 zz(4,i)=zz(4,i)-zz(7,i)*diag(5,i)
4347 zz(1,i)=zz(1,i)-zz(4,i)*diag(2,i)-zz(7,i)*diag(4,i)
4349 zz(5,i)=zln(5,i)-zln(2,i)*diag(2,i)
4350 zz(8,i)=zln(8,i)-zln(2,i)*diag(4,i)-zz(5,i)*diag(5,i)
4351 zz(2,i)=zln(2,i)*diag(1,i)
4352 zz(5,i)=zz(5,i)*diag(3,i)
4353 zz(8,i)=zz(8,i)*diag(6,i)
4354 zz(5,i)=zz(5,i)-zz(8,i)*diag(5,i)
4355 zz(2,i)=zz(2,i)-zz(5,i)*diag(2,i)-zz(8,i)*diag(4,i)
4357 zz(6,i)=zln(6,i)-zln(3,i)*diag(2,i)
4358 zz(9,i)=zln(9,i)-zln(3,i)*diag(4,i)-zz(6,i)*diag(5,i)
4359 zz(3,i)=zln(3,i)*diag(1,i)
4360 zz(6,i)=zz(6,i)*diag(3,i)
4361 zz(9,i)=zz(9,i)*diag(6,i)
4362 zz(6,i)=zz(6,i)-zz(9,i)*diag(5,i)
4363 zz(3,i)=zz(3,i)-zz(6,i)*diag(2,i)-zz(9,i)*diag(4,i)
4366 end subroutine v3prod
4369 subroutine d3dotl(t,a,b,n)
4372 real(kind=
kreal),
intent(in) :: a(:,:),b(:,:)
4373 real(kind=
kreal),
intent(out) :: t(:)
4374 integer(kind=kint),
intent(in) :: n
4376 integer(kind=kint) :: l,jj
4393 t(1)=t(1)+a(1,jj)*b(1,jj)+a(4,jj)*b(4,jj)+a(7,jj)*b(7,jj)
4394 t(2)=t(2)+a(2,jj)*b(1,jj)+a(5,jj)*b(4,jj)+a(8,jj)*b(7,jj)
4395 t(3)=t(3)+a(2,jj)*b(2,jj)+a(5,jj)*b(5,jj)+a(8,jj)*b(8,jj)
4396 t(4)=t(4)+a(3,jj)*b(1,jj)+a(6,jj)*b(4,jj)+a(9,jj)*b(7,jj)
4397 t(5)=t(5)+a(3,jj)*b(2,jj)+a(6,jj)*b(5,jj)+a(9,jj)*b(8,jj)
4398 t(6)=t(6)+a(3,jj)*b(3,jj)+a(6,jj)*b(6,jj)+a(9,jj)*b(9,jj)
4401 end subroutine d3dotl
4405 subroutine addr3(isw,i,j,aij,invp,xlnzr,colno,diag,zln,dsln,nstop,ir)
4409 integer(kind=kint),
intent(in) :: invp(:),xlnzr(:),colno(:)
4410 real(kind=
kreal),
intent(in) :: aij(:)
4411 real(kind=
kreal),
intent(out) :: zln(:,:),diag(:,:),dsln(:,:)
4412 integer(kind=kint),
intent(in) :: isw,i,j,nstop
4413 integer(kind=kint),
intent(out) :: ir
4415 integer(kind=kint),
parameter :: ndeg2=9
4416 integer(kind=kint),
parameter :: ndeg2l=6
4417 integer(kind=kint) :: k,l,ii,jj,itrans,i0,j0,ks,ke
4422 if(ldbg)
write(idbg,*)
'addr3',ii,jj,aij
4443 if(jj.ge.nstop)
then
4447 if(itrans.eq.0)
then
4470 if(colno(k).eq.jj)
then
4471 if(itrans.eq.0)
then
4492 end subroutine addr3
4496 subroutine s2um(ic,xlnzr,colno,zln,diag,nch,par,neqns)
4500 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),par(:)
4501 integer(kind=kint),
intent(out) :: nch(:)
4502 real(kind=
kreal),
intent(out) :: zln(:,:),diag(:,:)
4503 integer(kind=kint),
intent(in) :: ic,neqns
4505 integer(kind=kint) :: i,j,k,l,ks,ke,jj,jc,ir,kk, ierr
4506 real(kind=
kreal),
allocatable :: temp(:,:)
4507 integer(kind=kint),
allocatable :: indx(:)
4508 real(kind=
kreal) :: s(4),zz(4),t(3)
4510 allocate(temp(4,neqns),indx(neqns), stat=ierr)
4511 if(ierr .ne. 0)
then
4512 call errtrp(
'stop due to allocation error.')
4527 do 310 jj=xlnzr(jc),xlnzr(jc+1)-1
4529 if(indx(j).eq.ic)
then
4530 zz(1)=zz(1)-temp(1,j)*zln(1,jj)-temp(3,j)*zln(3,jj)
4531 zz(2)=zz(2)-temp(2,j)*zln(1,jj)-temp(4,j)*zln(3,jj)
4532 zz(3)=zz(3)-temp(1,j)*zln(2,jj)-temp(3,j)*zln(4,jj)
4533 zz(4)=zz(4)-temp(2,j)*zln(2,jj)-temp(4,j)*zln(4,jj)
4536 call inv22(zln(:,k),zz,diag(:,jc))
4540 t(1)=t(1)+zz(1)*zln(1,k)+zz(3)*zln(3,k)
4541 t(2)=t(2)+zz(2)*zln(1,k)+zz(4)*zln(3,k)
4542 t(3)=t(3)+zz(2)*zln(2,k)+zz(4)*zln(4,k)
4544 diag(1,ic)=diag(1,ic)-t(1)
4545 diag(2,ic)=diag(2,ic)-t(2)
4546 diag(3,ic)=diag(3,ic)-t(3)
4547 call inv2(diag(:,ic),ir)
4556 subroutine s2um1(ic,xlnzr,colno,zln,diag,nch,par,neqns)
4560 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:),nch(:),par(:)
4561 real(kind=
kreal),
intent(in) :: diag(:,:)
4562 real(kind=
kreal),
intent(out) :: zln(:,:)
4563 integer(kind=kint),
intent(in) :: ic,neqns
4565 integer(kind=kint) :: i,j,k,l,ks,ke,jc,jj, ierr
4566 real(kind=
kreal) :: s(4),zz(4)
4567 real(kind=
kreal),
allocatable :: temp(:,:)
4568 integer(kind=kint),
allocatable :: indx(:)
4570 allocate(temp(4,neqns),indx(neqns), stat=ierr)
4571 if(ierr .ne. 0)
then
4572 call errtrp(
'stop due to allocation error.')
4583 do 310 jj=xlnzr(jc),xlnzr(jc+1)-1
4585 if(indx(j).eq.ic)
then
4586 s(1)=s(1)+temp(1,j)*zln(1,jj)+temp(3,j)*zln(3,jj)
4587 s(2)=s(2)+temp(2,j)*zln(1,jj)+temp(4,j)*zln(3,jj)
4588 s(3)=s(3)+temp(1,j)*zln(2,jj)+temp(3,j)*zln(4,jj)
4589 s(4)=s(4)+temp(2,j)*zln(2,jj)+temp(4,j)*zln(4,jj)
4593 temp(l,jc)=zln(l,k)-s(l)
4599 end subroutine s2um1
4603 subroutine s2um2_child(neqns,nstop,xlnzr,colno,zln,diag,spdslnidx,spdslnval,nspdsln)
4607 integer(kind=kint),
intent(in) :: neqns, nstop
4608 integer(kind=kint),
intent(in) :: xlnzr(:),colno(:)
4609 real(kind=
kreal),
intent(inout) :: zln(:,:),diag(:,:)
4610 integer(kind=kint),
pointer :: spdslnidx(:)
4611 real(kind=
kreal),
pointer :: spdslnval(:,:)
4612 integer(kind=kint),
intent(out) :: nspdsln
4614 integer(kind=kint) :: i,j,k,l,m,n, ic,ks,ke,ii,jj,jc,j1,j2,loc,ispdsln, ierr
4615 real(kind=
kreal),
allocatable :: temp(:,:)
4616 integer(kind=kint),
allocatable :: indx(:)
4619 allocate(temp(4,neqns),indx(neqns), stat=ierr)
4620 if(ierr .ne. 0)
then
4621 call errtrp(
'stop due to allocation error.')
4635 do jj=xlnzr(jc),xlnzr(jc+1)-1
4637 if(indx(j).eq.ic)
then
4644 allocate(spdslnidx(nspdsln),spdslnval(4,nspdsln), stat=ierr)
4645 if(ierr .ne. 0)
then
4646 call errtrp(
'stop due to allocation error.')
4653 do 100 ic=nstop,neqns
4663 zln(3,k)=temp(3,jj)-temp(1,jj)*diag(2,jj)
4664 zln(1,k)=temp(1,jj)*diag(1,jj)
4665 zln(3,k)=zln(3,k)*diag(3,jj)
4666 zln(1,k)=zln(1,k)-zln(3,k)*diag(2,jj)
4668 zln(4,k)=temp(4,jj)-temp(2,jj)*diag(2,jj)
4669 zln(2,k)=temp(2,jj)*diag(1,jj)
4670 zln(4,k)=zln(4,k)*diag(3,jj)
4671 zln(2,k)=zln(2,k)-zln(4,k)*diag(2,jj)
4673 diag(1,ic)=diag(1,ic)-(temp(1,jj)*zln(1,k)+temp(3,jj)*zln(3,k))
4674 diag(2,ic)=diag(2,ic)-(temp(1,jj)*zln(2,k)+temp(3,jj)*zln(4,k))
4675 diag(3,ic)=diag(3,ic)-(temp(2,jj)*zln(2,k)+temp(4,jj)*zln(4,k))
4678 do 120 jc=nstop,ic-1
4680 do 220 jj=xlnzr(jc),xlnzr(jc+1)-1
4682 if(indx(j).eq.ic)
then
4687 spdslnidx(ispdsln)=loc
4688 spdslnval(1,ispdsln)=spdslnval(1,ispdsln)-(temp(1,j)*zln(1,jj)+temp(3,j)*zln(3,jj))
4689 spdslnval(2,ispdsln)=spdslnval(2,ispdsln)-(temp(2,j)*zln(1,jj)+temp(4,j)*zln(3,jj))
4690 spdslnval(3,ispdsln)=spdslnval(3,ispdsln)-(temp(1,j)*zln(2,jj)+temp(3,j)*zln(4,jj))
4691 spdslnval(4,ispdsln)=spdslnval(4,ispdsln)-(temp(2,j)*zln(2,jj)+temp(4,j)*zln(4,jj))
4698 end subroutine s2um2_child
4702 subroutine inv22(zln,zz,diag)
4706 real(kind=
kreal),
intent(in) :: zz(4),diag(3)
4707 real(kind=
kreal),
intent(out) :: zln(4)
4709 zln(3)=zz(3)-zz(1)*diag(2)
4710 zln(1)=zz(1)*diag(1)
4711 zln(3)=zln(3)*diag(3)
4712 zln(1)=zln(1)-zln(3)*diag(2)
4714 zln(4)=zz(4)-zz(2)*diag(2)
4715 zln(2)=zz(2)*diag(1)
4716 zln(4)=zln(4)*diag(3)
4717 zln(2)=zln(2)-zln(4)*diag(2)
4720 end subroutine inv22
4724 subroutine inv2(dsln,ir)
4728 real(kind=
kreal),
intent(out) :: dsln(3)
4729 integer(kind=kint),
intent(out) :: ir
4731 real(kind=
kreal) :: t
4734 if(dabs(dsln(1)).lt.rmin)
then
4738 dsln(1)=1.0d0/dsln(1)
4740 dsln(3)=dsln(3)-t*dsln(2)
4742 if(dabs(dsln(3)).lt.rmin)
then
4746 dsln(3)=1.0d0/dsln(3)
4752 subroutine d2sdot(wi,a,b,n)
4756 real(kind=
kreal),
intent(in) :: a(:,:),b(:,:)
4757 real(kind=
kreal),
intent(inout) :: wi(:)
4758 integer(kind=kint),
intent(in) :: n
4760 integer(kind=kint) :: jj
4772 wi(1)=wi(1)-a(1,jj)*b(1,jj)-a(2,jj)*b(3,jj)
4773 wi(2)=wi(2)-a(1,jj)*b(2,jj)-a(2,jj)*b(4,jj)
4776 end subroutine d2sdot
4780 subroutine s2pdot(bi,b,zln,colno,ks,ke)
4784 integer(kind=kint),
intent(in) :: colno(:)
4785 integer(kind=kint),
intent(in) :: ks,ke
4786 real(kind=
kreal),
intent(in) :: zln(:,:),b(:,:)
4787 real(kind=
kreal),
intent(out) :: bi(:)
4789 integer(kind=kint) :: jj,j
4802 bi(1)=bi(1)-zln(1,jj)*b(1,j)-zln(3,jj)*b(2,j)
4803 bi(2)=bi(2)-zln(2,jj)*b(1,j)-zln(4,jj)*b(2,j)
4806 end subroutine s2pdot
4810 subroutine addrx(isw,i,j,aij,invp,xlnzr,colno,diag,zln,dsln,nstop,ndeg,ndeg2,ndeg2l,ir)
4814 integer(kind=kint),
intent(in) :: invp(*),xlnzr(*),colno(*)
4815 real(kind=
kreal),
intent(in) :: aij(ndeg,ndeg)
4816 real(kind=
kreal),
intent(out) :: zln(ndeg,ndeg,*),diag(ndeg2l,*),dsln(ndeg,ndeg,*)
4817 integer(kind=kint),
intent(in) :: isw,i,j,nstop,ndeg,ndeg2,ndeg2l
4818 integer(kind=kint),
intent(out) :: ir
4820 integer(kind=kint) :: ii,jj,k,l,m,n,ks,ke,itrans,i0,j0
4825 if(ldbg)
write(idbg,*)
'addrx',ii,jj,aij
4843 if(jj.ge.nstop)
then
4847 if(itrans.eq.0)
then
4850 dsln(n,m,k)=aij(n,m)
4857 dsln(n,m,k)=aij(m,n)
4866 if(colno(k).eq.jj)
then
4867 if(itrans.eq.0)
then
4886 end subroutine addrx
4890 subroutine dxdot(ndeg,t,a,b,l)
4894 real(kind=
kreal),
intent(in) :: a(ndeg,ndeg,*),b(ndeg,ndeg,*)
4895 real(kind=
kreal),
intent(out) :: t(ndeg,ndeg)
4896 integer(kind=kint),
intent(in) :: ndeg,l
4898 integer(kind=kint) :: k,jj,n,m
4914 t(n,m)=t(n,m)+a(n,k,jj)*b(m,k,jj)
4920 end subroutine dxdot
4924 subroutine dxdotl(ndeg,t,a,b,l)
4928 real(kind=
kreal),
intent(in) :: a(ndeg,ndeg,*),b(ndeg,ndeg,*)
4929 real(kind=
kreal),
intent(out) :: t(ndeg,ndeg)
4930 integer(kind=kint),
intent(in) :: ndeg,l
4932 integer(kind=kint) :: n,m,jj,k
4948 t(n,m)=t(n,m)+a(n,k,jj)*b(m,k,jj)
4954 end subroutine dxdotl
4958 subroutine dxsdot(ndeg,wi,a,b,n)
4962 real(kind=
kreal),
intent(in) :: a(ndeg,*),b(ndeg,ndeg,*)
4963 real(kind=
kreal),
intent(out) :: wi(ndeg)
4964 integer(kind=kint),
intent(in) :: ndeg, n
4966 integer(kind=kint) :: jj, k, l
4981 wi(l)=wi(l)-b(l,k,jj)*a(k,jj)
4986 end subroutine dxsdot
4990 subroutine invx(dsln,ndeg,ir)
4994 real(kind=
kreal),
intent(inout) :: dsln(*)
4995 integer(kind=kint),
intent(in) :: ndeg
4996 integer(kind=kint),
intent(out) :: ir
4998 integer(kind=kint) :: i,j,k,l,ld,l0,k0,ll
4999 real(kind=
kreal) :: tem,t
5003 dsln(1)=1.0d0/dsln(1)
5011 dsln(l)=dsln(l)-dsln(l0+k)*dsln(ld)
5021 tem=dsln(k)*dsln(k0)
5027 dsln(l)=1.0d0/dsln(l)
5034 subroutine invxx(zln,zz,diag,ndeg)
5038 real(kind=
kreal),
intent(in) :: zz(ndeg,ndeg),diag(*)
5039 real(kind=
kreal),
intent(out) :: zln(ndeg,ndeg)
5040 integer(kind=kint),
intent(in) :: ndeg
5042 integer(kind=kint) :: i,j,k,l,m,n,loc,loc1
5051 zln(l,n)=zln(l,n)-zln(l,m)*diag(loc1)
5058 zln(l,m)=zln(l,m)*diag(loc)
5063 zln(l,m)=zln(l,m)-zln(l,n)*diag(loc)
5069 end subroutine invxx
5073 subroutine sxpdot(ndeg,bi,b,zln,colno,ks,ke)
5077 integer(kind=kint),
intent(in) :: colno(*)
5078 real(kind=
kreal),
intent(in) :: zln(ndeg,ndeg,*),b(ndeg,*)
5079 real(kind=
kreal),
intent(out) :: bi(ndeg)
5080 integer(kind=kint),
intent(in) :: ndeg,ks,ke
5082 integer(kind=kint) :: j,jj,m,n
5097 bi(n)=bi(n)-zln(n,m,jj)*b(m,j)
5102 end subroutine sxpdot
5106 subroutine sxum(ic,xlnzr,colno,zln,diag,nch,par,neqns,ndeg,ndegl)
5110 integer(kind=kint),
intent(in) :: xlnzr(*),colno(*),par(*)
5111 integer(kind=kint),
intent(out) :: nch(*)
5112 real(kind=
kreal),
intent(out) :: zln(ndeg,ndeg,*),diag(ndegl,*)
5113 integer(kind=kint),
intent(in) :: ic,neqns,ndeg,ndegl
5115 real(kind=
kreal) :: zz(ndeg,ndeg),t(ndegl)
5116 integer(kind=kint) :: i,j,k,l,m,n,ndeg22,ks,ke,jc,loc,jj,kk,ir, ierr
5117 real(kind=
kreal),
allocatable :: temp(:,:,:)
5118 integer(kind=kint),
allocatable :: indx(:)
5121 allocate(temp(ndeg,ndeg,neqns),indx(neqns), stat=ierr)
5122 if(ierr .ne. 0)
then
5123 call errtrp(
'stop due to allocation error.')
5134 do jj=xlnzr(jc),xlnzr(jc+1)-1
5136 if(indx(j).eq.ic)
then
5140 zz(n,m)=zz(n,m)-temp(n,kk,j)*zln(m,kk,jj)
5146 call invxx(zln(1,1,k),zz,diag(1,jc),ndeg)
5153 t(loc)=t(loc)+zz(n,kk)*zln(m,kk,k)
5158 diag(:,ic)=diag(:,ic)-t
5159 call invx(diag(1,ic),ndeg,ir)
5168 subroutine sxum1(ic,xlnzr,colno,zln,diag,nch,par,neqns,ndeg,ndegl)
5172 integer(kind=kint),
intent(in) :: xlnzr(*),colno(*),nch(*),par(*)
5173 real(kind=
kreal),
intent(in) :: diag(ndegl,*)
5174 real(kind=
kreal),
intent(out) :: zln(ndeg,ndeg,*)
5175 integer(kind=kint),
intent(in) :: ic,neqns,ndeg,ndegl
5177 real(kind=
kreal) :: s(ndeg,ndeg)
5178 integer(kind=kint) :: i,j,k,l,m,n,ks,ke,jc,jj,kk, ierr
5179 real(kind=
kreal),
allocatable :: temp(:,:,:)
5180 integer(kind=kint),
allocatable :: indx(:)
5182 allocate(temp(ndeg,ndeg,neqns),indx(neqns), stat=ierr)
5183 if(ierr .ne. 0)
then
5184 call errtrp(
'stop due to allocation error.')
5196 do jj=xlnzr(jc),xlnzr(jc+1)-1
5198 if(indx(j).eq.ic)
then
5202 s(n,m)=s(n,m)+temp(n,kk,j)*zln(m,kk,jj)
5210 temp(n,m,jc)=zln(n,m,k)-s(n,m)
5211 zln(n,m,k)=temp(n,m,jc)
5217 end subroutine sxum1
5221 subroutine sxum2_child(neqns,nstop,xlnzr,colno,zln,diag,spdslnidx,spdslnval,nspdsln,ndeg,ndegl)
5225 integer(kind=kint),
intent(in) :: neqns, nstop
5226 integer(kind=kint),
intent(in) :: xlnzr(*),colno(*)
5227 real(kind=
kreal),
intent(inout) :: zln(ndeg,ndeg,*),diag(ndegl,*)
5228 integer(kind=kint),
pointer :: spdslnidx(:)
5229 real(kind=
kreal),
pointer :: spdslnval(:,:)
5230 integer(kind=kint),
intent(out) :: nspdsln
5231 integer(kind=kint),
intent(in) :: ndeg, ndegl
5233 integer(kind=kint) :: i,j,k,l,m,n, ic,ks,ke,ii,jj,jc,j1,j2,loc,locd,kk, ierr
5234 integer(kind=kint) :: ispdsln
5235 real(kind=
kreal),
allocatable :: temp(:,:,:)
5236 integer(kind=kint),
allocatable :: indx(:)
5239 allocate(temp(ndeg,ndeg,neqns),indx(neqns), stat=ierr)
5240 if(ierr .ne. 0)
then
5241 call errtrp(
'stop due to allocation error.')
5255 do jj=xlnzr(jc),xlnzr(jc+1)-1
5257 if(indx(j).eq.ic)
then
5264 allocate(spdslnidx(nspdsln),spdslnval(ndeg*ndeg,nspdsln), stat=ierr)
5265 if(ierr .ne. 0)
then
5266 call errtrp(
'stop due to allocation error.')
5280 temp(n,m,jj)=zln(n,m,k)
5287 call invxx(zln(1,1,k),temp(1,1,jj),diag(1,jj),ndeg)
5297 diag(locd,ic)=diag(locd,ic)-temp(n,kk,jj)*zln(m,kk,k)
5306 do jj=xlnzr(jc),xlnzr(jc+1)-1
5308 if(indx(j).eq.ic)
then
5313 spdslnidx(ispdsln)=loc
5317 spdslnval(ndeg*(m-1)+n,ispdsln)=spdslnval(ndeg*(m-1)+n,ispdsln)-temp(n,k,j)*zln(m,k,jj)
5327 end subroutine sxum2_child
5331 subroutine sxum3(neqns,dsln,diag,ndeg,ndegl)
5335 real(kind=
kreal),
intent(inout):: dsln(ndeg,ndeg,*),diag(ndegl,*)
5336 integer(kind=kint),
intent(in) :: neqns, ndeg, ndegl
5338 integer(kind=kint) :: loc, locd, ir, i,j,n,m, ierr
5339 integer(kind=kint),
allocatable :: indx(:)
5340 real(kind=
kreal),
allocatable :: temp(:,:,:)
5341 real(kind=
kreal),
allocatable :: t(:,:)
5343 allocate(indx(neqns),temp(ndeg,ndeg,neqns),t(ndeg,ndeg), stat=ierr)
5344 if(ierr .ne. 0)
then
5345 call errtrp(
'stop due to allocation error.')
5348 if(neqns.le.0)
goto 1000
5351 call invx(diag(1,1),ndeg,ir)
5355 call dxdot(ndeg,t,dsln(1,1,indx(i)),dsln(1,1,indx(j)),j-1)
5358 dsln(n,m,loc)=dsln(n,m,loc)-t(n,m)
5363 call vxprod(ndeg,ndegl,dsln(1,1,indx(i)),diag,temp,i-1)
5364 call dxdotl(ndeg,t,temp,dsln(1,1,indx(i)),i-1)
5369 diag(locd,i)=diag(locd,i)-t(n,m)
5372 call vcopy(temp,dsln(1,1,indx(i)),ndeg*ndeg*(i-1))
5373 call invx(diag(1,i),ndeg,ir)
5377 end subroutine sxum3
5380 subroutine vcopy(a,c,n)
5383 integer(kind=kint) :: n
5384 real(kind=
kreal) :: a(n),c(n)
5390 end subroutine vcopy
5394 subroutine verif0(neqns,ndeg,nttbr,irow,jcol,val,rhs,x)
5398 integer(kind=kint),
intent(in) :: irow(*),jcol(*)
5399 integer(kind=kint),
intent(in) :: neqns,ndeg,nttbr
5400 real(kind=
kreal),
intent(in) :: val(ndeg,ndeg,*),x(ndeg,*)
5401 real(kind=
kreal),
intent(out) :: rhs(ndeg,*)
5403 integer(kind=kint) :: i,j,k,l,m
5404 real(kind=
kreal) :: rel,err
5415 rel=rel+dabs(rhs(l,i))
5423 rhs(l,i)=rhs(l,i)-val(l,m,k)*x(m,j)
5424 if(i.ne.j) rhs(l,j)=rhs(l,j)-val(m,l,k)*x(m,i)
5431 err=err+dabs(rhs(l,i))
5434 if (m_pds_procinfo%myid .eq. 0)
then
5435 write(imsg,6000) err,rel,err/rel
5437 6000
format(
' ***verification***(symmetric)'/&
5438 &
'norm(Ax-b) = ',1pd20.10/&
5439 &
'norm(b) = ',1pd20.10/&
5440 &
'norm(Ax-b)/norm(b) = ',1pd20.10)
5441 6010
format(1p4d15.7)
5447 subroutine vxprod(ndeg,ndegl,zln,diag,zz,n)
5451 real(kind=
kreal),
intent(in) :: zln(ndeg*ndeg,n),diag(ndegl,n)
5452 real(kind=
kreal),
intent(out) :: zz(ndeg*ndeg,n)
5453 integer(kind=kint),
intent(in) :: ndeg,ndegl,n
5455 integer(kind=kint) :: i
5458 call invxx(zz(1,i),zln(1,i),diag(1,i),ndeg)
5461 end subroutine vxprod
subroutine verif0(Neqns, Ndeg, Nttbr, Irow, Jcol, Val, Rhs, X)
subroutine idntty(Neqns, Invp, Iperm)
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)
integer(kind=kint) function hecmw_comm_get_comm()
integer(kind=4), parameter kreal
subroutine hecmw_abort(comm)
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)