From 09830f6814c8cca98a4a89bc7242acbf1bb121a4 Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Tue, 18 Sep 2007 12:53:48 +0000 Subject: [PATCH] Fixed target attribute on A. --- mld_daggrmap_bld.f90 | 409 +++++++++++++++++++++++-------------------- mld_zaggrmap_bld.f90 | 387 +++++++++++++++++++++------------------- 2 files changed, 433 insertions(+), 363 deletions(-) diff --git a/mld_daggrmap_bld.f90 b/mld_daggrmap_bld.f90 index f9ee8346..1a233df9 100644 --- a/mld_daggrmap_bld.f90 +++ b/mld_daggrmap_bld.f90 @@ -40,24 +40,26 @@ subroutine mld_daggrmap_bld(aggr_type,a,desc_a,nlaggr,ilaggr,info) implicit none integer, intent(in) :: aggr_type - type(psb_dspmat_type), intent(in) :: a + type(psb_dspmat_type), intent(in), target :: a type(psb_desc_type), intent(in) :: desc_a integer, allocatable :: ilaggr(:),nlaggr(:) integer, intent(out) :: info ! Locals integer, allocatable :: ils(:), neigh(:) integer :: icnt,nlp,k,n,ia,isz,nr, naggr,i,j,m + type(psb_dspmat_type), target :: atmp, atrans + type(psb_dspmat_type), pointer :: apnt logical :: recovery logical, parameter :: debug=.false. - integer ::ictxt,np,me,err_act + integer :: ictxt,np,me,err_act integer :: nrow, ncol, n_ne integer, parameter :: one=1, two=2 character(len=20) :: name, ch_err if(psb_get_errstatus().ne.0) return info=0 - name = 'mld_daggrmap_bld' + name = 'mld_aggrmap_bld' call psb_erractionsave(err_act) ! ! Note. At the time being we are ignoring aggr_type @@ -69,59 +71,143 @@ subroutine mld_daggrmap_bld(aggr_type,a,desc_a,nlaggr,ilaggr,info) nrow = psb_cd_get_local_rows(desc_a) ncol = psb_cd_get_local_cols(desc_a) - nr = a%m - allocate(ilaggr(nr),neigh(nr),stat=info) - if(info.ne.0) then - info=4025 - call psb_errpush(info,name,i_err=(/2*nr,0,0,0,0/),& - & a_err='integer') - goto 9999 - end if + select case (aggr_type) + case (dec_aggr_,sym_dec_aggr_) + + + nr = a%m + allocate(ilaggr(nr),neigh(nr),stat=info) + if(info.ne.0) then + info=4025 + call psb_errpush(info,name,i_err=(/2*nr,0,0,0,0/),& + & a_err='integer') + goto 9999 + end if - do i=1, nr - ilaggr(i) = -(nr+1) - end do - ! Note: -(nr+1) Untouched as yet - ! -i 1<=i<=nr Adjacent to aggregate i - ! i 1<=i<=nr Belonging to aggregate i + do i=1, nr + ilaggr(i) = -(nr+1) + end do + if (aggr_type == dec_aggr_) then + apnt => a + else + call psb_sp_clip(a,atmp,info,imax=nr,jmax=nr,& + & rscale=.false.,cscale=.false.) + atmp%m=nr + atmp%k=nr + call psb_transp(atmp,atrans,fmt='COO') + call psb_rwextd(nr,atmp,info,b=atrans,rowscale=.false.) + atmp%m=nr + atmp%k=nr + call psb_sp_free(atrans,info) + call psb_ipcoo2csr(atmp,info) + apnt => atmp + end if - ! - ! Phase one: group nodes together. - ! Very simple minded strategy. - ! - naggr = 0 - nlp = 0 - do - icnt = 0 - do i=1, nr - if (ilaggr(i) == -(nr+1)) then - ! - ! 1. Untouched nodes are marked >0 together - ! with their neighbours - ! - icnt = icnt + 1 - naggr = naggr + 1 - ilaggr(i) = naggr - call psb_neigh(a,i,neigh,n_ne,info,lev=one) - if (info/=0) then - info=4010 - ch_err='psb_neigh' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - do k=1, n_ne - j = neigh(k) - if ((1<=j).and.(j<=nr)) then - ilaggr(j) = naggr + ! Note: -(nr+1) Untouched as yet + ! -i 1<=i<=nr Adjacent to aggregate i + ! i 1<=i<=nr Belonging to aggregate i + + ! + ! Phase one: group nodes together. + ! Very simple minded strategy. + ! + naggr = 0 + nlp = 0 + do + icnt = 0 + do i=1, nr + if (ilaggr(i) == -(nr+1)) then + ! + ! 1. Untouched nodes are marked >0 together + ! with their neighbours + ! + icnt = icnt + 1 + naggr = naggr + 1 + ilaggr(i) = naggr + + call psb_neigh(apnt,i,neigh,n_ne,info,lev=one) + if (info/=0) then + info=4010 + ch_err='psb_neigh' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + do k=1, n_ne + j = neigh(k) + if ((1<=j).and.(j<=nr)) then + ilaggr(j) = naggr !!$ if (ilaggr(j) < 0) ilaggr(j) = naggr !!$ if (ilaggr(j) == -(nr+1)) ilaggr(j) = naggr - endif - enddo + endif + enddo + ! + ! 2. Untouched neighbours of these nodes are marked <0. + ! + call psb_neigh(apnt,i,neigh,n_ne,info,lev=two) + if (info/=0) then + info=4010 + ch_err='psb_neigh' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + do n = 1, n_ne + m = neigh(n) + if ((1<=m).and.(m<=nr)) then + if (ilaggr(m) == -(nr+1)) ilaggr(m) = -naggr + endif + enddo + endif + enddo + nlp = nlp + 1 + if (icnt == 0) exit + enddo + if (debug) then + write(0,*) 'Check 1:',count(ilaggr == -(nr+1)),(a%ia1(i),i=a%ia2(1),a%ia2(2)-1) + end if + + ! + ! Phase two: sweep over leftovers. + ! + allocate(ils(naggr+10),stat=info) + if(info.ne.0) then + info=4025 + call psb_errpush(info,name,i_err=(/naggr+10,0,0,0,0/),& + & a_err='integer') + goto 9999 + end if + + do i=1, size(ils) + ils(i) = 0 + end do + do i=1, nr + n = ilaggr(i) + if (n>0) then + if (n>naggr) then + write(0,*) 'loc_Aggregate: n > naggr 1 ? ',n,naggr + else + ils(n) = ils(n) + 1 + end if + + end if + end do + if (debug) then + write(0,*) 'Phase 1: number of aggregates ',naggr + write(0,*) 'Phase 1: nodes aggregated ',sum(ils) + end if + + recovery=.false. + do i=1, nr + if (ilaggr(i) < 0) then ! - ! 2. Untouched neighbours of these nodes are marked <0. + ! Now some silly rule to break ties: + ! Group with smallest adjacent aggregate. ! - call psb_neigh(a,i,neigh,n_ne,info,lev=two) + isz = nr+1 + ia = -1 + + call psb_neigh(apnt,i,neigh,n_ne,info,lev=one) if (info/=0) then info=4010 ch_err='psb_neigh' @@ -129,158 +215,107 @@ subroutine mld_daggrmap_bld(aggr_type,a,desc_a,nlaggr,ilaggr,info) goto 9999 end if - do n = 1, n_ne - m = neigh(n) - if ((1<=m).and.(m<=nr)) then - if (ilaggr(m) == -(nr+1)) ilaggr(m) = -naggr + do j=1, n_ne + k = neigh(j) + if ((1<=k).and.(k<=nr)) then + n = ilaggr(k) + if (n>0) then + if (n>naggr) then + write(0,*) 'loc_Aggregate: n > naggr 2? ',n,naggr + end if + + if (ils(n) < isz) then + ia = n + isz = ils(n) + endif + endif endif enddo - endif - enddo - nlp = nlp + 1 - if (icnt == 0) exit - enddo - if (debug) then - write(0,*) 'Check 1:',count(ilaggr == -(nr+1)),(a%ia1(i),i=a%ia2(1),a%ia2(2)-1) - end if - - ! - ! Phase two: sweep over leftovers. - ! - allocate(ils(naggr+10),stat=info) - if(info.ne.0) then - info=4025 - call psb_errpush(info,name,i_err=(/naggr+10,0,0,0,0/),& - & a_err='integer') - goto 9999 - end if + if (ia == -1) then + if (ilaggr(i) > -(nr+1)) then + ilaggr(i) = abs(ilaggr(i)) + if (ilaggr(I)>naggr) then + write(0,*) 'loc_Aggregate: n > naggr 3? ',ilaggr(i),naggr + end if + ils(ilaggr(i)) = ils(ilaggr(i)) + 1 + ! + ! This might happen if the pattern is non symmetric. + ! Need a better handling. + ! + recovery = .true. + else + write(0,*) 'Unrecoverable error !!',ilaggr(i), nr + endif + else + ilaggr(i) = ia + if (ia>naggr) then + write(0,*) 'loc_Aggregate: n > naggr 4? ',ia,naggr + end if - do i=1, size(ils) - ils(i) = 0 - end do - do i=1, nr - n = ilaggr(i) - if (n>0) then - if (n>naggr) then - write(0,*) 'loc_Aggregate: n > naggr 1 ? ',n,naggr - else - ils(n) = ils(n) + 1 + ils(ia) = ils(ia) + 1 + endif end if - + enddo + if (recovery) then + write(0,*) 'Had to recover from strange situation in loc_aggregate.' + write(0,*) 'Perhaps an unsymmetric pattern?' + endif + if (debug) then + write(0,*) 'Phase 2: number of aggregates ',naggr + write(0,*) 'Phase 2: nodes aggregated ',sum(ils) + do i=1, naggr + write(*,*) 'Size of aggregate ',i,' :',count(ilaggr==i), ils(i) + enddo + write(*,*) maxval(ils(1:naggr)) + write(*,*) 'Leftovers ',count(ilaggr<0), ' in ',nlp,' loops' end if - end do - if (debug) then - write(0,*) 'Phase 1: number of aggregates ',naggr - write(0,*) 'Phase 1: nodes aggregated ',sum(ils) - end if - - recovery=.false. - do i=1, nr - if (ilaggr(i) < 0) then - ! - ! Now some silly rule to break ties: - ! Group with smallest adjacent aggregate. - ! - isz = nr+1 - ia = -1 - call psb_neigh(a,i,neigh,n_ne,info,lev=one) - if (info/=0) then - info=4010 - ch_err='psb_neigh' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - - do j=1, n_ne - k = neigh(j) - if ((1<=k).and.(k<=nr)) then - n = ilaggr(k) - if (n>0) then - if (n>naggr) then - write(0,*) 'loc_Aggregate: n > naggr 2? ',n,naggr - end if +!!$ write(0,*) 'desc_a loc_aggr 4 : ', desc_a%matrix_data(m_) + if (count(ilaggr<0) >0) then + write(0,*) 'Fatal error: some leftovers!!!' + endif - if (ils(n) < isz) then - ia = n - isz = ils(n) - endif - endif - endif - enddo - if (ia == -1) then - if (ilaggr(i) > -(nr+1)) then - ilaggr(i) = abs(ilaggr(i)) - if (ilaggr(I)>naggr) then - write(0,*) 'loc_Aggregate: n > naggr 3? ',ilaggr(i),naggr - end if - ils(ilaggr(i)) = ils(ilaggr(i)) + 1 - ! - ! This might happen if the pattern is non symmetric. - ! Need a better handling. - ! - recovery = .true. - else - write(0,*) 'Unrecoverable error !!',ilaggr(i), nr - endif - else - ilaggr(i) = ia - if (ia>naggr) then - write(0,*) 'loc_Aggregate: n > naggr 4? ',ia,naggr - end if + deallocate(ils,neigh,stat=info) + if (info/=0) then + info=4000 + call psb_errpush(info,name) + goto 9999 + end if - ils(ia) = ils(ia) + 1 - endif + if (nrow /= size(ilaggr)) then + write(0,*) 'SOmething wrong ilaggr ',nrow,size(ilaggr) + endif + call psb_realloc(ncol,ilaggr,info) + if (info/=0) then + info=4010 + ch_err='psb_realloc' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 end if - enddo - if (recovery) then - write(0,*) 'Had to recover from strange situation in loc_aggregate.' - write(0,*) 'Perhaps an unsymmetric pattern?' - endif - if (debug) then - write(0,*) 'Phase 2: number of aggregates ',naggr - write(0,*) 'Phase 2: nodes aggregated ',sum(ils) - do i=1, naggr - write(*,*) 'Size of aggregate ',i,' :',count(ilaggr==i), ils(i) - enddo - write(*,*) maxval(ils(1:naggr)) - write(*,*) 'Leftovers ',count(ilaggr<0), ' in ',nlp,' loops' - end if -!!$ write(0,*) 'desc_a loc_aggr 4 : ', desc_a%matrix_data(m_) - if (count(ilaggr<0) >0) then - write(0,*) 'Fatal error: some leftovers!!!' - endif + allocate(nlaggr(np),stat=info) + if (info/=0) then + info=4025 + call psb_errpush(info,name,i_err=(/np,0,0,0,0/),& + & a_err='integer') + goto 9999 + end if - deallocate(ils,neigh,stat=info) - if (info/=0) then - info=4000 - call psb_errpush(info,name) - goto 9999 - end if + nlaggr(:) = 0 + nlaggr(me+1) = naggr + call psb_sum(ictxt,nlaggr(1:np)) - if (nrow /= size(ilaggr)) then - write(0,*) 'SOmething wrong ilaggr ',nrow,size(ilaggr) - endif - call psb_realloc(ncol,ilaggr,info) - if (info/=0) then - info=4010 - ch_err='psb_realloc' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if + if (aggr_type == sym_dec_aggr_) then + call psb_sp_free(atmp,info) + end if - allocate(nlaggr(np),stat=info) - if (info/=0) then - info=4025 - call psb_errpush(info,name,i_err=(/np,0,0,0,0/),& - & a_err='integer') - goto 9999 - end if + case default - nlaggr(:) = 0 - nlaggr(me+1) = naggr - call psb_sum(ictxt,nlaggr(1:np)) + write(0,*) 'Unimplemented aggregation algorithm ',aggr_type + info = -1 + call psb_errpush(30,name,i_err=(/1,aggr_type,0,0,0/)) + goto 9999 + end select call psb_erractionrestore(err_act) return diff --git a/mld_zaggrmap_bld.f90 b/mld_zaggrmap_bld.f90 index 056481cc..f78fd5d0 100644 --- a/mld_zaggrmap_bld.f90 +++ b/mld_zaggrmap_bld.f90 @@ -40,13 +40,15 @@ subroutine mld_zaggrmap_bld(aggr_type,a,desc_a,nlaggr,ilaggr,info) implicit none integer, intent(in) :: aggr_type - type(psb_zspmat_type), intent(in) :: a + type(psb_zspmat_type), intent(in), target :: a type(psb_desc_type), intent(in) :: desc_a integer, allocatable :: ilaggr(:),nlaggr(:) integer, intent(out) :: info ! Locals integer, allocatable :: ils(:), neigh(:) integer :: icnt,nlp,k,n,ia,isz,nr, naggr,i,j,m + type(psb_zspmat_type), target :: atmp, atrans + type(psb_zspmat_type), pointer :: apnt logical :: recovery logical, parameter :: debug=.false. @@ -57,7 +59,7 @@ subroutine mld_zaggrmap_bld(aggr_type,a,desc_a,nlaggr,ilaggr,info) if(psb_get_errstatus().ne.0) return info=0 - name = 'mld_zaggrmap_bld' + name = 'mld_aggrmap_bld' call psb_erractionsave(err_act) ! ! Note. At the time being we are ignoring aggr_type @@ -69,114 +71,135 @@ subroutine mld_zaggrmap_bld(aggr_type,a,desc_a,nlaggr,ilaggr,info) nrow = psb_cd_get_local_rows(desc_a) ncol = psb_cd_get_local_cols(desc_a) - nr = a%m - allocate(ilaggr(nr),neigh(nr),stat=info) - if(info.ne.0) then - info=4025 - call psb_errpush(info,name,i_err=(/2*nr,0,0,0,0/),& - & a_err='integer') - goto 9999 - end if + select case (aggr_type) + case (dec_aggr_,sym_dec_aggr_) + + + nr = a%m + allocate(ilaggr(nr),neigh(nr),stat=info) + if(info.ne.0) then + info=4025 + call psb_errpush(info,name,i_err=(/2*nr,0,0,0,0/),& + & a_err='integer') + goto 9999 + end if - do i=1, nr - ilaggr(i) = -(nr+1) - end do - ! Note: -(nr+1) Untouched as yet - ! -i 1<=i<=nr Adjacent to aggregate i - ! i 1<=i<=nr Belonging to aggregate i + do i=1, nr + ilaggr(i) = -(nr+1) + end do + if (aggr_type == dec_aggr_) then + apnt => a + else + call psb_sp_clip(a,atmp,info,imax=nr,jmax=nr,& + & rscale=.false.,cscale=.false.) + atmp%m=nr + atmp%k=nr + call psb_transp(atmp,atrans,fmt='COO') + call psb_rwextd(nr,atmp,info,b=atrans,rowscale=.false.) + atmp%m=nr + atmp%k=nr + call psb_sp_free(atrans,info) + call psb_ipcoo2csr(atmp,info) + apnt => atmp + end if - ! - ! Phase one: group nodes together. - ! Very simple minded strategy. - ! - naggr = 0 - nlp = 0 - do - icnt = 0 - do i=1, nr + + ! Note: -(nr+1) Untouched as yet + ! -i 1<=i<=nr Adjacent to aggregate i + ! i 1<=i<=nr Belonging to aggregate i + + ! + ! Phase one: group nodes together. + ! Very simple minded strategy. + ! + naggr = 0 + nlp = 0 + do + icnt = 0 + do i=1, nr if (ilaggr(i) == -(nr+1)) then - ! - ! 1. Untouched nodes are marked >0 together - ! with their neighbours - ! - icnt = icnt + 1 - naggr = naggr + 1 - ilaggr(i) = naggr + ! + ! 1. Untouched nodes are marked >0 together + ! with their neighbours + ! + icnt = icnt + 1 + naggr = naggr + 1 + ilaggr(i) = naggr - call psb_neigh(a,i,neigh,n_ne,info,lev=one) - if (info/=0) then - info=4010 - ch_err='psb_neigh' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - do k=1, n_ne - j = neigh(k) - if ((1<=j).and.(j<=nr)) then - ilaggr(j) = naggr + call psb_neigh(apnt,i,neigh,n_ne,info,lev=one) + if (info/=0) then + info=4010 + ch_err='psb_neigh' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + do k=1, n_ne + j = neigh(k) + if ((1<=j).and.(j<=nr)) then + ilaggr(j) = naggr !!$ if (ilaggr(j) < 0) ilaggr(j) = naggr !!$ if (ilaggr(j) == -(nr+1)) ilaggr(j) = naggr - endif - enddo - ! - ! 2. Untouched neighbours of these nodes are marked <0. - ! - call psb_neigh(a,i,neigh,n_ne,info,lev=two) - if (info/=0) then - info=4010 - ch_err='psb_neigh' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if + endif + enddo + ! + ! 2. Untouched neighbours of these nodes are marked <0. + ! + call psb_neigh(apnt,i,neigh,n_ne,info,lev=two) + if (info/=0) then + info=4010 + ch_err='psb_neigh' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if - do n = 1, n_ne - m = neigh(n) - if ((1<=m).and.(m<=nr)) then - if (ilaggr(m) == -(nr+1)) ilaggr(m) = -naggr - endif - enddo + do n = 1, n_ne + m = neigh(n) + if ((1<=m).and.(m<=nr)) then + if (ilaggr(m) == -(nr+1)) ilaggr(m) = -naggr + endif + enddo endif - enddo - nlp = nlp + 1 - if (icnt == 0) exit - enddo - if (debug) then - write(0,*) 'Check 1:',count(ilaggr == -(nr+1)),(a%ia1(i),i=a%ia2(1),a%ia2(2)-1) - end if + enddo + nlp = nlp + 1 + if (icnt == 0) exit + enddo + if (debug) then + write(0,*) 'Check 1:',count(ilaggr == -(nr+1)),(a%ia1(i),i=a%ia2(1),a%ia2(2)-1) + end if - ! - ! Phase two: sweep over leftovers. - ! - allocate(ils(naggr+10),stat=info) - if(info.ne.0) then - info=4025 - call psb_errpush(info,name,i_err=(/naggr+10,0,0,0,0/),& - & a_err='integer') - goto 9999 - end if + ! + ! Phase two: sweep over leftovers. + ! + allocate(ils(naggr+10),stat=info) + if(info.ne.0) then + info=4025 + call psb_errpush(info,name,i_err=(/naggr+10,0,0,0,0/),& + & a_err='integer') + goto 9999 + end if - do i=1, size(ils) - ils(i) = 0 - end do - do i=1, nr - n = ilaggr(i) - if (n>0) then + do i=1, size(ils) + ils(i) = 0 + end do + do i=1, nr + n = ilaggr(i) + if (n>0) then if (n>naggr) then - write(0,*) 'loc_Aggregate: n > naggr 1 ? ',n,naggr + write(0,*) 'loc_Aggregate: n > naggr 1 ? ',n,naggr else - ils(n) = ils(n) + 1 + ils(n) = ils(n) + 1 end if - end if - end do - if (debug) then - write(0,*) 'Phase 1: number of aggregates ',naggr - write(0,*) 'Phase 1: nodes aggregated ',sum(ils) - end if + end if + end do + if (debug) then + write(0,*) 'Phase 1: number of aggregates ',naggr + write(0,*) 'Phase 1: nodes aggregated ',sum(ils) + end if - recovery=.false. - do i=1, nr - if (ilaggr(i) < 0) then + recovery=.false. + do i=1, nr + if (ilaggr(i) < 0) then ! ! Now some silly rule to break ties: ! Group with smallest adjacent aggregate. @@ -184,103 +207,115 @@ subroutine mld_zaggrmap_bld(aggr_type,a,desc_a,nlaggr,ilaggr,info) isz = nr+1 ia = -1 - call psb_neigh(a,i,neigh,n_ne,info,lev=one) + call psb_neigh(apnt,i,neigh,n_ne,info,lev=one) if (info/=0) then - info=4010 - ch_err='psb_neigh' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 + info=4010 + ch_err='psb_neigh' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 end if do j=1, n_ne - k = neigh(j) - if ((1<=k).and.(k<=nr)) then - n = ilaggr(k) - if (n>0) then - if (n>naggr) then - write(0,*) 'loc_Aggregate: n > naggr 2? ',n,naggr - end if + k = neigh(j) + if ((1<=k).and.(k<=nr)) then + n = ilaggr(k) + if (n>0) then + if (n>naggr) then + write(0,*) 'loc_Aggregate: n > naggr 2? ',n,naggr + end if - if (ils(n) < isz) then - ia = n - isz = ils(n) - endif + if (ils(n) < isz) then + ia = n + isz = ils(n) endif - endif + endif + endif enddo if (ia == -1) then - if (ilaggr(i) > -(nr+1)) then - ilaggr(i) = abs(ilaggr(i)) - if (ilaggr(I)>naggr) then - write(0,*) 'loc_Aggregate: n > naggr 3? ',ilaggr(i),naggr - end if - ils(ilaggr(i)) = ils(ilaggr(i)) + 1 - ! - ! This might happen if the pattern is non symmetric. - ! Need a better handling. - ! - recovery = .true. - else - write(0,*) 'Unrecoverable error !!',ilaggr(i), nr - endif + if (ilaggr(i) > -(nr+1)) then + ilaggr(i) = abs(ilaggr(i)) + if (ilaggr(I)>naggr) then + write(0,*) 'loc_Aggregate: n > naggr 3? ',ilaggr(i),naggr + end if + ils(ilaggr(i)) = ils(ilaggr(i)) + 1 + ! + ! This might happen if the pattern is non symmetric. + ! Need a better handling. + ! + recovery = .true. + else + write(0,*) 'Unrecoverable error !!',ilaggr(i), nr + endif else - ilaggr(i) = ia - if (ia>naggr) then - write(0,*) 'loc_Aggregate: n > naggr 4? ',ia,naggr - end if + ilaggr(i) = ia + if (ia>naggr) then + write(0,*) 'loc_Aggregate: n > naggr 4? ',ia,naggr + end if - ils(ia) = ils(ia) + 1 + ils(ia) = ils(ia) + 1 endif - end if - enddo - if (recovery) then - write(0,*) 'Had to recover from strange situation in loc_aggregate.' - write(0,*) 'Perhaps an unsymmetric pattern?' - endif - if (debug) then - write(0,*) 'Phase 2: number of aggregates ',naggr - write(0,*) 'Phase 2: nodes aggregated ',sum(ils) - do i=1, naggr + end if + enddo + if (recovery) then + write(0,*) 'Had to recover from strange situation in loc_aggregate.' + write(0,*) 'Perhaps an unsymmetric pattern?' + endif + if (debug) then + write(0,*) 'Phase 2: number of aggregates ',naggr + write(0,*) 'Phase 2: nodes aggregated ',sum(ils) + do i=1, naggr write(*,*) 'Size of aggregate ',i,' :',count(ilaggr==i), ils(i) - enddo - write(*,*) maxval(ils(1:naggr)) - write(*,*) 'Leftovers ',count(ilaggr<0), ' in ',nlp,' loops' - end if + enddo + write(*,*) maxval(ils(1:naggr)) + write(*,*) 'Leftovers ',count(ilaggr<0), ' in ',nlp,' loops' + end if !!$ write(0,*) 'desc_a loc_aggr 4 : ', desc_a%matrix_data(m_) - if (count(ilaggr<0) >0) then - write(0,*) 'Fatal error: some leftovers!!!' - endif + if (count(ilaggr<0) >0) then + write(0,*) 'Fatal error: some leftovers!!!' + endif - deallocate(ils,neigh,stat=info) - if (info/=0) then - info=4000 - call psb_errpush(info,name) - goto 9999 - end if + deallocate(ils,neigh,stat=info) + if (info/=0) then + info=4000 + call psb_errpush(info,name) + goto 9999 + end if - if (nrow /= size(ilaggr)) then - write(0,*) 'SOmething wrong ilaggr ',nrow,size(ilaggr) - endif - call psb_realloc(ncol,ilaggr,info) - if (info/=0) then - info=4010 - ch_err='psb_realloc' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if + if (nrow /= size(ilaggr)) then + write(0,*) 'SOmething wrong ilaggr ',nrow,size(ilaggr) + endif + call psb_realloc(ncol,ilaggr,info) + if (info/=0) then + info=4010 + ch_err='psb_realloc' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if - allocate(nlaggr(np),stat=info) - if (info/=0) then - info=4025 - call psb_errpush(info,name,i_err=(/np,0,0,0,0/),& - & a_err='integer') - goto 9999 - end if + allocate(nlaggr(np),stat=info) + if (info/=0) then + info=4025 + call psb_errpush(info,name,i_err=(/np,0,0,0,0/),& + & a_err='integer') + goto 9999 + end if + + nlaggr(:) = 0 + nlaggr(me+1) = naggr + call psb_sum(ictxt,nlaggr(1:np)) + + if (aggr_type == sym_dec_aggr_) then + call psb_sp_free(atmp,info) + end if + + case default - nlaggr(:) = 0 - nlaggr(me+1) = naggr - call psb_sum(ictxt,nlaggr(1:np)) + write(0,*) 'Unimplemented aggregation algorithm ',aggr_type + info = -1 + call psb_errpush(30,name,i_err=(/1,aggr_type,0,0,0/)) + goto 9999 + end select call psb_erractionrestore(err_act) return @@ -288,8 +323,8 @@ subroutine mld_zaggrmap_bld(aggr_type,a,desc_a,nlaggr,ilaggr,info) 9999 continue call psb_erractionrestore(err_act) if (err_act.eq.psb_act_abort_) then - call psb_error() - return + call psb_error() + return end if return