|
|
|
@ -68,7 +68,7 @@ subroutine amg_d_parmatch_aggregator_build_tprol(ag,parms,ag_data,&
|
|
|
|
|
real(psb_dpk_), allocatable :: tmpw(:), tmpwnxt(:)
|
|
|
|
|
integer(psb_lpk_), allocatable :: ixaggr(:), nxaggr(:), tlaggr(:), ivr(:)
|
|
|
|
|
type(psb_dspmat_type) :: a_tmp
|
|
|
|
|
integer(c_int) :: match_algorithm, n_sweeps, max_csize, max_nlevels
|
|
|
|
|
integer(c_int) :: match_algorithm, n_sweeps, target_csize, max_nlevels
|
|
|
|
|
character(len=40) :: name, ch_err
|
|
|
|
|
character(len=80) :: fname, prefix_
|
|
|
|
|
type(psb_ctxt_type) :: ictxt
|
|
|
|
@ -128,10 +128,10 @@ subroutine amg_d_parmatch_aggregator_build_tprol(ag,parms,ag_data,&
|
|
|
|
|
write(debug_unit, *) 'Warning: AGGR_SIZE reset to value ',2**n_sweeps
|
|
|
|
|
end if
|
|
|
|
|
end if
|
|
|
|
|
if (ag%max_csize > 0) then
|
|
|
|
|
max_csize = ag%max_csize
|
|
|
|
|
if (ag_data%target_coarse_size > 0) then
|
|
|
|
|
target_csize = ag_data%target_coarse_size
|
|
|
|
|
else
|
|
|
|
|
max_csize = ag_data%min_coarse_size
|
|
|
|
|
target_csize = ag_data%min_coarse_size
|
|
|
|
|
end if
|
|
|
|
|
if (ag%max_nlevels > 0) then
|
|
|
|
|
max_nlevels = ag%max_nlevels
|
|
|
|
@ -141,14 +141,14 @@ subroutine amg_d_parmatch_aggregator_build_tprol(ag,parms,ag_data,&
|
|
|
|
|
if (.true.) then
|
|
|
|
|
block
|
|
|
|
|
integer(psb_ipk_) :: ipv(2)
|
|
|
|
|
ipv(1) = max_csize
|
|
|
|
|
ipv(1) = target_csize
|
|
|
|
|
ipv(2) = n_sweeps
|
|
|
|
|
call psb_bcast(ictxt,ipv)
|
|
|
|
|
max_csize = ipv(1)
|
|
|
|
|
target_csize = ipv(1)
|
|
|
|
|
n_sweeps = ipv(2)
|
|
|
|
|
end block
|
|
|
|
|
else
|
|
|
|
|
call psb_bcast(ictxt,max_csize)
|
|
|
|
|
call psb_bcast(ictxt,target_csize)
|
|
|
|
|
call psb_bcast(ictxt,n_sweeps)
|
|
|
|
|
end if
|
|
|
|
|
if (n_sweeps /= ag%n_sweeps) then
|
|
|
|
@ -156,7 +156,7 @@ subroutine amg_d_parmatch_aggregator_build_tprol(ag,parms,ag_data,&
|
|
|
|
|
end if
|
|
|
|
|
!!$ if (me==0) write(0,*) 'Matching sweeps: ',n_sweeps
|
|
|
|
|
n_sweeps = max(1,n_sweeps)
|
|
|
|
|
if (debug) write(0,*) me,' Copies, with n_sweeps: ',n_sweeps,max_csize
|
|
|
|
|
if (debug) write(0,*) me,' Copies, with n_sweeps: ',n_sweeps,target_csize
|
|
|
|
|
if (ag%unsmoothed_hierarchy.and.allocated(ag%base_a)) then
|
|
|
|
|
call ag%base_a%cp_to(acsr)
|
|
|
|
|
if (ag%do_clean_zeros) call acsr%clean_zeros(info)
|
|
|
|
@ -242,7 +242,7 @@ subroutine amg_d_parmatch_aggregator_build_tprol(ag,parms,ag_data,&
|
|
|
|
|
|
|
|
|
|
if (debug) then
|
|
|
|
|
call psb_barrier(ictxt)
|
|
|
|
|
if (me == 0) write(0,*) 'N_sweeps ',n_sweeps,nr,desc_acv(0)%is_ok(),max_csize
|
|
|
|
|
if (me == 0) write(0,*) 'N_sweeps ',n_sweeps,nr,desc_acv(0)%is_ok(),target_csize
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
|
|
!
|
|
|
|
@ -300,11 +300,11 @@ subroutine amg_d_parmatch_aggregator_build_tprol(ag,parms,ag_data,&
|
|
|
|
|
|
|
|
|
|
if (debug) then
|
|
|
|
|
call psb_barrier(ictxt)
|
|
|
|
|
if (me==0) write(0,*) me,trim(name),' Done mat_asb:',i,sum(nxaggr),max_csize,info
|
|
|
|
|
if (me==0) write(0,*) me,trim(name),' Done mat_asb:',i,sum(nxaggr),target_csize,info
|
|
|
|
|
csz = sum(nxaggr)
|
|
|
|
|
call psb_bcast(ictxt,csz)
|
|
|
|
|
if (csz /= sum(nxaggr)) write(0,*) me,trim(name),' Mismatch matasb',&
|
|
|
|
|
& csz,sum(nxaggr),max_csize
|
|
|
|
|
& csz,sum(nxaggr),target_csize
|
|
|
|
|
end if
|
|
|
|
|
if (psb_errstatus_fatal()) write(0,*)me,trim(name),'Error fatal on entry to tmpwnxt 2'
|
|
|
|
|
|
|
|
|
@ -342,10 +342,10 @@ subroutine amg_d_parmatch_aggregator_build_tprol(ag,parms,ag_data,&
|
|
|
|
|
call move_alloc(tmpwnxt,tmpw)
|
|
|
|
|
if (debug) then
|
|
|
|
|
if (csz /= sum(nlaggr)) write(0,*) me,trim(name),' Mismatch 2 matasb',&
|
|
|
|
|
& csz,sum(nlaggr),max_csize, info
|
|
|
|
|
& csz,sum(nlaggr),target_csize, info
|
|
|
|
|
end if
|
|
|
|
|
call acv(i-1)%free()
|
|
|
|
|
if ((sum(nlaggr) <= max_csize).or.(any(nlaggr==0))) then
|
|
|
|
|
if ((sum(nlaggr) <= target_csize).or.(any(nlaggr==0))) then
|
|
|
|
|
x_sweeps = i
|
|
|
|
|
exit sweeps_loop
|
|
|
|
|
end if
|
|
|
|
|