Merge branch 'unify_aggr_bld' into development

pizdaint-runs
Salvatore Filippone 5 years ago
commit c9cfb1bb06

@ -15,15 +15,15 @@ libd:
(if test ! -d include ; then mkdir include; fi; $(INSTALL_DATA) Make.inc include/Make.inc.psblas)
(if test ! -d modules ; then mkdir modules; fi;)
based:
cd base && $(MAKE) lib
$(MAKE) -C base lib
precd:
cd prec && $(MAKE) lib
$(MAKE) -C prec lib
kryld:
cd krylov && $(MAKE) lib
$(MAKE) -C krylov lib
utild:
cd util&& $(MAKE) lib
$(MAKE) -C util lib
cbindd:
cd cbind&& $(MAKE) lib
$(MAKE) -C cbind lib
install: all
mkdir -p $(INSTALL_INCLUDEDIR) &&\
@ -42,11 +42,11 @@ install: all
/bin/cp -fr test/pargen test/fileread test/kernel $(INSTALL_SAMPLESDIR) && \
mkdir -p $(INSTALL_SAMPLESDIR)/cbind && /bin/cp -fr cbind/test/pargen/* $(INSTALL_SAMPLESDIR)/cbind
clean:
cd base && $(MAKE) clean
cd prec && $(MAKE) clean
cd krylov && $(MAKE) clean
cd util && $(MAKE) clean
cd cbind && $(MAKE) clean
$(MAKE) -C base clean
$(MAKE) -C prec clean
$(MAKE) -C krylov clean
$(MAKE) -C util clean
$(MAKE) -C cbind clean
check: all
make check -C test/serial

@ -13,25 +13,25 @@ lib: mods sr cm in pb tl
sr cm in pb tl: mods
mods:
cd modules && $(MAKE) lib LIBNAME=$(BASELIBNAME) F90="$(MPF90)" F90COPT="$(F90COPT) $(MPI_OPT)"
$(MAKE) -C modules lib LIBNAME=$(BASELIBNAME) F90="$(MPF90)" F90COPT="$(F90COPT) $(MPI_OPT)"
sr:
cd serial && $(MAKE) lib LIBNAME=$(BASELIBNAME)
$(MAKE) -C serial lib LIBNAME=$(BASELIBNAME)
cm:
cd comm && $(MAKE) lib LIBNAME=$(BASELIBNAME)
$(MAKE) -C comm lib LIBNAME=$(BASELIBNAME)
in:
cd internals && $(MAKE) lib LIBNAME=$(BASELIBNAME)
$(MAKE) -C internals lib LIBNAME=$(BASELIBNAME)
pb:
cd psblas && $(MAKE) lib LIBNAME=$(BASELIBNAME)
$(MAKE) -C psblas lib LIBNAME=$(BASELIBNAME)
tl:
cd tools && $(MAKE) lib LIBNAME=$(BASELIBNAME)
$(MAKE) -C tools lib LIBNAME=$(BASELIBNAME)
clean:
(cd modules; $(MAKE) clean)
(cd comm; $(MAKE) clean)
(cd internals; $(MAKE) clean)
(cd tools; $(MAKE) clean)
(cd serial; $(MAKE) clean)
(cd psblas; $(MAKE) clean)
($(MAKE) -C modules clean)
($(MAKE) -C comm clean)
($(MAKE) -C internals clean)
($(MAKE) -C tools clean)
($(MAKE) -C serial clean)
($(MAKE) -C psblas clean)
veryclean: clean
/bin/rm -f $(HERE)/$(LIBNAME) $(LIBMOD) *$(.mod)

@ -32,7 +32,7 @@ lib: interns mpfobjs $(OBJS)
$(RANLIB) $(LIBDIR)/$(LIBNAME)
interns:
cd internals && $(MAKE) lib
$(MAKE) -C internals lib
mpfobjs:
$(MAKE) $(MPFOBJS) FC="$(MPFC)"

@ -162,7 +162,7 @@ subroutine psi_graph_fnd_owner(idx,iprc,idxmap,info)
!
call psb_safe_ab_cpy(idxmap%p_adjcncy,ladj,info)
nadj = psb_size(ladj)
! This makes ladj allocated with size 0 just in case
! This makes ladj allocated with size 0 if needed, as opposed to unallocated
call psb_realloc(nadj,ladj,info)
!
! Throughout the subroutine, nreqst is the number of local inquiries

@ -74,7 +74,8 @@ subroutine psi_indx_map_fnd_owner(idx,iprc,idxmap,info)
integer(psb_ipk_), allocatable :: hhidx(:)
integer(psb_mpk_) :: icomm, minfo, iictxt
integer(psb_ipk_) :: i, err_act, hsize, nv
integer(psb_ipk_) :: i, err_act, hsize
integer(psb_lpk_) :: nv
integer(psb_lpk_) :: mglob
integer(psb_ipk_) :: ictxt,np,me, nresp
logical, parameter :: gettime=.false.
@ -140,7 +141,66 @@ subroutine psi_indx_map_fnd_owner(idx,iprc,idxmap,info)
else
if (allocated(idxmap%halo_owner)) then
!
! Maybe we are coming here after a REINIT event.
! In this case, reuse the existing information as much as possible.
!
block
integer(psb_ipk_), allocatable :: tprc(:), lidx(:)
integer(psb_lpk_), allocatable :: tidx(:)
integer(psb_lpk_) :: k1, k2, nh
allocate(lidx(nv),stat=info)
if (info /= psb_success_) then
call psb_errpush(psb_err_from_subroutine_,name,a_err='Allocate')
goto 9999
end if
!
! Get local answers, if any
!
call idxmap%g2l(idx,lidx,info,owned=.false.)
call idxmap%qry_halo_owner(lidx,iprc,info)
nh = count(iprc<0)
!write(0,*) me,'Going through new impl from ',nv,' to ',nh
allocate(tidx(nh),tprc(nh),stat=info)
if (info /= psb_success_) then
call psb_errpush(psb_err_from_subroutine_,name,a_err='Allocate')
goto 9999
end if
!
! Prepare remote queries
!
k2 = 0
do k1 = 1, nv
if (iprc(k1) < 0) then
k2 = k2 + 1
if (k2 > nh) then
info = psb_err_internal_error_
call psb_errpush(info,name,a_err='Wrong auxiliary count')
goto 9999
end if
tidx(k2) = idx(k1)
end if
end do
call psi_graph_fnd_owner(tidx,tprc,idxmap,info)
k2 = 0
do k1 = 1, nv
if (iprc(k1) < 0) then
k2 = k2 + 1
if (k2 > nh) then
info = psb_err_internal_error_
call psb_errpush(info,name,a_err='Wrong auxiliary count')
goto 9999
end if
iprc(k1) = tprc(k2)
end if
end do
end block
else
call psi_graph_fnd_owner(idx,iprc,idxmap,info)
end if
end if

@ -94,8 +94,8 @@ module psb_hash_map_mod
procedure, pass(idxmap) :: lg2lv1_ins => hash_g2lv1_ins
procedure, pass(idxmap) :: lg2lv2_ins => hash_g2lv2_ins
procedure, pass(idxmap) :: hash_cpy
generic, public :: assignment(=) => hash_cpy
!!$ procedure, pass(idxmap) :: hash_cpy
!!$ generic, public :: assignment(=) => hash_cpy
procedure, pass(idxmap) :: bld_g2l_map => hash_bld_g2l_map
end type psb_hash_map
@ -1478,7 +1478,7 @@ contains
& call psb_safe_ab_cpy(idxmap%glb_lc,outmap%glb_lc,info)
if (info == psb_success_)&
& call psb_hash_copy(idxmap%hash,outmap%hash,info)
!!$ outmap = idxmap
class default
! This should be impossible
info = -1
@ -1499,28 +1499,30 @@ contains
end subroutine hash_clone
subroutine hash_cpy(outmap,idxmap)
use psb_penv_mod
use psb_error_mod
use psb_realloc_mod
implicit none
class(psb_hash_map), intent(in) :: idxmap
type(psb_hash_map), intent(out) :: outmap
integer(psb_ipk_) :: info
info = psb_success_
outmap%psb_indx_map = idxmap%psb_indx_map
outmap%hashvsize = idxmap%hashvsize
outmap%hashvmask = idxmap%hashvmask
if (info == psb_success_)&
& call psb_safe_ab_cpy(idxmap%loc_to_glob,outmap%loc_to_glob,info)
if (info == psb_success_)&
& call psb_safe_ab_cpy(idxmap%hashv,outmap%hashv,info)
if (info == psb_success_)&
& call psb_safe_ab_cpy(idxmap%glb_lc,outmap%glb_lc,info)
if (info == psb_success_)&
& call psb_hash_copy(idxmap%hash,outmap%hash,info)
end subroutine hash_cpy
!!$ subroutine hash_cpy(outmap,idxmap)
!!$ use psb_penv_mod
!!$ use psb_error_mod
!!$ use psb_realloc_mod
!!$ implicit none
!!$ class(psb_hash_map), intent(in) :: idxmap
!!$ type(psb_hash_map), intent(out) :: outmap
!!$ integer(psb_ipk_) :: info
!!$
!!$ info = psb_success_
!!$ call idxmap%psb_indx_map%cpy(outmap%psb_indx_map,info)
!!$ if (info == psb_success_) then
!!$ outmap%hashvsize = idxmap%hashvsize
!!$ outmap%hashvmask = idxmap%hashvmask
!!$ end if
!!$ if (info == psb_success_)&
!!$ & call psb_safe_ab_cpy(idxmap%loc_to_glob,outmap%loc_to_glob,info)
!!$ if (info == psb_success_)&
!!$ & call psb_safe_ab_cpy(idxmap%hashv,outmap%hashv,info)
!!$ if (info == psb_success_)&
!!$ & call psb_safe_ab_cpy(idxmap%glb_lc,outmap%glb_lc,info)
!!$ if (info == psb_success_)&
!!$ & call psb_hash_copy(idxmap%hash,outmap%hash,info)
!!$ end subroutine hash_cpy
subroutine hash_reinit(idxmap,info)
use psb_penv_mod
@ -1533,7 +1535,7 @@ contains
integer(psb_lpk_) :: lk
integer(psb_lpk_) :: ntot
integer(psb_ipk_) :: ictxt, me, np
integer(psb_ipk_), allocatable :: lidx(:)
integer(psb_ipk_), allocatable :: lidx(:), tadj(:), th_own(:)
integer(psb_lpk_), allocatable :: gidx(:)
character(len=20) :: name='hash_reinit'
logical, parameter :: debug=.false.
@ -1549,13 +1551,16 @@ contains
lidx = (/(k,k=1,nc)/)
gidx = (/(lk,lk=1,nc)/)
call idxmap%l2gip(gidx,info)
tadj = idxmap%get_p_adjcncy()
call idxmap%get_halo_owner(th_own,info)
call idxmap%free()
call hash_init_vlu(idxmap,ictxt,ntot,nr,gidx(1:nr),info)
if (nc>nr) then
call idxmap%g2lip_ins(gidx(nr+1:nc),info,lidx=lidx(nr+1:nc))
end if
call idxmap%set_p_adjcncy(tadj)
call idxmap%set_halo_owner(th_own,info)
if (info /= psb_success_) then
info = psb_err_from_subroutine_

@ -219,9 +219,9 @@ module psb_indx_map_mod
procedure, pass(idxmap) :: set_halo_owner => base_set_halo_owner
procedure, pass(idxmap) :: get_halo_owner => base_get_halo_owner
procedure, pass(idxmap) :: fnd_halo_owner_s => base_fnd_halo_owner_s
procedure, pass(idxmap) :: fnd_halo_owner_v => base_fnd_halo_owner_v
generic, public :: fnd_halo_owner => fnd_halo_owner_s, fnd_halo_owner_v
procedure, pass(idxmap) :: qry_halo_owner_s => base_qry_halo_owner_s
procedure, pass(idxmap) :: qry_halo_owner_v => base_qry_halo_owner_v
generic, public :: qry_halo_owner => qry_halo_owner_s, qry_halo_owner_v
procedure, pass(idxmap) :: fnd_owner => psi_indx_map_fnd_owner
procedure, pass(idxmap) :: init_vl => base_init_vl
@ -245,7 +245,7 @@ module psb_indx_map_mod
& base_lg2lv2_ins, base_init_vl, base_is_null,&
& base_row_extendable, base_clone, base_cpy, base_reinit, &
& base_set_halo_owner, base_get_halo_owner, &
& base_fnd_halo_owner_s, base_fnd_halo_owner_v,&
& base_qry_halo_owner_s, base_qry_halo_owner_v,&
& base_get_p_adjcncy, base_set_p_adjcncy, base_xtnd_p_adjcncy
!> Function: psi_indx_map_fnd_owner
@ -1486,6 +1486,7 @@ contains
end subroutine base_set_halo_owner
subroutine base_get_halo_owner(idxmap,v,info)
use psb_realloc_mod
use psb_penv_mod
use psb_error_mod
implicit none
@ -1494,13 +1495,15 @@ contains
integer(psb_ipk_), intent(out) :: info
integer(psb_ipk_) :: nh
nh = min(size(v),size(idxmap%halo_owner))
v(1:nh) = idxmap%halo_owner(1:nh)
nh = size(idxmap%halo_owner)
!v = idxmap%halo_owner(1:nh)
call psb_safe_ab_cpy(idxmap%halo_owner,v,info)
end subroutine base_get_halo_owner
subroutine base_fnd_halo_owner_s(idxmap,xin,xout,info)
subroutine base_qry_halo_owner_s(idxmap,xin,xout,info)
use psb_penv_mod
use psb_error_mod
use psb_realloc_mod
implicit none
class(psb_indx_map), intent(inout) :: idxmap
integer(psb_ipk_), intent(in) :: xin
@ -1510,24 +1513,26 @@ contains
integer(psb_ipk_) :: i, j, nr, nc, nh
nr = idxmap%local_rows
nc = idxmap%local_cols
nc = min(idxmap%local_cols, (nr+psb_size(idxmap%halo_owner)))
xout = -1
if (.not.allocated(idxmap%halo_owner)) then
!write(0,*) 'Halo_owner not allocated!', nr, nc, xin
return
end if
if ((nr<xin).and.(xin <= nc)) then
if (size(idxmap%halo_owner)<(xin-nr)) then
!write(0,*) 'Halo_owner bad size',xin,nr,xin-nr,size(idxmap%halo_owner)
return
end if
!!$ if (size(idxmap%halo_owner)<(xin-nr)) then
!!$ !write(0,*) 'Halo_owner bad size',xin,nr,xin-nr,size(idxmap%halo_owner)
!!$ return
!!$ end if
xout = idxmap%halo_owner(xin-nr)
end if
end subroutine base_fnd_halo_owner_s
end subroutine base_qry_halo_owner_s
subroutine base_fnd_halo_owner_v(idxmap,xin,xout,info)
subroutine base_qry_halo_owner_v(idxmap,xin,xout,info)
use psb_penv_mod
use psb_error_mod
use psb_realloc_mod
implicit none
class(psb_indx_map), intent(inout) :: idxmap
integer(psb_ipk_), intent(in) :: xin(:)
@ -1536,13 +1541,15 @@ contains
integer(psb_ipk_) :: i, j, nr, nc, nh, sz
nr = idxmap%local_rows
nc = idxmap%local_cols
nc = min(idxmap%local_cols, (nr+psb_size(idxmap%halo_owner)))
sz = min(size(xin),size(xout))
xout = -1
do i = 1, sz
if ((nr<xin(i)).and.(xin(i) <= nc)) xout = idxmap%halo_owner(xin(i)-nr)
xout(i) = -1
if ((nr<xin(i)).and.(xin(i) <= nc)) xout(i) = idxmap%halo_owner(xin(i)-nr)
end do
end subroutine base_fnd_halo_owner_v
do i=sz+1,size(xout)
xout(i) = -1
end do
end subroutine base_qry_halo_owner_v
end module psb_indx_map_mod

@ -29,12 +29,12 @@ lib: impld sortd lib1 $(FOBJS)
lib1: $(FOBJS)
impld:
cd impl && $(MAKE) lib
$(MAKE) -C impl lib
sortd:
cd sort && $(MAKE) lib
$(MAKE) -C sort lib
clean:
/bin/rm -f $(FOBJS) *$(.mod)
(cd impl; $(MAKE) clean)
(cd sort; $(MAKE) clean)
($(MAKE) -C impl clean)
($(MAKE) -C sort clean)
veryclean: clean

@ -2508,6 +2508,8 @@ subroutine psb_c_mv_from_lb(a,b)
class(psb_cspmat_type), intent(inout) :: a
class(psb_lc_base_sparse_mat), intent(inout) :: b
integer(psb_ipk_) :: info
info = psb_success_
if (.not.allocated(a%a)) allocate(psb_c_csr_sparse_mat :: a%a, stat=info)
if (info == psb_success_) call a%a%mv_from_lfmt(b,info)
@ -2524,6 +2526,7 @@ subroutine psb_c_cp_from_lb(a,b)
class(psb_lc_base_sparse_mat), intent(inout) :: b
integer(psb_ipk_) :: info
info = psb_success_
if (.not.allocated(a%a)) allocate(psb_c_csr_sparse_mat :: a%a, stat=info)
if (info == psb_success_) call a%a%cp_from_lfmt(b,info)
@ -2574,6 +2577,7 @@ subroutine psb_c_mv_from_l(a,b)
class(psb_lcspmat_type), intent(inout) :: b
integer(psb_ipk_) :: info
info = psb_success_
if (allocated(b%a)) then
if (.not.allocated(a%a)) allocate(psb_c_csr_sparse_mat :: a%a, stat=info)
call a%a%mv_from_lfmt(b%a,info)
@ -2595,6 +2599,7 @@ subroutine psb_c_cp_from_l(a,b)
class(psb_lcspmat_type), intent(in) :: b
integer(psb_ipk_) :: info
info = psb_success_
if (allocated(b%a)) then
if (.not.allocated(a%a)) allocate(psb_c_csr_sparse_mat :: a%a, stat=info)
call a%a%cp_from_lfmt(b%a,info)
@ -4913,6 +4918,8 @@ subroutine psb_lc_mv_from_ib(a,b)
class(psb_lcspmat_type), intent(inout) :: a
class(psb_c_base_sparse_mat), intent(inout) :: b
integer(psb_ipk_) :: info
info = psb_success_
if (.not.allocated(a%a)) allocate(psb_lc_csr_sparse_mat :: a%a, stat=info)
if (info == psb_success_) call a%a%mv_from_ifmt(b,info)
@ -4928,6 +4935,7 @@ subroutine psb_lc_cp_from_ib(a,b)
class(psb_c_base_sparse_mat), intent(inout) :: b
integer(psb_ipk_) :: info
info = psb_success_
if (.not.allocated(a%a)) allocate(psb_lc_csr_sparse_mat :: a%a, stat=info)
if (info == psb_success_) call a%a%cp_from_ifmt(b,info)

@ -2508,6 +2508,8 @@ subroutine psb_d_mv_from_lb(a,b)
class(psb_dspmat_type), intent(inout) :: a
class(psb_ld_base_sparse_mat), intent(inout) :: b
integer(psb_ipk_) :: info
info = psb_success_
if (.not.allocated(a%a)) allocate(psb_d_csr_sparse_mat :: a%a, stat=info)
if (info == psb_success_) call a%a%mv_from_lfmt(b,info)
@ -2524,6 +2526,7 @@ subroutine psb_d_cp_from_lb(a,b)
class(psb_ld_base_sparse_mat), intent(inout) :: b
integer(psb_ipk_) :: info
info = psb_success_
if (.not.allocated(a%a)) allocate(psb_d_csr_sparse_mat :: a%a, stat=info)
if (info == psb_success_) call a%a%cp_from_lfmt(b,info)
@ -2574,6 +2577,7 @@ subroutine psb_d_mv_from_l(a,b)
class(psb_ldspmat_type), intent(inout) :: b
integer(psb_ipk_) :: info
info = psb_success_
if (allocated(b%a)) then
if (.not.allocated(a%a)) allocate(psb_d_csr_sparse_mat :: a%a, stat=info)
call a%a%mv_from_lfmt(b%a,info)
@ -2595,6 +2599,7 @@ subroutine psb_d_cp_from_l(a,b)
class(psb_ldspmat_type), intent(in) :: b
integer(psb_ipk_) :: info
info = psb_success_
if (allocated(b%a)) then
if (.not.allocated(a%a)) allocate(psb_d_csr_sparse_mat :: a%a, stat=info)
call a%a%cp_from_lfmt(b%a,info)
@ -4913,6 +4918,8 @@ subroutine psb_ld_mv_from_ib(a,b)
class(psb_ldspmat_type), intent(inout) :: a
class(psb_d_base_sparse_mat), intent(inout) :: b
integer(psb_ipk_) :: info
info = psb_success_
if (.not.allocated(a%a)) allocate(psb_ld_csr_sparse_mat :: a%a, stat=info)
if (info == psb_success_) call a%a%mv_from_ifmt(b,info)
@ -4928,6 +4935,7 @@ subroutine psb_ld_cp_from_ib(a,b)
class(psb_d_base_sparse_mat), intent(inout) :: b
integer(psb_ipk_) :: info
info = psb_success_
if (.not.allocated(a%a)) allocate(psb_ld_csr_sparse_mat :: a%a, stat=info)
if (info == psb_success_) call a%a%cp_from_ifmt(b,info)

@ -2508,6 +2508,8 @@ subroutine psb_s_mv_from_lb(a,b)
class(psb_sspmat_type), intent(inout) :: a
class(psb_ls_base_sparse_mat), intent(inout) :: b
integer(psb_ipk_) :: info
info = psb_success_
if (.not.allocated(a%a)) allocate(psb_s_csr_sparse_mat :: a%a, stat=info)
if (info == psb_success_) call a%a%mv_from_lfmt(b,info)
@ -2524,6 +2526,7 @@ subroutine psb_s_cp_from_lb(a,b)
class(psb_ls_base_sparse_mat), intent(inout) :: b
integer(psb_ipk_) :: info
info = psb_success_
if (.not.allocated(a%a)) allocate(psb_s_csr_sparse_mat :: a%a, stat=info)
if (info == psb_success_) call a%a%cp_from_lfmt(b,info)
@ -2574,6 +2577,7 @@ subroutine psb_s_mv_from_l(a,b)
class(psb_lsspmat_type), intent(inout) :: b
integer(psb_ipk_) :: info
info = psb_success_
if (allocated(b%a)) then
if (.not.allocated(a%a)) allocate(psb_s_csr_sparse_mat :: a%a, stat=info)
call a%a%mv_from_lfmt(b%a,info)
@ -2595,6 +2599,7 @@ subroutine psb_s_cp_from_l(a,b)
class(psb_lsspmat_type), intent(in) :: b
integer(psb_ipk_) :: info
info = psb_success_
if (allocated(b%a)) then
if (.not.allocated(a%a)) allocate(psb_s_csr_sparse_mat :: a%a, stat=info)
call a%a%cp_from_lfmt(b%a,info)
@ -4913,6 +4918,8 @@ subroutine psb_ls_mv_from_ib(a,b)
class(psb_lsspmat_type), intent(inout) :: a
class(psb_s_base_sparse_mat), intent(inout) :: b
integer(psb_ipk_) :: info
info = psb_success_
if (.not.allocated(a%a)) allocate(psb_ls_csr_sparse_mat :: a%a, stat=info)
if (info == psb_success_) call a%a%mv_from_ifmt(b,info)
@ -4928,6 +4935,7 @@ subroutine psb_ls_cp_from_ib(a,b)
class(psb_s_base_sparse_mat), intent(inout) :: b
integer(psb_ipk_) :: info
info = psb_success_
if (.not.allocated(a%a)) allocate(psb_ls_csr_sparse_mat :: a%a, stat=info)
if (info == psb_success_) call a%a%cp_from_ifmt(b,info)

@ -2508,6 +2508,8 @@ subroutine psb_z_mv_from_lb(a,b)
class(psb_zspmat_type), intent(inout) :: a
class(psb_lz_base_sparse_mat), intent(inout) :: b
integer(psb_ipk_) :: info
info = psb_success_
if (.not.allocated(a%a)) allocate(psb_z_csr_sparse_mat :: a%a, stat=info)
if (info == psb_success_) call a%a%mv_from_lfmt(b,info)
@ -2524,6 +2526,7 @@ subroutine psb_z_cp_from_lb(a,b)
class(psb_lz_base_sparse_mat), intent(inout) :: b
integer(psb_ipk_) :: info
info = psb_success_
if (.not.allocated(a%a)) allocate(psb_z_csr_sparse_mat :: a%a, stat=info)
if (info == psb_success_) call a%a%cp_from_lfmt(b,info)
@ -2574,6 +2577,7 @@ subroutine psb_z_mv_from_l(a,b)
class(psb_lzspmat_type), intent(inout) :: b
integer(psb_ipk_) :: info
info = psb_success_
if (allocated(b%a)) then
if (.not.allocated(a%a)) allocate(psb_z_csr_sparse_mat :: a%a, stat=info)
call a%a%mv_from_lfmt(b%a,info)
@ -2595,6 +2599,7 @@ subroutine psb_z_cp_from_l(a,b)
class(psb_lzspmat_type), intent(in) :: b
integer(psb_ipk_) :: info
info = psb_success_
if (allocated(b%a)) then
if (.not.allocated(a%a)) allocate(psb_z_csr_sparse_mat :: a%a, stat=info)
call a%a%cp_from_lfmt(b%a,info)
@ -4913,6 +4918,8 @@ subroutine psb_lz_mv_from_ib(a,b)
class(psb_lzspmat_type), intent(inout) :: a
class(psb_z_base_sparse_mat), intent(inout) :: b
integer(psb_ipk_) :: info
info = psb_success_
if (.not.allocated(a%a)) allocate(psb_lz_csr_sparse_mat :: a%a, stat=info)
if (info == psb_success_) call a%a%mv_from_ifmt(b,info)
@ -4928,6 +4935,7 @@ subroutine psb_lz_cp_from_ib(a,b)
class(psb_z_base_sparse_mat), intent(inout) :: b
integer(psb_ipk_) :: info
info = psb_success_
if (.not.allocated(a%a)) allocate(psb_lz_csr_sparse_mat :: a%a, stat=info)
if (info == psb_success_) call a%a%cp_from_ifmt(b,info)

@ -123,6 +123,7 @@ subroutine psb_cbase_rwextd(nr,a,info,b,rowscale)
ma = a%get_nrows()
na = a%get_ncols()
nza = a%get_nzeros()
select type(a)
@ -137,16 +138,12 @@ subroutine psb_cbase_rwextd(nr,a,info,b,rowscale)
select type (b)
type is (psb_c_csr_sparse_mat)
call psb_ensure_size(size(a%ja)+nzb,a%ja,info)
call psb_ensure_size(size(a%val)+nzb,a%val,info)
call psb_ensure_size(nza+nzb,a%ja,info)
call psb_ensure_size(nza+nzb,a%val,info)
a%ja(nza+1:nza+nzb) = b%ja(1:nzb)
a%val(nza+1:nza+nzb) = b%val(1:nzb)
do i=1, min(nr-ma,mb)
a%irp(ma+i+1) = a%irp(ma+i) + b%irp(i+1) - b%irp(i)
ja = a%irp(ma+i)
do jb = b%irp(i), b%irp(i+1)-1
a%val(ja) = b%val(jb)
a%ja(ja) = b%ja(jb)
ja = ja + 1
end do
end do
do j=i,nr-ma
a%irp(ma+j+1) = a%irp(ma+j)
@ -175,7 +172,7 @@ subroutine psb_cbase_rwextd(nr,a,info,b,rowscale)
mb = b%get_nrows()
nb = b%get_ncols()
nzb = b%get_nzeros()
call a%reallocate(nza+nzb)
call a%ensure_size(nza+nzb)
select type(b)
type is (psb_c_coo_sparse_mat)
@ -328,6 +325,7 @@ subroutine psb_lcbase_rwextd(nr,a,info,b,rowscale)
ma = a%get_nrows()
na = a%get_ncols()
nza = a%get_nzeros()
select type(a)
@ -342,16 +340,12 @@ subroutine psb_lcbase_rwextd(nr,a,info,b,rowscale)
select type (b)
type is (psb_lc_csr_sparse_mat)
call psb_ensure_size(size(a%ja)+nzb,a%ja,info)
call psb_ensure_size(size(a%val)+nzb,a%val,info)
call psb_ensure_size(nza+nzb,a%ja,info)
call psb_ensure_size(nza+nzb,a%val,info)
a%ja(nza+1:nza+nzb) = b%ja(1:nzb)
a%val(nza+1:nza+nzb) = b%val(1:nzb)
do i=1, min(nr-ma,mb)
a%irp(ma+i+1) = a%irp(ma+i) + b%irp(i+1) - b%irp(i)
ja = a%irp(ma+i)
do jb = b%irp(i), b%irp(i+1)-1
a%val(ja) = b%val(jb)
a%ja(ja) = b%ja(jb)
ja = ja + 1
end do
end do
do j=i,nr-ma
a%irp(ma+j+1) = a%irp(ma+j)
@ -380,7 +374,7 @@ subroutine psb_lcbase_rwextd(nr,a,info,b,rowscale)
mb = b%get_nrows()
nb = b%get_ncols()
nzb = b%get_nzeros()
call a%reallocate(nza+nzb)
call a%ensure_size(nza+nzb)
select type(b)
type is (psb_lc_coo_sparse_mat)

@ -123,6 +123,7 @@ subroutine psb_dbase_rwextd(nr,a,info,b,rowscale)
ma = a%get_nrows()
na = a%get_ncols()
nza = a%get_nzeros()
select type(a)
@ -137,16 +138,12 @@ subroutine psb_dbase_rwextd(nr,a,info,b,rowscale)
select type (b)
type is (psb_d_csr_sparse_mat)
call psb_ensure_size(size(a%ja)+nzb,a%ja,info)
call psb_ensure_size(size(a%val)+nzb,a%val,info)
call psb_ensure_size(nza+nzb,a%ja,info)
call psb_ensure_size(nza+nzb,a%val,info)
a%ja(nza+1:nza+nzb) = b%ja(1:nzb)
a%val(nza+1:nza+nzb) = b%val(1:nzb)
do i=1, min(nr-ma,mb)
a%irp(ma+i+1) = a%irp(ma+i) + b%irp(i+1) - b%irp(i)
ja = a%irp(ma+i)
do jb = b%irp(i), b%irp(i+1)-1
a%val(ja) = b%val(jb)
a%ja(ja) = b%ja(jb)
ja = ja + 1
end do
end do
do j=i,nr-ma
a%irp(ma+j+1) = a%irp(ma+j)
@ -175,7 +172,7 @@ subroutine psb_dbase_rwextd(nr,a,info,b,rowscale)
mb = b%get_nrows()
nb = b%get_ncols()
nzb = b%get_nzeros()
call a%reallocate(nza+nzb)
call a%ensure_size(nza+nzb)
select type(b)
type is (psb_d_coo_sparse_mat)
@ -328,6 +325,7 @@ subroutine psb_ldbase_rwextd(nr,a,info,b,rowscale)
ma = a%get_nrows()
na = a%get_ncols()
nza = a%get_nzeros()
select type(a)
@ -342,16 +340,12 @@ subroutine psb_ldbase_rwextd(nr,a,info,b,rowscale)
select type (b)
type is (psb_ld_csr_sparse_mat)
call psb_ensure_size(size(a%ja)+nzb,a%ja,info)
call psb_ensure_size(size(a%val)+nzb,a%val,info)
call psb_ensure_size(nza+nzb,a%ja,info)
call psb_ensure_size(nza+nzb,a%val,info)
a%ja(nza+1:nza+nzb) = b%ja(1:nzb)
a%val(nza+1:nza+nzb) = b%val(1:nzb)
do i=1, min(nr-ma,mb)
a%irp(ma+i+1) = a%irp(ma+i) + b%irp(i+1) - b%irp(i)
ja = a%irp(ma+i)
do jb = b%irp(i), b%irp(i+1)-1
a%val(ja) = b%val(jb)
a%ja(ja) = b%ja(jb)
ja = ja + 1
end do
end do
do j=i,nr-ma
a%irp(ma+j+1) = a%irp(ma+j)
@ -380,7 +374,7 @@ subroutine psb_ldbase_rwextd(nr,a,info,b,rowscale)
mb = b%get_nrows()
nb = b%get_ncols()
nzb = b%get_nzeros()
call a%reallocate(nza+nzb)
call a%ensure_size(nza+nzb)
select type(b)
type is (psb_ld_coo_sparse_mat)

@ -123,6 +123,7 @@ subroutine psb_sbase_rwextd(nr,a,info,b,rowscale)
ma = a%get_nrows()
na = a%get_ncols()
nza = a%get_nzeros()
select type(a)
@ -137,16 +138,12 @@ subroutine psb_sbase_rwextd(nr,a,info,b,rowscale)
select type (b)
type is (psb_s_csr_sparse_mat)
call psb_ensure_size(size(a%ja)+nzb,a%ja,info)
call psb_ensure_size(size(a%val)+nzb,a%val,info)
call psb_ensure_size(nza+nzb,a%ja,info)
call psb_ensure_size(nza+nzb,a%val,info)
a%ja(nza+1:nza+nzb) = b%ja(1:nzb)
a%val(nza+1:nza+nzb) = b%val(1:nzb)
do i=1, min(nr-ma,mb)
a%irp(ma+i+1) = a%irp(ma+i) + b%irp(i+1) - b%irp(i)
ja = a%irp(ma+i)
do jb = b%irp(i), b%irp(i+1)-1
a%val(ja) = b%val(jb)
a%ja(ja) = b%ja(jb)
ja = ja + 1
end do
end do
do j=i,nr-ma
a%irp(ma+j+1) = a%irp(ma+j)
@ -175,7 +172,7 @@ subroutine psb_sbase_rwextd(nr,a,info,b,rowscale)
mb = b%get_nrows()
nb = b%get_ncols()
nzb = b%get_nzeros()
call a%reallocate(nza+nzb)
call a%ensure_size(nza+nzb)
select type(b)
type is (psb_s_coo_sparse_mat)
@ -328,6 +325,7 @@ subroutine psb_lsbase_rwextd(nr,a,info,b,rowscale)
ma = a%get_nrows()
na = a%get_ncols()
nza = a%get_nzeros()
select type(a)
@ -342,16 +340,12 @@ subroutine psb_lsbase_rwextd(nr,a,info,b,rowscale)
select type (b)
type is (psb_ls_csr_sparse_mat)
call psb_ensure_size(size(a%ja)+nzb,a%ja,info)
call psb_ensure_size(size(a%val)+nzb,a%val,info)
call psb_ensure_size(nza+nzb,a%ja,info)
call psb_ensure_size(nza+nzb,a%val,info)
a%ja(nza+1:nza+nzb) = b%ja(1:nzb)
a%val(nza+1:nza+nzb) = b%val(1:nzb)
do i=1, min(nr-ma,mb)
a%irp(ma+i+1) = a%irp(ma+i) + b%irp(i+1) - b%irp(i)
ja = a%irp(ma+i)
do jb = b%irp(i), b%irp(i+1)-1
a%val(ja) = b%val(jb)
a%ja(ja) = b%ja(jb)
ja = ja + 1
end do
end do
do j=i,nr-ma
a%irp(ma+j+1) = a%irp(ma+j)
@ -380,7 +374,7 @@ subroutine psb_lsbase_rwextd(nr,a,info,b,rowscale)
mb = b%get_nrows()
nb = b%get_ncols()
nzb = b%get_nzeros()
call a%reallocate(nza+nzb)
call a%ensure_size(nza+nzb)
select type(b)
type is (psb_ls_coo_sparse_mat)

@ -123,6 +123,7 @@ subroutine psb_zbase_rwextd(nr,a,info,b,rowscale)
ma = a%get_nrows()
na = a%get_ncols()
nza = a%get_nzeros()
select type(a)
@ -137,16 +138,12 @@ subroutine psb_zbase_rwextd(nr,a,info,b,rowscale)
select type (b)
type is (psb_z_csr_sparse_mat)
call psb_ensure_size(size(a%ja)+nzb,a%ja,info)
call psb_ensure_size(size(a%val)+nzb,a%val,info)
call psb_ensure_size(nza+nzb,a%ja,info)
call psb_ensure_size(nza+nzb,a%val,info)
a%ja(nza+1:nza+nzb) = b%ja(1:nzb)
a%val(nza+1:nza+nzb) = b%val(1:nzb)
do i=1, min(nr-ma,mb)
a%irp(ma+i+1) = a%irp(ma+i) + b%irp(i+1) - b%irp(i)
ja = a%irp(ma+i)
do jb = b%irp(i), b%irp(i+1)-1
a%val(ja) = b%val(jb)
a%ja(ja) = b%ja(jb)
ja = ja + 1
end do
end do
do j=i,nr-ma
a%irp(ma+j+1) = a%irp(ma+j)
@ -175,7 +172,7 @@ subroutine psb_zbase_rwextd(nr,a,info,b,rowscale)
mb = b%get_nrows()
nb = b%get_ncols()
nzb = b%get_nzeros()
call a%reallocate(nza+nzb)
call a%ensure_size(nza+nzb)
select type(b)
type is (psb_z_coo_sparse_mat)
@ -328,6 +325,7 @@ subroutine psb_lzbase_rwextd(nr,a,info,b,rowscale)
ma = a%get_nrows()
na = a%get_ncols()
nza = a%get_nzeros()
select type(a)
@ -342,16 +340,12 @@ subroutine psb_lzbase_rwextd(nr,a,info,b,rowscale)
select type (b)
type is (psb_lz_csr_sparse_mat)
call psb_ensure_size(size(a%ja)+nzb,a%ja,info)
call psb_ensure_size(size(a%val)+nzb,a%val,info)
call psb_ensure_size(nza+nzb,a%ja,info)
call psb_ensure_size(nza+nzb,a%val,info)
a%ja(nza+1:nza+nzb) = b%ja(1:nzb)
a%val(nza+1:nza+nzb) = b%val(1:nzb)
do i=1, min(nr-ma,mb)
a%irp(ma+i+1) = a%irp(ma+i) + b%irp(i+1) - b%irp(i)
ja = a%irp(ma+i)
do jb = b%irp(i), b%irp(i+1)-1
a%val(ja) = b%val(jb)
a%ja(ja) = b%ja(jb)
ja = ja + 1
end do
end do
do j=i,nr-ma
a%irp(ma+j+1) = a%irp(ma+j)
@ -380,7 +374,7 @@ subroutine psb_lzbase_rwextd(nr,a,info,b,rowscale)
mb = b%get_nrows()
nb = b%get_ncols()
nzb = b%get_nzeros()
call a%reallocate(nza+nzb)
call a%ensure_size(nza+nzb)
select type(b)
type is (psb_lz_coo_sparse_mat)

@ -113,7 +113,6 @@ subroutine psb_lc_coo_glob_transpose(ain,desc_r,info,atrans,desc_c,desc_rx)
integer(psb_ipk_) :: ictxt, np,me
integer(psb_ipk_) :: counter,proc, err_act, j
integer(psb_lpk_) :: i, k, idx, r, ipx,mat_recv, iszs, iszr,idxs,idxr,nz,&
& irmin,icmin,irmax,icmax,&
& l1, nsnds, nrcvs, nr,nc,nzl, hlstart, nzt, nzd
integer(psb_mpk_) :: icomm, minfo
integer(psb_mpk_), allocatable :: brvindx(:), &
@ -190,7 +189,7 @@ subroutine psb_lc_coo_glob_transpose(ain,desc_r,info,atrans,desc_c,desc_rx)
do k=1, nzl
j = acoo%ja(k)
if (j > hlstart) then
call p_desc_c%indxmap%fnd_halo_owner(j,proc,info)
call p_desc_c%indxmap%qry_halo_owner(j,proc,info)
sdsz(proc+1) = sdsz(proc+1) +1
end if
end do
@ -264,19 +263,19 @@ subroutine psb_lc_coo_glob_transpose(ain,desc_r,info,atrans,desc_c,desc_rx)
acoo%ja(nzd) = acoo%ja(k)
acoo%val(nzd) = acoo%val(k)
else
call p_desc_c%indxmap%fnd_halo_owner(j,proc,info)
call p_desc_c%indxmap%qry_halo_owner(j,proc,info)
tsdx(proc+1) = tsdx(proc+1) +1
iasnd(tsdx(proc+1)) = acoo%ia(k)
jasnd(tsdx(proc+1)) = acoo%ja(k)
valsnd(tsdx(proc+1)) = acoo%val(k)
end if
end do
call acoo%set_nzeros(nzd)
!
! Put halo entries in global numbering
!
call desc_r%indxmap%l2gip(jasnd(1:iszs),info)
call p_desc_c%indxmap%l2gip(iasnd(1:iszs),info)
call acoo%set_nzeros(nzd)
! And exchange data.
! Normally we'll use our SIMPLE A2AV and not MPI, because
! the communication pattern is sparse, so ours is more
@ -407,19 +406,293 @@ subroutine psb_c_coo_glob_transpose(ain,desc_r,info,atrans,desc_c,desc_rx)
type(psb_desc_type), intent(out), optional :: desc_rx
integer(psb_ipk_), intent(out) :: info
type(psb_lc_coo_sparse_mat) :: atcoo
integer(psb_ipk_) :: ictxt, np,me
integer(psb_ipk_) :: counter,proc, err_act, j
integer(psb_ipk_) :: i, k, idx, r, ipx,mat_recv, iszs, iszr,idxs,idxr,nz,&
& l1, nsnds, nrcvs, nr,nc,nzl, hlstart, nzd
integer(psb_lpk_) :: nzt, lszr
integer(psb_mpk_) :: icomm, minfo
integer(psb_mpk_), allocatable :: brvindx(:), &
& rvsz(:), bsdindx(:), sdsz(:), tsdx(:), trvx(:)
integer(psb_ipk_), allocatable :: halo_owner(:)
integer(psb_lpk_), allocatable :: iasnd(:), jasnd(:),iarcv(:),jarcv(:)
complex(psb_spk_), allocatable :: valsnd(:)
type(psb_c_coo_sparse_mat), allocatable :: acoo
logical :: rowcnv_,colcnv_,rowscale_,colscale_,outcol_glob_
type(psb_desc_type), pointer :: p_desc_c
character(len=5) :: outfmt_
integer(psb_ipk_) :: debug_level, debug_unit
character(len=20) :: name, ch_err
if(psb_get_errstatus() /= 0) return
info=psb_success_
name='mld_glob_transpose'
call psb_erractionsave(err_act)
if (psb_errstatus_fatal()) then
info = psb_err_internal_error_ ; goto 9999
end if
debug_unit = psb_get_debug_unit()
debug_level = psb_get_debug_level()
ictxt = desc_r%get_context()
icomm = desc_r%get_mpic()
Call psb_info(ictxt, me, np)
if (debug_level >= psb_debug_outer_) &
& write(debug_unit,*) me,' ',trim(name),': Start'
if (present(desc_c)) then
p_desc_c => desc_c
else
p_desc_c => desc_r
end if
Allocate(brvindx(np+1),&
& rvsz(np),sdsz(np),bsdindx(np+1), acoo,stat=info)
if (info /= psb_success_) then
info=psb_err_alloc_dealloc_
call psb_errpush(info,name)
goto 9999
end if
sdsz(:)=0
rvsz(:)=0
l1 = 0
brvindx(1) = 0
bsdindx(1) = 0
counter=1
idx = 0
idxs = 0
idxr = 0
if (present(atrans)) then
call ain%cp_to_lcoo(atcoo,info)
call ain%cp_to_coo(acoo,info)
else
call ain%mv_to_lcoo(atcoo,info)
call ain%mv_to_coo(acoo,info)
end if
!
! Compute number of entries in the
! halo part, sorted by destination process
!
nr = desc_r%get_local_rows()
nc = p_desc_c%get_local_cols()
nzl = acoo%get_nzeros()
hlstart = p_desc_c%get_local_rows()
do k=1, nzl
j = acoo%ja(k)
if (j > hlstart) then
call p_desc_c%indxmap%qry_halo_owner(j,proc,info)
sdsz(proc+1) = sdsz(proc+1) +1
end if
end do
!
! Exchange sizes, so as to know sends/receives.
! This is different from the halo exchange because the
! number of entries was not precomputed in the descriptor,
! which was vector-oriented and not matrix-entry-oriented
!
call mpi_alltoall(sdsz,1,psb_mpi_mpk_,&
& rvsz,1,psb_mpi_mpk_,icomm,minfo)
if (info /= psb_success_) then
info=psb_err_from_subroutine_
call psb_errpush(info,name,a_err='mpi_alltoall')
goto 9999
end if
nsnds = count(sdsz /= 0)
nrcvs = count(rvsz /= 0)
if (debug_level >= psb_debug_outer_)&
& write(debug_unit,*) me,' ',trim(name),': Done initial alltoall',nsnds,nrcvs
idxs = 0
idxr = 0
counter = 1
Do proc = 0, np-1
bsdindx(proc+1) = idxs
idxs = idxs + sdsz(proc+1)
brvindx(proc+1) = idxr
idxr = idxr + rvsz(proc+1)
Enddo
tsdx = bsdindx
trvx = brvindx
iszr = sum(rvsz)
iszs = sum(sdsz)
if (debug_level >= psb_debug_outer_)&
& write(debug_unit,*) me,' ',trim(name),': Sizes:',&
& ' Send:',sdsz(:),' Receive:',rvsz(:)
call psb_ensure_size(max(iszs,1),iasnd,info)
if (info == psb_success_) call psb_ensure_size(max(iszs,1),jasnd,info)
if (info == psb_success_) call psb_ensure_size(max(iszs,1),valsnd,info)
if (info == psb_success_) call psb_ensure_size(max(iszr,1),iarcv,info)
if (info == psb_success_) call psb_ensure_size(max(iszr,1),jarcv,info)
if (info /= psb_success_) then
info=psb_err_from_subroutine_
call psb_errpush(info,name,a_err='ensure_size')
goto 9999
end if
if (info == 0) call psb_glob_transpose(atcoo,desc_r,info,desc_c=desc_c,desc_rx=desc_rx)
!
! Now, transpose the matrix, then split between itself
! and the send buffers
!
call acoo%transp()
if (acoo%get_nzeros()/= nzl) then
write(0,*) me,'Something strange upon transpose: ',nzl,acoo%get_nzeros()
end if
nzl = acoo%get_nzeros()
hlstart = p_desc_c%get_local_rows()
nzd = 0
do k = 1, nzl
j = acoo%ia(k)
if (j<=hlstart) then
nzd = nzd + 1
acoo%ia(nzd) = acoo%ia(k)
acoo%ja(nzd) = acoo%ja(k)
acoo%val(nzd) = acoo%val(k)
else
call p_desc_c%indxmap%qry_halo_owner(j,proc,info)
tsdx(proc+1) = tsdx(proc+1) +1
iasnd(tsdx(proc+1)) = acoo%ia(k)
jasnd(tsdx(proc+1)) = acoo%ja(k)
valsnd(tsdx(proc+1)) = acoo%val(k)
end if
end do
call acoo%set_nzeros(nzd)
!
! Put halo entries in global numbering
!
call desc_r%indxmap%l2gip(jasnd(1:iszs),info)
call p_desc_c%indxmap%l2gip(iasnd(1:iszs),info)
! And exchange data.
! Normally we'll use our SIMPLE A2AV and not MPI, because
! the communication pattern is sparse, so ours is more
! efficient. Using ACOO for the receive buffers.
nzl = acoo%get_nzeros()
call acoo%ensure_size(nzl+iszr)
select case(psb_get_sp_a2av_alg())
case(psb_sp_a2av_smpl_triad_)
call psb_simple_triad_a2av(valsnd,iasnd,jasnd,sdsz,bsdindx,&
& acoo%val(nzl+1:nzl+iszr),iarcv(1:iszr),&
& jarcv(1:iszr),rvsz,brvindx,ictxt,info)
case(psb_sp_a2av_smpl_v_)
call psb_simple_a2av(valsnd,sdsz,bsdindx,&
& acoo%val(nzl+1:nzl+iszr),rvsz,brvindx,ictxt,info)
if (info == psb_success_) call psb_simple_a2av(iasnd,sdsz,bsdindx,&
& iarcv(1:iszr),rvsz,brvindx,ictxt,info)
if (info == psb_success_) call psb_simple_a2av(jasnd,sdsz,bsdindx,&
& jarcv(1:iszr),rvsz,brvindx,ictxt,info)
case(psb_sp_a2av_mpi_)
call mpi_alltoallv(valsnd,sdsz,bsdindx,psb_mpi_c_spk_,&
& acoo%val(nzl+1:nzl+iszr),rvsz,brvindx,psb_mpi_c_spk_,icomm,minfo)
if (minfo == mpi_success) &
& call mpi_alltoallv(iasnd,sdsz,bsdindx,psb_mpi_lpk_,&
& iarcv(1:iszr),rvsz,brvindx,psb_mpi_lpk_,icomm,minfo)
if (minfo == mpi_success) &
& call mpi_alltoallv(jasnd,sdsz,bsdindx,psb_mpi_lpk_,&
& jarcv(1:iszr),rvsz,brvindx,psb_mpi_lpk_,icomm,minfo)
if (minfo /= mpi_success) info = minfo
case default
info = psb_err_internal_error_
call psb_errpush(info,name,a_err='wrong A2AV alg selector')
goto 9999
end select
if (info /= psb_success_) then
info=psb_err_from_subroutine_
call psb_errpush(info,name,a_err='alltoallv')
goto 9999
end if
if (debug_level >= psb_debug_outer_)&
& write(debug_unit,*) me,' ',trim(name),': Done alltoallv'
if (present(desc_rx)) then
!
! Extend the appropriate descriptor; started as R but on
! transpose it now describes C
!
call desc_r%clone(desc_rx,info)
call psb_cd_reinit(desc_rx,info)
!
! Take out non-local rows
!
call psb_glob_to_loc(iarcv(1:iszr),p_desc_c,info,iact='I',owned=.true.)
lszr = iszr
call psb_coo_clean_negidx_inner(lszr,iarcv(1:iszr),jarcv(1:iszr),&
& acoo%val(nzl+1:nzl+iszr),nzt,info)
call desc_rx%g2lip_ins(jarcv(1:nzt),info)
call psb_cdasb(desc_rx,info)
acoo%ia(nzl+1:nzl+nzt) = iarcv(1:nzt)
acoo%ja(nzl+1:nzl+nzt) = jarcv(1:nzt)
nzl = nzl + nzt
call acoo%set_nzeros(nzl)
nzl = acoo%get_nzeros()
call acoo%set_sorted(.false.)
!
! Insert to extend descriptor
!
call acoo%set_nrows(p_desc_c%get_local_rows())
call acoo%set_ncols(desc_rx%get_local_cols())
!write(0,*) me,' Trans RX ',acoo%get_nrows(),acoo%get_ncols(),acoo%get_nzeros()
else
!
!
! Take out non-local rows
!
call psb_glob_to_loc(iarcv(1:iszr),p_desc_c,info,iact='I',owned=.true.)
call psb_glob_to_loc(jarcv(1:iszr),desc_r,info,iact='I')
lszr = iszr
call psb_coo_clean_negidx_inner(lszr,iarcv(1:iszr),jarcv(1:iszr),&
& acoo%val(nzl+1:nzl+iszr),nzt,info)
acoo%ia(nzl+1:nzl+nzt) = iarcv(1:nzt)
acoo%ja(nzl+1:nzl+nzt) = jarcv(1:nzt)
nzl = nzl + nzt
call acoo%set_nzeros(nzl)
nzl = acoo%get_nzeros()
call acoo%set_sorted(.false.)
call acoo%set_nrows(p_desc_c%get_local_rows())
call acoo%set_ncols(desc_r%get_local_cols())
!write(0,*) me,' Trans R- ',acoo%get_nrows(),acoo%get_ncols(),acoo%get_nzeros()
end if
!!$ write(0,*) me,' Sanity check after rx%g2l :',count(acoo%ja(1:nzl)<0)
call acoo%fix(info)
nzl = acoo%get_nzeros()
if (present(atrans)) then
call atrans%mv_from_lcoo(atcoo,info)
call atrans%mv_from_coo(acoo,info)
else
call ain%mv_from_lcoo(atcoo,info)
call ain%mv_from_coo(acoo,info)
end if
Deallocate(brvindx,bsdindx,rvsz,sdsz,&
& iasnd,jasnd,valsnd,&
& iarcv,jarcv,stat=info)
if (debug_level >= psb_debug_outer_)&
& write(debug_unit,*) me,' ',trim(name),': Done'
call psb_erractionrestore(err_act)
return
9999 call psb_error_handler(ictxt,err_act)
return
end subroutine psb_c_coo_glob_transpose
subroutine psb_c_simple_glob_transpose_ip(ain,desc_a,info)
@ -434,7 +707,7 @@ subroutine psb_c_simple_glob_transpose_ip(ain,desc_a,info)
! that the same DESC_A works for both A and A^T, which
! essentially means that A has a symmetric pattern.
!
type(psb_lc_coo_sparse_mat) :: tmpc1, tmpc2
type(psb_c_coo_sparse_mat) :: tmpc1, tmpc2
integer(psb_ipk_) :: nz1, nz2, nzh, nz
integer(psb_ipk_) :: ictxt, me, np
integer(psb_lpk_) :: i, j, k, nrow, ncol, nlz
@ -485,7 +758,7 @@ subroutine psb_c_simple_glob_transpose(ain,aout,desc_a,info)
! that the same DESC_A works for both A and A^T, which
! essentially means that A has a symmetric pattern.
!
type(psb_lc_coo_sparse_mat) :: tmpc1, tmpc2
type(psb_c_coo_sparse_mat) :: tmpc1, tmpc2
integer(psb_ipk_) :: nz1, nz2, nzh, nz
integer(psb_ipk_) :: ictxt, me, np
integer(psb_lpk_) :: i, j, k, nrow, ncol, nlz

@ -69,6 +69,9 @@ Subroutine psb_cd_reinit(desc,info)
call psb_move_alloc(tmp_halo,desc%halo_index,info)
call psb_move_alloc(tmp_ext,desc%ext_index,info)
call desc%indxmap%reinit(info)
!!$ if (me == 0) write(0,*) 'On cdreinit status :',&
!!$ & allocated(desc%indxmap%p_adjcncy),allocated(desc%indxmap%halo_owner), &
!!$ & desc%get_fmt()
! call psb_cd_set_bld(desc,info)
end if

@ -122,11 +122,11 @@ subroutine psb_cspasb(a,desc_a, info, afmt, upd, dupl, mold)
end if
IF (debug_level >= psb_debug_ext_) then
if (debug_level >= psb_debug_ext_) then
ch_err=a%get_fmt()
write(debug_unit, *) me,' ',trim(name),': From SPCNV',&
& info,' ',ch_err
end IF
end if
if (psb_errstatus_fatal()) then
info=psb_err_from_subroutine_

@ -113,7 +113,6 @@ subroutine psb_ld_coo_glob_transpose(ain,desc_r,info,atrans,desc_c,desc_rx)
integer(psb_ipk_) :: ictxt, np,me
integer(psb_ipk_) :: counter,proc, err_act, j
integer(psb_lpk_) :: i, k, idx, r, ipx,mat_recv, iszs, iszr,idxs,idxr,nz,&
& irmin,icmin,irmax,icmax,&
& l1, nsnds, nrcvs, nr,nc,nzl, hlstart, nzt, nzd
integer(psb_mpk_) :: icomm, minfo
integer(psb_mpk_), allocatable :: brvindx(:), &
@ -190,7 +189,7 @@ subroutine psb_ld_coo_glob_transpose(ain,desc_r,info,atrans,desc_c,desc_rx)
do k=1, nzl
j = acoo%ja(k)
if (j > hlstart) then
call p_desc_c%indxmap%fnd_halo_owner(j,proc,info)
call p_desc_c%indxmap%qry_halo_owner(j,proc,info)
sdsz(proc+1) = sdsz(proc+1) +1
end if
end do
@ -264,19 +263,19 @@ subroutine psb_ld_coo_glob_transpose(ain,desc_r,info,atrans,desc_c,desc_rx)
acoo%ja(nzd) = acoo%ja(k)
acoo%val(nzd) = acoo%val(k)
else
call p_desc_c%indxmap%fnd_halo_owner(j,proc,info)
call p_desc_c%indxmap%qry_halo_owner(j,proc,info)
tsdx(proc+1) = tsdx(proc+1) +1
iasnd(tsdx(proc+1)) = acoo%ia(k)
jasnd(tsdx(proc+1)) = acoo%ja(k)
valsnd(tsdx(proc+1)) = acoo%val(k)
end if
end do
call acoo%set_nzeros(nzd)
!
! Put halo entries in global numbering
!
call desc_r%indxmap%l2gip(jasnd(1:iszs),info)
call p_desc_c%indxmap%l2gip(iasnd(1:iszs),info)
call acoo%set_nzeros(nzd)
! And exchange data.
! Normally we'll use our SIMPLE A2AV and not MPI, because
! the communication pattern is sparse, so ours is more
@ -407,19 +406,293 @@ subroutine psb_d_coo_glob_transpose(ain,desc_r,info,atrans,desc_c,desc_rx)
type(psb_desc_type), intent(out), optional :: desc_rx
integer(psb_ipk_), intent(out) :: info
type(psb_ld_coo_sparse_mat) :: atcoo
integer(psb_ipk_) :: ictxt, np,me
integer(psb_ipk_) :: counter,proc, err_act, j
integer(psb_ipk_) :: i, k, idx, r, ipx,mat_recv, iszs, iszr,idxs,idxr,nz,&
& l1, nsnds, nrcvs, nr,nc,nzl, hlstart, nzd
integer(psb_lpk_) :: nzt, lszr
integer(psb_mpk_) :: icomm, minfo
integer(psb_mpk_), allocatable :: brvindx(:), &
& rvsz(:), bsdindx(:), sdsz(:), tsdx(:), trvx(:)
integer(psb_ipk_), allocatable :: halo_owner(:)
integer(psb_lpk_), allocatable :: iasnd(:), jasnd(:),iarcv(:),jarcv(:)
real(psb_dpk_), allocatable :: valsnd(:)
type(psb_d_coo_sparse_mat), allocatable :: acoo
logical :: rowcnv_,colcnv_,rowscale_,colscale_,outcol_glob_
type(psb_desc_type), pointer :: p_desc_c
character(len=5) :: outfmt_
integer(psb_ipk_) :: debug_level, debug_unit
character(len=20) :: name, ch_err
if(psb_get_errstatus() /= 0) return
info=psb_success_
name='mld_glob_transpose'
call psb_erractionsave(err_act)
if (psb_errstatus_fatal()) then
info = psb_err_internal_error_ ; goto 9999
end if
debug_unit = psb_get_debug_unit()
debug_level = psb_get_debug_level()
ictxt = desc_r%get_context()
icomm = desc_r%get_mpic()
Call psb_info(ictxt, me, np)
if (debug_level >= psb_debug_outer_) &
& write(debug_unit,*) me,' ',trim(name),': Start'
if (present(desc_c)) then
p_desc_c => desc_c
else
p_desc_c => desc_r
end if
Allocate(brvindx(np+1),&
& rvsz(np),sdsz(np),bsdindx(np+1), acoo,stat=info)
if (info /= psb_success_) then
info=psb_err_alloc_dealloc_
call psb_errpush(info,name)
goto 9999
end if
sdsz(:)=0
rvsz(:)=0
l1 = 0
brvindx(1) = 0
bsdindx(1) = 0
counter=1
idx = 0
idxs = 0
idxr = 0
if (present(atrans)) then
call ain%cp_to_lcoo(atcoo,info)
call ain%cp_to_coo(acoo,info)
else
call ain%mv_to_lcoo(atcoo,info)
call ain%mv_to_coo(acoo,info)
end if
!
! Compute number of entries in the
! halo part, sorted by destination process
!
nr = desc_r%get_local_rows()
nc = p_desc_c%get_local_cols()
nzl = acoo%get_nzeros()
hlstart = p_desc_c%get_local_rows()
do k=1, nzl
j = acoo%ja(k)
if (j > hlstart) then
call p_desc_c%indxmap%qry_halo_owner(j,proc,info)
sdsz(proc+1) = sdsz(proc+1) +1
end if
end do
!
! Exchange sizes, so as to know sends/receives.
! This is different from the halo exchange because the
! number of entries was not precomputed in the descriptor,
! which was vector-oriented and not matrix-entry-oriented
!
call mpi_alltoall(sdsz,1,psb_mpi_mpk_,&
& rvsz,1,psb_mpi_mpk_,icomm,minfo)
if (info /= psb_success_) then
info=psb_err_from_subroutine_
call psb_errpush(info,name,a_err='mpi_alltoall')
goto 9999
end if
nsnds = count(sdsz /= 0)
nrcvs = count(rvsz /= 0)
if (debug_level >= psb_debug_outer_)&
& write(debug_unit,*) me,' ',trim(name),': Done initial alltoall',nsnds,nrcvs
idxs = 0
idxr = 0
counter = 1
Do proc = 0, np-1
bsdindx(proc+1) = idxs
idxs = idxs + sdsz(proc+1)
brvindx(proc+1) = idxr
idxr = idxr + rvsz(proc+1)
Enddo
tsdx = bsdindx
trvx = brvindx
iszr = sum(rvsz)
iszs = sum(sdsz)
if (debug_level >= psb_debug_outer_)&
& write(debug_unit,*) me,' ',trim(name),': Sizes:',&
& ' Send:',sdsz(:),' Receive:',rvsz(:)
call psb_ensure_size(max(iszs,1),iasnd,info)
if (info == psb_success_) call psb_ensure_size(max(iszs,1),jasnd,info)
if (info == psb_success_) call psb_ensure_size(max(iszs,1),valsnd,info)
if (info == psb_success_) call psb_ensure_size(max(iszr,1),iarcv,info)
if (info == psb_success_) call psb_ensure_size(max(iszr,1),jarcv,info)
if (info /= psb_success_) then
info=psb_err_from_subroutine_
call psb_errpush(info,name,a_err='ensure_size')
goto 9999
end if
if (info == 0) call psb_glob_transpose(atcoo,desc_r,info,desc_c=desc_c,desc_rx=desc_rx)
!
! Now, transpose the matrix, then split between itself
! and the send buffers
!
call acoo%transp()
if (acoo%get_nzeros()/= nzl) then
write(0,*) me,'Something strange upon transpose: ',nzl,acoo%get_nzeros()
end if
nzl = acoo%get_nzeros()
hlstart = p_desc_c%get_local_rows()
nzd = 0
do k = 1, nzl
j = acoo%ia(k)
if (j<=hlstart) then
nzd = nzd + 1
acoo%ia(nzd) = acoo%ia(k)
acoo%ja(nzd) = acoo%ja(k)
acoo%val(nzd) = acoo%val(k)
else
call p_desc_c%indxmap%qry_halo_owner(j,proc,info)
tsdx(proc+1) = tsdx(proc+1) +1
iasnd(tsdx(proc+1)) = acoo%ia(k)
jasnd(tsdx(proc+1)) = acoo%ja(k)
valsnd(tsdx(proc+1)) = acoo%val(k)
end if
end do
call acoo%set_nzeros(nzd)
!
! Put halo entries in global numbering
!
call desc_r%indxmap%l2gip(jasnd(1:iszs),info)
call p_desc_c%indxmap%l2gip(iasnd(1:iszs),info)
! And exchange data.
! Normally we'll use our SIMPLE A2AV and not MPI, because
! the communication pattern is sparse, so ours is more
! efficient. Using ACOO for the receive buffers.
nzl = acoo%get_nzeros()
call acoo%ensure_size(nzl+iszr)
select case(psb_get_sp_a2av_alg())
case(psb_sp_a2av_smpl_triad_)
call psb_simple_triad_a2av(valsnd,iasnd,jasnd,sdsz,bsdindx,&
& acoo%val(nzl+1:nzl+iszr),iarcv(1:iszr),&
& jarcv(1:iszr),rvsz,brvindx,ictxt,info)
case(psb_sp_a2av_smpl_v_)
call psb_simple_a2av(valsnd,sdsz,bsdindx,&
& acoo%val(nzl+1:nzl+iszr),rvsz,brvindx,ictxt,info)
if (info == psb_success_) call psb_simple_a2av(iasnd,sdsz,bsdindx,&
& iarcv(1:iszr),rvsz,brvindx,ictxt,info)
if (info == psb_success_) call psb_simple_a2av(jasnd,sdsz,bsdindx,&
& jarcv(1:iszr),rvsz,brvindx,ictxt,info)
case(psb_sp_a2av_mpi_)
call mpi_alltoallv(valsnd,sdsz,bsdindx,psb_mpi_r_dpk_,&
& acoo%val(nzl+1:nzl+iszr),rvsz,brvindx,psb_mpi_r_dpk_,icomm,minfo)
if (minfo == mpi_success) &
& call mpi_alltoallv(iasnd,sdsz,bsdindx,psb_mpi_lpk_,&
& iarcv(1:iszr),rvsz,brvindx,psb_mpi_lpk_,icomm,minfo)
if (minfo == mpi_success) &
& call mpi_alltoallv(jasnd,sdsz,bsdindx,psb_mpi_lpk_,&
& jarcv(1:iszr),rvsz,brvindx,psb_mpi_lpk_,icomm,minfo)
if (minfo /= mpi_success) info = minfo
case default
info = psb_err_internal_error_
call psb_errpush(info,name,a_err='wrong A2AV alg selector')
goto 9999
end select
if (info /= psb_success_) then
info=psb_err_from_subroutine_
call psb_errpush(info,name,a_err='alltoallv')
goto 9999
end if
if (debug_level >= psb_debug_outer_)&
& write(debug_unit,*) me,' ',trim(name),': Done alltoallv'
if (present(desc_rx)) then
!
! Extend the appropriate descriptor; started as R but on
! transpose it now describes C
!
call desc_r%clone(desc_rx,info)
call psb_cd_reinit(desc_rx,info)
!
! Take out non-local rows
!
call psb_glob_to_loc(iarcv(1:iszr),p_desc_c,info,iact='I',owned=.true.)
lszr = iszr
call psb_coo_clean_negidx_inner(lszr,iarcv(1:iszr),jarcv(1:iszr),&
& acoo%val(nzl+1:nzl+iszr),nzt,info)
call desc_rx%g2lip_ins(jarcv(1:nzt),info)
call psb_cdasb(desc_rx,info)
acoo%ia(nzl+1:nzl+nzt) = iarcv(1:nzt)
acoo%ja(nzl+1:nzl+nzt) = jarcv(1:nzt)
nzl = nzl + nzt
call acoo%set_nzeros(nzl)
nzl = acoo%get_nzeros()
call acoo%set_sorted(.false.)
!
! Insert to extend descriptor
!
call acoo%set_nrows(p_desc_c%get_local_rows())
call acoo%set_ncols(desc_rx%get_local_cols())
!write(0,*) me,' Trans RX ',acoo%get_nrows(),acoo%get_ncols(),acoo%get_nzeros()
else
!
!
! Take out non-local rows
!
call psb_glob_to_loc(iarcv(1:iszr),p_desc_c,info,iact='I',owned=.true.)
call psb_glob_to_loc(jarcv(1:iszr),desc_r,info,iact='I')
lszr = iszr
call psb_coo_clean_negidx_inner(lszr,iarcv(1:iszr),jarcv(1:iszr),&
& acoo%val(nzl+1:nzl+iszr),nzt,info)
acoo%ia(nzl+1:nzl+nzt) = iarcv(1:nzt)
acoo%ja(nzl+1:nzl+nzt) = jarcv(1:nzt)
nzl = nzl + nzt
call acoo%set_nzeros(nzl)
nzl = acoo%get_nzeros()
call acoo%set_sorted(.false.)
call acoo%set_nrows(p_desc_c%get_local_rows())
call acoo%set_ncols(desc_r%get_local_cols())
!write(0,*) me,' Trans R- ',acoo%get_nrows(),acoo%get_ncols(),acoo%get_nzeros()
end if
!!$ write(0,*) me,' Sanity check after rx%g2l :',count(acoo%ja(1:nzl)<0)
call acoo%fix(info)
nzl = acoo%get_nzeros()
if (present(atrans)) then
call atrans%mv_from_lcoo(atcoo,info)
call atrans%mv_from_coo(acoo,info)
else
call ain%mv_from_lcoo(atcoo,info)
call ain%mv_from_coo(acoo,info)
end if
Deallocate(brvindx,bsdindx,rvsz,sdsz,&
& iasnd,jasnd,valsnd,&
& iarcv,jarcv,stat=info)
if (debug_level >= psb_debug_outer_)&
& write(debug_unit,*) me,' ',trim(name),': Done'
call psb_erractionrestore(err_act)
return
9999 call psb_error_handler(ictxt,err_act)
return
end subroutine psb_d_coo_glob_transpose
subroutine psb_d_simple_glob_transpose_ip(ain,desc_a,info)
@ -434,7 +707,7 @@ subroutine psb_d_simple_glob_transpose_ip(ain,desc_a,info)
! that the same DESC_A works for both A and A^T, which
! essentially means that A has a symmetric pattern.
!
type(psb_ld_coo_sparse_mat) :: tmpc1, tmpc2
type(psb_d_coo_sparse_mat) :: tmpc1, tmpc2
integer(psb_ipk_) :: nz1, nz2, nzh, nz
integer(psb_ipk_) :: ictxt, me, np
integer(psb_lpk_) :: i, j, k, nrow, ncol, nlz
@ -485,7 +758,7 @@ subroutine psb_d_simple_glob_transpose(ain,aout,desc_a,info)
! that the same DESC_A works for both A and A^T, which
! essentially means that A has a symmetric pattern.
!
type(psb_ld_coo_sparse_mat) :: tmpc1, tmpc2
type(psb_d_coo_sparse_mat) :: tmpc1, tmpc2
integer(psb_ipk_) :: nz1, nz2, nzh, nz
integer(psb_ipk_) :: ictxt, me, np
integer(psb_lpk_) :: i, j, k, nrow, ncol, nlz

@ -122,11 +122,11 @@ subroutine psb_dspasb(a,desc_a, info, afmt, upd, dupl, mold)
end if
IF (debug_level >= psb_debug_ext_) then
if (debug_level >= psb_debug_ext_) then
ch_err=a%get_fmt()
write(debug_unit, *) me,' ',trim(name),': From SPCNV',&
& info,' ',ch_err
end IF
end if
if (psb_errstatus_fatal()) then
info=psb_err_from_subroutine_

@ -113,7 +113,6 @@ subroutine psb_ls_coo_glob_transpose(ain,desc_r,info,atrans,desc_c,desc_rx)
integer(psb_ipk_) :: ictxt, np,me
integer(psb_ipk_) :: counter,proc, err_act, j
integer(psb_lpk_) :: i, k, idx, r, ipx,mat_recv, iszs, iszr,idxs,idxr,nz,&
& irmin,icmin,irmax,icmax,&
& l1, nsnds, nrcvs, nr,nc,nzl, hlstart, nzt, nzd
integer(psb_mpk_) :: icomm, minfo
integer(psb_mpk_), allocatable :: brvindx(:), &
@ -190,7 +189,7 @@ subroutine psb_ls_coo_glob_transpose(ain,desc_r,info,atrans,desc_c,desc_rx)
do k=1, nzl
j = acoo%ja(k)
if (j > hlstart) then
call p_desc_c%indxmap%fnd_halo_owner(j,proc,info)
call p_desc_c%indxmap%qry_halo_owner(j,proc,info)
sdsz(proc+1) = sdsz(proc+1) +1
end if
end do
@ -264,19 +263,19 @@ subroutine psb_ls_coo_glob_transpose(ain,desc_r,info,atrans,desc_c,desc_rx)
acoo%ja(nzd) = acoo%ja(k)
acoo%val(nzd) = acoo%val(k)
else
call p_desc_c%indxmap%fnd_halo_owner(j,proc,info)
call p_desc_c%indxmap%qry_halo_owner(j,proc,info)
tsdx(proc+1) = tsdx(proc+1) +1
iasnd(tsdx(proc+1)) = acoo%ia(k)
jasnd(tsdx(proc+1)) = acoo%ja(k)
valsnd(tsdx(proc+1)) = acoo%val(k)
end if
end do
call acoo%set_nzeros(nzd)
!
! Put halo entries in global numbering
!
call desc_r%indxmap%l2gip(jasnd(1:iszs),info)
call p_desc_c%indxmap%l2gip(iasnd(1:iszs),info)
call acoo%set_nzeros(nzd)
! And exchange data.
! Normally we'll use our SIMPLE A2AV and not MPI, because
! the communication pattern is sparse, so ours is more
@ -407,19 +406,293 @@ subroutine psb_s_coo_glob_transpose(ain,desc_r,info,atrans,desc_c,desc_rx)
type(psb_desc_type), intent(out), optional :: desc_rx
integer(psb_ipk_), intent(out) :: info
type(psb_ls_coo_sparse_mat) :: atcoo
integer(psb_ipk_) :: ictxt, np,me
integer(psb_ipk_) :: counter,proc, err_act, j
integer(psb_ipk_) :: i, k, idx, r, ipx,mat_recv, iszs, iszr,idxs,idxr,nz,&
& l1, nsnds, nrcvs, nr,nc,nzl, hlstart, nzd
integer(psb_lpk_) :: nzt, lszr
integer(psb_mpk_) :: icomm, minfo
integer(psb_mpk_), allocatable :: brvindx(:), &
& rvsz(:), bsdindx(:), sdsz(:), tsdx(:), trvx(:)
integer(psb_ipk_), allocatable :: halo_owner(:)
integer(psb_lpk_), allocatable :: iasnd(:), jasnd(:),iarcv(:),jarcv(:)
real(psb_spk_), allocatable :: valsnd(:)
type(psb_s_coo_sparse_mat), allocatable :: acoo
logical :: rowcnv_,colcnv_,rowscale_,colscale_,outcol_glob_
type(psb_desc_type), pointer :: p_desc_c
character(len=5) :: outfmt_
integer(psb_ipk_) :: debug_level, debug_unit
character(len=20) :: name, ch_err
if(psb_get_errstatus() /= 0) return
info=psb_success_
name='mld_glob_transpose'
call psb_erractionsave(err_act)
if (psb_errstatus_fatal()) then
info = psb_err_internal_error_ ; goto 9999
end if
debug_unit = psb_get_debug_unit()
debug_level = psb_get_debug_level()
ictxt = desc_r%get_context()
icomm = desc_r%get_mpic()
Call psb_info(ictxt, me, np)
if (debug_level >= psb_debug_outer_) &
& write(debug_unit,*) me,' ',trim(name),': Start'
if (present(desc_c)) then
p_desc_c => desc_c
else
p_desc_c => desc_r
end if
Allocate(brvindx(np+1),&
& rvsz(np),sdsz(np),bsdindx(np+1), acoo,stat=info)
if (info /= psb_success_) then
info=psb_err_alloc_dealloc_
call psb_errpush(info,name)
goto 9999
end if
sdsz(:)=0
rvsz(:)=0
l1 = 0
brvindx(1) = 0
bsdindx(1) = 0
counter=1
idx = 0
idxs = 0
idxr = 0
if (present(atrans)) then
call ain%cp_to_lcoo(atcoo,info)
call ain%cp_to_coo(acoo,info)
else
call ain%mv_to_lcoo(atcoo,info)
call ain%mv_to_coo(acoo,info)
end if
!
! Compute number of entries in the
! halo part, sorted by destination process
!
nr = desc_r%get_local_rows()
nc = p_desc_c%get_local_cols()
nzl = acoo%get_nzeros()
hlstart = p_desc_c%get_local_rows()
do k=1, nzl
j = acoo%ja(k)
if (j > hlstart) then
call p_desc_c%indxmap%qry_halo_owner(j,proc,info)
sdsz(proc+1) = sdsz(proc+1) +1
end if
end do
!
! Exchange sizes, so as to know sends/receives.
! This is different from the halo exchange because the
! number of entries was not precomputed in the descriptor,
! which was vector-oriented and not matrix-entry-oriented
!
call mpi_alltoall(sdsz,1,psb_mpi_mpk_,&
& rvsz,1,psb_mpi_mpk_,icomm,minfo)
if (info /= psb_success_) then
info=psb_err_from_subroutine_
call psb_errpush(info,name,a_err='mpi_alltoall')
goto 9999
end if
nsnds = count(sdsz /= 0)
nrcvs = count(rvsz /= 0)
if (debug_level >= psb_debug_outer_)&
& write(debug_unit,*) me,' ',trim(name),': Done initial alltoall',nsnds,nrcvs
idxs = 0
idxr = 0
counter = 1
Do proc = 0, np-1
bsdindx(proc+1) = idxs
idxs = idxs + sdsz(proc+1)
brvindx(proc+1) = idxr
idxr = idxr + rvsz(proc+1)
Enddo
tsdx = bsdindx
trvx = brvindx
iszr = sum(rvsz)
iszs = sum(sdsz)
if (debug_level >= psb_debug_outer_)&
& write(debug_unit,*) me,' ',trim(name),': Sizes:',&
& ' Send:',sdsz(:),' Receive:',rvsz(:)
call psb_ensure_size(max(iszs,1),iasnd,info)
if (info == psb_success_) call psb_ensure_size(max(iszs,1),jasnd,info)
if (info == psb_success_) call psb_ensure_size(max(iszs,1),valsnd,info)
if (info == psb_success_) call psb_ensure_size(max(iszr,1),iarcv,info)
if (info == psb_success_) call psb_ensure_size(max(iszr,1),jarcv,info)
if (info /= psb_success_) then
info=psb_err_from_subroutine_
call psb_errpush(info,name,a_err='ensure_size')
goto 9999
end if
if (info == 0) call psb_glob_transpose(atcoo,desc_r,info,desc_c=desc_c,desc_rx=desc_rx)
!
! Now, transpose the matrix, then split between itself
! and the send buffers
!
call acoo%transp()
if (acoo%get_nzeros()/= nzl) then
write(0,*) me,'Something strange upon transpose: ',nzl,acoo%get_nzeros()
end if
nzl = acoo%get_nzeros()
hlstart = p_desc_c%get_local_rows()
nzd = 0
do k = 1, nzl
j = acoo%ia(k)
if (j<=hlstart) then
nzd = nzd + 1
acoo%ia(nzd) = acoo%ia(k)
acoo%ja(nzd) = acoo%ja(k)
acoo%val(nzd) = acoo%val(k)
else
call p_desc_c%indxmap%qry_halo_owner(j,proc,info)
tsdx(proc+1) = tsdx(proc+1) +1
iasnd(tsdx(proc+1)) = acoo%ia(k)
jasnd(tsdx(proc+1)) = acoo%ja(k)
valsnd(tsdx(proc+1)) = acoo%val(k)
end if
end do
call acoo%set_nzeros(nzd)
!
! Put halo entries in global numbering
!
call desc_r%indxmap%l2gip(jasnd(1:iszs),info)
call p_desc_c%indxmap%l2gip(iasnd(1:iszs),info)
! And exchange data.
! Normally we'll use our SIMPLE A2AV and not MPI, because
! the communication pattern is sparse, so ours is more
! efficient. Using ACOO for the receive buffers.
nzl = acoo%get_nzeros()
call acoo%ensure_size(nzl+iszr)
select case(psb_get_sp_a2av_alg())
case(psb_sp_a2av_smpl_triad_)
call psb_simple_triad_a2av(valsnd,iasnd,jasnd,sdsz,bsdindx,&
& acoo%val(nzl+1:nzl+iszr),iarcv(1:iszr),&
& jarcv(1:iszr),rvsz,brvindx,ictxt,info)
case(psb_sp_a2av_smpl_v_)
call psb_simple_a2av(valsnd,sdsz,bsdindx,&
& acoo%val(nzl+1:nzl+iszr),rvsz,brvindx,ictxt,info)
if (info == psb_success_) call psb_simple_a2av(iasnd,sdsz,bsdindx,&
& iarcv(1:iszr),rvsz,brvindx,ictxt,info)
if (info == psb_success_) call psb_simple_a2av(jasnd,sdsz,bsdindx,&
& jarcv(1:iszr),rvsz,brvindx,ictxt,info)
case(psb_sp_a2av_mpi_)
call mpi_alltoallv(valsnd,sdsz,bsdindx,psb_mpi_r_spk_,&
& acoo%val(nzl+1:nzl+iszr),rvsz,brvindx,psb_mpi_r_spk_,icomm,minfo)
if (minfo == mpi_success) &
& call mpi_alltoallv(iasnd,sdsz,bsdindx,psb_mpi_lpk_,&
& iarcv(1:iszr),rvsz,brvindx,psb_mpi_lpk_,icomm,minfo)
if (minfo == mpi_success) &
& call mpi_alltoallv(jasnd,sdsz,bsdindx,psb_mpi_lpk_,&
& jarcv(1:iszr),rvsz,brvindx,psb_mpi_lpk_,icomm,minfo)
if (minfo /= mpi_success) info = minfo
case default
info = psb_err_internal_error_
call psb_errpush(info,name,a_err='wrong A2AV alg selector')
goto 9999
end select
if (info /= psb_success_) then
info=psb_err_from_subroutine_
call psb_errpush(info,name,a_err='alltoallv')
goto 9999
end if
if (debug_level >= psb_debug_outer_)&
& write(debug_unit,*) me,' ',trim(name),': Done alltoallv'
if (present(desc_rx)) then
!
! Extend the appropriate descriptor; started as R but on
! transpose it now describes C
!
call desc_r%clone(desc_rx,info)
call psb_cd_reinit(desc_rx,info)
!
! Take out non-local rows
!
call psb_glob_to_loc(iarcv(1:iszr),p_desc_c,info,iact='I',owned=.true.)
lszr = iszr
call psb_coo_clean_negidx_inner(lszr,iarcv(1:iszr),jarcv(1:iszr),&
& acoo%val(nzl+1:nzl+iszr),nzt,info)
call desc_rx%g2lip_ins(jarcv(1:nzt),info)
call psb_cdasb(desc_rx,info)
acoo%ia(nzl+1:nzl+nzt) = iarcv(1:nzt)
acoo%ja(nzl+1:nzl+nzt) = jarcv(1:nzt)
nzl = nzl + nzt
call acoo%set_nzeros(nzl)
nzl = acoo%get_nzeros()
call acoo%set_sorted(.false.)
!
! Insert to extend descriptor
!
call acoo%set_nrows(p_desc_c%get_local_rows())
call acoo%set_ncols(desc_rx%get_local_cols())
!write(0,*) me,' Trans RX ',acoo%get_nrows(),acoo%get_ncols(),acoo%get_nzeros()
else
!
!
! Take out non-local rows
!
call psb_glob_to_loc(iarcv(1:iszr),p_desc_c,info,iact='I',owned=.true.)
call psb_glob_to_loc(jarcv(1:iszr),desc_r,info,iact='I')
lszr = iszr
call psb_coo_clean_negidx_inner(lszr,iarcv(1:iszr),jarcv(1:iszr),&
& acoo%val(nzl+1:nzl+iszr),nzt,info)
acoo%ia(nzl+1:nzl+nzt) = iarcv(1:nzt)
acoo%ja(nzl+1:nzl+nzt) = jarcv(1:nzt)
nzl = nzl + nzt
call acoo%set_nzeros(nzl)
nzl = acoo%get_nzeros()
call acoo%set_sorted(.false.)
call acoo%set_nrows(p_desc_c%get_local_rows())
call acoo%set_ncols(desc_r%get_local_cols())
!write(0,*) me,' Trans R- ',acoo%get_nrows(),acoo%get_ncols(),acoo%get_nzeros()
end if
!!$ write(0,*) me,' Sanity check after rx%g2l :',count(acoo%ja(1:nzl)<0)
call acoo%fix(info)
nzl = acoo%get_nzeros()
if (present(atrans)) then
call atrans%mv_from_lcoo(atcoo,info)
call atrans%mv_from_coo(acoo,info)
else
call ain%mv_from_lcoo(atcoo,info)
call ain%mv_from_coo(acoo,info)
end if
Deallocate(brvindx,bsdindx,rvsz,sdsz,&
& iasnd,jasnd,valsnd,&
& iarcv,jarcv,stat=info)
if (debug_level >= psb_debug_outer_)&
& write(debug_unit,*) me,' ',trim(name),': Done'
call psb_erractionrestore(err_act)
return
9999 call psb_error_handler(ictxt,err_act)
return
end subroutine psb_s_coo_glob_transpose
subroutine psb_s_simple_glob_transpose_ip(ain,desc_a,info)
@ -434,7 +707,7 @@ subroutine psb_s_simple_glob_transpose_ip(ain,desc_a,info)
! that the same DESC_A works for both A and A^T, which
! essentially means that A has a symmetric pattern.
!
type(psb_ls_coo_sparse_mat) :: tmpc1, tmpc2
type(psb_s_coo_sparse_mat) :: tmpc1, tmpc2
integer(psb_ipk_) :: nz1, nz2, nzh, nz
integer(psb_ipk_) :: ictxt, me, np
integer(psb_lpk_) :: i, j, k, nrow, ncol, nlz
@ -485,7 +758,7 @@ subroutine psb_s_simple_glob_transpose(ain,aout,desc_a,info)
! that the same DESC_A works for both A and A^T, which
! essentially means that A has a symmetric pattern.
!
type(psb_ls_coo_sparse_mat) :: tmpc1, tmpc2
type(psb_s_coo_sparse_mat) :: tmpc1, tmpc2
integer(psb_ipk_) :: nz1, nz2, nzh, nz
integer(psb_ipk_) :: ictxt, me, np
integer(psb_lpk_) :: i, j, k, nrow, ncol, nlz

@ -122,11 +122,11 @@ subroutine psb_sspasb(a,desc_a, info, afmt, upd, dupl, mold)
end if
IF (debug_level >= psb_debug_ext_) then
if (debug_level >= psb_debug_ext_) then
ch_err=a%get_fmt()
write(debug_unit, *) me,' ',trim(name),': From SPCNV',&
& info,' ',ch_err
end IF
end if
if (psb_errstatus_fatal()) then
info=psb_err_from_subroutine_

@ -113,7 +113,6 @@ subroutine psb_lz_coo_glob_transpose(ain,desc_r,info,atrans,desc_c,desc_rx)
integer(psb_ipk_) :: ictxt, np,me
integer(psb_ipk_) :: counter,proc, err_act, j
integer(psb_lpk_) :: i, k, idx, r, ipx,mat_recv, iszs, iszr,idxs,idxr,nz,&
& irmin,icmin,irmax,icmax,&
& l1, nsnds, nrcvs, nr,nc,nzl, hlstart, nzt, nzd
integer(psb_mpk_) :: icomm, minfo
integer(psb_mpk_), allocatable :: brvindx(:), &
@ -190,7 +189,7 @@ subroutine psb_lz_coo_glob_transpose(ain,desc_r,info,atrans,desc_c,desc_rx)
do k=1, nzl
j = acoo%ja(k)
if (j > hlstart) then
call p_desc_c%indxmap%fnd_halo_owner(j,proc,info)
call p_desc_c%indxmap%qry_halo_owner(j,proc,info)
sdsz(proc+1) = sdsz(proc+1) +1
end if
end do
@ -264,19 +263,19 @@ subroutine psb_lz_coo_glob_transpose(ain,desc_r,info,atrans,desc_c,desc_rx)
acoo%ja(nzd) = acoo%ja(k)
acoo%val(nzd) = acoo%val(k)
else
call p_desc_c%indxmap%fnd_halo_owner(j,proc,info)
call p_desc_c%indxmap%qry_halo_owner(j,proc,info)
tsdx(proc+1) = tsdx(proc+1) +1
iasnd(tsdx(proc+1)) = acoo%ia(k)
jasnd(tsdx(proc+1)) = acoo%ja(k)
valsnd(tsdx(proc+1)) = acoo%val(k)
end if
end do
call acoo%set_nzeros(nzd)
!
! Put halo entries in global numbering
!
call desc_r%indxmap%l2gip(jasnd(1:iszs),info)
call p_desc_c%indxmap%l2gip(iasnd(1:iszs),info)
call acoo%set_nzeros(nzd)
! And exchange data.
! Normally we'll use our SIMPLE A2AV and not MPI, because
! the communication pattern is sparse, so ours is more
@ -407,19 +406,293 @@ subroutine psb_z_coo_glob_transpose(ain,desc_r,info,atrans,desc_c,desc_rx)
type(psb_desc_type), intent(out), optional :: desc_rx
integer(psb_ipk_), intent(out) :: info
type(psb_lz_coo_sparse_mat) :: atcoo
integer(psb_ipk_) :: ictxt, np,me
integer(psb_ipk_) :: counter,proc, err_act, j
integer(psb_ipk_) :: i, k, idx, r, ipx,mat_recv, iszs, iszr,idxs,idxr,nz,&
& l1, nsnds, nrcvs, nr,nc,nzl, hlstart, nzd
integer(psb_lpk_) :: nzt, lszr
integer(psb_mpk_) :: icomm, minfo
integer(psb_mpk_), allocatable :: brvindx(:), &
& rvsz(:), bsdindx(:), sdsz(:), tsdx(:), trvx(:)
integer(psb_ipk_), allocatable :: halo_owner(:)
integer(psb_lpk_), allocatable :: iasnd(:), jasnd(:),iarcv(:),jarcv(:)
complex(psb_dpk_), allocatable :: valsnd(:)
type(psb_z_coo_sparse_mat), allocatable :: acoo
logical :: rowcnv_,colcnv_,rowscale_,colscale_,outcol_glob_
type(psb_desc_type), pointer :: p_desc_c
character(len=5) :: outfmt_
integer(psb_ipk_) :: debug_level, debug_unit
character(len=20) :: name, ch_err
if(psb_get_errstatus() /= 0) return
info=psb_success_
name='mld_glob_transpose'
call psb_erractionsave(err_act)
if (psb_errstatus_fatal()) then
info = psb_err_internal_error_ ; goto 9999
end if
debug_unit = psb_get_debug_unit()
debug_level = psb_get_debug_level()
ictxt = desc_r%get_context()
icomm = desc_r%get_mpic()
Call psb_info(ictxt, me, np)
if (debug_level >= psb_debug_outer_) &
& write(debug_unit,*) me,' ',trim(name),': Start'
if (present(desc_c)) then
p_desc_c => desc_c
else
p_desc_c => desc_r
end if
Allocate(brvindx(np+1),&
& rvsz(np),sdsz(np),bsdindx(np+1), acoo,stat=info)
if (info /= psb_success_) then
info=psb_err_alloc_dealloc_
call psb_errpush(info,name)
goto 9999
end if
sdsz(:)=0
rvsz(:)=0
l1 = 0
brvindx(1) = 0
bsdindx(1) = 0
counter=1
idx = 0
idxs = 0
idxr = 0
if (present(atrans)) then
call ain%cp_to_lcoo(atcoo,info)
call ain%cp_to_coo(acoo,info)
else
call ain%mv_to_lcoo(atcoo,info)
call ain%mv_to_coo(acoo,info)
end if
!
! Compute number of entries in the
! halo part, sorted by destination process
!
nr = desc_r%get_local_rows()
nc = p_desc_c%get_local_cols()
nzl = acoo%get_nzeros()
hlstart = p_desc_c%get_local_rows()
do k=1, nzl
j = acoo%ja(k)
if (j > hlstart) then
call p_desc_c%indxmap%qry_halo_owner(j,proc,info)
sdsz(proc+1) = sdsz(proc+1) +1
end if
end do
!
! Exchange sizes, so as to know sends/receives.
! This is different from the halo exchange because the
! number of entries was not precomputed in the descriptor,
! which was vector-oriented and not matrix-entry-oriented
!
call mpi_alltoall(sdsz,1,psb_mpi_mpk_,&
& rvsz,1,psb_mpi_mpk_,icomm,minfo)
if (info /= psb_success_) then
info=psb_err_from_subroutine_
call psb_errpush(info,name,a_err='mpi_alltoall')
goto 9999
end if
nsnds = count(sdsz /= 0)
nrcvs = count(rvsz /= 0)
if (debug_level >= psb_debug_outer_)&
& write(debug_unit,*) me,' ',trim(name),': Done initial alltoall',nsnds,nrcvs
idxs = 0
idxr = 0
counter = 1
Do proc = 0, np-1
bsdindx(proc+1) = idxs
idxs = idxs + sdsz(proc+1)
brvindx(proc+1) = idxr
idxr = idxr + rvsz(proc+1)
Enddo
tsdx = bsdindx
trvx = brvindx
iszr = sum(rvsz)
iszs = sum(sdsz)
if (debug_level >= psb_debug_outer_)&
& write(debug_unit,*) me,' ',trim(name),': Sizes:',&
& ' Send:',sdsz(:),' Receive:',rvsz(:)
call psb_ensure_size(max(iszs,1),iasnd,info)
if (info == psb_success_) call psb_ensure_size(max(iszs,1),jasnd,info)
if (info == psb_success_) call psb_ensure_size(max(iszs,1),valsnd,info)
if (info == psb_success_) call psb_ensure_size(max(iszr,1),iarcv,info)
if (info == psb_success_) call psb_ensure_size(max(iszr,1),jarcv,info)
if (info /= psb_success_) then
info=psb_err_from_subroutine_
call psb_errpush(info,name,a_err='ensure_size')
goto 9999
end if
if (info == 0) call psb_glob_transpose(atcoo,desc_r,info,desc_c=desc_c,desc_rx=desc_rx)
!
! Now, transpose the matrix, then split between itself
! and the send buffers
!
call acoo%transp()
if (acoo%get_nzeros()/= nzl) then
write(0,*) me,'Something strange upon transpose: ',nzl,acoo%get_nzeros()
end if
nzl = acoo%get_nzeros()
hlstart = p_desc_c%get_local_rows()
nzd = 0
do k = 1, nzl
j = acoo%ia(k)
if (j<=hlstart) then
nzd = nzd + 1
acoo%ia(nzd) = acoo%ia(k)
acoo%ja(nzd) = acoo%ja(k)
acoo%val(nzd) = acoo%val(k)
else
call p_desc_c%indxmap%qry_halo_owner(j,proc,info)
tsdx(proc+1) = tsdx(proc+1) +1
iasnd(tsdx(proc+1)) = acoo%ia(k)
jasnd(tsdx(proc+1)) = acoo%ja(k)
valsnd(tsdx(proc+1)) = acoo%val(k)
end if
end do
call acoo%set_nzeros(nzd)
!
! Put halo entries in global numbering
!
call desc_r%indxmap%l2gip(jasnd(1:iszs),info)
call p_desc_c%indxmap%l2gip(iasnd(1:iszs),info)
! And exchange data.
! Normally we'll use our SIMPLE A2AV and not MPI, because
! the communication pattern is sparse, so ours is more
! efficient. Using ACOO for the receive buffers.
nzl = acoo%get_nzeros()
call acoo%ensure_size(nzl+iszr)
select case(psb_get_sp_a2av_alg())
case(psb_sp_a2av_smpl_triad_)
call psb_simple_triad_a2av(valsnd,iasnd,jasnd,sdsz,bsdindx,&
& acoo%val(nzl+1:nzl+iszr),iarcv(1:iszr),&
& jarcv(1:iszr),rvsz,brvindx,ictxt,info)
case(psb_sp_a2av_smpl_v_)
call psb_simple_a2av(valsnd,sdsz,bsdindx,&
& acoo%val(nzl+1:nzl+iszr),rvsz,brvindx,ictxt,info)
if (info == psb_success_) call psb_simple_a2av(iasnd,sdsz,bsdindx,&
& iarcv(1:iszr),rvsz,brvindx,ictxt,info)
if (info == psb_success_) call psb_simple_a2av(jasnd,sdsz,bsdindx,&
& jarcv(1:iszr),rvsz,brvindx,ictxt,info)
case(psb_sp_a2av_mpi_)
call mpi_alltoallv(valsnd,sdsz,bsdindx,psb_mpi_c_dpk_,&
& acoo%val(nzl+1:nzl+iszr),rvsz,brvindx,psb_mpi_c_dpk_,icomm,minfo)
if (minfo == mpi_success) &
& call mpi_alltoallv(iasnd,sdsz,bsdindx,psb_mpi_lpk_,&
& iarcv(1:iszr),rvsz,brvindx,psb_mpi_lpk_,icomm,minfo)
if (minfo == mpi_success) &
& call mpi_alltoallv(jasnd,sdsz,bsdindx,psb_mpi_lpk_,&
& jarcv(1:iszr),rvsz,brvindx,psb_mpi_lpk_,icomm,minfo)
if (minfo /= mpi_success) info = minfo
case default
info = psb_err_internal_error_
call psb_errpush(info,name,a_err='wrong A2AV alg selector')
goto 9999
end select
if (info /= psb_success_) then
info=psb_err_from_subroutine_
call psb_errpush(info,name,a_err='alltoallv')
goto 9999
end if
if (debug_level >= psb_debug_outer_)&
& write(debug_unit,*) me,' ',trim(name),': Done alltoallv'
if (present(desc_rx)) then
!
! Extend the appropriate descriptor; started as R but on
! transpose it now describes C
!
call desc_r%clone(desc_rx,info)
call psb_cd_reinit(desc_rx,info)
!
! Take out non-local rows
!
call psb_glob_to_loc(iarcv(1:iszr),p_desc_c,info,iact='I',owned=.true.)
lszr = iszr
call psb_coo_clean_negidx_inner(lszr,iarcv(1:iszr),jarcv(1:iszr),&
& acoo%val(nzl+1:nzl+iszr),nzt,info)
call desc_rx%g2lip_ins(jarcv(1:nzt),info)
call psb_cdasb(desc_rx,info)
acoo%ia(nzl+1:nzl+nzt) = iarcv(1:nzt)
acoo%ja(nzl+1:nzl+nzt) = jarcv(1:nzt)
nzl = nzl + nzt
call acoo%set_nzeros(nzl)
nzl = acoo%get_nzeros()
call acoo%set_sorted(.false.)
!
! Insert to extend descriptor
!
call acoo%set_nrows(p_desc_c%get_local_rows())
call acoo%set_ncols(desc_rx%get_local_cols())
!write(0,*) me,' Trans RX ',acoo%get_nrows(),acoo%get_ncols(),acoo%get_nzeros()
else
!
!
! Take out non-local rows
!
call psb_glob_to_loc(iarcv(1:iszr),p_desc_c,info,iact='I',owned=.true.)
call psb_glob_to_loc(jarcv(1:iszr),desc_r,info,iact='I')
lszr = iszr
call psb_coo_clean_negidx_inner(lszr,iarcv(1:iszr),jarcv(1:iszr),&
& acoo%val(nzl+1:nzl+iszr),nzt,info)
acoo%ia(nzl+1:nzl+nzt) = iarcv(1:nzt)
acoo%ja(nzl+1:nzl+nzt) = jarcv(1:nzt)
nzl = nzl + nzt
call acoo%set_nzeros(nzl)
nzl = acoo%get_nzeros()
call acoo%set_sorted(.false.)
call acoo%set_nrows(p_desc_c%get_local_rows())
call acoo%set_ncols(desc_r%get_local_cols())
!write(0,*) me,' Trans R- ',acoo%get_nrows(),acoo%get_ncols(),acoo%get_nzeros()
end if
!!$ write(0,*) me,' Sanity check after rx%g2l :',count(acoo%ja(1:nzl)<0)
call acoo%fix(info)
nzl = acoo%get_nzeros()
if (present(atrans)) then
call atrans%mv_from_lcoo(atcoo,info)
call atrans%mv_from_coo(acoo,info)
else
call ain%mv_from_lcoo(atcoo,info)
call ain%mv_from_coo(acoo,info)
end if
Deallocate(brvindx,bsdindx,rvsz,sdsz,&
& iasnd,jasnd,valsnd,&
& iarcv,jarcv,stat=info)
if (debug_level >= psb_debug_outer_)&
& write(debug_unit,*) me,' ',trim(name),': Done'
call psb_erractionrestore(err_act)
return
9999 call psb_error_handler(ictxt,err_act)
return
end subroutine psb_z_coo_glob_transpose
subroutine psb_z_simple_glob_transpose_ip(ain,desc_a,info)
@ -434,7 +707,7 @@ subroutine psb_z_simple_glob_transpose_ip(ain,desc_a,info)
! that the same DESC_A works for both A and A^T, which
! essentially means that A has a symmetric pattern.
!
type(psb_lz_coo_sparse_mat) :: tmpc1, tmpc2
type(psb_z_coo_sparse_mat) :: tmpc1, tmpc2
integer(psb_ipk_) :: nz1, nz2, nzh, nz
integer(psb_ipk_) :: ictxt, me, np
integer(psb_lpk_) :: i, j, k, nrow, ncol, nlz
@ -485,7 +758,7 @@ subroutine psb_z_simple_glob_transpose(ain,aout,desc_a,info)
! that the same DESC_A works for both A and A^T, which
! essentially means that A has a symmetric pattern.
!
type(psb_lz_coo_sparse_mat) :: tmpc1, tmpc2
type(psb_z_coo_sparse_mat) :: tmpc1, tmpc2
integer(psb_ipk_) :: nz1, nz2, nzh, nz
integer(psb_ipk_) :: ictxt, me, np
integer(psb_lpk_) :: i, j, k, nrow, ncol, nlz

@ -122,11 +122,11 @@ subroutine psb_zspasb(a,desc_a, info, afmt, upd, dupl, mold)
end if
IF (debug_level >= psb_debug_ext_) then
if (debug_level >= psb_debug_ext_) then
ch_err=a%get_fmt()
write(debug_unit, *) me,' ',trim(name),': From SPCNV',&
& info,' ',ch_err
end IF
end if
if (psb_errstatus_fatal()) then
info=psb_err_from_subroutine_

@ -114,7 +114,7 @@ class="description">Each process has its own value(s) independently.</dd></dl>
src="userhtml0x.png" alt="psb_version_string_
" class="math-display" ></center>
<!--l. 295--><p class="nopar" > whose current value is <span class="obeylines-h"><span class="verb"><span
class="cmtt-10">3.4.0</span></span></span>
class="cmtt-10">3.7.0</span></span></span>

@ -128,11 +128,13 @@ href="userhtml10.html#fn3x0"><sup class="textsuperscript">3</sup></a></span><a
id="x9-6019f3"></a> .
</li>
<li
class="enumerate" id="x9-6021x7">Call the iterative method of choice, e.g. <span class="obeylines-h"><span class="verb"><span
class="cmtt-10">psb_bicgstab</span></span></span></li></ol>
<!--l. 365--><p class="noindent" >This is the structure of the sample programs in the directory <span class="obeylines-h"><span class="verb"><span
class="enumerate" id="x9-6021x7">Call the iterative driver <span class="obeylines-h"><span class="verb"><span
class="cmtt-10">psb_krylov</span></span></span> with the method of choice, e.g.
<span class="obeylines-h"><span class="verb"><span
class="cmtt-10">bicgstab</span></span></span>.</li></ol>
<!--l. 366--><p class="noindent" >This is the structure of the sample programs in the directory <span class="obeylines-h"><span class="verb"><span
class="cmtt-10">test/pargen/</span></span></span>.
<!--l. 368--><p class="indent" > For a simulation in which the same discretization mesh is used over multiple time
<!--l. 369--><p class="indent" > For a simulation in which the same discretization mesh is used over multiple time
steps, the following structure may be more appropriate:
<ol class="enumerate1" >
<li
@ -189,16 +191,16 @@ class="cmtt-10">prec%build</span></span></span>
class="enumerate" id="x9-6043x5">Call the iterative method of choice, e.g. <span class="obeylines-h"><span class="verb"><span
class="cmtt-10">psb_bicgstab</span></span></span></li></ol>
</li></ol>
<!--l. 391--><p class="noindent" >The insertion routines will be called as many times as needed; they only need to be
<!--l. 392--><p class="noindent" >The insertion routines will be called as many times as needed; they only need to be
called on the data that is actually allocated to the current process, i.e. each process
generates its own data.
<!--l. 396--><p class="indent" > In principle there is no specific order in the calls to <span class="obeylines-h"><span class="verb"><span
<!--l. 397--><p class="indent" > In principle there is no specific order in the calls to <span class="obeylines-h"><span class="verb"><span
class="cmtt-10">psb_spins</span></span></span>, nor is there a
requirement to build a matrix row in its entirety before calling the routine; this
allows the application programmer to walk through the discretization mesh element
by element, generating the main part of a given matrix row but also contributions to
the rows corresponding to neighbouring elements.
<!--l. 403--><p class="indent" > From a functional point of view it is even possible to execute one call for each
<!--l. 404--><p class="indent" > From a functional point of view it is even possible to execute one call for each
nonzero coefficient; however this would have a substantial computational
overhead. It is therefore advisable to pack a certain amount of data into each
call to the insertion routine, say touching on a few tens of rows; the best
@ -209,10 +211,10 @@ process and pass it in a single call to <span class="obeylines-h"><span class="v
class="cmtt-10">psb_spins</span></span></span>; this, however, would entail a
doubling of memory occupation, and thus would be almost always far from
optimal.
<!--l. 416--><p class="noindent" >
<!--l. 417--><p class="noindent" >
<h5 class="subsubsectionHead"><span class="titlemark">2.3.1 </span> <a
id="x9-70002.3.1"></a>User-defined index mappings</h5>
<!--l. 418--><p class="noindent" >PSBLAS supports user-defined global to local index mappings, subject to the
<!--l. 419--><p class="noindent" >PSBLAS supports user-defined global to local index mappings, subject to the
constraints outlined in sec.&#x00A0;<a
href="#x9-60002.3">2.3<!--tex4ht:ref: sec:appstruct --></a>:
<ol class="enumerate1" >
@ -230,7 +232,7 @@ class="cmmi-10">&#x2026;</span><span
class="cmmi-10">n</span><sub>col<sub>
<span
class="cmmi-5">i</span></sub></sub>;</li></ol>
<!--l. 426--><p class="noindent" >but otherwise the mapping is arbitrary. The user application is responsible to ensure
<!--l. 427--><p class="noindent" >but otherwise the mapping is arbitrary. The user application is responsible to ensure
consistency of this mapping; some errors may be caught by the library, but
this is not guaranteed. The application structure to support this usage is as
follows:
@ -271,12 +273,12 @@ class="cmtt-10">irw</span></span></span>, respectively, are already local indice
<!--l. 448--><div class="crosslinks"><p class="noindent">[<a
<!--l. 449--><div class="crosslinks"><p class="noindent">[<a
href="userhtmlsu6.html" >next</a>] [<a
href="userhtmlsu2.html" >prev</a>] [<a
href="userhtmlsu2.html#tailuserhtmlsu2.html" >prev-tail</a>] [<a
href="userhtmlsu3.html" >front</a>] [<a
href="userhtmlse2.html#userhtmlse3.html" >up</a>] </p></div>
<!--l. 448--><p class="indent" > <a
<!--l. 449--><p class="indent" > <a
id="tailuserhtmlsu3.html"></a>
</body></html>

@ -10,23 +10,23 @@
<link rel="stylesheet" type="text/css" href="userhtml.css">
</head><body
>
<!--l. 448--><div class="crosslinks"><p class="noindent">[<a
<!--l. 449--><div class="crosslinks"><p class="noindent">[<a
href="userhtmlsu3.html" >prev</a>] [<a
href="userhtmlsu3.html#tailuserhtmlsu3.html" >prev-tail</a>] [<a
href="userhtmlsu2.html#tailuserhtmlsu4.html">tail</a>] [<a
href="userhtmlse2.html#userhtmlsu6.html" >up</a>] </p></div>
<h4 class="subsectionHead"><span class="titlemark">2.4 </span> <a
id="x11-80002.4"></a>Programming model</h4>
<!--l. 450--><p class="noindent" >The PSBLAS librarary is based on the Single Program Multiple Data (SPMD)
<!--l. 451--><p class="noindent" >The PSBLAS librarary is based on the Single Program Multiple Data (SPMD)
programming model: each process participating in the computation performs the
same actions on a chunk of data. Parallelism is thus data-driven.
<!--l. 455--><p class="indent" > Because of this structure, many subroutines coordinate their action across the
<!--l. 456--><p class="indent" > Because of this structure, many subroutines coordinate their action across the
various processes, thus providing an implicit synchronization point, and therefore
<span
class="cmti-10">must </span>be called simultaneously by all processes participating in the computation. This
is certainly true for the data allocation and assembly routines, for all the
computational routines and for some of the tools routines.
<!--l. 463--><p class="indent" > However there are many cases where no synchronization, and indeed no
<!--l. 464--><p class="indent" > However there are many cases where no synchronization, and indeed no
communication among processes, is implied; for instance, all the routines in sec.&#x00A0;<a
href="userhtmlse3.html#x12-90003">3<!--tex4ht:ref: sec:datastruct --></a>
are only acting on the local data structures, and thus may be called independently.
@ -34,7 +34,7 @@ The most important case is that of the coefficient insertion routines: since the
number of coefficients in the sparse and dense matrices varies among the processors,
and since the user is free to choose an arbitrary order in builiding the matrix entries,
these routines cannot imply a synchronization.
<!--l. 473--><p class="indent" > Throughout this user&#8217;s guide each subroutine will be clearly indicated
<!--l. 474--><p class="indent" > Throughout this user&#8217;s guide each subroutine will be clearly indicated
as:
<dl class="description"><dt class="description">
<span

@ -4726,7 +4726,7 @@ BT
0 g 0 G
/F27 9.9626 Tf -24.907 -24.208 Td [(lo)-32(cal)]TJ
0 g 0 G
/F8 9.9626 Tf 28.055 0 Td [(Eac)28(h)-334(p)1(ro)-28(cess)-334(has)-333(its)-333(o)27(wn)-333(v)56(alue\050s\051)-334(indep)-27(enden)27(tly)84(.)]TJ -28.055 -23.137 Td [(T)83(o)-333(\014nish)-333(our)-334(general)-333(description,)-333(w)28(e)-334(de\014ne)-333(a)-333(v)27(ersion)-333(string)-333(with)-334(th)1(e)-334(constan)28(t)]TJ/F30 9.9626 Tf 122.168 -24.059 Td [(psb_version_string_)]TJ/F8 9.9626 Tf -122.168 -24.059 Td [(whose)-333(curren)27(t)-333(v)56(alue)-334(is)]TJ/F30 9.9626 Tf 99.793 0 Td [(3.4.0)]TJ
/F8 9.9626 Tf 28.055 0 Td [(Eac)28(h)-334(p)1(ro)-28(cess)-334(has)-333(its)-333(o)27(wn)-333(v)56(alue\050s\051)-334(indep)-27(enden)27(tly)84(.)]TJ -28.055 -23.137 Td [(T)83(o)-333(\014nish)-333(our)-334(general)-333(description,)-333(w)28(e)-334(de\014ne)-333(a)-333(v)27(ersion)-333(string)-333(with)-334(th)1(e)-334(constan)28(t)]TJ/F30 9.9626 Tf 122.168 -24.059 Td [(psb_version_string_)]TJ/F8 9.9626 Tf -122.168 -24.059 Td [(whose)-333(curren)27(t)-333(v)56(alue)-334(is)]TJ/F30 9.9626 Tf 99.793 0 Td [(3.7.0)]TJ
0 g 0 G
/F8 9.9626 Tf 69.572 -29.888 Td [(5)]TJ
0 g 0 G
@ -4784,7 +4784,7 @@ endstream
endobj
857 0 obj
<<
/Length 7719
/Length 7840
>>
stream
0 g 0 G
@ -4801,7 +4801,7 @@ BT
0 g 0 G
-69.503 -22.397 Td [(7.)]TJ
0 g 0 G
[-500(Call)-333(the)-334(iterativ)28(e)-333(metho)-28(d)-333(of)-334(c)28(hoice,)-333(e.g.)]TJ/F30 9.9626 Tf 189.595 0 Td [(psb_bicgstab)]TJ/F8 9.9626 Tf -201.772 -21.778 Td [(This)-333(is)-334(the)-333(structure)-333(of)-334(the)-333(sample)-333(programs)-334(in)-333(the)-333(directory)]TJ/F30 9.9626 Tf 269.435 0 Td [(test/pargen/)]TJ/F8 9.9626 Tf 62.764 0 Td [(.)]TJ -317.255 -12.573 Td [(F)83(or)-291(a)-292(sim)28(ulation)-292(in)-291(whic)27(h)-291(the)-292(same)-292(discretization)-291(mes)-1(h)-291(is)-292(used)-291(o)27(v)28(er)-292(m)28(ultiple)]TJ -14.944 -11.955 Td [(time)-333(ste)-1(p)1(s)-1(,)-333(the)-333(follo)28(wing)-334(structure)-333(ma)28(y)-333(b)-28(e)-334(more)-333(appropriate:)]TJ
[-500(Call)-222(the)-222(iterativ)27(e)-222(driv)28(er)]TJ/F30 9.9626 Tf 114.654 0 Td [(psb_krylov)]TJ/F8 9.9626 Tf 54.517 0 Td [(with)-222(the)-222(metho)-28(d)-222(of)-223(c)28(hoice,)-244(e.g.)]TJ/F30 9.9626 Tf 133.518 0 Td [(bicgstab)]TJ/F8 9.9626 Tf 41.843 0 Td [(.)]TJ -356.709 -21.778 Td [(This)-333(is)-334(the)-333(structure)-333(of)-334(the)-333(sample)-333(programs)-334(in)-333(the)-333(directory)]TJ/F30 9.9626 Tf 269.435 0 Td [(test/pargen/)]TJ/F8 9.9626 Tf 62.764 0 Td [(.)]TJ -317.255 -12.573 Td [(F)83(or)-291(a)-292(sim)28(ulation)-292(in)-291(whic)27(h)-291(the)-292(same)-292(discretization)-291(mes)-1(h)-291(is)-292(used)-291(o)27(v)28(er)-292(m)28(ultiple)]TJ -14.944 -11.955 Td [(time)-333(ste)-1(p)1(s)-1(,)-333(the)-333(follo)28(wing)-334(structure)-333(ma)28(y)-333(b)-28(e)-334(more)-333(appropriate:)]TJ
0 g 0 G
12.177 -21.779 Td [(1.)]TJ
0 g 0 G
@ -27548,10 +27548,10 @@ endstream
endobj
1997 0 obj
<<
/Length1 2460
/Length2 17290
/Length1 2478
/Length2 17406
/Length3 0
/Length 19750
/Length 19884
>>
stream
%!PS-AdobeFont-1.0: CMTT10 003.002
@ -27571,7 +27571,7 @@ FontDirectory/CMTT10 known{/CMTT10 findfont dup/UniqueID known{dup
11 dict begin
/FontType 1 def
/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
/FontName /TJSMYH+CMTT10 def
/FontName /LTGWDM+CMTT10 def
/FontBBox {-4 -233 537 696 }readonly def
/PaintType 0 def
/FontInfo 9 dict dup begin
@ -27642,6 +27642,7 @@ dup 43 /plus put
dup 113 /q put
dup 114 /r put
dup 115 /s put
dup 55 /seven put
dup 54 /six put
dup 47 /slash put
dup 116 /t put
@ -27692,46 +27693,39 @@ KV
"hó·åï—/KU%ÅK<C385>ü­ˆ~0[°ø— P`CU¤/×ËÝãݘê²M3ʽïæ„Ëu²ÅíÇ‚&gk7XìñžpËïMÇŸîî²<>A<EFBFBD>ÇÆ{C%u‡–·‹Ñ%ÖÛ©|ÌV#GÀLߊb{%O¡Y3]øZa_W!¯l?÷víyf£*8ê*ã¯l4]­ù“¡e> zfÖ(½ìãY¡æ€`Û˜šóõ8?ÖH©PÙ‰J¸'.§dÚ°£Ñ?¨X¼¶¬ð¤„³û·ß*y!Õv4ý†8ÌIv 1²Lnÿá€<C3A1>÷<EFBFBD>?hF,CO
Ã2fn_Z™É,HcO†ëƒ¹ÚnÒ§cHÓ;›«¯ýô¥ n7ZB™žM]Þ%<25>“Ç6v &ó<¹ËºÇ†x}-`<60>{yq.*Za<5A>}ðôŒBub}Ú§a­ÆÆ“š<E2809C>ÎNh¹ Î\ÈëWKÅñè#”a<HÝÛþIæЯ<C390>ÁQ‰~Ù’œÝK9D¦µ"o»¤‹ˆ
} Lõ'ÉC´`>BöÛ³ä;yâROFË©^2ÌX1 <<3C>Ä)4ÙmT¿UûþÀ—dÕ¨4“ ȵ•À²©ªâc3þ…P1ØO\'(Ž£L¸?Ž×õ„á]J€{Ë||-UóƒOjk·Ì\|<³‡Jºùâu!I5Ÿ9Ù©Ûå_;MÛ™z>T÷ƒþ>K1ŸÝWî¤Æ^F:üR±6°§¦&beïˇM$/YýEêÔó±óÄüT¼­<C2BC>òR䙕æļx¹sÁþ¶pê¶ €…ú—þiÕÅëäPà/²ƒ´La5{ K
Šyóæo,F'=ýžèCn‰¤ÄÜxl<78>;`%mªwoðh`oƒ(Aê\•=Ð#ûTЇÊZÞ°×T6™ÔžÍPäH vçÉMcäãwVE<56>S"}<7D>”û£G“$6D¸£>£?¯…ªÃÖgx6O÷+ñ=|«Ídñæ2ËŸ·ò„;•l<18>˜¦„½ªõ <0B> <04>Æ«<C386>“9Î…éÏÊ¥1”v§`ýÏTÛb˜]úŠ^Þ¬šjÏ-ýYOCº=镹j¸I÷‰Onu&œ$iV¨Js·Ð¹^8½„á!?
6.Ĉ>øL¹Sh¡ $À;äÉóã‡ËázQ¾Žþú¤´
´A¼¼ŒÛì±,ÖR:Tôð¡ôc7²µÇ<C2B5>q ø3«Š*Ø.ÎÉ<©è<C2A9>ÀVõïUÜ5ÖÜ®ÉßËã£ö 8º ÓzЩbt¹pt$ì¬ý¶¢2{<­ÃÈMØÖ9*üëˆ.¢Ýnv€‡Ü•/·_*Q‡Šy°Tæ<54>/;Ù&Å”Í:m8DžÏ<C5BE>õÜ 2·Œ(D´Óîk_kÌZòm]àͨAó_ôµ6E ×ãÕ¥JÂð&x»ÎŒƒé;­r'<27>hô€ˆ"œËÀ<C38B>`iÎ%©Ûo'Íb™Í¨ÐÛþ ª<13>+ùÅ:ÿgß[×è-‘—Ú𞎣˜<«N
ð<EFBFBD>öƒ<EFBFBD>EÕ¬ '©WL^éöšþw=¬ÀpØÛ¾¨¦´ášÔ=•üÁ·¼Ì¾cù«•KGÓ+0%»Ó ydÝá¦ØB\ŒöäíL)GÜè@ЗS¥W$g÷Ð+,â|‚€'Vµ§èš19I2µ¦.פpŽÙº´rf—MXŽ±"2æX“¨ÉúÕ¢@ïuRïU˜¿óË•ÏÇþè•<C3A8>) +(!8÷êô5<>AÙwâ¹y͆'RaÚl¾-£áòÞØŸù¸ ½™Å­!ì4ÐÝÒ‘Á÷?pü†kÛJD n¼d.Þ¤¡ÃRP6N·¹2‰¾ÀJUnóŸXPû@?—Ò‡G•—ú¸tZËÕúÒyö¿nwúAXߟ|]¡ûlôû;f¯ Z6µC“»ƒA'Òdíóþë³cÌd÷Ñþ<C391><C3BE>˜c´šÆßM»x5“ì`ª:ô£ÒH„Õ·¶àÏfËwAur:€ £æ<C2A3>Rf¥?¼avÒª¬W^mxj˜ªök¡SŸÈšÅU YªãÊ^û1¶Sp¬Ó<C2AC>ÚCzVË*Ç P§­æ#kÎ}Ù<-BðÈm,¨)*צߔ#ýø´¡x|ÝZYQêöõÄqßÖâ]@Û;óß–Êý^c±#
›À,âÔ«ÏdbMØÌVS#1¥Z|æñcýÔ:2¿ À®}Ôø¿<C2BF>qds ‡Aq!€ÐÝŸó5H`®E¢p8º¾ç÷•ø<10>³s_¸N_$6(Íjt”ѧw=9€U&0d7R^ 4`7W½É¾‰Ò'ß3‘ö ,}SgaRoðr·qZÏÈ6¥ø¢Úo£
þ>DTîá2¦*˜KJõºwúnlR8všAZo`DLoô²k©}•äÉfÑ.w®¬iÒ а+üh†âùüß‚ÎÆI)uÑxs<78>Ù¦@w•&¨Íø¥†Ú¿žØ¦Ð¶IÜ­}h
A®k(ˆœC1<BúOž$×Ý¿Œ‚°À8 Ü9_LZX¿zÄ.Fì<46> ~!TMz·™d¾ -Æ»†¢™x§¬^ºwÏäžÜüSzw†A<>Æ)¾K9`QüƒŽ°^4›í¿[,.ø#MÊ&,¦ÈÇÁå3"_îšý;-SHHp¼FàÄ4ákÛCwTJZ×&Ê~<7E>þ>ï©nŠu
i1$mHL˜ó&X6|ü—ÜårH Ú:·Cå°ð.O®þ”€±5Êê6 œ‡"ஸû“¹Ryu(iàÇnê;÷¬27¹¯<C2B9>K€Q(€9‰Z«H¾ ˜½ÿÙÎÊkUi
f<>•çëÃ"ÈfM `üŒ3ޘʚ¨“KËd€Õ|äY&Æ–PúØhg?LZô Ø?f­|=YÐ r¶ô¬.¹r¤B<k·d<C2B7>Gÿ1õa<C3B5>Ðkqã8˜ÕkÇ«^5†ÈÆQ
áý$“þ•E⯨nëYp·!Ík2xÅwêÿãDÁé7™LŒ.î MpØVP—
v‡å¹OÅÓ/6äLÀ>˜‡¹)ež$<17>K"ò<2£³?8ÈAÑ«°c¯þðöcŽ½ÞÐܘJl  ¸£r÷~tST±¥<18>óÇí¿Lÿu'åMå\Aj§ˆ+Æ„iµ ¢5ášOô<4F>øG8„­—¤ƒoÍô§^'.¯l añGËú7{59êعsK$ÐL?2{0Tlè¿°YÅ„~1ü«kÚ1{SkZ­¬X¶®™q—,Óòê²RŠm´¸ù:ƒ®gÛPˆT£®ŠŠSÉ{—¬*8€õW2ãÎD¢]HŽœ}é¿S£?ý«¬)içB†Vî5Ä·4Ö)ÎÀ:Áø9W¢f…càs§;²‰*zJ©™A<E284A2>>”dv—r­hqÁóX ®cbÞíÓó<C3B3>&¯÷‘ÎÕ:šjm+¼ÔÀ[16dtW1ù˜êÄ«Ÿ}gNÓ´?öÜ'ŒÔÎÁR•ÇÕ„Û½dXlÐí÷N¾ÎnÄ')[î)ÔÞà<î_<C3AE>âÃ$ðLoyð²TŽ2îx ´ûŒºw ñ¦€Oo¨òÆ$Š‹]¨ùȾ;üF3«<33>YïoÌ3µõ
Ì Ø"‰÷ð
?û[m¦ÎzlX- Þ¿ÉRÎ…ø¨Ã ¬QMo=´ÏCmÇê`!1
YUû…µÝ#AÑÅy™ŽU¼‰ÁýZvæõ8~ ú|ŒŠ˜3Ëçsìÿ&ˤåèJLnÕŸÇ<C5B8>]?ZëžÊº}jšFšÿ¶ Ý`æ†Òi>{œŸô•¶G A-& K }(ŒëéÅâóx…<³æ¬ÿ w}c™ºëV 8¨9¯f…|<ÙžBG>]…Öæd1 :dm~¡ dߊÄM²o׃v¼á–%Û¿Y¸—Åäs÷D ú5xA¿¿8Â+×éê·©IIªá¼pYaààt!&XÀmEæ<šäÈ.Dô`Á€ÑŒ‡·ôZ¸(gÝVB]-ž‰±ãº<C3A3>tÃjcð<63>Ë!ük(”匀JK'gcÜ14ªcuö¹?šÛ;ÁoªTo''EÖ£¬ü˜"xò²Lé†_ =´$ŸËIc—çĉ•¨ ùWUî±Å"HꢟĘ<C384>s퇳Goò]kÛ/­<>{,]Gý£+™78&v£Xi:<3A>B,Æþ!Ñ<>ÍG"*qÇ„QŸÊ¨!24ý„óü_!¼¡/§þt<C3BE>¨þ"<22><>k?hì 0à°>ŽuÌÐ| zÕÕÃclÂŽ<C382>!u“Ã<>qæs©©Rë5ÆH$ÑôÔp•¢uÚYq<59>óŸX­o#—RÀ_\5Ýø_Â?!IgF)/Åeauø'ùAøVždàr¥ËïëÛÞ}¦Y'kÌÕf¸Vóu9 Ø!ˆpˆì£<C3AC>ÿàÿ·¸Ôù•e ¨²ÃÁSÕ`¾ž*kB<¥û¼W<C2BC>‰Ê¶Ý¡NÜΫ¸hkÜÓ:DR Éïí~óIÐ6]Dt]s²*\Î8±|ˆ—È*ðä£ß¯×‰lR˜ß½äs >kܱO}<§ç<C2A7>|Oœ¶A)«C Ç)Ê<>ã©BóÝÈà´™á©(t*Õµ×
l<> !2áN»/¥×E>`S®,RºQ#bñM,ÚTYb}+`Ç6¶Ãk†<6B>Ge9âÓ!ž6$?Ôì]hòJ¾«´.‡?ƒ‡Y Š¶‘@ŠwÔ°§Ødl<Gx<47>ÑB2@B/èTÖÛÂÉ1“X¤zà¡E‰ZùR2Q[‡£Ûƒe£™ —n¨ÆË"¶3·8ÕÍ$°<><ÃS¶EHXbMÕkqÏ;ê” ”ÔíÿúroÉÞ±]ª„Ò1JåÛC)ñ ËN„ÕžÈd
°}vSœiŽÁ½ßèÞ9ŒÜW&Pç·«t³è¨?䎓¥9_vpç°?ýny™«<E284A2>€6 W³Dê ;pžx°#…ÎyQ©h^qG¯x4Ý<E28099>u㎅%e§èÖ B¬Í\¬JF=ס<C397>7ã‡'v\íúùDmÒE =©, S â ëI$˜Í®Îʦ€ÆŠš1ŒéËpÎqÝ}3±I²éÖ¬C,Lv0ÖKÁgyÖC“ð¸†}müi˜°Š<C2B0>'øèÓù <¢…í ñ»‰isðÖ çU¢YŠ¨]@ßSWÆ<C383>jåE»3xIŸ cÛhƒ^ØPæ¯üž»ÛßÒ£“këÐÎ|¾<>ý`Du ®Éô£ŠƒRQã Y1l!ÊtÀw<C380>¦³ôöÐnWá>ð¦ÝÔp´t»ôègURÉ¡-¾(r _,—·ŒÖýnuX)"îV@.2*I¸/`>/ÿ™” ý{ÔV­9òªÊ7î >eÅ€ ïM—N­ºÍ\N#ÂÉ/ó­
§ð‰úL|$ö!dÚ JˆÞKØ<4B>}-T´æ×;¡«0_Õ,<2C> k‰ÉÃ>¾!¶:1êOSËêt0JÝ@ýuþGX“÷SBgc/ˆÔƒ N<Û^‚»ž9 îÇÉÕ”¿\”À<>ÆIŒ˜<C592>4j¸Õ“9½„<C2BD>kÜ ŽaϘ:ŠEM
P˜lŒe£ã+£¥¹ pkùë¶ØÉÇT¶l®^,XÀ¾ÝeÍì”_õUJ<05>€e@Çy¨}+”æb ø‰lK±ŒWZ:,cy‰Ÿf0þ\<>Î0ZÂS²üä»E>âû¸—˧=ì¥zpGŒ™\Êyª¾+[[øy§ç—ü ŸZt3Ïß<C38F>.°ãxciå•^žÉ;'îÚA<C39A>órMÐ<C390>Óו;ò]¨†=¿Ž8?±V«Ÿ·6ÞyÉÊ¿UþGF¡œ§-m4@ðwcÚ"é¹ÄVôÒμaU-È#Îåc¸Hd#Ä]EJ†:<3A>äI/<2F>ï¦ä]S0­÷¾Ìä_àÃCË䆄Ù<E2809E>¸œàm”ÇäÚù0 ±óW,Di$éyüw*Ë•c„kß÷•è#ˆ:G Žhˆjë-R<>Xvtªd?ÒX•ÀKaäkõZ|˜^ÌÉ2biBë˜Müâ²ëŠdÐ0F¿Æ(®glûþÓ†‡ÍIc“ïÔ™KYVž…:Áç_Ùg—7±ûêèúÞïµ.Àè <0B>·>iïî@3Ž&øÒ¯ˆ¼±I~ž ÿSMeÀÖÃBaåò¢³•=܇¹ O‡8G¯që¼ áA;8ÑÿÄa<C384>lUïûé`Îé½><3E>¼vð_<C3B0>Ô#*åA" (N<>Í?Yz{<7B>µÍÊZU'‡Û4.¬…"Q˜o¸ÏÁswaë èöœž:£7F{ *¯hw,btzdthŠð.}Ä˺Ø_p:\lGoû]v†ëý%ÝìïÅù†âJ4ª 7†¯<E280A0>èçYÏ=ì<>î}Ã`%WgE£
GuE»D‰ã<E280B0>Ô¥Âóñ;ïdœÏè<C38F>!”/Àó1ƒkI—ìf„YYZ-©ÄMiÊÈ]×þ$ƒ­·‡!ûr
LTºVú=Êo•È
Û½â˜ÆPäè§<>߸­xÞ=$ŽÏ-Ê6){wk(@øüáÕðOHUBù ?¡rl¯²éëú6cÓ>uÒ”½ŸIñh Õ¯­¹Æ½U}«zÚ$ß“¦$j ðW“£Bê¢_= D#0 ˜ÈExŒ”âZÂiܤŠI}ÈïÕ¯jÿW|ÆœÍÚˆMåyÄÞ-[ÄÌÙÓåØ…ªÙ Þ¥¼U$ÜbxÕÒÊ„&ÓPïžõzn<7A>ƒXAz^ »ë|YÈ:ËšpÅxSe´è´9k
Ýu»ƒ¤¸ÞmÚÞ D<C2A0>vâ¤äÆÞ
Õó”I¶èb×£~)©œbèXŸ²|îOÀ&‰g IÕ'u!Àª77Xñ*”() ÿ×ÎÝ¥}iTl,K½Í¯¾l
ܹ×P/…ú<E280A6>o=ûºK5þ)k¸Å9û ð,!P´_€ƒšù"£Æ#AÅÛ4ì¹l1CUêï_f<5F>E«ô¸ÉNat <20>u…œŒáóˆó¼Ï*¦Š¦Hæ6ƒùV¿Ÿ´¶V ‡F²À+ððDÌ™¸C~Zk+
´ JT<4A><Ê5Jŵ±E]<5D>Ì+D·ô>B‡™µœ8ÏË]8<>ÀT¨hØÙ'/¶!7…˜ë?ÙT¯knÓGÇáê »¤R—Õo7ìy><3E>À¬")Ɉ @aãÂÜN JÚÃ?Ô$O@_ñÆ,Õa4Æ€yüü@ ±Û;Ç`FõËëZvØÌǺֺí®eeG X­·õ&éÏeu`¸—ŽOä×£Æeh€Ìy¿@Ÿ“WÒ)¯é%uã7¦34T^¥„úvšh ά$· ƒ´—sú‡ÿ“¡ïvž¬,ôµÁÄ$ ºúë·“°xR¿|£î¿Ãó Ú,W<>]×¥¦ûÍ#0* 4¯ÿ¸>xÊf'…—FIc—„Øeøt7™Ù;e;¡Ë¯¯y ±* /òr3}KÙsÚ9¨ 6{÷ŒW?iöøê#ÓU¬ geV}y¶ï Ý¬LÓ÷ÏqùãÄ#nÊ<6E>ÒƧ©W“d§³1ªvÛ»âôE“¦õÌg]òÈeÕýÄqÍø<™ýRZÞ=~­²‡¥WôúÂyÁÈé4x*-Â%VÒVµÕ¶Q -ЇMÖhaQdÓ©y?<3F>fx“>ˆ¯é> ¶¾•QN÷[sæ€÷¦v ýó»¥à.ŒXý…p²ràu -Ý´Ÿ×+I^DîŒO ;6wùôçÛ‡ØüÂQ—FoAî8OÉ»ßþ¿)—û?êA=+(*ÜêíŠajL¼ï¾êîë2)㪼PªŠæRö*™Cšìã*±(Œ<>â}syXïqÃ%+8Çx.MÚ½4cU¤bðä÷€{3]ö*ƒƒs´ˆuSsŽñÏr{ªæAQªÏ*kóÓ.VÀ¾ÞÑ_a ;ýÐÙ\rßab¬2 ¾:GÍéO/Ã>qFÝá'à$5*:8Æ~K[¸ÌŸ/®çDh_%1ƒ}ÔVp}ñª#Ë\/9`ìÌS/ÌÚ |ƒ¯òÔVa؉šÏs<C38F>026êæž,G…âWd—=™ÝpH§oÌ×À6ð<2ân^×òbkÊ—µu!©ƒsâÔ³Íàr¿bß{vb)æß`¯ê7c<û­ƒGöN7€%è§6µ$½æÇPŠ¨ÑB¦[¸öNÃ/f ÂU¡@]k~'/_ú<útX4ŽG<C5BD>¶\Ú£<C2A3>\3-2»Š —¦¡øm8Ê œ/43ló”°<E2809D>»ªêˆVD 8¡½¼Aèžü<C5BE>€ÅAwçØSªSg:ÇÒY¥ø²—óà‡pµ´á£«ê©oâ·,>“ͧH7ÛáÄ`Åø"ÈoÕ¶÷ƒ˜NF^¾ÂJÙ<>}—-ýc½\ž¹­ÉsY(óA7È,™ýÝz*Öñ\ÖŸ¯ˆ_ãë~úÀ ¼|¸<>ñ
¥œhÿNNƒ9¨vG'Ug¸¨4ÅR1L°¹}¥ÙݷϺªä7œAr"²sÿå]DÌœáÖ*²˜fâ8>5ˆ#!†ô]Üù™J@oxžÀqñróä°h߬ÿÜÙÚ¹­ˆ µj˜ŒB˜þ <0B> ¯Jž<C382>•eŠ´)îõ5Ëè·71Ó¬Q^uÝÜ<C39D>\<5C>ŸÄ#™:<+ÈŠ1Ÿ¸ÿ38¹¬2ÉœØiB+WT^"a®×~Þ݆ëJÇ7ûXi`–ýù'_ý&²ïôïEÕg̦ËÌn¾ŸË3n “e<E280B9>œÅƒd¦ÓTÝÈF<>p«Öþ .2©Ä©· ?ÈÆjãÙ¦}ÝÉ °¾³jäÎXXcT¹7J B)ºÔNc6+Ö'ý¢dþ
F¨m©‡.]mD!±]ØÐâYp¸lk`ìÃJ‡ ŒsTBV´¸<C2B4>¶Ÿe<C5B8>¾œ¿ì¡½. kð£Û90þÐTô“£ö»ÔÒñ<C392>ÓÅʶ¢¸úûëņ¼¸ræØKj,fóh3ªøÿ2¸‰Àzz9=d=„ÁÒ¡<C392>¦9|˜¤õophg÷\©TI¬â6—ŒÑÃ’þÒ‹®€3îݪ¨¶µ§RTãµ=$Ê?ìåøA“ªâdß`UÆ<55>`Áߌù$ì{sÑ¥ * ÷.ÀÅV™ÿlyÈøšÆ<C5A1>K ¤jØfkè±ê œy¬úÈÁظëµ:w¥¾iÑÀï{z³½<>¨NÙƒZ]¡øŒÓõâŒd_‰è…"¸HJã?óíe`“ò¡:µ0H´-Q1“±vôØC¹”§ªt-T"wéý·)×µý‹{pδémF6©ÖùªgM_é´“Õ0(K(mÏ`ŒçWkàm•Ûyªâ¯<C3A2>ÿù+Ž0„ugÈI·¡f>W³
Æ…ˆÏ£7úÆ-ÆD¨iGÁú_)æut³ãU
"ŸÞ¯,Ô%ULÚ€bM!¡qÄxE~ÛAls.4•ÜðfÜH"\¸£Ô± _ÂwýgB™8LMLUyÈÞa™·sÚìš¡ôøj¹½ÒžÓ½‡¡ D¢Èš
<EFBFBD>7nO<EFBFBD>ºƒå<EFBFBD>ä´WHg~‰Ð7I'‹·
È·‹”÷íÌéß[MV§w ¶7€ÑSÏMR”šõ…4Æ;Èð J?¶Œ¾jÑ¿®J\ë<>ˆ7<CB86>ÁûÌK<4B>p (<28><57>cB¨3 ¹±ºÈ@³Ô_úzdx¢¨dURéë .ç·Ìº5m—s€¸H<C2B8>öÃIxIrtæ0Y"·tð/Y ºn÷.ˆYõ¹³÷Uù¼wAúYõ¤“Êž<C38A>a£ QI4s™Í·`Zq{x7â¢3K¨œÕSŽ6öFpJÅŸó¨Ê÷‰³`å‚ý×m,ÝŠ!ˆiâD'@).¦cîºA ¿ÞÊëÄöFkÃÞûa²G34ßÌLkubÕÝuŽ`—µwƒmS0á-§û®.Þï)ZˆÄ/Ô¥ñwhC
M-¶.F<>Œÿµäx*Ièwìï jå¿ñOÀ i㟧:eȶIêÅ¿:ÜŠHúݧ-rh\ï'ÓùÌR¥_TÐþgGP îZŸö<>ÁqæuSÛAž­§…³AÖñÂ2ò,ᇉ–^ϦO<>¹ðÒM³<4D>w6”BûIxöp²Dðy,Ö4™ÚÕ“ÏAøG½.þÂWA'R¿(ZÕÇ<C395>h³8Ï¿?ŠÇ3'„ªù]érmRKbw`wóóBSv£g‰MqL&"d4îßÿÔEÔ(ýÄ{Û´<>qt¡f[A\ªÊ»t1ÇžÛR<C39B>˜Ry# “dE‡âtÞúµju Y‰¤*2¬Î?°….T°ÿ2>G”íº«vwtj3Ň^!E÷3Õ廢XUZ _|lï±ï«m«E_ržÄ/ª-ϳÙ½Øë'ÏÕI¶ÊLàRQdÓ[<ásöŒ }û6cͱè$—ù<ÍÉw±x±ÐÊFÙVc$h»1Ùƒ#9×çáË "§+^t¶éŠ¡¤ÿØ<C3BF>+M_êv+ÿ<>VG10<31>>âaþñË´T®ô•´ °‡ñùC
,ÔOjÊŠb¶¹?×:m~¶—U¹<55>]†¤^Eù_âJÁðê cì¬ÆçiG·:ôO¨—K<7F>´Ã¡]ÚQHqûçz2n_yÌÞ#u®B4¤ìoXêLÇ7:nÍT5úF÷µÎ×—ˆÓ)´ç„L81ÿC“Å [bPˆN.ï™u{‘®œ<h„X(¹ûMƒñ·7=ã8Ró^:I ¾<><ßsGU1ýc$b Ô<>e]´²)+!,Æcu<E28099>¶7ö#@`|l÷@å(_XrWƒ0Ât-œÖ:­AœnpHΣ̨Œ,ÕÖ2ïy០EÜQ÷’†€=<3D>…pXuà‰6;,Ï<11>Њ¿¢¸!ôÄ꟟]é„\·"wð¦N~µç ªÓâǯzé;.ñqÖA Ý}»Ñ¡Á@b™éçÿ¤m<C2A4>„Þ£Ûú,ÿeµ<C2B5>ÑPÞŒ==VU<56>ÁE<C381>ë~ZJŸ×i±^0,Šh+µ­í)Üæ  {È\âÖ_h$%ñ×É Y¼£"^µP qŒŽ—Û`
šÎ î·›ß ~&‰vÌ%|ظE8V¤0qàÛ7£Ü¦vkQ==§@ø‡&´þ4€À».~ÝOªóÛÕõ`ÁÓBÉC"î™demð<9\Â{Íqêz½ßEà/íŒ<E2809A>õ&¼!ö/i­!á'§oIí¡`!&]‡óÚ_åˆæ¯lH{D_§{'
˜ªrà¨1“ËN ]õ•»‰gžFtñå4w«èjŒèþÊ`uø[†%2<Â0”¾'Š<>FÏ•Äh€*ZõŽì@x@P”«R<>]ÛNêVl¤ë¸Šbv¿þ Q8ÎѪYЪ¿mÊÿÔ·¥öOð­ÅÉÂ팇ée¸ýljNÎáZ˜Žn1¢ºü'l`-²£‡çEâ[¹2+y´©´moŸR·WÅô ZÊ9Â\
"uÍ+ò2ç×)¬n”ëaâ[ë™yçZ_R<52>|µfÐ⤲Å0[0\)=8Ö\õZ •6ˆPBÒHÏS«%®3dÚ[-ácÂjë_[ïôõø±Û#<23>•HÐÞ¾x̃öŠ¾‘â|À³üðLvÐ[ö¨´ġñ´s“²/ÓòÚöç~âîCʯ¡L¨@µ$§L*À‰†wUúh¨n{#aŠD0òð>2eá¢À÷ÀÄ$ †^%°ú8¦<38>=¯%Iñ%žu-^"mÈ.¤Û¸~<?024œ|åÈߨ{Š©Jg9z2(ñç[U7¿Ù~¿5<06>pë'ÓC¿4Ò|©ðÈU¶I"¢ñD€8{¯íÀ G¢µ>Ð:k@ju÷…¾c£Ïëd´"k¤Dm¿â†ZûÏÙ±˜÷TMcí"GÎÏÎtd$.¹<04>Ù ¢$ ¬ *ñ/éa+±wz£(±üŒÔSNNÇÒ4jUí@®7K‡Ìu7$-椟xP€‡ÔUõ?¦ÕÄÉÂû²ûåïÅv§0&T­ ÙtÞ8'þùë9=‹º=̽ÀE²µ‰'Ñ€¡l>Óöb¾è®ÿdï"}rÊûô<> hC¢A”•i\´¿Ž88¿¿Ã;B8¼ŽRp³g¨FaT“9µ•¯%:$¦é+§Jh<zSõ
6FáÄ“œñhv¡b L-](¿**œC,Ïâm ! ä- î Wãà7ôœ!FsX[v³§1(“jJ˜c¿ë6¸Fh¯Kg…žÙLªMë­Ž¬þ·—ÿ(î [ÛŸUò<>zYÑÀ{r{.ÊÀ}jÞñæ„M§Äã¸é¬¦]넆É*B˜ÝB¦~R>n¹ˆ Õöߢªñ©û¾×ý†&ê[KâÂ4¢5Ç?ø‡ÛR<~cù­¬ÒòL½Ùso»øóEópdÐអػTÝ°ÝÆj\#…2 ¨ðØšÝFâ”)ü^ ¢¸5à.6ô
 Ø4¥Ý—ÙŠ3ÂJœâ<C593>ý)åb·oß®k Á<E2809A>@IÂé¹<16>ÜÈÃ_wz  
eÞòHÔÀxwœ.¹=lÞÐO:ü¦Ð‡(Ú=•­V{/k?¿IÉbà"ï9çºRùd³Êxq¡+'ͺúíïšh®'ˆ¬Â<tX<74>4 Frtª¤Šl™ë×\#7;Êx¿ŒÙ)<29>|*‰kÂI o?Ê‹Ì&…H4  ¥uÄÉ•ç:éK2R6êˆËkÍé %X†ÙÚçÈm‰ÈU=FÎ| ùS >{í1ŒÀetb|Ñž¬™!ðÕݱ
s£7ƒæM9-‘ùÆìª@¯Ð®R³±îB#„:Þ‰À×£V÷ÌŒÜeƒ¶üUw²ÚÄ¿J·"™1 ×C±W<C2B1>|M`¯/ˆ©ïÑÕn­Æ$è”õÎÓÏw³½íÎ_<E280BA>®×7SŸ£¬›¹¿ `²Îkss½Þ‰o1½,ÈíÂؽ­IIøßÏä<C38F>ŠÁÖs>9y U.Ï&†²Ë<C2B2>ï:Ü.mQG-+ñ´NêÌM¢91
Šyóæo,F'=ýžèCn‰¤ÄÜxl<78>;`%mªwoðh`oƒ(Aê\•=Ð#ûTЇÊZÞ°×T6™ÔžÍPäH vçÉMcäãwVE<56>S"}<7D>”û£G“$6D¸£>£?¯…ªÃÖgx6O÷+ñ=|«Ídñæ2ËŸ·ò„;•l<18>˜¦„½ªõ <0B> <04>Æ«<C386>“9Î…éÏÊ¥1”v§`ýÏTÛb˜]úŠ^Þ¬šjÏ-ýYOCº=镹j¸I÷‰Onu&œ$iV¨K)¦þð9æ!x”ŽzÙ^¸ºÑålŒŽû£ïÅ” ŠÞ²µÙ|áEóhp<68>?èz‰ð…½ª¥QiK3WZ æ¬>™S†LV¨¯DMûj O<±³>qcá·sïòäB<>º@æ¯?È<8IŸ¬íô;œmÛT }uå_.>)Š®ÀuÆÑz ã¯k: \ý"¸¡ÿו«ýñvêSÀ—A"Ÿ. ß!Þ䳩ˆŽÒ¦ÐMèn mßøcø°ôlª¹w HÖZ<C396>.<2E>Ê)>J¦Vö؉<C398>+<n¾<6E>â^N}2ñ§NrgEÕö8€)È4:u&ÓU—‰3VU&ãù<C3A3>ze w^ÈfIÒ¥¬gíY C`öÕ˜š9Ž G¨ÞY7¥—I¡¨EúnDQ…âõaÍB¯8&ÈÂq•”¿yšÌÄ™±B8h³ªþIÄ!ð|‰
% ‰ëjì¦òV>ð%#· ʸ¹ÏpÉÝñbã<62>Ãø¯Çx=º†¤¡€õ‰ÏÂxó™%Ó|«î)ÆMûÇ=<3D>Èç »JÐàpYાÁ‰PcüåXôB)ßUW+ôÏ­ØŸ[ͱ^hˆ¹˜À<CB9C>¯8ø©òîäË¢ãI+ÙãŸÆÕï5qö“ßfÃikMuòf§&!¿¿9.ýš·S&H&mÈ8Šb6oq:MHý„¨ƒHöH¨"'í‰KUö  ™JísW/yAOÜXx÷ÂÌsA“öï<C3B6>͙Ȕ jbã0åp§9;õ@œcÁNÖ2V¾€Ç$Å[5$(i‡é¹_Á<5F>æÖ<E280B9>7yŒø-ÛJbiõ³$\ØuFõµ)7éXn¡e¯mŠ¸'n<>Lô¹—SÊBž$¥I´ã<>Åiô) ž´©¤µ•øÃä<C383>¨àênV™Å'ê«wæ(MµÓØšµJΣ
Ê­ £Ì~ªéæ{nN;B×Dß󃚼Fû³´:f~bÔk?å‘Øج¡¶Ô°Óº8w~”ø,eS=k·Þ ªn#ò±ìšñ)5´ÒŠ€£vS¼HlŽ"qj0<01>å£+2áˆÝÍÍ•ÙO<C399>jÎ*<2A>ãÖÇp¿!?„µ ¬GÜ!5ÿÃwœÞèN†²¢UÃÙ+ŒuDeX*‡gFO¾®Caoc[ìe´“?Õxh™Y¿4ý¿˜a¢ZK,û°~,xÏ8bˆ!×<>Ã~p¤Kš5¤ªÓIIc¹ió¨E#Œ¦i h Kôwßî hy<1Åîв_X—·««®RÙó1_ÀÆ:r^ˆÕz¹D<>ô/Ÿ)hŒ@åîÜ<C3AE>0Ñ¥» <>¿C6ùø'å5€â
¯©¯'<27>ŠDC(ص(ç!¨,Û3¯+ÍÌà ]F8K˜ÁþÜž­<C5BE>À!<21>­Á5¿dmÎŽ÷Îxß=§l…‰mn¬²hÍK̉<C38C>AhÞæÉN„ÉàY{-Ý ÏÝ*”Iîò+îæï•A,O¢ 2-ko̶²ãÃU‰Â€rˆ€</,E|]f÷BîŽðÁ\A‡µ„!¥ÊüüÐ#£÷ËÅäJMbªQI¥ûBº
ç9X:liÕoeyi<¶žX7ün
긱<EFBFBD>¡üRåî.»u‡Ó*…ãzàõ;MG"mÀûYÐ'Ê2ì“lB|ìwɧòºìÈáÂ4ÙêfÛwäßhǺé¹/ucÿÔçe³ö*Bfâ:óT*k¨‡BÁQË IÙqêÚhùò}c3ëßÐ!tM×)·.¨i|†+,ÖMÔ0˜<11>2R—͆þÜŸÒÞ“ k>W³Ù¢×"±Ûé¤:Š¢V2<0F>ÚÎaî-qWYçáã(×1š¼ß¤¢äh1‰I …<j´ ŒáÍ`|ÉFŽæØU¦yŒïJ©N&ÉeΦ>îç
Ï’Ž¨Bëêê¨Èº…ÝÍ~dž—\e.TD륕p6YФҕ0ó¬÷ "®ÈÜfh*fßo%H”ÀÉ#…~ÿ‡=¡w[š¹ûÆ1)-<2D>žª.ËU÷I9ó­ð„02óìAœdöe¿É„WŒ¢P÷¾
>³¦ªIÙ]ßø¸ ÒdZ±FgÓËÀû»3"|¯9Õ ¦š3ÙŠRU-Ëà}ªÒà<C383>&TŠ ï! ÚŒ17 <0B>Ÿc½b2Ð…&º©l Þ¦WàÆa<C386>ìXm¿j {QM/ËT2DÙãÇ( ØG±ÙÆçâ-ð.Éô•ªc_ç)#6-¤îú )W®ûÓì$<24>qzEGãœ}^íë½´ìØ%©ßíÛÎKÂ_ŒËÊD$û/Œ„µS'¦°yù¸|OéÏl~ß“ <20>ZpÏ#o(H¯XðãõÐÑ/D±Ö'œnÄøµX{¸{cZ/»ÅÜ¡««A M&‡R½œûG¤äþwBfÝå`w—ïív¤è¦$ù4ìò9K»„ì2ùø\øKŠ¯å#2#Îõ!µoªÌÞw»j_ÕÈAÿQ Bñ!ZI‰ŸžfÝlª!Äh<8ïÍÁNµ èÏæ†ê`®Â”Ï<E2809D>ÿé#©·Õiþ2×*9BŠ|²{óIÛW<C39B>ŽÓíÛZåO.Ÿ£NNIÙ¥RôŸg¿1_¡èÐÒ™5Œ=ýc¦§ÛÊO)`<60>ZSûÿÊïhÅYYçAΓJZ´¶ý<C2B6>HçògwÒ§þÅÌ~*<2A>¨=Ž°…·Š}œ®<ùOÁÕá-ÛíƲ!´¬ì1•ò½ÏèösÑ…ù—Æ×d ÷Ò‰Ïi¾í*ÀË
‡ê ?ƒYèþOý8”Pñž`+¼ÇY>E©ÜÂ6ôøüeaª6è§<C3A8>ˆœè¬Æê-®.¯QYû«lªžiî 5cñ¥·äìÌ~UìÆ<ñ9,
ÍŽ®{ô¼…Ÿv<C5B8>*Àašx¥}¡Nâ}¬)ÍÞJV¦ÂráwZ<æb_zi»]#ˆ¸1‡š«eÅ¡½82§½VmÁ¤ôáuKá±俲÷<>È&§ö ù|¹ÿÎcÎIˆŒÑKå§ðäé@â<>QOÇ)lb
WÛ8 wÇ7pîÃmô=µì½Âì™IÐbé- ¥º(1—Å<woÜg8p+6p&«>Lmó£x,Y3Ìc™$Øs!„Á"e†ðÑ5¾‚¹ñá<1E>sÏÅ•.¬¨"8(Îa
]bWvX§¨?G†M$tpùZE¤Á¯¥lA ±}gýdz†bÄ|•?yžsgDò@F_
«ï5ZÍR,ª$“-hŸŒæ _éʱJàÀQ íeêÕEÌ®_3Ï¢°¨­Ã 0QŒï±Ÿ¢E‰îG§=cç=„ª5åë]6&n6¸gÃÆUÍœ8ÛÛØÔªV)~k{'V¤T :Åd€ÆLLæm²8NÅ<>é9l(;EiQlâ0{Ž,ÞXúA$„¦˜æ¸<>Ðêj©xꀡJ`?“=Îå(þˆY·b<C2B7><62>Ôïc. Û7œÛÝlJ ëÎŽ€ybe¤,ä¿Ï[²VºsÛŽãŸ)ó3rÅ3²´Å‘ÞؽLuªNWÝÚ«¸~Üã»çøsLus°³<C2B0>Ô˜|¥Ù™÷g[ßÂÏ÷´² D˜RE-Ôî<>-0]Ð5ãu‰îbR³/#N®%pA'®0…†×;Â2XYÒî%d¥(®&“8·n¨Qb(÷Q]çÖW_" ìs»ò6“/ª$\Nií±ŸV¬Ú„¹èÓp%u£«”ôg¼Âë¶KѶð6g·ž€Ÿ_8Óu²œü?ì‡RBc l7L»Z!)IˆÃãdgiщE9…(~ÙŽà” µO3ÜX Këð¨<C3B0>³ýhËë_¶Ô:h6<68>ó`ó,¸Ì$Ñ× •ô’äÇ­ÂØ¥èôø#j x+vbØÿuK­YßEX| ¤1Šß¥¼³!Gev^J[4=Ÿù† Ô]g<>€iôœÑëÓ|H5΄ДÓñH×ñxaÀ>Sµëm»ºÎi †®òW}'<>À“´ñsX­SÈAàEiÃ}ÇFê áÅ•- pŒwQ‰×è“ZEÿr²Ãb 4¨>-<00>âÐûæYƼ™x‰@ø@ë *+ gæ좮§À
ùÀ¦BëŸé äÔ!YR/ôŽÊÙ_9ä#U´%S©ù¾Uàý)»Ë˜pvät˜h·a._àb“ zû-©œOš
fy&0^Æ‚¶"ÃÈ|Wi$*¾Á*ãàOØY ª‰N}QsT·T¸íÁ©ß]9,úç3ήƒ·[¬½[-W0Š(£L;ü&}•®°ãåi)=ºMÍ -UȧØþà0> ðQ¥k ¶3"zN*òm4¿=ö
#óó-øXf<>„Í(¥¯ˆP¡úy༠ÛÿeGzˆi¦b´<62>7Fc(%%ö Õã'?žz"Ë E€Bd”½bÜnn0÷š¨ö¨ï`E®\ô´ÏgIúæuw²ÞD*{téÂiK'hP—¿ô <0C>¨•Ñ®ÅSÕ9<39>#+ùs³Ñ„ûuå<=¸<>ÐMÔ׌<>¸æ~,¢é{LÍÅØ_$p¹zŠiμ^üÕâw8îG¸Ùb`ôÑ<EÔ}"öÁ¿7XóªakÒÓ<C392>X¡(šR
FO“Bˆ®Vüùøa¨DU—% <¢ø4.ÝK¹ºÕo(¡:ù®ƒe:f|ß·.ƒÂ<C692>hŽÏ(üº%éƒûä<C3BB>+f£ªÍó>D‰ÿ¿pm½³Ùó›~ׄ“·Fk¥Ÿ ùéÓαžëw¹tCÿ?<3F>^þ?ÜŠyTä»A{CuÂ@+´q[<12>0XŒÂªfV/¸ÈÝñì…ÍvAm<41>oÿó<C3BF>+n;.
<EFBFBD>ŘKm²È¼ÉÀo¨Â"±Ý<C2B1>B1ÜV„l&³¡E#µ^êÜ2!¯Ü Ô5¨(û<>Êûÿ³K%ŒV°ôŸ.ƒòåu†÷ã9"ž±+ɘ¸ËH¤¸‡ UGè;$ ´¥Ð¢ ¤ÿs¸l~b•U¼pß:0¼gï/ÀéŠ+†ÍŸ“öºåPƒh¬ C{)KÕ`][bíY "Âßâ»{ ­­Çþ9Ô²¸F1&ð•R:±)<29>WQ‰t}ªâèœA즕L¤Ä«žk]ÿs”á<>Œ¥¶ûâôOÑhàô˜?É8óŠxY i"Èð°ðUú7%A„}SˆÜÅëúÚønµšTôô²ÔrÇ<72>‰1£‡=gj>0¦äa`Ùy“ÕØ-W%{¹@Óºå6ûw.,[q f ¯ñJŒfK,y|þÆ©f!,¬]h½ÇÑN|²«~°b—À|Diõ¬†(MÊÖ!á|ò0 7ºº7Ú“Ï5Š¹ü<C2B9>tö-ßRV²&BÄÞËÝŸ§ínJÕrOUÅOn•ê˜säE}OZ¨Ò˜l"¿)„e1*J6]#úŒÄ‰Þ¨Nyãì„S»$üù¯gzß ¾½áfglááì$_ýÓ×€ÉUi1ôŒæzc Ò<>ÁœÁðwVgwŸÕ쩵JožÝzêÈ ½ñÙ@öÿÕ$ Æ“ò ¦Ù„äˆñg jVß9Ѥ+£oˆ¦<?º¥<1A>†‡Ó.#ϳáo%†Ã<E280A0>þcéøädÛÇ<C39B>ÿ ;À»c©÷Cå-™^-ÚÞ°N~::1LXƒRˆ¼ß)<29>°ß¥‡Íxi{«cÅ9³LÇ~?P>¿Â•àgfÔ,ôVv!uªŒ/H[¸"Z ÀI…Á«,zûýiëé¤H°ØfLÕMêfÉÐ “â)ùEÛó¡€ú>Ö,³3l=œem)=R$U£uº3™ÑèGÊÌ•¾~gIŒfç™­•°ÅØSEqhÒ»!=iŸz6w¼ÄðNT²¥ê˜<C3AA>Ä;@V€wjx˜´³+yÇìá\~tÖÜ%ž°¹·Ù%6;ÕŽÕ4Q=ÒPD?8mIl´EüøدÎIÏår>”?ø^aò¨<C2A8>/(63eòü—n ÌT1,ÓØíÅðdcŽÔ ö²jÞP}Ð:‡èkÀÙé:¶E2¸°ðKHNž¬~àL÷/}­8ÀNœ;¿<>~¨¹Ûê£YñeèÞHŸ¡HzDuv*ÖŽ'ZHzZ`Btµ(":ŒÒ¾½õÅl+öº4j÷RÕFë)60!ÚÍ+ˆñbO†5žÖq@“ªÓÍØÄ7khíìT<00>ä_:Xª ÔÞUu)¹h7ù©b\\$¶¾Æ“èê 0Ä-¬D¹éôÇ}Š³ó¬Q©5$>?*Á\Ë“Á—þ®¬»²Þ9d‰tX%7ë¾&à4³gF}èºÏªÌéÏ@#ë_¿~‡Û½g¯Q!®Àòá°w"ÂM„G sPÅ [æŸ1WÇöòêsÐ7éSûÚ½µ¿bVZœ,Sgü ä5Üšw_ð·%Õqö;ìu~<04>‡û¿"íã¼ÿil©èNfû òSÜ7øþë:<3A>ö-J"É›ƒÎœÿ kÌbb«ê|¨»y*<0F>´ç Ä°<C384>‡/ÿJ$þ5öØÜë<>ê¾µ?™,ÉJôòQ”õ1!7xÎt“`<60>¹O¤)<29>ŒPPÍmÞ¾ûô„v"}÷¡ß°ùÃîVÍøçp$J´¤ !Q?bh#þÆPv—EŸ ³]-ÐÊÒGå\±<>ÇÚ{LŽ:_¤<5F>÷ALk0g<µ¿ºŠt×û±WYÚ/åêÐÞMm^ò£~Zòþ_Áࢣ'aÑaÛeÚ§w §F}I3öó}—<>…É·¡ÎY“B¾<”Ÿ¯–5,Ô
æX§™û\kO•4Û·p
N©6„ºÑ<EFBFBD>Hªä<EFBFBD>²Ìäf „ÒÕ8¤c¬ý5S?n"·mb»$<24>d<EFBFBD>!oʶ*®Ú÷¢/$ÓR[XUð™DAGaGƒ“øê‡3‡v<76><E28099>wX¥éEts*ÃïËGZÛeàhbÁˆÄ¥†¹Ñ,¥¹ÎÕV&õz<E280B9>íQ}t]º<><ð\·œÔÓÂôºI|÷:¤ê´Õ}vƒæôÂKãá=˜x)ÌÆ0<>ù><3E>:ÉøÂvÏ[aMæHçì“ÄV[³—€¨&,(EÁò?¬ÔÊmK-\ï—Íyט1<>…Nî´Kö(|[¦\í‡zç©¥í]¤‡<C2A4>#t ò zè~XÞzæwǵ´Öœ¶gˆ†OáKPbtžç“ç寓ù¯«ë7$ª36Mz|ª{í}5‰)y(Ùù>qP*¹ óÙoÏ;;ŠJkVxÉžzÝì.¨<>©ÃÁ<C383>2<EFBFBD>Ã<EFBFBD>Ü؇ÅF€Ôm6èmœy|s6Óº±SÃ×q^y€¥ÊäÆ×fÍ¡²âÈp&õ8¢~¸6IzTÖ!ä<>:•±­AΔ‰X°Ï.º2K§+X <09>ðÊŒ7¿ ¹»äíFƒ9MoÕ<4E>ÐñøW~¿ö+uק<C397>·¨Ò”êO]ò<>â
äÎ\ÀøPÙ/ÿ׬-kt†|eþ çɶGù µÆvëÜëyŽ+ð*Ù˜9UwF§«2‡­Þ<ÈžìøÖÀÚç4Gu<47>¾¼ª§A˜îèÐ<C390>ò€Q(³jxQúb <20>O6K _"A¹µâK¬¼Ì+Ž“<C5BD>Ìe EpC2sÂþgí˜Í0½ÁëB\…™ˆžügTÝR<C39D>¦Be]¡<> ¯,Bàè[T”$ ~ñð“üéô¶rU|ÍÌBr8ïÐϲÌ׫bŠšGZ8\Þ;ˆe­ðKÂw8¦×·
È£9Ä*¯ÍV¶¨hj?m.Fëp˜†$kC™EI/r ÉNÍÈ BœîxáM¤&ô¢JFÿ
«Q?anÔY3˦|*<12>ZÀðÎMÓ퇣¶egÔG:r}ýfô(ºót ÙŽ*Ñ™;×½~õYA KÉú·ÏB+×sx¼haféW!ôtx“XN€ï_[\Ñ2{®<>†Tÿ÷D(IN\|:zg
†M|ûº½?¦cæs œ&r:Ì,£|/PÇkþ^%ÈZ zÞÇ&;M/)Žðí< ¼Ö(=¯È\¶ms?Söa†4Ê(q<>ˆ†W­Û%²˜0j‡Aª®õ໲<C2BB>ëžH={Dˆ¾¸ÝíÍ¡Cêi@<40>¾S×LY<4C>\ ªÑßLÕ*! $wZ։̕ñÎ'—œ<0žg½rDjò$M~!U!«.˜ßt»<74>zgÐPžÏ1¢s§¶Â}ÆÄ´»ÕdÞ{Âq~¨ vÿF<>D¨äˆœúe\_s¶Jb$îr*åkÛyÐÎ~©|Ö5abXýÞRq.Rr´Ôÿçó©Doª¸ºôŒsìÓÙf ά23Gp¿?À hA®3B×M9ëœ4
<EFBFBD>((ì ¸ÁoÊÞŒŸí˜osÞÏÞå=j(:@J¥5 v+Ž-F7€È~MÕ²véÍ×<>ì7‰1=Ít<C38D><EFBFBD>ñGòÄ_¾HNEzñNiKï?B­xºÕÔN¦<4E>p-Æ<>P•¶Œ©£òEJ9Él kWFÝâ® “ÉKß2 ½• ?…ÔÍŒ¤[©8/Ûmú¼N%!È„L4$»ÐGíÌîtÿA-¯¦îR¸"[ús¬l ê5ýÈ0¥ã}îÈÛÄc˜@P8zyuU¤<55> D wÇÏã8žxEyWålièœÛ¬¯šÚ™zÒ ¼¡- %`ªÂ*;b0ÿUU?¹ØíoåhU<68>ÈÛxNÁÄWëßš–â@ö^ãb1ü¬@²ñÂ7š>“åYŸ`eßQ„É c§?n£(äñt%Ííc8V\yEÀ<45>O IM<E280BA>”*Œý;ë×üS\F÷w³Ç*˜¢-Ƽy+i³yÖ݉î`¬täñù8TÈ¡jˆJö.ô—áØ=hS4@ U»:q0Äù”ó¡³qî•«<E280A2>y Ýæ1 NÒzDSmý¤u0úù~,éF ¢Þ( '£ r»Bs~àâùö¨mb¡é½àË×÷ˆÐ5,fÑ$4]Ä”Rú¨óý¢ÂØû™¸¼õHÇî®Ýè,*<2A>@ê'?nœ(+°œ í3ë¶\¦e<19>öâÔÿ \:û•±Ïô!jï[uv²ÔÔI[Bõ†Ò]ײþþó¡± Þf¨æô‡»¨«ÇSÈ2l“ØYuæ<75>g¹Ÿnp@æ „”y5{gFÅNrYäÏ¥™^pó`¯è7÷ò¨Vræ8ê¥43jðHzöÄô©)3Ƀr•ÿô¦Ãª
!ü’ã½øÖë÷Ò:üân™—êS\wü­<C3BC>ê#ø¼UÀD&zùƒNU>r8<E28099>íÿòEZcRÍ®ø³´¼<ÅW¤)¶Ûê•K¼Æ²Ö¨<C396>²Úó<C39A>e”Vඨ&JÐí#×ÜóG·pµýùþ”¤foݶx»D¡\Å ²ÓzE¨ n¨pAŸ3»tÄRoLšÞE(óIVz>å1v©þ~|œCé<43>#iŒE<C592>¯^d±ß~yw¤ºl^£4Sc•Bï½á2gL”b«}V¢Á†Q|Ïø<C38F>^Ù\U!Àí!èj1>ãÙ%¢C¿…Fø¿GÇp•
N_Ü¿÷®$D;œdy#<23>YÄ$³Y¯¨´$9<>ÿ‡:ÈÏQŽa9sM”Ò¸L‡~NŒcH=¯GŠ &_ª‰ãl}ª©â@·¶Õõ¿3ž9S—`lvõˆú†Á'ñð:e°´t“¡ŒwR §UMwÊÓÿŠh_”2q±Txä· y#Xõæ<C3B5>)‰a|MÈ"ñ!šiÔÜúp©vòŒ¡?èJ p=÷ÿÃЀUi÷t]ÏLÓjâóJá½xÛSzp°Ö•ÀnÝ—æâù9?3
NKt©«ÔÖyªµ¤97ààÚà<C39A>Ïó]5QŽNö7¢°dÄׄ””ãØP=LHjzÍÿ@LÝ{ì†Þ†Áã<C381>cù¤Ï²ÔÚÎ,YŸT´ŠÝ+Ç_á¶J)î€îøQo=ª`Ò
-§Ñ†w©Ó± (V”<56>©!Y„ †û.fvÈȈÀžîùÐì»'ù}‹éúÙ¾¦'<27>t3°» ‚Ñ~äTñ¤¨(`].öÇŽiNÕ½ˆÃóa!Þ W «â ÔKÝ1òh%‰dÙ“cþ<63>j«P&,
G˜J-§ ¡^îJ|L¡†¹û'ÁNI¥zév4FâY»€?h-ËùÕoÑôÐa˜vF^eÝgÌåÛto<03>¶ÖkÑùN`ð’Õ*zjks´öPUñb  Ë/ü=<3D>d5üO­m‡LMžágUFeî9,ë*}ú ÇûŠG;ãËha;tx0E-^³ÇÏf0¾ù¶eP‡À>8 Ðõß•€HCv ÿ©]\…úÚK¹Z¥\ñâgñü"†×£=#¹¿PÞ#úÛÜÃìC‡·†ï•O[Ó¦áKwžqJ°ܶŽÎ*­ÿ?ÿ\ú¢œ]t¥æ©+“(±<>5lH7¹ÓHxs¼²Ü(x@#m["`aɳñø99‰ê˜';£ôa×Ï^v ~ù–¬™"t ºÞ ;ü¼u·¹F)æ WøÐØŸãU{ ŸýÑd§Õ´òcLZ—”jÀ¶ÊÊ߸˜­«ÔMKÏpðH=Jb)‚ÍÑ”FH:4¾fsíÊ,j¾´/MqášR sý+¹vÂÒ<C382>ÊÈò<0E>ßm¥!(ï; »W d<C2A0>ÌÏèP£a3ÿUÛ©A%šñZ˜t.dÊý7yoç8!G%JŽ'Ofú{{
ÕBú ß,” 0• ¢ÞõI/<2F> ôi<C3B4>ÖS<C396>¹ÿ¹RŠ»\ùÐ1•+ˆ­¨‡¾öÈ´×ñGF~NÛQ<C39B>iÂΓ^A6< N4FÞ¤Ì _…«Š?a Ä÷88<38>éŒ-³<>æ¾á#‘³ó o'9œö £YItH0D"®PñQC*q-e!~ÛÒå®*t¤&{+±¥ò>¯2|ËI/á=ù¼5Åz],šÕFtéMc¡šÙ—ÁÒøŸf)µs´Ÿù`µSk{é¨oŽ6 ÔH®R"Ÿ¹|uù÷Ìœ >1@Ç{ßß}@™0 ªë[)è$UâÓŬ4f¨ý&{Xâÿß½#|¸Ïü¼cáCüfk­P+q#S+aÛì <0A>@ߎ¯âuã$£¤ûÀǼ
þ-½Ú2[ ç:ÿßȡB<C2A1>~«ÛâtˆCM7º¼Ž´ŸpBŠÀ®®µƒ³…„¯ð»gÍ;Ö"ÀÎmAÏàgM§:§"kš¬·]¡Õ:ÏùÁš“˜q>B„˜ 4»”nØ݉QUr“\”ÅÓ¬i˜jd=ÉRØP¿o]ÀŽ4Rf !¿Þè<C39E>Xºž@ bLâˆ,rÅ<ê-nm³ ÷5׊«LÒÒö8<C3B6>(~°^lœ¾ê¦Ÿ Uxàâÿeíw¢o|[ûn[.ÙƒUiäd\S¾ZvNm S¸æ»ö©ãªÉÔßyX¸øîë¾–Âñd8ŸP$~7±,bgB ˜f9Zèªs|®",åÂP¤?<3F>75À¨mÖtè^¹Ô4÷1¨®pçtNïÓŸ.­ÀžèaŸÁÆ Äþ¡e<C2A1>%Æídö€k[<5B>`lx߬ÐNÓ%º÷Ï<ŠIÎsSÂ*í­4AžöA|¶naA£Sdås25ÝE;B.}!iZGW;SÔºŸãDøFÁصZö…Lï1F-ô·.íMfÕ€†©Œ¡»á<È‹É;¸ôS•´$Ø3,Q˜þd6ìôЊŒ)ßžð™Fåef3?x"<22>Ž»ùÝ<C3B9>¢;ç|ÅHEÜ«vÏs-ñj½{ƽº»m <6D>»•K£Tk_«DÈ=¾fsáµ45ÛoÔ½lho#i%6qMo7¼åB†ã©øñ QWŸÓ¾'®Š3íÌJöOÞŠ ¶á®üÐ×w׳¹\îR§š§‰èÁ”È×<02>o±!bŒÛ^îŠ2šÆ}=SÑGàcðžI´óEÅC<C385>©KZ/UÎwñ¿33†<33>]Øyãdjúãƺߺ~\DêÀd¡j;PO¬ÝÎ Gê
Ë­Õ b‡s{”“Àµ>¥dΫ<C38E>Ž±±4vºUZ_€þK+ºó
endstream
endobj
1999 0 obj
@ -27913,19 +27907,19 @@ endobj
/Type /ObjStm
/N 100
/First 958
/Length 13084
/Length 13090
>>
stream
1991 0 1994 231 1996 604 1998 867 2000 1346 2002 1578 584 1862 582 2003 1753 2144 1726 2285
797 2427 845 2568 813 2709 1911 2849 585 2989 815 3129 812 3267 817 3405 1301 3544 814 3684
1171 3824 777 3963 583 4104 811 4245 873 4386 1013 4526 586 4667 778 4780 874 4893 929 5006
964 5119 993 5232 1036 5349 1091 5469 1139 5589 1197 5709 1250 5829 1302 5949 1358 6069 1399 6189
1437 6309 1486 6429 1528 6549 1562 6669 1602 6789 1643 6909 1676 7029 1707 7149 1744 7269 1806 7389
1847 7509 1884 7629 1924 7749 2003 7851 2004 7966 2005 8087 2006 8208 2007 8329 2008 8423 2009 8519
574 8588 570 8648 566 8759 562 8833 558 8921 554 9009 550 9097 546 9185 542 9259 538 9384
534 9458 530 9546 526 9634 522 9722 518 9810 514 9884 510 10009 506 10083 502 10171 498 10259
494 10333 490 10458 486 10532 482 10620 478 10708 474 10796 470 10884 466 10972 462 11060 458 11148
454 11236 450 11324 446 11412 442 11500 438 11588 434 11676 430 11764 426 11852 422 11926 418 12052
1991 0 1994 231 1996 604 1998 867 2000 1352 2002 1584 584 1868 582 2009 1753 2150 1726 2291
797 2433 845 2574 813 2715 1911 2855 585 2995 815 3135 812 3273 817 3411 1301 3550 814 3690
1171 3830 777 3969 583 4110 811 4251 873 4392 1013 4532 586 4673 778 4786 874 4899 929 5012
964 5125 993 5238 1036 5355 1091 5475 1139 5595 1197 5715 1250 5835 1302 5955 1358 6075 1399 6195
1437 6315 1486 6435 1528 6555 1562 6675 1602 6795 1643 6915 1676 7035 1707 7155 1744 7275 1806 7395
1847 7515 1884 7635 1924 7755 2003 7857 2004 7972 2005 8093 2006 8214 2007 8335 2008 8429 2009 8525
574 8594 570 8654 566 8765 562 8839 558 8927 554 9015 550 9103 546 9191 542 9265 538 9390
534 9464 530 9552 526 9640 522 9728 518 9816 514 9890 510 10015 506 10089 502 10177 498 10265
494 10339 490 10464 486 10538 482 10626 478 10714 474 10802 470 10890 466 10978 462 11066 458 11154
454 11242 450 11330 446 11418 442 11506 438 11594 434 11682 430 11770 426 11858 422 11932 418 12058
% 1991 0 obj
<<
/Type /FontDescriptor
@ -27974,7 +27968,7 @@ stream
% 1998 0 obj
<<
/Type /FontDescriptor
/FontName /TJSMYH+CMTT10
/FontName /LTGWDM+CMTT10
/Flags 4
/FontBBox [-4 -233 537 696]
/Ascent 611
@ -27983,7 +27977,7 @@ stream
/ItalicAngle 0
/StemV 69
/XHeight 431
/CharSet (/A/B/C/D/E/F/I/K/L/M/N/O/P/R/S/T/U/W/Y/a/ampersand/asciitilde/asterisk/b/backslash/bracketleft/bracketright/c/colon/comma/d/e/equal/f/four/g/h/hyphen/i/j/k/l/m/n/o/one/p/parenleft/parenright/percent/period/plus/q/r/s/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero)
/CharSet (/A/B/C/D/E/F/I/K/L/M/N/O/P/R/S/T/U/W/Y/a/ampersand/asciitilde/asterisk/b/backslash/bracketleft/bracketright/c/colon/comma/d/e/equal/f/four/g/h/hyphen/i/j/k/l/m/n/o/one/p/parenleft/parenright/percent/period/plus/q/r/s/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero)
/FontFile 1997 0 R
>>
% 2000 0 obj
@ -28190,7 +28184,7 @@ stream
<<
/Type /Font
/Subtype /Type1
/BaseFont /TJSMYH+CMTT10
/BaseFont /LTGWDM+CMTT10
/FontDescriptor 1998 0 R
/FirstChar 37
/LastChar 126
@ -30143,8 +30137,8 @@ endobj
2131 0 obj
<<
/Title (Parallel Sparse BLAS V. 3.7.0) /Subject (Parallel Sparse Basic Linear Algebra Subroutines) /Keywords (Computer Science Linear Algebra Fluid Dynamics Parallel Linux MPI PSBLAS Iterative Solvers Preconditioners) /Creator (pdfLaTeX) /Producer ($Id$) /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.19)/Keywords()
/CreationDate (D:20191218141557Z)
/ModDate (D:20191218141557Z)
/CreationDate (D:20200425083929+02'00')
/ModDate (D:20200425083929+02'00')
/Trapped /False
/PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.19 (TeX Live 2018) kpathsea version 6.3.0)
>>
@ -30279,7 +30273,7 @@ endobj
/W [1 3 1]
/Root 2130 0 R
/Info 2131 0 R
/ID [<6B1E8680CFEF4C06C14E8290AA58B896> <6B1E8680CFEF4C06C14E8290AA58B896>]
/ID [<CF39701A69C7A230DA7C0C0B3D0F6262> <CF39701A69C7A230DA7C0C0B3D0F6262>]
/Length 10665
>>
stream
@ -30294,34 +30288,35 @@ stream
ƒ ƒ ƒ ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ ƒ!ƒ"ƒ#ƒ$ƒ%ƒ&ƒ'ƒ(ƒ)ƒ.ƒ,”_ƒ*ƒ+ƒƒƒƒæƒ/ƒ0ƒ1ƒ2ƒ3ƒ4ƒ5ƒ6ƒ7ƒ8ƒ9ƒ:ƒ;ƒ<ƒ=ƒ>ƒ?ƒ@ƒAƒBƒCƒDƒEƒFƒGƒHƒIƒJƒKƒLƒMƒNƒOƒPƒQƒRƒSƒTƒUƒVƒWƒXƒYƒZƒ[ƒ\ƒ`ƒ^ƒ-‘ʃ]ƒaƒbƒcéééééééééé é
é é ééééééééééééééééééé é!é#é$é&é(é-é+ƒ_ÏÄé*é é"é%é'é)îýé/é1é3é4é5é6é7é8é9é:é;é=é,Wé<é.é0é2é?é@éAéBéCéDéEéFéGéHéJé>h<>ÈÈ]>]5]+]?]=]2]3]<]/]0éPéQéR 
éWéUéKŠÈ
éTéLéMéNéO¤À]1éXéYé^éV°céZÈÈÈ ÈÈé\Èé]];éc@èS@é_Ó5@@é`éaéb].A]-@@@ @@@@@
@z@ È @ @@@@@@@@)@'@b‰@@@@@@@@@ @!@"@#@$@%@&ÈÈ@*@4@(€ì@+@-@.@/@0@1@2@6@;@5žY@7@:@=@>@?@F@<¿¥@@@A@B@C@D@E@H@I@T@GÚŒ@J@K@L@M@N@O@P@Q@R@S@V@W@]@Uï@X@c@^²@_ȧ§9<§§b„§ §§ §§§§§d.§§§]:§§§ˆ9§§$§ŸÀ§ §"§*§%­Ó§&ȧ/§+¼´§,§4§0ϧ1§:§5ßV§6§>§;ïo§<§@§A§H§?$§B§G§K§O§I#§JȧQ§R§U§P2M§Sú §W§_§]§VA‰§X§\§a§c§^§`Èúú…òú“Gúúúúú ú
úúú†Ìú úúúú£¬úÈ úúúúúúú®Lúúú ú(ú̦ú!ú"ú#ú$ú%ú&ú'ú*ú+ú,ú-ú.ú/ú3ú)àèú0ú2ú6ú4ú5ú8ú9ú:ú>ú7¼ú;ú=úGú?Ôú@úAúBúCúDúEúFÈ!úIúJúKúOúHúLúNúQúRúSúWúPúTúVú`úXgúYúZú[ú\ú]ú^ú_úbúcffúavjffÔûffÀ¿ff f
f ffÃmf fÈ"ffÜ÷fffffffffff fïWfff"f#f'f!<07>f$f&f)f*f.f(]f+Èf-f0f1f2f3f<f:f/3Of4f6f7f8f9f=f>f?f@fAfBfCfEf;P2fDÈ#fGfMfKfFfHfJfNfOfPfQfRfSfUfL†|fTfWfXfZfV¥'fYf\f]f^f_f`fafbÑf[·ªfcÑÎÑÑîÑÑÑÑ Ñ
Ñ ÑÑÑÑœÑ ÑÈ$ÑÑÑÑÑÑÑÑÑÑÑÑÑ Ñ#ÑIsÑ!Ñ%Ñ&Ñ'Ñ6Ñ.Ñ$L;Ñ(Ñ*Ñ+Ñ,Ñ-uÑ7Ñ:Ñ/Ñ8Ñ9Ñ0Ñ1Ñ2Ñ3Ñ4Ñ5ƒñ·`Ñ=Ñ;äøÑ<ÈÈ%Ñ?Ñ@ÑAÑHÑ>ñÑBÑDÑEÑFÑGÑJ9ÑKÑLÑQÑIˆÑMÑNÑOÑPÑ]ÑTÑRÑSÑ^ÑU8Ñ\ÑVÑWÑXÑYÑZÑ[H/Ñ`ÑaÑbIÑ_©6ÑcIIII
:4IIÿŠIÈ&I
III  vI I IIIIII $8IIIIII I N<>III"I%I!I#I$I-I& <09>FI'I(I)I*I+I,È'I/I2I. šçI0I4I9I3 ·1I5I6I7I8I;I<I@I: ÃÂI=I?IBICIFIA ÜNIDIHIKIG ébIIIMINIQIL òlIOÈ(IVIR
ÕISITIUIXIYI_IW
EIZI\I]I^½IcI`
Ia½½½
éTéLéMéNéO¤À]1éXéYé^éV°céZÈÈÈ ÈÈé\Èé]];éc@èS@é_Ó5@@é`éaéb].º]-@@@ @@@@@
@z@ È @ @@@@@@@@)@'@b‰@@@@@@@@@ @!@"@#@$@%@&ÈÈ@*@4@(<02>e@+@-@.@/@0@1@2@6@;@5žÒ@7@:@=@>@?@F@<À@@@A@B@C@D@E@H@I@T@GÛ@J@K@L@M@N@O@P@Q@R@S@V@W@]@Uï{@X@c@^+@_ȧ§§§§ §MM§ §§§§§§§§]:§§§ˆ²§§$§ 9§ §"§*§%®L§&ȧ/§+½-§,§4§0Ï<>§1§:§5ßϧ6§>§;ïè§<§@§A§H§?<05>§B§G§K§O§I$§JȧQ§R§U§P§Sú §W§_§]§VB§X§\§a§c§^Tm§`Èúú†kú“Àúúúúú ú
úúú‡Eú úúúú¤%úÈ úúúúúúú®Åúúú ú(úÍú!ú"ú#ú$ú%ú&ú'ú*ú+ú,ú-ú.ú/ú3ú)áaú0ú2ú6ú4ˆú5ú8ú9ú:ú>ú75ú;ú=úGú? Mú@úAúBúCúDúEúFÈ!úIúJúKúOúH2OúLúNúQúRúSúWúPK<úTúVú`úXgyúYúZú[ú\ú]ú^ú_úbúcffúaffÕtffÁ8ff f
f ffÃæf fÈ"ffÝpfffffffffff fïÐfff"f#f'f! f$f&f)f*f.f(Öf+Èf-f0f1f2f3f<f:f/f4f6f7f8f9f=f>f?f@fAfBfCfEf;fDÈ#fGfMfKfFl9fHfJfNfOfPfQfRfSfUfL†õfTfWfXfZfV¥ fYf\f]f^f_f`fafbÑf[¸#fcÑÎŒÑÑgÑÑÑÑ Ñ
Ñ ÑÑÑÑ Ñ ÑÈ$ÑÑ&ZÑÑÑÑÑÑÑÑ,dÑÑÑ Ñ#ÑÑ!Ñ%Ñ&Ñ'Ñ6Ñ.Ñ$L´Ñ(Ñ*Ñ+Ñ,Ñ-vÑ7Ñ:Ñ/iVÑ8Ñ9Ñ0Ñ1Ñ2Ñ3Ñ4Ñ5„j·ÙÑ=Ñ;åqÑ<ÈÈ%Ñ?Ñ@ÑAÑHÑ>ñ˜ÑBÑDÑEÑFÑGÑJ:
ÑKÑLÑQÑIÑMÑNÑOÑPÑ]ÑTÑR*(ÑSÑ^ÑU8ˆÑ\ÑVÑWÑXÑYÑZÑ[|Ñ`ÑaÑbIÑ_©¯ÑcIIII
:­II IÈ&I
III  ïI I IIIIIIIII 5CIII I OIII"I%I! iAI#I$I-I& <09>¿I'I(I)I*I+I,È'I/I2I. `I0I4I9I3 ·ªI5I6I7I8I;I<I@I: Ä;I=I?IBICIFIA ÜÇIDIHIKIG éÛIIIMINIQIL òåIOÈ(IVIR
NISITIUIXIYI_IW
¾IZI\I]I^½IcI`
$Ia½½½
½
½½½½½½  ½½ 
€À½ ½ ½½½½½½½½½
<EFBFBD>ß½È)½"½
ª½½½½½½ ½!½$½%½(½#
³#½&½*½+½/½)
¿y½,½.½1½2½5½0
ÏG½3½7½8½;½6
ソ9½@½<
þƒ½=½>½?È*½B½C½D½G½A ½E½I½J½M½H ¾½K½Q½N %8½O½S½V½R 2ÿ½T½[½W ½X½Y½Z½]½`½\ ½^È+½b!½a fq½c! «1!!! <0B>!!!
!!  ±>! ! !!! ¾:!!!!! Ñæ!!!!!"! á)!! !!È,!$!'!# ï¸!%!-!( ¹!)!*!+!,!/!0!1!4!. l!2!8!5 !6!D!9 <<3C>!:!;!<!=!>!?!@!A!B!C!H!E X*!FÈ-!N!I Y!J!L!M!T!O o*!P!R!S![!U <0C>¢!V!X!Y!Z!_!\ ’ì!]!c!` <0C>f!a Ñ} â’È. Öa  Ü…   â  ô z!  È/'" 1s#%&-( FX)+,4. [ /12È 39568>: ˆù;=@AD? ž5BÈ0`abE ·_FGHÈIJKLMNOPQRSTUVWXYZ[\]^_÷c ÓÃ÷÷÷Þÿ÷
÷w÷÷÷ ÷÷  4÷ ÷÷÷÷Þ÷÷÷÷÷Z÷È1÷÷!÷°÷÷÷ ÷#÷(÷"/<2F>÷$÷&÷'÷*÷/÷)Dj÷+÷-÷.÷5÷0÷1÷3÷4÷7÷<÷6÷8÷:÷;÷B÷=r]÷>÷@÷AÈ2÷F÷C÷D÷H÷I÷M÷G„×÷J÷L÷O÷P÷Q÷R÷U÷N˜õ÷S÷X÷V·l÷W÷Z÷[÷\÷]÷`÷Y»ï÷^÷b]÷aÓ÷cÈ3q€]]Ž]]]] ]
±] ]] ž] ]]]]];]]]]]È ]]]] ]]]"]$]!U ]#È4]']%]&]7](h+])]*],]4]6]A]8ƒÎ]9]@]B]C]D]E]F]G]H]I]J]K]L]M]N]O]P]Q]R]S]T]U<0F>?]Vè]W7]X^]Y|B]Z½Ò][ÛÐ]\C]]]^†ž]_¦‹]`Èf]a
]b]cºÈÜSשÈ'lÈȤnÈ´£ÈÈ5È6È7È8È9È:È;ÌÛÛÛÛÛÛÛ Û
Û Û Û ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ Û!Û"Û#Û$Û%Û&Û'Û(Û)Û*Û+Û,Û-Û.Û/Û0Û1Û2Û3Û4Û5Û6Û7Û8Û9Û:Û;Û<Û=Û>Û?Û@ÛAÛBÛCÛDÛEÛFÛGÛHÛIÛJÛKÛLÛMÛNÛOÛPÛQÛRÛSÛTÛUÛVÛWÛXÛYÛZÛ[Û\Û]Û^Û_Û`ÛaÛbÛc>‡v>>>>>>>>> >
> > > >>>>>>>…A"
d*½½½½½½  t½½ 
<EFBFBD>9½ ½ ½½½½½½½½½
<EFBFBD>X½È)½"½
ª<EFBFBD>½½½½½½ ½!½$½%½(½#
³œ½&½*½+½/½)
¿ò½,½.½1½2½5½0
ÏÀ½3½7½8½;½6
ãû½9½@½<
þü½=½>½?È*½B½C½D½G½A <03>½E½I½J½M½H 7½K½Q½N ½O½S½V½R 3x½T½[½W MM½X½Y½Z½]½`½\ PK½^È+½b!½a ½c! «ª!!! <0B>û!!!
!!  ±·! ! !!! ¾³!!!!! Ò_!!!!!"! á¢!! !!È,!$!'!# ð1!%!-!( 2!)!*!+!,!/!0!1!4!. å!2!8!5 &L!6!D!9 =!:!;!<!=!>!?!@!A!B!C!H!E !FÈ-!N!I Y!J!L!M!T!O !P!R!S![!U !V!X!Y!Z!_!\ “e!]!c!` <0C>ß!a Ñö ã È. ÖÚ  Üþ   â•  ô‘ ó! | È/'"#%&-()+,4. [™/12È 395 tH68>: ‰r;=@AD? ž®BÈ0`abE ·ØFGHÈIJKLMNOPQRSTUVWXYZ[\]^_÷c Ô<÷÷÷ßx÷
÷ð÷÷÷ ÷÷  ­÷ ÷÷÷÷W÷÷÷÷÷Ó÷È1÷÷!÷)÷÷÷ ÷#÷(÷"0÷$÷&÷'÷*÷/÷)÷+÷-÷.÷5÷0Sr÷1÷3÷4÷7÷<÷6b4÷8÷:÷;÷B÷=÷>÷@÷AÈ2÷F÷C€T÷D÷H÷I÷M÷G…P÷J÷L÷O÷P÷Q÷R÷U÷N™n÷S÷X÷V·å÷W÷Z÷[÷\÷]÷`÷Y¼h÷^÷b]÷aÓ‹÷cÈ3]]]]]] ] *] ]] ] ]]]]]´]]]]]È ]]]] ]9u]]"]$]!U…]#È4]']%h]&]7](])]*],]4]6]A]8„G]9]@]B]C]D]E]F]G]H]I]J]K]L]M]N]O]P]Q]R]S]T]U<0F>¸]Vèø]W7}]X_]Y]Z¾K][ÜI]\¼]]"!]^]_§]`Èß]a
ˆ]bJN]cº<>ÈÝRØ"ÈÈW\È¥mȵ¢ÈÈ5È6È7È8È9È:È;ÑÛÛÛÛÛÛÛ Û
Û Û Û ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ Û!Û"Û#Û$Û%Û&Û'Û(Û)Û*Û+Û,Û-Û.Û/Û0Û1Û2Û3Û4Û5Û6Û7Û8Û9Û:Û;Û<Û=Û>Û?Û@ÛAÛBÛCÛDÛEÛFÛGÛHÛIÛJÛKÛLÛMÛNÛOÛPÛQÛRÛSÛTÛUÛVÛWÛXÛYÛZÛ[Û\Û]Û^Û_Û`ÛaÛbÛc>ˆ‡>>>>>>>>> >
> > > >>>>>>>†F“3
endstream
endobj
startxref
1348130
1348403
%%EOF

@ -112,7 +112,7 @@ DATE = $(shell date +%Y-%m-%d)
## Programs
#
LATEX = latex
LTX2HTML = latex2html -local_icons
#LTX2HTML = latex2html -local_icons
LTX2HTML = htlatex
PDFLATEX = pdflatex
ACRO = evince

@ -293,7 +293,7 @@ are classified as:
To finish our general description, we define a version string with the
constant
\[ \verb|psb_version_string_|\]
whose current value is \verb|3.4.0|
whose current value is \verb|3.7.0|
\subsection{Application structure}
\label{sec:appstruct}
@ -360,7 +360,8 @@ follows:
build it with \verb|prec%build|\footnote{The subroutine style {\tt
psb\_precinit} and {\tt psb\_precbl} are still supported for
backward compatibility}.
\item Call the iterative method of choice, e.g. \verb|psb_bicgstab|
\item Call the iterative driver \verb|psb_krylov| with the method of
choice, e.g. \verb|bicgstab|.
\end{enumerate}
This is the structure of the sample programs in the directory
\verb|test/pargen/|.

@ -27,7 +27,7 @@ lib: $(OBJS) impld
/bin/cp -p $(CPUPDFLAG) *$(.mod) $(MODDIR)
impld: $(OBJS)
cd impl && $(MAKE)
$(MAKE) -C impl
$(OBJS): $(MODDIR)/$(BASEMODNAME)$(.mod)

Loading…
Cancel
Save