First round of changes to use more @X@ than @LX@ in build process

unify_aggr_bld
Salvatore Filippone 6 years ago
parent 5c9c00c7b8
commit 56b5d53a86

@ -83,7 +83,7 @@
! info - integer, output. ! info - integer, output.
! Error code. ! Error code.
! !
subroutine mld_c_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,& subroutine mld_c_dec_aggregator_mat_asb(ag,parms,a,desc_a,&
& ac,desc_ac, op_prol,op_restr,info) & ac,desc_ac, op_prol,op_restr,info)
use psb_base_mod use psb_base_mod
use mld_base_prec_type use mld_base_prec_type
@ -93,8 +93,7 @@ subroutine mld_c_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,&
type(mld_sml_parms), intent(inout) :: parms type(mld_sml_parms), intent(inout) :: parms
type(psb_cspmat_type), intent(in) :: a type(psb_cspmat_type), intent(in) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(psb_cspmat_type), intent(inout) :: op_prol, ac,op_restr
type(psb_lcspmat_type), intent(inout) :: op_prol, ac,op_restr
type(psb_desc_type), intent(inout) :: desc_ac type(psb_desc_type), intent(inout) :: desc_ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
! !
@ -102,7 +101,7 @@ subroutine mld_c_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,&
type(psb_lc_coo_sparse_mat) :: tmpcoo type(psb_lc_coo_sparse_mat) :: tmpcoo
type(psb_c_coo_sparse_mat) :: acoo type(psb_c_coo_sparse_mat) :: acoo
type(psb_lc_csr_sparse_mat) :: acsr1 type(psb_lc_csr_sparse_mat) :: acsr1
type(psb_cspmat_type) :: tmp_ac type(psb_lcspmat_type) :: tmp_ac
integer(psb_ipk_) :: i_nr, i_nc, i_nl, nzl integer(psb_ipk_) :: i_nr, i_nc, i_nl, nzl
integer(psb_lpk_) :: ntaggr integer(psb_lpk_) :: ntaggr
integer(psb_ipk_) :: err_act, debug_level, debug_unit integer(psb_ipk_) :: err_act, debug_level, debug_unit
@ -117,8 +116,6 @@ subroutine mld_c_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,&
ictxt = desc_a%get_context() ictxt = desc_a%get_context()
call psb_info(ictxt,me,np) call psb_info(ictxt,me,np)
ntaggr = sum(nlaggr)
select case(parms%coarse_mat) select case(parms%coarse_mat)
case(mld_distr_mat_) case(mld_distr_mat_)
@ -133,7 +130,18 @@ subroutine mld_c_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,&
case(mld_repl_mat_) case(mld_repl_mat_)
! !
! We are assuming here that an c matrix
! can hold all entries
! !
if (desc_ac%get_global_rows() < huge(1_psb_ipk_) ) then
ntaggr = desc_ac%get_global_rows()
i_nr = ntaggr
else
info = psb_err_internal_error_
call psb_errpush(info,name,a_err='invalid mld_coarse_mat_')
goto 9999
end if
call op_prol%mv_to(tmpcoo) call op_prol%mv_to(tmpcoo)
nzl = tmpcoo%get_nzeros() nzl = tmpcoo%get_nzeros()
call psb_loc_to_glob(tmpcoo%ja(1:nzl),desc_ac,info,'I') call psb_loc_to_glob(tmpcoo%ja(1:nzl),desc_ac,info,'I')
@ -144,13 +152,14 @@ subroutine mld_c_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,&
call psb_loc_to_glob(tmpcoo%ia(1:nzl),desc_ac,info,'I') call psb_loc_to_glob(tmpcoo%ia(1:nzl),desc_ac,info,'I')
call op_restr%mv_from(tmpcoo) call op_restr%mv_from(tmpcoo)
call op_prol%set_ncols(ntaggr) call op_prol%set_ncols(i_nr)
call op_restr%set_nrows(ntaggr) call op_restr%set_nrows(i_nr)
call ac%mv_to(tmpcoo)
call tmp_ac%mv_from(tmpcoo)
call psb_gather(ac,tmp_ac,desc_ac,info,root=-ione,dupl=psb_dupl_add_,keeploc=.false.)
call psb_gather(tmp_ac,ac,desc_ac,info,root=-ione,&
& dupl=psb_dupl_add_,keeploc=.false.)
call tmp_ac%mv_to(tmpcoo)
call ac%mv_from(tmpcoo)
call psb_cdall(ictxt,desc_ac,info,mg=ntaggr,repl=.true.) call psb_cdall(ictxt,desc_ac,info,mg=ntaggr,repl=.true.)
if (info == psb_success_) call psb_cdasb(desc_ac,info) if (info == psb_success_) call psb_cdasb(desc_ac,info)

@ -134,7 +134,7 @@
! Error code. ! Error code.
! !
subroutine mld_c_dec_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,& subroutine mld_c_dec_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,&
& ac,desc_ac,op_prol,op_restr,info) & ac,desc_ac,op_prol,op_restr,t_prol,info)
use psb_base_mod use psb_base_mod
use mld_c_prec_type, mld_protect_name => mld_c_dec_aggregator_mat_bld use mld_c_prec_type, mld_protect_name => mld_c_dec_aggregator_mat_bld
use mld_c_inner_mod use mld_c_inner_mod
@ -145,16 +145,14 @@ subroutine mld_c_dec_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,&
type(psb_cspmat_type), intent(in) :: a type(psb_cspmat_type), intent(in) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
type(psb_lcspmat_type), intent(inout) :: op_prol type(psb_lcspmat_type), intent(inout) :: t_prol
type(psb_lcspmat_type), intent(out) :: ac,op_restr type(psb_cspmat_type), intent(out) :: op_prol,ac,op_restr
type(psb_desc_type), intent(inout) :: desc_ac type(psb_desc_type), intent(inout) :: desc_ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
! Local variables ! Local variables
character(len=20) :: name character(len=20) :: name
integer(psb_mpk_) :: ictxt, np, me integer(psb_mpk_) :: ictxt, np, me
type(psb_lc_coo_sparse_mat) :: acoo, bcoo
type(psb_lc_csr_sparse_mat) :: acsr1
integer(psb_lpk_) :: nzl,ntaggr integer(psb_lpk_) :: nzl,ntaggr
integer(psb_ipk_) :: err_act integer(psb_ipk_) :: err_act
integer(psb_ipk_) :: debug_level, debug_unit integer(psb_ipk_) :: debug_level, debug_unit
@ -179,22 +177,22 @@ subroutine mld_c_dec_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,&
case (mld_no_smooth_) case (mld_no_smooth_)
call mld_caggrmat_nosmth_bld(a,desc_a,ilaggr,nlaggr,& call mld_caggrmat_nosmth_bld(a,desc_a,ilaggr,nlaggr,&
& parms,ac,desc_ac,op_prol,op_restr,info) & parms,ac,desc_ac,op_prol,op_restr,t_prol,info)
case(mld_smooth_prol_) case(mld_smooth_prol_)
call mld_caggrmat_smth_bld(a,desc_a,ilaggr,nlaggr, & call mld_caggrmat_smth_bld(a,desc_a,ilaggr,nlaggr, &
& parms,ac,desc_ac,op_prol,op_restr,info) & parms,ac,desc_ac,op_prol,op_restr,t_prol,info)
!!$ case(mld_biz_prol_) !!$ case(mld_biz_prol_)
!!$ !!$
!!$ call mld_caggrmat_biz_bld(a,desc_a,ilaggr,nlaggr, & !!$ call mld_caggrmat_biz_bld(a,desc_a,ilaggr,nlaggr, &
!!$ & parms,ac,desc_ac,op_prol,op_restr,info) !!$ & parms,ac,desc_ac,op_prol,op_restr,t_prol,info)
case(mld_min_energy_) case(mld_min_energy_)
call mld_caggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr, & call mld_caggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr, &
& parms,ac,desc_ac,op_prol,op_restr,info) & parms,ac,desc_ac,op_prol,op_restr,t_prol,info)
case default case default
info = psb_err_internal_error_ info = psb_err_internal_error_

@ -68,14 +68,14 @@
! overlap. ! overlap.
! nlaggr - integer, dimension(:), allocatable, output ! nlaggr - integer, dimension(:), allocatable, output
! nlaggr(i) contains the aggregates held by process i. ! nlaggr(i) contains the aggregates held by process i.
! op_prol - type(psb_cspmat_type), output ! t_prol - type(psb_cspmat_type), output
! The tentative prolongator, based on ilaggr. ! The tentative prolongator, based on ilaggr.
! !
! info - integer, output. ! info - integer, output.
! Error code. ! Error code.
! !
subroutine mld_c_dec_aggregator_build_tprol(ag,parms,ag_data,& subroutine mld_c_dec_aggregator_build_tprol(ag,parms,ag_data,&
& a,desc_a,ilaggr,nlaggr,op_prol,info) & a,desc_a,ilaggr,nlaggr,t_prol,info)
use psb_base_mod use psb_base_mod
use mld_c_prec_type, mld_protect_name => mld_c_dec_aggregator_build_tprol use mld_c_prec_type, mld_protect_name => mld_c_dec_aggregator_build_tprol
use mld_c_inner_mod use mld_c_inner_mod
@ -86,7 +86,7 @@ subroutine mld_c_dec_aggregator_build_tprol(ag,parms,ag_data,&
type(psb_cspmat_type), intent(in) :: a type(psb_cspmat_type), intent(in) :: a
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:)
type(psb_lcspmat_type), intent(out) :: op_prol type(psb_lcspmat_type), intent(out) :: t_prol
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
! Local variables ! Local variables
@ -123,7 +123,7 @@ subroutine mld_c_dec_aggregator_build_tprol(ag,parms,ag_data,&
clean_zeros = ag%do_clean_zeros clean_zeros = ag%do_clean_zeros
call ag%soc_map_bld(parms%aggr_ord,parms%aggr_thresh,clean_zeros,a,desc_a,nlaggr,ilaggr,info) call ag%soc_map_bld(parms%aggr_ord,parms%aggr_thresh,clean_zeros,a,desc_a,nlaggr,ilaggr,info)
if (info==psb_success_) call mld_map_to_tprol(desc_a,ilaggr,nlaggr,op_prol,info) if (info==psb_success_) call mld_map_to_tprol(desc_a,ilaggr,nlaggr,t_prol,info)
if (info /= psb_success_) then if (info /= psb_success_) then
info=psb_err_from_subroutine_ info=psb_err_from_subroutine_
call psb_errpush(info,name,a_err='soc_map_bld/map_to_tprol') call psb_errpush(info,name,a_err='soc_map_bld/map_to_tprol')

@ -42,6 +42,220 @@ subroutine mld_c_ptap(a_csr,desc_a,nlaggr,parms,ac,&
use mld_c_base_aggregator_mod, mld_protect_name => mld_c_ptap use mld_c_base_aggregator_mod, mld_protect_name => mld_c_ptap
implicit none implicit none
! Arguments
type(psb_c_csr_sparse_mat), intent(inout) :: a_csr
type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: nlaggr(:)
type(mld_sml_parms), intent(inout) :: parms
type(psb_c_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr
type(psb_desc_type), intent(inout) :: desc_ac
type(psb_cspmat_type), intent(out) :: ac
integer(psb_ipk_), intent(out) :: info
type(psb_desc_type), intent(inout), optional :: desc_ax
! Local variables
integer(psb_ipk_) :: err_act
integer(psb_ipk_) :: ictxt,np,me, icomm, ndx, minfo
character(len=40) :: name
integer(psb_ipk_) :: ierr(5)
type(psb_lc_coo_sparse_mat) :: ac_coo, tmpcoo
type(psb_c_csr_sparse_mat) :: acsr3, csr_prol, ac_csr, csr_restr
integer(psb_ipk_) :: debug_level, debug_unit, naggr
integer(psb_lpk_) :: nglob, ntaggr, naggrm1, naggrp1
integer(psb_ipk_) :: nrow, ncol, nrl, nzl, ip, nzt, i, k
integer(psb_lpk_) :: nrsave, ncsave, nzsave, nza
logical, parameter :: do_timings=.false., oldstyle=.false., debug=.false.
integer(psb_ipk_), save :: idx_spspmm=-1
name='mld_ptap'
if(psb_get_errstatus().ne.0) return
info=psb_success_
call psb_erractionsave(err_act)
ictxt = desc_a%get_context()
icomm = desc_a%get_mpic()
call psb_info(ictxt, me, np)
debug_unit = psb_get_debug_unit()
debug_level = psb_get_debug_level()
nglob = desc_a%get_global_rows()
nrow = desc_a%get_local_rows()
ncol = desc_a%get_local_cols()
if ((do_timings).and.(idx_spspmm==-1)) &
& idx_spspmm = psb_get_timer_idx("SPMM_BLD: par_spspmm")
naggr = nlaggr(me+1)
ntaggr = sum(nlaggr)
naggrm1 = sum(nlaggr(1:me))
naggrp1 = sum(nlaggr(1:me+1))
!write(0,*)me,' ',name,' input sizes',nlaggr(:),':',naggr
!
! COO_PROL should arrive here with local numbering
!
if (debug) write(0,*) me,' ',trim(name),' Size check on entry New: ',&
& coo_prol%get_fmt(),coo_prol%get_nrows(),coo_prol%get_ncols(),coo_prol%get_nzeros(),&
& nrow,ntaggr,naggr
call coo_prol%cp_to_fmt(csr_prol,info)
if (debug) write(0,*) me,trim(name),' Product AxPROL ',&
& a_csr%get_nrows(),a_csr%get_ncols(), csr_prol%get_nrows(), &
& desc_a%get_local_rows(),desc_a%get_local_cols(),&
& desc_ac%get_local_rows(),desc_a%get_local_cols()
if (debug) flush(0)
if (do_timings) call psb_tic(idx_spspmm)
call psb_par_spspmm(a_csr,desc_a,csr_prol,acsr3,desc_ac,info)
if (do_timings) call psb_toc(idx_spspmm)
if (debug) write(0,*) me,trim(name),' Done AxPROL ',&
& acsr3%get_nrows(),acsr3%get_ncols(), acsr3%get_nzeros(),&
& desc_ac%get_local_rows(),desc_ac%get_local_cols()
!
! Ok first product done.
if (present(desc_ax)) then
block
call coo_prol%cp_to_coo(coo_restr,info)
call coo_restr%set_ncols(desc_ac%get_local_cols())
call coo_restr%set_nrows(desc_a%get_local_rows())
call psb_c_coo_glob_transpose(coo_restr,desc_a,info,desc_c=desc_ac,desc_rx=desc_ax)
call coo_restr%set_nrows(desc_ac%get_local_rows())
call coo_restr%set_ncols(desc_ax%get_local_cols())
write(0,*) me,' ',trim(name),' check on glob_transpose 1: ',&
& desc_a%get_local_cols(),desc_ax%get_local_cols(),coo_restr%get_nzeros()
if (desc_a%get_local_cols()<desc_ax%get_local_cols()) then
write(0,*) me,' ',trim(name),' WARNING: GLOB_TRANSPOSE NEW INDICES '
end if
end block
call csr_restr%cp_from_coo(coo_restr,info)
!!$ write(0,*)me,' ',name,' after transposition ',coo_restr%get_nrows(),coo_restr%get_ncols(),coo_restr%get_nzeros()
if (info /= psb_success_) then
call psb_errpush(psb_err_from_subroutine_,name,a_err='spcnv coo_restr')
goto 9999
end if
if (debug_level >= psb_debug_outer_) &
& write(debug_unit,*) me,' ',trim(name),&
& 'starting sphalo/ rwxtd'
if (debug) write(0,*) me,trim(name),' Product RESTRxAP ',&
& csr_restr%get_nrows(),csr_restr%get_ncols(), &
& desc_ac%get_local_rows(),desc_a%get_local_cols(),&
& acsr3%get_nrows(),acsr3%get_ncols()
if (do_timings) call psb_tic(idx_spspmm)
call psb_par_spspmm(csr_restr,desc_ax,acsr3,ac_csr,desc_ac,info)
if (do_timings) call psb_toc(idx_spspmm)
call acsr3%free()
else
!
! Remember that RESTR must be built from PROL after halo extension,
! which is done above in psb_par_spspmm
if (debug) write(0,*)me,' ',name,' No inp_restr, transposing prol ',&
& csr_prol%get_nrows(),csr_prol%get_ncols(),csr_prol%get_nzeros()
call csr_prol%mv_to_coo(coo_restr,info)
!!$ write(0,*)me,' ',name,' new into transposition ',coo_restr%get_nrows(),&
!!$ & coo_restr%get_ncols(),coo_restr%get_nzeros()
if (debug) call check_coo(me,trim(name)//' Check 1 (before transp) on coo_restr:',coo_restr)
call coo_restr%transp()
nzl = coo_restr%get_nzeros()
nrl = desc_ac%get_local_rows()
i=0
!
! Only keep local rows
!
do k=1, nzl
if ((1 <= coo_restr%ia(k)) .and.(coo_restr%ia(k) <= nrl)) then
i = i+1
coo_restr%val(i) = coo_restr%val(k)
coo_restr%ia(i) = coo_restr%ia(k)
coo_restr%ja(i) = coo_restr%ja(k)
end if
end do
call coo_restr%set_nzeros(i)
call coo_restr%fix(info)
nzl = coo_restr%get_nzeros()
call coo_restr%set_nrows(desc_ac%get_local_rows())
call coo_restr%set_ncols(desc_a%get_local_cols())
if (debug) call check_coo(me,trim(name)//' Check 2 on coo_restr:',coo_restr)
call csr_restr%cp_from_coo(coo_restr,info)
!!$ write(0,*)me,' ',name,' after transposition ',coo_restr%get_nrows(),coo_restr%get_ncols(),coo_restr%get_nzeros()
if (info /= psb_success_) then
call psb_errpush(psb_err_from_subroutine_,name,a_err='spcnv coo_restr')
goto 9999
end if
if (debug_level >= psb_debug_outer_) &
& write(debug_unit,*) me,' ',trim(name),&
& 'starting sphalo/ rwxtd'
if (debug) write(0,*) me,trim(name),' Product RESTRxAP ',&
& csr_restr%get_nrows(),csr_restr%get_ncols(), &
& desc_ac%get_local_rows(),desc_a%get_local_cols(),&
& acsr3%get_nrows(),acsr3%get_ncols()
if (do_timings) call psb_tic(idx_spspmm)
call psb_par_spspmm(csr_restr,desc_a,acsr3,ac_csr,desc_ac,info)
if (do_timings) call psb_toc(idx_spspmm)
call acsr3%free()
end if
call psb_cdasb(desc_ac,info)
call ac_csr%set_nrows(desc_ac%get_local_rows())
call ac_csr%set_ncols(desc_ac%get_local_cols())
call ac%mv_from(ac_csr)
call ac%set_asb()
if (debug) write(0,*) me,' ',trim(name),' After mv_from',psb_get_errstatus()
if (debug) write(0,*) me,' ',trim(name),' ',ac%get_fmt(),ac%get_nrows(),ac%get_ncols(),ac%get_nzeros(),naggr,ntaggr
! write(0,*) me,' ',trim(name),' Final AC newstyle ',ac%get_fmt(),ac%get_nrows(),ac%get_ncols(),ac%get_nzeros()
call coo_prol%set_ncols(desc_ac%get_local_cols())
if (debug) call check_coo(me,trim(name)//' Check 3 on coo_restr:',coo_restr)
if (debug_level >= psb_debug_outer_) &
& write(debug_unit,*) me,' ',trim(name),&
& 'Done ptap '
call psb_erractionrestore(err_act)
return
9999 call psb_error_handler(err_act)
return
contains
subroutine check_coo(me,string,coo)
implicit none
integer(psb_ipk_) :: me
type(psb_c_coo_sparse_mat) :: coo
character(len=*) :: string
integer(psb_lpk_) :: nr,nc,nz
nr = coo%get_nrows()
nc = coo%get_ncols()
nz = coo%get_nzeros()
write(0,*) me,string,nr,nc,&
& minval(coo%ia(1:nz)),maxval(coo%ia(1:nz)),&
& minval(coo%ja(1:nz)),maxval(coo%ja(1:nz))
end subroutine check_coo
end subroutine mld_c_ptap
subroutine mld_c_lc_ptap(a_csr,desc_a,nlaggr,parms,ac,&
& coo_prol,desc_ac,coo_restr,info,desc_ax)
use psb_base_mod
use mld_c_inner_mod
use mld_c_base_aggregator_mod, mld_protect_name => mld_c_lc_ptap
implicit none
! Arguments ! Arguments
type(psb_c_csr_sparse_mat), intent(inout) :: a_csr type(psb_c_csr_sparse_mat), intent(inout) :: a_csr
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
@ -250,7 +464,7 @@ contains
end subroutine check_coo end subroutine check_coo
end subroutine mld_c_ptap end subroutine mld_c_lc_ptap
subroutine mld_lc_ptap(a_csr,desc_a,nlaggr,parms,ac,& subroutine mld_lc_ptap(a_csr,desc_a,nlaggr,parms,ac,&
& coo_prol,desc_ac,coo_restr,info,desc_ax) & coo_prol,desc_ac,coo_restr,info,desc_ax)

@ -83,7 +83,7 @@
! info - integer, output. ! info - integer, output.
! Error code. ! Error code.
! !
subroutine mld_d_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,& subroutine mld_d_dec_aggregator_mat_asb(ag,parms,a,desc_a,&
& ac,desc_ac, op_prol,op_restr,info) & ac,desc_ac, op_prol,op_restr,info)
use psb_base_mod use psb_base_mod
use mld_base_prec_type use mld_base_prec_type
@ -93,8 +93,7 @@ subroutine mld_d_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,&
type(mld_dml_parms), intent(inout) :: parms type(mld_dml_parms), intent(inout) :: parms
type(psb_dspmat_type), intent(in) :: a type(psb_dspmat_type), intent(in) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(psb_dspmat_type), intent(inout) :: op_prol, ac,op_restr
type(psb_ldspmat_type), intent(inout) :: op_prol, ac,op_restr
type(psb_desc_type), intent(inout) :: desc_ac type(psb_desc_type), intent(inout) :: desc_ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
! !
@ -102,7 +101,7 @@ subroutine mld_d_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,&
type(psb_ld_coo_sparse_mat) :: tmpcoo type(psb_ld_coo_sparse_mat) :: tmpcoo
type(psb_d_coo_sparse_mat) :: acoo type(psb_d_coo_sparse_mat) :: acoo
type(psb_ld_csr_sparse_mat) :: acsr1 type(psb_ld_csr_sparse_mat) :: acsr1
type(psb_dspmat_type) :: tmp_ac type(psb_ldspmat_type) :: tmp_ac
integer(psb_ipk_) :: i_nr, i_nc, i_nl, nzl integer(psb_ipk_) :: i_nr, i_nc, i_nl, nzl
integer(psb_lpk_) :: ntaggr integer(psb_lpk_) :: ntaggr
integer(psb_ipk_) :: err_act, debug_level, debug_unit integer(psb_ipk_) :: err_act, debug_level, debug_unit
@ -117,8 +116,6 @@ subroutine mld_d_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,&
ictxt = desc_a%get_context() ictxt = desc_a%get_context()
call psb_info(ictxt,me,np) call psb_info(ictxt,me,np)
ntaggr = sum(nlaggr)
select case(parms%coarse_mat) select case(parms%coarse_mat)
case(mld_distr_mat_) case(mld_distr_mat_)
@ -133,7 +130,18 @@ subroutine mld_d_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,&
case(mld_repl_mat_) case(mld_repl_mat_)
! !
! We are assuming here that an d matrix
! can hold all entries
! !
if (desc_ac%get_global_rows() < huge(1_psb_ipk_) ) then
ntaggr = desc_ac%get_global_rows()
i_nr = ntaggr
else
info = psb_err_internal_error_
call psb_errpush(info,name,a_err='invalid mld_coarse_mat_')
goto 9999
end if
call op_prol%mv_to(tmpcoo) call op_prol%mv_to(tmpcoo)
nzl = tmpcoo%get_nzeros() nzl = tmpcoo%get_nzeros()
call psb_loc_to_glob(tmpcoo%ja(1:nzl),desc_ac,info,'I') call psb_loc_to_glob(tmpcoo%ja(1:nzl),desc_ac,info,'I')
@ -144,13 +152,14 @@ subroutine mld_d_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,&
call psb_loc_to_glob(tmpcoo%ia(1:nzl),desc_ac,info,'I') call psb_loc_to_glob(tmpcoo%ia(1:nzl),desc_ac,info,'I')
call op_restr%mv_from(tmpcoo) call op_restr%mv_from(tmpcoo)
call op_prol%set_ncols(ntaggr) call op_prol%set_ncols(i_nr)
call op_restr%set_nrows(ntaggr) call op_restr%set_nrows(i_nr)
call ac%mv_to(tmpcoo)
call tmp_ac%mv_from(tmpcoo)
call psb_gather(ac,tmp_ac,desc_ac,info,root=-ione,dupl=psb_dupl_add_,keeploc=.false.)
call psb_gather(tmp_ac,ac,desc_ac,info,root=-ione,&
& dupl=psb_dupl_add_,keeploc=.false.)
call tmp_ac%mv_to(tmpcoo)
call ac%mv_from(tmpcoo)
call psb_cdall(ictxt,desc_ac,info,mg=ntaggr,repl=.true.) call psb_cdall(ictxt,desc_ac,info,mg=ntaggr,repl=.true.)
if (info == psb_success_) call psb_cdasb(desc_ac,info) if (info == psb_success_) call psb_cdasb(desc_ac,info)

@ -134,7 +134,7 @@
! Error code. ! Error code.
! !
subroutine mld_d_dec_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,& subroutine mld_d_dec_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,&
& ac,desc_ac,op_prol,op_restr,info) & ac,desc_ac,op_prol,op_restr,t_prol,info)
use psb_base_mod use psb_base_mod
use mld_d_prec_type, mld_protect_name => mld_d_dec_aggregator_mat_bld use mld_d_prec_type, mld_protect_name => mld_d_dec_aggregator_mat_bld
use mld_d_inner_mod use mld_d_inner_mod
@ -145,16 +145,14 @@ subroutine mld_d_dec_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,&
type(psb_dspmat_type), intent(in) :: a type(psb_dspmat_type), intent(in) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
type(psb_ldspmat_type), intent(inout) :: op_prol type(psb_ldspmat_type), intent(inout) :: t_prol
type(psb_ldspmat_type), intent(out) :: ac,op_restr type(psb_dspmat_type), intent(out) :: op_prol,ac,op_restr
type(psb_desc_type), intent(inout) :: desc_ac type(psb_desc_type), intent(inout) :: desc_ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
! Local variables ! Local variables
character(len=20) :: name character(len=20) :: name
integer(psb_mpk_) :: ictxt, np, me integer(psb_mpk_) :: ictxt, np, me
type(psb_ld_coo_sparse_mat) :: acoo, bcoo
type(psb_ld_csr_sparse_mat) :: acsr1
integer(psb_lpk_) :: nzl,ntaggr integer(psb_lpk_) :: nzl,ntaggr
integer(psb_ipk_) :: err_act integer(psb_ipk_) :: err_act
integer(psb_ipk_) :: debug_level, debug_unit integer(psb_ipk_) :: debug_level, debug_unit
@ -179,22 +177,22 @@ subroutine mld_d_dec_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,&
case (mld_no_smooth_) case (mld_no_smooth_)
call mld_daggrmat_nosmth_bld(a,desc_a,ilaggr,nlaggr,& call mld_daggrmat_nosmth_bld(a,desc_a,ilaggr,nlaggr,&
& parms,ac,desc_ac,op_prol,op_restr,info) & parms,ac,desc_ac,op_prol,op_restr,t_prol,info)
case(mld_smooth_prol_) case(mld_smooth_prol_)
call mld_daggrmat_smth_bld(a,desc_a,ilaggr,nlaggr, & call mld_daggrmat_smth_bld(a,desc_a,ilaggr,nlaggr, &
& parms,ac,desc_ac,op_prol,op_restr,info) & parms,ac,desc_ac,op_prol,op_restr,t_prol,info)
!!$ case(mld_biz_prol_) !!$ case(mld_biz_prol_)
!!$ !!$
!!$ call mld_daggrmat_biz_bld(a,desc_a,ilaggr,nlaggr, & !!$ call mld_daggrmat_biz_bld(a,desc_a,ilaggr,nlaggr, &
!!$ & parms,ac,desc_ac,op_prol,op_restr,info) !!$ & parms,ac,desc_ac,op_prol,op_restr,t_prol,info)
case(mld_min_energy_) case(mld_min_energy_)
call mld_daggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr, & call mld_daggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr, &
& parms,ac,desc_ac,op_prol,op_restr,info) & parms,ac,desc_ac,op_prol,op_restr,t_prol,info)
case default case default
info = psb_err_internal_error_ info = psb_err_internal_error_

@ -68,14 +68,14 @@
! overlap. ! overlap.
! nlaggr - integer, dimension(:), allocatable, output ! nlaggr - integer, dimension(:), allocatable, output
! nlaggr(i) contains the aggregates held by process i. ! nlaggr(i) contains the aggregates held by process i.
! op_prol - type(psb_dspmat_type), output ! t_prol - type(psb_dspmat_type), output
! The tentative prolongator, based on ilaggr. ! The tentative prolongator, based on ilaggr.
! !
! info - integer, output. ! info - integer, output.
! Error code. ! Error code.
! !
subroutine mld_d_dec_aggregator_build_tprol(ag,parms,ag_data,& subroutine mld_d_dec_aggregator_build_tprol(ag,parms,ag_data,&
& a,desc_a,ilaggr,nlaggr,op_prol,info) & a,desc_a,ilaggr,nlaggr,t_prol,info)
use psb_base_mod use psb_base_mod
use mld_d_prec_type, mld_protect_name => mld_d_dec_aggregator_build_tprol use mld_d_prec_type, mld_protect_name => mld_d_dec_aggregator_build_tprol
use mld_d_inner_mod use mld_d_inner_mod
@ -86,7 +86,7 @@ subroutine mld_d_dec_aggregator_build_tprol(ag,parms,ag_data,&
type(psb_dspmat_type), intent(in) :: a type(psb_dspmat_type), intent(in) :: a
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:)
type(psb_ldspmat_type), intent(out) :: op_prol type(psb_ldspmat_type), intent(out) :: t_prol
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
! Local variables ! Local variables
@ -123,7 +123,7 @@ subroutine mld_d_dec_aggregator_build_tprol(ag,parms,ag_data,&
clean_zeros = ag%do_clean_zeros clean_zeros = ag%do_clean_zeros
call ag%soc_map_bld(parms%aggr_ord,parms%aggr_thresh,clean_zeros,a,desc_a,nlaggr,ilaggr,info) call ag%soc_map_bld(parms%aggr_ord,parms%aggr_thresh,clean_zeros,a,desc_a,nlaggr,ilaggr,info)
if (info==psb_success_) call mld_map_to_tprol(desc_a,ilaggr,nlaggr,op_prol,info) if (info==psb_success_) call mld_map_to_tprol(desc_a,ilaggr,nlaggr,t_prol,info)
if (info /= psb_success_) then if (info /= psb_success_) then
info=psb_err_from_subroutine_ info=psb_err_from_subroutine_
call psb_errpush(info,name,a_err='soc_map_bld/map_to_tprol') call psb_errpush(info,name,a_err='soc_map_bld/map_to_tprol')

@ -42,6 +42,220 @@ subroutine mld_d_ptap(a_csr,desc_a,nlaggr,parms,ac,&
use mld_d_base_aggregator_mod, mld_protect_name => mld_d_ptap use mld_d_base_aggregator_mod, mld_protect_name => mld_d_ptap
implicit none implicit none
! Arguments
type(psb_d_csr_sparse_mat), intent(inout) :: a_csr
type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: nlaggr(:)
type(mld_dml_parms), intent(inout) :: parms
type(psb_d_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr
type(psb_desc_type), intent(inout) :: desc_ac
type(psb_dspmat_type), intent(out) :: ac
integer(psb_ipk_), intent(out) :: info
type(psb_desc_type), intent(inout), optional :: desc_ax
! Local variables
integer(psb_ipk_) :: err_act
integer(psb_ipk_) :: ictxt,np,me, icomm, ndx, minfo
character(len=40) :: name
integer(psb_ipk_) :: ierr(5)
type(psb_ld_coo_sparse_mat) :: ac_coo, tmpcoo
type(psb_d_csr_sparse_mat) :: acsr3, csr_prol, ac_csr, csr_restr
integer(psb_ipk_) :: debug_level, debug_unit, naggr
integer(psb_lpk_) :: nglob, ntaggr, naggrm1, naggrp1
integer(psb_ipk_) :: nrow, ncol, nrl, nzl, ip, nzt, i, k
integer(psb_lpk_) :: nrsave, ncsave, nzsave, nza
logical, parameter :: do_timings=.false., oldstyle=.false., debug=.false.
integer(psb_ipk_), save :: idx_spspmm=-1
name='mld_ptap'
if(psb_get_errstatus().ne.0) return
info=psb_success_
call psb_erractionsave(err_act)
ictxt = desc_a%get_context()
icomm = desc_a%get_mpic()
call psb_info(ictxt, me, np)
debug_unit = psb_get_debug_unit()
debug_level = psb_get_debug_level()
nglob = desc_a%get_global_rows()
nrow = desc_a%get_local_rows()
ncol = desc_a%get_local_cols()
if ((do_timings).and.(idx_spspmm==-1)) &
& idx_spspmm = psb_get_timer_idx("SPMM_BLD: par_spspmm")
naggr = nlaggr(me+1)
ntaggr = sum(nlaggr)
naggrm1 = sum(nlaggr(1:me))
naggrp1 = sum(nlaggr(1:me+1))
!write(0,*)me,' ',name,' input sizes',nlaggr(:),':',naggr
!
! COO_PROL should arrive here with local numbering
!
if (debug) write(0,*) me,' ',trim(name),' Size check on entry New: ',&
& coo_prol%get_fmt(),coo_prol%get_nrows(),coo_prol%get_ncols(),coo_prol%get_nzeros(),&
& nrow,ntaggr,naggr
call coo_prol%cp_to_fmt(csr_prol,info)
if (debug) write(0,*) me,trim(name),' Product AxPROL ',&
& a_csr%get_nrows(),a_csr%get_ncols(), csr_prol%get_nrows(), &
& desc_a%get_local_rows(),desc_a%get_local_cols(),&
& desc_ac%get_local_rows(),desc_a%get_local_cols()
if (debug) flush(0)
if (do_timings) call psb_tic(idx_spspmm)
call psb_par_spspmm(a_csr,desc_a,csr_prol,acsr3,desc_ac,info)
if (do_timings) call psb_toc(idx_spspmm)
if (debug) write(0,*) me,trim(name),' Done AxPROL ',&
& acsr3%get_nrows(),acsr3%get_ncols(), acsr3%get_nzeros(),&
& desc_ac%get_local_rows(),desc_ac%get_local_cols()
!
! Ok first product done.
if (present(desc_ax)) then
block
call coo_prol%cp_to_coo(coo_restr,info)
call coo_restr%set_ncols(desc_ac%get_local_cols())
call coo_restr%set_nrows(desc_a%get_local_rows())
call psb_d_coo_glob_transpose(coo_restr,desc_a,info,desc_c=desc_ac,desc_rx=desc_ax)
call coo_restr%set_nrows(desc_ac%get_local_rows())
call coo_restr%set_ncols(desc_ax%get_local_cols())
write(0,*) me,' ',trim(name),' check on glob_transpose 1: ',&
& desc_a%get_local_cols(),desc_ax%get_local_cols(),coo_restr%get_nzeros()
if (desc_a%get_local_cols()<desc_ax%get_local_cols()) then
write(0,*) me,' ',trim(name),' WARNING: GLOB_TRANSPOSE NEW INDICES '
end if
end block
call csr_restr%cp_from_coo(coo_restr,info)
!!$ write(0,*)me,' ',name,' after transposition ',coo_restr%get_nrows(),coo_restr%get_ncols(),coo_restr%get_nzeros()
if (info /= psb_success_) then
call psb_errpush(psb_err_from_subroutine_,name,a_err='spcnv coo_restr')
goto 9999
end if
if (debug_level >= psb_debug_outer_) &
& write(debug_unit,*) me,' ',trim(name),&
& 'starting sphalo/ rwxtd'
if (debug) write(0,*) me,trim(name),' Product RESTRxAP ',&
& csr_restr%get_nrows(),csr_restr%get_ncols(), &
& desc_ac%get_local_rows(),desc_a%get_local_cols(),&
& acsr3%get_nrows(),acsr3%get_ncols()
if (do_timings) call psb_tic(idx_spspmm)
call psb_par_spspmm(csr_restr,desc_ax,acsr3,ac_csr,desc_ac,info)
if (do_timings) call psb_toc(idx_spspmm)
call acsr3%free()
else
!
! Remember that RESTR must be built from PROL after halo extension,
! which is done above in psb_par_spspmm
if (debug) write(0,*)me,' ',name,' No inp_restr, transposing prol ',&
& csr_prol%get_nrows(),csr_prol%get_ncols(),csr_prol%get_nzeros()
call csr_prol%mv_to_coo(coo_restr,info)
!!$ write(0,*)me,' ',name,' new into transposition ',coo_restr%get_nrows(),&
!!$ & coo_restr%get_ncols(),coo_restr%get_nzeros()
if (debug) call check_coo(me,trim(name)//' Check 1 (before transp) on coo_restr:',coo_restr)
call coo_restr%transp()
nzl = coo_restr%get_nzeros()
nrl = desc_ac%get_local_rows()
i=0
!
! Only keep local rows
!
do k=1, nzl
if ((1 <= coo_restr%ia(k)) .and.(coo_restr%ia(k) <= nrl)) then
i = i+1
coo_restr%val(i) = coo_restr%val(k)
coo_restr%ia(i) = coo_restr%ia(k)
coo_restr%ja(i) = coo_restr%ja(k)
end if
end do
call coo_restr%set_nzeros(i)
call coo_restr%fix(info)
nzl = coo_restr%get_nzeros()
call coo_restr%set_nrows(desc_ac%get_local_rows())
call coo_restr%set_ncols(desc_a%get_local_cols())
if (debug) call check_coo(me,trim(name)//' Check 2 on coo_restr:',coo_restr)
call csr_restr%cp_from_coo(coo_restr,info)
!!$ write(0,*)me,' ',name,' after transposition ',coo_restr%get_nrows(),coo_restr%get_ncols(),coo_restr%get_nzeros()
if (info /= psb_success_) then
call psb_errpush(psb_err_from_subroutine_,name,a_err='spcnv coo_restr')
goto 9999
end if
if (debug_level >= psb_debug_outer_) &
& write(debug_unit,*) me,' ',trim(name),&
& 'starting sphalo/ rwxtd'
if (debug) write(0,*) me,trim(name),' Product RESTRxAP ',&
& csr_restr%get_nrows(),csr_restr%get_ncols(), &
& desc_ac%get_local_rows(),desc_a%get_local_cols(),&
& acsr3%get_nrows(),acsr3%get_ncols()
if (do_timings) call psb_tic(idx_spspmm)
call psb_par_spspmm(csr_restr,desc_a,acsr3,ac_csr,desc_ac,info)
if (do_timings) call psb_toc(idx_spspmm)
call acsr3%free()
end if
call psb_cdasb(desc_ac,info)
call ac_csr%set_nrows(desc_ac%get_local_rows())
call ac_csr%set_ncols(desc_ac%get_local_cols())
call ac%mv_from(ac_csr)
call ac%set_asb()
if (debug) write(0,*) me,' ',trim(name),' After mv_from',psb_get_errstatus()
if (debug) write(0,*) me,' ',trim(name),' ',ac%get_fmt(),ac%get_nrows(),ac%get_ncols(),ac%get_nzeros(),naggr,ntaggr
! write(0,*) me,' ',trim(name),' Final AC newstyle ',ac%get_fmt(),ac%get_nrows(),ac%get_ncols(),ac%get_nzeros()
call coo_prol%set_ncols(desc_ac%get_local_cols())
if (debug) call check_coo(me,trim(name)//' Check 3 on coo_restr:',coo_restr)
if (debug_level >= psb_debug_outer_) &
& write(debug_unit,*) me,' ',trim(name),&
& 'Done ptap '
call psb_erractionrestore(err_act)
return
9999 call psb_error_handler(err_act)
return
contains
subroutine check_coo(me,string,coo)
implicit none
integer(psb_ipk_) :: me
type(psb_d_coo_sparse_mat) :: coo
character(len=*) :: string
integer(psb_lpk_) :: nr,nc,nz
nr = coo%get_nrows()
nc = coo%get_ncols()
nz = coo%get_nzeros()
write(0,*) me,string,nr,nc,&
& minval(coo%ia(1:nz)),maxval(coo%ia(1:nz)),&
& minval(coo%ja(1:nz)),maxval(coo%ja(1:nz))
end subroutine check_coo
end subroutine mld_d_ptap
subroutine mld_d_ld_ptap(a_csr,desc_a,nlaggr,parms,ac,&
& coo_prol,desc_ac,coo_restr,info,desc_ax)
use psb_base_mod
use mld_d_inner_mod
use mld_d_base_aggregator_mod, mld_protect_name => mld_d_ld_ptap
implicit none
! Arguments ! Arguments
type(psb_d_csr_sparse_mat), intent(inout) :: a_csr type(psb_d_csr_sparse_mat), intent(inout) :: a_csr
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
@ -250,7 +464,7 @@ contains
end subroutine check_coo end subroutine check_coo
end subroutine mld_d_ptap end subroutine mld_d_ld_ptap
subroutine mld_ld_ptap(a_csr,desc_a,nlaggr,parms,ac,& subroutine mld_ld_ptap(a_csr,desc_a,nlaggr,parms,ac,&
& coo_prol,desc_ac,coo_restr,info,desc_ax) & coo_prol,desc_ac,coo_restr,info,desc_ax)

@ -83,7 +83,7 @@
! info - integer, output. ! info - integer, output.
! Error code. ! Error code.
! !
subroutine mld_s_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,& subroutine mld_s_dec_aggregator_mat_asb(ag,parms,a,desc_a,&
& ac,desc_ac, op_prol,op_restr,info) & ac,desc_ac, op_prol,op_restr,info)
use psb_base_mod use psb_base_mod
use mld_base_prec_type use mld_base_prec_type
@ -93,8 +93,7 @@ subroutine mld_s_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,&
type(mld_sml_parms), intent(inout) :: parms type(mld_sml_parms), intent(inout) :: parms
type(psb_sspmat_type), intent(in) :: a type(psb_sspmat_type), intent(in) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(psb_sspmat_type), intent(inout) :: op_prol, ac,op_restr
type(psb_lsspmat_type), intent(inout) :: op_prol, ac,op_restr
type(psb_desc_type), intent(inout) :: desc_ac type(psb_desc_type), intent(inout) :: desc_ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
! !
@ -102,7 +101,7 @@ subroutine mld_s_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,&
type(psb_ls_coo_sparse_mat) :: tmpcoo type(psb_ls_coo_sparse_mat) :: tmpcoo
type(psb_s_coo_sparse_mat) :: acoo type(psb_s_coo_sparse_mat) :: acoo
type(psb_ls_csr_sparse_mat) :: acsr1 type(psb_ls_csr_sparse_mat) :: acsr1
type(psb_sspmat_type) :: tmp_ac type(psb_lsspmat_type) :: tmp_ac
integer(psb_ipk_) :: i_nr, i_nc, i_nl, nzl integer(psb_ipk_) :: i_nr, i_nc, i_nl, nzl
integer(psb_lpk_) :: ntaggr integer(psb_lpk_) :: ntaggr
integer(psb_ipk_) :: err_act, debug_level, debug_unit integer(psb_ipk_) :: err_act, debug_level, debug_unit
@ -117,8 +116,6 @@ subroutine mld_s_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,&
ictxt = desc_a%get_context() ictxt = desc_a%get_context()
call psb_info(ictxt,me,np) call psb_info(ictxt,me,np)
ntaggr = sum(nlaggr)
select case(parms%coarse_mat) select case(parms%coarse_mat)
case(mld_distr_mat_) case(mld_distr_mat_)
@ -133,7 +130,18 @@ subroutine mld_s_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,&
case(mld_repl_mat_) case(mld_repl_mat_)
! !
! We are assuming here that an s matrix
! can hold all entries
! !
if (desc_ac%get_global_rows() < huge(1_psb_ipk_) ) then
ntaggr = desc_ac%get_global_rows()
i_nr = ntaggr
else
info = psb_err_internal_error_
call psb_errpush(info,name,a_err='invalid mld_coarse_mat_')
goto 9999
end if
call op_prol%mv_to(tmpcoo) call op_prol%mv_to(tmpcoo)
nzl = tmpcoo%get_nzeros() nzl = tmpcoo%get_nzeros()
call psb_loc_to_glob(tmpcoo%ja(1:nzl),desc_ac,info,'I') call psb_loc_to_glob(tmpcoo%ja(1:nzl),desc_ac,info,'I')
@ -144,13 +152,14 @@ subroutine mld_s_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,&
call psb_loc_to_glob(tmpcoo%ia(1:nzl),desc_ac,info,'I') call psb_loc_to_glob(tmpcoo%ia(1:nzl),desc_ac,info,'I')
call op_restr%mv_from(tmpcoo) call op_restr%mv_from(tmpcoo)
call op_prol%set_ncols(ntaggr) call op_prol%set_ncols(i_nr)
call op_restr%set_nrows(ntaggr) call op_restr%set_nrows(i_nr)
call ac%mv_to(tmpcoo)
call tmp_ac%mv_from(tmpcoo)
call psb_gather(ac,tmp_ac,desc_ac,info,root=-ione,dupl=psb_dupl_add_,keeploc=.false.)
call psb_gather(tmp_ac,ac,desc_ac,info,root=-ione,&
& dupl=psb_dupl_add_,keeploc=.false.)
call tmp_ac%mv_to(tmpcoo)
call ac%mv_from(tmpcoo)
call psb_cdall(ictxt,desc_ac,info,mg=ntaggr,repl=.true.) call psb_cdall(ictxt,desc_ac,info,mg=ntaggr,repl=.true.)
if (info == psb_success_) call psb_cdasb(desc_ac,info) if (info == psb_success_) call psb_cdasb(desc_ac,info)

@ -134,7 +134,7 @@
! Error code. ! Error code.
! !
subroutine mld_s_dec_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,& subroutine mld_s_dec_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,&
& ac,desc_ac,op_prol,op_restr,info) & ac,desc_ac,op_prol,op_restr,t_prol,info)
use psb_base_mod use psb_base_mod
use mld_s_prec_type, mld_protect_name => mld_s_dec_aggregator_mat_bld use mld_s_prec_type, mld_protect_name => mld_s_dec_aggregator_mat_bld
use mld_s_inner_mod use mld_s_inner_mod
@ -145,16 +145,14 @@ subroutine mld_s_dec_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,&
type(psb_sspmat_type), intent(in) :: a type(psb_sspmat_type), intent(in) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
type(psb_lsspmat_type), intent(inout) :: op_prol type(psb_lsspmat_type), intent(inout) :: t_prol
type(psb_lsspmat_type), intent(out) :: ac,op_restr type(psb_sspmat_type), intent(out) :: op_prol,ac,op_restr
type(psb_desc_type), intent(inout) :: desc_ac type(psb_desc_type), intent(inout) :: desc_ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
! Local variables ! Local variables
character(len=20) :: name character(len=20) :: name
integer(psb_mpk_) :: ictxt, np, me integer(psb_mpk_) :: ictxt, np, me
type(psb_ls_coo_sparse_mat) :: acoo, bcoo
type(psb_ls_csr_sparse_mat) :: acsr1
integer(psb_lpk_) :: nzl,ntaggr integer(psb_lpk_) :: nzl,ntaggr
integer(psb_ipk_) :: err_act integer(psb_ipk_) :: err_act
integer(psb_ipk_) :: debug_level, debug_unit integer(psb_ipk_) :: debug_level, debug_unit
@ -179,22 +177,22 @@ subroutine mld_s_dec_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,&
case (mld_no_smooth_) case (mld_no_smooth_)
call mld_saggrmat_nosmth_bld(a,desc_a,ilaggr,nlaggr,& call mld_saggrmat_nosmth_bld(a,desc_a,ilaggr,nlaggr,&
& parms,ac,desc_ac,op_prol,op_restr,info) & parms,ac,desc_ac,op_prol,op_restr,t_prol,info)
case(mld_smooth_prol_) case(mld_smooth_prol_)
call mld_saggrmat_smth_bld(a,desc_a,ilaggr,nlaggr, & call mld_saggrmat_smth_bld(a,desc_a,ilaggr,nlaggr, &
& parms,ac,desc_ac,op_prol,op_restr,info) & parms,ac,desc_ac,op_prol,op_restr,t_prol,info)
!!$ case(mld_biz_prol_) !!$ case(mld_biz_prol_)
!!$ !!$
!!$ call mld_saggrmat_biz_bld(a,desc_a,ilaggr,nlaggr, & !!$ call mld_saggrmat_biz_bld(a,desc_a,ilaggr,nlaggr, &
!!$ & parms,ac,desc_ac,op_prol,op_restr,info) !!$ & parms,ac,desc_ac,op_prol,op_restr,t_prol,info)
case(mld_min_energy_) case(mld_min_energy_)
call mld_saggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr, & call mld_saggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr, &
& parms,ac,desc_ac,op_prol,op_restr,info) & parms,ac,desc_ac,op_prol,op_restr,t_prol,info)
case default case default
info = psb_err_internal_error_ info = psb_err_internal_error_

@ -68,14 +68,14 @@
! overlap. ! overlap.
! nlaggr - integer, dimension(:), allocatable, output ! nlaggr - integer, dimension(:), allocatable, output
! nlaggr(i) contains the aggregates held by process i. ! nlaggr(i) contains the aggregates held by process i.
! op_prol - type(psb_sspmat_type), output ! t_prol - type(psb_sspmat_type), output
! The tentative prolongator, based on ilaggr. ! The tentative prolongator, based on ilaggr.
! !
! info - integer, output. ! info - integer, output.
! Error code. ! Error code.
! !
subroutine mld_s_dec_aggregator_build_tprol(ag,parms,ag_data,& subroutine mld_s_dec_aggregator_build_tprol(ag,parms,ag_data,&
& a,desc_a,ilaggr,nlaggr,op_prol,info) & a,desc_a,ilaggr,nlaggr,t_prol,info)
use psb_base_mod use psb_base_mod
use mld_s_prec_type, mld_protect_name => mld_s_dec_aggregator_build_tprol use mld_s_prec_type, mld_protect_name => mld_s_dec_aggregator_build_tprol
use mld_s_inner_mod use mld_s_inner_mod
@ -86,7 +86,7 @@ subroutine mld_s_dec_aggregator_build_tprol(ag,parms,ag_data,&
type(psb_sspmat_type), intent(in) :: a type(psb_sspmat_type), intent(in) :: a
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:)
type(psb_lsspmat_type), intent(out) :: op_prol type(psb_lsspmat_type), intent(out) :: t_prol
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
! Local variables ! Local variables
@ -123,7 +123,7 @@ subroutine mld_s_dec_aggregator_build_tprol(ag,parms,ag_data,&
clean_zeros = ag%do_clean_zeros clean_zeros = ag%do_clean_zeros
call ag%soc_map_bld(parms%aggr_ord,parms%aggr_thresh,clean_zeros,a,desc_a,nlaggr,ilaggr,info) call ag%soc_map_bld(parms%aggr_ord,parms%aggr_thresh,clean_zeros,a,desc_a,nlaggr,ilaggr,info)
if (info==psb_success_) call mld_map_to_tprol(desc_a,ilaggr,nlaggr,op_prol,info) if (info==psb_success_) call mld_map_to_tprol(desc_a,ilaggr,nlaggr,t_prol,info)
if (info /= psb_success_) then if (info /= psb_success_) then
info=psb_err_from_subroutine_ info=psb_err_from_subroutine_
call psb_errpush(info,name,a_err='soc_map_bld/map_to_tprol') call psb_errpush(info,name,a_err='soc_map_bld/map_to_tprol')

@ -42,6 +42,220 @@ subroutine mld_s_ptap(a_csr,desc_a,nlaggr,parms,ac,&
use mld_s_base_aggregator_mod, mld_protect_name => mld_s_ptap use mld_s_base_aggregator_mod, mld_protect_name => mld_s_ptap
implicit none implicit none
! Arguments
type(psb_s_csr_sparse_mat), intent(inout) :: a_csr
type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: nlaggr(:)
type(mld_sml_parms), intent(inout) :: parms
type(psb_s_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr
type(psb_desc_type), intent(inout) :: desc_ac
type(psb_sspmat_type), intent(out) :: ac
integer(psb_ipk_), intent(out) :: info
type(psb_desc_type), intent(inout), optional :: desc_ax
! Local variables
integer(psb_ipk_) :: err_act
integer(psb_ipk_) :: ictxt,np,me, icomm, ndx, minfo
character(len=40) :: name
integer(psb_ipk_) :: ierr(5)
type(psb_ls_coo_sparse_mat) :: ac_coo, tmpcoo
type(psb_s_csr_sparse_mat) :: acsr3, csr_prol, ac_csr, csr_restr
integer(psb_ipk_) :: debug_level, debug_unit, naggr
integer(psb_lpk_) :: nglob, ntaggr, naggrm1, naggrp1
integer(psb_ipk_) :: nrow, ncol, nrl, nzl, ip, nzt, i, k
integer(psb_lpk_) :: nrsave, ncsave, nzsave, nza
logical, parameter :: do_timings=.false., oldstyle=.false., debug=.false.
integer(psb_ipk_), save :: idx_spspmm=-1
name='mld_ptap'
if(psb_get_errstatus().ne.0) return
info=psb_success_
call psb_erractionsave(err_act)
ictxt = desc_a%get_context()
icomm = desc_a%get_mpic()
call psb_info(ictxt, me, np)
debug_unit = psb_get_debug_unit()
debug_level = psb_get_debug_level()
nglob = desc_a%get_global_rows()
nrow = desc_a%get_local_rows()
ncol = desc_a%get_local_cols()
if ((do_timings).and.(idx_spspmm==-1)) &
& idx_spspmm = psb_get_timer_idx("SPMM_BLD: par_spspmm")
naggr = nlaggr(me+1)
ntaggr = sum(nlaggr)
naggrm1 = sum(nlaggr(1:me))
naggrp1 = sum(nlaggr(1:me+1))
!write(0,*)me,' ',name,' input sizes',nlaggr(:),':',naggr
!
! COO_PROL should arrive here with local numbering
!
if (debug) write(0,*) me,' ',trim(name),' Size check on entry New: ',&
& coo_prol%get_fmt(),coo_prol%get_nrows(),coo_prol%get_ncols(),coo_prol%get_nzeros(),&
& nrow,ntaggr,naggr
call coo_prol%cp_to_fmt(csr_prol,info)
if (debug) write(0,*) me,trim(name),' Product AxPROL ',&
& a_csr%get_nrows(),a_csr%get_ncols(), csr_prol%get_nrows(), &
& desc_a%get_local_rows(),desc_a%get_local_cols(),&
& desc_ac%get_local_rows(),desc_a%get_local_cols()
if (debug) flush(0)
if (do_timings) call psb_tic(idx_spspmm)
call psb_par_spspmm(a_csr,desc_a,csr_prol,acsr3,desc_ac,info)
if (do_timings) call psb_toc(idx_spspmm)
if (debug) write(0,*) me,trim(name),' Done AxPROL ',&
& acsr3%get_nrows(),acsr3%get_ncols(), acsr3%get_nzeros(),&
& desc_ac%get_local_rows(),desc_ac%get_local_cols()
!
! Ok first product done.
if (present(desc_ax)) then
block
call coo_prol%cp_to_coo(coo_restr,info)
call coo_restr%set_ncols(desc_ac%get_local_cols())
call coo_restr%set_nrows(desc_a%get_local_rows())
call psb_s_coo_glob_transpose(coo_restr,desc_a,info,desc_c=desc_ac,desc_rx=desc_ax)
call coo_restr%set_nrows(desc_ac%get_local_rows())
call coo_restr%set_ncols(desc_ax%get_local_cols())
write(0,*) me,' ',trim(name),' check on glob_transpose 1: ',&
& desc_a%get_local_cols(),desc_ax%get_local_cols(),coo_restr%get_nzeros()
if (desc_a%get_local_cols()<desc_ax%get_local_cols()) then
write(0,*) me,' ',trim(name),' WARNING: GLOB_TRANSPOSE NEW INDICES '
end if
end block
call csr_restr%cp_from_coo(coo_restr,info)
!!$ write(0,*)me,' ',name,' after transposition ',coo_restr%get_nrows(),coo_restr%get_ncols(),coo_restr%get_nzeros()
if (info /= psb_success_) then
call psb_errpush(psb_err_from_subroutine_,name,a_err='spcnv coo_restr')
goto 9999
end if
if (debug_level >= psb_debug_outer_) &
& write(debug_unit,*) me,' ',trim(name),&
& 'starting sphalo/ rwxtd'
if (debug) write(0,*) me,trim(name),' Product RESTRxAP ',&
& csr_restr%get_nrows(),csr_restr%get_ncols(), &
& desc_ac%get_local_rows(),desc_a%get_local_cols(),&
& acsr3%get_nrows(),acsr3%get_ncols()
if (do_timings) call psb_tic(idx_spspmm)
call psb_par_spspmm(csr_restr,desc_ax,acsr3,ac_csr,desc_ac,info)
if (do_timings) call psb_toc(idx_spspmm)
call acsr3%free()
else
!
! Remember that RESTR must be built from PROL after halo extension,
! which is done above in psb_par_spspmm
if (debug) write(0,*)me,' ',name,' No inp_restr, transposing prol ',&
& csr_prol%get_nrows(),csr_prol%get_ncols(),csr_prol%get_nzeros()
call csr_prol%mv_to_coo(coo_restr,info)
!!$ write(0,*)me,' ',name,' new into transposition ',coo_restr%get_nrows(),&
!!$ & coo_restr%get_ncols(),coo_restr%get_nzeros()
if (debug) call check_coo(me,trim(name)//' Check 1 (before transp) on coo_restr:',coo_restr)
call coo_restr%transp()
nzl = coo_restr%get_nzeros()
nrl = desc_ac%get_local_rows()
i=0
!
! Only keep local rows
!
do k=1, nzl
if ((1 <= coo_restr%ia(k)) .and.(coo_restr%ia(k) <= nrl)) then
i = i+1
coo_restr%val(i) = coo_restr%val(k)
coo_restr%ia(i) = coo_restr%ia(k)
coo_restr%ja(i) = coo_restr%ja(k)
end if
end do
call coo_restr%set_nzeros(i)
call coo_restr%fix(info)
nzl = coo_restr%get_nzeros()
call coo_restr%set_nrows(desc_ac%get_local_rows())
call coo_restr%set_ncols(desc_a%get_local_cols())
if (debug) call check_coo(me,trim(name)//' Check 2 on coo_restr:',coo_restr)
call csr_restr%cp_from_coo(coo_restr,info)
!!$ write(0,*)me,' ',name,' after transposition ',coo_restr%get_nrows(),coo_restr%get_ncols(),coo_restr%get_nzeros()
if (info /= psb_success_) then
call psb_errpush(psb_err_from_subroutine_,name,a_err='spcnv coo_restr')
goto 9999
end if
if (debug_level >= psb_debug_outer_) &
& write(debug_unit,*) me,' ',trim(name),&
& 'starting sphalo/ rwxtd'
if (debug) write(0,*) me,trim(name),' Product RESTRxAP ',&
& csr_restr%get_nrows(),csr_restr%get_ncols(), &
& desc_ac%get_local_rows(),desc_a%get_local_cols(),&
& acsr3%get_nrows(),acsr3%get_ncols()
if (do_timings) call psb_tic(idx_spspmm)
call psb_par_spspmm(csr_restr,desc_a,acsr3,ac_csr,desc_ac,info)
if (do_timings) call psb_toc(idx_spspmm)
call acsr3%free()
end if
call psb_cdasb(desc_ac,info)
call ac_csr%set_nrows(desc_ac%get_local_rows())
call ac_csr%set_ncols(desc_ac%get_local_cols())
call ac%mv_from(ac_csr)
call ac%set_asb()
if (debug) write(0,*) me,' ',trim(name),' After mv_from',psb_get_errstatus()
if (debug) write(0,*) me,' ',trim(name),' ',ac%get_fmt(),ac%get_nrows(),ac%get_ncols(),ac%get_nzeros(),naggr,ntaggr
! write(0,*) me,' ',trim(name),' Final AC newstyle ',ac%get_fmt(),ac%get_nrows(),ac%get_ncols(),ac%get_nzeros()
call coo_prol%set_ncols(desc_ac%get_local_cols())
if (debug) call check_coo(me,trim(name)//' Check 3 on coo_restr:',coo_restr)
if (debug_level >= psb_debug_outer_) &
& write(debug_unit,*) me,' ',trim(name),&
& 'Done ptap '
call psb_erractionrestore(err_act)
return
9999 call psb_error_handler(err_act)
return
contains
subroutine check_coo(me,string,coo)
implicit none
integer(psb_ipk_) :: me
type(psb_s_coo_sparse_mat) :: coo
character(len=*) :: string
integer(psb_lpk_) :: nr,nc,nz
nr = coo%get_nrows()
nc = coo%get_ncols()
nz = coo%get_nzeros()
write(0,*) me,string,nr,nc,&
& minval(coo%ia(1:nz)),maxval(coo%ia(1:nz)),&
& minval(coo%ja(1:nz)),maxval(coo%ja(1:nz))
end subroutine check_coo
end subroutine mld_s_ptap
subroutine mld_s_ls_ptap(a_csr,desc_a,nlaggr,parms,ac,&
& coo_prol,desc_ac,coo_restr,info,desc_ax)
use psb_base_mod
use mld_s_inner_mod
use mld_s_base_aggregator_mod, mld_protect_name => mld_s_ls_ptap
implicit none
! Arguments ! Arguments
type(psb_s_csr_sparse_mat), intent(inout) :: a_csr type(psb_s_csr_sparse_mat), intent(inout) :: a_csr
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
@ -250,7 +464,7 @@ contains
end subroutine check_coo end subroutine check_coo
end subroutine mld_s_ptap end subroutine mld_s_ls_ptap
subroutine mld_ls_ptap(a_csr,desc_a,nlaggr,parms,ac,& subroutine mld_ls_ptap(a_csr,desc_a,nlaggr,parms,ac,&
& coo_prol,desc_ac,coo_restr,info,desc_ax) & coo_prol,desc_ac,coo_restr,info,desc_ax)

@ -83,7 +83,7 @@
! info - integer, output. ! info - integer, output.
! Error code. ! Error code.
! !
subroutine mld_z_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,& subroutine mld_z_dec_aggregator_mat_asb(ag,parms,a,desc_a,&
& ac,desc_ac, op_prol,op_restr,info) & ac,desc_ac, op_prol,op_restr,info)
use psb_base_mod use psb_base_mod
use mld_base_prec_type use mld_base_prec_type
@ -93,8 +93,7 @@ subroutine mld_z_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,&
type(mld_dml_parms), intent(inout) :: parms type(mld_dml_parms), intent(inout) :: parms
type(psb_zspmat_type), intent(in) :: a type(psb_zspmat_type), intent(in) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(psb_zspmat_type), intent(inout) :: op_prol, ac,op_restr
type(psb_lzspmat_type), intent(inout) :: op_prol, ac,op_restr
type(psb_desc_type), intent(inout) :: desc_ac type(psb_desc_type), intent(inout) :: desc_ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
! !
@ -102,7 +101,7 @@ subroutine mld_z_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,&
type(psb_lz_coo_sparse_mat) :: tmpcoo type(psb_lz_coo_sparse_mat) :: tmpcoo
type(psb_z_coo_sparse_mat) :: acoo type(psb_z_coo_sparse_mat) :: acoo
type(psb_lz_csr_sparse_mat) :: acsr1 type(psb_lz_csr_sparse_mat) :: acsr1
type(psb_zspmat_type) :: tmp_ac type(psb_lzspmat_type) :: tmp_ac
integer(psb_ipk_) :: i_nr, i_nc, i_nl, nzl integer(psb_ipk_) :: i_nr, i_nc, i_nl, nzl
integer(psb_lpk_) :: ntaggr integer(psb_lpk_) :: ntaggr
integer(psb_ipk_) :: err_act, debug_level, debug_unit integer(psb_ipk_) :: err_act, debug_level, debug_unit
@ -117,8 +116,6 @@ subroutine mld_z_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,&
ictxt = desc_a%get_context() ictxt = desc_a%get_context()
call psb_info(ictxt,me,np) call psb_info(ictxt,me,np)
ntaggr = sum(nlaggr)
select case(parms%coarse_mat) select case(parms%coarse_mat)
case(mld_distr_mat_) case(mld_distr_mat_)
@ -133,7 +130,18 @@ subroutine mld_z_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,&
case(mld_repl_mat_) case(mld_repl_mat_)
! !
! We are assuming here that an z matrix
! can hold all entries
! !
if (desc_ac%get_global_rows() < huge(1_psb_ipk_) ) then
ntaggr = desc_ac%get_global_rows()
i_nr = ntaggr
else
info = psb_err_internal_error_
call psb_errpush(info,name,a_err='invalid mld_coarse_mat_')
goto 9999
end if
call op_prol%mv_to(tmpcoo) call op_prol%mv_to(tmpcoo)
nzl = tmpcoo%get_nzeros() nzl = tmpcoo%get_nzeros()
call psb_loc_to_glob(tmpcoo%ja(1:nzl),desc_ac,info,'I') call psb_loc_to_glob(tmpcoo%ja(1:nzl),desc_ac,info,'I')
@ -144,13 +152,14 @@ subroutine mld_z_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,&
call psb_loc_to_glob(tmpcoo%ia(1:nzl),desc_ac,info,'I') call psb_loc_to_glob(tmpcoo%ia(1:nzl),desc_ac,info,'I')
call op_restr%mv_from(tmpcoo) call op_restr%mv_from(tmpcoo)
call op_prol%set_ncols(ntaggr) call op_prol%set_ncols(i_nr)
call op_restr%set_nrows(ntaggr) call op_restr%set_nrows(i_nr)
call ac%mv_to(tmpcoo)
call tmp_ac%mv_from(tmpcoo)
call psb_gather(ac,tmp_ac,desc_ac,info,root=-ione,dupl=psb_dupl_add_,keeploc=.false.)
call psb_gather(tmp_ac,ac,desc_ac,info,root=-ione,&
& dupl=psb_dupl_add_,keeploc=.false.)
call tmp_ac%mv_to(tmpcoo)
call ac%mv_from(tmpcoo)
call psb_cdall(ictxt,desc_ac,info,mg=ntaggr,repl=.true.) call psb_cdall(ictxt,desc_ac,info,mg=ntaggr,repl=.true.)
if (info == psb_success_) call psb_cdasb(desc_ac,info) if (info == psb_success_) call psb_cdasb(desc_ac,info)

@ -134,7 +134,7 @@
! Error code. ! Error code.
! !
subroutine mld_z_dec_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,& subroutine mld_z_dec_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,&
& ac,desc_ac,op_prol,op_restr,info) & ac,desc_ac,op_prol,op_restr,t_prol,info)
use psb_base_mod use psb_base_mod
use mld_z_prec_type, mld_protect_name => mld_z_dec_aggregator_mat_bld use mld_z_prec_type, mld_protect_name => mld_z_dec_aggregator_mat_bld
use mld_z_inner_mod use mld_z_inner_mod
@ -145,16 +145,14 @@ subroutine mld_z_dec_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,&
type(psb_zspmat_type), intent(in) :: a type(psb_zspmat_type), intent(in) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
type(psb_lzspmat_type), intent(inout) :: op_prol type(psb_lzspmat_type), intent(inout) :: t_prol
type(psb_lzspmat_type), intent(out) :: ac,op_restr type(psb_zspmat_type), intent(out) :: op_prol,ac,op_restr
type(psb_desc_type), intent(inout) :: desc_ac type(psb_desc_type), intent(inout) :: desc_ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
! Local variables ! Local variables
character(len=20) :: name character(len=20) :: name
integer(psb_mpk_) :: ictxt, np, me integer(psb_mpk_) :: ictxt, np, me
type(psb_lz_coo_sparse_mat) :: acoo, bcoo
type(psb_lz_csr_sparse_mat) :: acsr1
integer(psb_lpk_) :: nzl,ntaggr integer(psb_lpk_) :: nzl,ntaggr
integer(psb_ipk_) :: err_act integer(psb_ipk_) :: err_act
integer(psb_ipk_) :: debug_level, debug_unit integer(psb_ipk_) :: debug_level, debug_unit
@ -179,22 +177,22 @@ subroutine mld_z_dec_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,&
case (mld_no_smooth_) case (mld_no_smooth_)
call mld_zaggrmat_nosmth_bld(a,desc_a,ilaggr,nlaggr,& call mld_zaggrmat_nosmth_bld(a,desc_a,ilaggr,nlaggr,&
& parms,ac,desc_ac,op_prol,op_restr,info) & parms,ac,desc_ac,op_prol,op_restr,t_prol,info)
case(mld_smooth_prol_) case(mld_smooth_prol_)
call mld_zaggrmat_smth_bld(a,desc_a,ilaggr,nlaggr, & call mld_zaggrmat_smth_bld(a,desc_a,ilaggr,nlaggr, &
& parms,ac,desc_ac,op_prol,op_restr,info) & parms,ac,desc_ac,op_prol,op_restr,t_prol,info)
!!$ case(mld_biz_prol_) !!$ case(mld_biz_prol_)
!!$ !!$
!!$ call mld_zaggrmat_biz_bld(a,desc_a,ilaggr,nlaggr, & !!$ call mld_zaggrmat_biz_bld(a,desc_a,ilaggr,nlaggr, &
!!$ & parms,ac,desc_ac,op_prol,op_restr,info) !!$ & parms,ac,desc_ac,op_prol,op_restr,t_prol,info)
case(mld_min_energy_) case(mld_min_energy_)
call mld_zaggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr, & call mld_zaggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr, &
& parms,ac,desc_ac,op_prol,op_restr,info) & parms,ac,desc_ac,op_prol,op_restr,t_prol,info)
case default case default
info = psb_err_internal_error_ info = psb_err_internal_error_

@ -68,14 +68,14 @@
! overlap. ! overlap.
! nlaggr - integer, dimension(:), allocatable, output ! nlaggr - integer, dimension(:), allocatable, output
! nlaggr(i) contains the aggregates held by process i. ! nlaggr(i) contains the aggregates held by process i.
! op_prol - type(psb_zspmat_type), output ! t_prol - type(psb_zspmat_type), output
! The tentative prolongator, based on ilaggr. ! The tentative prolongator, based on ilaggr.
! !
! info - integer, output. ! info - integer, output.
! Error code. ! Error code.
! !
subroutine mld_z_dec_aggregator_build_tprol(ag,parms,ag_data,& subroutine mld_z_dec_aggregator_build_tprol(ag,parms,ag_data,&
& a,desc_a,ilaggr,nlaggr,op_prol,info) & a,desc_a,ilaggr,nlaggr,t_prol,info)
use psb_base_mod use psb_base_mod
use mld_z_prec_type, mld_protect_name => mld_z_dec_aggregator_build_tprol use mld_z_prec_type, mld_protect_name => mld_z_dec_aggregator_build_tprol
use mld_z_inner_mod use mld_z_inner_mod
@ -86,7 +86,7 @@ subroutine mld_z_dec_aggregator_build_tprol(ag,parms,ag_data,&
type(psb_zspmat_type), intent(in) :: a type(psb_zspmat_type), intent(in) :: a
type(psb_desc_type), intent(in) :: desc_a type(psb_desc_type), intent(in) :: desc_a
integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:)
type(psb_lzspmat_type), intent(out) :: op_prol type(psb_lzspmat_type), intent(out) :: t_prol
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
! Local variables ! Local variables
@ -123,7 +123,7 @@ subroutine mld_z_dec_aggregator_build_tprol(ag,parms,ag_data,&
clean_zeros = ag%do_clean_zeros clean_zeros = ag%do_clean_zeros
call ag%soc_map_bld(parms%aggr_ord,parms%aggr_thresh,clean_zeros,a,desc_a,nlaggr,ilaggr,info) call ag%soc_map_bld(parms%aggr_ord,parms%aggr_thresh,clean_zeros,a,desc_a,nlaggr,ilaggr,info)
if (info==psb_success_) call mld_map_to_tprol(desc_a,ilaggr,nlaggr,op_prol,info) if (info==psb_success_) call mld_map_to_tprol(desc_a,ilaggr,nlaggr,t_prol,info)
if (info /= psb_success_) then if (info /= psb_success_) then
info=psb_err_from_subroutine_ info=psb_err_from_subroutine_
call psb_errpush(info,name,a_err='soc_map_bld/map_to_tprol') call psb_errpush(info,name,a_err='soc_map_bld/map_to_tprol')

@ -42,6 +42,220 @@ subroutine mld_z_ptap(a_csr,desc_a,nlaggr,parms,ac,&
use mld_z_base_aggregator_mod, mld_protect_name => mld_z_ptap use mld_z_base_aggregator_mod, mld_protect_name => mld_z_ptap
implicit none implicit none
! Arguments
type(psb_z_csr_sparse_mat), intent(inout) :: a_csr
type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: nlaggr(:)
type(mld_dml_parms), intent(inout) :: parms
type(psb_z_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr
type(psb_desc_type), intent(inout) :: desc_ac
type(psb_zspmat_type), intent(out) :: ac
integer(psb_ipk_), intent(out) :: info
type(psb_desc_type), intent(inout), optional :: desc_ax
! Local variables
integer(psb_ipk_) :: err_act
integer(psb_ipk_) :: ictxt,np,me, icomm, ndx, minfo
character(len=40) :: name
integer(psb_ipk_) :: ierr(5)
type(psb_lz_coo_sparse_mat) :: ac_coo, tmpcoo
type(psb_z_csr_sparse_mat) :: acsr3, csr_prol, ac_csr, csr_restr
integer(psb_ipk_) :: debug_level, debug_unit, naggr
integer(psb_lpk_) :: nglob, ntaggr, naggrm1, naggrp1
integer(psb_ipk_) :: nrow, ncol, nrl, nzl, ip, nzt, i, k
integer(psb_lpk_) :: nrsave, ncsave, nzsave, nza
logical, parameter :: do_timings=.false., oldstyle=.false., debug=.false.
integer(psb_ipk_), save :: idx_spspmm=-1
name='mld_ptap'
if(psb_get_errstatus().ne.0) return
info=psb_success_
call psb_erractionsave(err_act)
ictxt = desc_a%get_context()
icomm = desc_a%get_mpic()
call psb_info(ictxt, me, np)
debug_unit = psb_get_debug_unit()
debug_level = psb_get_debug_level()
nglob = desc_a%get_global_rows()
nrow = desc_a%get_local_rows()
ncol = desc_a%get_local_cols()
if ((do_timings).and.(idx_spspmm==-1)) &
& idx_spspmm = psb_get_timer_idx("SPMM_BLD: par_spspmm")
naggr = nlaggr(me+1)
ntaggr = sum(nlaggr)
naggrm1 = sum(nlaggr(1:me))
naggrp1 = sum(nlaggr(1:me+1))
!write(0,*)me,' ',name,' input sizes',nlaggr(:),':',naggr
!
! COO_PROL should arrive here with local numbering
!
if (debug) write(0,*) me,' ',trim(name),' Size check on entry New: ',&
& coo_prol%get_fmt(),coo_prol%get_nrows(),coo_prol%get_ncols(),coo_prol%get_nzeros(),&
& nrow,ntaggr,naggr
call coo_prol%cp_to_fmt(csr_prol,info)
if (debug) write(0,*) me,trim(name),' Product AxPROL ',&
& a_csr%get_nrows(),a_csr%get_ncols(), csr_prol%get_nrows(), &
& desc_a%get_local_rows(),desc_a%get_local_cols(),&
& desc_ac%get_local_rows(),desc_a%get_local_cols()
if (debug) flush(0)
if (do_timings) call psb_tic(idx_spspmm)
call psb_par_spspmm(a_csr,desc_a,csr_prol,acsr3,desc_ac,info)
if (do_timings) call psb_toc(idx_spspmm)
if (debug) write(0,*) me,trim(name),' Done AxPROL ',&
& acsr3%get_nrows(),acsr3%get_ncols(), acsr3%get_nzeros(),&
& desc_ac%get_local_rows(),desc_ac%get_local_cols()
!
! Ok first product done.
if (present(desc_ax)) then
block
call coo_prol%cp_to_coo(coo_restr,info)
call coo_restr%set_ncols(desc_ac%get_local_cols())
call coo_restr%set_nrows(desc_a%get_local_rows())
call psb_z_coo_glob_transpose(coo_restr,desc_a,info,desc_c=desc_ac,desc_rx=desc_ax)
call coo_restr%set_nrows(desc_ac%get_local_rows())
call coo_restr%set_ncols(desc_ax%get_local_cols())
write(0,*) me,' ',trim(name),' check on glob_transpose 1: ',&
& desc_a%get_local_cols(),desc_ax%get_local_cols(),coo_restr%get_nzeros()
if (desc_a%get_local_cols()<desc_ax%get_local_cols()) then
write(0,*) me,' ',trim(name),' WARNING: GLOB_TRANSPOSE NEW INDICES '
end if
end block
call csr_restr%cp_from_coo(coo_restr,info)
!!$ write(0,*)me,' ',name,' after transposition ',coo_restr%get_nrows(),coo_restr%get_ncols(),coo_restr%get_nzeros()
if (info /= psb_success_) then
call psb_errpush(psb_err_from_subroutine_,name,a_err='spcnv coo_restr')
goto 9999
end if
if (debug_level >= psb_debug_outer_) &
& write(debug_unit,*) me,' ',trim(name),&
& 'starting sphalo/ rwxtd'
if (debug) write(0,*) me,trim(name),' Product RESTRxAP ',&
& csr_restr%get_nrows(),csr_restr%get_ncols(), &
& desc_ac%get_local_rows(),desc_a%get_local_cols(),&
& acsr3%get_nrows(),acsr3%get_ncols()
if (do_timings) call psb_tic(idx_spspmm)
call psb_par_spspmm(csr_restr,desc_ax,acsr3,ac_csr,desc_ac,info)
if (do_timings) call psb_toc(idx_spspmm)
call acsr3%free()
else
!
! Remember that RESTR must be built from PROL after halo extension,
! which is done above in psb_par_spspmm
if (debug) write(0,*)me,' ',name,' No inp_restr, transposing prol ',&
& csr_prol%get_nrows(),csr_prol%get_ncols(),csr_prol%get_nzeros()
call csr_prol%mv_to_coo(coo_restr,info)
!!$ write(0,*)me,' ',name,' new into transposition ',coo_restr%get_nrows(),&
!!$ & coo_restr%get_ncols(),coo_restr%get_nzeros()
if (debug) call check_coo(me,trim(name)//' Check 1 (before transp) on coo_restr:',coo_restr)
call coo_restr%transp()
nzl = coo_restr%get_nzeros()
nrl = desc_ac%get_local_rows()
i=0
!
! Only keep local rows
!
do k=1, nzl
if ((1 <= coo_restr%ia(k)) .and.(coo_restr%ia(k) <= nrl)) then
i = i+1
coo_restr%val(i) = coo_restr%val(k)
coo_restr%ia(i) = coo_restr%ia(k)
coo_restr%ja(i) = coo_restr%ja(k)
end if
end do
call coo_restr%set_nzeros(i)
call coo_restr%fix(info)
nzl = coo_restr%get_nzeros()
call coo_restr%set_nrows(desc_ac%get_local_rows())
call coo_restr%set_ncols(desc_a%get_local_cols())
if (debug) call check_coo(me,trim(name)//' Check 2 on coo_restr:',coo_restr)
call csr_restr%cp_from_coo(coo_restr,info)
!!$ write(0,*)me,' ',name,' after transposition ',coo_restr%get_nrows(),coo_restr%get_ncols(),coo_restr%get_nzeros()
if (info /= psb_success_) then
call psb_errpush(psb_err_from_subroutine_,name,a_err='spcnv coo_restr')
goto 9999
end if
if (debug_level >= psb_debug_outer_) &
& write(debug_unit,*) me,' ',trim(name),&
& 'starting sphalo/ rwxtd'
if (debug) write(0,*) me,trim(name),' Product RESTRxAP ',&
& csr_restr%get_nrows(),csr_restr%get_ncols(), &
& desc_ac%get_local_rows(),desc_a%get_local_cols(),&
& acsr3%get_nrows(),acsr3%get_ncols()
if (do_timings) call psb_tic(idx_spspmm)
call psb_par_spspmm(csr_restr,desc_a,acsr3,ac_csr,desc_ac,info)
if (do_timings) call psb_toc(idx_spspmm)
call acsr3%free()
end if
call psb_cdasb(desc_ac,info)
call ac_csr%set_nrows(desc_ac%get_local_rows())
call ac_csr%set_ncols(desc_ac%get_local_cols())
call ac%mv_from(ac_csr)
call ac%set_asb()
if (debug) write(0,*) me,' ',trim(name),' After mv_from',psb_get_errstatus()
if (debug) write(0,*) me,' ',trim(name),' ',ac%get_fmt(),ac%get_nrows(),ac%get_ncols(),ac%get_nzeros(),naggr,ntaggr
! write(0,*) me,' ',trim(name),' Final AC newstyle ',ac%get_fmt(),ac%get_nrows(),ac%get_ncols(),ac%get_nzeros()
call coo_prol%set_ncols(desc_ac%get_local_cols())
if (debug) call check_coo(me,trim(name)//' Check 3 on coo_restr:',coo_restr)
if (debug_level >= psb_debug_outer_) &
& write(debug_unit,*) me,' ',trim(name),&
& 'Done ptap '
call psb_erractionrestore(err_act)
return
9999 call psb_error_handler(err_act)
return
contains
subroutine check_coo(me,string,coo)
implicit none
integer(psb_ipk_) :: me
type(psb_z_coo_sparse_mat) :: coo
character(len=*) :: string
integer(psb_lpk_) :: nr,nc,nz
nr = coo%get_nrows()
nc = coo%get_ncols()
nz = coo%get_nzeros()
write(0,*) me,string,nr,nc,&
& minval(coo%ia(1:nz)),maxval(coo%ia(1:nz)),&
& minval(coo%ja(1:nz)),maxval(coo%ja(1:nz))
end subroutine check_coo
end subroutine mld_z_ptap
subroutine mld_z_lz_ptap(a_csr,desc_a,nlaggr,parms,ac,&
& coo_prol,desc_ac,coo_restr,info,desc_ax)
use psb_base_mod
use mld_z_inner_mod
use mld_z_base_aggregator_mod, mld_protect_name => mld_z_lz_ptap
implicit none
! Arguments ! Arguments
type(psb_z_csr_sparse_mat), intent(inout) :: a_csr type(psb_z_csr_sparse_mat), intent(inout) :: a_csr
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
@ -250,7 +464,7 @@ contains
end subroutine check_coo end subroutine check_coo
end subroutine mld_z_ptap end subroutine mld_z_lz_ptap
subroutine mld_lz_ptap(a_csr,desc_a,nlaggr,parms,ac,& subroutine mld_lz_ptap(a_csr,desc_a,nlaggr,parms,ac,&
& coo_prol,desc_ac,coo_restr,info,desc_ax) & coo_prol,desc_ac,coo_restr,info,desc_ax)

@ -83,7 +83,7 @@
! info - integer, output. ! info - integer, output.
! Error code. ! Error code.
! !
subroutine mld_c_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info) subroutine mld_c_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,t_prol,info)
use psb_base_mod use psb_base_mod
use mld_base_prec_type use mld_base_prec_type
@ -97,7 +97,7 @@ subroutine mld_c_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info)
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: nlaggr(:) integer(psb_lpk_), intent(inout) :: nlaggr(:)
integer(psb_lpk_), intent(inout) :: ilaggr(:) integer(psb_lpk_), intent(inout) :: ilaggr(:)
type(psb_lcspmat_type), intent(inout) :: op_prol type(psb_lcspmat_type), intent(inout) :: t_prol
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
@ -105,10 +105,7 @@ subroutine mld_c_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info)
character(len=24) :: name character(len=24) :: name
integer(psb_ipk_) :: ictxt, np, me integer(psb_ipk_) :: ictxt, np, me
integer(psb_ipk_) :: err_act integer(psb_ipk_) :: err_act
type(psb_lcspmat_type) :: lac, op_restr type(psb_cspmat_type) :: ac, op_restr, op_prol
type(psb_cspmat_type) :: ac, iop_restr, iop_prol
type(psb_lc_coo_sparse_mat) :: acoo, bcoo
type(psb_lc_csr_sparse_mat) :: acsr1
integer(psb_ipk_) :: nzl, inl integer(psb_ipk_) :: nzl, inl
integer(psb_ipk_) :: debug_level, debug_unit integer(psb_ipk_) :: debug_level, debug_unit
@ -142,7 +139,7 @@ subroutine mld_c_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info)
! algorithm specified by lv%iprcparm(mld_aggr_prol_) ! algorithm specified by lv%iprcparm(mld_aggr_prol_)
! !
call lv%aggr%mat_bld(lv%parms,a,desc_a,ilaggr,nlaggr,& call lv%aggr%mat_bld(lv%parms,a,desc_a,ilaggr,nlaggr,&
& lac,lv%desc_ac,op_prol,op_restr,info) & lv%ac,lv%desc_ac,op_prol,op_restr,t_prol,info)
if(info /= psb_success_) then if(info /= psb_success_) then
call psb_errpush(psb_err_from_subroutine_,name,a_err='mld_aggrmat_asb') call psb_errpush(psb_err_from_subroutine_,name,a_err='mld_aggrmat_asb')
@ -154,10 +151,9 @@ subroutine mld_c_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info)
! ac, op_restr and op_prol ! ac, op_restr and op_prol
! !
if (info == psb_success_) & if (info == psb_success_) &
& call lv%aggr%mat_asb(lv%parms,a,desc_a,ilaggr,nlaggr,& & call lv%aggr%mat_asb(lv%parms,a,desc_a,&
& lac,lv%desc_ac,op_prol,op_restr,info) & lv%ac,lv%desc_ac,op_prol,op_restr,info)
call lv%ac%mv_from_l(lac)
if (info == psb_success_) call lv%ac%cscnv(info,type='csr',dupl=psb_dupl_add_) if (info == psb_success_) call lv%ac%cscnv(info,type='csr',dupl=psb_dupl_add_)
if (info == psb_success_) call lv%aggr%bld_map(desc_a, lv%desc_ac,& if (info == psb_success_) call lv%aggr%bld_map(desc_a, lv%desc_ac,&

@ -83,7 +83,7 @@
! info - integer, output. ! info - integer, output.
! Error code. ! Error code.
! !
subroutine mld_d_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info) subroutine mld_d_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,t_prol,info)
use psb_base_mod use psb_base_mod
use mld_base_prec_type use mld_base_prec_type
@ -97,7 +97,7 @@ subroutine mld_d_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info)
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: nlaggr(:) integer(psb_lpk_), intent(inout) :: nlaggr(:)
integer(psb_lpk_), intent(inout) :: ilaggr(:) integer(psb_lpk_), intent(inout) :: ilaggr(:)
type(psb_ldspmat_type), intent(inout) :: op_prol type(psb_ldspmat_type), intent(inout) :: t_prol
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
@ -105,10 +105,7 @@ subroutine mld_d_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info)
character(len=24) :: name character(len=24) :: name
integer(psb_ipk_) :: ictxt, np, me integer(psb_ipk_) :: ictxt, np, me
integer(psb_ipk_) :: err_act integer(psb_ipk_) :: err_act
type(psb_ldspmat_type) :: lac, op_restr type(psb_dspmat_type) :: ac, op_restr, op_prol
type(psb_dspmat_type) :: ac, iop_restr, iop_prol
type(psb_ld_coo_sparse_mat) :: acoo, bcoo
type(psb_ld_csr_sparse_mat) :: acsr1
integer(psb_ipk_) :: nzl, inl integer(psb_ipk_) :: nzl, inl
integer(psb_ipk_) :: debug_level, debug_unit integer(psb_ipk_) :: debug_level, debug_unit
@ -142,7 +139,7 @@ subroutine mld_d_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info)
! algorithm specified by lv%iprcparm(mld_aggr_prol_) ! algorithm specified by lv%iprcparm(mld_aggr_prol_)
! !
call lv%aggr%mat_bld(lv%parms,a,desc_a,ilaggr,nlaggr,& call lv%aggr%mat_bld(lv%parms,a,desc_a,ilaggr,nlaggr,&
& lac,lv%desc_ac,op_prol,op_restr,info) & lv%ac,lv%desc_ac,op_prol,op_restr,t_prol,info)
if(info /= psb_success_) then if(info /= psb_success_) then
call psb_errpush(psb_err_from_subroutine_,name,a_err='mld_aggrmat_asb') call psb_errpush(psb_err_from_subroutine_,name,a_err='mld_aggrmat_asb')
@ -154,10 +151,9 @@ subroutine mld_d_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info)
! ac, op_restr and op_prol ! ac, op_restr and op_prol
! !
if (info == psb_success_) & if (info == psb_success_) &
& call lv%aggr%mat_asb(lv%parms,a,desc_a,ilaggr,nlaggr,& & call lv%aggr%mat_asb(lv%parms,a,desc_a,&
& lac,lv%desc_ac,op_prol,op_restr,info) & lv%ac,lv%desc_ac,op_prol,op_restr,info)
call lv%ac%mv_from_l(lac)
if (info == psb_success_) call lv%ac%cscnv(info,type='csr',dupl=psb_dupl_add_) if (info == psb_success_) call lv%ac%cscnv(info,type='csr',dupl=psb_dupl_add_)
if (info == psb_success_) call lv%aggr%bld_map(desc_a, lv%desc_ac,& if (info == psb_success_) call lv%aggr%bld_map(desc_a, lv%desc_ac,&

@ -83,7 +83,7 @@
! info - integer, output. ! info - integer, output.
! Error code. ! Error code.
! !
subroutine mld_s_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info) subroutine mld_s_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,t_prol,info)
use psb_base_mod use psb_base_mod
use mld_base_prec_type use mld_base_prec_type
@ -97,7 +97,7 @@ subroutine mld_s_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info)
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: nlaggr(:) integer(psb_lpk_), intent(inout) :: nlaggr(:)
integer(psb_lpk_), intent(inout) :: ilaggr(:) integer(psb_lpk_), intent(inout) :: ilaggr(:)
type(psb_lsspmat_type), intent(inout) :: op_prol type(psb_lsspmat_type), intent(inout) :: t_prol
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
@ -105,10 +105,7 @@ subroutine mld_s_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info)
character(len=24) :: name character(len=24) :: name
integer(psb_ipk_) :: ictxt, np, me integer(psb_ipk_) :: ictxt, np, me
integer(psb_ipk_) :: err_act integer(psb_ipk_) :: err_act
type(psb_lsspmat_type) :: lac, op_restr type(psb_sspmat_type) :: ac, op_restr, op_prol
type(psb_sspmat_type) :: ac, iop_restr, iop_prol
type(psb_ls_coo_sparse_mat) :: acoo, bcoo
type(psb_ls_csr_sparse_mat) :: acsr1
integer(psb_ipk_) :: nzl, inl integer(psb_ipk_) :: nzl, inl
integer(psb_ipk_) :: debug_level, debug_unit integer(psb_ipk_) :: debug_level, debug_unit
@ -142,7 +139,7 @@ subroutine mld_s_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info)
! algorithm specified by lv%iprcparm(mld_aggr_prol_) ! algorithm specified by lv%iprcparm(mld_aggr_prol_)
! !
call lv%aggr%mat_bld(lv%parms,a,desc_a,ilaggr,nlaggr,& call lv%aggr%mat_bld(lv%parms,a,desc_a,ilaggr,nlaggr,&
& lac,lv%desc_ac,op_prol,op_restr,info) & lv%ac,lv%desc_ac,op_prol,op_restr,t_prol,info)
if(info /= psb_success_) then if(info /= psb_success_) then
call psb_errpush(psb_err_from_subroutine_,name,a_err='mld_aggrmat_asb') call psb_errpush(psb_err_from_subroutine_,name,a_err='mld_aggrmat_asb')
@ -154,10 +151,9 @@ subroutine mld_s_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info)
! ac, op_restr and op_prol ! ac, op_restr and op_prol
! !
if (info == psb_success_) & if (info == psb_success_) &
& call lv%aggr%mat_asb(lv%parms,a,desc_a,ilaggr,nlaggr,& & call lv%aggr%mat_asb(lv%parms,a,desc_a,&
& lac,lv%desc_ac,op_prol,op_restr,info) & lv%ac,lv%desc_ac,op_prol,op_restr,info)
call lv%ac%mv_from_l(lac)
if (info == psb_success_) call lv%ac%cscnv(info,type='csr',dupl=psb_dupl_add_) if (info == psb_success_) call lv%ac%cscnv(info,type='csr',dupl=psb_dupl_add_)
if (info == psb_success_) call lv%aggr%bld_map(desc_a, lv%desc_ac,& if (info == psb_success_) call lv%aggr%bld_map(desc_a, lv%desc_ac,&

@ -83,7 +83,7 @@
! info - integer, output. ! info - integer, output.
! Error code. ! Error code.
! !
subroutine mld_z_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info) subroutine mld_z_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,t_prol,info)
use psb_base_mod use psb_base_mod
use mld_base_prec_type use mld_base_prec_type
@ -97,7 +97,7 @@ subroutine mld_z_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info)
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: nlaggr(:) integer(psb_lpk_), intent(inout) :: nlaggr(:)
integer(psb_lpk_), intent(inout) :: ilaggr(:) integer(psb_lpk_), intent(inout) :: ilaggr(:)
type(psb_lzspmat_type), intent(inout) :: op_prol type(psb_lzspmat_type), intent(inout) :: t_prol
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
@ -105,10 +105,7 @@ subroutine mld_z_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info)
character(len=24) :: name character(len=24) :: name
integer(psb_ipk_) :: ictxt, np, me integer(psb_ipk_) :: ictxt, np, me
integer(psb_ipk_) :: err_act integer(psb_ipk_) :: err_act
type(psb_lzspmat_type) :: lac, op_restr type(psb_zspmat_type) :: ac, op_restr, op_prol
type(psb_zspmat_type) :: ac, iop_restr, iop_prol
type(psb_lz_coo_sparse_mat) :: acoo, bcoo
type(psb_lz_csr_sparse_mat) :: acsr1
integer(psb_ipk_) :: nzl, inl integer(psb_ipk_) :: nzl, inl
integer(psb_ipk_) :: debug_level, debug_unit integer(psb_ipk_) :: debug_level, debug_unit
@ -142,7 +139,7 @@ subroutine mld_z_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info)
! algorithm specified by lv%iprcparm(mld_aggr_prol_) ! algorithm specified by lv%iprcparm(mld_aggr_prol_)
! !
call lv%aggr%mat_bld(lv%parms,a,desc_a,ilaggr,nlaggr,& call lv%aggr%mat_bld(lv%parms,a,desc_a,ilaggr,nlaggr,&
& lac,lv%desc_ac,op_prol,op_restr,info) & lv%ac,lv%desc_ac,op_prol,op_restr,t_prol,info)
if(info /= psb_success_) then if(info /= psb_success_) then
call psb_errpush(psb_err_from_subroutine_,name,a_err='mld_aggrmat_asb') call psb_errpush(psb_err_from_subroutine_,name,a_err='mld_aggrmat_asb')
@ -154,10 +151,9 @@ subroutine mld_z_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info)
! ac, op_restr and op_prol ! ac, op_restr and op_prol
! !
if (info == psb_success_) & if (info == psb_success_) &
& call lv%aggr%mat_asb(lv%parms,a,desc_a,ilaggr,nlaggr,& & call lv%aggr%mat_asb(lv%parms,a,desc_a,&
& lac,lv%desc_ac,op_prol,op_restr,info) & lv%ac,lv%desc_ac,op_prol,op_restr,info)
call lv%ac%mv_from_l(lac)
if (info == psb_success_) call lv%ac%cscnv(info,type='csr',dupl=psb_dupl_add_) if (info == psb_success_) call lv%ac%cscnv(info,type='csr',dupl=psb_dupl_add_)
if (info == psb_success_) call lv%aggr%bld_map(desc_a, lv%desc_ac,& if (info == psb_success_) call lv%aggr%bld_map(desc_a, lv%desc_ac,&

@ -122,6 +122,21 @@ module mld_c_base_aggregator_mod
interface mld_ptap interface mld_ptap
subroutine mld_c_ptap(a_csr,desc_a,nlaggr,parms,ac,& subroutine mld_c_ptap(a_csr,desc_a,nlaggr,parms,ac,&
& coo_prol,desc_cprol,coo_restr,info,desc_ax) & coo_prol,desc_cprol,coo_restr,info,desc_ax)
import :: psb_c_csr_sparse_mat, psb_cspmat_type, psb_desc_type, &
& psb_c_coo_sparse_mat, mld_sml_parms, psb_spk_, psb_ipk_, psb_lpk_
implicit none
type(psb_c_csr_sparse_mat), intent(inout) :: a_csr
type(psb_desc_type), intent(in) :: desc_a
integer(psb_lpk_), intent(inout) :: nlaggr(:)
type(mld_sml_parms), intent(inout) :: parms
type(psb_c_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr
type(psb_desc_type), intent(inout) :: desc_cprol
type(psb_cspmat_type), intent(out) :: ac
integer(psb_ipk_), intent(out) :: info
type(psb_desc_type), intent(inout), optional :: desc_ax
end subroutine mld_c_ptap
subroutine mld_c_lc_ptap(a_csr,desc_a,nlaggr,parms,ac,&
& coo_prol,desc_cprol,coo_restr,info,desc_ax)
import :: psb_c_csr_sparse_mat, psb_lcspmat_type, psb_desc_type, & import :: psb_c_csr_sparse_mat, psb_lcspmat_type, psb_desc_type, &
& psb_lc_coo_sparse_mat, mld_sml_parms, psb_spk_, psb_ipk_, psb_lpk_ & psb_lc_coo_sparse_mat, mld_sml_parms, psb_spk_, psb_ipk_, psb_lpk_
implicit none implicit none
@ -134,7 +149,7 @@ module mld_c_base_aggregator_mod
type(psb_lcspmat_type), intent(out) :: ac type(psb_lcspmat_type), intent(out) :: ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
type(psb_desc_type), intent(inout), optional :: desc_ax type(psb_desc_type), intent(inout), optional :: desc_ax
end subroutine mld_c_ptap end subroutine mld_c_lc_ptap
subroutine mld_lc_ptap(a_csr,desc_a,nlaggr,parms,ac,& subroutine mld_lc_ptap(a_csr,desc_a,nlaggr,parms,ac,&
& coo_prol,desc_cprol,coo_restr,info,desc_ax) & coo_prol,desc_cprol,coo_restr,info,desc_ax)
import :: psb_lc_csr_sparse_mat, psb_lcspmat_type, psb_desc_type, & import :: psb_lc_csr_sparse_mat, psb_lcspmat_type, psb_desc_type, &
@ -322,7 +337,7 @@ contains
!! !!
! !
subroutine mld_c_base_aggregator_build_tprol(ag,parms,ag_data,& subroutine mld_c_base_aggregator_build_tprol(ag,parms,ag_data,&
& a,desc_a,ilaggr,nlaggr,op_prol,info) & a,desc_a,ilaggr,nlaggr,t_prol,info)
use psb_base_mod use psb_base_mod
implicit none implicit none
class(mld_c_base_aggregator_type), target, intent(inout) :: ag class(mld_c_base_aggregator_type), target, intent(inout) :: ag
@ -331,7 +346,7 @@ contains
type(psb_cspmat_type), intent(inout) :: a type(psb_cspmat_type), intent(inout) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:)
type(psb_lcspmat_type), intent(out) :: op_prol type(psb_lcspmat_type), intent(out) :: t_prol
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_) :: err_act integer(psb_ipk_) :: err_act
@ -372,17 +387,17 @@ contains
!! \param info Return code !! \param info Return code
!! !!
subroutine mld_c_base_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,& subroutine mld_c_base_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,&
& ac,desc_ac,op_prol,op_restr,info) & ac,desc_ac,op_prol,op_restr,t_prol,info)
use psb_base_mod use psb_base_mod
implicit none implicit none
class(mld_c_base_aggregator_type), target, intent(inout) :: ag class(mld_c_base_aggregator_type), target, intent(inout) :: ag
type(mld_sml_parms), intent(inout) :: parms type(mld_sml_parms), intent(inout) :: parms
type(psb_cspmat_type), intent(in) :: a type(psb_cspmat_type), intent(in) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
type(psb_lcspmat_type), intent(inout) :: op_prol type(psb_lcspmat_type), intent(inout) :: t_prol
type(psb_lcspmat_type), intent(out) :: ac,op_restr type(psb_cspmat_type), intent(out) :: op_prol, ac,op_restr
type(psb_desc_type), intent(inout) :: desc_ac type(psb_desc_type), intent(inout) :: desc_ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_) :: err_act integer(psb_ipk_) :: err_act
character(len=20) :: name='c_base_aggregator_mat_bld' character(len=20) :: name='c_base_aggregator_mat_bld'
@ -420,7 +435,7 @@ contains
!! in many cases it is the transpose of the prolongator. !! in many cases it is the transpose of the prolongator.
!! \param info Return code !! \param info Return code
!! !!
subroutine mld_c_base_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,& subroutine mld_c_base_aggregator_mat_asb(ag,parms,a,desc_a,&
& ac,desc_ac, op_prol,op_restr,info) & ac,desc_ac, op_prol,op_restr,info)
use psb_base_mod use psb_base_mod
implicit none implicit none
@ -428,8 +443,7 @@ contains
type(mld_sml_parms), intent(inout) :: parms type(mld_sml_parms), intent(inout) :: parms
type(psb_cspmat_type), intent(in) :: a type(psb_cspmat_type), intent(in) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(psb_cspmat_type), intent(inout) :: op_prol,ac,op_restr
type(psb_lcspmat_type), intent(inout) :: op_prol,ac,op_restr
type(psb_desc_type), intent(inout) :: desc_ac type(psb_desc_type), intent(inout) :: desc_ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_) :: err_act integer(psb_ipk_) :: err_act
@ -472,7 +486,7 @@ contains
class(mld_c_base_aggregator_type), target, intent(inout) :: ag class(mld_c_base_aggregator_type), target, intent(inout) :: ag
type(psb_desc_type), intent(in), target :: desc_a, desc_ac type(psb_desc_type), intent(in), target :: desc_a, desc_ac
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
type(psb_lcspmat_type), intent(inout) :: op_restr, op_prol type(psb_cspmat_type), intent(inout) :: op_restr, op_prol
type(psb_clinmap_type), intent(out) :: map type(psb_clinmap_type), intent(out) :: map
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
type(psb_cspmat_type) :: iop_restr, iop_prol type(psb_cspmat_type) :: iop_restr, iop_prol
@ -491,8 +505,6 @@ contains
! This default implementation reuses desc_a/desc_ac through ! This default implementation reuses desc_a/desc_ac through
! pointers in the map structure. ! pointers in the map structure.
! !
call iop_restr%mv_from_l(op_restr)
call iop_prol%mv_from_l(op_prol)
map = psb_linmap(psb_map_aggr_,desc_a,& map = psb_linmap(psb_map_aggr_,desc_a,&
& desc_ac,iop_restr,iop_prol,ilaggr,nlaggr) & desc_ac,iop_restr,iop_prol,ilaggr,nlaggr)
if (info == psb_success_) call iop_prol%free() if (info == psb_success_) call iop_prol%free()

@ -93,7 +93,7 @@ module mld_c_dec_aggregator_mod
interface interface
subroutine mld_c_dec_aggregator_build_tprol(ag,parms,ag_data,& subroutine mld_c_dec_aggregator_build_tprol(ag,parms,ag_data,&
& a,desc_a,ilaggr,nlaggr,op_prol,info) & a,desc_a,ilaggr,nlaggr,t_prol,info)
import :: mld_c_dec_aggregator_type, psb_desc_type, psb_cspmat_type, psb_spk_, & import :: mld_c_dec_aggregator_type, psb_desc_type, psb_cspmat_type, psb_spk_, &
& psb_ipk_, psb_lpk_, psb_lcspmat_type, mld_sml_parms, mld_saggr_data & psb_ipk_, psb_lpk_, psb_lcspmat_type, mld_sml_parms, mld_saggr_data
implicit none implicit none
@ -103,14 +103,14 @@ module mld_c_dec_aggregator_mod
type(psb_cspmat_type), intent(inout) :: a type(psb_cspmat_type), intent(inout) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:)
type(psb_lcspmat_type), intent(out) :: op_prol type(psb_lcspmat_type), intent(out) :: t_prol
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
end subroutine mld_c_dec_aggregator_build_tprol end subroutine mld_c_dec_aggregator_build_tprol
end interface end interface
interface interface
subroutine mld_c_dec_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,& subroutine mld_c_dec_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,&
& ac,desc_ac,op_prol,op_restr,info) & ac,desc_ac,op_prol,op_restr,t_prol,info)
import :: mld_c_dec_aggregator_type, psb_desc_type, psb_cspmat_type, psb_spk_, & import :: mld_c_dec_aggregator_type, psb_desc_type, psb_cspmat_type, psb_spk_, &
& psb_ipk_, psb_lpk_, psb_lcspmat_type, mld_sml_parms & psb_ipk_, psb_lpk_, psb_lcspmat_type, mld_sml_parms
implicit none implicit none
@ -119,15 +119,15 @@ module mld_c_dec_aggregator_mod
type(psb_cspmat_type), intent(in) :: a type(psb_cspmat_type), intent(in) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
type(psb_lcspmat_type), intent(inout) :: op_prol type(psb_lcspmat_type), intent(inout) :: t_prol
type(psb_lcspmat_type), intent(out) :: ac,op_restr type(psb_cspmat_type), intent(out) :: op_prol, ac,op_restr
type(psb_desc_type), intent(inout) :: desc_ac type(psb_desc_type), intent(inout) :: desc_ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
end subroutine mld_c_dec_aggregator_mat_bld end subroutine mld_c_dec_aggregator_mat_bld
end interface end interface
interface interface
subroutine mld_c_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,& subroutine mld_c_dec_aggregator_mat_asb(ag,parms,a,desc_a,&
& ac,desc_ac,op_prol,op_restr,info) & ac,desc_ac,op_prol,op_restr,info)
import :: mld_c_dec_aggregator_type, psb_desc_type, psb_cspmat_type, psb_spk_, & import :: mld_c_dec_aggregator_type, psb_desc_type, psb_cspmat_type, psb_spk_, &
& psb_ipk_, psb_lpk_, psb_lcspmat_type, mld_sml_parms & psb_ipk_, psb_lpk_, psb_lcspmat_type, mld_sml_parms
@ -136,8 +136,7 @@ module mld_c_dec_aggregator_mod
type(mld_sml_parms), intent(inout) :: parms type(mld_sml_parms), intent(inout) :: parms
type(psb_cspmat_type), intent(in) :: a type(psb_cspmat_type), intent(in) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(psb_cspmat_type), intent(inout) :: op_prol,ac,op_restr
type(psb_lcspmat_type), intent(inout) :: op_prol,ac,op_restr
type(psb_desc_type), intent(inout) :: desc_ac type(psb_desc_type), intent(inout) :: desc_ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
end subroutine mld_c_dec_aggregator_mat_asb end subroutine mld_c_dec_aggregator_mat_asb

@ -110,7 +110,7 @@ module mld_c_inner_mod
abstract interface abstract interface
subroutine mld_caggrmat_var_bld(a,desc_a,ilaggr,nlaggr,parms,& subroutine mld_caggrmat_var_bld(a,desc_a,ilaggr,nlaggr,parms,&
& ac,desc_ac,op_prol,op_restr,info) & ac,desc_ac,op_prol,op_restr,t_prol,info)
import :: psb_cspmat_type, psb_desc_type, psb_spk_, psb_ipk_, psb_lpk_, psb_lcspmat_type import :: psb_cspmat_type, psb_desc_type, psb_spk_, psb_ipk_, psb_lpk_, psb_lcspmat_type
import :: mld_c_onelev_type, mld_sml_parms import :: mld_c_onelev_type, mld_sml_parms
implicit none implicit none
@ -118,8 +118,8 @@ module mld_c_inner_mod
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
type(mld_sml_parms), intent(inout) :: parms type(mld_sml_parms), intent(inout) :: parms
type(psb_lcspmat_type), intent(inout) :: op_prol type(psb_cspmat_type), intent(inout) :: op_prol,ac,op_restr
type(psb_lcspmat_type), intent(out) :: ac,op_restr type(psb_lcspmat_type), intent(inout) :: t_prol
type(psb_desc_type), intent(inout) :: desc_ac type(psb_desc_type), intent(inout) :: desc_ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
end subroutine mld_caggrmat_var_bld end subroutine mld_caggrmat_var_bld

@ -210,7 +210,7 @@ module mld_c_onelev_mod
& c_base_onelev_free_wrk & c_base_onelev_free_wrk
interface interface
subroutine mld_c_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info) subroutine mld_c_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,t_prol,info)
import :: psb_cspmat_type, psb_desc_type, psb_spk_, psb_ipk_, psb_lcspmat_type, psb_lpk_ import :: psb_cspmat_type, psb_desc_type, psb_spk_, psb_ipk_, psb_lcspmat_type, psb_lpk_
import :: mld_c_onelev_type import :: mld_c_onelev_type
implicit none implicit none
@ -218,7 +218,7 @@ module mld_c_onelev_mod
type(psb_cspmat_type), intent(in) :: a type(psb_cspmat_type), intent(in) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:),nlaggr(:) integer(psb_lpk_), intent(inout) :: ilaggr(:),nlaggr(:)
type(psb_lcspmat_type), intent(inout) :: op_prol type(psb_lcspmat_type), intent(inout) :: t_prol
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
end subroutine mld_c_base_onelev_mat_asb end subroutine mld_c_base_onelev_mat_asb
end interface end interface
@ -488,17 +488,17 @@ contains
end subroutine c_base_onelev_default end subroutine c_base_onelev_default
subroutine c_base_onelev_bld_tprol(lv,a,desc_a,& subroutine c_base_onelev_bld_tprol(lv,a,desc_a,&
& ilaggr,nlaggr,op_prol,ag_data,info) & ilaggr,nlaggr,t_prol,ag_data,info)
implicit none implicit none
class(mld_c_onelev_type), intent(inout), target :: lv class(mld_c_onelev_type), intent(inout), target :: lv
type(psb_cspmat_type), intent(inout) :: a type(psb_cspmat_type), intent(inout) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:)
type(psb_lcspmat_type), intent(out) :: op_prol type(psb_lcspmat_type), intent(out) :: t_prol
type(mld_saggr_data), intent(in) :: ag_data type(mld_saggr_data), intent(in) :: ag_data
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
call lv%aggr%bld_tprol(lv%parms,ag_data,a,desc_a,ilaggr,nlaggr,op_prol,info) call lv%aggr%bld_tprol(lv%parms,ag_data,a,desc_a,ilaggr,nlaggr,t_prol,info)
end subroutine c_base_onelev_bld_tprol end subroutine c_base_onelev_bld_tprol

@ -63,7 +63,7 @@ module mld_c_symdec_aggregator_mod
interface interface
subroutine mld_c_symdec_aggregator_build_tprol(ag,parms,ag_data,& subroutine mld_c_symdec_aggregator_build_tprol(ag,parms,ag_data,&
& a,desc_a,ilaggr,nlaggr,op_prol,info) & a,desc_a,ilaggr,nlaggr,t_prol,info)
import :: mld_c_symdec_aggregator_type, psb_desc_type, psb_cspmat_type, psb_spk_, & import :: mld_c_symdec_aggregator_type, psb_desc_type, psb_cspmat_type, psb_spk_, &
& psb_ipk_, psb_lpk_, psb_lcspmat_type, mld_sml_parms, mld_saggr_data & psb_ipk_, psb_lpk_, psb_lcspmat_type, mld_sml_parms, mld_saggr_data
implicit none implicit none
@ -73,7 +73,7 @@ module mld_c_symdec_aggregator_mod
type(psb_cspmat_type), intent(inout) :: a type(psb_cspmat_type), intent(inout) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:)
type(psb_lcspmat_type), intent(out) :: op_prol type(psb_lcspmat_type), intent(out) :: t_prol
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
end subroutine mld_c_symdec_aggregator_build_tprol end subroutine mld_c_symdec_aggregator_build_tprol
end interface end interface

@ -122,6 +122,21 @@ module mld_d_base_aggregator_mod
interface mld_ptap interface mld_ptap
subroutine mld_d_ptap(a_csr,desc_a,nlaggr,parms,ac,& subroutine mld_d_ptap(a_csr,desc_a,nlaggr,parms,ac,&
& coo_prol,desc_cprol,coo_restr,info,desc_ax) & coo_prol,desc_cprol,coo_restr,info,desc_ax)
import :: psb_d_csr_sparse_mat, psb_dspmat_type, psb_desc_type, &
& psb_d_coo_sparse_mat, mld_dml_parms, psb_dpk_, psb_ipk_, psb_lpk_
implicit none
type(psb_d_csr_sparse_mat), intent(inout) :: a_csr
type(psb_desc_type), intent(in) :: desc_a
integer(psb_lpk_), intent(inout) :: nlaggr(:)
type(mld_dml_parms), intent(inout) :: parms
type(psb_d_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr
type(psb_desc_type), intent(inout) :: desc_cprol
type(psb_dspmat_type), intent(out) :: ac
integer(psb_ipk_), intent(out) :: info
type(psb_desc_type), intent(inout), optional :: desc_ax
end subroutine mld_d_ptap
subroutine mld_d_ld_ptap(a_csr,desc_a,nlaggr,parms,ac,&
& coo_prol,desc_cprol,coo_restr,info,desc_ax)
import :: psb_d_csr_sparse_mat, psb_ldspmat_type, psb_desc_type, & import :: psb_d_csr_sparse_mat, psb_ldspmat_type, psb_desc_type, &
& psb_ld_coo_sparse_mat, mld_dml_parms, psb_dpk_, psb_ipk_, psb_lpk_ & psb_ld_coo_sparse_mat, mld_dml_parms, psb_dpk_, psb_ipk_, psb_lpk_
implicit none implicit none
@ -134,7 +149,7 @@ module mld_d_base_aggregator_mod
type(psb_ldspmat_type), intent(out) :: ac type(psb_ldspmat_type), intent(out) :: ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
type(psb_desc_type), intent(inout), optional :: desc_ax type(psb_desc_type), intent(inout), optional :: desc_ax
end subroutine mld_d_ptap end subroutine mld_d_ld_ptap
subroutine mld_ld_ptap(a_csr,desc_a,nlaggr,parms,ac,& subroutine mld_ld_ptap(a_csr,desc_a,nlaggr,parms,ac,&
& coo_prol,desc_cprol,coo_restr,info,desc_ax) & coo_prol,desc_cprol,coo_restr,info,desc_ax)
import :: psb_ld_csr_sparse_mat, psb_ldspmat_type, psb_desc_type, & import :: psb_ld_csr_sparse_mat, psb_ldspmat_type, psb_desc_type, &
@ -322,7 +337,7 @@ contains
!! !!
! !
subroutine mld_d_base_aggregator_build_tprol(ag,parms,ag_data,& subroutine mld_d_base_aggregator_build_tprol(ag,parms,ag_data,&
& a,desc_a,ilaggr,nlaggr,op_prol,info) & a,desc_a,ilaggr,nlaggr,t_prol,info)
use psb_base_mod use psb_base_mod
implicit none implicit none
class(mld_d_base_aggregator_type), target, intent(inout) :: ag class(mld_d_base_aggregator_type), target, intent(inout) :: ag
@ -331,7 +346,7 @@ contains
type(psb_dspmat_type), intent(inout) :: a type(psb_dspmat_type), intent(inout) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:)
type(psb_ldspmat_type), intent(out) :: op_prol type(psb_ldspmat_type), intent(out) :: t_prol
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_) :: err_act integer(psb_ipk_) :: err_act
@ -372,17 +387,17 @@ contains
!! \param info Return code !! \param info Return code
!! !!
subroutine mld_d_base_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,& subroutine mld_d_base_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,&
& ac,desc_ac,op_prol,op_restr,info) & ac,desc_ac,op_prol,op_restr,t_prol,info)
use psb_base_mod use psb_base_mod
implicit none implicit none
class(mld_d_base_aggregator_type), target, intent(inout) :: ag class(mld_d_base_aggregator_type), target, intent(inout) :: ag
type(mld_dml_parms), intent(inout) :: parms type(mld_dml_parms), intent(inout) :: parms
type(psb_dspmat_type), intent(in) :: a type(psb_dspmat_type), intent(in) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
type(psb_ldspmat_type), intent(inout) :: op_prol type(psb_ldspmat_type), intent(inout) :: t_prol
type(psb_ldspmat_type), intent(out) :: ac,op_restr type(psb_dspmat_type), intent(out) :: op_prol, ac,op_restr
type(psb_desc_type), intent(inout) :: desc_ac type(psb_desc_type), intent(inout) :: desc_ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_) :: err_act integer(psb_ipk_) :: err_act
character(len=20) :: name='d_base_aggregator_mat_bld' character(len=20) :: name='d_base_aggregator_mat_bld'
@ -420,7 +435,7 @@ contains
!! in many cases it is the transpose of the prolongator. !! in many cases it is the transpose of the prolongator.
!! \param info Return code !! \param info Return code
!! !!
subroutine mld_d_base_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,& subroutine mld_d_base_aggregator_mat_asb(ag,parms,a,desc_a,&
& ac,desc_ac, op_prol,op_restr,info) & ac,desc_ac, op_prol,op_restr,info)
use psb_base_mod use psb_base_mod
implicit none implicit none
@ -428,8 +443,7 @@ contains
type(mld_dml_parms), intent(inout) :: parms type(mld_dml_parms), intent(inout) :: parms
type(psb_dspmat_type), intent(in) :: a type(psb_dspmat_type), intent(in) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(psb_dspmat_type), intent(inout) :: op_prol,ac,op_restr
type(psb_ldspmat_type), intent(inout) :: op_prol,ac,op_restr
type(psb_desc_type), intent(inout) :: desc_ac type(psb_desc_type), intent(inout) :: desc_ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_) :: err_act integer(psb_ipk_) :: err_act
@ -472,7 +486,7 @@ contains
class(mld_d_base_aggregator_type), target, intent(inout) :: ag class(mld_d_base_aggregator_type), target, intent(inout) :: ag
type(psb_desc_type), intent(in), target :: desc_a, desc_ac type(psb_desc_type), intent(in), target :: desc_a, desc_ac
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
type(psb_ldspmat_type), intent(inout) :: op_restr, op_prol type(psb_dspmat_type), intent(inout) :: op_restr, op_prol
type(psb_dlinmap_type), intent(out) :: map type(psb_dlinmap_type), intent(out) :: map
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
type(psb_dspmat_type) :: iop_restr, iop_prol type(psb_dspmat_type) :: iop_restr, iop_prol
@ -491,8 +505,6 @@ contains
! This default implementation reuses desc_a/desc_ac through ! This default implementation reuses desc_a/desc_ac through
! pointers in the map structure. ! pointers in the map structure.
! !
call iop_restr%mv_from_l(op_restr)
call iop_prol%mv_from_l(op_prol)
map = psb_linmap(psb_map_aggr_,desc_a,& map = psb_linmap(psb_map_aggr_,desc_a,&
& desc_ac,iop_restr,iop_prol,ilaggr,nlaggr) & desc_ac,iop_restr,iop_prol,ilaggr,nlaggr)
if (info == psb_success_) call iop_prol%free() if (info == psb_success_) call iop_prol%free()

@ -93,7 +93,7 @@ module mld_d_dec_aggregator_mod
interface interface
subroutine mld_d_dec_aggregator_build_tprol(ag,parms,ag_data,& subroutine mld_d_dec_aggregator_build_tprol(ag,parms,ag_data,&
& a,desc_a,ilaggr,nlaggr,op_prol,info) & a,desc_a,ilaggr,nlaggr,t_prol,info)
import :: mld_d_dec_aggregator_type, psb_desc_type, psb_dspmat_type, psb_dpk_, & import :: mld_d_dec_aggregator_type, psb_desc_type, psb_dspmat_type, psb_dpk_, &
& psb_ipk_, psb_lpk_, psb_ldspmat_type, mld_dml_parms, mld_daggr_data & psb_ipk_, psb_lpk_, psb_ldspmat_type, mld_dml_parms, mld_daggr_data
implicit none implicit none
@ -103,14 +103,14 @@ module mld_d_dec_aggregator_mod
type(psb_dspmat_type), intent(inout) :: a type(psb_dspmat_type), intent(inout) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:)
type(psb_ldspmat_type), intent(out) :: op_prol type(psb_ldspmat_type), intent(out) :: t_prol
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
end subroutine mld_d_dec_aggregator_build_tprol end subroutine mld_d_dec_aggregator_build_tprol
end interface end interface
interface interface
subroutine mld_d_dec_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,& subroutine mld_d_dec_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,&
& ac,desc_ac,op_prol,op_restr,info) & ac,desc_ac,op_prol,op_restr,t_prol,info)
import :: mld_d_dec_aggregator_type, psb_desc_type, psb_dspmat_type, psb_dpk_, & import :: mld_d_dec_aggregator_type, psb_desc_type, psb_dspmat_type, psb_dpk_, &
& psb_ipk_, psb_lpk_, psb_ldspmat_type, mld_dml_parms & psb_ipk_, psb_lpk_, psb_ldspmat_type, mld_dml_parms
implicit none implicit none
@ -119,15 +119,15 @@ module mld_d_dec_aggregator_mod
type(psb_dspmat_type), intent(in) :: a type(psb_dspmat_type), intent(in) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
type(psb_ldspmat_type), intent(inout) :: op_prol type(psb_ldspmat_type), intent(inout) :: t_prol
type(psb_ldspmat_type), intent(out) :: ac,op_restr type(psb_dspmat_type), intent(out) :: op_prol, ac,op_restr
type(psb_desc_type), intent(inout) :: desc_ac type(psb_desc_type), intent(inout) :: desc_ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
end subroutine mld_d_dec_aggregator_mat_bld end subroutine mld_d_dec_aggregator_mat_bld
end interface end interface
interface interface
subroutine mld_d_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,& subroutine mld_d_dec_aggregator_mat_asb(ag,parms,a,desc_a,&
& ac,desc_ac,op_prol,op_restr,info) & ac,desc_ac,op_prol,op_restr,info)
import :: mld_d_dec_aggregator_type, psb_desc_type, psb_dspmat_type, psb_dpk_, & import :: mld_d_dec_aggregator_type, psb_desc_type, psb_dspmat_type, psb_dpk_, &
& psb_ipk_, psb_lpk_, psb_ldspmat_type, mld_dml_parms & psb_ipk_, psb_lpk_, psb_ldspmat_type, mld_dml_parms
@ -136,8 +136,7 @@ module mld_d_dec_aggregator_mod
type(mld_dml_parms), intent(inout) :: parms type(mld_dml_parms), intent(inout) :: parms
type(psb_dspmat_type), intent(in) :: a type(psb_dspmat_type), intent(in) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(psb_dspmat_type), intent(inout) :: op_prol,ac,op_restr
type(psb_ldspmat_type), intent(inout) :: op_prol,ac,op_restr
type(psb_desc_type), intent(inout) :: desc_ac type(psb_desc_type), intent(inout) :: desc_ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
end subroutine mld_d_dec_aggregator_mat_asb end subroutine mld_d_dec_aggregator_mat_asb

@ -110,7 +110,7 @@ module mld_d_inner_mod
abstract interface abstract interface
subroutine mld_daggrmat_var_bld(a,desc_a,ilaggr,nlaggr,parms,& subroutine mld_daggrmat_var_bld(a,desc_a,ilaggr,nlaggr,parms,&
& ac,desc_ac,op_prol,op_restr,info) & ac,desc_ac,op_prol,op_restr,t_prol,info)
import :: psb_dspmat_type, psb_desc_type, psb_dpk_, psb_ipk_, psb_lpk_, psb_ldspmat_type import :: psb_dspmat_type, psb_desc_type, psb_dpk_, psb_ipk_, psb_lpk_, psb_ldspmat_type
import :: mld_d_onelev_type, mld_dml_parms import :: mld_d_onelev_type, mld_dml_parms
implicit none implicit none
@ -118,8 +118,8 @@ module mld_d_inner_mod
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
type(mld_dml_parms), intent(inout) :: parms type(mld_dml_parms), intent(inout) :: parms
type(psb_ldspmat_type), intent(inout) :: op_prol type(psb_dspmat_type), intent(inout) :: op_prol,ac,op_restr
type(psb_ldspmat_type), intent(out) :: ac,op_restr type(psb_ldspmat_type), intent(inout) :: t_prol
type(psb_desc_type), intent(inout) :: desc_ac type(psb_desc_type), intent(inout) :: desc_ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
end subroutine mld_daggrmat_var_bld end subroutine mld_daggrmat_var_bld

@ -210,7 +210,7 @@ module mld_d_onelev_mod
& d_base_onelev_free_wrk & d_base_onelev_free_wrk
interface interface
subroutine mld_d_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info) subroutine mld_d_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,t_prol,info)
import :: psb_dspmat_type, psb_desc_type, psb_dpk_, psb_ipk_, psb_ldspmat_type, psb_lpk_ import :: psb_dspmat_type, psb_desc_type, psb_dpk_, psb_ipk_, psb_ldspmat_type, psb_lpk_
import :: mld_d_onelev_type import :: mld_d_onelev_type
implicit none implicit none
@ -218,7 +218,7 @@ module mld_d_onelev_mod
type(psb_dspmat_type), intent(in) :: a type(psb_dspmat_type), intent(in) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:),nlaggr(:) integer(psb_lpk_), intent(inout) :: ilaggr(:),nlaggr(:)
type(psb_ldspmat_type), intent(inout) :: op_prol type(psb_ldspmat_type), intent(inout) :: t_prol
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
end subroutine mld_d_base_onelev_mat_asb end subroutine mld_d_base_onelev_mat_asb
end interface end interface
@ -488,17 +488,17 @@ contains
end subroutine d_base_onelev_default end subroutine d_base_onelev_default
subroutine d_base_onelev_bld_tprol(lv,a,desc_a,& subroutine d_base_onelev_bld_tprol(lv,a,desc_a,&
& ilaggr,nlaggr,op_prol,ag_data,info) & ilaggr,nlaggr,t_prol,ag_data,info)
implicit none implicit none
class(mld_d_onelev_type), intent(inout), target :: lv class(mld_d_onelev_type), intent(inout), target :: lv
type(psb_dspmat_type), intent(inout) :: a type(psb_dspmat_type), intent(inout) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:)
type(psb_ldspmat_type), intent(out) :: op_prol type(psb_ldspmat_type), intent(out) :: t_prol
type(mld_daggr_data), intent(in) :: ag_data type(mld_daggr_data), intent(in) :: ag_data
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
call lv%aggr%bld_tprol(lv%parms,ag_data,a,desc_a,ilaggr,nlaggr,op_prol,info) call lv%aggr%bld_tprol(lv%parms,ag_data,a,desc_a,ilaggr,nlaggr,t_prol,info)
end subroutine d_base_onelev_bld_tprol end subroutine d_base_onelev_bld_tprol

@ -63,7 +63,7 @@ module mld_d_symdec_aggregator_mod
interface interface
subroutine mld_d_symdec_aggregator_build_tprol(ag,parms,ag_data,& subroutine mld_d_symdec_aggregator_build_tprol(ag,parms,ag_data,&
& a,desc_a,ilaggr,nlaggr,op_prol,info) & a,desc_a,ilaggr,nlaggr,t_prol,info)
import :: mld_d_symdec_aggregator_type, psb_desc_type, psb_dspmat_type, psb_dpk_, & import :: mld_d_symdec_aggregator_type, psb_desc_type, psb_dspmat_type, psb_dpk_, &
& psb_ipk_, psb_lpk_, psb_ldspmat_type, mld_dml_parms, mld_daggr_data & psb_ipk_, psb_lpk_, psb_ldspmat_type, mld_dml_parms, mld_daggr_data
implicit none implicit none
@ -73,7 +73,7 @@ module mld_d_symdec_aggregator_mod
type(psb_dspmat_type), intent(inout) :: a type(psb_dspmat_type), intent(inout) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:)
type(psb_ldspmat_type), intent(out) :: op_prol type(psb_ldspmat_type), intent(out) :: t_prol
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
end subroutine mld_d_symdec_aggregator_build_tprol end subroutine mld_d_symdec_aggregator_build_tprol
end interface end interface

@ -122,6 +122,21 @@ module mld_s_base_aggregator_mod
interface mld_ptap interface mld_ptap
subroutine mld_s_ptap(a_csr,desc_a,nlaggr,parms,ac,& subroutine mld_s_ptap(a_csr,desc_a,nlaggr,parms,ac,&
& coo_prol,desc_cprol,coo_restr,info,desc_ax) & coo_prol,desc_cprol,coo_restr,info,desc_ax)
import :: psb_s_csr_sparse_mat, psb_sspmat_type, psb_desc_type, &
& psb_s_coo_sparse_mat, mld_sml_parms, psb_spk_, psb_ipk_, psb_lpk_
implicit none
type(psb_s_csr_sparse_mat), intent(inout) :: a_csr
type(psb_desc_type), intent(in) :: desc_a
integer(psb_lpk_), intent(inout) :: nlaggr(:)
type(mld_sml_parms), intent(inout) :: parms
type(psb_s_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr
type(psb_desc_type), intent(inout) :: desc_cprol
type(psb_sspmat_type), intent(out) :: ac
integer(psb_ipk_), intent(out) :: info
type(psb_desc_type), intent(inout), optional :: desc_ax
end subroutine mld_s_ptap
subroutine mld_s_ls_ptap(a_csr,desc_a,nlaggr,parms,ac,&
& coo_prol,desc_cprol,coo_restr,info,desc_ax)
import :: psb_s_csr_sparse_mat, psb_lsspmat_type, psb_desc_type, & import :: psb_s_csr_sparse_mat, psb_lsspmat_type, psb_desc_type, &
& psb_ls_coo_sparse_mat, mld_sml_parms, psb_spk_, psb_ipk_, psb_lpk_ & psb_ls_coo_sparse_mat, mld_sml_parms, psb_spk_, psb_ipk_, psb_lpk_
implicit none implicit none
@ -134,7 +149,7 @@ module mld_s_base_aggregator_mod
type(psb_lsspmat_type), intent(out) :: ac type(psb_lsspmat_type), intent(out) :: ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
type(psb_desc_type), intent(inout), optional :: desc_ax type(psb_desc_type), intent(inout), optional :: desc_ax
end subroutine mld_s_ptap end subroutine mld_s_ls_ptap
subroutine mld_ls_ptap(a_csr,desc_a,nlaggr,parms,ac,& subroutine mld_ls_ptap(a_csr,desc_a,nlaggr,parms,ac,&
& coo_prol,desc_cprol,coo_restr,info,desc_ax) & coo_prol,desc_cprol,coo_restr,info,desc_ax)
import :: psb_ls_csr_sparse_mat, psb_lsspmat_type, psb_desc_type, & import :: psb_ls_csr_sparse_mat, psb_lsspmat_type, psb_desc_type, &
@ -322,7 +337,7 @@ contains
!! !!
! !
subroutine mld_s_base_aggregator_build_tprol(ag,parms,ag_data,& subroutine mld_s_base_aggregator_build_tprol(ag,parms,ag_data,&
& a,desc_a,ilaggr,nlaggr,op_prol,info) & a,desc_a,ilaggr,nlaggr,t_prol,info)
use psb_base_mod use psb_base_mod
implicit none implicit none
class(mld_s_base_aggregator_type), target, intent(inout) :: ag class(mld_s_base_aggregator_type), target, intent(inout) :: ag
@ -331,7 +346,7 @@ contains
type(psb_sspmat_type), intent(inout) :: a type(psb_sspmat_type), intent(inout) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:)
type(psb_lsspmat_type), intent(out) :: op_prol type(psb_lsspmat_type), intent(out) :: t_prol
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_) :: err_act integer(psb_ipk_) :: err_act
@ -372,17 +387,17 @@ contains
!! \param info Return code !! \param info Return code
!! !!
subroutine mld_s_base_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,& subroutine mld_s_base_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,&
& ac,desc_ac,op_prol,op_restr,info) & ac,desc_ac,op_prol,op_restr,t_prol,info)
use psb_base_mod use psb_base_mod
implicit none implicit none
class(mld_s_base_aggregator_type), target, intent(inout) :: ag class(mld_s_base_aggregator_type), target, intent(inout) :: ag
type(mld_sml_parms), intent(inout) :: parms type(mld_sml_parms), intent(inout) :: parms
type(psb_sspmat_type), intent(in) :: a type(psb_sspmat_type), intent(in) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
type(psb_lsspmat_type), intent(inout) :: op_prol type(psb_lsspmat_type), intent(inout) :: t_prol
type(psb_lsspmat_type), intent(out) :: ac,op_restr type(psb_sspmat_type), intent(out) :: op_prol, ac,op_restr
type(psb_desc_type), intent(inout) :: desc_ac type(psb_desc_type), intent(inout) :: desc_ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_) :: err_act integer(psb_ipk_) :: err_act
character(len=20) :: name='s_base_aggregator_mat_bld' character(len=20) :: name='s_base_aggregator_mat_bld'
@ -420,7 +435,7 @@ contains
!! in many cases it is the transpose of the prolongator. !! in many cases it is the transpose of the prolongator.
!! \param info Return code !! \param info Return code
!! !!
subroutine mld_s_base_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,& subroutine mld_s_base_aggregator_mat_asb(ag,parms,a,desc_a,&
& ac,desc_ac, op_prol,op_restr,info) & ac,desc_ac, op_prol,op_restr,info)
use psb_base_mod use psb_base_mod
implicit none implicit none
@ -428,8 +443,7 @@ contains
type(mld_sml_parms), intent(inout) :: parms type(mld_sml_parms), intent(inout) :: parms
type(psb_sspmat_type), intent(in) :: a type(psb_sspmat_type), intent(in) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(psb_sspmat_type), intent(inout) :: op_prol,ac,op_restr
type(psb_lsspmat_type), intent(inout) :: op_prol,ac,op_restr
type(psb_desc_type), intent(inout) :: desc_ac type(psb_desc_type), intent(inout) :: desc_ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_) :: err_act integer(psb_ipk_) :: err_act
@ -472,7 +486,7 @@ contains
class(mld_s_base_aggregator_type), target, intent(inout) :: ag class(mld_s_base_aggregator_type), target, intent(inout) :: ag
type(psb_desc_type), intent(in), target :: desc_a, desc_ac type(psb_desc_type), intent(in), target :: desc_a, desc_ac
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
type(psb_lsspmat_type), intent(inout) :: op_restr, op_prol type(psb_sspmat_type), intent(inout) :: op_restr, op_prol
type(psb_slinmap_type), intent(out) :: map type(psb_slinmap_type), intent(out) :: map
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
type(psb_sspmat_type) :: iop_restr, iop_prol type(psb_sspmat_type) :: iop_restr, iop_prol
@ -491,8 +505,6 @@ contains
! This default implementation reuses desc_a/desc_ac through ! This default implementation reuses desc_a/desc_ac through
! pointers in the map structure. ! pointers in the map structure.
! !
call iop_restr%mv_from_l(op_restr)
call iop_prol%mv_from_l(op_prol)
map = psb_linmap(psb_map_aggr_,desc_a,& map = psb_linmap(psb_map_aggr_,desc_a,&
& desc_ac,iop_restr,iop_prol,ilaggr,nlaggr) & desc_ac,iop_restr,iop_prol,ilaggr,nlaggr)
if (info == psb_success_) call iop_prol%free() if (info == psb_success_) call iop_prol%free()

@ -93,7 +93,7 @@ module mld_s_dec_aggregator_mod
interface interface
subroutine mld_s_dec_aggregator_build_tprol(ag,parms,ag_data,& subroutine mld_s_dec_aggregator_build_tprol(ag,parms,ag_data,&
& a,desc_a,ilaggr,nlaggr,op_prol,info) & a,desc_a,ilaggr,nlaggr,t_prol,info)
import :: mld_s_dec_aggregator_type, psb_desc_type, psb_sspmat_type, psb_spk_, & import :: mld_s_dec_aggregator_type, psb_desc_type, psb_sspmat_type, psb_spk_, &
& psb_ipk_, psb_lpk_, psb_lsspmat_type, mld_sml_parms, mld_saggr_data & psb_ipk_, psb_lpk_, psb_lsspmat_type, mld_sml_parms, mld_saggr_data
implicit none implicit none
@ -103,14 +103,14 @@ module mld_s_dec_aggregator_mod
type(psb_sspmat_type), intent(inout) :: a type(psb_sspmat_type), intent(inout) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:)
type(psb_lsspmat_type), intent(out) :: op_prol type(psb_lsspmat_type), intent(out) :: t_prol
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
end subroutine mld_s_dec_aggregator_build_tprol end subroutine mld_s_dec_aggregator_build_tprol
end interface end interface
interface interface
subroutine mld_s_dec_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,& subroutine mld_s_dec_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,&
& ac,desc_ac,op_prol,op_restr,info) & ac,desc_ac,op_prol,op_restr,t_prol,info)
import :: mld_s_dec_aggregator_type, psb_desc_type, psb_sspmat_type, psb_spk_, & import :: mld_s_dec_aggregator_type, psb_desc_type, psb_sspmat_type, psb_spk_, &
& psb_ipk_, psb_lpk_, psb_lsspmat_type, mld_sml_parms & psb_ipk_, psb_lpk_, psb_lsspmat_type, mld_sml_parms
implicit none implicit none
@ -119,15 +119,15 @@ module mld_s_dec_aggregator_mod
type(psb_sspmat_type), intent(in) :: a type(psb_sspmat_type), intent(in) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
type(psb_lsspmat_type), intent(inout) :: op_prol type(psb_lsspmat_type), intent(inout) :: t_prol
type(psb_lsspmat_type), intent(out) :: ac,op_restr type(psb_sspmat_type), intent(out) :: op_prol, ac,op_restr
type(psb_desc_type), intent(inout) :: desc_ac type(psb_desc_type), intent(inout) :: desc_ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
end subroutine mld_s_dec_aggregator_mat_bld end subroutine mld_s_dec_aggregator_mat_bld
end interface end interface
interface interface
subroutine mld_s_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,& subroutine mld_s_dec_aggregator_mat_asb(ag,parms,a,desc_a,&
& ac,desc_ac,op_prol,op_restr,info) & ac,desc_ac,op_prol,op_restr,info)
import :: mld_s_dec_aggregator_type, psb_desc_type, psb_sspmat_type, psb_spk_, & import :: mld_s_dec_aggregator_type, psb_desc_type, psb_sspmat_type, psb_spk_, &
& psb_ipk_, psb_lpk_, psb_lsspmat_type, mld_sml_parms & psb_ipk_, psb_lpk_, psb_lsspmat_type, mld_sml_parms
@ -136,8 +136,7 @@ module mld_s_dec_aggregator_mod
type(mld_sml_parms), intent(inout) :: parms type(mld_sml_parms), intent(inout) :: parms
type(psb_sspmat_type), intent(in) :: a type(psb_sspmat_type), intent(in) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(psb_sspmat_type), intent(inout) :: op_prol,ac,op_restr
type(psb_lsspmat_type), intent(inout) :: op_prol,ac,op_restr
type(psb_desc_type), intent(inout) :: desc_ac type(psb_desc_type), intent(inout) :: desc_ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
end subroutine mld_s_dec_aggregator_mat_asb end subroutine mld_s_dec_aggregator_mat_asb

@ -110,7 +110,7 @@ module mld_s_inner_mod
abstract interface abstract interface
subroutine mld_saggrmat_var_bld(a,desc_a,ilaggr,nlaggr,parms,& subroutine mld_saggrmat_var_bld(a,desc_a,ilaggr,nlaggr,parms,&
& ac,desc_ac,op_prol,op_restr,info) & ac,desc_ac,op_prol,op_restr,t_prol,info)
import :: psb_sspmat_type, psb_desc_type, psb_spk_, psb_ipk_, psb_lpk_, psb_lsspmat_type import :: psb_sspmat_type, psb_desc_type, psb_spk_, psb_ipk_, psb_lpk_, psb_lsspmat_type
import :: mld_s_onelev_type, mld_sml_parms import :: mld_s_onelev_type, mld_sml_parms
implicit none implicit none
@ -118,8 +118,8 @@ module mld_s_inner_mod
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
type(mld_sml_parms), intent(inout) :: parms type(mld_sml_parms), intent(inout) :: parms
type(psb_lsspmat_type), intent(inout) :: op_prol type(psb_sspmat_type), intent(inout) :: op_prol,ac,op_restr
type(psb_lsspmat_type), intent(out) :: ac,op_restr type(psb_lsspmat_type), intent(inout) :: t_prol
type(psb_desc_type), intent(inout) :: desc_ac type(psb_desc_type), intent(inout) :: desc_ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
end subroutine mld_saggrmat_var_bld end subroutine mld_saggrmat_var_bld

@ -210,7 +210,7 @@ module mld_s_onelev_mod
& s_base_onelev_free_wrk & s_base_onelev_free_wrk
interface interface
subroutine mld_s_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info) subroutine mld_s_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,t_prol,info)
import :: psb_sspmat_type, psb_desc_type, psb_spk_, psb_ipk_, psb_lsspmat_type, psb_lpk_ import :: psb_sspmat_type, psb_desc_type, psb_spk_, psb_ipk_, psb_lsspmat_type, psb_lpk_
import :: mld_s_onelev_type import :: mld_s_onelev_type
implicit none implicit none
@ -218,7 +218,7 @@ module mld_s_onelev_mod
type(psb_sspmat_type), intent(in) :: a type(psb_sspmat_type), intent(in) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:),nlaggr(:) integer(psb_lpk_), intent(inout) :: ilaggr(:),nlaggr(:)
type(psb_lsspmat_type), intent(inout) :: op_prol type(psb_lsspmat_type), intent(inout) :: t_prol
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
end subroutine mld_s_base_onelev_mat_asb end subroutine mld_s_base_onelev_mat_asb
end interface end interface
@ -488,17 +488,17 @@ contains
end subroutine s_base_onelev_default end subroutine s_base_onelev_default
subroutine s_base_onelev_bld_tprol(lv,a,desc_a,& subroutine s_base_onelev_bld_tprol(lv,a,desc_a,&
& ilaggr,nlaggr,op_prol,ag_data,info) & ilaggr,nlaggr,t_prol,ag_data,info)
implicit none implicit none
class(mld_s_onelev_type), intent(inout), target :: lv class(mld_s_onelev_type), intent(inout), target :: lv
type(psb_sspmat_type), intent(inout) :: a type(psb_sspmat_type), intent(inout) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:)
type(psb_lsspmat_type), intent(out) :: op_prol type(psb_lsspmat_type), intent(out) :: t_prol
type(mld_saggr_data), intent(in) :: ag_data type(mld_saggr_data), intent(in) :: ag_data
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
call lv%aggr%bld_tprol(lv%parms,ag_data,a,desc_a,ilaggr,nlaggr,op_prol,info) call lv%aggr%bld_tprol(lv%parms,ag_data,a,desc_a,ilaggr,nlaggr,t_prol,info)
end subroutine s_base_onelev_bld_tprol end subroutine s_base_onelev_bld_tprol

@ -63,7 +63,7 @@ module mld_s_symdec_aggregator_mod
interface interface
subroutine mld_s_symdec_aggregator_build_tprol(ag,parms,ag_data,& subroutine mld_s_symdec_aggregator_build_tprol(ag,parms,ag_data,&
& a,desc_a,ilaggr,nlaggr,op_prol,info) & a,desc_a,ilaggr,nlaggr,t_prol,info)
import :: mld_s_symdec_aggregator_type, psb_desc_type, psb_sspmat_type, psb_spk_, & import :: mld_s_symdec_aggregator_type, psb_desc_type, psb_sspmat_type, psb_spk_, &
& psb_ipk_, psb_lpk_, psb_lsspmat_type, mld_sml_parms, mld_saggr_data & psb_ipk_, psb_lpk_, psb_lsspmat_type, mld_sml_parms, mld_saggr_data
implicit none implicit none
@ -73,7 +73,7 @@ module mld_s_symdec_aggregator_mod
type(psb_sspmat_type), intent(inout) :: a type(psb_sspmat_type), intent(inout) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:)
type(psb_lsspmat_type), intent(out) :: op_prol type(psb_lsspmat_type), intent(out) :: t_prol
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
end subroutine mld_s_symdec_aggregator_build_tprol end subroutine mld_s_symdec_aggregator_build_tprol
end interface end interface

@ -122,6 +122,21 @@ module mld_z_base_aggregator_mod
interface mld_ptap interface mld_ptap
subroutine mld_z_ptap(a_csr,desc_a,nlaggr,parms,ac,& subroutine mld_z_ptap(a_csr,desc_a,nlaggr,parms,ac,&
& coo_prol,desc_cprol,coo_restr,info,desc_ax) & coo_prol,desc_cprol,coo_restr,info,desc_ax)
import :: psb_z_csr_sparse_mat, psb_zspmat_type, psb_desc_type, &
& psb_z_coo_sparse_mat, mld_dml_parms, psb_dpk_, psb_ipk_, psb_lpk_
implicit none
type(psb_z_csr_sparse_mat), intent(inout) :: a_csr
type(psb_desc_type), intent(in) :: desc_a
integer(psb_lpk_), intent(inout) :: nlaggr(:)
type(mld_dml_parms), intent(inout) :: parms
type(psb_z_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr
type(psb_desc_type), intent(inout) :: desc_cprol
type(psb_zspmat_type), intent(out) :: ac
integer(psb_ipk_), intent(out) :: info
type(psb_desc_type), intent(inout), optional :: desc_ax
end subroutine mld_z_ptap
subroutine mld_z_lz_ptap(a_csr,desc_a,nlaggr,parms,ac,&
& coo_prol,desc_cprol,coo_restr,info,desc_ax)
import :: psb_z_csr_sparse_mat, psb_lzspmat_type, psb_desc_type, & import :: psb_z_csr_sparse_mat, psb_lzspmat_type, psb_desc_type, &
& psb_lz_coo_sparse_mat, mld_dml_parms, psb_dpk_, psb_ipk_, psb_lpk_ & psb_lz_coo_sparse_mat, mld_dml_parms, psb_dpk_, psb_ipk_, psb_lpk_
implicit none implicit none
@ -134,7 +149,7 @@ module mld_z_base_aggregator_mod
type(psb_lzspmat_type), intent(out) :: ac type(psb_lzspmat_type), intent(out) :: ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
type(psb_desc_type), intent(inout), optional :: desc_ax type(psb_desc_type), intent(inout), optional :: desc_ax
end subroutine mld_z_ptap end subroutine mld_z_lz_ptap
subroutine mld_lz_ptap(a_csr,desc_a,nlaggr,parms,ac,& subroutine mld_lz_ptap(a_csr,desc_a,nlaggr,parms,ac,&
& coo_prol,desc_cprol,coo_restr,info,desc_ax) & coo_prol,desc_cprol,coo_restr,info,desc_ax)
import :: psb_lz_csr_sparse_mat, psb_lzspmat_type, psb_desc_type, & import :: psb_lz_csr_sparse_mat, psb_lzspmat_type, psb_desc_type, &
@ -322,7 +337,7 @@ contains
!! !!
! !
subroutine mld_z_base_aggregator_build_tprol(ag,parms,ag_data,& subroutine mld_z_base_aggregator_build_tprol(ag,parms,ag_data,&
& a,desc_a,ilaggr,nlaggr,op_prol,info) & a,desc_a,ilaggr,nlaggr,t_prol,info)
use psb_base_mod use psb_base_mod
implicit none implicit none
class(mld_z_base_aggregator_type), target, intent(inout) :: ag class(mld_z_base_aggregator_type), target, intent(inout) :: ag
@ -331,7 +346,7 @@ contains
type(psb_zspmat_type), intent(inout) :: a type(psb_zspmat_type), intent(inout) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:)
type(psb_lzspmat_type), intent(out) :: op_prol type(psb_lzspmat_type), intent(out) :: t_prol
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_) :: err_act integer(psb_ipk_) :: err_act
@ -372,17 +387,17 @@ contains
!! \param info Return code !! \param info Return code
!! !!
subroutine mld_z_base_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,& subroutine mld_z_base_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,&
& ac,desc_ac,op_prol,op_restr,info) & ac,desc_ac,op_prol,op_restr,t_prol,info)
use psb_base_mod use psb_base_mod
implicit none implicit none
class(mld_z_base_aggregator_type), target, intent(inout) :: ag class(mld_z_base_aggregator_type), target, intent(inout) :: ag
type(mld_dml_parms), intent(inout) :: parms type(mld_dml_parms), intent(inout) :: parms
type(psb_zspmat_type), intent(in) :: a type(psb_zspmat_type), intent(in) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
type(psb_lzspmat_type), intent(inout) :: op_prol type(psb_lzspmat_type), intent(inout) :: t_prol
type(psb_lzspmat_type), intent(out) :: ac,op_restr type(psb_zspmat_type), intent(out) :: op_prol, ac,op_restr
type(psb_desc_type), intent(inout) :: desc_ac type(psb_desc_type), intent(inout) :: desc_ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_) :: err_act integer(psb_ipk_) :: err_act
character(len=20) :: name='z_base_aggregator_mat_bld' character(len=20) :: name='z_base_aggregator_mat_bld'
@ -420,7 +435,7 @@ contains
!! in many cases it is the transpose of the prolongator. !! in many cases it is the transpose of the prolongator.
!! \param info Return code !! \param info Return code
!! !!
subroutine mld_z_base_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,& subroutine mld_z_base_aggregator_mat_asb(ag,parms,a,desc_a,&
& ac,desc_ac, op_prol,op_restr,info) & ac,desc_ac, op_prol,op_restr,info)
use psb_base_mod use psb_base_mod
implicit none implicit none
@ -428,8 +443,7 @@ contains
type(mld_dml_parms), intent(inout) :: parms type(mld_dml_parms), intent(inout) :: parms
type(psb_zspmat_type), intent(in) :: a type(psb_zspmat_type), intent(in) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(psb_zspmat_type), intent(inout) :: op_prol,ac,op_restr
type(psb_lzspmat_type), intent(inout) :: op_prol,ac,op_restr
type(psb_desc_type), intent(inout) :: desc_ac type(psb_desc_type), intent(inout) :: desc_ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_) :: err_act integer(psb_ipk_) :: err_act
@ -472,7 +486,7 @@ contains
class(mld_z_base_aggregator_type), target, intent(inout) :: ag class(mld_z_base_aggregator_type), target, intent(inout) :: ag
type(psb_desc_type), intent(in), target :: desc_a, desc_ac type(psb_desc_type), intent(in), target :: desc_a, desc_ac
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
type(psb_lzspmat_type), intent(inout) :: op_restr, op_prol type(psb_zspmat_type), intent(inout) :: op_restr, op_prol
type(psb_zlinmap_type), intent(out) :: map type(psb_zlinmap_type), intent(out) :: map
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
type(psb_zspmat_type) :: iop_restr, iop_prol type(psb_zspmat_type) :: iop_restr, iop_prol
@ -491,8 +505,6 @@ contains
! This default implementation reuses desc_a/desc_ac through ! This default implementation reuses desc_a/desc_ac through
! pointers in the map structure. ! pointers in the map structure.
! !
call iop_restr%mv_from_l(op_restr)
call iop_prol%mv_from_l(op_prol)
map = psb_linmap(psb_map_aggr_,desc_a,& map = psb_linmap(psb_map_aggr_,desc_a,&
& desc_ac,iop_restr,iop_prol,ilaggr,nlaggr) & desc_ac,iop_restr,iop_prol,ilaggr,nlaggr)
if (info == psb_success_) call iop_prol%free() if (info == psb_success_) call iop_prol%free()

@ -93,7 +93,7 @@ module mld_z_dec_aggregator_mod
interface interface
subroutine mld_z_dec_aggregator_build_tprol(ag,parms,ag_data,& subroutine mld_z_dec_aggregator_build_tprol(ag,parms,ag_data,&
& a,desc_a,ilaggr,nlaggr,op_prol,info) & a,desc_a,ilaggr,nlaggr,t_prol,info)
import :: mld_z_dec_aggregator_type, psb_desc_type, psb_zspmat_type, psb_dpk_, & import :: mld_z_dec_aggregator_type, psb_desc_type, psb_zspmat_type, psb_dpk_, &
& psb_ipk_, psb_lpk_, psb_lzspmat_type, mld_dml_parms, mld_daggr_data & psb_ipk_, psb_lpk_, psb_lzspmat_type, mld_dml_parms, mld_daggr_data
implicit none implicit none
@ -103,14 +103,14 @@ module mld_z_dec_aggregator_mod
type(psb_zspmat_type), intent(inout) :: a type(psb_zspmat_type), intent(inout) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:)
type(psb_lzspmat_type), intent(out) :: op_prol type(psb_lzspmat_type), intent(out) :: t_prol
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
end subroutine mld_z_dec_aggregator_build_tprol end subroutine mld_z_dec_aggregator_build_tprol
end interface end interface
interface interface
subroutine mld_z_dec_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,& subroutine mld_z_dec_aggregator_mat_bld(ag,parms,a,desc_a,ilaggr,nlaggr,&
& ac,desc_ac,op_prol,op_restr,info) & ac,desc_ac,op_prol,op_restr,t_prol,info)
import :: mld_z_dec_aggregator_type, psb_desc_type, psb_zspmat_type, psb_dpk_, & import :: mld_z_dec_aggregator_type, psb_desc_type, psb_zspmat_type, psb_dpk_, &
& psb_ipk_, psb_lpk_, psb_lzspmat_type, mld_dml_parms & psb_ipk_, psb_lpk_, psb_lzspmat_type, mld_dml_parms
implicit none implicit none
@ -119,15 +119,15 @@ module mld_z_dec_aggregator_mod
type(psb_zspmat_type), intent(in) :: a type(psb_zspmat_type), intent(in) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
type(psb_lzspmat_type), intent(inout) :: op_prol type(psb_lzspmat_type), intent(inout) :: t_prol
type(psb_lzspmat_type), intent(out) :: ac,op_restr type(psb_zspmat_type), intent(out) :: op_prol, ac,op_restr
type(psb_desc_type), intent(inout) :: desc_ac type(psb_desc_type), intent(inout) :: desc_ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
end subroutine mld_z_dec_aggregator_mat_bld end subroutine mld_z_dec_aggregator_mat_bld
end interface end interface
interface interface
subroutine mld_z_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,& subroutine mld_z_dec_aggregator_mat_asb(ag,parms,a,desc_a,&
& ac,desc_ac,op_prol,op_restr,info) & ac,desc_ac,op_prol,op_restr,info)
import :: mld_z_dec_aggregator_type, psb_desc_type, psb_zspmat_type, psb_dpk_, & import :: mld_z_dec_aggregator_type, psb_desc_type, psb_zspmat_type, psb_dpk_, &
& psb_ipk_, psb_lpk_, psb_lzspmat_type, mld_dml_parms & psb_ipk_, psb_lpk_, psb_lzspmat_type, mld_dml_parms
@ -136,8 +136,7 @@ module mld_z_dec_aggregator_mod
type(mld_dml_parms), intent(inout) :: parms type(mld_dml_parms), intent(inout) :: parms
type(psb_zspmat_type), intent(in) :: a type(psb_zspmat_type), intent(in) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) type(psb_zspmat_type), intent(inout) :: op_prol,ac,op_restr
type(psb_lzspmat_type), intent(inout) :: op_prol,ac,op_restr
type(psb_desc_type), intent(inout) :: desc_ac type(psb_desc_type), intent(inout) :: desc_ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
end subroutine mld_z_dec_aggregator_mat_asb end subroutine mld_z_dec_aggregator_mat_asb

@ -110,7 +110,7 @@ module mld_z_inner_mod
abstract interface abstract interface
subroutine mld_zaggrmat_var_bld(a,desc_a,ilaggr,nlaggr,parms,& subroutine mld_zaggrmat_var_bld(a,desc_a,ilaggr,nlaggr,parms,&
& ac,desc_ac,op_prol,op_restr,info) & ac,desc_ac,op_prol,op_restr,t_prol,info)
import :: psb_zspmat_type, psb_desc_type, psb_dpk_, psb_ipk_, psb_lpk_, psb_lzspmat_type import :: psb_zspmat_type, psb_desc_type, psb_dpk_, psb_ipk_, psb_lpk_, psb_lzspmat_type
import :: mld_z_onelev_type, mld_dml_parms import :: mld_z_onelev_type, mld_dml_parms
implicit none implicit none
@ -118,8 +118,8 @@ module mld_z_inner_mod
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:) integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
type(mld_dml_parms), intent(inout) :: parms type(mld_dml_parms), intent(inout) :: parms
type(psb_lzspmat_type), intent(inout) :: op_prol type(psb_zspmat_type), intent(inout) :: op_prol,ac,op_restr
type(psb_lzspmat_type), intent(out) :: ac,op_restr type(psb_lzspmat_type), intent(inout) :: t_prol
type(psb_desc_type), intent(inout) :: desc_ac type(psb_desc_type), intent(inout) :: desc_ac
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
end subroutine mld_zaggrmat_var_bld end subroutine mld_zaggrmat_var_bld

@ -210,7 +210,7 @@ module mld_z_onelev_mod
& z_base_onelev_free_wrk & z_base_onelev_free_wrk
interface interface
subroutine mld_z_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info) subroutine mld_z_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,t_prol,info)
import :: psb_zspmat_type, psb_desc_type, psb_dpk_, psb_ipk_, psb_lzspmat_type, psb_lpk_ import :: psb_zspmat_type, psb_desc_type, psb_dpk_, psb_ipk_, psb_lzspmat_type, psb_lpk_
import :: mld_z_onelev_type import :: mld_z_onelev_type
implicit none implicit none
@ -218,7 +218,7 @@ module mld_z_onelev_mod
type(psb_zspmat_type), intent(in) :: a type(psb_zspmat_type), intent(in) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), intent(inout) :: ilaggr(:),nlaggr(:) integer(psb_lpk_), intent(inout) :: ilaggr(:),nlaggr(:)
type(psb_lzspmat_type), intent(inout) :: op_prol type(psb_lzspmat_type), intent(inout) :: t_prol
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
end subroutine mld_z_base_onelev_mat_asb end subroutine mld_z_base_onelev_mat_asb
end interface end interface
@ -488,17 +488,17 @@ contains
end subroutine z_base_onelev_default end subroutine z_base_onelev_default
subroutine z_base_onelev_bld_tprol(lv,a,desc_a,& subroutine z_base_onelev_bld_tprol(lv,a,desc_a,&
& ilaggr,nlaggr,op_prol,ag_data,info) & ilaggr,nlaggr,t_prol,ag_data,info)
implicit none implicit none
class(mld_z_onelev_type), intent(inout), target :: lv class(mld_z_onelev_type), intent(inout), target :: lv
type(psb_zspmat_type), intent(inout) :: a type(psb_zspmat_type), intent(inout) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:)
type(psb_lzspmat_type), intent(out) :: op_prol type(psb_lzspmat_type), intent(out) :: t_prol
type(mld_daggr_data), intent(in) :: ag_data type(mld_daggr_data), intent(in) :: ag_data
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
call lv%aggr%bld_tprol(lv%parms,ag_data,a,desc_a,ilaggr,nlaggr,op_prol,info) call lv%aggr%bld_tprol(lv%parms,ag_data,a,desc_a,ilaggr,nlaggr,t_prol,info)
end subroutine z_base_onelev_bld_tprol end subroutine z_base_onelev_bld_tprol

@ -63,7 +63,7 @@ module mld_z_symdec_aggregator_mod
interface interface
subroutine mld_z_symdec_aggregator_build_tprol(ag,parms,ag_data,& subroutine mld_z_symdec_aggregator_build_tprol(ag,parms,ag_data,&
& a,desc_a,ilaggr,nlaggr,op_prol,info) & a,desc_a,ilaggr,nlaggr,t_prol,info)
import :: mld_z_symdec_aggregator_type, psb_desc_type, psb_zspmat_type, psb_dpk_, & import :: mld_z_symdec_aggregator_type, psb_desc_type, psb_zspmat_type, psb_dpk_, &
& psb_ipk_, psb_lpk_, psb_lzspmat_type, mld_dml_parms, mld_daggr_data & psb_ipk_, psb_lpk_, psb_lzspmat_type, mld_dml_parms, mld_daggr_data
implicit none implicit none
@ -73,7 +73,7 @@ module mld_z_symdec_aggregator_mod
type(psb_zspmat_type), intent(inout) :: a type(psb_zspmat_type), intent(inout) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:)
type(psb_lzspmat_type), intent(out) :: op_prol type(psb_lzspmat_type), intent(out) :: t_prol
integer(psb_ipk_), intent(out) :: info integer(psb_ipk_), intent(out) :: info
end subroutine mld_z_symdec_aggregator_build_tprol end subroutine mld_z_symdec_aggregator_build_tprol
end interface end interface

Loading…
Cancel
Save