From da3f16ba56f5bc82efc8afbaf3649493cf105dd3 Mon Sep 17 00:00:00 2001 From: sfilippone Date: Wed, 9 Jul 2025 11:30:41 +0200 Subject: [PATCH 01/37] Use less memory, check on symbmm --- base/serial/impl/psb_c_csr_impl.F90 | 16 ++++++++-------- base/serial/impl/psb_d_csr_impl.F90 | 16 ++++++++-------- base/serial/impl/psb_s_csr_impl.F90 | 16 ++++++++-------- base/serial/impl/psb_z_csr_impl.F90 | 16 ++++++++-------- base/serial/psb_csymbmm.f90 | 1 + base/serial/psb_dsymbmm.f90 | 1 + base/serial/psb_ssymbmm.f90 | 1 + base/serial/psb_zsymbmm.f90 | 1 + 8 files changed, 36 insertions(+), 32 deletions(-) diff --git a/base/serial/impl/psb_c_csr_impl.F90 b/base/serial/impl/psb_c_csr_impl.F90 index 73324073..904bc6e7 100644 --- a/base/serial/impl/psb_c_csr_impl.F90 +++ b/base/serial/impl/psb_c_csr_impl.F90 @@ -4238,7 +4238,7 @@ subroutine psb_ccsrspspmm(a,b,c,info) ! Estimate number of nonzeros on output. nza = a%get_nzeros() nzb = b%get_nzeros() - nzc = max(nint(0.5*(nza+nzb)),ma,mb,na,nb) + nzc = max(nint(0.25*(nza+nzb)),ma,nb) call c%allocate(ma,nb,nzc) call csr_spspmm(a,b,c,info) @@ -4276,9 +4276,9 @@ contains nze = min(size(c%val),size(c%ja)) isz = max(ma,na,mb,nb) - call psb_realloc(isz,row,info) - if (info == 0) call psb_realloc(isz,idxs,info) - if (info == 0) call psb_realloc(isz,irow,info) + call psb_realloc(nb,row,info) + if (info == 0) call psb_realloc(na,idxs,info) + if (info == 0) call psb_realloc(nb,irow,info) if (info /= 0) return row = dzero irow = 0 @@ -6613,7 +6613,7 @@ subroutine psb_lccsrspspmm(a,b,c,info) nza = a%get_nzeros() nzb = b%get_nzeros() - nzc = 2*(nza+nzb) + nzc = max(nint(0.25*(nza+nzb)),ma,nb) call c%allocate(ma,nb,nzc) call csr_spspmm(a,b,c,info) @@ -6651,9 +6651,9 @@ contains nze = min(size(c%val),size(c%ja)) isz = max(ma,na,mb,nb) - call psb_realloc(isz,row,info) - if (info == 0) call psb_realloc(isz,idxs,info) - if (info == 0) call psb_realloc(isz,irow,info) + call psb_realloc(nb,row,info) + if (info == 0) call psb_realloc(na,idxs,info) + if (info == 0) call psb_realloc(nb,irow,info) if (info /= 0) return row = dzero irow = 0 diff --git a/base/serial/impl/psb_d_csr_impl.F90 b/base/serial/impl/psb_d_csr_impl.F90 index 7d8f477b..952bb1e9 100644 --- a/base/serial/impl/psb_d_csr_impl.F90 +++ b/base/serial/impl/psb_d_csr_impl.F90 @@ -4238,7 +4238,7 @@ subroutine psb_dcsrspspmm(a,b,c,info) ! Estimate number of nonzeros on output. nza = a%get_nzeros() nzb = b%get_nzeros() - nzc = max(nint(0.5*(nza+nzb)),ma,mb,na,nb) + nzc = max(nint(0.25*(nza+nzb)),ma,nb) call c%allocate(ma,nb,nzc) call csr_spspmm(a,b,c,info) @@ -4276,9 +4276,9 @@ contains nze = min(size(c%val),size(c%ja)) isz = max(ma,na,mb,nb) - call psb_realloc(isz,row,info) - if (info == 0) call psb_realloc(isz,idxs,info) - if (info == 0) call psb_realloc(isz,irow,info) + call psb_realloc(nb,row,info) + if (info == 0) call psb_realloc(na,idxs,info) + if (info == 0) call psb_realloc(nb,irow,info) if (info /= 0) return row = dzero irow = 0 @@ -6613,7 +6613,7 @@ subroutine psb_ldcsrspspmm(a,b,c,info) nza = a%get_nzeros() nzb = b%get_nzeros() - nzc = 2*(nza+nzb) + nzc = max(nint(0.25*(nza+nzb)),ma,nb) call c%allocate(ma,nb,nzc) call csr_spspmm(a,b,c,info) @@ -6651,9 +6651,9 @@ contains nze = min(size(c%val),size(c%ja)) isz = max(ma,na,mb,nb) - call psb_realloc(isz,row,info) - if (info == 0) call psb_realloc(isz,idxs,info) - if (info == 0) call psb_realloc(isz,irow,info) + call psb_realloc(nb,row,info) + if (info == 0) call psb_realloc(na,idxs,info) + if (info == 0) call psb_realloc(nb,irow,info) if (info /= 0) return row = dzero irow = 0 diff --git a/base/serial/impl/psb_s_csr_impl.F90 b/base/serial/impl/psb_s_csr_impl.F90 index a0cce83d..f384ef33 100644 --- a/base/serial/impl/psb_s_csr_impl.F90 +++ b/base/serial/impl/psb_s_csr_impl.F90 @@ -4238,7 +4238,7 @@ subroutine psb_scsrspspmm(a,b,c,info) ! Estimate number of nonzeros on output. nza = a%get_nzeros() nzb = b%get_nzeros() - nzc = max(nint(0.5*(nza+nzb)),ma,mb,na,nb) + nzc = max(nint(0.25*(nza+nzb)),ma,nb) call c%allocate(ma,nb,nzc) call csr_spspmm(a,b,c,info) @@ -4276,9 +4276,9 @@ contains nze = min(size(c%val),size(c%ja)) isz = max(ma,na,mb,nb) - call psb_realloc(isz,row,info) - if (info == 0) call psb_realloc(isz,idxs,info) - if (info == 0) call psb_realloc(isz,irow,info) + call psb_realloc(nb,row,info) + if (info == 0) call psb_realloc(na,idxs,info) + if (info == 0) call psb_realloc(nb,irow,info) if (info /= 0) return row = dzero irow = 0 @@ -6613,7 +6613,7 @@ subroutine psb_lscsrspspmm(a,b,c,info) nza = a%get_nzeros() nzb = b%get_nzeros() - nzc = 2*(nza+nzb) + nzc = max(nint(0.25*(nza+nzb)),ma,nb) call c%allocate(ma,nb,nzc) call csr_spspmm(a,b,c,info) @@ -6651,9 +6651,9 @@ contains nze = min(size(c%val),size(c%ja)) isz = max(ma,na,mb,nb) - call psb_realloc(isz,row,info) - if (info == 0) call psb_realloc(isz,idxs,info) - if (info == 0) call psb_realloc(isz,irow,info) + call psb_realloc(nb,row,info) + if (info == 0) call psb_realloc(na,idxs,info) + if (info == 0) call psb_realloc(nb,irow,info) if (info /= 0) return row = dzero irow = 0 diff --git a/base/serial/impl/psb_z_csr_impl.F90 b/base/serial/impl/psb_z_csr_impl.F90 index 784b78f6..dd4be13a 100644 --- a/base/serial/impl/psb_z_csr_impl.F90 +++ b/base/serial/impl/psb_z_csr_impl.F90 @@ -4238,7 +4238,7 @@ subroutine psb_zcsrspspmm(a,b,c,info) ! Estimate number of nonzeros on output. nza = a%get_nzeros() nzb = b%get_nzeros() - nzc = max(nint(0.5*(nza+nzb)),ma,mb,na,nb) + nzc = max(nint(0.25*(nza+nzb)),ma,nb) call c%allocate(ma,nb,nzc) call csr_spspmm(a,b,c,info) @@ -4276,9 +4276,9 @@ contains nze = min(size(c%val),size(c%ja)) isz = max(ma,na,mb,nb) - call psb_realloc(isz,row,info) - if (info == 0) call psb_realloc(isz,idxs,info) - if (info == 0) call psb_realloc(isz,irow,info) + call psb_realloc(nb,row,info) + if (info == 0) call psb_realloc(na,idxs,info) + if (info == 0) call psb_realloc(nb,irow,info) if (info /= 0) return row = dzero irow = 0 @@ -6613,7 +6613,7 @@ subroutine psb_lzcsrspspmm(a,b,c,info) nza = a%get_nzeros() nzb = b%get_nzeros() - nzc = 2*(nza+nzb) + nzc = max(nint(0.25*(nza+nzb)),ma,nb) call c%allocate(ma,nb,nzc) call csr_spspmm(a,b,c,info) @@ -6651,9 +6651,9 @@ contains nze = min(size(c%val),size(c%ja)) isz = max(ma,na,mb,nb) - call psb_realloc(isz,row,info) - if (info == 0) call psb_realloc(isz,idxs,info) - if (info == 0) call psb_realloc(isz,irow,info) + call psb_realloc(nb,row,info) + if (info == 0) call psb_realloc(na,idxs,info) + if (info == 0) call psb_realloc(nb,irow,info) if (info /= 0) return row = dzero irow = 0 diff --git a/base/serial/psb_csymbmm.f90 b/base/serial/psb_csymbmm.f90 index 7dd65789..0f8c18ab 100644 --- a/base/serial/psb_csymbmm.f90 +++ b/base/serial/psb_csymbmm.f90 @@ -85,6 +85,7 @@ end subroutine psb_csymbmm subroutine psb_cbase_symbmm(a,b,c,info) use psb_mat_mod use psb_sort_mod + use psb_serial_mod, only : symbmm implicit none class(psb_c_base_sparse_mat), intent(in) :: a,b diff --git a/base/serial/psb_dsymbmm.f90 b/base/serial/psb_dsymbmm.f90 index a1b59467..d647d270 100644 --- a/base/serial/psb_dsymbmm.f90 +++ b/base/serial/psb_dsymbmm.f90 @@ -85,6 +85,7 @@ end subroutine psb_dsymbmm subroutine psb_dbase_symbmm(a,b,c,info) use psb_mat_mod use psb_sort_mod + use psb_serial_mod, only : symbmm implicit none class(psb_d_base_sparse_mat), intent(in) :: a,b diff --git a/base/serial/psb_ssymbmm.f90 b/base/serial/psb_ssymbmm.f90 index 3b5a41af..d76b48ea 100644 --- a/base/serial/psb_ssymbmm.f90 +++ b/base/serial/psb_ssymbmm.f90 @@ -85,6 +85,7 @@ end subroutine psb_ssymbmm subroutine psb_sbase_symbmm(a,b,c,info) use psb_mat_mod use psb_sort_mod + use psb_serial_mod, only : symbmm implicit none class(psb_s_base_sparse_mat), intent(in) :: a,b diff --git a/base/serial/psb_zsymbmm.f90 b/base/serial/psb_zsymbmm.f90 index 5cbffb11..9c31b0e7 100644 --- a/base/serial/psb_zsymbmm.f90 +++ b/base/serial/psb_zsymbmm.f90 @@ -85,6 +85,7 @@ end subroutine psb_zsymbmm subroutine psb_zbase_symbmm(a,b,c,info) use psb_mat_mod use psb_sort_mod + use psb_serial_mod, only : symbmm implicit none class(psb_z_base_sparse_mat), intent(in) :: a,b From b51dc381409819abf5cc0bfad282bb1509cea3d1 Mon Sep 17 00:00:00 2001 From: Fabio Durastante Date: Fri, 18 Jul 2025 17:44:57 +0200 Subject: [PATCH 02/37] Added C interface to initialize communicator from existing MPI communicator --- cbind/base/psb_c_base.h | 1 + cbind/base/psb_cpenv_mod.f90 | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/cbind/base/psb_c_base.h b/cbind/base/psb_c_base.h index 601ba8c1..027caa3a 100644 --- a/cbind/base/psb_c_base.h +++ b/cbind/base/psb_c_base.h @@ -40,6 +40,7 @@ extern "C" { /* Environment routines */ void psb_c_init(psb_c_ctxt *cctxt); + void psb_c_init_from_fint(psb_c_ctxt *cctxt, psb_i_t f_comm); void psb_c_exit(psb_c_ctxt cctxt); void psb_c_exit_ctxt(psb_c_ctxt cctxt); void psb_c_abort(psb_c_ctxt cctxt); diff --git a/cbind/base/psb_cpenv_mod.f90 b/cbind/base/psb_cpenv_mod.f90 index e1003e99..6bc67bfb 100644 --- a/cbind/base/psb_cpenv_mod.f90 +++ b/cbind/base/psb_cpenv_mod.f90 @@ -50,6 +50,28 @@ contains end subroutine psb_c_init + ! Get MPI_Fint from C, psb_c_object_type and start a psb_ctxt_type + ! context from it. + subroutine psb_c_init_from_fint(cctxt,fint) bind(c) + use psb_base_mod, only : psb_init, psb_ctxt_type + implicit none + + type(psb_c_object_type) :: cctxt + integer(psb_c_mpk_), value :: fint + type(psb_ctxt_type), pointer :: ctxt + integer :: info + + ! Local variables + integer(psb_mpk_) :: fmctxt + + allocate(ctxt,stat=info) + if (info /= 0) return + fmctxt = fint + call psb_init(ctxt,extcomm=fmctxt) + cctxt%item = c_loc(ctxt) + + end subroutine psb_c_init_from_fint + function psb_c2f_ctxt(cctxt) result(res) implicit none type(psb_c_object_type), value :: cctxt From a2160b7ba0f2ee1d8f8ac48d9e8e4de71d6183c0 Mon Sep 17 00:00:00 2001 From: Fabio Durastante Date: Mon, 21 Jul 2025 15:58:22 +0200 Subject: [PATCH 03/37] Fixed import of complex.h for compatibility with C++ --- cbind/base/psb_c_base.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cbind/base/psb_c_base.h b/cbind/base/psb_c_base.h index 027caa3a..708a0e0f 100644 --- a/cbind/base/psb_c_base.h +++ b/cbind/base/psb_c_base.h @@ -6,7 +6,11 @@ extern "C" { #endif #include +#ifdef __cplusplus +#include +#else #include +#endif #include #include #include From ab7da2100b2074a47f43194c335855be9cb8cdba Mon Sep 17 00:00:00 2001 From: sfilippone Date: Tue, 2 Sep 2025 15:46:33 +0200 Subject: [PATCH 04/37] Change default CC for CUDA --- configure | 2 +- configure.ac | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 4f83aa19..0658f499 100755 --- a/configure +++ b/configure @@ -11139,7 +11139,7 @@ fi if test "x$pac_cv_cudacc" == "x"; then - pac_cv_cudacc="50,60,70,75,80,86"; + pac_cv_cudacc="75,80,86"; CUDA_CC="$pac_cv_cudacc"; fi if (( $pac_cv_cuda_version >= 11070 )) diff --git a/configure.ac b/configure.ac index 2850d275..2f472dea 100644 --- a/configure.ac +++ b/configure.ac @@ -885,7 +885,7 @@ else PAC_ARG_WITH_CUDACC() if test "x$pac_cv_cudacc" == "x"; then - pac_cv_cudacc="50,60,70,75,80,86"; + pac_cv_cudacc="75,80,86"; CUDA_CC="$pac_cv_cudacc"; fi if (( $pac_cv_cuda_version >= 11070 )) From 727dc13a98448053b50f6c243dcb8e425bb6a1a5 Mon Sep 17 00:00:00 2001 From: sfilippone Date: Thu, 18 Sep 2025 17:02:11 +0200 Subject: [PATCH 05/37] First attempt at a fix for INTEL --- base/modules/serial/psb_c_serial_mod.f90 | 6 +++- base/modules/serial/psb_d_serial_mod.f90 | 6 +++- base/modules/serial/psb_s_serial_mod.f90 | 6 +++- base/modules/serial/psb_z_serial_mod.f90 | 6 +++- base/serial/psb_cspspmm.f90 | 42 ++++++++++++++++++++++-- base/serial/psb_dspspmm.f90 | 42 ++++++++++++++++++++++-- base/serial/psb_sspspmm.f90 | 42 ++++++++++++++++++++++-- base/serial/psb_zspspmm.f90 | 42 ++++++++++++++++++++++-- 8 files changed, 176 insertions(+), 16 deletions(-) diff --git a/base/modules/serial/psb_c_serial_mod.f90 b/base/modules/serial/psb_c_serial_mod.f90 index 9c43f3e7..9da008c6 100644 --- a/base/modules/serial/psb_c_serial_mod.f90 +++ b/base/modules/serial/psb_c_serial_mod.f90 @@ -60,6 +60,8 @@ module psb_c_serial_mod type(psb_cspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info end subroutine psb_cspspmm + end interface psb_spspmm + interface subroutine psb_ccsrspspmm(a,b,c,info) use psb_c_mat_mod, only : psb_c_csr_sparse_mat import :: psb_ipk_ @@ -232,6 +234,8 @@ module psb_c_serial_mod type(psb_lcspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info end subroutine psb_lcspspmm + end interface psb_spspmm + interface subroutine psb_lccsrspspmm(a,b,c,info) use psb_c_mat_mod, only : psb_lc_csr_sparse_mat import :: psb_ipk_ @@ -248,7 +252,7 @@ module psb_c_serial_mod type(psb_lc_csc_sparse_mat), intent(out) :: c integer(psb_ipk_), intent(out) :: info end subroutine psb_lccscspspmm - end interface psb_spspmm + end interface interface psb_symbmm subroutine psb_lcsymbmm(a,b,c,info) diff --git a/base/modules/serial/psb_d_serial_mod.f90 b/base/modules/serial/psb_d_serial_mod.f90 index 523282f5..09344b70 100644 --- a/base/modules/serial/psb_d_serial_mod.f90 +++ b/base/modules/serial/psb_d_serial_mod.f90 @@ -60,6 +60,8 @@ module psb_d_serial_mod type(psb_dspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info end subroutine psb_dspspmm + end interface psb_spspmm + interface subroutine psb_dcsrspspmm(a,b,c,info) use psb_d_mat_mod, only : psb_d_csr_sparse_mat import :: psb_ipk_ @@ -232,6 +234,8 @@ module psb_d_serial_mod type(psb_ldspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info end subroutine psb_ldspspmm + end interface psb_spspmm + interface subroutine psb_ldcsrspspmm(a,b,c,info) use psb_d_mat_mod, only : psb_ld_csr_sparse_mat import :: psb_ipk_ @@ -248,7 +252,7 @@ module psb_d_serial_mod type(psb_ld_csc_sparse_mat), intent(out) :: c integer(psb_ipk_), intent(out) :: info end subroutine psb_ldcscspspmm - end interface psb_spspmm + end interface interface psb_symbmm subroutine psb_ldsymbmm(a,b,c,info) diff --git a/base/modules/serial/psb_s_serial_mod.f90 b/base/modules/serial/psb_s_serial_mod.f90 index 81583f64..da19d9ec 100644 --- a/base/modules/serial/psb_s_serial_mod.f90 +++ b/base/modules/serial/psb_s_serial_mod.f90 @@ -60,6 +60,8 @@ module psb_s_serial_mod type(psb_sspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info end subroutine psb_sspspmm + end interface psb_spspmm + interface subroutine psb_scsrspspmm(a,b,c,info) use psb_s_mat_mod, only : psb_s_csr_sparse_mat import :: psb_ipk_ @@ -232,6 +234,8 @@ module psb_s_serial_mod type(psb_lsspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info end subroutine psb_lsspspmm + end interface psb_spspmm + interface subroutine psb_lscsrspspmm(a,b,c,info) use psb_s_mat_mod, only : psb_ls_csr_sparse_mat import :: psb_ipk_ @@ -248,7 +252,7 @@ module psb_s_serial_mod type(psb_ls_csc_sparse_mat), intent(out) :: c integer(psb_ipk_), intent(out) :: info end subroutine psb_lscscspspmm - end interface psb_spspmm + end interface interface psb_symbmm subroutine psb_lssymbmm(a,b,c,info) diff --git a/base/modules/serial/psb_z_serial_mod.f90 b/base/modules/serial/psb_z_serial_mod.f90 index dbfce00b..70a3b42c 100644 --- a/base/modules/serial/psb_z_serial_mod.f90 +++ b/base/modules/serial/psb_z_serial_mod.f90 @@ -60,6 +60,8 @@ module psb_z_serial_mod type(psb_zspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info end subroutine psb_zspspmm + end interface psb_spspmm + interface subroutine psb_zcsrspspmm(a,b,c,info) use psb_z_mat_mod, only : psb_z_csr_sparse_mat import :: psb_ipk_ @@ -232,6 +234,8 @@ module psb_z_serial_mod type(psb_lzspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info end subroutine psb_lzspspmm + end interface psb_spspmm + interface subroutine psb_lzcsrspspmm(a,b,c,info) use psb_z_mat_mod, only : psb_lz_csr_sparse_mat import :: psb_ipk_ @@ -248,7 +252,7 @@ module psb_z_serial_mod type(psb_lz_csc_sparse_mat), intent(out) :: c integer(psb_ipk_), intent(out) :: info end subroutine psb_lzcscspspmm - end interface psb_spspmm + end interface interface psb_symbmm subroutine psb_lzsymbmm(a,b,c,info) diff --git a/base/serial/psb_cspspmm.f90 b/base/serial/psb_cspspmm.f90 index 83f22012..cdd45c3a 100644 --- a/base/serial/psb_cspspmm.f90 +++ b/base/serial/psb_cspspmm.f90 @@ -37,7 +37,7 @@ ! subroutine psb_cspspmm(a,b,c,info) use psb_mat_mod - use psb_c_serial_mod, psb_protect_name => psb_cspspmm + !use psb_c_serial_mod, psb_protect_name => psb_cspspmm implicit none type(psb_cspmat_type), intent(in) :: a,b @@ -48,6 +48,24 @@ subroutine psb_cspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm + interface + subroutine psb_ccsrspspmm(a,b,c,info) + use psb_c_mat_mod, only : psb_c_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_c_csr_sparse_mat), intent(in) :: a,b + type(psb_c_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_ccsrspspmm + subroutine psb_ccscspspmm(a,b,c,info) + use psb_c_mat_mod, only : psb_c_csc_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_c_csc_sparse_mat), intent(in) :: a,b + type(psb_c_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_ccscspspmm + end interface call psb_erractionsave(err_act) info = psb_success_ @@ -118,7 +136,7 @@ end subroutine psb_cspspmm subroutine psb_lcspspmm(a,b,c,info) use psb_mat_mod - use psb_c_serial_mod, psb_protect_name => psb_lcspspmm +! use psb_c_serial_mod, psb_protect_name => psb_lcspspmm implicit none type(psb_lcspmat_type), intent(in) :: a,b @@ -129,7 +147,25 @@ subroutine psb_lcspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm - call psb_erractionsave(err_act) + interface + subroutine psb_lccsrspspmm(a,b,c,info) + use psb_c_mat_mod, only : psb_lc_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_lc_csr_sparse_mat), intent(in) :: a,b + type(psb_lc_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lccsrspspmm + subroutine psb_lccscspspmm(a,b,c,info) + use psb_c_mat_mod, only : psb_lc_csc_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_lc_csc_sparse_mat), intent(in) :: a,b + type(psb_lc_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lccscspspmm + end interface + call psb_erractionsave(err_act) info = psb_success_ if ((a%is_null()) .or.(b%is_null())) then diff --git a/base/serial/psb_dspspmm.f90 b/base/serial/psb_dspspmm.f90 index e3e203d6..82c3b3f5 100644 --- a/base/serial/psb_dspspmm.f90 +++ b/base/serial/psb_dspspmm.f90 @@ -37,7 +37,7 @@ ! subroutine psb_dspspmm(a,b,c,info) use psb_mat_mod - use psb_d_serial_mod, psb_protect_name => psb_dspspmm + !use psb_d_serial_mod, psb_protect_name => psb_dspspmm implicit none type(psb_dspmat_type), intent(in) :: a,b @@ -48,6 +48,24 @@ subroutine psb_dspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm + interface + subroutine psb_dcsrspspmm(a,b,c,info) + use psb_d_mat_mod, only : psb_d_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_d_csr_sparse_mat), intent(in) :: a,b + type(psb_d_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_dcsrspspmm + subroutine psb_dcscspspmm(a,b,c,info) + use psb_d_mat_mod, only : psb_d_csc_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_d_csc_sparse_mat), intent(in) :: a,b + type(psb_d_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_dcscspspmm + end interface call psb_erractionsave(err_act) info = psb_success_ @@ -118,7 +136,7 @@ end subroutine psb_dspspmm subroutine psb_ldspspmm(a,b,c,info) use psb_mat_mod - use psb_d_serial_mod, psb_protect_name => psb_ldspspmm +! use psb_d_serial_mod, psb_protect_name => psb_ldspspmm implicit none type(psb_ldspmat_type), intent(in) :: a,b @@ -129,7 +147,25 @@ subroutine psb_ldspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm - call psb_erractionsave(err_act) + interface + subroutine psb_ldcsrspspmm(a,b,c,info) + use psb_d_mat_mod, only : psb_ld_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_ld_csr_sparse_mat), intent(in) :: a,b + type(psb_ld_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_ldcsrspspmm + subroutine psb_ldcscspspmm(a,b,c,info) + use psb_d_mat_mod, only : psb_ld_csc_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_ld_csc_sparse_mat), intent(in) :: a,b + type(psb_ld_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_ldcscspspmm + end interface + call psb_erractionsave(err_act) info = psb_success_ if ((a%is_null()) .or.(b%is_null())) then diff --git a/base/serial/psb_sspspmm.f90 b/base/serial/psb_sspspmm.f90 index e1ae9af3..792fb265 100644 --- a/base/serial/psb_sspspmm.f90 +++ b/base/serial/psb_sspspmm.f90 @@ -37,7 +37,7 @@ ! subroutine psb_sspspmm(a,b,c,info) use psb_mat_mod - use psb_s_serial_mod, psb_protect_name => psb_sspspmm + !use psb_s_serial_mod, psb_protect_name => psb_sspspmm implicit none type(psb_sspmat_type), intent(in) :: a,b @@ -48,6 +48,24 @@ subroutine psb_sspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm + interface + subroutine psb_scsrspspmm(a,b,c,info) + use psb_s_mat_mod, only : psb_s_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_s_csr_sparse_mat), intent(in) :: a,b + type(psb_s_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_scsrspspmm + subroutine psb_scscspspmm(a,b,c,info) + use psb_s_mat_mod, only : psb_s_csc_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_s_csc_sparse_mat), intent(in) :: a,b + type(psb_s_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_scscspspmm + end interface call psb_erractionsave(err_act) info = psb_success_ @@ -118,7 +136,7 @@ end subroutine psb_sspspmm subroutine psb_lsspspmm(a,b,c,info) use psb_mat_mod - use psb_s_serial_mod, psb_protect_name => psb_lsspspmm +! use psb_s_serial_mod, psb_protect_name => psb_lsspspmm implicit none type(psb_lsspmat_type), intent(in) :: a,b @@ -129,7 +147,25 @@ subroutine psb_lsspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm - call psb_erractionsave(err_act) + interface + subroutine psb_lscsrspspmm(a,b,c,info) + use psb_s_mat_mod, only : psb_ls_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_ls_csr_sparse_mat), intent(in) :: a,b + type(psb_ls_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lscsrspspmm + subroutine psb_lscscspspmm(a,b,c,info) + use psb_s_mat_mod, only : psb_ls_csc_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_ls_csc_sparse_mat), intent(in) :: a,b + type(psb_ls_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lscscspspmm + end interface + call psb_erractionsave(err_act) info = psb_success_ if ((a%is_null()) .or.(b%is_null())) then diff --git a/base/serial/psb_zspspmm.f90 b/base/serial/psb_zspspmm.f90 index e7b3df44..932ae20a 100644 --- a/base/serial/psb_zspspmm.f90 +++ b/base/serial/psb_zspspmm.f90 @@ -37,7 +37,7 @@ ! subroutine psb_zspspmm(a,b,c,info) use psb_mat_mod - use psb_z_serial_mod, psb_protect_name => psb_zspspmm + !use psb_z_serial_mod, psb_protect_name => psb_zspspmm implicit none type(psb_zspmat_type), intent(in) :: a,b @@ -48,6 +48,24 @@ subroutine psb_zspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm + interface + subroutine psb_zcsrspspmm(a,b,c,info) + use psb_z_mat_mod, only : psb_z_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_z_csr_sparse_mat), intent(in) :: a,b + type(psb_z_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_zcsrspspmm + subroutine psb_zcscspspmm(a,b,c,info) + use psb_z_mat_mod, only : psb_z_csc_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_z_csc_sparse_mat), intent(in) :: a,b + type(psb_z_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_zcscspspmm + end interface call psb_erractionsave(err_act) info = psb_success_ @@ -118,7 +136,7 @@ end subroutine psb_zspspmm subroutine psb_lzspspmm(a,b,c,info) use psb_mat_mod - use psb_z_serial_mod, psb_protect_name => psb_lzspspmm +! use psb_z_serial_mod, psb_protect_name => psb_lzspspmm implicit none type(psb_lzspmat_type), intent(in) :: a,b @@ -129,7 +147,25 @@ subroutine psb_lzspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm - call psb_erractionsave(err_act) + interface + subroutine psb_lzcsrspspmm(a,b,c,info) + use psb_z_mat_mod, only : psb_lz_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_lz_csr_sparse_mat), intent(in) :: a,b + type(psb_lz_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lzcsrspspmm + subroutine psb_lzcscspspmm(a,b,c,info) + use psb_z_mat_mod, only : psb_lz_csc_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_lz_csc_sparse_mat), intent(in) :: a,b + type(psb_lz_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lzcscspspmm + end interface + call psb_erractionsave(err_act) info = psb_success_ if ((a%is_null()) .or.(b%is_null())) then From dc25c789ef9aaa9b1e49fb5d145721fd9098f12a Mon Sep 17 00:00:00 2001 From: sfilippone Date: Thu, 18 Sep 2025 20:27:26 +0200 Subject: [PATCH 06/37] Fixes for Intel compilation take 2. To be completed. --- base/modules/penv/psi_penv_mod.F90 | 70 +++++++++++----------- base/modules/serial/psb_c_csc_mat_mod.f90 | 17 ++++++ base/modules/serial/psb_c_csr_mat_mod.f90 | 17 ++++++ base/modules/serial/psb_c_serial_mod.f90 | 38 +----------- base/modules/serial/psb_d_csc_mat_mod.f90 | 17 ++++++ base/modules/serial/psb_d_csr_mat_mod.f90 | 17 ++++++ base/modules/serial/psb_d_serial_mod.f90 | 38 +----------- base/modules/serial/psb_s_csc_mat_mod.f90 | 17 ++++++ base/modules/serial/psb_s_csr_mat_mod.f90 | 17 ++++++ base/modules/serial/psb_s_serial_mod.f90 | 38 +----------- base/modules/serial/psb_z_csc_mat_mod.f90 | 17 ++++++ base/modules/serial/psb_z_csr_mat_mod.f90 | 17 ++++++ base/modules/serial/psb_z_serial_mod.f90 | 38 +----------- base/serial/impl/psb_c_csc_impl.F90 | 8 +-- base/serial/impl/psb_c_csr_impl.F90 | 12 ++-- base/serial/impl/psb_d_csc_impl.F90 | 8 +-- base/serial/impl/psb_d_csr_impl.F90 | 12 ++-- base/serial/impl/psb_s_csc_impl.F90 | 8 +-- base/serial/impl/psb_s_csr_impl.F90 | 12 ++-- base/serial/impl/psb_z_csc_impl.F90 | 8 +-- base/serial/impl/psb_z_csr_impl.F90 | 12 ++-- base/serial/psb_cspspmm.f90 | 72 +++++++++++------------ base/serial/psb_dspspmm.f90 | 72 +++++++++++------------ base/serial/psb_sspspmm.f90 | 72 +++++++++++------------ base/serial/psb_zspspmm.f90 | 72 +++++++++++------------ base/tools/psb_c_par_csr_spspmm.f90 | 6 +- base/tools/psb_d_par_csr_spspmm.f90 | 6 +- base/tools/psb_s_par_csr_spspmm.f90 | 6 +- base/tools/psb_z_par_csr_spspmm.f90 | 6 +- 29 files changed, 376 insertions(+), 374 deletions(-) diff --git a/base/modules/penv/psi_penv_mod.F90 b/base/modules/penv/psi_penv_mod.F90 index 7091411d..249fd9b1 100644 --- a/base/modules/penv/psi_penv_mod.F90 +++ b/base/modules/penv/psi_penv_mod.F90 @@ -180,43 +180,45 @@ module psi_penv_mod use psb_const_mod use iso_c_binding - integer(psb_mpk_), parameter:: psb_int_tag = 543987 - integer(psb_mpk_), parameter:: psb_real_tag = psb_int_tag + 1 - integer(psb_mpk_), parameter:: psb_double_tag = psb_real_tag + 1 - integer(psb_mpk_), parameter:: psb_complex_tag = psb_double_tag + 1 - integer(psb_mpk_), parameter:: psb_dcomplex_tag = psb_complex_tag + 1 - integer(psb_mpk_), parameter:: psb_logical_tag = psb_dcomplex_tag + 1 - integer(psb_mpk_), parameter:: psb_char_tag = psb_logical_tag + 1 - integer(psb_mpk_), parameter:: psb_int8_tag = psb_char_tag + 1 - integer(psb_mpk_), parameter:: psb_int2_tag = psb_int8_tag + 1 - integer(psb_mpk_), parameter:: psb_int4_tag = psb_int2_tag + 1 - integer(psb_mpk_), parameter:: psb_long_tag = psb_int4_tag + 1 - - integer(psb_mpk_), parameter:: psb_int_swap_tag = psb_int_tag + psb_int_tag - integer(psb_mpk_), parameter:: psb_real_swap_tag = psb_real_tag + psb_int_tag - integer(psb_mpk_), parameter:: psb_double_swap_tag = psb_double_tag + psb_int_tag - integer(psb_mpk_), parameter:: psb_complex_swap_tag = psb_complex_tag + psb_int_tag - integer(psb_mpk_), parameter:: psb_dcomplex_swap_tag = psb_dcomplex_tag + psb_int_tag - integer(psb_mpk_), parameter:: psb_logical_swap_tag = psb_logical_tag + psb_int_tag - integer(psb_mpk_), parameter:: psb_char_swap_tag = psb_char_tag + psb_int_tag - integer(psb_mpk_), parameter:: psb_int8_swap_tag = psb_int8_tag + psb_int_tag - integer(psb_mpk_), parameter:: psb_int2_swap_tag = psb_int2_tag + psb_int_tag - integer(psb_mpk_), parameter:: psb_int4_swap_tag = psb_int4_tag + psb_int_tag - integer(psb_mpk_), parameter:: psb_long_swap_tag = psb_long_tag + psb_int_tag + integer(psb_mpk_), parameter :: psb_int_tag = 100 + integer(psb_mpk_), parameter :: psb_real_tag = psb_int_tag + 1 + integer(psb_mpk_), parameter :: psb_double_tag = psb_real_tag + 1 + integer(psb_mpk_), parameter :: psb_complex_tag = psb_double_tag + 1 + integer(psb_mpk_), parameter :: psb_dcomplex_tag = psb_complex_tag + 1 + integer(psb_mpk_), parameter :: psb_logical_tag = psb_dcomplex_tag + 1 + integer(psb_mpk_), parameter :: psb_char_tag = psb_logical_tag + 1 + integer(psb_mpk_), parameter :: psb_int8_tag = psb_char_tag + 1 + integer(psb_mpk_), parameter :: psb_int2_tag = psb_int8_tag + 1 + integer(psb_mpk_), parameter :: psb_int4_tag = psb_int2_tag + 1 + integer(psb_mpk_), parameter :: psb_long_tag = psb_int4_tag + 1 + + integer(psb_mpk_), parameter :: psb_max_simple_tag = psb_long_tag + 2 + + integer(psb_mpk_), parameter :: psb_int_swap_tag = psb_max_simple_tag + 1 + integer(psb_mpk_), parameter :: psb_real_swap_tag = psb_int_swap_tag + 1 + integer(psb_mpk_), parameter :: psb_double_swap_tag = psb_real_swap_tag + 1 + integer(psb_mpk_), parameter :: psb_complex_swap_tag = psb_double_swap_tag + 1 + integer(psb_mpk_), parameter :: psb_dcomplex_swap_tag = psb_complex_swap_tag + 1 + integer(psb_mpk_), parameter :: psb_logical_swap_tag = psb_dcomplex_swap_tag + 1 + integer(psb_mpk_), parameter :: psb_char_swap_tag = psb_logical_swap_tag + 1 + integer(psb_mpk_), parameter :: psb_int8_swap_tag = psb_char_swap_tag + 1 + integer(psb_mpk_), parameter :: psb_int2_swap_tag = psb_int8_swap_tag + 1 + integer(psb_mpk_), parameter :: psb_int4_swap_tag = psb_int2_swap_tag + 1 + integer(psb_mpk_), parameter :: psb_long_swap_tag = psb_int4_swap_tag + 1 - integer(psb_mpk_), private, parameter:: psb_int_type = 987543 - integer(psb_mpk_), private, parameter:: psb_real_type = psb_int_type + 1 - integer(psb_mpk_), private, parameter:: psb_double_type = psb_real_type + 1 - integer(psb_mpk_), private, parameter:: psb_complex_type = psb_double_type + 1 - integer(psb_mpk_), private, parameter:: psb_dcomplex_type = psb_complex_type + 1 - integer(psb_mpk_), private, parameter:: psb_logical_type = psb_dcomplex_type + 1 - integer(psb_mpk_), private, parameter:: psb_char_type = psb_logical_type + 1 - integer(psb_mpk_), private, parameter:: psb_int8_type = psb_char_type + 1 - integer(psb_mpk_), private, parameter:: psb_int2_type = psb_int8_type + 1 - integer(psb_mpk_), private, parameter:: psb_int4_type = psb_int2_type + 1 - integer(psb_mpk_), private, parameter:: psb_long_type = psb_int4_type + 1 + integer(psb_mpk_), private, parameter :: psb_int_type = 200 + integer(psb_mpk_), private, parameter :: psb_real_type = psb_int_type + 1 + integer(psb_mpk_), private, parameter :: psb_double_type = psb_real_type + 1 + integer(psb_mpk_), private, parameter :: psb_complex_type = psb_double_type + 1 + integer(psb_mpk_), private, parameter :: psb_dcomplex_type = psb_complex_type + 1 + integer(psb_mpk_), private, parameter :: psb_logical_type = psb_dcomplex_type + 1 + integer(psb_mpk_), private, parameter :: psb_char_type = psb_logical_type + 1 + integer(psb_mpk_), private, parameter :: psb_int8_type = psb_char_type + 1 + integer(psb_mpk_), private, parameter :: psb_int2_type = psb_int8_type + 1 + integer(psb_mpk_), private, parameter :: psb_int4_type = psb_int2_type + 1 + integer(psb_mpk_), private, parameter :: psb_long_type = psb_int4_type + 1 type psb_buffer_node integer(psb_mpk_) :: request diff --git a/base/modules/serial/psb_c_csc_mat_mod.f90 b/base/modules/serial/psb_c_csc_mat_mod.f90 index 5ccdd19a..d0f5a719 100644 --- a/base/modules/serial/psb_c_csc_mat_mod.f90 +++ b/base/modules/serial/psb_c_csc_mat_mod.f90 @@ -912,6 +912,23 @@ module psb_c_csc_mat_mod end subroutine psb_lc_csc_scals end interface + interface + subroutine psb_ccscspspmm(a,b,c,info) + import + implicit none + class(psb_c_csc_sparse_mat), intent(in) :: a,b + type(psb_c_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_ccscspspmm + subroutine psb_lccscspspmm(a,b,c,info) + import + implicit none + class(psb_lc_csc_sparse_mat), intent(in) :: a,b + type(psb_lc_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lccscspspmm + end interface + contains ! == =================================== diff --git a/base/modules/serial/psb_c_csr_mat_mod.f90 b/base/modules/serial/psb_c_csr_mat_mod.f90 index a39c204b..3aa09667 100644 --- a/base/modules/serial/psb_c_csr_mat_mod.f90 +++ b/base/modules/serial/psb_c_csr_mat_mod.f90 @@ -1162,6 +1162,23 @@ module psb_c_csr_mat_mod end subroutine psb_lc_csr_aclsum end interface + ! Interfaces for SPSPMM + interface + subroutine psb_ccsrspspmm(a,b,c,info) + import + implicit none + class(psb_c_csr_sparse_mat), intent(in) :: a,b + type(psb_c_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_ccsrspspmm + subroutine psb_lccsrspspmm(a,b,c,info) + import + implicit none + class(psb_lc_csr_sparse_mat), intent(in) :: a,b + type(psb_lc_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lccsrspspmm + end interface contains diff --git a/base/modules/serial/psb_c_serial_mod.f90 b/base/modules/serial/psb_c_serial_mod.f90 index 9da008c6..24fba38e 100644 --- a/base/modules/serial/psb_c_serial_mod.f90 +++ b/base/modules/serial/psb_c_serial_mod.f90 @@ -61,25 +61,7 @@ module psb_c_serial_mod integer(psb_ipk_), intent(out) :: info end subroutine psb_cspspmm end interface psb_spspmm - interface - subroutine psb_ccsrspspmm(a,b,c,info) - use psb_c_mat_mod, only : psb_c_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_c_csr_sparse_mat), intent(in) :: a,b - type(psb_c_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_ccsrspspmm - subroutine psb_ccscspspmm(a,b,c,info) - use psb_c_mat_mod, only : psb_c_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_c_csc_sparse_mat), intent(in) :: a,b - type(psb_c_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_ccscspspmm - end interface - + interface psb_symbmm subroutine psb_csymbmm(a,b,c,info) use psb_c_mat_mod, only : psb_cspmat_type @@ -235,24 +217,6 @@ module psb_c_serial_mod integer(psb_ipk_), intent(out) :: info end subroutine psb_lcspspmm end interface psb_spspmm - interface - subroutine psb_lccsrspspmm(a,b,c,info) - use psb_c_mat_mod, only : psb_lc_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_lc_csr_sparse_mat), intent(in) :: a,b - type(psb_lc_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_lccsrspspmm - subroutine psb_lccscspspmm(a,b,c,info) - use psb_c_mat_mod, only : psb_lc_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_lc_csc_sparse_mat), intent(in) :: a,b - type(psb_lc_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_lccscspspmm - end interface interface psb_symbmm subroutine psb_lcsymbmm(a,b,c,info) diff --git a/base/modules/serial/psb_d_csc_mat_mod.f90 b/base/modules/serial/psb_d_csc_mat_mod.f90 index 08d31256..9618536f 100644 --- a/base/modules/serial/psb_d_csc_mat_mod.f90 +++ b/base/modules/serial/psb_d_csc_mat_mod.f90 @@ -912,6 +912,23 @@ module psb_d_csc_mat_mod end subroutine psb_ld_csc_scals end interface + interface + subroutine psb_dcscspspmm(a,b,c,info) + import + implicit none + class(psb_d_csc_sparse_mat), intent(in) :: a,b + type(psb_d_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_dcscspspmm + subroutine psb_ldcscspspmm(a,b,c,info) + import + implicit none + class(psb_ld_csc_sparse_mat), intent(in) :: a,b + type(psb_ld_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_ldcscspspmm + end interface + contains ! == =================================== diff --git a/base/modules/serial/psb_d_csr_mat_mod.f90 b/base/modules/serial/psb_d_csr_mat_mod.f90 index 0669725f..bee32af0 100644 --- a/base/modules/serial/psb_d_csr_mat_mod.f90 +++ b/base/modules/serial/psb_d_csr_mat_mod.f90 @@ -1162,6 +1162,23 @@ module psb_d_csr_mat_mod end subroutine psb_ld_csr_aclsum end interface + ! Interfaces for SPSPMM + interface + subroutine psb_dcsrspspmm(a,b,c,info) + import + implicit none + class(psb_d_csr_sparse_mat), intent(in) :: a,b + type(psb_d_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_dcsrspspmm + subroutine psb_ldcsrspspmm(a,b,c,info) + import + implicit none + class(psb_ld_csr_sparse_mat), intent(in) :: a,b + type(psb_ld_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_ldcsrspspmm + end interface contains diff --git a/base/modules/serial/psb_d_serial_mod.f90 b/base/modules/serial/psb_d_serial_mod.f90 index 09344b70..1c186cf7 100644 --- a/base/modules/serial/psb_d_serial_mod.f90 +++ b/base/modules/serial/psb_d_serial_mod.f90 @@ -61,25 +61,7 @@ module psb_d_serial_mod integer(psb_ipk_), intent(out) :: info end subroutine psb_dspspmm end interface psb_spspmm - interface - subroutine psb_dcsrspspmm(a,b,c,info) - use psb_d_mat_mod, only : psb_d_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_d_csr_sparse_mat), intent(in) :: a,b - type(psb_d_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_dcsrspspmm - subroutine psb_dcscspspmm(a,b,c,info) - use psb_d_mat_mod, only : psb_d_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_d_csc_sparse_mat), intent(in) :: a,b - type(psb_d_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_dcscspspmm - end interface - + interface psb_symbmm subroutine psb_dsymbmm(a,b,c,info) use psb_d_mat_mod, only : psb_dspmat_type @@ -235,24 +217,6 @@ module psb_d_serial_mod integer(psb_ipk_), intent(out) :: info end subroutine psb_ldspspmm end interface psb_spspmm - interface - subroutine psb_ldcsrspspmm(a,b,c,info) - use psb_d_mat_mod, only : psb_ld_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_ld_csr_sparse_mat), intent(in) :: a,b - type(psb_ld_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_ldcsrspspmm - subroutine psb_ldcscspspmm(a,b,c,info) - use psb_d_mat_mod, only : psb_ld_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_ld_csc_sparse_mat), intent(in) :: a,b - type(psb_ld_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_ldcscspspmm - end interface interface psb_symbmm subroutine psb_ldsymbmm(a,b,c,info) diff --git a/base/modules/serial/psb_s_csc_mat_mod.f90 b/base/modules/serial/psb_s_csc_mat_mod.f90 index db874600..75cccc9d 100644 --- a/base/modules/serial/psb_s_csc_mat_mod.f90 +++ b/base/modules/serial/psb_s_csc_mat_mod.f90 @@ -912,6 +912,23 @@ module psb_s_csc_mat_mod end subroutine psb_ls_csc_scals end interface + interface + subroutine psb_scscspspmm(a,b,c,info) + import + implicit none + class(psb_s_csc_sparse_mat), intent(in) :: a,b + type(psb_s_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_scscspspmm + subroutine psb_lscscspspmm(a,b,c,info) + import + implicit none + class(psb_ls_csc_sparse_mat), intent(in) :: a,b + type(psb_ls_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lscscspspmm + end interface + contains ! == =================================== diff --git a/base/modules/serial/psb_s_csr_mat_mod.f90 b/base/modules/serial/psb_s_csr_mat_mod.f90 index 356e5b32..b70b2dc6 100644 --- a/base/modules/serial/psb_s_csr_mat_mod.f90 +++ b/base/modules/serial/psb_s_csr_mat_mod.f90 @@ -1162,6 +1162,23 @@ module psb_s_csr_mat_mod end subroutine psb_ls_csr_aclsum end interface + ! Interfaces for SPSPMM + interface + subroutine psb_scsrspspmm(a,b,c,info) + import + implicit none + class(psb_s_csr_sparse_mat), intent(in) :: a,b + type(psb_s_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_scsrspspmm + subroutine psb_lscsrspspmm(a,b,c,info) + import + implicit none + class(psb_ls_csr_sparse_mat), intent(in) :: a,b + type(psb_ls_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lscsrspspmm + end interface contains diff --git a/base/modules/serial/psb_s_serial_mod.f90 b/base/modules/serial/psb_s_serial_mod.f90 index da19d9ec..9872e53e 100644 --- a/base/modules/serial/psb_s_serial_mod.f90 +++ b/base/modules/serial/psb_s_serial_mod.f90 @@ -61,25 +61,7 @@ module psb_s_serial_mod integer(psb_ipk_), intent(out) :: info end subroutine psb_sspspmm end interface psb_spspmm - interface - subroutine psb_scsrspspmm(a,b,c,info) - use psb_s_mat_mod, only : psb_s_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_s_csr_sparse_mat), intent(in) :: a,b - type(psb_s_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_scsrspspmm - subroutine psb_scscspspmm(a,b,c,info) - use psb_s_mat_mod, only : psb_s_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_s_csc_sparse_mat), intent(in) :: a,b - type(psb_s_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_scscspspmm - end interface - + interface psb_symbmm subroutine psb_ssymbmm(a,b,c,info) use psb_s_mat_mod, only : psb_sspmat_type @@ -235,24 +217,6 @@ module psb_s_serial_mod integer(psb_ipk_), intent(out) :: info end subroutine psb_lsspspmm end interface psb_spspmm - interface - subroutine psb_lscsrspspmm(a,b,c,info) - use psb_s_mat_mod, only : psb_ls_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_ls_csr_sparse_mat), intent(in) :: a,b - type(psb_ls_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_lscsrspspmm - subroutine psb_lscscspspmm(a,b,c,info) - use psb_s_mat_mod, only : psb_ls_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_ls_csc_sparse_mat), intent(in) :: a,b - type(psb_ls_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_lscscspspmm - end interface interface psb_symbmm subroutine psb_lssymbmm(a,b,c,info) diff --git a/base/modules/serial/psb_z_csc_mat_mod.f90 b/base/modules/serial/psb_z_csc_mat_mod.f90 index b9828f59..023bbf01 100644 --- a/base/modules/serial/psb_z_csc_mat_mod.f90 +++ b/base/modules/serial/psb_z_csc_mat_mod.f90 @@ -912,6 +912,23 @@ module psb_z_csc_mat_mod end subroutine psb_lz_csc_scals end interface + interface + subroutine psb_zcscspspmm(a,b,c,info) + import + implicit none + class(psb_z_csc_sparse_mat), intent(in) :: a,b + type(psb_z_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_zcscspspmm + subroutine psb_lzcscspspmm(a,b,c,info) + import + implicit none + class(psb_lz_csc_sparse_mat), intent(in) :: a,b + type(psb_lz_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lzcscspspmm + end interface + contains ! == =================================== diff --git a/base/modules/serial/psb_z_csr_mat_mod.f90 b/base/modules/serial/psb_z_csr_mat_mod.f90 index 0bc66bcc..1703c6c8 100644 --- a/base/modules/serial/psb_z_csr_mat_mod.f90 +++ b/base/modules/serial/psb_z_csr_mat_mod.f90 @@ -1162,6 +1162,23 @@ module psb_z_csr_mat_mod end subroutine psb_lz_csr_aclsum end interface + ! Interfaces for SPSPMM + interface + subroutine psb_zcsrspspmm(a,b,c,info) + import + implicit none + class(psb_z_csr_sparse_mat), intent(in) :: a,b + type(psb_z_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_zcsrspspmm + subroutine psb_lzcsrspspmm(a,b,c,info) + import + implicit none + class(psb_lz_csr_sparse_mat), intent(in) :: a,b + type(psb_lz_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lzcsrspspmm + end interface contains diff --git a/base/modules/serial/psb_z_serial_mod.f90 b/base/modules/serial/psb_z_serial_mod.f90 index 70a3b42c..fa0b3ef2 100644 --- a/base/modules/serial/psb_z_serial_mod.f90 +++ b/base/modules/serial/psb_z_serial_mod.f90 @@ -61,25 +61,7 @@ module psb_z_serial_mod integer(psb_ipk_), intent(out) :: info end subroutine psb_zspspmm end interface psb_spspmm - interface - subroutine psb_zcsrspspmm(a,b,c,info) - use psb_z_mat_mod, only : psb_z_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_z_csr_sparse_mat), intent(in) :: a,b - type(psb_z_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_zcsrspspmm - subroutine psb_zcscspspmm(a,b,c,info) - use psb_z_mat_mod, only : psb_z_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_z_csc_sparse_mat), intent(in) :: a,b - type(psb_z_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_zcscspspmm - end interface - + interface psb_symbmm subroutine psb_zsymbmm(a,b,c,info) use psb_z_mat_mod, only : psb_zspmat_type @@ -235,24 +217,6 @@ module psb_z_serial_mod integer(psb_ipk_), intent(out) :: info end subroutine psb_lzspspmm end interface psb_spspmm - interface - subroutine psb_lzcsrspspmm(a,b,c,info) - use psb_z_mat_mod, only : psb_lz_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_lz_csr_sparse_mat), intent(in) :: a,b - type(psb_lz_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_lzcsrspspmm - subroutine psb_lzcscspspmm(a,b,c,info) - use psb_z_mat_mod, only : psb_lz_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_lz_csc_sparse_mat), intent(in) :: a,b - type(psb_lz_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_lzcscspspmm - end interface interface psb_symbmm subroutine psb_lzsymbmm(a,b,c,info) diff --git a/base/serial/impl/psb_c_csc_impl.F90 b/base/serial/impl/psb_c_csc_impl.F90 index 94744dcf..4073a1ac 100644 --- a/base/serial/impl/psb_c_csc_impl.F90 +++ b/base/serial/impl/psb_c_csc_impl.F90 @@ -2824,8 +2824,8 @@ subroutine psb_c_csc_print(iout,a,iv,head,ivr,ivc) end subroutine psb_c_csc_print subroutine psb_ccscspspmm(a,b,c,info) - use psb_c_mat_mod - use psb_serial_mod, psb_protect_name => psb_ccscspspmm + use psb_c_csc_mat_mod, psb_protect_name => psb_ccscspspmm + use psb_serial_mod implicit none @@ -4664,8 +4664,8 @@ subroutine psb_lc_csc_print(iout,a,iv,head,ivr,ivc) end subroutine psb_lc_csc_print subroutine psb_lccscspspmm(a,b,c,info) - use psb_c_mat_mod - use psb_serial_mod, psb_protect_name => psb_lccscspspmm + use psb_c_csc_mat_mod, psb_protect_name => psb_lccscspspmm + use psb_serial_mod implicit none diff --git a/base/serial/impl/psb_c_csr_impl.F90 b/base/serial/impl/psb_c_csr_impl.F90 index 904bc6e7..76b96288 100644 --- a/base/serial/impl/psb_c_csr_impl.F90 +++ b/base/serial/impl/psb_c_csr_impl.F90 @@ -3657,8 +3657,8 @@ end subroutine psb_c_cp_csr_from_fmt #if defined(PSB_OPENMP) subroutine psb_ccsrspspmm(a,b,c,info) - use psb_c_mat_mod - use psb_serial_mod, psb_protect_name => psb_ccsrspspmm + use psb_c_csr_mat_mod, psb_protect_name => psb_ccsrspspmm + use psb_serial_mod implicit none @@ -4204,8 +4204,8 @@ end subroutine psb_ccsrspspmm #else subroutine psb_ccsrspspmm(a,b,c,info) - use psb_c_mat_mod - use psb_serial_mod, psb_protect_name => psb_ccsrspspmm + use psb_c_csr_mat_mod, psb_protect_name => psb_ccsrspspmm + use psb_serial_mod implicit none @@ -6580,8 +6580,8 @@ end subroutine psb_lc_cp_csr_from_fmt !!$end subroutine psb_lc_csr_clean_zeros subroutine psb_lccsrspspmm(a,b,c,info) - use psb_c_mat_mod - use psb_serial_mod, psb_protect_name => psb_lccsrspspmm + use psb_c_csr_mat_mod, psb_protect_name => psb_lccsrspspmm + use psb_serial_mod implicit none diff --git a/base/serial/impl/psb_d_csc_impl.F90 b/base/serial/impl/psb_d_csc_impl.F90 index ba38e763..e91285cd 100644 --- a/base/serial/impl/psb_d_csc_impl.F90 +++ b/base/serial/impl/psb_d_csc_impl.F90 @@ -2824,8 +2824,8 @@ subroutine psb_d_csc_print(iout,a,iv,head,ivr,ivc) end subroutine psb_d_csc_print subroutine psb_dcscspspmm(a,b,c,info) - use psb_d_mat_mod - use psb_serial_mod, psb_protect_name => psb_dcscspspmm + use psb_d_csc_mat_mod, psb_protect_name => psb_dcscspspmm + use psb_serial_mod implicit none @@ -4664,8 +4664,8 @@ subroutine psb_ld_csc_print(iout,a,iv,head,ivr,ivc) end subroutine psb_ld_csc_print subroutine psb_ldcscspspmm(a,b,c,info) - use psb_d_mat_mod - use psb_serial_mod, psb_protect_name => psb_ldcscspspmm + use psb_d_csc_mat_mod, psb_protect_name => psb_ldcscspspmm + use psb_serial_mod implicit none diff --git a/base/serial/impl/psb_d_csr_impl.F90 b/base/serial/impl/psb_d_csr_impl.F90 index 952bb1e9..17d6bb8e 100644 --- a/base/serial/impl/psb_d_csr_impl.F90 +++ b/base/serial/impl/psb_d_csr_impl.F90 @@ -3657,8 +3657,8 @@ end subroutine psb_d_cp_csr_from_fmt #if defined(PSB_OPENMP) subroutine psb_dcsrspspmm(a,b,c,info) - use psb_d_mat_mod - use psb_serial_mod, psb_protect_name => psb_dcsrspspmm + use psb_d_csr_mat_mod, psb_protect_name => psb_dcsrspspmm + use psb_serial_mod implicit none @@ -4204,8 +4204,8 @@ end subroutine psb_dcsrspspmm #else subroutine psb_dcsrspspmm(a,b,c,info) - use psb_d_mat_mod - use psb_serial_mod, psb_protect_name => psb_dcsrspspmm + use psb_d_csr_mat_mod, psb_protect_name => psb_dcsrspspmm + use psb_serial_mod implicit none @@ -6580,8 +6580,8 @@ end subroutine psb_ld_cp_csr_from_fmt !!$end subroutine psb_ld_csr_clean_zeros subroutine psb_ldcsrspspmm(a,b,c,info) - use psb_d_mat_mod - use psb_serial_mod, psb_protect_name => psb_ldcsrspspmm + use psb_d_csr_mat_mod, psb_protect_name => psb_ldcsrspspmm + use psb_serial_mod implicit none diff --git a/base/serial/impl/psb_s_csc_impl.F90 b/base/serial/impl/psb_s_csc_impl.F90 index 73c11ce6..9dd32d58 100644 --- a/base/serial/impl/psb_s_csc_impl.F90 +++ b/base/serial/impl/psb_s_csc_impl.F90 @@ -2824,8 +2824,8 @@ subroutine psb_s_csc_print(iout,a,iv,head,ivr,ivc) end subroutine psb_s_csc_print subroutine psb_scscspspmm(a,b,c,info) - use psb_s_mat_mod - use psb_serial_mod, psb_protect_name => psb_scscspspmm + use psb_s_csc_mat_mod, psb_protect_name => psb_scscspspmm + use psb_serial_mod implicit none @@ -4664,8 +4664,8 @@ subroutine psb_ls_csc_print(iout,a,iv,head,ivr,ivc) end subroutine psb_ls_csc_print subroutine psb_lscscspspmm(a,b,c,info) - use psb_s_mat_mod - use psb_serial_mod, psb_protect_name => psb_lscscspspmm + use psb_s_csc_mat_mod, psb_protect_name => psb_lscscspspmm + use psb_serial_mod implicit none diff --git a/base/serial/impl/psb_s_csr_impl.F90 b/base/serial/impl/psb_s_csr_impl.F90 index f384ef33..5522bf85 100644 --- a/base/serial/impl/psb_s_csr_impl.F90 +++ b/base/serial/impl/psb_s_csr_impl.F90 @@ -3657,8 +3657,8 @@ end subroutine psb_s_cp_csr_from_fmt #if defined(PSB_OPENMP) subroutine psb_scsrspspmm(a,b,c,info) - use psb_s_mat_mod - use psb_serial_mod, psb_protect_name => psb_scsrspspmm + use psb_s_csr_mat_mod, psb_protect_name => psb_scsrspspmm + use psb_serial_mod implicit none @@ -4204,8 +4204,8 @@ end subroutine psb_scsrspspmm #else subroutine psb_scsrspspmm(a,b,c,info) - use psb_s_mat_mod - use psb_serial_mod, psb_protect_name => psb_scsrspspmm + use psb_s_csr_mat_mod, psb_protect_name => psb_scsrspspmm + use psb_serial_mod implicit none @@ -6580,8 +6580,8 @@ end subroutine psb_ls_cp_csr_from_fmt !!$end subroutine psb_ls_csr_clean_zeros subroutine psb_lscsrspspmm(a,b,c,info) - use psb_s_mat_mod - use psb_serial_mod, psb_protect_name => psb_lscsrspspmm + use psb_s_csr_mat_mod, psb_protect_name => psb_lscsrspspmm + use psb_serial_mod implicit none diff --git a/base/serial/impl/psb_z_csc_impl.F90 b/base/serial/impl/psb_z_csc_impl.F90 index 95de776d..4a06d8d8 100644 --- a/base/serial/impl/psb_z_csc_impl.F90 +++ b/base/serial/impl/psb_z_csc_impl.F90 @@ -2824,8 +2824,8 @@ subroutine psb_z_csc_print(iout,a,iv,head,ivr,ivc) end subroutine psb_z_csc_print subroutine psb_zcscspspmm(a,b,c,info) - use psb_z_mat_mod - use psb_serial_mod, psb_protect_name => psb_zcscspspmm + use psb_z_csc_mat_mod, psb_protect_name => psb_zcscspspmm + use psb_serial_mod implicit none @@ -4664,8 +4664,8 @@ subroutine psb_lz_csc_print(iout,a,iv,head,ivr,ivc) end subroutine psb_lz_csc_print subroutine psb_lzcscspspmm(a,b,c,info) - use psb_z_mat_mod - use psb_serial_mod, psb_protect_name => psb_lzcscspspmm + use psb_z_csc_mat_mod, psb_protect_name => psb_lzcscspspmm + use psb_serial_mod implicit none diff --git a/base/serial/impl/psb_z_csr_impl.F90 b/base/serial/impl/psb_z_csr_impl.F90 index dd4be13a..ccd55f0a 100644 --- a/base/serial/impl/psb_z_csr_impl.F90 +++ b/base/serial/impl/psb_z_csr_impl.F90 @@ -3657,8 +3657,8 @@ end subroutine psb_z_cp_csr_from_fmt #if defined(PSB_OPENMP) subroutine psb_zcsrspspmm(a,b,c,info) - use psb_z_mat_mod - use psb_serial_mod, psb_protect_name => psb_zcsrspspmm + use psb_z_csr_mat_mod, psb_protect_name => psb_zcsrspspmm + use psb_serial_mod implicit none @@ -4204,8 +4204,8 @@ end subroutine psb_zcsrspspmm #else subroutine psb_zcsrspspmm(a,b,c,info) - use psb_z_mat_mod - use psb_serial_mod, psb_protect_name => psb_zcsrspspmm + use psb_z_csr_mat_mod, psb_protect_name => psb_zcsrspspmm + use psb_serial_mod implicit none @@ -6580,8 +6580,8 @@ end subroutine psb_lz_cp_csr_from_fmt !!$end subroutine psb_lz_csr_clean_zeros subroutine psb_lzcsrspspmm(a,b,c,info) - use psb_z_mat_mod - use psb_serial_mod, psb_protect_name => psb_lzcsrspspmm + use psb_z_csr_mat_mod, psb_protect_name => psb_lzcsrspspmm + use psb_serial_mod implicit none diff --git a/base/serial/psb_cspspmm.f90 b/base/serial/psb_cspspmm.f90 index cdd45c3a..7e81c99c 100644 --- a/base/serial/psb_cspspmm.f90 +++ b/base/serial/psb_cspspmm.f90 @@ -48,24 +48,24 @@ subroutine psb_cspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm - interface - subroutine psb_ccsrspspmm(a,b,c,info) - use psb_c_mat_mod, only : psb_c_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_c_csr_sparse_mat), intent(in) :: a,b - type(psb_c_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_ccsrspspmm - subroutine psb_ccscspspmm(a,b,c,info) - use psb_c_mat_mod, only : psb_c_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_c_csc_sparse_mat), intent(in) :: a,b - type(psb_c_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_ccscspspmm - end interface +!!$ interface +!!$ subroutine psb_ccsrspspmm(a,b,c,info) +!!$ use psb_c_mat_mod, only : psb_c_csr_sparse_mat +!!$ import :: psb_ipk_ +!!$ implicit none +!!$ class(psb_c_csr_sparse_mat), intent(in) :: a,b +!!$ type(psb_c_csr_sparse_mat), intent(out) :: c +!!$ integer(psb_ipk_), intent(out) :: info +!!$ end subroutine psb_ccsrspspmm +!!$ subroutine psb_ccscspspmm(a,b,c,info) +!!$ use psb_c_mat_mod, only : psb_c_csc_sparse_mat +!!$ import :: psb_ipk_ +!!$ implicit none +!!$ class(psb_c_csc_sparse_mat), intent(in) :: a,b +!!$ type(psb_c_csc_sparse_mat), intent(out) :: c +!!$ integer(psb_ipk_), intent(out) :: info +!!$ end subroutine psb_ccscspspmm +!!$ end interface call psb_erractionsave(err_act) info = psb_success_ @@ -147,24 +147,24 @@ subroutine psb_lcspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm - interface - subroutine psb_lccsrspspmm(a,b,c,info) - use psb_c_mat_mod, only : psb_lc_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_lc_csr_sparse_mat), intent(in) :: a,b - type(psb_lc_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_lccsrspspmm - subroutine psb_lccscspspmm(a,b,c,info) - use psb_c_mat_mod, only : psb_lc_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_lc_csc_sparse_mat), intent(in) :: a,b - type(psb_lc_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_lccscspspmm - end interface +!!$ interface +!!$ subroutine psb_lccsrspspmm(a,b,c,info) +!!$ use psb_c_mat_mod, only : psb_lc_csr_sparse_mat +!!$ import :: psb_ipk_ +!!$ implicit none +!!$ class(psb_lc_csr_sparse_mat), intent(in) :: a,b +!!$ type(psb_lc_csr_sparse_mat), intent(out) :: c +!!$ integer(psb_ipk_), intent(out) :: info +!!$ end subroutine psb_lccsrspspmm +!!$ subroutine psb_lccscspspmm(a,b,c,info) +!!$ use psb_c_mat_mod, only : psb_lc_csc_sparse_mat +!!$ import :: psb_ipk_ +!!$ implicit none +!!$ class(psb_lc_csc_sparse_mat), intent(in) :: a,b +!!$ type(psb_lc_csc_sparse_mat), intent(out) :: c +!!$ integer(psb_ipk_), intent(out) :: info +!!$ end subroutine psb_lccscspspmm +!!$ end interface call psb_erractionsave(err_act) info = psb_success_ diff --git a/base/serial/psb_dspspmm.f90 b/base/serial/psb_dspspmm.f90 index 82c3b3f5..682c2628 100644 --- a/base/serial/psb_dspspmm.f90 +++ b/base/serial/psb_dspspmm.f90 @@ -48,24 +48,24 @@ subroutine psb_dspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm - interface - subroutine psb_dcsrspspmm(a,b,c,info) - use psb_d_mat_mod, only : psb_d_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_d_csr_sparse_mat), intent(in) :: a,b - type(psb_d_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_dcsrspspmm - subroutine psb_dcscspspmm(a,b,c,info) - use psb_d_mat_mod, only : psb_d_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_d_csc_sparse_mat), intent(in) :: a,b - type(psb_d_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_dcscspspmm - end interface +!!$ interface +!!$ subroutine psb_dcsrspspmm(a,b,c,info) +!!$ use psb_d_mat_mod, only : psb_d_csr_sparse_mat +!!$ import :: psb_ipk_ +!!$ implicit none +!!$ class(psb_d_csr_sparse_mat), intent(in) :: a,b +!!$ type(psb_d_csr_sparse_mat), intent(out) :: c +!!$ integer(psb_ipk_), intent(out) :: info +!!$ end subroutine psb_dcsrspspmm +!!$ subroutine psb_dcscspspmm(a,b,c,info) +!!$ use psb_d_mat_mod, only : psb_d_csc_sparse_mat +!!$ import :: psb_ipk_ +!!$ implicit none +!!$ class(psb_d_csc_sparse_mat), intent(in) :: a,b +!!$ type(psb_d_csc_sparse_mat), intent(out) :: c +!!$ integer(psb_ipk_), intent(out) :: info +!!$ end subroutine psb_dcscspspmm +!!$ end interface call psb_erractionsave(err_act) info = psb_success_ @@ -147,24 +147,24 @@ subroutine psb_ldspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm - interface - subroutine psb_ldcsrspspmm(a,b,c,info) - use psb_d_mat_mod, only : psb_ld_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_ld_csr_sparse_mat), intent(in) :: a,b - type(psb_ld_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_ldcsrspspmm - subroutine psb_ldcscspspmm(a,b,c,info) - use psb_d_mat_mod, only : psb_ld_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_ld_csc_sparse_mat), intent(in) :: a,b - type(psb_ld_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_ldcscspspmm - end interface +!!$ interface +!!$ subroutine psb_ldcsrspspmm(a,b,c,info) +!!$ use psb_d_mat_mod, only : psb_ld_csr_sparse_mat +!!$ import :: psb_ipk_ +!!$ implicit none +!!$ class(psb_ld_csr_sparse_mat), intent(in) :: a,b +!!$ type(psb_ld_csr_sparse_mat), intent(out) :: c +!!$ integer(psb_ipk_), intent(out) :: info +!!$ end subroutine psb_ldcsrspspmm +!!$ subroutine psb_ldcscspspmm(a,b,c,info) +!!$ use psb_d_mat_mod, only : psb_ld_csc_sparse_mat +!!$ import :: psb_ipk_ +!!$ implicit none +!!$ class(psb_ld_csc_sparse_mat), intent(in) :: a,b +!!$ type(psb_ld_csc_sparse_mat), intent(out) :: c +!!$ integer(psb_ipk_), intent(out) :: info +!!$ end subroutine psb_ldcscspspmm +!!$ end interface call psb_erractionsave(err_act) info = psb_success_ diff --git a/base/serial/psb_sspspmm.f90 b/base/serial/psb_sspspmm.f90 index 792fb265..f193a442 100644 --- a/base/serial/psb_sspspmm.f90 +++ b/base/serial/psb_sspspmm.f90 @@ -48,24 +48,24 @@ subroutine psb_sspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm - interface - subroutine psb_scsrspspmm(a,b,c,info) - use psb_s_mat_mod, only : psb_s_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_s_csr_sparse_mat), intent(in) :: a,b - type(psb_s_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_scsrspspmm - subroutine psb_scscspspmm(a,b,c,info) - use psb_s_mat_mod, only : psb_s_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_s_csc_sparse_mat), intent(in) :: a,b - type(psb_s_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_scscspspmm - end interface +!!$ interface +!!$ subroutine psb_scsrspspmm(a,b,c,info) +!!$ use psb_s_mat_mod, only : psb_s_csr_sparse_mat +!!$ import :: psb_ipk_ +!!$ implicit none +!!$ class(psb_s_csr_sparse_mat), intent(in) :: a,b +!!$ type(psb_s_csr_sparse_mat), intent(out) :: c +!!$ integer(psb_ipk_), intent(out) :: info +!!$ end subroutine psb_scsrspspmm +!!$ subroutine psb_scscspspmm(a,b,c,info) +!!$ use psb_s_mat_mod, only : psb_s_csc_sparse_mat +!!$ import :: psb_ipk_ +!!$ implicit none +!!$ class(psb_s_csc_sparse_mat), intent(in) :: a,b +!!$ type(psb_s_csc_sparse_mat), intent(out) :: c +!!$ integer(psb_ipk_), intent(out) :: info +!!$ end subroutine psb_scscspspmm +!!$ end interface call psb_erractionsave(err_act) info = psb_success_ @@ -147,24 +147,24 @@ subroutine psb_lsspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm - interface - subroutine psb_lscsrspspmm(a,b,c,info) - use psb_s_mat_mod, only : psb_ls_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_ls_csr_sparse_mat), intent(in) :: a,b - type(psb_ls_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_lscsrspspmm - subroutine psb_lscscspspmm(a,b,c,info) - use psb_s_mat_mod, only : psb_ls_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_ls_csc_sparse_mat), intent(in) :: a,b - type(psb_ls_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_lscscspspmm - end interface +!!$ interface +!!$ subroutine psb_lscsrspspmm(a,b,c,info) +!!$ use psb_s_mat_mod, only : psb_ls_csr_sparse_mat +!!$ import :: psb_ipk_ +!!$ implicit none +!!$ class(psb_ls_csr_sparse_mat), intent(in) :: a,b +!!$ type(psb_ls_csr_sparse_mat), intent(out) :: c +!!$ integer(psb_ipk_), intent(out) :: info +!!$ end subroutine psb_lscsrspspmm +!!$ subroutine psb_lscscspspmm(a,b,c,info) +!!$ use psb_s_mat_mod, only : psb_ls_csc_sparse_mat +!!$ import :: psb_ipk_ +!!$ implicit none +!!$ class(psb_ls_csc_sparse_mat), intent(in) :: a,b +!!$ type(psb_ls_csc_sparse_mat), intent(out) :: c +!!$ integer(psb_ipk_), intent(out) :: info +!!$ end subroutine psb_lscscspspmm +!!$ end interface call psb_erractionsave(err_act) info = psb_success_ diff --git a/base/serial/psb_zspspmm.f90 b/base/serial/psb_zspspmm.f90 index 932ae20a..b0a02cdc 100644 --- a/base/serial/psb_zspspmm.f90 +++ b/base/serial/psb_zspspmm.f90 @@ -48,24 +48,24 @@ subroutine psb_zspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm - interface - subroutine psb_zcsrspspmm(a,b,c,info) - use psb_z_mat_mod, only : psb_z_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_z_csr_sparse_mat), intent(in) :: a,b - type(psb_z_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_zcsrspspmm - subroutine psb_zcscspspmm(a,b,c,info) - use psb_z_mat_mod, only : psb_z_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_z_csc_sparse_mat), intent(in) :: a,b - type(psb_z_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_zcscspspmm - end interface +!!$ interface +!!$ subroutine psb_zcsrspspmm(a,b,c,info) +!!$ use psb_z_mat_mod, only : psb_z_csr_sparse_mat +!!$ import :: psb_ipk_ +!!$ implicit none +!!$ class(psb_z_csr_sparse_mat), intent(in) :: a,b +!!$ type(psb_z_csr_sparse_mat), intent(out) :: c +!!$ integer(psb_ipk_), intent(out) :: info +!!$ end subroutine psb_zcsrspspmm +!!$ subroutine psb_zcscspspmm(a,b,c,info) +!!$ use psb_z_mat_mod, only : psb_z_csc_sparse_mat +!!$ import :: psb_ipk_ +!!$ implicit none +!!$ class(psb_z_csc_sparse_mat), intent(in) :: a,b +!!$ type(psb_z_csc_sparse_mat), intent(out) :: c +!!$ integer(psb_ipk_), intent(out) :: info +!!$ end subroutine psb_zcscspspmm +!!$ end interface call psb_erractionsave(err_act) info = psb_success_ @@ -147,24 +147,24 @@ subroutine psb_lzspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm - interface - subroutine psb_lzcsrspspmm(a,b,c,info) - use psb_z_mat_mod, only : psb_lz_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_lz_csr_sparse_mat), intent(in) :: a,b - type(psb_lz_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_lzcsrspspmm - subroutine psb_lzcscspspmm(a,b,c,info) - use psb_z_mat_mod, only : psb_lz_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_lz_csc_sparse_mat), intent(in) :: a,b - type(psb_lz_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_lzcscspspmm - end interface +!!$ interface +!!$ subroutine psb_lzcsrspspmm(a,b,c,info) +!!$ use psb_z_mat_mod, only : psb_lz_csr_sparse_mat +!!$ import :: psb_ipk_ +!!$ implicit none +!!$ class(psb_lz_csr_sparse_mat), intent(in) :: a,b +!!$ type(psb_lz_csr_sparse_mat), intent(out) :: c +!!$ integer(psb_ipk_), intent(out) :: info +!!$ end subroutine psb_lzcsrspspmm +!!$ subroutine psb_lzcscspspmm(a,b,c,info) +!!$ use psb_z_mat_mod, only : psb_lz_csc_sparse_mat +!!$ import :: psb_ipk_ +!!$ implicit none +!!$ class(psb_lz_csc_sparse_mat), intent(in) :: a,b +!!$ type(psb_lz_csc_sparse_mat), intent(out) :: c +!!$ integer(psb_ipk_), intent(out) :: info +!!$ end subroutine psb_lzcscspspmm +!!$ end interface call psb_erractionsave(err_act) info = psb_success_ diff --git a/base/tools/psb_c_par_csr_spspmm.f90 b/base/tools/psb_c_par_csr_spspmm.f90 index 2dbd00f0..0d8e5989 100644 --- a/base/tools/psb_c_par_csr_spspmm.f90 +++ b/base/tools/psb_c_par_csr_spspmm.f90 @@ -66,7 +66,8 @@ Subroutine psb_c_par_csr_spspmm(acsr,desc_a,bcsr,ccsr,desc_c,info,data) use psb_comm_mod use psb_penv_mod use psb_c_tools_mod, psb_protect_name => psb_c_par_csr_spspmm - use psb_c_serial_mod, only : psb_ccsrspspmm, psb_cbase_rwextd + use psb_c_csr_mat_mod, only : psb_ccsrspspmm + use psb_c_serial_mod, only : psb_cbase_rwextd Implicit None type(psb_c_csr_sparse_mat),intent(in) :: acsr @@ -166,7 +167,8 @@ Subroutine psb_lc_par_csr_spspmm(acsr,desc_a,bcsr,ccsr,desc_c,info,data) use psb_comm_mod use psb_penv_mod use psb_c_tools_mod, psb_protect_name => psb_lc_par_csr_spspmm - use psb_c_serial_mod, only : psb_lccsrspspmm, psb_lcbase_rwextd + use psb_c_csr_mat_mod, only : psb_lccsrspspmm + use psb_c_serial_mod, only : psb_lcbase_rwextd Implicit None type(psb_lc_csr_sparse_mat),intent(in) :: acsr diff --git a/base/tools/psb_d_par_csr_spspmm.f90 b/base/tools/psb_d_par_csr_spspmm.f90 index 3ed62f05..3ab67561 100644 --- a/base/tools/psb_d_par_csr_spspmm.f90 +++ b/base/tools/psb_d_par_csr_spspmm.f90 @@ -66,7 +66,8 @@ Subroutine psb_d_par_csr_spspmm(acsr,desc_a,bcsr,ccsr,desc_c,info,data) use psb_comm_mod use psb_penv_mod use psb_d_tools_mod, psb_protect_name => psb_d_par_csr_spspmm - use psb_d_serial_mod, only : psb_dcsrspspmm, psb_dbase_rwextd + use psb_d_csr_mat_mod, only : psb_dcsrspspmm + use psb_d_serial_mod, only : psb_dbase_rwextd Implicit None type(psb_d_csr_sparse_mat),intent(in) :: acsr @@ -166,7 +167,8 @@ Subroutine psb_ld_par_csr_spspmm(acsr,desc_a,bcsr,ccsr,desc_c,info,data) use psb_comm_mod use psb_penv_mod use psb_d_tools_mod, psb_protect_name => psb_ld_par_csr_spspmm - use psb_d_serial_mod, only : psb_ldcsrspspmm, psb_ldbase_rwextd + use psb_d_csr_mat_mod, only : psb_ldcsrspspmm + use psb_d_serial_mod, only : psb_ldbase_rwextd Implicit None type(psb_ld_csr_sparse_mat),intent(in) :: acsr diff --git a/base/tools/psb_s_par_csr_spspmm.f90 b/base/tools/psb_s_par_csr_spspmm.f90 index 4e70478f..17bf4e44 100644 --- a/base/tools/psb_s_par_csr_spspmm.f90 +++ b/base/tools/psb_s_par_csr_spspmm.f90 @@ -66,7 +66,8 @@ Subroutine psb_s_par_csr_spspmm(acsr,desc_a,bcsr,ccsr,desc_c,info,data) use psb_comm_mod use psb_penv_mod use psb_s_tools_mod, psb_protect_name => psb_s_par_csr_spspmm - use psb_s_serial_mod, only : psb_scsrspspmm, psb_sbase_rwextd + use psb_s_csr_mat_mod, only : psb_scsrspspmm + use psb_s_serial_mod, only : psb_sbase_rwextd Implicit None type(psb_s_csr_sparse_mat),intent(in) :: acsr @@ -166,7 +167,8 @@ Subroutine psb_ls_par_csr_spspmm(acsr,desc_a,bcsr,ccsr,desc_c,info,data) use psb_comm_mod use psb_penv_mod use psb_s_tools_mod, psb_protect_name => psb_ls_par_csr_spspmm - use psb_s_serial_mod, only : psb_lscsrspspmm, psb_lsbase_rwextd + use psb_s_csr_mat_mod, only : psb_lscsrspspmm + use psb_s_serial_mod, only : psb_lsbase_rwextd Implicit None type(psb_ls_csr_sparse_mat),intent(in) :: acsr diff --git a/base/tools/psb_z_par_csr_spspmm.f90 b/base/tools/psb_z_par_csr_spspmm.f90 index 5ccf58d3..6629aee2 100644 --- a/base/tools/psb_z_par_csr_spspmm.f90 +++ b/base/tools/psb_z_par_csr_spspmm.f90 @@ -66,7 +66,8 @@ Subroutine psb_z_par_csr_spspmm(acsr,desc_a,bcsr,ccsr,desc_c,info,data) use psb_comm_mod use psb_penv_mod use psb_z_tools_mod, psb_protect_name => psb_z_par_csr_spspmm - use psb_z_serial_mod, only : psb_zcsrspspmm, psb_zbase_rwextd + use psb_z_csr_mat_mod, only : psb_zcsrspspmm + use psb_z_serial_mod, only : psb_zbase_rwextd Implicit None type(psb_z_csr_sparse_mat),intent(in) :: acsr @@ -166,7 +167,8 @@ Subroutine psb_lz_par_csr_spspmm(acsr,desc_a,bcsr,ccsr,desc_c,info,data) use psb_comm_mod use psb_penv_mod use psb_z_tools_mod, psb_protect_name => psb_lz_par_csr_spspmm - use psb_z_serial_mod, only : psb_lzcsrspspmm, psb_lzbase_rwextd + use psb_z_csr_mat_mod, only : psb_lzcsrspspmm + use psb_z_serial_mod, only : psb_lzbase_rwextd Implicit None type(psb_lz_csr_sparse_mat),intent(in) :: acsr From 6140b8c9e9e3265c3c35886cbbe721db8af2a22a Mon Sep 17 00:00:00 2001 From: sfilippone Date: Fri, 19 Sep 2025 08:52:40 +0200 Subject: [PATCH 07/37] Minor comment changes --- base/modules/psb_const_mod.F90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/base/modules/psb_const_mod.F90 b/base/modules/psb_const_mod.F90 index b4cacdca..d10bf974 100644 --- a/base/modules/psb_const_mod.F90 +++ b/base/modules/psb_const_mod.F90 @@ -35,7 +35,7 @@ module psb_const_mod use iso_fortran_env ! This is a 2-byte integer, just in case integer, parameter :: psb_i2pk_ = int16 - ! This is always a 4-byte integer, for MPI-related stuff + ! This is always a 4-byte integer. integer, parameter :: psb_mpk_ = int32 ! This is always an 8-byte integer. integer, parameter :: psb_epk_ = int64 @@ -51,7 +51,7 @@ module psb_const_mod ! This is a 2-byte integer, just in case integer, parameter :: i2ndig=4 integer, parameter :: psb_i2pk_ = selected_int_kind(i2ndig) - ! This is always a 4-byte integer, for MPI-related stuff + ! This is always a 4-byte integer. integer, parameter :: indig=8 integer, parameter :: psb_mpk_ = selected_int_kind(indig) ! This is always an 8-byte integer. From 0d69cdb005aa94a41f21e3436a6a1988cabb0c1d Mon Sep 17 00:00:00 2001 From: sfilippone Date: Fri, 19 Sep 2025 08:53:15 +0200 Subject: [PATCH 08/37] Further changes to constants for intel --- base/modules/penv/psi_penv_mod.F90 | 128 +++-------------------------- 1 file changed, 12 insertions(+), 116 deletions(-) diff --git a/base/modules/penv/psi_penv_mod.F90 b/base/modules/penv/psi_penv_mod.F90 index 249fd9b1..2792d22e 100644 --- a/base/modules/penv/psi_penv_mod.F90 +++ b/base/modules/penv/psi_penv_mod.F90 @@ -49,7 +49,9 @@ module mpi integer(psb_mpk_), parameter :: mpi_integer4 = 10 integer(psb_mpk_), parameter :: mpi_comm_null = -1 integer(psb_mpk_), parameter :: mpi_comm_world = 1 - + + integer(psb_mpk_), parameter :: mpi_address_kind = psb_epk_ + !real(psb_dpk_), external :: mpi_wtime interface @@ -179,7 +181,15 @@ end module mpi module psi_penv_mod use psb_const_mod use iso_c_binding - +#ifdef PSB_MPI_MOD + use mpi +#endif +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + integer(psb_mpk_), parameter :: psb_apk_ = mpi_address_kind + integer(psb_mpk_), parameter :: psb_int_tag = 100 integer(psb_mpk_), parameter :: psb_real_tag = psb_int_tag + 1 integer(psb_mpk_), parameter :: psb_double_tag = psb_real_tag + 1 @@ -343,13 +353,7 @@ contains end subroutine psb_init_queue subroutine psb_wait_buffer(node, info) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_buffer_node), intent(inout) :: node integer(psb_ipk_), intent(out) :: info integer(psb_mpk_) :: status(mpi_status_size),minfo @@ -359,13 +363,7 @@ contains end subroutine psb_wait_buffer subroutine psb_test_buffer(node, flag, info) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_buffer_node), intent(inout) :: node logical, intent(out) :: flag integer(psb_ipk_), intent(out) :: info @@ -478,13 +476,7 @@ contains ! ! !!!!!!!!!!!!!!!!! subroutine psi_msnd(ctxt,tag,dest,buffer,mesg_queue) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: tag, dest integer(psb_mpk_), allocatable, intent(inout) :: buffer(:) @@ -517,13 +509,7 @@ contains subroutine psi_esnd(ctxt,tag,dest,buffer,mesg_queue) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: tag, dest integer(psb_epk_), allocatable, intent(inout) :: buffer(:) @@ -554,13 +540,7 @@ contains end subroutine psi_esnd subroutine psi_i2snd(ctxt,tag,dest,buffer,mesg_queue) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: tag, dest integer(psb_i2pk_), allocatable, intent(inout) :: buffer(:) @@ -591,13 +571,7 @@ contains end subroutine psi_i2snd subroutine psi_ssnd(ctxt,tag,dest,buffer,mesg_queue) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: tag, dest real(psb_spk_), allocatable, intent(inout) :: buffer(:) @@ -628,13 +602,7 @@ contains end subroutine psi_ssnd subroutine psi_dsnd(ctxt,tag,dest,buffer,mesg_queue) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: tag, dest real(psb_dpk_), allocatable, intent(inout) :: buffer(:) @@ -665,13 +633,7 @@ contains end subroutine psi_dsnd subroutine psi_csnd(ctxt,tag,dest,buffer,mesg_queue) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: tag, dest complex(psb_spk_), allocatable, intent(inout) :: buffer(:) @@ -702,13 +664,7 @@ contains end subroutine psi_csnd subroutine psi_zsnd(ctxt,tag,dest,buffer,mesg_queue) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: tag, dest complex(psb_dpk_), allocatable, intent(inout) :: buffer(:) @@ -740,13 +696,7 @@ contains subroutine psi_logsnd(ctxt,tag,dest,buffer,mesg_queue) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: tag, dest logical, allocatable, intent(inout) :: buffer(:) @@ -778,13 +728,7 @@ contains subroutine psi_hsnd(ctxt,tag,dest,buffer,mesg_queue) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: tag, dest character(len=1), allocatable, intent(inout) :: buffer(:) @@ -853,13 +797,7 @@ contains end subroutine psi_get_sizes subroutine psi_register_mpi_extras(info) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif integer(psb_mpk_) :: info info = 0 @@ -943,13 +881,7 @@ contains use psb_mat_mod use psb_vect_mod ! !$ use psb_rsb_mod -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type), intent(out) :: ctxt type(psb_ctxt_type), intent(in), optional :: basectxt integer(psb_mpk_), intent(in), optional :: np, ids(:), extcomm @@ -1082,13 +1014,7 @@ contains use psb_mat_mod use psb_vect_mod ! !$ use psb_rsb_mod -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type), intent(inout) :: ctxt logical, intent(in), optional :: close logical :: close_ @@ -1156,13 +1082,7 @@ contains subroutine psb_barrier_mpik(ctxt) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type), intent(in) :: ctxt integer(psb_mpk_) :: info @@ -1177,13 +1097,7 @@ contains function psb_wtime() use psb_const_mod ! use mpi_constants -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif real(psb_dpk_) :: psb_wtime psb_wtime = mpi_wtime() @@ -1212,13 +1126,7 @@ contains subroutine psb_info_mpik(ctxt,iam,np) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type), intent(in) :: ctxt integer(psb_mpk_), intent(out) :: iam, np @@ -1271,13 +1179,7 @@ contains function psb_m_get_mpi_comm(ctxt) result(comm) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: comm comm = mpi_comm_null @@ -1293,13 +1195,7 @@ contains end function psb_m_get_mpi_rank subroutine psb_get_mpicomm(ctxt,comm) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: comm comm = mpi_comm_null From 42b8daae8c5b808a1b90818ebe727c14d48851b2 Mon Sep 17 00:00:00 2001 From: sfilippone Date: Fri, 19 Sep 2025 09:34:34 +0200 Subject: [PATCH 09/37] Use mpi_comm_get_attr to set tag values --- base/modules/penv/psi_penv_mod.F90 | 98 +++++++++++++++++++----------- 1 file changed, 64 insertions(+), 34 deletions(-) diff --git a/base/modules/penv/psi_penv_mod.F90 b/base/modules/penv/psi_penv_mod.F90 index 2792d22e..320df941 100644 --- a/base/modules/penv/psi_penv_mod.F90 +++ b/base/modules/penv/psi_penv_mod.F90 @@ -189,33 +189,32 @@ module psi_penv_mod #endif integer(psb_mpk_), parameter :: psb_apk_ = mpi_address_kind - - integer(psb_mpk_), parameter :: psb_int_tag = 100 - integer(psb_mpk_), parameter :: psb_real_tag = psb_int_tag + 1 - integer(psb_mpk_), parameter :: psb_double_tag = psb_real_tag + 1 - integer(psb_mpk_), parameter :: psb_complex_tag = psb_double_tag + 1 - integer(psb_mpk_), parameter :: psb_dcomplex_tag = psb_complex_tag + 1 - integer(psb_mpk_), parameter :: psb_logical_tag = psb_dcomplex_tag + 1 - integer(psb_mpk_), parameter :: psb_char_tag = psb_logical_tag + 1 - integer(psb_mpk_), parameter :: psb_int8_tag = psb_char_tag + 1 - integer(psb_mpk_), parameter :: psb_int2_tag = psb_int8_tag + 1 - integer(psb_mpk_), parameter :: psb_int4_tag = psb_int2_tag + 1 - integer(psb_mpk_), parameter :: psb_long_tag = psb_int4_tag + 1 - - integer(psb_mpk_), parameter :: psb_max_simple_tag = psb_long_tag + 2 - - integer(psb_mpk_), parameter :: psb_int_swap_tag = psb_max_simple_tag + 1 - integer(psb_mpk_), parameter :: psb_real_swap_tag = psb_int_swap_tag + 1 - integer(psb_mpk_), parameter :: psb_double_swap_tag = psb_real_swap_tag + 1 - integer(psb_mpk_), parameter :: psb_complex_swap_tag = psb_double_swap_tag + 1 - integer(psb_mpk_), parameter :: psb_dcomplex_swap_tag = psb_complex_swap_tag + 1 - integer(psb_mpk_), parameter :: psb_logical_swap_tag = psb_dcomplex_swap_tag + 1 - integer(psb_mpk_), parameter :: psb_char_swap_tag = psb_logical_swap_tag + 1 - integer(psb_mpk_), parameter :: psb_int8_swap_tag = psb_char_swap_tag + 1 - integer(psb_mpk_), parameter :: psb_int2_swap_tag = psb_int8_swap_tag + 1 - integer(psb_mpk_), parameter :: psb_int4_swap_tag = psb_int2_swap_tag + 1 - integer(psb_mpk_), parameter :: psb_long_swap_tag = psb_int4_swap_tag + 1 + integer(psb_mpk_), parameter :: psb_tag_space = 200 + + integer(psb_mpk_), save :: psb_int_tag + integer(psb_mpk_), save :: psb_real_tag + integer(psb_mpk_), save :: psb_double_tag + integer(psb_mpk_), save :: psb_complex_tag + integer(psb_mpk_), save :: psb_dcomplex_tag + integer(psb_mpk_), save :: psb_logical_tag + integer(psb_mpk_), save :: psb_char_tag + integer(psb_mpk_), save :: psb_int8_tag + integer(psb_mpk_), save :: psb_int2_tag + integer(psb_mpk_), save :: psb_int4_tag + integer(psb_mpk_), save :: psb_long_tag + integer(psb_mpk_), save :: psb_max_simple_tag + integer(psb_mpk_), save :: psb_int_swap_tag + integer(psb_mpk_), save :: psb_real_swap_tag + integer(psb_mpk_), save :: psb_double_swap_tag + integer(psb_mpk_), save :: psb_complex_swap_tag + integer(psb_mpk_), save :: psb_dcomplex_swap_tag + integer(psb_mpk_), save :: psb_logical_swap_tag + integer(psb_mpk_), save :: psb_char_swap_tag + integer(psb_mpk_), save :: psb_int8_swap_tag + integer(psb_mpk_), save :: psb_int2_swap_tag + integer(psb_mpk_), save :: psb_int4_swap_tag + integer(psb_mpk_), save :: psb_long_swap_tag integer(psb_mpk_), private, parameter :: psb_int_type = 200 @@ -316,7 +315,7 @@ module psi_penv_mod #endif - private :: psi_get_sizes, psi_register_mpi_extras + private :: psi_get_sizes, psi_register_mpi_const private :: psi_i2amx_op, psi_i2amn_op private :: psi_iamx_op, psi_iamn_op private :: psi_mamx_op, psi_mamn_op @@ -796,10 +795,12 @@ contains end subroutine psi_get_sizes - subroutine psi_register_mpi_extras(info) + subroutine psi_register_mpi_const(comm,info) implicit none - integer(psb_mpk_) :: info - + integer(psb_mpk_) :: comm,info + integer(psb_mpk_) :: ierror + integer(psb_apk_) :: tag_value + logical :: flag info = 0 #if 0 if (info == 0) call mpi_type_create_f90_integer(psb_ipk_, psb_mpi_ipk_ ,info) @@ -837,6 +838,7 @@ contains #endif #if defined(PSB_SERIAL_MPI) + tag_value = HUGE(psb_tag_space)/2 #else if (info == 0) call mpi_op_create(psi_i2amx_op,.true.,mpi_i2amx_op,info) if (info == 0) call mpi_op_create(psi_i2amn_op,.true.,mpi_i2amn_op,info) @@ -854,9 +856,37 @@ contains if (info == 0) call mpi_op_create(psi_zamn_op,.true.,mpi_zamn_op,info) if (info == 0) call mpi_op_create(psi_snrm2_op,.true.,mpi_snrm2_op,info) if (info == 0) call mpi_op_create(psi_dnrm2_op,.true.,mpi_dnrm2_op,info) + if (info == 0) call mpi_comm_get_attr(comm,mpi_tag_ub,tag_value,flag,ierror) + if ((ierror/=0).or.(.not.flag)) then + tag_value = 0 + info = psb_err_internal_error_ + end if #endif - - end subroutine psi_register_mpi_extras + psb_int_tag = tag_value - psb_tag_space + psb_real_tag = psb_int_tag + 1 + psb_double_tag = psb_real_tag + 1 + psb_complex_tag = psb_double_tag + 1 + psb_dcomplex_tag = psb_complex_tag + 1 + psb_logical_tag = psb_dcomplex_tag + 1 + psb_char_tag = psb_logical_tag + 1 + psb_int8_tag = psb_char_tag + 1 + psb_int2_tag = psb_int8_tag + 1 + psb_int4_tag = psb_int2_tag + 1 + psb_long_tag = psb_int4_tag + 1 + psb_max_simple_tag = psb_long_tag + 2 + psb_int_swap_tag = psb_max_simple_tag + 1 + psb_real_swap_tag = psb_int_swap_tag + 1 + psb_double_swap_tag = psb_real_swap_tag + 1 + psb_complex_swap_tag = psb_double_swap_tag + 1 + psb_dcomplex_swap_tag = psb_complex_swap_tag + 1 + psb_logical_swap_tag = psb_dcomplex_swap_tag + 1 + psb_char_swap_tag = psb_logical_swap_tag + 1 + psb_int8_swap_tag = psb_char_swap_tag + 1 + psb_int2_swap_tag = psb_int8_swap_tag + 1 + psb_int4_swap_tag = psb_int2_swap_tag + 1 + psb_long_swap_tag = psb_int4_swap_tag + 1 + + end subroutine psi_register_mpi_const #if (defined(PSB_IPK4) && defined(PSB_LPK8))||defined(PSB_IPK8) subroutine psb_info_epk(ctxt,iam,np) @@ -899,7 +929,7 @@ contains ctxt%ctxt = nctxt ! allocate on assignment nctxt = nctxt + 1 - call psi_register_mpi_extras(info) + call psi_register_mpi_const(nctxt,info) call psi_get_sizes() #else @@ -988,7 +1018,7 @@ contains if (info == 0) then ctxt%ctxt = icomm ! allocate on assignment end if - call psi_register_mpi_extras(info) + call psi_register_mpi_const(icomm,info) call psi_get_sizes() !if (ctxt == mpi_comm_null) return if (.not.allocated(ctxt%ctxt)) return From 2539b6c715ab9e07b0ff9704e8d43b102d40561a Mon Sep 17 00:00:00 2001 From: sfilippone Date: Fri, 19 Sep 2025 09:51:19 +0200 Subject: [PATCH 10/37] Fix interface location and use in spspmm --- base/serial/psb_cspspmm.f90 | 46 ++++++------------------------------- base/serial/psb_dspspmm.f90 | 46 ++++++------------------------------- base/serial/psb_sspspmm.f90 | 46 ++++++------------------------------- base/serial/psb_zspspmm.f90 | 46 ++++++------------------------------- 4 files changed, 28 insertions(+), 156 deletions(-) diff --git a/base/serial/psb_cspspmm.f90 b/base/serial/psb_cspspmm.f90 index 7e81c99c..a62bbcf6 100644 --- a/base/serial/psb_cspspmm.f90 +++ b/base/serial/psb_cspspmm.f90 @@ -37,7 +37,9 @@ ! subroutine psb_cspspmm(a,b,c,info) use psb_mat_mod - !use psb_c_serial_mod, psb_protect_name => psb_cspspmm + use psb_c_csr_mat_mod + use psb_c_csc_mat_mod + use psb_c_serial_mod, psb_protect_name => psb_cspspmm implicit none type(psb_cspmat_type), intent(in) :: a,b @@ -48,24 +50,6 @@ subroutine psb_cspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm -!!$ interface -!!$ subroutine psb_ccsrspspmm(a,b,c,info) -!!$ use psb_c_mat_mod, only : psb_c_csr_sparse_mat -!!$ import :: psb_ipk_ -!!$ implicit none -!!$ class(psb_c_csr_sparse_mat), intent(in) :: a,b -!!$ type(psb_c_csr_sparse_mat), intent(out) :: c -!!$ integer(psb_ipk_), intent(out) :: info -!!$ end subroutine psb_ccsrspspmm -!!$ subroutine psb_ccscspspmm(a,b,c,info) -!!$ use psb_c_mat_mod, only : psb_c_csc_sparse_mat -!!$ import :: psb_ipk_ -!!$ implicit none -!!$ class(psb_c_csc_sparse_mat), intent(in) :: a,b -!!$ type(psb_c_csc_sparse_mat), intent(out) :: c -!!$ integer(psb_ipk_), intent(out) :: info -!!$ end subroutine psb_ccscspspmm -!!$ end interface call psb_erractionsave(err_act) info = psb_success_ @@ -136,7 +120,9 @@ end subroutine psb_cspspmm subroutine psb_lcspspmm(a,b,c,info) use psb_mat_mod -! use psb_c_serial_mod, psb_protect_name => psb_lcspspmm + use psb_c_csr_mat_mod + use psb_c_csc_mat_mod + use psb_c_serial_mod, psb_protect_name => psb_lcspspmm implicit none type(psb_lcspmat_type), intent(in) :: a,b @@ -147,25 +133,7 @@ subroutine psb_lcspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm -!!$ interface -!!$ subroutine psb_lccsrspspmm(a,b,c,info) -!!$ use psb_c_mat_mod, only : psb_lc_csr_sparse_mat -!!$ import :: psb_ipk_ -!!$ implicit none -!!$ class(psb_lc_csr_sparse_mat), intent(in) :: a,b -!!$ type(psb_lc_csr_sparse_mat), intent(out) :: c -!!$ integer(psb_ipk_), intent(out) :: info -!!$ end subroutine psb_lccsrspspmm -!!$ subroutine psb_lccscspspmm(a,b,c,info) -!!$ use psb_c_mat_mod, only : psb_lc_csc_sparse_mat -!!$ import :: psb_ipk_ -!!$ implicit none -!!$ class(psb_lc_csc_sparse_mat), intent(in) :: a,b -!!$ type(psb_lc_csc_sparse_mat), intent(out) :: c -!!$ integer(psb_ipk_), intent(out) :: info -!!$ end subroutine psb_lccscspspmm -!!$ end interface - call psb_erractionsave(err_act) + call psb_erractionsave(err_act) info = psb_success_ if ((a%is_null()) .or.(b%is_null())) then diff --git a/base/serial/psb_dspspmm.f90 b/base/serial/psb_dspspmm.f90 index 682c2628..60059208 100644 --- a/base/serial/psb_dspspmm.f90 +++ b/base/serial/psb_dspspmm.f90 @@ -37,7 +37,9 @@ ! subroutine psb_dspspmm(a,b,c,info) use psb_mat_mod - !use psb_d_serial_mod, psb_protect_name => psb_dspspmm + use psb_d_csr_mat_mod + use psb_d_csc_mat_mod + use psb_d_serial_mod, psb_protect_name => psb_dspspmm implicit none type(psb_dspmat_type), intent(in) :: a,b @@ -48,24 +50,6 @@ subroutine psb_dspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm -!!$ interface -!!$ subroutine psb_dcsrspspmm(a,b,c,info) -!!$ use psb_d_mat_mod, only : psb_d_csr_sparse_mat -!!$ import :: psb_ipk_ -!!$ implicit none -!!$ class(psb_d_csr_sparse_mat), intent(in) :: a,b -!!$ type(psb_d_csr_sparse_mat), intent(out) :: c -!!$ integer(psb_ipk_), intent(out) :: info -!!$ end subroutine psb_dcsrspspmm -!!$ subroutine psb_dcscspspmm(a,b,c,info) -!!$ use psb_d_mat_mod, only : psb_d_csc_sparse_mat -!!$ import :: psb_ipk_ -!!$ implicit none -!!$ class(psb_d_csc_sparse_mat), intent(in) :: a,b -!!$ type(psb_d_csc_sparse_mat), intent(out) :: c -!!$ integer(psb_ipk_), intent(out) :: info -!!$ end subroutine psb_dcscspspmm -!!$ end interface call psb_erractionsave(err_act) info = psb_success_ @@ -136,7 +120,9 @@ end subroutine psb_dspspmm subroutine psb_ldspspmm(a,b,c,info) use psb_mat_mod -! use psb_d_serial_mod, psb_protect_name => psb_ldspspmm + use psb_d_csr_mat_mod + use psb_d_csc_mat_mod + use psb_d_serial_mod, psb_protect_name => psb_ldspspmm implicit none type(psb_ldspmat_type), intent(in) :: a,b @@ -147,25 +133,7 @@ subroutine psb_ldspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm -!!$ interface -!!$ subroutine psb_ldcsrspspmm(a,b,c,info) -!!$ use psb_d_mat_mod, only : psb_ld_csr_sparse_mat -!!$ import :: psb_ipk_ -!!$ implicit none -!!$ class(psb_ld_csr_sparse_mat), intent(in) :: a,b -!!$ type(psb_ld_csr_sparse_mat), intent(out) :: c -!!$ integer(psb_ipk_), intent(out) :: info -!!$ end subroutine psb_ldcsrspspmm -!!$ subroutine psb_ldcscspspmm(a,b,c,info) -!!$ use psb_d_mat_mod, only : psb_ld_csc_sparse_mat -!!$ import :: psb_ipk_ -!!$ implicit none -!!$ class(psb_ld_csc_sparse_mat), intent(in) :: a,b -!!$ type(psb_ld_csc_sparse_mat), intent(out) :: c -!!$ integer(psb_ipk_), intent(out) :: info -!!$ end subroutine psb_ldcscspspmm -!!$ end interface - call psb_erractionsave(err_act) + call psb_erractionsave(err_act) info = psb_success_ if ((a%is_null()) .or.(b%is_null())) then diff --git a/base/serial/psb_sspspmm.f90 b/base/serial/psb_sspspmm.f90 index f193a442..6c05fb79 100644 --- a/base/serial/psb_sspspmm.f90 +++ b/base/serial/psb_sspspmm.f90 @@ -37,7 +37,9 @@ ! subroutine psb_sspspmm(a,b,c,info) use psb_mat_mod - !use psb_s_serial_mod, psb_protect_name => psb_sspspmm + use psb_s_csr_mat_mod + use psb_s_csc_mat_mod + use psb_s_serial_mod, psb_protect_name => psb_sspspmm implicit none type(psb_sspmat_type), intent(in) :: a,b @@ -48,24 +50,6 @@ subroutine psb_sspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm -!!$ interface -!!$ subroutine psb_scsrspspmm(a,b,c,info) -!!$ use psb_s_mat_mod, only : psb_s_csr_sparse_mat -!!$ import :: psb_ipk_ -!!$ implicit none -!!$ class(psb_s_csr_sparse_mat), intent(in) :: a,b -!!$ type(psb_s_csr_sparse_mat), intent(out) :: c -!!$ integer(psb_ipk_), intent(out) :: info -!!$ end subroutine psb_scsrspspmm -!!$ subroutine psb_scscspspmm(a,b,c,info) -!!$ use psb_s_mat_mod, only : psb_s_csc_sparse_mat -!!$ import :: psb_ipk_ -!!$ implicit none -!!$ class(psb_s_csc_sparse_mat), intent(in) :: a,b -!!$ type(psb_s_csc_sparse_mat), intent(out) :: c -!!$ integer(psb_ipk_), intent(out) :: info -!!$ end subroutine psb_scscspspmm -!!$ end interface call psb_erractionsave(err_act) info = psb_success_ @@ -136,7 +120,9 @@ end subroutine psb_sspspmm subroutine psb_lsspspmm(a,b,c,info) use psb_mat_mod -! use psb_s_serial_mod, psb_protect_name => psb_lsspspmm + use psb_s_csr_mat_mod + use psb_s_csc_mat_mod + use psb_s_serial_mod, psb_protect_name => psb_lsspspmm implicit none type(psb_lsspmat_type), intent(in) :: a,b @@ -147,25 +133,7 @@ subroutine psb_lsspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm -!!$ interface -!!$ subroutine psb_lscsrspspmm(a,b,c,info) -!!$ use psb_s_mat_mod, only : psb_ls_csr_sparse_mat -!!$ import :: psb_ipk_ -!!$ implicit none -!!$ class(psb_ls_csr_sparse_mat), intent(in) :: a,b -!!$ type(psb_ls_csr_sparse_mat), intent(out) :: c -!!$ integer(psb_ipk_), intent(out) :: info -!!$ end subroutine psb_lscsrspspmm -!!$ subroutine psb_lscscspspmm(a,b,c,info) -!!$ use psb_s_mat_mod, only : psb_ls_csc_sparse_mat -!!$ import :: psb_ipk_ -!!$ implicit none -!!$ class(psb_ls_csc_sparse_mat), intent(in) :: a,b -!!$ type(psb_ls_csc_sparse_mat), intent(out) :: c -!!$ integer(psb_ipk_), intent(out) :: info -!!$ end subroutine psb_lscscspspmm -!!$ end interface - call psb_erractionsave(err_act) + call psb_erractionsave(err_act) info = psb_success_ if ((a%is_null()) .or.(b%is_null())) then diff --git a/base/serial/psb_zspspmm.f90 b/base/serial/psb_zspspmm.f90 index b0a02cdc..97ef2c81 100644 --- a/base/serial/psb_zspspmm.f90 +++ b/base/serial/psb_zspspmm.f90 @@ -37,7 +37,9 @@ ! subroutine psb_zspspmm(a,b,c,info) use psb_mat_mod - !use psb_z_serial_mod, psb_protect_name => psb_zspspmm + use psb_z_csr_mat_mod + use psb_z_csc_mat_mod + use psb_z_serial_mod, psb_protect_name => psb_zspspmm implicit none type(psb_zspmat_type), intent(in) :: a,b @@ -48,24 +50,6 @@ subroutine psb_zspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm -!!$ interface -!!$ subroutine psb_zcsrspspmm(a,b,c,info) -!!$ use psb_z_mat_mod, only : psb_z_csr_sparse_mat -!!$ import :: psb_ipk_ -!!$ implicit none -!!$ class(psb_z_csr_sparse_mat), intent(in) :: a,b -!!$ type(psb_z_csr_sparse_mat), intent(out) :: c -!!$ integer(psb_ipk_), intent(out) :: info -!!$ end subroutine psb_zcsrspspmm -!!$ subroutine psb_zcscspspmm(a,b,c,info) -!!$ use psb_z_mat_mod, only : psb_z_csc_sparse_mat -!!$ import :: psb_ipk_ -!!$ implicit none -!!$ class(psb_z_csc_sparse_mat), intent(in) :: a,b -!!$ type(psb_z_csc_sparse_mat), intent(out) :: c -!!$ integer(psb_ipk_), intent(out) :: info -!!$ end subroutine psb_zcscspspmm -!!$ end interface call psb_erractionsave(err_act) info = psb_success_ @@ -136,7 +120,9 @@ end subroutine psb_zspspmm subroutine psb_lzspspmm(a,b,c,info) use psb_mat_mod -! use psb_z_serial_mod, psb_protect_name => psb_lzspspmm + use psb_z_csr_mat_mod + use psb_z_csc_mat_mod + use psb_z_serial_mod, psb_protect_name => psb_lzspspmm implicit none type(psb_lzspmat_type), intent(in) :: a,b @@ -147,25 +133,7 @@ subroutine psb_lzspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm -!!$ interface -!!$ subroutine psb_lzcsrspspmm(a,b,c,info) -!!$ use psb_z_mat_mod, only : psb_lz_csr_sparse_mat -!!$ import :: psb_ipk_ -!!$ implicit none -!!$ class(psb_lz_csr_sparse_mat), intent(in) :: a,b -!!$ type(psb_lz_csr_sparse_mat), intent(out) :: c -!!$ integer(psb_ipk_), intent(out) :: info -!!$ end subroutine psb_lzcsrspspmm -!!$ subroutine psb_lzcscspspmm(a,b,c,info) -!!$ use psb_z_mat_mod, only : psb_lz_csc_sparse_mat -!!$ import :: psb_ipk_ -!!$ implicit none -!!$ class(psb_lz_csc_sparse_mat), intent(in) :: a,b -!!$ type(psb_lz_csc_sparse_mat), intent(out) :: c -!!$ integer(psb_ipk_), intent(out) :: info -!!$ end subroutine psb_lzcscspspmm -!!$ end interface - call psb_erractionsave(err_act) + call psb_erractionsave(err_act) info = psb_success_ if ((a%is_null()) .or.(b%is_null())) then From 13d4bc39d5a0a47869b33db6d52a1e5a8094bebd Mon Sep 17 00:00:00 2001 From: sfilippone Date: Fri, 19 Sep 2025 10:29:30 +0200 Subject: [PATCH 11/37] Update WRITE format string --- linsolve/psb_base_linsolve_conv_mod.f90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/linsolve/psb_base_linsolve_conv_mod.f90 b/linsolve/psb_base_linsolve_conv_mod.f90 index 8d36fb53..5eca2b82 100644 --- a/linsolve/psb_base_linsolve_conv_mod.f90 +++ b/linsolve/psb_base_linsolve_conv_mod.f90 @@ -76,7 +76,7 @@ contains character(len=*), intent(in) :: methdname integer(psb_ipk_), intent(in) :: me, itx, itrace real(psb_dpk_), intent(in) :: errnum, errden, eps - character(len=*), parameter :: fmt='(a18,1x,i4,3(2x,es15.9))' + character(len=*), parameter :: fmt='(a18,1x,i4,3(2x,es18.9))' integer(psb_ipk_), parameter :: outlen=18 character(len=len(methdname)) :: mname character(len=outlen) :: outname @@ -102,8 +102,8 @@ contains real(psb_dpk_), optional, intent(out) :: err integer(psb_ipk_), optional, intent(out) :: iter - character(len=*), parameter :: fmt='(a,2x,es15.9,1x,a,1x,i4,1x,a)' - character(len=*), parameter :: fmt1='(a,3(2x,es15.9))' + character(len=*), parameter :: fmt='(a,2x,es18.9,1x,a,1x,i4,1x,a)' + character(len=*), parameter :: fmt1='(a,3(2x,es18.9))' if (errden == dzero) then if (errnum > eps) then From 23261bafe63affcb8d61ad3d241ec3a222ff77ee Mon Sep 17 00:00:00 2001 From: sfilippone Date: Fri, 19 Sep 2025 10:35:20 +0200 Subject: [PATCH 12/37] Restore funny fix for intel --- base/serial/psb_cspspmm.f90 | 122 +++++++++++++++++++++++++++++++++--- base/serial/psb_dspspmm.f90 | 122 +++++++++++++++++++++++++++++++++--- base/serial/psb_sspspmm.f90 | 122 +++++++++++++++++++++++++++++++++--- base/serial/psb_zspspmm.f90 | 122 +++++++++++++++++++++++++++++++++--- 4 files changed, 456 insertions(+), 32 deletions(-) diff --git a/base/serial/psb_cspspmm.f90 b/base/serial/psb_cspspmm.f90 index a62bbcf6..1ceed43d 100644 --- a/base/serial/psb_cspspmm.f90 +++ b/base/serial/psb_cspspmm.f90 @@ -37,11 +37,10 @@ ! subroutine psb_cspspmm(a,b,c,info) use psb_mat_mod - use psb_c_csr_mat_mod - use psb_c_csc_mat_mod - use psb_c_serial_mod, psb_protect_name => psb_cspspmm - implicit none - +!!$ use psb_c_csr_mat_mod +!!$ use psb_c_csc_mat_mod + !use psb_c_serial_mod, psb_protect_name => psb_cspspmm, only : psb_symbmm, psb_numbmm implicit none + type(psb_cspmat_type), intent(in) :: a,b type(psb_cspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info @@ -50,6 +49,60 @@ subroutine psb_cspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm + + interface psb_symbmm + subroutine psb_csymbmm(a,b,c,info) + use psb_c_mat_mod, only : psb_cspmat_type + import :: psb_ipk_ + implicit none + type(psb_cspmat_type), intent(in) :: a,b + type(psb_cspmat_type), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_csymbmm + subroutine psb_cbase_symbmm(a,b,c,info) + use psb_c_mat_mod, only : psb_c_base_sparse_mat, psb_c_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_c_base_sparse_mat), intent(in) :: a,b + type(psb_c_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_cbase_symbmm + end interface psb_symbmm + + interface psb_numbmm + subroutine psb_cnumbmm(a,b,c) + use psb_c_mat_mod, only : psb_cspmat_type + import :: psb_ipk_ + implicit none + type(psb_cspmat_type), intent(in) :: a,b + type(psb_cspmat_type), intent(inout) :: c + end subroutine psb_cnumbmm + subroutine psb_cbase_numbmm(a,b,c) + use psb_c_mat_mod, only : psb_c_base_sparse_mat, psb_c_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_c_base_sparse_mat), intent(in) :: a,b + type(psb_c_csr_sparse_mat), intent(inout) :: c + end subroutine psb_cbase_numbmm + end interface psb_numbmm + interface + subroutine psb_ccsrspspmm(a,b,c,info) + use psb_c_mat_mod, only : psb_c_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_c_csr_sparse_mat), intent(in) :: a,b + type(psb_c_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_ccsrspspmm + subroutine psb_ccscspspmm(a,b,c,info) + use psb_c_mat_mod, only : psb_c_csc_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_c_csc_sparse_mat), intent(in) :: a,b + type(psb_c_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_ccscspspmm + end interface call psb_erractionsave(err_act) info = psb_success_ @@ -120,9 +173,9 @@ end subroutine psb_cspspmm subroutine psb_lcspspmm(a,b,c,info) use psb_mat_mod - use psb_c_csr_mat_mod - use psb_c_csc_mat_mod - use psb_c_serial_mod, psb_protect_name => psb_lcspspmm +!!$ use psb_c_csr_mat_mod +!!$ use psb_c_csc_mat_mod + !use psb_c_serial_mod, psb_protect_name => psb_lcspspmm, only : psb_symbmm, psb_numbmm implicit none type(psb_lcspmat_type), intent(in) :: a,b @@ -133,6 +186,59 @@ subroutine psb_lcspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm + interface psb_symbmm + subroutine psb_lcsymbmm(a,b,c,info) + use psb_c_mat_mod, only : psb_lcspmat_type + import :: psb_ipk_ + implicit none + type(psb_lcspmat_type), intent(in) :: a,b + type(psb_lcspmat_type), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lcsymbmm + subroutine psb_lcbase_symbmm(a,b,c,info) + use psb_c_mat_mod, only : psb_lc_base_sparse_mat, psb_lc_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_lc_base_sparse_mat), intent(in) :: a,b + type(psb_lc_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lcbase_symbmm + end interface psb_symbmm + + interface psb_numbmm + subroutine psb_lcnumbmm(a,b,c) + use psb_c_mat_mod, only : psb_lcspmat_type + import :: psb_ipk_ + implicit none + type(psb_lcspmat_type), intent(in) :: a,b + type(psb_lcspmat_type), intent(inout) :: c + end subroutine psb_lcnumbmm + subroutine psb_lcbase_numbmm(a,b,c) + use psb_c_mat_mod, only : psb_lc_base_sparse_mat, psb_lc_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_lc_base_sparse_mat), intent(in) :: a,b + type(psb_lc_csr_sparse_mat), intent(inout) :: c + end subroutine psb_lcbase_numbmm + end interface psb_numbmm + interface + subroutine psb_lccsrspspmm(a,b,c,info) + use psb_c_mat_mod, only : psb_lc_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_lc_csr_sparse_mat), intent(in) :: a,b + type(psb_lc_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lccsrspspmm + subroutine psb_lccscspspmm(a,b,c,info) + use psb_c_mat_mod, only : psb_lc_csc_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_lc_csc_sparse_mat), intent(in) :: a,b + type(psb_lc_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lccscspspmm + end interface call psb_erractionsave(err_act) info = psb_success_ diff --git a/base/serial/psb_dspspmm.f90 b/base/serial/psb_dspspmm.f90 index 60059208..216313e0 100644 --- a/base/serial/psb_dspspmm.f90 +++ b/base/serial/psb_dspspmm.f90 @@ -37,11 +37,10 @@ ! subroutine psb_dspspmm(a,b,c,info) use psb_mat_mod - use psb_d_csr_mat_mod - use psb_d_csc_mat_mod - use psb_d_serial_mod, psb_protect_name => psb_dspspmm - implicit none - +!!$ use psb_d_csr_mat_mod +!!$ use psb_d_csc_mat_mod + !use psb_d_serial_mod, psb_protect_name => psb_dspspmm, only : psb_symbmm, psb_numbmm implicit none + type(psb_dspmat_type), intent(in) :: a,b type(psb_dspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info @@ -50,6 +49,60 @@ subroutine psb_dspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm + + interface psb_symbmm + subroutine psb_dsymbmm(a,b,c,info) + use psb_d_mat_mod, only : psb_dspmat_type + import :: psb_ipk_ + implicit none + type(psb_dspmat_type), intent(in) :: a,b + type(psb_dspmat_type), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_dsymbmm + subroutine psb_dbase_symbmm(a,b,c,info) + use psb_d_mat_mod, only : psb_d_base_sparse_mat, psb_d_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_d_base_sparse_mat), intent(in) :: a,b + type(psb_d_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_dbase_symbmm + end interface psb_symbmm + + interface psb_numbmm + subroutine psb_dnumbmm(a,b,c) + use psb_d_mat_mod, only : psb_dspmat_type + import :: psb_ipk_ + implicit none + type(psb_dspmat_type), intent(in) :: a,b + type(psb_dspmat_type), intent(inout) :: c + end subroutine psb_dnumbmm + subroutine psb_dbase_numbmm(a,b,c) + use psb_d_mat_mod, only : psb_d_base_sparse_mat, psb_d_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_d_base_sparse_mat), intent(in) :: a,b + type(psb_d_csr_sparse_mat), intent(inout) :: c + end subroutine psb_dbase_numbmm + end interface psb_numbmm + interface + subroutine psb_dcsrspspmm(a,b,c,info) + use psb_d_mat_mod, only : psb_d_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_d_csr_sparse_mat), intent(in) :: a,b + type(psb_d_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_dcsrspspmm + subroutine psb_dcscspspmm(a,b,c,info) + use psb_d_mat_mod, only : psb_d_csc_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_d_csc_sparse_mat), intent(in) :: a,b + type(psb_d_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_dcscspspmm + end interface call psb_erractionsave(err_act) info = psb_success_ @@ -120,9 +173,9 @@ end subroutine psb_dspspmm subroutine psb_ldspspmm(a,b,c,info) use psb_mat_mod - use psb_d_csr_mat_mod - use psb_d_csc_mat_mod - use psb_d_serial_mod, psb_protect_name => psb_ldspspmm +!!$ use psb_d_csr_mat_mod +!!$ use psb_d_csc_mat_mod + !use psb_d_serial_mod, psb_protect_name => psb_ldspspmm, only : psb_symbmm, psb_numbmm implicit none type(psb_ldspmat_type), intent(in) :: a,b @@ -133,6 +186,59 @@ subroutine psb_ldspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm + interface psb_symbmm + subroutine psb_ldsymbmm(a,b,c,info) + use psb_d_mat_mod, only : psb_ldspmat_type + import :: psb_ipk_ + implicit none + type(psb_ldspmat_type), intent(in) :: a,b + type(psb_ldspmat_type), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_ldsymbmm + subroutine psb_ldbase_symbmm(a,b,c,info) + use psb_d_mat_mod, only : psb_ld_base_sparse_mat, psb_ld_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_ld_base_sparse_mat), intent(in) :: a,b + type(psb_ld_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_ldbase_symbmm + end interface psb_symbmm + + interface psb_numbmm + subroutine psb_ldnumbmm(a,b,c) + use psb_d_mat_mod, only : psb_ldspmat_type + import :: psb_ipk_ + implicit none + type(psb_ldspmat_type), intent(in) :: a,b + type(psb_ldspmat_type), intent(inout) :: c + end subroutine psb_ldnumbmm + subroutine psb_ldbase_numbmm(a,b,c) + use psb_d_mat_mod, only : psb_ld_base_sparse_mat, psb_ld_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_ld_base_sparse_mat), intent(in) :: a,b + type(psb_ld_csr_sparse_mat), intent(inout) :: c + end subroutine psb_ldbase_numbmm + end interface psb_numbmm + interface + subroutine psb_ldcsrspspmm(a,b,c,info) + use psb_d_mat_mod, only : psb_ld_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_ld_csr_sparse_mat), intent(in) :: a,b + type(psb_ld_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_ldcsrspspmm + subroutine psb_ldcscspspmm(a,b,c,info) + use psb_d_mat_mod, only : psb_ld_csc_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_ld_csc_sparse_mat), intent(in) :: a,b + type(psb_ld_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_ldcscspspmm + end interface call psb_erractionsave(err_act) info = psb_success_ diff --git a/base/serial/psb_sspspmm.f90 b/base/serial/psb_sspspmm.f90 index 6c05fb79..4dc5df40 100644 --- a/base/serial/psb_sspspmm.f90 +++ b/base/serial/psb_sspspmm.f90 @@ -37,11 +37,10 @@ ! subroutine psb_sspspmm(a,b,c,info) use psb_mat_mod - use psb_s_csr_mat_mod - use psb_s_csc_mat_mod - use psb_s_serial_mod, psb_protect_name => psb_sspspmm - implicit none - +!!$ use psb_s_csr_mat_mod +!!$ use psb_s_csc_mat_mod + !use psb_s_serial_mod, psb_protect_name => psb_sspspmm, only : psb_symbmm, psb_numbmm implicit none + type(psb_sspmat_type), intent(in) :: a,b type(psb_sspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info @@ -50,6 +49,60 @@ subroutine psb_sspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm + + interface psb_symbmm + subroutine psb_ssymbmm(a,b,c,info) + use psb_s_mat_mod, only : psb_sspmat_type + import :: psb_ipk_ + implicit none + type(psb_sspmat_type), intent(in) :: a,b + type(psb_sspmat_type), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_ssymbmm + subroutine psb_sbase_symbmm(a,b,c,info) + use psb_s_mat_mod, only : psb_s_base_sparse_mat, psb_s_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_s_base_sparse_mat), intent(in) :: a,b + type(psb_s_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_sbase_symbmm + end interface psb_symbmm + + interface psb_numbmm + subroutine psb_snumbmm(a,b,c) + use psb_s_mat_mod, only : psb_sspmat_type + import :: psb_ipk_ + implicit none + type(psb_sspmat_type), intent(in) :: a,b + type(psb_sspmat_type), intent(inout) :: c + end subroutine psb_snumbmm + subroutine psb_sbase_numbmm(a,b,c) + use psb_s_mat_mod, only : psb_s_base_sparse_mat, psb_s_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_s_base_sparse_mat), intent(in) :: a,b + type(psb_s_csr_sparse_mat), intent(inout) :: c + end subroutine psb_sbase_numbmm + end interface psb_numbmm + interface + subroutine psb_scsrspspmm(a,b,c,info) + use psb_s_mat_mod, only : psb_s_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_s_csr_sparse_mat), intent(in) :: a,b + type(psb_s_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_scsrspspmm + subroutine psb_scscspspmm(a,b,c,info) + use psb_s_mat_mod, only : psb_s_csc_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_s_csc_sparse_mat), intent(in) :: a,b + type(psb_s_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_scscspspmm + end interface call psb_erractionsave(err_act) info = psb_success_ @@ -120,9 +173,9 @@ end subroutine psb_sspspmm subroutine psb_lsspspmm(a,b,c,info) use psb_mat_mod - use psb_s_csr_mat_mod - use psb_s_csc_mat_mod - use psb_s_serial_mod, psb_protect_name => psb_lsspspmm +!!$ use psb_s_csr_mat_mod +!!$ use psb_s_csc_mat_mod + !use psb_s_serial_mod, psb_protect_name => psb_lsspspmm, only : psb_symbmm, psb_numbmm implicit none type(psb_lsspmat_type), intent(in) :: a,b @@ -133,6 +186,59 @@ subroutine psb_lsspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm + interface psb_symbmm + subroutine psb_lssymbmm(a,b,c,info) + use psb_s_mat_mod, only : psb_lsspmat_type + import :: psb_ipk_ + implicit none + type(psb_lsspmat_type), intent(in) :: a,b + type(psb_lsspmat_type), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lssymbmm + subroutine psb_lsbase_symbmm(a,b,c,info) + use psb_s_mat_mod, only : psb_ls_base_sparse_mat, psb_ls_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_ls_base_sparse_mat), intent(in) :: a,b + type(psb_ls_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lsbase_symbmm + end interface psb_symbmm + + interface psb_numbmm + subroutine psb_lsnumbmm(a,b,c) + use psb_s_mat_mod, only : psb_lsspmat_type + import :: psb_ipk_ + implicit none + type(psb_lsspmat_type), intent(in) :: a,b + type(psb_lsspmat_type), intent(inout) :: c + end subroutine psb_lsnumbmm + subroutine psb_lsbase_numbmm(a,b,c) + use psb_s_mat_mod, only : psb_ls_base_sparse_mat, psb_ls_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_ls_base_sparse_mat), intent(in) :: a,b + type(psb_ls_csr_sparse_mat), intent(inout) :: c + end subroutine psb_lsbase_numbmm + end interface psb_numbmm + interface + subroutine psb_lscsrspspmm(a,b,c,info) + use psb_s_mat_mod, only : psb_ls_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_ls_csr_sparse_mat), intent(in) :: a,b + type(psb_ls_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lscsrspspmm + subroutine psb_lscscspspmm(a,b,c,info) + use psb_s_mat_mod, only : psb_ls_csc_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_ls_csc_sparse_mat), intent(in) :: a,b + type(psb_ls_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lscscspspmm + end interface call psb_erractionsave(err_act) info = psb_success_ diff --git a/base/serial/psb_zspspmm.f90 b/base/serial/psb_zspspmm.f90 index 97ef2c81..831e4b9c 100644 --- a/base/serial/psb_zspspmm.f90 +++ b/base/serial/psb_zspspmm.f90 @@ -37,11 +37,10 @@ ! subroutine psb_zspspmm(a,b,c,info) use psb_mat_mod - use psb_z_csr_mat_mod - use psb_z_csc_mat_mod - use psb_z_serial_mod, psb_protect_name => psb_zspspmm - implicit none - +!!$ use psb_z_csr_mat_mod +!!$ use psb_z_csc_mat_mod + !use psb_z_serial_mod, psb_protect_name => psb_zspspmm, only : psb_symbmm, psb_numbmm implicit none + type(psb_zspmat_type), intent(in) :: a,b type(psb_zspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info @@ -50,6 +49,60 @@ subroutine psb_zspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm + + interface psb_symbmm + subroutine psb_zsymbmm(a,b,c,info) + use psb_z_mat_mod, only : psb_zspmat_type + import :: psb_ipk_ + implicit none + type(psb_zspmat_type), intent(in) :: a,b + type(psb_zspmat_type), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_zsymbmm + subroutine psb_zbase_symbmm(a,b,c,info) + use psb_z_mat_mod, only : psb_z_base_sparse_mat, psb_z_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_z_base_sparse_mat), intent(in) :: a,b + type(psb_z_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_zbase_symbmm + end interface psb_symbmm + + interface psb_numbmm + subroutine psb_znumbmm(a,b,c) + use psb_z_mat_mod, only : psb_zspmat_type + import :: psb_ipk_ + implicit none + type(psb_zspmat_type), intent(in) :: a,b + type(psb_zspmat_type), intent(inout) :: c + end subroutine psb_znumbmm + subroutine psb_zbase_numbmm(a,b,c) + use psb_z_mat_mod, only : psb_z_base_sparse_mat, psb_z_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_z_base_sparse_mat), intent(in) :: a,b + type(psb_z_csr_sparse_mat), intent(inout) :: c + end subroutine psb_zbase_numbmm + end interface psb_numbmm + interface + subroutine psb_zcsrspspmm(a,b,c,info) + use psb_z_mat_mod, only : psb_z_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_z_csr_sparse_mat), intent(in) :: a,b + type(psb_z_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_zcsrspspmm + subroutine psb_zcscspspmm(a,b,c,info) + use psb_z_mat_mod, only : psb_z_csc_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_z_csc_sparse_mat), intent(in) :: a,b + type(psb_z_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_zcscspspmm + end interface call psb_erractionsave(err_act) info = psb_success_ @@ -120,9 +173,9 @@ end subroutine psb_zspspmm subroutine psb_lzspspmm(a,b,c,info) use psb_mat_mod - use psb_z_csr_mat_mod - use psb_z_csc_mat_mod - use psb_z_serial_mod, psb_protect_name => psb_lzspspmm +!!$ use psb_z_csr_mat_mod +!!$ use psb_z_csc_mat_mod + !use psb_z_serial_mod, psb_protect_name => psb_lzspspmm, only : psb_symbmm, psb_numbmm implicit none type(psb_lzspmat_type), intent(in) :: a,b @@ -133,6 +186,59 @@ subroutine psb_lzspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm + interface psb_symbmm + subroutine psb_lzsymbmm(a,b,c,info) + use psb_z_mat_mod, only : psb_lzspmat_type + import :: psb_ipk_ + implicit none + type(psb_lzspmat_type), intent(in) :: a,b + type(psb_lzspmat_type), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lzsymbmm + subroutine psb_lzbase_symbmm(a,b,c,info) + use psb_z_mat_mod, only : psb_lz_base_sparse_mat, psb_lz_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_lz_base_sparse_mat), intent(in) :: a,b + type(psb_lz_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lzbase_symbmm + end interface psb_symbmm + + interface psb_numbmm + subroutine psb_lznumbmm(a,b,c) + use psb_z_mat_mod, only : psb_lzspmat_type + import :: psb_ipk_ + implicit none + type(psb_lzspmat_type), intent(in) :: a,b + type(psb_lzspmat_type), intent(inout) :: c + end subroutine psb_lznumbmm + subroutine psb_lzbase_numbmm(a,b,c) + use psb_z_mat_mod, only : psb_lz_base_sparse_mat, psb_lz_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_lz_base_sparse_mat), intent(in) :: a,b + type(psb_lz_csr_sparse_mat), intent(inout) :: c + end subroutine psb_lzbase_numbmm + end interface psb_numbmm + interface + subroutine psb_lzcsrspspmm(a,b,c,info) + use psb_z_mat_mod, only : psb_lz_csr_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_lz_csr_sparse_mat), intent(in) :: a,b + type(psb_lz_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lzcsrspspmm + subroutine psb_lzcscspspmm(a,b,c,info) + use psb_z_mat_mod, only : psb_lz_csc_sparse_mat + import :: psb_ipk_ + implicit none + class(psb_lz_csc_sparse_mat), intent(in) :: a,b + type(psb_lz_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lzcscspspmm + end interface call psb_erractionsave(err_act) info = psb_success_ From 5a0ef22cc2bba59b9fb73f38b00f5ebf8e809f8c Mon Sep 17 00:00:00 2001 From: sfilippone Date: Fri, 19 Sep 2025 10:55:49 +0200 Subject: [PATCH 13/37] Rename spspmm --- base/serial/{psb_cspspmm.f90 => psb_cspspmm.F90} | 0 base/serial/{psb_dspspmm.f90 => psb_dspspmm.F90} | 0 base/serial/{psb_sspspmm.f90 => psb_sspspmm.F90} | 0 base/serial/{psb_zspspmm.f90 => psb_zspspmm.F90} | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename base/serial/{psb_cspspmm.f90 => psb_cspspmm.F90} (100%) rename base/serial/{psb_dspspmm.f90 => psb_dspspmm.F90} (100%) rename base/serial/{psb_sspspmm.f90 => psb_sspspmm.F90} (100%) rename base/serial/{psb_zspspmm.f90 => psb_zspspmm.F90} (100%) diff --git a/base/serial/psb_cspspmm.f90 b/base/serial/psb_cspspmm.F90 similarity index 100% rename from base/serial/psb_cspspmm.f90 rename to base/serial/psb_cspspmm.F90 diff --git a/base/serial/psb_dspspmm.f90 b/base/serial/psb_dspspmm.F90 similarity index 100% rename from base/serial/psb_dspspmm.f90 rename to base/serial/psb_dspspmm.F90 diff --git a/base/serial/psb_sspspmm.f90 b/base/serial/psb_sspspmm.F90 similarity index 100% rename from base/serial/psb_sspspmm.f90 rename to base/serial/psb_sspspmm.F90 diff --git a/base/serial/psb_zspspmm.f90 b/base/serial/psb_zspspmm.F90 similarity index 100% rename from base/serial/psb_zspspmm.f90 rename to base/serial/psb_zspspmm.F90 From aa308390745e5c0df04eed808eda0e01d5691bab Mon Sep 17 00:00:00 2001 From: sfilippone Date: Fri, 19 Sep 2025 12:18:11 +0200 Subject: [PATCH 14/37] Fix define for compilers, and INTEL fix. --- base/comm/internals/psi_cswapdata_a.F90 | 4 ++-- base/comm/internals/psi_cswaptran_a.F90 | 4 ++-- base/comm/internals/psi_dswapdata_a.F90 | 4 ++-- base/comm/internals/psi_dswaptran_a.F90 | 4 ++-- base/comm/internals/psi_eswapdata_a.F90 | 4 ++-- base/comm/internals/psi_eswaptran_a.F90 | 4 ++-- base/comm/internals/psi_i2swapdata_a.F90 | 4 ++-- base/comm/internals/psi_i2swaptran_a.F90 | 4 ++-- base/comm/internals/psi_mswapdata_a.F90 | 4 ++-- base/comm/internals/psi_mswaptran_a.F90 | 4 ++-- base/comm/internals/psi_sswapdata_a.F90 | 4 ++-- base/comm/internals/psi_sswaptran_a.F90 | 4 ++-- base/comm/internals/psi_zswapdata_a.F90 | 4 ++-- base/comm/internals/psi_zswaptran_a.F90 | 4 ++-- base/serial/psb_cspspmm.F90 | 25 ++++++++++++++++-------- base/serial/psb_dspspmm.F90 | 25 ++++++++++++++++-------- base/serial/psb_sspspmm.F90 | 25 ++++++++++++++++-------- base/serial/psb_zspspmm.F90 | 25 ++++++++++++++++-------- configure | 8 ++++---- configure.ac | 8 ++++---- 20 files changed, 104 insertions(+), 68 deletions(-) diff --git a/base/comm/internals/psi_cswapdata_a.F90 b/base/comm/internals/psi_cswapdata_a.F90 index 8b137397..844daa00 100644 --- a/base/comm/internals/psi_cswapdata_a.F90 +++ b/base/comm/internals/psi_cswapdata_a.F90 @@ -193,7 +193,7 @@ subroutine psi_cswapidxm(ctxt,icomm,flag,n,beta,y,idx, & logical, parameter :: usersend=.false. complex(psb_spk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) +#if !defined(PSB_CMP_FLANG) volatile :: sndbuf, rcvbuf #endif character(len=20) :: name @@ -680,7 +680,7 @@ subroutine psi_cswapidxv(ctxt,icomm,flag,beta,y,idx, & logical, parameter :: usersend=.false. complex(psb_spk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) +#if !defined(PSB_CMP_FLANG) volatile :: sndbuf, rcvbuf #endif character(len=20) :: name diff --git a/base/comm/internals/psi_cswaptran_a.F90 b/base/comm/internals/psi_cswaptran_a.F90 index 3fa61d94..e46a556d 100644 --- a/base/comm/internals/psi_cswaptran_a.F90 +++ b/base/comm/internals/psi_cswaptran_a.F90 @@ -197,7 +197,7 @@ subroutine psi_ctranidxm(ctxt,icomm,flag,n,beta,y,idx,& logical, parameter :: usersend=.false. complex(psb_spk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) +#if !defined(PSB_CMP_FLANG) volatile :: sndbuf, rcvbuf #endif character(len=20) :: name @@ -691,7 +691,7 @@ subroutine psi_ctranidxv(ctxt,icomm,flag,beta,y,idx,& logical, parameter :: usersend=.false. complex(psb_spk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) +#if !defined(PSB_CMP_FLANG) volatile :: sndbuf, rcvbuf #endif character(len=20) :: name diff --git a/base/comm/internals/psi_dswapdata_a.F90 b/base/comm/internals/psi_dswapdata_a.F90 index 6f1d4a10..d86025cf 100644 --- a/base/comm/internals/psi_dswapdata_a.F90 +++ b/base/comm/internals/psi_dswapdata_a.F90 @@ -193,7 +193,7 @@ subroutine psi_dswapidxm(ctxt,icomm,flag,n,beta,y,idx, & logical, parameter :: usersend=.false. real(psb_dpk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) +#if !defined(PSB_CMP_FLANG) volatile :: sndbuf, rcvbuf #endif character(len=20) :: name @@ -680,7 +680,7 @@ subroutine psi_dswapidxv(ctxt,icomm,flag,beta,y,idx, & logical, parameter :: usersend=.false. real(psb_dpk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) +#if !defined(PSB_CMP_FLANG) volatile :: sndbuf, rcvbuf #endif character(len=20) :: name diff --git a/base/comm/internals/psi_dswaptran_a.F90 b/base/comm/internals/psi_dswaptran_a.F90 index df04c391..e5966c2e 100644 --- a/base/comm/internals/psi_dswaptran_a.F90 +++ b/base/comm/internals/psi_dswaptran_a.F90 @@ -197,7 +197,7 @@ subroutine psi_dtranidxm(ctxt,icomm,flag,n,beta,y,idx,& logical, parameter :: usersend=.false. real(psb_dpk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) +#if !defined(PSB_CMP_FLANG) volatile :: sndbuf, rcvbuf #endif character(len=20) :: name @@ -691,7 +691,7 @@ subroutine psi_dtranidxv(ctxt,icomm,flag,beta,y,idx,& logical, parameter :: usersend=.false. real(psb_dpk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) +#if !defined(PSB_CMP_FLANG) volatile :: sndbuf, rcvbuf #endif character(len=20) :: name diff --git a/base/comm/internals/psi_eswapdata_a.F90 b/base/comm/internals/psi_eswapdata_a.F90 index 6e2d9557..d917b64c 100644 --- a/base/comm/internals/psi_eswapdata_a.F90 +++ b/base/comm/internals/psi_eswapdata_a.F90 @@ -193,7 +193,7 @@ subroutine psi_eswapidxm(ctxt,icomm,flag,n,beta,y,idx, & logical, parameter :: usersend=.false. integer(psb_epk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) +#if !defined(PSB_CMP_FLANG) volatile :: sndbuf, rcvbuf #endif character(len=20) :: name @@ -680,7 +680,7 @@ subroutine psi_eswapidxv(ctxt,icomm,flag,beta,y,idx, & logical, parameter :: usersend=.false. integer(psb_epk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) +#if !defined(PSB_CMP_FLANG) volatile :: sndbuf, rcvbuf #endif character(len=20) :: name diff --git a/base/comm/internals/psi_eswaptran_a.F90 b/base/comm/internals/psi_eswaptran_a.F90 index e105c88b..67a92569 100644 --- a/base/comm/internals/psi_eswaptran_a.F90 +++ b/base/comm/internals/psi_eswaptran_a.F90 @@ -197,7 +197,7 @@ subroutine psi_etranidxm(ctxt,icomm,flag,n,beta,y,idx,& logical, parameter :: usersend=.false. integer(psb_epk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) +#if !defined(PSB_CMP_FLANG) volatile :: sndbuf, rcvbuf #endif character(len=20) :: name @@ -691,7 +691,7 @@ subroutine psi_etranidxv(ctxt,icomm,flag,beta,y,idx,& logical, parameter :: usersend=.false. integer(psb_epk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) +#if !defined(PSB_CMP_FLANG) volatile :: sndbuf, rcvbuf #endif character(len=20) :: name diff --git a/base/comm/internals/psi_i2swapdata_a.F90 b/base/comm/internals/psi_i2swapdata_a.F90 index 4acdbc9e..3d82d5b1 100644 --- a/base/comm/internals/psi_i2swapdata_a.F90 +++ b/base/comm/internals/psi_i2swapdata_a.F90 @@ -193,7 +193,7 @@ subroutine psi_i2swapidxm(ctxt,icomm,flag,n,beta,y,idx, & logical, parameter :: usersend=.false. integer(psb_i2pk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) +#if !defined(PSB_CMP_FLANG) volatile :: sndbuf, rcvbuf #endif character(len=20) :: name @@ -680,7 +680,7 @@ subroutine psi_i2swapidxv(ctxt,icomm,flag,beta,y,idx, & logical, parameter :: usersend=.false. integer(psb_i2pk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) +#if !defined(PSB_CMP_FLANG) volatile :: sndbuf, rcvbuf #endif character(len=20) :: name diff --git a/base/comm/internals/psi_i2swaptran_a.F90 b/base/comm/internals/psi_i2swaptran_a.F90 index f879702c..925e8a0c 100644 --- a/base/comm/internals/psi_i2swaptran_a.F90 +++ b/base/comm/internals/psi_i2swaptran_a.F90 @@ -197,7 +197,7 @@ subroutine psi_i2tranidxm(ctxt,icomm,flag,n,beta,y,idx,& logical, parameter :: usersend=.false. integer(psb_i2pk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) +#if !defined(PSB_CMP_FLANG) volatile :: sndbuf, rcvbuf #endif character(len=20) :: name @@ -691,7 +691,7 @@ subroutine psi_i2tranidxv(ctxt,icomm,flag,beta,y,idx,& logical, parameter :: usersend=.false. integer(psb_i2pk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) +#if !defined(PSB_CMP_FLANG) volatile :: sndbuf, rcvbuf #endif character(len=20) :: name diff --git a/base/comm/internals/psi_mswapdata_a.F90 b/base/comm/internals/psi_mswapdata_a.F90 index 0a1a3a61..bda186b8 100644 --- a/base/comm/internals/psi_mswapdata_a.F90 +++ b/base/comm/internals/psi_mswapdata_a.F90 @@ -193,7 +193,7 @@ subroutine psi_mswapidxm(ctxt,icomm,flag,n,beta,y,idx, & logical, parameter :: usersend=.false. integer(psb_mpk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) +#if !defined(PSB_CMP_FLANG) volatile :: sndbuf, rcvbuf #endif character(len=20) :: name @@ -680,7 +680,7 @@ subroutine psi_mswapidxv(ctxt,icomm,flag,beta,y,idx, & logical, parameter :: usersend=.false. integer(psb_mpk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) +#if !defined(PSB_CMP_FLANG) volatile :: sndbuf, rcvbuf #endif character(len=20) :: name diff --git a/base/comm/internals/psi_mswaptran_a.F90 b/base/comm/internals/psi_mswaptran_a.F90 index 8d6e0b52..65e3e6c7 100644 --- a/base/comm/internals/psi_mswaptran_a.F90 +++ b/base/comm/internals/psi_mswaptran_a.F90 @@ -197,7 +197,7 @@ subroutine psi_mtranidxm(ctxt,icomm,flag,n,beta,y,idx,& logical, parameter :: usersend=.false. integer(psb_mpk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) +#if !defined(PSB_CMP_FLANG) volatile :: sndbuf, rcvbuf #endif character(len=20) :: name @@ -691,7 +691,7 @@ subroutine psi_mtranidxv(ctxt,icomm,flag,beta,y,idx,& logical, parameter :: usersend=.false. integer(psb_mpk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) +#if !defined(PSB_CMP_FLANG) volatile :: sndbuf, rcvbuf #endif character(len=20) :: name diff --git a/base/comm/internals/psi_sswapdata_a.F90 b/base/comm/internals/psi_sswapdata_a.F90 index 0f1f26da..ae456162 100644 --- a/base/comm/internals/psi_sswapdata_a.F90 +++ b/base/comm/internals/psi_sswapdata_a.F90 @@ -193,7 +193,7 @@ subroutine psi_sswapidxm(ctxt,icomm,flag,n,beta,y,idx, & logical, parameter :: usersend=.false. real(psb_spk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) +#if !defined(PSB_CMP_FLANG) volatile :: sndbuf, rcvbuf #endif character(len=20) :: name @@ -680,7 +680,7 @@ subroutine psi_sswapidxv(ctxt,icomm,flag,beta,y,idx, & logical, parameter :: usersend=.false. real(psb_spk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) +#if !defined(PSB_CMP_FLANG) volatile :: sndbuf, rcvbuf #endif character(len=20) :: name diff --git a/base/comm/internals/psi_sswaptran_a.F90 b/base/comm/internals/psi_sswaptran_a.F90 index 10e741dd..f4f9513e 100644 --- a/base/comm/internals/psi_sswaptran_a.F90 +++ b/base/comm/internals/psi_sswaptran_a.F90 @@ -197,7 +197,7 @@ subroutine psi_stranidxm(ctxt,icomm,flag,n,beta,y,idx,& logical, parameter :: usersend=.false. real(psb_spk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) +#if !defined(PSB_CMP_FLANG) volatile :: sndbuf, rcvbuf #endif character(len=20) :: name @@ -691,7 +691,7 @@ subroutine psi_stranidxv(ctxt,icomm,flag,beta,y,idx,& logical, parameter :: usersend=.false. real(psb_spk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) +#if !defined(PSB_CMP_FLANG) volatile :: sndbuf, rcvbuf #endif character(len=20) :: name diff --git a/base/comm/internals/psi_zswapdata_a.F90 b/base/comm/internals/psi_zswapdata_a.F90 index f37dc1c7..c0ac76f5 100644 --- a/base/comm/internals/psi_zswapdata_a.F90 +++ b/base/comm/internals/psi_zswapdata_a.F90 @@ -193,7 +193,7 @@ subroutine psi_zswapidxm(ctxt,icomm,flag,n,beta,y,idx, & logical, parameter :: usersend=.false. complex(psb_dpk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) +#if !defined(PSB_CMP_FLANG) volatile :: sndbuf, rcvbuf #endif character(len=20) :: name @@ -680,7 +680,7 @@ subroutine psi_zswapidxv(ctxt,icomm,flag,beta,y,idx, & logical, parameter :: usersend=.false. complex(psb_dpk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) +#if !defined(PSB_CMP_FLANG) volatile :: sndbuf, rcvbuf #endif character(len=20) :: name diff --git a/base/comm/internals/psi_zswaptran_a.F90 b/base/comm/internals/psi_zswaptran_a.F90 index 8b4e4268..804acb6b 100644 --- a/base/comm/internals/psi_zswaptran_a.F90 +++ b/base/comm/internals/psi_zswaptran_a.F90 @@ -197,7 +197,7 @@ subroutine psi_ztranidxm(ctxt,icomm,flag,n,beta,y,idx,& logical, parameter :: usersend=.false. complex(psb_dpk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) +#if !defined(PSB_CMP_FLANG) volatile :: sndbuf, rcvbuf #endif character(len=20) :: name @@ -691,7 +691,7 @@ subroutine psi_ztranidxv(ctxt,icomm,flag,beta,y,idx,& logical, parameter :: usersend=.false. complex(psb_dpk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) +#if !defined(PSB_CMP_FLANG) volatile :: sndbuf, rcvbuf #endif character(len=20) :: name diff --git a/base/serial/psb_cspspmm.F90 b/base/serial/psb_cspspmm.F90 index 1ceed43d..865c1922 100644 --- a/base/serial/psb_cspspmm.F90 +++ b/base/serial/psb_cspspmm.F90 @@ -37,10 +37,11 @@ ! subroutine psb_cspspmm(a,b,c,info) use psb_mat_mod -!!$ use psb_c_csr_mat_mod -!!$ use psb_c_csc_mat_mod - !use psb_c_serial_mod, psb_protect_name => psb_cspspmm, only : psb_symbmm, psb_numbmm implicit none - +#if !defined(PSB_CMP_INTEL) + use psb_c_csr_mat_mod + use psb_c_csc_mat_mod + use psb_c_serial_mod, psb_protect_name => psb_cspspmm +#endif type(psb_cspmat_type), intent(in) :: a,b type(psb_cspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info @@ -49,7 +50,8 @@ subroutine psb_cspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm - + +#if defined(PSB_CMP_INTEL) interface psb_symbmm subroutine psb_csymbmm(a,b,c,info) use psb_c_mat_mod, only : psb_cspmat_type @@ -103,6 +105,8 @@ subroutine psb_cspspmm(a,b,c,info) integer(psb_ipk_), intent(out) :: info end subroutine psb_ccscspspmm end interface +#endif + call psb_erractionsave(err_act) info = psb_success_ @@ -173,9 +177,11 @@ end subroutine psb_cspspmm subroutine psb_lcspspmm(a,b,c,info) use psb_mat_mod -!!$ use psb_c_csr_mat_mod -!!$ use psb_c_csc_mat_mod - !use psb_c_serial_mod, psb_protect_name => psb_lcspspmm, only : psb_symbmm, psb_numbmm +#if !defined(PSB_CMP_INTEL) + use psb_c_csr_mat_mod + use psb_c_csc_mat_mod + use psb_c_serial_mod, psb_protect_name => psb_lcspspmm +#endif implicit none type(psb_lcspmat_type), intent(in) :: a,b @@ -186,6 +192,7 @@ subroutine psb_lcspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm +#if defined(PSB_CMP_INTEL) interface psb_symbmm subroutine psb_lcsymbmm(a,b,c,info) use psb_c_mat_mod, only : psb_lcspmat_type @@ -239,6 +246,8 @@ subroutine psb_lcspspmm(a,b,c,info) integer(psb_ipk_), intent(out) :: info end subroutine psb_lccscspspmm end interface +#endif + call psb_erractionsave(err_act) info = psb_success_ diff --git a/base/serial/psb_dspspmm.F90 b/base/serial/psb_dspspmm.F90 index 216313e0..f7e37fe7 100644 --- a/base/serial/psb_dspspmm.F90 +++ b/base/serial/psb_dspspmm.F90 @@ -37,10 +37,11 @@ ! subroutine psb_dspspmm(a,b,c,info) use psb_mat_mod -!!$ use psb_d_csr_mat_mod -!!$ use psb_d_csc_mat_mod - !use psb_d_serial_mod, psb_protect_name => psb_dspspmm, only : psb_symbmm, psb_numbmm implicit none - +#if !defined(PSB_CMP_INTEL) + use psb_d_csr_mat_mod + use psb_d_csc_mat_mod + use psb_d_serial_mod, psb_protect_name => psb_dspspmm +#endif type(psb_dspmat_type), intent(in) :: a,b type(psb_dspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info @@ -49,7 +50,8 @@ subroutine psb_dspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm - + +#if defined(PSB_CMP_INTEL) interface psb_symbmm subroutine psb_dsymbmm(a,b,c,info) use psb_d_mat_mod, only : psb_dspmat_type @@ -103,6 +105,8 @@ subroutine psb_dspspmm(a,b,c,info) integer(psb_ipk_), intent(out) :: info end subroutine psb_dcscspspmm end interface +#endif + call psb_erractionsave(err_act) info = psb_success_ @@ -173,9 +177,11 @@ end subroutine psb_dspspmm subroutine psb_ldspspmm(a,b,c,info) use psb_mat_mod -!!$ use psb_d_csr_mat_mod -!!$ use psb_d_csc_mat_mod - !use psb_d_serial_mod, psb_protect_name => psb_ldspspmm, only : psb_symbmm, psb_numbmm +#if !defined(PSB_CMP_INTEL) + use psb_d_csr_mat_mod + use psb_d_csc_mat_mod + use psb_d_serial_mod, psb_protect_name => psb_ldspspmm +#endif implicit none type(psb_ldspmat_type), intent(in) :: a,b @@ -186,6 +192,7 @@ subroutine psb_ldspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm +#if defined(PSB_CMP_INTEL) interface psb_symbmm subroutine psb_ldsymbmm(a,b,c,info) use psb_d_mat_mod, only : psb_ldspmat_type @@ -239,6 +246,8 @@ subroutine psb_ldspspmm(a,b,c,info) integer(psb_ipk_), intent(out) :: info end subroutine psb_ldcscspspmm end interface +#endif + call psb_erractionsave(err_act) info = psb_success_ diff --git a/base/serial/psb_sspspmm.F90 b/base/serial/psb_sspspmm.F90 index 4dc5df40..4af56176 100644 --- a/base/serial/psb_sspspmm.F90 +++ b/base/serial/psb_sspspmm.F90 @@ -37,10 +37,11 @@ ! subroutine psb_sspspmm(a,b,c,info) use psb_mat_mod -!!$ use psb_s_csr_mat_mod -!!$ use psb_s_csc_mat_mod - !use psb_s_serial_mod, psb_protect_name => psb_sspspmm, only : psb_symbmm, psb_numbmm implicit none - +#if !defined(PSB_CMP_INTEL) + use psb_s_csr_mat_mod + use psb_s_csc_mat_mod + use psb_s_serial_mod, psb_protect_name => psb_sspspmm +#endif type(psb_sspmat_type), intent(in) :: a,b type(psb_sspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info @@ -49,7 +50,8 @@ subroutine psb_sspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm - + +#if defined(PSB_CMP_INTEL) interface psb_symbmm subroutine psb_ssymbmm(a,b,c,info) use psb_s_mat_mod, only : psb_sspmat_type @@ -103,6 +105,8 @@ subroutine psb_sspspmm(a,b,c,info) integer(psb_ipk_), intent(out) :: info end subroutine psb_scscspspmm end interface +#endif + call psb_erractionsave(err_act) info = psb_success_ @@ -173,9 +177,11 @@ end subroutine psb_sspspmm subroutine psb_lsspspmm(a,b,c,info) use psb_mat_mod -!!$ use psb_s_csr_mat_mod -!!$ use psb_s_csc_mat_mod - !use psb_s_serial_mod, psb_protect_name => psb_lsspspmm, only : psb_symbmm, psb_numbmm +#if !defined(PSB_CMP_INTEL) + use psb_s_csr_mat_mod + use psb_s_csc_mat_mod + use psb_s_serial_mod, psb_protect_name => psb_lsspspmm +#endif implicit none type(psb_lsspmat_type), intent(in) :: a,b @@ -186,6 +192,7 @@ subroutine psb_lsspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm +#if defined(PSB_CMP_INTEL) interface psb_symbmm subroutine psb_lssymbmm(a,b,c,info) use psb_s_mat_mod, only : psb_lsspmat_type @@ -239,6 +246,8 @@ subroutine psb_lsspspmm(a,b,c,info) integer(psb_ipk_), intent(out) :: info end subroutine psb_lscscspspmm end interface +#endif + call psb_erractionsave(err_act) info = psb_success_ diff --git a/base/serial/psb_zspspmm.F90 b/base/serial/psb_zspspmm.F90 index 831e4b9c..95d1e112 100644 --- a/base/serial/psb_zspspmm.F90 +++ b/base/serial/psb_zspspmm.F90 @@ -37,10 +37,11 @@ ! subroutine psb_zspspmm(a,b,c,info) use psb_mat_mod -!!$ use psb_z_csr_mat_mod -!!$ use psb_z_csc_mat_mod - !use psb_z_serial_mod, psb_protect_name => psb_zspspmm, only : psb_symbmm, psb_numbmm implicit none - +#if !defined(PSB_CMP_INTEL) + use psb_z_csr_mat_mod + use psb_z_csc_mat_mod + use psb_z_serial_mod, psb_protect_name => psb_zspspmm +#endif type(psb_zspmat_type), intent(in) :: a,b type(psb_zspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info @@ -49,7 +50,8 @@ subroutine psb_zspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm - + +#if defined(PSB_CMP_INTEL) interface psb_symbmm subroutine psb_zsymbmm(a,b,c,info) use psb_z_mat_mod, only : psb_zspmat_type @@ -103,6 +105,8 @@ subroutine psb_zspspmm(a,b,c,info) integer(psb_ipk_), intent(out) :: info end subroutine psb_zcscspspmm end interface +#endif + call psb_erractionsave(err_act) info = psb_success_ @@ -173,9 +177,11 @@ end subroutine psb_zspspmm subroutine psb_lzspspmm(a,b,c,info) use psb_mat_mod -!!$ use psb_z_csr_mat_mod -!!$ use psb_z_csc_mat_mod - !use psb_z_serial_mod, psb_protect_name => psb_lzspspmm, only : psb_symbmm, psb_numbmm +#if !defined(PSB_CMP_INTEL) + use psb_z_csr_mat_mod + use psb_z_csc_mat_mod + use psb_z_serial_mod, psb_protect_name => psb_lzspspmm +#endif implicit none type(psb_lzspmat_type), intent(in) :: a,b @@ -186,6 +192,7 @@ subroutine psb_lzspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm +#if defined(PSB_CMP_INTEL) interface psb_symbmm subroutine psb_lzsymbmm(a,b,c,info) use psb_z_mat_mod, only : psb_lzspmat_type @@ -239,6 +246,8 @@ subroutine psb_lzspspmm(a,b,c,info) integer(psb_ipk_), intent(out) :: info end subroutine psb_lzcscspspmm end interface +#endif + call psb_erractionsave(err_act) info = psb_success_ diff --git a/configure b/configure index 0658f499..388ffae9 100755 --- a/configure +++ b/configure @@ -6989,7 +6989,7 @@ if test x"$psblas_cv_fc" == "x" ; then # TODO : discover the exact conditions when the usage of -WF is needed. psblas_cv_define_prepend="-WF," if eval "$MPIFC -qversion 2>&1 | grep -e\"Version: 10\.\" 2>/dev/null"; then - FDEFINES="$psblas_cv_define_prepend-DXLF_10 $FDEFINES"; sed -e's/(0-9*).*/$1/p' + FDEFINES="$psblas_cv_define_prepend-DPSB_CMP_XLF_10 $FDEFINES"; sed -e's/(0-9*).*/$1/p' fi # Note : there could be problems with old xlf compiler versions ( <10.1 ) @@ -7005,7 +7005,7 @@ if test x"$psblas_cv_fc" == "x" ; then psblas_flang_version=`flang-new --version |grep flang| sed -e 's/^ *flang.* version *//gi'`; psblas_flang_shv=`flang-new --version |grep flang| sed -e 's/^ *flang.* version *//gi' | sed -e's/\./ /g' | awk '{print $1}'`; psblas_cv_define_prepend=""; - FDEFINES="$psblas_cv_define_prepend-DFLANG $FDEFINES" + FDEFINES="$psblas_cv_define_prepend-DPSB_CMP_FLANG $FDEFINES" psblas_shvs=`echo $psblas_flang_shv|sed -e's/^0-9*//g'`; if test x"$psblas_shvs" != x""; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Running with LLVM $psblas_flang_version ($psblas_flang_shv). " >&5 @@ -7024,7 +7024,7 @@ printf "%s\n" "$as_me: Running with LLVM $psblas_flang_version ($psblas_flang_ psblas_flang_shv=`flang --version |grep flang| sed -e 's/^ *flang.* version *//gi' | sed -e's/\./ /g' | awk '{print $1}'`; psblas_cv_fc="flang"; psblas_cv_define_prepend=""; - FDEFINES="$psblas_cv_define_prepend-DFLANG $FDEFINES" + FDEFINES="$psblas_cv_define_prepend-DPSB_CMP_FLANG $FDEFINES" psblas_shvs=`echo $psblas_flang_shv|sed -e's/^0-9*//g'`; if test x"$psblas_shvs" != x""; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Running with LLVM $psblas_flang_version ($psblas_flang_shv). " >&5 @@ -7037,7 +7037,7 @@ printf "%s\n" "$as_me: Running with LLVM $psblas_flang_version ($psblas_flang_ fi elif eval "$MPIFC -V 2>&1 | grep Intel.*Fortran.*Compiler 2>/dev/null" ; then # Intel compiler identification - + FDEFINES="$psblas_cv_define_prepend-DPSB_CMP_INTEL $FDEFINES" psblas_cv_fc="ifc"; elif eval "$MPIFC -v 2>&1 | grep NAG 2>/dev/null" ; then psblas_cv_fc="nag"; diff --git a/configure.ac b/configure.ac index 2f472dea..f3c78664 100644 --- a/configure.ac +++ b/configure.ac @@ -242,7 +242,7 @@ if test x"$psblas_cv_fc" == "x" ; then # TODO : discover the exact conditions when the usage of -WF is needed. psblas_cv_define_prepend="-WF," if eval "$MPIFC -qversion 2>&1 | grep -e\"Version: 10\.\" 2>/dev/null"; then - FDEFINES="$psblas_cv_define_prepend-DXLF_10 $FDEFINES"; sed -e's/([0-9]*).*/$1/p' + FDEFINES="$psblas_cv_define_prepend-DPSB_CMP_XLF_10 $FDEFINES"; sed -e's/([0-9]*).*/$1/p' fi # Note : there could be problems with old xlf compiler versions ( <10.1 ) @@ -258,7 +258,7 @@ if test x"$psblas_cv_fc" == "x" ; then psblas_flang_version=`flang-new --version |grep flang| sed -e 's/^ *flang.* version *//gi'`; psblas_flang_shv=`flang-new --version |grep flang| sed -e 's/^ *flang.* version *//gi' | sed -e's/\./ /g' | awk '{print $1}'`; psblas_cv_define_prepend=""; - FDEFINES="$psblas_cv_define_prepend-DFLANG $FDEFINES" + FDEFINES="$psblas_cv_define_prepend-DPSB_CMP_FLANG $FDEFINES" psblas_shvs=`echo $psblas_flang_shv|sed -e's/[^0-9]*//g'`; if test x"$psblas_shvs" != x""; then AC_MSG_NOTICE([[Running with LLVM $psblas_flang_version ($psblas_flang_shv). ]]) @@ -276,7 +276,7 @@ if test x"$psblas_cv_fc" == "x" ; then psblas_flang_shv=`flang --version |grep flang| sed -e 's/^ *flang.* version *//gi' | sed -e's/\./ /g' | awk '{print $1}'`; psblas_cv_fc="flang"; psblas_cv_define_prepend=""; - FDEFINES="$psblas_cv_define_prepend-DFLANG $FDEFINES" + FDEFINES="$psblas_cv_define_prepend-DPSB_CMP_FLANG $FDEFINES" psblas_shvs=`echo $psblas_flang_shv|sed -e's/[^0-9]*//g'`; if test x"$psblas_shvs" != x""; then AC_MSG_NOTICE([[Running with LLVM $psblas_flang_version ($psblas_flang_shv). ]]) @@ -288,7 +288,7 @@ if test x"$psblas_cv_fc" == "x" ; then fi elif eval "$MPIFC -V 2>&1 | grep Intel.*Fortran.*Compiler 2>/dev/null" ; then # Intel compiler identification - + FDEFINES="$psblas_cv_define_prepend-DPSB_CMP_INTEL $FDEFINES" psblas_cv_fc="ifc"; elif eval "$MPIFC -v 2>&1 | grep NAG 2>/dev/null" ; then psblas_cv_fc="nag"; From cdad04813ba1b3346505821ebc5503caa29d9472 Mon Sep 17 00:00:00 2001 From: sfilippone Date: Mon, 22 Sep 2025 13:24:07 +0200 Subject: [PATCH 15/37] Fix handling of tags for P2P and swap --- base/modules/penv/psi_penv_mod.F90 | 246 ++++++++++------------------- 1 file changed, 87 insertions(+), 159 deletions(-) diff --git a/base/modules/penv/psi_penv_mod.F90 b/base/modules/penv/psi_penv_mod.F90 index 7091411d..320df941 100644 --- a/base/modules/penv/psi_penv_mod.F90 +++ b/base/modules/penv/psi_penv_mod.F90 @@ -49,7 +49,9 @@ module mpi integer(psb_mpk_), parameter :: mpi_integer4 = 10 integer(psb_mpk_), parameter :: mpi_comm_null = -1 integer(psb_mpk_), parameter :: mpi_comm_world = 1 - + + integer(psb_mpk_), parameter :: mpi_address_kind = psb_epk_ + !real(psb_dpk_), external :: mpi_wtime interface @@ -179,44 +181,53 @@ end module mpi module psi_penv_mod use psb_const_mod use iso_c_binding - - integer(psb_mpk_), parameter:: psb_int_tag = 543987 - integer(psb_mpk_), parameter:: psb_real_tag = psb_int_tag + 1 - integer(psb_mpk_), parameter:: psb_double_tag = psb_real_tag + 1 - integer(psb_mpk_), parameter:: psb_complex_tag = psb_double_tag + 1 - integer(psb_mpk_), parameter:: psb_dcomplex_tag = psb_complex_tag + 1 - integer(psb_mpk_), parameter:: psb_logical_tag = psb_dcomplex_tag + 1 - integer(psb_mpk_), parameter:: psb_char_tag = psb_logical_tag + 1 - integer(psb_mpk_), parameter:: psb_int8_tag = psb_char_tag + 1 - integer(psb_mpk_), parameter:: psb_int2_tag = psb_int8_tag + 1 - integer(psb_mpk_), parameter:: psb_int4_tag = psb_int2_tag + 1 - integer(psb_mpk_), parameter:: psb_long_tag = psb_int4_tag + 1 - - integer(psb_mpk_), parameter:: psb_int_swap_tag = psb_int_tag + psb_int_tag - integer(psb_mpk_), parameter:: psb_real_swap_tag = psb_real_tag + psb_int_tag - integer(psb_mpk_), parameter:: psb_double_swap_tag = psb_double_tag + psb_int_tag - integer(psb_mpk_), parameter:: psb_complex_swap_tag = psb_complex_tag + psb_int_tag - integer(psb_mpk_), parameter:: psb_dcomplex_swap_tag = psb_dcomplex_tag + psb_int_tag - integer(psb_mpk_), parameter:: psb_logical_swap_tag = psb_logical_tag + psb_int_tag - integer(psb_mpk_), parameter:: psb_char_swap_tag = psb_char_tag + psb_int_tag - integer(psb_mpk_), parameter:: psb_int8_swap_tag = psb_int8_tag + psb_int_tag - integer(psb_mpk_), parameter:: psb_int2_swap_tag = psb_int2_tag + psb_int_tag - integer(psb_mpk_), parameter:: psb_int4_swap_tag = psb_int4_tag + psb_int_tag - integer(psb_mpk_), parameter:: psb_long_swap_tag = psb_long_tag + psb_int_tag - +#ifdef PSB_MPI_MOD + use mpi +#endif +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + integer(psb_mpk_), parameter :: psb_apk_ = mpi_address_kind + + integer(psb_mpk_), parameter :: psb_tag_space = 200 + + integer(psb_mpk_), save :: psb_int_tag + integer(psb_mpk_), save :: psb_real_tag + integer(psb_mpk_), save :: psb_double_tag + integer(psb_mpk_), save :: psb_complex_tag + integer(psb_mpk_), save :: psb_dcomplex_tag + integer(psb_mpk_), save :: psb_logical_tag + integer(psb_mpk_), save :: psb_char_tag + integer(psb_mpk_), save :: psb_int8_tag + integer(psb_mpk_), save :: psb_int2_tag + integer(psb_mpk_), save :: psb_int4_tag + integer(psb_mpk_), save :: psb_long_tag + integer(psb_mpk_), save :: psb_max_simple_tag + integer(psb_mpk_), save :: psb_int_swap_tag + integer(psb_mpk_), save :: psb_real_swap_tag + integer(psb_mpk_), save :: psb_double_swap_tag + integer(psb_mpk_), save :: psb_complex_swap_tag + integer(psb_mpk_), save :: psb_dcomplex_swap_tag + integer(psb_mpk_), save :: psb_logical_swap_tag + integer(psb_mpk_), save :: psb_char_swap_tag + integer(psb_mpk_), save :: psb_int8_swap_tag + integer(psb_mpk_), save :: psb_int2_swap_tag + integer(psb_mpk_), save :: psb_int4_swap_tag + integer(psb_mpk_), save :: psb_long_swap_tag - integer(psb_mpk_), private, parameter:: psb_int_type = 987543 - integer(psb_mpk_), private, parameter:: psb_real_type = psb_int_type + 1 - integer(psb_mpk_), private, parameter:: psb_double_type = psb_real_type + 1 - integer(psb_mpk_), private, parameter:: psb_complex_type = psb_double_type + 1 - integer(psb_mpk_), private, parameter:: psb_dcomplex_type = psb_complex_type + 1 - integer(psb_mpk_), private, parameter:: psb_logical_type = psb_dcomplex_type + 1 - integer(psb_mpk_), private, parameter:: psb_char_type = psb_logical_type + 1 - integer(psb_mpk_), private, parameter:: psb_int8_type = psb_char_type + 1 - integer(psb_mpk_), private, parameter:: psb_int2_type = psb_int8_type + 1 - integer(psb_mpk_), private, parameter:: psb_int4_type = psb_int2_type + 1 - integer(psb_mpk_), private, parameter:: psb_long_type = psb_int4_type + 1 + integer(psb_mpk_), private, parameter :: psb_int_type = 200 + integer(psb_mpk_), private, parameter :: psb_real_type = psb_int_type + 1 + integer(psb_mpk_), private, parameter :: psb_double_type = psb_real_type + 1 + integer(psb_mpk_), private, parameter :: psb_complex_type = psb_double_type + 1 + integer(psb_mpk_), private, parameter :: psb_dcomplex_type = psb_complex_type + 1 + integer(psb_mpk_), private, parameter :: psb_logical_type = psb_dcomplex_type + 1 + integer(psb_mpk_), private, parameter :: psb_char_type = psb_logical_type + 1 + integer(psb_mpk_), private, parameter :: psb_int8_type = psb_char_type + 1 + integer(psb_mpk_), private, parameter :: psb_int2_type = psb_int8_type + 1 + integer(psb_mpk_), private, parameter :: psb_int4_type = psb_int2_type + 1 + integer(psb_mpk_), private, parameter :: psb_long_type = psb_int4_type + 1 type psb_buffer_node integer(psb_mpk_) :: request @@ -304,7 +315,7 @@ module psi_penv_mod #endif - private :: psi_get_sizes, psi_register_mpi_extras + private :: psi_get_sizes, psi_register_mpi_const private :: psi_i2amx_op, psi_i2amn_op private :: psi_iamx_op, psi_iamn_op private :: psi_mamx_op, psi_mamn_op @@ -341,13 +352,7 @@ contains end subroutine psb_init_queue subroutine psb_wait_buffer(node, info) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_buffer_node), intent(inout) :: node integer(psb_ipk_), intent(out) :: info integer(psb_mpk_) :: status(mpi_status_size),minfo @@ -357,13 +362,7 @@ contains end subroutine psb_wait_buffer subroutine psb_test_buffer(node, flag, info) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_buffer_node), intent(inout) :: node logical, intent(out) :: flag integer(psb_ipk_), intent(out) :: info @@ -476,13 +475,7 @@ contains ! ! !!!!!!!!!!!!!!!!! subroutine psi_msnd(ctxt,tag,dest,buffer,mesg_queue) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: tag, dest integer(psb_mpk_), allocatable, intent(inout) :: buffer(:) @@ -515,13 +508,7 @@ contains subroutine psi_esnd(ctxt,tag,dest,buffer,mesg_queue) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: tag, dest integer(psb_epk_), allocatable, intent(inout) :: buffer(:) @@ -552,13 +539,7 @@ contains end subroutine psi_esnd subroutine psi_i2snd(ctxt,tag,dest,buffer,mesg_queue) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: tag, dest integer(psb_i2pk_), allocatable, intent(inout) :: buffer(:) @@ -589,13 +570,7 @@ contains end subroutine psi_i2snd subroutine psi_ssnd(ctxt,tag,dest,buffer,mesg_queue) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: tag, dest real(psb_spk_), allocatable, intent(inout) :: buffer(:) @@ -626,13 +601,7 @@ contains end subroutine psi_ssnd subroutine psi_dsnd(ctxt,tag,dest,buffer,mesg_queue) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: tag, dest real(psb_dpk_), allocatable, intent(inout) :: buffer(:) @@ -663,13 +632,7 @@ contains end subroutine psi_dsnd subroutine psi_csnd(ctxt,tag,dest,buffer,mesg_queue) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: tag, dest complex(psb_spk_), allocatable, intent(inout) :: buffer(:) @@ -700,13 +663,7 @@ contains end subroutine psi_csnd subroutine psi_zsnd(ctxt,tag,dest,buffer,mesg_queue) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: tag, dest complex(psb_dpk_), allocatable, intent(inout) :: buffer(:) @@ -738,13 +695,7 @@ contains subroutine psi_logsnd(ctxt,tag,dest,buffer,mesg_queue) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: tag, dest logical, allocatable, intent(inout) :: buffer(:) @@ -776,13 +727,7 @@ contains subroutine psi_hsnd(ctxt,tag,dest,buffer,mesg_queue) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: tag, dest character(len=1), allocatable, intent(inout) :: buffer(:) @@ -850,16 +795,12 @@ contains end subroutine psi_get_sizes - subroutine psi_register_mpi_extras(info) -#ifdef PSB_MPI_MOD - use mpi -#endif + subroutine psi_register_mpi_const(comm,info) implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif - integer(psb_mpk_) :: info - + integer(psb_mpk_) :: comm,info + integer(psb_mpk_) :: ierror + integer(psb_apk_) :: tag_value + logical :: flag info = 0 #if 0 if (info == 0) call mpi_type_create_f90_integer(psb_ipk_, psb_mpi_ipk_ ,info) @@ -897,6 +838,7 @@ contains #endif #if defined(PSB_SERIAL_MPI) + tag_value = HUGE(psb_tag_space)/2 #else if (info == 0) call mpi_op_create(psi_i2amx_op,.true.,mpi_i2amx_op,info) if (info == 0) call mpi_op_create(psi_i2amn_op,.true.,mpi_i2amn_op,info) @@ -914,9 +856,37 @@ contains if (info == 0) call mpi_op_create(psi_zamn_op,.true.,mpi_zamn_op,info) if (info == 0) call mpi_op_create(psi_snrm2_op,.true.,mpi_snrm2_op,info) if (info == 0) call mpi_op_create(psi_dnrm2_op,.true.,mpi_dnrm2_op,info) + if (info == 0) call mpi_comm_get_attr(comm,mpi_tag_ub,tag_value,flag,ierror) + if ((ierror/=0).or.(.not.flag)) then + tag_value = 0 + info = psb_err_internal_error_ + end if #endif - - end subroutine psi_register_mpi_extras + psb_int_tag = tag_value - psb_tag_space + psb_real_tag = psb_int_tag + 1 + psb_double_tag = psb_real_tag + 1 + psb_complex_tag = psb_double_tag + 1 + psb_dcomplex_tag = psb_complex_tag + 1 + psb_logical_tag = psb_dcomplex_tag + 1 + psb_char_tag = psb_logical_tag + 1 + psb_int8_tag = psb_char_tag + 1 + psb_int2_tag = psb_int8_tag + 1 + psb_int4_tag = psb_int2_tag + 1 + psb_long_tag = psb_int4_tag + 1 + psb_max_simple_tag = psb_long_tag + 2 + psb_int_swap_tag = psb_max_simple_tag + 1 + psb_real_swap_tag = psb_int_swap_tag + 1 + psb_double_swap_tag = psb_real_swap_tag + 1 + psb_complex_swap_tag = psb_double_swap_tag + 1 + psb_dcomplex_swap_tag = psb_complex_swap_tag + 1 + psb_logical_swap_tag = psb_dcomplex_swap_tag + 1 + psb_char_swap_tag = psb_logical_swap_tag + 1 + psb_int8_swap_tag = psb_char_swap_tag + 1 + psb_int2_swap_tag = psb_int8_swap_tag + 1 + psb_int4_swap_tag = psb_int2_swap_tag + 1 + psb_long_swap_tag = psb_int4_swap_tag + 1 + + end subroutine psi_register_mpi_const #if (defined(PSB_IPK4) && defined(PSB_LPK8))||defined(PSB_IPK8) subroutine psb_info_epk(ctxt,iam,np) @@ -941,13 +911,7 @@ contains use psb_mat_mod use psb_vect_mod ! !$ use psb_rsb_mod -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type), intent(out) :: ctxt type(psb_ctxt_type), intent(in), optional :: basectxt integer(psb_mpk_), intent(in), optional :: np, ids(:), extcomm @@ -965,7 +929,7 @@ contains ctxt%ctxt = nctxt ! allocate on assignment nctxt = nctxt + 1 - call psi_register_mpi_extras(info) + call psi_register_mpi_const(nctxt,info) call psi_get_sizes() #else @@ -1054,7 +1018,7 @@ contains if (info == 0) then ctxt%ctxt = icomm ! allocate on assignment end if - call psi_register_mpi_extras(info) + call psi_register_mpi_const(icomm,info) call psi_get_sizes() !if (ctxt == mpi_comm_null) return if (.not.allocated(ctxt%ctxt)) return @@ -1080,13 +1044,7 @@ contains use psb_mat_mod use psb_vect_mod ! !$ use psb_rsb_mod -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type), intent(inout) :: ctxt logical, intent(in), optional :: close logical :: close_ @@ -1154,13 +1112,7 @@ contains subroutine psb_barrier_mpik(ctxt) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type), intent(in) :: ctxt integer(psb_mpk_) :: info @@ -1175,13 +1127,7 @@ contains function psb_wtime() use psb_const_mod ! use mpi_constants -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif real(psb_dpk_) :: psb_wtime psb_wtime = mpi_wtime() @@ -1210,13 +1156,7 @@ contains subroutine psb_info_mpik(ctxt,iam,np) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type), intent(in) :: ctxt integer(psb_mpk_), intent(out) :: iam, np @@ -1269,13 +1209,7 @@ contains function psb_m_get_mpi_comm(ctxt) result(comm) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: comm comm = mpi_comm_null @@ -1291,13 +1225,7 @@ contains end function psb_m_get_mpi_rank subroutine psb_get_mpicomm(ctxt,comm) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: comm comm = mpi_comm_null From 0239569e2b06295a2e4611791806ca917ff0f005 Mon Sep 17 00:00:00 2001 From: sfilippone Date: Tue, 23 Sep 2025 13:10:49 +0200 Subject: [PATCH 16/37] Final fixes for compilation with INTEL --- base/modules/serial/psb_c_mat_mod.F90 | 7 ++-- base/modules/serial/psb_c_serial_mod.f90 | 10 +++++ base/modules/serial/psb_d_mat_mod.F90 | 7 ++-- base/modules/serial/psb_d_serial_mod.f90 | 10 +++++ base/modules/serial/psb_s_mat_mod.F90 | 7 ++-- base/modules/serial/psb_s_serial_mod.f90 | 10 +++++ base/modules/serial/psb_z_mat_mod.F90 | 7 ++-- base/modules/serial/psb_z_serial_mod.f90 | 10 +++++ base/serial/Makefile | 1 + base/serial/psb_caplusat.f90 | 50 ++++++++++++++++++++++++ base/serial/psb_daplusat.f90 | 50 ++++++++++++++++++++++++ base/serial/psb_saplusat.f90 | 50 ++++++++++++++++++++++++ base/serial/psb_zaplusat.f90 | 50 ++++++++++++++++++++++++ 13 files changed, 257 insertions(+), 12 deletions(-) create mode 100644 base/serial/psb_caplusat.f90 create mode 100644 base/serial/psb_daplusat.f90 create mode 100644 base/serial/psb_saplusat.f90 create mode 100644 base/serial/psb_zaplusat.f90 diff --git a/base/modules/serial/psb_c_mat_mod.F90 b/base/modules/serial/psb_c_mat_mod.F90 index 165a5451..91d8bf4d 100644 --- a/base/modules/serial/psb_c_mat_mod.F90 +++ b/base/modules/serial/psb_c_mat_mod.F90 @@ -78,6 +78,8 @@ ! module psb_c_mat_mod + use psb_c_vect_mod + use psb_i_vect_mod use psb_c_base_mat_mod use psb_c_csr_mat_mod, only : psb_c_csr_sparse_mat, psb_lc_csr_sparse_mat,& & psb_c_ecsr_sparse_mat @@ -661,9 +663,8 @@ module psb_c_mat_mod interface subroutine psb_c_csput_v(nz,ia,ja,val,a,imin,imax,jmin,jmax,info) - use psb_c_vect_mod, only : psb_c_vect_type - use psb_i_vect_mod, only : psb_i_vect_type - import :: psb_ipk_, psb_lpk_, psb_cspmat_type + import :: psb_ipk_, psb_lpk_, psb_cspmat_type, & + & psb_c_vect_type, psb_i_vect_type class(psb_cspmat_type), intent(inout) :: a type(psb_c_vect_type), intent(inout) :: val type(psb_i_vect_type), intent(inout) :: ia, ja diff --git a/base/modules/serial/psb_c_serial_mod.f90 b/base/modules/serial/psb_c_serial_mod.f90 index 24fba38e..5ad71641 100644 --- a/base/modules/serial/psb_c_serial_mod.f90 +++ b/base/modules/serial/psb_c_serial_mod.f90 @@ -98,6 +98,16 @@ module psb_c_serial_mod end subroutine psb_cbase_numbmm end interface psb_numbmm + interface psb_aplusat + subroutine psb_caplusat(ain,aout,info) + use psb_c_mat_mod, only : psb_cspmat_type + import :: psb_ipk_ + implicit none + type(psb_cspmat_type) :: ain, aout + integer(psb_ipk_) :: info + end subroutine psb_caplusat + end interface + interface psb_rwextd subroutine psb_crwextd(nr,a,info,b,rowscale) use psb_c_mat_mod, only : psb_cspmat_type diff --git a/base/modules/serial/psb_d_mat_mod.F90 b/base/modules/serial/psb_d_mat_mod.F90 index a4318ba4..754196b7 100644 --- a/base/modules/serial/psb_d_mat_mod.F90 +++ b/base/modules/serial/psb_d_mat_mod.F90 @@ -78,6 +78,8 @@ ! module psb_d_mat_mod + use psb_d_vect_mod + use psb_i_vect_mod use psb_d_base_mat_mod use psb_d_csr_mat_mod, only : psb_d_csr_sparse_mat, psb_ld_csr_sparse_mat,& & psb_d_ecsr_sparse_mat @@ -661,9 +663,8 @@ module psb_d_mat_mod interface subroutine psb_d_csput_v(nz,ia,ja,val,a,imin,imax,jmin,jmax,info) - use psb_d_vect_mod, only : psb_d_vect_type - use psb_i_vect_mod, only : psb_i_vect_type - import :: psb_ipk_, psb_lpk_, psb_dspmat_type + import :: psb_ipk_, psb_lpk_, psb_dspmat_type, & + & psb_d_vect_type, psb_i_vect_type class(psb_dspmat_type), intent(inout) :: a type(psb_d_vect_type), intent(inout) :: val type(psb_i_vect_type), intent(inout) :: ia, ja diff --git a/base/modules/serial/psb_d_serial_mod.f90 b/base/modules/serial/psb_d_serial_mod.f90 index 1c186cf7..6446a9f5 100644 --- a/base/modules/serial/psb_d_serial_mod.f90 +++ b/base/modules/serial/psb_d_serial_mod.f90 @@ -98,6 +98,16 @@ module psb_d_serial_mod end subroutine psb_dbase_numbmm end interface psb_numbmm + interface psb_aplusat + subroutine psb_daplusat(ain,aout,info) + use psb_d_mat_mod, only : psb_dspmat_type + import :: psb_ipk_ + implicit none + type(psb_dspmat_type) :: ain, aout + integer(psb_ipk_) :: info + end subroutine psb_daplusat + end interface + interface psb_rwextd subroutine psb_drwextd(nr,a,info,b,rowscale) use psb_d_mat_mod, only : psb_dspmat_type diff --git a/base/modules/serial/psb_s_mat_mod.F90 b/base/modules/serial/psb_s_mat_mod.F90 index e342ed8c..ac619c03 100644 --- a/base/modules/serial/psb_s_mat_mod.F90 +++ b/base/modules/serial/psb_s_mat_mod.F90 @@ -78,6 +78,8 @@ ! module psb_s_mat_mod + use psb_s_vect_mod + use psb_i_vect_mod use psb_s_base_mat_mod use psb_s_csr_mat_mod, only : psb_s_csr_sparse_mat, psb_ls_csr_sparse_mat,& & psb_s_ecsr_sparse_mat @@ -661,9 +663,8 @@ module psb_s_mat_mod interface subroutine psb_s_csput_v(nz,ia,ja,val,a,imin,imax,jmin,jmax,info) - use psb_s_vect_mod, only : psb_s_vect_type - use psb_i_vect_mod, only : psb_i_vect_type - import :: psb_ipk_, psb_lpk_, psb_sspmat_type + import :: psb_ipk_, psb_lpk_, psb_sspmat_type, & + & psb_s_vect_type, psb_i_vect_type class(psb_sspmat_type), intent(inout) :: a type(psb_s_vect_type), intent(inout) :: val type(psb_i_vect_type), intent(inout) :: ia, ja diff --git a/base/modules/serial/psb_s_serial_mod.f90 b/base/modules/serial/psb_s_serial_mod.f90 index 9872e53e..c475ab8d 100644 --- a/base/modules/serial/psb_s_serial_mod.f90 +++ b/base/modules/serial/psb_s_serial_mod.f90 @@ -98,6 +98,16 @@ module psb_s_serial_mod end subroutine psb_sbase_numbmm end interface psb_numbmm + interface psb_aplusat + subroutine psb_saplusat(ain,aout,info) + use psb_s_mat_mod, only : psb_sspmat_type + import :: psb_ipk_ + implicit none + type(psb_sspmat_type) :: ain, aout + integer(psb_ipk_) :: info + end subroutine psb_saplusat + end interface + interface psb_rwextd subroutine psb_srwextd(nr,a,info,b,rowscale) use psb_s_mat_mod, only : psb_sspmat_type diff --git a/base/modules/serial/psb_z_mat_mod.F90 b/base/modules/serial/psb_z_mat_mod.F90 index 47342aee..521e665a 100644 --- a/base/modules/serial/psb_z_mat_mod.F90 +++ b/base/modules/serial/psb_z_mat_mod.F90 @@ -78,6 +78,8 @@ ! module psb_z_mat_mod + use psb_z_vect_mod + use psb_i_vect_mod use psb_z_base_mat_mod use psb_z_csr_mat_mod, only : psb_z_csr_sparse_mat, psb_lz_csr_sparse_mat,& & psb_z_ecsr_sparse_mat @@ -661,9 +663,8 @@ module psb_z_mat_mod interface subroutine psb_z_csput_v(nz,ia,ja,val,a,imin,imax,jmin,jmax,info) - use psb_z_vect_mod, only : psb_z_vect_type - use psb_i_vect_mod, only : psb_i_vect_type - import :: psb_ipk_, psb_lpk_, psb_zspmat_type + import :: psb_ipk_, psb_lpk_, psb_zspmat_type, & + & psb_z_vect_type, psb_i_vect_type class(psb_zspmat_type), intent(inout) :: a type(psb_z_vect_type), intent(inout) :: val type(psb_i_vect_type), intent(inout) :: ia, ja diff --git a/base/modules/serial/psb_z_serial_mod.f90 b/base/modules/serial/psb_z_serial_mod.f90 index fa0b3ef2..6339f5e1 100644 --- a/base/modules/serial/psb_z_serial_mod.f90 +++ b/base/modules/serial/psb_z_serial_mod.f90 @@ -98,6 +98,16 @@ module psb_z_serial_mod end subroutine psb_zbase_numbmm end interface psb_numbmm + interface psb_aplusat + subroutine psb_zaplusat(ain,aout,info) + use psb_z_mat_mod, only : psb_zspmat_type + import :: psb_ipk_ + implicit none + type(psb_zspmat_type) :: ain, aout + integer(psb_ipk_) :: info + end subroutine psb_zaplusat + end interface + interface psb_rwextd subroutine psb_zrwextd(nr,a,info,b,rowscale) use psb_z_mat_mod, only : psb_zspmat_type diff --git a/base/serial/Makefile b/base/serial/Makefile index ec0e2c82..57e4bfa1 100644 --- a/base/serial/Makefile +++ b/base/serial/Makefile @@ -11,6 +11,7 @@ FOBJS = psb_lsame.o psi_m_serial_impl.o psi_e_serial_impl.o \ smmp.o lsmmp.o \ psb_sgeprt.o psb_dgeprt.o psb_cgeprt.o psb_zgeprt.o\ psb_spdot_srtd.o psb_aspxpby.o psb_spge_dot.o\ + psb_saplusat.o psb_daplusat.o psb_caplusat.o psb_zaplusat.o \ psb_samax_s.o psb_damax_s.o psb_camax_s.o psb_zamax_s.o \ psb_sasum_s.o psb_dasum_s.o psb_casum_s.o psb_zasum_s.o diff --git a/base/serial/psb_caplusat.f90 b/base/serial/psb_caplusat.f90 new file mode 100644 index 00000000..6beb7f17 --- /dev/null +++ b/base/serial/psb_caplusat.f90 @@ -0,0 +1,50 @@ +subroutine psb_caplusat(ain,aout,info) + use psb_c_mat_mod + + implicit none + type(psb_cspmat_type), intent(inout) :: ain + type(psb_cspmat_type), intent(out) :: aout + integer(psb_ipk_) :: info + + type(psb_c_coo_sparse_mat) :: acoo1, acoo2 + integer(psb_ipk_) :: nr, nc, nz1, nz2 + integer(psb_ipk_) :: err_act + character(len=20) :: name, ch_err + + name='psb_caplusat' + info = psb_success_ + call psb_erractionsave(err_act) + + + + nr = ain%get_nrows() + nc = ain%get_ncols() + + if (nr /= nc) then + info=psb_err_internal_error_ + call psb_errpush(info,name) + goto 9999 + end if + + call ain%cp_to(acoo1) + call acoo1%cp_to_coo(acoo2,info) + nz1 = acoo1%get_nzeros() + nz2 = acoo2%get_nzeros() + call acoo1%reallocate(nz1+nz2) + acoo1%ia(nz1+1:nz1+nz2) = acoo2%ja(1:nz2) + acoo1%ja(nz1+1:nz1+nz2) = acoo2%ia(1:nz2) + acoo1%val(nz1+1:nz1+nz2) = acoo2%val(1:nz2) + call acoo1%set_nrows(nr) + call acoo1%set_ncols(nr) + call acoo1%set_nzeros(nz1+nz2) + call aout%cp_from(acoo1) + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + + return + + +end subroutine psb_caplusat diff --git a/base/serial/psb_daplusat.f90 b/base/serial/psb_daplusat.f90 new file mode 100644 index 00000000..6ae0b462 --- /dev/null +++ b/base/serial/psb_daplusat.f90 @@ -0,0 +1,50 @@ +subroutine psb_daplusat(ain,aout,info) + use psb_d_mat_mod + + implicit none + type(psb_dspmat_type), intent(inout) :: ain + type(psb_dspmat_type), intent(out) :: aout + integer(psb_ipk_) :: info + + type(psb_d_coo_sparse_mat) :: acoo1, acoo2 + integer(psb_ipk_) :: nr, nc, nz1, nz2 + integer(psb_ipk_) :: err_act + character(len=20) :: name, ch_err + + name='psb_daplusat' + info = psb_success_ + call psb_erractionsave(err_act) + + + + nr = ain%get_nrows() + nc = ain%get_ncols() + + if (nr /= nc) then + info=psb_err_internal_error_ + call psb_errpush(info,name) + goto 9999 + end if + + call ain%cp_to(acoo1) + call acoo1%cp_to_coo(acoo2,info) + nz1 = acoo1%get_nzeros() + nz2 = acoo2%get_nzeros() + call acoo1%reallocate(nz1+nz2) + acoo1%ia(nz1+1:nz1+nz2) = acoo2%ja(1:nz2) + acoo1%ja(nz1+1:nz1+nz2) = acoo2%ia(1:nz2) + acoo1%val(nz1+1:nz1+nz2) = acoo2%val(1:nz2) + call acoo1%set_nrows(nr) + call acoo1%set_ncols(nr) + call acoo1%set_nzeros(nz1+nz2) + call aout%cp_from(acoo1) + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + + return + + +end subroutine psb_daplusat diff --git a/base/serial/psb_saplusat.f90 b/base/serial/psb_saplusat.f90 new file mode 100644 index 00000000..3e9024d3 --- /dev/null +++ b/base/serial/psb_saplusat.f90 @@ -0,0 +1,50 @@ +subroutine psb_saplusat(ain,aout,info) + use psb_s_mat_mod + + implicit none + type(psb_sspmat_type), intent(inout) :: ain + type(psb_sspmat_type), intent(out) :: aout + integer(psb_ipk_) :: info + + type(psb_s_coo_sparse_mat) :: acoo1, acoo2 + integer(psb_ipk_) :: nr, nc, nz1, nz2 + integer(psb_ipk_) :: err_act + character(len=20) :: name, ch_err + + name='psb_saplusat' + info = psb_success_ + call psb_erractionsave(err_act) + + + + nr = ain%get_nrows() + nc = ain%get_ncols() + + if (nr /= nc) then + info=psb_err_internal_error_ + call psb_errpush(info,name) + goto 9999 + end if + + call ain%cp_to(acoo1) + call acoo1%cp_to_coo(acoo2,info) + nz1 = acoo1%get_nzeros() + nz2 = acoo2%get_nzeros() + call acoo1%reallocate(nz1+nz2) + acoo1%ia(nz1+1:nz1+nz2) = acoo2%ja(1:nz2) + acoo1%ja(nz1+1:nz1+nz2) = acoo2%ia(1:nz2) + acoo1%val(nz1+1:nz1+nz2) = acoo2%val(1:nz2) + call acoo1%set_nrows(nr) + call acoo1%set_ncols(nr) + call acoo1%set_nzeros(nz1+nz2) + call aout%cp_from(acoo1) + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + + return + + +end subroutine psb_saplusat diff --git a/base/serial/psb_zaplusat.f90 b/base/serial/psb_zaplusat.f90 new file mode 100644 index 00000000..cb418474 --- /dev/null +++ b/base/serial/psb_zaplusat.f90 @@ -0,0 +1,50 @@ +subroutine psb_zaplusat(ain,aout,info) + use psb_z_mat_mod + + implicit none + type(psb_zspmat_type), intent(inout) :: ain + type(psb_zspmat_type), intent(out) :: aout + integer(psb_ipk_) :: info + + type(psb_z_coo_sparse_mat) :: acoo1, acoo2 + integer(psb_ipk_) :: nr, nc, nz1, nz2 + integer(psb_ipk_) :: err_act + character(len=20) :: name, ch_err + + name='psb_zaplusat' + info = psb_success_ + call psb_erractionsave(err_act) + + + + nr = ain%get_nrows() + nc = ain%get_ncols() + + if (nr /= nc) then + info=psb_err_internal_error_ + call psb_errpush(info,name) + goto 9999 + end if + + call ain%cp_to(acoo1) + call acoo1%cp_to_coo(acoo2,info) + nz1 = acoo1%get_nzeros() + nz2 = acoo2%get_nzeros() + call acoo1%reallocate(nz1+nz2) + acoo1%ia(nz1+1:nz1+nz2) = acoo2%ja(1:nz2) + acoo1%ja(nz1+1:nz1+nz2) = acoo2%ia(1:nz2) + acoo1%val(nz1+1:nz1+nz2) = acoo2%val(1:nz2) + call acoo1%set_nrows(nr) + call acoo1%set_ncols(nr) + call acoo1%set_nzeros(nz1+nz2) + call aout%cp_from(acoo1) + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + + return + + +end subroutine psb_zaplusat From e25d25460ed67855172cd301b59602910beadc2d Mon Sep 17 00:00:00 2001 From: sfilippone Date: Tue, 23 Sep 2025 13:38:27 +0200 Subject: [PATCH 17/37] Revert one INTEL fix no longer needed --- base/serial/psb_cspspmm.F90 | 114 ------------------------------------ base/serial/psb_dspspmm.F90 | 114 ------------------------------------ base/serial/psb_sspspmm.F90 | 114 ------------------------------------ base/serial/psb_zspspmm.F90 | 114 ------------------------------------ 4 files changed, 456 deletions(-) diff --git a/base/serial/psb_cspspmm.F90 b/base/serial/psb_cspspmm.F90 index 865c1922..64fedbfe 100644 --- a/base/serial/psb_cspspmm.F90 +++ b/base/serial/psb_cspspmm.F90 @@ -37,11 +37,9 @@ ! subroutine psb_cspspmm(a,b,c,info) use psb_mat_mod -#if !defined(PSB_CMP_INTEL) use psb_c_csr_mat_mod use psb_c_csc_mat_mod use psb_c_serial_mod, psb_protect_name => psb_cspspmm -#endif type(psb_cspmat_type), intent(in) :: a,b type(psb_cspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info @@ -51,61 +49,6 @@ subroutine psb_cspspmm(a,b,c,info) character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm -#if defined(PSB_CMP_INTEL) - interface psb_symbmm - subroutine psb_csymbmm(a,b,c,info) - use psb_c_mat_mod, only : psb_cspmat_type - import :: psb_ipk_ - implicit none - type(psb_cspmat_type), intent(in) :: a,b - type(psb_cspmat_type), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_csymbmm - subroutine psb_cbase_symbmm(a,b,c,info) - use psb_c_mat_mod, only : psb_c_base_sparse_mat, psb_c_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_c_base_sparse_mat), intent(in) :: a,b - type(psb_c_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_cbase_symbmm - end interface psb_symbmm - - interface psb_numbmm - subroutine psb_cnumbmm(a,b,c) - use psb_c_mat_mod, only : psb_cspmat_type - import :: psb_ipk_ - implicit none - type(psb_cspmat_type), intent(in) :: a,b - type(psb_cspmat_type), intent(inout) :: c - end subroutine psb_cnumbmm - subroutine psb_cbase_numbmm(a,b,c) - use psb_c_mat_mod, only : psb_c_base_sparse_mat, psb_c_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_c_base_sparse_mat), intent(in) :: a,b - type(psb_c_csr_sparse_mat), intent(inout) :: c - end subroutine psb_cbase_numbmm - end interface psb_numbmm - interface - subroutine psb_ccsrspspmm(a,b,c,info) - use psb_c_mat_mod, only : psb_c_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_c_csr_sparse_mat), intent(in) :: a,b - type(psb_c_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_ccsrspspmm - subroutine psb_ccscspspmm(a,b,c,info) - use psb_c_mat_mod, only : psb_c_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_c_csc_sparse_mat), intent(in) :: a,b - type(psb_c_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_ccscspspmm - end interface -#endif call psb_erractionsave(err_act) info = psb_success_ @@ -177,11 +120,9 @@ end subroutine psb_cspspmm subroutine psb_lcspspmm(a,b,c,info) use psb_mat_mod -#if !defined(PSB_CMP_INTEL) use psb_c_csr_mat_mod use psb_c_csc_mat_mod use psb_c_serial_mod, psb_protect_name => psb_lcspspmm -#endif implicit none type(psb_lcspmat_type), intent(in) :: a,b @@ -192,61 +133,6 @@ subroutine psb_lcspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm -#if defined(PSB_CMP_INTEL) - interface psb_symbmm - subroutine psb_lcsymbmm(a,b,c,info) - use psb_c_mat_mod, only : psb_lcspmat_type - import :: psb_ipk_ - implicit none - type(psb_lcspmat_type), intent(in) :: a,b - type(psb_lcspmat_type), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_lcsymbmm - subroutine psb_lcbase_symbmm(a,b,c,info) - use psb_c_mat_mod, only : psb_lc_base_sparse_mat, psb_lc_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_lc_base_sparse_mat), intent(in) :: a,b - type(psb_lc_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_lcbase_symbmm - end interface psb_symbmm - - interface psb_numbmm - subroutine psb_lcnumbmm(a,b,c) - use psb_c_mat_mod, only : psb_lcspmat_type - import :: psb_ipk_ - implicit none - type(psb_lcspmat_type), intent(in) :: a,b - type(psb_lcspmat_type), intent(inout) :: c - end subroutine psb_lcnumbmm - subroutine psb_lcbase_numbmm(a,b,c) - use psb_c_mat_mod, only : psb_lc_base_sparse_mat, psb_lc_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_lc_base_sparse_mat), intent(in) :: a,b - type(psb_lc_csr_sparse_mat), intent(inout) :: c - end subroutine psb_lcbase_numbmm - end interface psb_numbmm - interface - subroutine psb_lccsrspspmm(a,b,c,info) - use psb_c_mat_mod, only : psb_lc_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_lc_csr_sparse_mat), intent(in) :: a,b - type(psb_lc_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_lccsrspspmm - subroutine psb_lccscspspmm(a,b,c,info) - use psb_c_mat_mod, only : psb_lc_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_lc_csc_sparse_mat), intent(in) :: a,b - type(psb_lc_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_lccscspspmm - end interface -#endif call psb_erractionsave(err_act) info = psb_success_ diff --git a/base/serial/psb_dspspmm.F90 b/base/serial/psb_dspspmm.F90 index f7e37fe7..4b37df0e 100644 --- a/base/serial/psb_dspspmm.F90 +++ b/base/serial/psb_dspspmm.F90 @@ -37,11 +37,9 @@ ! subroutine psb_dspspmm(a,b,c,info) use psb_mat_mod -#if !defined(PSB_CMP_INTEL) use psb_d_csr_mat_mod use psb_d_csc_mat_mod use psb_d_serial_mod, psb_protect_name => psb_dspspmm -#endif type(psb_dspmat_type), intent(in) :: a,b type(psb_dspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info @@ -51,61 +49,6 @@ subroutine psb_dspspmm(a,b,c,info) character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm -#if defined(PSB_CMP_INTEL) - interface psb_symbmm - subroutine psb_dsymbmm(a,b,c,info) - use psb_d_mat_mod, only : psb_dspmat_type - import :: psb_ipk_ - implicit none - type(psb_dspmat_type), intent(in) :: a,b - type(psb_dspmat_type), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_dsymbmm - subroutine psb_dbase_symbmm(a,b,c,info) - use psb_d_mat_mod, only : psb_d_base_sparse_mat, psb_d_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_d_base_sparse_mat), intent(in) :: a,b - type(psb_d_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_dbase_symbmm - end interface psb_symbmm - - interface psb_numbmm - subroutine psb_dnumbmm(a,b,c) - use psb_d_mat_mod, only : psb_dspmat_type - import :: psb_ipk_ - implicit none - type(psb_dspmat_type), intent(in) :: a,b - type(psb_dspmat_type), intent(inout) :: c - end subroutine psb_dnumbmm - subroutine psb_dbase_numbmm(a,b,c) - use psb_d_mat_mod, only : psb_d_base_sparse_mat, psb_d_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_d_base_sparse_mat), intent(in) :: a,b - type(psb_d_csr_sparse_mat), intent(inout) :: c - end subroutine psb_dbase_numbmm - end interface psb_numbmm - interface - subroutine psb_dcsrspspmm(a,b,c,info) - use psb_d_mat_mod, only : psb_d_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_d_csr_sparse_mat), intent(in) :: a,b - type(psb_d_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_dcsrspspmm - subroutine psb_dcscspspmm(a,b,c,info) - use psb_d_mat_mod, only : psb_d_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_d_csc_sparse_mat), intent(in) :: a,b - type(psb_d_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_dcscspspmm - end interface -#endif call psb_erractionsave(err_act) info = psb_success_ @@ -177,11 +120,9 @@ end subroutine psb_dspspmm subroutine psb_ldspspmm(a,b,c,info) use psb_mat_mod -#if !defined(PSB_CMP_INTEL) use psb_d_csr_mat_mod use psb_d_csc_mat_mod use psb_d_serial_mod, psb_protect_name => psb_ldspspmm -#endif implicit none type(psb_ldspmat_type), intent(in) :: a,b @@ -192,61 +133,6 @@ subroutine psb_ldspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm -#if defined(PSB_CMP_INTEL) - interface psb_symbmm - subroutine psb_ldsymbmm(a,b,c,info) - use psb_d_mat_mod, only : psb_ldspmat_type - import :: psb_ipk_ - implicit none - type(psb_ldspmat_type), intent(in) :: a,b - type(psb_ldspmat_type), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_ldsymbmm - subroutine psb_ldbase_symbmm(a,b,c,info) - use psb_d_mat_mod, only : psb_ld_base_sparse_mat, psb_ld_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_ld_base_sparse_mat), intent(in) :: a,b - type(psb_ld_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_ldbase_symbmm - end interface psb_symbmm - - interface psb_numbmm - subroutine psb_ldnumbmm(a,b,c) - use psb_d_mat_mod, only : psb_ldspmat_type - import :: psb_ipk_ - implicit none - type(psb_ldspmat_type), intent(in) :: a,b - type(psb_ldspmat_type), intent(inout) :: c - end subroutine psb_ldnumbmm - subroutine psb_ldbase_numbmm(a,b,c) - use psb_d_mat_mod, only : psb_ld_base_sparse_mat, psb_ld_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_ld_base_sparse_mat), intent(in) :: a,b - type(psb_ld_csr_sparse_mat), intent(inout) :: c - end subroutine psb_ldbase_numbmm - end interface psb_numbmm - interface - subroutine psb_ldcsrspspmm(a,b,c,info) - use psb_d_mat_mod, only : psb_ld_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_ld_csr_sparse_mat), intent(in) :: a,b - type(psb_ld_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_ldcsrspspmm - subroutine psb_ldcscspspmm(a,b,c,info) - use psb_d_mat_mod, only : psb_ld_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_ld_csc_sparse_mat), intent(in) :: a,b - type(psb_ld_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_ldcscspspmm - end interface -#endif call psb_erractionsave(err_act) info = psb_success_ diff --git a/base/serial/psb_sspspmm.F90 b/base/serial/psb_sspspmm.F90 index 4af56176..bc3352ee 100644 --- a/base/serial/psb_sspspmm.F90 +++ b/base/serial/psb_sspspmm.F90 @@ -37,11 +37,9 @@ ! subroutine psb_sspspmm(a,b,c,info) use psb_mat_mod -#if !defined(PSB_CMP_INTEL) use psb_s_csr_mat_mod use psb_s_csc_mat_mod use psb_s_serial_mod, psb_protect_name => psb_sspspmm -#endif type(psb_sspmat_type), intent(in) :: a,b type(psb_sspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info @@ -51,61 +49,6 @@ subroutine psb_sspspmm(a,b,c,info) character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm -#if defined(PSB_CMP_INTEL) - interface psb_symbmm - subroutine psb_ssymbmm(a,b,c,info) - use psb_s_mat_mod, only : psb_sspmat_type - import :: psb_ipk_ - implicit none - type(psb_sspmat_type), intent(in) :: a,b - type(psb_sspmat_type), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_ssymbmm - subroutine psb_sbase_symbmm(a,b,c,info) - use psb_s_mat_mod, only : psb_s_base_sparse_mat, psb_s_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_s_base_sparse_mat), intent(in) :: a,b - type(psb_s_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_sbase_symbmm - end interface psb_symbmm - - interface psb_numbmm - subroutine psb_snumbmm(a,b,c) - use psb_s_mat_mod, only : psb_sspmat_type - import :: psb_ipk_ - implicit none - type(psb_sspmat_type), intent(in) :: a,b - type(psb_sspmat_type), intent(inout) :: c - end subroutine psb_snumbmm - subroutine psb_sbase_numbmm(a,b,c) - use psb_s_mat_mod, only : psb_s_base_sparse_mat, psb_s_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_s_base_sparse_mat), intent(in) :: a,b - type(psb_s_csr_sparse_mat), intent(inout) :: c - end subroutine psb_sbase_numbmm - end interface psb_numbmm - interface - subroutine psb_scsrspspmm(a,b,c,info) - use psb_s_mat_mod, only : psb_s_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_s_csr_sparse_mat), intent(in) :: a,b - type(psb_s_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_scsrspspmm - subroutine psb_scscspspmm(a,b,c,info) - use psb_s_mat_mod, only : psb_s_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_s_csc_sparse_mat), intent(in) :: a,b - type(psb_s_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_scscspspmm - end interface -#endif call psb_erractionsave(err_act) info = psb_success_ @@ -177,11 +120,9 @@ end subroutine psb_sspspmm subroutine psb_lsspspmm(a,b,c,info) use psb_mat_mod -#if !defined(PSB_CMP_INTEL) use psb_s_csr_mat_mod use psb_s_csc_mat_mod use psb_s_serial_mod, psb_protect_name => psb_lsspspmm -#endif implicit none type(psb_lsspmat_type), intent(in) :: a,b @@ -192,61 +133,6 @@ subroutine psb_lsspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm -#if defined(PSB_CMP_INTEL) - interface psb_symbmm - subroutine psb_lssymbmm(a,b,c,info) - use psb_s_mat_mod, only : psb_lsspmat_type - import :: psb_ipk_ - implicit none - type(psb_lsspmat_type), intent(in) :: a,b - type(psb_lsspmat_type), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_lssymbmm - subroutine psb_lsbase_symbmm(a,b,c,info) - use psb_s_mat_mod, only : psb_ls_base_sparse_mat, psb_ls_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_ls_base_sparse_mat), intent(in) :: a,b - type(psb_ls_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_lsbase_symbmm - end interface psb_symbmm - - interface psb_numbmm - subroutine psb_lsnumbmm(a,b,c) - use psb_s_mat_mod, only : psb_lsspmat_type - import :: psb_ipk_ - implicit none - type(psb_lsspmat_type), intent(in) :: a,b - type(psb_lsspmat_type), intent(inout) :: c - end subroutine psb_lsnumbmm - subroutine psb_lsbase_numbmm(a,b,c) - use psb_s_mat_mod, only : psb_ls_base_sparse_mat, psb_ls_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_ls_base_sparse_mat), intent(in) :: a,b - type(psb_ls_csr_sparse_mat), intent(inout) :: c - end subroutine psb_lsbase_numbmm - end interface psb_numbmm - interface - subroutine psb_lscsrspspmm(a,b,c,info) - use psb_s_mat_mod, only : psb_ls_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_ls_csr_sparse_mat), intent(in) :: a,b - type(psb_ls_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_lscsrspspmm - subroutine psb_lscscspspmm(a,b,c,info) - use psb_s_mat_mod, only : psb_ls_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_ls_csc_sparse_mat), intent(in) :: a,b - type(psb_ls_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_lscscspspmm - end interface -#endif call psb_erractionsave(err_act) info = psb_success_ diff --git a/base/serial/psb_zspspmm.F90 b/base/serial/psb_zspspmm.F90 index 95d1e112..a37bd013 100644 --- a/base/serial/psb_zspspmm.F90 +++ b/base/serial/psb_zspspmm.F90 @@ -37,11 +37,9 @@ ! subroutine psb_zspspmm(a,b,c,info) use psb_mat_mod -#if !defined(PSB_CMP_INTEL) use psb_z_csr_mat_mod use psb_z_csc_mat_mod use psb_z_serial_mod, psb_protect_name => psb_zspspmm -#endif type(psb_zspmat_type), intent(in) :: a,b type(psb_zspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info @@ -51,61 +49,6 @@ subroutine psb_zspspmm(a,b,c,info) character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm -#if defined(PSB_CMP_INTEL) - interface psb_symbmm - subroutine psb_zsymbmm(a,b,c,info) - use psb_z_mat_mod, only : psb_zspmat_type - import :: psb_ipk_ - implicit none - type(psb_zspmat_type), intent(in) :: a,b - type(psb_zspmat_type), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_zsymbmm - subroutine psb_zbase_symbmm(a,b,c,info) - use psb_z_mat_mod, only : psb_z_base_sparse_mat, psb_z_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_z_base_sparse_mat), intent(in) :: a,b - type(psb_z_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_zbase_symbmm - end interface psb_symbmm - - interface psb_numbmm - subroutine psb_znumbmm(a,b,c) - use psb_z_mat_mod, only : psb_zspmat_type - import :: psb_ipk_ - implicit none - type(psb_zspmat_type), intent(in) :: a,b - type(psb_zspmat_type), intent(inout) :: c - end subroutine psb_znumbmm - subroutine psb_zbase_numbmm(a,b,c) - use psb_z_mat_mod, only : psb_z_base_sparse_mat, psb_z_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_z_base_sparse_mat), intent(in) :: a,b - type(psb_z_csr_sparse_mat), intent(inout) :: c - end subroutine psb_zbase_numbmm - end interface psb_numbmm - interface - subroutine psb_zcsrspspmm(a,b,c,info) - use psb_z_mat_mod, only : psb_z_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_z_csr_sparse_mat), intent(in) :: a,b - type(psb_z_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_zcsrspspmm - subroutine psb_zcscspspmm(a,b,c,info) - use psb_z_mat_mod, only : psb_z_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_z_csc_sparse_mat), intent(in) :: a,b - type(psb_z_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_zcscspspmm - end interface -#endif call psb_erractionsave(err_act) info = psb_success_ @@ -177,11 +120,9 @@ end subroutine psb_zspspmm subroutine psb_lzspspmm(a,b,c,info) use psb_mat_mod -#if !defined(PSB_CMP_INTEL) use psb_z_csr_mat_mod use psb_z_csc_mat_mod use psb_z_serial_mod, psb_protect_name => psb_lzspspmm -#endif implicit none type(psb_lzspmat_type), intent(in) :: a,b @@ -192,61 +133,6 @@ subroutine psb_lzspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm -#if defined(PSB_CMP_INTEL) - interface psb_symbmm - subroutine psb_lzsymbmm(a,b,c,info) - use psb_z_mat_mod, only : psb_lzspmat_type - import :: psb_ipk_ - implicit none - type(psb_lzspmat_type), intent(in) :: a,b - type(psb_lzspmat_type), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_lzsymbmm - subroutine psb_lzbase_symbmm(a,b,c,info) - use psb_z_mat_mod, only : psb_lz_base_sparse_mat, psb_lz_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_lz_base_sparse_mat), intent(in) :: a,b - type(psb_lz_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_lzbase_symbmm - end interface psb_symbmm - - interface psb_numbmm - subroutine psb_lznumbmm(a,b,c) - use psb_z_mat_mod, only : psb_lzspmat_type - import :: psb_ipk_ - implicit none - type(psb_lzspmat_type), intent(in) :: a,b - type(psb_lzspmat_type), intent(inout) :: c - end subroutine psb_lznumbmm - subroutine psb_lzbase_numbmm(a,b,c) - use psb_z_mat_mod, only : psb_lz_base_sparse_mat, psb_lz_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_lz_base_sparse_mat), intent(in) :: a,b - type(psb_lz_csr_sparse_mat), intent(inout) :: c - end subroutine psb_lzbase_numbmm - end interface psb_numbmm - interface - subroutine psb_lzcsrspspmm(a,b,c,info) - use psb_z_mat_mod, only : psb_lz_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_lz_csr_sparse_mat), intent(in) :: a,b - type(psb_lz_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_lzcsrspspmm - subroutine psb_lzcscspspmm(a,b,c,info) - use psb_z_mat_mod, only : psb_lz_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_lz_csc_sparse_mat), intent(in) :: a,b - type(psb_lz_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_lzcscspspmm - end interface -#endif call psb_erractionsave(err_act) info = psb_success_ From 390144126cbbdbe74820f46f4bfe80b923d3177d Mon Sep 17 00:00:00 2001 From: sfilippone Date: Thu, 25 Sep 2025 13:35:30 +0200 Subject: [PATCH 18/37] Fixes for compilation with CUDA 13.0 --- cuda/Makefile | 5 +++-- cuda/cuda_util.c | 18 ++++++++++++++++-- cuda/cuda_util.h | 4 ++++ cuda/psb_cuda_env_mod.F90 | 24 ++++++++++++++++++++++-- cuda/spgpu/Makefile | 4 ++-- test/cudakern/Makefile | 2 +- 6 files changed, 48 insertions(+), 9 deletions(-) diff --git a/cuda/Makefile b/cuda/Makefile index b47e58ce..5e0aaa28 100755 --- a/cuda/Makefile +++ b/cuda/Makefile @@ -51,14 +51,15 @@ lib: objs ilib cudalib spgpulib $(AR) $(LIBNAME) $(OBJS) /bin/cp -p $(LIBNAME) $(LIBDIR) -$(COBJS): spgpuinc objs: spgpuinc $(OBJS) iobjs cudaobjs spgpuobjs /bin/cp -p *$(.mod) $(MODDIR) /bin/cp -p *.h $(INCDIR) +#$(COBJS): spgpuinc + spgpuinc: - $(MAKE) -C spgpu includes + $(MAKE) -C spgpu incl spgpuobjs: $(MAKE) -C spgpu objs spgpulib: diff --git a/cuda/cuda_util.c b/cuda/cuda_util.c index 8ae2e663..f7414695 100644 --- a/cuda/cuda_util.c +++ b/cuda/cuda_util.c @@ -37,6 +37,9 @@ static int hasUVA=-1; static struct cudaDeviceProp *prop=NULL; static spgpuHandle_t psb_cuda_handle = NULL; static cublasHandle_t psb_cublas_handle = NULL; +#if PSB_CUDA_VERSION >= 13000 +static int memoryClockRate=-1; +#endif #if defined(TRACK_CUDA_MALLOC) static int64_t total_cuda_mem = 0; #endif @@ -310,17 +313,28 @@ int getGPUMultiProcessors() int getGPUMemoryBusWidth() { int count=0; -#if CUDART_VERSION >= 5000 +#if PSB_CUDA_VERSION >= 5000 if (prop!=NULL) count = prop->memoryBusWidth; #endif return(count); } + +#if PSB_CUDA_VERSION >= 13000 +int getGPUMemoryClockRate(int dev) +#else int getGPUMemoryClockRate() +#endif { int count=0; -#if CUDART_VERSION >= 5000 +#if PSB_CUDA_VERSION >= 5000 +#if PSB_CUDA_VERSION >= 13000 + cudaDeviceGetAttribute(&memoryClockRate, + cudaDevAttrMemoryClockRate, dev); + count = memoryClockRate; +#else if (prop!=NULL) count = prop->memoryClockRate; +#endif #endif return(count); } diff --git a/cuda/cuda_util.h b/cuda/cuda_util.h index 609e6f43..0c2cce4f 100644 --- a/cuda/cuda_util.h +++ b/cuda/cuda_util.h @@ -59,7 +59,11 @@ int getDeviceHasUVA(); int setDevice(int dev); int getGPUMultiProcessors(); int getGPUMemoryBusWidth(); +#if PSB_CUDA_VERSION >= 13000 +int getGPUMemoryClockRate(int dev); +#else int getGPUMemoryClockRate(); +#endif int getGPUWarpSize(); int getGPUMaxThreadsPerBlock(); int getGPUMaxThreadsPerMP(); diff --git a/cuda/psb_cuda_env_mod.F90 b/cuda/psb_cuda_env_mod.F90 index d1cee398..58250dbc 100644 --- a/cuda/psb_cuda_env_mod.F90 +++ b/cuda/psb_cuda_env_mod.F90 @@ -145,11 +145,20 @@ module psb_cuda_env_mod use iso_c_binding integer(c_int) :: res end function psb_C_get_MemoryBusWidth +#if (PSB_CUDA_VERSION >= 13000) + function psb_C_get_MemoryClockRate(dev) & + & result(res) bind(c,name='getGPUMemoryClockRate') + use iso_c_binding + integer(c_int), value :: dev + integer(c_int) :: res + end function psb_C_get_MemoryClockRate +#else function psb_C_get_MemoryClockRate() & & result(res) bind(c,name='getGPUMemoryClockRate') use iso_c_binding integer(c_int) :: res end function psb_C_get_MemoryClockRate +#endif function psb_C_get_WarpSize() & & result(res) bind(c,name='getGPUWarpSize') use iso_c_binding @@ -174,8 +183,9 @@ module psb_cuda_env_mod end subroutine psb_C_cpy_NameString end interface - logical, private :: gpu_do_maybe_free_buffer = .false. - + logical, private, save :: gpu_do_maybe_free_buffer = .false. + integer(c_int), private, save :: myDevice + Contains function psb_cuda_get_maybe_free_buffer() result(res) @@ -217,6 +227,7 @@ Contains if (present(dev)) then info = psb_C_gpu_init(dev) + myDevice = dev else if (count >0) then dev_ = mod(iam,count) @@ -224,6 +235,7 @@ Contains dev_ = 0 end if info = psb_C_gpu_init(dev_) + myDevice = dev_ end if if (info == 0) info = initFcusparse() if (info /= 0) then @@ -283,7 +295,11 @@ Contains function psb_cuda_MemoryClockRate() result(res) integer(psb_ipk_) :: res +#if (PSB_CUDA_VERSION >= 13000) + res = psb_C_get_MemoryClockRate(myDevice) +#else res = psb_C_get_MemoryClockRate() +#endif end function psb_cuda_MemoryClockRate function psb_cuda_MemoryBusWidth() result(res) @@ -296,7 +312,11 @@ Contains ! Formula here: 2*ClockRate(KHz)*BusWidth(bit) ! normalization: bit/byte, KHz/MHz ! output: MBytes/s +#if PSB_CUDA_VERSION >= 13000 + res = 2.d0*0.125d0*1.d-3*psb_C_get_MemoryBusWidth()*psb_C_get_MemoryClockRate(myDevice) +#else res = 2.d0*0.125d0*1.d-3*psb_C_get_MemoryBusWidth()*psb_C_get_MemoryClockRate() +#endif end function psb_cuda_MemoryPeakBandwidth function psb_cuda_DeviceName() result(res) diff --git a/cuda/spgpu/Makefile b/cuda/spgpu/Makefile index ae0b1be6..75302a50 100644 --- a/cuda/spgpu/Makefile +++ b/cuda/spgpu/Makefile @@ -11,7 +11,7 @@ LIBNAME=libspgpu.a OBJS=coo.o core.o dia.o ell.o hdia.o hell.o CU_INCLUDES=-I$(INCDIR) $(CUDA_INCLUDES) -all: includes objs +all: incl objs objs: $(OBJS) iobjs @@ -24,7 +24,7 @@ iobjs: ilib: $(MAKE) -C kernels lib LIBNAME=$(LIBNAME) -includes: +incl: /bin/cp -p *.h $(INCDIR) clean: iclean diff --git a/test/cudakern/Makefile b/test/cudakern/Makefile index e1c3b78d..a7752f0a 100755 --- a/test/cudakern/Makefile +++ b/test/cudakern/Makefile @@ -27,7 +27,7 @@ dir: (if test ! -d $(EXEDIR); then mkdir $(EXEDIR); fi) dpdegenmv.o spdegenmv.o: data_input.o dpdegenmv: $(DPGOBJS) - $(FLINK) $(LOPT) $(DPGOBJS) -o dpdegenmv $(FINCLUDES) $(PSBLAS_LIB) $(LDLIBS) + $(FLINK) $(LOPT) $(DPGOBJS) -o dpdegenmv $(FINCLUDES) $(PSBLAS_LIB) $(LDLIBS) -lstdc++ /bin/mv dpdegenmv $(EXEDIR) spdegenmv: $(SPGOBJS) $(FLINK) $(LOPT) $(SPGOBJS) -o spdegenmv $(PSBLAS_LIB) $(LDLIBS) From 25d63d156a82f1b27afbdf47ffa4d558641d685f Mon Sep 17 00:00:00 2001 From: sfilippone Date: Thu, 25 Sep 2025 13:38:59 +0200 Subject: [PATCH 19/37] Restore configure --- configure | 6 +++--- configure.ac | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/configure b/configure index 388ffae9..1a23fa64 100755 --- a/configure +++ b/configure @@ -11093,7 +11093,7 @@ LIBS="$SAVE_LIBS" CPPFLAGS="$SAVE_CPPFLAGS" PSB_CUDA_VERSION="$pac_cv_cuda_version"; - if (( ${PSB_CUDA_VERSION} > 12080 )); then + if (( ${PSB_CUDA_VERSION} > 15010 )); then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Unsupported CUDA version ${PSB_CUDA_VERSION} disabling CUDA" >&5 printf "%s\n" "$as_me: Unsupported CUDA version ${PSB_CUDA_VERSION} disabling CUDA" >&6;} pac_cv_cuda="no"; @@ -11151,8 +11151,8 @@ fi CUDEFINES="$CUDEFINES -gencode arch=compute_$cc,code=sm_$cc"; done if test "x$pac_cv_cuda_version" != "xunknown"; then - FCUDEFINES=" ${CUDA_DEFINES}" - fi + FCUDEFINES=" ${CUDA_DEFINES}" + fi fi fi fi diff --git a/configure.ac b/configure.ac index f3c78664..3b6aedbd 100644 --- a/configure.ac +++ b/configure.ac @@ -853,7 +853,7 @@ else PAC_CHECK_CUDA_VERSION() dnl PAC_CHECK_SPGPU() PSB_CUDA_VERSION="$pac_cv_cuda_version"; - if (( ${PSB_CUDA_VERSION} > 12080 )); then + if (( ${PSB_CUDA_VERSION} > 15010 )); then AC_MSG_NOTICE([Unsupported CUDA version ${PSB_CUDA_VERSION} disabling CUDA]) pac_cv_cuda="no"; PSB_HAVE_CUDA="no"; @@ -898,8 +898,8 @@ else done if test "x$pac_cv_cuda_version" != "xunknown"; then dnl CUDEFINES="$CUDEFINES ${CUDA_DEFINES}" - FCUDEFINES=" ${CUDA_DEFINES}" - dnl CCUDEFINES=" ${CUDA_DEFINES}" + FCUDEFINES=" ${CUDA_DEFINES}" + dnl CCUDEFINES=" ${CUDA_DEFINES}" dnl CXXCUDEFINES=" ${CUDA_DEFINES}" fi fi From 6bb7725102ce3c0fc4cc031f8055627572237b06 Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Mon, 29 Sep 2025 16:15:25 +0200 Subject: [PATCH 20/37] Minor change to mat_dist_impl --- util/psb_c_mat_dist_impl.f90 | 10 ++++------ util/psb_d_mat_dist_impl.f90 | 10 ++++------ util/psb_s_mat_dist_impl.f90 | 10 ++++------ util/psb_z_mat_dist_impl.f90 | 10 ++++------ 4 files changed, 16 insertions(+), 24 deletions(-) diff --git a/util/psb_c_mat_dist_impl.f90 b/util/psb_c_mat_dist_impl.f90 index 26d04041..b4b4c13e 100644 --- a/util/psb_c_mat_dist_impl.f90 +++ b/util/psb_c_mat_dist_impl.f90 @@ -238,6 +238,10 @@ subroutine psb_cmatdist(a_glob, a, ctxt, desc_a,& if (j_count > nrow) exit if (j_count > lastigp) exit end do + if (j_count > lastigp) then + iproc = iproc + 1 + lastigp = lastigp + vsz(iproc+1) + end if end if ! now we should insert rows i_count..j_count-1 @@ -313,12 +317,6 @@ subroutine psb_cmatdist(a_glob, a, ctxt, desc_a,& end do endif i_count = j_count - if ((use_vsz).and.(j_count <= nrow)) then - if (j_count > lastigp) then - iproc = iproc + 1 - lastigp = lastigp + vsz(iproc+1) - end if - end if end do call psb_barrier(ctxt) diff --git a/util/psb_d_mat_dist_impl.f90 b/util/psb_d_mat_dist_impl.f90 index 44d853e4..0b0db2cd 100644 --- a/util/psb_d_mat_dist_impl.f90 +++ b/util/psb_d_mat_dist_impl.f90 @@ -238,6 +238,10 @@ subroutine psb_dmatdist(a_glob, a, ctxt, desc_a,& if (j_count > nrow) exit if (j_count > lastigp) exit end do + if (j_count > lastigp) then + iproc = iproc + 1 + lastigp = lastigp + vsz(iproc+1) + end if end if ! now we should insert rows i_count..j_count-1 @@ -313,12 +317,6 @@ subroutine psb_dmatdist(a_glob, a, ctxt, desc_a,& end do endif i_count = j_count - if ((use_vsz).and.(j_count <= nrow)) then - if (j_count > lastigp) then - iproc = iproc + 1 - lastigp = lastigp + vsz(iproc+1) - end if - end if end do call psb_barrier(ctxt) diff --git a/util/psb_s_mat_dist_impl.f90 b/util/psb_s_mat_dist_impl.f90 index 126938bf..941906a8 100644 --- a/util/psb_s_mat_dist_impl.f90 +++ b/util/psb_s_mat_dist_impl.f90 @@ -238,6 +238,10 @@ subroutine psb_smatdist(a_glob, a, ctxt, desc_a,& if (j_count > nrow) exit if (j_count > lastigp) exit end do + if (j_count > lastigp) then + iproc = iproc + 1 + lastigp = lastigp + vsz(iproc+1) + end if end if ! now we should insert rows i_count..j_count-1 @@ -313,12 +317,6 @@ subroutine psb_smatdist(a_glob, a, ctxt, desc_a,& end do endif i_count = j_count - if ((use_vsz).and.(j_count <= nrow)) then - if (j_count > lastigp) then - iproc = iproc + 1 - lastigp = lastigp + vsz(iproc+1) - end if - end if end do call psb_barrier(ctxt) diff --git a/util/psb_z_mat_dist_impl.f90 b/util/psb_z_mat_dist_impl.f90 index 48abe46d..e96f50b3 100644 --- a/util/psb_z_mat_dist_impl.f90 +++ b/util/psb_z_mat_dist_impl.f90 @@ -238,6 +238,10 @@ subroutine psb_zmatdist(a_glob, a, ctxt, desc_a,& if (j_count > nrow) exit if (j_count > lastigp) exit end do + if (j_count > lastigp) then + iproc = iproc + 1 + lastigp = lastigp + vsz(iproc+1) + end if end if ! now we should insert rows i_count..j_count-1 @@ -313,12 +317,6 @@ subroutine psb_zmatdist(a_glob, a, ctxt, desc_a,& end do endif i_count = j_count - if ((use_vsz).and.(j_count <= nrow)) then - if (j_count > lastigp) then - iproc = iproc + 1 - lastigp = lastigp + vsz(iproc+1) - end if - end if end do call psb_barrier(ctxt) From 25f73d15db96490274883410d606362c4104c433 Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Tue, 30 Sep 2025 10:23:40 +0200 Subject: [PATCH 21/37] Fix spspmm allocation to avoid double free error --- base/serial/impl/psb_c_csr_impl.F90 | 4 ++-- base/serial/impl/psb_d_csr_impl.F90 | 4 ++-- base/serial/impl/psb_s_csr_impl.F90 | 4 ++-- base/serial/impl/psb_z_csr_impl.F90 | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/base/serial/impl/psb_c_csr_impl.F90 b/base/serial/impl/psb_c_csr_impl.F90 index 76b96288..af5812da 100644 --- a/base/serial/impl/psb_c_csr_impl.F90 +++ b/base/serial/impl/psb_c_csr_impl.F90 @@ -4277,7 +4277,7 @@ contains nze = min(size(c%val),size(c%ja)) isz = max(ma,na,mb,nb) call psb_realloc(nb,row,info) - if (info == 0) call psb_realloc(na,idxs,info) + if (info == 0) call psb_realloc(max(na,nb),idxs,info) if (info == 0) call psb_realloc(nb,irow,info) if (info /= 0) return row = dzero @@ -6652,7 +6652,7 @@ contains nze = min(size(c%val),size(c%ja)) isz = max(ma,na,mb,nb) call psb_realloc(nb,row,info) - if (info == 0) call psb_realloc(na,idxs,info) + if (info == 0) call psb_realloc(max(na,nb),idxs,info) if (info == 0) call psb_realloc(nb,irow,info) if (info /= 0) return row = dzero diff --git a/base/serial/impl/psb_d_csr_impl.F90 b/base/serial/impl/psb_d_csr_impl.F90 index 17d6bb8e..5ff34a2f 100644 --- a/base/serial/impl/psb_d_csr_impl.F90 +++ b/base/serial/impl/psb_d_csr_impl.F90 @@ -4277,7 +4277,7 @@ contains nze = min(size(c%val),size(c%ja)) isz = max(ma,na,mb,nb) call psb_realloc(nb,row,info) - if (info == 0) call psb_realloc(na,idxs,info) + if (info == 0) call psb_realloc(max(na,nb),idxs,info) if (info == 0) call psb_realloc(nb,irow,info) if (info /= 0) return row = dzero @@ -6652,7 +6652,7 @@ contains nze = min(size(c%val),size(c%ja)) isz = max(ma,na,mb,nb) call psb_realloc(nb,row,info) - if (info == 0) call psb_realloc(na,idxs,info) + if (info == 0) call psb_realloc(max(na,nb),idxs,info) if (info == 0) call psb_realloc(nb,irow,info) if (info /= 0) return row = dzero diff --git a/base/serial/impl/psb_s_csr_impl.F90 b/base/serial/impl/psb_s_csr_impl.F90 index 5522bf85..a7dd2c15 100644 --- a/base/serial/impl/psb_s_csr_impl.F90 +++ b/base/serial/impl/psb_s_csr_impl.F90 @@ -4277,7 +4277,7 @@ contains nze = min(size(c%val),size(c%ja)) isz = max(ma,na,mb,nb) call psb_realloc(nb,row,info) - if (info == 0) call psb_realloc(na,idxs,info) + if (info == 0) call psb_realloc(max(na,nb),idxs,info) if (info == 0) call psb_realloc(nb,irow,info) if (info /= 0) return row = dzero @@ -6652,7 +6652,7 @@ contains nze = min(size(c%val),size(c%ja)) isz = max(ma,na,mb,nb) call psb_realloc(nb,row,info) - if (info == 0) call psb_realloc(na,idxs,info) + if (info == 0) call psb_realloc(max(na,nb),idxs,info) if (info == 0) call psb_realloc(nb,irow,info) if (info /= 0) return row = dzero diff --git a/base/serial/impl/psb_z_csr_impl.F90 b/base/serial/impl/psb_z_csr_impl.F90 index ccd55f0a..9f6c9b94 100644 --- a/base/serial/impl/psb_z_csr_impl.F90 +++ b/base/serial/impl/psb_z_csr_impl.F90 @@ -4277,7 +4277,7 @@ contains nze = min(size(c%val),size(c%ja)) isz = max(ma,na,mb,nb) call psb_realloc(nb,row,info) - if (info == 0) call psb_realloc(na,idxs,info) + if (info == 0) call psb_realloc(max(na,nb),idxs,info) if (info == 0) call psb_realloc(nb,irow,info) if (info /= 0) return row = dzero @@ -6652,7 +6652,7 @@ contains nze = min(size(c%val),size(c%ja)) isz = max(ma,na,mb,nb) call psb_realloc(nb,row,info) - if (info == 0) call psb_realloc(na,idxs,info) + if (info == 0) call psb_realloc(max(na,nb),idxs,info) if (info == 0) call psb_realloc(nb,irow,info) if (info /= 0) return row = dzero From d16b39ed1b1355dd128bf79867a99d339c46fc20 Mon Sep 17 00:00:00 2001 From: Fabio Durastante Date: Tue, 30 Sep 2025 17:18:38 +0200 Subject: [PATCH 22/37] Exposed psb_c_cd_get_global_cols into header file --- cbind/base/psb_c_base.h | 1 + 1 file changed, 1 insertion(+) diff --git a/cbind/base/psb_c_base.h b/cbind/base/psb_c_base.h index 708a0e0f..f28f7bbb 100644 --- a/cbind/base/psb_c_base.h +++ b/cbind/base/psb_c_base.h @@ -85,6 +85,7 @@ extern "C" { psb_i_t psb_c_cd_get_local_rows(psb_c_descriptor *cd); psb_i_t psb_c_cd_get_local_cols(psb_c_descriptor *cd); psb_l_t psb_c_cd_get_global_rows(psb_c_descriptor *cd); + psb_l_t psb_c_cd_get_global_cols(psb_c_descriptor *cd); psb_i_t psb_c_cd_get_global_indices(psb_l_t idx[], psb_i_t nidx, bool owned, psb_c_descriptor *cd); psb_i_t psb_c_g2l(psb_c_descriptor *cdh,psb_l_t gindex,bool cowned); From 2f514d1959c9b5ed953c6fce7c925de5787c1f02 Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Tue, 30 Sep 2025 19:09:03 +0200 Subject: [PATCH 23/37] Update sorting docs --- docs/html/userhtmlse6.html | 120 +- docs/psblas-3.9.pdf | 3482 ++++++++++++++++++------------------ docs/src/toolsrout.tex | 20 +- 3 files changed, 1842 insertions(+), 1780 deletions(-) diff --git a/docs/html/userhtmlse6.html b/docs/html/userhtmlse6.html index 7d23f86f..f5be71d9 100644 --- a/docs/html/userhtmlse6.html +++ b/docs/html/userhtmlse6.html @@ -3872,72 +3872,76 @@ class="cmtt-10">integer(psb_long_int_k_) number. id="x12-1050006.27">Sorting utilities —

psb_msort — Sorting by the Merge-sort algorithm +class="pplb7t-x-x-120">_isort — Sorting by the Insertion-sort algorithm

psb_qsort — Sorting by the Quicksort algorithm +class="pplb7t-x-x-120">_msort — Sorting by the Merge-sort algorithm

psb_qsort — Sorting by the Quicksort algorithm +

psb_hsort — Sorting by the Heapsort algorithm

+call psb_isort(x,ix,dir,flag)
 call psb_msort(x,ix,dir,flag)
 call psb_qsort(x,ix,dir,flag)
 call psb_hsort(x,ix,dir,flag)
 
-

-

These serial routines sort a sequence

+

These serial routines sort a sequence X into ascending or descending order. The -argument meaning is identical for the three calls; the only difference is the algorithm -used to accomplish the task (see Usage Notes below). +argument meaning is identical for all calls; the only difference is the algorithm used +to accomplish the task (see Usage Notes below).

-

+

Type:

-

Asynchronous. +

Asynchronous.

-

+

On Entry

-

+

-

+

x

-

The sequence to be sorted.

The sequence to be sorted.
Type:required.
Specified as: an integer, real or complex array of rank 1.

-

+

ix

-

A vector of indices.

A vector of indices.
Type:optional.
Specified as: an integer array of (at least) the same size as X.

-

+

dir

-

The desired ordering.

The desired ordering.
Type:optional.
Specified as: an integer value:

-

+

Integer and real data:

-

psb_sort_up_, psb_sort_down_, psb_asort_up_, @@ -3948,11 +3952,11 @@ class="cmtt-10">psb_sort_up_.

-

+

Complex data:

-

psb_lsort_up_, psb_lsort_down_, psb_asort_up_, @@ -3960,11 +3964,11 @@ class="cmtt-10">psb_asort_up_, class="cmtt-10">psb_asort_down_; default psb_lsort_up_.

-

+

flag

-

Whether to keep the original values in

Whether to keep the original values in IX.
Type:optional.
psb_sort_keep_idx_; default psb_sort_ovw_idx_.

-

+

-

+

On Return

-

+

-

+

x

-

The sequence of values, in the chosen ordering.

The sequence of values, in the chosen ordering.
Type:required.
Specified as: an integer, real or complex array of rank 1.

-

+

ix

-

A vector of indices.

A vector of indices.
Type: Optional
An integer array of rank 1, whose entries are moved to the same position as the corresponding entries in x.

-

Notes

  1. -

    For integer or real data the sorting can be performed in the up/down +

    For integer or real data the sorting can be performed in the up/down direction, on the natural or absolute values;

  2. -

    For complex data the sorting can be done in a lexicographic order (i.e.: +

    For complex data the sorting can be done in a lexicographic order (i.e.: sort on the real part with ties broken according to the imaginary part) or on the absolute values; @@ -4020,15 +4024,15 @@ class="pplb7t-x-x-120">Notes

  3. -

    The routines return the items in the chosen ordering; the output +

    The routines return the items in the chosen ordering; the output difference is the handling of ties (i.e. items with an equal value) in the - original input. With the merge-sort algorithm ties are preserved in the - same relative order as they had in the original sequence, while this is not - guaranteed for quicksort or heapsort; + original input. With the insertion-sort or merge-sort algorithms ties are + preserved in the same relative order as they had in the original sequence, + while this is not guaranteed for quicksort or heapsort;

  4. -

    If

    If flag = psb_) occupied

  5. -

    If

    If flag = psb_(:) have already been initialized by the user;

  6. -

    The three sorting algorithms have a similar

    Three sorting algorithms have a similar O(n log n) expected running time; +class="zplmr7t-">) expected running time, + whereas insertion sort has an expected running time O(n2); of the other three, in the average case quicksort will be the fastest and merge-sort the slowest. However note that:

    1. -

      The worst case running time +

      The the best case running time for insertion sort is Ω(n) while the + average and worst case are O(n2); however for very short input + sequences this is likely to be the fastest method; +

    2. +
    3. +

      The worst case running time for quicksort is O(); the algorithm implemented here follows the apply;

    4. -

      The worst case running time for merge-sort and heap-sort is + class="enumerate" id="x12-105018x3"> +

      The worst case running time for merge-sort and heap-sort is O(n log n) as the average case; + + +

    5. -

      The merge-sort algorithm is implemented to take advantage of + class="enumerate" id="x12-105020x4"> +

      The merge-sort algorithm is implemented to take advantage of subsequences that may be already in the desired ordering prior to the subroutine call; this situation is relatively common when dealing with groups of indices of sparse matrix entries, thus merge-sort is - - - the preferred choice when a sorting is needed by other routines in the library.

diff --git a/docs/psblas-3.9.pdf b/docs/psblas-3.9.pdf index 6f6505c6..a0d16c37 100644 --- a/docs/psblas-3.9.pdf +++ b/docs/psblas-3.9.pdf @@ -21904,81 +21904,88 @@ endstream endobj 1742 0 obj << -/Length 6065 +/Length 6342 >> stream 0 g 0 G 0 g 0 G BT -/F75 11.9552 Tf 150.705 706.129 Td [(6.27)-1000(Sorting)-250(utilities)-250(\227)]TJ -0.371 -20.164 Td [(psb)]TJ +/F75 11.9552 Tf 150.705 706.129 Td [(6.27)-1000(Sorting)-250(utilities)-250(\227)]TJ -0.371 -19.314 Td [(psb)]TJ +ET +q +1 0 0 1 170.969 687.014 cm +[]0 d 0 J 0.398 w 0 0 m 3.587 0 l S +Q +BT +/F75 11.9552 Tf 174.555 686.815 Td [(isort)-250(\227)-250(Sorting)-250(by)-250(the)-250(Insertion-sort)-250(algorithm)]TJ -24.221 -12.136 Td [(psb)]TJ ET q -1 0 0 1 170.969 686.164 cm +1 0 0 1 170.969 674.878 cm []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 174.555 685.965 Td [(msort)-250(\227)-250(Sorting)-250(by)-250(the)-250(Merge-sort)-250(algorithm)]TJ -24.221 -12.574 Td [(psb)]TJ +/F75 11.9552 Tf 174.555 674.679 Td [(msort)-250(\227)-250(Sorting)-250(by)-250(the)-250(Merge-sort)-250(algorithm)]TJ -24.221 -12.136 Td [(psb)]TJ ET q -1 0 0 1 170.969 673.59 cm +1 0 0 1 170.969 662.742 cm []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 174.555 673.391 Td [(qsort)-250(\227)-250(Sorting)-250(by)-250(the)-250(Quicksort)-250(algorithm)]TJ -24.221 -12.575 Td [(psb)]TJ +/F75 11.9552 Tf 174.555 662.543 Td [(qsort)-250(\227)-250(Sorting)-250(by)-250(the)-250(Quicksort)-250(algorithm)]TJ -24.221 -12.136 Td [(psb)]TJ ET q -1 0 0 1 170.969 661.016 cm +1 0 0 1 170.969 650.607 cm []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 174.555 660.816 Td [(hsort)-250(\227)-250(Sorting)-250(by)-250(the)-250(Heapsort)-250(algorithm)]TJ +/F75 11.9552 Tf 174.555 650.407 Td [(hsort)-250(\227)-250(Sorting)-250(by)-250(the)-250(Heapsort)-250(algorithm)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -23.85 -22.402 Td [(call)-525(psb_msort\050x,ix,dir,flag\051)]TJ 0 -11.955 Td [(call)-525(psb_qsort\050x,ix,dir,flag\051)]TJ 0 -11.955 Td [(call)-525(psb_hsort\050x,ix,dir,flag\051)]TJ/F84 9.9626 Tf 1.001 0 0 1 165.649 592.721 Tm [(These)-249(serial)-248(r)18(outines)-249(sort)-248(a)-249(sequence)]TJ/F78 9.9626 Tf 1 0 0 1 328.652 592.721 Tm [(X)]TJ/F84 9.9626 Tf 1.001 0 0 1 338.668 592.721 Tm [(into)-249(ascending)-248(or)-249(descending)-248(or)18(der)74(.)]TJ 0.998 0 0 1 150.396 580.766 Tm [(The)-251(ar)18(gument)-250(meaning)-251(is)-251(identical)-251(for)-250(the)-251(thr)18(ee)-251(calls;)-250(the)-251(only)-251(dif)18(fer)18(ence)-251(is)-250(the)]TJ 1 0 0 1 150.705 568.811 Tm [(algorithm)-250(used)-250(to)-250(accomplish)-250(the)-250(task)-250(\050see)-250(Usage)-250(Notes)-250(below\051.)]TJ +/F145 9.9626 Tf -23.85 -20.648 Td [(call)-525(psb_isort\050x,ix,dir,flag\051)]TJ 0 -11.955 Td [(call)-525(psb_msort\050x,ix,dir,flag\051)]TJ 0 -11.955 Td [(call)-525(psb_qsort\050x,ix,dir,flag\051)]TJ 0 -11.955 Td [(call)-525(psb_hsort\050x,ix,dir,flag\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 165.649 573.426 Tm [(These)-314(serial)-313(r)17(outines)-313(sort)-314(a)-314(sequence)]TJ/F78 9.9626 Tf 1 0 0 1 335.711 573.426 Tm [(X)]TJ/F84 9.9626 Tf 1.02 0 0 1 346.436 573.426 Tm [(into)-314(ascending)-313(or)-314(descending)-314(or)18(-)]TJ 1.02 0 0 1 150.705 561.471 Tm [(der)73(.)-328(The)-253(ar)18(gument)-253(meaning)-253(is)-253(identical)-253(for)-253(all)-253(calls;)-257(the)-253(only)-253(dif)17(f)1(er)17(ence)-253(is)-253(the)]TJ 1 0 0 1 150.705 549.516 Tm [(algorithm)-250(used)-250(to)-250(accomplish)-250(the)-250(task)-250(\050see)-250(Usage)-250(Notes)-250(below\051.)]TJ 0 g 0 G -/F75 9.9626 Tf 0 -21.783 Td [(T)90(ype:)]TJ +/F75 9.9626 Tf 0 -20.467 Td [(T)90(ype:)]TJ 0 g 0 G /F84 9.9626 Tf 29.439 0 Td [(Asynchr)18(onous.)]TJ 0 g 0 G -/F75 9.9626 Tf -29.439 -22.402 Td [(On)-250(Entry)]TJ +/F75 9.9626 Tf -29.439 -20.648 Td [(On)-250(Entry)]TJ 0 g 0 G 0 g 0 G - 0 -22.402 Td [(x)]TJ + 0 -20.648 Td [(x)]TJ 0 g 0 G /F84 9.9626 Tf 9.654 0 Td [(The)-250(sequence)-250(to)-250(be)-250(sorted.)]TJ 14.944 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.984 -11.956 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)74(,)-250(r)18(eal)-250(or)-250(complex)-250(array)-250(of)-250(rank)-250(1.)]TJ 0 g 0 G -/F75 9.9626 Tf -24.906 -22.402 Td [(ix)]TJ +/F75 9.9626 Tf -24.906 -20.648 Td [(ix)]TJ 0 g 0 G /F84 9.9626 Tf 12.891 0 Td [(A)-250(vector)-250(of)-250(indices.)]TJ 11.707 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -61.878 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(array)-250(of)-250(\050at)-250(least\051)-250(the)-250(same)-250(size)-250(as)]TJ/F78 9.9626 Tf 254.19 0 Td [(X)]TJ/F84 9.9626 Tf 7.536 0 Td [(.)]TJ 0 g 0 G -/F75 9.9626 Tf -286.632 -22.402 Td [(dir)]TJ +/F75 9.9626 Tf -286.632 -20.648 Td [(dir)]TJ 0 g 0 G -/F84 9.9626 Tf 17.952 0 Td [(The)-250(desir)18(ed)-250(or)18(dering.)]TJ 6.646 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -61.878 -11.956 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value:)]TJ +/F84 9.9626 Tf 17.952 0 Td [(The)-250(desir)18(ed)-250(or)18(dering.)]TJ 6.646 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -61.878 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value:)]TJ 0 g 0 G -/F75 9.9626 Tf 0 -22.402 Td [(Integer)-250(and)-250(real)-250(data:)]TJ +/F75 9.9626 Tf 0 -20.648 Td [(Integer)-250(and)-250(real)-250(data:)]TJ 0 g 0 G -/F145 9.9626 Tf 101.28 0 Td [(psb_sort_up_)]TJ/F84 9.9626 Tf 1.02 0 0 1 339.655 363.286 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 345.778 363.286 Tm [(psb_sort_down_)]TJ/F84 9.9626 Tf 1.02 0 0 1 419.003 363.286 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 425.126 363.286 Tm [(psb_asort_up_)]TJ/F84 9.9626 Tf 1.02 0 0 1 493.121 363.286 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 197.529 351.331 Tm [(psb_asort_down_)]TJ/F84 9.9626 Tf 78.455 0 Td [(;)-250(default)]TJ/F145 9.9626 Tf 38.784 0 Td [(psb_sort_up_)]TJ/F84 9.9626 Tf 62.765 0 Td [(.)]TJ +/F145 9.9626 Tf 101.28 0 Td [(psb_sort_up_)]TJ/F84 9.9626 Tf 1.02 0 0 1 339.655 354.078 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 345.778 354.078 Tm [(psb_sort_down_)]TJ/F84 9.9626 Tf 1.02 0 0 1 419.003 354.078 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 425.126 354.078 Tm [(psb_asort_up_)]TJ/F84 9.9626 Tf 1.02 0 0 1 493.121 354.078 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 197.529 342.122 Tm [(psb_asort_down_)]TJ/F84 9.9626 Tf 78.455 0 Td [(;)-250(default)]TJ/F145 9.9626 Tf 38.784 0 Td [(psb_sort_up_)]TJ/F84 9.9626 Tf 62.765 0 Td [(.)]TJ 0 g 0 G -/F75 9.9626 Tf -201.922 -17.178 Td [(Complex)-250(data:)]TJ +/F75 9.9626 Tf -201.922 -16.301 Td [(Complex)-250(data:)]TJ 0 g 0 G -/F145 9.9626 Tf 70.287 0 Td [(psb_lsort_up_)]TJ/F84 9.9626 Tf 0.98 0 0 1 313.892 334.153 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 318.345 334.153 Tm [(psb_lsort_down_)]TJ/F84 9.9626 Tf 0.98 0 0 1 396.8 334.153 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 401.254 334.153 Tm [(psb_asort_up_)]TJ/F84 9.9626 Tf 0.98 0 0 1 469.248 334.153 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 473.701 334.153 Tm [(psb_asort_down_)]TJ/F84 9.9626 Tf 0.98 0 0 1 552.157 334.153 Tm [(;)]TJ 1 0 0 1 197.529 322.197 Tm [(default)]TJ/F145 9.9626 Tf 33.803 0 Td [(psb_lsort_up_)]TJ/F84 9.9626 Tf 67.994 0 Td [(.)]TJ +/F145 9.9626 Tf 70.287 0 Td [(psb_lsort_up_)]TJ/F84 9.9626 Tf 0.98 0 0 1 313.892 325.821 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 318.345 325.821 Tm [(psb_lsort_down_)]TJ/F84 9.9626 Tf 0.98 0 0 1 396.8 325.821 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 401.254 325.821 Tm [(psb_asort_up_)]TJ/F84 9.9626 Tf 0.98 0 0 1 469.248 325.821 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 473.701 325.821 Tm [(psb_asort_down_)]TJ/F84 9.9626 Tf 0.98 0 0 1 552.157 325.821 Tm [(;)]TJ 1 0 0 1 197.529 313.866 Tm [(default)]TJ/F145 9.9626 Tf 33.803 0 Td [(psb_lsort_up_)]TJ/F84 9.9626 Tf 67.994 0 Td [(.)]TJ 0 g 0 G -/F75 9.9626 Tf -148.621 -22.402 Td [(\003ag)]TJ +/F75 9.9626 Tf -148.621 -20.648 Td [(\003ag)]TJ 0 g 0 G -/F84 9.9626 Tf 21.091 0 Td [(Whether)-250(to)-250(keep)-250(the)-250(original)-250(values)-250(in)]TJ/F78 9.9626 Tf 171.519 0 Td [(I)-81(X)]TJ/F84 9.9626 Tf 11.661 0 Td [(.)]TJ -179.673 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ 0.98 0 0 1 175.611 275.885 Tm [(Speci\002ed)-194(as:)-286(an)-193(integer)-194(value)]TJ/F145 9.9626 Tf 1 0 0 1 301.54 275.885 Tm [(psb_sort_ovw_idx_)]TJ/F84 9.9626 Tf 0.98 0 0 1 392.349 275.885 Tm [(or)]TJ/F145 9.9626 Tf 1 0 0 1 403.429 275.885 Tm [(psb_sort_keep_idx_)]TJ/F84 9.9626 Tf 0.98 0 0 1 497.575 275.885 Tm [(;)]TJ 1 0 0 1 175.611 263.93 Tm [(default)]TJ/F145 9.9626 Tf 33.803 0 Td [(psb_sort_ovw_idx_)]TJ/F84 9.9626 Tf 88.916 0 Td [(.)]TJ +/F84 9.9626 Tf 21.091 0 Td [(Whether)-250(to)-250(keep)-250(the)-250(original)-250(values)-250(in)]TJ/F78 9.9626 Tf 171.519 0 Td [(I)-81(X)]TJ/F84 9.9626 Tf 11.661 0 Td [(.)]TJ -179.673 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ 0.98 0 0 1 175.611 269.307 Tm [(Speci\002ed)-194(as:)-286(an)-193(integer)-194(value)]TJ/F145 9.9626 Tf 1 0 0 1 301.54 269.307 Tm [(psb_sort_ovw_idx_)]TJ/F84 9.9626 Tf 0.98 0 0 1 392.349 269.307 Tm [(or)]TJ/F145 9.9626 Tf 1 0 0 1 403.429 269.307 Tm [(psb_sort_keep_idx_)]TJ/F84 9.9626 Tf 0.98 0 0 1 497.575 269.307 Tm [(;)]TJ 1 0 0 1 175.611 257.352 Tm [(default)]TJ/F145 9.9626 Tf 33.803 0 Td [(psb_sort_ovw_idx_)]TJ/F84 9.9626 Tf 88.916 0 Td [(.)]TJ 0 g 0 G -/F75 9.9626 Tf -147.625 -24.395 Td [(On)-250(Return)]TJ +/F75 9.9626 Tf -147.625 -22.64 Td [(On)-250(Return)]TJ 0 g 0 G 0 g 0 G - 0 -22.402 Td [(x)]TJ + 0 -20.648 Td [(x)]TJ 0 g 0 G -/F84 9.9626 Tf 9.654 0 Td [(The)-250(sequence)-250(of)-250(values,)-250(in)-250(the)-250(chosen)-250(or)18(dering.)]TJ 14.944 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.984 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)74(,)-250(r)18(eal)-250(or)-250(complex)-250(array)-250(of)-250(rank)-250(1.)]TJ +/F84 9.9626 Tf 9.654 0 Td [(The)-250(sequence)-250(of)-250(values,)-250(in)-250(the)-250(chosen)-250(or)18(dering.)]TJ 14.944 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.984 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)74(,)-250(r)18(eal)-250(or)-250(complex)-250(array)-250(of)-250(rank)-250(1.)]TJ 0 g 0 G -/F75 9.9626 Tf -24.906 -22.402 Td [(ix)]TJ +/F75 9.9626 Tf -24.906 -20.648 Td [(ix)]TJ 0 g 0 G -/F84 9.9626 Tf 12.891 0 Td [(A)-250(vector)-250(of)-250(indices.)]TJ 11.707 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(Optional)]TJ/F84 9.9626 Tf 0.996 0 0 1 175.223 146.91 Tm [(An)-251(integer)-250(array)-251(of)-251(rank)-250(1,)-251(whose)-251(entries)-250(ar)18(e)-251(moved)-251(to)-250(the)-251(same)-251(position)]TJ 1 0 0 1 175.611 134.955 Tm [(as)-250(the)-250(corr)18(esponding)-250(entries)-250(in)]TJ/F78 9.9626 Tf 138.215 0 Td [(x)]TJ/F84 9.9626 Tf 5.206 0 Td [(.)]TJ +/F84 9.9626 Tf 12.891 0 Td [(A)-250(vector)-250(of)-250(indices.)]TJ 11.707 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(Optional)]TJ/F84 9.9626 Tf 0.996 0 0 1 175.223 145.595 Tm [(An)-251(integer)-250(array)-251(of)-251(rank)-250(1,)-251(whose)-251(entries)-250(ar)18(e)-251(moved)-251(to)-250(the)-251(same)-251(position)]TJ 1 0 0 1 175.611 133.64 Tm [(as)-250(the)-250(corr)18(esponding)-250(entries)-250(in)]TJ/F78 9.9626 Tf 138.215 0 Td [(x)]TJ/F84 9.9626 Tf 5.206 0 Td [(.)]TJ 0 g 0 G - -3.944 -44.517 Td [(110)]TJ + -3.944 -43.202 Td [(110)]TJ 0 g 0 G ET @@ -21986,7 +21993,7 @@ endstream endobj 1746 0 obj << -/Length 8202 +/Length 9569 >> stream 0 g 0 G @@ -22004,9 +22011,9 @@ BT 0 g 0 G -12.453 -19.925 Td [(3.)]TJ 0 g 0 G - 0.98 0 0 1 124.493 610.488 Tm [(The)-240(r)18(outines)-240(r)18(et)1(urn)-241(the)-240(items)-240(in)-240(the)-240(chosen)-240(or)18(dering;)-245(the)-240(output)-240(dif)18(fer)18(ence)]TJ 0.98 0 0 1 124.802 598.532 Tm [(is)-256(the)-256(handling)-256(of)-256(ties)-256(\050i.e.)-318(items)-256(with)-256(an)-256(equal)-256(value\051)-256(in)-256(the)-256(original)-256(input.)]TJ 0.98 0 0 1 124.304 586.577 Tm [(W)56(ith)-225(the)-226(mer)18(ge-so)1(rt)-226(algorithm)-226(t)1(ies)-226(ar)18(e)-225(pr)18(eserved)-225(in)-226(the)-225(same)-226(r)19(elative)-226(or)18(der)]TJ 1.02 0 0 1 124.802 574.622 Tm [(as)-352(they)-351(had)-352(in)-352(the)-351(original)-352(sequence,)-378(while)-352(this)-351(is)-352(not)-352(guaranteed)-351(for)]TJ 1 0 0 1 124.523 562.667 Tm [(quicksort)-250(or)-250(heapsort;)]TJ + 0.98 0 0 1 124.493 610.488 Tm [(The)-240(r)18(outines)-240(r)18(et)1(urn)-241(the)-240(items)-240(in)-240(the)-240(chosen)-240(or)18(dering;)-245(the)-240(output)-240(dif)18(fer)18(ence)]TJ 0.98 0 0 1 124.802 598.532 Tm [(is)-256(the)-256(handling)-256(of)-256(ties)-256(\050i.e.)-318(items)-256(with)-256(an)-256(equal)-256(value\051)-256(in)-256(the)-256(original)-256(input.)]TJ 1 0 0 1 124.304 586.577 Tm [(W)55(ith)-250(the)-250(insertion-sort)-250(or)-250(mer)18(ge-sort)-250(algorithms)-250(ties)-250(ar)18(e)-250(pr)18(eserved)-250(in)-250(the)]TJ 0.997 0 0 1 124.802 574.622 Tm [(same)-250(r)18(elative)-250(or)18(der)-251(as)-250(they)-250(had)-251(i)1(n)-251(the)-250(original)-250(sequence,)-251(while)-250(this)-250(is)-250(not)]TJ 1 0 0 1 124.802 562.667 Tm [(guaranteed)-250(for)-250(quicksort)-250(or)-250(heapsort;)]TJ 0 g 0 G - -12.174 -19.925 Td [(4.)]TJ + -12.453 -19.925 Td [(4.)]TJ 0 g 0 G 0.98 0 0 1 124.802 542.742 Tm [(If)]TJ/F78 9.9626 Tf 1 0 0 1 135.146 542.742 Tm [(f)-160(l)-70(a)-47(g)]TJ/F192 10.3811 Tf 20.72 0 Td [(=)]TJ/F78 9.9626 Tf 11.634 0 Td [(p)-25(s)-25(b)]TJ ET @@ -22072,27 +22079,31 @@ BT 0 g 0 G -34.749 -19.926 Td [(6.)]TJ 0 g 0 G - 1.008 0 0 1 124.493 455.07 Tm [(The)-249(thr)18(ee)-249(sorting)-248(algorithms)-249(have)-249(a)-248(similar)]TJ/F78 9.9626 Tf 1 0 0 1 317.915 455.07 Tm [(O)]TJ/F192 10.3811 Tf 8 0 Td [(\050)]TJ/F78 9.9626 Tf 4.273 0 Td [(n)]TJ/F84 9.9626 Tf 7.325 0 Td [(log)]TJ/F78 9.9626 Tf 15.662 0 Td [(n)]TJ/F192 10.3811 Tf 5.789 0 Td [(\051)]TJ/F84 9.9626 Tf 1.008 0 0 1 365.611 455.07 Tm [(expected)-249(r)8(unning)]TJ 1.008 0 0 1 124.802 443.115 Tm [(time;)-248(in)-248(the)-248(average)-248(case)-248(quicksort)-248(will)-247(be)-248(the)-248(fastest)-248(and)-248(mer)18(ge-sort)-248(the)]TJ 1 0 0 1 124.802 431.16 Tm [(slowest.)-310(However)-250(note)-250(that:)]TJ + 0.98 0 0 1 124.493 455.07 Tm [(Thr)18(ee)-256(sorting)-256(algorithms)-256(have)-256(a)-256(similar)]TJ/F78 9.9626 Tf 1 0 0 1 296.993 455.07 Tm [(O)]TJ/F192 10.3811 Tf 8 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(n)]TJ/F84 9.9626 Tf 7.324 0 Td [(log)]TJ/F78 9.9626 Tf 15.662 0 Td [(n)]TJ/F192 10.3811 Tf 5.789 0 Td [(\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 344.691 455.07 Tm [(expected)-256(r)8(unning)-256(time,)]TJ 1.017 0 0 1 124.384 443.115 Tm [(wher)18(eas)-247(insertion)-246(sort)-247(has)-246(an)-247(expected)-246(r)8(unning)-247(time)]TJ/F78 9.9626 Tf 1 0 0 1 360.734 443.115 Tm [(O)]TJ/F192 10.3811 Tf 8 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(n)]TJ/F84 7.5716 Tf 5.664 3.617 Td [(2)]TJ/F192 10.3811 Tf 4.408 -3.617 Td [(\051)]TJ/F84 9.9626 Tf 1.017 0 0 1 387.23 443.115 Tm [(;)-247(of)-246(the)-247(other)]TJ 0.999 0 0 1 124.802 431.16 Tm [(thr)18(ee,)-250(in)-250(the)-249(average)-250(case)-250(quicksort)-250(will)-249(be)-250(the)-250(fastest)-250(and)-249(mer)18(ge-sort)-250(the)]TJ 1 0 0 1 124.802 419.205 Tm [(slowest.)-310(However)-250(note)-250(that:)]TJ 0 g 0 G 5.32 -19.925 Td [(\050a\051)]TJ 0 g 0 G - 0.98 0 0 1 146.411 411.235 Tm [(The)-241(worst)-240(case)-241(r)8(unning)-241(time)-240(for)-241(quicksort)-241(is)]TJ/F78 9.9626 Tf 1 0 0 1 338.306 411.235 Tm [(O)]TJ/F192 10.3811 Tf 8 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(n)]TJ/F84 7.5716 Tf 5.664 3.616 Td [(2)]TJ/F192 10.3811 Tf 4.408 -3.616 Td [(\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 364.802 411.235 Tm [(;)-245(the)-241(algorithm)-241(im-)]TJ 1.007 0 0 1 146.421 399.28 Tm [(plemented)-246(her)18(e)-246(follows)-246(the)-246(well-known)-246(median-of-thr)18(ee)-246(heuristics,)]TJ 1 0 0 1 146.72 387.324 Tm [(but)-250(the)-250(worst)-250(case)-250(may)-250(still)-250(apply;)]TJ + 1.02 0 0 1 146.411 399.28 Tm [(The)-274(the)-273(best)-274(case)-274(r)8(unning)-274(ti)1(me)-274(for)-274(insertion)-274(so)1(rt)-274(is)]TJ/F243 9.9626 Tf 1 0 0 1 376.039 399.28 Tm [(W)]TJ/F192 10.3811 Tf 8.528 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(n)]TJ/F192 10.3811 Tf 5.789 0 Td [(\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 401.56 399.28 Tm [(while)-274(the)]TJ 1.02 0 0 1 146.72 387.324 Tm [(average)-359(and)-360(worst)-359(case)-359(ar)17(e)]TJ/F78 9.9626 Tf 1 0 0 1 275.57 387.324 Tm [(O)]TJ/F192 10.3811 Tf 7.999 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(n)]TJ/F84 7.5716 Tf 5.664 3.617 Td [(2)]TJ/F192 10.3811 Tf 4.409 -3.617 Td [(\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 302.065 387.324 Tm [(;)-416(however)-360(for)-359(very)-359(short)-360(input)]TJ 1 0 0 1 146.72 375.369 Tm [(sequences)-250(this)-250(is)-250(likely)-250(to)-250(be)-250(the)-250(fastest)-250(method;)]TJ 0 g 0 G -17.126 -15.94 Td [(\050b\051)]TJ 0 g 0 G - 0.98 0 0 1 146.411 371.384 Tm [(The)-194(worst)-194(case)-194(r)9(unning)-194(time)-194(for)-194(mer)18(ge-sort)-193(and)-194(heap-sort)-194(is)]TJ/F78 9.9626 Tf 1 0 0 1 402.204 371.384 Tm [(O)]TJ/F192 10.3811 Tf 8 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(n)]TJ/F84 9.9626 Tf 7.324 0 Td [(log)]TJ/F78 9.9626 Tf 15.663 0 Td [(n)]TJ/F192 10.3811 Tf 5.788 0 Td [(\051)]TJ/F84 9.9626 Tf -296.533 -11.955 Td [(as)-250(the)-250(average)-250(case;)]TJ + 0.98 0 0 1 146.411 359.429 Tm [(The)-241(worst)-240(case)-241(r)8(unning)-241(time)-240(for)-241(quicksort)-241(is)]TJ/F78 9.9626 Tf 1 0 0 1 338.306 359.429 Tm [(O)]TJ/F192 10.3811 Tf 8 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(n)]TJ/F84 7.5716 Tf 5.664 3.616 Td [(2)]TJ/F192 10.3811 Tf 4.408 -3.616 Td [(\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 364.802 359.429 Tm [(;)-245(the)-241(algorithm)-241(im-)]TJ 1.007 0 0 1 146.421 347.474 Tm [(plemented)-246(her)18(e)-246(follows)-246(the)-246(well-known)-246(median-of-thr)18(ee)-246(heuristics,)]TJ 1 0 0 1 146.72 335.519 Tm [(but)-250(the)-250(worst)-250(case)-250(may)-250(still)-250(apply;)]TJ +0 g 0 G + -16.04 -15.941 Td [(\050c\051)]TJ 0 g 0 G - -16.04 -15.94 Td [(\050c\051)]TJ + 0.98 0 0 1 146.411 319.578 Tm [(The)-194(worst)-194(case)-194(r)9(unning)-194(time)-194(for)-194(mer)18(ge-sort)-193(and)-194(heap-sort)-194(is)]TJ/F78 9.9626 Tf 1 0 0 1 402.204 319.578 Tm [(O)]TJ/F192 10.3811 Tf 8 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(n)]TJ/F84 9.9626 Tf 7.324 0 Td [(log)]TJ/F78 9.9626 Tf 15.663 0 Td [(n)]TJ/F192 10.3811 Tf 5.788 0 Td [(\051)]TJ/F84 9.9626 Tf -296.533 -11.955 Td [(as)-250(the)-250(average)-250(case;)]TJ 0 g 0 G - 1.005 0 0 1 146.411 343.489 Tm [(The)-249(mer)18(ge-sort)-249(algorithm)-249(is)-249(implemented)-249(to)-250(take)-249(advantage)-249(of)-249(sub-)]TJ 1.02 0 0 1 146.72 331.534 Tm [(sequences)-260(that)-261(may)-261(be)-260(alr)18(eady)-261(in)-260(the)-261(desir)18(ed)-261(or)18(dering)-261(prior)-260(to)-261(the)]TJ 1.02 0 0 1 146.72 319.578 Tm [(subr)18(outine)-321(call;)-358(this)-321(situation)-320(is)-321(r)18(elatively)-321(common)-320(when)-321(dealing)]TJ 0.98 0 0 1 146.301 307.623 Tm [(with)-239(gr)18(oups)-240(of)-239(indices)-239(of)-240(sparse)-239(matrix)-240(entries,)-242(thus)-240(mer)19(ge-sort)-240(is)-239(the)]TJ 1.02 0 0 1 146.421 295.668 Tm [(pr)18(eferr)17(ed)-268(choice)-268(when)-268(a)-268(sorting)-268(is)-268(needed)-268(by)-269(other)-268(r)18(outines)-268(in)-268(the)]TJ 1 0 0 1 146.72 283.713 Tm [(library)111(.)]TJ + -17.704 -15.94 Td [(\050d\051)]TJ 0 g 0 G - 117.559 -193.275 Td [(111)]TJ + 1.005 0 0 1 146.411 291.683 Tm [(The)-249(mer)18(ge-sort)-249(algorithm)-249(is)-249(implemented)-249(to)-250(take)-249(advantage)-249(of)-249(sub-)]TJ 1.02 0 0 1 146.72 279.728 Tm [(sequences)-260(that)-261(may)-261(be)-260(alr)18(eady)-261(in)-260(the)-261(desir)18(ed)-261(or)18(dering)-261(prior)-260(to)-261(the)]TJ 1.02 0 0 1 146.72 267.773 Tm [(subr)18(outine)-321(call;)-358(this)-321(situation)-320(is)-321(r)18(elatively)-321(common)-320(when)-321(dealing)]TJ 0.98 0 0 1 146.301 255.818 Tm [(with)-239(gr)18(oups)-240(of)-239(indices)-239(of)-240(sparse)-239(matrix)-240(entries,)-242(thus)-240(mer)19(ge-sort)-240(is)-239(the)]TJ 1.02 0 0 1 146.421 243.862 Tm [(pr)18(eferr)17(ed)-268(choice)-268(when)-268(a)-268(sorting)-268(is)-268(needed)-268(by)-269(other)-268(r)18(outines)-268(in)-268(the)]TJ 1 0 0 1 146.72 231.907 Tm [(library)111(.)]TJ +0 g 0 G + 117.559 -141.469 Td [(111)]TJ 0 g 0 G ET endstream endobj -1759 0 obj +1760 0 obj << /Length 172 >> @@ -22108,7 +22119,7 @@ ET endstream endobj -1763 0 obj +1764 0 obj << /Length 6837 >> @@ -22200,7 +22211,7 @@ ET endstream endobj -1769 0 obj +1770 0 obj << /Length 4738 >> @@ -22256,7 +22267,7 @@ ET endstream endobj -1775 0 obj +1776 0 obj << /Length 4507 >> @@ -22309,7 +22320,7 @@ ET endstream endobj -1783 0 obj +1784 0 obj << /Length 2607 >> @@ -22367,7 +22378,7 @@ ET endstream endobj -1787 0 obj +1788 0 obj << /Length 3383 >> @@ -22429,7 +22440,7 @@ ET endstream endobj -1791 0 obj +1792 0 obj << /Length 1171 >> @@ -22466,7 +22477,7 @@ ET endstream endobj -1795 0 obj +1796 0 obj << /Length 1466 >> @@ -22503,7 +22514,7 @@ ET endstream endobj -1799 0 obj +1800 0 obj << /Length 1287 >> @@ -22540,7 +22551,7 @@ ET endstream endobj -1803 0 obj +1804 0 obj << /Length 6065 >> @@ -22600,7 +22611,7 @@ ET endstream endobj -1808 0 obj +1809 0 obj << /Length 5230 >> @@ -22723,7 +22734,7 @@ ET endstream endobj -1816 0 obj +1817 0 obj << /Length 6196 >> @@ -22783,7 +22794,7 @@ ET endstream endobj -1820 0 obj +1821 0 obj << /Length 5025 >> @@ -22911,19 +22922,19 @@ endobj /Type /ObjStm /N 100 /First 971 -/Length 9417 +/Length 9352 >> stream 1717 0 1718 59 1713 118 1722 213 1720 352 1724 497 413 555 1721 612 1726 735 1728 853 1729 912 1730 971 1731 1030 1725 1089 1736 1211 1732 1368 1733 1513 1734 1660 1738 1807 417 1865 1735 1922 1741 2030 1743 2148 421 2207 1740 2265 1745 2373 1747 2491 1748 2549 1749 2607 1750 2665 -1751 2723 1752 2781 1753 2839 1754 2897 1755 2955 1756 3013 1744 3071 1758 3193 1760 3311 425 3370 -1757 3428 1762 3509 1764 3627 429 3685 1765 3742 1766 3800 1761 3858 1768 3994 1770 4112 433 4171 -1771 4229 1772 4287 1767 4344 1774 4480 1776 4598 437 4656 1777 4713 1778 4771 1779 4829 1773 4887 -1782 5023 1784 5141 441 5200 1781 5258 1786 5353 1788 5471 445 5529 1785 5586 1790 5708 1792 5826 -449 5885 1789 5943 1794 6038 1796 6156 453 6214 1793 6271 1798 6366 1800 6484 457 6543 1797 6601 -1802 6696 1804 6814 461 6872 1801 6929 1807 7080 1809 7198 1810 7257 1811 7316 1812 7375 1806 7434 -1815 7572 1817 7690 465 7748 1814 7805 1819 7956 1821 8074 1822 8133 1823 8192 1824 8250 1818 8308 +1751 2723 1752 2781 1753 2839 1754 2897 1755 2955 1756 3013 1757 3071 1744 3129 1759 3266 1761 3384 +425 3443 1758 3501 1763 3582 1765 3700 429 3758 1766 3815 1767 3873 1762 3931 1769 4067 1771 4185 +433 4244 1772 4302 1773 4360 1768 4417 1775 4553 1777 4671 437 4729 1778 4786 1779 4844 1780 4902 +1774 4960 1783 5096 1785 5214 441 5273 1782 5331 1787 5426 1789 5544 445 5602 1786 5659 1791 5781 +1793 5899 449 5958 1790 6016 1795 6111 1797 6229 453 6287 1794 6344 1799 6439 1801 6557 457 6616 +1798 6674 1803 6769 1805 6887 461 6945 1802 7002 1808 7153 1810 7271 1811 7330 1812 7389 1813 7448 +1807 7507 1816 7645 1818 7763 465 7821 1815 7878 1820 8029 1822 8147 1823 8206 1824 8265 1825 8323 % 1717 0 obj << /D [1714 0 R /XYZ 150.705 370.138 null] @@ -23101,342 +23112,341 @@ stream >> % 1754 0 obj << -/D [1745 0 R /XYZ 99.895 425.023 null] +/D [1745 0 R /XYZ 99.895 413.068 null] >> % 1755 0 obj << -/D [1745 0 R /XYZ 99.895 382.522 null] +/D [1745 0 R /XYZ 99.895 370.567 null] >> % 1756 0 obj << -/D [1745 0 R /XYZ 99.895 354.627 null] +/D [1745 0 R /XYZ 99.895 330.717 null] +>> +% 1757 0 obj +<< +/D [1745 0 R /XYZ 99.895 302.821 null] >> % 1744 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F192 942 0 R /F190 941 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F192 942 0 R /F190 941 0 R /F243 1285 0 R >> /ProcSet [ /PDF /Text ] >> -% 1758 0 obj +% 1759 0 obj << /Type /Page -/Contents 1759 0 R -/Resources 1757 0 R +/Contents 1760 0 R +/Resources 1758 0 R /MediaBox [0 0 595.276 841.89] /Parent 1739 0 R >> -% 1760 0 obj +% 1761 0 obj << -/D [1758 0 R /XYZ 149.705 753.953 null] +/D [1759 0 R /XYZ 149.705 753.953 null] >> % 425 0 obj << -/D [1758 0 R /XYZ 150.705 716.092 null] +/D [1759 0 R /XYZ 150.705 716.092 null] >> -% 1757 0 obj +% 1758 0 obj << /Font << /F75 685 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1762 0 obj +% 1763 0 obj << /Type /Page -/Contents 1763 0 R -/Resources 1761 0 R +/Contents 1764 0 R +/Resources 1762 0 R /MediaBox [0 0 595.276 841.89] /Parent 1739 0 R >> -% 1764 0 obj +% 1765 0 obj << -/D [1762 0 R /XYZ 98.895 753.953 null] +/D [1763 0 R /XYZ 98.895 753.953 null] >> % 429 0 obj << -/D [1762 0 R /XYZ 99.895 716.092 null] +/D [1763 0 R /XYZ 99.895 716.092 null] >> -% 1765 0 obj +% 1766 0 obj << -/D [1762 0 R /XYZ 99.895 170.282 null] +/D [1763 0 R /XYZ 99.895 170.282 null] >> -% 1766 0 obj +% 1767 0 obj << -/D [1762 0 R /XYZ 99.895 149.368 null] +/D [1763 0 R /XYZ 99.895 149.368 null] >> -% 1761 0 obj +% 1762 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F192 942 0 R /F78 686 0 R /F190 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1768 0 obj +% 1769 0 obj << /Type /Page -/Contents 1769 0 R -/Resources 1767 0 R +/Contents 1770 0 R +/Resources 1768 0 R /MediaBox [0 0 595.276 841.89] /Parent 1739 0 R >> -% 1770 0 obj +% 1771 0 obj << -/D [1768 0 R /XYZ 149.705 753.953 null] +/D [1769 0 R /XYZ 149.705 753.953 null] >> % 433 0 obj << -/D [1768 0 R /XYZ 150.705 716.092 null] +/D [1769 0 R /XYZ 150.705 716.092 null] >> -% 1771 0 obj +% 1772 0 obj << -/D [1768 0 R /XYZ 150.705 348.22 null] +/D [1769 0 R /XYZ 150.705 348.22 null] >> -% 1772 0 obj +% 1773 0 obj << -/D [1768 0 R /XYZ 150.705 313.8 null] +/D [1769 0 R /XYZ 150.705 313.8 null] >> -% 1767 0 obj +% 1768 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F190 941 0 R /F78 686 0 R /F192 942 0 R >> /ProcSet [ /PDF /Text ] >> -% 1774 0 obj +% 1775 0 obj << /Type /Page -/Contents 1775 0 R -/Resources 1773 0 R +/Contents 1776 0 R +/Resources 1774 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1780 0 R +/Parent 1781 0 R >> -% 1776 0 obj +% 1777 0 obj << -/D [1774 0 R /XYZ 98.895 753.953 null] +/D [1775 0 R /XYZ 98.895 753.953 null] >> % 437 0 obj << -/D [1774 0 R /XYZ 99.895 716.092 null] ->> -% 1777 0 obj -<< -/D [1774 0 R /XYZ 99.895 441.869 null] +/D [1775 0 R /XYZ 99.895 716.092 null] >> % 1778 0 obj << -/D [1774 0 R /XYZ 99.895 395.439 null] +/D [1775 0 R /XYZ 99.895 441.869 null] >> % 1779 0 obj << -/D [1774 0 R /XYZ 99.895 363.559 null] +/D [1775 0 R /XYZ 99.895 395.439 null] >> -% 1773 0 obj +% 1780 0 obj +<< +/D [1775 0 R /XYZ 99.895 363.559 null] +>> +% 1774 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R /F192 942 0 R /F190 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1782 0 obj +% 1783 0 obj << /Type /Page -/Contents 1783 0 R -/Resources 1781 0 R +/Contents 1784 0 R +/Resources 1782 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1780 0 R +/Parent 1781 0 R >> -% 1784 0 obj +% 1785 0 obj << -/D [1782 0 R /XYZ 149.705 753.953 null] +/D [1783 0 R /XYZ 149.705 753.953 null] >> % 441 0 obj << -/D [1782 0 R /XYZ 150.705 716.092 null] +/D [1783 0 R /XYZ 150.705 716.092 null] >> -% 1781 0 obj +% 1782 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1786 0 obj +% 1787 0 obj << /Type /Page -/Contents 1787 0 R -/Resources 1785 0 R +/Contents 1788 0 R +/Resources 1786 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1780 0 R +/Parent 1781 0 R >> -% 1788 0 obj +% 1789 0 obj << -/D [1786 0 R /XYZ 98.895 753.953 null] +/D [1787 0 R /XYZ 98.895 753.953 null] >> % 445 0 obj << -/D [1786 0 R /XYZ 99.895 716.092 null] +/D [1787 0 R /XYZ 99.895 716.092 null] >> -% 1785 0 obj +% 1786 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R /F190 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1790 0 obj +% 1791 0 obj << /Type /Page -/Contents 1791 0 R -/Resources 1789 0 R +/Contents 1792 0 R +/Resources 1790 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1780 0 R +/Parent 1781 0 R >> -% 1792 0 obj +% 1793 0 obj << -/D [1790 0 R /XYZ 149.705 753.953 null] +/D [1791 0 R /XYZ 149.705 753.953 null] >> % 449 0 obj << -/D [1790 0 R /XYZ 150.705 716.092 null] +/D [1791 0 R /XYZ 150.705 716.092 null] >> -% 1789 0 obj +% 1790 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1794 0 obj +% 1795 0 obj << /Type /Page -/Contents 1795 0 R -/Resources 1793 0 R +/Contents 1796 0 R +/Resources 1794 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1780 0 R +/Parent 1781 0 R >> -% 1796 0 obj +% 1797 0 obj << -/D [1794 0 R /XYZ 98.895 753.953 null] +/D [1795 0 R /XYZ 98.895 753.953 null] >> % 453 0 obj << -/D [1794 0 R /XYZ 99.895 716.092 null] +/D [1795 0 R /XYZ 99.895 716.092 null] >> -% 1793 0 obj +% 1794 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1798 0 obj +% 1799 0 obj << /Type /Page -/Contents 1799 0 R -/Resources 1797 0 R +/Contents 1800 0 R +/Resources 1798 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1780 0 R +/Parent 1781 0 R >> -% 1800 0 obj +% 1801 0 obj << -/D [1798 0 R /XYZ 149.705 753.953 null] +/D [1799 0 R /XYZ 149.705 753.953 null] >> % 457 0 obj << -/D [1798 0 R /XYZ 150.705 716.092 null] +/D [1799 0 R /XYZ 150.705 716.092 null] >> -% 1797 0 obj +% 1798 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1802 0 obj +% 1803 0 obj << /Type /Page -/Contents 1803 0 R -/Resources 1801 0 R +/Contents 1804 0 R +/Resources 1802 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1805 0 R +/Parent 1806 0 R >> -% 1804 0 obj +% 1805 0 obj << -/D [1802 0 R /XYZ 98.895 753.953 null] +/D [1803 0 R /XYZ 98.895 753.953 null] >> % 461 0 obj << -/D [1802 0 R /XYZ 99.895 716.092 null] +/D [1803 0 R /XYZ 99.895 716.092 null] >> -% 1801 0 obj +% 1802 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F148 1490 0 R /F192 942 0 R /F78 686 0 R /F190 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1807 0 obj +% 1808 0 obj << /Type /Page -/Contents 1808 0 R -/Resources 1806 0 R +/Contents 1809 0 R +/Resources 1807 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1805 0 R ->> -% 1809 0 obj -<< -/D [1807 0 R /XYZ 149.705 753.953 null] +/Parent 1806 0 R >> % 1810 0 obj << -/D [1807 0 R /XYZ 150.705 576.399 null] +/D [1808 0 R /XYZ 149.705 753.953 null] >> % 1811 0 obj << -/D [1807 0 R /XYZ 150.705 541.925 null] +/D [1808 0 R /XYZ 150.705 576.399 null] >> % 1812 0 obj << -/D [1807 0 R /XYZ 150.705 451.085 null] +/D [1808 0 R /XYZ 150.705 541.925 null] >> -% 1806 0 obj +% 1813 0 obj +<< +/D [1808 0 R /XYZ 150.705 451.085 null] +>> +% 1807 0 obj << -/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R /F78 686 0 R /F279 1813 0 R >> +/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R /F78 686 0 R /F279 1814 0 R >> /ProcSet [ /PDF /Text ] >> -% 1815 0 obj +% 1816 0 obj << /Type /Page -/Contents 1816 0 R -/Resources 1814 0 R +/Contents 1817 0 R +/Resources 1815 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1805 0 R +/Parent 1806 0 R >> -% 1817 0 obj +% 1818 0 obj << -/D [1815 0 R /XYZ 98.895 753.953 null] +/D [1816 0 R /XYZ 98.895 753.953 null] >> % 465 0 obj << -/D [1815 0 R /XYZ 99.895 716.092 null] +/D [1816 0 R /XYZ 99.895 716.092 null] >> -% 1814 0 obj +% 1815 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F190 941 0 R /F148 1490 0 R /F192 942 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1819 0 obj +% 1820 0 obj << /Type /Page -/Contents 1820 0 R -/Resources 1818 0 R +/Contents 1821 0 R +/Resources 1819 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1805 0 R ->> -% 1821 0 obj -<< -/D [1819 0 R /XYZ 149.705 753.953 null] +/Parent 1806 0 R >> % 1822 0 obj << -/D [1819 0 R /XYZ 150.705 588.355 null] +/D [1820 0 R /XYZ 149.705 753.953 null] >> % 1823 0 obj << -/D [1819 0 R /XYZ 150.705 553.88 null] +/D [1820 0 R /XYZ 150.705 588.355 null] >> % 1824 0 obj << -/D [1819 0 R /XYZ 150.705 463.04 null] +/D [1820 0 R /XYZ 150.705 553.88 null] >> -% 1818 0 obj +% 1825 0 obj << -/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R /F78 686 0 R /F279 1813 0 R >> -/ProcSet [ /PDF /Text ] +/D [1820 0 R /XYZ 150.705 463.04 null] >> endstream endobj -1827 0 obj +1829 0 obj << /Length 6060 >> @@ -23496,7 +23506,7 @@ ET endstream endobj -1832 0 obj +1833 0 obj << /Length 5209 >> @@ -23619,7 +23629,7 @@ ET endstream endobj -1839 0 obj +1840 0 obj << /Length 6144 >> @@ -23679,7 +23689,7 @@ ET endstream endobj -1844 0 obj +1845 0 obj << /Length 5122 >> @@ -23802,7 +23812,7 @@ ET endstream endobj -1851 0 obj +1852 0 obj << /Length 6205 >> @@ -23862,7 +23872,7 @@ ET endstream endobj -1855 0 obj +1856 0 obj << /Length 5076 >> @@ -23983,7 +23993,7 @@ ET endstream endobj -1862 0 obj +1863 0 obj << /Length 6206 >> @@ -24043,7 +24053,7 @@ ET endstream endobj -1866 0 obj +1867 0 obj << /Length 5140 >> @@ -24166,7 +24176,7 @@ ET endstream endobj -1873 0 obj +1874 0 obj << /Length 6113 >> @@ -24226,7 +24236,7 @@ ET endstream endobj -1878 0 obj +1879 0 obj << /Length 6575 >> @@ -24362,7 +24372,7 @@ ET endstream endobj -1888 0 obj +1889 0 obj << /Length 5618 >> @@ -24419,7 +24429,7 @@ ET endstream endobj -1893 0 obj +1894 0 obj << /Length 5630 >> @@ -24475,7 +24485,7 @@ ET endstream endobj -1900 0 obj +1901 0 obj << /Length 6870 >> @@ -24499,7 +24509,7 @@ ET endstream endobj -1906 0 obj +1907 0 obj << /Length 10395 >> @@ -24950,7 +24960,7 @@ ET endstream endobj -1910 0 obj +1911 0 obj << /Length 3566 >> @@ -25061,7 +25071,7 @@ ET endstream endobj -1917 0 obj +1918 0 obj << /Length 1379 >> @@ -25104,7 +25114,7 @@ ET endstream endobj -1923 0 obj +1924 0 obj << /Length 1583 >> @@ -25161,7 +25171,7 @@ ET endstream endobj -1929 0 obj +1930 0 obj << /Length 2082 >> @@ -25232,7 +25242,7 @@ ET endstream endobj -1935 0 obj +1936 0 obj << /Length 535 >> @@ -25248,342 +25258,347 @@ ET endstream endobj -1829 0 obj +1826 0 obj << /Type /ObjStm /N 100 -/First 973 -/Length 9417 ->> -stream -1826 0 1828 118 469 176 1825 233 1831 384 1833 502 1834 561 1835 620 1836 679 1830 738 -1838 876 1840 994 473 1052 1837 1109 1843 1260 1845 1378 1846 1437 1847 1496 1848 1555 1842 1614 -1850 1752 1852 1870 477 1928 1849 1985 1854 2136 1856 2254 1857 2313 1858 2372 1859 2430 1853 2488 -1861 2626 1863 2744 481 2802 1860 2859 1865 3010 1867 3128 1868 3187 1869 3246 1870 3305 1864 3364 -1872 3502 1874 3620 485 3678 1871 3735 1877 3886 1879 4004 1880 4063 1881 4122 1883 4180 1884 4239 -1885 4298 1876 4357 1887 4538 1889 4656 489 4714 1890 4771 1886 4829 1892 4980 1894 5098 493 5157 -1895 5215 1891 5274 1899 5425 1896 5573 1897 5721 1901 5869 497 5927 1898 5984 1905 6079 1907 6197 -1902 6256 1903 6315 1904 6374 1909 6471 1911 6589 501 6647 1912 6704 1913 6762 1908 6820 1916 6901 -1918 7019 505 7078 1919 7136 1920 7194 1915 7253 1922 7334 1924 7452 509 7510 1925 7567 1926 7625 -1921 7683 1928 7764 1930 7882 513 7941 1931 7999 1932 8057 1927 8116 1934 8211 1936 8329 517 8387 -% 1826 0 obj +/First 975 +/Length 9500 +>> +stream +1819 0 1828 138 1830 256 469 314 1827 371 1832 522 1834 640 1835 699 1836 758 1837 817 +1831 876 1839 1014 1841 1132 473 1190 1838 1247 1844 1398 1846 1516 1847 1575 1848 1634 1849 1693 +1843 1752 1851 1890 1853 2008 477 2066 1850 2123 1855 2274 1857 2392 1858 2451 1859 2510 1860 2568 +1854 2626 1862 2764 1864 2882 481 2940 1861 2997 1866 3148 1868 3266 1869 3325 1870 3384 1871 3443 +1865 3502 1873 3640 1875 3758 485 3816 1872 3873 1878 4024 1880 4142 1881 4201 1882 4260 1884 4318 +1885 4377 1886 4436 1877 4495 1888 4676 1890 4794 489 4852 1891 4909 1887 4967 1893 5118 1895 5236 +493 5295 1896 5353 1892 5412 1900 5563 1897 5711 1898 5859 1902 6007 497 6065 1899 6122 1906 6217 +1908 6335 1903 6394 1904 6453 1905 6512 1910 6609 1912 6727 501 6785 1913 6842 1914 6900 1909 6958 +1917 7039 1919 7157 505 7216 1920 7274 1921 7332 1916 7391 1923 7472 1925 7590 509 7648 1926 7705 +1927 7763 1922 7821 1929 7902 1931 8020 513 8079 1932 8137 1933 8195 1928 8254 1935 8349 1937 8467 +% 1819 0 obj +<< +/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R /F78 686 0 R /F279 1814 0 R >> +/ProcSet [ /PDF /Text ] +>> +% 1828 0 obj << /Type /Page -/Contents 1827 0 R -/Resources 1825 0 R +/Contents 1829 0 R +/Resources 1827 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1805 0 R +/Parent 1806 0 R >> -% 1828 0 obj +% 1830 0 obj << -/D [1826 0 R /XYZ 98.895 753.953 null] +/D [1828 0 R /XYZ 98.895 753.953 null] >> % 469 0 obj << -/D [1826 0 R /XYZ 99.895 716.092 null] +/D [1828 0 R /XYZ 99.895 716.092 null] >> -% 1825 0 obj +% 1827 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F190 941 0 R /F148 1490 0 R /F192 942 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1831 0 obj +% 1832 0 obj << /Type /Page -/Contents 1832 0 R -/Resources 1830 0 R +/Contents 1833 0 R +/Resources 1831 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1805 0 R ->> -% 1833 0 obj -<< -/D [1831 0 R /XYZ 149.705 753.953 null] +/Parent 1806 0 R >> % 1834 0 obj << -/D [1831 0 R /XYZ 150.705 576.399 null] +/D [1832 0 R /XYZ 149.705 753.953 null] >> % 1835 0 obj << -/D [1831 0 R /XYZ 150.705 541.925 null] +/D [1832 0 R /XYZ 150.705 576.399 null] >> % 1836 0 obj << -/D [1831 0 R /XYZ 150.705 451.085 null] +/D [1832 0 R /XYZ 150.705 541.925 null] >> -% 1830 0 obj +% 1837 0 obj +<< +/D [1832 0 R /XYZ 150.705 451.085 null] +>> +% 1831 0 obj << -/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R /F78 686 0 R /F279 1813 0 R >> +/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R /F78 686 0 R /F279 1814 0 R >> /ProcSet [ /PDF /Text ] >> -% 1838 0 obj +% 1839 0 obj << /Type /Page -/Contents 1839 0 R -/Resources 1837 0 R +/Contents 1840 0 R +/Resources 1838 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1841 0 R +/Parent 1842 0 R >> -% 1840 0 obj +% 1841 0 obj << -/D [1838 0 R /XYZ 98.895 753.953 null] +/D [1839 0 R /XYZ 98.895 753.953 null] >> % 473 0 obj << -/D [1838 0 R /XYZ 99.895 716.092 null] +/D [1839 0 R /XYZ 99.895 716.092 null] >> -% 1837 0 obj +% 1838 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F190 941 0 R /F148 1490 0 R /F192 942 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1843 0 obj +% 1844 0 obj << /Type /Page -/Contents 1844 0 R -/Resources 1842 0 R +/Contents 1845 0 R +/Resources 1843 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1841 0 R ->> -% 1845 0 obj -<< -/D [1843 0 R /XYZ 149.705 753.953 null] +/Parent 1842 0 R >> % 1846 0 obj << -/D [1843 0 R /XYZ 150.705 576.399 null] +/D [1844 0 R /XYZ 149.705 753.953 null] >> % 1847 0 obj << -/D [1843 0 R /XYZ 150.705 541.925 null] +/D [1844 0 R /XYZ 150.705 576.399 null] >> % 1848 0 obj << -/D [1843 0 R /XYZ 150.705 451.085 null] +/D [1844 0 R /XYZ 150.705 541.925 null] >> -% 1842 0 obj +% 1849 0 obj +<< +/D [1844 0 R /XYZ 150.705 451.085 null] +>> +% 1843 0 obj << -/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R /F78 686 0 R /F279 1813 0 R >> +/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R /F78 686 0 R /F279 1814 0 R >> /ProcSet [ /PDF /Text ] >> -% 1850 0 obj +% 1851 0 obj << /Type /Page -/Contents 1851 0 R -/Resources 1849 0 R +/Contents 1852 0 R +/Resources 1850 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1841 0 R +/Parent 1842 0 R >> -% 1852 0 obj +% 1853 0 obj << -/D [1850 0 R /XYZ 98.895 753.953 null] +/D [1851 0 R /XYZ 98.895 753.953 null] >> % 477 0 obj << -/D [1850 0 R /XYZ 99.895 716.092 null] +/D [1851 0 R /XYZ 99.895 716.092 null] >> -% 1849 0 obj +% 1850 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F190 941 0 R /F148 1490 0 R /F192 942 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1854 0 obj +% 1855 0 obj << /Type /Page -/Contents 1855 0 R -/Resources 1853 0 R +/Contents 1856 0 R +/Resources 1854 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1841 0 R ->> -% 1856 0 obj -<< -/D [1854 0 R /XYZ 149.705 753.953 null] +/Parent 1842 0 R >> % 1857 0 obj << -/D [1854 0 R /XYZ 150.705 588.355 null] +/D [1855 0 R /XYZ 149.705 753.953 null] >> % 1858 0 obj << -/D [1854 0 R /XYZ 150.705 553.88 null] +/D [1855 0 R /XYZ 150.705 588.355 null] >> % 1859 0 obj << -/D [1854 0 R /XYZ 150.705 463.04 null] +/D [1855 0 R /XYZ 150.705 553.88 null] >> -% 1853 0 obj +% 1860 0 obj +<< +/D [1855 0 R /XYZ 150.705 463.04 null] +>> +% 1854 0 obj << -/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R /F78 686 0 R /F279 1813 0 R >> +/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R /F78 686 0 R /F279 1814 0 R >> /ProcSet [ /PDF /Text ] >> -% 1861 0 obj +% 1862 0 obj << /Type /Page -/Contents 1862 0 R -/Resources 1860 0 R +/Contents 1863 0 R +/Resources 1861 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1841 0 R +/Parent 1842 0 R >> -% 1863 0 obj +% 1864 0 obj << -/D [1861 0 R /XYZ 98.895 753.953 null] +/D [1862 0 R /XYZ 98.895 753.953 null] >> % 481 0 obj << -/D [1861 0 R /XYZ 99.895 716.092 null] +/D [1862 0 R /XYZ 99.895 716.092 null] >> -% 1860 0 obj +% 1861 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F190 941 0 R /F148 1490 0 R /F192 942 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1865 0 obj +% 1866 0 obj << /Type /Page -/Contents 1866 0 R -/Resources 1864 0 R +/Contents 1867 0 R +/Resources 1865 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1841 0 R ->> -% 1867 0 obj -<< -/D [1865 0 R /XYZ 149.705 753.953 null] +/Parent 1842 0 R >> % 1868 0 obj << -/D [1865 0 R /XYZ 150.705 576.399 null] +/D [1866 0 R /XYZ 149.705 753.953 null] >> % 1869 0 obj << -/D [1865 0 R /XYZ 150.705 541.925 null] +/D [1866 0 R /XYZ 150.705 576.399 null] >> % 1870 0 obj << -/D [1865 0 R /XYZ 150.705 451.085 null] +/D [1866 0 R /XYZ 150.705 541.925 null] >> -% 1864 0 obj +% 1871 0 obj +<< +/D [1866 0 R /XYZ 150.705 451.085 null] +>> +% 1865 0 obj << -/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R /F78 686 0 R /F279 1813 0 R >> +/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R /F78 686 0 R /F279 1814 0 R >> /ProcSet [ /PDF /Text ] >> -% 1872 0 obj +% 1873 0 obj << /Type /Page -/Contents 1873 0 R -/Resources 1871 0 R +/Contents 1874 0 R +/Resources 1872 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1875 0 R +/Parent 1876 0 R >> -% 1874 0 obj +% 1875 0 obj << -/D [1872 0 R /XYZ 98.895 753.953 null] +/D [1873 0 R /XYZ 98.895 753.953 null] >> % 485 0 obj << -/D [1872 0 R /XYZ 99.895 716.092 null] +/D [1873 0 R /XYZ 99.895 716.092 null] >> -% 1871 0 obj +% 1872 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F190 941 0 R /F148 1490 0 R /F192 942 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1877 0 obj +% 1878 0 obj << /Type /Page -/Contents 1878 0 R -/Resources 1876 0 R +/Contents 1879 0 R +/Resources 1877 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1875 0 R ->> -% 1879 0 obj -<< -/D [1877 0 R /XYZ 149.705 753.953 null] +/Parent 1876 0 R >> % 1880 0 obj << -/D [1877 0 R /XYZ 150.705 588.355 null] +/D [1878 0 R /XYZ 149.705 753.953 null] >> % 1881 0 obj << -/D [1877 0 R /XYZ 150.705 553.88 null] +/D [1878 0 R /XYZ 150.705 588.355 null] >> -% 1883 0 obj +% 1882 0 obj << -/D [1877 0 R /XYZ 150.705 465.726 null] +/D [1878 0 R /XYZ 150.705 553.88 null] >> % 1884 0 obj << -/D [1877 0 R /XYZ 150.705 433.845 null] +/D [1878 0 R /XYZ 150.705 465.726 null] >> % 1885 0 obj << -/D [1877 0 R /XYZ 150.705 343.006 null] +/D [1878 0 R /XYZ 150.705 433.845 null] >> -% 1876 0 obj +% 1886 0 obj +<< +/D [1878 0 R /XYZ 150.705 343.006 null] +>> +% 1877 0 obj << -/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F78 686 0 R /F192 942 0 R /F17 1882 0 R /F243 1285 0 R /F233 1044 0 R /F279 1813 0 R >> +/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F78 686 0 R /F192 942 0 R /F17 1883 0 R /F243 1285 0 R /F233 1044 0 R /F279 1814 0 R >> /ProcSet [ /PDF /Text ] >> -% 1887 0 obj +% 1888 0 obj << /Type /Page -/Contents 1888 0 R -/Resources 1886 0 R +/Contents 1889 0 R +/Resources 1887 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1875 0 R +/Parent 1876 0 R >> -% 1889 0 obj +% 1890 0 obj << -/D [1887 0 R /XYZ 98.895 753.953 null] +/D [1888 0 R /XYZ 98.895 753.953 null] >> % 489 0 obj << -/D [1887 0 R /XYZ 99.895 716.092 null] +/D [1888 0 R /XYZ 99.895 716.092 null] >> -% 1890 0 obj +% 1891 0 obj << -/D [1887 0 R /XYZ 99.895 222.691 null] +/D [1888 0 R /XYZ 99.895 222.691 null] >> -% 1886 0 obj +% 1887 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R /F148 1490 0 R /F192 942 0 R /F190 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1892 0 obj +% 1893 0 obj << /Type /Page -/Contents 1893 0 R -/Resources 1891 0 R +/Contents 1894 0 R +/Resources 1892 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1875 0 R +/Parent 1876 0 R >> -% 1894 0 obj +% 1895 0 obj << -/D [1892 0 R /XYZ 149.705 753.953 null] +/D [1893 0 R /XYZ 149.705 753.953 null] >> % 493 0 obj << -/D [1892 0 R /XYZ 150.705 716.092 null] +/D [1893 0 R /XYZ 150.705 716.092 null] >> -% 1895 0 obj +% 1896 0 obj << -/D [1892 0 R /XYZ 150.705 222.691 null] +/D [1893 0 R /XYZ 150.705 222.691 null] >> -% 1891 0 obj +% 1892 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F148 1490 0 R /F192 942 0 R /F78 686 0 R /F190 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1899 0 obj +% 1900 0 obj << /Type /Page -/Contents 1900 0 R -/Resources 1898 0 R +/Contents 1901 0 R +/Resources 1899 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1875 0 R -/Annots [ 1896 0 R 1897 0 R ] +/Parent 1876 0 R +/Annots [ 1897 0 R 1898 0 R ] >> -% 1896 0 obj +% 1897 0 obj << /Type /Annot /Subtype /Link @@ -25591,7 +25606,7 @@ stream /Rect [145.364 511.904 152.427 523.964] /A << /S /GoTo /D (listing.5) >> >> -% 1897 0 obj +% 1898 0 obj << /Type /Annot /Subtype /Link @@ -25599,180 +25614,176 @@ stream /Rect [143.975 356.487 150.849 368.547] /A << /S /GoTo /D (listing.6) >> >> -% 1901 0 obj +% 1902 0 obj << -/D [1899 0 R /XYZ 98.895 753.953 null] +/D [1900 0 R /XYZ 98.895 753.953 null] >> % 497 0 obj << -/D [1899 0 R /XYZ 99.895 716.092 null] +/D [1900 0 R /XYZ 99.895 716.092 null] >> -% 1898 0 obj +% 1899 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> /ProcSet [ /PDF /Text ] >> -% 1905 0 obj +% 1906 0 obj << /Type /Page -/Contents 1906 0 R -/Resources 1904 0 R +/Contents 1907 0 R +/Resources 1905 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1875 0 R ->> -% 1907 0 obj -<< -/D [1905 0 R /XYZ 149.705 753.953 null] +/Parent 1876 0 R >> -% 1902 0 obj +% 1908 0 obj << -/D [1905 0 R /XYZ 150.705 411.235 null] +/D [1906 0 R /XYZ 149.705 753.953 null] >> % 1903 0 obj << -/D [1905 0 R /XYZ 150.705 182.902 null] +/D [1906 0 R /XYZ 150.705 411.235 null] >> % 1904 0 obj << -/Font << /F145 940 0 R /F279 1813 0 R /F84 687 0 R >> +/D [1906 0 R /XYZ 150.705 182.902 null] +>> +% 1905 0 obj +<< +/Font << /F145 940 0 R /F279 1814 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1909 0 obj +% 1910 0 obj << /Type /Page -/Contents 1910 0 R -/Resources 1908 0 R +/Contents 1911 0 R +/Resources 1909 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1914 0 R +/Parent 1915 0 R >> -% 1911 0 obj +% 1912 0 obj << -/D [1909 0 R /XYZ 98.895 753.953 null] +/D [1910 0 R /XYZ 98.895 753.953 null] >> % 501 0 obj << -/D [1909 0 R /XYZ 99.895 716.092 null] +/D [1910 0 R /XYZ 99.895 716.092 null] >> -% 1912 0 obj +% 1913 0 obj << -/D [1909 0 R /XYZ 99.895 690.058 null] +/D [1910 0 R /XYZ 99.895 690.058 null] >> -% 1913 0 obj +% 1914 0 obj << -/D [1909 0 R /XYZ 99.895 693.143 null] +/D [1910 0 R /XYZ 99.895 693.143 null] >> -% 1908 0 obj +% 1909 0 obj << /Font << /F75 685 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1916 0 obj +% 1917 0 obj << /Type /Page -/Contents 1917 0 R -/Resources 1915 0 R +/Contents 1918 0 R +/Resources 1916 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1914 0 R +/Parent 1915 0 R >> -% 1918 0 obj +% 1919 0 obj << -/D [1916 0 R /XYZ 149.705 753.953 null] +/D [1917 0 R /XYZ 149.705 753.953 null] >> % 505 0 obj << -/D [1916 0 R /XYZ 150.705 716.092 null] +/D [1917 0 R /XYZ 150.705 716.092 null] >> -% 1919 0 obj +% 1920 0 obj << -/D [1916 0 R /XYZ 150.705 678.98 null] +/D [1917 0 R /XYZ 150.705 678.98 null] >> -% 1920 0 obj +% 1921 0 obj << -/D [1916 0 R /XYZ 150.705 679.195 null] +/D [1917 0 R /XYZ 150.705 679.195 null] >> -% 1915 0 obj +% 1916 0 obj << /Font << /F75 685 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1922 0 obj +% 1923 0 obj << /Type /Page -/Contents 1923 0 R -/Resources 1921 0 R +/Contents 1924 0 R +/Resources 1922 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1914 0 R +/Parent 1915 0 R >> -% 1924 0 obj +% 1925 0 obj << -/D [1922 0 R /XYZ 98.895 753.953 null] +/D [1923 0 R /XYZ 98.895 753.953 null] >> % 509 0 obj << -/D [1922 0 R /XYZ 99.895 716.092 null] +/D [1923 0 R /XYZ 99.895 716.092 null] >> -% 1925 0 obj +% 1926 0 obj << -/D [1922 0 R /XYZ 99.895 689.963 null] +/D [1923 0 R /XYZ 99.895 689.963 null] >> -% 1926 0 obj +% 1927 0 obj << -/D [1922 0 R /XYZ 99.895 693.143 null] +/D [1923 0 R /XYZ 99.895 693.143 null] >> -% 1921 0 obj +% 1922 0 obj << /Font << /F75 685 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1928 0 obj +% 1929 0 obj << /Type /Page -/Contents 1929 0 R -/Resources 1927 0 R +/Contents 1930 0 R +/Resources 1928 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1914 0 R +/Parent 1915 0 R >> -% 1930 0 obj +% 1931 0 obj << -/D [1928 0 R /XYZ 149.705 753.953 null] +/D [1929 0 R /XYZ 149.705 753.953 null] >> % 513 0 obj << -/D [1928 0 R /XYZ 150.705 716.092 null] +/D [1929 0 R /XYZ 150.705 716.092 null] >> -% 1931 0 obj +% 1932 0 obj << -/D [1928 0 R /XYZ 150.705 678.98 null] +/D [1929 0 R /XYZ 150.705 678.98 null] >> -% 1932 0 obj +% 1933 0 obj << -/D [1928 0 R /XYZ 150.705 679.195 null] +/D [1929 0 R /XYZ 150.705 679.195 null] >> -% 1927 0 obj +% 1928 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> /ProcSet [ /PDF /Text ] >> -% 1934 0 obj +% 1935 0 obj << /Type /Page -/Contents 1935 0 R -/Resources 1933 0 R +/Contents 1936 0 R +/Resources 1934 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1914 0 R ->> -% 1936 0 obj -<< -/D [1934 0 R /XYZ 98.895 753.953 null] +/Parent 1915 0 R >> -% 517 0 obj +% 1937 0 obj << -/D [1934 0 R /XYZ 99.895 716.092 null] +/D [1935 0 R /XYZ 98.895 753.953 null] >> endstream endobj -1941 0 obj +1942 0 obj << /Length 4752 >> @@ -25856,7 +25867,7 @@ ET endstream endobj -1948 0 obj +1949 0 obj << /Length 5153 >> @@ -25944,7 +25955,7 @@ ET endstream endobj -1956 0 obj +1957 0 obj << /Length 3684 >> @@ -26034,7 +26045,7 @@ ET endstream endobj -1963 0 obj +1964 0 obj << /Length 4361 >> @@ -26131,7 +26142,7 @@ ET endstream endobj -1970 0 obj +1971 0 obj << /Length 7544 >> @@ -26318,7 +26329,7 @@ ET endstream endobj -1977 0 obj +1978 0 obj << /Length 7395 >> @@ -26495,7 +26506,7 @@ ET endstream endobj -1983 0 obj +1984 0 obj << /Length 656 >> @@ -26533,7 +26544,7 @@ ET endstream endobj -1987 0 obj +1988 0 obj << /Length 1399 >> @@ -26561,7 +26572,7 @@ ET endstream endobj -1995 0 obj +1996 0 obj << /Length 5053 >> @@ -26653,7 +26664,7 @@ ET endstream endobj -2006 0 obj +2007 0 obj << /Length 4359 >> @@ -26752,7 +26763,7 @@ ET endstream endobj -2010 0 obj +2011 0 obj << /Length 13651 >> @@ -27293,7 +27304,7 @@ ET endstream endobj -2019 0 obj +2020 0 obj << /Length 7660 >> @@ -27511,7 +27522,7 @@ ET endstream endobj -2023 0 obj +2024 0 obj << /Length 1133 >> @@ -27530,7 +27541,7 @@ ET endstream endobj -2032 0 obj +2033 0 obj << /Length 6132 >> @@ -27684,7 +27695,7 @@ ET endstream endobj -2038 0 obj +2039 0 obj << /Length 3490 >> @@ -27747,7 +27758,7 @@ ET endstream endobj -2042 0 obj +2043 0 obj << /Length 973 >> @@ -27788,39 +27799,43 @@ ET endstream endobj -1937 0 obj +1938 0 obj << /Type /ObjStm /N 100 -/First 973 -/Length 10967 ->> -stream -1933 0 1940 95 1938 234 1942 379 521 438 1943 496 1944 555 1939 614 1947 709 1945 848 -1949 993 525 1051 1950 1108 1951 1166 1946 1224 1955 1319 1953 1458 1957 1603 529 1662 1958 1720 -1959 1778 1954 1837 1962 1932 1960 2071 1964 2215 533 2273 1965 2330 1966 2387 1961 2445 1969 2540 -1967 2679 1971 2824 537 2883 1972 2941 1973 3000 1968 3059 1976 3182 1974 3321 1978 3463 541 3521 -1979 3578 1980 3636 1975 3694 1982 3817 1984 3935 1981 3994 1986 4077 1988 4195 545 4253 1985 4310 -1994 4405 1990 4562 1991 4709 1992 4857 1996 5004 549 5063 1997 5121 1993 5179 2005 5287 1999 5453 -2000 5600 2001 5747 2002 5895 2007 6042 553 6100 2004 6157 2009 6265 2003 6404 2011 6567 1998 6626 -2008 6686 2018 6796 2013 6962 2014 7107 2015 7254 2016 7401 2020 7548 557 7606 2017 7663 2022 7758 -2024 7876 2021 7935 2031 8030 2025 8205 2026 8350 2027 8493 2028 8640 2029 8784 2033 8933 561 8991 -2030 9048 2037 9143 2035 9282 2039 9427 565 9486 2036 9544 2041 9666 2043 9784 569 9842 2040 9899 -% 1933 0 obj +/First 972 +/Length 10928 +>> +stream +517 0 1934 57 1941 152 1939 291 1943 436 521 495 1944 553 1945 612 1940 671 1948 766 +1946 905 1950 1050 525 1108 1951 1165 1952 1223 1947 1281 1956 1376 1954 1515 1958 1660 529 1719 +1959 1777 1960 1835 1955 1894 1963 1989 1961 2128 1965 2272 533 2330 1966 2387 1967 2444 1962 2502 +1970 2597 1968 2736 1972 2881 537 2940 1973 2998 1974 3057 1969 3116 1977 3239 1975 3378 1979 3520 +541 3578 1980 3635 1981 3693 1976 3751 1983 3874 1985 3992 1982 4051 1987 4134 1989 4252 545 4310 +1986 4367 1995 4462 1991 4619 1992 4766 1993 4914 1997 5061 549 5120 1998 5178 1994 5236 2006 5344 +2000 5510 2001 5657 2002 5804 2003 5952 2008 6099 553 6157 2005 6214 2010 6322 2004 6461 2012 6624 +1999 6683 2009 6743 2019 6853 2014 7019 2015 7164 2016 7311 2017 7458 2021 7605 557 7663 2018 7720 +2023 7815 2025 7933 2022 7992 2032 8087 2026 8262 2027 8407 2028 8550 2029 8697 2030 8841 2034 8990 +561 9048 2031 9105 2038 9200 2036 9339 2040 9484 565 9543 2037 9601 2042 9723 2044 9841 569 9899 +% 517 0 obj +<< +/D [1935 0 R /XYZ 99.895 716.092 null] +>> +% 1934 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> /ProcSet [ /PDF /Text ] >> -% 1940 0 obj +% 1941 0 obj << /Type /Page -/Contents 1941 0 R -/Resources 1939 0 R +/Contents 1942 0 R +/Resources 1940 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1914 0 R -/Annots [ 1938 0 R ] +/Parent 1915 0 R +/Annots [ 1939 0 R ] >> -% 1938 0 obj +% 1939 0 obj << /Type /Annot /Subtype /Link @@ -27828,37 +27843,37 @@ stream /Rect [342.753 438.278 420.271 450.338] /A << /S /GoTo /D (spdata) >> >> -% 1942 0 obj +% 1943 0 obj << -/D [1940 0 R /XYZ 149.705 753.953 null] +/D [1941 0 R /XYZ 149.705 753.953 null] >> % 521 0 obj << -/D [1940 0 R /XYZ 150.705 716.092 null] +/D [1941 0 R /XYZ 150.705 716.092 null] >> -% 1943 0 obj +% 1944 0 obj << -/D [1940 0 R /XYZ 150.705 676.015 null] +/D [1941 0 R /XYZ 150.705 676.015 null] >> -% 1944 0 obj +% 1945 0 obj << -/D [1940 0 R /XYZ 150.705 679.195 null] +/D [1941 0 R /XYZ 150.705 679.195 null] >> -% 1939 0 obj +% 1940 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> /ProcSet [ /PDF /Text ] >> -% 1947 0 obj +% 1948 0 obj << /Type /Page -/Contents 1948 0 R -/Resources 1946 0 R +/Contents 1949 0 R +/Resources 1947 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1952 0 R -/Annots [ 1945 0 R ] +/Parent 1953 0 R +/Annots [ 1946 0 R ] >> -% 1945 0 obj +% 1946 0 obj << /Type /Annot /Subtype /Link @@ -27866,37 +27881,37 @@ stream /Rect [291.943 571.778 369.462 583.837] /A << /S /GoTo /D (spdata) >> >> -% 1949 0 obj +% 1950 0 obj << -/D [1947 0 R /XYZ 98.895 753.953 null] +/D [1948 0 R /XYZ 98.895 753.953 null] >> % 525 0 obj << -/D [1947 0 R /XYZ 99.895 716.092 null] +/D [1948 0 R /XYZ 99.895 716.092 null] >> -% 1950 0 obj +% 1951 0 obj << -/D [1947 0 R /XYZ 99.895 676.015 null] +/D [1948 0 R /XYZ 99.895 676.015 null] >> -% 1951 0 obj +% 1952 0 obj << -/D [1947 0 R /XYZ 99.895 679.195 null] +/D [1948 0 R /XYZ 99.895 679.195 null] >> -% 1946 0 obj +% 1947 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> /ProcSet [ /PDF /Text ] >> -% 1955 0 obj +% 1956 0 obj << /Type /Page -/Contents 1956 0 R -/Resources 1954 0 R +/Contents 1957 0 R +/Resources 1955 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1952 0 R -/Annots [ 1953 0 R ] +/Parent 1953 0 R +/Annots [ 1954 0 R ] >> -% 1953 0 obj +% 1954 0 obj << /Type /Annot /Subtype /Link @@ -27904,37 +27919,37 @@ stream /Rect [342.753 438.278 420.271 450.338] /A << /S /GoTo /D (spdata) >> >> -% 1957 0 obj +% 1958 0 obj << -/D [1955 0 R /XYZ 149.705 753.953 null] +/D [1956 0 R /XYZ 149.705 753.953 null] >> % 529 0 obj << -/D [1955 0 R /XYZ 150.705 716.092 null] +/D [1956 0 R /XYZ 150.705 716.092 null] >> -% 1958 0 obj +% 1959 0 obj << -/D [1955 0 R /XYZ 150.705 678.98 null] +/D [1956 0 R /XYZ 150.705 678.98 null] >> -% 1959 0 obj +% 1960 0 obj << -/D [1955 0 R /XYZ 150.705 679.195 null] +/D [1956 0 R /XYZ 150.705 679.195 null] >> -% 1954 0 obj +% 1955 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> /ProcSet [ /PDF /Text ] >> -% 1962 0 obj +% 1963 0 obj << /Type /Page -/Contents 1963 0 R -/Resources 1961 0 R +/Contents 1964 0 R +/Resources 1962 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1952 0 R -/Annots [ 1960 0 R ] +/Parent 1953 0 R +/Annots [ 1961 0 R ] >> -% 1960 0 obj +% 1961 0 obj << /Type /Annot /Subtype /Link @@ -27942,37 +27957,37 @@ stream /Rect [301.961 426.323 378.015 438.383] /A << /S /GoTo /D (vdata) >> >> -% 1964 0 obj +% 1965 0 obj << -/D [1962 0 R /XYZ 98.895 753.953 null] +/D [1963 0 R /XYZ 98.895 753.953 null] >> % 533 0 obj << -/D [1962 0 R /XYZ 99.895 716.092 null] +/D [1963 0 R /XYZ 99.895 716.092 null] >> -% 1965 0 obj +% 1966 0 obj << -/D [1962 0 R /XYZ 99.895 678.98 null] +/D [1963 0 R /XYZ 99.895 678.98 null] >> -% 1966 0 obj +% 1967 0 obj << -/D [1962 0 R /XYZ 99.895 679.195 null] +/D [1963 0 R /XYZ 99.895 679.195 null] >> -% 1961 0 obj +% 1962 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> /ProcSet [ /PDF /Text ] >> -% 1969 0 obj +% 1970 0 obj << /Type /Page -/Contents 1970 0 R -/Resources 1968 0 R +/Contents 1971 0 R +/Resources 1969 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1952 0 R -/Annots [ 1967 0 R ] +/Parent 1953 0 R +/Annots [ 1968 0 R ] >> -% 1967 0 obj +% 1968 0 obj << /Type /Annot /Subtype /Link @@ -27980,37 +27995,37 @@ stream /Rect [342.753 574.778 420.271 586.838] /A << /S /GoTo /D (spdata) >> >> -% 1971 0 obj +% 1972 0 obj << -/D [1969 0 R /XYZ 149.705 753.953 null] +/D [1970 0 R /XYZ 149.705 753.953 null] >> % 537 0 obj << -/D [1969 0 R /XYZ 150.705 716.092 null] +/D [1970 0 R /XYZ 150.705 716.092 null] >> -% 1972 0 obj +% 1973 0 obj << -/D [1969 0 R /XYZ 150.705 679.441 null] +/D [1970 0 R /XYZ 150.705 679.441 null] >> -% 1973 0 obj +% 1974 0 obj << -/D [1969 0 R /XYZ 150.705 679.657 null] +/D [1970 0 R /XYZ 150.705 679.657 null] >> -% 1968 0 obj +% 1969 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R /F78 686 0 R /F233 1044 0 R >> /ProcSet [ /PDF /Text ] >> -% 1976 0 obj +% 1977 0 obj << /Type /Page -/Contents 1977 0 R -/Resources 1975 0 R +/Contents 1978 0 R +/Resources 1976 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1952 0 R -/Annots [ 1974 0 R ] +/Parent 1953 0 R +/Annots [ 1975 0 R ] >> -% 1974 0 obj +% 1975 0 obj << /Type /Annot /Subtype /Link @@ -28018,75 +28033,75 @@ stream /Rect [396.215 574.59 472.269 586.65] /A << /S /GoTo /D (vdata) >> >> -% 1978 0 obj +% 1979 0 obj << -/D [1976 0 R /XYZ 98.895 753.953 null] +/D [1977 0 R /XYZ 98.895 753.953 null] >> % 541 0 obj << -/D [1976 0 R /XYZ 99.895 716.092 null] +/D [1977 0 R /XYZ 99.895 716.092 null] >> -% 1979 0 obj +% 1980 0 obj << -/D [1976 0 R /XYZ 99.895 679.413 null] +/D [1977 0 R /XYZ 99.895 679.413 null] >> -% 1980 0 obj +% 1981 0 obj << -/D [1976 0 R /XYZ 99.895 679.628 null] +/D [1977 0 R /XYZ 99.895 679.628 null] >> -% 1975 0 obj +% 1976 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R /F78 686 0 R /F233 1044 0 R >> /ProcSet [ /PDF /Text ] >> -% 1982 0 obj +% 1983 0 obj << /Type /Page -/Contents 1983 0 R -/Resources 1981 0 R +/Contents 1984 0 R +/Resources 1982 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1952 0 R +/Parent 1953 0 R >> -% 1984 0 obj +% 1985 0 obj << -/D [1982 0 R /XYZ 149.705 753.953 null] +/D [1983 0 R /XYZ 149.705 753.953 null] >> -% 1981 0 obj +% 1982 0 obj << /Font << /F233 1044 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1986 0 obj +% 1987 0 obj << /Type /Page -/Contents 1987 0 R -/Resources 1985 0 R +/Contents 1988 0 R +/Resources 1986 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1989 0 R +/Parent 1990 0 R >> -% 1988 0 obj +% 1989 0 obj << -/D [1986 0 R /XYZ 98.895 753.953 null] +/D [1987 0 R /XYZ 98.895 753.953 null] >> % 545 0 obj << -/D [1986 0 R /XYZ 99.895 716.092 null] +/D [1987 0 R /XYZ 99.895 716.092 null] >> -% 1985 0 obj +% 1986 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> /ProcSet [ /PDF /Text ] >> -% 1994 0 obj +% 1995 0 obj << /Type /Page -/Contents 1995 0 R -/Resources 1993 0 R +/Contents 1996 0 R +/Resources 1994 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1989 0 R -/Annots [ 1990 0 R 1991 0 R 1992 0 R ] +/Parent 1990 0 R +/Annots [ 1991 0 R 1992 0 R 1993 0 R ] >> -% 1990 0 obj +% 1991 0 obj << /Type /Annot /Subtype /Link @@ -28094,7 +28109,7 @@ stream /Rect [371.126 442.264 443.414 454.323] /A << /S /GoTo /D (precdata) >> >> -% 1991 0 obj +% 1992 0 obj << /Type /Annot /Subtype /Link @@ -28102,7 +28117,7 @@ stream /Rect [222.066 352.6 228.343 366.303] /A << /S /GoTo /D (Hfootnote.4) >> >> -% 1992 0 obj +% 1993 0 obj << /Type /Annot /Subtype /Link @@ -28110,33 +28125,33 @@ stream /Rect [221.319 235.698 233.275 245.108] /A << /S /GoTo /D (table.21) >> >> -% 1996 0 obj +% 1997 0 obj << -/D [1994 0 R /XYZ 149.705 753.953 null] +/D [1995 0 R /XYZ 149.705 753.953 null] >> % 549 0 obj << -/D [1994 0 R /XYZ 150.705 716.092 null] +/D [1995 0 R /XYZ 150.705 716.092 null] >> -% 1997 0 obj +% 1998 0 obj << -/D [1994 0 R /XYZ 165.051 129.79 null] +/D [1995 0 R /XYZ 165.051 129.79 null] >> -% 1993 0 obj +% 1994 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 2005 0 obj +% 2006 0 obj << /Type /Page -/Contents 2006 0 R -/Resources 2004 0 R +/Contents 2007 0 R +/Resources 2005 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1989 0 R -/Annots [ 1999 0 R 2000 0 R 2001 0 R 2002 0 R ] +/Parent 1990 0 R +/Annots [ 2000 0 R 2001 0 R 2002 0 R 2003 0 R ] >> -% 1999 0 obj +% 2000 0 obj << /Type /Annot /Subtype /Link @@ -28144,7 +28159,7 @@ stream /Rect [283.359 567.422 295.314 580.259] /A << /S /GoTo /D (table.21) >> >> -% 2000 0 obj +% 2001 0 obj << /Type /Annot /Subtype /Link @@ -28152,7 +28167,7 @@ stream /Rect [366.137 520.379 378.292 532.438] /A << /S /GoTo /D (table.21) >> >> -% 2001 0 obj +% 2002 0 obj << /Type /Annot /Subtype /Link @@ -28160,7 +28175,7 @@ stream /Rect [379.319 483.736 386.292 496.573] /A << /S /GoTo /D (section.8) >> >> -% 2002 0 obj +% 2003 0 obj << /Type /Annot /Subtype /Link @@ -28168,29 +28183,29 @@ stream /Rect [136.757 451.412 148.712 460.822] /A << /S /GoTo /D (table.21) >> >> -% 2007 0 obj +% 2008 0 obj << -/D [2005 0 R /XYZ 98.895 753.953 null] +/D [2006 0 R /XYZ 98.895 753.953 null] >> % 553 0 obj << -/D [2005 0 R /XYZ 99.895 716.092 null] +/D [2006 0 R /XYZ 99.895 716.092 null] >> -% 2004 0 obj +% 2005 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 2009 0 obj +% 2010 0 obj << /Type /Page -/Contents 2010 0 R -/Resources 2008 0 R +/Contents 2011 0 R +/Resources 2009 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1989 0 R -/Annots [ 2003 0 R ] +/Parent 1990 0 R +/Annots [ 2004 0 R ] >> -% 2003 0 obj +% 2004 0 obj << /Type /Annot /Subtype /Link @@ -28198,29 +28213,29 @@ stream /Rect [404.253 212.933 412.423 220.405] /A << /S /GoTo /D (cite.BERTACCINIFILIPPONE) >> >> -% 2011 0 obj +% 2012 0 obj << -/D [2009 0 R /XYZ 149.705 753.953 null] +/D [2010 0 R /XYZ 149.705 753.953 null] >> -% 1998 0 obj +% 1999 0 obj << -/D [2009 0 R /XYZ -3900.052 719.08 null] +/D [2010 0 R /XYZ -3900.052 719.08 null] >> -% 2008 0 obj +% 2009 0 obj << /Font << /F233 1044 0 R /F84 687 0 R /F78 686 0 R /F190 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 2018 0 obj +% 2019 0 obj << /Type /Page -/Contents 2019 0 R -/Resources 2017 0 R +/Contents 2020 0 R +/Resources 2018 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1989 0 R -/Annots [ 2013 0 R 2014 0 R 2015 0 R 2016 0 R ] +/Parent 1990 0 R +/Annots [ 2014 0 R 2015 0 R 2016 0 R 2017 0 R ] >> -% 2013 0 obj +% 2014 0 obj << /Type /Annot /Subtype /Link @@ -28228,7 +28243,7 @@ stream /Rect [314.678 576.377 392.197 588.437] /A << /S /GoTo /D (spdata) >> >> -% 2014 0 obj +% 2015 0 obj << /Type /Annot /Subtype /Link @@ -28236,7 +28251,7 @@ stream /Rect [395.856 505.741 468.144 517.801] /A << /S /GoTo /D (precdata) >> >> -% 2015 0 obj +% 2016 0 obj << /Type /Annot /Subtype /Link @@ -28244,7 +28259,7 @@ stream /Rect [371.454 435.105 438.512 447.165] /A << /S /GoTo /D (descdata) >> >> -% 2016 0 obj +% 2017 0 obj << /Type /Annot /Subtype /Link @@ -28252,46 +28267,46 @@ stream /Rect [317.418 128.475 389.706 140.535] /A << /S /GoTo /D (precdata) >> >> -% 2020 0 obj +% 2021 0 obj << -/D [2018 0 R /XYZ 98.895 753.953 null] +/D [2019 0 R /XYZ 98.895 753.953 null] >> % 557 0 obj << -/D [2018 0 R /XYZ 99.895 716.092 null] +/D [2019 0 R /XYZ 99.895 716.092 null] >> -% 2017 0 obj +% 2018 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 2022 0 obj +% 2023 0 obj << /Type /Page -/Contents 2023 0 R -/Resources 2021 0 R +/Contents 2024 0 R +/Resources 2022 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1989 0 R +/Parent 1990 0 R >> -% 2024 0 obj +% 2025 0 obj << -/D [2022 0 R /XYZ 149.705 753.953 null] +/D [2023 0 R /XYZ 149.705 753.953 null] >> -% 2021 0 obj +% 2022 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> /ProcSet [ /PDF /Text ] >> -% 2031 0 obj +% 2032 0 obj << /Type /Page -/Contents 2032 0 R -/Resources 2030 0 R +/Contents 2033 0 R +/Resources 2031 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2034 0 R -/Annots [ 2025 0 R 2026 0 R 2027 0 R 2028 0 R 2029 0 R ] +/Parent 2035 0 R +/Annots [ 2026 0 R 2027 0 R 2028 0 R 2029 0 R 2030 0 R ] >> -% 2025 0 obj +% 2026 0 obj << /Type /Annot /Subtype /Link @@ -28299,7 +28314,7 @@ stream /Rect [320.317 573.77 392.605 585.83] /A << /S /GoTo /D (precdata) >> >> -% 2026 0 obj +% 2027 0 obj << /Type /Annot /Subtype /Link @@ -28307,7 +28322,7 @@ stream /Rect [342.493 517.98 418.548 530.039] /A << /S /GoTo /D (vdata) >> >> -% 2027 0 obj +% 2028 0 obj << /Type /Annot /Subtype /Link @@ -28315,7 +28330,7 @@ stream /Rect [324.013 462.189 391.071 474.248] /A << /S /GoTo /D (descdata) >> >> -% 2028 0 obj +% 2029 0 obj << /Type /Annot /Subtype /Link @@ -28323,7 +28338,7 @@ stream /Rect [342.493 272.899 418.548 284.958] /A << /S /GoTo /D (vdata) >> >> -% 2029 0 obj +% 2030 0 obj << /Type /Annot /Subtype /Link @@ -28331,29 +28346,29 @@ stream /Rect [431.552 183.235 443.387 196.238] /A << /S /GoTo /D (section.11) >> >> -% 2033 0 obj +% 2034 0 obj << -/D [2031 0 R /XYZ 98.895 753.953 null] +/D [2032 0 R /XYZ 98.895 753.953 null] >> % 561 0 obj << -/D [2031 0 R /XYZ 99.895 716.092 null] +/D [2032 0 R /XYZ 99.895 716.092 null] >> -% 2030 0 obj +% 2031 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 2037 0 obj +% 2038 0 obj << /Type /Page -/Contents 2038 0 R -/Resources 2036 0 R +/Contents 2039 0 R +/Resources 2037 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2034 0 R -/Annots [ 2035 0 R ] +/Parent 2035 0 R +/Annots [ 2036 0 R ] >> -% 2035 0 obj +% 2036 0 obj << /Type /Annot /Subtype /Link @@ -28361,44 +28376,39 @@ stream /Rect [371.126 573.77 443.414 585.83] /A << /S /GoTo /D (precdata) >> >> -% 2039 0 obj +% 2040 0 obj << -/D [2037 0 R /XYZ 149.705 753.953 null] +/D [2038 0 R /XYZ 149.705 753.953 null] >> % 565 0 obj << -/D [2037 0 R /XYZ 150.705 716.092 null] +/D [2038 0 R /XYZ 150.705 716.092 null] >> -% 2036 0 obj +% 2037 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R /F190 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 2041 0 obj +% 2042 0 obj << /Type /Page -/Contents 2042 0 R -/Resources 2040 0 R +/Contents 2043 0 R +/Resources 2041 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2034 0 R +/Parent 2035 0 R >> -% 2043 0 obj +% 2044 0 obj << -/D [2041 0 R /XYZ 98.895 753.953 null] +/D [2042 0 R /XYZ 98.895 753.953 null] >> % 569 0 obj << -/D [2041 0 R /XYZ 99.895 716.092 null] ->> -% 2040 0 obj -<< -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> -/ProcSet [ /PDF /Text ] +/D [2042 0 R /XYZ 99.895 716.092 null] >> endstream endobj -2048 0 obj +2050 0 obj << /Length 2715 >> @@ -28475,7 +28485,7 @@ ET endstream endobj -2057 0 obj +2058 0 obj << /Length 6107 >> @@ -28599,7 +28609,7 @@ ET endstream endobj -2064 0 obj +2065 0 obj << /Length 3194 >> @@ -28687,7 +28697,7 @@ ET endstream endobj -2068 0 obj +2069 0 obj << /Length 607 >> @@ -28703,7 +28713,7 @@ ET endstream endobj -2076 0 obj +2077 0 obj << /Length 8466 >> @@ -28853,7 +28863,7 @@ ET endstream endobj -2087 0 obj +2088 0 obj << /Length 7173 >> @@ -28993,7 +29003,7 @@ ET endstream endobj -2092 0 obj +2093 0 obj << /Length 4580 >> @@ -29060,7 +29070,7 @@ ET endstream endobj -2100 0 obj +2101 0 obj << /Length 8759 >> @@ -29212,7 +29222,7 @@ ET endstream endobj -2109 0 obj +2110 0 obj << /Length 6806 >> @@ -29337,7 +29347,7 @@ ET endstream endobj -2113 0 obj +2114 0 obj << /Length 1090 >> @@ -29360,7 +29370,7 @@ ET endstream endobj -2124 0 obj +2125 0 obj << /Length 8172 >> @@ -29594,7 +29604,7 @@ ET endstream endobj -2138 0 obj +2139 0 obj << /Length 9201 >> @@ -29851,7 +29861,7 @@ ET endstream endobj -2147 0 obj +2148 0 obj << /Length 4837 >> @@ -29920,21 +29930,21 @@ ET endstream endobj -2131 0 obj +2132 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/mat.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 2152 0 R +/PTEX.InfoDict 2153 0 R /BBox [0 0 438 395] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << -/R7 2153 0 R +/R7 2154 0 R >>/XObject << -/R8 2154 0 R +/R8 2155 0 R >>>> /Length 3551 /Filter /FlateDecode @@ -29963,7 +29973,7 @@ r ´JXØxèóC¹ù[— S¬ë¹Ïæ^zݰ.¼¯÷ëFÜ$ä 5`2. L£× 0 · æÁî# Z(Dô¿Sð÷žÅjý²¥¬³*'fÖåÃÝÖ;?buÞîR­rœ†þ—* Ýœ—"@„ÂúaËiý(ÿ« o^ÿ/o*o endstream endobj -2154 0 obj +2155 0 obj << /Subtype /Image /ColorSpace /DeviceGray @@ -29982,7 +29992,7 @@ stream & ÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÀ@ endstream endobj -2158 0 obj +2159 0 obj << /Length 7547 >> @@ -30132,22 +30142,22 @@ ET endstream endobj -2133 0 obj +2134 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/ell.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 2169 0 R +/PTEX.InfoDict 2170 0 R /BBox [0 0 447 205] /Resources << /ProcSet [ /PDF /ImageC /Text ] /ExtGState << -/R7 2170 0 R +/R7 2171 0 R >>/XObject << -/R8 2171 0 R ->>/Font << /R9 2172 0 R/R11 2173 0 R>> +/R8 2172 0 R +>>/Font << /R9 2173 0 R/R11 2174 0 R>> >> /Length 2281 /Filter /FlateDecode @@ -30159,34 +30169,39 @@ x Íy-?ýíùï¯ßñGz·5®„ùËéOß}àMžså¾Atû·ÔÇÿ|THF endstream endobj -2050 0 obj +2045 0 obj << /Type /ObjStm /N 100 -/First 991 -/Length 12168 ->> -stream -2047 0 2044 148 2045 293 2049 440 573 499 2046 557 2056 652 2051 818 2052 963 2053 1110 -2054 1264 2058 1413 577 1471 2055 1528 2063 1623 2059 1780 2060 1927 2061 2074 2065 2228 581 2287 -2062 2345 2067 2440 2069 2558 585 2616 2066 2673 2075 2768 2071 2916 2072 3066 2077 3211 589 3270 -2078 3328 2079 3387 2080 3446 2081 3505 2074 3563 2086 3714 2073 3880 2082 4027 2083 4171 2084 4315 -2088 4460 2085 4518 2091 4669 2089 4808 2093 4952 2090 5011 2099 5119 2094 5276 2095 5421 2096 5568 -2101 5710 593 5768 2102 5825 2103 5883 2104 5941 2098 5999 2108 6150 2097 6307 2105 6451 2106 6598 -2110 6742 2107 6801 2112 6952 2114 7070 2111 7128 2123 7209 2116 7402 2126 7578 2117 7753 2118 7936 -2119 8088 2120 8243 2121 8395 2125 8549 597 8608 601 8666 2122 8724 2137 8847 2129 9004 2130 9153 -2132 9300 2139 9447 606 9505 610 9562 2140 9619 2141 9677 2136 9735 2146 9873 2152 10012 2153 10192 -2135 10235 2148 10382 2143 10441 2149 10500 2150 10559 2151 10618 2145 10677 2157 10815 2169 10954 2170 11134 -% 2047 0 obj +/First 989 +/Length 12218 +>> +stream +2041 0 2049 95 2046 243 2047 388 2051 535 573 594 2048 652 2057 747 2052 913 2053 1058 +2054 1205 2055 1359 2059 1508 577 1566 2056 1623 2064 1718 2060 1875 2061 2022 2062 2169 2066 2323 +581 2382 2063 2440 2068 2535 2070 2653 585 2711 2067 2768 2076 2863 2072 3011 2073 3161 2078 3306 +589 3365 2079 3423 2080 3482 2081 3541 2082 3600 2075 3658 2087 3809 2074 3975 2083 4122 2084 4266 +2085 4410 2089 4555 2086 4613 2092 4764 2090 4903 2094 5047 2091 5106 2100 5214 2095 5371 2096 5516 +2097 5663 2102 5805 593 5863 2103 5920 2104 5978 2105 6036 2099 6094 2109 6245 2098 6402 2106 6546 +2107 6693 2111 6837 2108 6896 2113 7047 2115 7165 2112 7223 2124 7304 2117 7497 2127 7673 2118 7848 +2119 8031 2120 8183 2121 8338 2122 8490 2126 8644 597 8703 601 8761 2123 8819 2138 8942 2130 9099 +2131 9248 2133 9395 2140 9542 606 9600 610 9657 2141 9714 2142 9772 2137 9830 2147 9968 2153 10107 +2154 10287 2136 10330 2149 10477 2144 10536 2150 10595 2151 10654 2152 10713 2146 10772 2158 10910 2170 11049 +% 2041 0 obj +<< +/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> +/ProcSet [ /PDF /Text ] +>> +% 2049 0 obj << /Type /Page -/Contents 2048 0 R -/Resources 2046 0 R +/Contents 2050 0 R +/Resources 2048 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2034 0 R -/Annots [ 2044 0 R 2045 0 R ] +/Parent 2035 0 R +/Annots [ 2046 0 R 2047 0 R ] >> -% 2044 0 obj +% 2046 0 obj << /Type /Annot /Subtype /Link @@ -30194,7 +30209,7 @@ stream /Rect [371.126 573.77 443.414 585.83] /A << /S /GoTo /D (precdata) >> >> -% 2045 0 obj +% 2047 0 obj << /Type /Annot /Subtype /Link @@ -30202,29 +30217,29 @@ stream /Rect [371.126 498.054 443.414 510.114] /A << /S /GoTo /D (precdata) >> >> -% 2049 0 obj +% 2051 0 obj << -/D [2047 0 R /XYZ 149.705 753.953 null] +/D [2049 0 R /XYZ 149.705 753.953 null] >> % 573 0 obj << -/D [2047 0 R /XYZ 150.705 716.092 null] +/D [2049 0 R /XYZ 150.705 716.092 null] >> -% 2046 0 obj +% 2048 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 2056 0 obj +% 2057 0 obj << /Type /Page -/Contents 2057 0 R -/Resources 2055 0 R +/Contents 2058 0 R +/Resources 2056 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2034 0 R -/Annots [ 2051 0 R 2052 0 R 2053 0 R 2054 0 R ] +/Parent 2035 0 R +/Annots [ 2052 0 R 2053 0 R 2054 0 R 2055 0 R ] >> -% 2051 0 obj +% 2052 0 obj << /Type /Annot /Subtype /Link @@ -30232,7 +30247,7 @@ stream /Rect [320.317 573.77 392.605 585.83] /A << /S /GoTo /D (precdata) >> >> -% 2052 0 obj +% 2053 0 obj << /Type /Annot /Subtype /Link @@ -30240,7 +30255,7 @@ stream /Rect [320.317 430.308 392.605 442.368] /A << /S /GoTo /D (precdata) >> >> -% 2053 0 obj +% 2054 0 obj << /Type /Annot /Subtype /Link @@ -30248,7 +30263,7 @@ stream /Rect [129.909 304.779 149.563 316.839] /A << /S /GoTo /D (subsection.12.4) >> >> -% 2054 0 obj +% 2055 0 obj << /Type /Annot /Subtype /Link @@ -30256,29 +30271,29 @@ stream /Rect [172.161 304.779 184.246 316.839] /A << /S /GoTo /D (section.13) >> >> -% 2058 0 obj +% 2059 0 obj << -/D [2056 0 R /XYZ 98.895 753.953 null] +/D [2057 0 R /XYZ 98.895 753.953 null] >> % 577 0 obj << -/D [2056 0 R /XYZ 99.895 716.092 null] +/D [2057 0 R /XYZ 99.895 716.092 null] >> -% 2055 0 obj +% 2056 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 2063 0 obj +% 2064 0 obj << /Type /Page -/Contents 2064 0 R -/Resources 2062 0 R +/Contents 2065 0 R +/Resources 2063 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2034 0 R -/Annots [ 2059 0 R 2060 0 R 2061 0 R ] +/Parent 2035 0 R +/Annots [ 2060 0 R 2061 0 R 2062 0 R ] >> -% 2059 0 obj +% 2060 0 obj << /Type /Annot /Subtype /Link @@ -30286,7 +30301,7 @@ stream /Rect [371.126 561.815 443.414 573.875] /A << /S /GoTo /D (precdata) >> >> -% 2060 0 obj +% 2061 0 obj << /Type /Annot /Subtype /Link @@ -30294,7 +30309,7 @@ stream /Rect [371.126 486.099 443.414 498.159] /A << /S /GoTo /D (precdata) >> >> -% 2061 0 obj +% 2062 0 obj << /Type /Annot /Subtype /Link @@ -30302,50 +30317,50 @@ stream /Rect [443.742 396.435 463.169 408.495] /A << /S /GoTo /D (subsection.10.8) >> >> -% 2065 0 obj +% 2066 0 obj << -/D [2063 0 R /XYZ 149.705 753.953 null] +/D [2064 0 R /XYZ 149.705 753.953 null] >> % 581 0 obj << -/D [2063 0 R /XYZ 150.705 716.092 null] +/D [2064 0 R /XYZ 150.705 716.092 null] >> -% 2062 0 obj +% 2063 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 2067 0 obj +% 2068 0 obj << /Type /Page -/Contents 2068 0 R -/Resources 2066 0 R +/Contents 2069 0 R +/Resources 2067 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2070 0 R +/Parent 2071 0 R >> -% 2069 0 obj +% 2070 0 obj << -/D [2067 0 R /XYZ 98.895 753.953 null] +/D [2068 0 R /XYZ 98.895 753.953 null] >> % 585 0 obj << -/D [2067 0 R /XYZ 99.895 716.092 null] +/D [2068 0 R /XYZ 99.895 716.092 null] >> -% 2066 0 obj +% 2067 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> /ProcSet [ /PDF /Text ] >> -% 2075 0 obj +% 2076 0 obj << /Type /Page -/Contents 2076 0 R -/Resources 2074 0 R +/Contents 2077 0 R +/Resources 2075 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2070 0 R -/Annots [ 2071 0 R 2072 0 R ] +/Parent 2071 0 R +/Annots [ 2072 0 R 2073 0 R ] >> -% 2071 0 obj +% 2072 0 obj << /Type /Annot /Subtype /Link @@ -30353,7 +30368,7 @@ stream /Rect [379.973 275.278 386.249 288.868] /A << /S /GoTo /D (Hfootnote.5) >> >> -% 2072 0 obj +% 2073 0 obj << /Type /Annot /Subtype /Link @@ -30361,45 +30376,45 @@ stream /Rect [342.753 134.696 420.271 146.755] /A << /S /GoTo /D (spdata) >> >> -% 2077 0 obj +% 2078 0 obj << -/D [2075 0 R /XYZ 149.705 753.953 null] +/D [2076 0 R /XYZ 149.705 753.953 null] >> % 589 0 obj << -/D [2075 0 R /XYZ 150.705 716.092 null] ->> -% 2078 0 obj -<< -/D [2075 0 R /XYZ 150.705 444.811 null] +/D [2076 0 R /XYZ 150.705 716.092 null] >> % 2079 0 obj << -/D [2075 0 R /XYZ 150.705 444.971 null] +/D [2076 0 R /XYZ 150.705 444.811 null] >> % 2080 0 obj << -/D [2075 0 R /XYZ 150.705 433.015 null] +/D [2076 0 R /XYZ 150.705 444.971 null] >> % 2081 0 obj << -/D [2075 0 R /XYZ 165.051 129.79 null] +/D [2076 0 R /XYZ 150.705 433.015 null] >> -% 2074 0 obj +% 2082 0 obj +<< +/D [2076 0 R /XYZ 165.051 129.79 null] +>> +% 2075 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F192 942 0 R /F190 941 0 R /F148 1490 0 R /F145 940 0 R >> /ProcSet [ /PDF /Text ] >> -% 2086 0 obj +% 2087 0 obj << /Type /Page -/Contents 2087 0 R -/Resources 2085 0 R +/Contents 2088 0 R +/Resources 2086 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2070 0 R -/Annots [ 2073 0 R 2082 0 R 2083 0 R 2084 0 R ] +/Parent 2071 0 R +/Annots [ 2074 0 R 2083 0 R 2084 0 R 2085 0 R ] >> -% 2073 0 obj +% 2074 0 obj << /Type /Annot /Subtype /Link @@ -30407,7 +30422,7 @@ stream /Rect [291.943 654.503 364.232 666.562] /A << /S /GoTo /D (precdata) >> >> -% 2082 0 obj +% 2083 0 obj << /Type /Annot /Subtype /Link @@ -30415,7 +30430,7 @@ stream /Rect [342.493 584.479 418.548 596.539] /A << /S /GoTo /D (vdata) >> >> -% 2083 0 obj +% 2084 0 obj << /Type /Annot /Subtype /Link @@ -30423,7 +30438,7 @@ stream /Rect [342.493 514.456 418.548 526.516] /A << /S /GoTo /D (vdata) >> >> -% 2084 0 obj +% 2085 0 obj << /Type /Annot /Subtype /Link @@ -30431,25 +30446,25 @@ stream /Rect [291.943 374.41 359.001 386.47] /A << /S /GoTo /D (descdata) >> >> -% 2088 0 obj +% 2089 0 obj << -/D [2086 0 R /XYZ 98.895 753.953 null] +/D [2087 0 R /XYZ 98.895 753.953 null] >> -% 2085 0 obj +% 2086 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R /F78 686 0 R /F192 942 0 R /F190 941 0 R /F148 1490 0 R >> /ProcSet [ /PDF /Text ] >> -% 2091 0 obj +% 2092 0 obj << /Type /Page -/Contents 2092 0 R -/Resources 2090 0 R +/Contents 2093 0 R +/Resources 2091 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2070 0 R -/Annots [ 2089 0 R ] +/Parent 2071 0 R +/Annots [ 2090 0 R ] >> -% 2089 0 obj +% 2090 0 obj << /Type /Annot /Subtype /Link @@ -30457,25 +30472,25 @@ stream /Rect [393.303 554.876 469.357 566.936] /A << /S /GoTo /D (vdata) >> >> -% 2093 0 obj +% 2094 0 obj << -/D [2091 0 R /XYZ 149.705 753.953 null] +/D [2092 0 R /XYZ 149.705 753.953 null] >> -% 2090 0 obj +% 2091 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 2099 0 obj +% 2100 0 obj << /Type /Page -/Contents 2100 0 R -/Resources 2098 0 R +/Contents 2101 0 R +/Resources 2099 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2070 0 R -/Annots [ 2094 0 R 2095 0 R 2096 0 R ] +/Parent 2071 0 R +/Annots [ 2095 0 R 2096 0 R 2097 0 R ] >> -% 2094 0 obj +% 2095 0 obj << /Type /Annot /Subtype /Link @@ -30483,7 +30498,7 @@ stream /Rect [291.943 253.023 369.462 265.083] /A << /S /GoTo /D (spdata) >> >> -% 2095 0 obj +% 2096 0 obj << /Type /Annot /Subtype /Link @@ -30491,7 +30506,7 @@ stream /Rect [291.943 184.772 364.232 196.831] /A << /S /GoTo /D (precdata) >> >> -% 2096 0 obj +% 2097 0 obj << /Type /Annot /Subtype /Link @@ -30499,41 +30514,41 @@ stream /Rect [342.493 116.52 418.548 128.58] /A << /S /GoTo /D (vdata) >> >> -% 2101 0 obj +% 2102 0 obj << -/D [2099 0 R /XYZ 98.895 753.953 null] +/D [2100 0 R /XYZ 98.895 753.953 null] >> % 593 0 obj << -/D [2099 0 R /XYZ 99.895 716.092 null] ->> -% 2102 0 obj -<< -/D [2099 0 R /XYZ 99.895 397.916 null] +/D [2100 0 R /XYZ 99.895 716.092 null] >> % 2103 0 obj << -/D [2099 0 R /XYZ 99.895 398.076 null] +/D [2100 0 R /XYZ 99.895 397.916 null] >> % 2104 0 obj << -/D [2099 0 R /XYZ 99.895 386.121 null] +/D [2100 0 R /XYZ 99.895 398.076 null] >> -% 2098 0 obj +% 2105 0 obj +<< +/D [2100 0 R /XYZ 99.895 386.121 null] +>> +% 2099 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F192 942 0 R /F190 941 0 R /F148 1490 0 R /F145 940 0 R >> /ProcSet [ /PDF /Text ] >> -% 2108 0 obj +% 2109 0 obj << /Type /Page -/Contents 2109 0 R -/Resources 2107 0 R +/Contents 2110 0 R +/Resources 2108 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2070 0 R -/Annots [ 2097 0 R 2105 0 R 2106 0 R ] +/Parent 2071 0 R +/Annots [ 2098 0 R 2106 0 R 2107 0 R ] >> -% 2097 0 obj +% 2098 0 obj << /Type /Annot /Subtype /Link @@ -30541,7 +30556,7 @@ stream /Rect [393.303 654.503 469.357 666.562] /A << /S /GoTo /D (vdata) >> >> -% 2105 0 obj +% 2106 0 obj << /Type /Annot /Subtype /Link @@ -30549,7 +30564,7 @@ stream /Rect [342.753 520.007 409.811 532.067] /A << /S /GoTo /D (descdata) >> >> -% 2106 0 obj +% 2107 0 obj << /Type /Annot /Subtype /Link @@ -30557,63 +30572,63 @@ stream /Rect [393.303 183.768 469.357 195.827] /A << /S /GoTo /D (vdata) >> >> -% 2110 0 obj +% 2111 0 obj << -/D [2108 0 R /XYZ 149.705 753.953 null] +/D [2109 0 R /XYZ 149.705 753.953 null] >> -% 2107 0 obj +% 2108 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R /F78 686 0 R /F192 942 0 R /F190 941 0 R /F148 1490 0 R >> /ProcSet [ /PDF /Text ] >> -% 2112 0 obj +% 2113 0 obj << /Type /Page -/Contents 2113 0 R -/Resources 2111 0 R +/Contents 2114 0 R +/Resources 2112 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2115 0 R +/Parent 2116 0 R >> -% 2114 0 obj +% 2115 0 obj << -/D [2112 0 R /XYZ 98.895 753.953 null] +/D [2113 0 R /XYZ 98.895 753.953 null] >> -% 2111 0 obj +% 2112 0 obj << /Font << /F75 685 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 2123 0 obj +% 2124 0 obj << /Type /Page -/Contents 2124 0 R -/Resources 2122 0 R +/Contents 2125 0 R +/Resources 2123 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2115 0 R -/Annots [ 2116 0 R 2126 0 R 2117 0 R 2118 0 R 2119 0 R 2120 0 R 2121 0 R ] +/Parent 2116 0 R +/Annots [ 2117 0 R 2127 0 R 2118 0 R 2119 0 R 2120 0 R 2121 0 R 2122 0 R ] >> -% 2116 0 obj +% 2117 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [368.938 636.522 495.412 648.582] /Subtype/Link/A<> >> -% 2126 0 obj +% 2127 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [174.615 624.567 218.45 636.627] /Subtype/Link/A<> >> -% 2117 0 obj +% 2118 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [191.223 593.098 397.198 605.158] /Subtype/Link/A<> >> -% 2118 0 obj +% 2119 0 obj << /Type /Annot /Subtype /Link @@ -30621,7 +30636,7 @@ stream /Rect [280.59 552.835 292.545 561.841] /A << /S /GoTo /D (cite.DesPat:11) >> >> -% 2119 0 obj +% 2120 0 obj << /Type /Annot /Subtype /Link @@ -30629,7 +30644,7 @@ stream /Rect [296.203 552.835 308.158 561.692] /A << /S /GoTo /D (cite.CaFiRo:2014) >> >> -% 2120 0 obj +% 2121 0 obj << /Type /Annot /Subtype /Link @@ -30637,7 +30652,7 @@ stream /Rect [311.815 552.835 323.771 561.841] /A << /S /GoTo /D (cite.Sparse03) >> >> -% 2121 0 obj +% 2122 0 obj << /Type /Annot /Subtype /Link @@ -30645,33 +30660,33 @@ stream /Rect [209.414 540.781 221.369 549.737] /A << /S /GoTo /D (cite.OurTechRep) >> >> -% 2125 0 obj +% 2126 0 obj << -/D [2123 0 R /XYZ 149.705 753.953 null] +/D [2124 0 R /XYZ 149.705 753.953 null] >> % 597 0 obj << -/D [2123 0 R /XYZ 150.705 716.092 null] +/D [2124 0 R /XYZ 150.705 716.092 null] >> % 601 0 obj << -/D [2123 0 R /XYZ 150.705 525.151 null] +/D [2124 0 R /XYZ 150.705 525.151 null] >> -% 2122 0 obj +% 2123 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R /F78 686 0 R /F233 1044 0 R >> /ProcSet [ /PDF /Text ] >> -% 2137 0 obj +% 2138 0 obj << /Type /Page -/Contents 2138 0 R -/Resources 2136 0 R +/Contents 2139 0 R +/Resources 2137 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2115 0 R -/Annots [ 2129 0 R 2130 0 R 2132 0 R ] +/Parent 2116 0 R +/Annots [ 2130 0 R 2131 0 R 2133 0 R ] >> -% 2129 0 obj +% 2130 0 obj << /Type /Annot /Subtype /Link @@ -30679,7 +30694,7 @@ stream /Rect [121.315 282.067 133.27 291.173] /A << /S /GoTo /D (cite.MRC:11) >> >> -% 2130 0 obj +% 2131 0 obj << /Type /Annot /Subtype /Link @@ -30687,7 +30702,7 @@ stream /Rect [253.836 246.183 265.791 255.592] /A << /S /GoTo /D (table.22) >> >> -% 2132 0 obj +% 2133 0 obj << /Type /Annot /Subtype /Link @@ -30695,53 +30710,53 @@ stream /Rect [310.367 176.296 317.241 188.355] /A << /S /GoTo /D (figure.6) >> >> -% 2139 0 obj +% 2140 0 obj << -/D [2137 0 R /XYZ 98.895 753.953 null] +/D [2138 0 R /XYZ 98.895 753.953 null] >> % 606 0 obj << -/D [2137 0 R /XYZ 99.895 349.244 null] +/D [2138 0 R /XYZ 99.895 349.244 null] >> % 610 0 obj << -/D [2137 0 R /XYZ 99.895 231.907 null] +/D [2138 0 R /XYZ 99.895 231.907 null] >> -% 2140 0 obj +% 2141 0 obj << -/D [2137 0 R /XYZ 99.895 211.056 null] +/D [2138 0 R /XYZ 99.895 211.056 null] >> -% 2141 0 obj +% 2142 0 obj << -/D [2137 0 R /XYZ 99.895 120.166 null] +/D [2138 0 R /XYZ 99.895 120.166 null] >> -% 2136 0 obj +% 2137 0 obj << -/Font << /F279 1813 0 R /F233 1044 0 R /F84 687 0 R /F145 940 0 R /F75 685 0 R /F78 686 0 R >> +/Font << /F279 1814 0 R /F233 1044 0 R /F84 687 0 R /F145 940 0 R /F75 685 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 2146 0 obj +% 2147 0 obj << /Type /Page -/Contents 2147 0 R -/Resources 2145 0 R +/Contents 2148 0 R +/Resources 2146 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2115 0 R -/Annots [ 2135 0 R ] +/Parent 2116 0 R +/Annots [ 2136 0 R ] >> -% 2152 0 obj +% 2153 0 obj << /Producer (GPL Ghostscript 9.10) /CreationDate (D:20140329133929+01'00') /ModDate (D:20140329133929+01'00') /Creator (cairo 1.13.1 \(http://cairographics.org\)) >> -% 2153 0 obj +% 2154 0 obj << /Type /ExtGState /OPM 1 >> -% 2135 0 obj +% 2136 0 obj << /Type /Annot /Subtype /Link @@ -30749,57 +30764,52 @@ stream /Rect [170.554 324.049 177.543 336.109] /A << /S /GoTo /D (algocf.1) >> >> -% 2148 0 obj -<< -/D [2146 0 R /XYZ 149.705 753.953 null] ->> -% 2143 0 obj +% 2149 0 obj << -/D [2146 0 R /XYZ 150.705 716.092 null] +/D [2147 0 R /XYZ 149.705 753.953 null] >> -% 2149 0 obj +% 2144 0 obj << -/D [2146 0 R /XYZ 397.506 407.446 null] +/D [2147 0 R /XYZ 150.705 716.092 null] >> % 2150 0 obj << -/D [2146 0 R /XYZ 150.705 260.219 null] +/D [2147 0 R /XYZ 397.506 407.446 null] >> % 2151 0 obj << -/D [2146 0 R /XYZ 150.705 226.207 null] +/D [2147 0 R /XYZ 150.705 260.219 null] >> -% 2145 0 obj +% 2152 0 obj +<< +/D [2147 0 R /XYZ 150.705 226.207 null] +>> +% 2146 0 obj << /Font << /F84 687 0 R /F78 686 0 R /F192 942 0 R /F145 940 0 R >> -/XObject << /Im6 2131 0 R >> +/XObject << /Im6 2132 0 R >> /ProcSet [ /PDF /Text ] >> -% 2157 0 obj +% 2158 0 obj << /Type /Page -/Contents 2158 0 R -/Resources 2156 0 R +/Contents 2159 0 R +/Resources 2157 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2115 0 R -/Annots [ 2134 0 R ] +/Parent 2116 0 R +/Annots [ 2135 0 R ] >> -% 2169 0 obj +% 2170 0 obj << /Producer (GPL Ghostscript 9.10) /CreationDate (D:20140329133928+01'00') /ModDate (D:20140329133928+01'00') /Creator (cairo 1.13.1 \(http://cairographics.org\)) >> -% 2170 0 obj -<< -/Type /ExtGState -/OPM 1 ->> endstream endobj -2171 0 obj +2172 0 obj << /Subtype /Image /ColorSpace /DeviceGray @@ -30818,7 +30828,7 @@ stream ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ;Y¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà endstream endobj -2176 0 obj +2177 0 obj << /Filter /FlateDecode /Length 171 @@ -30827,7 +30837,7 @@ stream xœ]Mƒ F÷œ‚àOÛĸ±mš¶Àa0,‚¸èí; vфߛ|ˆ~¸ÖD.ÁÁ #ׯª€‹[ q2–•WâNy‡Yz&ú›ôïGNÔßåŒâYžóM¹9à.^i'dmQt­ÖC«þžªMõž¬)YŸ:2èDØ^26Y?‚iRªt4à°†€6æÞ¹Wêc,þ¾æO§Å¾=+V endstream endobj -2178 0 obj +2179 0 obj << /Filter /FlateDecode /Length 191 @@ -30837,7 +30847,7 @@ x â ±—Uˆ}íuT-mËüǸT¯)ÏuɺDÞyøýC ±¸(Š|iÑ_À endstream endobj -2179 0 obj +2180 0 obj << /Filter /FlateDecode /Length1 11124 @@ -30886,7 +30896,7 @@ B “žÑ endstream endobj -2180 0 obj +2181 0 obj << /Filter /FlateDecode /Length1 3512 @@ -30902,7 +30912,7 @@ a lþ'÷uþoL|E÷¾r«Ço¸ß9®ñߺӣú¾Á( endstream endobj -2187 0 obj +2188 0 obj << /Length 8640 >> @@ -31070,20 +31080,20 @@ ET endstream endobj -2181 0 obj +2182 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (../figures/hll.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 2191 0 R +/PTEX.InfoDict 2192 0 R /BBox [0 0 494 214] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << -/R7 2192 0 R ->>/Font << /R8 2193 0 R/R10 2194 0 R>> +/R7 2193 0 R +>>/Font << /R8 2194 0 R/R10 2195 0 R>> >> /Length 2880 /Filter /FlateDecode @@ -31105,7 +31115,7 @@ l Ù<øÇ×O?Ó‚•2.šg9_ÿ*×Ps ŸOøYT¨•®U¼v²rƈºŸÂãSóøbzh”8†Ñ½ÂXZÊü°ó`—ú矆@8èwàô)aÿ…¢ªküœËEvëñ»›šK°|dG˜s%´D YšVòÔ@( ázé‹ñCüÿæ×¬á¿8Ç7•xVÇ‹ éÑi3kè4½ðw(Ölú¸V*|ik¬Ô¦âÓ*økµøåÀ—žÑÑ÷K•_á•Box:ÀÀ¯¿Æë‘HÏ+x´“êˆÆi[‡;¬<ž¿Á²ÐùÅ+i œ°ùŸø`8¼=ÿ³·‡ endstream endobj -2196 0 obj +2197 0 obj << /Filter /FlateDecode /Length 214 @@ -31114,7 +31124,7 @@ stream xœ]Á‚0 †ï{нÁ@²ì¢£¾ÀÙ±L<øö¶EOK šp#Ý&ÉQZ]ŒV«ÓqA« ×͈ÆãøÝn ¸G6ЍÑë4(„‡ ÇéÍÍé~¹R6èõ&Ž{øaÎxÿ.[±D½˜ÐK·ÈQ7idZñ?:õ;> @@ -31512,20 +31522,20 @@ ET endstream endobj -2203 0 obj +2204 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/dia.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 2212 0 R +/PTEX.InfoDict 2213 0 R /BBox [0 0 499 211] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << -/R7 2213 0 R ->>/Font << /R8 2214 0 R/R10 2215 0 R>> +/R7 2214 0 R +>>/Font << /R8 2215 0 R/R10 2216 0 R>> >> /Length 2502 /Filter /FlateDecode @@ -31543,7 +31553,7 @@ $ rca™ñ8ÏzD—‹bH…°d'¥¢šÃ\LÀ/ó¹¬1ÙŒ,0F c¨)T#  7Ì,¥j7ß%Î¥šäÛæ›RÙ6ßq4›/ÉÙ¸g]åû\¦—×\ÃW\¬ò+3,êmó½Lr´›ïJŽ·Í7ñÅÓÐÈþ¶ù&þ?9³ù.y’QQШ» Ñ•Œ&Gs¼m¾7ì“LÏ‹I7=šûmóM¹m›/]”o›/ÉvóUQxT»ù._àlÛæ»òâ›QUÔÌá×.Ü$Rg{çæñÊØcé‚Lçúqçþú1º‡ç×><>¾bûJ:ªŠÞËÃ_ƽ:dº’·p>yºovª†ç¿‘ã¿ûîã·ÏÓ‘¯ì-u„縑óß¿Ë&& endstream endobj -2217 0 obj +2218 0 obj << /Filter /FlateDecode /Length 177 @@ -31553,7 +31563,7 @@ x ¢t s1#8ý÷ÕUÃlŽÉV‹"α’¡Cc×fÄb/Šû²íôåÅ9ሪ=Fp©œQbæxÖÁïÒàCvQùðY¢ endstream endobj -2219 0 obj +2220 0 obj << /Filter /FlateDecode /Length 197 @@ -31562,7 +31572,7 @@ stream xœ]Mƒ …÷œ‚ˆFmL»qѦi{ÄÁ° ꢷï0j]¼ Ìß#k»kçÝʳGœÍ Vn",ó ðFçY^ðÁ™õ ŠfÒeíM‡÷'ǰ;ßõÙ3¿ÐM¾×˜y€%hQû˜BIk?ü=Õ{AoÌ3“„ÀÈd™+’+Äš°Jh ›ËªP²*â ±Q$ĆFŸCÒÉι=7[ŒàWòLž’çá÷-a©Š£ØsÇbã endstream endobj -2220 0 obj +2221 0 obj << /Filter /FlateDecode /Length1 9528 @@ -31596,7 +31606,7 @@ E ó˜Ÿó_ ù[ØCÛ×,š0Z­ÊþÛ Ê+é×…¬Ã¿]úi ^gù\Þo´ùȯ›‰ò'/! `¢ìÁŠàÆ?GÿÁžÿ…&X‘³œ‰çI,¯ÖÆåbøQ ~¼ü÷8É߇㈭^×Ô:·éÛ š×ÕßZ½pÎ"£'ÛõDÊrms#×0F~6Mc£øÓ´ÎåBi6U ¯éÿðȾü?ôèGNÔÙý_XR‡=ñÑè—$=zC/]l»¼ÃQd‰E3ꊭÿîi endstream endobj -2221 0 obj +2222 0 obj << /Filter /FlateDecode /Length1 4304 @@ -31622,7 +31632,7 @@ Hp —øï}Ø».|wy endstream endobj -2226 0 obj +2227 0 obj << /Length 9674 >> @@ -31849,22 +31859,22 @@ ET endstream endobj -2222 0 obj +2223 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (../figures/hdia.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 2229 0 R +/PTEX.InfoDict 2230 0 R /BBox [0 0 556 211] /Resources << /ProcSet [ /PDF /ImageC /Text ] /ExtGState << -/R7 2230 0 R +/R7 2231 0 R >>/XObject << -/R8 2231 0 R ->>/Font << /R9 2232 0 R/R11 2233 0 R>> +/R8 2232 0 R +>>/Font << /R9 2233 0 R/R11 2234 0 R>> >> /Length 3027 /Filter /FlateDecode @@ -31881,7 +31891,7 @@ mC àÕÀ–ÅèÚWšÙ‡ñZ1m¹©†CË8?¬¹e—¶Ühc·æÖó57‘-7ÖhhlABg–›Ä ŽQ ìYP×¾ÖÌÆZkaðfÃÞ%÷1#YSñüõtÃIoÃ`·FzT#Ô:ž©""ÒÒw+ ÄÁíj€eqA#Xƒ#͸g =з‰ 1€cP€D-¶,ÆZûJ3k-Í^Zn¢‘Ðrœ³ABÏqLË-‡9Ÿæ|S,›cÕphbABg–›Ä ‰Z lYŒµö•fF]æf^˜ò¨gÚ8ų7ÕÄŠýlT3"ª± Ú¿þV)Z?·¾ãf̺¡1Ö°X]]ƒùLÈ¿†ÙYáKjÏ¢ÖKedjˆ›<Ÿ®ð/o•¢‡‹í—çÛ>úéÆÅPó\+u¿Uóq™¿¨Ùñ¼(q|KàcÉtõ¼h|¤;ÓDŸ8TÜè3¦ÆÃYË«HŒÇŠ”Û+½’¬Q‹‰n¨û±ûìþǨÙ¡k£1*R$¢™®`˜jš“†Òè •f‘ª,vU#žÅûØ}JoÒ|íYÖ„5%sMè%Çxé?k‚SW-"RMXQ»Ö„G°Æ|d®ÉÕ§Ô„ì5kšéŠjÒãéÕwjt·n²¨VUÁne4;Ørô!”6t„A· ¡Y!éeB±:³h ¬yâJà×:ùD#†R[Dï°a§˜Ì–Isµ<H«eÕðd¡ èm8Ï% P§õ§#Þ´Ï·màxG¼ÎZË‘ýn9s…#Àƒjõ§á‚N5‚ÌcG,r©™®Çum”Ò|ûi¬½–»8¾PÃôE!øæ*]Šâ ÛæGR,_#ù¬ÝÍ?fCésöâÄñßâÝ´Ï·}$½”Ç®`Ly®…ÈR+Q—æ#­ÍK³ÙzT&zµ)ŠH_x6£=“¥O±ôù¢Og„ixLEð8•ˆÉ«KŽc³2žÙOO¦áU ¡òjSÃJ[êYâE,l^yÖÑgeƒ”´Ø¢þð™‰o² }DêBtôú§ëÏÎ'ºÖÑ"ý¨†ù‡Ç +Š}–éæƒ„†Ì¶fbôBÍ™þïñùøÍÃí›7ýéxøñ6¿qžßŸ`Ú dœöPÀ‡çÛ{õð›Ïø%¥ƒ^w¬ã_îÎ…)ôzÜãÉŽ-îú ƒʪ#Oú! smèéRßa÷ý»;ÿê¾aÃì\º«¯þúð‡Û=–ŒsØï®†ßÝݦ@ïwñÕ}Íî.ã?„NC ¬Ô,PŒ˜{¤ …áÛÔ…öJŸ«÷ôº8¬å¹×ô}¯ ÏHzw÷û׿ýãñ§ï¾{‹ÀU­áîÛ‡}±£ÇÀ„nbURA4Ûƒãǹ@7ú#Ãׯ"íW}¼{{¼~ófZÍÍã‡êðg)wæG?Üþ4º‘ endstream endobj -2231 0 obj +2232 0 obj << /Subtype /Image /ColorSpace /DeviceGray @@ -31900,7 +31910,7 @@ stream ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 0l?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü@ endstream endobj -2235 0 obj +2236 0 obj << /Filter /FlateDecode /Length 177 @@ -31909,7 +31919,7 @@ stream xœ]1à EwNÁ €0´C”%]24ªÚ^€€‰ˆ¡·/8I‡¶ülë›õÃmð.SöHA¿ Së¼I°†-i ÌÎÑPãt>³^T$¬¿«øþD eìΣZ€=Å;b×è``JCR~ÒrÞµÖv¼ùÉ]0Ùc³1ç%“V¡KUP¼ J¼vêêáêð4Dõ–øŒo ÍjÏyø}C¬*Z‚|ïY› endstream endobj -2237 0 obj +2238 0 obj << /Filter /FlateDecode /Length 213 @@ -31921,7 +31931,7 @@ e ¦Y$àÅcÂß ó”yJê Ûál« endstream endobj -2238 0 obj +2239 0 obj << /Filter /FlateDecode /Length1 10604 @@ -31955,7 +31965,7 @@ b YÑF.þÎ X°bÍÒιKo˜ß¾¦ùúÚº9 ô,p÷xýÿÍg¼²xή`ŒÿK)ÄDÀl;Áy‚jö8Ô­ƒ¨[ßÿáí°×þÒï=2ØdqmŒëøá“žôèÕðÃú‹;­EÆP%ï÷ÿ=X endstream endobj -2239 0 obj +2240 0 obj << /Filter /FlateDecode /Length1 5080 @@ -31976,7 +31986,7 @@ Y2 pÓÇ}3ÇóyØà.”pÄ€×ÏôÁ›ýÿâqÁ%§t1Þ®onb©³eæÑM¸éÃáË0÷ǵ3kçéD ^ðoÛw# çô°'Ì?¸²rtåÁ3÷9#§þëò¾W|ÞÞ|¢ûïš«A†ûD¸Ÿàûe0¹bÎxõ¯`}u¤¸%üžÄ÷÷ðý\3“¹ÙZŸ­¾eÓ?¼|Odò?¸¯ðo2õU3ðÜÖÿãÿ­ðÿÍWúßÓ )' endstream endobj -2242 0 obj +2243 0 obj << /Length 1097 >> @@ -32036,7 +32046,7 @@ ET endstream endobj -2246 0 obj +2247 0 obj << /Length 7873 >> @@ -32103,7 +32113,7 @@ ET endstream endobj -2250 0 obj +2251 0 obj << /Length 5844 >> @@ -32206,7 +32216,7 @@ ET endstream endobj -2255 0 obj +2256 0 obj << /Length 5432 >> @@ -32394,7 +32404,7 @@ ET endstream endobj -2259 0 obj +2260 0 obj << /Length 2725 >> @@ -32498,7 +32508,7 @@ ET endstream endobj -2264 0 obj +2265 0 obj << /Length 81 >> @@ -32513,7 +32523,7 @@ ET endstream endobj -2268 0 obj +2269 0 obj << /Length 7303 >> @@ -32577,47 +32587,52 @@ ET endstream endobj -2174 0 obj +2175 0 obj << /Type /ObjStm /N 100 -/First 986 -/Length 11860 ->> -stream -2172 0 2173 205 2175 494 2177 715 2134 928 2159 1074 2144 1132 2160 1191 2161 1250 2162 1309 -2163 1368 2164 1427 2165 1486 2166 1545 2167 1603 2155 1662 2168 1721 2156 1779 2186 1974 2191 2131 -2192 2311 2193 2354 2194 2657 2195 2862 2197 3075 2182 3296 2183 3443 2184 3590 2188 3737 2189 3796 -2190 3854 2185 3913 2206 4123 2212 4262 2213 4442 2214 4485 2215 4686 2216 4981 2218 5202 2204 5415 -2208 5561 2201 5619 2209 5678 2202 5736 2210 5795 2205 5853 2225 6007 2229 6146 2230 6326 2232 6369 -2233 6576 2234 6877 2236 7098 2223 7311 2227 7458 2228 7517 2224 7576 2241 7758 2243 7876 2240 7934 -2245 8017 2247 8135 614 8194 2244 8252 2249 8375 2251 8493 618 8551 622 8607 2252 8664 626 8722 -2248 8779 2254 8874 2256 8992 630 9051 634 9109 638 9167 642 9225 646 9283 650 9341 654 9399 -658 9457 2253 9515 2258 9610 2260 9728 662 9786 666 9843 670 9900 674 9957 2257 10014 2263 10109 -2265 10227 2262 10286 2267 10354 2269 10472 2270 10530 2271 10588 2012 10646 958 10703 957 10760 916 10817 -% 2172 0 obj +/First 985 +/Length 11845 +>> +stream +2171 0 2173 43 2174 248 2176 537 2178 758 2135 971 2160 1117 2145 1175 2161 1234 2162 1293 +2163 1352 2164 1411 2165 1470 2166 1529 2167 1588 2168 1646 2156 1705 2169 1764 2157 1822 2187 2017 +2192 2174 2193 2354 2194 2397 2195 2700 2196 2905 2198 3118 2183 3339 2184 3486 2185 3633 2189 3780 +2190 3839 2191 3897 2186 3956 2207 4166 2213 4305 2214 4485 2215 4528 2216 4729 2217 5024 2219 5245 +2205 5458 2209 5604 2202 5662 2210 5721 2203 5779 2211 5838 2206 5896 2226 6050 2230 6189 2231 6369 +2233 6412 2234 6619 2235 6920 2237 7141 2224 7354 2228 7501 2229 7560 2225 7619 2242 7801 2244 7919 +2241 7977 2246 8060 2248 8178 614 8237 2245 8295 2250 8418 2252 8536 618 8594 622 8650 2253 8707 +626 8765 2249 8822 2255 8917 2257 9035 630 9094 634 9152 638 9210 642 9268 646 9326 650 9384 +654 9442 658 9500 2254 9558 2259 9653 2261 9771 662 9829 666 9886 670 9943 674 10000 2258 10057 +2264 10152 2266 10270 2263 10329 2268 10397 2270 10515 2271 10573 2272 10631 2013 10689 958 10746 957 10803 +% 2171 0 obj +<< +/Type /ExtGState +/OPM 1 +>> +% 2173 0 obj << /BaseFont /YAZDUX+TimesNewRomanPSMT -/FontDescriptor 2175 0 R -/ToUnicode 2176 0 R +/FontDescriptor 2176 0 R +/ToUnicode 2177 0 R /Type /Font /FirstChar 48 /LastChar 57 /Widths [ 500 500 500 500 500 0 0 500 500 500] /Subtype /TrueType >> -% 2173 0 obj +% 2174 0 obj << /BaseFont /NDNSMY+FreeSerif -/FontDescriptor 2177 0 R -/ToUnicode 2178 0 R +/FontDescriptor 2178 0 R +/ToUnicode 2179 0 R /Type /Font /FirstChar 32 /LastChar 89 /Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 721 0 0 0 0 0 0 0 0 385 0 0 0 0 0 0 0 667 529 0 0 0 0 0 701] /Subtype /TrueType >> -% 2175 0 obj +% 2176 0 obj << /Type /FontDescriptor /FontName /YAZDUX+TimesNewRomanPSMT @@ -32629,9 +32644,9 @@ stream /ItalicAngle 0 /StemV 95 /MissingWidth 777 -/FontFile2 2179 0 R +/FontFile2 2180 0 R >> -% 2177 0 obj +% 2178 0 obj << /Type /FontDescriptor /FontName /NDNSMY+FreeSerif @@ -32643,9 +32658,9 @@ stream /ItalicAngle 0 /StemV 105 /MissingWidth 600 -/FontFile2 2180 0 R +/FontFile2 2181 0 R >> -% 2134 0 obj +% 2135 0 obj << /Type /Annot /Subtype /Link @@ -32653,104 +32668,104 @@ stream /Rect [384.587 583.767 391.56 595.827] /A << /S /GoTo /D (figure.5) >> >> -% 2159 0 obj -<< -/D [2157 0 R /XYZ 98.895 753.953 null] ->> -% 2144 0 obj +% 2160 0 obj << -/D [2157 0 R /XYZ 389.217 621.446 null] +/D [2158 0 R /XYZ 98.895 753.953 null] >> -% 2160 0 obj +% 2145 0 obj << -/D [2157 0 R /XYZ 114.839 563.747 null] +/D [2158 0 R /XYZ 389.217 621.446 null] >> % 2161 0 obj << -/D [2157 0 R /XYZ 114.839 567.034 null] +/D [2158 0 R /XYZ 114.839 563.747 null] >> % 2162 0 obj << -/D [2157 0 R /XYZ 114.839 556.075 null] +/D [2158 0 R /XYZ 114.839 567.034 null] >> % 2163 0 obj << -/D [2157 0 R /XYZ 114.839 545.116 null] +/D [2158 0 R /XYZ 114.839 556.075 null] >> % 2164 0 obj << -/D [2157 0 R /XYZ 114.839 534.158 null] +/D [2158 0 R /XYZ 114.839 545.116 null] >> % 2165 0 obj << -/D [2157 0 R /XYZ 114.839 523.199 null] +/D [2158 0 R /XYZ 114.839 534.158 null] >> % 2166 0 obj << -/D [2157 0 R /XYZ 114.839 512.24 null] +/D [2158 0 R /XYZ 114.839 523.199 null] >> % 2167 0 obj << -/D [2157 0 R /XYZ 114.839 501.281 null] ->> -% 2155 0 obj -<< -/D [2157 0 R /XYZ 114.839 481.057 null] +/D [2158 0 R /XYZ 114.839 512.24 null] >> % 2168 0 obj << -/D [2157 0 R /XYZ 99.895 294.895 null] +/D [2158 0 R /XYZ 114.839 501.281 null] >> % 2156 0 obj << -/Font << /F84 687 0 R /F75 685 0 R /F233 1044 0 R /F279 1813 0 R /F78 686 0 R /F192 942 0 R /F190 941 0 R /F145 940 0 R >> -/XObject << /Im7 2133 0 R >> +/D [2158 0 R /XYZ 114.839 481.057 null] +>> +% 2169 0 obj +<< +/D [2158 0 R /XYZ 99.895 294.895 null] +>> +% 2157 0 obj +<< +/Font << /F84 687 0 R /F75 685 0 R /F233 1044 0 R /F279 1814 0 R /F78 686 0 R /F192 942 0 R /F190 941 0 R /F145 940 0 R >> +/XObject << /Im7 2134 0 R >> /ProcSet [ /PDF /Text ] >> -% 2186 0 obj +% 2187 0 obj << /Type /Page -/Contents 2187 0 R -/Resources 2185 0 R +/Contents 2188 0 R +/Resources 2186 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2115 0 R -/Annots [ 2182 0 R 2183 0 R 2184 0 R ] +/Parent 2116 0 R +/Annots [ 2183 0 R 2184 0 R 2185 0 R ] >> -% 2191 0 obj +% 2192 0 obj << /Producer (GPL Ghostscript 9.10) /CreationDate (D:20140329133928+01'00') /ModDate (D:20140329133928+01'00') /Creator (cairo 1.13.1 \(http://cairographics.org\)) >> -% 2192 0 obj +% 2193 0 obj << /Type /ExtGState /OPM 1 >> -% 2193 0 obj +% 2194 0 obj << /BaseFont /MCSFLP+FreeSerif -/FontDescriptor 2195 0 R -/ToUnicode 2196 0 R +/FontDescriptor 2196 0 R +/ToUnicode 2197 0 R /Type /Font /FirstChar 32 /LastChar 89 /Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 721 0 670 0 610 564 0 714 0 385 709 0 0 0 724 0 0 667 529 606 0 0 0 0 701] /Subtype /TrueType >> -% 2194 0 obj +% 2195 0 obj << /BaseFont /AJRCAD+TimesNewRomanPSMT -/FontDescriptor 2197 0 R -/ToUnicode 2198 0 R +/FontDescriptor 2198 0 R +/ToUnicode 2199 0 R /Type /Font /FirstChar 48 /LastChar 57 /Widths [ 500 500 500 500 500 0 0 500 500 500] /Subtype /TrueType >> -% 2195 0 obj +% 2196 0 obj << /Type /FontDescriptor /FontName /MCSFLP+FreeSerif @@ -32762,9 +32777,9 @@ stream /ItalicAngle 0 /StemV 105 /MissingWidth 600 -/FontFile2 2199 0 R +/FontFile2 2200 0 R >> -% 2197 0 obj +% 2198 0 obj << /Type /FontDescriptor /FontName /AJRCAD+TimesNewRomanPSMT @@ -32776,9 +32791,9 @@ stream /ItalicAngle 0 /StemV 95 /MissingWidth 777 -/FontFile2 2200 0 R +/FontFile2 2201 0 R >> -% 2182 0 obj +% 2183 0 obj << /Type /Annot /Subtype /Link @@ -32786,7 +32801,7 @@ stream /Rect [453.687 426.731 460.661 438.791] /A << /S /GoTo /D (figure.5) >> >> -% 2183 0 obj +% 2184 0 obj << /Type /Annot /Subtype /Link @@ -32794,7 +32809,7 @@ stream /Rect [354.541 176.362 361.575 188.421] /A << /S /GoTo /D (figure.8) >> >> -% 2184 0 obj +% 2185 0 obj << /Type /Annot /Subtype /Link @@ -32802,68 +32817,68 @@ stream /Rect [487.118 128.475 494.142 140.535] /A << /S /GoTo /D (algocf.2) >> >> -% 2188 0 obj -<< -/D [2186 0 R /XYZ 149.705 753.953 null] ->> % 2189 0 obj << -/D [2186 0 R /XYZ 447.542 464.41 null] +/D [2187 0 R /XYZ 149.705 753.953 null] >> % 2190 0 obj << -/D [2186 0 R /XYZ 150.705 211.214 null] +/D [2187 0 R /XYZ 447.542 464.41 null] >> -% 2185 0 obj +% 2191 0 obj << -/Font << /F84 687 0 R /F78 686 0 R /F192 942 0 R /F145 940 0 R /F233 1044 0 R /F279 1813 0 R /F148 1490 0 R /F190 941 0 R /F75 685 0 R >> -/XObject << /Im8 2181 0 R >> +/D [2187 0 R /XYZ 150.705 211.214 null] +>> +% 2186 0 obj +<< +/Font << /F84 687 0 R /F78 686 0 R /F192 942 0 R /F145 940 0 R /F233 1044 0 R /F279 1814 0 R /F148 1490 0 R /F190 941 0 R /F75 685 0 R >> +/XObject << /Im8 2182 0 R >> /ProcSet [ /PDF /Text ] >> -% 2206 0 obj +% 2207 0 obj << /Type /Page -/Contents 2207 0 R -/Resources 2205 0 R +/Contents 2208 0 R +/Resources 2206 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2211 0 R -/Annots [ 2204 0 R ] +/Parent 2212 0 R +/Annots [ 2205 0 R ] >> -% 2212 0 obj +% 2213 0 obj << /Producer (GPL Ghostscript 9.10) /CreationDate (D:20140329133927+01'00') /ModDate (D:20140329133927+01'00') /Creator (cairo 1.13.1 \(http://cairographics.org\)) >> -% 2213 0 obj +% 2214 0 obj << /Type /ExtGState /OPM 1 >> -% 2214 0 obj +% 2215 0 obj << /BaseFont /BNRUAU+TimesNewRomanPSMT -/FontDescriptor 2216 0 R -/ToUnicode 2217 0 R +/FontDescriptor 2217 0 R +/ToUnicode 2218 0 R /Type /Font /FirstChar 45 /LastChar 55 /Widths [ 333 0 0 500 500 500 0 0 0 0 500] /Subtype /TrueType >> -% 2215 0 obj +% 2216 0 obj << /BaseFont /ICFUKB+FreeSerif -/FontDescriptor 2218 0 R -/ToUnicode 2219 0 R +/FontDescriptor 2219 0 R +/ToUnicode 2220 0 R /Type /Font /FirstChar 32 /LastChar 89 /Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 721 0 0 0 610 564 0 0 0 0 0 0 0 0 724 0 0 667 529 606 0 0 0 0 701] /Subtype /TrueType >> -% 2216 0 obj +% 2217 0 obj << /Type /FontDescriptor /FontName /BNRUAU+TimesNewRomanPSMT @@ -32875,9 +32890,9 @@ stream /ItalicAngle 0 /StemV 95 /MissingWidth 777 -/FontFile2 2220 0 R +/FontFile2 2221 0 R >> -% 2218 0 obj +% 2219 0 obj << /Type /FontDescriptor /FontName /ICFUKB+FreeSerif @@ -32889,9 +32904,9 @@ stream /ItalicAngle 0 /StemV 105 /MissingWidth 600 -/FontFile2 2221 0 R +/FontFile2 2222 0 R >> -% 2204 0 obj +% 2205 0 obj << /Type /Annot /Subtype /Link @@ -32899,76 +32914,76 @@ stream /Rect [371.292 537.01 378.265 549.069] /A << /S /GoTo /D (figure.5) >> >> -% 2208 0 obj +% 2209 0 obj << -/D [2206 0 R /XYZ 98.895 753.953 null] +/D [2207 0 R /XYZ 98.895 753.953 null] >> -% 2201 0 obj +% 2202 0 obj << -/D [2206 0 R /XYZ 396.732 574.688 null] +/D [2207 0 R /XYZ 396.732 574.688 null] >> -% 2209 0 obj +% 2210 0 obj << -/D [2206 0 R /XYZ 99.895 526.012 null] +/D [2207 0 R /XYZ 99.895 526.012 null] >> -% 2202 0 obj +% 2203 0 obj << -/D [2206 0 R /XYZ 114.839 383.469 null] +/D [2207 0 R /XYZ 114.839 383.469 null] >> -% 2210 0 obj +% 2211 0 obj << -/D [2206 0 R /XYZ 99.895 187.185 null] +/D [2207 0 R /XYZ 99.895 187.185 null] >> -% 2205 0 obj +% 2206 0 obj << -/Font << /F84 687 0 R /F145 940 0 R /F233 1044 0 R /F75 685 0 R /F279 1813 0 R >> -/XObject << /Im9 2203 0 R >> +/Font << /F84 687 0 R /F145 940 0 R /F233 1044 0 R /F75 685 0 R /F279 1814 0 R >> +/XObject << /Im9 2204 0 R >> /ProcSet [ /PDF /Text ] >> -% 2225 0 obj +% 2226 0 obj << /Type /Page -/Contents 2226 0 R -/Resources 2224 0 R +/Contents 2227 0 R +/Resources 2225 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2211 0 R -/Annots [ 2223 0 R ] +/Parent 2212 0 R +/Annots [ 2224 0 R ] >> -% 2229 0 obj +% 2230 0 obj << /Producer (GPL Ghostscript 9.10) /CreationDate (D:20140329133928+01'00') /ModDate (D:20140329133928+01'00') /Creator (cairo 1.13.1 \(http://cairographics.org\)) >> -% 2230 0 obj +% 2231 0 obj << /Type /ExtGState /OPM 1 >> -% 2232 0 obj +% 2233 0 obj << /BaseFont /PBIKKX+TimesNewRomanPSMT -/FontDescriptor 2234 0 R -/ToUnicode 2235 0 R +/FontDescriptor 2235 0 R +/ToUnicode 2236 0 R /Type /Font /FirstChar 45 /LastChar 55 /Widths [ 333 0 0 500 500 0 500 500 500 500 500] /Subtype /TrueType >> -% 2233 0 obj +% 2234 0 obj << /BaseFont /ZBHFTP+FreeSerif -/FontDescriptor 2236 0 R -/ToUnicode 2237 0 R +/FontDescriptor 2237 0 R +/ToUnicode 2238 0 R /Type /Font /FirstChar 32 /LastChar 89 /Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 721 0 670 0 610 564 0 714 0 0 709 0 0 0 724 0 0 667 529 606 0 0 0 0 701] /Subtype /TrueType >> -% 2234 0 obj +% 2235 0 obj << /Type /FontDescriptor /FontName /PBIKKX+TimesNewRomanPSMT @@ -32980,9 +32995,9 @@ stream /ItalicAngle 0 /StemV 95 /MissingWidth 777 -/FontFile2 2238 0 R +/FontFile2 2239 0 R >> -% 2236 0 obj +% 2237 0 obj << /Type /FontDescriptor /FontName /ZBHFTP+FreeSerif @@ -32994,9 +33009,9 @@ stream /ItalicAngle 0 /StemV 105 /MissingWidth 600 -/FontFile2 2239 0 R +/FontFile2 2240 0 R >> -% 2223 0 obj +% 2224 0 obj << /Type /Annot /Subtype /Link @@ -33004,230 +33019,226 @@ stream /Rect [440.392 344.666 447.366 356.726] /A << /S /GoTo /D (figure.5) >> >> -% 2227 0 obj +% 2228 0 obj << -/D [2225 0 R /XYZ 149.705 753.953 null] +/D [2226 0 R /XYZ 149.705 753.953 null] >> -% 2228 0 obj +% 2229 0 obj << -/D [2225 0 R /XYZ 447.542 382.345 null] +/D [2226 0 R /XYZ 447.542 382.345 null] >> -% 2224 0 obj +% 2225 0 obj << -/Font << /F84 687 0 R /F145 940 0 R /F78 686 0 R /F75 685 0 R /F192 942 0 R /F233 1044 0 R /F279 1813 0 R >> -/XObject << /Im10 2222 0 R >> +/Font << /F84 687 0 R /F145 940 0 R /F78 686 0 R /F75 685 0 R /F192 942 0 R /F233 1044 0 R /F279 1814 0 R >> +/XObject << /Im10 2223 0 R >> /ProcSet [ /PDF /Text ] >> -% 2241 0 obj +% 2242 0 obj << /Type /Page -/Contents 2242 0 R -/Resources 2240 0 R +/Contents 2243 0 R +/Resources 2241 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2211 0 R +/Parent 2212 0 R >> -% 2243 0 obj +% 2244 0 obj << -/D [2241 0 R /XYZ 98.895 753.953 null] +/D [2242 0 R /XYZ 98.895 753.953 null] >> -% 2240 0 obj +% 2241 0 obj << /Font << /F233 1044 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 2245 0 obj +% 2246 0 obj << /Type /Page -/Contents 2246 0 R -/Resources 2244 0 R +/Contents 2247 0 R +/Resources 2245 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2211 0 R +/Parent 2212 0 R >> -% 2247 0 obj +% 2248 0 obj << -/D [2245 0 R /XYZ 149.705 753.953 null] +/D [2246 0 R /XYZ 149.705 753.953 null] >> % 614 0 obj << -/D [2245 0 R /XYZ 150.705 716.092 null] +/D [2246 0 R /XYZ 150.705 716.092 null] >> -% 2244 0 obj +% 2245 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F233 1044 0 R /F145 940 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 2249 0 obj +% 2250 0 obj << /Type /Page -/Contents 2250 0 R -/Resources 2248 0 R +/Contents 2251 0 R +/Resources 2249 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2211 0 R +/Parent 2212 0 R >> -% 2251 0 obj +% 2252 0 obj << -/D [2249 0 R /XYZ 98.895 753.953 null] +/D [2250 0 R /XYZ 98.895 753.953 null] >> % 618 0 obj << -/D [2249 0 R /XYZ 99.895 554.06 null] +/D [2250 0 R /XYZ 99.895 554.06 null] >> % 622 0 obj << -/D [2249 0 R /XYZ 99.895 527.944 null] +/D [2250 0 R /XYZ 99.895 527.944 null] >> -% 2252 0 obj +% 2253 0 obj << -/D [2249 0 R /XYZ 99.895 315.727 null] +/D [2250 0 R /XYZ 99.895 315.727 null] >> % 626 0 obj << -/D [2249 0 R /XYZ 99.895 284.171 null] +/D [2250 0 R /XYZ 99.895 284.171 null] >> -% 2248 0 obj +% 2249 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> /ProcSet [ /PDF /Text ] >> -% 2254 0 obj +% 2255 0 obj << /Type /Page -/Contents 2255 0 R -/Resources 2253 0 R +/Contents 2256 0 R +/Resources 2254 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2211 0 R +/Parent 2212 0 R >> -% 2256 0 obj +% 2257 0 obj << -/D [2254 0 R /XYZ 149.705 753.953 null] +/D [2255 0 R /XYZ 149.705 753.953 null] >> % 630 0 obj << -/D [2254 0 R /XYZ 150.705 720.077 null] +/D [2255 0 R /XYZ 150.705 720.077 null] >> % 634 0 obj << -/D [2254 0 R /XYZ 150.705 633.991 null] +/D [2255 0 R /XYZ 150.705 633.991 null] >> % 638 0 obj << -/D [2254 0 R /XYZ 150.705 559.861 null] +/D [2255 0 R /XYZ 150.705 559.861 null] >> % 642 0 obj << -/D [2254 0 R /XYZ 150.705 485.732 null] +/D [2255 0 R /XYZ 150.705 485.732 null] >> % 646 0 obj << -/D [2254 0 R /XYZ 150.705 411.602 null] +/D [2255 0 R /XYZ 150.705 411.602 null] >> % 650 0 obj << -/D [2254 0 R /XYZ 150.705 325.516 null] +/D [2255 0 R /XYZ 150.705 325.516 null] >> % 654 0 obj << -/D [2254 0 R /XYZ 150.705 251.386 null] +/D [2255 0 R /XYZ 150.705 251.386 null] >> % 658 0 obj << -/D [2254 0 R /XYZ 150.705 177.256 null] +/D [2255 0 R /XYZ 150.705 177.256 null] >> -% 2253 0 obj +% 2254 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 2258 0 obj +% 2259 0 obj << /Type /Page -/Contents 2259 0 R -/Resources 2257 0 R +/Contents 2260 0 R +/Resources 2258 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2261 0 R +/Parent 2262 0 R >> -% 2260 0 obj +% 2261 0 obj << -/D [2258 0 R /XYZ 98.895 753.953 null] +/D [2259 0 R /XYZ 98.895 753.953 null] >> % 662 0 obj << -/D [2258 0 R /XYZ 99.895 720.077 null] +/D [2259 0 R /XYZ 99.895 720.077 null] >> % 666 0 obj << -/D [2258 0 R /XYZ 99.895 650.062 null] +/D [2259 0 R /XYZ 99.895 650.062 null] >> % 670 0 obj << -/D [2258 0 R /XYZ 99.895 580.047 null] +/D [2259 0 R /XYZ 99.895 580.047 null] >> % 674 0 obj << -/D [2258 0 R /XYZ 99.895 510.033 null] +/D [2259 0 R /XYZ 99.895 510.033 null] >> -% 2257 0 obj +% 2258 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 2263 0 obj +% 2264 0 obj << /Type /Page -/Contents 2264 0 R -/Resources 2262 0 R +/Contents 2265 0 R +/Resources 2263 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2261 0 R +/Parent 2262 0 R >> -% 2265 0 obj +% 2266 0 obj << -/D [2263 0 R /XYZ 149.705 753.953 null] +/D [2264 0 R /XYZ 149.705 753.953 null] >> -% 2262 0 obj +% 2263 0 obj << /Font << /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 2267 0 obj +% 2268 0 obj << /Type /Page -/Contents 2268 0 R -/Resources 2266 0 R +/Contents 2269 0 R +/Resources 2267 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2261 0 R ->> -% 2269 0 obj -<< -/D [2267 0 R /XYZ 98.895 753.953 null] +/Parent 2262 0 R >> % 2270 0 obj << -/D [2267 0 R /XYZ 99.895 723.717 null] +/D [2268 0 R /XYZ 98.895 753.953 null] >> % 2271 0 obj << -/D [2267 0 R /XYZ 99.895 698.792 null] +/D [2268 0 R /XYZ 99.895 723.717 null] >> -% 2012 0 obj +% 2272 0 obj << -/D [2267 0 R /XYZ 99.895 638.64 null] +/D [2268 0 R /XYZ 99.895 698.792 null] >> -% 958 0 obj +% 2013 0 obj << -/D [2267 0 R /XYZ 99.895 595.644 null] +/D [2268 0 R /XYZ 99.895 638.64 null] >> -% 957 0 obj +% 958 0 obj << -/D [2267 0 R /XYZ 99.895 538.043 null] +/D [2268 0 R /XYZ 99.895 595.644 null] >> -% 916 0 obj +% 957 0 obj << -/D [2267 0 R /XYZ 99.895 477.792 null] +/D [2268 0 R /XYZ 99.895 538.043 null] >> endstream endobj -2277 0 obj +2278 0 obj << /Length 6164 >> @@ -33290,7 +33301,7 @@ ET endstream endobj -2295 0 obj +2296 0 obj << /Length1 1383 /Length2 5908 @@ -33361,7 +33372,7 @@ W ò6S&ªå_!“½SÎ|esU›FÌR™y† ¢Y‹¥ýžï­§N endstream endobj -2297 0 obj +2298 0 obj << /Length1 1956 /Length2 7144 @@ -33478,7 +33489,7 @@ _g\e+J`Ú¼u F½Aa´´ÿ.P’gvŸþì˜Çaósl ø¯ZBh·õ´gæÇ –Wµ Û-‹BѶ”N˜°ŠÜhú`˨[ÉW÷jßí)qˆ(µÎãÓÌý÷ÍŒþð.wYÕæ‹$ÞQ¬ÿ0±€®Ñ]Šü endstream endobj -2299 0 obj +2300 0 obj << /Length1 1442 /Length2 6151 @@ -33556,7 +33567,7 @@ n^ r sb¢VØb)l 2ÅþSŠ„T£­H+PMzjÔîëzËiÍfí$ŽDáŒMkV©° Ã?ã\Ù¼Ä>ެ߈ƶa¹<¡ÈèEE£ÜL½¦D…¯6=t¯–EÒ÷µ€ðàÀ.…(Á%FoÜ~­´ô6€rý¦\l•ù;séñ'$Öµ…ïß>ž4¹ÿr$ï2¨DZý~*®\R ù·Yi$=Þ¡¥k‡å'¯Öå“™úý.m…6¯Â–„tY0’O$ð)ºQñ’ršÈUQ…»+¶ßªúÔ4(¨«,‡°Qb8¬—mÓ©qý±âÀÁÝHä°=‘œ,YŠ8i  ÿ‡½ª”SZ6Žöã½mØ@ˆ»`é7~â"L7\ã¹ßFdN#FþýHR´K´KHpb40 2ÂÚ~HÇKε֊úøX endstream endobj -2301 0 obj +2302 0 obj << /Length1 1478 /Length2 6403 @@ -33637,7 +33648,7 @@ O GÁ0ÿÑûòÿ¦œÿ+B°¸+›æ¸žb¥qGYÀðitâLxRIPv®Õ½·hÎÄÓÔ¥ºÒÏ‹^ž½:nwåòœÕp5¿Ð>^؉R¥Þä}ð4ü¸¿Œò™áùÞaŒgül}×^™(©t7ƒaÝÔ &ó½¶)±ZS«ˆ‘ ”¾8ÿn}@f0;­b.Û£ELì›7†%·¹›3Cª,ò@ä7¹Õï[I [1sI¬îÅXÚ<Æü[›fÜŒ¹¶Ýa¯:?yºÈç3"èu/'Ø\Ödñ ÁDÓ¹Ú=»qUü êškóκùH‚â$ y§ïQ7¼plŽ*žmhS]ADäÛäøù5Îã½üÆ«ü‹79µ endstream endobj -2303 0 obj +2304 0 obj << /Length1 1688 /Length2 8444 @@ -33728,7 +33739,7 @@ p bŠ|Ü<dF.ÊÂÃOü¶½£æ[–ßÈÝv°ó¿ö±O¨hgÃy‡Qì®—»å¶ ‘«h›0}¦ª»½˜Üõ,ïåè:Õ(Ñ–~¨–À–’6uü‹mXóR·VÃ<‡­Ð³JVíM\Fw%T6VÍvýÑQnéϨÿ¦:Ï M¤\Ú…Uá-:φ57M}ÎÞ!ãZ‘D ês‰ ç {$Qû0Ý„në®êÓ Ê(ãN3°Þ[( ½¶?™ÓŒoÜî9T½”ÒuæÒ«6nÀu÷ðD!qáíZ”ÞU›·ÍÜT”!pÚ¹VØžïó‡/…È\ýh^‡:ñ'.AµEõ¾S‹6P*BËY‹LŸ endstream endobj -2305 0 obj +2306 0 obj << /Length1 2571 /Length2 18274 @@ -33918,7 +33929,7 @@ bvT ­¬Ì$LŽ`u\$ÿyýƒ îË63rŒa ù*}L¬ÿOƒþ­Nûšâ°Vz`NÁ~©âÖüËïþD|°ˆÏ!5…çÆkW· Îï¯ËÅ[uõ 1HÉ6ÅGÍ y‚ÀDÐûW…ÔC˜¿•%‹Ò¸Vî96ºkœ>lLtÆgÑ)d:ã|Ù\Ž,?†ÅÙ¾¦d”5·ÖŒ‘ì¡âØ#2}‰Äñ‘«Ã™ >>©™–Ay÷r5dý>>Ç:Xqa¿ÓÙ x^åJÓ^a”Õ ÀÝ2PA¡½Îk@¨AP£íÓ~<¢GÇ€w*ßjRr… (Þbí]4²2æa´<¡ï‰ö‚kdù©#YtuÎdW'*Õ³C+%˜ 9vȽâðq endstream endobj -2307 0 obj +2308 0 obj << /Length1 1509 /Length2 2696 @@ -33980,7 +33991,7 @@ currentfile eexec ¢½›ß½€eдË*›¹¡Å×KÀËHªX3.Óg 2L9tžèbMµ$ÿx*Ý™4$R=å Þ+JUùCwŠe–䡞±…›-%þe)ê³Óƒ¼Ö\™MS{Æ•Këž³.œ endstream endobj -2309 0 obj +2310 0 obj << /Length1 2495 /Length2 16116 @@ -34167,12 +34178,12 @@ uÖ‚ }ã´ûKç+ÑàôÎïÈL5XáçB´Æ`{˜PØžFR/´e¦•{›ùÉþ¿xì³If!«ÐÞdå˜w!q>)ο ç«׫ÍélÞV•]˜$>Øð€Om•Å€„”œKé1îy®ïà^ÑŸ= ˜"YkèK‡ÇÉÜgt¼[1à6eà´§p[hNc¾}]Û#Ü^ékNoʼm, ±5u£‰‘yéá<Õnå•TA³t<Íw£&+•5O–y[šì÷N„þ[ªP±+J ã$ìiÙ/×%”ÖˆÞHEPBÓaÓÒàz`~-Âôa+Õ¸wi W€´êÔ=ÞþYÝÃÊÿ%àb-ÈòÐÈSQ­=SVuIwï®–¥H°¸CÒ8ûq—-º£ ©›¨íW£‰R͢ݼ?ÎÎïÒ‰G¼»g5…áá)Ó9 P9©_öQ‰+Ë[nÒÞð‘k¡ð#ß%J!³„zùŽø6:ÈLÑiÑ)Yð´™exR4ëÌ©b&Œø-Àé¸Îä˜bŸ©³Ï e’ðNæb³x+’ÎÔ‚>êxró}Ô„%öˆSx#«ÆóìðáÀ¼àÔ\/¸aĬ1^BIOÿÌ…Ô•x_å<=rãÔTi¤º½Ôø_ƒä­[›ÖÉ-W¿õ…&íg!zÂ{N•i×%’3s|刽¨’66gú಑do–D»¹^-@AæJ–ðHSPºHSä[N¥©:ORØ~\¨·bj–•1 ãæp endstream endobj -2311 0 obj +2312 0 obj << -/Length1 1173 -/Length2 2916 +/Length1 1191 +/Length2 3225 /Length3 0 -/Length 4089 +/Length 4416 >> stream %!PS-AdobeFont-1.0: PazoMath 001.003 @@ -34191,9 +34202,10 @@ stream /UnderlineThickness 50 def /Weight (Regular) readonly def end readonly def -/FontName /IKXQUG+PazoMath def +/FontName /ZSBXRF+PazoMath def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for +dup 87 /Omega put dup 165 /infinity put dup 229 /summation put readonly def @@ -34207,15 +34219,12 @@ currentfile eexec nƒAŽYXÖþUÙ1ñ2¨×èèÒrÕrúE^Oy¤"â;ôDmÒà{O0Ò {2ÆR¿BÊi³¯N´íÌMÃýÙöéufû–L´”o¬ñ¹nõÛâ>å‘Gl»_ëí1¶#<ðW”\’ŽïJºÄaâ½æ„_«òF˜bÁ†ŠÆ~˜ ”M÷PsRƒî“ÛŬK5B|«BuG‰ÓŒ8öer(ßVΫ0¶\òFÌ+£S“hdr=ÊéÊVd^ RUl^›0ŒpEÉTXÛ½‡Ç›í—ë]Æ%’ÁÒ[õ”áT8ݯœû%²Uæ~ë½25ƒì£‡µK÷±;¯Fª<´FS$ÆÕû²9dwY€-u&‡i$ªò¼(O´fvdz¦‹ hº¾Ó¹ s;¯“Ï‘èB]¢rø„£œ* 3Ü”™ Ãæ_&+Æ ÿªñ‹œÍ4‡ôÇ9¡Ï^WJ òÐlÆ.ņä»Y¹~^à³¾¨“òXq¹=ÂË;agâ £CgïÏÃÄ _%‰Æ˜¾JéD­í>‘ÚYÎ> Ø‹’¢á½næ×¯ ,G#¢Ä²›‹5À.êFŒE)a"™¬²ó p‘˜ßqÖo-Ù4Ï`7µò}§Óº¤WÌt_ceuÅÐóJŒ—h>ËÌÿÍú¸µ>Wþ¾ªÎ! ôA5j¾-±v`òç-Š?R ïtl.ƒe)öµ1=Ìï–kdSã¤iõä!5Ëþ_lŒœ<Ÿ ô—²ß-^ó­ª+éÍš‘Žôùbøîƒ™ÞŽçÞ©ÈÜ–™nWÿ%yïg§õ͚™ý÷3¡N>âVpä9ÿeŠ.•¯oÀÖÛv’£ˆóý“€hÓ; ÂÍ‹ ÀfW´\¹ü^yÑ_øÜ“±š¢'Úî1︖œø]c¨*Îç–" Õ磺û©@A.Øê’æXïècǽD&Ê<¼r”—kö¢ ¾Õ|lØ\†Ù·[ne_@úÄ_TkϺ©åhô´.5G´ ô­­†ï[î‚\?… nä½;göƒà¦ŸÌ’\]%»ÐAí¥ÝVY 3ã”è×?¼ ³ßMhš•L”I•*nÁFçÕqÄ™ñu §Šeñ÷~ÈÀA‚õE Q€P+%[sÖÐVÔÓ$—G… YRœ}aâÕÉèüHງ´×÷õÃPœ  Ð1t'yˆwBî`©Ö~›× -‹å$óe1cww9üBî6$Ê—T͍³;ÀZæ (4¤9g»ð6Èv¡¡f«´§æ4J Ÿ¿¨]5(§™Wð ø„šs¹Ô˜tàaȳÅ<[Eެp­üT˧Uü¥!µ”JtОÄò ©ýª?,–ÎL?!w ˜×ÃçsŸðg0Môh¾BÅ1êä³Í$sÉyѼÏåÐÛç8G•º“Š(ûûbÏí>z¨uݬ£ÿ­·¾‡Do­eHÐòñz)Ž^0 -9JžÒW –©fÅ'ÈUâ€ÀIõ•c‡‡eiÒä+¡5¦¤ÄH,ârø73g0Ÿ3{#Y°«ò_‰E^n2ÖÝ¥»„ þš®Á¿xdR$;‡ž9ÎÒÌ(ìúû·ŒfôñÂ÷n*±Ï×eHýc¸«AóìI…#†y`©û÷µ%,tÅ¢\µ ì)ÿ_ãV£+µó7À\öMþ7AÙ4R‚ã"З…@ðOÉ!1í$¥¯*ϤóÐŒsp%>*¿È–, QÄíŸÉ¥H;ºEÖ×Ùº~b@Ž—näÿ¦ sשÌXZðÛ–…ì+ ”¥ì, -ƒy¡¯#ö/–!A¨§L‹9¦Ú8üøž¢¼üT»a/±äe£T´,‰ut/u¼¶ÀÌî6ü~¯® áº1ûQAÔ‚\ñSøâWä{N?2¤±â/ïóG½?ÚÆE£æ« 8¼Ó®chbK3¿qí$£þ;+^ÇB(ƒñ¬¼¨xšà¸‰k‹:wMá…XÕ,³Óƒ~õ‚Rçÿþ[&¡òh¬8AµS #L'ɧÑT‘p¤®ú#{Ûª½¹>É;+â­¼’MÞuU§”‰[¡ä˜%Vû0ºEÄ—‚Ù²ˆC9Ø…ÀS©×Èu^sIÓ2\ØþÄï’¢ÒÊÍ. ->Íj5ÃxBÄ’Úª]˸fóŠâ*Á÷‡g|Üšx*c·fr+µB!ÔÃH9Râ€2Hî4^ÁEìdöãöÄ>>ž›J1öu£¬•z¹&¿ÐMLLœ÷i¸Úo™Jè$!¸ótîFoµÜ¸§_µO>yù,ÞªôÎ+ø±#îD‰ Ùqµø¾ýWô2³û  tE"Q×IŸÕ…À§Ø.e]‚Çùl wÙú,•Ó*¡"ŒœMf]­—ÍÆàiðñ/FSóê‚’.÷ìsãç_.nÁ1 àÕ/€ßâ8,‰}̨ó ÍÊçðW˜“‹‡ HFPšsµWkn3‰áa¸9`6I¼åŒùÿ݉Wi¦>|ä =ÔÙÙ1u¬Åª4ÿ¤ÅÔ…X·’HAH -ƒ$ü-UÒÛÊ3¤³# +‹å$óe1cww9üBî6$Ê—T͍³;ÀZæ (4¤9g»ð6Èv¡¡f«´§æ4J Ÿ¿¨]5(§™Wð ø„šs¹Ô˜tàaȳÅ<[Eެp­üT˧Uü¥!µ”JtОÄò ©ýª?,–ÎL?!w ˜×ÃçsŸðg0Mð7ßsHš|ì’Пdª«Ž dQò®¯ü±ï<š¼=BRêCé¬ïÁ­ ¢ê)öðôìÔù-a_GüΜ>sÜæA–ªÔjSæv$Cä Õ/ð` JO±.Öü«Ù*šN¶ËVhNƒ2ò5OðøC sŒ¤‰ZSÉ^Ôvu¦„žì48¡,Ž6Vl°Šð¿ò:š„0]æœ)¡hT‘ÇQkó¡ï»ÕŽïѲ¦A‚þâ8ËÜT:XJâ+·;ÛÎú ˜!Œ ^˜PkÊý$8ÌÁ•;xçÙÔ1¡µ Js¯JƒÇçç/(^þ0¼Fû/ NaÖ+õJœ§„µ:׊ŠoµXÁç”ü»Ò{ÜÈ3aµ8¬¾ˆhÌ&=“ýQ ïд‚~ô¿ Ë[pî‡ÖsŸ!c yÞ<“j\Q­µY[3:ÈìJBÆÍ˜¡ó  k0p iÍÜAmË/ëVHšê¶Tõs7ÚÍ%ª­‚y»ÄüÓµÛ7ˆ çpžg,陸Ä"µÅBWÆe‚™~‚Aaóö¾iÄCŽÚ1æÌL;01 O×$ƒÝŽâ'’`–ñeú·UÚµ×%çø÷ï…I`ÊÝqv rűX¤ +dÙ|F-,ÓgOr ÁZ­—c¤…º?º£!Ån%„ÎÆLLvœ–Üc<˜ó¿ûŽ„Ÿuך ~ˆ+ýÞ mí(å3’è àöÄ—’AáØþV±= •×ñ)€So+ËÅ  ôé«"²»¯ÕƒXŸaO"€¼?¾üçe5|Ü;rîÉð´7‡Ä:ydLXÕïPºd£iÁÝ®Éõñ.YœOT¤ÿND˜’ÙÆÒA±¼…ì'V:XDýk–o½tãq÷6F¯…ÃÀÈP=±n2Úà-š04ycÑÓîXEc‘vÿ=dTO“ª»œ›·$p“ÿ¾‰$”^¬úêkH\ uÂÚã*ŸeÎ ¥[%쿲Øà8ÊFA|•–9̸ûÀ¡É¨gß'FÏ}Ö•“‰!“µp¤.ùªEúõ P’ov®>ÕªI8©3!ÕÜ/ª˜ JÝÚ?|iî$dØ_ìñ(°/;Åb÷üÒ49Ãï•Û%X¾eÊal¥Øw픋v_Õ̹ûœ@dr®Ëp.álä§<çêÉJt~½ŸM«÷[£†yœ ä™û3¹î[Î{ endstream endobj -2315 0 obj +2316 0 obj << /Length1 1614 /Length2 22531 @@ -34384,7 +34393,7 @@ s ÿK=ö² ’á(ÛHfUïÎãrÒø¾IQ$W0LÇòÅÕµ8ŽÅX‘k¯ß‰ô¹­JÏMÐz{äPãÀ÷–¢Ô“‹¾>$ yò§ÑéÚ"Éjrº½¾‹Xf¯yÓLEœtnÖy“ÉŽœ‰ö•ƒQ]Ex.ò¢B‚…;®úˆ[„çðÂXánÍUîOýÅ›1Nd É¸&÷ïÎŒþ endstream endobj -2317 0 obj +2318 0 obj << /Length1 1616 /Length2 24418 @@ -34509,7 +34518,7 @@ c51 AÌø2C0ˆ¯5§Œƒñ¸ûoÔ]}‰I(&*㤠½;Ã@ar½’§×@ ž\-@óˆ…Ô|†5J¾ÏZ¬¬Ò¿ÖTÛÆâ¼ .áç1åT–€"aõJk:‘¹bÄ–D»| endstream endobj -2319 0 obj +2320 0 obj << /Length1 1620 /Length2 18334 @@ -34618,7 +34627,7 @@ Gɽ Ï¿([‘ç[·º tŸz|' oÒUc×yrH¯+ÍÝ(m§‚ 8Áýµ$#%¼°¢ûÕ endstream endobj -2321 0 obj +2322 0 obj << /Length 1007 >> @@ -34688,7 +34697,7 @@ end endstream endobj -2322 0 obj +2323 0 obj << /Length 1577 >> @@ -34803,7 +34812,7 @@ end endstream endobj -2323 0 obj +2324 0 obj << /Length 1535 >> @@ -34909,7 +34918,7 @@ end endstream endobj -2324 0 obj +2325 0 obj << /Length 1724 >> @@ -35032,7 +35041,7 @@ end endstream endobj -2325 0 obj +2326 0 obj << /Length 2050 >> @@ -35178,7 +35187,7 @@ end endstream endobj -2326 0 obj +2327 0 obj << /Length 1543 >> @@ -35291,7 +35300,7 @@ end endstream endobj -2327 0 obj +2328 0 obj << /Length 1538 >> @@ -35404,7 +35413,7 @@ end endstream endobj -2328 0 obj +2329 0 obj << /Length 1538 >> @@ -35517,7 +35526,7 @@ end endstream endobj -2329 0 obj +2330 0 obj << /Length 853 >> @@ -35575,7 +35584,7 @@ end endstream endobj -2330 0 obj +2331 0 obj << /Length 1113 >> @@ -35653,7 +35662,7 @@ end endstream endobj -2331 0 obj +2332 0 obj << /Length 1477 >> @@ -35756,7 +35765,7 @@ end endstream endobj -2332 0 obj +2333 0 obj << /Length 1477 >> @@ -35859,7 +35868,7 @@ end endstream endobj -2333 0 obj +2334 0 obj << /Length 1482 >> @@ -35962,149 +35971,153 @@ end endstream endobj -2274 0 obj +2275 0 obj << /Type /ObjStm /N 100 -/First 1012 -/Length 18437 ->> -stream -917 0 933 57 913 114 914 170 2272 227 909 285 2273 342 2266 400 2276 494 2278 612 -1074 671 945 730 915 788 912 846 908 904 2142 962 911 1021 2279 1079 910 1138 2127 1195 -2128 1254 2280 1313 2275 1372 2281 1467 2282 1487 2283 1858 2284 1961 2285 2120 2286 2143 2287 2598 -2288 2727 2289 3025 2290 3671 2292 4142 2293 4773 2294 5244 2296 5819 2298 6044 2300 6376 2302 6620 -2304 6891 2306 7239 2308 7745 2310 7979 2312 8453 2314 8679 2316 8910 2318 9389 2320 9965 2291 10383 -1882 10824 1813 10987 1490 11150 942 11311 941 11470 940 11630 1000 11791 1044 11952 1285 12113 1157 12278 -685 12448 687 12638 686 12828 688 13018 894 13131 978 13244 1052 13361 1087 13481 1117 13601 1158 13721 -1205 13841 1244 13961 1300 14081 1351 14201 1400 14321 1457 14441 1492 14561 1534 14681 1577 14801 1626 14921 -1663 15041 1698 15161 1739 15281 1780 15401 1805 15521 1841 15641 1875 15761 1914 15881 1952 16001 1989 16121 -2034 16241 2070 16361 2115 16481 2211 16601 2261 16721 2334 16823 2335 16941 2336 17062 2337 17183 2338 17304 +/First 1011 +/Length 18541 +>> +stream +916 0 917 57 933 114 913 171 914 227 2273 284 909 342 2274 399 2267 457 2277 551 +2279 669 1074 728 945 787 915 845 912 903 908 961 2143 1019 911 1078 2280 1136 910 1195 +2128 1252 2129 1311 2281 1370 2276 1429 2282 1524 2283 1544 2284 1915 2285 2018 2286 2341 2287 2364 +2288 2819 2289 2948 2290 3246 2291 3892 2293 4363 2294 4994 2295 5465 2297 6040 2299 6265 2301 6597 +2303 6841 2305 7112 2307 7460 2309 7966 2311 8200 2313 8674 2315 8906 2317 9137 2319 9616 2321 10192 +2292 10610 1883 11051 1814 11214 1490 11377 942 11538 941 11697 940 11857 1000 12018 1044 12179 1285 12340 +1157 12504 685 12674 687 12864 686 13054 688 13244 894 13357 978 13470 1052 13587 1087 13707 1117 13827 +1158 13947 1205 14067 1244 14187 1300 14307 1351 14427 1400 14547 1457 14667 1492 14787 1534 14907 1577 15027 +1626 15147 1663 15267 1698 15387 1739 15507 1781 15627 1806 15747 1842 15867 1876 15987 1915 16107 1953 16227 +1990 16347 2035 16467 2071 16587 2116 16707 2212 16827 2262 16947 2335 17049 2336 17167 2337 17288 2338 17409 +% 916 0 obj +<< +/D [2268 0 R /XYZ 99.895 477.792 null] +>> % 917 0 obj << -/D [2267 0 R /XYZ 99.895 433.422 null] +/D [2268 0 R /XYZ 99.895 433.422 null] >> % 933 0 obj << -/D [2267 0 R /XYZ 99.895 398.456 null] +/D [2268 0 R /XYZ 99.895 398.456 null] >> % 913 0 obj << -/D [2267 0 R /XYZ 99.895 352.81 null] +/D [2268 0 R /XYZ 99.895 352.81 null] >> % 914 0 obj << -/D [2267 0 R /XYZ 99.895 307.164 null] +/D [2268 0 R /XYZ 99.895 307.164 null] >> -% 2272 0 obj +% 2273 0 obj << -/D [2267 0 R /XYZ 99.895 261.519 null] +/D [2268 0 R /XYZ 99.895 261.519 null] >> % 909 0 obj << -/D [2267 0 R /XYZ 99.895 215.873 null] +/D [2268 0 R /XYZ 99.895 215.873 null] >> -% 2273 0 obj +% 2274 0 obj << -/D [2267 0 R /XYZ 99.895 170.895 null] +/D [2268 0 R /XYZ 99.895 170.895 null] >> -% 2266 0 obj +% 2267 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 2276 0 obj +% 2277 0 obj << /Type /Page -/Contents 2277 0 R -/Resources 2275 0 R +/Contents 2278 0 R +/Resources 2276 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2261 0 R +/Parent 2262 0 R >> -% 2278 0 obj +% 2279 0 obj << -/D [2276 0 R /XYZ 149.705 753.953 null] +/D [2277 0 R /XYZ 149.705 753.953 null] >> % 1074 0 obj << -/D [2276 0 R /XYZ 150.705 716.092 null] +/D [2277 0 R /XYZ 150.705 716.092 null] >> % 945 0 obj << -/D [2276 0 R /XYZ 150.705 687.379 null] +/D [2277 0 R /XYZ 150.705 687.379 null] >> % 915 0 obj << -/D [2276 0 R /XYZ 150.705 632.184 null] +/D [2277 0 R /XYZ 150.705 632.184 null] >> % 912 0 obj << -/D [2276 0 R /XYZ 150.705 590.403 null] +/D [2277 0 R /XYZ 150.705 590.403 null] >> % 908 0 obj << -/D [2276 0 R /XYZ 150.705 545.192 null] +/D [2277 0 R /XYZ 150.705 545.192 null] >> -% 2142 0 obj +% 2143 0 obj << -/D [2276 0 R /XYZ 150.705 512.037 null] +/D [2277 0 R /XYZ 150.705 512.037 null] >> % 911 0 obj << -/D [2276 0 R /XYZ 150.705 480.156 null] +/D [2277 0 R /XYZ 150.705 480.156 null] >> -% 2279 0 obj +% 2280 0 obj << -/D [2276 0 R /XYZ 150.705 448.276 null] +/D [2277 0 R /XYZ 150.705 448.276 null] >> % 910 0 obj << -/D [2276 0 R /XYZ 150.705 407.09 null] +/D [2277 0 R /XYZ 150.705 407.09 null] >> -% 2127 0 obj +% 2128 0 obj << -/D [2276 0 R /XYZ 150.705 348.649 null] +/D [2277 0 R /XYZ 150.705 348.649 null] >> -% 2128 0 obj +% 2129 0 obj << -/D [2276 0 R /XYZ 150.705 304.874 null] +/D [2277 0 R /XYZ 150.705 304.874 null] >> -% 2280 0 obj +% 2281 0 obj << -/D [2276 0 R /XYZ 150.705 260.978 null] +/D [2277 0 R /XYZ 150.705 260.978 null] >> -% 2275 0 obj +% 2276 0 obj << /Font << /F84 687 0 R /F78 686 0 R /F145 940 0 R >> /ProcSet [ /PDF /Text ] >> -% 2281 0 obj -[1000] % 2282 0 obj -[525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] +[1000] % 2283 0 obj -[277.8 277.8 500 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 777.8 500 777.8] +[525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] % 2284 0 obj -[853 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 666 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 747 0 0 0 0 0 0 0 0 0 0 0 0 0 0 881 0 0 0 0 0 0 0 0 0 0 0 0 234 0 881 767] +[277.8 277.8 500 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 777.8 500 777.8] % 2285 0 obj -[528 542] +[831 660 753 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 0 0 853 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 666 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 747 0 0 0 0 0 0 0 0 0 0 0 0 0 0 881 0 0 0 0 0 0 0 0 0 0 0 0 234 0 881 767] % 2286 0 obj -[525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] +[528 542] % 2287 0 obj -[531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3] +[525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] % 2288 0 obj -[388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8] +[531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3] % 2289 0 obj -[777.8 277.8 777.8 500 777.8 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 500 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 1000 777.8 777.8 1000 1000 500 500 1000 1000 1000 777.8 1000 1000 611.1 611.1 1000 1000 1000 777.8 275 1000 666.7 666.7 888.9 888.9 0 0 555.6 555.6 666.7 500 722.2 722.2 777.8 777.8 611.1 798.5 656.8 526.5 771.4 527.8 718.7 594.9 844.5 544.5 677.8 761.9 689.7 1200.9 820.5 796.1 695.6 816.7 847.5 605.6 544.6 625.8 612.8 987.8 713.3 668.3 724.7 666.7 666.7 666.7 666.7 666.7 611.1 611.1 444.4 444.4 444.4 444.4 500 500 388.9 388.9 277.8 500 500 611.1 500 277.8 833.3] +[388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8] % 2290 0 obj +[777.8 277.8 777.8 500 777.8 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 500 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 1000 777.8 777.8 1000 1000 500 500 1000 1000 1000 777.8 1000 1000 611.1 611.1 1000 1000 1000 777.8 275 1000 666.7 666.7 888.9 888.9 0 0 555.6 555.6 666.7 500 722.2 722.2 777.8 777.8 611.1 798.5 656.8 526.5 771.4 527.8 718.7 594.9 844.5 544.5 677.8 761.9 689.7 1200.9 820.5 796.1 695.6 816.7 847.5 605.6 544.6 625.8 612.8 987.8 713.3 668.3 724.7 666.7 666.7 666.7 666.7 666.7 611.1 611.1 444.4 444.4 444.4 444.4 500 500 388.9 388.9 277.8 500 500 611.1 500 277.8 833.3] +% 2291 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] -% 2292 0 obj -[605 608 167 380 611 291 313 333 0 333 606 0 667 500 333 287 0 0 0 0 0 0 0 0 0 0 0 0 333 208 250 278 371 500 500 840 778 278 333 333 389 606 250 333 250 606 500 500 500 500 500 500 500 500 500 500 250 250 606 606 606 444 747 778 611 709 774 611 556 763 832 337 333 726 611 946 831 786 604 786 668 525 613 778 722 1000 667 667 667 333 606 333 606 500 278 500 553 444 611 479 333 556 582 291 234 556 291 883 582 546 601 560 395 424 326 603 565 834 516 556 500 333 606 333 606 0 0 0 278 500 500 1000 500 500 333 1144 525 331 998 0 0 0 0 0 0 500 500 606 500 1000 333 979 424 331 827 0 0 667 0 278 500 500 500 500 606 500] % 2293 0 obj -[528 545 167 333 556 278 333 333 0 333 606 0 667 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 333 250 333 500 500 500 889 778 278 333 333 389 606 250 333 250 296 500 500 500 500 500 500 500 500 500 500 250 250 606 606 606 500 747 722 611 667 778 611 556 722 778 333 333 667 556 944 778 778 611 778 667 556 611 778 722 944 722 667 667 333 606 333 606 500 278 444 463 407 500 389 278 500 500 278 278 444 278 778 556 444 500 463 389 389 333 556 500 722 500 500 444] +[605 608 167 380 611 291 313 333 0 333 606 0 667 500 333 287 0 0 0 0 0 0 0 0 0 0 0 0 333 208 250 278 371 500 500 840 778 278 333 333 389 606 250 333 250 606 500 500 500 500 500 500 500 500 500 500 250 250 606 606 606 444 747 778 611 709 774 611 556 763 832 337 333 726 611 946 831 786 604 786 668 525 613 778 722 1000 667 667 667 333 606 333 606 500 278 500 553 444 611 479 333 556 582 291 234 556 291 883 582 546 601 560 395 424 326 603 565 834 516 556 500 333 606 333 606 0 0 0 278 500 500 1000 500 500 333 1144 525 331 998 0 0 0 0 0 0 500 500 606 500 1000 333 979 424 331 827 0 0 667 0 278 500 500 500 500 606 500] % 2294 0 obj +[528 545 167 333 556 278 333 333 0 333 606 0 667 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 333 250 333 500 500 500 889 778 278 333 333 389 606 250 333 250 296 500 500 500 500 500 500 500 500 500 500 250 250 606 606 606 500 747 722 611 667 778 611 556 722 778 333 333 667 556 944 778 778 611 778 667 556 611 778 722 944 722 667 667 333 606 333 606 500 278 444 463 407 500 389 278 500 500 278 278 444 278 778 556 444 500 463 389 389 333 556 500 722 500 500 444] +% 2295 0 obj [611 611 167 333 611 333 333 333 0 333 606 0 667 500 333 333 0 0 0 0 0 0 0 0 0 0 0 0 333 227 250 278 402 500 500 889 833 278 333 333 444 606 250 333 250 296 500 500 500 500 500 500 500 500 500 500 250 250 606 606 606 444 747 778 667 722 833 611 556 833 833 389 389 778 611 1000 833 833 611 833 722 611 667 778 778 1000 667 667 667 333 606 333 606 500 278 500 611 444 611 500 389 556 611 333 333 611 333 889 611 556 611 611 389 444 333 611 556 833 500 556 500 310 606 310 606 0 0 0 333 500 500 1000 500 500 333 1000 611 389 1000 0 0 0 0 0 0 500 500 606 500 1000] -% 2296 0 obj +% 2297 0 obj << /Type /FontDescriptor /FontName /MNPEHI+CMEX10 @@ -36117,9 +36130,9 @@ stream /StemV 47 /XHeight 431 /CharSet (/radicalbigg) -/FontFile 2295 0 R +/FontFile 2296 0 R >> -% 2298 0 obj +% 2299 0 obj << /Type /FontDescriptor /FontName /SFGIZH+CMITT10 @@ -36132,9 +36145,9 @@ stream /StemV 69 /XHeight 431 /CharSet (/A/C/D/E/H/I/K/L/M/P/T/V/a/c/comma/d/e/exclam/f/g/h/hyphen/i/k/m/n/o/p/parenleft/parenright/period/r/s/slash/t/w/x/y) -/FontFile 2297 0 R +/FontFile 2298 0 R >> -% 2300 0 obj +% 2301 0 obj << /Type /FontDescriptor /FontName /TPELEW+CMMI10 @@ -36147,9 +36160,9 @@ stream /StemV 72 /XHeight 431 /CharSet (/arrowhookleft/greater/less) -/FontFile 2299 0 R +/FontFile 2300 0 R >> -% 2302 0 obj +% 2303 0 obj << /Type /FontDescriptor /FontName /SOSTRQ+CMR10 @@ -36162,9 +36175,9 @@ stream /StemV 69 /XHeight 431 /CharSet (/bracketleft/bracketright/equal/parenleft/parenright/plus) -/FontFile 2301 0 R +/FontFile 2302 0 R >> -% 2304 0 obj +% 2305 0 obj << /Type /FontDescriptor /FontName /VKSUEJ+CMSY10 @@ -36177,9 +36190,9 @@ stream /StemV 40 /XHeight 431 /CharSet (/B/H/I/arrowleft/arrowright/asteriskmath/bar/bardbl/braceleft/braceright/element/greaterequal/lessequal/minus/negationslash/radical) -/FontFile 2303 0 R +/FontFile 2304 0 R >> -% 2306 0 obj +% 2307 0 obj << /Type /FontDescriptor /FontName /XIQVGP+CMTT10 @@ -36192,9 +36205,9 @@ stream /StemV 69 /XHeight 431 /CharSet (/A/B/C/D/E/F/H/I/J/K/L/M/N/O/P/R/S/T/U/V/W/X/Y/Z/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/nine/o/one/p/parenleft/parenright/percent/period/plus/q/quotesingle/r/s/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) -/FontFile 2305 0 R +/FontFile 2306 0 R >> -% 2308 0 obj +% 2309 0 obj << /Type /FontDescriptor /FontName /KPZRIA+CMTT8 @@ -36207,9 +36220,9 @@ stream /StemV 76 /XHeight 431 /CharSet (/b/c/d/e/i/l/n/p/r/s/t) -/FontFile 2307 0 R +/FontFile 2308 0 R >> -% 2310 0 obj +% 2311 0 obj << /Type /FontDescriptor /FontName /FYMOSO+CMTT9 @@ -36222,12 +36235,12 @@ stream /StemV 74 /XHeight 431 /CharSet (/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/R/S/T/U/V/W/X/Y/a/ampersand/asterisk/b/c/colon/comma/d/e/equal/f/four/g/greater/h/hyphen/i/j/k/l/less/m/n/nine/o/one/p/parenleft/parenright/percent/period/plus/q/quotesingle/r/s/semicolon/six/slash/t/two/u/underscore/v/w/x/y/z/zero) -/FontFile 2309 0 R +/FontFile 2310 0 R >> -% 2312 0 obj +% 2313 0 obj << /Type /FontDescriptor -/FontName /IKXQUG+PazoMath +/FontName /ZSBXRF+PazoMath /Flags 4 /FontBBox [-40 -283 878 946] /Ascent 0 @@ -36236,10 +36249,10 @@ stream /ItalicAngle 0 /StemV 95 /XHeight 0 -/CharSet (/infinity/summation) -/FontFile 2311 0 R +/CharSet (/Omega/infinity/summation) +/FontFile 2312 0 R >> -% 2314 0 obj +% 2315 0 obj << /Type /FontDescriptor /FontName /DUJUUF+PazoMath-Italic @@ -36252,9 +36265,9 @@ stream /StemV 65 /XHeight 0 /CharSet (/alpha/beta) -/FontFile 2313 0 R +/FontFile 2314 0 R >> -% 2316 0 obj +% 2317 0 obj << /Type /FontDescriptor /FontName /BDDEWM+URWPalladioL-Bold @@ -36267,9 +36280,9 @@ stream /StemV 123 /XHeight 471 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/Y/Z/a/b/c/colon/comma/d/e/eight/emdash/endash/equal/f/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/period/q/question/quoteright/r/s/seven/six/slash/t/three/two/u/v/w/x/y/z/zero) -/FontFile 2315 0 R +/FontFile 2316 0 R >> -% 2318 0 obj +% 2319 0 obj << /Type /FontDescriptor /FontName /GLTUCO+URWPalladioL-Roma @@ -36282,9 +36295,9 @@ stream /StemV 84 /XHeight 469 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/R/S/T/U/V/W/X/Y/Z/a/ampersand/asterisk/b/bracketleft/bracketright/bullet/c/colon/comma/d/e/eight/emdash/endash/equal/f/fi/five/fl/four/g/grave/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/period/plus/q/quotedblleft/quotedblright/quoteright/r/s/section/semicolon/seven/six/slash/t/three/two/u/v/w/x/y/z/zero) -/FontFile 2317 0 R +/FontFile 2318 0 R >> -% 2320 0 obj +% 2321 0 obj << /Type /FontDescriptor /FontName /ZZXCQL+URWPalladioL-Ital @@ -36297,453 +36310,453 @@ stream /StemV 78 /XHeight 482 /CharSet (/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/X/a/b/bracketleft/bracketright/c/colon/comma/d/e/f/fi/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/period/plus/q/quoteright/r/s/t/three/two/u/v/w/x/y/z/zero) -/FontFile 2319 0 R +/FontFile 2320 0 R >> -% 2291 0 obj +% 2292 0 obj << /Type /Encoding /Differences [2/fi/fl 30/grave 38/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon 61/equal 63/question 65/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/bracketleft 93/bracketright 97/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 147/quotedblleft/quotedblright/bullet/endash/emdash 167/section] >> -% 1882 0 obj +% 1883 0 obj << /Type /Font /Subtype /Type1 /BaseFont /MNPEHI+CMEX10 -/FontDescriptor 2296 0 R +/FontDescriptor 2297 0 R /FirstChar 114 /LastChar 114 -/Widths 2281 0 R -/ToUnicode 2321 0 R +/Widths 2282 0 R +/ToUnicode 2322 0 R >> -% 1813 0 obj +% 1814 0 obj << /Type /Font /Subtype /Type1 /BaseFont /SFGIZH+CMITT10 -/FontDescriptor 2298 0 R +/FontDescriptor 2299 0 R /FirstChar 33 /LastChar 121 -/Widths 2282 0 R -/ToUnicode 2322 0 R +/Widths 2283 0 R +/ToUnicode 2323 0 R >> % 1490 0 obj << /Type /Font /Subtype /Type1 /BaseFont /TPELEW+CMMI10 -/FontDescriptor 2300 0 R +/FontDescriptor 2301 0 R /FirstChar 44 /LastChar 62 -/Widths 2283 0 R -/ToUnicode 2323 0 R +/Widths 2284 0 R +/ToUnicode 2324 0 R >> % 942 0 obj << /Type /Font /Subtype /Type1 /BaseFont /SOSTRQ+CMR10 -/FontDescriptor 2302 0 R +/FontDescriptor 2303 0 R /FirstChar 40 /LastChar 93 -/Widths 2288 0 R -/ToUnicode 2324 0 R +/Widths 2289 0 R +/ToUnicode 2325 0 R >> % 941 0 obj << /Type /Font /Subtype /Type1 /BaseFont /VKSUEJ+CMSY10 -/FontDescriptor 2304 0 R +/FontDescriptor 2305 0 R /FirstChar 0 /LastChar 112 -/Widths 2289 0 R -/ToUnicode 2325 0 R +/Widths 2290 0 R +/ToUnicode 2326 0 R >> % 940 0 obj << /Type /Font /Subtype /Type1 /BaseFont /XIQVGP+CMTT10 -/FontDescriptor 2306 0 R +/FontDescriptor 2307 0 R /FirstChar 13 /LastChar 126 -/Widths 2290 0 R -/ToUnicode 2326 0 R +/Widths 2291 0 R +/ToUnicode 2327 0 R >> % 1000 0 obj << /Type /Font /Subtype /Type1 /BaseFont /KPZRIA+CMTT8 -/FontDescriptor 2308 0 R +/FontDescriptor 2309 0 R /FirstChar 98 /LastChar 116 -/Widths 2287 0 R -/ToUnicode 2327 0 R +/Widths 2288 0 R +/ToUnicode 2328 0 R >> % 1044 0 obj << /Type /Font /Subtype /Type1 /BaseFont /FYMOSO+CMTT9 -/FontDescriptor 2310 0 R +/FontDescriptor 2311 0 R /FirstChar 13 /LastChar 122 -/Widths 2286 0 R -/ToUnicode 2328 0 R +/Widths 2287 0 R +/ToUnicode 2329 0 R >> % 1285 0 obj << /Type /Font /Subtype /Type1 -/BaseFont /IKXQUG+PazoMath -/FontDescriptor 2312 0 R -/FirstChar 165 +/BaseFont /ZSBXRF+PazoMath +/FontDescriptor 2313 0 R +/FirstChar 87 /LastChar 229 -/Widths 2284 0 R -/ToUnicode 2329 0 R +/Widths 2285 0 R +/ToUnicode 2330 0 R >> % 1157 0 obj << /Type /Font /Subtype /Type1 /BaseFont /DUJUUF+PazoMath-Italic -/FontDescriptor 2314 0 R +/FontDescriptor 2315 0 R /FirstChar 97 /LastChar 98 -/Widths 2285 0 R -/ToUnicode 2330 0 R +/Widths 2286 0 R +/ToUnicode 2331 0 R >> % 685 0 obj << /Type /Font /Subtype /Type1 /BaseFont /BDDEWM+URWPalladioL-Bold -/FontDescriptor 2316 0 R +/FontDescriptor 2317 0 R /FirstChar 2 /LastChar 151 -/Widths 2294 0 R -/Encoding 2291 0 R -/ToUnicode 2331 0 R +/Widths 2295 0 R +/Encoding 2292 0 R +/ToUnicode 2332 0 R >> % 687 0 obj << /Type /Font /Subtype /Type1 /BaseFont /GLTUCO+URWPalladioL-Roma -/FontDescriptor 2318 0 R +/FontDescriptor 2319 0 R /FirstChar 2 /LastChar 167 -/Widths 2292 0 R -/Encoding 2291 0 R -/ToUnicode 2332 0 R +/Widths 2293 0 R +/Encoding 2292 0 R +/ToUnicode 2333 0 R >> % 686 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ZZXCQL+URWPalladioL-Ital -/FontDescriptor 2320 0 R +/FontDescriptor 2321 0 R /FirstChar 2 /LastChar 122 -/Widths 2293 0 R -/Encoding 2291 0 R -/ToUnicode 2333 0 R +/Widths 2294 0 R +/Encoding 2292 0 R +/ToUnicode 2334 0 R >> % 688 0 obj << /Type /Pages /Count 6 -/Parent 2334 0 R +/Parent 2335 0 R /Kids [678 0 R 691 0 R 737 0 R 793 0 R 841 0 R 884 0 R] >> % 894 0 obj << /Type /Pages /Count 6 -/Parent 2334 0 R +/Parent 2335 0 R /Kids [892 0 R 906 0 R 924 0 R 937 0 R 950 0 R 962 0 R] >> % 978 0 obj << /Type /Pages /Count 6 -/Parent 2334 0 R +/Parent 2335 0 R /Kids [967 0 R 982 0 R 1003 0 R 1014 0 R 1022 0 R 1033 0 R] >> % 1052 0 obj << /Type /Pages /Count 6 -/Parent 2334 0 R +/Parent 2335 0 R /Kids [1049 0 R 1054 0 R 1058 0 R 1063 0 R 1070 0 R 1078 0 R] >> % 1087 0 obj << /Type /Pages /Count 6 -/Parent 2334 0 R +/Parent 2335 0 R /Kids [1083 0 R 1089 0 R 1093 0 R 1097 0 R 1103 0 R 1107 0 R] >> % 1117 0 obj << /Type /Pages /Count 6 -/Parent 2334 0 R +/Parent 2335 0 R /Kids [1113 0 R 1120 0 R 1126 0 R 1133 0 R 1139 0 R 1143 0 R] >> % 1158 0 obj << /Type /Pages /Count 6 -/Parent 2335 0 R +/Parent 2336 0 R /Kids [1154 0 R 1162 0 R 1172 0 R 1178 0 R 1189 0 R 1194 0 R] >> % 1205 0 obj << /Type /Pages /Count 6 -/Parent 2335 0 R +/Parent 2336 0 R /Kids [1201 0 R 1207 0 R 1215 0 R 1223 0 R 1228 0 R 1236 0 R] >> % 1244 0 obj << /Type /Pages /Count 6 -/Parent 2335 0 R +/Parent 2336 0 R /Kids [1241 0 R 1249 0 R 1254 0 R 1267 0 R 1274 0 R 1282 0 R] >> % 1300 0 obj << /Type /Pages /Count 6 -/Parent 2335 0 R +/Parent 2336 0 R /Kids [1293 0 R 1309 0 R 1315 0 R 1326 0 R 1332 0 R 1343 0 R] >> % 1351 0 obj << /Type /Pages /Count 6 -/Parent 2335 0 R +/Parent 2336 0 R /Kids [1348 0 R 1360 0 R 1365 0 R 1374 0 R 1380 0 R 1389 0 R] >> % 1400 0 obj << /Type /Pages /Count 6 -/Parent 2335 0 R +/Parent 2336 0 R /Kids [1396 0 R 1410 0 R 1417 0 R 1426 0 R 1434 0 R 1438 0 R] >> % 1457 0 obj << /Type /Pages /Count 6 -/Parent 2336 0 R +/Parent 2337 0 R /Kids [1453 0 R 1459 0 R 1465 0 R 1472 0 R 1476 0 R 1481 0 R] >> % 1492 0 obj << /Type /Pages /Count 6 -/Parent 2336 0 R +/Parent 2337 0 R /Kids [1487 0 R 1494 0 R 1505 0 R 1510 0 R 1519 0 R 1526 0 R] >> % 1534 0 obj << /Type /Pages /Count 6 -/Parent 2336 0 R +/Parent 2337 0 R /Kids [1531 0 R 1538 0 R 1542 0 R 1550 0 R 1555 0 R 1563 0 R] >> % 1577 0 obj << /Type /Pages /Count 6 -/Parent 2336 0 R +/Parent 2337 0 R /Kids [1569 0 R 1579 0 R 1592 0 R 1596 0 R 1609 0 R 1616 0 R] >> % 1626 0 obj << /Type /Pages /Count 6 -/Parent 2336 0 R +/Parent 2337 0 R /Kids [1623 0 R 1628 0 R 1635 0 R 1639 0 R 1648 0 R 1656 0 R] >> % 1663 0 obj << /Type /Pages /Count 6 -/Parent 2336 0 R +/Parent 2337 0 R /Kids [1660 0 R 1666 0 R 1670 0 R 1677 0 R 1682 0 R 1688 0 R] >> % 1698 0 obj << /Type /Pages /Count 6 -/Parent 2337 0 R +/Parent 2338 0 R /Kids [1694 0 R 1701 0 R 1707 0 R 1714 0 R 1722 0 R 1726 0 R] >> % 1739 0 obj << /Type /Pages /Count 6 -/Parent 2337 0 R -/Kids [1736 0 R 1741 0 R 1745 0 R 1758 0 R 1762 0 R 1768 0 R] ->> -% 1780 0 obj -<< -/Type /Pages -/Count 6 -/Parent 2337 0 R -/Kids [1774 0 R 1782 0 R 1786 0 R 1790 0 R 1794 0 R 1798 0 R] +/Parent 2338 0 R +/Kids [1736 0 R 1741 0 R 1745 0 R 1759 0 R 1763 0 R 1769 0 R] >> -% 1805 0 obj +% 1781 0 obj << /Type /Pages /Count 6 -/Parent 2337 0 R -/Kids [1802 0 R 1807 0 R 1815 0 R 1819 0 R 1826 0 R 1831 0 R] +/Parent 2338 0 R +/Kids [1775 0 R 1783 0 R 1787 0 R 1791 0 R 1795 0 R 1799 0 R] >> -% 1841 0 obj +% 1806 0 obj << /Type /Pages /Count 6 -/Parent 2337 0 R -/Kids [1838 0 R 1843 0 R 1850 0 R 1854 0 R 1861 0 R 1865 0 R] +/Parent 2338 0 R +/Kids [1803 0 R 1808 0 R 1816 0 R 1820 0 R 1828 0 R 1832 0 R] >> -% 1875 0 obj +% 1842 0 obj << /Type /Pages /Count 6 -/Parent 2337 0 R -/Kids [1872 0 R 1877 0 R 1887 0 R 1892 0 R 1899 0 R 1905 0 R] +/Parent 2338 0 R +/Kids [1839 0 R 1844 0 R 1851 0 R 1855 0 R 1862 0 R 1866 0 R] >> -% 1914 0 obj +% 1876 0 obj << /Type /Pages /Count 6 /Parent 2338 0 R -/Kids [1909 0 R 1916 0 R 1922 0 R 1928 0 R 1934 0 R 1940 0 R] +/Kids [1873 0 R 1878 0 R 1888 0 R 1893 0 R 1900 0 R 1906 0 R] >> -% 1952 0 obj +% 1915 0 obj << /Type /Pages /Count 6 -/Parent 2338 0 R -/Kids [1947 0 R 1955 0 R 1962 0 R 1969 0 R 1976 0 R 1982 0 R] +/Parent 2339 0 R +/Kids [1910 0 R 1917 0 R 1923 0 R 1929 0 R 1935 0 R 1941 0 R] >> -% 1989 0 obj +% 1953 0 obj << /Type /Pages /Count 6 -/Parent 2338 0 R -/Kids [1986 0 R 1994 0 R 2005 0 R 2009 0 R 2018 0 R 2022 0 R] +/Parent 2339 0 R +/Kids [1948 0 R 1956 0 R 1963 0 R 1970 0 R 1977 0 R 1983 0 R] >> -% 2034 0 obj +% 1990 0 obj << /Type /Pages /Count 6 -/Parent 2338 0 R -/Kids [2031 0 R 2037 0 R 2041 0 R 2047 0 R 2056 0 R 2063 0 R] +/Parent 2339 0 R +/Kids [1987 0 R 1995 0 R 2006 0 R 2010 0 R 2019 0 R 2023 0 R] >> -% 2070 0 obj +% 2035 0 obj << /Type /Pages /Count 6 -/Parent 2338 0 R -/Kids [2067 0 R 2075 0 R 2086 0 R 2091 0 R 2099 0 R 2108 0 R] +/Parent 2339 0 R +/Kids [2032 0 R 2038 0 R 2042 0 R 2049 0 R 2057 0 R 2064 0 R] >> -% 2115 0 obj +% 2071 0 obj << /Type /Pages /Count 6 -/Parent 2338 0 R -/Kids [2112 0 R 2123 0 R 2137 0 R 2146 0 R 2157 0 R 2186 0 R] +/Parent 2339 0 R +/Kids [2068 0 R 2076 0 R 2087 0 R 2092 0 R 2100 0 R 2109 0 R] >> -% 2211 0 obj +% 2116 0 obj << /Type /Pages /Count 6 /Parent 2339 0 R -/Kids [2206 0 R 2225 0 R 2241 0 R 2245 0 R 2249 0 R 2254 0 R] +/Kids [2113 0 R 2124 0 R 2138 0 R 2147 0 R 2158 0 R 2187 0 R] >> -% 2261 0 obj +% 2212 0 obj << /Type /Pages -/Count 4 -/Parent 2339 0 R -/Kids [2258 0 R 2263 0 R 2267 0 R 2276 0 R] +/Count 6 +/Parent 2340 0 R +/Kids [2207 0 R 2226 0 R 2242 0 R 2246 0 R 2250 0 R 2255 0 R] >> -% 2334 0 obj +% 2262 0 obj << /Type /Pages -/Count 36 +/Count 4 /Parent 2340 0 R -/Kids [688 0 R 894 0 R 978 0 R 1052 0 R 1087 0 R 1117 0 R] +/Kids [2259 0 R 2264 0 R 2268 0 R 2277 0 R] >> % 2335 0 obj << /Type /Pages /Count 36 -/Parent 2340 0 R -/Kids [1158 0 R 1205 0 R 1244 0 R 1300 0 R 1351 0 R 1400 0 R] +/Parent 2341 0 R +/Kids [688 0 R 894 0 R 978 0 R 1052 0 R 1087 0 R 1117 0 R] >> % 2336 0 obj << /Type /Pages /Count 36 -/Parent 2340 0 R -/Kids [1457 0 R 1492 0 R 1534 0 R 1577 0 R 1626 0 R 1663 0 R] +/Parent 2341 0 R +/Kids [1158 0 R 1205 0 R 1244 0 R 1300 0 R 1351 0 R 1400 0 R] >> % 2337 0 obj << /Type /Pages /Count 36 -/Parent 2340 0 R -/Kids [1698 0 R 1739 0 R 1780 0 R 1805 0 R 1841 0 R 1875 0 R] +/Parent 2341 0 R +/Kids [1457 0 R 1492 0 R 1534 0 R 1577 0 R 1626 0 R 1663 0 R] >> % 2338 0 obj << /Type /Pages /Count 36 -/Parent 2340 0 R -/Kids [1914 0 R 1952 0 R 1989 0 R 2034 0 R 2070 0 R 2115 0 R] +/Parent 2341 0 R +/Kids [1698 0 R 1739 0 R 1781 0 R 1806 0 R 1842 0 R 1876 0 R] >> endstream endobj -2341 0 obj +2342 0 obj << /Type /ObjStm /N 100 -/First 888 -/Length 9739 ->> -stream -2339 0 2340 85 2342 190 675 259 671 333 667 421 663 509 659 597 655 685 651 773 -647 861 643 949 639 1037 635 1125 631 1213 627 1301 623 1389 619 1463 615 1575 611 1649 -607 1737 602 1825 598 1899 594 2024 590 2098 586 2172 582 2297 578 2371 574 2459 570 2547 -566 2635 562 2723 558 2811 554 2899 550 2987 546 3061 542 3186 538 3260 534 3348 530 3436 -526 3524 522 3612 518 3686 514 3811 510 3885 506 3973 502 4061 498 4135 494 4260 490 4334 -486 4422 482 4510 478 4598 474 4686 470 4774 466 4862 462 4950 458 5038 454 5126 450 5214 -446 5302 442 5390 438 5478 434 5566 430 5654 426 5728 422 5854 418 5928 414 6016 410 6104 -406 6192 401 6280 397 6368 393 6456 389 6544 385 6632 381 6720 377 6808 373 6896 369 6984 -365 7072 361 7160 357 7248 353 7336 349 7424 345 7512 341 7600 337 7688 333 7776 329 7864 -325 7952 321 8040 317 8128 313 8202 309 8328 305 8402 301 8490 297 8578 293 8652 289 8777 +/First 890 +/Length 9788 +>> +stream +2339 0 2340 121 2341 206 2343 311 675 380 671 454 667 542 663 630 659 718 655 806 +651 894 647 982 643 1070 639 1158 635 1246 631 1334 627 1422 623 1510 619 1584 615 1696 +611 1770 607 1858 602 1946 598 2020 594 2145 590 2219 586 2293 582 2418 578 2492 574 2580 +570 2668 566 2756 562 2844 558 2932 554 3020 550 3108 546 3182 542 3307 538 3381 534 3469 +530 3557 526 3645 522 3733 518 3807 514 3932 510 4006 506 4094 502 4182 498 4256 494 4381 +490 4455 486 4543 482 4631 478 4719 474 4807 470 4895 466 4983 462 5071 458 5159 454 5247 +450 5335 446 5423 442 5511 438 5599 434 5687 430 5775 426 5849 422 5975 418 6049 414 6137 +410 6225 406 6313 401 6401 397 6489 393 6577 389 6665 385 6753 381 6841 377 6929 373 7017 +369 7105 365 7193 361 7281 357 7369 353 7457 349 7545 345 7633 341 7721 337 7809 333 7897 +329 7985 325 8073 321 8161 317 8249 313 8323 309 8449 305 8523 301 8611 297 8699 293 8773 % 2339 0 obj << /Type /Pages -/Count 10 -/Parent 2340 0 R -/Kids [2211 0 R 2261 0 R] +/Count 36 +/Parent 2341 0 R +/Kids [1915 0 R 1953 0 R 1990 0 R 2035 0 R 2071 0 R 2116 0 R] >> % 2340 0 obj << /Type /Pages +/Count 10 +/Parent 2341 0 R +/Kids [2212 0 R 2262 0 R] +>> +% 2341 0 obj +<< +/Type /Pages /Count 190 -/Kids [2334 0 R 2335 0 R 2336 0 R 2337 0 R 2338 0 R 2339 0 R] +/Kids [2335 0 R 2336 0 R 2337 0 R 2338 0 R 2339 0 R 2340 0 R] >> -% 2342 0 obj +% 2343 0 obj << /Type /Outlines /First 4 0 R @@ -37526,6 +37539,27 @@ stream /Last 309 0 R /Count -4 >> + +endstream +endobj +2344 0 obj +<< +/Type /ObjStm +/N 100 +/First 893 +/Length 12099 +>> +stream +289 0 285 74 281 162 277 250 273 338 269 426 265 514 261 602 257 690 253 778 +249 866 245 954 241 1042 237 1130 233 1218 229 1306 225 1380 221 1505 217 1578 213 1665 +209 1739 205 1827 200 1915 196 2003 192 2091 188 2165 184 2291 180 2365 176 2453 172 2541 +168 2629 164 2717 160 2805 156 2893 152 2981 148 3069 144 3157 140 3245 136 3333 132 3421 +128 3509 124 3597 120 3685 116 3773 112 3861 108 3935 104 4061 100 4134 96 4219 92 4302 +88 4384 84 4466 80 4548 76 4630 72 4712 68 4794 64 4876 60 4958 56 5040 52 5122 +48 5204 44 5273 40 5382 36 5502 32 5571 28 5627 24 5746 20 5828 16 5897 12 6015 +8 6095 4 6160 2345 6253 2346 6449 2347 6622 2348 6802 2349 6979 2350 7156 2351 7336 2352 7514 +2353 7694 2354 7872 2355 8052 2356 8225 2357 8390 2358 8562 2359 8732 2360 8904 2361 9073 2362 9242 +2363 9414 2364 9584 2365 9756 2366 9926 2367 10098 2368 10268 2369 10440 2370 10610 2371 10782 2372 10974 % 289 0 obj << /Title 290 0 R @@ -37533,27 +37567,6 @@ stream /Parent 225 0 R /Prev 285 0 R >> - -endstream -endobj -2343 0 obj -<< -/Type /ObjStm -/N 100 -/First 895 -/Length 12279 ->> -stream -285 0 281 88 277 176 273 264 269 352 265 440 261 528 257 616 253 704 249 792 -245 880 241 968 237 1056 233 1144 229 1232 225 1306 221 1431 217 1504 213 1591 209 1665 -205 1753 200 1841 196 1929 192 2017 188 2091 184 2217 180 2291 176 2379 172 2467 168 2555 -164 2643 160 2731 156 2819 152 2907 148 2995 144 3083 140 3171 136 3259 132 3347 128 3435 -124 3523 120 3611 116 3699 112 3787 108 3861 104 3987 100 4060 96 4145 92 4228 88 4310 -84 4392 80 4474 76 4556 72 4638 68 4720 64 4802 60 4884 56 4966 52 5048 48 5130 -44 5199 40 5308 36 5428 32 5497 28 5553 24 5672 20 5754 16 5823 12 5941 8 6021 -4 6086 2344 6179 2345 6375 2346 6548 2347 6728 2348 6905 2349 7082 2350 7262 2351 7440 2352 7620 -2353 7798 2354 7978 2355 8149 2356 8315 2357 8487 2358 8656 2359 8825 2360 8997 2361 9167 2362 9339 -2363 9509 2364 9681 2365 9851 2366 10023 2367 10193 2368 10365 2369 10534 2370 10708 2371 10930 2372 11135 % 285 0 obj << /Title 286 0 R @@ -38125,155 +38138,150 @@ stream << /Title 5 0 R /A 1 0 R -/Parent 2342 0 R +/Parent 2343 0 R /First 8 0 R /Last 619 0 R /Count -14 >> -% 2344 0 obj +% 2345 0 obj << -/Names [(Doc-Start) 684 0 R (Hfootnote.1) 943 0 R (Hfootnote.2) 944 0 R (Hfootnote.3) 999 0 R (Hfootnote.4) 1997 0 R (Hfootnote.5) 2081 0 R] +/Names [(Doc-Start) 684 0 R (Hfootnote.1) 943 0 R (Hfootnote.2) 944 0 R (Hfootnote.3) 999 0 R (Hfootnote.4) 1998 0 R (Hfootnote.5) 2082 0 R] /Limits [(Doc-Start) (Hfootnote.5)] >> -% 2345 0 obj +% 2346 0 obj << /Names [(Item.1) 970 0 R (Item.10) 986 0 R (Item.100) 1711 0 R (Item.101) 1717 0 R (Item.102) 1718 0 R (Item.103) 1729 0 R] /Limits [(Item.1) (Item.103)] >> -% 2346 0 obj +% 2347 0 obj << /Names [(Item.104) 1730 0 R (Item.105) 1731 0 R (Item.106) 1748 0 R (Item.107) 1749 0 R (Item.108) 1750 0 R (Item.109) 1751 0 R] /Limits [(Item.104) (Item.109)] >> -% 2347 0 obj +% 2348 0 obj << /Names [(Item.11) 987 0 R (Item.110) 1752 0 R (Item.111) 1753 0 R (Item.112) 1754 0 R (Item.113) 1755 0 R (Item.114) 1756 0 R] /Limits [(Item.11) (Item.114)] >> -% 2348 0 obj -<< -/Names [(Item.115) 1765 0 R (Item.116) 1766 0 R (Item.117) 1771 0 R (Item.118) 1772 0 R (Item.119) 1777 0 R (Item.12) 988 0 R] -/Limits [(Item.115) (Item.12)] ->> % 2349 0 obj << -/Names [(Item.120) 1778 0 R (Item.121) 1779 0 R (Item.122) 1810 0 R (Item.123) 1811 0 R (Item.124) 1812 0 R (Item.125) 1822 0 R] -/Limits [(Item.120) (Item.125)] +/Names [(Item.115) 1757 0 R (Item.116) 1766 0 R (Item.117) 1767 0 R (Item.118) 1772 0 R (Item.119) 1773 0 R (Item.12) 988 0 R] +/Limits [(Item.115) (Item.12)] >> % 2350 0 obj << -/Names [(Item.126) 1823 0 R (Item.127) 1824 0 R (Item.128) 1834 0 R (Item.129) 1835 0 R (Item.13) 989 0 R (Item.130) 1836 0 R] -/Limits [(Item.126) (Item.130)] +/Names [(Item.120) 1778 0 R (Item.121) 1779 0 R (Item.122) 1780 0 R (Item.123) 1811 0 R (Item.124) 1812 0 R (Item.125) 1813 0 R] +/Limits [(Item.120) (Item.125)] >> % 2351 0 obj << -/Names [(Item.131) 1846 0 R (Item.132) 1847 0 R (Item.133) 1848 0 R (Item.134) 1857 0 R (Item.135) 1858 0 R (Item.136) 1859 0 R] -/Limits [(Item.131) (Item.136)] +/Names [(Item.126) 1823 0 R (Item.127) 1824 0 R (Item.128) 1825 0 R (Item.129) 1835 0 R (Item.13) 989 0 R (Item.130) 1836 0 R] +/Limits [(Item.126) (Item.130)] >> % 2352 0 obj << -/Names [(Item.137) 1868 0 R (Item.138) 1869 0 R (Item.139) 1870 0 R (Item.14) 990 0 R (Item.140) 1880 0 R (Item.141) 1881 0 R] -/Limits [(Item.137) (Item.141)] +/Names [(Item.131) 1837 0 R (Item.132) 1847 0 R (Item.133) 1848 0 R (Item.134) 1849 0 R (Item.135) 1858 0 R (Item.136) 1859 0 R] +/Limits [(Item.131) (Item.136)] >> % 2353 0 obj << -/Names [(Item.142) 1883 0 R (Item.143) 1884 0 R (Item.144) 1885 0 R (Item.145) 1890 0 R (Item.146) 1895 0 R (Item.147) 2150 0 R] -/Limits [(Item.142) (Item.147)] +/Names [(Item.137) 1860 0 R (Item.138) 1869 0 R (Item.139) 1870 0 R (Item.14) 990 0 R (Item.140) 1871 0 R (Item.141) 1881 0 R] +/Limits [(Item.137) (Item.141)] >> % 2354 0 obj << -/Names [(Item.148) 2151 0 R (Item.149) 2252 0 R (Item.15) 991 0 R (Item.16) 992 0 R (Item.17) 993 0 R (Item.18) 994 0 R] -/Limits [(Item.148) (Item.18)] +/Names [(Item.142) 1882 0 R (Item.143) 1884 0 R (Item.144) 1885 0 R (Item.145) 1886 0 R (Item.146) 1891 0 R (Item.147) 1896 0 R] +/Limits [(Item.142) (Item.147)] >> % 2355 0 obj << -/Names [(Item.19) 995 0 R (Item.2) 971 0 R (Item.20) 996 0 R (Item.21) 997 0 R (Item.22) 998 0 R (Item.23) 1006 0 R] -/Limits [(Item.19) (Item.23)] +/Names [(Item.148) 2151 0 R (Item.149) 2152 0 R (Item.15) 991 0 R (Item.150) 2253 0 R (Item.16) 992 0 R (Item.17) 993 0 R] +/Limits [(Item.148) (Item.17)] >> % 2356 0 obj << -/Names [(Item.24) 1007 0 R (Item.25) 1008 0 R (Item.26) 1009 0 R (Item.27) 1010 0 R (Item.28) 1011 0 R (Item.29) 1025 0 R] -/Limits [(Item.24) (Item.29)] +/Names [(Item.18) 994 0 R (Item.19) 995 0 R (Item.2) 971 0 R (Item.20) 996 0 R (Item.21) 997 0 R (Item.22) 998 0 R] +/Limits [(Item.18) (Item.22)] >> % 2357 0 obj << -/Names [(Item.3) 972 0 R (Item.30) 1026 0 R (Item.31) 1027 0 R (Item.32) 1028 0 R (Item.33) 1029 0 R (Item.34) 1036 0 R] -/Limits [(Item.3) (Item.34)] +/Names [(Item.23) 1006 0 R (Item.24) 1007 0 R (Item.25) 1008 0 R (Item.26) 1009 0 R (Item.27) 1010 0 R (Item.28) 1011 0 R] +/Limits [(Item.23) (Item.28)] >> % 2358 0 obj << -/Names [(Item.35) 1037 0 R (Item.36) 1038 0 R (Item.37) 1039 0 R (Item.38) 1040 0 R (Item.39) 1041 0 R (Item.4) 973 0 R] -/Limits [(Item.35) (Item.4)] +/Names [(Item.29) 1025 0 R (Item.3) 972 0 R (Item.30) 1026 0 R (Item.31) 1027 0 R (Item.32) 1028 0 R (Item.33) 1029 0 R] +/Limits [(Item.29) (Item.33)] >> % 2359 0 obj << -/Names [(Item.40) 1042 0 R (Item.41) 1043 0 R (Item.42) 1086 0 R (Item.43) 1100 0 R (Item.44) 1101 0 R (Item.45) 1181 0 R] -/Limits [(Item.40) (Item.45)] +/Names [(Item.34) 1036 0 R (Item.35) 1037 0 R (Item.36) 1038 0 R (Item.37) 1039 0 R (Item.38) 1040 0 R (Item.39) 1041 0 R] +/Limits [(Item.34) (Item.39)] >> % 2360 0 obj << -/Names [(Item.46) 1210 0 R (Item.47) 1231 0 R (Item.48) 1257 0 R (Item.49) 1429 0 R (Item.5) 974 0 R (Item.50) 1430 0 R] -/Limits [(Item.46) (Item.50)] +/Names [(Item.4) 973 0 R (Item.40) 1042 0 R (Item.41) 1043 0 R (Item.42) 1086 0 R (Item.43) 1100 0 R (Item.44) 1101 0 R] +/Limits [(Item.4) (Item.44)] >> % 2361 0 obj << -/Names [(Item.51) 1431 0 R (Item.52) 1484 0 R (Item.53) 1491 0 R (Item.54) 1497 0 R (Item.55) 1498 0 R (Item.56) 1499 0 R] -/Limits [(Item.51) (Item.56)] +/Names [(Item.45) 1181 0 R (Item.46) 1210 0 R (Item.47) 1231 0 R (Item.48) 1257 0 R (Item.49) 1429 0 R (Item.5) 974 0 R] +/Limits [(Item.45) (Item.5)] >> % 2362 0 obj << -/Names [(Item.57) 1500 0 R (Item.58) 1501 0 R (Item.59) 1513 0 R (Item.6) 975 0 R (Item.60) 1514 0 R (Item.61) 1515 0 R] -/Limits [(Item.57) (Item.61)] +/Names [(Item.50) 1430 0 R (Item.51) 1431 0 R (Item.52) 1484 0 R (Item.53) 1491 0 R (Item.54) 1497 0 R (Item.55) 1498 0 R] +/Limits [(Item.50) (Item.55)] >> % 2363 0 obj << -/Names [(Item.62) 1522 0 R (Item.63) 1545 0 R (Item.64) 1546 0 R (Item.65) 1553 0 R (Item.66) 1558 0 R (Item.67) 1559 0 R] -/Limits [(Item.62) (Item.67)] +/Names [(Item.56) 1499 0 R (Item.57) 1500 0 R (Item.58) 1501 0 R (Item.59) 1513 0 R (Item.6) 975 0 R (Item.60) 1514 0 R] +/Limits [(Item.56) (Item.60)] >> % 2364 0 obj << -/Names [(Item.68) 1560 0 R (Item.69) 1572 0 R (Item.7) 976 0 R (Item.70) 1573 0 R (Item.71) 1574 0 R (Item.72) 1575 0 R] -/Limits [(Item.68) (Item.72)] +/Names [(Item.61) 1515 0 R (Item.62) 1522 0 R (Item.63) 1545 0 R (Item.64) 1546 0 R (Item.65) 1553 0 R (Item.66) 1558 0 R] +/Limits [(Item.61) (Item.66)] >> % 2365 0 obj << -/Names [(Item.73) 1576 0 R (Item.74) 1582 0 R (Item.75) 1583 0 R (Item.76) 1584 0 R (Item.77) 1585 0 R (Item.78) 1586 0 R] -/Limits [(Item.73) (Item.78)] +/Names [(Item.67) 1559 0 R (Item.68) 1560 0 R (Item.69) 1572 0 R (Item.7) 976 0 R (Item.70) 1573 0 R (Item.71) 1574 0 R] +/Limits [(Item.67) (Item.71)] >> % 2366 0 obj << -/Names [(Item.79) 1587 0 R (Item.8) 977 0 R (Item.80) 1599 0 R (Item.81) 1600 0 R (Item.82) 1601 0 R (Item.83) 1602 0 R] -/Limits [(Item.79) (Item.83)] +/Names [(Item.72) 1575 0 R (Item.73) 1576 0 R (Item.74) 1582 0 R (Item.75) 1583 0 R (Item.76) 1584 0 R (Item.77) 1585 0 R] +/Limits [(Item.72) (Item.77)] >> % 2367 0 obj << -/Names [(Item.84) 1603 0 R (Item.85) 1604 0 R (Item.86) 1605 0 R (Item.87) 1619 0 R (Item.88) 1631 0 R (Item.89) 1642 0 R] -/Limits [(Item.84) (Item.89)] +/Names [(Item.78) 1586 0 R (Item.79) 1587 0 R (Item.8) 977 0 R (Item.80) 1599 0 R (Item.81) 1600 0 R (Item.82) 1601 0 R] +/Limits [(Item.78) (Item.82)] >> % 2368 0 obj << -/Names [(Item.9) 985 0 R (Item.90) 1643 0 R (Item.91) 1651 0 R (Item.92) 1652 0 R (Item.93) 1673 0 R (Item.94) 1674 0 R] -/Limits [(Item.9) (Item.94)] +/Names [(Item.83) 1602 0 R (Item.84) 1603 0 R (Item.85) 1604 0 R (Item.86) 1605 0 R (Item.87) 1619 0 R (Item.88) 1631 0 R] +/Limits [(Item.83) (Item.88)] >> % 2369 0 obj << -/Names [(Item.95) 1685 0 R (Item.96) 1691 0 R (Item.97) 1697 0 R (Item.98) 1704 0 R (Item.99) 1710 0 R (algocf.1) 2155 0 R] -/Limits [(Item.95) (algocf.1)] +/Names [(Item.89) 1642 0 R (Item.9) 985 0 R (Item.90) 1643 0 R (Item.91) 1651 0 R (Item.92) 1652 0 R (Item.93) 1673 0 R] +/Limits [(Item.89) (Item.93)] >> % 2370 0 obj << -/Names [(algocf.2) 2202 0 R (algocfline.1) 2141 0 R (algocfline.2) 2209 0 R (cite.2007c) 957 0 R (cite.2007d) 958 0 R (cite.BERTACCINIFILIPPONE) 2012 0 R] -/Limits [(algocf.2) (cite.BERTACCINIFILIPPONE)] +/Names [(Item.94) 1674 0 R (Item.95) 1685 0 R (Item.96) 1691 0 R (Item.97) 1697 0 R (Item.98) 1704 0 R (Item.99) 1710 0 R] +/Limits [(Item.94) (Item.99)] >> % 2371 0 obj << -/Names [(cite.BLACS) 933 0 R (cite.BLAS1) 915 0 R (cite.BLAS2) 916 0 R (cite.BLAS3) 917 0 R (cite.CaFiRo:2014) 2127 0 R (cite.DesPat:11) 910 0 R] -/Limits [(cite.BLACS) (cite.DesPat:11)] +/Names [(algocf.1) 2156 0 R (algocf.2) 2203 0 R (algocfline.1) 2142 0 R (algocfline.2) 2210 0 R (cite.2007c) 957 0 R (cite.2007d) 958 0 R] +/Limits [(algocf.1) (cite.2007d)] >> % 2372 0 obj << -/Names [(cite.DesignPatterns) 1074 0 R (cite.Filippone:2017:SMM:3034774.3017994) 2280 0 R (cite.KIVA3PSBLAS) 2273 0 R (cite.METIS) 945 0 R (cite.MPI1) 2279 0 R (cite.MRC:11) 2142 0 R] -/Limits [(cite.DesignPatterns) (cite.MRC:11)] +/Names [(cite.BERTACCINIFILIPPONE) 2013 0 R (cite.BLACS) 933 0 R (cite.BLAS1) 915 0 R (cite.BLAS2) 916 0 R (cite.BLAS3) 917 0 R (cite.CaFiRo:2014) 2128 0 R] +/Limits [(cite.BERTACCINIFILIPPONE) (cite.CaFiRo:2014)] >> endstream @@ -38283,572 +38291,594 @@ endobj /Type /ObjStm /N 100 /First 1040 -/Length 19083 ->> -stream -2373 0 2375 226 2376 431 2377 617 2378 800 2379 1002 2380 1227 2381 1447 2382 1678 2383 1914 -2384 2148 2385 2376 2386 2564 2387 2744 2388 2923 2389 3103 2390 3281 2391 3459 2392 3639 2393 3818 -2394 3998 2395 4177 2396 4357 2397 4536 2398 4716 2399 4895 2400 5075 2401 5253 2402 5423 2403 5595 -2404 5764 2405 5933 2406 6105 2407 6275 2408 6447 2409 6617 2410 6789 2411 6959 2412 7131 2413 7301 -2414 7473 2415 7643 2416 7812 2417 7992 2418 8190 2419 8386 2420 8580 2421 8768 2422 8948 2423 9148 -2424 9378 2425 9608 2426 9827 2427 10051 2428 10281 2429 10503 2430 10725 2431 10953 2432 11181 2433 11411 -2434 11636 2435 11861 2436 12091 2437 12313 2438 12535 2439 12757 2440 13018 2441 13278 2442 13538 2443 13808 -2444 14074 2445 14336 2446 14575 2447 14755 2448 14934 2449 15109 2450 15276 2451 15390 2452 15502 2453 15613 -2454 15724 2455 15840 2456 15962 2457 16081 2458 16194 2459 16307 2460 16418 2461 16529 2462 16644 2463 16767 -2464 16893 2465 17019 2466 17150 2467 17274 2468 17357 2469 17476 2470 17598 2471 17711 2472 17795 2473 17830 +/Length 19171 +>> +stream +2373 0 2375 244 2376 465 2377 671 2378 861 2379 1043 2380 1239 2381 1465 2382 1685 2383 1913 +2384 2149 2385 2385 2386 2613 2387 2807 2388 2987 2389 3166 2390 3346 2391 3525 2392 3705 2393 3883 +2394 4061 2395 4241 2396 4420 2397 4600 2398 4779 2399 4959 2400 5138 2401 5318 2402 5497 2403 5669 +2404 5841 2405 6011 2406 6183 2407 6352 2408 6521 2409 6693 2410 6863 2411 7035 2412 7205 2413 7377 +2414 7547 2415 7719 2416 7890 2417 8062 2418 8235 2419 8433 2420 8628 2421 8825 2422 9013 2423 9195 +2424 9389 2425 9619 2426 9849 2427 10070 2428 10291 2429 10521 2430 10745 2431 10967 2432 11194 2433 11424 +2434 11652 2435 11878 2436 12102 2437 12332 2438 12556 2439 12778 2440 13000 2441 13251 2442 13512 2443 13769 +2444 14039 2445 14306 2446 14568 2447 14830 2448 15008 2449 15186 2450 15362 2451 15535 2452 15606 2453 15720 +2454 15832 2455 15943 2456 16054 2457 16171 2458 16294 2459 16412 2460 16524 2461 16637 2462 16749 2463 16859 +2464 16973 2465 17096 2466 17222 2467 17348 2468 17479 2469 17603 2470 17695 2471 17814 2472 17934 2473 18047 % 2373 0 obj << -/Names [(cite.OurTechRep) 2128 0 R (cite.PARA04FOREST) 2271 0 R (cite.PSBLAS) 2272 0 R (cite.RouXiaXu:11) 911 0 R (cite.Sparse03) 909 0 R (cite.machiels) 912 0 R] -/Limits [(cite.OurTechRep) (cite.machiels)] +/Names [(cite.DesPat:11) 910 0 R (cite.DesignPatterns) 1074 0 R (cite.Filippone:2017:SMM:3034774.3017994) 2281 0 R (cite.KIVA3PSBLAS) 2274 0 R (cite.METIS) 945 0 R (cite.MPI1) 2280 0 R] +/Limits [(cite.DesPat:11) (cite.MPI1)] >> % 2375 0 obj << -/Names [(cite.metcalf) 908 0 R (cite.sblas02) 914 0 R (cite.sblas97) 913 0 R (descdata) 1017 0 R (equation.4.1) 1296 0 R (equation.4.2) 1297 0 R] -/Limits [(cite.metcalf) (equation.4.2)] +/Names [(cite.MRC:11) 2143 0 R (cite.OurTechRep) 2129 0 R (cite.PARA04FOREST) 2272 0 R (cite.PSBLAS) 2273 0 R (cite.RouXiaXu:11) 911 0 R (cite.Sparse03) 909 0 R] +/Limits [(cite.MRC:11) (cite.Sparse03)] >> % 2376 0 obj << -/Names [(equation.4.3) 1298 0 R (figure.1) 927 0 R (figure.2) 953 0 R (figure.3) 1399 0 R (figure.4) 1432 0 R (figure.5) 2149 0 R] -/Limits [(equation.4.3) (figure.5)] +/Names [(cite.machiels) 912 0 R (cite.metcalf) 908 0 R (cite.sblas02) 914 0 R (cite.sblas97) 913 0 R (descdata) 1017 0 R (equation.4.1) 1296 0 R] +/Limits [(cite.machiels) (equation.4.1)] >> % 2377 0 obj << -/Names [(figure.6) 2144 0 R (figure.7) 2189 0 R (figure.8) 2201 0 R (figure.9) 2228 0 R (listing.1) 1045 0 R (listing.2) 1075 0 R] -/Limits [(figure.6) (listing.2)] +/Names [(equation.4.2) 1297 0 R (equation.4.3) 1298 0 R (figure.1) 927 0 R (figure.2) 953 0 R (figure.3) 1399 0 R (figure.4) 1432 0 R] +/Limits [(equation.4.2) (figure.4)] >> % 2378 0 obj << -/Names [(listing.3) 1118 0 R (listing.4) 1137 0 R (listing.5) 1902 0 R (listing.6) 1903 0 R (lstlisting.-1) 1258 0 R (lstlisting.-10) 1972 0 R] -/Limits [(listing.3) (lstlisting.-10)] +/Names [(figure.5) 2150 0 R (figure.6) 2145 0 R (figure.7) 2190 0 R (figure.8) 2202 0 R (figure.9) 2229 0 R (listing.1) 1045 0 R] +/Limits [(figure.5) (listing.1)] >> % 2379 0 obj << -/Names [(lstlisting.-11) 1979 0 R (lstlisting.-12) 2078 0 R (lstlisting.-13) 2102 0 R (lstlisting.-14) 2160 0 R (lstlisting.-2) 1912 0 R (lstlisting.-3) 1919 0 R] -/Limits [(lstlisting.-11) (lstlisting.-3)] +/Names [(listing.2) 1075 0 R (listing.3) 1118 0 R (listing.4) 1137 0 R (listing.5) 1903 0 R (listing.6) 1904 0 R (lstlisting.-1) 1258 0 R] +/Limits [(listing.2) (lstlisting.-1)] >> % 2380 0 obj << -/Names [(lstlisting.-4) 1925 0 R (lstlisting.-5) 1931 0 R (lstlisting.-6) 1943 0 R (lstlisting.-7) 1950 0 R (lstlisting.-8) 1958 0 R (lstlisting.-9) 1965 0 R] -/Limits [(lstlisting.-4) (lstlisting.-9)] +/Names [(lstlisting.-10) 1973 0 R (lstlisting.-11) 1980 0 R (lstlisting.-12) 2079 0 R (lstlisting.-13) 2103 0 R (lstlisting.-14) 2161 0 R (lstlisting.-2) 1913 0 R] +/Limits [(lstlisting.-10) (lstlisting.-2)] >> % 2381 0 obj << -/Names [(lstnumber.-1.1) 1259 0 R (lstnumber.-1.2) 1260 0 R (lstnumber.-1.3) 1261 0 R (lstnumber.-1.4) 1262 0 R (lstnumber.-10.1) 1973 0 R (lstnumber.-11.1) 1980 0 R] -/Limits [(lstnumber.-1.1) (lstnumber.-11.1)] +/Names [(lstlisting.-3) 1920 0 R (lstlisting.-4) 1926 0 R (lstlisting.-5) 1932 0 R (lstlisting.-6) 1944 0 R (lstlisting.-7) 1951 0 R (lstlisting.-8) 1959 0 R] +/Limits [(lstlisting.-3) (lstlisting.-8)] >> % 2382 0 obj << -/Names [(lstnumber.-12.1) 2079 0 R (lstnumber.-12.2) 2080 0 R (lstnumber.-13.1) 2103 0 R (lstnumber.-13.2) 2104 0 R (lstnumber.-14.1) 2161 0 R (lstnumber.-14.2) 2162 0 R] -/Limits [(lstnumber.-12.1) (lstnumber.-14.2)] +/Names [(lstlisting.-9) 1966 0 R (lstnumber.-1.1) 1259 0 R (lstnumber.-1.2) 1260 0 R (lstnumber.-1.3) 1261 0 R (lstnumber.-1.4) 1262 0 R (lstnumber.-10.1) 1974 0 R] +/Limits [(lstlisting.-9) (lstnumber.-10.1)] >> % 2383 0 obj << -/Names [(lstnumber.-14.3) 2163 0 R (lstnumber.-14.4) 2164 0 R (lstnumber.-14.5) 2165 0 R (lstnumber.-14.6) 2166 0 R (lstnumber.-14.7) 2167 0 R (lstnumber.-2.1) 1913 0 R] -/Limits [(lstnumber.-14.3) (lstnumber.-2.1)] +/Names [(lstnumber.-11.1) 1981 0 R (lstnumber.-12.1) 2080 0 R (lstnumber.-12.2) 2081 0 R (lstnumber.-13.1) 2104 0 R (lstnumber.-13.2) 2105 0 R (lstnumber.-14.1) 2162 0 R] +/Limits [(lstnumber.-11.1) (lstnumber.-14.1)] >> % 2384 0 obj << -/Names [(lstnumber.-3.1) 1920 0 R (lstnumber.-4.1) 1926 0 R (lstnumber.-5.1) 1932 0 R (lstnumber.-6.1) 1944 0 R (lstnumber.-7.1) 1951 0 R (lstnumber.-8.1) 1959 0 R] -/Limits [(lstnumber.-3.1) (lstnumber.-8.1)] +/Names [(lstnumber.-14.2) 2163 0 R (lstnumber.-14.3) 2164 0 R (lstnumber.-14.4) 2165 0 R (lstnumber.-14.5) 2166 0 R (lstnumber.-14.6) 2167 0 R (lstnumber.-14.7) 2168 0 R] +/Limits [(lstnumber.-14.2) (lstnumber.-14.7)] >> % 2385 0 obj << -/Names [(lstnumber.-9.1) 1966 0 R (page.1) 683 0 R (page.10) 1016 0 R (page.100) 1679 0 R (page.101) 1684 0 R (page.102) 1690 0 R] -/Limits [(lstnumber.-9.1) (page.102)] +/Names [(lstnumber.-2.1) 1914 0 R (lstnumber.-3.1) 1921 0 R (lstnumber.-4.1) 1927 0 R (lstnumber.-5.1) 1933 0 R (lstnumber.-6.1) 1945 0 R (lstnumber.-7.1) 1952 0 R] +/Limits [(lstnumber.-2.1) (lstnumber.-7.1)] >> % 2386 0 obj << -/Names [(page.103) 1696 0 R (page.104) 1703 0 R (page.105) 1709 0 R (page.106) 1716 0 R (page.107) 1724 0 R (page.108) 1728 0 R] -/Limits [(page.103) (page.108)] +/Names [(lstnumber.-8.1) 1960 0 R (lstnumber.-9.1) 1967 0 R (page.1) 683 0 R (page.10) 1016 0 R (page.100) 1679 0 R (page.101) 1684 0 R] +/Limits [(lstnumber.-8.1) (page.101)] >> % 2387 0 obj << -/Names [(page.109) 1738 0 R (page.11) 1024 0 R (page.110) 1743 0 R (page.111) 1747 0 R (page.112) 1760 0 R (page.113) 1764 0 R] -/Limits [(page.109) (page.113)] +/Names [(page.102) 1690 0 R (page.103) 1696 0 R (page.104) 1703 0 R (page.105) 1709 0 R (page.106) 1716 0 R (page.107) 1724 0 R] +/Limits [(page.102) (page.107)] >> % 2388 0 obj << -/Names [(page.114) 1770 0 R (page.115) 1776 0 R (page.116) 1784 0 R (page.117) 1788 0 R (page.118) 1792 0 R (page.119) 1796 0 R] -/Limits [(page.114) (page.119)] +/Names [(page.108) 1728 0 R (page.109) 1738 0 R (page.11) 1024 0 R (page.110) 1743 0 R (page.111) 1747 0 R (page.112) 1761 0 R] +/Limits [(page.108) (page.112)] >> % 2389 0 obj << -/Names [(page.12) 1035 0 R (page.120) 1800 0 R (page.121) 1804 0 R (page.122) 1809 0 R (page.123) 1817 0 R (page.124) 1821 0 R] -/Limits [(page.12) (page.124)] +/Names [(page.113) 1765 0 R (page.114) 1771 0 R (page.115) 1777 0 R (page.116) 1785 0 R (page.117) 1789 0 R (page.118) 1793 0 R] +/Limits [(page.113) (page.118)] >> % 2390 0 obj << -/Names [(page.125) 1828 0 R (page.126) 1833 0 R (page.127) 1840 0 R (page.128) 1845 0 R (page.129) 1852 0 R (page.13) 1051 0 R] -/Limits [(page.125) (page.13)] +/Names [(page.119) 1797 0 R (page.12) 1035 0 R (page.120) 1801 0 R (page.121) 1805 0 R (page.122) 1810 0 R (page.123) 1818 0 R] +/Limits [(page.119) (page.123)] >> % 2391 0 obj << -/Names [(page.130) 1856 0 R (page.131) 1863 0 R (page.132) 1867 0 R (page.133) 1874 0 R (page.134) 1879 0 R (page.135) 1889 0 R] -/Limits [(page.130) (page.135)] +/Names [(page.124) 1822 0 R (page.125) 1830 0 R (page.126) 1834 0 R (page.127) 1841 0 R (page.128) 1846 0 R (page.129) 1853 0 R] +/Limits [(page.124) (page.129)] >> % 2392 0 obj << -/Names [(page.136) 1894 0 R (page.137) 1901 0 R (page.138) 1907 0 R (page.139) 1911 0 R (page.14) 1056 0 R (page.140) 1918 0 R] -/Limits [(page.136) (page.140)] +/Names [(page.13) 1051 0 R (page.130) 1857 0 R (page.131) 1864 0 R (page.132) 1868 0 R (page.133) 1875 0 R (page.134) 1880 0 R] +/Limits [(page.13) (page.134)] >> % 2393 0 obj << -/Names [(page.141) 1924 0 R (page.142) 1930 0 R (page.143) 1936 0 R (page.144) 1942 0 R (page.145) 1949 0 R (page.146) 1957 0 R] -/Limits [(page.141) (page.146)] +/Names [(page.135) 1890 0 R (page.136) 1895 0 R (page.137) 1902 0 R (page.138) 1908 0 R (page.139) 1912 0 R (page.14) 1056 0 R] +/Limits [(page.135) (page.14)] >> % 2394 0 obj << -/Names [(page.147) 1964 0 R (page.148) 1971 0 R (page.149) 1978 0 R (page.15) 1060 0 R (page.150) 1984 0 R (page.151) 1988 0 R] -/Limits [(page.147) (page.151)] +/Names [(page.140) 1919 0 R (page.141) 1925 0 R (page.142) 1931 0 R (page.143) 1937 0 R (page.144) 1943 0 R (page.145) 1950 0 R] +/Limits [(page.140) (page.145)] >> % 2395 0 obj << -/Names [(page.152) 1996 0 R (page.153) 2007 0 R (page.154) 2011 0 R (page.155) 2020 0 R (page.156) 2024 0 R (page.157) 2033 0 R] -/Limits [(page.152) (page.157)] +/Names [(page.146) 1958 0 R (page.147) 1965 0 R (page.148) 1972 0 R (page.149) 1979 0 R (page.15) 1060 0 R (page.150) 1985 0 R] +/Limits [(page.146) (page.150)] >> % 2396 0 obj << -/Names [(page.158) 2039 0 R (page.159) 2043 0 R (page.16) 1065 0 R (page.160) 2049 0 R (page.161) 2058 0 R (page.162) 2065 0 R] -/Limits [(page.158) (page.162)] +/Names [(page.151) 1989 0 R (page.152) 1997 0 R (page.153) 2008 0 R (page.154) 2012 0 R (page.155) 2021 0 R (page.156) 2025 0 R] +/Limits [(page.151) (page.156)] >> % 2397 0 obj << -/Names [(page.163) 2069 0 R (page.164) 2077 0 R (page.165) 2088 0 R (page.166) 2093 0 R (page.167) 2101 0 R (page.168) 2110 0 R] -/Limits [(page.163) (page.168)] +/Names [(page.157) 2034 0 R (page.158) 2040 0 R (page.159) 2044 0 R (page.16) 1065 0 R (page.160) 2051 0 R (page.161) 2059 0 R] +/Limits [(page.157) (page.161)] >> % 2398 0 obj << -/Names [(page.169) 2114 0 R (page.17) 1072 0 R (page.170) 2125 0 R (page.171) 2139 0 R (page.172) 2148 0 R (page.173) 2159 0 R] -/Limits [(page.169) (page.173)] +/Names [(page.162) 2066 0 R (page.163) 2070 0 R (page.164) 2078 0 R (page.165) 2089 0 R (page.166) 2094 0 R (page.167) 2102 0 R] +/Limits [(page.162) (page.167)] >> % 2399 0 obj << -/Names [(page.174) 2188 0 R (page.175) 2208 0 R (page.176) 2227 0 R (page.177) 2243 0 R (page.178) 2247 0 R (page.179) 2251 0 R] -/Limits [(page.174) (page.179)] +/Names [(page.168) 2111 0 R (page.169) 2115 0 R (page.17) 1072 0 R (page.170) 2126 0 R (page.171) 2140 0 R (page.172) 2149 0 R] +/Limits [(page.168) (page.172)] >> % 2400 0 obj << -/Names [(page.18) 1080 0 R (page.180) 2256 0 R (page.181) 2260 0 R (page.182) 2265 0 R (page.183) 2269 0 R (page.184) 2278 0 R] -/Limits [(page.18) (page.184)] +/Names [(page.173) 2160 0 R (page.174) 2189 0 R (page.175) 2209 0 R (page.176) 2228 0 R (page.177) 2244 0 R (page.178) 2248 0 R] +/Limits [(page.173) (page.178)] >> % 2401 0 obj << -/Names [(page.19) 1085 0 R (page.2) 693 0 R (page.20) 1091 0 R (page.21) 1095 0 R (page.22) 1099 0 R (page.23) 1105 0 R] -/Limits [(page.19) (page.23)] +/Names [(page.179) 2252 0 R (page.18) 1080 0 R (page.180) 2257 0 R (page.181) 2261 0 R (page.182) 2266 0 R (page.183) 2270 0 R] +/Limits [(page.179) (page.183)] >> % 2402 0 obj << -/Names [(page.24) 1109 0 R (page.25) 1115 0 R (page.26) 1122 0 R (page.27) 1128 0 R (page.28) 1135 0 R (page.29) 1141 0 R] -/Limits [(page.24) (page.29)] +/Names [(page.184) 2279 0 R (page.19) 1085 0 R (page.2) 693 0 R (page.20) 1091 0 R (page.21) 1095 0 R (page.22) 1099 0 R] +/Limits [(page.184) (page.22)] >> % 2403 0 obj << -/Names [(page.3) 926 0 R (page.30) 1145 0 R (page.31) 1156 0 R (page.32) 1164 0 R (page.33) 1174 0 R (page.34) 1180 0 R] -/Limits [(page.3) (page.34)] +/Names [(page.23) 1105 0 R (page.24) 1109 0 R (page.25) 1115 0 R (page.26) 1122 0 R (page.27) 1128 0 R (page.28) 1135 0 R] +/Limits [(page.23) (page.28)] >> % 2404 0 obj << -/Names [(page.35) 1191 0 R (page.36) 1196 0 R (page.37) 1203 0 R (page.38) 1209 0 R (page.39) 1217 0 R (page.4) 939 0 R] -/Limits [(page.35) (page.4)] +/Names [(page.29) 1141 0 R (page.3) 926 0 R (page.30) 1145 0 R (page.31) 1156 0 R (page.32) 1164 0 R (page.33) 1174 0 R] +/Limits [(page.29) (page.33)] >> % 2405 0 obj << -/Names [(page.40) 1225 0 R (page.41) 1230 0 R (page.42) 1238 0 R (page.43) 1243 0 R (page.44) 1251 0 R (page.45) 1256 0 R] -/Limits [(page.40) (page.45)] +/Names [(page.34) 1180 0 R (page.35) 1191 0 R (page.36) 1196 0 R (page.37) 1203 0 R (page.38) 1209 0 R (page.39) 1217 0 R] +/Limits [(page.34) (page.39)] >> % 2406 0 obj << -/Names [(page.46) 1269 0 R (page.47) 1276 0 R (page.48) 1284 0 R (page.49) 1295 0 R (page.5) 952 0 R (page.50) 1311 0 R] -/Limits [(page.46) (page.50)] +/Names [(page.4) 939 0 R (page.40) 1225 0 R (page.41) 1230 0 R (page.42) 1238 0 R (page.43) 1243 0 R (page.44) 1251 0 R] +/Limits [(page.4) (page.44)] >> % 2407 0 obj << -/Names [(page.51) 1317 0 R (page.52) 1328 0 R (page.53) 1334 0 R (page.54) 1345 0 R (page.55) 1350 0 R (page.56) 1362 0 R] -/Limits [(page.51) (page.56)] +/Names [(page.45) 1256 0 R (page.46) 1269 0 R (page.47) 1276 0 R (page.48) 1284 0 R (page.49) 1295 0 R (page.5) 952 0 R] +/Limits [(page.45) (page.5)] >> % 2408 0 obj << -/Names [(page.57) 1367 0 R (page.58) 1376 0 R (page.59) 1382 0 R (page.6) 964 0 R (page.60) 1391 0 R (page.61) 1398 0 R] -/Limits [(page.57) (page.61)] +/Names [(page.50) 1311 0 R (page.51) 1317 0 R (page.52) 1328 0 R (page.53) 1334 0 R (page.54) 1345 0 R (page.55) 1350 0 R] +/Limits [(page.50) (page.55)] >> % 2409 0 obj << -/Names [(page.62) 1412 0 R (page.63) 1419 0 R (page.64) 1428 0 R (page.65) 1436 0 R (page.66) 1440 0 R (page.67) 1455 0 R] -/Limits [(page.62) (page.67)] +/Names [(page.56) 1362 0 R (page.57) 1367 0 R (page.58) 1376 0 R (page.59) 1382 0 R (page.6) 964 0 R (page.60) 1391 0 R] +/Limits [(page.56) (page.60)] >> % 2410 0 obj << -/Names [(page.68) 1461 0 R (page.69) 1467 0 R (page.7) 969 0 R (page.70) 1474 0 R (page.71) 1478 0 R (page.72) 1483 0 R] -/Limits [(page.68) (page.72)] +/Names [(page.61) 1398 0 R (page.62) 1412 0 R (page.63) 1419 0 R (page.64) 1428 0 R (page.65) 1436 0 R (page.66) 1440 0 R] +/Limits [(page.61) (page.66)] >> % 2411 0 obj << -/Names [(page.73) 1489 0 R (page.74) 1496 0 R (page.75) 1507 0 R (page.76) 1512 0 R (page.77) 1521 0 R (page.78) 1528 0 R] -/Limits [(page.73) (page.78)] +/Names [(page.67) 1455 0 R (page.68) 1461 0 R (page.69) 1467 0 R (page.7) 969 0 R (page.70) 1474 0 R (page.71) 1478 0 R] +/Limits [(page.67) (page.71)] >> % 2412 0 obj << -/Names [(page.79) 1533 0 R (page.8) 984 0 R (page.80) 1540 0 R (page.81) 1544 0 R (page.82) 1552 0 R (page.83) 1557 0 R] -/Limits [(page.79) (page.83)] +/Names [(page.72) 1483 0 R (page.73) 1489 0 R (page.74) 1496 0 R (page.75) 1507 0 R (page.76) 1512 0 R (page.77) 1521 0 R] +/Limits [(page.72) (page.77)] >> % 2413 0 obj << -/Names [(page.84) 1565 0 R (page.85) 1571 0 R (page.86) 1581 0 R (page.87) 1594 0 R (page.88) 1598 0 R (page.89) 1611 0 R] -/Limits [(page.84) (page.89)] +/Names [(page.78) 1528 0 R (page.79) 1533 0 R (page.8) 984 0 R (page.80) 1540 0 R (page.81) 1544 0 R (page.82) 1552 0 R] +/Limits [(page.78) (page.82)] >> % 2414 0 obj << -/Names [(page.9) 1005 0 R (page.90) 1618 0 R (page.91) 1625 0 R (page.92) 1630 0 R (page.93) 1637 0 R (page.94) 1641 0 R] -/Limits [(page.9) (page.94)] +/Names [(page.83) 1557 0 R (page.84) 1565 0 R (page.85) 1571 0 R (page.86) 1581 0 R (page.87) 1594 0 R (page.88) 1598 0 R] +/Limits [(page.83) (page.88)] >> % 2415 0 obj << -/Names [(page.95) 1650 0 R (page.96) 1658 0 R (page.97) 1662 0 R (page.98) 1668 0 R (page.99) 1672 0 R (page.i) 739 0 R] -/Limits [(page.95) (page.i)] +/Names [(page.89) 1611 0 R (page.9) 1005 0 R (page.90) 1618 0 R (page.91) 1625 0 R (page.92) 1630 0 R (page.93) 1637 0 R] +/Limits [(page.89) (page.93)] >> % 2416 0 obj << -/Names [(page.ii) 795 0 R (page.iii) 843 0 R (page.iv) 886 0 R (precdata) 1136 0 R (section*.1) 740 0 R (section*.10) 634 0 R] -/Limits [(page.ii) (section*.10)] +/Names [(page.94) 1641 0 R (page.95) 1650 0 R (page.96) 1658 0 R (page.97) 1662 0 R (page.98) 1668 0 R (page.99) 1672 0 R] +/Limits [(page.94) (page.99)] >> % 2417 0 obj << -/Names [(section*.11) 638 0 R (section*.12) 642 0 R (section*.13) 646 0 R (section*.14) 650 0 R (section*.15) 654 0 R (section*.16) 658 0 R] -/Limits [(section*.11) (section*.16)] +/Names [(page.i) 739 0 R (page.ii) 795 0 R (page.iii) 843 0 R (page.iv) 886 0 R (precdata) 1136 0 R (section*.1) 740 0 R] +/Limits [(page.i) (section*.1)] >> % 2418 0 obj << -/Names [(section*.17) 662 0 R (section*.18) 666 0 R (section*.19) 670 0 R (section*.2) 7 0 R (section*.20) 674 0 R (section*.21) 2270 0 R] -/Limits [(section*.17) (section*.21)] +/Names [(section*.10) 634 0 R (section*.11) 638 0 R (section*.12) 642 0 R (section*.13) 646 0 R (section*.14) 650 0 R (section*.15) 654 0 R] +/Limits [(section*.10) (section*.15)] >> % 2419 0 obj << -/Names [(section*.3) 2140 0 R (section*.4) 2168 0 R (section*.5) 2190 0 R (section*.6) 2210 0 R (section*.7) 622 0 R (section*.8) 626 0 R] -/Limits [(section*.3) (section*.8)] +/Names [(section*.16) 658 0 R (section*.17) 662 0 R (section*.18) 666 0 R (section*.19) 670 0 R (section*.2) 7 0 R (section*.20) 674 0 R] +/Limits [(section*.16) (section*.20)] >> % 2420 0 obj << -/Names [(section*.9) 630 0 R (section.1) 11 0 R (section.10) 545 0 R (section.11) 585 0 R (section.12) 597 0 R (section.13) 618 0 R] -/Limits [(section*.9) (section.13)] +/Names [(section*.21) 2271 0 R (section*.3) 2141 0 R (section*.4) 2169 0 R (section*.5) 2191 0 R (section*.6) 2211 0 R (section*.7) 622 0 R] +/Limits [(section*.21) (section*.7)] >> % 2421 0 obj << -/Names [(section.2) 15 0 R (section.3) 39 0 R (section.4) 224 0 R (section.5) 292 0 R (section.6) 312 0 R (section.7) 425 0 R] -/Limits [(section.2) (section.7)] +/Names [(section*.8) 626 0 R (section*.9) 630 0 R (section.1) 11 0 R (section.10) 545 0 R (section.11) 585 0 R (section.12) 597 0 R] +/Limits [(section*.8) (section.12)] >> % 2422 0 obj << -/Names [(section.8) 497 0 R (section.9) 517 0 R (spbasedata) 1081 0 R (spdata) 1073 0 R (subsection.10.1) 549 0 R (subsection.10.2) 553 0 R] -/Limits [(section.8) (subsection.10.2)] +/Names [(section.13) 618 0 R (section.2) 15 0 R (section.3) 39 0 R (section.4) 224 0 R (section.5) 292 0 R (section.6) 312 0 R] +/Limits [(section.13) (section.6)] >> % 2423 0 obj << -/Names [(subsection.10.3) 557 0 R (subsection.10.4) 561 0 R (subsection.10.5) 565 0 R (subsection.10.6) 569 0 R (subsection.10.7) 573 0 R (subsection.10.8) 577 0 R] -/Limits [(subsection.10.3) (subsection.10.8)] +/Names [(section.7) 425 0 R (section.8) 497 0 R (section.9) 517 0 R (spbasedata) 1081 0 R (spdata) 1073 0 R (subsection.10.1) 549 0 R] +/Limits [(section.7) (subsection.10.1)] >> % 2424 0 obj << -/Names [(subsection.10.9) 581 0 R (subsection.11.1) 589 0 R (subsection.11.2) 593 0 R (subsection.12.1) 601 0 R (subsection.12.2) 606 0 R (subsection.12.3) 610 0 R] -/Limits [(subsection.10.9) (subsection.12.3)] +/Names [(subsection.10.2) 553 0 R (subsection.10.3) 557 0 R (subsection.10.4) 561 0 R (subsection.10.5) 565 0 R (subsection.10.6) 569 0 R (subsection.10.7) 573 0 R] +/Limits [(subsection.10.2) (subsection.10.7)] >> % 2425 0 obj << -/Names [(subsection.12.4) 614 0 R (subsection.2.1) 19 0 R (subsection.2.2) 23 0 R (subsection.2.3) 27 0 R (subsection.2.4) 35 0 R (subsection.3.1) 43 0 R] -/Limits [(subsection.12.4) (subsection.3.1)] +/Names [(subsection.10.8) 577 0 R (subsection.10.9) 581 0 R (subsection.11.1) 589 0 R (subsection.11.2) 593 0 R (subsection.12.1) 601 0 R (subsection.12.2) 606 0 R] +/Limits [(subsection.10.8) (subsection.12.2)] >> % 2426 0 obj << -/Names [(subsection.3.2) 107 0 R (subsection.3.3) 187 0 R (subsection.3.4) 216 0 R (subsection.3.5) 220 0 R (subsection.4.1) 228 0 R (subsection.4.10) 264 0 R] -/Limits [(subsection.3.2) (subsection.4.10)] +/Names [(subsection.12.3) 610 0 R (subsection.12.4) 614 0 R (subsection.2.1) 19 0 R (subsection.2.2) 23 0 R (subsection.2.3) 27 0 R (subsection.2.4) 35 0 R] +/Limits [(subsection.12.3) (subsection.2.4)] >> % 2427 0 obj << -/Names [(subsection.4.11) 268 0 R (subsection.4.12) 272 0 R (subsection.4.13) 276 0 R (subsection.4.14) 280 0 R (subsection.4.15) 284 0 R (subsection.4.16) 288 0 R] -/Limits [(subsection.4.11) (subsection.4.16)] +/Names [(subsection.3.1) 43 0 R (subsection.3.2) 107 0 R (subsection.3.3) 187 0 R (subsection.3.4) 216 0 R (subsection.3.5) 220 0 R (subsection.4.1) 228 0 R] +/Limits [(subsection.3.1) (subsection.4.1)] >> % 2428 0 obj << -/Names [(subsection.4.2) 232 0 R (subsection.4.3) 236 0 R (subsection.4.4) 240 0 R (subsection.4.5) 244 0 R (subsection.4.6) 248 0 R (subsection.4.7) 252 0 R] -/Limits [(subsection.4.2) (subsection.4.7)] +/Names [(subsection.4.10) 264 0 R (subsection.4.11) 268 0 R (subsection.4.12) 272 0 R (subsection.4.13) 276 0 R (subsection.4.14) 280 0 R (subsection.4.15) 284 0 R] +/Limits [(subsection.4.10) (subsection.4.15)] >> % 2429 0 obj << -/Names [(subsection.4.8) 256 0 R (subsection.4.9) 260 0 R (subsection.5.1) 296 0 R (subsection.5.2) 300 0 R (subsection.5.3) 304 0 R (subsection.5.4) 308 0 R] -/Limits [(subsection.4.8) (subsection.5.4)] +/Names [(subsection.4.16) 288 0 R (subsection.4.2) 232 0 R (subsection.4.3) 236 0 R (subsection.4.4) 240 0 R (subsection.4.5) 244 0 R (subsection.4.6) 248 0 R] +/Limits [(subsection.4.16) (subsection.4.6)] >> % 2430 0 obj << -/Names [(subsection.6.1) 316 0 R (subsection.6.10) 352 0 R (subsection.6.11) 356 0 R (subsection.6.12) 360 0 R (subsection.6.13) 364 0 R (subsection.6.14) 368 0 R] -/Limits [(subsection.6.1) (subsection.6.14)] +/Names [(subsection.4.7) 252 0 R (subsection.4.8) 256 0 R (subsection.4.9) 260 0 R (subsection.5.1) 296 0 R (subsection.5.2) 300 0 R (subsection.5.3) 304 0 R] +/Limits [(subsection.4.7) (subsection.5.3)] >> % 2431 0 obj << -/Names [(subsection.6.15) 372 0 R (subsection.6.16) 376 0 R (subsection.6.17) 380 0 R (subsection.6.18) 384 0 R (subsection.6.19) 388 0 R (subsection.6.2) 320 0 R] -/Limits [(subsection.6.15) (subsection.6.2)] +/Names [(subsection.5.4) 308 0 R (subsection.6.1) 316 0 R (subsection.6.10) 352 0 R (subsection.6.11) 356 0 R (subsection.6.12) 360 0 R (subsection.6.13) 364 0 R] +/Limits [(subsection.5.4) (subsection.6.13)] >> % 2432 0 obj << -/Names [(subsection.6.20) 392 0 R (subsection.6.21) 396 0 R (subsection.6.22) 400 0 R (subsection.6.23) 405 0 R (subsection.6.24) 409 0 R (subsection.6.25) 413 0 R] -/Limits [(subsection.6.20) (subsection.6.25)] +/Names [(subsection.6.14) 368 0 R (subsection.6.15) 372 0 R (subsection.6.16) 376 0 R (subsection.6.17) 380 0 R (subsection.6.18) 384 0 R (subsection.6.19) 388 0 R] +/Limits [(subsection.6.14) (subsection.6.19)] >> % 2433 0 obj << -/Names [(subsection.6.26) 417 0 R (subsection.6.27) 421 0 R (subsection.6.3) 324 0 R (subsection.6.4) 328 0 R (subsection.6.5) 332 0 R (subsection.6.6) 336 0 R] -/Limits [(subsection.6.26) (subsection.6.6)] +/Names [(subsection.6.2) 320 0 R (subsection.6.20) 392 0 R (subsection.6.21) 396 0 R (subsection.6.22) 400 0 R (subsection.6.23) 405 0 R (subsection.6.24) 409 0 R] +/Limits [(subsection.6.2) (subsection.6.24)] >> % 2434 0 obj << -/Names [(subsection.6.7) 340 0 R (subsection.6.8) 344 0 R (subsection.6.9) 348 0 R (subsection.7.1) 429 0 R (subsection.7.10) 465 0 R (subsection.7.11) 469 0 R] -/Limits [(subsection.6.7) (subsection.7.11)] +/Names [(subsection.6.25) 413 0 R (subsection.6.26) 417 0 R (subsection.6.27) 421 0 R (subsection.6.3) 324 0 R (subsection.6.4) 328 0 R (subsection.6.5) 332 0 R] +/Limits [(subsection.6.25) (subsection.6.5)] >> % 2435 0 obj << -/Names [(subsection.7.12) 473 0 R (subsection.7.13) 477 0 R (subsection.7.14) 481 0 R (subsection.7.15) 485 0 R (subsection.7.16) 489 0 R (subsection.7.17) 493 0 R] -/Limits [(subsection.7.12) (subsection.7.17)] +/Names [(subsection.6.6) 336 0 R (subsection.6.7) 340 0 R (subsection.6.8) 344 0 R (subsection.6.9) 348 0 R (subsection.7.1) 429 0 R (subsection.7.10) 465 0 R] +/Limits [(subsection.6.6) (subsection.7.10)] >> % 2436 0 obj << -/Names [(subsection.7.2) 433 0 R (subsection.7.3) 437 0 R (subsection.7.4) 441 0 R (subsection.7.5) 445 0 R (subsection.7.6) 449 0 R (subsection.7.7) 453 0 R] -/Limits [(subsection.7.2) (subsection.7.7)] +/Names [(subsection.7.11) 469 0 R (subsection.7.12) 473 0 R (subsection.7.13) 477 0 R (subsection.7.14) 481 0 R (subsection.7.15) 485 0 R (subsection.7.16) 489 0 R] +/Limits [(subsection.7.11) (subsection.7.16)] >> % 2437 0 obj << -/Names [(subsection.7.8) 457 0 R (subsection.7.9) 461 0 R (subsection.8.1) 501 0 R (subsection.8.2) 505 0 R (subsection.8.3) 509 0 R (subsection.8.4) 513 0 R] -/Limits [(subsection.7.8) (subsection.8.4)] +/Names [(subsection.7.17) 493 0 R (subsection.7.2) 433 0 R (subsection.7.3) 437 0 R (subsection.7.4) 441 0 R (subsection.7.5) 445 0 R (subsection.7.6) 449 0 R] +/Limits [(subsection.7.17) (subsection.7.6)] >> % 2438 0 obj << -/Names [(subsection.9.1) 521 0 R (subsection.9.2) 525 0 R (subsection.9.3) 529 0 R (subsection.9.4) 533 0 R (subsection.9.5) 537 0 R (subsection.9.6) 541 0 R] -/Limits [(subsection.9.1) (subsection.9.6)] +/Names [(subsection.7.7) 453 0 R (subsection.7.8) 457 0 R (subsection.7.9) 461 0 R (subsection.8.1) 501 0 R (subsection.8.2) 505 0 R (subsection.8.3) 509 0 R] +/Limits [(subsection.7.7) (subsection.8.3)] >> % 2439 0 obj << -/Names [(subsubsection.2.3.1) 31 0 R (subsubsection.3.1.1) 47 0 R (subsubsection.3.1.10) 83 0 R (subsubsection.3.1.11) 87 0 R (subsubsection.3.1.12) 91 0 R (subsubsection.3.1.13) 95 0 R] -/Limits [(subsubsection.2.3.1) (subsubsection.3.1.13)] +/Names [(subsection.8.4) 513 0 R (subsection.9.1) 521 0 R (subsection.9.2) 525 0 R (subsection.9.3) 529 0 R (subsection.9.4) 533 0 R (subsection.9.5) 537 0 R] +/Limits [(subsection.8.4) (subsection.9.5)] >> % 2440 0 obj << -/Names [(subsubsection.3.1.14) 99 0 R (subsubsection.3.1.15) 103 0 R (subsubsection.3.1.2) 51 0 R (subsubsection.3.1.3) 55 0 R (subsubsection.3.1.4) 59 0 R (subsubsection.3.1.5) 63 0 R] -/Limits [(subsubsection.3.1.14) (subsubsection.3.1.5)] +/Names [(subsection.9.6) 541 0 R (subsubsection.2.3.1) 31 0 R (subsubsection.3.1.1) 47 0 R (subsubsection.3.1.10) 83 0 R (subsubsection.3.1.11) 87 0 R (subsubsection.3.1.12) 91 0 R] +/Limits [(subsection.9.6) (subsubsection.3.1.12)] >> % 2441 0 obj << -/Names [(subsubsection.3.1.6) 67 0 R (subsubsection.3.1.7) 71 0 R (subsubsection.3.1.8) 75 0 R (subsubsection.3.1.9) 79 0 R (subsubsection.3.2.1) 111 0 R (subsubsection.3.2.10) 147 0 R] -/Limits [(subsubsection.3.1.6) (subsubsection.3.2.10)] +/Names [(subsubsection.3.1.13) 95 0 R (subsubsection.3.1.14) 99 0 R (subsubsection.3.1.15) 103 0 R (subsubsection.3.1.2) 51 0 R (subsubsection.3.1.3) 55 0 R (subsubsection.3.1.4) 59 0 R] +/Limits [(subsubsection.3.1.13) (subsubsection.3.1.4)] >> % 2442 0 obj << -/Names [(subsubsection.3.2.11) 151 0 R (subsubsection.3.2.12) 155 0 R (subsubsection.3.2.13) 159 0 R (subsubsection.3.2.14) 163 0 R (subsubsection.3.2.15) 167 0 R (subsubsection.3.2.16) 171 0 R] -/Limits [(subsubsection.3.2.11) (subsubsection.3.2.16)] +/Names [(subsubsection.3.1.5) 63 0 R (subsubsection.3.1.6) 67 0 R (subsubsection.3.1.7) 71 0 R (subsubsection.3.1.8) 75 0 R (subsubsection.3.1.9) 79 0 R (subsubsection.3.2.1) 111 0 R] +/Limits [(subsubsection.3.1.5) (subsubsection.3.2.1)] >> % 2443 0 obj << -/Names [(subsubsection.3.2.17) 175 0 R (subsubsection.3.2.18) 179 0 R (subsubsection.3.2.19) 183 0 R (subsubsection.3.2.2) 115 0 R (subsubsection.3.2.3) 119 0 R (subsubsection.3.2.4) 123 0 R] -/Limits [(subsubsection.3.2.17) (subsubsection.3.2.4)] +/Names [(subsubsection.3.2.10) 147 0 R (subsubsection.3.2.11) 151 0 R (subsubsection.3.2.12) 155 0 R (subsubsection.3.2.13) 159 0 R (subsubsection.3.2.14) 163 0 R (subsubsection.3.2.15) 167 0 R] +/Limits [(subsubsection.3.2.10) (subsubsection.3.2.15)] >> % 2444 0 obj << -/Names [(subsubsection.3.2.5) 127 0 R (subsubsection.3.2.6) 131 0 R (subsubsection.3.2.7) 135 0 R (subsubsection.3.2.8) 139 0 R (subsubsection.3.2.9) 143 0 R (subsubsection.3.3.1) 191 0 R] -/Limits [(subsubsection.3.2.5) (subsubsection.3.3.1)] +/Names [(subsubsection.3.2.16) 171 0 R (subsubsection.3.2.17) 175 0 R (subsubsection.3.2.18) 179 0 R (subsubsection.3.2.19) 183 0 R (subsubsection.3.2.2) 115 0 R (subsubsection.3.2.3) 119 0 R] +/Limits [(subsubsection.3.2.16) (subsubsection.3.2.3)] >> % 2445 0 obj << -/Names [(subsubsection.3.3.2) 195 0 R (subsubsection.3.3.3) 199 0 R (subsubsection.3.3.4) 204 0 R (subsubsection.3.3.5) 208 0 R (subsubsection.3.3.6) 212 0 R (table.1) 1129 0 R] -/Limits [(subsubsection.3.3.2) (table.1)] +/Names [(subsubsection.3.2.4) 123 0 R (subsubsection.3.2.5) 127 0 R (subsubsection.3.2.6) 131 0 R (subsubsection.3.2.7) 135 0 R (subsubsection.3.2.8) 139 0 R (subsubsection.3.2.9) 143 0 R] +/Limits [(subsubsection.3.2.4) (subsubsection.3.2.9)] >> % 2446 0 obj << -/Names [(table.10) 1277 0 R (table.11) 1286 0 R (table.12) 1299 0 R (table.13) 1318 0 R (table.14) 1346 0 R (table.15) 1363 0 R] -/Limits [(table.10) (table.15)] +/Names [(subsubsection.3.3.1) 191 0 R (subsubsection.3.3.2) 195 0 R (subsubsection.3.3.3) 199 0 R (subsubsection.3.3.4) 204 0 R (subsubsection.3.3.5) 208 0 R (subsubsection.3.3.6) 212 0 R] +/Limits [(subsubsection.3.3.1) (subsubsection.3.3.6)] >> % 2447 0 obj << -/Names [(table.16) 1377 0 R (table.17) 1392 0 R (table.18) 1420 0 R (table.19) 1456 0 R (table.2) 1175 0 R (table.20) 1468 0 R] -/Limits [(table.16) (table.20)] +/Names [(table.1) 1129 0 R (table.10) 1277 0 R (table.11) 1286 0 R (table.12) 1299 0 R (table.13) 1318 0 R (table.14) 1346 0 R] +/Limits [(table.1) (table.14)] >> % 2448 0 obj << -/Names [(table.21) 1998 0 R (table.22) 2143 0 R (table.3) 1192 0 R (table.4) 1204 0 R (table.5) 1218 0 R (table.6) 1226 0 R] -/Limits [(table.21) (table.6)] +/Names [(table.15) 1363 0 R (table.16) 1377 0 R (table.17) 1392 0 R (table.18) 1420 0 R (table.19) 1456 0 R (table.2) 1175 0 R] +/Limits [(table.15) (table.2)] >> % 2449 0 obj << -/Names [(table.7) 1239 0 R (table.8) 1252 0 R (table.9) 1270 0 R (title.0) 3 0 R (vbasedata) 1061 0 R (vdata) 1116 0 R] -/Limits [(table.7) (vdata)] +/Names [(table.20) 1468 0 R (table.21) 1999 0 R (table.22) 2144 0 R (table.3) 1192 0 R (table.4) 1204 0 R (table.5) 1218 0 R] +/Limits [(table.20) (table.5)] >> % 2450 0 obj << -/Kids [2344 0 R 2345 0 R 2346 0 R 2347 0 R 2348 0 R 2349 0 R] -/Limits [(Doc-Start) (Item.125)] +/Names [(table.6) 1226 0 R (table.7) 1239 0 R (table.8) 1252 0 R (table.9) 1270 0 R (title.0) 3 0 R (vbasedata) 1061 0 R] +/Limits [(table.6) (vbasedata)] >> % 2451 0 obj << -/Kids [2350 0 R 2351 0 R 2352 0 R 2353 0 R 2354 0 R 2355 0 R] -/Limits [(Item.126) (Item.23)] +/Names [(vdata) 1116 0 R] +/Limits [(vdata) (vdata)] >> % 2452 0 obj << -/Kids [2356 0 R 2357 0 R 2358 0 R 2359 0 R 2360 0 R 2361 0 R] -/Limits [(Item.24) (Item.56)] +/Kids [2345 0 R 2346 0 R 2347 0 R 2348 0 R 2349 0 R 2350 0 R] +/Limits [(Doc-Start) (Item.125)] >> % 2453 0 obj << -/Kids [2362 0 R 2363 0 R 2364 0 R 2365 0 R 2366 0 R 2367 0 R] -/Limits [(Item.57) (Item.89)] +/Kids [2351 0 R 2352 0 R 2353 0 R 2354 0 R 2355 0 R 2356 0 R] +/Limits [(Item.126) (Item.22)] >> % 2454 0 obj << -/Kids [2368 0 R 2369 0 R 2370 0 R 2371 0 R 2372 0 R 2373 0 R] -/Limits [(Item.9) (cite.machiels)] +/Kids [2357 0 R 2358 0 R 2359 0 R 2360 0 R 2361 0 R 2362 0 R] +/Limits [(Item.23) (Item.55)] >> % 2455 0 obj << -/Kids [2375 0 R 2376 0 R 2377 0 R 2378 0 R 2379 0 R 2380 0 R] -/Limits [(cite.metcalf) (lstlisting.-9)] +/Kids [2363 0 R 2364 0 R 2365 0 R 2366 0 R 2367 0 R 2368 0 R] +/Limits [(Item.56) (Item.88)] >> % 2456 0 obj << -/Kids [2381 0 R 2382 0 R 2383 0 R 2384 0 R 2385 0 R 2386 0 R] -/Limits [(lstnumber.-1.1) (page.108)] +/Kids [2369 0 R 2370 0 R 2371 0 R 2372 0 R 2373 0 R 2375 0 R] +/Limits [(Item.89) (cite.Sparse03)] >> % 2457 0 obj << -/Kids [2387 0 R 2388 0 R 2389 0 R 2390 0 R 2391 0 R 2392 0 R] -/Limits [(page.109) (page.140)] +/Kids [2376 0 R 2377 0 R 2378 0 R 2379 0 R 2380 0 R 2381 0 R] +/Limits [(cite.machiels) (lstlisting.-8)] >> % 2458 0 obj << -/Kids [2393 0 R 2394 0 R 2395 0 R 2396 0 R 2397 0 R 2398 0 R] -/Limits [(page.141) (page.173)] +/Kids [2382 0 R 2383 0 R 2384 0 R 2385 0 R 2386 0 R 2387 0 R] +/Limits [(lstlisting.-9) (page.107)] >> % 2459 0 obj << -/Kids [2399 0 R 2400 0 R 2401 0 R 2402 0 R 2403 0 R 2404 0 R] -/Limits [(page.174) (page.4)] +/Kids [2388 0 R 2389 0 R 2390 0 R 2391 0 R 2392 0 R 2393 0 R] +/Limits [(page.108) (page.14)] >> % 2460 0 obj << -/Kids [2405 0 R 2406 0 R 2407 0 R 2408 0 R 2409 0 R 2410 0 R] -/Limits [(page.40) (page.72)] +/Kids [2394 0 R 2395 0 R 2396 0 R 2397 0 R 2398 0 R 2399 0 R] +/Limits [(page.140) (page.172)] >> % 2461 0 obj << -/Kids [2411 0 R 2412 0 R 2413 0 R 2414 0 R 2415 0 R 2416 0 R] -/Limits [(page.73) (section*.10)] +/Kids [2400 0 R 2401 0 R 2402 0 R 2403 0 R 2404 0 R 2405 0 R] +/Limits [(page.173) (page.39)] >> % 2462 0 obj << -/Kids [2417 0 R 2418 0 R 2419 0 R 2420 0 R 2421 0 R 2422 0 R] -/Limits [(section*.11) (subsection.10.2)] +/Kids [2406 0 R 2407 0 R 2408 0 R 2409 0 R 2410 0 R 2411 0 R] +/Limits [(page.4) (page.71)] >> % 2463 0 obj << -/Kids [2423 0 R 2424 0 R 2425 0 R 2426 0 R 2427 0 R 2428 0 R] -/Limits [(subsection.10.3) (subsection.4.7)] +/Kids [2412 0 R 2413 0 R 2414 0 R 2415 0 R 2416 0 R 2417 0 R] +/Limits [(page.72) (section*.1)] >> % 2464 0 obj << -/Kids [2429 0 R 2430 0 R 2431 0 R 2432 0 R 2433 0 R 2434 0 R] -/Limits [(subsection.4.8) (subsection.7.11)] +/Kids [2418 0 R 2419 0 R 2420 0 R 2421 0 R 2422 0 R 2423 0 R] +/Limits [(section*.10) (subsection.10.1)] >> % 2465 0 obj << -/Kids [2435 0 R 2436 0 R 2437 0 R 2438 0 R 2439 0 R 2440 0 R] -/Limits [(subsection.7.12) (subsubsection.3.1.5)] +/Kids [2424 0 R 2425 0 R 2426 0 R 2427 0 R 2428 0 R 2429 0 R] +/Limits [(subsection.10.2) (subsection.4.6)] >> % 2466 0 obj << -/Kids [2441 0 R 2442 0 R 2443 0 R 2444 0 R 2445 0 R 2446 0 R] -/Limits [(subsubsection.3.1.6) (table.15)] +/Kids [2430 0 R 2431 0 R 2432 0 R 2433 0 R 2434 0 R 2435 0 R] +/Limits [(subsection.4.7) (subsection.7.10)] >> % 2467 0 obj << -/Kids [2447 0 R 2448 0 R 2449 0 R] -/Limits [(table.16) (vdata)] +/Kids [2436 0 R 2437 0 R 2438 0 R 2439 0 R 2440 0 R 2441 0 R] +/Limits [(subsection.7.11) (subsubsection.3.1.4)] >> % 2468 0 obj << -/Kids [2450 0 R 2451 0 R 2452 0 R 2453 0 R 2454 0 R 2455 0 R] -/Limits [(Doc-Start) (lstlisting.-9)] +/Kids [2442 0 R 2443 0 R 2444 0 R 2445 0 R 2446 0 R 2447 0 R] +/Limits [(subsubsection.3.1.5) (table.14)] >> % 2469 0 obj << -/Kids [2456 0 R 2457 0 R 2458 0 R 2459 0 R 2460 0 R 2461 0 R] -/Limits [(lstnumber.-1.1) (section*.10)] +/Kids [2448 0 R 2449 0 R 2450 0 R 2451 0 R] +/Limits [(table.15) (vdata)] >> % 2470 0 obj << -/Kids [2462 0 R 2463 0 R 2464 0 R 2465 0 R 2466 0 R 2467 0 R] -/Limits [(section*.11) (vdata)] +/Kids [2452 0 R 2453 0 R 2454 0 R 2455 0 R 2456 0 R 2457 0 R] +/Limits [(Doc-Start) (lstlisting.-8)] >> % 2471 0 obj << -/Kids [2468 0 R 2469 0 R 2470 0 R] -/Limits [(Doc-Start) (vdata)] +/Kids [2458 0 R 2459 0 R 2460 0 R 2461 0 R 2462 0 R 2463 0 R] +/Limits [(lstlisting.-9) (section*.1)] >> % 2472 0 obj << -/Dests 2471 0 R +/Kids [2464 0 R 2465 0 R 2466 0 R 2467 0 R 2468 0 R 2469 0 R] +/Limits [(section*.10) (vdata)] >> % 2473 0 obj << -/Type /Catalog -/Pages 2340 0 R -/Outlines 2342 0 R -/Names 2472 0 R - /URI (http://ce.uniroma2.it/psblas) /PageMode/UseOutlines/PageLabels<>2<>6<>]>> -/OpenAction 677 0 R +/Kids [2470 0 R 2471 0 R 2472 0 R] +/Limits [(Doc-Start) (vdata)] >> endstream endobj -2474 0 obj +2477 0 obj << /Title (Parallel Sparse BLAS V. 3.9.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)/Keywords() -/CreationDate (D:20250605185524+02'00') -/ModDate (D:20250605185524+02'00') +/CreationDate (D:20250930190717+02'00') +/ModDate (D:20250930190717+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023) kpathsea version 6.3.5) >> endobj 2475 0 obj << +/Type /ObjStm +/N 2 +/First 15 +/Length 263 +>> +stream +2474 0 2476 35 +% 2474 0 obj +<< +/Dests 2473 0 R +>> +% 2476 0 obj +<< +/Type /Catalog +/Pages 2341 0 R +/Outlines 2343 0 R +/Names 2474 0 R + /URI (http://ce.uniroma2.it/psblas) /PageMode/UseOutlines/PageLabels<>2<>6<>]>> +/OpenAction 677 0 R +>> + +endstream +endobj +2478 0 obj +<< /Type /XRef -/Index [0 2476] -/Size 2476 +/Index [0 2479] +/Size 2479 /W [1 3 1] -/Root 2473 0 R -/Info 2474 0 R -/ID [ ] -/Length 12380 ->> -stream -ÿ]) 'Fz& 'Ez3 'Dz> 'CzF 'B  -zR 'A  z[ '@ Ó '?Ó '>Ó$ '=Ó% '<ÓE ';ÓF ':ÓG '9ÓH '8ÓL '7 ÓM '6!"ÓN '5#$ÓR '4%&ÓS '3'(ÓU '2)*ÓV '1+,ÓZ '0-.Ó[ '//0Ó\ '.12Óc '-344 ',564 '+784 '*9:4  ');<4  '(=>4 ''?@4 '&AB4 '%CD4 '$EF4 '#GH4 '"IJ4 '!KL4 ' MN4% 'OP4& 'QR4' 'ST4+ 'UV41 'WX42 'YZ43 '[\44 ']^4: '_`4; 'ab4< 'cË>\4B 'ËË4G 'ËË4H 'ËË4I 'ËË4P 'Ë Ë -4T 'Ë Ë 4^ 'Ë Ë - ' ËË ' ËË% ' ËË1 ' -ËË9 ' ËËE 'ËËP 'ËËa 'ËËþ 'ËË þ  'Ë!Ë"þ 'Ë#Ë$þ( 'Ë%Ë&þC 'Ë'Ë(þP 'Ë)Ë*þ_ %cË+Ë,g %bË-Ë.g %aË/Ë0g %`Ë1Ë2g= %_Ë3Ë4gF %^Ë5Ë6gQ %]Ë7Ë8gR %\Ë9Ë:Þ %[Ë;Ë<Þ %ZË=Ë>Þ %YË?Ë@Þ %XËAËBÞ$ %WËCËDÞ/ %VËEËFÞ: %UËGËHÞU %TËIËJL %SËKËLL %RËMËNL %QËOËPL %PËQËRL$ %OËSËTL, %NËUËVL0 %MËWËXL5 %LËYËZL? %KË[Ë\LD %JË]Ë^LJ %IË_Ë`LP %HËaËbLV %GËc”|YL\ %F””Lc %E””· %D””· %C””· %B” ” -·' %A” ” ·+ %@” ”·1 %?””·7 %>””·> %=””·B %<””·F %;””·J %:””·N %9””·R %8””·\ %7”” % %6”!”"%  %5”#”$% %4”%”&%  %3”'”(%* %2”)”*%6 %1”+”,%; %0”-”.%B %/”/”0%K %.”1”2%Q %-”3”4%W %,”5”6%] %+”7”8%c %*”9”:‘ %)”;”<‘  %(”=”>‘ %'”?”@‘ %&”A”B‘  %%”C”D‘' %$”E”F‘0 %#”G”H‘7 %"”I”J‘@ %!”K”L‘M % ”M”N‘Y %”O”P‘^ %”Q”R‘b %”S”T %”U”V  %”W”X %”Y”Z %”[”\ %”]”^3 %”_”`J %”a”bK %”c]ý{R %]]S %]]~> %]]~B %]]~C %] ] -~E %] ] ~I %] ]~J % ]]~K % ]]~L % ]]~M % -]]~N % ]]~O %]]~P %]]~T %]]~U %]] ~V %]!]"~W %]#]$]%Áæ]&]*¾«]'](â<â>â=â?Ò’]-]+ƒ0],]/]0]1]2]3]4]5]6]7]8]9]:];]<]=]>]?]@]A]B]D]F]G]H]I]J]K]L]M]N]P]R]S]T]U]V]W]X]Y]Z][]`]^].ƒº]\]]]C]E]O]Q]a]b]c  +/Root 2476 0 R +/Info 2477 0 R +/ID [<74AF8409D9443F34D74B521E914F839E> <74AF8409D9443F34D74B521E914F839E>] +/Length 12395 +>> +stream +ÿ]) (Gz& (Fz3 (Ez> (DzF (C  +zR (B  z[ (A Ó (@Ó (?Ó$ (>Ó% (=ÓE (<ÓF (;ÓG (:ÓH (9ÓL (8 ÓM (7!"ÓN (6#$ÓR (5%&ÓS (4'(ÓU (3)*ÓV (2+,ÓZ (1-.Ó[ (0/0Ó\ (/12Óc (.344 (-564 (,784 (+9:4  (*;<4  ()=>4 ((?@4 ('AB4 (&CD4 (%EF4 ($GH4 (#IJ4 ("KL4 (!MN4% ( OP4& (QR4' (ST4+ (UV41 (WX42 (YZ43 ([\44 (]^4: (_`4; (ab4< (cË>\4B (ËË4G (ËË4H (ËË4I (ËË4P (Ë Ë +4T (Ë Ë 4^ (Ë Ë + (ËË ( ËË% ( ËË1 ( ËË9 ( +ËËE ( ËËP (ËËa (ËËþ (ËË þ  (Ë!Ë"þ (Ë#Ë$þ( (Ë%Ë&þC (Ë'Ë(þP (Ë)Ë*þ_ (Ë+Ë,g &cË-Ë.g &bË/Ë0g &aË1Ë2g= &`Ë3Ë4gF &_Ë5Ë6gQ &^Ë7Ë8gR &]Ë9Ë:Þ &\Ë;Ë<Þ &[Ë=Ë>Þ &ZË?Ë@Þ &YËAËBÞ$ &XËCËDÞ/ &WËEËFÞ: &VËGËHÞU &UËIËJL &TËKËLL &SËMËNL &RËOËPL &QËQËRL$ &PËSËTL, &OËUËVL0 &NËWËXL5 &MËYËZL? &LË[Ë\LD &KË]Ë^LJ &JË_Ë`LP &IËaËbLV &HËc”|YL\ &G””Lc &F””· &E””· &D””· &C” ” +·( &B” ” ·, &A” ”·2 &@””·8 &?””·? &>””·C &=””·G &<””·K &;””·O &:””·S &9””·] &8”” " &7”!”""  &6”#”$" &5”%”&"! &4”'”("+ &3”)”*"7 &2”+”,"< &1”-”."C &0”/”0"L &/”1”2"R &.”3”4"X &-”5”6"^ &,”7”8’ &+”9”:’ &*”;”<’  &)”=”>’ &(”?”@’ &'”A”B’! &&”C”D’( &%”E”F’1 &$”G”H’8 &#”I”J’A &"”K”L’N &!”M”N’Z & ”O”P’_ &”Q”R’c &”S”Tý &”U”Vý  &”W”Xý &”Y”Zý &”[”\ý &”]”^ý4 &”_”`ýK &”a”býL &”c]ý{ýS &]]ýT &]]? &]]C &]]D &] ] +F &] ] J &] ]K &]]L & ]]M & ]]N & ]]O & +]]P & ]]Q &]]U &]]V &]] W &]!]"X &]#]$]%Áæ]&]*¾«]'](ã=ã?ã>ã@Ò’]-]+ƒ0],]/]0]1]2]3]4]5]6]7]8]9]:];]<]=]>]?]@]A]B]D]F]G]H]I]J]K]L]M]N]P]R]S]T]U]V]W]X]Y]Z][]`]^].ƒº]\]]]C]E]O]Q]a]b]c      !"#$%&'()*.,]_¿L+¶Ñ/0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTVWY[`^-4]UXZ\bzzzzzzzzz z -z z z zzzzzzzzzzzzzzzzzzz z!z"z$_}!z#aczÎJz'z%÷Tâ@z)z*z+z,z-z.z/z0z1z2z4z(Åâââââ âââ ~câz:z;z<BÍzBz@z5+£z=z?z6z7z8z9GƒâzCzDzIzAS&zEâ7â6â5zGzHâ zNzOŒ¯zSzJwúzPzQzKzLzM~b~azUzVzXzT“YzWÓÓzY¨^zZz\z]z^z_z`zazbzcâAÓÓÓ4ÓÓÓÓÓÓÓ Ó -Ó Ó Ó ÓÓÓÓÓâ8ÓÓ Ó&ÓÓÓÓÓÓÓÓ"Ó'Ó!EoÓ#Ó&Ó)Ó*Ó+Ó2Ó(gêÓ,Ó-Ó.Ó/Ó0Ó1Ó4Ó5Ó@Ó3:Ó6Ó7Ó8Ó9Ó:Ó;Ó<Ó=Ó>â9Ó?ÓBÓCÓIÓAïÓDâBÓOÓJ²IÓKÓWÓPÄÓQÓTÓ]ÓX×çÓYÓ_Ó`Óa4Ó^îæÓb4â -4^à4 444444 -T54 4âC44d444v44"4Ž44 4!4(4#¢4$4,4)´°4*4.4/464-Ît4045âD494=47í¢484?4@4C4>4A4_4E4M4K4Dí4F4J4O4Q4L$ç4N4U4R6)4S4W4X4Y4Z4[4\4b4`4V74]â;âE4c4aU!°± …F   ¤µ»ؼ!"#' Û>$&âF+(úx)*-./3,ñ02567;4 †8:?<>X=>ABCG@J×DFJHhÏIâGLMNRKkROQ[S…òTUVWXYZ]^_c\—Í`bþþþþÞNþþ÷eþþ þ þóŸþ -â:þ þþþþþþþþþþþþþâHþþþþþ þ!þ"þ$þ(¿þ#þ&þ,þ*þ%C1þ'þ)þ-þ.þ/þ0þ1þ2þ4þ+c5þ3þ6þ7þ9þ5€›þ8þ;þ<þ=þ>þ?þ@þAþEþ:’øþBþDþHþF±^þGâIþJþKþLþMþNþTþUþRþI²ÓþOþQþWþSÑ$þVþYþZþ[þ\þ]þaþXÖ þ^þ`þcgþbô™gHggggg -g*¤gg R[ggg E“ggâJg g gggg`¶”%ggÁ½ggggg!gÍãgg g#Êg$g%g*g"ìÅg&g'g(g)g6g-g+0g,g7g.Lg5g/g0g1g2g3g4"hU×g9g:g;g?g8ƒog<g>âKgBg@¥NgAgDgJgHgC«gEgGgKgLgNgIÉgMgSgOÙDgPgUgXgTó¯gVgWgZg]gYŽg[â4g\âLÞg^<-g_g`gagbgcÞ†fÞÞÞwîÞÞÞ Þ”@Þ Þ -Þ Þ ÞÞÞÞ ˆÞÞÞÞÞÞ¸ïÞÞÞÞÅžÞâMÞ!Þ"Þ%Þ ÎTÞ#Þ*Þ&å×Þ'Þ(Þ)Þ,Þ-Þ1Þ+ìèÞ.Þ0Þ7Þ2dÞ3Þ4Þ5Þ6Þ=Þ;Þ8 ºÞ9Þ>Þ?ÞFÞ<iÞ@ÞAÞBÞCÞDÞEâNÞOÞGLBLFLA_ëLCLELHLLLGmLILKLNLRLM+LOLQâQLTLXLSŽ3LULWLZL_LY¢OL[L]L^La·L`±GLb··!d···é +z z z zzzzzzzzzzzzzzzzzzz z!z"z$_}!z#aczÎJz'z%÷TãAz)z*z+z,z-z.z/z0z1z2z4z(Åãããããããã ããz:z;z<BÍzBz@z5+£z=z?z6z7z8z9GƒãzCzDzIzAS&zEã8ã7ã6zGzHã zNzOŒ¯zSzJwúzPzQzKzLzMcbzUzVzXzT“YzWÓÓzY¨^zZz\z]z^z_z`zazbzcãBÓÓÓ4ÓÓÓÓÓÓÓ Ó +Ó Ó Ó ÓÓÓÓÓã9ÓÓ Ó&ÓÓÓÓÓÓÓÓ"Ó'Ó!EoÓ#Ó&Ó)Ó*Ó+Ó2Ó(gêÓ,Ó-Ó.Ó/Ó0Ó1Ó4Ó5Ó@Ó3:Ó6Ó7Ó8Ó9Ó:Ó;Ó<Ó=Ó>ã:Ó?ÓBÓCÓIÓAïÓDãCÓOÓJ²IÓKÓWÓPÄÓQÓTÓ]ÓX×çÓYÓ_Ó`Óa4Ó^îæÓb4ã 4^à4 444444 +T54 4ãD44d444v44"4Ž44 4!4(4#¢4$4,4)´°4*4.4/464-Ît4045ãE494=47í¢484?4@4C4>4A4_4E4M4K4Dí4F4J4O4Q4L$ç4N4U4R6)4S4W4X4Y4Z4[4\4b4`4V74]ã<ãF4c4aU!°± …F   ¤µ»ؼ!"#' Û>$&ãG+(úx)*-./3,ñ02567;4 †8:?<>X=>ABCG@J×DFJHhÏIãHLMNRKkROQ[S…òTUVWXYZ]^_c\—Í`bþþþþÞNþþ÷eþþ þ þóŸþ +ã;þ þþþþþþþþþþþþþãIþþþþþ þ!þ"þ$þ(¿þ#þ&þ,þ*þ%C1þ'þ)þ-þ.þ/þ0þ1þ2þ4þ+c5þ3þ6þ7þ9þ5€›þ8þ;þ<þ=þ>þ?þ@þAþEþ:’øþBþDþHþF±^þGãJþJþKþLþMþNþTþUþRþI²ÓþOþQþWþSÑ$þVþYþZþ[þ\þ]þaþXÖ þ^þ`þcgþbô™gHggggg +g*¤gg R[ggg E“ggãKg g gggg`¶”%ggÁ½ggggg!gÍãgg g#Êg$g%g*g"ìÅg&g'g(g)g6g-g+0g,g7g.Lg5g/g0g1g2g3g4"hU×g9g:g;g?g8ƒog<g>ãLgBg@¥NgAgDgJgHgC«gEgGgKgLgNgIÉgMgSgOÙDgPgUgXgTó¯gVgWgZg]gYŽg[ã5g\ãMÞg^<-g_g`gagbgcÞ†fÞÞÞwîÞÞÞ Þ”@Þ Þ +Þ Þ ÞÞÞÞ ˆÞÞÞÞÞÞ¸ïÞÞÞÞÅžÞãNÞ!Þ"Þ%Þ ÎTÞ#Þ*Þ&å×Þ'Þ(Þ)Þ,Þ-Þ1Þ+ìèÞ.Þ0Þ7Þ2dÞ3Þ4Þ5Þ6Þ=Þ;Þ8 ºÞ9Þ>Þ?ÞFÞ<iÞ@ÞAÞBÞCÞDÞEãOÞOÞGLBLFLA_ëLCLELHLLLGmLILKLNLRLM+LOLQãRLTLXLSŽ3LULWLZL_LY¢OL[L]L^La·L`±GLb··!з··é ·· ·þà· · -· · ····· ê·âR·· ê··$· 5Ø······· ·!·"·#·(·% V·&·.·) W·*·,·-·4·/ qú·0·2·3·;·5 „¹·6·8·9·:âS·?·< –‘·=·C·@  ý·A·G·D ®q·E·K·H ³A·I·O·L ¹8·M·S·P ¾|·QâT·Y·T Öj·U·V·W·Xâ3·]·Z ë·[·c·^!†·_·`·a·b%%!<Š%"¶%% %!Ts%%%%% % -!i % âU%%!F%%%%%%!•…%%%!­ÿ%%%%%!%!Â%%'%"!Ú‹%#%$%%%&%+%(!îÜ%)âV%3%,"ú%-%.%/â2%0%1%2%8%4" æ%5%7%=%9"7%:%<%?%@%C%>"MP%A%F%G%H%D"hc%E%N%I"‘;%J%L%MâW%T%O"Ÿf%P%R%S%Z%U"¥%V%X%Y%`%["«r%\%^%_‘%a"³Ñ%b$ n‘‘‘"ÛK‘‘‘‘ ‘‘"î‘ -‘ ‘ âX‘‘‘#v‘‘‘‘‘‘#‘‘‘‘‘#‘#"]‘‘!‘"‘%‘*‘$#@‘&‘(‘)‘-‘+#]2‘,‘1‘.#_ÿ‘/âY‘3‘4‘5‘9‘2#e³‘6‘8‘E‘;‘<‘=‘>‘C‘A‘:#y­‘?‘F‘B#Šñ‘D~`‘H‘I‘J‘K‘N‘G#À‘L‘Q‘O#Þª‘P‘S‘T‘U‘V‘W‘Z‘R#ãT‘XâZ‘\‘_‘[#û…‘]‘c‘`$ d‘a$8¢%Œt  - $Cz $[’$hIâ[$"$jå !%&')#$Œ4(+-*$¨v,/0197.$º—2456:;=8$Ý <@>$÷Þ?â\BDEFGHLA$ü]ICââNO%SÖP%‚%~ZVM%†QTUâ\~`W%@´[]^_XY%bð~~a%dm~~~~ ~ -~ ~ ~ ~~bc%¼Y~~'p~%½a~%¾W%¿a%Þ;& j~~~~~%çm~~~~~~~~&î~&&&%Á~)~+&dÙ~'~-~ &D—~(~*~,â]~!~"~#~$~%&oâ~&&pÞ&qî&‹‹&¼Å~5~8~.&–¾~6~7~/~0&Ê~1~2~3&Ëq~4&Ìm&Í&ê˜~;~9&÷Ù~:~?~<&ü_~=~F~@']~A~D~Q~G'2n~H~X~R'Gã~Sâ^~[~Y'RÅ~Zâ~\'SS~]~^~_ââ*‰ ââ'žÈâ ââââââââââââ â1â!â"â#'·â$'Óøâ%'÷èâ&(õâ'(5"â((]â)(®ìâ*(¿½â+)Õâ,)2â-)(îâ.)‡¤â/)í»â0*<*@>*F¤*Là*SÙ*\*b\*h›*nÚ*rl*w*}*ƒâ_â`âaâbâc % %*Ñp %*÷Ø 'G 'H 'I 'J 'K 'L 'M 'N 'O 'P 'Q 'R 'S 'T 'U 'V 'W 'X 'Y 'Z '[ '\ '] '^ '_ '` 'a 'b 'c F+(, F F F F F F F F F  F - F  F  F  F F F F F F F F F F F F F F F F F F F  F! F" F# F$ F% F& F' F( F) F* F+ F, F- F. F/ F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F: F; F< F= F> F? F@ FA FB FC FD FE FF FG FH FI FJ FK FL FM FN FO FP FQ FR FS FT FU FV FW FX FY FZ F[ F\ F] F^ F_ F` Fa Fb Fc+s+u6 +· · ····· ê·ãS·· ê··%· 6í······· ·!·"·#·$·)·& \‹·'·/·* ]t·+·-·.·5·0 xf·1·3·4·<·6 ‹%·7·9·:·;ãT·@·= œý·>·D·A §i·B·H·E ´Ý·F·L·I ¹­·J·P·M ¿¤·N·T·Q Äè·RãU·Z·U ÜÖ·V·W·X·Yã4·^·[ ñ·\"·_! ò·`·a·b·c"¼P""!Bµ"" +"!Zž"""" "" !o4" ãV""!‡q""""""!›°"""!´*"""""""!È;" "("#!à¶"$"%"&"'",")!õ"*ãW"4"-" %"."/"0ã3"1"2"3"9"5"'"6"8">":"=@";"="@"A"D"?"S{"B"G"H"I"E"nŽ"F"O"J"—f"K"M"NãX"U"P"¥‘"Q"S"T"["V"«1"W"Y"Z"a"\"±"]"_"`’"b"¹ü"c$ì’’’"áÉ’’’’ +’’ "ô–’ ’ ’ãY’’’#ô’’’’’’#•’’’’’$’#(Û’ ’"’#’&’+’%#F’'’)’*’.’,#c°’-’2’/#f}’0ãZ’4’5’6’:’3#l1’7’9’F’<’=’>’?’D’B’;#€+’@’G’C#‘o’Ea’I’J’K’L’O’H#Æÿ’M’R’P#å(’Q’T’U’V’W’X’[’S#éÒ’Yã[’]’`’\$’^ý’a$â’b%’Ëýýýý$>ùýýý ý +ý ýý$IÑý ýýýýý$aéýýý$n ýã\ýýý%ý#ý$q<ýýý ý!ý"ý&ý'ý(ý*ý$$’‹ý)ý,ý.ý+$®Íý-ý0ý1ý2ý:ý8ý/$Àîý3ý5ý6ý7ý;ý<ý>ý9$ãbý=ýAý?$þ5ý@ã]ýCýEýFýGýHýIýMýB%´ýJýDããýOýP%Z-ýQ%ˆ|ý[ýWýN%"ÝýRýUýVãý]ýaýX%G ý\ý^ý_ý`ýYýZ%iGýb%jÄ  +   ýc%Ââ'v %Ãê%Äà%Åê%äÄ&ó %íö&w&˜&Ž&,J*,&kb(.!&K )+-ã^"#$%&&vk'&wg&xw&’&ÃN69/&G7801&Љ234&Ñú5&Òö&Ô&ñ!<:&þb;@='è>GA'!æBERH'8÷IYS'NlTã_\Z'YN[ã]'YÜ^_`ãã*Îãã '¥Bã +ããããããããããã ã!ã2ã"ã#ã$'½“ã%'Úrã&'þbã'(oã((;œã)(c”ã*(µfã+(Æ7ã,)Oã-) óã.)0¯ã/)eã0)õ|ã1*CÓ*Gÿ*Ne*T¡*[š*cÙ*j*p\*v›*z-*~Ã*„Å*ŠÇã`ãaãbãc & & &*Ù™ &+2 (H (I (J (K (L (M (N (O (P (Q (R (S (T (U (V (W (X (Y (Z ([ (\ (] (^ (_ (` (a (b (c F+/Ò F F F F F F F F F  F + F  F  F  F F F F F F F F F F F F F F F F F F F  F! F" F# F$ F% F& F' F( F) F* F+ F, F- F. F/ F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F: F; F< F= F> F? F@ FA FB FC FD FE FF FG FH FI FJ FK FL FM FN FO FP FQ FR FS FT FU FV FW FX FY FZ F[ F\ F] F^ F_ F` Fa Fb Fc «+}4 «+{+~• endstream endobj startxref -2848054 +2850453 %%EOF diff --git a/docs/src/toolsrout.tex b/docs/src/toolsrout.tex index d026f585..d58faadc 100644 --- a/docs/src/toolsrout.tex +++ b/docs/src/toolsrout.tex @@ -1780,6 +1780,9 @@ Returned as: an \verb|integer(psb_long_int_k_)| number. \clearpage\subsection{Sorting utilities --- } %\addcontentsline{toc}{subsection}{Sorting utilities} +{\par\noindent\large\bfseries psb\_isort --- Sorting by the Insertion-sort + algorithm} + {\par\noindent\large\bfseries psb\_msort --- Sorting by the Merge-sort algorithm} @@ -1788,13 +1791,14 @@ Returned as: an \verb|integer(psb_long_int_k_)| number. {\par\noindent\large\bfseries psb\_hsort --- Sorting by the Heapsort algorithm} \begin{verbatim} +call psb_isort(x,ix,dir,flag) call psb_msort(x,ix,dir,flag) call psb_qsort(x,ix,dir,flag) call psb_hsort(x,ix,dir,flag) \end{verbatim} These serial routines sort a sequence $X$ into ascending or -descending order. The argument meaning is identical for the three +descending order. The argument meaning is identical for all calls; the only difference is the algorithm used to accomplish the task (see Usage Notes below). \begin{description} @@ -1843,7 +1847,7 @@ position as the corresponding entries in $x$. the imaginary part) or on the absolute values; \item The routines return the items in the chosen ordering; the output difference is the handling of ties (i.e. items with an - equal value) in the original input. With the merge-sort algorithm + equal value) in the original input. With the insertion-sort or merge-sort algorithms ties are preserved in the same relative order as they had in the original sequence, while this is not guaranteed for quicksort or heapsort; @@ -1854,11 +1858,15 @@ position as the corresponding entries in $x$. occupied in the original data sequence; \item If $flag = psb\_sort\_keep\_idx\_$ the routine will assume that the entries in $ix(:)$ have already been initialized by the user; -\item The three sorting algorithms have a similar $O(n \log n)$ expected - running time; in the average case quicksort will be the +\item Three sorting algorithms have a similar $O(n \log n)$ expected + running time, whereas insertion sort has an expected running time + $O(n^2)$; of the other three, in the average case quicksort will be the fastest and merge-sort the slowest. However note that: -\begin{enumerate} -\item The worst case running time for quicksort is $O(n^2)$; the algorithm + \begin{enumerate} + \item The the best case running time for insertion sort is $\Omega(n)$ while the average + and worst case are $O(n^2)$; however for very short input sequences this is + likely to be the fastest method; + \item The worst case running time for quicksort is $O(n^2)$; the algorithm implemented here follows the well-known median-of-three heuristics, but the worst case may still apply; \item The worst case running time for merge-sort and heap-sort is From 4cd6cf21d02f86ee9ae7ca1cdc2589fd8fd12eaa Mon Sep 17 00:00:00 2001 From: Fabio Durastante Date: Wed, 1 Oct 2025 14:34:00 +0200 Subject: [PATCH 24/37] Exposed to c the psb_is_owned function --- cbind/base/psb_base_tools_cbind_mod.F90 | 20 ++++++++++++++++++++ cbind/base/psb_c_base.h | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/cbind/base/psb_base_tools_cbind_mod.F90 b/cbind/base/psb_base_tools_cbind_mod.F90 index 7126ced8..d8aa0769 100644 --- a/cbind/base/psb_base_tools_cbind_mod.F90 +++ b/cbind/base/psb_base_tools_cbind_mod.F90 @@ -390,5 +390,25 @@ contains end function psb_c_cd_get_global_indices + function psb_c_is_owned(x,cdh) bind(c,name='psb_c_is_owned') result(res) + implicit none + type(psb_c_object_type) :: cdh + integer(psb_c_lpk_), value :: x + logical(c_bool) :: res + ! Internal variables + type(psb_desc_type), pointer :: descp + integer(psb_c_ipk_) :: info + logical :: fowned + res = .false. + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + fowned = psb_is_owned(x+(1-psb_c_get_index_base()),descp) + if (fowned) then + res = .true. + end if + end if + + end function psb_c_is_owned + end module psb_base_tools_cbind_mod diff --git a/cbind/base/psb_c_base.h b/cbind/base/psb_c_base.h index f28f7bbb..6dacb3de 100644 --- a/cbind/base/psb_c_base.h +++ b/cbind/base/psb_c_base.h @@ -80,7 +80,7 @@ extern "C" { psb_i_t psb_c_cdasb(psb_c_descriptor *cd); psb_i_t psb_c_cdfree(psb_c_descriptor *cd); psb_i_t psb_c_cdins(psb_i_t nz, const psb_l_t *ia, const psb_l_t *ja, psb_c_descriptor *cd); - + bool psb_c_is_owned(psb_l_t gindex, psb_c_descriptor *cd); psb_i_t psb_c_cd_get_local_rows(psb_c_descriptor *cd); psb_i_t psb_c_cd_get_local_cols(psb_c_descriptor *cd); From f120015ff55fcf70bc7aebe6e28f27cd7a22ca47 Mon Sep 17 00:00:00 2001 From: Fabio Durastante Date: Fri, 3 Oct 2025 15:16:28 +0200 Subject: [PATCH 25/37] Exposed psb_c_cd_is_asb to check is descriptor is assembled --- cbind/base/psb_base_tools_cbind_mod.F90 | 21 +++++++++++++++++++++ cbind/base/psb_c_base.h | 1 + 2 files changed, 22 insertions(+) diff --git a/cbind/base/psb_base_tools_cbind_mod.F90 b/cbind/base/psb_base_tools_cbind_mod.F90 index d8aa0769..5f9cdf75 100644 --- a/cbind/base/psb_base_tools_cbind_mod.F90 +++ b/cbind/base/psb_base_tools_cbind_mod.F90 @@ -277,6 +277,27 @@ contains return end function psb_c_cdins + function psb_c_cd_is_asb(cdh) bind(c,name='psb_c_cd_is_asb') result(res) + implicit none + + logical(c_bool) :: res + type(psb_c_object_type) :: cdh + + type(psb_desc_type), pointer :: descp + + res = .false. + + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + if (descp%is_asb()) then + res = .true. + else + res = .false. + end if + end if + + end function psb_c_cd_is_asb + function psb_c_cd_get_local_rows(cdh) bind(c,name='psb_c_cd_get_local_rows') result(res) diff --git a/cbind/base/psb_c_base.h b/cbind/base/psb_c_base.h index 6dacb3de..5ae62cac 100644 --- a/cbind/base/psb_c_base.h +++ b/cbind/base/psb_c_base.h @@ -81,6 +81,7 @@ extern "C" { psb_i_t psb_c_cdfree(psb_c_descriptor *cd); psb_i_t psb_c_cdins(psb_i_t nz, const psb_l_t *ia, const psb_l_t *ja, psb_c_descriptor *cd); bool psb_c_is_owned(psb_l_t gindex, psb_c_descriptor *cd); + bool psb_c_cd_is_asb(psb_c_descriptor *cd); psb_i_t psb_c_cd_get_local_rows(psb_c_descriptor *cd); psb_i_t psb_c_cd_get_local_cols(psb_c_descriptor *cd); From 6ef434bcbe70709172ee3756aaa810f37c27649e Mon Sep 17 00:00:00 2001 From: sfilippone Date: Mon, 6 Oct 2025 17:14:25 +0200 Subject: [PATCH 26/37] Confg machinery to extract PSB version into psb_config.h --- base/modules/psb_config.h.in | 5 +++++ config/pac.m4 | 20 ++++++++++++++++++++ configure | 19 +++++++++++++++++++ configure.ac | 14 ++++++++++++++ 4 files changed, 58 insertions(+) diff --git a/base/modules/psb_config.h.in b/base/modules/psb_config.h.in index 3bf9a645..e0258015 100644 --- a/base/modules/psb_config.h.in +++ b/base/modules/psb_config.h.in @@ -4,6 +4,11 @@ #define PSB_ERR_ERROR -1 #define PSB_ERR_SUCCESS 0 +#define PSB_VERSION_MAJOR @PSBLASMAJOR@ +#define PSB_VERSION_MINOR @PSBLASMINOR@ +#define PSB_VERSION_PATCHLEVEL @PSBLASPATCH@ +#define PSB_VERSION_STRING @PSBLASSTRING@ + @CSERIALMPI@ @PSB_IPKDEF@ diff --git a/config/pac.m4 b/config/pac.m4 index 9a9a1b0f..90340c8d 100644 --- a/config/pac.m4 +++ b/config/pac.m4 @@ -2348,3 +2348,23 @@ fi ] ) +dnl @synopsis PAC_FORTRAN_PSBLAS_VERSION( ) +dnl +dnl Will try to compile, link and run a program using the PSBLAS library. \ +dnl Checks for version major, minor and patchlevel +dnl +dnl Will use MPIFC, otherwise '$FC'. +dnl +dnl If the test passes, will execute ACTION-IF-FOUND. Otherwise, ACTION-IF-NOT-FOUND. +dnl +dnl @author Michele Martone +dnl @author Salvatore Filippone +dnl +AC_DEFUN(PAC_EXTRACT_PSBLAS_VERSION, +[AC_MSG_CHECKING([for version data of PSBLAS]) + pac_const_file="base/modules/psb_const_mod.F90"; + pac_cv_psblas_version_major=`cat $pac_const_file| grep version_major`; + pac_cv_psblas_version_minor=`cat $pac_const_file | grep version_minor `; + pac_cv_psblas_patchlevel=`cat $pac_const_file | grep patchlevel `; + pac_cv_psblas_version_string=`cat $pac_const_file | grep version_string `; +]) diff --git a/configure b/configure index 1a23fa64..ef5867a5 100755 --- a/configure +++ b/configure @@ -690,6 +690,10 @@ CINTMETIS CHAVEMETIS CHAVE_OPENMP CSERIALMPI +PSBLASSTRING +PSBLASPATCH +PSBLASMINOR +PSBLASMAJOR PSB_LPKDEF PSB_IPKDEF FINCLUDES @@ -8745,6 +8749,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu +###################### +# Extract version data +###################### +#PAC_EXTRACT_PSBLAS_VERSION +CFILE="base/modules/psb_const_mod.F90"; +PSBLASMAJOR=`cat $CFILE| grep version_major | $AWK '{print $6;}'`; +PSBLASMINOR=`cat $CFILE| grep version_minor| $AWK '{print $6;}'`; +PSBLASPATCH=`cat $CFILE| grep patchlevel| $AWK '{print $6;}'`; +PSBLASSTRING=`cat $CFILE | grep version_string | $AWK '{print $6;}'`; +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: version $PSBLASSTRING" >&5 +printf "%s\n" " version $PSBLASSTRING" >&6; } ############################################################################### # Additional pathname stuff (yes, it is redundant and confusing...) @@ -11694,6 +11709,10 @@ FDEFINES=$(PSBFDEFINES) + + + + diff --git a/configure.ac b/configure.ac index 3b6aedbd..ad5e573f 100644 --- a/configure.ac +++ b/configure.ac @@ -680,6 +680,16 @@ PAC_FORTRAN_TEST_FLUSH( [FDEFINES="$psblas_cv_define_prepend-DPSB_HAVE_FLUSH_STMT $FDEFINES"], ) +###################### +# Extract version data +###################### +#PAC_EXTRACT_PSBLAS_VERSION +CFILE="base/modules/psb_const_mod.F90"; +PSBLASMAJOR=`cat $CFILE| grep version_major | $AWK '{print $6;}'`; +PSBLASMINOR=`cat $CFILE| grep version_minor| $AWK '{print $6;}'`; +PSBLASPATCH=`cat $CFILE| grep patchlevel| $AWK '{print $6;}'`; +PSBLASSTRING=`cat $CFILE | grep version_string | $AWK '{print $6;}'`; +AC_MSG_RESULT([ version $PSBLASSTRING]) ############################################################################### # Additional pathname stuff (yes, it is redundant and confusing...) @@ -1051,6 +1061,10 @@ FDEFINES=$(PSBFDEFINES) AC_SUBST(PSB_IPKDEF) AC_SUBST(PSB_LPKDEF) +AC_SUBST(PSBLASMAJOR) +AC_SUBST(PSBLASMINOR) +AC_SUBST(PSBLASPATCH) +AC_SUBST(PSBLASSTRING) AC_SUBST(CSERIALMPI) AC_SUBST(CHAVE_OPENMP) AC_SUBST(CHAVEMETIS) From 1bba419d795d1888869be09b4bbfd813ada0f645 Mon Sep 17 00:00:00 2001 From: Marco Feder Date: Mon, 6 Oct 2025 19:05:59 +0200 Subject: [PATCH 27/37] Add local indices to psb_c_cdall C interface --- cbind/base/psb_base_tools_cbind_mod.F90 | 42 +++++++++++++++++++++++++ cbind/base/psb_c_base.h | 1 + 2 files changed, 43 insertions(+) diff --git a/cbind/base/psb_base_tools_cbind_mod.F90 b/cbind/base/psb_base_tools_cbind_mod.F90 index 5f9cdf75..b5ee8cff 100644 --- a/cbind/base/psb_base_tools_cbind_mod.F90 +++ b/cbind/base/psb_base_tools_cbind_mod.F90 @@ -141,6 +141,48 @@ contains end function psb_c_cdall_vl_opt + function psb_c_cdall_vl_lidx(nl,vl,lidx,cctxt,cdh) bind(c,name='psb_c_cdall_vl_lidx') result(res) + implicit none + + integer(psb_c_ipk_) :: res + type(psb_c_object_type), value :: cctxt + integer(psb_c_ipk_), value :: nl + integer(psb_c_lpk_) :: vl(*) + integer(psb_c_lpk_) :: lidx(*) + type(psb_c_object_type) :: cdh + type(psb_desc_type), pointer :: descp + integer(psb_c_ipk_) :: info, ixb + type(psb_ctxt_type) :: ctxt + ctxt = psb_c2f_ctxt(cctxt) + + res = -1 + if (nl <=0) then + write(0,*) 'Invalid size' + return + end if + + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + call descp%free(info) + if (info == 0) deallocate(descp,stat=info) + if (info /= 0) return + end if + + allocate(descp,stat=info) + if (info < 0) return + + ixb = psb_c_get_index_base() + + if (ixb == 1) then + call psb_cdall(ctxt,descp,info,vl=vl(1:nl),lidx=int(lidx(1:nl),psb_ipk_)) + else + call psb_cdall(ctxt,descp,info,vl=(vl(1:nl)+(1-ixb)),lidx=int(lidx(1:nl)+(1-ixb),psb_ipk_)) + end if + cdh%item = c_loc(descp) + res = info + + end function psb_c_cdall_vl_lidx + function psb_c_cdall_nl(nl,cctxt,cdh) bind(c,name='psb_c_cdall_nl') result(res) implicit none diff --git a/cbind/base/psb_c_base.h b/cbind/base/psb_c_base.h index 5ae62cac..81cddb05 100644 --- a/cbind/base/psb_c_base.h +++ b/cbind/base/psb_c_base.h @@ -75,6 +75,7 @@ extern "C" { void psb_c_delete_ctxt(psb_c_ctxt *); psb_i_t psb_c_cdall_vg(psb_l_t ng, psb_i_t *vg, psb_c_ctxt cctxt, psb_c_descriptor *cd); psb_i_t psb_c_cdall_vl(psb_i_t nl, psb_l_t *vl, psb_c_ctxt cctxt, psb_c_descriptor *cd); + psb_i_t psb_c_cdall_vl_lidx(psb_i_t nl, psb_l_t *vl, psb_l_t *lidx,psb_c_ctxt cctxt, psb_c_descriptor *cd); psb_i_t psb_c_cdall_nl(psb_i_t nl, psb_c_ctxt cctxt, psb_c_descriptor *cd); psb_i_t psb_c_cdall_repl(psb_l_t n, psb_c_ctxt cctxt, psb_c_descriptor *cd); psb_i_t psb_c_cdasb(psb_c_descriptor *cd); From cd72888cd43a8557ba08b70c4eba4972f0cc8af2 Mon Sep 17 00:00:00 2001 From: Marco Feder Date: Tue, 7 Oct 2025 09:26:43 +0200 Subject: [PATCH 28/37] Expose variant of psb_cdins() with local indices to C interface --- cbind/base/psb_base_tools_cbind_mod.F90 | 36 ++++++++++++++++++++++--- cbind/base/psb_c_base.h | 3 ++- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/cbind/base/psb_base_tools_cbind_mod.F90 b/cbind/base/psb_base_tools_cbind_mod.F90 index b5ee8cff..4029bfd2 100644 --- a/cbind/base/psb_base_tools_cbind_mod.F90 +++ b/cbind/base/psb_base_tools_cbind_mod.F90 @@ -148,7 +148,7 @@ contains type(psb_c_object_type), value :: cctxt integer(psb_c_ipk_), value :: nl integer(psb_c_lpk_) :: vl(*) - integer(psb_c_lpk_) :: lidx(*) + integer(psb_c_ipk_) :: lidx(*) type(psb_c_object_type) :: cdh type(psb_desc_type), pointer :: descp integer(psb_c_ipk_) :: info, ixb @@ -174,9 +174,9 @@ contains ixb = psb_c_get_index_base() if (ixb == 1) then - call psb_cdall(ctxt,descp,info,vl=vl(1:nl),lidx=int(lidx(1:nl),psb_ipk_)) + call psb_cdall(ctxt,descp,info,vl=vl(1:nl),lidx=lidx(1:nl)) else - call psb_cdall(ctxt,descp,info,vl=(vl(1:nl)+(1-ixb)),lidx=int(lidx(1:nl)+(1-ixb),psb_ipk_)) + call psb_cdall(ctxt,descp,info,vl=(vl(1:nl)+(1-ixb)),lidx=(lidx(1:nl)+(1-ixb))) end if cdh%item = c_loc(descp) res = info @@ -319,6 +319,36 @@ contains return end function psb_c_cdins + + function psb_c_cdins_lidx(nz,ja,lidx,cdh) bind(c,name='psb_c_cdins_lidx') result(res) + + implicit none + integer(psb_c_ipk_) :: res + integer(psb_c_ipk_), value :: nz + type(psb_c_object_type) :: cdh + integer(psb_c_lpk_) :: ja(*) + integer(psb_c_ipk_) :: lidx(*) + + type(psb_desc_type), pointer :: descp + integer(psb_c_ipk_) :: ixb,info + + res = -1 + + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + ixb = psb_c_get_index_base() + + if (ixb == 1) then + call psb_cdins(nz,ja(1:nz),descp,info,lidx=lidx(1:nz)) + else + call psb_cdins(nz,(ja(1:nz)+(1-ixb)),descp,info,lidx=(lidx(1:nz)+(1-ixb))) + end if + + res = info + end if + return + end function psb_c_cdins_lidx + function psb_c_cd_is_asb(cdh) bind(c,name='psb_c_cd_is_asb') result(res) implicit none diff --git a/cbind/base/psb_c_base.h b/cbind/base/psb_c_base.h index 81cddb05..ec130a9f 100644 --- a/cbind/base/psb_c_base.h +++ b/cbind/base/psb_c_base.h @@ -75,12 +75,13 @@ extern "C" { void psb_c_delete_ctxt(psb_c_ctxt *); psb_i_t psb_c_cdall_vg(psb_l_t ng, psb_i_t *vg, psb_c_ctxt cctxt, psb_c_descriptor *cd); psb_i_t psb_c_cdall_vl(psb_i_t nl, psb_l_t *vl, psb_c_ctxt cctxt, psb_c_descriptor *cd); - psb_i_t psb_c_cdall_vl_lidx(psb_i_t nl, psb_l_t *vl, psb_l_t *lidx,psb_c_ctxt cctxt, psb_c_descriptor *cd); + psb_i_t psb_c_cdall_vl_lidx(psb_i_t nl, psb_l_t *vl, psb_i_t *lidx, psb_c_ctxt cctxt, psb_c_descriptor *cd); psb_i_t psb_c_cdall_nl(psb_i_t nl, psb_c_ctxt cctxt, psb_c_descriptor *cd); psb_i_t psb_c_cdall_repl(psb_l_t n, psb_c_ctxt cctxt, psb_c_descriptor *cd); psb_i_t psb_c_cdasb(psb_c_descriptor *cd); psb_i_t psb_c_cdfree(psb_c_descriptor *cd); psb_i_t psb_c_cdins(psb_i_t nz, const psb_l_t *ia, const psb_l_t *ja, psb_c_descriptor *cd); + psb_i_t psb_c_cdins_lidx(psb_i_t nz, const psb_l_t *ja, const psb_i_t *lidx, psb_c_descriptor *cd); bool psb_c_is_owned(psb_l_t gindex, psb_c_descriptor *cd); bool psb_c_cd_is_asb(psb_c_descriptor *cd); From ed97717037a571a0b7519896281e8fed996f1112 Mon Sep 17 00:00:00 2001 From: sfilippone Date: Wed, 8 Oct 2025 12:54:59 +0200 Subject: [PATCH 29/37] Change name of an error constant. --- base/modules/psb_const_mod.F90 | 13 +++++++------ base/modules/psb_error_mod.F90 | 2 +- base/tools/psb_cdals.f90 | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/base/modules/psb_const_mod.F90 b/base/modules/psb_const_mod.F90 index d10bf974..395f4574 100644 --- a/base/modules/psb_const_mod.F90 +++ b/base/modules/psb_const_mod.F90 @@ -185,11 +185,12 @@ module psb_const_mod ! The up/down constant are defined in pairs having ! opposite values. We make use of this fact in the heapsort routine. ! - integer(psb_ipk_), parameter :: psb_sort_up_ = 1, psb_sort_down_ = -1 - integer(psb_ipk_), parameter :: psb_lsort_up_ = 2, psb_lsort_down_ = -2 - integer(psb_ipk_), parameter :: psb_asort_up_ = 3, psb_asort_down_ = -3 - integer(psb_ipk_), parameter :: psb_alsort_up_ = 4, psb_alsort_down_ = -4 - integer(psb_ipk_), parameter :: psb_sort_ovw_idx_ = 0, psb_sort_keep_idx_ = 1 + integer(psb_ipk_), parameter :: psb_sort_up_ = 1, psb_sort_down_ = -1 + integer(psb_ipk_), parameter :: psb_lsort_up_ = 2, psb_lsort_down_ = -2 + integer(psb_ipk_), parameter :: psb_asort_up_ = 3, psb_asort_down_ = -3 + integer(psb_ipk_), parameter :: psb_alsort_up_ = 4, psb_alsort_down_ = -4 + integer(psb_ipk_), parameter :: psb_sort_ovw_idx_ = 0, psb_sort_keep_idx_ = 1 + integer(psb_ipk_), parameter :: psb_sort_reord_x_ = 0, psb_sort_noreord_x_ = 1 integer(psb_ipk_), parameter :: psb_heap_resize = 200 integer(psb_ipk_), parameter :: psb_find_any_ = 0 integer(psb_ipk_), parameter :: psb_find_first_ge_ = 1 @@ -282,7 +283,7 @@ module psb_const_mod integer(psb_ipk_), parameter, public :: psb_err_parm_differs_among_procs_=550 integer(psb_ipk_), parameter, public :: psb_err_entry_out_of_bounds_=551 integer(psb_ipk_), parameter, public :: psb_err_inconsistent_index_lists_=552 - integer(psb_ipk_), parameter, public :: psb_err_partfunc_toomuchprocs_=570 + integer(psb_ipk_), parameter, public :: psb_err_partfunc_toomanyprocs_=570 integer(psb_ipk_), parameter, public :: psb_err_partfunc_toofewprocs_=575 integer(psb_ipk_), parameter, public :: psb_err_partfunc_wrong_pid_=580 integer(psb_ipk_), parameter, public :: psb_err_no_optional_arg_=581 diff --git a/base/modules/psb_error_mod.F90 b/base/modules/psb_error_mod.F90 index f47f884b..a13dd97f 100644 --- a/base/modules/psb_error_mod.F90 +++ b/base/modules/psb_error_mod.F90 @@ -750,7 +750,7 @@ contains achmsg(1) = tmpmsg write(achmsg(2),'("Index lists are inconsistent: some indices are orphans")') - case(psb_err_partfunc_toomuchprocs_) + case(psb_err_partfunc_toomanyprocs_) allocate(achmsg(4)) achmsg(1) = tmpmsg write(achmsg(2),& diff --git a/base/tools/psb_cdals.f90 b/base/tools/psb_cdals.f90 index 92ad3e94..2b1aa8c5 100644 --- a/base/tools/psb_cdals.f90 +++ b/base/tools/psb_cdals.f90 @@ -175,7 +175,7 @@ subroutine psb_cdals(m, n, parts, ctxt, desc, info) if (info == psb_success_) then call parts(iglob,m,np,prc_v,nprocs) if (nprocs > np) then - info=psb_err_partfunc_toomuchprocs_ + info=psb_err_partfunc_toomanyprocs_ call psb_errpush(info,name,l_err=(/3_psb_lpk_,np*lone,nprocs*lone,iglob/)) goto 9999 else if (nprocs <= 0) then From 246bd70b3a851cfcccf3c52af8706a00190b2a4e Mon Sep 17 00:00:00 2001 From: sfilippone Date: Wed, 8 Oct 2025 12:55:23 +0200 Subject: [PATCH 30/37] Modify sorting with REORD. Document same. --- base/modules/auxil/psb_c_hsort_mod.f90 | 4 +- base/modules/auxil/psb_c_isort_mod.f90 | 4 +- base/modules/auxil/psb_c_msort_mod.f90 | 4 +- base/modules/auxil/psb_c_qsort_mod.f90 | 4 +- base/modules/auxil/psb_d_hsort_mod.f90 | 4 +- base/modules/auxil/psb_d_isort_mod.f90 | 4 +- base/modules/auxil/psb_d_msort_mod.f90 | 4 +- base/modules/auxil/psb_d_qsort_mod.f90 | 4 +- base/modules/auxil/psb_e_hsort_mod.f90 | 4 +- base/modules/auxil/psb_e_isort_mod.f90 | 4 +- base/modules/auxil/psb_e_msort_mod.f90 | 4 +- base/modules/auxil/psb_e_qsort_mod.f90 | 4 +- base/modules/auxil/psb_i2_hsort_mod.f90 | 4 +- base/modules/auxil/psb_i2_isort_mod.f90 | 4 +- base/modules/auxil/psb_i2_msort_mod.f90 | 4 +- base/modules/auxil/psb_i2_qsort_mod.f90 | 4 +- base/modules/auxil/psb_m_hsort_mod.f90 | 4 +- base/modules/auxil/psb_m_isort_mod.f90 | 4 +- base/modules/auxil/psb_m_msort_mod.f90 | 4 +- base/modules/auxil/psb_m_qsort_mod.f90 | 4 +- base/modules/auxil/psb_s_hsort_mod.f90 | 4 +- base/modules/auxil/psb_s_isort_mod.f90 | 4 +- base/modules/auxil/psb_s_msort_mod.f90 | 4 +- base/modules/auxil/psb_s_qsort_mod.f90 | 4 +- base/modules/auxil/psb_z_hsort_mod.f90 | 4 +- base/modules/auxil/psb_z_isort_mod.f90 | 4 +- base/modules/auxil/psb_z_msort_mod.f90 | 4 +- base/modules/auxil/psb_z_qsort_mod.f90 | 4 +- base/serial/sort/psb_c_hsort_impl.f90 | 85 +- base/serial/sort/psb_c_isort_impl.f90 | 81 +- base/serial/sort/psb_c_msort_impl.f90 | 35 +- base/serial/sort/psb_c_qsort_impl.f90 | 65 +- base/serial/sort/psb_d_hsort_impl.f90 | 85 +- base/serial/sort/psb_d_isort_impl.f90 | 69 +- base/serial/sort/psb_d_msort_impl.f90 | 38 +- base/serial/sort/psb_d_qsort_impl.f90 | 61 +- base/serial/sort/psb_e_hsort_impl.f90 | 85 +- base/serial/sort/psb_e_isort_impl.f90 | 69 +- base/serial/sort/psb_e_msort_impl.f90 | 38 +- base/serial/sort/psb_e_qsort_impl.f90 | 61 +- base/serial/sort/psb_m_hsort_impl.f90 | 85 +- base/serial/sort/psb_m_isort_impl.f90 | 69 +- base/serial/sort/psb_m_msort_impl.f90 | 38 +- base/serial/sort/psb_m_qsort_impl.f90 | 61 +- base/serial/sort/psb_s_hsort_impl.f90 | 85 +- base/serial/sort/psb_s_isort_impl.f90 | 69 +- base/serial/sort/psb_s_msort_impl.f90 | 38 +- base/serial/sort/psb_s_qsort_impl.f90 | 61 +- base/serial/sort/psb_z_hsort_impl.f90 | 85 +- base/serial/sort/psb_z_isort_impl.f90 | 81 +- base/serial/sort/psb_z_msort_impl.f90 | 35 +- base/serial/sort/psb_z_qsort_impl.f90 | 65 +- docs/html/userhtmlse6.html | 135 +- docs/psblas-3.9.pdf | 3605 ++++++++++++----------- docs/src/toolsrout.tex | 28 +- test/openacc/Makefile | 7 +- test/openacc/runs/ppde.inp | 19 - 57 files changed, 3176 insertions(+), 2274 deletions(-) delete mode 100644 test/openacc/runs/ppde.inp diff --git a/base/modules/auxil/psb_c_hsort_mod.f90 b/base/modules/auxil/psb_c_hsort_mod.f90 index e7eb2fbf..863614c9 100644 --- a/base/modules/auxil/psb_c_hsort_mod.f90 +++ b/base/modules/auxil/psb_c_hsort_mod.f90 @@ -44,10 +44,10 @@ module psb_c_hsort_mod use psb_const_mod interface psb_hsort - subroutine psb_chsort(x,ix,dir,flag) + subroutine psb_chsort(x,ix,dir,flag,reord) import complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_chsort end interface psb_hsort diff --git a/base/modules/auxil/psb_c_isort_mod.f90 b/base/modules/auxil/psb_c_isort_mod.f90 index d0dbd281..302a2d8e 100644 --- a/base/modules/auxil/psb_c_isort_mod.f90 +++ b/base/modules/auxil/psb_c_isort_mod.f90 @@ -44,10 +44,10 @@ module psb_c_isort_mod use psb_const_mod interface psb_isort - subroutine psb_cisort(x,ix,dir,flag) + subroutine psb_cisort(x,ix,dir,flag,reord) import complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_cisort end interface psb_isort diff --git a/base/modules/auxil/psb_c_msort_mod.f90 b/base/modules/auxil/psb_c_msort_mod.f90 index a74c32fd..54103747 100644 --- a/base/modules/auxil/psb_c_msort_mod.f90 +++ b/base/modules/auxil/psb_c_msort_mod.f90 @@ -55,10 +55,10 @@ module psb_c_msort_mod interface psb_msort - subroutine psb_cmsort(x,ix,dir,flag) + subroutine psb_cmsort(x,ix,dir,flag,reord) import complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag, reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_cmsort end interface psb_msort diff --git a/base/modules/auxil/psb_c_qsort_mod.f90 b/base/modules/auxil/psb_c_qsort_mod.f90 index 6c4ceb3f..178fdc72 100644 --- a/base/modules/auxil/psb_c_qsort_mod.f90 +++ b/base/modules/auxil/psb_c_qsort_mod.f90 @@ -45,10 +45,10 @@ module psb_c_qsort_mod interface psb_qsort - subroutine psb_cqsort(x,ix,dir,flag) + subroutine psb_cqsort(x,ix,dir,flag,reord) import complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_cqsort end interface psb_qsort diff --git a/base/modules/auxil/psb_d_hsort_mod.f90 b/base/modules/auxil/psb_d_hsort_mod.f90 index 570f27b1..e9d10a70 100644 --- a/base/modules/auxil/psb_d_hsort_mod.f90 +++ b/base/modules/auxil/psb_d_hsort_mod.f90 @@ -44,10 +44,10 @@ module psb_d_hsort_mod use psb_const_mod interface psb_hsort - subroutine psb_dhsort(x,ix,dir,flag) + subroutine psb_dhsort(x,ix,dir,flag,reord) import real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_dhsort end interface psb_hsort diff --git a/base/modules/auxil/psb_d_isort_mod.f90 b/base/modules/auxil/psb_d_isort_mod.f90 index b34a3dff..e5e2a09a 100644 --- a/base/modules/auxil/psb_d_isort_mod.f90 +++ b/base/modules/auxil/psb_d_isort_mod.f90 @@ -44,10 +44,10 @@ module psb_d_isort_mod use psb_const_mod interface psb_isort - subroutine psb_disort(x,ix,dir,flag) + subroutine psb_disort(x,ix,dir,flag,reord) import real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_disort end interface psb_isort diff --git a/base/modules/auxil/psb_d_msort_mod.f90 b/base/modules/auxil/psb_d_msort_mod.f90 index d035486b..3c4559bf 100644 --- a/base/modules/auxil/psb_d_msort_mod.f90 +++ b/base/modules/auxil/psb_d_msort_mod.f90 @@ -55,10 +55,10 @@ module psb_d_msort_mod interface psb_msort - subroutine psb_dmsort(x,ix,dir,flag) + subroutine psb_dmsort(x,ix,dir,flag,reord) import real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag, reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_dmsort end interface psb_msort diff --git a/base/modules/auxil/psb_d_qsort_mod.f90 b/base/modules/auxil/psb_d_qsort_mod.f90 index 4da0b840..4a9953d8 100644 --- a/base/modules/auxil/psb_d_qsort_mod.f90 +++ b/base/modules/auxil/psb_d_qsort_mod.f90 @@ -64,10 +64,10 @@ module psb_d_qsort_mod end interface psb_ssrch interface psb_qsort - subroutine psb_dqsort(x,ix,dir,flag) + subroutine psb_dqsort(x,ix,dir,flag,reord) import real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_dqsort end interface psb_qsort diff --git a/base/modules/auxil/psb_e_hsort_mod.f90 b/base/modules/auxil/psb_e_hsort_mod.f90 index 5433cec4..3bc38743 100644 --- a/base/modules/auxil/psb_e_hsort_mod.f90 +++ b/base/modules/auxil/psb_e_hsort_mod.f90 @@ -44,10 +44,10 @@ module psb_e_hsort_mod use psb_const_mod interface psb_hsort - subroutine psb_ehsort(x,ix,dir,flag) + subroutine psb_ehsort(x,ix,dir,flag,reord) import integer(psb_epk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_epk_), optional, intent(inout) :: ix(:) end subroutine psb_ehsort end interface psb_hsort diff --git a/base/modules/auxil/psb_e_isort_mod.f90 b/base/modules/auxil/psb_e_isort_mod.f90 index ead8af04..4006c412 100644 --- a/base/modules/auxil/psb_e_isort_mod.f90 +++ b/base/modules/auxil/psb_e_isort_mod.f90 @@ -44,10 +44,10 @@ module psb_e_isort_mod use psb_const_mod interface psb_isort - subroutine psb_eisort(x,ix,dir,flag) + subroutine psb_eisort(x,ix,dir,flag,reord) import integer(psb_epk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_epk_), optional, intent(inout) :: ix(:) end subroutine psb_eisort end interface psb_isort diff --git a/base/modules/auxil/psb_e_msort_mod.f90 b/base/modules/auxil/psb_e_msort_mod.f90 index 5a0758dd..ef9d5b8d 100644 --- a/base/modules/auxil/psb_e_msort_mod.f90 +++ b/base/modules/auxil/psb_e_msort_mod.f90 @@ -62,10 +62,10 @@ module psb_e_msort_mod interface psb_msort - subroutine psb_emsort(x,ix,dir,flag) + subroutine psb_emsort(x,ix,dir,flag,reord) import integer(psb_epk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag, reord integer(psb_epk_), optional, intent(inout) :: ix(:) end subroutine psb_emsort end interface psb_msort diff --git a/base/modules/auxil/psb_e_qsort_mod.f90 b/base/modules/auxil/psb_e_qsort_mod.f90 index 09f45d45..bfd9aa0d 100644 --- a/base/modules/auxil/psb_e_qsort_mod.f90 +++ b/base/modules/auxil/psb_e_qsort_mod.f90 @@ -64,10 +64,10 @@ module psb_e_qsort_mod end interface psb_ssrch interface psb_qsort - subroutine psb_eqsort(x,ix,dir,flag) + subroutine psb_eqsort(x,ix,dir,flag,reord) import integer(psb_epk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_epk_), optional, intent(inout) :: ix(:) end subroutine psb_eqsort end interface psb_qsort diff --git a/base/modules/auxil/psb_i2_hsort_mod.f90 b/base/modules/auxil/psb_i2_hsort_mod.f90 index 6a6c96de..76f7c3fe 100644 --- a/base/modules/auxil/psb_i2_hsort_mod.f90 +++ b/base/modules/auxil/psb_i2_hsort_mod.f90 @@ -44,10 +44,10 @@ module psb_i2_hsort_mod use psb_const_mod interface psb_hsort - subroutine psb_i2hsort(x,ix,dir,flag) + subroutine psb_i2hsort(x,ix,dir,flag,reord) import integer(psb_i2pk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_i2hsort end interface psb_hsort diff --git a/base/modules/auxil/psb_i2_isort_mod.f90 b/base/modules/auxil/psb_i2_isort_mod.f90 index 115da75c..a7b01662 100644 --- a/base/modules/auxil/psb_i2_isort_mod.f90 +++ b/base/modules/auxil/psb_i2_isort_mod.f90 @@ -44,10 +44,10 @@ module psb_i2_isort_mod use psb_const_mod interface psb_isort - subroutine psb_i2isort(x,ix,dir,flag) + subroutine psb_i2isort(x,ix,dir,flag,reord) import integer(psb_i2pk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_i2isort end interface psb_isort diff --git a/base/modules/auxil/psb_i2_msort_mod.f90 b/base/modules/auxil/psb_i2_msort_mod.f90 index caad0971..f884be48 100644 --- a/base/modules/auxil/psb_i2_msort_mod.f90 +++ b/base/modules/auxil/psb_i2_msort_mod.f90 @@ -62,10 +62,10 @@ module psb_i2_msort_mod interface psb_msort - subroutine psb_i2msort(x,ix,dir,flag) + subroutine psb_i2msort(x,ix,dir,flag,reord) import integer(psb_i2pk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag, reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_i2msort end interface psb_msort diff --git a/base/modules/auxil/psb_i2_qsort_mod.f90 b/base/modules/auxil/psb_i2_qsort_mod.f90 index 2f192a0a..4931a35e 100644 --- a/base/modules/auxil/psb_i2_qsort_mod.f90 +++ b/base/modules/auxil/psb_i2_qsort_mod.f90 @@ -64,10 +64,10 @@ module psb_i2_qsort_mod end interface psb_ssrch interface psb_qsort - subroutine psb_i2qsort(x,ix,dir,flag) + subroutine psb_i2qsort(x,ix,dir,flag,reord) import integer(psb_i2pk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_i2qsort end interface psb_qsort diff --git a/base/modules/auxil/psb_m_hsort_mod.f90 b/base/modules/auxil/psb_m_hsort_mod.f90 index 22ffdf34..06dab210 100644 --- a/base/modules/auxil/psb_m_hsort_mod.f90 +++ b/base/modules/auxil/psb_m_hsort_mod.f90 @@ -44,10 +44,10 @@ module psb_m_hsort_mod use psb_const_mod interface psb_hsort - subroutine psb_mhsort(x,ix,dir,flag) + subroutine psb_mhsort(x,ix,dir,flag,reord) import integer(psb_mpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_mhsort end interface psb_hsort diff --git a/base/modules/auxil/psb_m_isort_mod.f90 b/base/modules/auxil/psb_m_isort_mod.f90 index 1f82f389..11206fd0 100644 --- a/base/modules/auxil/psb_m_isort_mod.f90 +++ b/base/modules/auxil/psb_m_isort_mod.f90 @@ -44,10 +44,10 @@ module psb_m_isort_mod use psb_const_mod interface psb_isort - subroutine psb_misort(x,ix,dir,flag) + subroutine psb_misort(x,ix,dir,flag,reord) import integer(psb_mpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_misort end interface psb_isort diff --git a/base/modules/auxil/psb_m_msort_mod.f90 b/base/modules/auxil/psb_m_msort_mod.f90 index 12a33686..d433a3a6 100644 --- a/base/modules/auxil/psb_m_msort_mod.f90 +++ b/base/modules/auxil/psb_m_msort_mod.f90 @@ -62,10 +62,10 @@ module psb_m_msort_mod interface psb_msort - subroutine psb_mmsort(x,ix,dir,flag) + subroutine psb_mmsort(x,ix,dir,flag,reord) import integer(psb_mpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag, reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_mmsort end interface psb_msort diff --git a/base/modules/auxil/psb_m_qsort_mod.f90 b/base/modules/auxil/psb_m_qsort_mod.f90 index bf029065..b43a62c0 100644 --- a/base/modules/auxil/psb_m_qsort_mod.f90 +++ b/base/modules/auxil/psb_m_qsort_mod.f90 @@ -64,10 +64,10 @@ module psb_m_qsort_mod end interface psb_ssrch interface psb_qsort - subroutine psb_mqsort(x,ix,dir,flag) + subroutine psb_mqsort(x,ix,dir,flag,reord) import integer(psb_mpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_mqsort end interface psb_qsort diff --git a/base/modules/auxil/psb_s_hsort_mod.f90 b/base/modules/auxil/psb_s_hsort_mod.f90 index 4cee5508..7b25cec0 100644 --- a/base/modules/auxil/psb_s_hsort_mod.f90 +++ b/base/modules/auxil/psb_s_hsort_mod.f90 @@ -44,10 +44,10 @@ module psb_s_hsort_mod use psb_const_mod interface psb_hsort - subroutine psb_shsort(x,ix,dir,flag) + subroutine psb_shsort(x,ix,dir,flag,reord) import real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_shsort end interface psb_hsort diff --git a/base/modules/auxil/psb_s_isort_mod.f90 b/base/modules/auxil/psb_s_isort_mod.f90 index 9692ed88..194ba2de 100644 --- a/base/modules/auxil/psb_s_isort_mod.f90 +++ b/base/modules/auxil/psb_s_isort_mod.f90 @@ -44,10 +44,10 @@ module psb_s_isort_mod use psb_const_mod interface psb_isort - subroutine psb_sisort(x,ix,dir,flag) + subroutine psb_sisort(x,ix,dir,flag,reord) import real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_sisort end interface psb_isort diff --git a/base/modules/auxil/psb_s_msort_mod.f90 b/base/modules/auxil/psb_s_msort_mod.f90 index f3107290..ce0e4399 100644 --- a/base/modules/auxil/psb_s_msort_mod.f90 +++ b/base/modules/auxil/psb_s_msort_mod.f90 @@ -55,10 +55,10 @@ module psb_s_msort_mod interface psb_msort - subroutine psb_smsort(x,ix,dir,flag) + subroutine psb_smsort(x,ix,dir,flag,reord) import real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag, reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_smsort end interface psb_msort diff --git a/base/modules/auxil/psb_s_qsort_mod.f90 b/base/modules/auxil/psb_s_qsort_mod.f90 index a5bdb2d9..5fbfe9e1 100644 --- a/base/modules/auxil/psb_s_qsort_mod.f90 +++ b/base/modules/auxil/psb_s_qsort_mod.f90 @@ -64,10 +64,10 @@ module psb_s_qsort_mod end interface psb_ssrch interface psb_qsort - subroutine psb_sqsort(x,ix,dir,flag) + subroutine psb_sqsort(x,ix,dir,flag,reord) import real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_sqsort end interface psb_qsort diff --git a/base/modules/auxil/psb_z_hsort_mod.f90 b/base/modules/auxil/psb_z_hsort_mod.f90 index 98e47da2..bc3d3436 100644 --- a/base/modules/auxil/psb_z_hsort_mod.f90 +++ b/base/modules/auxil/psb_z_hsort_mod.f90 @@ -44,10 +44,10 @@ module psb_z_hsort_mod use psb_const_mod interface psb_hsort - subroutine psb_zhsort(x,ix,dir,flag) + subroutine psb_zhsort(x,ix,dir,flag,reord) import complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_zhsort end interface psb_hsort diff --git a/base/modules/auxil/psb_z_isort_mod.f90 b/base/modules/auxil/psb_z_isort_mod.f90 index 4048088a..bb51de00 100644 --- a/base/modules/auxil/psb_z_isort_mod.f90 +++ b/base/modules/auxil/psb_z_isort_mod.f90 @@ -44,10 +44,10 @@ module psb_z_isort_mod use psb_const_mod interface psb_isort - subroutine psb_zisort(x,ix,dir,flag) + subroutine psb_zisort(x,ix,dir,flag,reord) import complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_zisort end interface psb_isort diff --git a/base/modules/auxil/psb_z_msort_mod.f90 b/base/modules/auxil/psb_z_msort_mod.f90 index 515b69cf..6a830d5d 100644 --- a/base/modules/auxil/psb_z_msort_mod.f90 +++ b/base/modules/auxil/psb_z_msort_mod.f90 @@ -55,10 +55,10 @@ module psb_z_msort_mod interface psb_msort - subroutine psb_zmsort(x,ix,dir,flag) + subroutine psb_zmsort(x,ix,dir,flag,reord) import complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag, reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_zmsort end interface psb_msort diff --git a/base/modules/auxil/psb_z_qsort_mod.f90 b/base/modules/auxil/psb_z_qsort_mod.f90 index 2fc6baab..351c6ebd 100644 --- a/base/modules/auxil/psb_z_qsort_mod.f90 +++ b/base/modules/auxil/psb_z_qsort_mod.f90 @@ -45,10 +45,10 @@ module psb_z_qsort_mod interface psb_qsort - subroutine psb_zqsort(x,ix,dir,flag) + subroutine psb_zqsort(x,ix,dir,flag,reord) import complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_zqsort end interface psb_qsort diff --git a/base/serial/sort/psb_c_hsort_impl.f90 b/base/serial/sort/psb_c_hsort_impl.f90 index 2400fcf7..4251ddaa 100644 --- a/base/serial/sort/psb_c_hsort_impl.f90 +++ b/base/serial/sort/psb_c_hsort_impl.f90 @@ -41,18 +41,19 @@ ! Data Structures and Algorithms ! Addison-Wesley ! -subroutine psb_chsort(x,ix,dir,flag) +subroutine psb_chsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_chsort use psb_error_mod implicit none complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: flag_, n, i, err_act,info - integer(psb_ipk_) :: dir_, l + integer(psb_ipk_) :: flag_, err_act, info, reord_ + integer(psb_ipk_) :: n, i, l, dir_ complex(psb_spk_) :: key integer(psb_ipk_) :: index + complex(psb_spk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name @@ -60,6 +61,13 @@ subroutine psb_chsort(x,ix,dir,flag) name='psb_hsort' call psb_erractionsave(err_act) + + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if + if (present(flag)) then flag_ = flag else @@ -113,24 +121,57 @@ subroutine psb_chsort(x,ix,dir,flag) ix(i) = i end do end if - l = 0 - do i=1, n - key = x(i) - index = ix(i) - call psi_idx_insert_heap(key,index,l,x,ix,dir_,info) - if (l /= i) then - write(psb_err_unit,*) 'Mismatch while heapifying ! ' - end if - end do - do i=n, 2, -1 - call psi_idx_heap_get_first(key,index,l,x,ix,dir_,info) - if (l /= i-1) then - write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i - end if - x(i) = key - ix(i) = index - end do - else if (.not.present(ix)) then + select case(reord_) + case (psb_sort_reord_x_) + + l = 0 + do i=1, n + key = x(i) + index = ix(i) + call psi_idx_insert_heap(key,index,l,x,ix,dir_,info) + if (l /= i) then + write(psb_err_unit,*) 'Mismatch while heapifying ! ' + end if + end do + do i=n, 2, -1 + call psi_idx_heap_get_first(key,index,l,x,ix,dir_,info) + if (l /= i-1) then + write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i + end if + x(i) = key + ix(i) = index + end do + case(psb_sort_noreord_x_) + tx = x + + l = 0 + do i=1, n + key = tx(i) + index = ix(i) + call psi_idx_insert_heap(key,index,l,tx,ix,dir_,info) + if (l /= i) then + write(psb_err_unit,*) 'Mismatch while heapifying ! ' + end if + end do + do i=n, 2, -1 + call psi_idx_heap_get_first(key,index,l,tx,ix,dir_,info) + if (l /= i-1) then + write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i + end if + tx(i) = key + ix(i) = index + end do + end select + else if (.not.present(ix)) then + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + l = 0 do i=1, n key = x(i) diff --git a/base/serial/sort/psb_c_isort_impl.f90 b/base/serial/sort/psb_c_isort_impl.f90 index e6163753..0251d37e 100644 --- a/base/serial/sort/psb_c_isort_impl.f90 +++ b/base/serial/sort/psb_c_isort_impl.f90 @@ -40,16 +40,17 @@ ! Data Structures and Algorithms ! Addison-Wesley ! -subroutine psb_cisort(x,ix,dir,flag) +subroutine psb_cisort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_cisort use psb_error_mod implicit none complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, err_act + integer(psb_ipk_) :: dir_, flag_, err_act, reord_ integer(psb_ipk_) :: n, i + complex(psb_spk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name @@ -57,6 +58,12 @@ subroutine psb_cisort(x,ix,dir,flag) name='psb_cisort' call psb_erractionsave(err_act) + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if + if (present(flag)) then flag_ = flag else @@ -90,39 +97,73 @@ subroutine psb_cisort(x,ix,dir,flag) ix(i) = i end do end if - - select case(dir_) - case (psb_lsort_up_) + select case(reord_) + case (psb_sort_reord_x_) + select case(dir_) + case (psb_lsort_up_) call psi_clisrx_up(n,x,ix) - case (psb_lsort_down_) + case (psb_lsort_down_) call psi_clisrx_dw(n,x,ix) - case (psb_alsort_up_) + case (psb_alsort_up_) call psi_calisrx_up(n,x,ix) - case (psb_alsort_down_) + case (psb_alsort_down_) call psi_calisrx_dw(n,x,ix) - case (psb_asort_up_) + case (psb_asort_up_) call psi_caisrx_up(n,x,ix) - case (psb_asort_down_) + case (psb_asort_down_) call psi_caisrx_dw(n,x,ix) - case default - ierr(1) = 3; ierr(2) = dir_; + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case(psb_sort_noreord_x_) + tx = x + select case(dir_) + case (psb_lsort_up_) + call psi_clisrx_up(n,tx,ix) + case (psb_lsort_down_) + call psi_clisrx_dw(n,tx,ix) + case (psb_alsort_up_) + call psi_calisrx_up(n,tx,ix) + case (psb_alsort_down_) + call psi_calisrx_dw(n,tx,ix) + case (psb_asort_up_) + call psi_caisrx_up(n,tx,ix) + case (psb_asort_down_) + call psi_caisrx_dw(n,tx,ix) + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + else + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) goto 9999 end select - else select case(dir_) case (psb_lsort_up_) - call psi_clisr_up(n,x) + call psi_clisr_up(n,x) case (psb_lsort_down_) - call psi_clisr_dw(n,x) + call psi_clisr_dw(n,x) case (psb_alsort_up_) - call psi_calisr_up(n,x) + call psi_calisr_up(n,x) case (psb_alsort_down_) - call psi_calisr_dw(n,x) + call psi_calisr_dw(n,x) case (psb_asort_up_) - call psi_caisr_up(n,x) + call psi_caisr_up(n,x) case (psb_asort_down_) - call psi_caisr_dw(n,x) + call psi_caisr_dw(n,x) case default ierr(1) = 3; ierr(2) = dir_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) diff --git a/base/serial/sort/psb_c_msort_impl.f90 b/base/serial/sort/psb_c_msort_impl.f90 index 751f6098..e61ee9e1 100644 --- a/base/serial/sort/psb_c_msort_impl.f90 +++ b/base/serial/sort/psb_c_msort_impl.f90 @@ -77,16 +77,16 @@ subroutine psb_cmsort_u(x,nout,dir) end subroutine psb_cmsort_u -subroutine psb_cmsort(x,ix,dir,flag) +subroutine psb_cmsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_cmsort use psb_error_mod use psb_ip_reord_mod implicit none complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, n, err_act + integer(psb_ipk_) :: dir_, flag_, n, err_act, reord_ integer(psb_ipk_), allocatable :: iaux(:) integer(psb_ipk_) :: iret, info, i @@ -96,6 +96,11 @@ subroutine psb_cmsort(x,ix,dir,flag) name='psb_cmsort' call psb_erractionsave(err_act) + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if if (present(dir)) then dir_ = dir else @@ -163,11 +168,25 @@ subroutine psb_cmsort(x,ix,dir,flag) ! only provide linked pointers. ! if (iret == 0 ) then - if (present(ix)) then - call psb_ip_reord(n,x,ix,iaux) - else - call psb_ip_reord(n,x,iaux) - end if + select case(reord_) + case(psb_sort_reord_x_) + if (present(ix)) then + call psb_ip_reord(n,x,ix,iaux) + else + call psb_ip_reord(n,x,iaux) + end if + case(psb_sort_noreord_x_) + if (present(ix)) then + call psb_ip_reord(n,ix,iaux) + else + call psb_errpush(psb_err_no_optional_arg_,name,a_err="ix") + goto 9999 + end if + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select end if return diff --git a/base/serial/sort/psb_c_qsort_impl.f90 b/base/serial/sort/psb_c_qsort_impl.f90 index 7f33c099..0111e9c2 100644 --- a/base/serial/sort/psb_c_qsort_impl.f90 +++ b/base/serial/sort/psb_c_qsort_impl.f90 @@ -41,22 +41,29 @@ ! Addison-Wesley ! -subroutine psb_cqsort(x,ix,dir,flag) +subroutine psb_cqsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_cqsort use psb_error_mod implicit none complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, err_act, i + integer(psb_ipk_) :: dir_, flag_, err_act, i, reord_ integer(psb_ipk_) :: n + complex(psb_spk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name name='psb_cqsort' call psb_erractionsave(err_act) + + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if if (present(flag)) then flag_ = flag else @@ -91,25 +98,57 @@ subroutine psb_cqsort(x,ix,dir,flag) end do end if - select case(dir_) - case (psb_lsort_up_) + select case(reord_) + case (psb_sort_reord_x_) + select case(dir_) + case (psb_lsort_up_) call psi_clqsrx_up(n,x,ix) - case (psb_lsort_down_) + case (psb_lsort_down_) call psi_clqsrx_dw(n,x,ix) - case (psb_alsort_up_) + case (psb_alsort_up_) call psi_calqsrx_up(n,x,ix) - case (psb_alsort_down_) + case (psb_alsort_down_) call psi_calqsrx_dw(n,x,ix) - case (psb_asort_up_) + case (psb_asort_up_) call psi_caqsrx_up(n,x,ix) - case (psb_asort_down_) + case (psb_asort_down_) call psi_caqsrx_dw(n,x,ix) - case default - ierr(1) = 3; ierr(2) = dir_; + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case(psb_sort_noreord_x_) + tx = x + select case(dir_) + case (psb_lsort_up_) + call psi_clqsrx_up(n,tx,ix) + case (psb_lsort_down_) + call psi_clqsrx_dw(n,tx,ix) + case (psb_alsort_up_) + call psi_calqsrx_up(n,tx,ix) + case (psb_alsort_down_) + call psi_calqsrx_dw(n,tx,ix) + case (psb_asort_up_) + call psi_caqsrx_up(n,tx,ix) + case (psb_asort_down_) + call psi_caqsrx_dw(n,tx,ix) + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + end select + else + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) goto 9999 end select - else + select case(dir_) case (psb_lsort_up_) call psi_clqsr_up(n,x) diff --git a/base/serial/sort/psb_d_hsort_impl.f90 b/base/serial/sort/psb_d_hsort_impl.f90 index ffb952d5..dac327d1 100644 --- a/base/serial/sort/psb_d_hsort_impl.f90 +++ b/base/serial/sort/psb_d_hsort_impl.f90 @@ -41,18 +41,19 @@ ! Data Structures and Algorithms ! Addison-Wesley ! -subroutine psb_dhsort(x,ix,dir,flag) +subroutine psb_dhsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_dhsort use psb_error_mod implicit none real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: flag_, n, i, err_act,info - integer(psb_ipk_) :: dir_, l + integer(psb_ipk_) :: flag_, err_act, info, reord_ + integer(psb_ipk_) :: n, i, l, dir_ real(psb_dpk_) :: key integer(psb_ipk_) :: index + real(psb_dpk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name @@ -60,6 +61,13 @@ subroutine psb_dhsort(x,ix,dir,flag) name='psb_hsort' call psb_erractionsave(err_act) + + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if + if (present(flag)) then flag_ = flag else @@ -113,24 +121,57 @@ subroutine psb_dhsort(x,ix,dir,flag) ix(i) = i end do end if - l = 0 - do i=1, n - key = x(i) - index = ix(i) - call psi_idx_insert_heap(key,index,l,x,ix,dir_,info) - if (l /= i) then - write(psb_err_unit,*) 'Mismatch while heapifying ! ' - end if - end do - do i=n, 2, -1 - call psi_idx_heap_get_first(key,index,l,x,ix,dir_,info) - if (l /= i-1) then - write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i - end if - x(i) = key - ix(i) = index - end do - else if (.not.present(ix)) then + select case(reord_) + case (psb_sort_reord_x_) + + l = 0 + do i=1, n + key = x(i) + index = ix(i) + call psi_idx_insert_heap(key,index,l,x,ix,dir_,info) + if (l /= i) then + write(psb_err_unit,*) 'Mismatch while heapifying ! ' + end if + end do + do i=n, 2, -1 + call psi_idx_heap_get_first(key,index,l,x,ix,dir_,info) + if (l /= i-1) then + write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i + end if + x(i) = key + ix(i) = index + end do + case(psb_sort_noreord_x_) + tx = x + + l = 0 + do i=1, n + key = tx(i) + index = ix(i) + call psi_idx_insert_heap(key,index,l,tx,ix,dir_,info) + if (l /= i) then + write(psb_err_unit,*) 'Mismatch while heapifying ! ' + end if + end do + do i=n, 2, -1 + call psi_idx_heap_get_first(key,index,l,tx,ix,dir_,info) + if (l /= i-1) then + write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i + end if + tx(i) = key + ix(i) = index + end do + end select + else if (.not.present(ix)) then + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + l = 0 do i=1, n key = x(i) diff --git a/base/serial/sort/psb_d_isort_impl.f90 b/base/serial/sort/psb_d_isort_impl.f90 index 94e3abd4..62b6eed1 100644 --- a/base/serial/sort/psb_d_isort_impl.f90 +++ b/base/serial/sort/psb_d_isort_impl.f90 @@ -40,16 +40,17 @@ ! Data Structures and Algorithms ! Addison-Wesley ! -subroutine psb_disort(x,ix,dir,flag) +subroutine psb_disort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_disort use psb_error_mod implicit none real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, err_act + integer(psb_ipk_) :: dir_, flag_, err_act, reord_ integer(psb_ipk_) :: n, i + real(psb_dpk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name @@ -57,6 +58,12 @@ subroutine psb_disort(x,ix,dir,flag) name='psb_disort' call psb_erractionsave(err_act) + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if + if (present(flag)) then flag_ = flag else @@ -90,31 +97,61 @@ subroutine psb_disort(x,ix,dir,flag) ix(i) = i end do end if - - select case(dir_) - case (psb_sort_up_) - call psi_disrx_up(n,x,ix) - case (psb_sort_down_) - call psi_disrx_dw(n,x,ix) - case (psb_asort_up_) + select case(reord_) + case (psb_sort_reord_x_) + select case(dir_) + case (psb_sort_up_) + call psi_disrx_up(n,x,ix) + case (psb_sort_down_) + call psi_disrx_dw(n,x,ix) + case (psb_asort_up_) call psi_daisrx_up(n,x,ix) - case (psb_asort_down_) + case (psb_asort_down_) call psi_daisrx_dw(n,x,ix) - case default - ierr(1) = 3; ierr(2) = dir_; + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case(psb_sort_noreord_x_) + tx = x + select case(dir_) + case (psb_sort_up_) + call psi_disrx_up(n,tx,ix) + case (psb_sort_down_) + call psi_disrx_dw(n,tx,ix) + case (psb_asort_up_) + call psi_daisrx_up(n,tx,ix) + case (psb_asort_down_) + call psi_daisrx_dw(n,tx,ix) + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + else + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) goto 9999 end select - else select case(dir_) case (psb_sort_up_) call psi_disr_up(n,x) case (psb_sort_down_) call psi_disr_dw(n,x) case (psb_asort_up_) - call psi_daisr_up(n,x) + call psi_daisr_up(n,x) case (psb_asort_down_) - call psi_daisr_dw(n,x) + call psi_daisr_dw(n,x) case default ierr(1) = 3; ierr(2) = dir_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) diff --git a/base/serial/sort/psb_d_msort_impl.f90 b/base/serial/sort/psb_d_msort_impl.f90 index 66ad7897..7c38f27d 100644 --- a/base/serial/sort/psb_d_msort_impl.f90 +++ b/base/serial/sort/psb_d_msort_impl.f90 @@ -76,16 +76,16 @@ subroutine psb_dmsort_u(x,nout,dir) return end subroutine psb_dmsort_u -subroutine psb_dmsort(x,ix,dir,flag) +subroutine psb_dmsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_dmsort use psb_error_mod use psb_ip_reord_mod implicit none real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag, reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, n, err_act + integer(psb_ipk_) :: dir_, flag_, n, err_act, reord_ integer(psb_ipk_), allocatable :: iaux(:) integer(psb_ipk_) :: iret, info, i @@ -95,6 +95,11 @@ subroutine psb_dmsort(x,ix,dir,flag) name='psb_dmsort' call psb_erractionsave(err_act) + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if if (present(dir)) then dir_ = dir else @@ -157,15 +162,28 @@ subroutine psb_dmsort(x,ix,dir,flag) ! Do the actual reordering, since the inner routines ! only provide linked pointers. ! - if (iret == 0 ) then - if (present(ix)) then - call psb_ip_reord(n,x,ix,iaux) - else - call psb_ip_reord(n,x,iaux) - end if + if (iret == 0 ) then + select case(reord_) + case(psb_sort_reord_x_) + if (present(ix)) then + call psb_ip_reord(n,x,ix,iaux) + else + call psb_ip_reord(n,x,iaux) + end if + case(psb_sort_noreord_x_) + if (present(ix)) then + call psb_ip_reord(n,ix,iaux) + else + call psb_errpush(psb_err_no_optional_arg_,name,a_err="ix") + goto 9999 + end if + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select end if - return 9999 call psb_error_handler(err_act) diff --git a/base/serial/sort/psb_d_qsort_impl.f90 b/base/serial/sort/psb_d_qsort_impl.f90 index 8e4b1d21..c397ba23 100644 --- a/base/serial/sort/psb_d_qsort_impl.f90 +++ b/base/serial/sort/psb_d_qsort_impl.f90 @@ -159,22 +159,29 @@ function psb_dssrch(key,n,v) result(ipos) return end function psb_dssrch -subroutine psb_dqsort(x,ix,dir,flag) +subroutine psb_dqsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_dqsort use psb_error_mod implicit none real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, err_act, i + integer(psb_ipk_) :: dir_, flag_, err_act, i, reord_ integer(psb_ipk_) :: n + real(psb_dpk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name name='psb_dqsort' call psb_erractionsave(err_act) + + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if if (present(flag)) then flag_ = flag else @@ -209,21 +216,49 @@ subroutine psb_dqsort(x,ix,dir,flag) end do end if - select case(dir_) - case (psb_sort_up_) - call psi_dqsrx_up(n,x,ix) - case (psb_sort_down_) - call psi_dqsrx_dw(n,x,ix) - case (psb_asort_up_) + select case(reord_) + case (psb_sort_reord_x_) + select case(dir_) + case (psb_sort_up_) + call psi_dqsrx_up(n,x,ix) + case (psb_sort_down_) + call psi_dqsrx_dw(n,x,ix) + case (psb_asort_up_) call psi_daqsrx_up(n,x,ix) - case (psb_asort_down_) + case (psb_asort_down_) call psi_daqsrx_dw(n,x,ix) - case default - ierr(1) = 3; ierr(2) = dir_; + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case(psb_sort_noreord_x_) + tx = x + select case(dir_) + case (psb_sort_up_) + call psi_dqsrx_up(n,tx,ix) + case (psb_sort_down_) + call psi_dqsrx_dw(n,tx,ix) + case (psb_asort_up_) + call psi_daqsrx_up(n,tx,ix) + case (psb_asort_down_) + call psi_daqsrx_dw(n,tx,ix) + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + end select + else + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) goto 9999 end select - else + select case(dir_) case (psb_sort_up_) call psi_dqsr_up(n,x) diff --git a/base/serial/sort/psb_e_hsort_impl.f90 b/base/serial/sort/psb_e_hsort_impl.f90 index f1a1a78f..8fa00a83 100644 --- a/base/serial/sort/psb_e_hsort_impl.f90 +++ b/base/serial/sort/psb_e_hsort_impl.f90 @@ -41,18 +41,19 @@ ! Data Structures and Algorithms ! Addison-Wesley ! -subroutine psb_ehsort(x,ix,dir,flag) +subroutine psb_ehsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_ehsort use psb_error_mod implicit none integer(psb_epk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_epk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: flag_, n, i, err_act,info - integer(psb_epk_) :: dir_, l + integer(psb_ipk_) :: flag_, err_act, info, reord_ + integer(psb_epk_) :: n, i, l, dir_ integer(psb_epk_) :: key integer(psb_epk_) :: index + integer(psb_epk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name @@ -60,6 +61,13 @@ subroutine psb_ehsort(x,ix,dir,flag) name='psb_hsort' call psb_erractionsave(err_act) + + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if + if (present(flag)) then flag_ = flag else @@ -113,24 +121,57 @@ subroutine psb_ehsort(x,ix,dir,flag) ix(i) = i end do end if - l = 0 - do i=1, n - key = x(i) - index = ix(i) - call psi_idx_insert_heap(key,index,l,x,ix,dir_,info) - if (l /= i) then - write(psb_err_unit,*) 'Mismatch while heapifying ! ' - end if - end do - do i=n, 2, -1 - call psi_idx_heap_get_first(key,index,l,x,ix,dir_,info) - if (l /= i-1) then - write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i - end if - x(i) = key - ix(i) = index - end do - else if (.not.present(ix)) then + select case(reord_) + case (psb_sort_reord_x_) + + l = 0 + do i=1, n + key = x(i) + index = ix(i) + call psi_idx_insert_heap(key,index,l,x,ix,dir_,info) + if (l /= i) then + write(psb_err_unit,*) 'Mismatch while heapifying ! ' + end if + end do + do i=n, 2, -1 + call psi_idx_heap_get_first(key,index,l,x,ix,dir_,info) + if (l /= i-1) then + write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i + end if + x(i) = key + ix(i) = index + end do + case(psb_sort_noreord_x_) + tx = x + + l = 0 + do i=1, n + key = tx(i) + index = ix(i) + call psi_idx_insert_heap(key,index,l,tx,ix,dir_,info) + if (l /= i) then + write(psb_err_unit,*) 'Mismatch while heapifying ! ' + end if + end do + do i=n, 2, -1 + call psi_idx_heap_get_first(key,index,l,tx,ix,dir_,info) + if (l /= i-1) then + write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i + end if + tx(i) = key + ix(i) = index + end do + end select + else if (.not.present(ix)) then + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + l = 0 do i=1, n key = x(i) diff --git a/base/serial/sort/psb_e_isort_impl.f90 b/base/serial/sort/psb_e_isort_impl.f90 index 0fe32318..20d3600c 100644 --- a/base/serial/sort/psb_e_isort_impl.f90 +++ b/base/serial/sort/psb_e_isort_impl.f90 @@ -40,16 +40,17 @@ ! Data Structures and Algorithms ! Addison-Wesley ! -subroutine psb_eisort(x,ix,dir,flag) +subroutine psb_eisort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_eisort use psb_error_mod implicit none integer(psb_epk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_epk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, err_act + integer(psb_ipk_) :: dir_, flag_, err_act, reord_ integer(psb_epk_) :: n, i + integer(psb_epk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name @@ -57,6 +58,12 @@ subroutine psb_eisort(x,ix,dir,flag) name='psb_eisort' call psb_erractionsave(err_act) + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if + if (present(flag)) then flag_ = flag else @@ -90,31 +97,61 @@ subroutine psb_eisort(x,ix,dir,flag) ix(i) = i end do end if - - select case(dir_) - case (psb_sort_up_) - call psi_eisrx_up(n,x,ix) - case (psb_sort_down_) - call psi_eisrx_dw(n,x,ix) - case (psb_asort_up_) + select case(reord_) + case (psb_sort_reord_x_) + select case(dir_) + case (psb_sort_up_) + call psi_eisrx_up(n,x,ix) + case (psb_sort_down_) + call psi_eisrx_dw(n,x,ix) + case (psb_asort_up_) call psi_eaisrx_up(n,x,ix) - case (psb_asort_down_) + case (psb_asort_down_) call psi_eaisrx_dw(n,x,ix) - case default - ierr(1) = 3; ierr(2) = dir_; + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case(psb_sort_noreord_x_) + tx = x + select case(dir_) + case (psb_sort_up_) + call psi_eisrx_up(n,tx,ix) + case (psb_sort_down_) + call psi_eisrx_dw(n,tx,ix) + case (psb_asort_up_) + call psi_eaisrx_up(n,tx,ix) + case (psb_asort_down_) + call psi_eaisrx_dw(n,tx,ix) + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + else + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) goto 9999 end select - else select case(dir_) case (psb_sort_up_) call psi_eisr_up(n,x) case (psb_sort_down_) call psi_eisr_dw(n,x) case (psb_asort_up_) - call psi_eaisr_up(n,x) + call psi_eaisr_up(n,x) case (psb_asort_down_) - call psi_eaisr_dw(n,x) + call psi_eaisr_dw(n,x) case default ierr(1) = 3; ierr(2) = dir_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) diff --git a/base/serial/sort/psb_e_msort_impl.f90 b/base/serial/sort/psb_e_msort_impl.f90 index b97d448a..93ac8a6e 100644 --- a/base/serial/sort/psb_e_msort_impl.f90 +++ b/base/serial/sort/psb_e_msort_impl.f90 @@ -131,16 +131,16 @@ subroutine psb_emsort_u(x,nout,dir) return end subroutine psb_emsort_u -subroutine psb_emsort(x,ix,dir,flag) +subroutine psb_emsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_emsort use psb_error_mod use psb_ip_reord_mod implicit none integer(psb_epk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag, reord integer(psb_epk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, n, err_act + integer(psb_ipk_) :: dir_, flag_, n, err_act, reord_ integer(psb_epk_), allocatable :: iaux(:) integer(psb_ipk_) :: iret, info, i @@ -150,6 +150,11 @@ subroutine psb_emsort(x,ix,dir,flag) name='psb_emsort' call psb_erractionsave(err_act) + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if if (present(dir)) then dir_ = dir else @@ -212,15 +217,28 @@ subroutine psb_emsort(x,ix,dir,flag) ! Do the actual reordering, since the inner routines ! only provide linked pointers. ! - if (iret == 0 ) then - if (present(ix)) then - call psb_ip_reord(n,x,ix,iaux) - else - call psb_ip_reord(n,x,iaux) - end if + if (iret == 0 ) then + select case(reord_) + case(psb_sort_reord_x_) + if (present(ix)) then + call psb_ip_reord(n,x,ix,iaux) + else + call psb_ip_reord(n,x,iaux) + end if + case(psb_sort_noreord_x_) + if (present(ix)) then + call psb_ip_reord(n,ix,iaux) + else + call psb_errpush(psb_err_no_optional_arg_,name,a_err="ix") + goto 9999 + end if + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select end if - return 9999 call psb_error_handler(err_act) diff --git a/base/serial/sort/psb_e_qsort_impl.f90 b/base/serial/sort/psb_e_qsort_impl.f90 index c70f8051..ea3bfd14 100644 --- a/base/serial/sort/psb_e_qsort_impl.f90 +++ b/base/serial/sort/psb_e_qsort_impl.f90 @@ -159,22 +159,29 @@ function psb_essrch(key,n,v) result(ipos) return end function psb_essrch -subroutine psb_eqsort(x,ix,dir,flag) +subroutine psb_eqsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_eqsort use psb_error_mod implicit none integer(psb_epk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_epk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, err_act, i + integer(psb_ipk_) :: dir_, flag_, err_act, i, reord_ integer(psb_epk_) :: n + integer(psb_epk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name name='psb_eqsort' call psb_erractionsave(err_act) + + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if if (present(flag)) then flag_ = flag else @@ -209,21 +216,49 @@ subroutine psb_eqsort(x,ix,dir,flag) end do end if - select case(dir_) - case (psb_sort_up_) - call psi_eqsrx_up(n,x,ix) - case (psb_sort_down_) - call psi_eqsrx_dw(n,x,ix) - case (psb_asort_up_) + select case(reord_) + case (psb_sort_reord_x_) + select case(dir_) + case (psb_sort_up_) + call psi_eqsrx_up(n,x,ix) + case (psb_sort_down_) + call psi_eqsrx_dw(n,x,ix) + case (psb_asort_up_) call psi_eaqsrx_up(n,x,ix) - case (psb_asort_down_) + case (psb_asort_down_) call psi_eaqsrx_dw(n,x,ix) - case default - ierr(1) = 3; ierr(2) = dir_; + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case(psb_sort_noreord_x_) + tx = x + select case(dir_) + case (psb_sort_up_) + call psi_eqsrx_up(n,tx,ix) + case (psb_sort_down_) + call psi_eqsrx_dw(n,tx,ix) + case (psb_asort_up_) + call psi_eaqsrx_up(n,tx,ix) + case (psb_asort_down_) + call psi_eaqsrx_dw(n,tx,ix) + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + end select + else + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) goto 9999 end select - else + select case(dir_) case (psb_sort_up_) call psi_eqsr_up(n,x) diff --git a/base/serial/sort/psb_m_hsort_impl.f90 b/base/serial/sort/psb_m_hsort_impl.f90 index 5dc92082..92f67d8b 100644 --- a/base/serial/sort/psb_m_hsort_impl.f90 +++ b/base/serial/sort/psb_m_hsort_impl.f90 @@ -41,18 +41,19 @@ ! Data Structures and Algorithms ! Addison-Wesley ! -subroutine psb_mhsort(x,ix,dir,flag) +subroutine psb_mhsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_mhsort use psb_error_mod implicit none integer(psb_mpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: flag_, n, i, err_act,info - integer(psb_ipk_) :: dir_, l + integer(psb_ipk_) :: flag_, err_act, info, reord_ + integer(psb_ipk_) :: n, i, l, dir_ integer(psb_mpk_) :: key integer(psb_ipk_) :: index + integer(psb_mpk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name @@ -60,6 +61,13 @@ subroutine psb_mhsort(x,ix,dir,flag) name='psb_hsort' call psb_erractionsave(err_act) + + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if + if (present(flag)) then flag_ = flag else @@ -113,24 +121,57 @@ subroutine psb_mhsort(x,ix,dir,flag) ix(i) = i end do end if - l = 0 - do i=1, n - key = x(i) - index = ix(i) - call psi_idx_insert_heap(key,index,l,x,ix,dir_,info) - if (l /= i) then - write(psb_err_unit,*) 'Mismatch while heapifying ! ' - end if - end do - do i=n, 2, -1 - call psi_idx_heap_get_first(key,index,l,x,ix,dir_,info) - if (l /= i-1) then - write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i - end if - x(i) = key - ix(i) = index - end do - else if (.not.present(ix)) then + select case(reord_) + case (psb_sort_reord_x_) + + l = 0 + do i=1, n + key = x(i) + index = ix(i) + call psi_idx_insert_heap(key,index,l,x,ix,dir_,info) + if (l /= i) then + write(psb_err_unit,*) 'Mismatch while heapifying ! ' + end if + end do + do i=n, 2, -1 + call psi_idx_heap_get_first(key,index,l,x,ix,dir_,info) + if (l /= i-1) then + write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i + end if + x(i) = key + ix(i) = index + end do + case(psb_sort_noreord_x_) + tx = x + + l = 0 + do i=1, n + key = tx(i) + index = ix(i) + call psi_idx_insert_heap(key,index,l,tx,ix,dir_,info) + if (l /= i) then + write(psb_err_unit,*) 'Mismatch while heapifying ! ' + end if + end do + do i=n, 2, -1 + call psi_idx_heap_get_first(key,index,l,tx,ix,dir_,info) + if (l /= i-1) then + write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i + end if + tx(i) = key + ix(i) = index + end do + end select + else if (.not.present(ix)) then + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + l = 0 do i=1, n key = x(i) diff --git a/base/serial/sort/psb_m_isort_impl.f90 b/base/serial/sort/psb_m_isort_impl.f90 index 1f373e42..ae6c0ce2 100644 --- a/base/serial/sort/psb_m_isort_impl.f90 +++ b/base/serial/sort/psb_m_isort_impl.f90 @@ -40,16 +40,17 @@ ! Data Structures and Algorithms ! Addison-Wesley ! -subroutine psb_misort(x,ix,dir,flag) +subroutine psb_misort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_misort use psb_error_mod implicit none integer(psb_mpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, err_act + integer(psb_ipk_) :: dir_, flag_, err_act, reord_ integer(psb_ipk_) :: n, i + integer(psb_mpk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name @@ -57,6 +58,12 @@ subroutine psb_misort(x,ix,dir,flag) name='psb_misort' call psb_erractionsave(err_act) + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if + if (present(flag)) then flag_ = flag else @@ -90,31 +97,61 @@ subroutine psb_misort(x,ix,dir,flag) ix(i) = i end do end if - - select case(dir_) - case (psb_sort_up_) - call psi_misrx_up(n,x,ix) - case (psb_sort_down_) - call psi_misrx_dw(n,x,ix) - case (psb_asort_up_) + select case(reord_) + case (psb_sort_reord_x_) + select case(dir_) + case (psb_sort_up_) + call psi_misrx_up(n,x,ix) + case (psb_sort_down_) + call psi_misrx_dw(n,x,ix) + case (psb_asort_up_) call psi_maisrx_up(n,x,ix) - case (psb_asort_down_) + case (psb_asort_down_) call psi_maisrx_dw(n,x,ix) - case default - ierr(1) = 3; ierr(2) = dir_; + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case(psb_sort_noreord_x_) + tx = x + select case(dir_) + case (psb_sort_up_) + call psi_misrx_up(n,tx,ix) + case (psb_sort_down_) + call psi_misrx_dw(n,tx,ix) + case (psb_asort_up_) + call psi_maisrx_up(n,tx,ix) + case (psb_asort_down_) + call psi_maisrx_dw(n,tx,ix) + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + else + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) goto 9999 end select - else select case(dir_) case (psb_sort_up_) call psi_misr_up(n,x) case (psb_sort_down_) call psi_misr_dw(n,x) case (psb_asort_up_) - call psi_maisr_up(n,x) + call psi_maisr_up(n,x) case (psb_asort_down_) - call psi_maisr_dw(n,x) + call psi_maisr_dw(n,x) case default ierr(1) = 3; ierr(2) = dir_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) diff --git a/base/serial/sort/psb_m_msort_impl.f90 b/base/serial/sort/psb_m_msort_impl.f90 index 437d1069..d3af4673 100644 --- a/base/serial/sort/psb_m_msort_impl.f90 +++ b/base/serial/sort/psb_m_msort_impl.f90 @@ -131,16 +131,16 @@ subroutine psb_mmsort_u(x,nout,dir) return end subroutine psb_mmsort_u -subroutine psb_mmsort(x,ix,dir,flag) +subroutine psb_mmsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_mmsort use psb_error_mod use psb_ip_reord_mod implicit none integer(psb_mpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag, reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, n, err_act + integer(psb_ipk_) :: dir_, flag_, n, err_act, reord_ integer(psb_ipk_), allocatable :: iaux(:) integer(psb_ipk_) :: iret, info, i @@ -150,6 +150,11 @@ subroutine psb_mmsort(x,ix,dir,flag) name='psb_mmsort' call psb_erractionsave(err_act) + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if if (present(dir)) then dir_ = dir else @@ -212,15 +217,28 @@ subroutine psb_mmsort(x,ix,dir,flag) ! Do the actual reordering, since the inner routines ! only provide linked pointers. ! - if (iret == 0 ) then - if (present(ix)) then - call psb_ip_reord(n,x,ix,iaux) - else - call psb_ip_reord(n,x,iaux) - end if + if (iret == 0 ) then + select case(reord_) + case(psb_sort_reord_x_) + if (present(ix)) then + call psb_ip_reord(n,x,ix,iaux) + else + call psb_ip_reord(n,x,iaux) + end if + case(psb_sort_noreord_x_) + if (present(ix)) then + call psb_ip_reord(n,ix,iaux) + else + call psb_errpush(psb_err_no_optional_arg_,name,a_err="ix") + goto 9999 + end if + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select end if - return 9999 call psb_error_handler(err_act) diff --git a/base/serial/sort/psb_m_qsort_impl.f90 b/base/serial/sort/psb_m_qsort_impl.f90 index 6b70c3a0..2dd009b3 100644 --- a/base/serial/sort/psb_m_qsort_impl.f90 +++ b/base/serial/sort/psb_m_qsort_impl.f90 @@ -159,22 +159,29 @@ function psb_mssrch(key,n,v) result(ipos) return end function psb_mssrch -subroutine psb_mqsort(x,ix,dir,flag) +subroutine psb_mqsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_mqsort use psb_error_mod implicit none integer(psb_mpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, err_act, i + integer(psb_ipk_) :: dir_, flag_, err_act, i, reord_ integer(psb_ipk_) :: n + integer(psb_mpk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name name='psb_mqsort' call psb_erractionsave(err_act) + + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if if (present(flag)) then flag_ = flag else @@ -209,21 +216,49 @@ subroutine psb_mqsort(x,ix,dir,flag) end do end if - select case(dir_) - case (psb_sort_up_) - call psi_mqsrx_up(n,x,ix) - case (psb_sort_down_) - call psi_mqsrx_dw(n,x,ix) - case (psb_asort_up_) + select case(reord_) + case (psb_sort_reord_x_) + select case(dir_) + case (psb_sort_up_) + call psi_mqsrx_up(n,x,ix) + case (psb_sort_down_) + call psi_mqsrx_dw(n,x,ix) + case (psb_asort_up_) call psi_maqsrx_up(n,x,ix) - case (psb_asort_down_) + case (psb_asort_down_) call psi_maqsrx_dw(n,x,ix) - case default - ierr(1) = 3; ierr(2) = dir_; + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case(psb_sort_noreord_x_) + tx = x + select case(dir_) + case (psb_sort_up_) + call psi_mqsrx_up(n,tx,ix) + case (psb_sort_down_) + call psi_mqsrx_dw(n,tx,ix) + case (psb_asort_up_) + call psi_maqsrx_up(n,tx,ix) + case (psb_asort_down_) + call psi_maqsrx_dw(n,tx,ix) + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + end select + else + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) goto 9999 end select - else + select case(dir_) case (psb_sort_up_) call psi_mqsr_up(n,x) diff --git a/base/serial/sort/psb_s_hsort_impl.f90 b/base/serial/sort/psb_s_hsort_impl.f90 index 77fefe14..559f92c5 100644 --- a/base/serial/sort/psb_s_hsort_impl.f90 +++ b/base/serial/sort/psb_s_hsort_impl.f90 @@ -41,18 +41,19 @@ ! Data Structures and Algorithms ! Addison-Wesley ! -subroutine psb_shsort(x,ix,dir,flag) +subroutine psb_shsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_shsort use psb_error_mod implicit none real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: flag_, n, i, err_act,info - integer(psb_ipk_) :: dir_, l + integer(psb_ipk_) :: flag_, err_act, info, reord_ + integer(psb_ipk_) :: n, i, l, dir_ real(psb_spk_) :: key integer(psb_ipk_) :: index + real(psb_spk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name @@ -60,6 +61,13 @@ subroutine psb_shsort(x,ix,dir,flag) name='psb_hsort' call psb_erractionsave(err_act) + + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if + if (present(flag)) then flag_ = flag else @@ -113,24 +121,57 @@ subroutine psb_shsort(x,ix,dir,flag) ix(i) = i end do end if - l = 0 - do i=1, n - key = x(i) - index = ix(i) - call psi_idx_insert_heap(key,index,l,x,ix,dir_,info) - if (l /= i) then - write(psb_err_unit,*) 'Mismatch while heapifying ! ' - end if - end do - do i=n, 2, -1 - call psi_idx_heap_get_first(key,index,l,x,ix,dir_,info) - if (l /= i-1) then - write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i - end if - x(i) = key - ix(i) = index - end do - else if (.not.present(ix)) then + select case(reord_) + case (psb_sort_reord_x_) + + l = 0 + do i=1, n + key = x(i) + index = ix(i) + call psi_idx_insert_heap(key,index,l,x,ix,dir_,info) + if (l /= i) then + write(psb_err_unit,*) 'Mismatch while heapifying ! ' + end if + end do + do i=n, 2, -1 + call psi_idx_heap_get_first(key,index,l,x,ix,dir_,info) + if (l /= i-1) then + write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i + end if + x(i) = key + ix(i) = index + end do + case(psb_sort_noreord_x_) + tx = x + + l = 0 + do i=1, n + key = tx(i) + index = ix(i) + call psi_idx_insert_heap(key,index,l,tx,ix,dir_,info) + if (l /= i) then + write(psb_err_unit,*) 'Mismatch while heapifying ! ' + end if + end do + do i=n, 2, -1 + call psi_idx_heap_get_first(key,index,l,tx,ix,dir_,info) + if (l /= i-1) then + write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i + end if + tx(i) = key + ix(i) = index + end do + end select + else if (.not.present(ix)) then + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + l = 0 do i=1, n key = x(i) diff --git a/base/serial/sort/psb_s_isort_impl.f90 b/base/serial/sort/psb_s_isort_impl.f90 index cdcc05eb..a8be6d46 100644 --- a/base/serial/sort/psb_s_isort_impl.f90 +++ b/base/serial/sort/psb_s_isort_impl.f90 @@ -40,16 +40,17 @@ ! Data Structures and Algorithms ! Addison-Wesley ! -subroutine psb_sisort(x,ix,dir,flag) +subroutine psb_sisort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_sisort use psb_error_mod implicit none real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, err_act + integer(psb_ipk_) :: dir_, flag_, err_act, reord_ integer(psb_ipk_) :: n, i + real(psb_spk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name @@ -57,6 +58,12 @@ subroutine psb_sisort(x,ix,dir,flag) name='psb_sisort' call psb_erractionsave(err_act) + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if + if (present(flag)) then flag_ = flag else @@ -90,31 +97,61 @@ subroutine psb_sisort(x,ix,dir,flag) ix(i) = i end do end if - - select case(dir_) - case (psb_sort_up_) - call psi_sisrx_up(n,x,ix) - case (psb_sort_down_) - call psi_sisrx_dw(n,x,ix) - case (psb_asort_up_) + select case(reord_) + case (psb_sort_reord_x_) + select case(dir_) + case (psb_sort_up_) + call psi_sisrx_up(n,x,ix) + case (psb_sort_down_) + call psi_sisrx_dw(n,x,ix) + case (psb_asort_up_) call psi_saisrx_up(n,x,ix) - case (psb_asort_down_) + case (psb_asort_down_) call psi_saisrx_dw(n,x,ix) - case default - ierr(1) = 3; ierr(2) = dir_; + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case(psb_sort_noreord_x_) + tx = x + select case(dir_) + case (psb_sort_up_) + call psi_sisrx_up(n,tx,ix) + case (psb_sort_down_) + call psi_sisrx_dw(n,tx,ix) + case (psb_asort_up_) + call psi_saisrx_up(n,tx,ix) + case (psb_asort_down_) + call psi_saisrx_dw(n,tx,ix) + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + else + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) goto 9999 end select - else select case(dir_) case (psb_sort_up_) call psi_sisr_up(n,x) case (psb_sort_down_) call psi_sisr_dw(n,x) case (psb_asort_up_) - call psi_saisr_up(n,x) + call psi_saisr_up(n,x) case (psb_asort_down_) - call psi_saisr_dw(n,x) + call psi_saisr_dw(n,x) case default ierr(1) = 3; ierr(2) = dir_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) diff --git a/base/serial/sort/psb_s_msort_impl.f90 b/base/serial/sort/psb_s_msort_impl.f90 index e3382f27..e3c0a184 100644 --- a/base/serial/sort/psb_s_msort_impl.f90 +++ b/base/serial/sort/psb_s_msort_impl.f90 @@ -76,16 +76,16 @@ subroutine psb_smsort_u(x,nout,dir) return end subroutine psb_smsort_u -subroutine psb_smsort(x,ix,dir,flag) +subroutine psb_smsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_smsort use psb_error_mod use psb_ip_reord_mod implicit none real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag, reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, n, err_act + integer(psb_ipk_) :: dir_, flag_, n, err_act, reord_ integer(psb_ipk_), allocatable :: iaux(:) integer(psb_ipk_) :: iret, info, i @@ -95,6 +95,11 @@ subroutine psb_smsort(x,ix,dir,flag) name='psb_smsort' call psb_erractionsave(err_act) + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if if (present(dir)) then dir_ = dir else @@ -157,15 +162,28 @@ subroutine psb_smsort(x,ix,dir,flag) ! Do the actual reordering, since the inner routines ! only provide linked pointers. ! - if (iret == 0 ) then - if (present(ix)) then - call psb_ip_reord(n,x,ix,iaux) - else - call psb_ip_reord(n,x,iaux) - end if + if (iret == 0 ) then + select case(reord_) + case(psb_sort_reord_x_) + if (present(ix)) then + call psb_ip_reord(n,x,ix,iaux) + else + call psb_ip_reord(n,x,iaux) + end if + case(psb_sort_noreord_x_) + if (present(ix)) then + call psb_ip_reord(n,ix,iaux) + else + call psb_errpush(psb_err_no_optional_arg_,name,a_err="ix") + goto 9999 + end if + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select end if - return 9999 call psb_error_handler(err_act) diff --git a/base/serial/sort/psb_s_qsort_impl.f90 b/base/serial/sort/psb_s_qsort_impl.f90 index cae32546..6b2d4821 100644 --- a/base/serial/sort/psb_s_qsort_impl.f90 +++ b/base/serial/sort/psb_s_qsort_impl.f90 @@ -159,22 +159,29 @@ function psb_sssrch(key,n,v) result(ipos) return end function psb_sssrch -subroutine psb_sqsort(x,ix,dir,flag) +subroutine psb_sqsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_sqsort use psb_error_mod implicit none real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, err_act, i + integer(psb_ipk_) :: dir_, flag_, err_act, i, reord_ integer(psb_ipk_) :: n + real(psb_spk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name name='psb_sqsort' call psb_erractionsave(err_act) + + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if if (present(flag)) then flag_ = flag else @@ -209,21 +216,49 @@ subroutine psb_sqsort(x,ix,dir,flag) end do end if - select case(dir_) - case (psb_sort_up_) - call psi_sqsrx_up(n,x,ix) - case (psb_sort_down_) - call psi_sqsrx_dw(n,x,ix) - case (psb_asort_up_) + select case(reord_) + case (psb_sort_reord_x_) + select case(dir_) + case (psb_sort_up_) + call psi_sqsrx_up(n,x,ix) + case (psb_sort_down_) + call psi_sqsrx_dw(n,x,ix) + case (psb_asort_up_) call psi_saqsrx_up(n,x,ix) - case (psb_asort_down_) + case (psb_asort_down_) call psi_saqsrx_dw(n,x,ix) - case default - ierr(1) = 3; ierr(2) = dir_; + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case(psb_sort_noreord_x_) + tx = x + select case(dir_) + case (psb_sort_up_) + call psi_sqsrx_up(n,tx,ix) + case (psb_sort_down_) + call psi_sqsrx_dw(n,tx,ix) + case (psb_asort_up_) + call psi_saqsrx_up(n,tx,ix) + case (psb_asort_down_) + call psi_saqsrx_dw(n,tx,ix) + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + end select + else + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) goto 9999 end select - else + select case(dir_) case (psb_sort_up_) call psi_sqsr_up(n,x) diff --git a/base/serial/sort/psb_z_hsort_impl.f90 b/base/serial/sort/psb_z_hsort_impl.f90 index e796f831..9e886dde 100644 --- a/base/serial/sort/psb_z_hsort_impl.f90 +++ b/base/serial/sort/psb_z_hsort_impl.f90 @@ -41,18 +41,19 @@ ! Data Structures and Algorithms ! Addison-Wesley ! -subroutine psb_zhsort(x,ix,dir,flag) +subroutine psb_zhsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_zhsort use psb_error_mod implicit none complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: flag_, n, i, err_act,info - integer(psb_ipk_) :: dir_, l + integer(psb_ipk_) :: flag_, err_act, info, reord_ + integer(psb_ipk_) :: n, i, l, dir_ complex(psb_dpk_) :: key integer(psb_ipk_) :: index + complex(psb_dpk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name @@ -60,6 +61,13 @@ subroutine psb_zhsort(x,ix,dir,flag) name='psb_hsort' call psb_erractionsave(err_act) + + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if + if (present(flag)) then flag_ = flag else @@ -113,24 +121,57 @@ subroutine psb_zhsort(x,ix,dir,flag) ix(i) = i end do end if - l = 0 - do i=1, n - key = x(i) - index = ix(i) - call psi_idx_insert_heap(key,index,l,x,ix,dir_,info) - if (l /= i) then - write(psb_err_unit,*) 'Mismatch while heapifying ! ' - end if - end do - do i=n, 2, -1 - call psi_idx_heap_get_first(key,index,l,x,ix,dir_,info) - if (l /= i-1) then - write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i - end if - x(i) = key - ix(i) = index - end do - else if (.not.present(ix)) then + select case(reord_) + case (psb_sort_reord_x_) + + l = 0 + do i=1, n + key = x(i) + index = ix(i) + call psi_idx_insert_heap(key,index,l,x,ix,dir_,info) + if (l /= i) then + write(psb_err_unit,*) 'Mismatch while heapifying ! ' + end if + end do + do i=n, 2, -1 + call psi_idx_heap_get_first(key,index,l,x,ix,dir_,info) + if (l /= i-1) then + write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i + end if + x(i) = key + ix(i) = index + end do + case(psb_sort_noreord_x_) + tx = x + + l = 0 + do i=1, n + key = tx(i) + index = ix(i) + call psi_idx_insert_heap(key,index,l,tx,ix,dir_,info) + if (l /= i) then + write(psb_err_unit,*) 'Mismatch while heapifying ! ' + end if + end do + do i=n, 2, -1 + call psi_idx_heap_get_first(key,index,l,tx,ix,dir_,info) + if (l /= i-1) then + write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i + end if + tx(i) = key + ix(i) = index + end do + end select + else if (.not.present(ix)) then + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + l = 0 do i=1, n key = x(i) diff --git a/base/serial/sort/psb_z_isort_impl.f90 b/base/serial/sort/psb_z_isort_impl.f90 index 340ed8e3..465699da 100644 --- a/base/serial/sort/psb_z_isort_impl.f90 +++ b/base/serial/sort/psb_z_isort_impl.f90 @@ -40,16 +40,17 @@ ! Data Structures and Algorithms ! Addison-Wesley ! -subroutine psb_zisort(x,ix,dir,flag) +subroutine psb_zisort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_zisort use psb_error_mod implicit none complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, err_act + integer(psb_ipk_) :: dir_, flag_, err_act, reord_ integer(psb_ipk_) :: n, i + complex(psb_dpk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name @@ -57,6 +58,12 @@ subroutine psb_zisort(x,ix,dir,flag) name='psb_zisort' call psb_erractionsave(err_act) + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if + if (present(flag)) then flag_ = flag else @@ -90,39 +97,73 @@ subroutine psb_zisort(x,ix,dir,flag) ix(i) = i end do end if - - select case(dir_) - case (psb_lsort_up_) + select case(reord_) + case (psb_sort_reord_x_) + select case(dir_) + case (psb_lsort_up_) call psi_zlisrx_up(n,x,ix) - case (psb_lsort_down_) + case (psb_lsort_down_) call psi_zlisrx_dw(n,x,ix) - case (psb_alsort_up_) + case (psb_alsort_up_) call psi_zalisrx_up(n,x,ix) - case (psb_alsort_down_) + case (psb_alsort_down_) call psi_zalisrx_dw(n,x,ix) - case (psb_asort_up_) + case (psb_asort_up_) call psi_zaisrx_up(n,x,ix) - case (psb_asort_down_) + case (psb_asort_down_) call psi_zaisrx_dw(n,x,ix) - case default - ierr(1) = 3; ierr(2) = dir_; + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case(psb_sort_noreord_x_) + tx = x + select case(dir_) + case (psb_lsort_up_) + call psi_zlisrx_up(n,tx,ix) + case (psb_lsort_down_) + call psi_zlisrx_dw(n,tx,ix) + case (psb_alsort_up_) + call psi_zalisrx_up(n,tx,ix) + case (psb_alsort_down_) + call psi_zalisrx_dw(n,tx,ix) + case (psb_asort_up_) + call psi_zaisrx_up(n,tx,ix) + case (psb_asort_down_) + call psi_zaisrx_dw(n,tx,ix) + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + else + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) goto 9999 end select - else select case(dir_) case (psb_lsort_up_) - call psi_zlisr_up(n,x) + call psi_zlisr_up(n,x) case (psb_lsort_down_) - call psi_zlisr_dw(n,x) + call psi_zlisr_dw(n,x) case (psb_alsort_up_) - call psi_zalisr_up(n,x) + call psi_zalisr_up(n,x) case (psb_alsort_down_) - call psi_zalisr_dw(n,x) + call psi_zalisr_dw(n,x) case (psb_asort_up_) - call psi_zaisr_up(n,x) + call psi_zaisr_up(n,x) case (psb_asort_down_) - call psi_zaisr_dw(n,x) + call psi_zaisr_dw(n,x) case default ierr(1) = 3; ierr(2) = dir_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) diff --git a/base/serial/sort/psb_z_msort_impl.f90 b/base/serial/sort/psb_z_msort_impl.f90 index 525ed572..24934e14 100644 --- a/base/serial/sort/psb_z_msort_impl.f90 +++ b/base/serial/sort/psb_z_msort_impl.f90 @@ -77,16 +77,16 @@ subroutine psb_zmsort_u(x,nout,dir) end subroutine psb_zmsort_u -subroutine psb_zmsort(x,ix,dir,flag) +subroutine psb_zmsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_zmsort use psb_error_mod use psb_ip_reord_mod implicit none complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, n, err_act + integer(psb_ipk_) :: dir_, flag_, n, err_act, reord_ integer(psb_ipk_), allocatable :: iaux(:) integer(psb_ipk_) :: iret, info, i @@ -96,6 +96,11 @@ subroutine psb_zmsort(x,ix,dir,flag) name='psb_zmsort' call psb_erractionsave(err_act) + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if if (present(dir)) then dir_ = dir else @@ -163,11 +168,25 @@ subroutine psb_zmsort(x,ix,dir,flag) ! only provide linked pointers. ! if (iret == 0 ) then - if (present(ix)) then - call psb_ip_reord(n,x,ix,iaux) - else - call psb_ip_reord(n,x,iaux) - end if + select case(reord_) + case(psb_sort_reord_x_) + if (present(ix)) then + call psb_ip_reord(n,x,ix,iaux) + else + call psb_ip_reord(n,x,iaux) + end if + case(psb_sort_noreord_x_) + if (present(ix)) then + call psb_ip_reord(n,ix,iaux) + else + call psb_errpush(psb_err_no_optional_arg_,name,a_err="ix") + goto 9999 + end if + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select end if return diff --git a/base/serial/sort/psb_z_qsort_impl.f90 b/base/serial/sort/psb_z_qsort_impl.f90 index a1cdb193..ce3061ea 100644 --- a/base/serial/sort/psb_z_qsort_impl.f90 +++ b/base/serial/sort/psb_z_qsort_impl.f90 @@ -41,22 +41,29 @@ ! Addison-Wesley ! -subroutine psb_zqsort(x,ix,dir,flag) +subroutine psb_zqsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_zqsort use psb_error_mod implicit none complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, err_act, i + integer(psb_ipk_) :: dir_, flag_, err_act, i, reord_ integer(psb_ipk_) :: n + complex(psb_dpk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name name='psb_zqsort' call psb_erractionsave(err_act) + + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if if (present(flag)) then flag_ = flag else @@ -91,25 +98,57 @@ subroutine psb_zqsort(x,ix,dir,flag) end do end if - select case(dir_) - case (psb_lsort_up_) + select case(reord_) + case (psb_sort_reord_x_) + select case(dir_) + case (psb_lsort_up_) call psi_zlqsrx_up(n,x,ix) - case (psb_lsort_down_) + case (psb_lsort_down_) call psi_zlqsrx_dw(n,x,ix) - case (psb_alsort_up_) + case (psb_alsort_up_) call psi_zalqsrx_up(n,x,ix) - case (psb_alsort_down_) + case (psb_alsort_down_) call psi_zalqsrx_dw(n,x,ix) - case (psb_asort_up_) + case (psb_asort_up_) call psi_zaqsrx_up(n,x,ix) - case (psb_asort_down_) + case (psb_asort_down_) call psi_zaqsrx_dw(n,x,ix) - case default - ierr(1) = 3; ierr(2) = dir_; + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case(psb_sort_noreord_x_) + tx = x + select case(dir_) + case (psb_lsort_up_) + call psi_zlqsrx_up(n,tx,ix) + case (psb_lsort_down_) + call psi_zlqsrx_dw(n,tx,ix) + case (psb_alsort_up_) + call psi_zalqsrx_up(n,tx,ix) + case (psb_alsort_down_) + call psi_zalqsrx_dw(n,tx,ix) + case (psb_asort_up_) + call psi_zaqsrx_up(n,tx,ix) + case (psb_asort_down_) + call psi_zaqsrx_dw(n,tx,ix) + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + end select + else + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) goto 9999 end select - else + select case(dir_) case (psb_lsort_up_) call psi_zlqsr_up(n,x) diff --git a/docs/html/userhtmlse6.html b/docs/html/userhtmlse6.html index f5be71d9..c26876b8 100644 --- a/docs/html/userhtmlse6.html +++ b/docs/html/userhtmlse6.html @@ -3886,10 +3886,10 @@ class="pplb7t-x-x-120">_hsort — Sorting by the Heapsort algorithm
-call psb_isort(x,ix,dir,flag)
-call psb_msort(x,ix,dir,flag)
-call psb_qsort(x,ix,dir,flag)
-call psb_hsort(x,ix,dir,flag)
+call psb_isort(x,ix,dir,flag,reord)
+call psb_msort(x,ix,dir,flag,reord)
+call psb_qsort(x,ix,dir,flag,reord)
+call psb_hsort(x,ix,dir,flag,reord)
 

These serial routines sort a sequence

A vector of indices.
Type:optional.
Specified as: an integer array of (at least) the same size as X. +class="newline" />Specified as: an integer array of (at least) the same size as X. This + argument is required when reord = psb_sort_noreord_x_.

-

+

dir

-

The desired ordering.

The desired ordering.
Type:optional.
Specified as: an integer value:

-

+

Integer and real data:

-

psb_sort_up_, psb_sort_down_, psb_asort_up_, @@ -3952,11 +3959,11 @@ class="cmtt-10">psb_sort_up_.

-

+

Complex data:

-

psb_lsort_up_, psb_lsort_down_, psb_asort_up_, @@ -3964,11 +3971,11 @@ class="cmtt-10">psb_asort_up_, class="cmtt-10">psb_asort_down_; default psb_lsort_up_.

-

+

flag

-

Whether to keep the original values in

Whether to keep the original values in IX.
Type:optional.
psb_sort_ovw_idx_ or psb_sort_keep_idx_; default psb_sort_ovw_idx_. +

+

+reord

+

Whether to reorder the input vector x or just return IX for further + usage.
Type:optional.
Specified as: an integer value psb_sort_reord_x_ or psb_sort_noreord_x_; + default psb_sort_reord_x_.

-

+

-

+

On Return

-

+

-

+

x

-

The sequence of values, in the chosen ordering.

The sequence of values; if reord=psb_sort_reord_x_ it will be in the + chosen ordering.
Type:required.
Specified as: an integer, real or complex array of rank 1.

-

+

ix

-

A vector of indices.

A vector of indices.
Type: Optional
An integer array of rank 1, whose entries are moved to the same position - as the corresponding entries in x.

-

An integer array of rank 1, whose i-th entry gives the position of the + (sorted) value of x in the original sequence. + + + +

Notes

  1. -

    For integer or real data the sorting can be performed in the up/down +

    For integer or real data the sorting can be performed in the up/down direction, on the natural or absolute values;

  2. -

    For complex data the sorting can be done in a lexicographic order (i.e.: +

    For complex data the sorting can be done in a lexicographic order (i.e.: sort on the real part with ties broken according to the imaginary part) or on the absolute values; - - -

  3. -

    The routines return the items in the chosen ordering; the output +

    The routines return the items in the chosen ordering; the output difference is the handling of ties (i.e. items with an equal value) in the original input. With the insertion-sort or merge-sort algorithms ties are preserved in the same relative order as they had in the original sequence, @@ -4032,7 +4058,22 @@ class="pplb7t-x-x-120">Notes

  4. -

    If

    If reord = psb_sort_noreord_x_, then the input sequence x is not reordered; + the output is given in ix. Calling without ix in this case is flagged as an + error; +

  5. +
  6. +

    If flag = psb_) occupied in the original data sequence;

  7. -

    If +

    If flag = psb_ix(:) have already been initialized by the user;

  8. -

    Three sorting algorithms have a similar + + + +

    Three sorting algorithms have a similar O(n log ); of the other three, However note that:

    1. -

      The the best case running time for insertion sort is +

      The the best case running time for insertion sort is Ω(n) while the @@ -4110,8 +4154,8 @@ class="zplmr7t-">); however for very short input sequences this is likely to be the fastest method;

    2. -

      The worst case running time + class="enumerate" id="x12-105018x2"> +

      The worst case running time for quicksort is O(); the algorithm implemented here follows the apply;

    3. -

      The worst case running time for merge-sort and heap-sort is + class="enumerate" id="x12-105020x3"> +

      The worst case running time for merge-sort and heap-sort is O(n log n) as the average case; - - -

    4. -

      The merge-sort algorithm is implemented to take advantage of + class="enumerate" id="x12-105022x4"> +

      The merge-sort algorithm is implemented to take advantage of subsequences that may be already in the desired ordering prior to the subroutine call; this situation is relatively common when dealing with groups of indices of sparse matrix entries, thus merge-sort is diff --git a/docs/psblas-3.9.pdf b/docs/psblas-3.9.pdf index a0d16c37..4bbd69b4 100644 --- a/docs/psblas-3.9.pdf +++ b/docs/psblas-3.9.pdf @@ -21904,88 +21904,116 @@ endstream endobj 1742 0 obj << -/Length 6342 +/Length 7828 >> stream 0 g 0 G 0 g 0 G BT -/F75 11.9552 Tf 150.705 706.129 Td [(6.27)-1000(Sorting)-250(utilities)-250(\227)]TJ -0.371 -19.314 Td [(psb)]TJ +/F75 11.9552 Tf 150.705 706.129 Td [(6.27)-1000(Sorting)-250(utilities)-250(\227)]TJ -0.371 -18.964 Td [(psb)]TJ ET q -1 0 0 1 170.969 687.014 cm +1 0 0 1 170.969 687.364 cm []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 174.555 686.815 Td [(isort)-250(\227)-250(Sorting)-250(by)-250(the)-250(Insertion-sort)-250(algorithm)]TJ -24.221 -12.136 Td [(psb)]TJ +/F75 11.9552 Tf 174.555 687.165 Td [(isort)-250(\227)-250(Sorting)-250(by)-250(the)-250(Insertion-sort)-250(algorithm)]TJ -24.221 -11.955 Td [(psb)]TJ ET q -1 0 0 1 170.969 674.878 cm +1 0 0 1 170.969 675.409 cm []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 174.555 674.679 Td [(msort)-250(\227)-250(Sorting)-250(by)-250(the)-250(Merge-sort)-250(algorithm)]TJ -24.221 -12.136 Td [(psb)]TJ +/F75 11.9552 Tf 174.555 675.21 Td [(msort)-250(\227)-250(Sorting)-250(by)-250(the)-250(Merge-sort)-250(algorithm)]TJ -24.221 -11.955 Td [(psb)]TJ ET q -1 0 0 1 170.969 662.742 cm +1 0 0 1 170.969 663.454 cm []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 174.555 662.543 Td [(qsort)-250(\227)-250(Sorting)-250(by)-250(the)-250(Quicksort)-250(algorithm)]TJ -24.221 -12.136 Td [(psb)]TJ +/F75 11.9552 Tf 174.555 663.255 Td [(qsort)-250(\227)-250(Sorting)-250(by)-250(the)-250(Quicksort)-250(algorithm)]TJ -24.221 -11.955 Td [(psb)]TJ ET q -1 0 0 1 170.969 650.607 cm +1 0 0 1 170.969 651.499 cm []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 174.555 650.407 Td [(hsort)-250(\227)-250(Sorting)-250(by)-250(the)-250(Heapsort)-250(algorithm)]TJ +/F75 11.9552 Tf 174.555 651.3 Td [(hsort)-250(\227)-250(Sorting)-250(by)-250(the)-250(Heapsort)-250(algorithm)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -23.85 -20.648 Td [(call)-525(psb_isort\050x,ix,dir,flag\051)]TJ 0 -11.955 Td [(call)-525(psb_msort\050x,ix,dir,flag\051)]TJ 0 -11.955 Td [(call)-525(psb_qsort\050x,ix,dir,flag\051)]TJ 0 -11.955 Td [(call)-525(psb_hsort\050x,ix,dir,flag\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 165.649 573.426 Tm [(These)-314(serial)-313(r)17(outines)-313(sort)-314(a)-314(sequence)]TJ/F78 9.9626 Tf 1 0 0 1 335.711 573.426 Tm [(X)]TJ/F84 9.9626 Tf 1.02 0 0 1 346.436 573.426 Tm [(into)-314(ascending)-313(or)-314(descending)-314(or)18(-)]TJ 1.02 0 0 1 150.705 561.471 Tm [(der)73(.)-328(The)-253(ar)18(gument)-253(meaning)-253(is)-253(identical)-253(for)-253(all)-253(calls;)-257(the)-253(only)-253(dif)17(f)1(er)17(ence)-253(is)-253(the)]TJ 1 0 0 1 150.705 549.516 Tm [(algorithm)-250(used)-250(to)-250(accomplish)-250(the)-250(task)-250(\050see)-250(Usage)-250(Notes)-250(below\051.)]TJ +/F145 9.9626 Tf -23.85 -19.808 Td [(call)-525(psb_isort\050x,ix,dir,flag,reord\051)]TJ 0 -11.955 Td [(call)-525(psb_msort\050x,ix,dir,flag,reord\051)]TJ 0 -11.955 Td [(call)-525(psb_qsort\050x,ix,dir,flag,reord\051)]TJ 0 -11.955 Td [(call)-525(psb_hsort\050x,ix,dir,flag,reord\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 165.649 575.819 Tm [(These)-314(serial)-313(r)17(outines)-313(sort)-314(a)-314(sequence)]TJ/F78 9.9626 Tf 1 0 0 1 335.711 575.819 Tm [(X)]TJ/F84 9.9626 Tf 1.02 0 0 1 346.436 575.819 Tm [(into)-314(ascending)-313(or)-314(descending)-314(or)18(-)]TJ 1.02 0 0 1 150.705 563.864 Tm [(der)73(.)-328(The)-253(ar)18(gument)-253(meaning)-253(is)-253(identical)-253(for)-253(all)-253(calls;)-257(the)-253(only)-253(dif)17(f)1(er)17(ence)-253(is)-253(the)]TJ 1 0 0 1 150.705 551.909 Tm [(algorithm)-250(used)-250(to)-250(accomplish)-250(the)-250(task)-250(\050see)-250(Usage)-250(Notes)-250(below\051.)]TJ 0 g 0 G -/F75 9.9626 Tf 0 -20.467 Td [(T)90(ype:)]TJ +/F75 9.9626 Tf 0 -19.808 Td [(T)90(ype:)]TJ 0 g 0 G /F84 9.9626 Tf 29.439 0 Td [(Asynchr)18(onous.)]TJ 0 g 0 G -/F75 9.9626 Tf -29.439 -20.648 Td [(On)-250(Entry)]TJ +/F75 9.9626 Tf -29.439 -19.866 Td [(On)-250(Entry)]TJ 0 g 0 G 0 g 0 G - 0 -20.648 Td [(x)]TJ + 0 -19.866 Td [(x)]TJ 0 g 0 G -/F84 9.9626 Tf 9.654 0 Td [(The)-250(sequence)-250(to)-250(be)-250(sorted.)]TJ 14.944 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.984 -11.956 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)74(,)-250(r)18(eal)-250(or)-250(complex)-250(array)-250(of)-250(rank)-250(1.)]TJ +/F84 9.9626 Tf 9.654 0 Td [(The)-250(sequence)-250(to)-250(be)-250(sorted.)]TJ 14.944 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.984 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)74(,)-250(r)18(eal)-250(or)-250(complex)-250(array)-250(of)-250(rank)-250(1.)]TJ 0 g 0 G -/F75 9.9626 Tf -24.906 -20.648 Td [(ix)]TJ +/F75 9.9626 Tf -24.906 -19.866 Td [(ix)]TJ 0 g 0 G -/F84 9.9626 Tf 12.891 0 Td [(A)-250(vector)-250(of)-250(indices.)]TJ 11.707 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -61.878 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(array)-250(of)-250(\050at)-250(least\051)-250(the)-250(same)-250(size)-250(as)]TJ/F78 9.9626 Tf 254.19 0 Td [(X)]TJ/F84 9.9626 Tf 7.536 0 Td [(.)]TJ +/F84 9.9626 Tf 12.891 0 Td [(A)-250(vector)-250(of)-250(indices.)]TJ 11.707 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ 0.98 0 0 1 175.611 424.682 Tm [(Speci\002ed)-198(as:)-288(an)-198(integer)-198(array)-198(of)-198(\050at)-198(least\051)-198(t)1(he)-198(same)-198(size)-198(as)]TJ/F78 9.9626 Tf 1 0 0 1 418.918 424.682 Tm [(X)]TJ/F84 9.9626 Tf 0.98 0 0 1 426.455 424.682 Tm [(.)-297(This)-198(ar)18(gument)]TJ 1 0 0 1 175.611 412.726 Tm [(is)-250(r)18(equir)18(ed)-250(when)]TJ/F78 9.9626 Tf 76.926 0 Td [(r)-17(e)-25(o)-25(r)-17(d)]TJ/F192 10.3811 Tf 24.884 0 Td [(=)]TJ/F78 9.9626 Tf 11.634 0 Td [(p)-25(s)-25(b)]TJ +ET +q +1 0 0 1 303.745 412.926 cm +[]0 d 0 J 0.398 w 0 0 m 2.989 0 l S +Q +BT +/F78 9.9626 Tf 306.858 412.726 Td [(s)-25(o)-25(r)-35(t)]TJ +ET +q +1 0 0 1 323.919 412.926 cm +[]0 d 0 J 0.398 w 0 0 m 2.989 0 l S +Q +BT +/F78 9.9626 Tf 327.032 412.726 Td [(n)-25(o)-25(r)-17(e)-25(o)-25(r)-17(d)]TJ +ET +q +1 0 0 1 360.083 412.926 cm +[]0 d 0 J 0.398 w 0 0 m 2.989 0 l S +Q +BT +/F78 9.9626 Tf 363.366 412.726 Td [(x)]TJ +ET +q +1 0 0 1 369.169 412.926 cm +[]0 d 0 J 0.398 w 0 0 m 2.989 0 l S +Q +BT +/F84 9.9626 Tf 372.158 412.726 Td [(.)]TJ 0 g 0 G -/F75 9.9626 Tf -286.632 -20.648 Td [(dir)]TJ +/F75 9.9626 Tf -221.453 -19.866 Td [(dir)]TJ 0 g 0 G /F84 9.9626 Tf 17.952 0 Td [(The)-250(desir)18(ed)-250(or)18(dering.)]TJ 6.646 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -61.878 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value:)]TJ 0 g 0 G -/F75 9.9626 Tf 0 -20.648 Td [(Integer)-250(and)-250(real)-250(data:)]TJ +/F75 9.9626 Tf 0 -19.867 Td [(Integer)-250(and)-250(real)-250(data:)]TJ 0 g 0 G -/F145 9.9626 Tf 101.28 0 Td [(psb_sort_up_)]TJ/F84 9.9626 Tf 1.02 0 0 1 339.655 354.078 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 345.778 354.078 Tm [(psb_sort_down_)]TJ/F84 9.9626 Tf 1.02 0 0 1 419.003 354.078 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 425.126 354.078 Tm [(psb_asort_up_)]TJ/F84 9.9626 Tf 1.02 0 0 1 493.121 354.078 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 197.529 342.122 Tm [(psb_asort_down_)]TJ/F84 9.9626 Tf 78.455 0 Td [(;)-250(default)]TJ/F145 9.9626 Tf 38.784 0 Td [(psb_sort_up_)]TJ/F84 9.9626 Tf 62.765 0 Td [(.)]TJ +/F145 9.9626 Tf 101.28 0 Td [(psb_sort_up_)]TJ/F84 9.9626 Tf 1.02 0 0 1 339.655 349.083 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 345.778 349.083 Tm [(psb_sort_down_)]TJ/F84 9.9626 Tf 1.02 0 0 1 419.003 349.083 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 425.126 349.083 Tm [(psb_asort_up_)]TJ/F84 9.9626 Tf 1.02 0 0 1 493.121 349.083 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 197.529 337.128 Tm [(psb_asort_down_)]TJ/F84 9.9626 Tf 78.455 0 Td [(;)-250(default)]TJ/F145 9.9626 Tf 38.784 0 Td [(psb_sort_up_)]TJ/F84 9.9626 Tf 62.765 0 Td [(.)]TJ 0 g 0 G -/F75 9.9626 Tf -201.922 -16.301 Td [(Complex)-250(data:)]TJ +/F75 9.9626 Tf -201.922 -15.881 Td [(Complex)-250(data:)]TJ 0 g 0 G -/F145 9.9626 Tf 70.287 0 Td [(psb_lsort_up_)]TJ/F84 9.9626 Tf 0.98 0 0 1 313.892 325.821 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 318.345 325.821 Tm [(psb_lsort_down_)]TJ/F84 9.9626 Tf 0.98 0 0 1 396.8 325.821 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 401.254 325.821 Tm [(psb_asort_up_)]TJ/F84 9.9626 Tf 0.98 0 0 1 469.248 325.821 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 473.701 325.821 Tm [(psb_asort_down_)]TJ/F84 9.9626 Tf 0.98 0 0 1 552.157 325.821 Tm [(;)]TJ 1 0 0 1 197.529 313.866 Tm [(default)]TJ/F145 9.9626 Tf 33.803 0 Td [(psb_lsort_up_)]TJ/F84 9.9626 Tf 67.994 0 Td [(.)]TJ +/F145 9.9626 Tf 70.287 0 Td [(psb_lsort_up_)]TJ/F84 9.9626 Tf 0.98 0 0 1 313.892 321.247 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 318.345 321.247 Tm [(psb_lsort_down_)]TJ/F84 9.9626 Tf 0.98 0 0 1 396.8 321.247 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 401.254 321.247 Tm [(psb_asort_up_)]TJ/F84 9.9626 Tf 0.98 0 0 1 469.248 321.247 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 473.701 321.247 Tm [(psb_asort_down_)]TJ/F84 9.9626 Tf 0.98 0 0 1 552.157 321.247 Tm [(;)]TJ 1 0 0 1 197.529 309.292 Tm [(default)]TJ/F145 9.9626 Tf 33.803 0 Td [(psb_lsort_up_)]TJ/F84 9.9626 Tf 67.994 0 Td [(.)]TJ 0 g 0 G -/F75 9.9626 Tf -148.621 -20.648 Td [(\003ag)]TJ +/F75 9.9626 Tf -148.621 -19.867 Td [(\003ag)]TJ 0 g 0 G -/F84 9.9626 Tf 21.091 0 Td [(Whether)-250(to)-250(keep)-250(the)-250(original)-250(values)-250(in)]TJ/F78 9.9626 Tf 171.519 0 Td [(I)-81(X)]TJ/F84 9.9626 Tf 11.661 0 Td [(.)]TJ -179.673 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ 0.98 0 0 1 175.611 269.307 Tm [(Speci\002ed)-194(as:)-286(an)-193(integer)-194(value)]TJ/F145 9.9626 Tf 1 0 0 1 301.54 269.307 Tm [(psb_sort_ovw_idx_)]TJ/F84 9.9626 Tf 0.98 0 0 1 392.349 269.307 Tm [(or)]TJ/F145 9.9626 Tf 1 0 0 1 403.429 269.307 Tm [(psb_sort_keep_idx_)]TJ/F84 9.9626 Tf 0.98 0 0 1 497.575 269.307 Tm [(;)]TJ 1 0 0 1 175.611 257.352 Tm [(default)]TJ/F145 9.9626 Tf 33.803 0 Td [(psb_sort_ovw_idx_)]TJ/F84 9.9626 Tf 88.916 0 Td [(.)]TJ +/F84 9.9626 Tf 21.091 0 Td [(Whether)-250(to)-250(keep)-250(the)-250(original)-250(values)-250(in)]TJ/F78 9.9626 Tf 171.519 0 Td [(I)-81(X)]TJ/F84 9.9626 Tf 11.661 0 Td [(.)]TJ -179.673 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ 0.98 0 0 1 175.611 265.515 Tm [(Speci\002ed)-194(as:)-286(an)-193(integer)-194(value)]TJ/F145 9.9626 Tf 1 0 0 1 301.54 265.515 Tm [(psb_sort_ovw_idx_)]TJ/F84 9.9626 Tf 0.98 0 0 1 392.349 265.515 Tm [(or)]TJ/F145 9.9626 Tf 1 0 0 1 403.429 265.515 Tm [(psb_sort_keep_idx_)]TJ/F84 9.9626 Tf 0.98 0 0 1 497.575 265.515 Tm [(;)]TJ 1 0 0 1 175.611 253.56 Tm [(default)]TJ/F145 9.9626 Tf 33.803 0 Td [(psb_sort_ovw_idx_)]TJ/F84 9.9626 Tf 88.916 0 Td [(.)]TJ 0 g 0 G -/F75 9.9626 Tf -147.625 -22.64 Td [(On)-250(Return)]TJ +/F75 9.9626 Tf -147.625 -19.866 Td [(reord)]TJ 0 g 0 G +/F84 9.9626 Tf 0.984 0 0 1 179.546 233.694 Tm [(Whether)-253(to)-254(r)19(eor)18(der)-253(the)-254(input)-253(vector)]TJ/F78 9.9626 Tf 1 0 0 1 337.115 233.694 Tm [(x)]TJ/F84 9.9626 Tf 0.984 0 0 1 344.804 233.694 Tm [(or)-253(just)-254(r)19(eturn)]TJ/F78 9.9626 Tf 1 0 0 1 404.732 233.694 Tm [(I)-81(X)]TJ/F84 9.9626 Tf 0.984 0 0 1 418.877 233.694 Tm [(for)-253(further)-254(usage.)]TJ 1 0 0 1 175.303 221.738 Tm [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ 0.98 0 0 1 175.611 209.783 Tm [(Speci\002ed)-194(as:)-286(an)-193(integer)-194(value)]TJ/F145 9.9626 Tf 1 0 0 1 301.54 209.783 Tm [(psb_sort_reord_x_)]TJ/F84 9.9626 Tf 0.98 0 0 1 392.349 209.783 Tm [(or)]TJ/F145 9.9626 Tf 1 0 0 1 403.429 209.783 Tm [(psb_sort_noreord_x_)]TJ/F84 9.9626 Tf 0.98 0 0 1 502.806 209.783 Tm [(;)]TJ 1 0 0 1 175.611 197.828 Tm [(default)]TJ/F145 9.9626 Tf 33.803 0 Td [(psb_sort_reord_x_)]TJ/F84 9.9626 Tf 88.916 0 Td [(.)]TJ 0 g 0 G - 0 -20.648 Td [(x)]TJ +/F75 9.9626 Tf -147.625 -21.771 Td [(On)-250(Return)]TJ 0 g 0 G -/F84 9.9626 Tf 9.654 0 Td [(The)-250(sequence)-250(of)-250(values,)-250(in)-250(the)-250(chosen)-250(or)18(dering.)]TJ 14.944 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.984 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)74(,)-250(r)18(eal)-250(or)-250(complex)-250(array)-250(of)-250(rank)-250(1.)]TJ 0 g 0 G -/F75 9.9626 Tf -24.906 -20.648 Td [(ix)]TJ + 0 -19.866 Td [(x)]TJ 0 g 0 G -/F84 9.9626 Tf 12.891 0 Td [(A)-250(vector)-250(of)-250(indices.)]TJ 11.707 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(Optional)]TJ/F84 9.9626 Tf 0.996 0 0 1 175.223 145.595 Tm [(An)-251(integer)-250(array)-251(of)-251(rank)-250(1,)-251(whose)-251(entries)-250(ar)18(e)-251(moved)-251(to)-250(the)-251(same)-251(position)]TJ 1 0 0 1 175.611 133.64 Tm [(as)-250(the)-250(corr)18(esponding)-250(entries)-250(in)]TJ/F78 9.9626 Tf 138.215 0 Td [(x)]TJ/F84 9.9626 Tf 5.206 0 Td [(.)]TJ +/F84 9.9626 Tf 0.984 0 0 1 160.359 156.191 Tm [(The)-254(sequence)-254(of)-254(values;)-254(if)]TJ/F145 9.9626 Tf 1 0 0 1 274.16 156.191 Tm [(reord=psb_sort_reord_x_)]TJ/F84 9.9626 Tf 0.984 0 0 1 396.947 156.191 Tm [(it)-254(will)-254(be)-254(in)-254(the)-254(chosen)]TJ 1 0 0 1 175.611 144.236 Tm [(or)18(dering.)]TJ -0.308 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.984 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)74(,)-250(r)18(eal)-250(or)-250(complex)-250(array)-250(of)-250(rank)-250(1.)]TJ 0 g 0 G - -3.944 -43.202 Td [(110)]TJ + 139.477 -29.888 Td [(110)]TJ 0 g 0 G ET @@ -21993,117 +22021,152 @@ endstream endobj 1746 0 obj << -/Length 9569 +/Length 11593 >> stream 0 g 0 G 0 g 0 G +0 g 0 G BT -/F75 11.9552 Tf 99.895 706.129 Td [(Notes)]TJ +/F75 9.9626 Tf 99.895 706.129 Td [(ix)]TJ 0 g 0 G -/F84 9.9626 Tf 12.454 -19.925 Td [(1.)]TJ +/F84 9.9626 Tf 12.892 0 Td [(A)-250(vector)-250(of)-250(indices.)]TJ 11.706 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(Optional)]TJ/F84 9.9626 Tf 1.02 0 0 1 124.413 682.219 Tm [(An)-353(integer)-353(array)-354(of)-353(rank)-353(1,)-380(whose)]TJ/F78 9.9626 Tf 1 0 0 1 285.438 682.219 Tm [(i)]TJ/F84 9.9626 Tf 1.02 0 0 1 288.402 682.219 Tm [(-th)-353(entry)-353(gives)-354(the)-353(position)-353(of)-353(the)]TJ 1 0 0 1 124.473 670.263 Tm [(\050sorted\051)-250(value)-250(of)]TJ/F78 9.9626 Tf 75.152 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(in)-250(the)-250(original)-250(sequence.)]TJ/F75 11.9552 Tf -107.426 -21.917 Td [(Notes)]TJ +0 g 0 G +/F84 9.9626 Tf 12.454 -19.926 Td [(1.)]TJ 0 g 0 G - 1.02 0 0 1 124.802 686.204 Tm [(For)-318(integer)-317(or)-318(r)18(eal)-318(data)-318(the)-318(sorting)-317(can)-318(be)-318(performed)-317(in)-318(the)-318(up/down)]TJ 1 0 0 1 124.802 674.248 Tm [(dir)18(ection,)-250(on)-250(the)-250(natural)-250(or)-250(absolute)-250(values;)]TJ + 1.02 0 0 1 124.802 628.42 Tm [(For)-318(integer)-317(or)-318(r)18(eal)-318(data)-318(the)-318(sorting)-317(can)-318(be)-318(performed)-317(in)-318(the)-318(up/down)]TJ 1 0 0 1 124.802 616.465 Tm [(dir)18(ection,)-250(on)-250(the)-250(natural)-250(or)-250(absolute)-250(values;)]TJ 0 g 0 G -12.453 -19.925 Td [(2.)]TJ 0 g 0 G - 1.02 0 0 1 124.802 654.323 Tm [(For)-287(complex)-288(data)-287(the)-287(sorting)-288(can)-287(be)-287(done)-288(in)-287(a)-287(lexicographic)-288(or)18(der)-287(\050i.e.:)]TJ 1.007 0 0 1 124.802 642.368 Tm [(sort)-247(on)-248(the)-247(r)18(eal)-248(part)-247(with)-248(tie)1(s)-248(br)18(oken)-247(accor)17(ding)-247(to)-247(the)-248(imaginary)-247(part\051)-248(or)]TJ 1 0 0 1 124.802 630.413 Tm [(on)-250(the)-250(absolute)-250(values;)]TJ + 1.02 0 0 1 124.802 596.54 Tm [(For)-287(complex)-288(data)-287(the)-287(sorting)-288(can)-287(be)-287(done)-288(in)-287(a)-287(lexicographic)-288(or)18(der)-287(\050i.e.:)]TJ 1.007 0 0 1 124.802 584.585 Tm [(sort)-247(on)-248(the)-247(r)18(eal)-248(part)-247(with)-248(tie)1(s)-248(br)18(oken)-247(accor)17(ding)-247(to)-247(the)-248(imaginary)-247(part\051)-248(or)]TJ 1 0 0 1 124.802 572.629 Tm [(on)-250(the)-250(absolute)-250(values;)]TJ 0 g 0 G -12.453 -19.925 Td [(3.)]TJ 0 g 0 G - 0.98 0 0 1 124.493 610.488 Tm [(The)-240(r)18(outines)-240(r)18(et)1(urn)-241(the)-240(items)-240(in)-240(the)-240(chosen)-240(or)18(dering;)-245(the)-240(output)-240(dif)18(fer)18(ence)]TJ 0.98 0 0 1 124.802 598.532 Tm [(is)-256(the)-256(handling)-256(of)-256(ties)-256(\050i.e.)-318(items)-256(with)-256(an)-256(equal)-256(value\051)-256(in)-256(the)-256(original)-256(input.)]TJ 1 0 0 1 124.304 586.577 Tm [(W)55(ith)-250(the)-250(insertion-sort)-250(or)-250(mer)18(ge-sort)-250(algorithms)-250(ties)-250(ar)18(e)-250(pr)18(eserved)-250(in)-250(the)]TJ 0.997 0 0 1 124.802 574.622 Tm [(same)-250(r)18(elative)-250(or)18(der)-251(as)-250(they)-250(had)-251(i)1(n)-251(the)-250(original)-250(sequence,)-251(while)-250(this)-250(is)-250(not)]TJ 1 0 0 1 124.802 562.667 Tm [(guaranteed)-250(for)-250(quicksort)-250(or)-250(heapsort;)]TJ + 0.98 0 0 1 124.493 552.704 Tm [(The)-240(r)18(outines)-240(r)18(et)1(urn)-241(the)-240(items)-240(in)-240(the)-240(chosen)-240(or)18(dering;)-245(the)-240(output)-240(dif)18(fer)18(ence)]TJ 0.98 0 0 1 124.802 540.749 Tm [(is)-256(the)-256(handling)-256(of)-256(ties)-256(\050i.e.)-318(items)-256(with)-256(an)-256(equal)-256(value\051)-256(in)-256(the)-256(original)-256(input.)]TJ 1 0 0 1 124.304 528.794 Tm [(W)55(ith)-250(the)-250(insertion-sort)-250(or)-250(mer)18(ge-sort)-250(algorithms)-250(ties)-250(ar)18(e)-250(pr)18(eserved)-250(in)-250(the)]TJ 0.997 0 0 1 124.802 516.839 Tm [(same)-250(r)18(elative)-250(or)18(der)-251(as)-250(they)-250(had)-251(i)1(n)-251(the)-250(original)-250(sequence,)-251(while)-250(this)-250(is)-250(not)]TJ 1 0 0 1 124.802 504.884 Tm [(guaranteed)-250(for)-250(quicksort)-250(or)-250(heapsort;)]TJ 0 g 0 G - -12.453 -19.925 Td [(4.)]TJ + -12.453 -19.926 Td [(4.)]TJ 0 g 0 G - 0.98 0 0 1 124.802 542.742 Tm [(If)]TJ/F78 9.9626 Tf 1 0 0 1 135.146 542.742 Tm [(f)-160(l)-70(a)-47(g)]TJ/F192 10.3811 Tf 20.72 0 Td [(=)]TJ/F78 9.9626 Tf 11.634 0 Td [(p)-25(s)-25(b)]TJ + 0.99 0 0 1 124.802 484.958 Tm [(If)]TJ/F78 9.9626 Tf 1 0 0 1 133.93 484.958 Tm [(r)-17(e)-25(o)-25(r)-17(d)]TJ/F192 10.3811 Tf 24.891 0 Td [(=)]TJ/F78 9.9626 Tf 11.642 0 Td [(p)-25(s)-25(b)]TJ ET q -1 0 0 1 182.189 542.941 cm +1 0 0 1 185.152 485.158 cm []0 d 0 J 0.398 w 0 0 m 2.989 0 l S Q BT -/F78 9.9626 Tf 185.303 542.742 Td [(s)-25(o)-25(r)-35(t)]TJ +/F78 9.9626 Tf 188.266 484.958 Td [(s)-25(o)-25(r)-35(t)]TJ ET q -1 0 0 1 202.364 542.941 cm +1 0 0 1 205.326 485.158 cm []0 d 0 J 0.398 w 0 0 m 2.989 0 l S Q BT -/F78 9.9626 Tf 205.477 542.742 Td [(o)-35(v)-25(w)]TJ +/F78 9.9626 Tf 208.44 484.958 Td [(n)-25(o)-25(r)-17(e)-25(o)-25(r)-17(d)]TJ ET q -1 0 0 1 223.394 542.941 cm +1 0 0 1 241.49 485.158 cm []0 d 0 J 0.398 w 0 0 m 2.989 0 l S Q BT -/F78 9.9626 Tf 226.438 542.742 Td [(i)-32(d)-42(x)]TJ +/F78 9.9626 Tf 244.773 484.958 Td [(x)]TJ ET q -1 0 0 1 240.729 542.941 cm +1 0 0 1 250.576 485.158 cm []0 d 0 J 0.398 w 0 0 m 2.989 0 l S Q BT -/F84 9.9626 Tf 0.98 0 0 1 246.101 542.742 Tm [(then)-244(the)-244(entries)-244(in)]TJ/F78 9.9626 Tf 1 0 0 1 326.032 542.742 Tm [(i)-49(x)]TJ/F192 10.3811 Tf 8.587 0 Td [(\050)]TJ/F84 9.9626 Tf 0.98 0 0 1 338.769 542.742 Tm [(1)]TJ 1 0 0 1 346.542 542.742 Tm [(:)]TJ/F78 9.9626 Tf 5.507 0 Td [(n)]TJ/F192 10.3811 Tf 5.788 0 Td [(\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 364.37 542.742 Tm [(wher)18(e)]TJ/F78 9.9626 Tf 1 0 0 1 393.733 542.742 Tm [(n)]TJ/F84 9.9626 Tf 0.98 0 0 1 401.779 542.742 Tm [(is)-244(the)-244(size)]TJ 0.984 0 0 1 124.802 530.786 Tm [(of)]TJ/F78 9.9626 Tf 1 0 0 1 136.206 530.786 Tm [(x)]TJ/F84 9.9626 Tf 0.984 0 0 1 143.904 530.786 Tm [(ar)18(e)-254(initialized)-254(to)]TJ/F78 9.9626 Tf 1 0 0 1 216.929 530.786 Tm [(i)-49(x)]TJ/F192 10.3811 Tf 8.588 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F190 10.3811 Tf 7.046 0 Td [(\040)]TJ/F78 9.9626 Tf 13.332 0 Td [(i)]TJ/F84 9.9626 Tf 0.984 0 0 1 256.15 530.786 Tm [(;)-254(thus,)-255(upon)-254(r)18(eturn)-254(fr)18(om)-254(the)-254(subr)18(outine,)-254(for)]TJ 1.02 0 0 1 124.802 518.831 Tm [(each)-260(index)]TJ/F78 9.9626 Tf 1 0 0 1 175.703 518.831 Tm [(i)]TJ/F84 9.9626 Tf 1.02 0 0 1 181.308 518.831 Tm [(we)-260(have)-260(in)]TJ/F78 9.9626 Tf 1 0 0 1 233.102 518.831 Tm [(i)-49(x)]TJ/F192 10.3811 Tf 8.588 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 255.772 518.831 Tm [(the)-260(position)-260(that)-260(the)-259(item)]TJ/F78 9.9626 Tf 1 0 0 1 371.842 518.831 Tm [(x)]TJ/F192 10.3811 Tf 5.33 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 391.255 518.831 Tm [(occupied)-260(in)]TJ 1 0 0 1 124.802 506.876 Tm [(the)-250(original)-250(data)-250(sequence;)]TJ +/F84 9.9626 Tf 0.99 0 0 1 253.565 484.958 Tm [(,)-253(then)-253(the)-253(input)-253(sequence)]TJ/F78 9.9626 Tf 1 0 0 1 365.544 484.958 Tm [(x)]TJ/F84 9.9626 Tf 0.99 0 0 1 373.244 484.958 Tm [(is)-253(not)-253(r)18(eor)19(der)18(ed;)]TJ 1.02 0 0 1 124.802 473.003 Tm [(the)-254(output)-255(i)1(s)-255(given)-254(in)]TJ/F78 9.9626 Tf 1 0 0 1 223.674 473.003 Tm [(i)-49(x)]TJ/F84 9.9626 Tf 1.02 0 0 1 232.137 473.003 Tm [(.)-331(Calling)-255(without)]TJ/F78 9.9626 Tf 1 0 0 1 311.637 473.003 Tm [(i)-49(x)]TJ/F84 9.9626 Tf 1.02 0 0 1 322.684 473.003 Tm [(in)-254(this)-255(case)-254(is)-254(\003agged)-254(as)-255(an)]TJ 1 0 0 1 124.802 461.048 Tm [(err)18(or;)]TJ 0 g 0 G -12.453 -19.925 Td [(5.)]TJ 0 g 0 G - 1.02 0 0 1 124.802 486.951 Tm [(If)]TJ/F78 9.9626 Tf 1 0 0 1 136.291 486.951 Tm [(f)-160(l)-70(a)-47(g)]TJ/F192 10.3811 Tf 22.147 0 Td [(=)]TJ/F78 9.9626 Tf 13.061 0 Td [(p)-25(s)-25(b)]TJ + 0.98 0 0 1 124.802 441.123 Tm [(If)]TJ/F78 9.9626 Tf 1 0 0 1 135.146 441.123 Tm [(f)-160(l)-70(a)-47(g)]TJ/F192 10.3811 Tf 20.72 0 Td [(=)]TJ/F78 9.9626 Tf 11.634 0 Td [(p)-25(s)-25(b)]TJ +ET +q +1 0 0 1 182.189 441.322 cm +[]0 d 0 J 0.398 w 0 0 m 2.989 0 l S +Q +BT +/F78 9.9626 Tf 185.303 441.123 Td [(s)-25(o)-25(r)-35(t)]TJ +ET +q +1 0 0 1 202.364 441.322 cm +[]0 d 0 J 0.398 w 0 0 m 2.989 0 l S +Q +BT +/F78 9.9626 Tf 205.477 441.123 Td [(o)-35(v)-25(w)]TJ +ET +q +1 0 0 1 223.394 441.322 cm +[]0 d 0 J 0.398 w 0 0 m 2.989 0 l S +Q +BT +/F78 9.9626 Tf 226.438 441.123 Td [(i)-32(d)-42(x)]TJ +ET +q +1 0 0 1 240.729 441.322 cm +[]0 d 0 J 0.398 w 0 0 m 2.989 0 l S +Q +BT +/F84 9.9626 Tf 0.98 0 0 1 246.101 441.123 Tm [(then)-244(the)-244(entries)-244(in)]TJ/F78 9.9626 Tf 1 0 0 1 326.032 441.123 Tm [(i)-49(x)]TJ/F192 10.3811 Tf 8.587 0 Td [(\050)]TJ/F84 9.9626 Tf 0.98 0 0 1 338.769 441.123 Tm [(1)]TJ 1 0 0 1 346.542 441.123 Tm [(:)]TJ/F78 9.9626 Tf 5.507 0 Td [(n)]TJ/F192 10.3811 Tf 5.788 0 Td [(\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 364.37 441.123 Tm [(wher)18(e)]TJ/F78 9.9626 Tf 1 0 0 1 393.733 441.123 Tm [(n)]TJ/F84 9.9626 Tf 0.98 0 0 1 401.779 441.123 Tm [(is)-244(the)-244(size)]TJ 0.984 0 0 1 124.802 429.167 Tm [(of)]TJ/F78 9.9626 Tf 1 0 0 1 136.206 429.167 Tm [(x)]TJ/F84 9.9626 Tf 0.984 0 0 1 143.904 429.167 Tm [(ar)18(e)-254(initialized)-254(to)]TJ/F78 9.9626 Tf 1 0 0 1 216.929 429.167 Tm [(i)-49(x)]TJ/F192 10.3811 Tf 8.588 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F190 10.3811 Tf 7.046 0 Td [(\040)]TJ/F78 9.9626 Tf 13.332 0 Td [(i)]TJ/F84 9.9626 Tf 0.984 0 0 1 256.15 429.167 Tm [(;)-254(thus,)-255(upon)-254(r)18(eturn)-254(fr)18(om)-254(the)-254(subr)18(outine,)-254(for)]TJ 1.02 0 0 1 124.802 417.212 Tm [(each)-260(index)]TJ/F78 9.9626 Tf 1 0 0 1 175.703 417.212 Tm [(i)]TJ/F84 9.9626 Tf 1.02 0 0 1 181.308 417.212 Tm [(we)-260(have)-260(in)]TJ/F78 9.9626 Tf 1 0 0 1 233.102 417.212 Tm [(i)-49(x)]TJ/F192 10.3811 Tf 8.588 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 255.772 417.212 Tm [(the)-260(position)-260(that)-260(the)-259(item)]TJ/F78 9.9626 Tf 1 0 0 1 371.842 417.212 Tm [(x)]TJ/F192 10.3811 Tf 5.33 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 391.255 417.212 Tm [(occupied)-260(in)]TJ 1 0 0 1 124.802 405.257 Tm [(the)-250(original)-250(data)-250(sequence;)]TJ +0 g 0 G + -12.453 -19.925 Td [(6.)]TJ +0 g 0 G + 1.02 0 0 1 124.802 385.332 Tm [(If)]TJ/F78 9.9626 Tf 1 0 0 1 136.291 385.332 Tm [(f)-160(l)-70(a)-47(g)]TJ/F192 10.3811 Tf 22.147 0 Td [(=)]TJ/F78 9.9626 Tf 13.061 0 Td [(p)-25(s)-25(b)]TJ ET q -1 0 0 1 186.188 487.15 cm +1 0 0 1 186.188 385.531 cm []0 d 0 J 0.398 w 0 0 m 2.989 0 l S Q BT -/F78 9.9626 Tf 189.302 486.951 Td [(s)-25(o)-25(r)-35(t)]TJ +/F78 9.9626 Tf 189.302 385.332 Td [(s)-25(o)-25(r)-35(t)]TJ ET q -1 0 0 1 206.362 487.15 cm +1 0 0 1 206.362 385.531 cm []0 d 0 J 0.398 w 0 0 m 2.989 0 l S Q BT -/F78 9.9626 Tf 209.476 486.951 Td [(k)-30(e)-25(e)-80(p)]TJ +/F78 9.9626 Tf 209.476 385.332 Td [(k)-30(e)-25(e)-80(p)]TJ ET q -1 0 0 1 228.698 487.15 cm +1 0 0 1 228.698 385.531 cm []0 d 0 J 0.398 w 0 0 m 2.989 0 l S Q BT -/F78 9.9626 Tf 231.742 486.951 Td [(i)-32(d)-42(x)]TJ +/F78 9.9626 Tf 231.742 385.332 Td [(i)-32(d)-42(x)]TJ ET q -1 0 0 1 246.033 487.15 cm +1 0 0 1 246.033 385.531 cm []0 d 0 J 0.398 w 0 0 m 2.989 0 l S Q BT -/F84 9.9626 Tf 1.02 0 0 1 252.283 486.951 Tm [(the)-321(r)18(outine)-321(will)-321(assume)-321(that)-321(the)-321(entries)-321(in)]TJ/F78 9.9626 Tf 1 0 0 1 124.857 474.996 Tm [(i)-49(x)]TJ/F192 10.3811 Tf 8.587 0 Td [(\050)]TJ/F84 9.9626 Tf 4.274 0 Td [(:)]TJ/F192 10.3811 Tf 2.74 0 Td [(\051)]TJ/F84 9.9626 Tf 6.64 0 Td [(have)-250(alr)18(eady)-250(been)-250(initialized)-250(by)-250(the)-250(user;)]TJ +/F84 9.9626 Tf 1.02 0 0 1 252.283 385.332 Tm [(the)-321(r)18(outine)-321(will)-321(assume)-321(that)-321(the)-321(entries)-321(in)]TJ/F78 9.9626 Tf 1 0 0 1 124.857 373.377 Tm [(i)-49(x)]TJ/F192 10.3811 Tf 8.587 0 Td [(\050)]TJ/F84 9.9626 Tf 4.274 0 Td [(:)]TJ/F192 10.3811 Tf 2.74 0 Td [(\051)]TJ/F84 9.9626 Tf 6.64 0 Td [(have)-250(alr)18(eady)-250(been)-250(initialized)-250(by)-250(the)-250(user;)]TJ 0 g 0 G - -34.749 -19.926 Td [(6.)]TJ + -34.749 -19.926 Td [(7.)]TJ 0 g 0 G - 0.98 0 0 1 124.493 455.07 Tm [(Thr)18(ee)-256(sorting)-256(algorithms)-256(have)-256(a)-256(similar)]TJ/F78 9.9626 Tf 1 0 0 1 296.993 455.07 Tm [(O)]TJ/F192 10.3811 Tf 8 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(n)]TJ/F84 9.9626 Tf 7.324 0 Td [(log)]TJ/F78 9.9626 Tf 15.662 0 Td [(n)]TJ/F192 10.3811 Tf 5.789 0 Td [(\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 344.691 455.07 Tm [(expected)-256(r)8(unning)-256(time,)]TJ 1.017 0 0 1 124.384 443.115 Tm [(wher)18(eas)-247(insertion)-246(sort)-247(has)-246(an)-247(expected)-246(r)8(unning)-247(time)]TJ/F78 9.9626 Tf 1 0 0 1 360.734 443.115 Tm [(O)]TJ/F192 10.3811 Tf 8 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(n)]TJ/F84 7.5716 Tf 5.664 3.617 Td [(2)]TJ/F192 10.3811 Tf 4.408 -3.617 Td [(\051)]TJ/F84 9.9626 Tf 1.017 0 0 1 387.23 443.115 Tm [(;)-247(of)-246(the)-247(other)]TJ 0.999 0 0 1 124.802 431.16 Tm [(thr)18(ee,)-250(in)-250(the)-249(average)-250(case)-250(quicksort)-250(will)-249(be)-250(the)-250(fastest)-250(and)-249(mer)18(ge-sort)-250(the)]TJ 1 0 0 1 124.802 419.205 Tm [(slowest.)-310(However)-250(note)-250(that:)]TJ + 0.98 0 0 1 124.493 353.451 Tm [(Thr)18(ee)-256(sorting)-256(algorithms)-256(have)-256(a)-256(similar)]TJ/F78 9.9626 Tf 1 0 0 1 296.993 353.451 Tm [(O)]TJ/F192 10.3811 Tf 8 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(n)]TJ/F84 9.9626 Tf 7.324 0 Td [(log)]TJ/F78 9.9626 Tf 15.662 0 Td [(n)]TJ/F192 10.3811 Tf 5.789 0 Td [(\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 344.691 353.451 Tm [(expected)-256(r)8(unning)-256(time,)]TJ 1.017 0 0 1 124.384 341.496 Tm [(wher)18(eas)-247(insertion)-246(sort)-247(has)-246(an)-247(expected)-246(r)8(unning)-247(time)]TJ/F78 9.9626 Tf 1 0 0 1 360.734 341.496 Tm [(O)]TJ/F192 10.3811 Tf 8 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(n)]TJ/F84 7.5716 Tf 5.664 3.617 Td [(2)]TJ/F192 10.3811 Tf 4.408 -3.617 Td [(\051)]TJ/F84 9.9626 Tf 1.017 0 0 1 387.23 341.496 Tm [(;)-247(of)-246(the)-247(other)]TJ 0.999 0 0 1 124.802 329.541 Tm [(thr)18(ee,)-250(in)-250(the)-249(average)-250(case)-250(quicksort)-250(will)-249(be)-250(the)-250(fastest)-250(and)-249(mer)18(ge-sort)-250(the)]TJ 1 0 0 1 124.802 317.586 Tm [(slowest.)-310(However)-250(note)-250(that:)]TJ 0 g 0 G 5.32 -19.925 Td [(\050a\051)]TJ 0 g 0 G - 1.02 0 0 1 146.411 399.28 Tm [(The)-274(the)-273(best)-274(case)-274(r)8(unning)-274(ti)1(me)-274(for)-274(insertion)-274(so)1(rt)-274(is)]TJ/F243 9.9626 Tf 1 0 0 1 376.039 399.28 Tm [(W)]TJ/F192 10.3811 Tf 8.528 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(n)]TJ/F192 10.3811 Tf 5.789 0 Td [(\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 401.56 399.28 Tm [(while)-274(the)]TJ 1.02 0 0 1 146.72 387.324 Tm [(average)-359(and)-360(worst)-359(case)-359(ar)17(e)]TJ/F78 9.9626 Tf 1 0 0 1 275.57 387.324 Tm [(O)]TJ/F192 10.3811 Tf 7.999 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(n)]TJ/F84 7.5716 Tf 5.664 3.617 Td [(2)]TJ/F192 10.3811 Tf 4.409 -3.617 Td [(\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 302.065 387.324 Tm [(;)-416(however)-360(for)-359(very)-359(short)-360(input)]TJ 1 0 0 1 146.72 375.369 Tm [(sequences)-250(this)-250(is)-250(likely)-250(to)-250(be)-250(the)-250(fastest)-250(method;)]TJ + 1.02 0 0 1 146.411 297.661 Tm [(The)-274(the)-273(best)-274(case)-274(r)8(unning)-274(ti)1(me)-274(for)-274(insertion)-274(so)1(rt)-274(is)]TJ/F243 9.9626 Tf 1 0 0 1 376.039 297.661 Tm [(W)]TJ/F192 10.3811 Tf 8.528 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(n)]TJ/F192 10.3811 Tf 5.789 0 Td [(\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 401.56 297.661 Tm [(while)-274(the)]TJ 1.02 0 0 1 146.72 285.705 Tm [(average)-359(and)-360(worst)-359(case)-359(ar)17(e)]TJ/F78 9.9626 Tf 1 0 0 1 275.57 285.705 Tm [(O)]TJ/F192 10.3811 Tf 7.999 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(n)]TJ/F84 7.5716 Tf 5.664 3.617 Td [(2)]TJ/F192 10.3811 Tf 4.409 -3.617 Td [(\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 302.065 285.705 Tm [(;)-416(however)-360(for)-359(very)-359(short)-360(input)]TJ 1 0 0 1 146.72 273.75 Tm [(sequences)-250(this)-250(is)-250(likely)-250(to)-250(be)-250(the)-250(fastest)-250(method;)]TJ 0 g 0 G -17.126 -15.94 Td [(\050b\051)]TJ 0 g 0 G - 0.98 0 0 1 146.411 359.429 Tm [(The)-241(worst)-240(case)-241(r)8(unning)-241(time)-240(for)-241(quicksort)-241(is)]TJ/F78 9.9626 Tf 1 0 0 1 338.306 359.429 Tm [(O)]TJ/F192 10.3811 Tf 8 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(n)]TJ/F84 7.5716 Tf 5.664 3.616 Td [(2)]TJ/F192 10.3811 Tf 4.408 -3.616 Td [(\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 364.802 359.429 Tm [(;)-245(the)-241(algorithm)-241(im-)]TJ 1.007 0 0 1 146.421 347.474 Tm [(plemented)-246(her)18(e)-246(follows)-246(the)-246(well-known)-246(median-of-thr)18(ee)-246(heuristics,)]TJ 1 0 0 1 146.72 335.519 Tm [(but)-250(the)-250(worst)-250(case)-250(may)-250(still)-250(apply;)]TJ + 0.98 0 0 1 146.411 257.81 Tm [(The)-241(worst)-240(case)-241(r)8(unning)-241(time)-240(for)-241(quicksort)-241(is)]TJ/F78 9.9626 Tf 1 0 0 1 338.306 257.81 Tm [(O)]TJ/F192 10.3811 Tf 8 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(n)]TJ/F84 7.5716 Tf 5.664 3.616 Td [(2)]TJ/F192 10.3811 Tf 4.408 -3.616 Td [(\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 364.802 257.81 Tm [(;)-245(the)-241(algorithm)-241(im-)]TJ 1.007 0 0 1 146.421 245.855 Tm [(plemented)-246(her)18(e)-246(follows)-246(the)-246(well-known)-246(median-of-thr)18(ee)-246(heuristics,)]TJ 1 0 0 1 146.72 233.9 Tm [(but)-250(the)-250(worst)-250(case)-250(may)-250(still)-250(apply;)]TJ 0 g 0 G - -16.04 -15.941 Td [(\050c\051)]TJ + -16.04 -15.94 Td [(\050c\051)]TJ 0 g 0 G - 0.98 0 0 1 146.411 319.578 Tm [(The)-194(worst)-194(case)-194(r)9(unning)-194(time)-194(for)-194(mer)18(ge-sort)-193(and)-194(heap-sort)-194(is)]TJ/F78 9.9626 Tf 1 0 0 1 402.204 319.578 Tm [(O)]TJ/F192 10.3811 Tf 8 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(n)]TJ/F84 9.9626 Tf 7.324 0 Td [(log)]TJ/F78 9.9626 Tf 15.663 0 Td [(n)]TJ/F192 10.3811 Tf 5.788 0 Td [(\051)]TJ/F84 9.9626 Tf -296.533 -11.955 Td [(as)-250(the)-250(average)-250(case;)]TJ + 0.98 0 0 1 146.411 217.96 Tm [(The)-194(worst)-194(case)-194(r)9(unning)-194(time)-194(for)-194(mer)18(ge-sort)-193(and)-194(heap-sort)-194(is)]TJ/F78 9.9626 Tf 1 0 0 1 402.204 217.96 Tm [(O)]TJ/F192 10.3811 Tf 8 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(n)]TJ/F84 9.9626 Tf 7.324 0 Td [(log)]TJ/F78 9.9626 Tf 15.663 0 Td [(n)]TJ/F192 10.3811 Tf 5.788 0 Td [(\051)]TJ/F84 9.9626 Tf -296.533 -11.956 Td [(as)-250(the)-250(average)-250(case;)]TJ 0 g 0 G -17.704 -15.94 Td [(\050d\051)]TJ 0 g 0 G - 1.005 0 0 1 146.411 291.683 Tm [(The)-249(mer)18(ge-sort)-249(algorithm)-249(is)-249(implemented)-249(to)-250(take)-249(advantage)-249(of)-249(sub-)]TJ 1.02 0 0 1 146.72 279.728 Tm [(sequences)-260(that)-261(may)-261(be)-260(alr)18(eady)-261(in)-260(the)-261(desir)18(ed)-261(or)18(dering)-261(prior)-260(to)-261(the)]TJ 1.02 0 0 1 146.72 267.773 Tm [(subr)18(outine)-321(call;)-358(this)-321(situation)-320(is)-321(r)18(elatively)-321(common)-320(when)-321(dealing)]TJ 0.98 0 0 1 146.301 255.818 Tm [(with)-239(gr)18(oups)-240(of)-239(indices)-239(of)-240(sparse)-239(matrix)-240(entries,)-242(thus)-240(mer)19(ge-sort)-240(is)-239(the)]TJ 1.02 0 0 1 146.421 243.862 Tm [(pr)18(eferr)17(ed)-268(choice)-268(when)-268(a)-268(sorting)-268(is)-268(needed)-268(by)-269(other)-268(r)18(outines)-268(in)-268(the)]TJ 1 0 0 1 146.72 231.907 Tm [(library)111(.)]TJ + 1.005 0 0 1 146.411 190.064 Tm [(The)-249(mer)18(ge-sort)-249(algorithm)-249(is)-249(implemented)-249(to)-250(take)-249(advantage)-249(of)-249(sub-)]TJ 1.02 0 0 1 146.72 178.109 Tm [(sequences)-260(that)-261(may)-261(be)-260(alr)18(eady)-261(in)-260(the)-261(desir)18(ed)-261(or)18(dering)-261(prior)-260(to)-261(the)]TJ 1.02 0 0 1 146.72 166.154 Tm [(subr)18(outine)-321(call;)-358(this)-321(situation)-320(is)-321(r)18(elatively)-321(common)-320(when)-321(dealing)]TJ 0.98 0 0 1 146.301 154.199 Tm [(with)-239(gr)18(oups)-240(of)-239(indices)-239(of)-240(sparse)-239(matrix)-240(entries,)-242(thus)-240(mer)19(ge-sort)-240(is)-239(the)]TJ 1.02 0 0 1 146.421 142.243 Tm [(pr)18(eferr)17(ed)-268(choice)-268(when)-268(a)-268(sorting)-268(is)-268(needed)-268(by)-269(other)-268(r)18(outines)-268(in)-268(the)]TJ 1 0 0 1 146.72 130.288 Tm [(library)111(.)]TJ 0 g 0 G - 117.559 -141.469 Td [(111)]TJ + 117.559 -39.85 Td [(111)]TJ 0 g 0 G ET endstream endobj -1760 0 obj +1761 0 obj << /Length 172 >> @@ -22119,7 +22182,7 @@ ET endstream endobj -1764 0 obj +1765 0 obj << /Length 6837 >> @@ -22211,7 +22274,7 @@ ET endstream endobj -1770 0 obj +1771 0 obj << /Length 4738 >> @@ -22267,7 +22330,7 @@ ET endstream endobj -1776 0 obj +1777 0 obj << /Length 4507 >> @@ -22320,7 +22383,7 @@ ET endstream endobj -1784 0 obj +1785 0 obj << /Length 2607 >> @@ -22378,7 +22441,7 @@ ET endstream endobj -1788 0 obj +1789 0 obj << /Length 3383 >> @@ -22440,7 +22503,7 @@ ET endstream endobj -1792 0 obj +1793 0 obj << /Length 1171 >> @@ -22477,7 +22540,7 @@ ET endstream endobj -1796 0 obj +1797 0 obj << /Length 1466 >> @@ -22514,7 +22577,7 @@ ET endstream endobj -1800 0 obj +1801 0 obj << /Length 1287 >> @@ -22551,7 +22614,7 @@ ET endstream endobj -1804 0 obj +1805 0 obj << /Length 6065 >> @@ -22611,7 +22674,7 @@ ET endstream endobj -1809 0 obj +1810 0 obj << /Length 5230 >> @@ -22734,7 +22797,7 @@ ET endstream endobj -1817 0 obj +1818 0 obj << /Length 6196 >> @@ -22794,7 +22857,7 @@ ET endstream endobj -1821 0 obj +1822 0 obj << /Length 5025 >> @@ -22922,19 +22985,19 @@ endobj /Type /ObjStm /N 100 /First 971 -/Length 9352 +/Length 9365 >> stream 1717 0 1718 59 1713 118 1722 213 1720 352 1724 497 413 555 1721 612 1726 735 1728 853 1729 912 1730 971 1731 1030 1725 1089 1736 1211 1732 1368 1733 1513 1734 1660 1738 1807 417 1865 -1735 1922 1741 2030 1743 2148 421 2207 1740 2265 1745 2373 1747 2491 1748 2549 1749 2607 1750 2665 -1751 2723 1752 2781 1753 2839 1754 2897 1755 2955 1756 3013 1757 3071 1744 3129 1759 3266 1761 3384 -425 3443 1758 3501 1763 3582 1765 3700 429 3758 1766 3815 1767 3873 1762 3931 1769 4067 1771 4185 -433 4244 1772 4302 1773 4360 1768 4417 1775 4553 1777 4671 437 4729 1778 4786 1779 4844 1780 4902 -1774 4960 1783 5096 1785 5214 441 5273 1782 5331 1787 5426 1789 5544 445 5602 1786 5659 1791 5781 -1793 5899 449 5958 1790 6016 1795 6111 1797 6229 453 6287 1794 6344 1799 6439 1801 6557 457 6616 -1798 6674 1803 6769 1805 6887 461 6945 1802 7002 1808 7153 1810 7271 1811 7330 1812 7389 1813 7448 -1807 7507 1816 7645 1818 7763 465 7821 1815 7878 1820 8029 1822 8147 1823 8206 1824 8265 1825 8323 +1735 1922 1741 2030 1743 2148 421 2207 1740 2265 1745 2387 1747 2505 1748 2563 1749 2621 1750 2679 +1751 2736 1752 2794 1753 2852 1754 2910 1755 2968 1756 3026 1757 3084 1758 3142 1744 3200 1760 3337 +1762 3455 425 3514 1759 3572 1764 3653 1766 3771 429 3829 1767 3886 1768 3944 1763 4002 1770 4138 +1772 4256 433 4315 1773 4373 1774 4431 1769 4488 1776 4624 1778 4742 437 4800 1779 4857 1780 4915 +1781 4973 1775 5031 1784 5167 1786 5285 441 5344 1783 5402 1788 5497 1790 5615 445 5673 1787 5730 +1792 5852 1794 5970 449 6029 1791 6087 1796 6182 1798 6300 453 6358 1795 6415 1800 6510 1802 6628 +457 6687 1799 6745 1804 6840 1806 6958 461 7016 1803 7073 1809 7224 1811 7342 1812 7401 1813 7460 +1814 7519 1808 7578 1817 7716 1819 7834 465 7892 1816 7949 1821 8100 1823 8218 1824 8277 1825 8336 % 1717 0 obj << /D [1714 0 R /XYZ 150.705 370.138 null] @@ -23071,7 +23134,7 @@ stream >> % 1740 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R >> +/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R /F192 942 0 R >> /ProcSet [ /PDF /Text ] >> % 1745 0 obj @@ -23088,365 +23151,365 @@ stream >> % 1748 0 obj << -/D [1745 0 R /XYZ 99.895 701.929 null] +/D [1745 0 R /XYZ 99.895 644.145 null] >> % 1749 0 obj << -/D [1745 0 R /XYZ 99.895 668.729 null] +/D [1745 0 R /XYZ 99.895 610.946 null] >> % 1750 0 obj << -/D [1745 0 R /XYZ 99.895 624.894 null] +/D [1745 0 R /XYZ 99.895 567.11 null] >> % 1751 0 obj << -/D [1745 0 R /XYZ 99.895 555.872 null] +/D [1745 0 R /XYZ 99.895 498.089 null] >> % 1752 0 obj << -/D [1745 0 R /XYZ 99.895 500.082 null] +/D [1745 0 R /XYZ 99.895 455.529 null] >> % 1753 0 obj << -/D [1745 0 R /XYZ 99.895 468.201 null] +/D [1745 0 R /XYZ 99.895 398.463 null] >> % 1754 0 obj << -/D [1745 0 R /XYZ 99.895 413.068 null] +/D [1745 0 R /XYZ 99.895 366.582 null] >> % 1755 0 obj << -/D [1745 0 R /XYZ 99.895 370.567 null] +/D [1745 0 R /XYZ 99.895 311.449 null] >> % 1756 0 obj << -/D [1745 0 R /XYZ 99.895 330.717 null] +/D [1745 0 R /XYZ 99.895 268.948 null] >> % 1757 0 obj << -/D [1745 0 R /XYZ 99.895 302.821 null] +/D [1745 0 R /XYZ 99.895 229.098 null] +>> +% 1758 0 obj +<< +/D [1745 0 R /XYZ 99.895 201.202 null] >> % 1744 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F192 942 0 R /F190 941 0 R /F243 1285 0 R >> /ProcSet [ /PDF /Text ] >> -% 1759 0 obj +% 1760 0 obj << /Type /Page -/Contents 1760 0 R -/Resources 1758 0 R +/Contents 1761 0 R +/Resources 1759 0 R /MediaBox [0 0 595.276 841.89] /Parent 1739 0 R >> -% 1761 0 obj +% 1762 0 obj << -/D [1759 0 R /XYZ 149.705 753.953 null] +/D [1760 0 R /XYZ 149.705 753.953 null] >> % 425 0 obj << -/D [1759 0 R /XYZ 150.705 716.092 null] +/D [1760 0 R /XYZ 150.705 716.092 null] >> -% 1758 0 obj +% 1759 0 obj << /Font << /F75 685 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1763 0 obj +% 1764 0 obj << /Type /Page -/Contents 1764 0 R -/Resources 1762 0 R +/Contents 1765 0 R +/Resources 1763 0 R /MediaBox [0 0 595.276 841.89] /Parent 1739 0 R >> -% 1765 0 obj +% 1766 0 obj << -/D [1763 0 R /XYZ 98.895 753.953 null] +/D [1764 0 R /XYZ 98.895 753.953 null] >> % 429 0 obj << -/D [1763 0 R /XYZ 99.895 716.092 null] +/D [1764 0 R /XYZ 99.895 716.092 null] >> -% 1766 0 obj +% 1767 0 obj << -/D [1763 0 R /XYZ 99.895 170.282 null] +/D [1764 0 R /XYZ 99.895 170.282 null] >> -% 1767 0 obj +% 1768 0 obj << -/D [1763 0 R /XYZ 99.895 149.368 null] +/D [1764 0 R /XYZ 99.895 149.368 null] >> -% 1762 0 obj +% 1763 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F192 942 0 R /F78 686 0 R /F190 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1769 0 obj +% 1770 0 obj << /Type /Page -/Contents 1770 0 R -/Resources 1768 0 R +/Contents 1771 0 R +/Resources 1769 0 R /MediaBox [0 0 595.276 841.89] /Parent 1739 0 R >> -% 1771 0 obj +% 1772 0 obj << -/D [1769 0 R /XYZ 149.705 753.953 null] +/D [1770 0 R /XYZ 149.705 753.953 null] >> % 433 0 obj << -/D [1769 0 R /XYZ 150.705 716.092 null] +/D [1770 0 R /XYZ 150.705 716.092 null] >> -% 1772 0 obj +% 1773 0 obj << -/D [1769 0 R /XYZ 150.705 348.22 null] +/D [1770 0 R /XYZ 150.705 348.22 null] >> -% 1773 0 obj +% 1774 0 obj << -/D [1769 0 R /XYZ 150.705 313.8 null] +/D [1770 0 R /XYZ 150.705 313.8 null] >> -% 1768 0 obj +% 1769 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F190 941 0 R /F78 686 0 R /F192 942 0 R >> /ProcSet [ /PDF /Text ] >> -% 1775 0 obj +% 1776 0 obj << /Type /Page -/Contents 1776 0 R -/Resources 1774 0 R +/Contents 1777 0 R +/Resources 1775 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1781 0 R +/Parent 1782 0 R >> -% 1777 0 obj +% 1778 0 obj << -/D [1775 0 R /XYZ 98.895 753.953 null] +/D [1776 0 R /XYZ 98.895 753.953 null] >> % 437 0 obj << -/D [1775 0 R /XYZ 99.895 716.092 null] ->> -% 1778 0 obj -<< -/D [1775 0 R /XYZ 99.895 441.869 null] +/D [1776 0 R /XYZ 99.895 716.092 null] >> % 1779 0 obj << -/D [1775 0 R /XYZ 99.895 395.439 null] +/D [1776 0 R /XYZ 99.895 441.869 null] >> % 1780 0 obj << -/D [1775 0 R /XYZ 99.895 363.559 null] +/D [1776 0 R /XYZ 99.895 395.439 null] >> -% 1774 0 obj +% 1781 0 obj +<< +/D [1776 0 R /XYZ 99.895 363.559 null] +>> +% 1775 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R /F192 942 0 R /F190 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1783 0 obj +% 1784 0 obj << /Type /Page -/Contents 1784 0 R -/Resources 1782 0 R +/Contents 1785 0 R +/Resources 1783 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1781 0 R +/Parent 1782 0 R >> -% 1785 0 obj +% 1786 0 obj << -/D [1783 0 R /XYZ 149.705 753.953 null] +/D [1784 0 R /XYZ 149.705 753.953 null] >> % 441 0 obj << -/D [1783 0 R /XYZ 150.705 716.092 null] +/D [1784 0 R /XYZ 150.705 716.092 null] >> -% 1782 0 obj +% 1783 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1787 0 obj +% 1788 0 obj << /Type /Page -/Contents 1788 0 R -/Resources 1786 0 R +/Contents 1789 0 R +/Resources 1787 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1781 0 R +/Parent 1782 0 R >> -% 1789 0 obj +% 1790 0 obj << -/D [1787 0 R /XYZ 98.895 753.953 null] +/D [1788 0 R /XYZ 98.895 753.953 null] >> % 445 0 obj << -/D [1787 0 R /XYZ 99.895 716.092 null] +/D [1788 0 R /XYZ 99.895 716.092 null] >> -% 1786 0 obj +% 1787 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R /F190 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1791 0 obj +% 1792 0 obj << /Type /Page -/Contents 1792 0 R -/Resources 1790 0 R +/Contents 1793 0 R +/Resources 1791 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1781 0 R +/Parent 1782 0 R >> -% 1793 0 obj +% 1794 0 obj << -/D [1791 0 R /XYZ 149.705 753.953 null] +/D [1792 0 R /XYZ 149.705 753.953 null] >> % 449 0 obj << -/D [1791 0 R /XYZ 150.705 716.092 null] +/D [1792 0 R /XYZ 150.705 716.092 null] >> -% 1790 0 obj +% 1791 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1795 0 obj +% 1796 0 obj << /Type /Page -/Contents 1796 0 R -/Resources 1794 0 R +/Contents 1797 0 R +/Resources 1795 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1781 0 R +/Parent 1782 0 R >> -% 1797 0 obj +% 1798 0 obj << -/D [1795 0 R /XYZ 98.895 753.953 null] +/D [1796 0 R /XYZ 98.895 753.953 null] >> % 453 0 obj << -/D [1795 0 R /XYZ 99.895 716.092 null] +/D [1796 0 R /XYZ 99.895 716.092 null] >> -% 1794 0 obj +% 1795 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1799 0 obj +% 1800 0 obj << /Type /Page -/Contents 1800 0 R -/Resources 1798 0 R +/Contents 1801 0 R +/Resources 1799 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1781 0 R +/Parent 1782 0 R >> -% 1801 0 obj +% 1802 0 obj << -/D [1799 0 R /XYZ 149.705 753.953 null] +/D [1800 0 R /XYZ 149.705 753.953 null] >> % 457 0 obj << -/D [1799 0 R /XYZ 150.705 716.092 null] +/D [1800 0 R /XYZ 150.705 716.092 null] >> -% 1798 0 obj +% 1799 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1803 0 obj +% 1804 0 obj << /Type /Page -/Contents 1804 0 R -/Resources 1802 0 R +/Contents 1805 0 R +/Resources 1803 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1806 0 R +/Parent 1807 0 R >> -% 1805 0 obj +% 1806 0 obj << -/D [1803 0 R /XYZ 98.895 753.953 null] +/D [1804 0 R /XYZ 98.895 753.953 null] >> % 461 0 obj << -/D [1803 0 R /XYZ 99.895 716.092 null] +/D [1804 0 R /XYZ 99.895 716.092 null] >> -% 1802 0 obj +% 1803 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F148 1490 0 R /F192 942 0 R /F78 686 0 R /F190 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1808 0 obj +% 1809 0 obj << /Type /Page -/Contents 1809 0 R -/Resources 1807 0 R +/Contents 1810 0 R +/Resources 1808 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1806 0 R ->> -% 1810 0 obj -<< -/D [1808 0 R /XYZ 149.705 753.953 null] +/Parent 1807 0 R >> % 1811 0 obj << -/D [1808 0 R /XYZ 150.705 576.399 null] +/D [1809 0 R /XYZ 149.705 753.953 null] >> % 1812 0 obj << -/D [1808 0 R /XYZ 150.705 541.925 null] +/D [1809 0 R /XYZ 150.705 576.399 null] >> % 1813 0 obj << -/D [1808 0 R /XYZ 150.705 451.085 null] +/D [1809 0 R /XYZ 150.705 541.925 null] >> -% 1807 0 obj +% 1814 0 obj +<< +/D [1809 0 R /XYZ 150.705 451.085 null] +>> +% 1808 0 obj << -/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R /F78 686 0 R /F279 1814 0 R >> +/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R /F78 686 0 R /F279 1815 0 R >> /ProcSet [ /PDF /Text ] >> -% 1816 0 obj +% 1817 0 obj << /Type /Page -/Contents 1817 0 R -/Resources 1815 0 R +/Contents 1818 0 R +/Resources 1816 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1806 0 R +/Parent 1807 0 R >> -% 1818 0 obj +% 1819 0 obj << -/D [1816 0 R /XYZ 98.895 753.953 null] +/D [1817 0 R /XYZ 98.895 753.953 null] >> % 465 0 obj << -/D [1816 0 R /XYZ 99.895 716.092 null] +/D [1817 0 R /XYZ 99.895 716.092 null] >> -% 1815 0 obj +% 1816 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F190 941 0 R /F148 1490 0 R /F192 942 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1820 0 obj +% 1821 0 obj << /Type /Page -/Contents 1821 0 R -/Resources 1819 0 R +/Contents 1822 0 R +/Resources 1820 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1806 0 R ->> -% 1822 0 obj -<< -/D [1820 0 R /XYZ 149.705 753.953 null] +/Parent 1807 0 R >> % 1823 0 obj << -/D [1820 0 R /XYZ 150.705 588.355 null] +/D [1821 0 R /XYZ 149.705 753.953 null] >> % 1824 0 obj << -/D [1820 0 R /XYZ 150.705 553.88 null] +/D [1821 0 R /XYZ 150.705 588.355 null] >> % 1825 0 obj << -/D [1820 0 R /XYZ 150.705 463.04 null] +/D [1821 0 R /XYZ 150.705 553.88 null] >> endstream endobj -1829 0 obj +1830 0 obj << /Length 6060 >> @@ -23506,7 +23569,7 @@ ET endstream endobj -1833 0 obj +1834 0 obj << /Length 5209 >> @@ -23629,7 +23692,7 @@ ET endstream endobj -1840 0 obj +1841 0 obj << /Length 6144 >> @@ -23689,7 +23752,7 @@ ET endstream endobj -1845 0 obj +1846 0 obj << /Length 5122 >> @@ -23812,7 +23875,7 @@ ET endstream endobj -1852 0 obj +1853 0 obj << /Length 6205 >> @@ -23872,7 +23935,7 @@ ET endstream endobj -1856 0 obj +1857 0 obj << /Length 5076 >> @@ -23993,7 +24056,7 @@ ET endstream endobj -1863 0 obj +1864 0 obj << /Length 6206 >> @@ -24053,7 +24116,7 @@ ET endstream endobj -1867 0 obj +1868 0 obj << /Length 5140 >> @@ -24176,7 +24239,7 @@ ET endstream endobj -1874 0 obj +1875 0 obj << /Length 6113 >> @@ -24236,7 +24299,7 @@ ET endstream endobj -1879 0 obj +1880 0 obj << /Length 6575 >> @@ -24372,7 +24435,7 @@ ET endstream endobj -1889 0 obj +1890 0 obj << /Length 5618 >> @@ -24429,7 +24492,7 @@ ET endstream endobj -1894 0 obj +1895 0 obj << /Length 5630 >> @@ -24485,7 +24548,7 @@ ET endstream endobj -1901 0 obj +1902 0 obj << /Length 6870 >> @@ -24509,7 +24572,7 @@ ET endstream endobj -1907 0 obj +1908 0 obj << /Length 10395 >> @@ -24960,7 +25023,7 @@ ET endstream endobj -1911 0 obj +1912 0 obj << /Length 3566 >> @@ -25071,7 +25134,7 @@ ET endstream endobj -1918 0 obj +1919 0 obj << /Length 1379 >> @@ -25114,7 +25177,7 @@ ET endstream endobj -1924 0 obj +1925 0 obj << /Length 1583 >> @@ -25171,7 +25234,7 @@ ET endstream endobj -1930 0 obj +1931 0 obj << /Length 2082 >> @@ -25242,7 +25305,7 @@ ET endstream endobj -1936 0 obj +1937 0 obj << /Length 535 >> @@ -25258,347 +25321,351 @@ ET endstream endobj -1826 0 obj +1827 0 obj << /Type /ObjStm /N 100 -/First 975 -/Length 9500 ->> -stream -1819 0 1828 138 1830 256 469 314 1827 371 1832 522 1834 640 1835 699 1836 758 1837 817 -1831 876 1839 1014 1841 1132 473 1190 1838 1247 1844 1398 1846 1516 1847 1575 1848 1634 1849 1693 -1843 1752 1851 1890 1853 2008 477 2066 1850 2123 1855 2274 1857 2392 1858 2451 1859 2510 1860 2568 -1854 2626 1862 2764 1864 2882 481 2940 1861 2997 1866 3148 1868 3266 1869 3325 1870 3384 1871 3443 -1865 3502 1873 3640 1875 3758 485 3816 1872 3873 1878 4024 1880 4142 1881 4201 1882 4260 1884 4318 -1885 4377 1886 4436 1877 4495 1888 4676 1890 4794 489 4852 1891 4909 1887 4967 1893 5118 1895 5236 -493 5295 1896 5353 1892 5412 1900 5563 1897 5711 1898 5859 1902 6007 497 6065 1899 6122 1906 6217 -1908 6335 1903 6394 1904 6453 1905 6512 1910 6609 1912 6727 501 6785 1913 6842 1914 6900 1909 6958 -1917 7039 1919 7157 505 7216 1920 7274 1921 7332 1916 7391 1923 7472 1925 7590 509 7648 1926 7705 -1927 7763 1922 7821 1929 7902 1931 8020 513 8079 1932 8137 1933 8195 1928 8254 1935 8349 1937 8467 -% 1819 0 obj +/First 973 +/Length 9498 +>> +stream +1826 0 1820 58 1829 196 1831 314 469 372 1828 429 1833 580 1835 698 1836 757 1837 816 +1838 875 1832 934 1840 1072 1842 1190 473 1248 1839 1305 1845 1456 1847 1574 1848 1633 1849 1692 +1850 1751 1844 1810 1852 1948 1854 2066 477 2124 1851 2181 1856 2332 1858 2450 1859 2509 1860 2568 +1861 2626 1855 2684 1863 2822 1865 2940 481 2998 1862 3055 1867 3206 1869 3324 1870 3383 1871 3442 +1872 3501 1866 3560 1874 3698 1876 3816 485 3874 1873 3931 1879 4082 1881 4200 1882 4259 1883 4318 +1885 4376 1886 4435 1887 4494 1878 4553 1889 4734 1891 4852 489 4910 1892 4967 1888 5025 1894 5176 +1896 5294 493 5353 1897 5411 1893 5470 1901 5621 1898 5769 1899 5917 1903 6065 497 6123 1900 6180 +1907 6275 1909 6393 1904 6452 1905 6511 1906 6570 1911 6667 1913 6785 501 6843 1914 6900 1915 6958 +1910 7016 1918 7097 1920 7215 505 7274 1921 7332 1922 7390 1917 7449 1924 7530 1926 7648 509 7706 +1927 7763 1928 7821 1923 7879 1930 7960 1932 8078 513 8137 1933 8195 1934 8253 1929 8312 1936 8407 +% 1826 0 obj +<< +/D [1821 0 R /XYZ 150.705 463.04 null] +>> +% 1820 0 obj << -/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R /F78 686 0 R /F279 1814 0 R >> +/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R /F78 686 0 R /F279 1815 0 R >> /ProcSet [ /PDF /Text ] >> -% 1828 0 obj +% 1829 0 obj << /Type /Page -/Contents 1829 0 R -/Resources 1827 0 R +/Contents 1830 0 R +/Resources 1828 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1806 0 R +/Parent 1807 0 R >> -% 1830 0 obj +% 1831 0 obj << -/D [1828 0 R /XYZ 98.895 753.953 null] +/D [1829 0 R /XYZ 98.895 753.953 null] >> % 469 0 obj << -/D [1828 0 R /XYZ 99.895 716.092 null] +/D [1829 0 R /XYZ 99.895 716.092 null] >> -% 1827 0 obj +% 1828 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F190 941 0 R /F148 1490 0 R /F192 942 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1832 0 obj +% 1833 0 obj << /Type /Page -/Contents 1833 0 R -/Resources 1831 0 R +/Contents 1834 0 R +/Resources 1832 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1806 0 R ->> -% 1834 0 obj -<< -/D [1832 0 R /XYZ 149.705 753.953 null] +/Parent 1807 0 R >> % 1835 0 obj << -/D [1832 0 R /XYZ 150.705 576.399 null] +/D [1833 0 R /XYZ 149.705 753.953 null] >> % 1836 0 obj << -/D [1832 0 R /XYZ 150.705 541.925 null] +/D [1833 0 R /XYZ 150.705 576.399 null] >> % 1837 0 obj << -/D [1832 0 R /XYZ 150.705 451.085 null] +/D [1833 0 R /XYZ 150.705 541.925 null] >> -% 1831 0 obj +% 1838 0 obj +<< +/D [1833 0 R /XYZ 150.705 451.085 null] +>> +% 1832 0 obj << -/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R /F78 686 0 R /F279 1814 0 R >> +/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R /F78 686 0 R /F279 1815 0 R >> /ProcSet [ /PDF /Text ] >> -% 1839 0 obj +% 1840 0 obj << /Type /Page -/Contents 1840 0 R -/Resources 1838 0 R +/Contents 1841 0 R +/Resources 1839 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1842 0 R +/Parent 1843 0 R >> -% 1841 0 obj +% 1842 0 obj << -/D [1839 0 R /XYZ 98.895 753.953 null] +/D [1840 0 R /XYZ 98.895 753.953 null] >> % 473 0 obj << -/D [1839 0 R /XYZ 99.895 716.092 null] +/D [1840 0 R /XYZ 99.895 716.092 null] >> -% 1838 0 obj +% 1839 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F190 941 0 R /F148 1490 0 R /F192 942 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1844 0 obj +% 1845 0 obj << /Type /Page -/Contents 1845 0 R -/Resources 1843 0 R +/Contents 1846 0 R +/Resources 1844 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1842 0 R ->> -% 1846 0 obj -<< -/D [1844 0 R /XYZ 149.705 753.953 null] +/Parent 1843 0 R >> % 1847 0 obj << -/D [1844 0 R /XYZ 150.705 576.399 null] +/D [1845 0 R /XYZ 149.705 753.953 null] >> % 1848 0 obj << -/D [1844 0 R /XYZ 150.705 541.925 null] +/D [1845 0 R /XYZ 150.705 576.399 null] >> % 1849 0 obj << -/D [1844 0 R /XYZ 150.705 451.085 null] +/D [1845 0 R /XYZ 150.705 541.925 null] >> -% 1843 0 obj +% 1850 0 obj +<< +/D [1845 0 R /XYZ 150.705 451.085 null] +>> +% 1844 0 obj << -/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R /F78 686 0 R /F279 1814 0 R >> +/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R /F78 686 0 R /F279 1815 0 R >> /ProcSet [ /PDF /Text ] >> -% 1851 0 obj +% 1852 0 obj << /Type /Page -/Contents 1852 0 R -/Resources 1850 0 R +/Contents 1853 0 R +/Resources 1851 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1842 0 R +/Parent 1843 0 R >> -% 1853 0 obj +% 1854 0 obj << -/D [1851 0 R /XYZ 98.895 753.953 null] +/D [1852 0 R /XYZ 98.895 753.953 null] >> % 477 0 obj << -/D [1851 0 R /XYZ 99.895 716.092 null] +/D [1852 0 R /XYZ 99.895 716.092 null] >> -% 1850 0 obj +% 1851 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F190 941 0 R /F148 1490 0 R /F192 942 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1855 0 obj +% 1856 0 obj << /Type /Page -/Contents 1856 0 R -/Resources 1854 0 R +/Contents 1857 0 R +/Resources 1855 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1842 0 R ->> -% 1857 0 obj -<< -/D [1855 0 R /XYZ 149.705 753.953 null] +/Parent 1843 0 R >> % 1858 0 obj << -/D [1855 0 R /XYZ 150.705 588.355 null] +/D [1856 0 R /XYZ 149.705 753.953 null] >> % 1859 0 obj << -/D [1855 0 R /XYZ 150.705 553.88 null] +/D [1856 0 R /XYZ 150.705 588.355 null] >> % 1860 0 obj << -/D [1855 0 R /XYZ 150.705 463.04 null] +/D [1856 0 R /XYZ 150.705 553.88 null] >> -% 1854 0 obj +% 1861 0 obj +<< +/D [1856 0 R /XYZ 150.705 463.04 null] +>> +% 1855 0 obj << -/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R /F78 686 0 R /F279 1814 0 R >> +/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R /F78 686 0 R /F279 1815 0 R >> /ProcSet [ /PDF /Text ] >> -% 1862 0 obj +% 1863 0 obj << /Type /Page -/Contents 1863 0 R -/Resources 1861 0 R +/Contents 1864 0 R +/Resources 1862 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1842 0 R +/Parent 1843 0 R >> -% 1864 0 obj +% 1865 0 obj << -/D [1862 0 R /XYZ 98.895 753.953 null] +/D [1863 0 R /XYZ 98.895 753.953 null] >> % 481 0 obj << -/D [1862 0 R /XYZ 99.895 716.092 null] +/D [1863 0 R /XYZ 99.895 716.092 null] >> -% 1861 0 obj +% 1862 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F190 941 0 R /F148 1490 0 R /F192 942 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1866 0 obj +% 1867 0 obj << /Type /Page -/Contents 1867 0 R -/Resources 1865 0 R +/Contents 1868 0 R +/Resources 1866 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1842 0 R ->> -% 1868 0 obj -<< -/D [1866 0 R /XYZ 149.705 753.953 null] +/Parent 1843 0 R >> % 1869 0 obj << -/D [1866 0 R /XYZ 150.705 576.399 null] +/D [1867 0 R /XYZ 149.705 753.953 null] >> % 1870 0 obj << -/D [1866 0 R /XYZ 150.705 541.925 null] +/D [1867 0 R /XYZ 150.705 576.399 null] >> % 1871 0 obj << -/D [1866 0 R /XYZ 150.705 451.085 null] +/D [1867 0 R /XYZ 150.705 541.925 null] >> -% 1865 0 obj +% 1872 0 obj +<< +/D [1867 0 R /XYZ 150.705 451.085 null] +>> +% 1866 0 obj << -/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R /F78 686 0 R /F279 1814 0 R >> +/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R /F78 686 0 R /F279 1815 0 R >> /ProcSet [ /PDF /Text ] >> -% 1873 0 obj +% 1874 0 obj << /Type /Page -/Contents 1874 0 R -/Resources 1872 0 R +/Contents 1875 0 R +/Resources 1873 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1876 0 R +/Parent 1877 0 R >> -% 1875 0 obj +% 1876 0 obj << -/D [1873 0 R /XYZ 98.895 753.953 null] +/D [1874 0 R /XYZ 98.895 753.953 null] >> % 485 0 obj << -/D [1873 0 R /XYZ 99.895 716.092 null] +/D [1874 0 R /XYZ 99.895 716.092 null] >> -% 1872 0 obj +% 1873 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F190 941 0 R /F148 1490 0 R /F192 942 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1878 0 obj +% 1879 0 obj << /Type /Page -/Contents 1879 0 R -/Resources 1877 0 R +/Contents 1880 0 R +/Resources 1878 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1876 0 R ->> -% 1880 0 obj -<< -/D [1878 0 R /XYZ 149.705 753.953 null] +/Parent 1877 0 R >> % 1881 0 obj << -/D [1878 0 R /XYZ 150.705 588.355 null] +/D [1879 0 R /XYZ 149.705 753.953 null] >> % 1882 0 obj << -/D [1878 0 R /XYZ 150.705 553.88 null] +/D [1879 0 R /XYZ 150.705 588.355 null] >> -% 1884 0 obj +% 1883 0 obj << -/D [1878 0 R /XYZ 150.705 465.726 null] +/D [1879 0 R /XYZ 150.705 553.88 null] >> % 1885 0 obj << -/D [1878 0 R /XYZ 150.705 433.845 null] +/D [1879 0 R /XYZ 150.705 465.726 null] >> % 1886 0 obj << -/D [1878 0 R /XYZ 150.705 343.006 null] +/D [1879 0 R /XYZ 150.705 433.845 null] >> -% 1877 0 obj +% 1887 0 obj +<< +/D [1879 0 R /XYZ 150.705 343.006 null] +>> +% 1878 0 obj << -/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F78 686 0 R /F192 942 0 R /F17 1883 0 R /F243 1285 0 R /F233 1044 0 R /F279 1814 0 R >> +/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F78 686 0 R /F192 942 0 R /F17 1884 0 R /F243 1285 0 R /F233 1044 0 R /F279 1815 0 R >> /ProcSet [ /PDF /Text ] >> -% 1888 0 obj +% 1889 0 obj << /Type /Page -/Contents 1889 0 R -/Resources 1887 0 R +/Contents 1890 0 R +/Resources 1888 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1876 0 R +/Parent 1877 0 R >> -% 1890 0 obj +% 1891 0 obj << -/D [1888 0 R /XYZ 98.895 753.953 null] +/D [1889 0 R /XYZ 98.895 753.953 null] >> % 489 0 obj << -/D [1888 0 R /XYZ 99.895 716.092 null] +/D [1889 0 R /XYZ 99.895 716.092 null] >> -% 1891 0 obj +% 1892 0 obj << -/D [1888 0 R /XYZ 99.895 222.691 null] +/D [1889 0 R /XYZ 99.895 222.691 null] >> -% 1887 0 obj +% 1888 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R /F148 1490 0 R /F192 942 0 R /F190 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1893 0 obj +% 1894 0 obj << /Type /Page -/Contents 1894 0 R -/Resources 1892 0 R +/Contents 1895 0 R +/Resources 1893 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1876 0 R +/Parent 1877 0 R >> -% 1895 0 obj +% 1896 0 obj << -/D [1893 0 R /XYZ 149.705 753.953 null] +/D [1894 0 R /XYZ 149.705 753.953 null] >> % 493 0 obj << -/D [1893 0 R /XYZ 150.705 716.092 null] +/D [1894 0 R /XYZ 150.705 716.092 null] >> -% 1896 0 obj +% 1897 0 obj << -/D [1893 0 R /XYZ 150.705 222.691 null] +/D [1894 0 R /XYZ 150.705 222.691 null] >> -% 1892 0 obj +% 1893 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F148 1490 0 R /F192 942 0 R /F78 686 0 R /F190 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1900 0 obj +% 1901 0 obj << /Type /Page -/Contents 1901 0 R -/Resources 1899 0 R +/Contents 1902 0 R +/Resources 1900 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1876 0 R -/Annots [ 1897 0 R 1898 0 R ] +/Parent 1877 0 R +/Annots [ 1898 0 R 1899 0 R ] >> -% 1897 0 obj +% 1898 0 obj << /Type /Annot /Subtype /Link @@ -25606,7 +25673,7 @@ stream /Rect [145.364 511.904 152.427 523.964] /A << /S /GoTo /D (listing.5) >> >> -% 1898 0 obj +% 1899 0 obj << /Type /Annot /Subtype /Link @@ -25614,176 +25681,172 @@ stream /Rect [143.975 356.487 150.849 368.547] /A << /S /GoTo /D (listing.6) >> >> -% 1902 0 obj +% 1903 0 obj << -/D [1900 0 R /XYZ 98.895 753.953 null] +/D [1901 0 R /XYZ 98.895 753.953 null] >> % 497 0 obj << -/D [1900 0 R /XYZ 99.895 716.092 null] +/D [1901 0 R /XYZ 99.895 716.092 null] >> -% 1899 0 obj +% 1900 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> /ProcSet [ /PDF /Text ] >> -% 1906 0 obj +% 1907 0 obj << /Type /Page -/Contents 1907 0 R -/Resources 1905 0 R +/Contents 1908 0 R +/Resources 1906 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1876 0 R ->> -% 1908 0 obj -<< -/D [1906 0 R /XYZ 149.705 753.953 null] +/Parent 1877 0 R >> -% 1903 0 obj +% 1909 0 obj << -/D [1906 0 R /XYZ 150.705 411.235 null] +/D [1907 0 R /XYZ 149.705 753.953 null] >> % 1904 0 obj << -/D [1906 0 R /XYZ 150.705 182.902 null] +/D [1907 0 R /XYZ 150.705 411.235 null] >> % 1905 0 obj << -/Font << /F145 940 0 R /F279 1814 0 R /F84 687 0 R >> +/D [1907 0 R /XYZ 150.705 182.902 null] +>> +% 1906 0 obj +<< +/Font << /F145 940 0 R /F279 1815 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1910 0 obj +% 1911 0 obj << /Type /Page -/Contents 1911 0 R -/Resources 1909 0 R +/Contents 1912 0 R +/Resources 1910 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1915 0 R +/Parent 1916 0 R >> -% 1912 0 obj +% 1913 0 obj << -/D [1910 0 R /XYZ 98.895 753.953 null] +/D [1911 0 R /XYZ 98.895 753.953 null] >> % 501 0 obj << -/D [1910 0 R /XYZ 99.895 716.092 null] +/D [1911 0 R /XYZ 99.895 716.092 null] >> -% 1913 0 obj +% 1914 0 obj << -/D [1910 0 R /XYZ 99.895 690.058 null] +/D [1911 0 R /XYZ 99.895 690.058 null] >> -% 1914 0 obj +% 1915 0 obj << -/D [1910 0 R /XYZ 99.895 693.143 null] +/D [1911 0 R /XYZ 99.895 693.143 null] >> -% 1909 0 obj +% 1910 0 obj << /Font << /F75 685 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1917 0 obj +% 1918 0 obj << /Type /Page -/Contents 1918 0 R -/Resources 1916 0 R +/Contents 1919 0 R +/Resources 1917 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1915 0 R +/Parent 1916 0 R >> -% 1919 0 obj +% 1920 0 obj << -/D [1917 0 R /XYZ 149.705 753.953 null] +/D [1918 0 R /XYZ 149.705 753.953 null] >> % 505 0 obj << -/D [1917 0 R /XYZ 150.705 716.092 null] +/D [1918 0 R /XYZ 150.705 716.092 null] >> -% 1920 0 obj +% 1921 0 obj << -/D [1917 0 R /XYZ 150.705 678.98 null] +/D [1918 0 R /XYZ 150.705 678.98 null] >> -% 1921 0 obj +% 1922 0 obj << -/D [1917 0 R /XYZ 150.705 679.195 null] +/D [1918 0 R /XYZ 150.705 679.195 null] >> -% 1916 0 obj +% 1917 0 obj << /Font << /F75 685 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1923 0 obj +% 1924 0 obj << /Type /Page -/Contents 1924 0 R -/Resources 1922 0 R +/Contents 1925 0 R +/Resources 1923 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1915 0 R +/Parent 1916 0 R >> -% 1925 0 obj +% 1926 0 obj << -/D [1923 0 R /XYZ 98.895 753.953 null] +/D [1924 0 R /XYZ 98.895 753.953 null] >> % 509 0 obj << -/D [1923 0 R /XYZ 99.895 716.092 null] +/D [1924 0 R /XYZ 99.895 716.092 null] >> -% 1926 0 obj +% 1927 0 obj << -/D [1923 0 R /XYZ 99.895 689.963 null] +/D [1924 0 R /XYZ 99.895 689.963 null] >> -% 1927 0 obj +% 1928 0 obj << -/D [1923 0 R /XYZ 99.895 693.143 null] +/D [1924 0 R /XYZ 99.895 693.143 null] >> -% 1922 0 obj +% 1923 0 obj << /Font << /F75 685 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1929 0 obj +% 1930 0 obj << /Type /Page -/Contents 1930 0 R -/Resources 1928 0 R +/Contents 1931 0 R +/Resources 1929 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1915 0 R +/Parent 1916 0 R >> -% 1931 0 obj +% 1932 0 obj << -/D [1929 0 R /XYZ 149.705 753.953 null] +/D [1930 0 R /XYZ 149.705 753.953 null] >> % 513 0 obj << -/D [1929 0 R /XYZ 150.705 716.092 null] +/D [1930 0 R /XYZ 150.705 716.092 null] >> -% 1932 0 obj +% 1933 0 obj << -/D [1929 0 R /XYZ 150.705 678.98 null] +/D [1930 0 R /XYZ 150.705 678.98 null] >> -% 1933 0 obj +% 1934 0 obj << -/D [1929 0 R /XYZ 150.705 679.195 null] +/D [1930 0 R /XYZ 150.705 679.195 null] >> -% 1928 0 obj +% 1929 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> /ProcSet [ /PDF /Text ] >> -% 1935 0 obj +% 1936 0 obj << /Type /Page -/Contents 1936 0 R -/Resources 1934 0 R +/Contents 1937 0 R +/Resources 1935 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1915 0 R ->> -% 1937 0 obj -<< -/D [1935 0 R /XYZ 98.895 753.953 null] +/Parent 1916 0 R >> endstream endobj -1942 0 obj +1943 0 obj << /Length 4752 >> @@ -25867,7 +25930,7 @@ ET endstream endobj -1949 0 obj +1950 0 obj << /Length 5153 >> @@ -25955,7 +26018,7 @@ ET endstream endobj -1957 0 obj +1958 0 obj << /Length 3684 >> @@ -26045,7 +26108,7 @@ ET endstream endobj -1964 0 obj +1965 0 obj << /Length 4361 >> @@ -26142,7 +26205,7 @@ ET endstream endobj -1971 0 obj +1972 0 obj << /Length 7544 >> @@ -26329,7 +26392,7 @@ ET endstream endobj -1978 0 obj +1979 0 obj << /Length 7395 >> @@ -26506,7 +26569,7 @@ ET endstream endobj -1984 0 obj +1985 0 obj << /Length 656 >> @@ -26544,7 +26607,7 @@ ET endstream endobj -1988 0 obj +1989 0 obj << /Length 1399 >> @@ -26572,7 +26635,7 @@ ET endstream endobj -1996 0 obj +1997 0 obj << /Length 5053 >> @@ -26664,7 +26727,7 @@ ET endstream endobj -2007 0 obj +2008 0 obj << /Length 4359 >> @@ -26763,7 +26826,7 @@ ET endstream endobj -2011 0 obj +2012 0 obj << /Length 13651 >> @@ -27304,7 +27367,7 @@ ET endstream endobj -2020 0 obj +2021 0 obj << /Length 7660 >> @@ -27522,7 +27585,7 @@ ET endstream endobj -2024 0 obj +2025 0 obj << /Length 1133 >> @@ -27541,7 +27604,7 @@ ET endstream endobj -2033 0 obj +2034 0 obj << /Length 6132 >> @@ -27695,7 +27758,7 @@ ET endstream endobj -2039 0 obj +2040 0 obj << /Length 3490 >> @@ -27758,7 +27821,7 @@ ET endstream endobj -2043 0 obj +2044 0 obj << /Length 973 >> @@ -27799,43 +27862,47 @@ ET endstream endobj -1938 0 obj +1939 0 obj << /Type /ObjStm /N 100 /First 972 -/Length 10928 ->> -stream -517 0 1934 57 1941 152 1939 291 1943 436 521 495 1944 553 1945 612 1940 671 1948 766 -1946 905 1950 1050 525 1108 1951 1165 1952 1223 1947 1281 1956 1376 1954 1515 1958 1660 529 1719 -1959 1777 1960 1835 1955 1894 1963 1989 1961 2128 1965 2272 533 2330 1966 2387 1967 2444 1962 2502 -1970 2597 1968 2736 1972 2881 537 2940 1973 2998 1974 3057 1969 3116 1977 3239 1975 3378 1979 3520 -541 3578 1980 3635 1981 3693 1976 3751 1983 3874 1985 3992 1982 4051 1987 4134 1989 4252 545 4310 -1986 4367 1995 4462 1991 4619 1992 4766 1993 4914 1997 5061 549 5120 1998 5178 1994 5236 2006 5344 -2000 5510 2001 5657 2002 5804 2003 5952 2008 6099 553 6157 2005 6214 2010 6322 2004 6461 2012 6624 -1999 6683 2009 6743 2019 6853 2014 7019 2015 7164 2016 7311 2017 7458 2021 7605 557 7663 2018 7720 -2023 7815 2025 7933 2022 7992 2032 8087 2026 8262 2027 8407 2028 8550 2029 8697 2030 8841 2034 8990 -561 9048 2031 9105 2038 9200 2036 9339 2040 9484 565 9543 2037 9601 2042 9723 2044 9841 569 9899 -% 517 0 obj +/Length 10929 +>> +stream +1938 0 517 58 1935 115 1942 210 1940 349 1944 494 521 553 1945 611 1946 670 1941 729 +1949 824 1947 963 1951 1108 525 1166 1952 1223 1953 1281 1948 1339 1957 1434 1955 1573 1959 1718 +529 1777 1960 1835 1961 1893 1956 1952 1964 2047 1962 2186 1966 2330 533 2388 1967 2445 1968 2502 +1963 2560 1971 2655 1969 2794 1973 2939 537 2998 1974 3056 1975 3115 1970 3174 1978 3297 1976 3436 +1980 3578 541 3636 1981 3693 1982 3751 1977 3809 1984 3932 1986 4050 1983 4109 1988 4192 1990 4310 +545 4368 1987 4425 1996 4520 1992 4677 1993 4824 1994 4972 1998 5119 549 5178 1999 5236 1995 5294 +2007 5402 2001 5568 2002 5715 2003 5862 2004 6010 2009 6157 553 6215 2006 6272 2011 6380 2005 6519 +2013 6682 2000 6741 2010 6801 2020 6911 2015 7077 2016 7222 2017 7369 2018 7516 2022 7663 557 7721 +2019 7778 2024 7873 2026 7991 2023 8050 2033 8145 2027 8320 2028 8465 2029 8608 2030 8755 2031 8899 +2035 9048 561 9106 2032 9163 2039 9258 2037 9397 2041 9542 565 9601 2038 9659 2043 9781 2045 9899 +% 1938 0 obj << -/D [1935 0 R /XYZ 99.895 716.092 null] +/D [1936 0 R /XYZ 98.895 753.953 null] >> -% 1934 0 obj +% 517 0 obj +<< +/D [1936 0 R /XYZ 99.895 716.092 null] +>> +% 1935 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> /ProcSet [ /PDF /Text ] >> -% 1941 0 obj +% 1942 0 obj << /Type /Page -/Contents 1942 0 R -/Resources 1940 0 R +/Contents 1943 0 R +/Resources 1941 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1915 0 R -/Annots [ 1939 0 R ] +/Parent 1916 0 R +/Annots [ 1940 0 R ] >> -% 1939 0 obj +% 1940 0 obj << /Type /Annot /Subtype /Link @@ -27843,37 +27910,37 @@ stream /Rect [342.753 438.278 420.271 450.338] /A << /S /GoTo /D (spdata) >> >> -% 1943 0 obj +% 1944 0 obj << -/D [1941 0 R /XYZ 149.705 753.953 null] +/D [1942 0 R /XYZ 149.705 753.953 null] >> % 521 0 obj << -/D [1941 0 R /XYZ 150.705 716.092 null] +/D [1942 0 R /XYZ 150.705 716.092 null] >> -% 1944 0 obj +% 1945 0 obj << -/D [1941 0 R /XYZ 150.705 676.015 null] +/D [1942 0 R /XYZ 150.705 676.015 null] >> -% 1945 0 obj +% 1946 0 obj << -/D [1941 0 R /XYZ 150.705 679.195 null] +/D [1942 0 R /XYZ 150.705 679.195 null] >> -% 1940 0 obj +% 1941 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> /ProcSet [ /PDF /Text ] >> -% 1948 0 obj +% 1949 0 obj << /Type /Page -/Contents 1949 0 R -/Resources 1947 0 R +/Contents 1950 0 R +/Resources 1948 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1953 0 R -/Annots [ 1946 0 R ] +/Parent 1954 0 R +/Annots [ 1947 0 R ] >> -% 1946 0 obj +% 1947 0 obj << /Type /Annot /Subtype /Link @@ -27881,37 +27948,37 @@ stream /Rect [291.943 571.778 369.462 583.837] /A << /S /GoTo /D (spdata) >> >> -% 1950 0 obj +% 1951 0 obj << -/D [1948 0 R /XYZ 98.895 753.953 null] +/D [1949 0 R /XYZ 98.895 753.953 null] >> % 525 0 obj << -/D [1948 0 R /XYZ 99.895 716.092 null] +/D [1949 0 R /XYZ 99.895 716.092 null] >> -% 1951 0 obj +% 1952 0 obj << -/D [1948 0 R /XYZ 99.895 676.015 null] +/D [1949 0 R /XYZ 99.895 676.015 null] >> -% 1952 0 obj +% 1953 0 obj << -/D [1948 0 R /XYZ 99.895 679.195 null] +/D [1949 0 R /XYZ 99.895 679.195 null] >> -% 1947 0 obj +% 1948 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> /ProcSet [ /PDF /Text ] >> -% 1956 0 obj +% 1957 0 obj << /Type /Page -/Contents 1957 0 R -/Resources 1955 0 R +/Contents 1958 0 R +/Resources 1956 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1953 0 R -/Annots [ 1954 0 R ] +/Parent 1954 0 R +/Annots [ 1955 0 R ] >> -% 1954 0 obj +% 1955 0 obj << /Type /Annot /Subtype /Link @@ -27919,37 +27986,37 @@ stream /Rect [342.753 438.278 420.271 450.338] /A << /S /GoTo /D (spdata) >> >> -% 1958 0 obj +% 1959 0 obj << -/D [1956 0 R /XYZ 149.705 753.953 null] +/D [1957 0 R /XYZ 149.705 753.953 null] >> % 529 0 obj << -/D [1956 0 R /XYZ 150.705 716.092 null] +/D [1957 0 R /XYZ 150.705 716.092 null] >> -% 1959 0 obj +% 1960 0 obj << -/D [1956 0 R /XYZ 150.705 678.98 null] +/D [1957 0 R /XYZ 150.705 678.98 null] >> -% 1960 0 obj +% 1961 0 obj << -/D [1956 0 R /XYZ 150.705 679.195 null] +/D [1957 0 R /XYZ 150.705 679.195 null] >> -% 1955 0 obj +% 1956 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> /ProcSet [ /PDF /Text ] >> -% 1963 0 obj +% 1964 0 obj << /Type /Page -/Contents 1964 0 R -/Resources 1962 0 R +/Contents 1965 0 R +/Resources 1963 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1953 0 R -/Annots [ 1961 0 R ] +/Parent 1954 0 R +/Annots [ 1962 0 R ] >> -% 1961 0 obj +% 1962 0 obj << /Type /Annot /Subtype /Link @@ -27957,37 +28024,37 @@ stream /Rect [301.961 426.323 378.015 438.383] /A << /S /GoTo /D (vdata) >> >> -% 1965 0 obj +% 1966 0 obj << -/D [1963 0 R /XYZ 98.895 753.953 null] +/D [1964 0 R /XYZ 98.895 753.953 null] >> % 533 0 obj << -/D [1963 0 R /XYZ 99.895 716.092 null] +/D [1964 0 R /XYZ 99.895 716.092 null] >> -% 1966 0 obj +% 1967 0 obj << -/D [1963 0 R /XYZ 99.895 678.98 null] +/D [1964 0 R /XYZ 99.895 678.98 null] >> -% 1967 0 obj +% 1968 0 obj << -/D [1963 0 R /XYZ 99.895 679.195 null] +/D [1964 0 R /XYZ 99.895 679.195 null] >> -% 1962 0 obj +% 1963 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> /ProcSet [ /PDF /Text ] >> -% 1970 0 obj +% 1971 0 obj << /Type /Page -/Contents 1971 0 R -/Resources 1969 0 R +/Contents 1972 0 R +/Resources 1970 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1953 0 R -/Annots [ 1968 0 R ] +/Parent 1954 0 R +/Annots [ 1969 0 R ] >> -% 1968 0 obj +% 1969 0 obj << /Type /Annot /Subtype /Link @@ -27995,37 +28062,37 @@ stream /Rect [342.753 574.778 420.271 586.838] /A << /S /GoTo /D (spdata) >> >> -% 1972 0 obj +% 1973 0 obj << -/D [1970 0 R /XYZ 149.705 753.953 null] +/D [1971 0 R /XYZ 149.705 753.953 null] >> % 537 0 obj << -/D [1970 0 R /XYZ 150.705 716.092 null] +/D [1971 0 R /XYZ 150.705 716.092 null] >> -% 1973 0 obj +% 1974 0 obj << -/D [1970 0 R /XYZ 150.705 679.441 null] +/D [1971 0 R /XYZ 150.705 679.441 null] >> -% 1974 0 obj +% 1975 0 obj << -/D [1970 0 R /XYZ 150.705 679.657 null] +/D [1971 0 R /XYZ 150.705 679.657 null] >> -% 1969 0 obj +% 1970 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R /F78 686 0 R /F233 1044 0 R >> /ProcSet [ /PDF /Text ] >> -% 1977 0 obj +% 1978 0 obj << /Type /Page -/Contents 1978 0 R -/Resources 1976 0 R +/Contents 1979 0 R +/Resources 1977 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1953 0 R -/Annots [ 1975 0 R ] +/Parent 1954 0 R +/Annots [ 1976 0 R ] >> -% 1975 0 obj +% 1976 0 obj << /Type /Annot /Subtype /Link @@ -28033,75 +28100,75 @@ stream /Rect [396.215 574.59 472.269 586.65] /A << /S /GoTo /D (vdata) >> >> -% 1979 0 obj +% 1980 0 obj << -/D [1977 0 R /XYZ 98.895 753.953 null] +/D [1978 0 R /XYZ 98.895 753.953 null] >> % 541 0 obj << -/D [1977 0 R /XYZ 99.895 716.092 null] +/D [1978 0 R /XYZ 99.895 716.092 null] >> -% 1980 0 obj +% 1981 0 obj << -/D [1977 0 R /XYZ 99.895 679.413 null] +/D [1978 0 R /XYZ 99.895 679.413 null] >> -% 1981 0 obj +% 1982 0 obj << -/D [1977 0 R /XYZ 99.895 679.628 null] +/D [1978 0 R /XYZ 99.895 679.628 null] >> -% 1976 0 obj +% 1977 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R /F78 686 0 R /F233 1044 0 R >> /ProcSet [ /PDF /Text ] >> -% 1983 0 obj +% 1984 0 obj << /Type /Page -/Contents 1984 0 R -/Resources 1982 0 R +/Contents 1985 0 R +/Resources 1983 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1953 0 R +/Parent 1954 0 R >> -% 1985 0 obj +% 1986 0 obj << -/D [1983 0 R /XYZ 149.705 753.953 null] +/D [1984 0 R /XYZ 149.705 753.953 null] >> -% 1982 0 obj +% 1983 0 obj << /Font << /F233 1044 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1987 0 obj +% 1988 0 obj << /Type /Page -/Contents 1988 0 R -/Resources 1986 0 R +/Contents 1989 0 R +/Resources 1987 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1990 0 R +/Parent 1991 0 R >> -% 1989 0 obj +% 1990 0 obj << -/D [1987 0 R /XYZ 98.895 753.953 null] +/D [1988 0 R /XYZ 98.895 753.953 null] >> % 545 0 obj << -/D [1987 0 R /XYZ 99.895 716.092 null] +/D [1988 0 R /XYZ 99.895 716.092 null] >> -% 1986 0 obj +% 1987 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> /ProcSet [ /PDF /Text ] >> -% 1995 0 obj +% 1996 0 obj << /Type /Page -/Contents 1996 0 R -/Resources 1994 0 R +/Contents 1997 0 R +/Resources 1995 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1990 0 R -/Annots [ 1991 0 R 1992 0 R 1993 0 R ] +/Parent 1991 0 R +/Annots [ 1992 0 R 1993 0 R 1994 0 R ] >> -% 1991 0 obj +% 1992 0 obj << /Type /Annot /Subtype /Link @@ -28109,7 +28176,7 @@ stream /Rect [371.126 442.264 443.414 454.323] /A << /S /GoTo /D (precdata) >> >> -% 1992 0 obj +% 1993 0 obj << /Type /Annot /Subtype /Link @@ -28117,7 +28184,7 @@ stream /Rect [222.066 352.6 228.343 366.303] /A << /S /GoTo /D (Hfootnote.4) >> >> -% 1993 0 obj +% 1994 0 obj << /Type /Annot /Subtype /Link @@ -28125,33 +28192,33 @@ stream /Rect [221.319 235.698 233.275 245.108] /A << /S /GoTo /D (table.21) >> >> -% 1997 0 obj +% 1998 0 obj << -/D [1995 0 R /XYZ 149.705 753.953 null] +/D [1996 0 R /XYZ 149.705 753.953 null] >> % 549 0 obj << -/D [1995 0 R /XYZ 150.705 716.092 null] +/D [1996 0 R /XYZ 150.705 716.092 null] >> -% 1998 0 obj +% 1999 0 obj << -/D [1995 0 R /XYZ 165.051 129.79 null] +/D [1996 0 R /XYZ 165.051 129.79 null] >> -% 1994 0 obj +% 1995 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 2006 0 obj +% 2007 0 obj << /Type /Page -/Contents 2007 0 R -/Resources 2005 0 R +/Contents 2008 0 R +/Resources 2006 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1990 0 R -/Annots [ 2000 0 R 2001 0 R 2002 0 R 2003 0 R ] +/Parent 1991 0 R +/Annots [ 2001 0 R 2002 0 R 2003 0 R 2004 0 R ] >> -% 2000 0 obj +% 2001 0 obj << /Type /Annot /Subtype /Link @@ -28159,7 +28226,7 @@ stream /Rect [283.359 567.422 295.314 580.259] /A << /S /GoTo /D (table.21) >> >> -% 2001 0 obj +% 2002 0 obj << /Type /Annot /Subtype /Link @@ -28167,7 +28234,7 @@ stream /Rect [366.137 520.379 378.292 532.438] /A << /S /GoTo /D (table.21) >> >> -% 2002 0 obj +% 2003 0 obj << /Type /Annot /Subtype /Link @@ -28175,7 +28242,7 @@ stream /Rect [379.319 483.736 386.292 496.573] /A << /S /GoTo /D (section.8) >> >> -% 2003 0 obj +% 2004 0 obj << /Type /Annot /Subtype /Link @@ -28183,29 +28250,29 @@ stream /Rect [136.757 451.412 148.712 460.822] /A << /S /GoTo /D (table.21) >> >> -% 2008 0 obj +% 2009 0 obj << -/D [2006 0 R /XYZ 98.895 753.953 null] +/D [2007 0 R /XYZ 98.895 753.953 null] >> % 553 0 obj << -/D [2006 0 R /XYZ 99.895 716.092 null] +/D [2007 0 R /XYZ 99.895 716.092 null] >> -% 2005 0 obj +% 2006 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 2010 0 obj +% 2011 0 obj << /Type /Page -/Contents 2011 0 R -/Resources 2009 0 R +/Contents 2012 0 R +/Resources 2010 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1990 0 R -/Annots [ 2004 0 R ] +/Parent 1991 0 R +/Annots [ 2005 0 R ] >> -% 2004 0 obj +% 2005 0 obj << /Type /Annot /Subtype /Link @@ -28213,29 +28280,29 @@ stream /Rect [404.253 212.933 412.423 220.405] /A << /S /GoTo /D (cite.BERTACCINIFILIPPONE) >> >> -% 2012 0 obj +% 2013 0 obj << -/D [2010 0 R /XYZ 149.705 753.953 null] +/D [2011 0 R /XYZ 149.705 753.953 null] >> -% 1999 0 obj +% 2000 0 obj << -/D [2010 0 R /XYZ -3900.052 719.08 null] +/D [2011 0 R /XYZ -3900.052 719.08 null] >> -% 2009 0 obj +% 2010 0 obj << /Font << /F233 1044 0 R /F84 687 0 R /F78 686 0 R /F190 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 2019 0 obj +% 2020 0 obj << /Type /Page -/Contents 2020 0 R -/Resources 2018 0 R +/Contents 2021 0 R +/Resources 2019 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1990 0 R -/Annots [ 2014 0 R 2015 0 R 2016 0 R 2017 0 R ] +/Parent 1991 0 R +/Annots [ 2015 0 R 2016 0 R 2017 0 R 2018 0 R ] >> -% 2014 0 obj +% 2015 0 obj << /Type /Annot /Subtype /Link @@ -28243,7 +28310,7 @@ stream /Rect [314.678 576.377 392.197 588.437] /A << /S /GoTo /D (spdata) >> >> -% 2015 0 obj +% 2016 0 obj << /Type /Annot /Subtype /Link @@ -28251,7 +28318,7 @@ stream /Rect [395.856 505.741 468.144 517.801] /A << /S /GoTo /D (precdata) >> >> -% 2016 0 obj +% 2017 0 obj << /Type /Annot /Subtype /Link @@ -28259,7 +28326,7 @@ stream /Rect [371.454 435.105 438.512 447.165] /A << /S /GoTo /D (descdata) >> >> -% 2017 0 obj +% 2018 0 obj << /Type /Annot /Subtype /Link @@ -28267,46 +28334,46 @@ stream /Rect [317.418 128.475 389.706 140.535] /A << /S /GoTo /D (precdata) >> >> -% 2021 0 obj +% 2022 0 obj << -/D [2019 0 R /XYZ 98.895 753.953 null] +/D [2020 0 R /XYZ 98.895 753.953 null] >> % 557 0 obj << -/D [2019 0 R /XYZ 99.895 716.092 null] +/D [2020 0 R /XYZ 99.895 716.092 null] >> -% 2018 0 obj +% 2019 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 2023 0 obj +% 2024 0 obj << /Type /Page -/Contents 2024 0 R -/Resources 2022 0 R +/Contents 2025 0 R +/Resources 2023 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1990 0 R +/Parent 1991 0 R >> -% 2025 0 obj +% 2026 0 obj << -/D [2023 0 R /XYZ 149.705 753.953 null] +/D [2024 0 R /XYZ 149.705 753.953 null] >> -% 2022 0 obj +% 2023 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> /ProcSet [ /PDF /Text ] >> -% 2032 0 obj +% 2033 0 obj << /Type /Page -/Contents 2033 0 R -/Resources 2031 0 R +/Contents 2034 0 R +/Resources 2032 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2035 0 R -/Annots [ 2026 0 R 2027 0 R 2028 0 R 2029 0 R 2030 0 R ] +/Parent 2036 0 R +/Annots [ 2027 0 R 2028 0 R 2029 0 R 2030 0 R 2031 0 R ] >> -% 2026 0 obj +% 2027 0 obj << /Type /Annot /Subtype /Link @@ -28314,7 +28381,7 @@ stream /Rect [320.317 573.77 392.605 585.83] /A << /S /GoTo /D (precdata) >> >> -% 2027 0 obj +% 2028 0 obj << /Type /Annot /Subtype /Link @@ -28322,7 +28389,7 @@ stream /Rect [342.493 517.98 418.548 530.039] /A << /S /GoTo /D (vdata) >> >> -% 2028 0 obj +% 2029 0 obj << /Type /Annot /Subtype /Link @@ -28330,7 +28397,7 @@ stream /Rect [324.013 462.189 391.071 474.248] /A << /S /GoTo /D (descdata) >> >> -% 2029 0 obj +% 2030 0 obj << /Type /Annot /Subtype /Link @@ -28338,7 +28405,7 @@ stream /Rect [342.493 272.899 418.548 284.958] /A << /S /GoTo /D (vdata) >> >> -% 2030 0 obj +% 2031 0 obj << /Type /Annot /Subtype /Link @@ -28346,29 +28413,29 @@ stream /Rect [431.552 183.235 443.387 196.238] /A << /S /GoTo /D (section.11) >> >> -% 2034 0 obj +% 2035 0 obj << -/D [2032 0 R /XYZ 98.895 753.953 null] +/D [2033 0 R /XYZ 98.895 753.953 null] >> % 561 0 obj << -/D [2032 0 R /XYZ 99.895 716.092 null] +/D [2033 0 R /XYZ 99.895 716.092 null] >> -% 2031 0 obj +% 2032 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 2038 0 obj +% 2039 0 obj << /Type /Page -/Contents 2039 0 R -/Resources 2037 0 R +/Contents 2040 0 R +/Resources 2038 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2035 0 R -/Annots [ 2036 0 R ] +/Parent 2036 0 R +/Annots [ 2037 0 R ] >> -% 2036 0 obj +% 2037 0 obj << /Type /Annot /Subtype /Link @@ -28376,39 +28443,35 @@ stream /Rect [371.126 573.77 443.414 585.83] /A << /S /GoTo /D (precdata) >> >> -% 2040 0 obj +% 2041 0 obj << -/D [2038 0 R /XYZ 149.705 753.953 null] +/D [2039 0 R /XYZ 149.705 753.953 null] >> % 565 0 obj << -/D [2038 0 R /XYZ 150.705 716.092 null] +/D [2039 0 R /XYZ 150.705 716.092 null] >> -% 2037 0 obj +% 2038 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R /F190 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 2042 0 obj +% 2043 0 obj << /Type /Page -/Contents 2043 0 R -/Resources 2041 0 R +/Contents 2044 0 R +/Resources 2042 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2035 0 R +/Parent 2036 0 R >> -% 2044 0 obj +% 2045 0 obj << -/D [2042 0 R /XYZ 98.895 753.953 null] ->> -% 569 0 obj -<< -/D [2042 0 R /XYZ 99.895 716.092 null] +/D [2043 0 R /XYZ 98.895 753.953 null] >> endstream endobj -2050 0 obj +2051 0 obj << /Length 2715 >> @@ -28485,7 +28548,7 @@ ET endstream endobj -2058 0 obj +2059 0 obj << /Length 6107 >> @@ -28609,7 +28672,7 @@ ET endstream endobj -2065 0 obj +2066 0 obj << /Length 3194 >> @@ -28697,7 +28760,7 @@ ET endstream endobj -2069 0 obj +2070 0 obj << /Length 607 >> @@ -28713,7 +28776,7 @@ ET endstream endobj -2077 0 obj +2078 0 obj << /Length 8466 >> @@ -28863,7 +28926,7 @@ ET endstream endobj -2088 0 obj +2089 0 obj << /Length 7173 >> @@ -29003,7 +29066,7 @@ ET endstream endobj -2093 0 obj +2094 0 obj << /Length 4580 >> @@ -29070,7 +29133,7 @@ ET endstream endobj -2101 0 obj +2102 0 obj << /Length 8759 >> @@ -29222,7 +29285,7 @@ ET endstream endobj -2110 0 obj +2111 0 obj << /Length 6806 >> @@ -29347,7 +29410,7 @@ ET endstream endobj -2114 0 obj +2115 0 obj << /Length 1090 >> @@ -29370,7 +29433,7 @@ ET endstream endobj -2125 0 obj +2126 0 obj << /Length 8172 >> @@ -29604,7 +29667,7 @@ ET endstream endobj -2139 0 obj +2140 0 obj << /Length 9201 >> @@ -29861,7 +29924,7 @@ ET endstream endobj -2148 0 obj +2149 0 obj << /Length 4837 >> @@ -29930,21 +29993,21 @@ ET endstream endobj -2132 0 obj +2133 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/mat.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 2153 0 R +/PTEX.InfoDict 2154 0 R /BBox [0 0 438 395] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << -/R7 2154 0 R +/R7 2155 0 R >>/XObject << -/R8 2155 0 R +/R8 2156 0 R >>>> /Length 3551 /Filter /FlateDecode @@ -29973,7 +30036,7 @@ r ´JXØxèóC¹ù[— S¬ë¹Ïæ^zݰ.¼¯÷ëFÜ$ä 5`2. L£× 0 · æÁî# Z(Dô¿Sð÷žÅjý²¥¬³*'fÖåÃÝÖ;?buÞîR­rœ†þ—* Ýœ—"@„ÂúaËiý(ÿ« o^ÿ/o*o endstream endobj -2155 0 obj +2156 0 obj << /Subtype /Image /ColorSpace /DeviceGray @@ -29992,7 +30055,7 @@ stream & ÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÀ@ endstream endobj -2159 0 obj +2160 0 obj << /Length 7547 >> @@ -30142,66 +30205,43 @@ ET endstream endobj -2134 0 obj -<< -/Type /XObject -/Subtype /Form -/FormType 1 -/PTEX.FileName (./figures/ell.pdf) -/PTEX.PageNumber 1 -/PTEX.InfoDict 2170 0 R -/BBox [0 0 447 205] -/Resources << -/ProcSet [ /PDF /ImageC /Text ] -/ExtGState << -/R7 2171 0 R ->>/XObject << -/R8 2172 0 R ->>/Font << /R9 2173 0 R/R11 2174 0 R>> ->> -/Length 2281 -/Filter /FlateDecode ->> -stream -xœÝYËŠ%¹ÝçWäÎU‹’õ~,ÛØoº§À˜Á«kOý6=^ø÷!Å )E—™M3Pôâv…â)ŒÌúrZãNËÿä÷ö8~ÿ©œŸÿs|9Zñ&”vúêM -î|-7¬;}¡ßâΖ‹)…Äd²_Dg|¨çí³©]]¶ç`l©§:HÍ4Çúd(f²)‰Ö›ñŽÅd)´Lš"é×bZ^š3ÅÍý-’ßÕ~«Æ¦%€ÖLŽuyf ˆ¤ ¨\Hx‡ÄPiGZb¤_NIˆÈIK–P@``kÃMã8¯Ø–Æ8N¼6tÂ%Ê3L1V“óì‹‹Ñø®-»£5Iý¹@ñøº´Å…h\ñڼɶ!%ˆ³/ª 5QRµÅ…ÔUBªk€*#HÛ‘?H…f[µÞùÙ—cÇ‘ƒˆ³-ª€"ÀÀÖ„ÙNª¸õ¾PÚÞYíC°&²i½»]ï‹3¹»D_(Ô®—QveíŒ3©¶ª¡j¥ÂJVggTenº@in‚Ô;¤Y¢iŠ­‚ø@fs¸ùa¹3Ñg]FgsTAê ¶VÜŽ¿žÿ¢òÚÓ“+nßãpÖNñ>Ä.Pˆ÷®;¥Ÿú~R·‘À@»c,S¼‘õ ócß—3‘õίޓÞKH…NùK®ÄR1 Ò­çÿ}|¤_Ži½,¼K@4y²ÉtҔÁ[г©a>¸3†˜-Ý0'‰ÑÄI¬$W²³Poˆ%Rè*NÕ¿Ú§†¼ø¯‘ÎÓŸÈK@£XÐ ÊŠð¦F(¼ª9(ój–ScA-\úpCc&à”¼¤2ˆkƒÙÔ@ç=ØWZDD ND bEN“z‘õÔU™zÙV£®ˆ`T}ÆY@3”íZa_YQÞÔ…W5e^MrjŒ"¨…K´-“wQU0ªFš·œ¥ˆ°šöEX>•5(!N bEZ“z‘øÔ¨…Q¹Å…”Vc¡1âÍ,2ófº‹ÉŠˆ¼‰Á«Èb2/ò\4z¦…K/ñ¸2oˆmeÞ.N®íÊ;õzç‹©îW0´¯4Lè¯eð®úÿI¼û GÌ,Nûÿ{PeZ®D‡>ÝùR2³áƒ…ûÿïÇ÷$]×.‹¹¬‹,-‹­­‹,-‹.¸uµ‹ër¾„ÔÅu¹]¢êâ²ìRÎðŒNUšJ¬bÏ’Ö%‘Æ’³e]ƒ(‹Ñ^E”Åâ/‹"ö "Y¡–EÛ(:ß{œ/ȪUâ®dÕr63¸h¹h…¶k rÑ¢[»i ÒµøÄøäø8ÑÜ i ®Ù®Z‚¬Z9úb ÈE+ò#÷¢%ÈE«Ô-. «V¤Ú\m¹hE¿ÅdÕ¢7Rëyl´Æ6ky`d(µTÎ_>Ó”äÆe”ŸÛãüÃ+]@zšÇóõÇc¼ÎòÀC׸ËÆl’¥¥Çñäž_&û‰ž_6Ó4å™äõ²xnôë_Ž'ÿü»ãeÑõüÔº¡ë:9¶Fæ=Q/xؾ±_ýÜã ¼•†Ý¾Pyá…êN†ŸhÇž(~Jò7õ+n$Ö­ÑLÜxxÑ„8CÛÍyS¨ÚׄÆÒ ]¨¾f;XûÓkL'/ƒ<íùË?O¦G7øîíž}"´Ö„ÄÃ5ž^ B‡Üò|IgÊñ8D7†*ãm‘7Ó!ßGó&?-8ÇkšX˜òðA;€doië©r¦¹®L"ßBR,ìyÜèÁÔôùÈ.~‹²ô-ü &gjg*±ûªŽêR㙼'ƒS¾|÷È$j­¡ìöI]žVè*ÉîFÇ„Ÿ#0ùv Xöoñߎß_JÜ«F>,¿kV@V¥w‚è½FÍüjý’U¡Q‹/Bñ ö‹8ݰ°Q‹ý™¢!‹=îÕ»L‹ûå|L†»O/ÉsbŠøj p4°žbÍ&z½p‰î®ŠLÖf.(Åí$}6Os¸XÈ…_­\@¤ ƒ*HŒj`Ë‚[ö^3[oÙÌM §¡Ëq™¹á<‘ã†ýÕ­ˆ Û·ØŸ‰! öÖ[ö®Òâ~ UμHX`ZD .žy Y*Ç~ˆêTD%»4ÌÏ´‰û·ø—§×ûI‰û„ùcf¥ˆ„… QcÆYHC¦ É*cJRÒ€G ;É¿õ©˜Ï@3~ýZL²kÄÅŽÿ8EÜóú8~xúðìÓ÷ç‡OŸž_([zR6 -Íy-?ýíùï¯ßñGz·5®„ùËéOß}àMžså¾Atû·ÔÇÿ|THF -endstream -endobj -2045 0 obj +2046 0 obj << /Type /ObjStm /N 100 -/First 989 -/Length 12218 ->> -stream -2041 0 2049 95 2046 243 2047 388 2051 535 573 594 2048 652 2057 747 2052 913 2053 1058 -2054 1205 2055 1359 2059 1508 577 1566 2056 1623 2064 1718 2060 1875 2061 2022 2062 2169 2066 2323 -581 2382 2063 2440 2068 2535 2070 2653 585 2711 2067 2768 2076 2863 2072 3011 2073 3161 2078 3306 -589 3365 2079 3423 2080 3482 2081 3541 2082 3600 2075 3658 2087 3809 2074 3975 2083 4122 2084 4266 -2085 4410 2089 4555 2086 4613 2092 4764 2090 4903 2094 5047 2091 5106 2100 5214 2095 5371 2096 5516 -2097 5663 2102 5805 593 5863 2103 5920 2104 5978 2105 6036 2099 6094 2109 6245 2098 6402 2106 6546 -2107 6693 2111 6837 2108 6896 2113 7047 2115 7165 2112 7223 2124 7304 2117 7497 2127 7673 2118 7848 -2119 8031 2120 8183 2121 8338 2122 8490 2126 8644 597 8703 601 8761 2123 8819 2138 8942 2130 9099 -2131 9248 2133 9395 2140 9542 606 9600 610 9657 2141 9714 2142 9772 2137 9830 2147 9968 2153 10107 -2154 10287 2136 10330 2149 10477 2144 10536 2150 10595 2151 10654 2152 10713 2146 10772 2158 10910 2170 11049 -% 2041 0 obj +/First 987 +/Length 12093 +>> +stream +569 0 2042 57 2050 152 2047 300 2048 445 2052 592 573 651 2049 709 2058 804 2053 970 +2054 1115 2055 1262 2056 1416 2060 1565 577 1623 2057 1680 2065 1775 2061 1932 2062 2079 2063 2226 +2067 2380 581 2439 2064 2497 2069 2592 2071 2710 585 2768 2068 2825 2077 2920 2073 3068 2074 3218 +2079 3363 589 3422 2080 3480 2081 3539 2082 3598 2083 3657 2076 3715 2088 3866 2075 4032 2084 4179 +2085 4323 2086 4467 2090 4612 2087 4670 2093 4821 2091 4960 2095 5104 2092 5163 2101 5271 2096 5428 +2097 5573 2098 5720 2103 5862 593 5920 2104 5977 2105 6035 2106 6093 2100 6151 2110 6302 2099 6459 +2107 6603 2108 6750 2112 6894 2109 6953 2114 7104 2116 7222 2113 7280 2125 7361 2118 7554 2128 7730 +2119 7905 2120 8088 2121 8240 2122 8395 2123 8547 2127 8701 597 8760 601 8818 2124 8876 2139 8999 +2131 9156 2132 9305 2134 9452 2141 9599 606 9657 610 9714 2142 9771 2143 9829 2138 9887 2148 10025 +2154 10164 2155 10344 2137 10387 2150 10534 2145 10593 2151 10652 2152 10711 2153 10770 2147 10829 2159 10967 +% 569 0 obj +<< +/D [2043 0 R /XYZ 99.895 716.092 null] +>> +% 2042 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 2049 0 obj +% 2050 0 obj << /Type /Page -/Contents 2050 0 R -/Resources 2048 0 R +/Contents 2051 0 R +/Resources 2049 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2035 0 R -/Annots [ 2046 0 R 2047 0 R ] +/Parent 2036 0 R +/Annots [ 2047 0 R 2048 0 R ] >> -% 2046 0 obj +% 2047 0 obj << /Type /Annot /Subtype /Link @@ -30209,7 +30249,7 @@ stream /Rect [371.126 573.77 443.414 585.83] /A << /S /GoTo /D (precdata) >> >> -% 2047 0 obj +% 2048 0 obj << /Type /Annot /Subtype /Link @@ -30217,29 +30257,29 @@ stream /Rect [371.126 498.054 443.414 510.114] /A << /S /GoTo /D (precdata) >> >> -% 2051 0 obj +% 2052 0 obj << -/D [2049 0 R /XYZ 149.705 753.953 null] +/D [2050 0 R /XYZ 149.705 753.953 null] >> % 573 0 obj << -/D [2049 0 R /XYZ 150.705 716.092 null] +/D [2050 0 R /XYZ 150.705 716.092 null] >> -% 2048 0 obj +% 2049 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 2057 0 obj +% 2058 0 obj << /Type /Page -/Contents 2058 0 R -/Resources 2056 0 R +/Contents 2059 0 R +/Resources 2057 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2035 0 R -/Annots [ 2052 0 R 2053 0 R 2054 0 R 2055 0 R ] +/Parent 2036 0 R +/Annots [ 2053 0 R 2054 0 R 2055 0 R 2056 0 R ] >> -% 2052 0 obj +% 2053 0 obj << /Type /Annot /Subtype /Link @@ -30247,7 +30287,7 @@ stream /Rect [320.317 573.77 392.605 585.83] /A << /S /GoTo /D (precdata) >> >> -% 2053 0 obj +% 2054 0 obj << /Type /Annot /Subtype /Link @@ -30255,7 +30295,7 @@ stream /Rect [320.317 430.308 392.605 442.368] /A << /S /GoTo /D (precdata) >> >> -% 2054 0 obj +% 2055 0 obj << /Type /Annot /Subtype /Link @@ -30263,7 +30303,7 @@ stream /Rect [129.909 304.779 149.563 316.839] /A << /S /GoTo /D (subsection.12.4) >> >> -% 2055 0 obj +% 2056 0 obj << /Type /Annot /Subtype /Link @@ -30271,29 +30311,29 @@ stream /Rect [172.161 304.779 184.246 316.839] /A << /S /GoTo /D (section.13) >> >> -% 2059 0 obj +% 2060 0 obj << -/D [2057 0 R /XYZ 98.895 753.953 null] +/D [2058 0 R /XYZ 98.895 753.953 null] >> % 577 0 obj << -/D [2057 0 R /XYZ 99.895 716.092 null] +/D [2058 0 R /XYZ 99.895 716.092 null] >> -% 2056 0 obj +% 2057 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 2064 0 obj +% 2065 0 obj << /Type /Page -/Contents 2065 0 R -/Resources 2063 0 R +/Contents 2066 0 R +/Resources 2064 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2035 0 R -/Annots [ 2060 0 R 2061 0 R 2062 0 R ] +/Parent 2036 0 R +/Annots [ 2061 0 R 2062 0 R 2063 0 R ] >> -% 2060 0 obj +% 2061 0 obj << /Type /Annot /Subtype /Link @@ -30301,7 +30341,7 @@ stream /Rect [371.126 561.815 443.414 573.875] /A << /S /GoTo /D (precdata) >> >> -% 2061 0 obj +% 2062 0 obj << /Type /Annot /Subtype /Link @@ -30309,7 +30349,7 @@ stream /Rect [371.126 486.099 443.414 498.159] /A << /S /GoTo /D (precdata) >> >> -% 2062 0 obj +% 2063 0 obj << /Type /Annot /Subtype /Link @@ -30317,50 +30357,50 @@ stream /Rect [443.742 396.435 463.169 408.495] /A << /S /GoTo /D (subsection.10.8) >> >> -% 2066 0 obj +% 2067 0 obj << -/D [2064 0 R /XYZ 149.705 753.953 null] +/D [2065 0 R /XYZ 149.705 753.953 null] >> % 581 0 obj << -/D [2064 0 R /XYZ 150.705 716.092 null] +/D [2065 0 R /XYZ 150.705 716.092 null] >> -% 2063 0 obj +% 2064 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 2068 0 obj +% 2069 0 obj << /Type /Page -/Contents 2069 0 R -/Resources 2067 0 R +/Contents 2070 0 R +/Resources 2068 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2071 0 R +/Parent 2072 0 R >> -% 2070 0 obj +% 2071 0 obj << -/D [2068 0 R /XYZ 98.895 753.953 null] +/D [2069 0 R /XYZ 98.895 753.953 null] >> % 585 0 obj << -/D [2068 0 R /XYZ 99.895 716.092 null] +/D [2069 0 R /XYZ 99.895 716.092 null] >> -% 2067 0 obj +% 2068 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> /ProcSet [ /PDF /Text ] >> -% 2076 0 obj +% 2077 0 obj << /Type /Page -/Contents 2077 0 R -/Resources 2075 0 R +/Contents 2078 0 R +/Resources 2076 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2071 0 R -/Annots [ 2072 0 R 2073 0 R ] +/Parent 2072 0 R +/Annots [ 2073 0 R 2074 0 R ] >> -% 2072 0 obj +% 2073 0 obj << /Type /Annot /Subtype /Link @@ -30368,7 +30408,7 @@ stream /Rect [379.973 275.278 386.249 288.868] /A << /S /GoTo /D (Hfootnote.5) >> >> -% 2073 0 obj +% 2074 0 obj << /Type /Annot /Subtype /Link @@ -30376,45 +30416,45 @@ stream /Rect [342.753 134.696 420.271 146.755] /A << /S /GoTo /D (spdata) >> >> -% 2078 0 obj +% 2079 0 obj << -/D [2076 0 R /XYZ 149.705 753.953 null] +/D [2077 0 R /XYZ 149.705 753.953 null] >> % 589 0 obj << -/D [2076 0 R /XYZ 150.705 716.092 null] ->> -% 2079 0 obj -<< -/D [2076 0 R /XYZ 150.705 444.811 null] +/D [2077 0 R /XYZ 150.705 716.092 null] >> % 2080 0 obj << -/D [2076 0 R /XYZ 150.705 444.971 null] +/D [2077 0 R /XYZ 150.705 444.811 null] >> % 2081 0 obj << -/D [2076 0 R /XYZ 150.705 433.015 null] +/D [2077 0 R /XYZ 150.705 444.971 null] >> % 2082 0 obj << -/D [2076 0 R /XYZ 165.051 129.79 null] +/D [2077 0 R /XYZ 150.705 433.015 null] >> -% 2075 0 obj +% 2083 0 obj +<< +/D [2077 0 R /XYZ 165.051 129.79 null] +>> +% 2076 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F192 942 0 R /F190 941 0 R /F148 1490 0 R /F145 940 0 R >> /ProcSet [ /PDF /Text ] >> -% 2087 0 obj +% 2088 0 obj << /Type /Page -/Contents 2088 0 R -/Resources 2086 0 R +/Contents 2089 0 R +/Resources 2087 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2071 0 R -/Annots [ 2074 0 R 2083 0 R 2084 0 R 2085 0 R ] +/Parent 2072 0 R +/Annots [ 2075 0 R 2084 0 R 2085 0 R 2086 0 R ] >> -% 2074 0 obj +% 2075 0 obj << /Type /Annot /Subtype /Link @@ -30422,7 +30462,7 @@ stream /Rect [291.943 654.503 364.232 666.562] /A << /S /GoTo /D (precdata) >> >> -% 2083 0 obj +% 2084 0 obj << /Type /Annot /Subtype /Link @@ -30430,7 +30470,7 @@ stream /Rect [342.493 584.479 418.548 596.539] /A << /S /GoTo /D (vdata) >> >> -% 2084 0 obj +% 2085 0 obj << /Type /Annot /Subtype /Link @@ -30438,7 +30478,7 @@ stream /Rect [342.493 514.456 418.548 526.516] /A << /S /GoTo /D (vdata) >> >> -% 2085 0 obj +% 2086 0 obj << /Type /Annot /Subtype /Link @@ -30446,25 +30486,25 @@ stream /Rect [291.943 374.41 359.001 386.47] /A << /S /GoTo /D (descdata) >> >> -% 2089 0 obj +% 2090 0 obj << -/D [2087 0 R /XYZ 98.895 753.953 null] +/D [2088 0 R /XYZ 98.895 753.953 null] >> -% 2086 0 obj +% 2087 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R /F78 686 0 R /F192 942 0 R /F190 941 0 R /F148 1490 0 R >> /ProcSet [ /PDF /Text ] >> -% 2092 0 obj +% 2093 0 obj << /Type /Page -/Contents 2093 0 R -/Resources 2091 0 R +/Contents 2094 0 R +/Resources 2092 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2071 0 R -/Annots [ 2090 0 R ] +/Parent 2072 0 R +/Annots [ 2091 0 R ] >> -% 2090 0 obj +% 2091 0 obj << /Type /Annot /Subtype /Link @@ -30472,25 +30512,25 @@ stream /Rect [393.303 554.876 469.357 566.936] /A << /S /GoTo /D (vdata) >> >> -% 2094 0 obj +% 2095 0 obj << -/D [2092 0 R /XYZ 149.705 753.953 null] +/D [2093 0 R /XYZ 149.705 753.953 null] >> -% 2091 0 obj +% 2092 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 2100 0 obj +% 2101 0 obj << /Type /Page -/Contents 2101 0 R -/Resources 2099 0 R +/Contents 2102 0 R +/Resources 2100 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2071 0 R -/Annots [ 2095 0 R 2096 0 R 2097 0 R ] +/Parent 2072 0 R +/Annots [ 2096 0 R 2097 0 R 2098 0 R ] >> -% 2095 0 obj +% 2096 0 obj << /Type /Annot /Subtype /Link @@ -30498,7 +30538,7 @@ stream /Rect [291.943 253.023 369.462 265.083] /A << /S /GoTo /D (spdata) >> >> -% 2096 0 obj +% 2097 0 obj << /Type /Annot /Subtype /Link @@ -30506,7 +30546,7 @@ stream /Rect [291.943 184.772 364.232 196.831] /A << /S /GoTo /D (precdata) >> >> -% 2097 0 obj +% 2098 0 obj << /Type /Annot /Subtype /Link @@ -30514,41 +30554,41 @@ stream /Rect [342.493 116.52 418.548 128.58] /A << /S /GoTo /D (vdata) >> >> -% 2102 0 obj +% 2103 0 obj << -/D [2100 0 R /XYZ 98.895 753.953 null] +/D [2101 0 R /XYZ 98.895 753.953 null] >> % 593 0 obj << -/D [2100 0 R /XYZ 99.895 716.092 null] ->> -% 2103 0 obj -<< -/D [2100 0 R /XYZ 99.895 397.916 null] +/D [2101 0 R /XYZ 99.895 716.092 null] >> % 2104 0 obj << -/D [2100 0 R /XYZ 99.895 398.076 null] +/D [2101 0 R /XYZ 99.895 397.916 null] >> % 2105 0 obj << -/D [2100 0 R /XYZ 99.895 386.121 null] +/D [2101 0 R /XYZ 99.895 398.076 null] >> -% 2099 0 obj +% 2106 0 obj +<< +/D [2101 0 R /XYZ 99.895 386.121 null] +>> +% 2100 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F192 942 0 R /F190 941 0 R /F148 1490 0 R /F145 940 0 R >> /ProcSet [ /PDF /Text ] >> -% 2109 0 obj +% 2110 0 obj << /Type /Page -/Contents 2110 0 R -/Resources 2108 0 R +/Contents 2111 0 R +/Resources 2109 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2071 0 R -/Annots [ 2098 0 R 2106 0 R 2107 0 R ] +/Parent 2072 0 R +/Annots [ 2099 0 R 2107 0 R 2108 0 R ] >> -% 2098 0 obj +% 2099 0 obj << /Type /Annot /Subtype /Link @@ -30556,7 +30596,7 @@ stream /Rect [393.303 654.503 469.357 666.562] /A << /S /GoTo /D (vdata) >> >> -% 2106 0 obj +% 2107 0 obj << /Type /Annot /Subtype /Link @@ -30564,7 +30604,7 @@ stream /Rect [342.753 520.007 409.811 532.067] /A << /S /GoTo /D (descdata) >> >> -% 2107 0 obj +% 2108 0 obj << /Type /Annot /Subtype /Link @@ -30572,63 +30612,63 @@ stream /Rect [393.303 183.768 469.357 195.827] /A << /S /GoTo /D (vdata) >> >> -% 2111 0 obj +% 2112 0 obj << -/D [2109 0 R /XYZ 149.705 753.953 null] +/D [2110 0 R /XYZ 149.705 753.953 null] >> -% 2108 0 obj +% 2109 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R /F78 686 0 R /F192 942 0 R /F190 941 0 R /F148 1490 0 R >> /ProcSet [ /PDF /Text ] >> -% 2113 0 obj +% 2114 0 obj << /Type /Page -/Contents 2114 0 R -/Resources 2112 0 R +/Contents 2115 0 R +/Resources 2113 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2116 0 R +/Parent 2117 0 R >> -% 2115 0 obj +% 2116 0 obj << -/D [2113 0 R /XYZ 98.895 753.953 null] +/D [2114 0 R /XYZ 98.895 753.953 null] >> -% 2112 0 obj +% 2113 0 obj << /Font << /F75 685 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 2124 0 obj +% 2125 0 obj << /Type /Page -/Contents 2125 0 R -/Resources 2123 0 R +/Contents 2126 0 R +/Resources 2124 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2116 0 R -/Annots [ 2117 0 R 2127 0 R 2118 0 R 2119 0 R 2120 0 R 2121 0 R 2122 0 R ] +/Parent 2117 0 R +/Annots [ 2118 0 R 2128 0 R 2119 0 R 2120 0 R 2121 0 R 2122 0 R 2123 0 R ] >> -% 2117 0 obj +% 2118 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [368.938 636.522 495.412 648.582] /Subtype/Link/A<> >> -% 2127 0 obj +% 2128 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [174.615 624.567 218.45 636.627] /Subtype/Link/A<> >> -% 2118 0 obj +% 2119 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [191.223 593.098 397.198 605.158] /Subtype/Link/A<> >> -% 2119 0 obj +% 2120 0 obj << /Type /Annot /Subtype /Link @@ -30636,7 +30676,7 @@ stream /Rect [280.59 552.835 292.545 561.841] /A << /S /GoTo /D (cite.DesPat:11) >> >> -% 2120 0 obj +% 2121 0 obj << /Type /Annot /Subtype /Link @@ -30644,7 +30684,7 @@ stream /Rect [296.203 552.835 308.158 561.692] /A << /S /GoTo /D (cite.CaFiRo:2014) >> >> -% 2121 0 obj +% 2122 0 obj << /Type /Annot /Subtype /Link @@ -30652,7 +30692,7 @@ stream /Rect [311.815 552.835 323.771 561.841] /A << /S /GoTo /D (cite.Sparse03) >> >> -% 2122 0 obj +% 2123 0 obj << /Type /Annot /Subtype /Link @@ -30660,33 +30700,33 @@ stream /Rect [209.414 540.781 221.369 549.737] /A << /S /GoTo /D (cite.OurTechRep) >> >> -% 2126 0 obj +% 2127 0 obj << -/D [2124 0 R /XYZ 149.705 753.953 null] +/D [2125 0 R /XYZ 149.705 753.953 null] >> % 597 0 obj << -/D [2124 0 R /XYZ 150.705 716.092 null] +/D [2125 0 R /XYZ 150.705 716.092 null] >> % 601 0 obj << -/D [2124 0 R /XYZ 150.705 525.151 null] +/D [2125 0 R /XYZ 150.705 525.151 null] >> -% 2123 0 obj +% 2124 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R /F78 686 0 R /F233 1044 0 R >> /ProcSet [ /PDF /Text ] >> -% 2138 0 obj +% 2139 0 obj << /Type /Page -/Contents 2139 0 R -/Resources 2137 0 R +/Contents 2140 0 R +/Resources 2138 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2116 0 R -/Annots [ 2130 0 R 2131 0 R 2133 0 R ] +/Parent 2117 0 R +/Annots [ 2131 0 R 2132 0 R 2134 0 R ] >> -% 2130 0 obj +% 2131 0 obj << /Type /Annot /Subtype /Link @@ -30694,7 +30734,7 @@ stream /Rect [121.315 282.067 133.27 291.173] /A << /S /GoTo /D (cite.MRC:11) >> >> -% 2131 0 obj +% 2132 0 obj << /Type /Annot /Subtype /Link @@ -30702,7 +30742,7 @@ stream /Rect [253.836 246.183 265.791 255.592] /A << /S /GoTo /D (table.22) >> >> -% 2133 0 obj +% 2134 0 obj << /Type /Annot /Subtype /Link @@ -30710,53 +30750,53 @@ stream /Rect [310.367 176.296 317.241 188.355] /A << /S /GoTo /D (figure.6) >> >> -% 2140 0 obj +% 2141 0 obj << -/D [2138 0 R /XYZ 98.895 753.953 null] +/D [2139 0 R /XYZ 98.895 753.953 null] >> % 606 0 obj << -/D [2138 0 R /XYZ 99.895 349.244 null] +/D [2139 0 R /XYZ 99.895 349.244 null] >> % 610 0 obj << -/D [2138 0 R /XYZ 99.895 231.907 null] +/D [2139 0 R /XYZ 99.895 231.907 null] >> -% 2141 0 obj +% 2142 0 obj << -/D [2138 0 R /XYZ 99.895 211.056 null] +/D [2139 0 R /XYZ 99.895 211.056 null] >> -% 2142 0 obj +% 2143 0 obj << -/D [2138 0 R /XYZ 99.895 120.166 null] +/D [2139 0 R /XYZ 99.895 120.166 null] >> -% 2137 0 obj +% 2138 0 obj << -/Font << /F279 1814 0 R /F233 1044 0 R /F84 687 0 R /F145 940 0 R /F75 685 0 R /F78 686 0 R >> +/Font << /F279 1815 0 R /F233 1044 0 R /F84 687 0 R /F145 940 0 R /F75 685 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 2147 0 obj +% 2148 0 obj << /Type /Page -/Contents 2148 0 R -/Resources 2146 0 R +/Contents 2149 0 R +/Resources 2147 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2116 0 R -/Annots [ 2136 0 R ] +/Parent 2117 0 R +/Annots [ 2137 0 R ] >> -% 2153 0 obj +% 2154 0 obj << /Producer (GPL Ghostscript 9.10) /CreationDate (D:20140329133929+01'00') /ModDate (D:20140329133929+01'00') /Creator (cairo 1.13.1 \(http://cairographics.org\)) >> -% 2154 0 obj +% 2155 0 obj << /Type /ExtGState /OPM 1 >> -% 2136 0 obj +% 2137 0 obj << /Type /Annot /Subtype /Link @@ -30764,52 +30804,72 @@ stream /Rect [170.554 324.049 177.543 336.109] /A << /S /GoTo /D (algocf.1) >> >> -% 2149 0 obj -<< -/D [2147 0 R /XYZ 149.705 753.953 null] ->> -% 2144 0 obj +% 2150 0 obj << -/D [2147 0 R /XYZ 150.705 716.092 null] +/D [2148 0 R /XYZ 149.705 753.953 null] >> -% 2150 0 obj +% 2145 0 obj << -/D [2147 0 R /XYZ 397.506 407.446 null] +/D [2148 0 R /XYZ 150.705 716.092 null] >> % 2151 0 obj << -/D [2147 0 R /XYZ 150.705 260.219 null] +/D [2148 0 R /XYZ 397.506 407.446 null] >> % 2152 0 obj << -/D [2147 0 R /XYZ 150.705 226.207 null] +/D [2148 0 R /XYZ 150.705 260.219 null] >> -% 2146 0 obj +% 2153 0 obj +<< +/D [2148 0 R /XYZ 150.705 226.207 null] +>> +% 2147 0 obj << /Font << /F84 687 0 R /F78 686 0 R /F192 942 0 R /F145 940 0 R >> -/XObject << /Im6 2132 0 R >> +/XObject << /Im6 2133 0 R >> /ProcSet [ /PDF /Text ] >> -% 2158 0 obj +% 2159 0 obj << /Type /Page -/Contents 2159 0 R -/Resources 2157 0 R +/Contents 2160 0 R +/Resources 2158 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2116 0 R -/Annots [ 2135 0 R ] +/Parent 2117 0 R +/Annots [ 2136 0 R ] >> -% 2170 0 obj + +endstream +endobj +2135 0 obj << -/Producer (GPL Ghostscript 9.10) -/CreationDate (D:20140329133928+01'00') -/ModDate (D:20140329133928+01'00') -/Creator (cairo 1.13.1 \(http://cairographics.org\)) +/Type /XObject +/Subtype /Form +/FormType 1 +/PTEX.FileName (./figures/ell.pdf) +/PTEX.PageNumber 1 +/PTEX.InfoDict 2171 0 R +/BBox [0 0 447 205] +/Resources << +/ProcSet [ /PDF /ImageC /Text ] +/ExtGState << +/R7 2172 0 R +>>/XObject << +/R8 2173 0 R +>>/Font << /R9 2174 0 R/R11 2175 0 R>> >> - +/Length 2281 +/Filter /FlateDecode +>> +stream +xœÝYËŠ%¹ÝçWäÎU‹’õ~,ÛØoº§À˜Á«kOý6=^ø÷!Å )E—™M3Pôâv…â)ŒÌúrZãNËÿä÷ö8~ÿ©œŸÿs|9Zñ&”vúêM +î|-7¬;}¡ßâΖ‹)…Äd²_Dg|¨çí³©]]¶ç`l©§:HÍ4Çúd(f²)‰Ö›ñŽÅd)´Lš"é×bZ^š3ÅÍý-’ßÕ~«Æ¦%€ÖLŽuyf ˆ¤ ¨\Hx‡ÄPiGZb¤_NIˆÈIK–P@``kÃMã8¯Ø–Æ8N¼6tÂ%Ê3L1V“óì‹‹Ñø®-»£5Iý¹@ñøº´Å…h\ñڼɶ!%ˆ³/ª 5QRµÅ…ÔUBªk€*#HÛ‘?H…f[µÞùÙ—cÇ‘ƒˆ³-ª€"ÀÀÖ„ÙNª¸õ¾PÚÞYíC°&²i½»]ï‹3¹»D_(Ô®—QveíŒ3©¶ª¡j¥ÂJVggTenº@in‚Ô;¤Y¢iŠ­‚ø@fs¸ùa¹3Ñg]FgsTAê ¶VÜŽ¿žÿ¢òÚÓ“+nßãpÖNñ>Ä.Pˆ÷®;¥Ÿú~R·‘À@»c,S¼‘õ ócß—3‘õίޓÞKH…NùK®ÄR1 Ò­çÿ}|¤_Ži½,¼K@4y²ÉtҔÁ[г©a>¸3†˜-Ý0'‰ÑÄI¬$W²³Poˆ%Rè*NÕ¿Ú§†¼ø¯‘ÎÓŸÈK@£XÐ ÊŠð¦F(¼ª9(ój–ScA-\úpCc&à”¼¤2ˆkƒÙÔ@ç=ØWZDD ND bEN“z‘õÔU™zÙV£®ˆ`T}ÆY@3”íZa_YQÞÔ…W5e^MrjŒ"¨…K´-“wQU0ªFš·œ¥ˆ°šöEX>•5(!N bEZ“z‘øÔ¨…Q¹Å…”Vc¡1âÍ,2ófº‹ÉŠˆ¼‰Á«Èb2/ò\4z¦…K/ñ¸2oˆmeÞ.N®íÊ;õzç‹©îW0´¯4Lè¯eð®úÿI¼û GÌ,Nûÿ{PeZ®D‡>ÝùR2³áƒ…ûÿïÇ÷$]×.‹¹¬‹,-‹­­‹,-‹.¸uµ‹ër¾„ÔÅu¹]¢êâ²ìRÎðŒNUšJ¬bÏ’Ö%‘Æ’³e]ƒ(‹Ñ^E”Åâ/‹"ö "Y¡–EÛ(:ß{œ/ȪUâ®dÕr63¸h¹h…¶k rÑ¢[»i ÒµøÄøäø8ÑÜ i ®Ù®Z‚¬Z9úb ÈE+ò#÷¢%ÈE«Ô-. «V¤Ú\m¹hE¿ÅdÕ¢7Rëyl´Æ6ky`d(µTÎ_>Ó”äÆe”ŸÛãüÃ+]@zšÇóõÇc¼ÎòÀC׸ËÆl’¥¥Çñäž_&û‰ž_6Ó4å™äõ²xnôë_Ž'ÿü»ãeÑõüÔº¡ë:9¶Fæ=Q/xؾ±_ýÜã ¼•†Ý¾Pyá…êN†ŸhÇž(~Jò7õ+n$Ö­ÑLÜxxÑ„8CÛÍyS¨ÚׄÆÒ ]¨¾f;XûÓkL'/ƒ<íùË?O¦G7øîíž}"´Ö„ÄÃ5ž^ B‡Üò|IgÊñ8D7†*ãm‘7Ó!ßGó&?-8ÇkšX˜òðA;€doië©r¦¹®L"ßBR,ìyÜèÁÔôùÈ.~‹²ô-ü &gjg*±ûªŽêR㙼'ƒS¾|÷È$j­¡ìöI]žVè*ÉîFÇ„Ÿ#0ùv Xöoñߎß_JÜ«F>,¿kV@V¥w‚è½FÍüjý’U¡Q‹/Bñ ö‹8ݰ°Q‹ý™¢!‹=îÕ»L‹ûå|L†»O/ÉsbŠøj p4°žbÍ&z½p‰î®ŠLÖf.(Åí$}6Os¸XÈ…_­\@¤ ƒ*HŒj`Ë‚[ö^3[oÙÌM §¡Ëq™¹á<‘ã†ýÕ­ˆ Û·ØŸ‰! öÖ[ö®Òâ~ UμHX`ZD .žy Y*Ç~ˆêTD%»4ÌÏ´‰û·ø—§×ûI‰û„ùcf¥ˆ„… QcÆYHC¦ É*cJRÒ€G ;É¿õ©˜Ï@3~ýZL²kÄÅŽÿ8EÜóú8~xúðìÓ÷ç‡OŸž_([zR6 +Íy-?ýíùï¯ßñGz·5®„ùËéOß}àMžså¾Atû·ÔÇÿ|THF endstream endobj -2172 0 obj +2173 0 obj << /Subtype /Image /ColorSpace /DeviceGray @@ -30828,7 +30888,7 @@ stream ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ;Y¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà endstream endobj -2177 0 obj +2178 0 obj << /Filter /FlateDecode /Length 171 @@ -30837,7 +30897,7 @@ stream xœ]Mƒ F÷œ‚àOÛĸ±mš¶Àa0,‚¸èí; vфߛ|ˆ~¸ÖD.ÁÁ #ׯª€‹[ q2–•WâNy‡Yz&ú›ôïGNÔßåŒâYžóM¹9à.^i'dmQt­ÖC«þžªMõž¬)YŸ:2èDØ^26Y?‚iRªt4à°†€6æÞ¹Wêc,þ¾æO§Å¾=+V endstream endobj -2179 0 obj +2180 0 obj << /Filter /FlateDecode /Length 191 @@ -30847,7 +30907,7 @@ x â ±—Uˆ}íuT-mËüǸT¯)ÏuɺDÞyøýC ±¸(Š|iÑ_À endstream endobj -2180 0 obj +2181 0 obj << /Filter /FlateDecode /Length1 11124 @@ -30896,7 +30956,7 @@ B “žÑ endstream endobj -2181 0 obj +2182 0 obj << /Filter /FlateDecode /Length1 3512 @@ -30912,7 +30972,7 @@ a lþ'÷uþoL|E÷¾r«Ço¸ß9®ñߺӣú¾Á( endstream endobj -2188 0 obj +2189 0 obj << /Length 8640 >> @@ -31080,20 +31140,20 @@ ET endstream endobj -2182 0 obj +2183 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (../figures/hll.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 2192 0 R +/PTEX.InfoDict 2193 0 R /BBox [0 0 494 214] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << -/R7 2193 0 R ->>/Font << /R8 2194 0 R/R10 2195 0 R>> +/R7 2194 0 R +>>/Font << /R8 2195 0 R/R10 2196 0 R>> >> /Length 2880 /Filter /FlateDecode @@ -31115,7 +31175,7 @@ l Ù<øÇ×O?Ó‚•2.šg9_ÿ*×Ps ŸOøYT¨•®U¼v²rƈºŸÂãSóøbzh”8†Ñ½ÂXZÊü°ó`—ú矆@8èwàô)aÿ…¢ªküœËEvëñ»›šK°|dG˜s%´D YšVòÔ@( ázé‹ñCüÿæ×¬á¿8Ç7•xVÇ‹ éÑi3kè4½ðw(Ölú¸V*|ik¬Ô¦âÓ*økµøåÀ—žÑÑ÷K•_á•Box:ÀÀ¯¿Æë‘HÏ+x´“êˆÆi[‡;¬<ž¿Á²ÐùÅ+i œ°ùŸø`8¼=ÿ³·‡ endstream endobj -2197 0 obj +2198 0 obj << /Filter /FlateDecode /Length 214 @@ -31124,7 +31184,7 @@ stream xœ]Á‚0 †ï{нÁ@²ì¢£¾ÀÙ±L<øö¶EOK šp#Ý&ÉQZ]ŒV«ÓqA« ×͈ÆãøÝn ¸G6ЍÑë4(„‡ ÇéÍÍé~¹R6èõ&Ž{øaÎxÿ.[±D½˜ÐK·ÈQ7idZñ?:õ;> @@ -31522,20 +31582,20 @@ ET endstream endobj -2204 0 obj +2205 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/dia.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 2213 0 R +/PTEX.InfoDict 2214 0 R /BBox [0 0 499 211] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << -/R7 2214 0 R ->>/Font << /R8 2215 0 R/R10 2216 0 R>> +/R7 2215 0 R +>>/Font << /R8 2216 0 R/R10 2217 0 R>> >> /Length 2502 /Filter /FlateDecode @@ -31553,7 +31613,7 @@ $ rca™ñ8ÏzD—‹bH…°d'¥¢šÃ\LÀ/ó¹¬1ÙŒ,0F c¨)T#  7Ì,¥j7ß%Î¥šäÛæ›RÙ6ßq4›/ÉÙ¸g]åû\¦—×\ÃW\¬ò+3,êmó½Lr´›ïJŽ·Í7ñÅÓÐÈþ¶ù&þ?9³ù.y’QQШ» Ñ•Œ&Gs¼m¾7ì“LÏ‹I7=šûmóM¹m›/]”o›/ÉvóUQxT»ù._àlÛæ»òâ›QUÔÌá×.Ü$Rg{çæñÊØcé‚Lçúqçþú1º‡ç×><>¾bûJ:ªŠÞËÃ_ƽ:dº’·p>yºovª†ç¿‘ã¿ûîã·ÏÓ‘¯ì-u„縑óß¿Ë&& endstream endobj -2218 0 obj +2219 0 obj << /Filter /FlateDecode /Length 177 @@ -31563,7 +31623,7 @@ x ¢t s1#8ý÷ÕUÃlŽÉV‹"α’¡Cc×fÄb/Šû²íôåÅ9ሪ=Fp©œQbæxÖÁïÒàCvQùðY¢ endstream endobj -2220 0 obj +2221 0 obj << /Filter /FlateDecode /Length 197 @@ -31572,7 +31632,7 @@ stream xœ]Mƒ …÷œ‚ˆFmL»qѦi{ÄÁ° ꢷï0j]¼ Ìß#k»kçÝʳGœÍ Vn",ó ðFçY^ðÁ™õ ŠfÒeíM‡÷'ǰ;ßõÙ3¿ÐM¾×˜y€%hQû˜BIk?ü=Õ{AoÌ3“„ÀÈd™+’+Äš°Jh ›ËªP²*â ±Q$ĆFŸCÒÉι=7[ŒàWòLž’çá÷-a©Š£ØsÇbã endstream endobj -2221 0 obj +2222 0 obj << /Filter /FlateDecode /Length1 9528 @@ -31606,7 +31666,7 @@ E ó˜Ÿó_ ù[ØCÛ×,š0Z­ÊþÛ Ê+é×…¬Ã¿]úi ^gù\Þo´ùȯ›‰ò'/! `¢ìÁŠàÆ?GÿÁžÿ…&X‘³œ‰çI,¯ÖÆåbøQ ~¼ü÷8É߇㈭^×Ô:·éÛ š×ÕßZ½pÎ"£'ÛõDÊrms#×0F~6Mc£øÓ´ÎåBi6U ¯éÿðȾü?ôèGNÔÙý_XR‡=ñÑè—$=zC/]l»¼ÃQd‰E3ꊭÿîi endstream endobj -2222 0 obj +2223 0 obj << /Filter /FlateDecode /Length1 4304 @@ -31632,7 +31692,7 @@ Hp —øï}Ø».|wy endstream endobj -2227 0 obj +2228 0 obj << /Length 9674 >> @@ -31859,22 +31919,22 @@ ET endstream endobj -2223 0 obj +2224 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (../figures/hdia.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 2230 0 R +/PTEX.InfoDict 2231 0 R /BBox [0 0 556 211] /Resources << /ProcSet [ /PDF /ImageC /Text ] /ExtGState << -/R7 2231 0 R +/R7 2232 0 R >>/XObject << -/R8 2232 0 R ->>/Font << /R9 2233 0 R/R11 2234 0 R>> +/R8 2233 0 R +>>/Font << /R9 2234 0 R/R11 2235 0 R>> >> /Length 3027 /Filter /FlateDecode @@ -31891,7 +31951,7 @@ mC àÕÀ–ÅèÚWšÙ‡ñZ1m¹©†CË8?¬¹e—¶Ühc·æÖó57‘-7ÖhhlABg–›Ä ŽQ ìYP×¾ÖÌÆZkaðfÃÞ%÷1#YSñüõtÃIoÃ`·FzT#Ô:ž©""ÒÒw+ ÄÁíj€eqA#Xƒ#͸g =з‰ 1€cP€D-¶,ÆZûJ3k-Í^Zn¢‘Ðrœ³ABÏqLË-‡9Ÿæ|S,›cÕphbABg–›Ä ‰Z lYŒµö•fF]æf^˜ò¨gÚ8ų7ÕÄŠýlT3"ª± Ú¿þV)Z?·¾ãf̺¡1Ö°X]]ƒùLÈ¿†ÙYáKjÏ¢ÖKedjˆ›<Ÿ®ð/o•¢‡‹í—çÛ>úéÆÅPó\+u¿Uóq™¿¨Ùñ¼(q|KàcÉtõ¼h|¤;ÓDŸ8TÜè3¦ÆÃYË«HŒÇŠ”Û+½’¬Q‹‰n¨û±ûìþǨÙ¡k£1*R$¢™®`˜jš“†Òè •f‘ª,vU#žÅûØ}JoÒ|íYÖ„5%sMè%Çxé?k‚SW-"RMXQ»Ö„G°Æ|d®ÉÕ§Ô„ì5kšéŠjÒãéÕwjt·n²¨VUÁne4;Ørô!”6t„A· ¡Y!éeB±:³h ¬yâJà×:ùD#†R[Dï°a§˜Ì–Isµ<H«eÕðd¡ èm8Ï% P§õ§#Þ´Ï·màxG¼ÎZË‘ýn9s…#Àƒjõ§á‚N5‚ÌcG,r©™®Çum”Ò|ûi¬½–»8¾PÃôE!øæ*]Šâ ÛæGR,_#ù¬ÝÍ?fCésöâÄñßâÝ´Ï·}$½”Ç®`Ly®…ÈR+Q—æ#­ÍK³ÙzT&zµ)ŠH_x6£=“¥O±ôù¢Og„ixLEð8•ˆÉ«KŽc³2žÙOO¦áU ¡òjSÃJ[êYâE,l^yÖÑgeƒ”´Ø¢þð™‰o² }DêBtôú§ëÏÎ'ºÖÑ"ý¨†ù‡Ç +Š}–éæƒ„†Ì¶fbôBÍ™þïñùøÍÃí›7ýéxøñ6¿qžßŸ`Ú dœöPÀ‡çÛ{õð›Ïø%¥ƒ^w¬ã_îÎ…)ôzÜãÉŽ-îú ƒʪ#Oú! smèéRßa÷ý»;ÿê¾aÃì\º«¯þúð‡Û=–ŒsØï®†ßÝݦ@ïwñÕ}Íî.ã?„NC ¬Ô,PŒ˜{¤ …áÛÔ…öJŸ«÷ôº8¬å¹×ô}¯ ÏHzw÷û׿ýãñ§ï¾{‹ÀU­áîÛ‡}±£ÇÀ„nbURA4Ûƒãǹ@7ú#Ãׯ"íW}¼{{¼~ófZÍÍã‡êðg)wæG?Üþ4º‘ endstream endobj -2232 0 obj +2233 0 obj << /Subtype /Image /ColorSpace /DeviceGray @@ -31910,7 +31970,7 @@ stream ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 0l?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü@ endstream endobj -2236 0 obj +2237 0 obj << /Filter /FlateDecode /Length 177 @@ -31919,7 +31979,7 @@ stream xœ]1à EwNÁ €0´C”%]24ªÚ^€€‰ˆ¡·/8I‡¶ülë›õÃmð.SöHA¿ Së¼I°†-i ÌÎÑPãt>³^T$¬¿«øþD eìΣZ€=Å;b×è``JCR~ÒrÞµÖv¼ùÉ]0Ùc³1ç%“V¡KUP¼ J¼vêêáêð4Dõ–øŒo ÍjÏyø}C¬*Z‚|ïY› endstream endobj -2238 0 obj +2239 0 obj << /Filter /FlateDecode /Length 213 @@ -31931,7 +31991,7 @@ e ¦Y$àÅcÂß ó”yJê Ûál« endstream endobj -2239 0 obj +2240 0 obj << /Filter /FlateDecode /Length1 10604 @@ -31965,7 +32025,7 @@ b YÑF.þÎ X°bÍÒιKo˜ß¾¦ùúÚº9 ô,p÷xýÿÍg¼²xή`ŒÿK)ÄDÀl;Áy‚jö8Ô­ƒ¨[ßÿáí°×þÒï=2ØdqmŒëøá“žôèÕðÃú‹;­EÆP%ï÷ÿ=X endstream endobj -2240 0 obj +2241 0 obj << /Filter /FlateDecode /Length1 5080 @@ -31986,7 +32046,7 @@ Y2 pÓÇ}3ÇóyØà.”pÄ€×ÏôÁ›ýÿâqÁ%§t1Þ®onb©³eæÑM¸éÃáË0÷ǵ3kçéD ^ðoÛw# çô°'Ì?¸²rtåÁ3÷9#§þëò¾W|ÞÞ|¢ûïš«A†ûD¸Ÿàûe0¹bÎxõ¯`}u¤¸%üžÄ÷÷ðý\3“¹ÙZŸ­¾eÓ?¼|Odò?¸¯ðo2õU3ðÜÖÿãÿ­ðÿÍWúßÓ )' endstream endobj -2243 0 obj +2244 0 obj << /Length 1097 >> @@ -32046,7 +32106,7 @@ ET endstream endobj -2247 0 obj +2248 0 obj << /Length 7873 >> @@ -32113,7 +32173,7 @@ ET endstream endobj -2251 0 obj +2252 0 obj << /Length 5844 >> @@ -32216,7 +32276,7 @@ ET endstream endobj -2256 0 obj +2257 0 obj << /Length 5432 >> @@ -32404,7 +32464,7 @@ ET endstream endobj -2260 0 obj +2261 0 obj << /Length 2725 >> @@ -32508,7 +32568,7 @@ ET endstream endobj -2265 0 obj +2266 0 obj << /Length 81 >> @@ -32523,7 +32583,7 @@ ET endstream endobj -2269 0 obj +2270 0 obj << /Length 7303 >> @@ -32587,52 +32647,59 @@ ET endstream endobj -2175 0 obj +2176 0 obj << /Type /ObjStm /N 100 -/First 985 -/Length 11845 ->> -stream -2171 0 2173 43 2174 248 2176 537 2178 758 2135 971 2160 1117 2145 1175 2161 1234 2162 1293 -2163 1352 2164 1411 2165 1470 2166 1529 2167 1588 2168 1646 2156 1705 2169 1764 2157 1822 2187 2017 -2192 2174 2193 2354 2194 2397 2195 2700 2196 2905 2198 3118 2183 3339 2184 3486 2185 3633 2189 3780 -2190 3839 2191 3897 2186 3956 2207 4166 2213 4305 2214 4485 2215 4528 2216 4729 2217 5024 2219 5245 -2205 5458 2209 5604 2202 5662 2210 5721 2203 5779 2211 5838 2206 5896 2226 6050 2230 6189 2231 6369 -2233 6412 2234 6619 2235 6920 2237 7141 2224 7354 2228 7501 2229 7560 2225 7619 2242 7801 2244 7919 -2241 7977 2246 8060 2248 8178 614 8237 2245 8295 2250 8418 2252 8536 618 8594 622 8650 2253 8707 -626 8765 2249 8822 2255 8917 2257 9035 630 9094 634 9152 638 9210 642 9268 646 9326 650 9384 -654 9442 658 9500 2254 9558 2259 9653 2261 9771 662 9829 666 9886 670 9943 674 10000 2258 10057 -2264 10152 2266 10270 2263 10329 2268 10397 2270 10515 2271 10573 2272 10631 2013 10689 958 10746 957 10803 +/First 989 +/Length 11972 +>> +stream +2171 0 2172 180 2174 223 2175 428 2177 717 2179 938 2136 1151 2161 1297 2146 1355 2162 1414 +2163 1473 2164 1532 2165 1591 2166 1650 2167 1709 2168 1768 2169 1826 2157 1885 2170 1944 2158 2002 +2188 2197 2193 2354 2194 2534 2195 2577 2196 2880 2197 3085 2199 3298 2184 3519 2185 3666 2186 3813 +2190 3960 2191 4019 2192 4077 2187 4136 2208 4346 2214 4485 2215 4665 2216 4708 2217 4909 2218 5204 +2220 5425 2206 5638 2210 5784 2203 5842 2211 5901 2204 5959 2212 6018 2207 6076 2227 6230 2231 6369 +2232 6549 2234 6592 2235 6799 2236 7100 2238 7321 2225 7534 2229 7681 2230 7740 2226 7799 2243 7981 +2245 8099 2242 8157 2247 8240 2249 8358 614 8417 2246 8475 2251 8598 2253 8716 618 8774 622 8830 +2254 8887 626 8945 2250 9002 2256 9097 2258 9215 630 9274 634 9332 638 9390 642 9448 646 9506 +650 9564 654 9622 658 9680 2255 9738 2260 9833 2262 9951 662 10009 666 10066 670 10123 674 10180 +2259 10237 2265 10332 2267 10450 2264 10509 2269 10577 2271 10695 2272 10753 2273 10811 2014 10869 958 10926 % 2171 0 obj << +/Producer (GPL Ghostscript 9.10) +/CreationDate (D:20140329133928+01'00') +/ModDate (D:20140329133928+01'00') +/Creator (cairo 1.13.1 \(http://cairographics.org\)) +>> +% 2172 0 obj +<< /Type /ExtGState /OPM 1 >> -% 2173 0 obj +% 2174 0 obj << /BaseFont /YAZDUX+TimesNewRomanPSMT -/FontDescriptor 2176 0 R -/ToUnicode 2177 0 R +/FontDescriptor 2177 0 R +/ToUnicode 2178 0 R /Type /Font /FirstChar 48 /LastChar 57 /Widths [ 500 500 500 500 500 0 0 500 500 500] /Subtype /TrueType >> -% 2174 0 obj +% 2175 0 obj << /BaseFont /NDNSMY+FreeSerif -/FontDescriptor 2178 0 R -/ToUnicode 2179 0 R +/FontDescriptor 2179 0 R +/ToUnicode 2180 0 R /Type /Font /FirstChar 32 /LastChar 89 /Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 721 0 0 0 0 0 0 0 0 385 0 0 0 0 0 0 0 667 529 0 0 0 0 0 701] /Subtype /TrueType >> -% 2176 0 obj +% 2177 0 obj << /Type /FontDescriptor /FontName /YAZDUX+TimesNewRomanPSMT @@ -32644,9 +32711,9 @@ stream /ItalicAngle 0 /StemV 95 /MissingWidth 777 -/FontFile2 2180 0 R +/FontFile2 2181 0 R >> -% 2178 0 obj +% 2179 0 obj << /Type /FontDescriptor /FontName /NDNSMY+FreeSerif @@ -32658,9 +32725,9 @@ stream /ItalicAngle 0 /StemV 105 /MissingWidth 600 -/FontFile2 2181 0 R +/FontFile2 2182 0 R >> -% 2135 0 obj +% 2136 0 obj << /Type /Annot /Subtype /Link @@ -32668,104 +32735,104 @@ stream /Rect [384.587 583.767 391.56 595.827] /A << /S /GoTo /D (figure.5) >> >> -% 2160 0 obj -<< -/D [2158 0 R /XYZ 98.895 753.953 null] ->> -% 2145 0 obj +% 2161 0 obj << -/D [2158 0 R /XYZ 389.217 621.446 null] +/D [2159 0 R /XYZ 98.895 753.953 null] >> -% 2161 0 obj +% 2146 0 obj << -/D [2158 0 R /XYZ 114.839 563.747 null] +/D [2159 0 R /XYZ 389.217 621.446 null] >> % 2162 0 obj << -/D [2158 0 R /XYZ 114.839 567.034 null] +/D [2159 0 R /XYZ 114.839 563.747 null] >> % 2163 0 obj << -/D [2158 0 R /XYZ 114.839 556.075 null] +/D [2159 0 R /XYZ 114.839 567.034 null] >> % 2164 0 obj << -/D [2158 0 R /XYZ 114.839 545.116 null] +/D [2159 0 R /XYZ 114.839 556.075 null] >> % 2165 0 obj << -/D [2158 0 R /XYZ 114.839 534.158 null] +/D [2159 0 R /XYZ 114.839 545.116 null] >> % 2166 0 obj << -/D [2158 0 R /XYZ 114.839 523.199 null] +/D [2159 0 R /XYZ 114.839 534.158 null] >> % 2167 0 obj << -/D [2158 0 R /XYZ 114.839 512.24 null] +/D [2159 0 R /XYZ 114.839 523.199 null] >> % 2168 0 obj << -/D [2158 0 R /XYZ 114.839 501.281 null] ->> -% 2156 0 obj -<< -/D [2158 0 R /XYZ 114.839 481.057 null] +/D [2159 0 R /XYZ 114.839 512.24 null] >> % 2169 0 obj << -/D [2158 0 R /XYZ 99.895 294.895 null] +/D [2159 0 R /XYZ 114.839 501.281 null] >> % 2157 0 obj << -/Font << /F84 687 0 R /F75 685 0 R /F233 1044 0 R /F279 1814 0 R /F78 686 0 R /F192 942 0 R /F190 941 0 R /F145 940 0 R >> -/XObject << /Im7 2134 0 R >> +/D [2159 0 R /XYZ 114.839 481.057 null] +>> +% 2170 0 obj +<< +/D [2159 0 R /XYZ 99.895 294.895 null] +>> +% 2158 0 obj +<< +/Font << /F84 687 0 R /F75 685 0 R /F233 1044 0 R /F279 1815 0 R /F78 686 0 R /F192 942 0 R /F190 941 0 R /F145 940 0 R >> +/XObject << /Im7 2135 0 R >> /ProcSet [ /PDF /Text ] >> -% 2187 0 obj +% 2188 0 obj << /Type /Page -/Contents 2188 0 R -/Resources 2186 0 R +/Contents 2189 0 R +/Resources 2187 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2116 0 R -/Annots [ 2183 0 R 2184 0 R 2185 0 R ] +/Parent 2117 0 R +/Annots [ 2184 0 R 2185 0 R 2186 0 R ] >> -% 2192 0 obj +% 2193 0 obj << /Producer (GPL Ghostscript 9.10) /CreationDate (D:20140329133928+01'00') /ModDate (D:20140329133928+01'00') /Creator (cairo 1.13.1 \(http://cairographics.org\)) >> -% 2193 0 obj +% 2194 0 obj << /Type /ExtGState /OPM 1 >> -% 2194 0 obj +% 2195 0 obj << /BaseFont /MCSFLP+FreeSerif -/FontDescriptor 2196 0 R -/ToUnicode 2197 0 R +/FontDescriptor 2197 0 R +/ToUnicode 2198 0 R /Type /Font /FirstChar 32 /LastChar 89 /Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 721 0 670 0 610 564 0 714 0 385 709 0 0 0 724 0 0 667 529 606 0 0 0 0 701] /Subtype /TrueType >> -% 2195 0 obj +% 2196 0 obj << /BaseFont /AJRCAD+TimesNewRomanPSMT -/FontDescriptor 2198 0 R -/ToUnicode 2199 0 R +/FontDescriptor 2199 0 R +/ToUnicode 2200 0 R /Type /Font /FirstChar 48 /LastChar 57 /Widths [ 500 500 500 500 500 0 0 500 500 500] /Subtype /TrueType >> -% 2196 0 obj +% 2197 0 obj << /Type /FontDescriptor /FontName /MCSFLP+FreeSerif @@ -32777,9 +32844,9 @@ stream /ItalicAngle 0 /StemV 105 /MissingWidth 600 -/FontFile2 2200 0 R +/FontFile2 2201 0 R >> -% 2198 0 obj +% 2199 0 obj << /Type /FontDescriptor /FontName /AJRCAD+TimesNewRomanPSMT @@ -32791,9 +32858,9 @@ stream /ItalicAngle 0 /StemV 95 /MissingWidth 777 -/FontFile2 2201 0 R +/FontFile2 2202 0 R >> -% 2183 0 obj +% 2184 0 obj << /Type /Annot /Subtype /Link @@ -32801,7 +32868,7 @@ stream /Rect [453.687 426.731 460.661 438.791] /A << /S /GoTo /D (figure.5) >> >> -% 2184 0 obj +% 2185 0 obj << /Type /Annot /Subtype /Link @@ -32809,7 +32876,7 @@ stream /Rect [354.541 176.362 361.575 188.421] /A << /S /GoTo /D (figure.8) >> >> -% 2185 0 obj +% 2186 0 obj << /Type /Annot /Subtype /Link @@ -32817,68 +32884,68 @@ stream /Rect [487.118 128.475 494.142 140.535] /A << /S /GoTo /D (algocf.2) >> >> -% 2189 0 obj -<< -/D [2187 0 R /XYZ 149.705 753.953 null] ->> % 2190 0 obj << -/D [2187 0 R /XYZ 447.542 464.41 null] +/D [2188 0 R /XYZ 149.705 753.953 null] >> % 2191 0 obj << -/D [2187 0 R /XYZ 150.705 211.214 null] +/D [2188 0 R /XYZ 447.542 464.41 null] >> -% 2186 0 obj +% 2192 0 obj +<< +/D [2188 0 R /XYZ 150.705 211.214 null] +>> +% 2187 0 obj << -/Font << /F84 687 0 R /F78 686 0 R /F192 942 0 R /F145 940 0 R /F233 1044 0 R /F279 1814 0 R /F148 1490 0 R /F190 941 0 R /F75 685 0 R >> -/XObject << /Im8 2182 0 R >> +/Font << /F84 687 0 R /F78 686 0 R /F192 942 0 R /F145 940 0 R /F233 1044 0 R /F279 1815 0 R /F148 1490 0 R /F190 941 0 R /F75 685 0 R >> +/XObject << /Im8 2183 0 R >> /ProcSet [ /PDF /Text ] >> -% 2207 0 obj +% 2208 0 obj << /Type /Page -/Contents 2208 0 R -/Resources 2206 0 R +/Contents 2209 0 R +/Resources 2207 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2212 0 R -/Annots [ 2205 0 R ] +/Parent 2213 0 R +/Annots [ 2206 0 R ] >> -% 2213 0 obj +% 2214 0 obj << /Producer (GPL Ghostscript 9.10) /CreationDate (D:20140329133927+01'00') /ModDate (D:20140329133927+01'00') /Creator (cairo 1.13.1 \(http://cairographics.org\)) >> -% 2214 0 obj +% 2215 0 obj << /Type /ExtGState /OPM 1 >> -% 2215 0 obj +% 2216 0 obj << /BaseFont /BNRUAU+TimesNewRomanPSMT -/FontDescriptor 2217 0 R -/ToUnicode 2218 0 R +/FontDescriptor 2218 0 R +/ToUnicode 2219 0 R /Type /Font /FirstChar 45 /LastChar 55 /Widths [ 333 0 0 500 500 500 0 0 0 0 500] /Subtype /TrueType >> -% 2216 0 obj +% 2217 0 obj << /BaseFont /ICFUKB+FreeSerif -/FontDescriptor 2219 0 R -/ToUnicode 2220 0 R +/FontDescriptor 2220 0 R +/ToUnicode 2221 0 R /Type /Font /FirstChar 32 /LastChar 89 /Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 721 0 0 0 610 564 0 0 0 0 0 0 0 0 724 0 0 667 529 606 0 0 0 0 701] /Subtype /TrueType >> -% 2217 0 obj +% 2218 0 obj << /Type /FontDescriptor /FontName /BNRUAU+TimesNewRomanPSMT @@ -32890,9 +32957,9 @@ stream /ItalicAngle 0 /StemV 95 /MissingWidth 777 -/FontFile2 2221 0 R +/FontFile2 2222 0 R >> -% 2219 0 obj +% 2220 0 obj << /Type /FontDescriptor /FontName /ICFUKB+FreeSerif @@ -32904,9 +32971,9 @@ stream /ItalicAngle 0 /StemV 105 /MissingWidth 600 -/FontFile2 2222 0 R +/FontFile2 2223 0 R >> -% 2205 0 obj +% 2206 0 obj << /Type /Annot /Subtype /Link @@ -32914,76 +32981,76 @@ stream /Rect [371.292 537.01 378.265 549.069] /A << /S /GoTo /D (figure.5) >> >> -% 2209 0 obj +% 2210 0 obj << -/D [2207 0 R /XYZ 98.895 753.953 null] +/D [2208 0 R /XYZ 98.895 753.953 null] >> -% 2202 0 obj +% 2203 0 obj << -/D [2207 0 R /XYZ 396.732 574.688 null] +/D [2208 0 R /XYZ 396.732 574.688 null] >> -% 2210 0 obj +% 2211 0 obj << -/D [2207 0 R /XYZ 99.895 526.012 null] +/D [2208 0 R /XYZ 99.895 526.012 null] >> -% 2203 0 obj +% 2204 0 obj << -/D [2207 0 R /XYZ 114.839 383.469 null] +/D [2208 0 R /XYZ 114.839 383.469 null] >> -% 2211 0 obj +% 2212 0 obj << -/D [2207 0 R /XYZ 99.895 187.185 null] +/D [2208 0 R /XYZ 99.895 187.185 null] >> -% 2206 0 obj +% 2207 0 obj << -/Font << /F84 687 0 R /F145 940 0 R /F233 1044 0 R /F75 685 0 R /F279 1814 0 R >> -/XObject << /Im9 2204 0 R >> +/Font << /F84 687 0 R /F145 940 0 R /F233 1044 0 R /F75 685 0 R /F279 1815 0 R >> +/XObject << /Im9 2205 0 R >> /ProcSet [ /PDF /Text ] >> -% 2226 0 obj +% 2227 0 obj << /Type /Page -/Contents 2227 0 R -/Resources 2225 0 R +/Contents 2228 0 R +/Resources 2226 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2212 0 R -/Annots [ 2224 0 R ] +/Parent 2213 0 R +/Annots [ 2225 0 R ] >> -% 2230 0 obj +% 2231 0 obj << /Producer (GPL Ghostscript 9.10) /CreationDate (D:20140329133928+01'00') /ModDate (D:20140329133928+01'00') /Creator (cairo 1.13.1 \(http://cairographics.org\)) >> -% 2231 0 obj +% 2232 0 obj << /Type /ExtGState /OPM 1 >> -% 2233 0 obj +% 2234 0 obj << /BaseFont /PBIKKX+TimesNewRomanPSMT -/FontDescriptor 2235 0 R -/ToUnicode 2236 0 R +/FontDescriptor 2236 0 R +/ToUnicode 2237 0 R /Type /Font /FirstChar 45 /LastChar 55 /Widths [ 333 0 0 500 500 0 500 500 500 500 500] /Subtype /TrueType >> -% 2234 0 obj +% 2235 0 obj << /BaseFont /ZBHFTP+FreeSerif -/FontDescriptor 2237 0 R -/ToUnicode 2238 0 R +/FontDescriptor 2238 0 R +/ToUnicode 2239 0 R /Type /Font /FirstChar 32 /LastChar 89 /Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 721 0 670 0 610 564 0 714 0 0 709 0 0 0 724 0 0 667 529 606 0 0 0 0 701] /Subtype /TrueType >> -% 2235 0 obj +% 2236 0 obj << /Type /FontDescriptor /FontName /PBIKKX+TimesNewRomanPSMT @@ -32995,9 +33062,9 @@ stream /ItalicAngle 0 /StemV 95 /MissingWidth 777 -/FontFile2 2239 0 R +/FontFile2 2240 0 R >> -% 2237 0 obj +% 2238 0 obj << /Type /FontDescriptor /FontName /ZBHFTP+FreeSerif @@ -33009,9 +33076,9 @@ stream /ItalicAngle 0 /StemV 105 /MissingWidth 600 -/FontFile2 2240 0 R +/FontFile2 2241 0 R >> -% 2224 0 obj +% 2225 0 obj << /Type /Annot /Subtype /Link @@ -33019,226 +33086,222 @@ stream /Rect [440.392 344.666 447.366 356.726] /A << /S /GoTo /D (figure.5) >> >> -% 2228 0 obj +% 2229 0 obj << -/D [2226 0 R /XYZ 149.705 753.953 null] +/D [2227 0 R /XYZ 149.705 753.953 null] >> -% 2229 0 obj +% 2230 0 obj << -/D [2226 0 R /XYZ 447.542 382.345 null] +/D [2227 0 R /XYZ 447.542 382.345 null] >> -% 2225 0 obj +% 2226 0 obj << -/Font << /F84 687 0 R /F145 940 0 R /F78 686 0 R /F75 685 0 R /F192 942 0 R /F233 1044 0 R /F279 1814 0 R >> -/XObject << /Im10 2223 0 R >> +/Font << /F84 687 0 R /F145 940 0 R /F78 686 0 R /F75 685 0 R /F192 942 0 R /F233 1044 0 R /F279 1815 0 R >> +/XObject << /Im10 2224 0 R >> /ProcSet [ /PDF /Text ] >> -% 2242 0 obj +% 2243 0 obj << /Type /Page -/Contents 2243 0 R -/Resources 2241 0 R +/Contents 2244 0 R +/Resources 2242 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2212 0 R +/Parent 2213 0 R >> -% 2244 0 obj +% 2245 0 obj << -/D [2242 0 R /XYZ 98.895 753.953 null] +/D [2243 0 R /XYZ 98.895 753.953 null] >> -% 2241 0 obj +% 2242 0 obj << /Font << /F233 1044 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 2246 0 obj +% 2247 0 obj << /Type /Page -/Contents 2247 0 R -/Resources 2245 0 R +/Contents 2248 0 R +/Resources 2246 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2212 0 R +/Parent 2213 0 R >> -% 2248 0 obj +% 2249 0 obj << -/D [2246 0 R /XYZ 149.705 753.953 null] +/D [2247 0 R /XYZ 149.705 753.953 null] >> % 614 0 obj << -/D [2246 0 R /XYZ 150.705 716.092 null] +/D [2247 0 R /XYZ 150.705 716.092 null] >> -% 2245 0 obj +% 2246 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F233 1044 0 R /F145 940 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 2250 0 obj +% 2251 0 obj << /Type /Page -/Contents 2251 0 R -/Resources 2249 0 R +/Contents 2252 0 R +/Resources 2250 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2212 0 R +/Parent 2213 0 R >> -% 2252 0 obj +% 2253 0 obj << -/D [2250 0 R /XYZ 98.895 753.953 null] +/D [2251 0 R /XYZ 98.895 753.953 null] >> % 618 0 obj << -/D [2250 0 R /XYZ 99.895 554.06 null] +/D [2251 0 R /XYZ 99.895 554.06 null] >> % 622 0 obj << -/D [2250 0 R /XYZ 99.895 527.944 null] +/D [2251 0 R /XYZ 99.895 527.944 null] >> -% 2253 0 obj +% 2254 0 obj << -/D [2250 0 R /XYZ 99.895 315.727 null] +/D [2251 0 R /XYZ 99.895 315.727 null] >> % 626 0 obj << -/D [2250 0 R /XYZ 99.895 284.171 null] +/D [2251 0 R /XYZ 99.895 284.171 null] >> -% 2249 0 obj +% 2250 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> /ProcSet [ /PDF /Text ] >> -% 2255 0 obj +% 2256 0 obj << /Type /Page -/Contents 2256 0 R -/Resources 2254 0 R +/Contents 2257 0 R +/Resources 2255 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2212 0 R +/Parent 2213 0 R >> -% 2257 0 obj +% 2258 0 obj << -/D [2255 0 R /XYZ 149.705 753.953 null] +/D [2256 0 R /XYZ 149.705 753.953 null] >> % 630 0 obj << -/D [2255 0 R /XYZ 150.705 720.077 null] +/D [2256 0 R /XYZ 150.705 720.077 null] >> % 634 0 obj << -/D [2255 0 R /XYZ 150.705 633.991 null] +/D [2256 0 R /XYZ 150.705 633.991 null] >> % 638 0 obj << -/D [2255 0 R /XYZ 150.705 559.861 null] +/D [2256 0 R /XYZ 150.705 559.861 null] >> % 642 0 obj << -/D [2255 0 R /XYZ 150.705 485.732 null] +/D [2256 0 R /XYZ 150.705 485.732 null] >> % 646 0 obj << -/D [2255 0 R /XYZ 150.705 411.602 null] +/D [2256 0 R /XYZ 150.705 411.602 null] >> % 650 0 obj << -/D [2255 0 R /XYZ 150.705 325.516 null] +/D [2256 0 R /XYZ 150.705 325.516 null] >> % 654 0 obj << -/D [2255 0 R /XYZ 150.705 251.386 null] +/D [2256 0 R /XYZ 150.705 251.386 null] >> % 658 0 obj << -/D [2255 0 R /XYZ 150.705 177.256 null] +/D [2256 0 R /XYZ 150.705 177.256 null] >> -% 2254 0 obj +% 2255 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 2259 0 obj +% 2260 0 obj << /Type /Page -/Contents 2260 0 R -/Resources 2258 0 R +/Contents 2261 0 R +/Resources 2259 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2262 0 R +/Parent 2263 0 R >> -% 2261 0 obj +% 2262 0 obj << -/D [2259 0 R /XYZ 98.895 753.953 null] +/D [2260 0 R /XYZ 98.895 753.953 null] >> % 662 0 obj << -/D [2259 0 R /XYZ 99.895 720.077 null] +/D [2260 0 R /XYZ 99.895 720.077 null] >> % 666 0 obj << -/D [2259 0 R /XYZ 99.895 650.062 null] +/D [2260 0 R /XYZ 99.895 650.062 null] >> % 670 0 obj << -/D [2259 0 R /XYZ 99.895 580.047 null] +/D [2260 0 R /XYZ 99.895 580.047 null] >> % 674 0 obj << -/D [2259 0 R /XYZ 99.895 510.033 null] +/D [2260 0 R /XYZ 99.895 510.033 null] >> -% 2258 0 obj +% 2259 0 obj << /Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 2264 0 obj +% 2265 0 obj << /Type /Page -/Contents 2265 0 R -/Resources 2263 0 R +/Contents 2266 0 R +/Resources 2264 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2262 0 R +/Parent 2263 0 R >> -% 2266 0 obj +% 2267 0 obj << -/D [2264 0 R /XYZ 149.705 753.953 null] +/D [2265 0 R /XYZ 149.705 753.953 null] >> -% 2263 0 obj +% 2264 0 obj << /Font << /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 2268 0 obj +% 2269 0 obj << /Type /Page -/Contents 2269 0 R -/Resources 2267 0 R +/Contents 2270 0 R +/Resources 2268 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2262 0 R ->> -% 2270 0 obj -<< -/D [2268 0 R /XYZ 98.895 753.953 null] +/Parent 2263 0 R >> % 2271 0 obj << -/D [2268 0 R /XYZ 99.895 723.717 null] +/D [2269 0 R /XYZ 98.895 753.953 null] >> % 2272 0 obj << -/D [2268 0 R /XYZ 99.895 698.792 null] +/D [2269 0 R /XYZ 99.895 723.717 null] >> -% 2013 0 obj +% 2273 0 obj << -/D [2268 0 R /XYZ 99.895 638.64 null] +/D [2269 0 R /XYZ 99.895 698.792 null] >> -% 958 0 obj +% 2014 0 obj << -/D [2268 0 R /XYZ 99.895 595.644 null] +/D [2269 0 R /XYZ 99.895 638.64 null] >> -% 957 0 obj +% 958 0 obj << -/D [2268 0 R /XYZ 99.895 538.043 null] +/D [2269 0 R /XYZ 99.895 595.644 null] >> endstream endobj -2278 0 obj +2279 0 obj << /Length 6164 >> @@ -33301,7 +33364,7 @@ ET endstream endobj -2296 0 obj +2297 0 obj << /Length1 1383 /Length2 5908 @@ -33372,7 +33435,7 @@ W ò6S&ªå_!“½SÎ|esU›FÌR™y† ¢Y‹¥ýžï­§N endstream endobj -2298 0 obj +2299 0 obj << /Length1 1956 /Length2 7144 @@ -33489,7 +33552,7 @@ _g\e+J`Ú¼u F½Aa´´ÿ.P’gvŸþì˜Çaósl ø¯ZBh·õ´gæÇ –Wµ Û-‹BѶ”N˜°ŠÜhú`˨[ÉW÷jßí)qˆ(µÎãÓÌý÷ÍŒþð.wYÕæ‹$ÞQ¬ÿ0±€®Ñ]Šü endstream endobj -2300 0 obj +2301 0 obj << /Length1 1442 /Length2 6151 @@ -33567,7 +33630,7 @@ n^ r sb¢VØb)l 2ÅþSŠ„T£­H+PMzjÔîëzËiÍfí$ŽDáŒMkV©° Ã?ã\Ù¼Ä>ެ߈ƶa¹<¡ÈèEE£ÜL½¦D…¯6=t¯–EÒ÷µ€ðàÀ.…(Á%FoÜ~­´ô6€rý¦\l•ù;séñ'$Öµ…ïß>ž4¹ÿr$ï2¨DZý~*®\R ù·Yi$=Þ¡¥k‡å'¯Öå“™úý.m…6¯Â–„tY0’O$ð)ºQñ’ršÈUQ…»+¶ßªúÔ4(¨«,‡°Qb8¬—mÓ©qý±âÀÁÝHä°=‘œ,YŠ8i  ÿ‡½ª”SZ6Žöã½mØ@ˆ»`é7~â"L7\ã¹ßFdN#FþýHR´K´KHpb40 2ÂÚ~HÇKε֊úøX endstream endobj -2302 0 obj +2303 0 obj << /Length1 1478 /Length2 6403 @@ -33648,7 +33711,7 @@ O GÁ0ÿÑûòÿ¦œÿ+B°¸+›æ¸žb¥qGYÀðitâLxRIPv®Õ½·hÎÄÓÔ¥ºÒÏ‹^ž½:nwåòœÕp5¿Ð>^؉R¥Þä}ð4ü¸¿Œò™áùÞaŒgül}×^™(©t7ƒaÝÔ &ó½¶)±ZS«ˆ‘ ”¾8ÿn}@f0;­b.Û£ELì›7†%·¹›3Cª,ò@ä7¹Õï[I [1sI¬îÅXÚ<Æü[›fÜŒ¹¶Ýa¯:?yºÈç3"èu/'Ø\Ödñ ÁDÓ¹Ú=»qUü êškóκùH‚â$ y§ïQ7¼plŽ*žmhS]ADäÛäøù5Îã½üÆ«ü‹79µ endstream endobj -2304 0 obj +2305 0 obj << /Length1 1688 /Length2 8444 @@ -33739,7 +33802,7 @@ p bŠ|Ü<dF.ÊÂÃOü¶½£æ[–ßÈÝv°ó¿ö±O¨hgÃy‡Qì®—»å¶ ‘«h›0}¦ª»½˜Üõ,ïåè:Õ(Ñ–~¨–À–’6uü‹mXóR·VÃ<‡­Ð³JVíM\Fw%T6VÍvýÑQnéϨÿ¦:Ï M¤\Ú…Uá-:φ57M}ÎÞ!ãZ‘D ês‰ ç {$Qû0Ý„në®êÓ Ê(ãN3°Þ[( ½¶?™ÓŒoÜî9T½”ÒuæÒ«6nÀu÷ðD!qáíZ”ÞU›·ÍÜT”!pÚ¹VØžïó‡/…È\ýh^‡:ñ'.AµEõ¾S‹6P*BËY‹LŸ endstream endobj -2306 0 obj +2307 0 obj << /Length1 2571 /Length2 18274 @@ -33929,7 +33992,7 @@ bvT ­¬Ì$LŽ`u\$ÿyýƒ îË63rŒa ù*}L¬ÿOƒþ­Nûšâ°Vz`NÁ~©âÖüËïþD|°ˆÏ!5…çÆkW· Îï¯ËÅ[uõ 1HÉ6ÅGÍ y‚ÀDÐûW…ÔC˜¿•%‹Ò¸Vî96ºkœ>lLtÆgÑ)d:ã|Ù\Ž,?†ÅÙ¾¦d”5·ÖŒ‘ì¡âØ#2}‰Äñ‘«Ã™ >>©™–Ay÷r5dý>>Ç:Xqa¿ÓÙ x^åJÓ^a”Õ ÀÝ2PA¡½Îk@¨AP£íÓ~<¢GÇ€w*ßjRr… (Þbí]4²2æa´<¡ï‰ö‚kdù©#YtuÎdW'*Õ³C+%˜ 9vȽâðq endstream endobj -2308 0 obj +2309 0 obj << /Length1 1509 /Length2 2696 @@ -33991,7 +34054,7 @@ currentfile eexec ¢½›ß½€eдË*›¹¡Å×KÀËHªX3.Óg 2L9tžèbMµ$ÿx*Ý™4$R=å Þ+JUùCwŠe–䡞±…›-%þe)ê³Óƒ¼Ö\™MS{Æ•Këž³.œ endstream endobj -2310 0 obj +2311 0 obj << /Length1 2495 /Length2 16116 @@ -34178,7 +34241,7 @@ uÖ‚ }ã´ûKç+ÑàôÎïÈL5XáçB´Æ`{˜PØžFR/´e¦•{›ùÉþ¿xì³If!«ÐÞdå˜w!q>)ο ç«׫ÍélÞV•]˜$>Øð€Om•Å€„”œKé1îy®ïà^ÑŸ= ˜"YkèK‡ÇÉÜgt¼[1à6eà´§p[hNc¾}]Û#Ü^ékNoʼm, ±5u£‰‘yéá<Õnå•TA³t<Íw£&+•5O–y[šì÷N„þ[ªP±+J ã$ìiÙ/×%”ÖˆÞHEPBÓaÓÒàz`~-Âôa+Õ¸wi W€´êÔ=ÞþYÝÃÊÿ%àb-ÈòÐÈSQ­=SVuIwï®–¥H°¸CÒ8ûq—-º£ ©›¨íW£‰R͢ݼ?ÎÎïÒ‰G¼»g5…áá)Ó9 P9©_öQ‰+Ë[nÒÞð‘k¡ð#ß%J!³„zùŽø6:ÈLÑiÑ)Yð´™exR4ëÌ©b&Œø-Àé¸Îä˜bŸ©³Ï e’ðNæb³x+’ÎÔ‚>êxró}Ô„%öˆSx#«ÆóìðáÀ¼àÔ\/¸aĬ1^BIOÿÌ…Ô•x_å<=rãÔTi¤º½Ôø_ƒä­[›ÖÉ-W¿õ…&íg!zÂ{N•i×%’3s|刽¨’66gú಑do–D»¹^-@AæJ–ðHSPºHSä[N¥©:ORØ~\¨·bj–•1 ãæp endstream endobj -2312 0 obj +2313 0 obj << /Length1 1191 /Length2 3225 @@ -34224,7 +34287,7 @@ s; 3B@•Fs5ò® endstream endobj -2314 0 obj +2315 0 obj << /Length1 1188 /Length2 2740 @@ -34273,7 +34336,7 @@ AÖª^ 6» f žÑrº^‚7£ö1ë5aj³à¡Ašº£¨nWÉ©!µp© cílov®>ÕªI8©3!ÕÜ/ª˜ JÝÚ?|iî$dØ_ìñ(°/;Åb÷üÒ49Ãï•Û%X¾eÊal¥Øw픋v_Õ̹ûœ@dr®Ëp.álä§<çêÉJt~½ŸM«÷[£†yœ ä™û3¹î[Î{ endstream endobj -2316 0 obj +2317 0 obj << /Length1 1614 /Length2 22531 @@ -34393,7 +34456,7 @@ s ÿK=ö² ’á(ÛHfUïÎãrÒø¾IQ$W0LÇòÅÕµ8ŽÅX‘k¯ß‰ô¹­JÏMÐz{äPãÀ÷–¢Ô“‹¾>$ yò§ÑéÚ"Éjrº½¾‹Xf¯yÓLEœtnÖy“ÉŽœ‰ö•ƒQ]Ex.ò¢B‚…;®úˆ[„çðÂXánÍUîOýÅ›1Nd É¸&÷ïÎŒþ endstream endobj -2318 0 obj +2319 0 obj << /Length1 1616 /Length2 24418 @@ -34518,7 +34581,7 @@ c51 AÌø2C0ˆ¯5§Œƒñ¸ûoÔ]}‰I(&*㤠½;Ã@ar½’§×@ ž\-@óˆ…Ô|†5J¾ÏZ¬¬Ò¿ÖTÛÆâ¼ .áç1åT–€"aõJk:‘¹bÄ–D»| endstream endobj -2320 0 obj +2321 0 obj << /Length1 1620 /Length2 18334 @@ -34627,7 +34690,7 @@ Gɽ Ï¿([‘ç[·º tŸz|' oÒUc×yrH¯+ÍÝ(m§‚ 8Áýµ$#%¼°¢ûÕ endstream endobj -2322 0 obj +2323 0 obj << /Length 1007 >> @@ -34697,7 +34760,7 @@ end endstream endobj -2323 0 obj +2324 0 obj << /Length 1577 >> @@ -34812,7 +34875,7 @@ end endstream endobj -2324 0 obj +2325 0 obj << /Length 1535 >> @@ -34918,7 +34981,7 @@ end endstream endobj -2325 0 obj +2326 0 obj << /Length 1724 >> @@ -35041,7 +35104,7 @@ end endstream endobj -2326 0 obj +2327 0 obj << /Length 2050 >> @@ -35187,7 +35250,7 @@ end endstream endobj -2327 0 obj +2328 0 obj << /Length 1543 >> @@ -35300,7 +35363,7 @@ end endstream endobj -2328 0 obj +2329 0 obj << /Length 1538 >> @@ -35413,7 +35476,7 @@ end endstream endobj -2329 0 obj +2330 0 obj << /Length 1538 >> @@ -35526,7 +35589,7 @@ end endstream endobj -2330 0 obj +2331 0 obj << /Length 853 >> @@ -35584,7 +35647,7 @@ end endstream endobj -2331 0 obj +2332 0 obj << /Length 1113 >> @@ -35662,7 +35725,7 @@ end endstream endobj -2332 0 obj +2333 0 obj << /Length 1477 >> @@ -35765,7 +35828,7 @@ end endstream endobj -2333 0 obj +2334 0 obj << /Length 1477 >> @@ -35868,7 +35931,7 @@ end endstream endobj -2334 0 obj +2335 0 obj << /Length 1482 >> @@ -35971,153 +36034,157 @@ end endstream endobj -2275 0 obj +2276 0 obj << /Type /ObjStm /N 100 -/First 1011 -/Length 18541 ->> -stream -916 0 917 57 933 114 913 171 914 227 2273 284 909 342 2274 399 2267 457 2277 551 -2279 669 1074 728 945 787 915 845 912 903 908 961 2143 1019 911 1078 2280 1136 910 1195 -2128 1252 2129 1311 2281 1370 2276 1429 2282 1524 2283 1544 2284 1915 2285 2018 2286 2341 2287 2364 -2288 2819 2289 2948 2290 3246 2291 3892 2293 4363 2294 4994 2295 5465 2297 6040 2299 6265 2301 6597 -2303 6841 2305 7112 2307 7460 2309 7966 2311 8200 2313 8674 2315 8906 2317 9137 2319 9616 2321 10192 -2292 10610 1883 11051 1814 11214 1490 11377 942 11538 941 11697 940 11857 1000 12018 1044 12179 1285 12340 -1157 12504 685 12674 687 12864 686 13054 688 13244 894 13357 978 13470 1052 13587 1087 13707 1117 13827 -1158 13947 1205 14067 1244 14187 1300 14307 1351 14427 1400 14547 1457 14667 1492 14787 1534 14907 1577 15027 -1626 15147 1663 15267 1698 15387 1739 15507 1781 15627 1806 15747 1842 15867 1876 15987 1915 16107 1953 16227 -1990 16347 2035 16467 2071 16587 2116 16707 2212 16827 2262 16947 2335 17049 2336 17167 2337 17288 2338 17409 +/First 1009 +/Length 18475 +>> +stream +957 0 916 57 917 114 933 171 913 228 914 284 2274 341 909 399 2275 456 2268 514 +2278 608 2280 726 1074 785 945 844 915 902 912 960 908 1018 2144 1076 911 1135 2281 1193 +910 1252 2129 1309 2130 1368 2282 1427 2277 1486 2283 1581 2284 1601 2285 1972 2286 2075 2287 2398 +2288 2421 2289 2876 2290 3005 2291 3303 2292 3949 2294 4420 2295 5051 2296 5522 2298 6097 2300 6322 +2302 6654 2304 6898 2306 7169 2308 7517 2310 8023 2312 8257 2314 8731 2316 8963 2318 9194 2320 9673 +2322 10249 2293 10667 1884 11108 1815 11271 1490 11434 942 11595 941 11754 940 11914 1000 12075 1044 12236 +1285 12397 1157 12561 685 12731 687 12921 686 13111 688 13301 894 13414 978 13527 1052 13644 1087 13764 +1117 13884 1158 14004 1205 14124 1244 14244 1300 14364 1351 14484 1400 14604 1457 14724 1492 14844 1534 14964 +1577 15084 1626 15204 1663 15324 1698 15444 1739 15564 1782 15684 1807 15804 1843 15924 1877 16044 1916 16164 +1954 16284 1991 16404 2036 16524 2072 16644 2117 16764 2213 16884 2263 17004 2336 17106 2337 17224 2338 17345 +% 957 0 obj +<< +/D [2269 0 R /XYZ 99.895 538.043 null] +>> % 916 0 obj << -/D [2268 0 R /XYZ 99.895 477.792 null] +/D [2269 0 R /XYZ 99.895 477.792 null] >> % 917 0 obj << -/D [2268 0 R /XYZ 99.895 433.422 null] +/D [2269 0 R /XYZ 99.895 433.422 null] >> % 933 0 obj << -/D [2268 0 R /XYZ 99.895 398.456 null] +/D [2269 0 R /XYZ 99.895 398.456 null] >> % 913 0 obj << -/D [2268 0 R /XYZ 99.895 352.81 null] +/D [2269 0 R /XYZ 99.895 352.81 null] >> % 914 0 obj << -/D [2268 0 R /XYZ 99.895 307.164 null] +/D [2269 0 R /XYZ 99.895 307.164 null] >> -% 2273 0 obj +% 2274 0 obj << -/D [2268 0 R /XYZ 99.895 261.519 null] +/D [2269 0 R /XYZ 99.895 261.519 null] >> % 909 0 obj << -/D [2268 0 R /XYZ 99.895 215.873 null] +/D [2269 0 R /XYZ 99.895 215.873 null] >> -% 2274 0 obj +% 2275 0 obj << -/D [2268 0 R /XYZ 99.895 170.895 null] +/D [2269 0 R /XYZ 99.895 170.895 null] >> -% 2267 0 obj +% 2268 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 2277 0 obj +% 2278 0 obj << /Type /Page -/Contents 2278 0 R -/Resources 2276 0 R +/Contents 2279 0 R +/Resources 2277 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2262 0 R +/Parent 2263 0 R >> -% 2279 0 obj +% 2280 0 obj << -/D [2277 0 R /XYZ 149.705 753.953 null] +/D [2278 0 R /XYZ 149.705 753.953 null] >> % 1074 0 obj << -/D [2277 0 R /XYZ 150.705 716.092 null] +/D [2278 0 R /XYZ 150.705 716.092 null] >> % 945 0 obj << -/D [2277 0 R /XYZ 150.705 687.379 null] +/D [2278 0 R /XYZ 150.705 687.379 null] >> % 915 0 obj << -/D [2277 0 R /XYZ 150.705 632.184 null] +/D [2278 0 R /XYZ 150.705 632.184 null] >> % 912 0 obj << -/D [2277 0 R /XYZ 150.705 590.403 null] +/D [2278 0 R /XYZ 150.705 590.403 null] >> % 908 0 obj << -/D [2277 0 R /XYZ 150.705 545.192 null] +/D [2278 0 R /XYZ 150.705 545.192 null] >> -% 2143 0 obj +% 2144 0 obj << -/D [2277 0 R /XYZ 150.705 512.037 null] +/D [2278 0 R /XYZ 150.705 512.037 null] >> % 911 0 obj << -/D [2277 0 R /XYZ 150.705 480.156 null] +/D [2278 0 R /XYZ 150.705 480.156 null] >> -% 2280 0 obj +% 2281 0 obj << -/D [2277 0 R /XYZ 150.705 448.276 null] +/D [2278 0 R /XYZ 150.705 448.276 null] >> % 910 0 obj << -/D [2277 0 R /XYZ 150.705 407.09 null] +/D [2278 0 R /XYZ 150.705 407.09 null] >> -% 2128 0 obj +% 2129 0 obj << -/D [2277 0 R /XYZ 150.705 348.649 null] +/D [2278 0 R /XYZ 150.705 348.649 null] >> -% 2129 0 obj +% 2130 0 obj << -/D [2277 0 R /XYZ 150.705 304.874 null] +/D [2278 0 R /XYZ 150.705 304.874 null] >> -% 2281 0 obj +% 2282 0 obj << -/D [2277 0 R /XYZ 150.705 260.978 null] +/D [2278 0 R /XYZ 150.705 260.978 null] >> -% 2276 0 obj +% 2277 0 obj << /Font << /F84 687 0 R /F78 686 0 R /F145 940 0 R >> /ProcSet [ /PDF /Text ] >> -% 2282 0 obj -[1000] % 2283 0 obj -[525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] +[1000] % 2284 0 obj -[277.8 277.8 500 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 777.8 500 777.8] +[525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] % 2285 0 obj -[831 660 753 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 0 0 853 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 666 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 747 0 0 0 0 0 0 0 0 0 0 0 0 0 0 881 0 0 0 0 0 0 0 0 0 0 0 0 234 0 881 767] +[277.8 277.8 500 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 777.8 500 777.8] % 2286 0 obj -[528 542] +[831 660 753 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 0 0 853 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 666 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 747 0 0 0 0 0 0 0 0 0 0 0 0 0 0 881 0 0 0 0 0 0 0 0 0 0 0 0 234 0 881 767] % 2287 0 obj -[525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] +[528 542] % 2288 0 obj -[531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3] +[525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] % 2289 0 obj -[388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8] +[531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3] % 2290 0 obj -[777.8 277.8 777.8 500 777.8 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 500 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 1000 777.8 777.8 1000 1000 500 500 1000 1000 1000 777.8 1000 1000 611.1 611.1 1000 1000 1000 777.8 275 1000 666.7 666.7 888.9 888.9 0 0 555.6 555.6 666.7 500 722.2 722.2 777.8 777.8 611.1 798.5 656.8 526.5 771.4 527.8 718.7 594.9 844.5 544.5 677.8 761.9 689.7 1200.9 820.5 796.1 695.6 816.7 847.5 605.6 544.6 625.8 612.8 987.8 713.3 668.3 724.7 666.7 666.7 666.7 666.7 666.7 611.1 611.1 444.4 444.4 444.4 444.4 500 500 388.9 388.9 277.8 500 500 611.1 500 277.8 833.3] +[388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8] % 2291 0 obj +[777.8 277.8 777.8 500 777.8 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 500 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 1000 777.8 777.8 1000 1000 500 500 1000 1000 1000 777.8 1000 1000 611.1 611.1 1000 1000 1000 777.8 275 1000 666.7 666.7 888.9 888.9 0 0 555.6 555.6 666.7 500 722.2 722.2 777.8 777.8 611.1 798.5 656.8 526.5 771.4 527.8 718.7 594.9 844.5 544.5 677.8 761.9 689.7 1200.9 820.5 796.1 695.6 816.7 847.5 605.6 544.6 625.8 612.8 987.8 713.3 668.3 724.7 666.7 666.7 666.7 666.7 666.7 611.1 611.1 444.4 444.4 444.4 444.4 500 500 388.9 388.9 277.8 500 500 611.1 500 277.8 833.3] +% 2292 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] -% 2293 0 obj -[605 608 167 380 611 291 313 333 0 333 606 0 667 500 333 287 0 0 0 0 0 0 0 0 0 0 0 0 333 208 250 278 371 500 500 840 778 278 333 333 389 606 250 333 250 606 500 500 500 500 500 500 500 500 500 500 250 250 606 606 606 444 747 778 611 709 774 611 556 763 832 337 333 726 611 946 831 786 604 786 668 525 613 778 722 1000 667 667 667 333 606 333 606 500 278 500 553 444 611 479 333 556 582 291 234 556 291 883 582 546 601 560 395 424 326 603 565 834 516 556 500 333 606 333 606 0 0 0 278 500 500 1000 500 500 333 1144 525 331 998 0 0 0 0 0 0 500 500 606 500 1000 333 979 424 331 827 0 0 667 0 278 500 500 500 500 606 500] % 2294 0 obj -[528 545 167 333 556 278 333 333 0 333 606 0 667 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 333 250 333 500 500 500 889 778 278 333 333 389 606 250 333 250 296 500 500 500 500 500 500 500 500 500 500 250 250 606 606 606 500 747 722 611 667 778 611 556 722 778 333 333 667 556 944 778 778 611 778 667 556 611 778 722 944 722 667 667 333 606 333 606 500 278 444 463 407 500 389 278 500 500 278 278 444 278 778 556 444 500 463 389 389 333 556 500 722 500 500 444] +[605 608 167 380 611 291 313 333 0 333 606 0 667 500 333 287 0 0 0 0 0 0 0 0 0 0 0 0 333 208 250 278 371 500 500 840 778 278 333 333 389 606 250 333 250 606 500 500 500 500 500 500 500 500 500 500 250 250 606 606 606 444 747 778 611 709 774 611 556 763 832 337 333 726 611 946 831 786 604 786 668 525 613 778 722 1000 667 667 667 333 606 333 606 500 278 500 553 444 611 479 333 556 582 291 234 556 291 883 582 546 601 560 395 424 326 603 565 834 516 556 500 333 606 333 606 0 0 0 278 500 500 1000 500 500 333 1144 525 331 998 0 0 0 0 0 0 500 500 606 500 1000 333 979 424 331 827 0 0 667 0 278 500 500 500 500 606 500] % 2295 0 obj +[528 545 167 333 556 278 333 333 0 333 606 0 667 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 333 250 333 500 500 500 889 778 278 333 333 389 606 250 333 250 296 500 500 500 500 500 500 500 500 500 500 250 250 606 606 606 500 747 722 611 667 778 611 556 722 778 333 333 667 556 944 778 778 611 778 667 556 611 778 722 944 722 667 667 333 606 333 606 500 278 444 463 407 500 389 278 500 500 278 278 444 278 778 556 444 500 463 389 389 333 556 500 722 500 500 444] +% 2296 0 obj [611 611 167 333 611 333 333 333 0 333 606 0 667 500 333 333 0 0 0 0 0 0 0 0 0 0 0 0 333 227 250 278 402 500 500 889 833 278 333 333 444 606 250 333 250 296 500 500 500 500 500 500 500 500 500 500 250 250 606 606 606 444 747 778 667 722 833 611 556 833 833 389 389 778 611 1000 833 833 611 833 722 611 667 778 778 1000 667 667 667 333 606 333 606 500 278 500 611 444 611 500 389 556 611 333 333 611 333 889 611 556 611 611 389 444 333 611 556 833 500 556 500 310 606 310 606 0 0 0 333 500 500 1000 500 500 333 1000 611 389 1000 0 0 0 0 0 0 500 500 606 500 1000] -% 2297 0 obj +% 2298 0 obj << /Type /FontDescriptor /FontName /MNPEHI+CMEX10 @@ -36130,9 +36197,9 @@ stream /StemV 47 /XHeight 431 /CharSet (/radicalbigg) -/FontFile 2296 0 R +/FontFile 2297 0 R >> -% 2299 0 obj +% 2300 0 obj << /Type /FontDescriptor /FontName /SFGIZH+CMITT10 @@ -36145,9 +36212,9 @@ stream /StemV 69 /XHeight 431 /CharSet (/A/C/D/E/H/I/K/L/M/P/T/V/a/c/comma/d/e/exclam/f/g/h/hyphen/i/k/m/n/o/p/parenleft/parenright/period/r/s/slash/t/w/x/y) -/FontFile 2298 0 R +/FontFile 2299 0 R >> -% 2301 0 obj +% 2302 0 obj << /Type /FontDescriptor /FontName /TPELEW+CMMI10 @@ -36160,9 +36227,9 @@ stream /StemV 72 /XHeight 431 /CharSet (/arrowhookleft/greater/less) -/FontFile 2300 0 R +/FontFile 2301 0 R >> -% 2303 0 obj +% 2304 0 obj << /Type /FontDescriptor /FontName /SOSTRQ+CMR10 @@ -36175,9 +36242,9 @@ stream /StemV 69 /XHeight 431 /CharSet (/bracketleft/bracketright/equal/parenleft/parenright/plus) -/FontFile 2302 0 R +/FontFile 2303 0 R >> -% 2305 0 obj +% 2306 0 obj << /Type /FontDescriptor /FontName /VKSUEJ+CMSY10 @@ -36190,9 +36257,9 @@ stream /StemV 40 /XHeight 431 /CharSet (/B/H/I/arrowleft/arrowright/asteriskmath/bar/bardbl/braceleft/braceright/element/greaterequal/lessequal/minus/negationslash/radical) -/FontFile 2304 0 R +/FontFile 2305 0 R >> -% 2307 0 obj +% 2308 0 obj << /Type /FontDescriptor /FontName /XIQVGP+CMTT10 @@ -36205,9 +36272,9 @@ stream /StemV 69 /XHeight 431 /CharSet (/A/B/C/D/E/F/H/I/J/K/L/M/N/O/P/R/S/T/U/V/W/X/Y/Z/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/nine/o/one/p/parenleft/parenright/percent/period/plus/q/quotesingle/r/s/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) -/FontFile 2306 0 R +/FontFile 2307 0 R >> -% 2309 0 obj +% 2310 0 obj << /Type /FontDescriptor /FontName /KPZRIA+CMTT8 @@ -36220,9 +36287,9 @@ stream /StemV 76 /XHeight 431 /CharSet (/b/c/d/e/i/l/n/p/r/s/t) -/FontFile 2308 0 R +/FontFile 2309 0 R >> -% 2311 0 obj +% 2312 0 obj << /Type /FontDescriptor /FontName /FYMOSO+CMTT9 @@ -36235,9 +36302,9 @@ stream /StemV 74 /XHeight 431 /CharSet (/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/R/S/T/U/V/W/X/Y/a/ampersand/asterisk/b/c/colon/comma/d/e/equal/f/four/g/greater/h/hyphen/i/j/k/l/less/m/n/nine/o/one/p/parenleft/parenright/percent/period/plus/q/quotesingle/r/s/semicolon/six/slash/t/two/u/underscore/v/w/x/y/z/zero) -/FontFile 2310 0 R +/FontFile 2311 0 R >> -% 2313 0 obj +% 2314 0 obj << /Type /FontDescriptor /FontName /ZSBXRF+PazoMath @@ -36250,9 +36317,9 @@ stream /StemV 95 /XHeight 0 /CharSet (/Omega/infinity/summation) -/FontFile 2312 0 R +/FontFile 2313 0 R >> -% 2315 0 obj +% 2316 0 obj << /Type /FontDescriptor /FontName /DUJUUF+PazoMath-Italic @@ -36265,9 +36332,9 @@ stream /StemV 65 /XHeight 0 /CharSet (/alpha/beta) -/FontFile 2314 0 R +/FontFile 2315 0 R >> -% 2317 0 obj +% 2318 0 obj << /Type /FontDescriptor /FontName /BDDEWM+URWPalladioL-Bold @@ -36280,9 +36347,9 @@ stream /StemV 123 /XHeight 471 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/Y/Z/a/b/c/colon/comma/d/e/eight/emdash/endash/equal/f/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/period/q/question/quoteright/r/s/seven/six/slash/t/three/two/u/v/w/x/y/z/zero) -/FontFile 2316 0 R +/FontFile 2317 0 R >> -% 2319 0 obj +% 2320 0 obj << /Type /FontDescriptor /FontName /GLTUCO+URWPalladioL-Roma @@ -36295,9 +36362,9 @@ stream /StemV 84 /XHeight 469 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/R/S/T/U/V/W/X/Y/Z/a/ampersand/asterisk/b/bracketleft/bracketright/bullet/c/colon/comma/d/e/eight/emdash/endash/equal/f/fi/five/fl/four/g/grave/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/period/plus/q/quotedblleft/quotedblright/quoteright/r/s/section/semicolon/seven/six/slash/t/three/two/u/v/w/x/y/z/zero) -/FontFile 2318 0 R +/FontFile 2319 0 R >> -% 2321 0 obj +% 2322 0 obj << /Type /FontDescriptor /FontName /ZZXCQL+URWPalladioL-Ital @@ -36310,453 +36377,453 @@ stream /StemV 78 /XHeight 482 /CharSet (/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/X/a/b/bracketleft/bracketright/c/colon/comma/d/e/f/fi/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/period/plus/q/quoteright/r/s/t/three/two/u/v/w/x/y/z/zero) -/FontFile 2320 0 R +/FontFile 2321 0 R >> -% 2292 0 obj +% 2293 0 obj << /Type /Encoding /Differences [2/fi/fl 30/grave 38/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon 61/equal 63/question 65/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/bracketleft 93/bracketright 97/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 147/quotedblleft/quotedblright/bullet/endash/emdash 167/section] >> -% 1883 0 obj +% 1884 0 obj << /Type /Font /Subtype /Type1 /BaseFont /MNPEHI+CMEX10 -/FontDescriptor 2297 0 R +/FontDescriptor 2298 0 R /FirstChar 114 /LastChar 114 -/Widths 2282 0 R -/ToUnicode 2322 0 R +/Widths 2283 0 R +/ToUnicode 2323 0 R >> -% 1814 0 obj +% 1815 0 obj << /Type /Font /Subtype /Type1 /BaseFont /SFGIZH+CMITT10 -/FontDescriptor 2299 0 R +/FontDescriptor 2300 0 R /FirstChar 33 /LastChar 121 -/Widths 2283 0 R -/ToUnicode 2323 0 R +/Widths 2284 0 R +/ToUnicode 2324 0 R >> % 1490 0 obj << /Type /Font /Subtype /Type1 /BaseFont /TPELEW+CMMI10 -/FontDescriptor 2301 0 R +/FontDescriptor 2302 0 R /FirstChar 44 /LastChar 62 -/Widths 2284 0 R -/ToUnicode 2324 0 R +/Widths 2285 0 R +/ToUnicode 2325 0 R >> % 942 0 obj << /Type /Font /Subtype /Type1 /BaseFont /SOSTRQ+CMR10 -/FontDescriptor 2303 0 R +/FontDescriptor 2304 0 R /FirstChar 40 /LastChar 93 -/Widths 2289 0 R -/ToUnicode 2325 0 R +/Widths 2290 0 R +/ToUnicode 2326 0 R >> % 941 0 obj << /Type /Font /Subtype /Type1 /BaseFont /VKSUEJ+CMSY10 -/FontDescriptor 2305 0 R +/FontDescriptor 2306 0 R /FirstChar 0 /LastChar 112 -/Widths 2290 0 R -/ToUnicode 2326 0 R +/Widths 2291 0 R +/ToUnicode 2327 0 R >> % 940 0 obj << /Type /Font /Subtype /Type1 /BaseFont /XIQVGP+CMTT10 -/FontDescriptor 2307 0 R +/FontDescriptor 2308 0 R /FirstChar 13 /LastChar 126 -/Widths 2291 0 R -/ToUnicode 2327 0 R +/Widths 2292 0 R +/ToUnicode 2328 0 R >> % 1000 0 obj << /Type /Font /Subtype /Type1 /BaseFont /KPZRIA+CMTT8 -/FontDescriptor 2309 0 R +/FontDescriptor 2310 0 R /FirstChar 98 /LastChar 116 -/Widths 2288 0 R -/ToUnicode 2328 0 R +/Widths 2289 0 R +/ToUnicode 2329 0 R >> % 1044 0 obj << /Type /Font /Subtype /Type1 /BaseFont /FYMOSO+CMTT9 -/FontDescriptor 2311 0 R +/FontDescriptor 2312 0 R /FirstChar 13 /LastChar 122 -/Widths 2287 0 R -/ToUnicode 2329 0 R +/Widths 2288 0 R +/ToUnicode 2330 0 R >> % 1285 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ZSBXRF+PazoMath -/FontDescriptor 2313 0 R +/FontDescriptor 2314 0 R /FirstChar 87 /LastChar 229 -/Widths 2285 0 R -/ToUnicode 2330 0 R +/Widths 2286 0 R +/ToUnicode 2331 0 R >> % 1157 0 obj << /Type /Font /Subtype /Type1 /BaseFont /DUJUUF+PazoMath-Italic -/FontDescriptor 2315 0 R +/FontDescriptor 2316 0 R /FirstChar 97 /LastChar 98 -/Widths 2286 0 R -/ToUnicode 2331 0 R +/Widths 2287 0 R +/ToUnicode 2332 0 R >> % 685 0 obj << /Type /Font /Subtype /Type1 /BaseFont /BDDEWM+URWPalladioL-Bold -/FontDescriptor 2317 0 R +/FontDescriptor 2318 0 R /FirstChar 2 /LastChar 151 -/Widths 2295 0 R -/Encoding 2292 0 R -/ToUnicode 2332 0 R +/Widths 2296 0 R +/Encoding 2293 0 R +/ToUnicode 2333 0 R >> % 687 0 obj << /Type /Font /Subtype /Type1 /BaseFont /GLTUCO+URWPalladioL-Roma -/FontDescriptor 2319 0 R +/FontDescriptor 2320 0 R /FirstChar 2 /LastChar 167 -/Widths 2293 0 R -/Encoding 2292 0 R -/ToUnicode 2333 0 R +/Widths 2294 0 R +/Encoding 2293 0 R +/ToUnicode 2334 0 R >> % 686 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ZZXCQL+URWPalladioL-Ital -/FontDescriptor 2321 0 R +/FontDescriptor 2322 0 R /FirstChar 2 /LastChar 122 -/Widths 2294 0 R -/Encoding 2292 0 R -/ToUnicode 2334 0 R +/Widths 2295 0 R +/Encoding 2293 0 R +/ToUnicode 2335 0 R >> % 688 0 obj << /Type /Pages /Count 6 -/Parent 2335 0 R +/Parent 2336 0 R /Kids [678 0 R 691 0 R 737 0 R 793 0 R 841 0 R 884 0 R] >> % 894 0 obj << /Type /Pages /Count 6 -/Parent 2335 0 R +/Parent 2336 0 R /Kids [892 0 R 906 0 R 924 0 R 937 0 R 950 0 R 962 0 R] >> % 978 0 obj << /Type /Pages /Count 6 -/Parent 2335 0 R +/Parent 2336 0 R /Kids [967 0 R 982 0 R 1003 0 R 1014 0 R 1022 0 R 1033 0 R] >> % 1052 0 obj << /Type /Pages /Count 6 -/Parent 2335 0 R +/Parent 2336 0 R /Kids [1049 0 R 1054 0 R 1058 0 R 1063 0 R 1070 0 R 1078 0 R] >> % 1087 0 obj << /Type /Pages /Count 6 -/Parent 2335 0 R +/Parent 2336 0 R /Kids [1083 0 R 1089 0 R 1093 0 R 1097 0 R 1103 0 R 1107 0 R] >> % 1117 0 obj << /Type /Pages /Count 6 -/Parent 2335 0 R +/Parent 2336 0 R /Kids [1113 0 R 1120 0 R 1126 0 R 1133 0 R 1139 0 R 1143 0 R] >> % 1158 0 obj << /Type /Pages /Count 6 -/Parent 2336 0 R +/Parent 2337 0 R /Kids [1154 0 R 1162 0 R 1172 0 R 1178 0 R 1189 0 R 1194 0 R] >> % 1205 0 obj << /Type /Pages /Count 6 -/Parent 2336 0 R +/Parent 2337 0 R /Kids [1201 0 R 1207 0 R 1215 0 R 1223 0 R 1228 0 R 1236 0 R] >> % 1244 0 obj << /Type /Pages /Count 6 -/Parent 2336 0 R +/Parent 2337 0 R /Kids [1241 0 R 1249 0 R 1254 0 R 1267 0 R 1274 0 R 1282 0 R] >> % 1300 0 obj << /Type /Pages /Count 6 -/Parent 2336 0 R +/Parent 2337 0 R /Kids [1293 0 R 1309 0 R 1315 0 R 1326 0 R 1332 0 R 1343 0 R] >> % 1351 0 obj << /Type /Pages /Count 6 -/Parent 2336 0 R +/Parent 2337 0 R /Kids [1348 0 R 1360 0 R 1365 0 R 1374 0 R 1380 0 R 1389 0 R] >> % 1400 0 obj << /Type /Pages /Count 6 -/Parent 2336 0 R +/Parent 2337 0 R /Kids [1396 0 R 1410 0 R 1417 0 R 1426 0 R 1434 0 R 1438 0 R] >> % 1457 0 obj << /Type /Pages /Count 6 -/Parent 2337 0 R +/Parent 2338 0 R /Kids [1453 0 R 1459 0 R 1465 0 R 1472 0 R 1476 0 R 1481 0 R] >> % 1492 0 obj << /Type /Pages /Count 6 -/Parent 2337 0 R +/Parent 2338 0 R /Kids [1487 0 R 1494 0 R 1505 0 R 1510 0 R 1519 0 R 1526 0 R] >> % 1534 0 obj << /Type /Pages /Count 6 -/Parent 2337 0 R +/Parent 2338 0 R /Kids [1531 0 R 1538 0 R 1542 0 R 1550 0 R 1555 0 R 1563 0 R] >> % 1577 0 obj << /Type /Pages /Count 6 -/Parent 2337 0 R +/Parent 2338 0 R /Kids [1569 0 R 1579 0 R 1592 0 R 1596 0 R 1609 0 R 1616 0 R] >> % 1626 0 obj << /Type /Pages /Count 6 -/Parent 2337 0 R +/Parent 2338 0 R /Kids [1623 0 R 1628 0 R 1635 0 R 1639 0 R 1648 0 R 1656 0 R] >> % 1663 0 obj << /Type /Pages /Count 6 -/Parent 2337 0 R +/Parent 2338 0 R /Kids [1660 0 R 1666 0 R 1670 0 R 1677 0 R 1682 0 R 1688 0 R] >> % 1698 0 obj << /Type /Pages /Count 6 -/Parent 2338 0 R +/Parent 2339 0 R /Kids [1694 0 R 1701 0 R 1707 0 R 1714 0 R 1722 0 R 1726 0 R] >> % 1739 0 obj << /Type /Pages /Count 6 -/Parent 2338 0 R -/Kids [1736 0 R 1741 0 R 1745 0 R 1759 0 R 1763 0 R 1769 0 R] ->> -% 1781 0 obj -<< -/Type /Pages -/Count 6 -/Parent 2338 0 R -/Kids [1775 0 R 1783 0 R 1787 0 R 1791 0 R 1795 0 R 1799 0 R] +/Parent 2339 0 R +/Kids [1736 0 R 1741 0 R 1745 0 R 1760 0 R 1764 0 R 1770 0 R] >> -% 1806 0 obj +% 1782 0 obj << /Type /Pages /Count 6 -/Parent 2338 0 R -/Kids [1803 0 R 1808 0 R 1816 0 R 1820 0 R 1828 0 R 1832 0 R] +/Parent 2339 0 R +/Kids [1776 0 R 1784 0 R 1788 0 R 1792 0 R 1796 0 R 1800 0 R] >> -% 1842 0 obj +% 1807 0 obj << /Type /Pages /Count 6 -/Parent 2338 0 R -/Kids [1839 0 R 1844 0 R 1851 0 R 1855 0 R 1862 0 R 1866 0 R] +/Parent 2339 0 R +/Kids [1804 0 R 1809 0 R 1817 0 R 1821 0 R 1829 0 R 1833 0 R] >> -% 1876 0 obj +% 1843 0 obj << /Type /Pages /Count 6 -/Parent 2338 0 R -/Kids [1873 0 R 1878 0 R 1888 0 R 1893 0 R 1900 0 R 1906 0 R] +/Parent 2339 0 R +/Kids [1840 0 R 1845 0 R 1852 0 R 1856 0 R 1863 0 R 1867 0 R] >> -% 1915 0 obj +% 1877 0 obj << /Type /Pages /Count 6 /Parent 2339 0 R -/Kids [1910 0 R 1917 0 R 1923 0 R 1929 0 R 1935 0 R 1941 0 R] +/Kids [1874 0 R 1879 0 R 1889 0 R 1894 0 R 1901 0 R 1907 0 R] >> -% 1953 0 obj +% 1916 0 obj << /Type /Pages /Count 6 -/Parent 2339 0 R -/Kids [1948 0 R 1956 0 R 1963 0 R 1970 0 R 1977 0 R 1983 0 R] +/Parent 2340 0 R +/Kids [1911 0 R 1918 0 R 1924 0 R 1930 0 R 1936 0 R 1942 0 R] >> -% 1990 0 obj +% 1954 0 obj << /Type /Pages /Count 6 -/Parent 2339 0 R -/Kids [1987 0 R 1995 0 R 2006 0 R 2010 0 R 2019 0 R 2023 0 R] +/Parent 2340 0 R +/Kids [1949 0 R 1957 0 R 1964 0 R 1971 0 R 1978 0 R 1984 0 R] >> -% 2035 0 obj +% 1991 0 obj << /Type /Pages /Count 6 -/Parent 2339 0 R -/Kids [2032 0 R 2038 0 R 2042 0 R 2049 0 R 2057 0 R 2064 0 R] +/Parent 2340 0 R +/Kids [1988 0 R 1996 0 R 2007 0 R 2011 0 R 2020 0 R 2024 0 R] >> -% 2071 0 obj +% 2036 0 obj << /Type /Pages /Count 6 -/Parent 2339 0 R -/Kids [2068 0 R 2076 0 R 2087 0 R 2092 0 R 2100 0 R 2109 0 R] +/Parent 2340 0 R +/Kids [2033 0 R 2039 0 R 2043 0 R 2050 0 R 2058 0 R 2065 0 R] >> -% 2116 0 obj +% 2072 0 obj << /Type /Pages /Count 6 -/Parent 2339 0 R -/Kids [2113 0 R 2124 0 R 2138 0 R 2147 0 R 2158 0 R 2187 0 R] +/Parent 2340 0 R +/Kids [2069 0 R 2077 0 R 2088 0 R 2093 0 R 2101 0 R 2110 0 R] >> -% 2212 0 obj +% 2117 0 obj << /Type /Pages /Count 6 /Parent 2340 0 R -/Kids [2207 0 R 2226 0 R 2242 0 R 2246 0 R 2250 0 R 2255 0 R] +/Kids [2114 0 R 2125 0 R 2139 0 R 2148 0 R 2159 0 R 2188 0 R] >> -% 2262 0 obj +% 2213 0 obj << /Type /Pages -/Count 4 -/Parent 2340 0 R -/Kids [2259 0 R 2264 0 R 2268 0 R 2277 0 R] +/Count 6 +/Parent 2341 0 R +/Kids [2208 0 R 2227 0 R 2243 0 R 2247 0 R 2251 0 R 2256 0 R] >> -% 2335 0 obj +% 2263 0 obj << /Type /Pages -/Count 36 +/Count 4 /Parent 2341 0 R -/Kids [688 0 R 894 0 R 978 0 R 1052 0 R 1087 0 R 1117 0 R] +/Kids [2260 0 R 2265 0 R 2269 0 R 2278 0 R] >> % 2336 0 obj << /Type /Pages /Count 36 -/Parent 2341 0 R -/Kids [1158 0 R 1205 0 R 1244 0 R 1300 0 R 1351 0 R 1400 0 R] +/Parent 2342 0 R +/Kids [688 0 R 894 0 R 978 0 R 1052 0 R 1087 0 R 1117 0 R] >> % 2337 0 obj << /Type /Pages /Count 36 -/Parent 2341 0 R -/Kids [1457 0 R 1492 0 R 1534 0 R 1577 0 R 1626 0 R 1663 0 R] +/Parent 2342 0 R +/Kids [1158 0 R 1205 0 R 1244 0 R 1300 0 R 1351 0 R 1400 0 R] >> % 2338 0 obj << /Type /Pages /Count 36 -/Parent 2341 0 R -/Kids [1698 0 R 1739 0 R 1781 0 R 1806 0 R 1842 0 R 1876 0 R] +/Parent 2342 0 R +/Kids [1457 0 R 1492 0 R 1534 0 R 1577 0 R 1626 0 R 1663 0 R] >> endstream endobj -2342 0 obj +2343 0 obj << /Type /ObjStm /N 100 -/First 890 -/Length 9788 ->> -stream -2339 0 2340 121 2341 206 2343 311 675 380 671 454 667 542 663 630 659 718 655 806 -651 894 647 982 643 1070 639 1158 635 1246 631 1334 627 1422 623 1510 619 1584 615 1696 -611 1770 607 1858 602 1946 598 2020 594 2145 590 2219 586 2293 582 2418 578 2492 574 2580 -570 2668 566 2756 562 2844 558 2932 554 3020 550 3108 546 3182 542 3307 538 3381 534 3469 -530 3557 526 3645 522 3733 518 3807 514 3932 510 4006 506 4094 502 4182 498 4256 494 4381 -490 4455 486 4543 482 4631 478 4719 474 4807 470 4895 466 4983 462 5071 458 5159 454 5247 -450 5335 446 5423 442 5511 438 5599 434 5687 430 5775 426 5849 422 5975 418 6049 414 6137 -410 6225 406 6313 401 6401 397 6489 393 6577 389 6665 385 6753 381 6841 377 6929 373 7017 -369 7105 365 7193 361 7281 357 7369 353 7457 349 7545 345 7633 341 7721 337 7809 333 7897 -329 7985 325 8073 321 8161 317 8249 313 8323 309 8449 305 8523 301 8611 297 8699 293 8773 +/First 892 +/Length 9786 +>> +stream +2339 0 2340 121 2341 242 2342 327 2344 432 675 501 671 575 667 663 663 751 659 839 +655 927 651 1015 647 1103 643 1191 639 1279 635 1367 631 1455 627 1543 623 1631 619 1705 +615 1817 611 1891 607 1979 602 2067 598 2141 594 2266 590 2340 586 2414 582 2539 578 2613 +574 2701 570 2789 566 2877 562 2965 558 3053 554 3141 550 3229 546 3303 542 3428 538 3502 +534 3590 530 3678 526 3766 522 3854 518 3928 514 4053 510 4127 506 4215 502 4303 498 4377 +494 4502 490 4576 486 4664 482 4752 478 4840 474 4928 470 5016 466 5104 462 5192 458 5280 +454 5368 450 5456 446 5544 442 5632 438 5720 434 5808 430 5896 426 5970 422 6096 418 6170 +414 6258 410 6346 406 6434 401 6522 397 6610 393 6698 389 6786 385 6874 381 6962 377 7050 +373 7138 369 7226 365 7314 361 7402 357 7490 353 7578 349 7666 345 7754 341 7842 337 7930 +333 8018 329 8106 325 8194 321 8282 317 8370 313 8444 309 8570 305 8644 301 8732 297 8820 % 2339 0 obj << /Type /Pages /Count 36 -/Parent 2341 0 R -/Kids [1915 0 R 1953 0 R 1990 0 R 2035 0 R 2071 0 R 2116 0 R] +/Parent 2342 0 R +/Kids [1698 0 R 1739 0 R 1782 0 R 1807 0 R 1843 0 R 1877 0 R] >> % 2340 0 obj << /Type /Pages -/Count 10 -/Parent 2341 0 R -/Kids [2212 0 R 2262 0 R] +/Count 36 +/Parent 2342 0 R +/Kids [1916 0 R 1954 0 R 1991 0 R 2036 0 R 2072 0 R 2117 0 R] >> % 2341 0 obj << /Type /Pages +/Count 10 +/Parent 2342 0 R +/Kids [2213 0 R 2263 0 R] +>> +% 2342 0 obj +<< +/Type /Pages /Count 190 -/Kids [2335 0 R 2336 0 R 2337 0 R 2338 0 R 2339 0 R 2340 0 R] +/Kids [2336 0 R 2337 0 R 2338 0 R 2339 0 R 2340 0 R 2341 0 R] >> -% 2343 0 obj +% 2344 0 obj << /Type /Outlines /First 4 0 R @@ -37528,6 +37595,27 @@ stream /Parent 293 0 R /Next 301 0 R >> + +endstream +endobj +2345 0 obj +<< +/Type /ObjStm +/N 100 +/First 893 +/Length 11990 +>> +stream +293 0 289 125 285 199 281 287 277 375 273 463 269 551 265 639 261 727 257 815 +253 903 249 991 245 1079 241 1167 237 1255 233 1343 229 1431 225 1505 221 1630 217 1703 +213 1790 209 1864 205 1952 200 2040 196 2128 192 2216 188 2290 184 2416 180 2490 176 2578 +172 2666 168 2754 164 2842 160 2930 156 3018 152 3106 148 3194 144 3282 140 3370 136 3458 +132 3546 128 3634 124 3722 120 3810 116 3898 112 3986 108 4060 104 4186 100 4259 96 4344 +92 4427 88 4509 84 4591 80 4673 76 4755 72 4837 68 4919 64 5001 60 5083 56 5165 +52 5247 48 5329 44 5398 40 5507 36 5627 32 5696 28 5752 24 5871 20 5953 16 6022 +12 6140 8 6220 4 6285 2346 6378 2347 6574 2348 6747 2349 6927 2350 7104 2351 7281 2352 7461 +2353 7639 2354 7819 2355 7997 2356 8177 2357 8352 2358 8517 2359 8688 2360 8858 2361 9030 2362 9200 +2363 9372 2364 9541 2365 9710 2366 9882 2367 10052 2368 10224 2369 10394 2370 10566 2371 10736 2372 10908 % 293 0 obj << /Title 294 0 R @@ -37539,27 +37627,6 @@ stream /Last 309 0 R /Count -4 >> - -endstream -endobj -2344 0 obj -<< -/Type /ObjStm -/N 100 -/First 893 -/Length 12099 ->> -stream -289 0 285 74 281 162 277 250 273 338 269 426 265 514 261 602 257 690 253 778 -249 866 245 954 241 1042 237 1130 233 1218 229 1306 225 1380 221 1505 217 1578 213 1665 -209 1739 205 1827 200 1915 196 2003 192 2091 188 2165 184 2291 180 2365 176 2453 172 2541 -168 2629 164 2717 160 2805 156 2893 152 2981 148 3069 144 3157 140 3245 136 3333 132 3421 -128 3509 124 3597 120 3685 116 3773 112 3861 108 3935 104 4061 100 4134 96 4219 92 4302 -88 4384 84 4466 80 4548 76 4630 72 4712 68 4794 64 4876 60 4958 56 5040 52 5122 -48 5204 44 5273 40 5382 36 5502 32 5571 28 5627 24 5746 20 5828 16 5897 12 6015 -8 6095 4 6160 2345 6253 2346 6449 2347 6622 2348 6802 2349 6979 2350 7156 2351 7336 2352 7514 -2353 7694 2354 7872 2355 8052 2356 8225 2357 8390 2358 8562 2359 8732 2360 8904 2361 9073 2362 9242 -2363 9414 2364 9584 2365 9756 2366 9926 2367 10098 2368 10268 2369 10440 2370 10610 2371 10782 2372 10974 % 289 0 obj << /Title 290 0 R @@ -38138,150 +38205,145 @@ stream << /Title 5 0 R /A 1 0 R -/Parent 2343 0 R +/Parent 2344 0 R /First 8 0 R /Last 619 0 R /Count -14 >> -% 2345 0 obj +% 2346 0 obj << -/Names [(Doc-Start) 684 0 R (Hfootnote.1) 943 0 R (Hfootnote.2) 944 0 R (Hfootnote.3) 999 0 R (Hfootnote.4) 1998 0 R (Hfootnote.5) 2082 0 R] +/Names [(Doc-Start) 684 0 R (Hfootnote.1) 943 0 R (Hfootnote.2) 944 0 R (Hfootnote.3) 999 0 R (Hfootnote.4) 1999 0 R (Hfootnote.5) 2083 0 R] /Limits [(Doc-Start) (Hfootnote.5)] >> -% 2346 0 obj +% 2347 0 obj << /Names [(Item.1) 970 0 R (Item.10) 986 0 R (Item.100) 1711 0 R (Item.101) 1717 0 R (Item.102) 1718 0 R (Item.103) 1729 0 R] /Limits [(Item.1) (Item.103)] >> -% 2347 0 obj +% 2348 0 obj << /Names [(Item.104) 1730 0 R (Item.105) 1731 0 R (Item.106) 1748 0 R (Item.107) 1749 0 R (Item.108) 1750 0 R (Item.109) 1751 0 R] /Limits [(Item.104) (Item.109)] >> -% 2348 0 obj +% 2349 0 obj << /Names [(Item.11) 987 0 R (Item.110) 1752 0 R (Item.111) 1753 0 R (Item.112) 1754 0 R (Item.113) 1755 0 R (Item.114) 1756 0 R] /Limits [(Item.11) (Item.114)] >> -% 2349 0 obj -<< -/Names [(Item.115) 1757 0 R (Item.116) 1766 0 R (Item.117) 1767 0 R (Item.118) 1772 0 R (Item.119) 1773 0 R (Item.12) 988 0 R] -/Limits [(Item.115) (Item.12)] ->> % 2350 0 obj << -/Names [(Item.120) 1778 0 R (Item.121) 1779 0 R (Item.122) 1780 0 R (Item.123) 1811 0 R (Item.124) 1812 0 R (Item.125) 1813 0 R] -/Limits [(Item.120) (Item.125)] +/Names [(Item.115) 1757 0 R (Item.116) 1758 0 R (Item.117) 1767 0 R (Item.118) 1768 0 R (Item.119) 1773 0 R (Item.12) 988 0 R] +/Limits [(Item.115) (Item.12)] >> % 2351 0 obj << -/Names [(Item.126) 1823 0 R (Item.127) 1824 0 R (Item.128) 1825 0 R (Item.129) 1835 0 R (Item.13) 989 0 R (Item.130) 1836 0 R] -/Limits [(Item.126) (Item.130)] +/Names [(Item.120) 1774 0 R (Item.121) 1779 0 R (Item.122) 1780 0 R (Item.123) 1781 0 R (Item.124) 1812 0 R (Item.125) 1813 0 R] +/Limits [(Item.120) (Item.125)] >> % 2352 0 obj << -/Names [(Item.131) 1837 0 R (Item.132) 1847 0 R (Item.133) 1848 0 R (Item.134) 1849 0 R (Item.135) 1858 0 R (Item.136) 1859 0 R] -/Limits [(Item.131) (Item.136)] +/Names [(Item.126) 1814 0 R (Item.127) 1824 0 R (Item.128) 1825 0 R (Item.129) 1826 0 R (Item.13) 989 0 R (Item.130) 1836 0 R] +/Limits [(Item.126) (Item.130)] >> % 2353 0 obj << -/Names [(Item.137) 1860 0 R (Item.138) 1869 0 R (Item.139) 1870 0 R (Item.14) 990 0 R (Item.140) 1871 0 R (Item.141) 1881 0 R] -/Limits [(Item.137) (Item.141)] +/Names [(Item.131) 1837 0 R (Item.132) 1838 0 R (Item.133) 1848 0 R (Item.134) 1849 0 R (Item.135) 1850 0 R (Item.136) 1859 0 R] +/Limits [(Item.131) (Item.136)] >> % 2354 0 obj << -/Names [(Item.142) 1882 0 R (Item.143) 1884 0 R (Item.144) 1885 0 R (Item.145) 1886 0 R (Item.146) 1891 0 R (Item.147) 1896 0 R] -/Limits [(Item.142) (Item.147)] +/Names [(Item.137) 1860 0 R (Item.138) 1861 0 R (Item.139) 1870 0 R (Item.14) 990 0 R (Item.140) 1871 0 R (Item.141) 1872 0 R] +/Limits [(Item.137) (Item.141)] >> % 2355 0 obj << -/Names [(Item.148) 2151 0 R (Item.149) 2152 0 R (Item.15) 991 0 R (Item.150) 2253 0 R (Item.16) 992 0 R (Item.17) 993 0 R] -/Limits [(Item.148) (Item.17)] +/Names [(Item.142) 1882 0 R (Item.143) 1883 0 R (Item.144) 1885 0 R (Item.145) 1886 0 R (Item.146) 1887 0 R (Item.147) 1892 0 R] +/Limits [(Item.142) (Item.147)] >> % 2356 0 obj << -/Names [(Item.18) 994 0 R (Item.19) 995 0 R (Item.2) 971 0 R (Item.20) 996 0 R (Item.21) 997 0 R (Item.22) 998 0 R] -/Limits [(Item.18) (Item.22)] +/Names [(Item.148) 1897 0 R (Item.149) 2152 0 R (Item.15) 991 0 R (Item.150) 2153 0 R (Item.151) 2254 0 R (Item.16) 992 0 R] +/Limits [(Item.148) (Item.16)] >> % 2357 0 obj << -/Names [(Item.23) 1006 0 R (Item.24) 1007 0 R (Item.25) 1008 0 R (Item.26) 1009 0 R (Item.27) 1010 0 R (Item.28) 1011 0 R] -/Limits [(Item.23) (Item.28)] +/Names [(Item.17) 993 0 R (Item.18) 994 0 R (Item.19) 995 0 R (Item.2) 971 0 R (Item.20) 996 0 R (Item.21) 997 0 R] +/Limits [(Item.17) (Item.21)] >> % 2358 0 obj << -/Names [(Item.29) 1025 0 R (Item.3) 972 0 R (Item.30) 1026 0 R (Item.31) 1027 0 R (Item.32) 1028 0 R (Item.33) 1029 0 R] -/Limits [(Item.29) (Item.33)] +/Names [(Item.22) 998 0 R (Item.23) 1006 0 R (Item.24) 1007 0 R (Item.25) 1008 0 R (Item.26) 1009 0 R (Item.27) 1010 0 R] +/Limits [(Item.22) (Item.27)] >> % 2359 0 obj << -/Names [(Item.34) 1036 0 R (Item.35) 1037 0 R (Item.36) 1038 0 R (Item.37) 1039 0 R (Item.38) 1040 0 R (Item.39) 1041 0 R] -/Limits [(Item.34) (Item.39)] +/Names [(Item.28) 1011 0 R (Item.29) 1025 0 R (Item.3) 972 0 R (Item.30) 1026 0 R (Item.31) 1027 0 R (Item.32) 1028 0 R] +/Limits [(Item.28) (Item.32)] >> % 2360 0 obj << -/Names [(Item.4) 973 0 R (Item.40) 1042 0 R (Item.41) 1043 0 R (Item.42) 1086 0 R (Item.43) 1100 0 R (Item.44) 1101 0 R] -/Limits [(Item.4) (Item.44)] +/Names [(Item.33) 1029 0 R (Item.34) 1036 0 R (Item.35) 1037 0 R (Item.36) 1038 0 R (Item.37) 1039 0 R (Item.38) 1040 0 R] +/Limits [(Item.33) (Item.38)] >> % 2361 0 obj << -/Names [(Item.45) 1181 0 R (Item.46) 1210 0 R (Item.47) 1231 0 R (Item.48) 1257 0 R (Item.49) 1429 0 R (Item.5) 974 0 R] -/Limits [(Item.45) (Item.5)] +/Names [(Item.39) 1041 0 R (Item.4) 973 0 R (Item.40) 1042 0 R (Item.41) 1043 0 R (Item.42) 1086 0 R (Item.43) 1100 0 R] +/Limits [(Item.39) (Item.43)] >> % 2362 0 obj << -/Names [(Item.50) 1430 0 R (Item.51) 1431 0 R (Item.52) 1484 0 R (Item.53) 1491 0 R (Item.54) 1497 0 R (Item.55) 1498 0 R] -/Limits [(Item.50) (Item.55)] +/Names [(Item.44) 1101 0 R (Item.45) 1181 0 R (Item.46) 1210 0 R (Item.47) 1231 0 R (Item.48) 1257 0 R (Item.49) 1429 0 R] +/Limits [(Item.44) (Item.49)] >> % 2363 0 obj << -/Names [(Item.56) 1499 0 R (Item.57) 1500 0 R (Item.58) 1501 0 R (Item.59) 1513 0 R (Item.6) 975 0 R (Item.60) 1514 0 R] -/Limits [(Item.56) (Item.60)] +/Names [(Item.5) 974 0 R (Item.50) 1430 0 R (Item.51) 1431 0 R (Item.52) 1484 0 R (Item.53) 1491 0 R (Item.54) 1497 0 R] +/Limits [(Item.5) (Item.54)] >> % 2364 0 obj << -/Names [(Item.61) 1515 0 R (Item.62) 1522 0 R (Item.63) 1545 0 R (Item.64) 1546 0 R (Item.65) 1553 0 R (Item.66) 1558 0 R] -/Limits [(Item.61) (Item.66)] +/Names [(Item.55) 1498 0 R (Item.56) 1499 0 R (Item.57) 1500 0 R (Item.58) 1501 0 R (Item.59) 1513 0 R (Item.6) 975 0 R] +/Limits [(Item.55) (Item.6)] >> % 2365 0 obj << -/Names [(Item.67) 1559 0 R (Item.68) 1560 0 R (Item.69) 1572 0 R (Item.7) 976 0 R (Item.70) 1573 0 R (Item.71) 1574 0 R] -/Limits [(Item.67) (Item.71)] +/Names [(Item.60) 1514 0 R (Item.61) 1515 0 R (Item.62) 1522 0 R (Item.63) 1545 0 R (Item.64) 1546 0 R (Item.65) 1553 0 R] +/Limits [(Item.60) (Item.65)] >> % 2366 0 obj << -/Names [(Item.72) 1575 0 R (Item.73) 1576 0 R (Item.74) 1582 0 R (Item.75) 1583 0 R (Item.76) 1584 0 R (Item.77) 1585 0 R] -/Limits [(Item.72) (Item.77)] +/Names [(Item.66) 1558 0 R (Item.67) 1559 0 R (Item.68) 1560 0 R (Item.69) 1572 0 R (Item.7) 976 0 R (Item.70) 1573 0 R] +/Limits [(Item.66) (Item.70)] >> % 2367 0 obj << -/Names [(Item.78) 1586 0 R (Item.79) 1587 0 R (Item.8) 977 0 R (Item.80) 1599 0 R (Item.81) 1600 0 R (Item.82) 1601 0 R] -/Limits [(Item.78) (Item.82)] +/Names [(Item.71) 1574 0 R (Item.72) 1575 0 R (Item.73) 1576 0 R (Item.74) 1582 0 R (Item.75) 1583 0 R (Item.76) 1584 0 R] +/Limits [(Item.71) (Item.76)] >> % 2368 0 obj << -/Names [(Item.83) 1602 0 R (Item.84) 1603 0 R (Item.85) 1604 0 R (Item.86) 1605 0 R (Item.87) 1619 0 R (Item.88) 1631 0 R] -/Limits [(Item.83) (Item.88)] +/Names [(Item.77) 1585 0 R (Item.78) 1586 0 R (Item.79) 1587 0 R (Item.8) 977 0 R (Item.80) 1599 0 R (Item.81) 1600 0 R] +/Limits [(Item.77) (Item.81)] >> % 2369 0 obj << -/Names [(Item.89) 1642 0 R (Item.9) 985 0 R (Item.90) 1643 0 R (Item.91) 1651 0 R (Item.92) 1652 0 R (Item.93) 1673 0 R] -/Limits [(Item.89) (Item.93)] +/Names [(Item.82) 1601 0 R (Item.83) 1602 0 R (Item.84) 1603 0 R (Item.85) 1604 0 R (Item.86) 1605 0 R (Item.87) 1619 0 R] +/Limits [(Item.82) (Item.87)] >> % 2370 0 obj << -/Names [(Item.94) 1674 0 R (Item.95) 1685 0 R (Item.96) 1691 0 R (Item.97) 1697 0 R (Item.98) 1704 0 R (Item.99) 1710 0 R] -/Limits [(Item.94) (Item.99)] +/Names [(Item.88) 1631 0 R (Item.89) 1642 0 R (Item.9) 985 0 R (Item.90) 1643 0 R (Item.91) 1651 0 R (Item.92) 1652 0 R] +/Limits [(Item.88) (Item.92)] >> % 2371 0 obj << -/Names [(algocf.1) 2156 0 R (algocf.2) 2203 0 R (algocfline.1) 2142 0 R (algocfline.2) 2210 0 R (cite.2007c) 957 0 R (cite.2007d) 958 0 R] -/Limits [(algocf.1) (cite.2007d)] +/Names [(Item.93) 1673 0 R (Item.94) 1674 0 R (Item.95) 1685 0 R (Item.96) 1691 0 R (Item.97) 1697 0 R (Item.98) 1704 0 R] +/Limits [(Item.93) (Item.98)] >> % 2372 0 obj << -/Names [(cite.BERTACCINIFILIPPONE) 2013 0 R (cite.BLACS) 933 0 R (cite.BLAS1) 915 0 R (cite.BLAS2) 916 0 R (cite.BLAS3) 917 0 R (cite.CaFiRo:2014) 2128 0 R] -/Limits [(cite.BERTACCINIFILIPPONE) (cite.CaFiRo:2014)] +/Names [(Item.99) 1710 0 R (algocf.1) 2157 0 R (algocf.2) 2204 0 R (algocfline.1) 2143 0 R (algocfline.2) 2211 0 R (cite.2007c) 957 0 R] +/Limits [(Item.99) (cite.2007c)] >> endstream @@ -38291,527 +38353,527 @@ endobj /Type /ObjStm /N 100 /First 1040 -/Length 19171 ->> -stream -2373 0 2375 244 2376 465 2377 671 2378 861 2379 1043 2380 1239 2381 1465 2382 1685 2383 1913 -2384 2149 2385 2385 2386 2613 2387 2807 2388 2987 2389 3166 2390 3346 2391 3525 2392 3705 2393 3883 -2394 4061 2395 4241 2396 4420 2397 4600 2398 4779 2399 4959 2400 5138 2401 5318 2402 5497 2403 5669 -2404 5841 2405 6011 2406 6183 2407 6352 2408 6521 2409 6693 2410 6863 2411 7035 2412 7205 2413 7377 -2414 7547 2415 7719 2416 7890 2417 8062 2418 8235 2419 8433 2420 8628 2421 8825 2422 9013 2423 9195 -2424 9389 2425 9619 2426 9849 2427 10070 2428 10291 2429 10521 2430 10745 2431 10967 2432 11194 2433 11424 -2434 11652 2435 11878 2436 12102 2437 12332 2438 12556 2439 12778 2440 13000 2441 13251 2442 13512 2443 13769 -2444 14039 2445 14306 2446 14568 2447 14830 2448 15008 2449 15186 2450 15362 2451 15535 2452 15606 2453 15720 -2454 15832 2455 15943 2456 16054 2457 16171 2458 16294 2459 16412 2460 16524 2461 16637 2462 16749 2463 16859 -2464 16973 2465 17096 2466 17222 2467 17348 2468 17479 2469 17603 2470 17695 2471 17814 2472 17934 2473 18047 +/Length 19303 +>> +stream +2373 0 2375 205 2376 459 2377 678 2378 880 2379 1074 2380 1254 2381 1442 2382 1668 2383 1888 +2384 2113 2385 2349 2386 2585 2387 2815 2388 3015 2389 3195 2390 3374 2391 3554 2392 3733 2393 3913 +2394 4092 2395 4272 2396 4450 2397 4628 2398 4808 2399 4987 2400 5167 2401 5346 2402 5526 2403 5705 +2404 5878 2405 6050 2406 6220 2407 6392 2408 6562 2409 6734 2410 6903 2411 7072 2412 7244 2413 7414 +2414 7586 2415 7756 2416 7928 2417 8099 2418 8271 2419 8441 2420 8637 2421 8831 2422 9029 2423 9217 +2424 9400 2425 9579 2426 9809 2427 10039 2428 10262 2429 10482 2430 10710 2431 10935 2432 11157 2433 11383 +2434 11613 2435 11842 2436 12069 2437 12291 2438 12521 2439 12746 2440 12968 2441 13190 2442 13436 2443 13698 +2444 13954 2445 14222 2446 14490 2447 14752 2448 15014 2449 15214 2450 15394 2451 15569 2452 15738 2453 15834 +2454 15948 2455 16060 2456 16171 2457 16282 2458 16402 2459 16525 2460 16643 2461 16756 2462 16868 2463 16980 +2464 17091 2465 17203 2466 17316 2467 17442 2468 17567 2469 17698 2470 17822 2471 17914 2472 18033 2473 18151 % 2373 0 obj << -/Names [(cite.DesPat:11) 910 0 R (cite.DesignPatterns) 1074 0 R (cite.Filippone:2017:SMM:3034774.3017994) 2281 0 R (cite.KIVA3PSBLAS) 2274 0 R (cite.METIS) 945 0 R (cite.MPI1) 2280 0 R] -/Limits [(cite.DesPat:11) (cite.MPI1)] +/Names [(cite.2007d) 958 0 R (cite.BERTACCINIFILIPPONE) 2014 0 R (cite.BLACS) 933 0 R (cite.BLAS1) 915 0 R (cite.BLAS2) 916 0 R (cite.BLAS3) 917 0 R] +/Limits [(cite.2007d) (cite.BLAS3)] >> % 2375 0 obj << -/Names [(cite.MRC:11) 2143 0 R (cite.OurTechRep) 2129 0 R (cite.PARA04FOREST) 2272 0 R (cite.PSBLAS) 2273 0 R (cite.RouXiaXu:11) 911 0 R (cite.Sparse03) 909 0 R] -/Limits [(cite.MRC:11) (cite.Sparse03)] +/Names [(cite.CaFiRo:2014) 2129 0 R (cite.DesPat:11) 910 0 R (cite.DesignPatterns) 1074 0 R (cite.Filippone:2017:SMM:3034774.3017994) 2282 0 R (cite.KIVA3PSBLAS) 2275 0 R (cite.METIS) 945 0 R] +/Limits [(cite.CaFiRo:2014) (cite.METIS)] >> % 2376 0 obj << -/Names [(cite.machiels) 912 0 R (cite.metcalf) 908 0 R (cite.sblas02) 914 0 R (cite.sblas97) 913 0 R (descdata) 1017 0 R (equation.4.1) 1296 0 R] -/Limits [(cite.machiels) (equation.4.1)] +/Names [(cite.MPI1) 2281 0 R (cite.MRC:11) 2144 0 R (cite.OurTechRep) 2130 0 R (cite.PARA04FOREST) 2273 0 R (cite.PSBLAS) 2274 0 R (cite.RouXiaXu:11) 911 0 R] +/Limits [(cite.MPI1) (cite.RouXiaXu:11)] >> % 2377 0 obj << -/Names [(equation.4.2) 1297 0 R (equation.4.3) 1298 0 R (figure.1) 927 0 R (figure.2) 953 0 R (figure.3) 1399 0 R (figure.4) 1432 0 R] -/Limits [(equation.4.2) (figure.4)] +/Names [(cite.Sparse03) 909 0 R (cite.machiels) 912 0 R (cite.metcalf) 908 0 R (cite.sblas02) 914 0 R (cite.sblas97) 913 0 R (descdata) 1017 0 R] +/Limits [(cite.Sparse03) (descdata)] >> % 2378 0 obj << -/Names [(figure.5) 2150 0 R (figure.6) 2145 0 R (figure.7) 2190 0 R (figure.8) 2202 0 R (figure.9) 2229 0 R (listing.1) 1045 0 R] -/Limits [(figure.5) (listing.1)] +/Names [(equation.4.1) 1296 0 R (equation.4.2) 1297 0 R (equation.4.3) 1298 0 R (figure.1) 927 0 R (figure.2) 953 0 R (figure.3) 1399 0 R] +/Limits [(equation.4.1) (figure.3)] >> % 2379 0 obj << -/Names [(listing.2) 1075 0 R (listing.3) 1118 0 R (listing.4) 1137 0 R (listing.5) 1903 0 R (listing.6) 1904 0 R (lstlisting.-1) 1258 0 R] -/Limits [(listing.2) (lstlisting.-1)] +/Names [(figure.4) 1432 0 R (figure.5) 2151 0 R (figure.6) 2146 0 R (figure.7) 2191 0 R (figure.8) 2203 0 R (figure.9) 2230 0 R] +/Limits [(figure.4) (figure.9)] >> % 2380 0 obj << -/Names [(lstlisting.-10) 1973 0 R (lstlisting.-11) 1980 0 R (lstlisting.-12) 2079 0 R (lstlisting.-13) 2103 0 R (lstlisting.-14) 2161 0 R (lstlisting.-2) 1913 0 R] -/Limits [(lstlisting.-10) (lstlisting.-2)] +/Names [(listing.1) 1045 0 R (listing.2) 1075 0 R (listing.3) 1118 0 R (listing.4) 1137 0 R (listing.5) 1904 0 R (listing.6) 1905 0 R] +/Limits [(listing.1) (listing.6)] >> % 2381 0 obj << -/Names [(lstlisting.-3) 1920 0 R (lstlisting.-4) 1926 0 R (lstlisting.-5) 1932 0 R (lstlisting.-6) 1944 0 R (lstlisting.-7) 1951 0 R (lstlisting.-8) 1959 0 R] -/Limits [(lstlisting.-3) (lstlisting.-8)] +/Names [(lstlisting.-1) 1258 0 R (lstlisting.-10) 1974 0 R (lstlisting.-11) 1981 0 R (lstlisting.-12) 2080 0 R (lstlisting.-13) 2104 0 R (lstlisting.-14) 2162 0 R] +/Limits [(lstlisting.-1) (lstlisting.-14)] >> % 2382 0 obj << -/Names [(lstlisting.-9) 1966 0 R (lstnumber.-1.1) 1259 0 R (lstnumber.-1.2) 1260 0 R (lstnumber.-1.3) 1261 0 R (lstnumber.-1.4) 1262 0 R (lstnumber.-10.1) 1974 0 R] -/Limits [(lstlisting.-9) (lstnumber.-10.1)] +/Names [(lstlisting.-2) 1914 0 R (lstlisting.-3) 1921 0 R (lstlisting.-4) 1927 0 R (lstlisting.-5) 1933 0 R (lstlisting.-6) 1945 0 R (lstlisting.-7) 1952 0 R] +/Limits [(lstlisting.-2) (lstlisting.-7)] >> % 2383 0 obj << -/Names [(lstnumber.-11.1) 1981 0 R (lstnumber.-12.1) 2080 0 R (lstnumber.-12.2) 2081 0 R (lstnumber.-13.1) 2104 0 R (lstnumber.-13.2) 2105 0 R (lstnumber.-14.1) 2162 0 R] -/Limits [(lstnumber.-11.1) (lstnumber.-14.1)] +/Names [(lstlisting.-8) 1960 0 R (lstlisting.-9) 1967 0 R (lstnumber.-1.1) 1259 0 R (lstnumber.-1.2) 1260 0 R (lstnumber.-1.3) 1261 0 R (lstnumber.-1.4) 1262 0 R] +/Limits [(lstlisting.-8) (lstnumber.-1.4)] >> % 2384 0 obj << -/Names [(lstnumber.-14.2) 2163 0 R (lstnumber.-14.3) 2164 0 R (lstnumber.-14.4) 2165 0 R (lstnumber.-14.5) 2166 0 R (lstnumber.-14.6) 2167 0 R (lstnumber.-14.7) 2168 0 R] -/Limits [(lstnumber.-14.2) (lstnumber.-14.7)] +/Names [(lstnumber.-10.1) 1975 0 R (lstnumber.-11.1) 1982 0 R (lstnumber.-12.1) 2081 0 R (lstnumber.-12.2) 2082 0 R (lstnumber.-13.1) 2105 0 R (lstnumber.-13.2) 2106 0 R] +/Limits [(lstnumber.-10.1) (lstnumber.-13.2)] >> % 2385 0 obj << -/Names [(lstnumber.-2.1) 1914 0 R (lstnumber.-3.1) 1921 0 R (lstnumber.-4.1) 1927 0 R (lstnumber.-5.1) 1933 0 R (lstnumber.-6.1) 1945 0 R (lstnumber.-7.1) 1952 0 R] -/Limits [(lstnumber.-2.1) (lstnumber.-7.1)] +/Names [(lstnumber.-14.1) 2163 0 R (lstnumber.-14.2) 2164 0 R (lstnumber.-14.3) 2165 0 R (lstnumber.-14.4) 2166 0 R (lstnumber.-14.5) 2167 0 R (lstnumber.-14.6) 2168 0 R] +/Limits [(lstnumber.-14.1) (lstnumber.-14.6)] >> % 2386 0 obj << -/Names [(lstnumber.-8.1) 1960 0 R (lstnumber.-9.1) 1967 0 R (page.1) 683 0 R (page.10) 1016 0 R (page.100) 1679 0 R (page.101) 1684 0 R] -/Limits [(lstnumber.-8.1) (page.101)] +/Names [(lstnumber.-14.7) 2169 0 R (lstnumber.-2.1) 1915 0 R (lstnumber.-3.1) 1922 0 R (lstnumber.-4.1) 1928 0 R (lstnumber.-5.1) 1934 0 R (lstnumber.-6.1) 1946 0 R] +/Limits [(lstnumber.-14.7) (lstnumber.-6.1)] >> % 2387 0 obj << -/Names [(page.102) 1690 0 R (page.103) 1696 0 R (page.104) 1703 0 R (page.105) 1709 0 R (page.106) 1716 0 R (page.107) 1724 0 R] -/Limits [(page.102) (page.107)] +/Names [(lstnumber.-7.1) 1953 0 R (lstnumber.-8.1) 1961 0 R (lstnumber.-9.1) 1968 0 R (page.1) 683 0 R (page.10) 1016 0 R (page.100) 1679 0 R] +/Limits [(lstnumber.-7.1) (page.100)] >> % 2388 0 obj << -/Names [(page.108) 1728 0 R (page.109) 1738 0 R (page.11) 1024 0 R (page.110) 1743 0 R (page.111) 1747 0 R (page.112) 1761 0 R] -/Limits [(page.108) (page.112)] +/Names [(page.101) 1684 0 R (page.102) 1690 0 R (page.103) 1696 0 R (page.104) 1703 0 R (page.105) 1709 0 R (page.106) 1716 0 R] +/Limits [(page.101) (page.106)] >> % 2389 0 obj << -/Names [(page.113) 1765 0 R (page.114) 1771 0 R (page.115) 1777 0 R (page.116) 1785 0 R (page.117) 1789 0 R (page.118) 1793 0 R] -/Limits [(page.113) (page.118)] +/Names [(page.107) 1724 0 R (page.108) 1728 0 R (page.109) 1738 0 R (page.11) 1024 0 R (page.110) 1743 0 R (page.111) 1747 0 R] +/Limits [(page.107) (page.111)] >> % 2390 0 obj << -/Names [(page.119) 1797 0 R (page.12) 1035 0 R (page.120) 1801 0 R (page.121) 1805 0 R (page.122) 1810 0 R (page.123) 1818 0 R] -/Limits [(page.119) (page.123)] +/Names [(page.112) 1762 0 R (page.113) 1766 0 R (page.114) 1772 0 R (page.115) 1778 0 R (page.116) 1786 0 R (page.117) 1790 0 R] +/Limits [(page.112) (page.117)] >> % 2391 0 obj << -/Names [(page.124) 1822 0 R (page.125) 1830 0 R (page.126) 1834 0 R (page.127) 1841 0 R (page.128) 1846 0 R (page.129) 1853 0 R] -/Limits [(page.124) (page.129)] +/Names [(page.118) 1794 0 R (page.119) 1798 0 R (page.12) 1035 0 R (page.120) 1802 0 R (page.121) 1806 0 R (page.122) 1811 0 R] +/Limits [(page.118) (page.122)] >> % 2392 0 obj << -/Names [(page.13) 1051 0 R (page.130) 1857 0 R (page.131) 1864 0 R (page.132) 1868 0 R (page.133) 1875 0 R (page.134) 1880 0 R] -/Limits [(page.13) (page.134)] +/Names [(page.123) 1819 0 R (page.124) 1823 0 R (page.125) 1831 0 R (page.126) 1835 0 R (page.127) 1842 0 R (page.128) 1847 0 R] +/Limits [(page.123) (page.128)] >> % 2393 0 obj << -/Names [(page.135) 1890 0 R (page.136) 1895 0 R (page.137) 1902 0 R (page.138) 1908 0 R (page.139) 1912 0 R (page.14) 1056 0 R] -/Limits [(page.135) (page.14)] +/Names [(page.129) 1854 0 R (page.13) 1051 0 R (page.130) 1858 0 R (page.131) 1865 0 R (page.132) 1869 0 R (page.133) 1876 0 R] +/Limits [(page.129) (page.133)] >> % 2394 0 obj << -/Names [(page.140) 1919 0 R (page.141) 1925 0 R (page.142) 1931 0 R (page.143) 1937 0 R (page.144) 1943 0 R (page.145) 1950 0 R] -/Limits [(page.140) (page.145)] +/Names [(page.134) 1881 0 R (page.135) 1891 0 R (page.136) 1896 0 R (page.137) 1903 0 R (page.138) 1909 0 R (page.139) 1913 0 R] +/Limits [(page.134) (page.139)] >> % 2395 0 obj << -/Names [(page.146) 1958 0 R (page.147) 1965 0 R (page.148) 1972 0 R (page.149) 1979 0 R (page.15) 1060 0 R (page.150) 1985 0 R] -/Limits [(page.146) (page.150)] +/Names [(page.14) 1056 0 R (page.140) 1920 0 R (page.141) 1926 0 R (page.142) 1932 0 R (page.143) 1938 0 R (page.144) 1944 0 R] +/Limits [(page.14) (page.144)] >> % 2396 0 obj << -/Names [(page.151) 1989 0 R (page.152) 1997 0 R (page.153) 2008 0 R (page.154) 2012 0 R (page.155) 2021 0 R (page.156) 2025 0 R] -/Limits [(page.151) (page.156)] +/Names [(page.145) 1951 0 R (page.146) 1959 0 R (page.147) 1966 0 R (page.148) 1973 0 R (page.149) 1980 0 R (page.15) 1060 0 R] +/Limits [(page.145) (page.15)] >> % 2397 0 obj << -/Names [(page.157) 2034 0 R (page.158) 2040 0 R (page.159) 2044 0 R (page.16) 1065 0 R (page.160) 2051 0 R (page.161) 2059 0 R] -/Limits [(page.157) (page.161)] +/Names [(page.150) 1986 0 R (page.151) 1990 0 R (page.152) 1998 0 R (page.153) 2009 0 R (page.154) 2013 0 R (page.155) 2022 0 R] +/Limits [(page.150) (page.155)] >> % 2398 0 obj << -/Names [(page.162) 2066 0 R (page.163) 2070 0 R (page.164) 2078 0 R (page.165) 2089 0 R (page.166) 2094 0 R (page.167) 2102 0 R] -/Limits [(page.162) (page.167)] +/Names [(page.156) 2026 0 R (page.157) 2035 0 R (page.158) 2041 0 R (page.159) 2045 0 R (page.16) 1065 0 R (page.160) 2052 0 R] +/Limits [(page.156) (page.160)] >> % 2399 0 obj << -/Names [(page.168) 2111 0 R (page.169) 2115 0 R (page.17) 1072 0 R (page.170) 2126 0 R (page.171) 2140 0 R (page.172) 2149 0 R] -/Limits [(page.168) (page.172)] +/Names [(page.161) 2060 0 R (page.162) 2067 0 R (page.163) 2071 0 R (page.164) 2079 0 R (page.165) 2090 0 R (page.166) 2095 0 R] +/Limits [(page.161) (page.166)] >> % 2400 0 obj << -/Names [(page.173) 2160 0 R (page.174) 2189 0 R (page.175) 2209 0 R (page.176) 2228 0 R (page.177) 2244 0 R (page.178) 2248 0 R] -/Limits [(page.173) (page.178)] +/Names [(page.167) 2103 0 R (page.168) 2112 0 R (page.169) 2116 0 R (page.17) 1072 0 R (page.170) 2127 0 R (page.171) 2141 0 R] +/Limits [(page.167) (page.171)] >> % 2401 0 obj << -/Names [(page.179) 2252 0 R (page.18) 1080 0 R (page.180) 2257 0 R (page.181) 2261 0 R (page.182) 2266 0 R (page.183) 2270 0 R] -/Limits [(page.179) (page.183)] +/Names [(page.172) 2150 0 R (page.173) 2161 0 R (page.174) 2190 0 R (page.175) 2210 0 R (page.176) 2229 0 R (page.177) 2245 0 R] +/Limits [(page.172) (page.177)] >> % 2402 0 obj << -/Names [(page.184) 2279 0 R (page.19) 1085 0 R (page.2) 693 0 R (page.20) 1091 0 R (page.21) 1095 0 R (page.22) 1099 0 R] -/Limits [(page.184) (page.22)] +/Names [(page.178) 2249 0 R (page.179) 2253 0 R (page.18) 1080 0 R (page.180) 2258 0 R (page.181) 2262 0 R (page.182) 2267 0 R] +/Limits [(page.178) (page.182)] >> % 2403 0 obj << -/Names [(page.23) 1105 0 R (page.24) 1109 0 R (page.25) 1115 0 R (page.26) 1122 0 R (page.27) 1128 0 R (page.28) 1135 0 R] -/Limits [(page.23) (page.28)] +/Names [(page.183) 2271 0 R (page.184) 2280 0 R (page.19) 1085 0 R (page.2) 693 0 R (page.20) 1091 0 R (page.21) 1095 0 R] +/Limits [(page.183) (page.21)] >> % 2404 0 obj << -/Names [(page.29) 1141 0 R (page.3) 926 0 R (page.30) 1145 0 R (page.31) 1156 0 R (page.32) 1164 0 R (page.33) 1174 0 R] -/Limits [(page.29) (page.33)] +/Names [(page.22) 1099 0 R (page.23) 1105 0 R (page.24) 1109 0 R (page.25) 1115 0 R (page.26) 1122 0 R (page.27) 1128 0 R] +/Limits [(page.22) (page.27)] >> % 2405 0 obj << -/Names [(page.34) 1180 0 R (page.35) 1191 0 R (page.36) 1196 0 R (page.37) 1203 0 R (page.38) 1209 0 R (page.39) 1217 0 R] -/Limits [(page.34) (page.39)] +/Names [(page.28) 1135 0 R (page.29) 1141 0 R (page.3) 926 0 R (page.30) 1145 0 R (page.31) 1156 0 R (page.32) 1164 0 R] +/Limits [(page.28) (page.32)] >> % 2406 0 obj << -/Names [(page.4) 939 0 R (page.40) 1225 0 R (page.41) 1230 0 R (page.42) 1238 0 R (page.43) 1243 0 R (page.44) 1251 0 R] -/Limits [(page.4) (page.44)] +/Names [(page.33) 1174 0 R (page.34) 1180 0 R (page.35) 1191 0 R (page.36) 1196 0 R (page.37) 1203 0 R (page.38) 1209 0 R] +/Limits [(page.33) (page.38)] >> % 2407 0 obj << -/Names [(page.45) 1256 0 R (page.46) 1269 0 R (page.47) 1276 0 R (page.48) 1284 0 R (page.49) 1295 0 R (page.5) 952 0 R] -/Limits [(page.45) (page.5)] +/Names [(page.39) 1217 0 R (page.4) 939 0 R (page.40) 1225 0 R (page.41) 1230 0 R (page.42) 1238 0 R (page.43) 1243 0 R] +/Limits [(page.39) (page.43)] >> % 2408 0 obj << -/Names [(page.50) 1311 0 R (page.51) 1317 0 R (page.52) 1328 0 R (page.53) 1334 0 R (page.54) 1345 0 R (page.55) 1350 0 R] -/Limits [(page.50) (page.55)] +/Names [(page.44) 1251 0 R (page.45) 1256 0 R (page.46) 1269 0 R (page.47) 1276 0 R (page.48) 1284 0 R (page.49) 1295 0 R] +/Limits [(page.44) (page.49)] >> % 2409 0 obj << -/Names [(page.56) 1362 0 R (page.57) 1367 0 R (page.58) 1376 0 R (page.59) 1382 0 R (page.6) 964 0 R (page.60) 1391 0 R] -/Limits [(page.56) (page.60)] +/Names [(page.5) 952 0 R (page.50) 1311 0 R (page.51) 1317 0 R (page.52) 1328 0 R (page.53) 1334 0 R (page.54) 1345 0 R] +/Limits [(page.5) (page.54)] >> % 2410 0 obj << -/Names [(page.61) 1398 0 R (page.62) 1412 0 R (page.63) 1419 0 R (page.64) 1428 0 R (page.65) 1436 0 R (page.66) 1440 0 R] -/Limits [(page.61) (page.66)] +/Names [(page.55) 1350 0 R (page.56) 1362 0 R (page.57) 1367 0 R (page.58) 1376 0 R (page.59) 1382 0 R (page.6) 964 0 R] +/Limits [(page.55) (page.6)] >> % 2411 0 obj << -/Names [(page.67) 1455 0 R (page.68) 1461 0 R (page.69) 1467 0 R (page.7) 969 0 R (page.70) 1474 0 R (page.71) 1478 0 R] -/Limits [(page.67) (page.71)] +/Names [(page.60) 1391 0 R (page.61) 1398 0 R (page.62) 1412 0 R (page.63) 1419 0 R (page.64) 1428 0 R (page.65) 1436 0 R] +/Limits [(page.60) (page.65)] >> % 2412 0 obj << -/Names [(page.72) 1483 0 R (page.73) 1489 0 R (page.74) 1496 0 R (page.75) 1507 0 R (page.76) 1512 0 R (page.77) 1521 0 R] -/Limits [(page.72) (page.77)] +/Names [(page.66) 1440 0 R (page.67) 1455 0 R (page.68) 1461 0 R (page.69) 1467 0 R (page.7) 969 0 R (page.70) 1474 0 R] +/Limits [(page.66) (page.70)] >> % 2413 0 obj << -/Names [(page.78) 1528 0 R (page.79) 1533 0 R (page.8) 984 0 R (page.80) 1540 0 R (page.81) 1544 0 R (page.82) 1552 0 R] -/Limits [(page.78) (page.82)] +/Names [(page.71) 1478 0 R (page.72) 1483 0 R (page.73) 1489 0 R (page.74) 1496 0 R (page.75) 1507 0 R (page.76) 1512 0 R] +/Limits [(page.71) (page.76)] >> % 2414 0 obj << -/Names [(page.83) 1557 0 R (page.84) 1565 0 R (page.85) 1571 0 R (page.86) 1581 0 R (page.87) 1594 0 R (page.88) 1598 0 R] -/Limits [(page.83) (page.88)] +/Names [(page.77) 1521 0 R (page.78) 1528 0 R (page.79) 1533 0 R (page.8) 984 0 R (page.80) 1540 0 R (page.81) 1544 0 R] +/Limits [(page.77) (page.81)] >> % 2415 0 obj << -/Names [(page.89) 1611 0 R (page.9) 1005 0 R (page.90) 1618 0 R (page.91) 1625 0 R (page.92) 1630 0 R (page.93) 1637 0 R] -/Limits [(page.89) (page.93)] +/Names [(page.82) 1552 0 R (page.83) 1557 0 R (page.84) 1565 0 R (page.85) 1571 0 R (page.86) 1581 0 R (page.87) 1594 0 R] +/Limits [(page.82) (page.87)] >> % 2416 0 obj << -/Names [(page.94) 1641 0 R (page.95) 1650 0 R (page.96) 1658 0 R (page.97) 1662 0 R (page.98) 1668 0 R (page.99) 1672 0 R] -/Limits [(page.94) (page.99)] +/Names [(page.88) 1598 0 R (page.89) 1611 0 R (page.9) 1005 0 R (page.90) 1618 0 R (page.91) 1625 0 R (page.92) 1630 0 R] +/Limits [(page.88) (page.92)] >> % 2417 0 obj << -/Names [(page.i) 739 0 R (page.ii) 795 0 R (page.iii) 843 0 R (page.iv) 886 0 R (precdata) 1136 0 R (section*.1) 740 0 R] -/Limits [(page.i) (section*.1)] +/Names [(page.93) 1637 0 R (page.94) 1641 0 R (page.95) 1650 0 R (page.96) 1658 0 R (page.97) 1662 0 R (page.98) 1668 0 R] +/Limits [(page.93) (page.98)] >> % 2418 0 obj << -/Names [(section*.10) 634 0 R (section*.11) 638 0 R (section*.12) 642 0 R (section*.13) 646 0 R (section*.14) 650 0 R (section*.15) 654 0 R] -/Limits [(section*.10) (section*.15)] +/Names [(page.99) 1672 0 R (page.i) 739 0 R (page.ii) 795 0 R (page.iii) 843 0 R (page.iv) 886 0 R (precdata) 1136 0 R] +/Limits [(page.99) (precdata)] >> % 2419 0 obj << -/Names [(section*.16) 658 0 R (section*.17) 662 0 R (section*.18) 666 0 R (section*.19) 670 0 R (section*.2) 7 0 R (section*.20) 674 0 R] -/Limits [(section*.16) (section*.20)] +/Names [(section*.1) 740 0 R (section*.10) 634 0 R (section*.11) 638 0 R (section*.12) 642 0 R (section*.13) 646 0 R (section*.14) 650 0 R] +/Limits [(section*.1) (section*.14)] >> % 2420 0 obj << -/Names [(section*.21) 2271 0 R (section*.3) 2141 0 R (section*.4) 2169 0 R (section*.5) 2191 0 R (section*.6) 2211 0 R (section*.7) 622 0 R] -/Limits [(section*.21) (section*.7)] +/Names [(section*.15) 654 0 R (section*.16) 658 0 R (section*.17) 662 0 R (section*.18) 666 0 R (section*.19) 670 0 R (section*.2) 7 0 R] +/Limits [(section*.15) (section*.2)] >> % 2421 0 obj << -/Names [(section*.8) 626 0 R (section*.9) 630 0 R (section.1) 11 0 R (section.10) 545 0 R (section.11) 585 0 R (section.12) 597 0 R] -/Limits [(section*.8) (section.12)] +/Names [(section*.20) 674 0 R (section*.21) 2272 0 R (section*.3) 2142 0 R (section*.4) 2170 0 R (section*.5) 2192 0 R (section*.6) 2212 0 R] +/Limits [(section*.20) (section*.6)] >> % 2422 0 obj << -/Names [(section.13) 618 0 R (section.2) 15 0 R (section.3) 39 0 R (section.4) 224 0 R (section.5) 292 0 R (section.6) 312 0 R] -/Limits [(section.13) (section.6)] +/Names [(section*.7) 622 0 R (section*.8) 626 0 R (section*.9) 630 0 R (section.1) 11 0 R (section.10) 545 0 R (section.11) 585 0 R] +/Limits [(section*.7) (section.11)] >> % 2423 0 obj << -/Names [(section.7) 425 0 R (section.8) 497 0 R (section.9) 517 0 R (spbasedata) 1081 0 R (spdata) 1073 0 R (subsection.10.1) 549 0 R] -/Limits [(section.7) (subsection.10.1)] +/Names [(section.12) 597 0 R (section.13) 618 0 R (section.2) 15 0 R (section.3) 39 0 R (section.4) 224 0 R (section.5) 292 0 R] +/Limits [(section.12) (section.5)] >> % 2424 0 obj << -/Names [(subsection.10.2) 553 0 R (subsection.10.3) 557 0 R (subsection.10.4) 561 0 R (subsection.10.5) 565 0 R (subsection.10.6) 569 0 R (subsection.10.7) 573 0 R] -/Limits [(subsection.10.2) (subsection.10.7)] +/Names [(section.6) 312 0 R (section.7) 425 0 R (section.8) 497 0 R (section.9) 517 0 R (spbasedata) 1081 0 R (spdata) 1073 0 R] +/Limits [(section.6) (spdata)] >> % 2425 0 obj << -/Names [(subsection.10.8) 577 0 R (subsection.10.9) 581 0 R (subsection.11.1) 589 0 R (subsection.11.2) 593 0 R (subsection.12.1) 601 0 R (subsection.12.2) 606 0 R] -/Limits [(subsection.10.8) (subsection.12.2)] +/Names [(subsection.10.1) 549 0 R (subsection.10.2) 553 0 R (subsection.10.3) 557 0 R (subsection.10.4) 561 0 R (subsection.10.5) 565 0 R (subsection.10.6) 569 0 R] +/Limits [(subsection.10.1) (subsection.10.6)] >> % 2426 0 obj << -/Names [(subsection.12.3) 610 0 R (subsection.12.4) 614 0 R (subsection.2.1) 19 0 R (subsection.2.2) 23 0 R (subsection.2.3) 27 0 R (subsection.2.4) 35 0 R] -/Limits [(subsection.12.3) (subsection.2.4)] +/Names [(subsection.10.7) 573 0 R (subsection.10.8) 577 0 R (subsection.10.9) 581 0 R (subsection.11.1) 589 0 R (subsection.11.2) 593 0 R (subsection.12.1) 601 0 R] +/Limits [(subsection.10.7) (subsection.12.1)] >> % 2427 0 obj << -/Names [(subsection.3.1) 43 0 R (subsection.3.2) 107 0 R (subsection.3.3) 187 0 R (subsection.3.4) 216 0 R (subsection.3.5) 220 0 R (subsection.4.1) 228 0 R] -/Limits [(subsection.3.1) (subsection.4.1)] +/Names [(subsection.12.2) 606 0 R (subsection.12.3) 610 0 R (subsection.12.4) 614 0 R (subsection.2.1) 19 0 R (subsection.2.2) 23 0 R (subsection.2.3) 27 0 R] +/Limits [(subsection.12.2) (subsection.2.3)] >> % 2428 0 obj << -/Names [(subsection.4.10) 264 0 R (subsection.4.11) 268 0 R (subsection.4.12) 272 0 R (subsection.4.13) 276 0 R (subsection.4.14) 280 0 R (subsection.4.15) 284 0 R] -/Limits [(subsection.4.10) (subsection.4.15)] +/Names [(subsection.2.4) 35 0 R (subsection.3.1) 43 0 R (subsection.3.2) 107 0 R (subsection.3.3) 187 0 R (subsection.3.4) 216 0 R (subsection.3.5) 220 0 R] +/Limits [(subsection.2.4) (subsection.3.5)] >> % 2429 0 obj << -/Names [(subsection.4.16) 288 0 R (subsection.4.2) 232 0 R (subsection.4.3) 236 0 R (subsection.4.4) 240 0 R (subsection.4.5) 244 0 R (subsection.4.6) 248 0 R] -/Limits [(subsection.4.16) (subsection.4.6)] +/Names [(subsection.4.1) 228 0 R (subsection.4.10) 264 0 R (subsection.4.11) 268 0 R (subsection.4.12) 272 0 R (subsection.4.13) 276 0 R (subsection.4.14) 280 0 R] +/Limits [(subsection.4.1) (subsection.4.14)] >> % 2430 0 obj << -/Names [(subsection.4.7) 252 0 R (subsection.4.8) 256 0 R (subsection.4.9) 260 0 R (subsection.5.1) 296 0 R (subsection.5.2) 300 0 R (subsection.5.3) 304 0 R] -/Limits [(subsection.4.7) (subsection.5.3)] +/Names [(subsection.4.15) 284 0 R (subsection.4.16) 288 0 R (subsection.4.2) 232 0 R (subsection.4.3) 236 0 R (subsection.4.4) 240 0 R (subsection.4.5) 244 0 R] +/Limits [(subsection.4.15) (subsection.4.5)] >> % 2431 0 obj << -/Names [(subsection.5.4) 308 0 R (subsection.6.1) 316 0 R (subsection.6.10) 352 0 R (subsection.6.11) 356 0 R (subsection.6.12) 360 0 R (subsection.6.13) 364 0 R] -/Limits [(subsection.5.4) (subsection.6.13)] +/Names [(subsection.4.6) 248 0 R (subsection.4.7) 252 0 R (subsection.4.8) 256 0 R (subsection.4.9) 260 0 R (subsection.5.1) 296 0 R (subsection.5.2) 300 0 R] +/Limits [(subsection.4.6) (subsection.5.2)] >> % 2432 0 obj << -/Names [(subsection.6.14) 368 0 R (subsection.6.15) 372 0 R (subsection.6.16) 376 0 R (subsection.6.17) 380 0 R (subsection.6.18) 384 0 R (subsection.6.19) 388 0 R] -/Limits [(subsection.6.14) (subsection.6.19)] +/Names [(subsection.5.3) 304 0 R (subsection.5.4) 308 0 R (subsection.6.1) 316 0 R (subsection.6.10) 352 0 R (subsection.6.11) 356 0 R (subsection.6.12) 360 0 R] +/Limits [(subsection.5.3) (subsection.6.12)] >> % 2433 0 obj << -/Names [(subsection.6.2) 320 0 R (subsection.6.20) 392 0 R (subsection.6.21) 396 0 R (subsection.6.22) 400 0 R (subsection.6.23) 405 0 R (subsection.6.24) 409 0 R] -/Limits [(subsection.6.2) (subsection.6.24)] +/Names [(subsection.6.13) 364 0 R (subsection.6.14) 368 0 R (subsection.6.15) 372 0 R (subsection.6.16) 376 0 R (subsection.6.17) 380 0 R (subsection.6.18) 384 0 R] +/Limits [(subsection.6.13) (subsection.6.18)] >> % 2434 0 obj << -/Names [(subsection.6.25) 413 0 R (subsection.6.26) 417 0 R (subsection.6.27) 421 0 R (subsection.6.3) 324 0 R (subsection.6.4) 328 0 R (subsection.6.5) 332 0 R] -/Limits [(subsection.6.25) (subsection.6.5)] +/Names [(subsection.6.19) 388 0 R (subsection.6.2) 320 0 R (subsection.6.20) 392 0 R (subsection.6.21) 396 0 R (subsection.6.22) 400 0 R (subsection.6.23) 405 0 R] +/Limits [(subsection.6.19) (subsection.6.23)] >> % 2435 0 obj << -/Names [(subsection.6.6) 336 0 R (subsection.6.7) 340 0 R (subsection.6.8) 344 0 R (subsection.6.9) 348 0 R (subsection.7.1) 429 0 R (subsection.7.10) 465 0 R] -/Limits [(subsection.6.6) (subsection.7.10)] +/Names [(subsection.6.24) 409 0 R (subsection.6.25) 413 0 R (subsection.6.26) 417 0 R (subsection.6.27) 421 0 R (subsection.6.3) 324 0 R (subsection.6.4) 328 0 R] +/Limits [(subsection.6.24) (subsection.6.4)] >> % 2436 0 obj << -/Names [(subsection.7.11) 469 0 R (subsection.7.12) 473 0 R (subsection.7.13) 477 0 R (subsection.7.14) 481 0 R (subsection.7.15) 485 0 R (subsection.7.16) 489 0 R] -/Limits [(subsection.7.11) (subsection.7.16)] +/Names [(subsection.6.5) 332 0 R (subsection.6.6) 336 0 R (subsection.6.7) 340 0 R (subsection.6.8) 344 0 R (subsection.6.9) 348 0 R (subsection.7.1) 429 0 R] +/Limits [(subsection.6.5) (subsection.7.1)] >> % 2437 0 obj << -/Names [(subsection.7.17) 493 0 R (subsection.7.2) 433 0 R (subsection.7.3) 437 0 R (subsection.7.4) 441 0 R (subsection.7.5) 445 0 R (subsection.7.6) 449 0 R] -/Limits [(subsection.7.17) (subsection.7.6)] +/Names [(subsection.7.10) 465 0 R (subsection.7.11) 469 0 R (subsection.7.12) 473 0 R (subsection.7.13) 477 0 R (subsection.7.14) 481 0 R (subsection.7.15) 485 0 R] +/Limits [(subsection.7.10) (subsection.7.15)] >> % 2438 0 obj << -/Names [(subsection.7.7) 453 0 R (subsection.7.8) 457 0 R (subsection.7.9) 461 0 R (subsection.8.1) 501 0 R (subsection.8.2) 505 0 R (subsection.8.3) 509 0 R] -/Limits [(subsection.7.7) (subsection.8.3)] +/Names [(subsection.7.16) 489 0 R (subsection.7.17) 493 0 R (subsection.7.2) 433 0 R (subsection.7.3) 437 0 R (subsection.7.4) 441 0 R (subsection.7.5) 445 0 R] +/Limits [(subsection.7.16) (subsection.7.5)] >> % 2439 0 obj << -/Names [(subsection.8.4) 513 0 R (subsection.9.1) 521 0 R (subsection.9.2) 525 0 R (subsection.9.3) 529 0 R (subsection.9.4) 533 0 R (subsection.9.5) 537 0 R] -/Limits [(subsection.8.4) (subsection.9.5)] +/Names [(subsection.7.6) 449 0 R (subsection.7.7) 453 0 R (subsection.7.8) 457 0 R (subsection.7.9) 461 0 R (subsection.8.1) 501 0 R (subsection.8.2) 505 0 R] +/Limits [(subsection.7.6) (subsection.8.2)] >> % 2440 0 obj << -/Names [(subsection.9.6) 541 0 R (subsubsection.2.3.1) 31 0 R (subsubsection.3.1.1) 47 0 R (subsubsection.3.1.10) 83 0 R (subsubsection.3.1.11) 87 0 R (subsubsection.3.1.12) 91 0 R] -/Limits [(subsection.9.6) (subsubsection.3.1.12)] +/Names [(subsection.8.3) 509 0 R (subsection.8.4) 513 0 R (subsection.9.1) 521 0 R (subsection.9.2) 525 0 R (subsection.9.3) 529 0 R (subsection.9.4) 533 0 R] +/Limits [(subsection.8.3) (subsection.9.4)] >> % 2441 0 obj << -/Names [(subsubsection.3.1.13) 95 0 R (subsubsection.3.1.14) 99 0 R (subsubsection.3.1.15) 103 0 R (subsubsection.3.1.2) 51 0 R (subsubsection.3.1.3) 55 0 R (subsubsection.3.1.4) 59 0 R] -/Limits [(subsubsection.3.1.13) (subsubsection.3.1.4)] +/Names [(subsection.9.5) 537 0 R (subsection.9.6) 541 0 R (subsubsection.2.3.1) 31 0 R (subsubsection.3.1.1) 47 0 R (subsubsection.3.1.10) 83 0 R (subsubsection.3.1.11) 87 0 R] +/Limits [(subsection.9.5) (subsubsection.3.1.11)] >> % 2442 0 obj << -/Names [(subsubsection.3.1.5) 63 0 R (subsubsection.3.1.6) 67 0 R (subsubsection.3.1.7) 71 0 R (subsubsection.3.1.8) 75 0 R (subsubsection.3.1.9) 79 0 R (subsubsection.3.2.1) 111 0 R] -/Limits [(subsubsection.3.1.5) (subsubsection.3.2.1)] +/Names [(subsubsection.3.1.12) 91 0 R (subsubsection.3.1.13) 95 0 R (subsubsection.3.1.14) 99 0 R (subsubsection.3.1.15) 103 0 R (subsubsection.3.1.2) 51 0 R (subsubsection.3.1.3) 55 0 R] +/Limits [(subsubsection.3.1.12) (subsubsection.3.1.3)] >> % 2443 0 obj << -/Names [(subsubsection.3.2.10) 147 0 R (subsubsection.3.2.11) 151 0 R (subsubsection.3.2.12) 155 0 R (subsubsection.3.2.13) 159 0 R (subsubsection.3.2.14) 163 0 R (subsubsection.3.2.15) 167 0 R] -/Limits [(subsubsection.3.2.10) (subsubsection.3.2.15)] +/Names [(subsubsection.3.1.4) 59 0 R (subsubsection.3.1.5) 63 0 R (subsubsection.3.1.6) 67 0 R (subsubsection.3.1.7) 71 0 R (subsubsection.3.1.8) 75 0 R (subsubsection.3.1.9) 79 0 R] +/Limits [(subsubsection.3.1.4) (subsubsection.3.1.9)] >> % 2444 0 obj << -/Names [(subsubsection.3.2.16) 171 0 R (subsubsection.3.2.17) 175 0 R (subsubsection.3.2.18) 179 0 R (subsubsection.3.2.19) 183 0 R (subsubsection.3.2.2) 115 0 R (subsubsection.3.2.3) 119 0 R] -/Limits [(subsubsection.3.2.16) (subsubsection.3.2.3)] +/Names [(subsubsection.3.2.1) 111 0 R (subsubsection.3.2.10) 147 0 R (subsubsection.3.2.11) 151 0 R (subsubsection.3.2.12) 155 0 R (subsubsection.3.2.13) 159 0 R (subsubsection.3.2.14) 163 0 R] +/Limits [(subsubsection.3.2.1) (subsubsection.3.2.14)] >> % 2445 0 obj << -/Names [(subsubsection.3.2.4) 123 0 R (subsubsection.3.2.5) 127 0 R (subsubsection.3.2.6) 131 0 R (subsubsection.3.2.7) 135 0 R (subsubsection.3.2.8) 139 0 R (subsubsection.3.2.9) 143 0 R] -/Limits [(subsubsection.3.2.4) (subsubsection.3.2.9)] +/Names [(subsubsection.3.2.15) 167 0 R (subsubsection.3.2.16) 171 0 R (subsubsection.3.2.17) 175 0 R (subsubsection.3.2.18) 179 0 R (subsubsection.3.2.19) 183 0 R (subsubsection.3.2.2) 115 0 R] +/Limits [(subsubsection.3.2.15) (subsubsection.3.2.2)] >> % 2446 0 obj << -/Names [(subsubsection.3.3.1) 191 0 R (subsubsection.3.3.2) 195 0 R (subsubsection.3.3.3) 199 0 R (subsubsection.3.3.4) 204 0 R (subsubsection.3.3.5) 208 0 R (subsubsection.3.3.6) 212 0 R] -/Limits [(subsubsection.3.3.1) (subsubsection.3.3.6)] +/Names [(subsubsection.3.2.3) 119 0 R (subsubsection.3.2.4) 123 0 R (subsubsection.3.2.5) 127 0 R (subsubsection.3.2.6) 131 0 R (subsubsection.3.2.7) 135 0 R (subsubsection.3.2.8) 139 0 R] +/Limits [(subsubsection.3.2.3) (subsubsection.3.2.8)] >> % 2447 0 obj << -/Names [(table.1) 1129 0 R (table.10) 1277 0 R (table.11) 1286 0 R (table.12) 1299 0 R (table.13) 1318 0 R (table.14) 1346 0 R] -/Limits [(table.1) (table.14)] +/Names [(subsubsection.3.2.9) 143 0 R (subsubsection.3.3.1) 191 0 R (subsubsection.3.3.2) 195 0 R (subsubsection.3.3.3) 199 0 R (subsubsection.3.3.4) 204 0 R (subsubsection.3.3.5) 208 0 R] +/Limits [(subsubsection.3.2.9) (subsubsection.3.3.5)] >> % 2448 0 obj << -/Names [(table.15) 1363 0 R (table.16) 1377 0 R (table.17) 1392 0 R (table.18) 1420 0 R (table.19) 1456 0 R (table.2) 1175 0 R] -/Limits [(table.15) (table.2)] +/Names [(subsubsection.3.3.6) 212 0 R (table.1) 1129 0 R (table.10) 1277 0 R (table.11) 1286 0 R (table.12) 1299 0 R (table.13) 1318 0 R] +/Limits [(subsubsection.3.3.6) (table.13)] >> % 2449 0 obj << -/Names [(table.20) 1468 0 R (table.21) 1999 0 R (table.22) 2144 0 R (table.3) 1192 0 R (table.4) 1204 0 R (table.5) 1218 0 R] -/Limits [(table.20) (table.5)] +/Names [(table.14) 1346 0 R (table.15) 1363 0 R (table.16) 1377 0 R (table.17) 1392 0 R (table.18) 1420 0 R (table.19) 1456 0 R] +/Limits [(table.14) (table.19)] >> % 2450 0 obj << -/Names [(table.6) 1226 0 R (table.7) 1239 0 R (table.8) 1252 0 R (table.9) 1270 0 R (title.0) 3 0 R (vbasedata) 1061 0 R] -/Limits [(table.6) (vbasedata)] +/Names [(table.2) 1175 0 R (table.20) 1468 0 R (table.21) 2000 0 R (table.22) 2145 0 R (table.3) 1192 0 R (table.4) 1204 0 R] +/Limits [(table.2) (table.4)] >> % 2451 0 obj << -/Names [(vdata) 1116 0 R] -/Limits [(vdata) (vdata)] +/Names [(table.5) 1218 0 R (table.6) 1226 0 R (table.7) 1239 0 R (table.8) 1252 0 R (table.9) 1270 0 R (title.0) 3 0 R] +/Limits [(table.5) (title.0)] >> % 2452 0 obj << -/Kids [2345 0 R 2346 0 R 2347 0 R 2348 0 R 2349 0 R 2350 0 R] -/Limits [(Doc-Start) (Item.125)] +/Names [(vbasedata) 1061 0 R (vdata) 1116 0 R] +/Limits [(vbasedata) (vdata)] >> % 2453 0 obj << -/Kids [2351 0 R 2352 0 R 2353 0 R 2354 0 R 2355 0 R 2356 0 R] -/Limits [(Item.126) (Item.22)] +/Kids [2346 0 R 2347 0 R 2348 0 R 2349 0 R 2350 0 R 2351 0 R] +/Limits [(Doc-Start) (Item.125)] >> % 2454 0 obj << -/Kids [2357 0 R 2358 0 R 2359 0 R 2360 0 R 2361 0 R 2362 0 R] -/Limits [(Item.23) (Item.55)] +/Kids [2352 0 R 2353 0 R 2354 0 R 2355 0 R 2356 0 R 2357 0 R] +/Limits [(Item.126) (Item.21)] >> % 2455 0 obj << -/Kids [2363 0 R 2364 0 R 2365 0 R 2366 0 R 2367 0 R 2368 0 R] -/Limits [(Item.56) (Item.88)] +/Kids [2358 0 R 2359 0 R 2360 0 R 2361 0 R 2362 0 R 2363 0 R] +/Limits [(Item.22) (Item.54)] >> % 2456 0 obj << -/Kids [2369 0 R 2370 0 R 2371 0 R 2372 0 R 2373 0 R 2375 0 R] -/Limits [(Item.89) (cite.Sparse03)] +/Kids [2364 0 R 2365 0 R 2366 0 R 2367 0 R 2368 0 R 2369 0 R] +/Limits [(Item.55) (Item.87)] >> % 2457 0 obj << -/Kids [2376 0 R 2377 0 R 2378 0 R 2379 0 R 2380 0 R 2381 0 R] -/Limits [(cite.machiels) (lstlisting.-8)] +/Kids [2370 0 R 2371 0 R 2372 0 R 2373 0 R 2375 0 R 2376 0 R] +/Limits [(Item.88) (cite.RouXiaXu:11)] >> % 2458 0 obj << -/Kids [2382 0 R 2383 0 R 2384 0 R 2385 0 R 2386 0 R 2387 0 R] -/Limits [(lstlisting.-9) (page.107)] +/Kids [2377 0 R 2378 0 R 2379 0 R 2380 0 R 2381 0 R 2382 0 R] +/Limits [(cite.Sparse03) (lstlisting.-7)] >> % 2459 0 obj << -/Kids [2388 0 R 2389 0 R 2390 0 R 2391 0 R 2392 0 R 2393 0 R] -/Limits [(page.108) (page.14)] +/Kids [2383 0 R 2384 0 R 2385 0 R 2386 0 R 2387 0 R 2388 0 R] +/Limits [(lstlisting.-8) (page.106)] >> % 2460 0 obj << -/Kids [2394 0 R 2395 0 R 2396 0 R 2397 0 R 2398 0 R 2399 0 R] -/Limits [(page.140) (page.172)] +/Kids [2389 0 R 2390 0 R 2391 0 R 2392 0 R 2393 0 R 2394 0 R] +/Limits [(page.107) (page.139)] >> % 2461 0 obj << -/Kids [2400 0 R 2401 0 R 2402 0 R 2403 0 R 2404 0 R 2405 0 R] -/Limits [(page.173) (page.39)] +/Kids [2395 0 R 2396 0 R 2397 0 R 2398 0 R 2399 0 R 2400 0 R] +/Limits [(page.14) (page.171)] >> % 2462 0 obj << -/Kids [2406 0 R 2407 0 R 2408 0 R 2409 0 R 2410 0 R 2411 0 R] -/Limits [(page.4) (page.71)] +/Kids [2401 0 R 2402 0 R 2403 0 R 2404 0 R 2405 0 R 2406 0 R] +/Limits [(page.172) (page.38)] >> % 2463 0 obj << -/Kids [2412 0 R 2413 0 R 2414 0 R 2415 0 R 2416 0 R 2417 0 R] -/Limits [(page.72) (section*.1)] +/Kids [2407 0 R 2408 0 R 2409 0 R 2410 0 R 2411 0 R 2412 0 R] +/Limits [(page.39) (page.70)] >> % 2464 0 obj << -/Kids [2418 0 R 2419 0 R 2420 0 R 2421 0 R 2422 0 R 2423 0 R] -/Limits [(section*.10) (subsection.10.1)] +/Kids [2413 0 R 2414 0 R 2415 0 R 2416 0 R 2417 0 R 2418 0 R] +/Limits [(page.71) (precdata)] >> % 2465 0 obj << -/Kids [2424 0 R 2425 0 R 2426 0 R 2427 0 R 2428 0 R 2429 0 R] -/Limits [(subsection.10.2) (subsection.4.6)] +/Kids [2419 0 R 2420 0 R 2421 0 R 2422 0 R 2423 0 R 2424 0 R] +/Limits [(section*.1) (spdata)] >> % 2466 0 obj << -/Kids [2430 0 R 2431 0 R 2432 0 R 2433 0 R 2434 0 R 2435 0 R] -/Limits [(subsection.4.7) (subsection.7.10)] +/Kids [2425 0 R 2426 0 R 2427 0 R 2428 0 R 2429 0 R 2430 0 R] +/Limits [(subsection.10.1) (subsection.4.5)] >> % 2467 0 obj << -/Kids [2436 0 R 2437 0 R 2438 0 R 2439 0 R 2440 0 R 2441 0 R] -/Limits [(subsection.7.11) (subsubsection.3.1.4)] +/Kids [2431 0 R 2432 0 R 2433 0 R 2434 0 R 2435 0 R 2436 0 R] +/Limits [(subsection.4.6) (subsection.7.1)] >> % 2468 0 obj << -/Kids [2442 0 R 2443 0 R 2444 0 R 2445 0 R 2446 0 R 2447 0 R] -/Limits [(subsubsection.3.1.5) (table.14)] +/Kids [2437 0 R 2438 0 R 2439 0 R 2440 0 R 2441 0 R 2442 0 R] +/Limits [(subsection.7.10) (subsubsection.3.1.3)] >> % 2469 0 obj << -/Kids [2448 0 R 2449 0 R 2450 0 R 2451 0 R] -/Limits [(table.15) (vdata)] +/Kids [2443 0 R 2444 0 R 2445 0 R 2446 0 R 2447 0 R 2448 0 R] +/Limits [(subsubsection.3.1.4) (table.13)] >> % 2470 0 obj << -/Kids [2452 0 R 2453 0 R 2454 0 R 2455 0 R 2456 0 R 2457 0 R] -/Limits [(Doc-Start) (lstlisting.-8)] +/Kids [2449 0 R 2450 0 R 2451 0 R 2452 0 R] +/Limits [(table.14) (vdata)] >> % 2471 0 obj << -/Kids [2458 0 R 2459 0 R 2460 0 R 2461 0 R 2462 0 R 2463 0 R] -/Limits [(lstlisting.-9) (section*.1)] +/Kids [2453 0 R 2454 0 R 2455 0 R 2456 0 R 2457 0 R 2458 0 R] +/Limits [(Doc-Start) (lstlisting.-7)] >> % 2472 0 obj << -/Kids [2464 0 R 2465 0 R 2466 0 R 2467 0 R 2468 0 R 2469 0 R] -/Limits [(section*.10) (vdata)] +/Kids [2459 0 R 2460 0 R 2461 0 R 2462 0 R 2463 0 R 2464 0 R] +/Limits [(lstlisting.-8) (precdata)] >> % 2473 0 obj << -/Kids [2470 0 R 2471 0 R 2472 0 R] -/Limits [(Doc-Start) (vdata)] +/Kids [2465 0 R 2466 0 R 2467 0 R 2468 0 R 2469 0 R 2470 0 R] +/Limits [(section*.1) (vdata)] >> endstream endobj -2477 0 obj +2478 0 obj << /Title (Parallel Sparse BLAS V. 3.9.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)/Keywords() -/CreationDate (D:20250930190717+02'00') -/ModDate (D:20250930190717+02'00') +/CreationDate (D:20251008095233+02'00') +/ModDate (D:20251008095233+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023) kpathsea version 6.3.5) >> @@ -38819,66 +38881,71 @@ endobj 2475 0 obj << /Type /ObjStm -/N 2 -/First 15 -/Length 263 +/N 3 +/First 24 +/Length 356 >> stream -2474 0 2476 35 +2474 0 2476 84 2477 119 % 2474 0 obj << -/Dests 2473 0 R +/Kids [2471 0 R 2472 0 R 2473 0 R] +/Limits [(Doc-Start) (vdata)] >> % 2476 0 obj << +/Dests 2474 0 R +>> +% 2477 0 obj +<< /Type /Catalog -/Pages 2341 0 R -/Outlines 2343 0 R -/Names 2474 0 R +/Pages 2342 0 R +/Outlines 2344 0 R +/Names 2476 0 R /URI (http://ce.uniroma2.it/psblas) /PageMode/UseOutlines/PageLabels<>2<>6<>]>> /OpenAction 677 0 R >> endstream endobj -2478 0 obj +2479 0 obj << /Type /XRef -/Index [0 2479] -/Size 2479 +/Index [0 2480] +/Size 2480 /W [1 3 1] -/Root 2476 0 R -/Info 2477 0 R -/ID [<74AF8409D9443F34D74B521E914F839E> <74AF8409D9443F34D74B521E914F839E>] -/Length 12395 ->> -stream -ÿ]) (Gz& (Fz3 (Ez> (DzF (C  -zR (B  z[ (A Ó (@Ó (?Ó$ (>Ó% (=ÓE (<ÓF (;ÓG (:ÓH (9ÓL (8 ÓM (7!"ÓN (6#$ÓR (5%&ÓS (4'(ÓU (3)*ÓV (2+,ÓZ (1-.Ó[ (0/0Ó\ (/12Óc (.344 (-564 (,784 (+9:4  (*;<4  ()=>4 ((?@4 ('AB4 (&CD4 (%EF4 ($GH4 (#IJ4 ("KL4 (!MN4% ( OP4& (QR4' (ST4+ (UV41 (WX42 (YZ43 ([\44 (]^4: (_`4; (ab4< (cË>\4B (ËË4G (ËË4H (ËË4I (ËË4P (Ë Ë -4T (Ë Ë 4^ (Ë Ë - (ËË ( ËË% ( ËË1 ( ËË9 ( -ËËE ( ËËP (ËËa (ËËþ (ËË þ  (Ë!Ë"þ (Ë#Ë$þ( (Ë%Ë&þC (Ë'Ë(þP (Ë)Ë*þ_ (Ë+Ë,g &cË-Ë.g &bË/Ë0g &aË1Ë2g= &`Ë3Ë4gF &_Ë5Ë6gQ &^Ë7Ë8gR &]Ë9Ë:Þ &\Ë;Ë<Þ &[Ë=Ë>Þ &ZË?Ë@Þ &YËAËBÞ$ &XËCËDÞ/ &WËEËFÞ: &VËGËHÞU &UËIËJL &TËKËLL &SËMËNL &RËOËPL &QËQËRL$ &PËSËTL, &OËUËVL0 &NËWËXL5 &MËYËZL? &LË[Ë\LD &KË]Ë^LJ &JË_Ë`LP &IËaËbLV &HËc”|YL\ &G””Lc &F””· &E””· &D””· &C” ” -·( &B” ” ·, &A” ”·2 &@””·8 &?””·? &>””·C &=””·G &<””·K &;””·O &:””·S &9””·] &8”” " &7”!”""  &6”#”$" &5”%”&"! &4”'”("+ &3”)”*"7 &2”+”,"< &1”-”."C &0”/”0"L &/”1”2"R &.”3”4"X &-”5”6"^ &,”7”8’ &+”9”:’ &*”;”<’  &)”=”>’ &(”?”@’ &'”A”B’! &&”C”D’( &%”E”F’1 &$”G”H’8 &#”I”J’A &"”K”L’N &!”M”N’Z & ”O”P’_ &”Q”R’c &”S”Tý &”U”Vý  &”W”Xý &”Y”Zý &”[”\ý &”]”^ý4 &”_”`ýK &”a”býL &”c]ý{ýS &]]ýT &]]? &]]C &]]D &] ] -F &] ] J &] ]K &]]L & ]]M & ]]N & ]]O & -]]P & ]]Q &]]U &]]V &]] W &]!]"X &]#]$]%Áæ]&]*¾«]'](ã=ã?ã>ã@Ò’]-]+ƒ0],]/]0]1]2]3]4]5]6]7]8]9]:];]<]=]>]?]@]A]B]D]F]G]H]I]J]K]L]M]N]P]R]S]T]U]V]W]X]Y]Z][]`]^].ƒº]\]]]C]E]O]Q]a]b]c  +/Root 2477 0 R +/Info 2478 0 R +/ID [ ] +/Length 12400 +>> +stream +ÿ]) )Hz& )Gz3 )Fz> )EzF )D  +zR )C  z[ )B Ó )AÓ )@Ó$ )?Ó% )>ÓE )=ÓF )<ÓG );ÓH ):ÓL )9 ÓM )8!"ÓN )7#$ÓR )6%&ÓS )5'(ÓU )4)*ÓV )3+,ÓZ )2-.Ó[ )1/0Ó\ )012Óc )/344 ).564 )-784 ),9:4  )+;<4  )*=>4 ))?@4 )(AB4 )'CD4 )&EF4 )%GH4 )$IJ4 )#KL4 )"MN4% )!OP4& ) QR4' )ST4+ )UV41 )WX42 )YZ43 )[\44 )]^4: )_`4; )ab4< )cË>\4B )ËË4G )ËË4H )ËË4I )ËË4P )Ë Ë +4T )Ë Ë 4^ )Ë Ë + )ËË )ËË% ) ËË1 ) ËË9 ) ËËE ) +ËËP ) ËËa )ËËþ )ËË þ  )Ë!Ë"þ )Ë#Ë$þ( )Ë%Ë&þC )Ë'Ë(þP )Ë)Ë*þ_ )Ë+Ë,g )Ë-Ë.g 'cË/Ë0g 'bË1Ë2g= 'aË3Ë4gF '`Ë5Ë6gQ '_Ë7Ë8gR '^Ë9Ë:Þ ']Ë;Ë<Þ '\Ë=Ë>Þ '[Ë?Ë@Þ 'ZËAËBÞ$ 'YËCËDÞ/ 'XËEËFÞ: 'WËGËHÞU 'VËIËJL 'UËKËLL 'TËMËNL 'SËOËPL 'RËQËRL$ 'QËSËTL, 'PËUËVL0 'OËWËXL5 'NËYËZL? 'MË[Ë\LD 'LË]Ë^LJ 'KË_Ë`LP 'JËaËbLV 'IËc”|YL\ 'H””Lc 'G””· 'F””· 'E””· 'D” ” +·) 'C” ” ·- 'B” ”·3 'A””·9 '@””·@ '?””·D '>””·H '=””·L '<””·P ';””·T ':””·^ '9”” # '8”!”"# '7”#”$# '6”%”&#" '5”'”(#, '4”)”*#8 '3”+”,#= '2”-”.#D '1”/”0#M '0”1”2#S '/”3”4#Y '.”5”6#_ '-”7”8“ ',”9”:“ '+”;”<“  '*”=”>“ ')”?”@“ '(”A”B“" ''”C”D“) '&”E”F“2 '%”G”H“9 '$”I”J“B '#”K”L“O '"”M”N“[ '!”O”P“` ' ”Q”Rþ '”S”Tþ '”U”Vþ '”W”Xþ '”Y”Zþ '”[”\þ '”]”^þ5 '”_”`þL '”a”bþM '”c]ý{þT ']]þU ']]€@ ']]€D ']]€E '] ] +€G '] ] €K '] ]€L ']]€M ']]€N ' ]]€O ' ]]€P ' ]]€Q ' +]]€R ' ]]€V ']]€W ']] €X ']!]"€Y ']#]$]%Áæ]&]*¾«]'](ä>ä@ä?äAÒ’]-]+ƒ0],]/]0]1]2]3]4]5]6]7]8]9]:];]<]=]>]?]@]A]B]D]F]G]H]I]J]K]L]M]N]P]R]S]T]U]V]W]X]Y]Z][]`]^].ƒº]\]]]C]E]O]Q]a]b]c      !"#$%&'()*.,]_¿L+¶Ñ/0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTVWY[`^-4]UXZ\bzzzzzzzzz z -z z z zzzzzzzzzzzzzzzzzzz z!z"z$_}!z#aczÎJz'z%÷TãAz)z*z+z,z-z.z/z0z1z2z4z(Åãããããããã ããz:z;z<BÍzBz@z5+£z=z?z6z7z8z9GƒãzCzDzIzAS&zEã8ã7ã6zGzHã zNzOŒ¯zSzJwúzPzQzKzLzMcbzUzVzXzT“YzWÓÓzY¨^zZz\z]z^z_z`zazbzcãBÓÓÓ4ÓÓÓÓÓÓÓ Ó -Ó Ó Ó ÓÓÓÓÓã9ÓÓ Ó&ÓÓÓÓÓÓÓÓ"Ó'Ó!EoÓ#Ó&Ó)Ó*Ó+Ó2Ó(gêÓ,Ó-Ó.Ó/Ó0Ó1Ó4Ó5Ó@Ó3:Ó6Ó7Ó8Ó9Ó:Ó;Ó<Ó=Ó>ã:Ó?ÓBÓCÓIÓAïÓDãCÓOÓJ²IÓKÓWÓPÄÓQÓTÓ]ÓX×çÓYÓ_Ó`Óa4Ó^îæÓb4ã 4^à4 444444 -T54 4ãD44d444v44"4Ž44 4!4(4#¢4$4,4)´°4*4.4/464-Ît4045ãE494=47í¢484?4@4C4>4A4_4E4M4K4Dí4F4J4O4Q4L$ç4N4U4R6)4S4W4X4Y4Z4[4\4b4`4V74]ã<ãF4c4aU!°± …F   ¤µ»ؼ!"#' Û>$&ãG+(úx)*-./3,ñ02567;4 †8:?<>X=>ABCG@J×DFJHhÏIãHLMNRKkROQ[S…òTUVWXYZ]^_c\—Í`bþþþþÞNþþ÷eþþ þ þóŸþ -ã;þ þþþþþþþþþþþþþãIþþþþþ þ!þ"þ$þ(¿þ#þ&þ,þ*þ%C1þ'þ)þ-þ.þ/þ0þ1þ2þ4þ+c5þ3þ6þ7þ9þ5€›þ8þ;þ<þ=þ>þ?þ@þAþEþ:’øþBþDþHþF±^þGãJþJþKþLþMþNþTþUþRþI²ÓþOþQþWþSÑ$þVþYþZþ[þ\þ]þaþXÖ þ^þ`þcgþbô™gHggggg -g*¤gg R[ggg E“ggãKg g gggg`¶”%ggÁ½ggggg!gÍãgg g#Êg$g%g*g"ìÅg&g'g(g)g6g-g+0g,g7g.Lg5g/g0g1g2g3g4"hU×g9g:g;g?g8ƒog<g>ãLgBg@¥NgAgDgJgHgC«gEgGgKgLgNgIÉgMgSgOÙDgPgUgXgTó¯gVgWgZg]gYŽg[ã5g\ãMÞg^<-g_g`gagbgcÞ†fÞÞÞwîÞÞÞ Þ”@Þ Þ -Þ Þ ÞÞÞÞ ˆÞÞÞÞÞÞ¸ïÞÞÞÞÅžÞãNÞ!Þ"Þ%Þ ÎTÞ#Þ*Þ&å×Þ'Þ(Þ)Þ,Þ-Þ1Þ+ìèÞ.Þ0Þ7Þ2dÞ3Þ4Þ5Þ6Þ=Þ;Þ8 ºÞ9Þ>Þ?ÞFÞ<iÞ@ÞAÞBÞCÞDÞEãOÞOÞGLBLFLA_ëLCLELHLLLGmLILKLNLRLM+LOLQãRLTLXLSŽ3LULWLZL_LY¢OL[L]L^La·L`±GLb··!з··é +z z z zzzzzzzzzzzzzzzzzzz z!z"z$_}!z#aczÎJz'z%÷TäBz)z*z+z,z-z.z/z0z1z2z4z(Åääääääääääz:z;z<BÍzBz@z5+£z=z?z6z7z8z9GƒäzCzDzIzAS&zEä9ä8ä7zGzHä zNzOŒ¯zSzJwúzPzQzKzLzMä€czUzVzXzT“YzWÓÓzY¨^zZz\z]z^z_z`zazbzcäCÓÓÓ4ÓÓÓÓÓÓÓ Ó +Ó Ó Ó ÓÓÓÓÓä:ÓÓ Ó&ÓÓÓÓÓÓÓÓ"Ó'Ó!EoÓ#Ó&Ó)Ó*Ó+Ó2Ó(gêÓ,Ó-Ó.Ó/Ó0Ó1Ó4Ó5Ó@Ó3:Ó6Ó7Ó8Ó9Ó:Ó;Ó<Ó=Ó>ä;Ó?ÓBÓCÓIÓAïÓDäDÓOÓJ²IÓKÓWÓPÄÓQÓTÓ]ÓX×çÓYÓ_Ó`Óa4Ó^îæÓb4ä 4^à4 444444 +T54 4äE44d444v44"4Ž44 4!4(4#¢4$4,4)´°4*4.4/464-Ît4045äF494=47í¢484?4@4C4>4A4_4E4M4K4Dí4F4J4O4Q4L$ç4N4U4R6)4S4W4X4Y4Z4[4\4b4`4V74]ä=äG4c4aU!°± …F   ¤µ»ؼ!"#' Û>$&äH+(úx)*-./3,ñ02567;4 †8:?<>X=>ABCG@J×DFJHhÏIäILMNRKkROQ[S…òTUVWXYZ]^_c\—Í`bþþþþÞNþþ÷eþþ þ þóŸþ +ä<þ þþþþþþþþþþþþþäJþþþþþ þ!þ"þ$þ(¿þ#þ&þ,þ*þ%C1þ'þ)þ-þ.þ/þ0þ1þ2þ4þ+c5þ3þ6þ7þ9þ5€›þ8þ;þ<þ=þ>þ?þ@þAþEþ:’øþBþDþHþF±^þGäKþJþKþLþMþNþTþUþRþI²ÓþOþQþWþSÑ$þVþYþZþ[þ\þ]þaþXÖ þ^þ`þcgþbô™gHggggg +g*¤gg R[ggg E“ggäLg g gggg`¶”%ggÁ½ggggg!gÍãgg g#Êg$g%g*g"ìÅg&g'g(g)g6g-g+0g,g7g.Lg5g/g0g1g2g3g4"hU×g9g:g;g?g8ƒog<g>äMgBg@¥NgAgDgJgHgC«gEgGgKgLgNgIÉgMgSgOÙDgPgUgXgTó¯gVgWgZg]gYŽg[ä6g\äNÞg^<-g_g`gagbgcÞ†fÞÞÞwîÞÞÞ Þ”@Þ Þ +Þ Þ ÞÞÞÞ ˆÞÞÞÞÞÞ¸ïÞÞÞÞÅžÞäOÞ!Þ"Þ%Þ ÎTÞ#Þ*Þ&å×Þ'Þ(Þ)Þ,Þ-Þ1Þ+ìèÞ.Þ0Þ7Þ2dÞ3Þ4Þ5Þ6Þ=Þ;Þ8 ºÞ9Þ>Þ?ÞFÞ<iÞ@ÞAÞBÞCÞDÞEäPÞOÞGLBLFLA_ëLCLELHLLLGmLILKLNLRLM+LOLQäSLTLXLSŽ3LULWLZL_LY¢OL[L]L^La·L`±GLb··!+†···é ·· ·þà· · -· · ····· ê·ãS·· ê··%· 6í······· ·!·"·#·$·)·& \‹·'·/·* ]t·+·-·.·5·0 xf·1·3·4·<·6 ‹%·7·9·:·;ãT·@·= œý·>·D·A §i·B·H·E ´Ý·F·L·I ¹­·J·P·M ¿¤·N·T·Q Äè·RãU·Z·U ÜÖ·V·W·X·Yã4·^·[ ñ·\"·_! ò·`·a·b·c"¼P""!Bµ"" -"!Zž"""" "" !o4" ãV""!‡q""""""!›°"""!´*"""""""!È;" "("#!à¶"$"%"&"'",")!õ"*ãW"4"-" %"."/"0ã3"1"2"3"9"5"'"6"8">":"=@";"="@"A"D"?"S{"B"G"H"I"E"nŽ"F"O"J"—f"K"M"NãX"U"P"¥‘"Q"S"T"["V"«1"W"Y"Z"a"\"±"]"_"`’"b"¹ü"c$ì’’’"áÉ’’’’ -’’ "ô–’ ’ ’ãY’’’#ô’’’’’’#•’’’’’$’#(Û’ ’"’#’&’+’%#F’'’)’*’.’,#c°’-’2’/#f}’0ãZ’4’5’6’:’3#l1’7’9’F’<’=’>’?’D’B’;#€+’@’G’C#‘o’Ea’I’J’K’L’O’H#Æÿ’M’R’P#å(’Q’T’U’V’W’X’[’S#éÒ’Yã[’]’`’\$’^ý’a$â’b%’Ëýýýý$>ùýýý ý -ý ýý$IÑý ýýýýý$aéýýý$n ýã\ýýý%ý#ý$q<ýýý ý!ý"ý&ý'ý(ý*ý$$’‹ý)ý,ý.ý+$®Íý-ý0ý1ý2ý:ý8ý/$Àîý3ý5ý6ý7ý;ý<ý>ý9$ãbý=ýAý?$þ5ý@ã]ýCýEýFýGýHýIýMýB%´ýJýDããýOýP%Z-ýQ%ˆ|ý[ýWýN%"ÝýRýUýVãý]ýaýX%G ý\ý^ý_ý`ýYýZ%iGýb%jÄ  -   ýc%Ââ'v %Ãê%Äà%Åê%äÄ&ó %íö&w&˜&Ž&,J*,&kb(.!&K )+-ã^"#$%&&vk'&wg&xw&’&ÃN69/&G7801&Љ234&Ñú5&Òö&Ô&ñ!<:&þb;@='è>GA'!æBERH'8÷IYS'NlTã_\Z'YN[ã]'YÜ^_`ãã*Îãã '¥Bã -ããããããããããã ã!ã2ã"ã#ã$'½“ã%'Úrã&'þbã'(oã((;œã)(c”ã*(µfã+(Æ7ã,)Oã-) óã.)0¯ã/)eã0)õ|ã1*CÓ*Gÿ*Ne*T¡*[š*cÙ*j*p\*v›*z-*~Ã*„Å*ŠÇã`ãaãbãc & & &*Ù™ &+2 (H (I (J (K (L (M (N (O (P (Q (R (S (T (U (V (W (X (Y (Z ([ (\ (] (^ (_ (` (a (b (c F+/Ò F F F F F F F F F  F - F  F  F  F F F F F F F F F F F F F F F F F F F  F! F" F# F$ F% F& F' F( F) F* F+ F, F- F. F/ F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F: F; F< F= F> F? F@ FA FB FC FD FE FF FG FH FI FJ FK FL FM FN FO FP FQ FR FS FT FU FV FW FX FY FZ F[ F\ F] F^ F_ F` Fa Fb Fc «+}4 «+{+~• +· · ····· ê·äT·· ê··&· <»······· ·!·"·#·$·%·*·' jA·(·0·+ k*·,·.·/·6·1 †·2·4·5·=·7 ˜Û·8·:·;·<äU·A·> ª³·?·E·B µ·C·I·F “·G·M·J Çc·K·Q·N ÍZ·O·U·R Òž·SäV·[·V ꌷW·X·Y·Zä5·_·\ ÿ7·]#·`!¨·a·b·c#"Ê##!Px## #!ha### # +## !|÷# äW##!•4######!©s###!Áí####### !Õþ#!#)#$!îy#%#&#'#(#-#*"Ê#+äX#5#."è#/#0#1ä4#2#3#4#:#6"4Ô#7#9#?#;"K#<#>#A#B#E#@"a>#C#H#I#J#F"|Q#G#P#K"¥)#L#N#OäY#V#Q"³T#R#T#U#\#W"¸ô#X#Z#[#b#]"¿`#^#`#a“#c"Ç¿“$!­““ “"“““ ““ +#W“ ““äZ“““#µ““““““#%V““““ “%“#6œ“!“#“$“'“,“&#TQ“(“*“+“/“-#qq“.“3“0#t>“1ä[“5“6“7“;“4#yò“8“:“G“=“>“?“@“E“C“<#ì“A“H“D#Ÿ0“F€b“J“K“L“M“P“I#ÔÀ“N“S“Q#òé“R“U“V“W“X“Y“\“T#÷““Zä\“^“a“]$Ä“_þ“b$£“c%–>þþþþ$L»þþ þ +þ þ þþ$W“þ þþþþþ$o«þþþ$|bþä]þþþ&þ$þ$~þþþ þ!þ"þ#þ'þ(þ)þ+þ%$ Mþ*þ-þ/þ,$¼þ.þ1þ2þ3þ;þ9þ0$ΰþ4þ6þ7þ8þ<þ=þ?þ:$ñ$þ>þBþ@% ÷þAä^þDþFþGþHþIþJþNþC%vþKþEääþPþQ%gïþR%ÅØ€þ\þXþO%0ŸþSþVþWäþ^€þbþY%TÍþ]þ_þ`þaþZþ[%w €€þc%x†€€ € +€ € € €€€€€€%Ð'€€'ƒå€%Ñ/€%Ò%%Ó/%ò &8€€€€!€%û;€€€ €€€€€&)¼€&*Ý&+Ó&9€+€-&x§€)€/€"&Xe€*€,€.ä_€#€$€%€&€'&ƒ°€(&„¬&…¼&ŸY&Г€7€:€0&ªŒ€8€9€1€2&Ý΀3€4€5&ß?€6&à;&á[&þf€=€;' §€<€A€>'-€?€H€B'/+€C€F€S€I'F<€J€Z€T'[±€Uä`€]€['f“€\ä €^'g!€_€`€aää*ž’ää +'³ä ääääääääää ä!ä"ä3ä#ä$ä%'ËWä&'è6ä'( &ä((*3ä)(I`ä*(qXä+(Ã*ä,(Óûä-)ä.).·ä/)>sä0))ä1*@ä2*Q—*UÃ*\)*be*i^*q*wá*~ *„_*‡ñ*Œ‡*’‰*˜‹äaäbäc ' ' ' '*ç '+ ² )I )J )K )L )M )N )O )P )Q )R )S )T )U )V )W )X )Y )Z )[ )\ )] )^ )_ )` )a )b )c F+<å F F F F F F F F F  F + F  F  F  F F F F F F F F F F F F F F F F F F F  F! F" F# F$ F% F& F' F( F) F* F+ F, F- F. F/ F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F: F; F< F= F> F? F@ FA FB FC FD FE FF FG FH FI FJ FK FL FM FN FO FP FQ FR FS FT FU FV FW FX FY FZ F[ F\ F] F^ F_ F` Fa Fb Fc «+ŠË « «+ˆª+Œ‰ endstream endobj startxref -2850453 +2854025 %%EOF diff --git a/docs/src/toolsrout.tex b/docs/src/toolsrout.tex index d58faadc..d43af726 100644 --- a/docs/src/toolsrout.tex +++ b/docs/src/toolsrout.tex @@ -1791,10 +1791,10 @@ Returned as: an \verb|integer(psb_long_int_k_)| number. {\par\noindent\large\bfseries psb\_hsort --- Sorting by the Heapsort algorithm} \begin{verbatim} -call psb_isort(x,ix,dir,flag) -call psb_msort(x,ix,dir,flag) -call psb_qsort(x,ix,dir,flag) -call psb_hsort(x,ix,dir,flag) +call psb_isort(x,ix,dir,flag,reord) +call psb_msort(x,ix,dir,flag,reord) +call psb_qsort(x,ix,dir,flag,reord) +call psb_hsort(x,ix,dir,flag,reord) \end{verbatim} These serial routines sort a sequence $X$ into ascending or @@ -1809,7 +1809,8 @@ Type:{\bf required}.\\ Specified as: an integer, real or complex array of rank 1. \item[ix] A vector of indices.\\ Type:{\bf optional}.\\ -Specified as: an integer array of (at least) the same size as $X$. +Specified as: an integer array of (at least) the same size as +$X$. This argument is required when $reord=psb\_sort\_noreord\_x\_$. \item[dir] The desired ordering.\\ Type:{\bf optional}.\\ Specified as: an integer value: \begin{description} @@ -1824,18 +1825,24 @@ default \verb|psb_lsort_up_|. Type:{\bf optional}.\\ Specified as: an integer value \verb|psb_sort_ovw_idx_| or \verb|psb_sort_keep_idx_|; default \verb|psb_sort_ovw_idx_|. +\item[reord] Whether to reorder the input vector $x$ or just return + $IX$ for further usage.\\ +Type:{\bf optional}.\\ +Specified as: an integer value \verb|psb_sort_reord_x_| or +\verb|psb_sort_noreord_x_|; default \verb|psb_sort_reord_x_|. \end{description} \begin{description} \item[\bf On Return] -\item[x] The sequence of values, in the chosen ordering.\\ +\item[x] The sequence of values; if \verb|reord=psb_sort_reord_x_| it + will be in the chosen ordering.\\ Type:{\bf required}.\\ Specified as: an integer, real or complex array of rank 1. \item[ix] A vector of indices.\\ Type: {\bf Optional} \\ -An integer array of rank 1, whose entries are moved to the same -position as the corresponding entries in $x$. +An integer array of rank 1, whose $i$-th entry gives the position of +the (sorted) value of $x$ in the original sequence. \end{description} {\goodbreak\par\noindent\large\bfseries Notes} @@ -1850,7 +1857,10 @@ position as the corresponding entries in $x$. equal value) in the original input. With the insertion-sort or merge-sort algorithms ties are preserved in the same relative order as they had in the original sequence, while this is not guaranteed for quicksort or - heapsort; + heapsort; +\item If $reord=psb\_sort\_noreord\_x\_$, then the input sequence $x$ + is not reordered; the output is given in $ix$. Calling without $ix$ + in this case is flagged as an error; \item If $flag = psb\_sort\_ovw\_idx\_$ then the entries in $ix(1:n)$ where $n$ is the size of $x$ are initialized to $ix(i) \leftarrow i$; thus, upon return from the subroutine, for each diff --git a/test/openacc/Makefile b/test/openacc/Makefile index 5b69c2d6..b62373f2 100644 --- a/test/openacc/Makefile +++ b/test/openacc/Makefile @@ -14,7 +14,7 @@ LDLIBS=$(PSBGPULDLIBS) FINCLUDES=$(FMFLAG)$(MODDIR) $(FMFLAG)$(INCDIR) $(FMFLAG). $(FMFLAG)$(PSBMODDIR) $(FMFLAG)$(PSBINCDIR) $(LIBRSB_DEFINES) -FFLAGS=-O3 -march=native -fopenacc -foffload=nvptx-none="-march=sm_75" +FFLAGS=-O3 -march=native $(FCOPENACC) -DOPENACC CFLAGS=-O3 -march=native VTC=vectoacc.o @@ -47,9 +47,8 @@ psb_d_oacc_pde3d: $(FLINK) -fopenacc -DOPENACC psb_d_oacc_pde3d.o -o psb_d_oacc_pde3d $(PSBLAS_LIB) $(LDLIBS) /bin/mv psb_d_oacc_pde3d $(EXEDIR) -dpdegenmv: - mpifort -fallow-argument-mismatch -frecursive -g -O3 -frecursive -I../../modules/ -I. -DOPENACC -DHAVE_LAPACK -DHAVE_FLUSH_STMT -DLPK8 -DIPK4 -DMPI_MOD -c dpdegenmv.F90 -o dpdegenmv.o - $(FLINK) -fopenacc -DOPENACC dpdegenmv.o -o dpdegenmv $(PSBLAS_LIB) $(LDLIBS) +dpdegenmv: dpdegenmv.o + $(FLINK) $(FCOPENACC) dpdegenmv.o -o dpdegenmv $(PSBLAS_LIB) $(LDLIBS) /bin/mv dpdegenmv $(EXEDIR) clean: diff --git a/test/openacc/runs/ppde.inp b/test/openacc/runs/ppde.inp deleted file mode 100644 index f6a0cff3..00000000 --- a/test/openacc/runs/ppde.inp +++ /dev/null @@ -1,19 +0,0 @@ -17 Number of entries below this -BICGSTAB Iterative method BICGSTAB CGS BICG BICGSTABL RGMRES FCG CGR RICHARDSON -BJAC Preconditioner NONE DIAG BJAC -CSR Storage format for matrix A: CSR COO -HLL Storage format for matrix A: CSR COO -140 Domain size (acutal system is this**3 (pde3d) or **2 (pde2d) ) -3 Partition: 1 BLOCK 3 3D -2 Stopping criterion 1 2 -0200 MAXIT -10 ITRACE -002 IRST restart for RGMRES and BiCGSTABL -INVK Block Solver ILU,ILUT,INVK,INVT,AINV -NONE If ILU : MILU or NONE othewise ignored -NONE Scaling if ILUT: NONE, MAXVAL otherwise ignored -0 Level of fill for forward factorization -1 Level of fill for inverse factorization (only INVK,INVT) -1E-1 Threshold for forward factorization -1E-1 Threshold for inverse factorization (Only INVK, INVT) -LLK What orthogonalization algorithm? (Only AINV) From d757c9f1faaba4fb046c33f95eb5eadd0799b12e Mon Sep 17 00:00:00 2001 From: sfilippone Date: Wed, 8 Oct 2025 16:47:16 +0200 Subject: [PATCH 31/37] Show EXTRA_OPT in screen log --- configure | 4 ++++ configure.ac | 2 ++ 2 files changed, 6 insertions(+) diff --git a/configure b/configure index ef5867a5..ad040b1a 100755 --- a/configure +++ b/configure @@ -13064,6 +13064,8 @@ fi FCOPT : ${FCOPT} CCOPT : ${CCOPT} + EXTRA_OPT : ${EXTRA_OPT} + CUDA : ${PSB_HAVE_CUDA} CUDA_CC : ${pac_cv_cudacc} @@ -13102,6 +13104,8 @@ printf "%s\n" "$as_me: FCOPT : ${FCOPT} CCOPT : ${CCOPT} + EXTRA_OPT : ${EXTRA_OPT} + CUDA : ${PSB_HAVE_CUDA} CUDA_CC : ${pac_cv_cudacc} diff --git a/configure.ac b/configure.ac index ad5e573f..c2eade58 100644 --- a/configure.ac +++ b/configure.ac @@ -1142,6 +1142,8 @@ AC_MSG_NOTICE([ FCOPT : ${FCOPT} CCOPT : ${CCOPT} + EXTRA_OPT : ${EXTRA_OPT} + CUDA : ${PSB_HAVE_CUDA} CUDA_CC : ${pac_cv_cudacc} From 8f09b4be344936b0237d526da827dbc219e4cd88 Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Sun, 12 Oct 2025 17:34:17 +0200 Subject: [PATCH 32/37] Work around OpenMPI issue with mpi_get_attr --- base/modules/penv/psi_penv_mod.F90 | 88 ++++++++++-------------------- 1 file changed, 28 insertions(+), 60 deletions(-) diff --git a/base/modules/penv/psi_penv_mod.F90 b/base/modules/penv/psi_penv_mod.F90 index 320df941..f810863c 100644 --- a/base/modules/penv/psi_penv_mod.F90 +++ b/base/modules/penv/psi_penv_mod.F90 @@ -188,33 +188,33 @@ module psi_penv_mod include 'mpif.h' #endif - integer(psb_mpk_), parameter :: psb_apk_ = mpi_address_kind - - integer(psb_mpk_), parameter :: psb_tag_space = 200 - - integer(psb_mpk_), save :: psb_int_tag - integer(psb_mpk_), save :: psb_real_tag - integer(psb_mpk_), save :: psb_double_tag - integer(psb_mpk_), save :: psb_complex_tag - integer(psb_mpk_), save :: psb_dcomplex_tag - integer(psb_mpk_), save :: psb_logical_tag - integer(psb_mpk_), save :: psb_char_tag - integer(psb_mpk_), save :: psb_int8_tag - integer(psb_mpk_), save :: psb_int2_tag - integer(psb_mpk_), save :: psb_int4_tag - integer(psb_mpk_), save :: psb_long_tag - integer(psb_mpk_), save :: psb_max_simple_tag - integer(psb_mpk_), save :: psb_int_swap_tag - integer(psb_mpk_), save :: psb_real_swap_tag - integer(psb_mpk_), save :: psb_double_swap_tag - integer(psb_mpk_), save :: psb_complex_swap_tag - integer(psb_mpk_), save :: psb_dcomplex_swap_tag - integer(psb_mpk_), save :: psb_logical_swap_tag - integer(psb_mpk_), save :: psb_char_swap_tag - integer(psb_mpk_), save :: psb_int8_swap_tag - integer(psb_mpk_), save :: psb_int2_swap_tag - integer(psb_mpk_), save :: psb_int4_swap_tag - integer(psb_mpk_), save :: psb_long_swap_tag + integer(psb_mpk_), parameter :: psb_apk_ = mpi_address_kind + + integer(psb_mpk_), parameter :: psb_tag_space = 200 + integer(psb_mpk_), parameter :: psb_tag_base = 512 + integer(psb_mpk_), parameter :: psb_int_tag = psb_tag_base + 1 + integer(psb_mpk_), parameter :: psb_real_tag = psb_int_tag + 1 + integer(psb_mpk_), parameter :: psb_double_tag = psb_real_tag + 1 + integer(psb_mpk_), parameter :: psb_complex_tag = psb_double_tag + 1 + integer(psb_mpk_), parameter :: psb_dcomplex_tag = psb_complex_tag + 1 + integer(psb_mpk_), parameter :: psb_logical_tag = psb_dcomplex_tag + 1 + integer(psb_mpk_), parameter :: psb_char_tag = psb_logical_tag + 1 + integer(psb_mpk_), parameter :: psb_int8_tag = psb_char_tag + 1 + integer(psb_mpk_), parameter :: psb_int2_tag = psb_int8_tag + 1 + integer(psb_mpk_), parameter :: psb_int4_tag = psb_int2_tag + 1 + integer(psb_mpk_), parameter :: psb_long_tag = psb_int4_tag + 1 + integer(psb_mpk_), parameter :: psb_max_simple_tag = psb_long_tag + 2 + integer(psb_mpk_), parameter :: psb_int_swap_tag = psb_max_simple_tag + 1 + integer(psb_mpk_), parameter :: psb_real_swap_tag = psb_int_swap_tag + 1 + integer(psb_mpk_), parameter :: psb_double_swap_tag = psb_real_swap_tag + 1 + integer(psb_mpk_), parameter :: psb_complex_swap_tag = psb_double_swap_tag + 1 + integer(psb_mpk_), parameter :: psb_dcomplex_swap_tag = psb_complex_swap_tag + 1 + integer(psb_mpk_), parameter :: psb_logical_swap_tag = psb_dcomplex_swap_tag + 1 + integer(psb_mpk_), parameter :: psb_char_swap_tag = psb_logical_swap_tag + 1 + integer(psb_mpk_), parameter :: psb_int8_swap_tag = psb_char_swap_tag + 1 + integer(psb_mpk_), parameter :: psb_int2_swap_tag = psb_int8_swap_tag + 1 + integer(psb_mpk_), parameter :: psb_int4_swap_tag = psb_int2_swap_tag + 1 + integer(psb_mpk_), parameter :: psb_long_swap_tag = psb_int4_swap_tag + 1 integer(psb_mpk_), private, parameter :: psb_int_type = 200 @@ -799,7 +799,6 @@ contains implicit none integer(psb_mpk_) :: comm,info integer(psb_mpk_) :: ierror - integer(psb_apk_) :: tag_value logical :: flag info = 0 #if 0 @@ -837,9 +836,7 @@ contains psb_mpi_c_dpk_ = mpi_double_complex #endif -#if defined(PSB_SERIAL_MPI) - tag_value = HUGE(psb_tag_space)/2 -#else +#if ! defined(PSB_SERIAL_MPI) if (info == 0) call mpi_op_create(psi_i2amx_op,.true.,mpi_i2amx_op,info) if (info == 0) call mpi_op_create(psi_i2amn_op,.true.,mpi_i2amn_op,info) if (info == 0) call mpi_op_create(psi_mamx_op,.true.,mpi_mamx_op,info) @@ -856,36 +853,7 @@ contains if (info == 0) call mpi_op_create(psi_zamn_op,.true.,mpi_zamn_op,info) if (info == 0) call mpi_op_create(psi_snrm2_op,.true.,mpi_snrm2_op,info) if (info == 0) call mpi_op_create(psi_dnrm2_op,.true.,mpi_dnrm2_op,info) - if (info == 0) call mpi_comm_get_attr(comm,mpi_tag_ub,tag_value,flag,ierror) - if ((ierror/=0).or.(.not.flag)) then - tag_value = 0 - info = psb_err_internal_error_ - end if #endif - psb_int_tag = tag_value - psb_tag_space - psb_real_tag = psb_int_tag + 1 - psb_double_tag = psb_real_tag + 1 - psb_complex_tag = psb_double_tag + 1 - psb_dcomplex_tag = psb_complex_tag + 1 - psb_logical_tag = psb_dcomplex_tag + 1 - psb_char_tag = psb_logical_tag + 1 - psb_int8_tag = psb_char_tag + 1 - psb_int2_tag = psb_int8_tag + 1 - psb_int4_tag = psb_int2_tag + 1 - psb_long_tag = psb_int4_tag + 1 - psb_max_simple_tag = psb_long_tag + 2 - psb_int_swap_tag = psb_max_simple_tag + 1 - psb_real_swap_tag = psb_int_swap_tag + 1 - psb_double_swap_tag = psb_real_swap_tag + 1 - psb_complex_swap_tag = psb_double_swap_tag + 1 - psb_dcomplex_swap_tag = psb_complex_swap_tag + 1 - psb_logical_swap_tag = psb_dcomplex_swap_tag + 1 - psb_char_swap_tag = psb_logical_swap_tag + 1 - psb_int8_swap_tag = psb_char_swap_tag + 1 - psb_int2_swap_tag = psb_int8_swap_tag + 1 - psb_int4_swap_tag = psb_int2_swap_tag + 1 - psb_long_swap_tag = psb_int4_swap_tag + 1 - end subroutine psi_register_mpi_const #if (defined(PSB_IPK4) && defined(PSB_LPK8))||defined(PSB_IPK8) From b60fc2531414197f932384fec856bab411500b63 Mon Sep 17 00:00:00 2001 From: sfilippone Date: Mon, 20 Oct 2025 16:37:31 +0200 Subject: [PATCH 33/37] New OpenACC test and compile fix --- test/openacc/Makefile | 17 +- test/openacc/dpmix.F90 | 1216 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1230 insertions(+), 3 deletions(-) create mode 100644 test/openacc/dpmix.F90 diff --git a/test/openacc/Makefile b/test/openacc/Makefile index b62373f2..85d72330 100644 --- a/test/openacc/Makefile +++ b/test/openacc/Makefile @@ -14,7 +14,7 @@ LDLIBS=$(PSBGPULDLIBS) FINCLUDES=$(FMFLAG)$(MODDIR) $(FMFLAG)$(INCDIR) $(FMFLAG). $(FMFLAG)$(PSBMODDIR) $(FMFLAG)$(PSBINCDIR) $(LIBRSB_DEFINES) -FFLAGS=-O3 -march=native $(FCOPENACC) -DOPENACC +FFLAGS=-O3 -march=native $(FCOPENACC) -DOPENACC -DCUDA CFLAGS=-O3 -march=native VTC=vectoacc.o @@ -22,6 +22,7 @@ DVT=datavect.o CSRC=timers.c OBJS=$(SRCS:.F90=.o) $(CSRC:.c=.o) +OADIR=oaobjs all: dir psb_d_oacc_pde3d dpdegenmv @@ -42,15 +43,25 @@ dir: %.o: %.c $(CC) $(CFLAGS) $(FINCLUDES) -c $< -o $@ +cpyoa: + @if test ! -d $(OADIR); then mkdir $(OADIR); fi + /bin/cp $(TOPDIR)/openacc/*.o $(OADIR) + /bin/cp $(TOPDIR)/openacc/impl/*.o $(OADIR) + + psb_d_oacc_pde3d: mpifort -fallow-argument-mismatch -frecursive -g -O3 -frecursive -I../../modules/ -I. -DOPENACC -DHAVE_LAPACK -DHAVE_FLUSH_STMT -DLPK8 -DIPK4 -DMPI_MOD -c psb_d_oacc_pde3d.F90 -o psb_d_oacc_pde3d.o $(FLINK) -fopenacc -DOPENACC psb_d_oacc_pde3d.o -o psb_d_oacc_pde3d $(PSBLAS_LIB) $(LDLIBS) /bin/mv psb_d_oacc_pde3d $(EXEDIR) -dpdegenmv: dpdegenmv.o - $(FLINK) $(FCOPENACC) dpdegenmv.o -o dpdegenmv $(PSBLAS_LIB) $(LDLIBS) +dpdegenmv: dpdegenmv.o cpyoa + $(FLINK) $(FCOPENACC) dpdegenmv.o -o dpdegenmv $(OADIR)/*.o $(PSBLAS_LIB) $(LDLIBS) /bin/mv dpdegenmv $(EXEDIR) +dpmix: dpmix.o cpyoa + $(FLINK) $(FCOPENACC) dpmix.o -o dpmix $(OADIR)/*.o $(PSBLAS_LIB) $(LDLIBS) + /bin/mv dpmix $(EXEDIR) + clean: /bin/rm -fr *.o *.mod $(EXEDIR)/* diff --git a/test/openacc/dpmix.F90 b/test/openacc/dpmix.F90 new file mode 100644 index 00000000..3950dc44 --- /dev/null +++ b/test/openacc/dpmix.F90 @@ -0,0 +1,1216 @@ +! +! Parallel Sparse BLAS GPU plugin +! (C) Copyright 2013 +! Salvatore Filippone +! Alessandro Fanfarillo +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the PSBLAS group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PSBLAS GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! File: dpdegenmv.f90 +! +! Program: pdegenmv +! This sample program measures the performance of the matrix-vector product. +! The matrix is generated in the same way as for the pdegen test case of +! the main PSBLAS library. +! +! +module psb_d_pde3d_mod + + + use psb_base_mod, only : psb_dpk_, psb_ipk_, psb_lpk_, psb_desc_type,& + & psb_dspmat_type, psb_d_vect_type, dzero,& + & psb_d_base_sparse_mat, psb_d_base_vect_type, & + & psb_i_base_vect_type, psb_l_base_vect_type + + interface + function d_func_3d(x,y,z) result(val) + import :: psb_dpk_ + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + end function d_func_3d + end interface + + interface psb_gen_pde3d + module procedure psb_d_gen_pde3d + end interface psb_gen_pde3d + +contains + + function d_null_func_3d(x,y,z) result(val) + + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + + val = dzero + + end function d_null_func_3d + ! + ! functions parametrizing the differential equation + ! + + ! + ! Note: b1, b2 and b3 are the coefficients of the first + ! derivative of the unknown function. The default + ! we apply here is to have them zero, so that the resulting + ! matrix is symmetric/hermitian and suitable for + ! testing with CG and FCG. + ! When testing methods for non-hermitian matrices you can + ! change the B1/B2/B3 functions to e.g. done/sqrt((3*done)) + ! + function b1(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: b1 + real(psb_dpk_), intent(in) :: x,y,z + b1=done/sqrt((3*done)) + end function b1 + function b2(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: b2 + real(psb_dpk_), intent(in) :: x,y,z + b2=done/sqrt((3*done)) + end function b2 + function b3(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: b3 + real(psb_dpk_), intent(in) :: x,y,z + b3=done/sqrt((3*done)) + end function b3 + function c(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: c + real(psb_dpk_), intent(in) :: x,y,z + c=dzero + end function c + function a1(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: a1 + real(psb_dpk_), intent(in) :: x,y,z + a1=done/80 + end function a1 + function a2(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: a2 + real(psb_dpk_), intent(in) :: x,y,z + a2=done/80 + end function a2 + function a3(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: a3 + real(psb_dpk_), intent(in) :: x,y,z + a3=done/80 + end function a3 + function g(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: g + real(psb_dpk_), intent(in) :: x,y,z + g = dzero + if (x == done) then + g = done + else if (x == dzero) then + g = exp(y**2-z**2) + end if + end function g + + + ! + ! subroutine to allocate and fill in the coefficient matrix and + ! the rhs. + ! + subroutine psb_d_gen_pde3d(ctxt,idim,a,bv,xv,desc_a,afmt,info,& + & f,amold,vmold,imold,partition,nrl,iv,tnd) + use psb_base_mod + use psb_util_mod + ! + ! Discretizes the partial differential equation + ! + ! a1 dd(u) a2 dd(u) a3 dd(u) b1 d(u) b2 d(u) b3 d(u) + ! - ------ - ------ - ------ + ----- + ------ + ------ + c u = f + ! dxdx dydy dzdz dx dy dz + ! + ! with Dirichlet boundary conditions + ! u = g + ! + ! on the unit cube 0<=x,y,z<=1. + ! + ! + ! Note that if b1=b2=b3=c=0., the PDE is the Laplace equation. + ! + implicit none + integer(psb_ipk_) :: idim + type(psb_dspmat_type) :: a + type(psb_d_vect_type) :: xv,bv + type(psb_desc_type) :: desc_a + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: info + character(len=*) :: afmt + procedure(d_func_3d), optional :: f + class(psb_d_base_sparse_mat), optional :: amold + class(psb_d_base_vect_type), optional :: vmold + class(psb_i_base_vect_type), optional :: imold + integer(psb_ipk_), optional :: partition, nrl,iv(:) + logical, optional :: tnd + ! Local variables. + + integer(psb_ipk_), parameter :: nb=20 + type(psb_d_csc_sparse_mat) :: acsc + type(psb_d_coo_sparse_mat) :: acoo + type(psb_d_csr_sparse_mat) :: acsr + real(psb_dpk_) :: zt(nb),x,y,z + integer(psb_ipk_) :: nnz,nr,nlr,i,j,ii,ib,k, partition_ + integer(psb_lpk_) :: m,n,glob_row,nt + integer(psb_ipk_) :: ix,iy,iz,ia,indx_owner + ! For 3D partition + ! Note: integer control variables going directly into an MPI call + ! must be 4 bytes, i.e. psb_mpk_ + integer(psb_mpk_) :: npdims(3), npp, minfo + integer(psb_ipk_) :: npx,npy,npz, iamx,iamy,iamz,mynx,myny,mynz + integer(psb_ipk_), allocatable :: bndx(:),bndy(:),bndz(:) + ! Process grid + integer(psb_ipk_) :: np, iam + integer(psb_ipk_) :: icoeff + integer(psb_lpk_), allocatable :: irow(:),icol(:),myidx(:) + real(psb_dpk_), allocatable :: val(:) + ! deltah dimension of each grid cell + ! deltat discretization time + real(psb_dpk_) :: deltah, sqdeltah, deltah2 + real(psb_dpk_), parameter :: rhs=dzero,one=done,zero=dzero + real(psb_dpk_) :: t0, t1, t2, t3, tasb, talc, ttot, tgen, tcdasb + integer(psb_ipk_) :: err_act + procedure(d_func_3d), pointer :: f_ + logical :: tnd_ + character(len=20) :: name, ch_err,tmpfmt + + info = psb_success_ + name = 'create_matrix' + call psb_erractionsave(err_act) + + call psb_info(ctxt, iam, np) + + + if (present(f)) then + f_ => f + else + f_ => d_null_func_3d + end if + + deltah = done/(idim+2) + sqdeltah = deltah*deltah + deltah2 = (2*done)* deltah + + if (present(partition)) then + if ((1<= partition).and.(partition <= 3)) then + partition_ = partition + else + write(*,*) 'Invalid partition choice ',partition,' defaulting to 3' + partition_ = 3 + end if + else + partition_ = 3 + end if + + ! initialize array descriptor and sparse matrix storage. provide an + ! estimate of the number of non zeroes + + m = (1_psb_lpk_*idim)*idim*idim + n = m + nnz = ((n*7)/(np)) + if(iam == psb_root_) write(psb_out_unit,'("Generating Matrix (size=",i0,")...")')n + t0 = psb_wtime() + select case(partition_) + case(1) + ! A BLOCK partition + if (present(nrl)) then + nr = nrl + else + ! + ! Using a simple BLOCK distribution. + ! + nt = (m+np-1)/np + nr = max(0,min(nt,m-(iam*nt))) + end if + + nt = nr + call psb_sum(ctxt,nt) + if (nt /= m) then + write(psb_err_unit,*) iam, 'Initialization error ',nr,nt,m + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end if + + ! + ! First example of use of CDALL: specify for each process a number of + ! contiguous rows + ! + call psb_cdall(ctxt,desc_a,info,nl=nr) + myidx = desc_a%get_global_indices() + nlr = size(myidx) + + case(2) + ! A partition defined by the user through IV + + if (present(iv)) then + if (size(iv) /= m) then + write(psb_err_unit,*) iam, 'Initialization error: wrong IV size',size(iv),m + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end if + else + write(psb_err_unit,*) iam, 'Initialization error: IV not present' + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end if + + ! + ! Second example of use of CDALL: specify for each row the + ! process that owns it + ! + call psb_cdall(ctxt,desc_a,info,vg=iv) + myidx = desc_a%get_global_indices() + nlr = size(myidx) + + case(3) + ! A 3-dimensional partition + + ! A nifty MPI function will split the process list + npdims = 0 + call mpi_dims_create(np,3,npdims,info) + npx = npdims(1) + npy = npdims(2) + npz = npdims(3) + + allocate(bndx(0:npx),bndy(0:npy),bndz(0:npz)) + ! We can reuse idx2ijk for process indices as well. + call idx2ijk(iamx,iamy,iamz,iam,npx,npy,npz,base=0) + ! Now let's split the 3D cube in hexahedra + call dist1Didx(bndx,idim,npx) + mynx = bndx(iamx+1)-bndx(iamx) + call dist1Didx(bndy,idim,npy) + myny = bndy(iamy+1)-bndy(iamy) + call dist1Didx(bndz,idim,npz) + mynz = bndz(iamz+1)-bndz(iamz) + + ! How many indices do I own? + nlr = mynx*myny*mynz + allocate(myidx(nlr)) + ! Now, let's generate the list of indices I own + nr = 0 + do i=bndx(iamx),bndx(iamx+1)-1 + do j=bndy(iamy),bndy(iamy+1)-1 + do k=bndz(iamz),bndz(iamz+1)-1 + nr = nr + 1 + call ijk2idx(myidx(nr),i,j,k,idim,idim,idim) + end do + end do + end do + if (nr /= nlr) then + write(psb_err_unit,*) iam,iamx,iamy,iamz, 'Initialization error: NR vs NLR ',& + & nr,nlr,mynx,myny,mynz + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + end if + + ! + ! Third example of use of CDALL: specify for each process + ! the set of global indices it owns. + ! + call psb_cdall(ctxt,desc_a,info,vl=myidx) + + case default + write(psb_err_unit,*) iam, 'Initialization error: should not get here' + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end select + + + if (info == psb_success_) call psb_spall(a,desc_a,info,nnz=nnz,& + & dupl=psb_dupl_err_) + ! define rhs from boundary conditions; also build initial guess + if (info == psb_success_) call psb_geall(xv,desc_a,info) + if (info == psb_success_) call psb_geall(bv,desc_a,info) + + call psb_barrier(ctxt) + talc = psb_wtime()-t0 + + if (info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='allocation rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + ! we build an auxiliary matrix consisting of one row at a + ! time; just a small matrix. might be extended to generate + ! a bunch of rows per call. + ! + allocate(val(20*nb),irow(20*nb),& + &icol(20*nb),stat=info) + if (info /= psb_success_ ) then + info=psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + + ! loop over rows belonging to current process in a block + ! distribution. + + call psb_barrier(ctxt) + t1 = psb_wtime() + do ii=1, nlr,nb + ib = min(nb,nlr-ii+1) + icoeff = 1 + do k=1,ib + i=ii+k-1 + ! local matrix pointer + glob_row=myidx(i) + ! compute gridpoint coordinates + call idx2ijk(ix,iy,iz,glob_row,idim,idim,idim) + ! x, y, z coordinates + x = (ix-1)*deltah + y = (iy-1)*deltah + z = (iz-1)*deltah + zt(k) = f_(x,y,z) + ! internal point: build discretization + ! + ! term depending on (x-1,y,z) + ! + val(icoeff) = -a1(x,y,z)/sqdeltah-b1(x,y,z)/deltah2 + if (ix == 1) then + zt(k) = g(dzero,y,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix-1,iy,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x,y-1,z) + val(icoeff) = -a2(x,y,z)/sqdeltah-b2(x,y,z)/deltah2 + if (iy == 1) then + zt(k) = g(x,dzero,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy-1,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x,y,z-1) + val(icoeff)=-a3(x,y,z)/sqdeltah-b3(x,y,z)/deltah2 + if (iz == 1) then + zt(k) = g(x,y,dzero)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy,iz-1,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + ! term depending on (x,y,z) + val(icoeff)=(2*done)*(a1(x,y,z)+a2(x,y,z)+a3(x,y,z))/sqdeltah & + & + c(x,y,z) + call ijk2idx(icol(icoeff),ix,iy,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + ! term depending on (x,y,z+1) + val(icoeff)=-a3(x,y,z)/sqdeltah+b3(x,y,z)/deltah2 + if (iz == idim) then + zt(k) = g(x,y,done)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy,iz+1,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x,y+1,z) + val(icoeff)=-a2(x,y,z)/sqdeltah+b2(x,y,z)/deltah2 + if (iy == idim) then + zt(k) = g(x,done,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy+1,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x+1,y,z) + val(icoeff)=-a1(x,y,z)/sqdeltah+b1(x,y,z)/deltah2 + if (ix==idim) then + zt(k) = g(done,y,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix+1,iy,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + end do + call psb_spins(icoeff-1,irow,icol,val,a,desc_a,info) + if(info /= psb_success_) exit + call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),bv,desc_a,info) + if(info /= psb_success_) exit + zt(:)=dzero + call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),xv,desc_a,info) + if(info /= psb_success_) exit + end do + + tgen = psb_wtime()-t1 + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='insert rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + deallocate(val,irow,icol) + + call psb_barrier(ctxt) + t1 = psb_wtime() + call psb_cdasb(desc_a,info,mold=imold) + tcdasb = psb_wtime()-t1 + call psb_barrier(ctxt) + t1 = psb_wtime() + if (info == psb_success_) then + if (present(amold)) then + call psb_spasb(a,desc_a,info,mold=amold,bld_and=tnd) + else + call psb_spasb(a,desc_a,info,afmt=afmt,bld_and=tnd) + end if + end if + call psb_barrier(ctxt) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='asb rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + if (info == psb_success_) call psb_geasb(xv,desc_a,info,mold=vmold) + if (info == psb_success_) call psb_geasb(bv,desc_a,info,mold=vmold) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='asb rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + tasb = psb_wtime()-t1 + call psb_barrier(ctxt) + ttot = psb_wtime() - t0 + + call psb_amx(ctxt,talc) + call psb_amx(ctxt,tgen) + call psb_amx(ctxt,tasb) + call psb_amx(ctxt,ttot) + if(iam == psb_root_) then + tmpfmt = a%get_fmt() + write(psb_out_unit,'("The matrix has been generated and assembled in ",a3," format.")')& + & tmpfmt + write(psb_out_unit,'("-allocation time : ",es12.5)') talc + write(psb_out_unit,'("-coeff. gen. time : ",es12.5)') tgen + write(psb_out_unit,'("-desc asbly time : ",es12.5)') tcdasb + write(psb_out_unit,'("- mat asbly time : ",es12.5)') tasb + write(psb_out_unit,'("-total time : ",es12.5)') ttot + + end if + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psb_d_gen_pde3d + + +end module psb_d_pde3d_mod + + +program pdgenmv + use psb_base_mod + use psb_util_mod + use psb_ext_mod +#ifdef OPENACC + use psb_oacc_mod +#endif +#ifdef CUDA + use psb_cuda_mod +#endif + use psb_d_pde3d_mod + implicit none + + ! input parameters + character(len=5) :: acfmt, agfmt + integer :: idim + logical :: tnd + ! miscellaneous + real(psb_dpk_), parameter :: one = 1.d0 + real(psb_dpk_) :: t1, t2, tprec, flops, tflops,& + & tt1, tt2, gt1, gt2, gflops, bdwdth,& + & tcnvcsr, tcnvc1, tcnvgpu, tcnvg1 + + ! sparse matrix and preconditioner + type(psb_dspmat_type) :: a, aoacc, aux_a, acuda + ! descriptor + type(psb_desc_type) :: desc_a + ! dense matrices + type(psb_d_vect_type), target :: xv, bv, xoacc, boacc, xcuda,bcuda +#ifdef OPENACC + type(psb_d_vect_oacc) :: vomold + type(psb_i_vect_oacc) :: iomold +#endif +#ifdef CUDA + type(psb_d_vect_cuda) :: vgmold + type(psb_i_vect_cuda) :: igmold +#endif + real(psb_dpk_), allocatable :: x1(:), x2(:), x0(:) + ! blacs parameters + type(psb_ctxt_type) :: ctxt + integer :: iam, np + + ! solver parameters + integer(psb_epk_) :: amatsize, precsize, descsize, annz, nbytes + real(psb_dpk_) :: err, eps, tnv, tng,tdot, dnrm2,ddot + integer, parameter :: ntests=8, ngpu=4, ncnv=3 + type(psb_d_coo_sparse_mat), target :: acoo + type(psb_d_csr_sparse_mat), target :: acsr + type(psb_d_ell_sparse_mat), target :: aell + type(psb_d_hll_sparse_mat), target :: ahll + type(psb_d_dia_sparse_mat), target :: adia + type(psb_d_hdia_sparse_mat), target :: ahdia +#ifdef OPENACC + type(psb_d_oacc_ell_sparse_mat), target :: aelg + type(psb_d_oacc_csr_sparse_mat), target :: acsrg + type(psb_d_oacc_hll_sparse_mat), target :: ahlg +#endif +#ifdef CUDA + type(psb_d_cuda_elg_sparse_mat), target :: acelg + type(psb_d_cuda_csrg_sparse_mat), target :: accsrg + type(psb_d_cuda_hlg_sparse_mat), target :: achlg +#endif + class(psb_d_base_sparse_mat), pointer :: agmold, acmold, aomold + + ! other variables + logical, parameter :: dump=.false. + integer(psb_ipk_) :: info, i, j, nr, nrg + integer(psb_lpk_) :: ig + character(len=20) :: name,ch_err + character(len=40) :: fname + + info=psb_success_ + + + call psb_init(ctxt) + call psb_info(ctxt,iam,np) + +#ifdef OPENACC + call psb_oacc_init(ctxt) +#endif + +#ifdef CUDA + call psb_cuda_init(ctxt) +#endif + + if (iam < 0) then + ! This should not happen, but just in case + call psb_exit(ctxt) + stop + endif + if(psb_get_errstatus() /= 0) goto 9999 + name='pdegenmv-oacc' + ! + ! Hello world + ! + if (iam == psb_root_) then + write(*,*) 'Welcome to PSBLAS version: ',psb_version_string_ + write(*,*) 'This is the ',trim(name),' sample program' + end if +#ifdef OPENACC +!!$ write(*,*) 'Process ',iam,' running on device: ', psb_oacc_getDevice(),' out of', psb_oacc_getDeviceCount() +!!$ write(*,*) 'Process ',iam,' device ', psb_oacc_getDevice(),' is a: ', trim(psb_oacc_DeviceName()) +#endif +#ifdef CUDA + write(*,*) 'Process ',iam,' running on device: ', psb_cuda_getDevice(),' out of', psb_cuda_getDeviceCount() + write(*,*) 'Process ',iam,' device ', psb_cuda_getDevice(),' is a: ', trim(psb_cuda_DeviceName()) +#endif +!!$ call psb_oacc_DeviceSync() + call psb_cuda_DeviceSync() + ! + ! get parameters + ! + call get_parms(ctxt,acfmt,agfmt,idim,tnd) + call psb_init_timers() + ! + ! allocate and fill in the coefficient matrix and initial vectors + ! + call psb_barrier(ctxt) + t1 = psb_wtime() + call psb_gen_pde3d(ctxt,idim,a,bv,xv,desc_a,'CSR ',info,partition=3,tnd=tnd) + call psb_barrier(ctxt) + t2 = psb_wtime() - t1 + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='create_matrix' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + if (iam == psb_root_) write(psb_out_unit,'("Overall matrix creation time : ",es12.5)')t2 + if (iam == psb_root_) write(psb_out_unit,'(" ")') + + if (dump) then + write(fname,'(a,i3.3,a,i3.3,a,i3.3,a)') 'pde',idim,'-',iam,'-',np,'.mtx' + call a%print(fname,head='PDEGEN test matrix') + end if + + select case(psb_toupper(acfmt)) + case('ELL') + acmold => aell + case('HLL') + acmold => ahll + case('DIA') + acmold => adia + case('HDIA') + acmold => ahdia + case('CSR') + acmold => acsr + case('COO') + acmold => acoo + case default + write(*,*) 'Unknown format defaulting to HLL' + acmold => ahll + end select + call a%cscnv(info,mold=acmold) + if ((info /= 0).or.(psb_get_errstatus()/=0)) then + write(0,*) 'From cscnv ',info + call psb_error() + stop + end if + +#ifdef OPENACC + select case(psb_toupper(agfmt)) + case('ELG') + aomold => aelg + case('HLG') + aomold => ahlg + case('CSRG') + aomold => acsrg + case default + write(*,*) 'Unknown format defaulting to HLG' + aomold => ahlg + end select + call a%cscnv(aoacc,info,mold=aomold) + if ((info /= 0).or.(psb_get_errstatus()/=0)) then + write(0,*) 'From cscnv ',info + call psb_error() + stop + end if + call desc_a%cnv(mold=iomold) + + call psb_geasb(boacc,desc_a,info,scratch=.true.,mold=vomold) + call psb_geasb(xoacc,desc_a,info,scratch=.true.,mold=vomold) + nr = desc_a%get_local_rows() + nrg = desc_a%get_global_rows() + call psb_geall(x0,desc_a,info) + do i=1, nr + call desc_a%l2g(i,ig,info) + x0(i) = 1.0 + (1.0*ig)/(nrg**2) + end do + call a%cscnv(aux_a,info,mold=acoo) + tcnvcsr = 0 + tcnvgpu = 0 + call psb_geall(x1,desc_a,info) + do j=1, ncnv + call aux_a%cscnv(a,info,mold=acoo) + call psb_barrier(ctxt) + t1 = psb_wtime() + call a%cscnv(info,mold=acmold) + t2 = psb_Wtime() -t1 + call psb_amx(ctxt,t2) + tcnvcsr = tcnvcsr + t2 + if (j==1) tcnvc1 = t2 + call psb_geasb(x1,desc_a,info) + call xv%bld(x0) + call psb_geasb(bv,desc_a,info,scratch=.true.) + + + call aux_a%cscnv(aoacc,info,mold=acoo) + call xoacc%bld(x0,mold=vomold) + call psb_geasb(boacc,desc_a,info,scratch=.true.,mold=vomold) + call psb_barrier(ctxt) + t1 = psb_wtime() + call aoacc%cscnv(info,mold=aomold) +!!$ call psb_oacc_DeviceSync() + t2 = psb_Wtime() -t1 + call psb_amx(ctxt,t2) + if (j==1) tcnvg1 = t2 + tcnvgpu = tcnvgpu + t2 + end do + + call xv%set(x0) + call psb_barrier(ctxt) + t1 = psb_wtime() + do i=1,ntests + call psb_spmm(done,a,xv,dzero,bv,desc_a,info) + end do + call psb_barrier(ctxt) + t2 = psb_wtime() - t1 + call psb_amx(ctxt,t2) + + call xoacc%set(x0) + + ! FIXME: cache flush needed here + x1 = bv%get_vect() + x2 = boacc%get_vect() + + call psb_barrier(ctxt) + tt1 = psb_wtime() + do i=1,ntests + call psb_spmm(done,aoacc,xv,dzero,boacc,desc_a,info) + if ((info /= 0).or.(psb_get_errstatus()/=0)) then + write(0,*) 'From 1 spmm',info,i,ntests + call psb_error() + stop + end if + + end do +!!$ call psb_oacc_DeviceSync() + call psb_barrier(ctxt) + tt2 = psb_wtime() - tt1 + call psb_amx(ctxt,tt2) + x1 = bv%get_vect() + x2 = boacc%get_vect() + nr = desc_a%get_local_rows() + eps = maxval(abs(x1(1:nr)-x2(1:nr))) + call psb_amx(ctxt,eps) + if (iam==0) write(*,*) 'Max diff on xoaccPU',eps + + ! FIXME: cache flush needed here + call xoacc%set(x0) + call xoacc%sync() + call psb_barrier(ctxt) + gt1 = psb_wtime() + do i=1,ntests*ngpu + call psb_spmm(done,aoacc,xoacc,dzero,boacc,desc_a,info) + ! For timing purposes we need to make sure all threads + ! in the device are done. + if ((info /= 0).or.(psb_get_errstatus()/=0)) then + write(0,*) 'From 2 spmm',info,i,ntests + call psb_error() + stop + end if + + end do +!!$ call psb_oacc_DeviceSync() + call psb_barrier(ctxt) + gt2 = psb_wtime() - gt1 + call psb_amx(ctxt,gt2) + call boacc%sync() + x1 = bv%get_vect() + x2 = boacc%get_vect() + tnv = psb_genrm2(bv,desc_a,info) + tng = psb_genrm2(boacc,desc_a,info) + tdot = psb_gedot(boacc,boacc,desc_a,info) +!!$ write(0,*) ' bv ',tnv,' boacc ',tng, ' dot ',tdot,eps,& +!!$ & dnrm2(desc_a%get_local_rows(),x2,1),& +!!$ & ddot(desc_a%get_local_rows(),x1,1,x2,1) + call psb_geaxpby(-done,boacc,+done,bv,desc_a,info) + eps = psb_geamax(bv,desc_a,info) + + call psb_amx(ctxt,t2) + eps = maxval(abs(x1(1:nr)-x2(1:nr))) + call psb_amx(ctxt,eps) + if (iam==0) write(*,*) 'Max diff on GPU',eps + if (dump) then + write(fname,'(a,i3.3,a,i3.3,a)')'XCPU-out-',iam,'-',np,'.mtx' + call mm_array_write(x1(1:nr),'Local part CPU',info,filename=fname) + write(fname,'(a,i3.3,a,i3.3,a)')'XGPU-out-',iam,'-',np,'.mtx' + call mm_array_write(x2(1:nr),'Local part GPU',info,filename=fname) + end if + + annz = a%get_nzeros() + amatsize = a%sizeof() + descsize = psb_sizeof(desc_a) + call psb_sum(ctxt,nr) + call psb_sum(ctxt,annz) + call psb_sum(ctxt,amatsize) + call psb_sum(ctxt,descsize) + + if (iam == psb_root_) then + write(psb_out_unit,& + & '("Matrix: ell1 ",i0)') idim + write(psb_out_unit,& + &'("Test on : ",i20," processors")') np + write(psb_out_unit,& + &'("Size of matrix : ",i20," ")') nr + write(psb_out_unit,& + &'("Number of nonzeros : ",i20," ")') annz + write(psb_out_unit,& + &'("Memory occupation : ",i20," ")') amatsize + flops = ntests*(2.d0*annz) + tflops = flops + gflops = flops * ngpu + write(psb_out_unit,'("Storage type for A: ",a)') a%get_fmt() + write(psb_out_unit,'("Storage type for AOACC: ",a)') aoacc%get_fmt() + write(psb_out_unit,'("Time to convert A from COO to CPU (1): ",F20.9)')& + & tcnvc1 + write(psb_out_unit,'("Time to convert A from COO to CPU (t): ",F20.9)')& + & tcnvcsr + write(psb_out_unit,'("Time to convert A from COO to CPU (a): ",F20.9)')& + & tcnvcsr/ncnv + write(psb_out_unit,'("Time to convert A from COO to GPU (1): ",F20.9)')& + & tcnvg1 + write(psb_out_unit,'("Time to convert A from COO to GPU (t): ",F20.9)')& + & tcnvgpu + write(psb_out_unit,'("Time to convert A from COO to GPU (a): ",F20.9)')& + & tcnvgpu/ncnv + + write(psb_out_unit,& + & '("Number of flops (",i0," prod) : ",F20.0," ")') & + & ntests,flops + + flops = flops / (t2) + tflops = tflops / (tt2) + gflops = gflops / (gt2) + + write(psb_out_unit,'("Time for ",i6," products (s) (CPU) : ",F20.3)')& + & ntests,t2 + write(psb_out_unit,'("Time per product (ms) (CPU) : ",F20.3)')& + & t2*1.d3/(1.d0*ntests) + write(psb_out_unit,'("MFLOPS (CPU) : ",F20.3)')& + & flops/1.d6 + write(psb_out_unit,'("Time for ",i6," products (s) (xGPU) : ",F20.3)')& + & ntests, tt2 + write(psb_out_unit,'("Time per product (ms) (xGPU) : ",F20.3)')& + & tt2*1.d3/(1.d0*ntests) + write(psb_out_unit,'("MFLOPS (xGPU) : ",F20.3)')& + & tflops/1.d6 + + write(psb_out_unit,'("Time for ",i6," products (s) (GPU.) : ",F20.3)')& + & ngpu*ntests,gt2 + write(psb_out_unit,'("Time per product (ms) (GPU.) : ",F20.3)')& + & gt2*1.d3/(1.d0*ntests*ngpu) + write(psb_out_unit,'("MFLOPS (GPU.) : ",F20.3)')& + & gflops/1.d6 + ! + ! This computation assumes the data movement associated with CSR: + ! it is minimal in terms of coefficients. Other formats may either move + ! more data (padding etc.) or less data (if they can save on the indices). + ! + nbytes = nr*(2*psb_sizeof_dp + psb_sizeof_ip)+& + & annz*(psb_sizeof_dp + psb_sizeof_ip) + bdwdth = ntests*nbytes/(t2*1.d6) + write(psb_out_unit,*) + write(psb_out_unit,'("MBYTES/S sust. effective bandwidth (CPU) : ",F20.3)') bdwdth + bdwdth = ngpu*ntests*nbytes/(gt2*1.d6) + write(psb_out_unit,'("MBYTES/S sust. effective bandwidth (GPU) : ",F20.3)') bdwdth +!!$ bdwdth = psb_oacc_MemoryPeakBandwidth() + write(psb_out_unit,'("MBYTES/S peak bandwidth (GPU) : ",F20.3)') bdwdth + write(psb_out_unit,'("Storage type for DESC_A: ",a)') desc_a%indxmap%get_fmt() + write(psb_out_unit,'("Total memory occupation for DESC_A: ",i12)')descsize + end if +#endif + +#ifdef CUDA + select case(psb_toupper(agfmt)) + case('ELG') + agmold => acelg + case('HLG') + agmold => achlg + case('CSRG') + agmold => accsrg + case default + write(*,*) 'Unknown format defaulting to HLG' + agmold => achlg + end select + call a%cscnv(acuda,info,mold=agmold) + if ((info /= 0).or.(psb_get_errstatus()/=0)) then + write(0,*) 'From cscnv ',info + call psb_error() + stop + end if + call desc_a%cnv(mold=igmold) + call psb_geasb(bcuda,desc_a,info,scratch=.true.,mold=vgmold) + call psb_geasb(xcuda,desc_a,info,scratch=.true.,mold=vgmold) + nr = desc_a%get_local_rows() + nrg = desc_a%get_global_rows() + call psb_geall(x0,desc_a,info) + do i=1, nr + call desc_a%l2g(i,ig,info) + x0(i) = 1.0 + (1.0*ig)/(nrg**2) + end do + call a%cscnv(aux_a,info,mold=acoo) + tcnvcsr = 0 + tcnvgpu = 0 + call psb_geall(x1,desc_a,info) + do j=1, ncnv + call aux_a%cscnv(a,info,mold=acoo) + call psb_barrier(ctxt) + t1 = psb_wtime() + call a%cscnv(info,mold=acmold) + t2 = psb_Wtime() -t1 + call psb_amx(ctxt,t2) + tcnvcsr = tcnvcsr + t2 + if (j==1) tcnvc1 = t2 + call psb_geasb(x1,desc_a,info) + call xv%bld(x0) + call psb_geasb(bv,desc_a,info,scratch=.true.) + call aux_a%cscnv(acuda,info,mold=acoo) + call xcuda%bld(x0,mold=vgmold) + call psb_geasb(bcuda,desc_a,info,scratch=.true.,mold=vgmold) + call psb_barrier(ctxt) + t1 = psb_wtime() + call acuda%cscnv(info,mold=agmold) + call psb_cuda_DeviceSync() + t2 = psb_Wtime() -t1 + call psb_amx(ctxt,t2) + if (j==1) tcnvg1 = t2 + tcnvgpu = tcnvgpu + t2 + end do + call xv%set(x0) + call psb_barrier(ctxt) + t1 = psb_wtime() + do i=1,ntests + call psb_spmm(done,a,xv,dzero,bv,desc_a,info) + end do + call psb_barrier(ctxt) + t2 = psb_wtime() - t1 + call psb_amx(ctxt,t2) + + call xcuda%set(x0) + + ! FIXME: cache flush needed here + x1 = bv%get_vect() + x2 = bcuda%get_vect() + + call psb_barrier(ctxt) + tt1 = psb_wtime() + do i=1,ntests + call psb_spmm(done,acuda,xv,dzero,bcuda,desc_a,info) + if ((info /= 0).or.(psb_get_errstatus()/=0)) then + write(0,*) 'From 1 spmm',info,i,ntests + call psb_error() + stop + end if + + end do + call psb_cuda_DeviceSync() + call psb_barrier(ctxt) + tt2 = psb_wtime() - tt1 + call psb_amx(ctxt,tt2) + x1 = bv%get_vect() + x2 = bcuda%get_vect() + nr = desc_a%get_local_rows() + eps = maxval(abs(x1(1:nr)-x2(1:nr))) + call psb_amx(ctxt,eps) + if (iam==0) write(*,*) 'Max diff on xGPU',eps + + ! FIXME: cache flush needed here + call xcuda%set(x0) + call xcuda%sync() + call psb_barrier(ctxt) + gt1 = psb_wtime() + do i=1,ntests*ngpu + call psb_spmm(done,acuda,xcuda,dzero,bcuda,desc_a,info) + ! For timing purposes we need to make sure all threads + ! in the device are done. + if ((info /= 0).or.(psb_get_errstatus()/=0)) then + write(0,*) 'From 2 spmm',info,i,ntests + call psb_error() + stop + end if + + end do + + call psb_cuda_DeviceSync() + call psb_barrier(ctxt) + gt2 = psb_wtime() - gt1 + call psb_amx(ctxt,gt2) + call bcuda%sync() + x1 = bv%get_vect() + x2 = bcuda%get_vect() + tnv = psb_genrm2(bv,desc_a,info) + tng = psb_genrm2(bcuda,desc_a,info) + tdot = psb_gedot(bcuda,bcuda,desc_a,info) + write(0,*) ' bv ',tnv,' bcuda ',tng, ' dot ',tdot,eps,& + & dnrm2(desc_a%get_local_rows(),x2,1),& + & ddot(desc_a%get_local_rows(),x1,1,x2,1) + call psb_geaxpby(-done,bcuda,+done,bv,desc_a,info) + eps = psb_geamax(bv,desc_a,info) + + call psb_amx(ctxt,t2) + eps = maxval(abs(x1(1:nr)-x2(1:nr))) + call psb_amx(ctxt,eps) + if (iam==0) write(*,*) 'Max diff on GPU',eps + if (dump) then + write(fname,'(a,i3.3,a,i3.3,a)')'XCPU-out-',iam,'-',np,'.mtx' + call mm_array_write(x1(1:nr),'Local part CPU',info,filename=fname) + write(fname,'(a,i3.3,a,i3.3,a)')'XGPU-out-',iam,'-',np,'.mtx' + call mm_array_write(x2(1:nr),'Local part GPU',info,filename=fname) + end if + + annz = a%get_nzeros() + amatsize = a%sizeof() + descsize = psb_sizeof(desc_a) + call psb_sum(ctxt,nr) + call psb_sum(ctxt,annz) + call psb_sum(ctxt,amatsize) + call psb_sum(ctxt,descsize) + + if (iam == psb_root_) then + write(psb_out_unit,& + & '("Matrix: ell1 ",i0)') idim + write(psb_out_unit,& + &'("Test on : ",i20," processors")') np + write(psb_out_unit,& + &'("Size of matrix : ",i20," ")') nr + write(psb_out_unit,& + &'("Number of nonzeros : ",i20," ")') annz + write(psb_out_unit,& + &'("Memory occupation : ",i20," ")') amatsize + flops = ntests*(2.d0*annz) + tflops = flops + gflops = flops * ngpu + write(psb_out_unit,'("Storage type for A: ",a)') a%get_fmt() + write(psb_out_unit,'("Storage type for ACUDA: ",a)') acuda%get_fmt() + write(psb_out_unit,'("Time to convert A from COO to CPU (1): ",F20.9)')& + & tcnvc1 + write(psb_out_unit,'("Time to convert A from COO to CPU (t): ",F20.9)')& + & tcnvcsr + write(psb_out_unit,'("Time to convert A from COO to CPU (a): ",F20.9)')& + & tcnvcsr/ncnv + write(psb_out_unit,'("Time to convert A from COO to GPU (1): ",F20.9)')& + & tcnvg1 + write(psb_out_unit,'("Time to convert A from COO to GPU (t): ",F20.9)')& + & tcnvgpu + write(psb_out_unit,'("Time to convert A from COO to GPU (a): ",F20.9)')& + & tcnvgpu/ncnv + write(psb_out_unit,& + & '("Number of flops (",i0," prod) : ",F20.0," ")') & + & ntests,flops + + flops = flops / (t2) + tflops = tflops / (tt2) + gflops = gflops / (gt2) + + write(psb_out_unit,'("Time for ",i6," products (s) (CPU) : ",F20.3)')& + & ntests,t2 + write(psb_out_unit,'("Time per product (ms) (CPU) : ",F20.3)')& + & t2*1.d3/(1.d0*ntests) + write(psb_out_unit,'("MFLOPS (CPU) : ",F20.3)')& + & flops/1.d6 + write(psb_out_unit,'("Time for ",i6," products (s) (xGPU) : ",F20.3)')& + & ntests, tt2 + write(psb_out_unit,'("Time per product (ms) (xGPU) : ",F20.3)')& + & tt2*1.d3/(1.d0*ntests) + write(psb_out_unit,'("MFLOPS (xGPU) : ",F20.3)')& + & tflops/1.d6 + + write(psb_out_unit,'("Time for ",i6," products (s) (GPU.) : ",F20.3)')& + & ngpu*ntests,gt2 + write(psb_out_unit,'("Time per product (ms) (GPU.) : ",F20.3)')& + & gt2*1.d3/(1.d0*ntests*ngpu) + write(psb_out_unit,'("MFLOPS (GPU.) : ",F20.3)')& + & gflops/1.d6 + ! + ! This computation assumes the data movement associated with CSR: + ! it is minimal in terms of coefficients. Other formats may either move + ! more data (padding etc.) or less data (if they can save on the indices). + ! + nbytes = nr*(2*psb_sizeof_dp + psb_sizeof_ip)+& + & annz*(psb_sizeof_dp + psb_sizeof_ip) + bdwdth = ntests*nbytes/(t2*1.d6) + write(psb_out_unit,*) + write(psb_out_unit,'("MBYTES/S sust. effective bandwidth (CPU) : ",F20.3)') bdwdth + bdwdth = ngpu*ntests*nbytes/(gt2*1.d6) + write(psb_out_unit,'("MBYTES/S sust. effective bandwidth (GPU) : ",F20.3)') bdwdth + bdwdth = psb_cuda_MemoryPeakBandwidth() + write(psb_out_unit,'("MBYTES/S peak bandwidth (GPU) : ",F20.3)') bdwdth + write(psb_out_unit,'("Storage type for DESC_A: ",a)') desc_a%indxmap%get_fmt() + write(psb_out_unit,'("Total memory occupation for DESC_A: ",i12)')descsize + + end if +#endif + +#ifdef OPENACC + call psb_oacc_exit() +#endif +#ifdef CUDA + call psb_cuda_exit() +#endif + call psb_exit(ctxt) + stop + +9999 continue + call psb_error(ctxt) + +contains + ! + ! get iteration parameters from standard input + ! + subroutine get_parms(ctxt,acfmt,agfmt,idim,tnd) + type(psb_ctxt_type) :: ctxt + character(len=*) :: agfmt, acfmt + integer :: idim + logical :: tnd + integer :: np, iam + integer :: intbuf(10), ip + + call psb_info(ctxt, iam, np) + + if (iam == 0) then + write(*,*) 'CPU side format?' + read(psb_inp_unit,*) acfmt + write(*,*) 'OACC side format?' + read(psb_inp_unit,*) agfmt + write(*,*) 'Size of discretization cube?' + read(psb_inp_unit,*) idim + write(*,*) 'Try comm/comp overlap?' + read(psb_inp_unit,*) tnd + endif + call psb_bcast(ctxt,acfmt) + call psb_bcast(ctxt,agfmt) + call psb_bcast(ctxt,idim) + call psb_bcast(ctxt,tnd) + + if (iam == 0) then + write(psb_out_unit,'("Testing matrix : ell1")') + write(psb_out_unit,'("Grid dimensions : ",i4,"x",i4,"x",i4)')idim,idim,idim + write(psb_out_unit,'("Number of processors : ",i0)')np + write(psb_out_unit,'("Data distribution : BLOCK")') + write(psb_out_unit,'(" ")') + write(psb_out_unit,'("Storage formats ",a)') acfmt,' ',agfmt + write(psb_out_unit,'("Testing overlap ND ",l8)') tnd + end if + return + + end subroutine get_parms + +end program pdgenmv From 8f6000f940d1b42d0a32545630e553009e577890 Mon Sep 17 00:00:00 2001 From: sfilippone Date: Mon, 20 Oct 2025 16:37:47 +0200 Subject: [PATCH 34/37] Fix OpenACC files --- openacc/psb_c_oacc_csr_mat_mod.F90 | 48 ++++++++++++++++------ openacc/psb_c_oacc_ell_mat_mod.F90 | 66 ++++++++++++++++++++++-------- openacc/psb_c_oacc_hll_mat_mod.F90 | 2 +- openacc/psb_c_oacc_vect_mod.F90 | 8 ++-- openacc/psb_d_oacc_csr_mat_mod.F90 | 48 ++++++++++++++++------ openacc/psb_d_oacc_ell_mat_mod.F90 | 64 +++++++++++++++++++++-------- openacc/psb_d_oacc_vect_mod.F90 | 4 +- openacc/psb_i_oacc_vect_mod.F90 | 1 + openacc/psb_l_oacc_vect_mod.F90 | 1 + openacc/psb_s_oacc_csr_mat_mod.F90 | 48 ++++++++++++++++------ openacc/psb_s_oacc_ell_mat_mod.F90 | 66 ++++++++++++++++++++++-------- openacc/psb_s_oacc_hll_mat_mod.F90 | 2 +- openacc/psb_s_oacc_vect_mod.F90 | 4 +- openacc/psb_z_oacc_csr_mat_mod.F90 | 48 ++++++++++++++++------ openacc/psb_z_oacc_ell_mat_mod.F90 | 66 ++++++++++++++++++++++-------- openacc/psb_z_oacc_hll_mat_mod.F90 | 2 +- openacc/psb_z_oacc_vect_mod.F90 | 8 ++-- 17 files changed, 360 insertions(+), 126 deletions(-) diff --git a/openacc/psb_c_oacc_csr_mat_mod.F90 b/openacc/psb_c_oacc_csr_mat_mod.F90 index c6461fe3..f138e4c9 100644 --- a/openacc/psb_c_oacc_csr_mat_mod.F90 +++ b/openacc/psb_c_oacc_csr_mat_mod.F90 @@ -144,9 +144,15 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_delete_finalize(a%val) - if (psb_size(a%ja)>0) call acc_delete_finalize(a%ja) - if (psb_size(a%irp)>0) call acc_delete_finalize(a%irp) + if (psb_size(a%val)>0) then + !$acc exit data delete(a%val) finalize + end if + if (psb_size(a%ja)>0) then + !$acc exit data delete(a%ja) finalize + end if + if (psb_size(a%irp)>0) then + !$acc exit data delete(a%irp) finalize + end if return end subroutine c_oacc_csr_free_dev_space @@ -257,9 +263,15 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_copyin(a%val) - if (psb_size(a%ja)>0) call acc_copyin(a%ja) - if (psb_size(a%irp)>0) call acc_copyin(a%irp) + if (psb_size(a%val)>0) then + !$acc enter data copyin(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc enter data copyin(a%ja) + end if + if (psb_size(a%irp)>0) then + !$acc enter data copyin(a%irp) + end if end subroutine c_oacc_csr_sync_dev_space subroutine c_oacc_csr_sync(a) @@ -275,13 +287,25 @@ contains ! will fail ! if (a%is_dev()) then - if (psb_size(a%val)>0) call acc_update_self(a%val) - if (psb_size(a%ja)>0) call acc_update_self(a%ja) - if (psb_size(a%irp)>0) call acc_update_self(a%irp) + if (psb_size(a%val)>0) then + !$acc update self(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update self(a%ja) + end if + if (psb_size(a%irp)>0) then + !$acc update self(a%irp) + end if else if (a%is_host()) then - if (psb_size(a%val)>0) call acc_update_device(a%val) - if (psb_size(a%ja)>0) call acc_update_device(a%ja) - if (psb_size(a%irp)>0) call acc_update_device(a%irp) + if (psb_size(a%val)>0) then + !$acc update device(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update device(a%ja) + end if + if (psb_size(a%irp)>0) then + !$acc update device(a%irp) + end if end if call tmpa%set_sync() end subroutine c_oacc_csr_sync diff --git a/openacc/psb_c_oacc_ell_mat_mod.F90 b/openacc/psb_c_oacc_ell_mat_mod.F90 index b2168646..30438011 100644 --- a/openacc/psb_c_oacc_ell_mat_mod.F90 +++ b/openacc/psb_c_oacc_ell_mat_mod.F90 @@ -143,10 +143,18 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_delete_finalize(a%val) - if (psb_size(a%ja)>0) call acc_delete_finalize(a%ja) - if (psb_size(a%irn)>0) call acc_delete_finalize(a%irn) - if (psb_size(a%idiag)>0) call acc_delete_finalize(a%idiag) + if (psb_size(a%val)>0) then + !$acc exit data delete(a%val) finalize + end if + if (psb_size(a%ja)>0) then + !$acc exit data delete(a%ja) finalize + end if + if (psb_size(a%irn)>0) then + !$acc exit data delete(a%irn) finalize + end if + if (psb_size(a%idiag)>0) then + !$acc exit data delete(a%idiag) finalize + end if return end subroutine c_oacc_ell_free_dev_space @@ -170,7 +178,7 @@ contains if (a%is_dev()) call a%sync() res = 8 - res = res + psb_sizeof_dp * size(a%val) + res = res + (2*psb_sizeof_sp) * size(a%val) res = res + psb_sizeof_ip * size(a%ja) res = res + psb_sizeof_ip * size(a%irn) res = res + psb_sizeof_ip * size(a%idiag) @@ -186,10 +194,18 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_copyin(a%val) - if (psb_size(a%ja)>0) call acc_copyin(a%ja) - if (psb_size(a%irn)>0) call acc_copyin(a%irn) - if (psb_size(a%idiag)>0) call acc_copyin(a%idiag) + if (psb_size(a%val)>0) then + !$acc enter data copyin(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc enter data copyin(a%ja) + end if + if (psb_size(a%irn)>0) then + !$acc enter data copyin(a%irn) + end if + if (psb_size(a%idiag)>0) then + !$acc enter data copyin(a%idiag) + end if end subroutine c_oacc_ell_sync_dev_space function c_oacc_ell_is_host(a) result(res) @@ -256,15 +272,31 @@ contains ! will fail ! if (a%is_dev()) then - if (psb_size(a%val)>0) call acc_update_self(a%val) - if (psb_size(a%ja)>0) call acc_update_self(a%ja) - if (psb_size(a%irn)>0) call acc_update_self(a%irn) - if (psb_size(a%idiag)>0) call acc_update_self(a%idiag) + if (psb_size(a%val)>0) then + !$acc update self(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update self(a%ja) + end if + if (psb_size(a%irn)>0) then + !$acc update self(a%irn) + end if + if (psb_size(a%idiag)>0) then + !$acc update self(a%idiag) + end if else if (a%is_host()) then - if (psb_size(a%val)>0) call acc_update_device(a%val) - if (psb_size(a%ja)>0) call acc_update_device(a%ja) - if (psb_size(a%irn)>0) call acc_update_device(a%irn) - if (psb_size(a%idiag)>0) call acc_update_device(a%idiag) + if (psb_size(a%val)>0) then + !$acc update device(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update device(a%ja) + end if + if (psb_size(a%irn)>0) then + !$acc update device(a%irn) + end if + if (psb_size(a%idiag)>0) then + !$acc update device(a%idiag) + end if end if call tmpa%set_sync() end subroutine c_oacc_ell_sync diff --git a/openacc/psb_c_oacc_hll_mat_mod.F90 b/openacc/psb_c_oacc_hll_mat_mod.F90 index f8c19275..5c9d9721 100644 --- a/openacc/psb_c_oacc_hll_mat_mod.F90 +++ b/openacc/psb_c_oacc_hll_mat_mod.F90 @@ -171,7 +171,7 @@ contains if (a%is_dev()) call a%sync() res = 8 - res = res + psb_sizeof_dp * size(a%val) + res = res + (2*psb_sizeof_sp) * size(a%val) res = res + psb_sizeof_ip * size(a%ja) res = res + psb_sizeof_ip * size(a%irn) res = res + psb_sizeof_ip * size(a%idiag) diff --git a/openacc/psb_c_oacc_vect_mod.F90 b/openacc/psb_c_oacc_vect_mod.F90 index 2aa11db9..18b900bb 100644 --- a/openacc/psb_c_oacc_vect_mod.F90 +++ b/openacc/psb_c_oacc_vect_mod.F90 @@ -829,9 +829,10 @@ contains complex(psb_spk_) :: res integer(psb_ipk_) :: i + res = czero !$acc parallel loop reduction(+:res) present(x, y) do i = 1, n - res = res + x(i) * y(i) + res = res + conjg(x(i)) * y(i) end do !$acc end parallel loop end function c_inner_oacc_dot @@ -843,10 +844,10 @@ contains complex(psb_spk_), intent(in) :: y(:) integer(psb_ipk_), intent(in) :: n complex(psb_spk_) :: res - complex(psb_spk_), external :: cdot + complex(psb_spk_), external :: cdotc if (x%is_dev()) call x%sync() - res = cdot(n, y, 1, x%v, 1) + res = cdotc(n, y, 1, x%v, 1) end function c_oacc_dot_a @@ -943,6 +944,7 @@ contains class(psb_c_vect_oacc), intent(out) :: x integer(psb_ipk_), intent(out) :: info + call x%free(info) call psb_realloc(n, x%v, info) if (info /= 0) then info = psb_err_alloc_request_ diff --git a/openacc/psb_d_oacc_csr_mat_mod.F90 b/openacc/psb_d_oacc_csr_mat_mod.F90 index 21907312..0c689f39 100644 --- a/openacc/psb_d_oacc_csr_mat_mod.F90 +++ b/openacc/psb_d_oacc_csr_mat_mod.F90 @@ -144,9 +144,15 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_delete_finalize(a%val) - if (psb_size(a%ja)>0) call acc_delete_finalize(a%ja) - if (psb_size(a%irp)>0) call acc_delete_finalize(a%irp) + if (psb_size(a%val)>0) then + !$acc exit data delete(a%val) finalize + end if + if (psb_size(a%ja)>0) then + !$acc exit data delete(a%ja) finalize + end if + if (psb_size(a%irp)>0) then + !$acc exit data delete(a%irp) finalize + end if return end subroutine d_oacc_csr_free_dev_space @@ -257,9 +263,15 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_copyin(a%val) - if (psb_size(a%ja)>0) call acc_copyin(a%ja) - if (psb_size(a%irp)>0) call acc_copyin(a%irp) + if (psb_size(a%val)>0) then + !$acc enter data copyin(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc enter data copyin(a%ja) + end if + if (psb_size(a%irp)>0) then + !$acc enter data copyin(a%irp) + end if end subroutine d_oacc_csr_sync_dev_space subroutine d_oacc_csr_sync(a) @@ -275,13 +287,25 @@ contains ! will fail ! if (a%is_dev()) then - if (psb_size(a%val)>0) call acc_update_self(a%val) - if (psb_size(a%ja)>0) call acc_update_self(a%ja) - if (psb_size(a%irp)>0) call acc_update_self(a%irp) + if (psb_size(a%val)>0) then + !$acc update self(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update self(a%ja) + end if + if (psb_size(a%irp)>0) then + !$acc update self(a%irp) + end if else if (a%is_host()) then - if (psb_size(a%val)>0) call acc_update_device(a%val) - if (psb_size(a%ja)>0) call acc_update_device(a%ja) - if (psb_size(a%irp)>0) call acc_update_device(a%irp) + if (psb_size(a%val)>0) then + !$acc update device(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update device(a%ja) + end if + if (psb_size(a%irp)>0) then + !$acc update device(a%irp) + end if end if call tmpa%set_sync() end subroutine d_oacc_csr_sync diff --git a/openacc/psb_d_oacc_ell_mat_mod.F90 b/openacc/psb_d_oacc_ell_mat_mod.F90 index 021face3..07ae88ae 100644 --- a/openacc/psb_d_oacc_ell_mat_mod.F90 +++ b/openacc/psb_d_oacc_ell_mat_mod.F90 @@ -143,10 +143,18 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_delete_finalize(a%val) - if (psb_size(a%ja)>0) call acc_delete_finalize(a%ja) - if (psb_size(a%irn)>0) call acc_delete_finalize(a%irn) - if (psb_size(a%idiag)>0) call acc_delete_finalize(a%idiag) + if (psb_size(a%val)>0) then + !$acc exit data delete(a%val) finalize + end if + if (psb_size(a%ja)>0) then + !$acc exit data delete(a%ja) finalize + end if + if (psb_size(a%irn)>0) then + !$acc exit data delete(a%irn) finalize + end if + if (psb_size(a%idiag)>0) then + !$acc exit data delete(a%idiag) finalize + end if return end subroutine d_oacc_ell_free_dev_space @@ -186,10 +194,18 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_copyin(a%val) - if (psb_size(a%ja)>0) call acc_copyin(a%ja) - if (psb_size(a%irn)>0) call acc_copyin(a%irn) - if (psb_size(a%idiag)>0) call acc_copyin(a%idiag) + if (psb_size(a%val)>0) then + !$acc enter data copyin(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc enter data copyin(a%ja) + end if + if (psb_size(a%irn)>0) then + !$acc enter data copyin(a%irn) + end if + if (psb_size(a%idiag)>0) then + !$acc enter data copyin(a%idiag) + end if end subroutine d_oacc_ell_sync_dev_space function d_oacc_ell_is_host(a) result(res) @@ -256,15 +272,31 @@ contains ! will fail ! if (a%is_dev()) then - if (psb_size(a%val)>0) call acc_update_self(a%val) - if (psb_size(a%ja)>0) call acc_update_self(a%ja) - if (psb_size(a%irn)>0) call acc_update_self(a%irn) - if (psb_size(a%idiag)>0) call acc_update_self(a%idiag) + if (psb_size(a%val)>0) then + !$acc update self(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update self(a%ja) + end if + if (psb_size(a%irn)>0) then + !$acc update self(a%irn) + end if + if (psb_size(a%idiag)>0) then + !$acc update self(a%idiag) + end if else if (a%is_host()) then - if (psb_size(a%val)>0) call acc_update_device(a%val) - if (psb_size(a%ja)>0) call acc_update_device(a%ja) - if (psb_size(a%irn)>0) call acc_update_device(a%irn) - if (psb_size(a%idiag)>0) call acc_update_device(a%idiag) + if (psb_size(a%val)>0) then + !$acc update device(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update device(a%ja) + end if + if (psb_size(a%irn)>0) then + !$acc update device(a%irn) + end if + if (psb_size(a%idiag)>0) then + !$acc update device(a%idiag) + end if end if call tmpa%set_sync() end subroutine d_oacc_ell_sync diff --git a/openacc/psb_d_oacc_vect_mod.F90 b/openacc/psb_d_oacc_vect_mod.F90 index 1e3f07d7..830b2216 100644 --- a/openacc/psb_d_oacc_vect_mod.F90 +++ b/openacc/psb_d_oacc_vect_mod.F90 @@ -829,9 +829,10 @@ contains real(psb_dpk_) :: res integer(psb_ipk_) :: i + res = dzero !$acc parallel loop reduction(+:res) present(x, y) do i = 1, n - res = res + x(i) * y(i) + res = res + (x(i)) * y(i) end do !$acc end parallel loop end function d_inner_oacc_dot @@ -943,6 +944,7 @@ contains class(psb_d_vect_oacc), intent(out) :: x integer(psb_ipk_), intent(out) :: info + call x%free(info) call psb_realloc(n, x%v, info) if (info /= 0) then info = psb_err_alloc_request_ diff --git a/openacc/psb_i_oacc_vect_mod.F90 b/openacc/psb_i_oacc_vect_mod.F90 index 344ad931..4494ba70 100644 --- a/openacc/psb_i_oacc_vect_mod.F90 +++ b/openacc/psb_i_oacc_vect_mod.F90 @@ -547,6 +547,7 @@ contains class(psb_i_vect_oacc), intent(out) :: x integer(psb_ipk_), intent(out) :: info + call x%free(info) call psb_realloc(n, x%v, info) if (info /= 0) then info = psb_err_alloc_request_ diff --git a/openacc/psb_l_oacc_vect_mod.F90 b/openacc/psb_l_oacc_vect_mod.F90 index 85b561a9..aeb1051c 100644 --- a/openacc/psb_l_oacc_vect_mod.F90 +++ b/openacc/psb_l_oacc_vect_mod.F90 @@ -549,6 +549,7 @@ contains class(psb_l_vect_oacc), intent(out) :: x integer(psb_ipk_), intent(out) :: info + call x%free(info) call psb_realloc(n, x%v, info) if (info /= 0) then info = psb_err_alloc_request_ diff --git a/openacc/psb_s_oacc_csr_mat_mod.F90 b/openacc/psb_s_oacc_csr_mat_mod.F90 index d66dca3b..ce721a77 100644 --- a/openacc/psb_s_oacc_csr_mat_mod.F90 +++ b/openacc/psb_s_oacc_csr_mat_mod.F90 @@ -144,9 +144,15 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_delete_finalize(a%val) - if (psb_size(a%ja)>0) call acc_delete_finalize(a%ja) - if (psb_size(a%irp)>0) call acc_delete_finalize(a%irp) + if (psb_size(a%val)>0) then + !$acc exit data delete(a%val) finalize + end if + if (psb_size(a%ja)>0) then + !$acc exit data delete(a%ja) finalize + end if + if (psb_size(a%irp)>0) then + !$acc exit data delete(a%irp) finalize + end if return end subroutine s_oacc_csr_free_dev_space @@ -257,9 +263,15 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_copyin(a%val) - if (psb_size(a%ja)>0) call acc_copyin(a%ja) - if (psb_size(a%irp)>0) call acc_copyin(a%irp) + if (psb_size(a%val)>0) then + !$acc enter data copyin(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc enter data copyin(a%ja) + end if + if (psb_size(a%irp)>0) then + !$acc enter data copyin(a%irp) + end if end subroutine s_oacc_csr_sync_dev_space subroutine s_oacc_csr_sync(a) @@ -275,13 +287,25 @@ contains ! will fail ! if (a%is_dev()) then - if (psb_size(a%val)>0) call acc_update_self(a%val) - if (psb_size(a%ja)>0) call acc_update_self(a%ja) - if (psb_size(a%irp)>0) call acc_update_self(a%irp) + if (psb_size(a%val)>0) then + !$acc update self(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update self(a%ja) + end if + if (psb_size(a%irp)>0) then + !$acc update self(a%irp) + end if else if (a%is_host()) then - if (psb_size(a%val)>0) call acc_update_device(a%val) - if (psb_size(a%ja)>0) call acc_update_device(a%ja) - if (psb_size(a%irp)>0) call acc_update_device(a%irp) + if (psb_size(a%val)>0) then + !$acc update device(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update device(a%ja) + end if + if (psb_size(a%irp)>0) then + !$acc update device(a%irp) + end if end if call tmpa%set_sync() end subroutine s_oacc_csr_sync diff --git a/openacc/psb_s_oacc_ell_mat_mod.F90 b/openacc/psb_s_oacc_ell_mat_mod.F90 index 600a08a7..c31f2bb9 100644 --- a/openacc/psb_s_oacc_ell_mat_mod.F90 +++ b/openacc/psb_s_oacc_ell_mat_mod.F90 @@ -143,10 +143,18 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_delete_finalize(a%val) - if (psb_size(a%ja)>0) call acc_delete_finalize(a%ja) - if (psb_size(a%irn)>0) call acc_delete_finalize(a%irn) - if (psb_size(a%idiag)>0) call acc_delete_finalize(a%idiag) + if (psb_size(a%val)>0) then + !$acc exit data delete(a%val) finalize + end if + if (psb_size(a%ja)>0) then + !$acc exit data delete(a%ja) finalize + end if + if (psb_size(a%irn)>0) then + !$acc exit data delete(a%irn) finalize + end if + if (psb_size(a%idiag)>0) then + !$acc exit data delete(a%idiag) finalize + end if return end subroutine s_oacc_ell_free_dev_space @@ -170,7 +178,7 @@ contains if (a%is_dev()) call a%sync() res = 8 - res = res + psb_sizeof_dp * size(a%val) + res = res + psb_sizeof_sp * size(a%val) res = res + psb_sizeof_ip * size(a%ja) res = res + psb_sizeof_ip * size(a%irn) res = res + psb_sizeof_ip * size(a%idiag) @@ -186,10 +194,18 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_copyin(a%val) - if (psb_size(a%ja)>0) call acc_copyin(a%ja) - if (psb_size(a%irn)>0) call acc_copyin(a%irn) - if (psb_size(a%idiag)>0) call acc_copyin(a%idiag) + if (psb_size(a%val)>0) then + !$acc enter data copyin(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc enter data copyin(a%ja) + end if + if (psb_size(a%irn)>0) then + !$acc enter data copyin(a%irn) + end if + if (psb_size(a%idiag)>0) then + !$acc enter data copyin(a%idiag) + end if end subroutine s_oacc_ell_sync_dev_space function s_oacc_ell_is_host(a) result(res) @@ -256,15 +272,31 @@ contains ! will fail ! if (a%is_dev()) then - if (psb_size(a%val)>0) call acc_update_self(a%val) - if (psb_size(a%ja)>0) call acc_update_self(a%ja) - if (psb_size(a%irn)>0) call acc_update_self(a%irn) - if (psb_size(a%idiag)>0) call acc_update_self(a%idiag) + if (psb_size(a%val)>0) then + !$acc update self(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update self(a%ja) + end if + if (psb_size(a%irn)>0) then + !$acc update self(a%irn) + end if + if (psb_size(a%idiag)>0) then + !$acc update self(a%idiag) + end if else if (a%is_host()) then - if (psb_size(a%val)>0) call acc_update_device(a%val) - if (psb_size(a%ja)>0) call acc_update_device(a%ja) - if (psb_size(a%irn)>0) call acc_update_device(a%irn) - if (psb_size(a%idiag)>0) call acc_update_device(a%idiag) + if (psb_size(a%val)>0) then + !$acc update device(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update device(a%ja) + end if + if (psb_size(a%irn)>0) then + !$acc update device(a%irn) + end if + if (psb_size(a%idiag)>0) then + !$acc update device(a%idiag) + end if end if call tmpa%set_sync() end subroutine s_oacc_ell_sync diff --git a/openacc/psb_s_oacc_hll_mat_mod.F90 b/openacc/psb_s_oacc_hll_mat_mod.F90 index 33033248..3c3f52de 100644 --- a/openacc/psb_s_oacc_hll_mat_mod.F90 +++ b/openacc/psb_s_oacc_hll_mat_mod.F90 @@ -171,7 +171,7 @@ contains if (a%is_dev()) call a%sync() res = 8 - res = res + psb_sizeof_dp * size(a%val) + res = res + psb_sizeof_sp * size(a%val) res = res + psb_sizeof_ip * size(a%ja) res = res + psb_sizeof_ip * size(a%irn) res = res + psb_sizeof_ip * size(a%idiag) diff --git a/openacc/psb_s_oacc_vect_mod.F90 b/openacc/psb_s_oacc_vect_mod.F90 index b8d9700d..e7edb998 100644 --- a/openacc/psb_s_oacc_vect_mod.F90 +++ b/openacc/psb_s_oacc_vect_mod.F90 @@ -829,9 +829,10 @@ contains real(psb_spk_) :: res integer(psb_ipk_) :: i + res = szero !$acc parallel loop reduction(+:res) present(x, y) do i = 1, n - res = res + x(i) * y(i) + res = res + (x(i)) * y(i) end do !$acc end parallel loop end function s_inner_oacc_dot @@ -943,6 +944,7 @@ contains class(psb_s_vect_oacc), intent(out) :: x integer(psb_ipk_), intent(out) :: info + call x%free(info) call psb_realloc(n, x%v, info) if (info /= 0) then info = psb_err_alloc_request_ diff --git a/openacc/psb_z_oacc_csr_mat_mod.F90 b/openacc/psb_z_oacc_csr_mat_mod.F90 index 3b66787a..2fef14a6 100644 --- a/openacc/psb_z_oacc_csr_mat_mod.F90 +++ b/openacc/psb_z_oacc_csr_mat_mod.F90 @@ -144,9 +144,15 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_delete_finalize(a%val) - if (psb_size(a%ja)>0) call acc_delete_finalize(a%ja) - if (psb_size(a%irp)>0) call acc_delete_finalize(a%irp) + if (psb_size(a%val)>0) then + !$acc exit data delete(a%val) finalize + end if + if (psb_size(a%ja)>0) then + !$acc exit data delete(a%ja) finalize + end if + if (psb_size(a%irp)>0) then + !$acc exit data delete(a%irp) finalize + end if return end subroutine z_oacc_csr_free_dev_space @@ -257,9 +263,15 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_copyin(a%val) - if (psb_size(a%ja)>0) call acc_copyin(a%ja) - if (psb_size(a%irp)>0) call acc_copyin(a%irp) + if (psb_size(a%val)>0) then + !$acc enter data copyin(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc enter data copyin(a%ja) + end if + if (psb_size(a%irp)>0) then + !$acc enter data copyin(a%irp) + end if end subroutine z_oacc_csr_sync_dev_space subroutine z_oacc_csr_sync(a) @@ -275,13 +287,25 @@ contains ! will fail ! if (a%is_dev()) then - if (psb_size(a%val)>0) call acc_update_self(a%val) - if (psb_size(a%ja)>0) call acc_update_self(a%ja) - if (psb_size(a%irp)>0) call acc_update_self(a%irp) + if (psb_size(a%val)>0) then + !$acc update self(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update self(a%ja) + end if + if (psb_size(a%irp)>0) then + !$acc update self(a%irp) + end if else if (a%is_host()) then - if (psb_size(a%val)>0) call acc_update_device(a%val) - if (psb_size(a%ja)>0) call acc_update_device(a%ja) - if (psb_size(a%irp)>0) call acc_update_device(a%irp) + if (psb_size(a%val)>0) then + !$acc update device(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update device(a%ja) + end if + if (psb_size(a%irp)>0) then + !$acc update device(a%irp) + end if end if call tmpa%set_sync() end subroutine z_oacc_csr_sync diff --git a/openacc/psb_z_oacc_ell_mat_mod.F90 b/openacc/psb_z_oacc_ell_mat_mod.F90 index abfb11e3..a79bebf5 100644 --- a/openacc/psb_z_oacc_ell_mat_mod.F90 +++ b/openacc/psb_z_oacc_ell_mat_mod.F90 @@ -143,10 +143,18 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_delete_finalize(a%val) - if (psb_size(a%ja)>0) call acc_delete_finalize(a%ja) - if (psb_size(a%irn)>0) call acc_delete_finalize(a%irn) - if (psb_size(a%idiag)>0) call acc_delete_finalize(a%idiag) + if (psb_size(a%val)>0) then + !$acc exit data delete(a%val) finalize + end if + if (psb_size(a%ja)>0) then + !$acc exit data delete(a%ja) finalize + end if + if (psb_size(a%irn)>0) then + !$acc exit data delete(a%irn) finalize + end if + if (psb_size(a%idiag)>0) then + !$acc exit data delete(a%idiag) finalize + end if return end subroutine z_oacc_ell_free_dev_space @@ -170,7 +178,7 @@ contains if (a%is_dev()) call a%sync() res = 8 - res = res + psb_sizeof_dp * size(a%val) + res = res + (2*psb_sizeof_dp) * size(a%val) res = res + psb_sizeof_ip * size(a%ja) res = res + psb_sizeof_ip * size(a%irn) res = res + psb_sizeof_ip * size(a%idiag) @@ -186,10 +194,18 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_copyin(a%val) - if (psb_size(a%ja)>0) call acc_copyin(a%ja) - if (psb_size(a%irn)>0) call acc_copyin(a%irn) - if (psb_size(a%idiag)>0) call acc_copyin(a%idiag) + if (psb_size(a%val)>0) then + !$acc enter data copyin(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc enter data copyin(a%ja) + end if + if (psb_size(a%irn)>0) then + !$acc enter data copyin(a%irn) + end if + if (psb_size(a%idiag)>0) then + !$acc enter data copyin(a%idiag) + end if end subroutine z_oacc_ell_sync_dev_space function z_oacc_ell_is_host(a) result(res) @@ -256,15 +272,31 @@ contains ! will fail ! if (a%is_dev()) then - if (psb_size(a%val)>0) call acc_update_self(a%val) - if (psb_size(a%ja)>0) call acc_update_self(a%ja) - if (psb_size(a%irn)>0) call acc_update_self(a%irn) - if (psb_size(a%idiag)>0) call acc_update_self(a%idiag) + if (psb_size(a%val)>0) then + !$acc update self(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update self(a%ja) + end if + if (psb_size(a%irn)>0) then + !$acc update self(a%irn) + end if + if (psb_size(a%idiag)>0) then + !$acc update self(a%idiag) + end if else if (a%is_host()) then - if (psb_size(a%val)>0) call acc_update_device(a%val) - if (psb_size(a%ja)>0) call acc_update_device(a%ja) - if (psb_size(a%irn)>0) call acc_update_device(a%irn) - if (psb_size(a%idiag)>0) call acc_update_device(a%idiag) + if (psb_size(a%val)>0) then + !$acc update device(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update device(a%ja) + end if + if (psb_size(a%irn)>0) then + !$acc update device(a%irn) + end if + if (psb_size(a%idiag)>0) then + !$acc update device(a%idiag) + end if end if call tmpa%set_sync() end subroutine z_oacc_ell_sync diff --git a/openacc/psb_z_oacc_hll_mat_mod.F90 b/openacc/psb_z_oacc_hll_mat_mod.F90 index 4c9f1b11..2cce6e2d 100644 --- a/openacc/psb_z_oacc_hll_mat_mod.F90 +++ b/openacc/psb_z_oacc_hll_mat_mod.F90 @@ -171,7 +171,7 @@ contains if (a%is_dev()) call a%sync() res = 8 - res = res + psb_sizeof_dp * size(a%val) + res = res + (2*psb_sizeof_dp) * size(a%val) res = res + psb_sizeof_ip * size(a%ja) res = res + psb_sizeof_ip * size(a%irn) res = res + psb_sizeof_ip * size(a%idiag) diff --git a/openacc/psb_z_oacc_vect_mod.F90 b/openacc/psb_z_oacc_vect_mod.F90 index a119303d..88ba484b 100644 --- a/openacc/psb_z_oacc_vect_mod.F90 +++ b/openacc/psb_z_oacc_vect_mod.F90 @@ -829,9 +829,10 @@ contains complex(psb_dpk_) :: res integer(psb_ipk_) :: i + res = zzero !$acc parallel loop reduction(+:res) present(x, y) do i = 1, n - res = res + x(i) * y(i) + res = res + conjg(x(i)) * y(i) end do !$acc end parallel loop end function z_inner_oacc_dot @@ -843,10 +844,10 @@ contains complex(psb_dpk_), intent(in) :: y(:) integer(psb_ipk_), intent(in) :: n complex(psb_dpk_) :: res - complex(psb_dpk_), external :: zdot + complex(psb_dpk_), external :: zdotc if (x%is_dev()) call x%sync() - res = zdot(n, y, 1, x%v, 1) + res = zdotc(n, y, 1, x%v, 1) end function z_oacc_dot_a @@ -943,6 +944,7 @@ contains class(psb_z_vect_oacc), intent(out) :: x integer(psb_ipk_), intent(out) :: info + call x%free(info) call psb_realloc(n, x%v, info) if (info /= 0) then info = psb_err_alloc_request_ From 388b679d8aed5056360cd79d432c6bf6b76b3341 Mon Sep 17 00:00:00 2001 From: sfilippone Date: Tue, 28 Oct 2025 11:31:00 +0100 Subject: [PATCH 35/37] Fixed OpenACC test program mixed with CUDA --- test/openacc/Makefile | 26 +- test/openacc/dpdegenmv.F90 | 631 +++---------------- test/openacc/dpmix.F90 | 1216 ------------------------------------ 3 files changed, 88 insertions(+), 1785 deletions(-) delete mode 100644 test/openacc/dpmix.F90 diff --git a/test/openacc/Makefile b/test/openacc/Makefile index 85d72330..891789f4 100644 --- a/test/openacc/Makefile +++ b/test/openacc/Makefile @@ -12,9 +12,9 @@ EXEDIR=./runs PSBLAS_LIB= -L$(LIBDIR) -L$(PSBLIBDIR) -lpsb_openacc -lpsb_ext -lpsb_util -lpsb_linsolve -lpsb_prec -lpsb_base LDLIBS=$(PSBGPULDLIBS) -FINCLUDES=$(FMFLAG)$(MODDIR) $(FMFLAG)$(INCDIR) $(FMFLAG). $(FMFLAG)$(PSBMODDIR) $(FMFLAG)$(PSBINCDIR) $(LIBRSB_DEFINES) +FINCLUDES= $(FMFLAG). $(FMFLAG)$(MODDIR) $(FMFLAG)$(INCDIR) $(FMFLAG)$(PSBMODDIR) $(FMFLAG)$(PSBINCDIR) $(LIBRSB_DEFINES) -FFLAGS=-O3 -march=native $(FCOPENACC) -DOPENACC -DCUDA +FFLAGS=-O3 -march=native $(FCOPENACC) -DPSB_OPENACC -DPSB_HAVE_CUDA CFLAGS=-O3 -march=native VTC=vectoacc.o @@ -22,9 +22,8 @@ DVT=datavect.o CSRC=timers.c OBJS=$(SRCS:.F90=.o) $(CSRC:.c=.o) -OADIR=oaobjs -all: dir psb_d_oacc_pde3d dpdegenmv +all: dir dpdegenmv #$(OBJS) # $(FC) $(FFLAGS) $(OBJS) -o datavect $(FINCLUDES) $(PSBLAS_LIB) $(LDLIBS) @@ -43,25 +42,12 @@ dir: %.o: %.c $(CC) $(CFLAGS) $(FINCLUDES) -c $< -o $@ -cpyoa: - @if test ! -d $(OADIR); then mkdir $(OADIR); fi - /bin/cp $(TOPDIR)/openacc/*.o $(OADIR) - /bin/cp $(TOPDIR)/openacc/impl/*.o $(OADIR) - -psb_d_oacc_pde3d: - mpifort -fallow-argument-mismatch -frecursive -g -O3 -frecursive -I../../modules/ -I. -DOPENACC -DHAVE_LAPACK -DHAVE_FLUSH_STMT -DLPK8 -DIPK4 -DMPI_MOD -c psb_d_oacc_pde3d.F90 -o psb_d_oacc_pde3d.o - $(FLINK) -fopenacc -DOPENACC psb_d_oacc_pde3d.o -o psb_d_oacc_pde3d $(PSBLAS_LIB) $(LDLIBS) - /bin/mv psb_d_oacc_pde3d $(EXEDIR) - -dpdegenmv: dpdegenmv.o cpyoa - $(FLINK) $(FCOPENACC) dpdegenmv.o -o dpdegenmv $(OADIR)/*.o $(PSBLAS_LIB) $(LDLIBS) +dpdegenmv.o: psb_d_pde3d_mod.o +dpdegenmv: dpdegenmv.o psb_d_pde3d_mod.o + $(FLINK) $(FCOPENACC) dpdegenmv.o psb_d_pde3d_mod.o -o dpdegenmv -fuse-ld=mold $(PSBLAS_LIB) $(LDLIBS) /bin/mv dpdegenmv $(EXEDIR) -dpmix: dpmix.o cpyoa - $(FLINK) $(FCOPENACC) dpmix.o -o dpmix $(OADIR)/*.o $(PSBLAS_LIB) $(LDLIBS) - /bin/mv dpmix $(EXEDIR) - clean: /bin/rm -fr *.o *.mod $(EXEDIR)/* diff --git a/test/openacc/dpdegenmv.F90 b/test/openacc/dpdegenmv.F90 index 3342c6dc..951e41e1 100644 --- a/test/openacc/dpdegenmv.F90 +++ b/test/openacc/dpdegenmv.F90 @@ -37,531 +37,17 @@ ! the main PSBLAS library. ! ! -module psb_d_pde3d_mod - - - use psb_base_mod, only : psb_dpk_, psb_ipk_, psb_lpk_, psb_desc_type,& - & psb_dspmat_type, psb_d_vect_type, dzero,& - & psb_d_base_sparse_mat, psb_d_base_vect_type, & - & psb_i_base_vect_type, psb_l_base_vect_type - - interface - function d_func_3d(x,y,z) result(val) - import :: psb_dpk_ - real(psb_dpk_), intent(in) :: x,y,z - real(psb_dpk_) :: val - end function d_func_3d - end interface - - interface psb_gen_pde3d - module procedure psb_d_gen_pde3d - end interface psb_gen_pde3d - -contains - - function d_null_func_3d(x,y,z) result(val) - - real(psb_dpk_), intent(in) :: x,y,z - real(psb_dpk_) :: val - - val = dzero - - end function d_null_func_3d - ! - ! functions parametrizing the differential equation - ! - - ! - ! Note: b1, b2 and b3 are the coefficients of the first - ! derivative of the unknown function. The default - ! we apply here is to have them zero, so that the resulting - ! matrix is symmetric/hermitian and suitable for - ! testing with CG and FCG. - ! When testing methods for non-hermitian matrices you can - ! change the B1/B2/B3 functions to e.g. done/sqrt((3*done)) - ! - function b1(x,y,z) - use psb_base_mod, only : psb_dpk_, done, dzero - implicit none - real(psb_dpk_) :: b1 - real(psb_dpk_), intent(in) :: x,y,z - b1=done/sqrt((3*done)) - end function b1 - function b2(x,y,z) - use psb_base_mod, only : psb_dpk_, done, dzero - implicit none - real(psb_dpk_) :: b2 - real(psb_dpk_), intent(in) :: x,y,z - b2=done/sqrt((3*done)) - end function b2 - function b3(x,y,z) - use psb_base_mod, only : psb_dpk_, done, dzero - implicit none - real(psb_dpk_) :: b3 - real(psb_dpk_), intent(in) :: x,y,z - b3=done/sqrt((3*done)) - end function b3 - function c(x,y,z) - use psb_base_mod, only : psb_dpk_, done, dzero - implicit none - real(psb_dpk_) :: c - real(psb_dpk_), intent(in) :: x,y,z - c=dzero - end function c - function a1(x,y,z) - use psb_base_mod, only : psb_dpk_, done, dzero - implicit none - real(psb_dpk_) :: a1 - real(psb_dpk_), intent(in) :: x,y,z - a1=done/80 - end function a1 - function a2(x,y,z) - use psb_base_mod, only : psb_dpk_, done, dzero - implicit none - real(psb_dpk_) :: a2 - real(psb_dpk_), intent(in) :: x,y,z - a2=done/80 - end function a2 - function a3(x,y,z) - use psb_base_mod, only : psb_dpk_, done, dzero - implicit none - real(psb_dpk_) :: a3 - real(psb_dpk_), intent(in) :: x,y,z - a3=done/80 - end function a3 - function g(x,y,z) - use psb_base_mod, only : psb_dpk_, done, dzero - implicit none - real(psb_dpk_) :: g - real(psb_dpk_), intent(in) :: x,y,z - g = dzero - if (x == done) then - g = done - else if (x == dzero) then - g = exp(y**2-z**2) - end if - end function g - - - ! - ! subroutine to allocate and fill in the coefficient matrix and - ! the rhs. - ! - subroutine psb_d_gen_pde3d(ctxt,idim,a,bv,xv,desc_a,afmt,info,& - & f,amold,vmold,imold,partition,nrl,iv,tnd) - use psb_base_mod - use psb_util_mod - ! - ! Discretizes the partial differential equation - ! - ! a1 dd(u) a2 dd(u) a3 dd(u) b1 d(u) b2 d(u) b3 d(u) - ! - ------ - ------ - ------ + ----- + ------ + ------ + c u = f - ! dxdx dydy dzdz dx dy dz - ! - ! with Dirichlet boundary conditions - ! u = g - ! - ! on the unit cube 0<=x,y,z<=1. - ! - ! - ! Note that if b1=b2=b3=c=0., the PDE is the Laplace equation. - ! - implicit none - integer(psb_ipk_) :: idim - type(psb_dspmat_type) :: a - type(psb_d_vect_type) :: xv,bv - type(psb_desc_type) :: desc_a - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: info - character(len=*) :: afmt - procedure(d_func_3d), optional :: f - class(psb_d_base_sparse_mat), optional :: amold - class(psb_d_base_vect_type), optional :: vmold - class(psb_i_base_vect_type), optional :: imold - integer(psb_ipk_), optional :: partition, nrl,iv(:) - logical, optional :: tnd - ! Local variables. - - integer(psb_ipk_), parameter :: nb=20 - type(psb_d_csc_sparse_mat) :: acsc - type(psb_d_coo_sparse_mat) :: acoo - type(psb_d_csr_sparse_mat) :: acsr - real(psb_dpk_) :: zt(nb),x,y,z - integer(psb_ipk_) :: nnz,nr,nlr,i,j,ii,ib,k, partition_ - integer(psb_lpk_) :: m,n,glob_row,nt - integer(psb_ipk_) :: ix,iy,iz,ia,indx_owner - ! For 3D partition - ! Note: integer control variables going directly into an MPI call - ! must be 4 bytes, i.e. psb_mpk_ - integer(psb_mpk_) :: npdims(3), npp, minfo - integer(psb_ipk_) :: npx,npy,npz, iamx,iamy,iamz,mynx,myny,mynz - integer(psb_ipk_), allocatable :: bndx(:),bndy(:),bndz(:) - ! Process grid - integer(psb_ipk_) :: np, iam - integer(psb_ipk_) :: icoeff - integer(psb_lpk_), allocatable :: irow(:),icol(:),myidx(:) - real(psb_dpk_), allocatable :: val(:) - ! deltah dimension of each grid cell - ! deltat discretization time - real(psb_dpk_) :: deltah, sqdeltah, deltah2 - real(psb_dpk_), parameter :: rhs=dzero,one=done,zero=dzero - real(psb_dpk_) :: t0, t1, t2, t3, tasb, talc, ttot, tgen, tcdasb - integer(psb_ipk_) :: err_act - procedure(d_func_3d), pointer :: f_ - logical :: tnd_ - character(len=20) :: name, ch_err,tmpfmt - - info = psb_success_ - name = 'create_matrix' - call psb_erractionsave(err_act) - - call psb_info(ctxt, iam, np) - - - if (present(f)) then - f_ => f - else - f_ => d_null_func_3d - end if - - deltah = done/(idim+2) - sqdeltah = deltah*deltah - deltah2 = (2*done)* deltah - - if (present(partition)) then - if ((1<= partition).and.(partition <= 3)) then - partition_ = partition - else - write(*,*) 'Invalid partition choice ',partition,' defaulting to 3' - partition_ = 3 - end if - else - partition_ = 3 - end if - - ! initialize array descriptor and sparse matrix storage. provide an - ! estimate of the number of non zeroes - - m = (1_psb_lpk_*idim)*idim*idim - n = m - nnz = ((n*7)/(np)) - if(iam == psb_root_) write(psb_out_unit,'("Generating Matrix (size=",i0,")...")')n - t0 = psb_wtime() - select case(partition_) - case(1) - ! A BLOCK partition - if (present(nrl)) then - nr = nrl - else - ! - ! Using a simple BLOCK distribution. - ! - nt = (m+np-1)/np - nr = max(0,min(nt,m-(iam*nt))) - end if - - nt = nr - call psb_sum(ctxt,nt) - if (nt /= m) then - write(psb_err_unit,*) iam, 'Initialization error ',nr,nt,m - info = -1 - call psb_barrier(ctxt) - call psb_abort(ctxt) - return - end if - - ! - ! First example of use of CDALL: specify for each process a number of - ! contiguous rows - ! - call psb_cdall(ctxt,desc_a,info,nl=nr) - myidx = desc_a%get_global_indices() - nlr = size(myidx) - - case(2) - ! A partition defined by the user through IV - - if (present(iv)) then - if (size(iv) /= m) then - write(psb_err_unit,*) iam, 'Initialization error: wrong IV size',size(iv),m - info = -1 - call psb_barrier(ctxt) - call psb_abort(ctxt) - return - end if - else - write(psb_err_unit,*) iam, 'Initialization error: IV not present' - info = -1 - call psb_barrier(ctxt) - call psb_abort(ctxt) - return - end if - - ! - ! Second example of use of CDALL: specify for each row the - ! process that owns it - ! - call psb_cdall(ctxt,desc_a,info,vg=iv) - myidx = desc_a%get_global_indices() - nlr = size(myidx) - - case(3) - ! A 3-dimensional partition - - ! A nifty MPI function will split the process list - npdims = 0 - call mpi_dims_create(np,3,npdims,info) - npx = npdims(1) - npy = npdims(2) - npz = npdims(3) - - allocate(bndx(0:npx),bndy(0:npy),bndz(0:npz)) - ! We can reuse idx2ijk for process indices as well. - call idx2ijk(iamx,iamy,iamz,iam,npx,npy,npz,base=0) - ! Now let's split the 3D cube in hexahedra - call dist1Didx(bndx,idim,npx) - mynx = bndx(iamx+1)-bndx(iamx) - call dist1Didx(bndy,idim,npy) - myny = bndy(iamy+1)-bndy(iamy) - call dist1Didx(bndz,idim,npz) - mynz = bndz(iamz+1)-bndz(iamz) - - ! How many indices do I own? - nlr = mynx*myny*mynz - allocate(myidx(nlr)) - ! Now, let's generate the list of indices I own - nr = 0 - do i=bndx(iamx),bndx(iamx+1)-1 - do j=bndy(iamy),bndy(iamy+1)-1 - do k=bndz(iamz),bndz(iamz+1)-1 - nr = nr + 1 - call ijk2idx(myidx(nr),i,j,k,idim,idim,idim) - end do - end do - end do - if (nr /= nlr) then - write(psb_err_unit,*) iam,iamx,iamy,iamz, 'Initialization error: NR vs NLR ',& - & nr,nlr,mynx,myny,mynz - info = -1 - call psb_barrier(ctxt) - call psb_abort(ctxt) - end if - - ! - ! Third example of use of CDALL: specify for each process - ! the set of global indices it owns. - ! - call psb_cdall(ctxt,desc_a,info,vl=myidx) - - case default - write(psb_err_unit,*) iam, 'Initialization error: should not get here' - info = -1 - call psb_barrier(ctxt) - call psb_abort(ctxt) - return - end select - - - if (info == psb_success_) call psb_spall(a,desc_a,info,nnz=nnz,& - & dupl=psb_dupl_err_) - ! define rhs from boundary conditions; also build initial guess - if (info == psb_success_) call psb_geall(xv,desc_a,info) - if (info == psb_success_) call psb_geall(bv,desc_a,info) - - call psb_barrier(ctxt) - talc = psb_wtime()-t0 - - if (info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='allocation rout.' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - - ! we build an auxiliary matrix consisting of one row at a - ! time; just a small matrix. might be extended to generate - ! a bunch of rows per call. - ! - allocate(val(20*nb),irow(20*nb),& - &icol(20*nb),stat=info) - if (info /= psb_success_ ) then - info=psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - endif - - - ! loop over rows belonging to current process in a block - ! distribution. - - call psb_barrier(ctxt) - t1 = psb_wtime() - do ii=1, nlr,nb - ib = min(nb,nlr-ii+1) - icoeff = 1 - do k=1,ib - i=ii+k-1 - ! local matrix pointer - glob_row=myidx(i) - ! compute gridpoint coordinates - call idx2ijk(ix,iy,iz,glob_row,idim,idim,idim) - ! x, y, z coordinates - x = (ix-1)*deltah - y = (iy-1)*deltah - z = (iz-1)*deltah - zt(k) = f_(x,y,z) - ! internal point: build discretization - ! - ! term depending on (x-1,y,z) - ! - val(icoeff) = -a1(x,y,z)/sqdeltah-b1(x,y,z)/deltah2 - if (ix == 1) then - zt(k) = g(dzero,y,z)*(-val(icoeff)) + zt(k) - else - call ijk2idx(icol(icoeff),ix-1,iy,iz,idim,idim,idim) - irow(icoeff) = glob_row - icoeff = icoeff+1 - endif - ! term depending on (x,y-1,z) - val(icoeff) = -a2(x,y,z)/sqdeltah-b2(x,y,z)/deltah2 - if (iy == 1) then - zt(k) = g(x,dzero,z)*(-val(icoeff)) + zt(k) - else - call ijk2idx(icol(icoeff),ix,iy-1,iz,idim,idim,idim) - irow(icoeff) = glob_row - icoeff = icoeff+1 - endif - ! term depending on (x,y,z-1) - val(icoeff)=-a3(x,y,z)/sqdeltah-b3(x,y,z)/deltah2 - if (iz == 1) then - zt(k) = g(x,y,dzero)*(-val(icoeff)) + zt(k) - else - call ijk2idx(icol(icoeff),ix,iy,iz-1,idim,idim,idim) - irow(icoeff) = glob_row - icoeff = icoeff+1 - endif - - ! term depending on (x,y,z) - val(icoeff)=(2*done)*(a1(x,y,z)+a2(x,y,z)+a3(x,y,z))/sqdeltah & - & + c(x,y,z) - call ijk2idx(icol(icoeff),ix,iy,iz,idim,idim,idim) - irow(icoeff) = glob_row - icoeff = icoeff+1 - ! term depending on (x,y,z+1) - val(icoeff)=-a3(x,y,z)/sqdeltah+b3(x,y,z)/deltah2 - if (iz == idim) then - zt(k) = g(x,y,done)*(-val(icoeff)) + zt(k) - else - call ijk2idx(icol(icoeff),ix,iy,iz+1,idim,idim,idim) - irow(icoeff) = glob_row - icoeff = icoeff+1 - endif - ! term depending on (x,y+1,z) - val(icoeff)=-a2(x,y,z)/sqdeltah+b2(x,y,z)/deltah2 - if (iy == idim) then - zt(k) = g(x,done,z)*(-val(icoeff)) + zt(k) - else - call ijk2idx(icol(icoeff),ix,iy+1,iz,idim,idim,idim) - irow(icoeff) = glob_row - icoeff = icoeff+1 - endif - ! term depending on (x+1,y,z) - val(icoeff)=-a1(x,y,z)/sqdeltah+b1(x,y,z)/deltah2 - if (ix==idim) then - zt(k) = g(done,y,z)*(-val(icoeff)) + zt(k) - else - call ijk2idx(icol(icoeff),ix+1,iy,iz,idim,idim,idim) - irow(icoeff) = glob_row - icoeff = icoeff+1 - endif - - end do - call psb_spins(icoeff-1,irow,icol,val,a,desc_a,info) - if(info /= psb_success_) exit - call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),bv,desc_a,info) - if(info /= psb_success_) exit - zt(:)=dzero - call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),xv,desc_a,info) - if(info /= psb_success_) exit - end do - - tgen = psb_wtime()-t1 - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='insert rout.' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - - deallocate(val,irow,icol) - - call psb_barrier(ctxt) - t1 = psb_wtime() - call psb_cdasb(desc_a,info,mold=imold) - tcdasb = psb_wtime()-t1 - call psb_barrier(ctxt) - t1 = psb_wtime() - if (info == psb_success_) then - if (present(amold)) then - call psb_spasb(a,desc_a,info,mold=amold,bld_and=tnd) - else - call psb_spasb(a,desc_a,info,afmt=afmt,bld_and=tnd) - end if - end if - call psb_barrier(ctxt) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='asb rout.' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - if (info == psb_success_) call psb_geasb(xv,desc_a,info,mold=vmold) - if (info == psb_success_) call psb_geasb(bv,desc_a,info,mold=vmold) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='asb rout.' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - tasb = psb_wtime()-t1 - call psb_barrier(ctxt) - ttot = psb_wtime() - t0 - - call psb_amx(ctxt,talc) - call psb_amx(ctxt,tgen) - call psb_amx(ctxt,tasb) - call psb_amx(ctxt,ttot) - if(iam == psb_root_) then - tmpfmt = a%get_fmt() - write(psb_out_unit,'("The matrix has been generated and assembled in ",a3," format.")')& - & tmpfmt - write(psb_out_unit,'("-allocation time : ",es12.5)') talc - write(psb_out_unit,'("-coeff. gen. time : ",es12.5)') tgen - write(psb_out_unit,'("-desc asbly time : ",es12.5)') tcdasb - write(psb_out_unit,'("- mat asbly time : ",es12.5)') tasb - write(psb_out_unit,'("-total time : ",es12.5)') ttot - - end if - call psb_erractionrestore(err_act) - return - -9999 call psb_error_handler(ctxt,err_act) - - return - end subroutine psb_d_gen_pde3d - - -end module psb_d_pde3d_mod - - program pdgenmv use psb_base_mod use psb_util_mod use psb_ext_mod -#ifdef OPENACC + use psb_d_pde3d_mod +#ifdef PSB_OPENACC use psb_oacc_mod #endif - use psb_d_pde3d_mod +#ifdef PSB_HAVE_CUDA + use psb_cuda_mod +#endif implicit none ! input parameters @@ -580,10 +66,6 @@ program pdgenmv type(psb_desc_type) :: desc_a ! dense matrices type(psb_d_vect_type), target :: xv, bv, xg, bg -#ifdef OPENACC - type(psb_d_vect_oacc) :: vmold - type(psb_i_vect_oacc) :: imold -#endif real(psb_dpk_), allocatable :: x1(:), x2(:), x0(:) ! blacs parameters type(psb_ctxt_type) :: ctxt @@ -599,12 +81,29 @@ program pdgenmv type(psb_d_hll_sparse_mat), target :: ahll type(psb_d_dia_sparse_mat), target :: adia type(psb_d_hdia_sparse_mat), target :: ahdia -#ifdef OPENACC - type(psb_d_oacc_ell_sparse_mat), target :: aelg - type(psb_d_oacc_csr_sparse_mat), target :: acsrg - type(psb_d_oacc_hll_sparse_mat), target :: ahlg + type(psb_d_base_vect_type), target :: dvect + type(psb_i_base_vect_type), target :: ivect + class(psb_d_base_sparse_mat), pointer :: acmold => acsr + class(psb_d_base_vect_type), pointer :: vmold => dvect + class(psb_i_base_vect_type), pointer :: imold => ivect + class(psb_d_base_vect_type), pointer :: vgmold => dvect + class(psb_i_base_vect_type), pointer :: igmold => ivect +#if defined(PSB_HAVE_CUDA) + type(psb_d_cuda_hlg_sparse_mat), target :: ahlg + type(psb_d_cuda_hdiag_sparse_mat), target :: ahdiag + type(psb_d_cuda_csrg_sparse_mat), target :: acsrg + type(psb_d_cuda_elg_sparse_mat), target :: aelg + type(psb_d_vect_cuda), target :: dvgpu + type(psb_i_vect_cuda), target :: ivgpu #endif - class(psb_d_base_sparse_mat), pointer :: agmold, acmold +#if defined(PSB_OPENACC) + type(psb_d_oacc_hll_sparse_mat), target :: ahlo + type(psb_d_oacc_csr_sparse_mat), target :: acsro + type(psb_d_oacc_ell_sparse_mat), target :: aelo + type(psb_d_vect_oacc), target :: dvoac + type(psb_i_vect_oacc), target :: ivoac +#endif + class(psb_d_base_sparse_mat), pointer :: agmold ! other variables logical, parameter :: dump=.false. integer(psb_ipk_) :: info, i, j, nr, nrg @@ -618,9 +117,12 @@ program pdgenmv call psb_init(ctxt) call psb_info(ctxt,iam,np) -#ifdef OPENACC +#ifdef PSB_OPENACC call psb_oacc_init(ctxt) #endif +#ifdef PSB_HAVE_CUDA + call psb_cuda_init(ctxt) +#endif if (iam < 0) then ! This should not happen, but just in case @@ -636,9 +138,13 @@ program pdgenmv write(*,*) 'Welcome to PSBLAS version: ',psb_version_string_ write(*,*) 'This is the ',trim(name),' sample program' end if -#ifdef OPENACC +#ifdef PSB_OPENACC !!$ write(*,*) 'Process ',iam,' running on device: ', psb_oacc_getDevice(),' out of', psb_oacc_getDeviceCount() !!$ write(*,*) 'Process ',iam,' device ', psb_oacc_getDevice(),' is a: ', trim(psb_oacc_DeviceName()) +#endif +#if defined(PSB_HAVE_CUDA) + write(*,*) 'Process ',iam,' running on device: ', psb_cuda_getDevice(),' out of', psb_cuda_getDeviceCount() + write(*,*) 'Process ',iam,' device ', psb_cuda_getDevice(),' is a: ', trim(psb_cuda_DeviceName()) #endif ! ! get parameters @@ -650,7 +156,7 @@ program pdgenmv ! call psb_barrier(ctxt) t1 = psb_wtime() - call psb_gen_pde3d(ctxt,idim,a,bv,xv,desc_a,'CSR ',info,partition=3,tnd=tnd) + call psb_d_gen_pde3d(ctxt,idim,a,bv,xv,desc_a,'CSR ',info,partition=3,tnd=tnd) call psb_barrier(ctxt) t2 = psb_wtime() - t1 if(info /= psb_success_) then @@ -691,29 +197,54 @@ program pdgenmv stop end if -#ifdef OPENACC select case(psb_toupper(agfmt)) +#if defined(PSB_HAVE_CUDA) case('ELG') agmold => aelg + vgmold => dvgpu + igmold => ivgpu case('HLG') + call psi_set_hksz(32) agmold => ahlg + vgmold => dvgpu + igmold => ivgpu + case('HDIAG') + agmold => ahdiag + vgmold => dvgpu + igmold => ivgpu case('CSRG') agmold => acsrg - case default - write(*,*) 'Unknown format defaulting to HLG' - agmold => ahlg - end select + vgmold => dvgpu + igmold => ivgpu +#endif +#if defined(PSB_OPENACC) + case('ELO') + agmold => aelo + vgmold => dvoac + igmold => ivoac + case('HLO') + call psi_set_hksz(32) + agmold => ahlo + vgmold => dvoac + igmold => ivoac +!!$ case('HDIAG') +!!$ amold => ahdiag + case('CSRO') + agmold => acsro + vgmold => dvoac + igmold => ivoac #endif + end select call a%cscnv(agpu,info,mold=agmold) if ((info /= 0).or.(psb_get_errstatus()/=0)) then write(0,*) 'From cscnv ',info call psb_error() stop end if - call desc_a%cnv(mold=imold) + call desc_a%cnv(mold=igmold) - call psb_geasb(bg,desc_a,info,scratch=.true.,mold=vmold) - call psb_geasb(xg,desc_a,info,scratch=.true.,mold=vmold) + call psb_geasb(bg,desc_a,info,scratch=.true.,mold=vgmold) + call psb_geasb(xg,desc_a,info,scratch=.true.,mold=vgmold) nr = desc_a%get_local_rows() nrg = desc_a%get_global_rows() call psb_geall(x0,desc_a,info) @@ -738,11 +269,10 @@ program pdgenmv call xv%bld(x0) call psb_geasb(bv,desc_a,info,scratch=.true.) -#ifdef OPENACC - +#if defined(PSB_OPENACC)||defined(PSB_HAVE_CUDA) call aux_a%cscnv(agpu,info,mold=acoo) - call xg%bld(x0,mold=vmold) - call psb_geasb(bg,desc_a,info,scratch=.true.,mold=vmold) + call xg%bld(x0,mold=vgmold) + call psb_geasb(bg,desc_a,info,scratch=.true.,mold=vgmold) call psb_barrier(ctxt) t1 = psb_wtime() call agpu%cscnv(info,mold=agmold) @@ -765,7 +295,7 @@ program pdgenmv t2 = psb_wtime() - t1 call psb_amx(ctxt,t2) -#ifdef OPENACC +#if defined(PSB_OPENACC)||defined(PSB_HAVE_CUDA) call xg%set(x0) ! FIXME: cache flush needed here @@ -861,7 +391,7 @@ program pdgenmv tflops = flops gflops = flops * ngpu write(psb_out_unit,'("Storage type for A: ",a)') a%get_fmt() -#ifdef OPENACC +#if defined(PSB_OPENACC)||defined(PSB_HAVE_CUDA) write(psb_out_unit,'("Storage type for AGPU: ",a)') agpu%get_fmt() write(psb_out_unit,'("Time to convert A from COO to CPU (1): ",F20.9)')& & tcnvc1 @@ -891,7 +421,7 @@ program pdgenmv & t2*1.d3/(1.d0*ntests) write(psb_out_unit,'("MFLOPS (CPU) : ",F20.3)')& & flops/1.d6 -#ifdef OPENACC +#if defined(PSB_OPENACC)||defined(PSB_HAVE_CUDA) write(psb_out_unit,'("Time for ",i6," products (s) (xGPU) : ",F20.3)')& & ntests, tt2 write(psb_out_unit,'("Time per product (ms) (xGPU) : ",F20.3)')& @@ -916,7 +446,7 @@ program pdgenmv bdwdth = ntests*nbytes/(t2*1.d6) write(psb_out_unit,*) write(psb_out_unit,'("MBYTES/S sust. effective bandwidth (CPU) : ",F20.3)') bdwdth -#ifdef OPENACC +#if defined(PSB_OPENACC)||defined(PSB_HAVE_CUDA) bdwdth = ngpu*ntests*nbytes/(gt2*1.d6) write(psb_out_unit,'("MBYTES/S sust. effective bandwidth (GPU) : ",F20.3)') bdwdth !!$ bdwdth = psb_oacc_MemoryPeakBandwidth() @@ -941,8 +471,11 @@ program pdgenmv call psb_errpush(info,name,a_err=ch_err) goto 9999 end if -#ifdef OPENACC +#ifdef PSB_OPENACC call psb_oacc_exit() +#endif +#ifdef PSB_HAVE_CUDA + call psb_cuda_exit() #endif call psb_exit(ctxt) stop @@ -967,7 +500,7 @@ contains if (iam == 0) then write(*,*) 'CPU side format?' read(psb_inp_unit,*) acfmt - write(*,*) 'OACC side format?' + write(*,*) 'DEVICE side format?' read(psb_inp_unit,*) agfmt write(*,*) 'Size of discretization cube?' read(psb_inp_unit,*) idim diff --git a/test/openacc/dpmix.F90 b/test/openacc/dpmix.F90 deleted file mode 100644 index 3950dc44..00000000 --- a/test/openacc/dpmix.F90 +++ /dev/null @@ -1,1216 +0,0 @@ -! -! Parallel Sparse BLAS GPU plugin -! (C) Copyright 2013 -! Salvatore Filippone -! Alessandro Fanfarillo -! -! Redistribution and use in source and binary forms, with or without -! modification, are permitted provided that the following conditions -! are met: -! 1. Redistributions of source code must retain the above copyright -! notice, this list of conditions and the following disclaimer. -! 2. Redistributions in binary form must reproduce the above copyright -! notice, this list of conditions, and the following disclaimer in the -! documentation and/or other materials provided with the distribution. -! 3. The name of the PSBLAS group or the names of its contributors may -! not be used to endorse or promote products derived from this -! software without specific written permission. -! -! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PSBLAS GROUP OR ITS CONTRIBUTORS -! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -! POSSIBILITY OF SUCH DAMAGE. -! -! -! File: dpdegenmv.f90 -! -! Program: pdegenmv -! This sample program measures the performance of the matrix-vector product. -! The matrix is generated in the same way as for the pdegen test case of -! the main PSBLAS library. -! -! -module psb_d_pde3d_mod - - - use psb_base_mod, only : psb_dpk_, psb_ipk_, psb_lpk_, psb_desc_type,& - & psb_dspmat_type, psb_d_vect_type, dzero,& - & psb_d_base_sparse_mat, psb_d_base_vect_type, & - & psb_i_base_vect_type, psb_l_base_vect_type - - interface - function d_func_3d(x,y,z) result(val) - import :: psb_dpk_ - real(psb_dpk_), intent(in) :: x,y,z - real(psb_dpk_) :: val - end function d_func_3d - end interface - - interface psb_gen_pde3d - module procedure psb_d_gen_pde3d - end interface psb_gen_pde3d - -contains - - function d_null_func_3d(x,y,z) result(val) - - real(psb_dpk_), intent(in) :: x,y,z - real(psb_dpk_) :: val - - val = dzero - - end function d_null_func_3d - ! - ! functions parametrizing the differential equation - ! - - ! - ! Note: b1, b2 and b3 are the coefficients of the first - ! derivative of the unknown function. The default - ! we apply here is to have them zero, so that the resulting - ! matrix is symmetric/hermitian and suitable for - ! testing with CG and FCG. - ! When testing methods for non-hermitian matrices you can - ! change the B1/B2/B3 functions to e.g. done/sqrt((3*done)) - ! - function b1(x,y,z) - use psb_base_mod, only : psb_dpk_, done, dzero - implicit none - real(psb_dpk_) :: b1 - real(psb_dpk_), intent(in) :: x,y,z - b1=done/sqrt((3*done)) - end function b1 - function b2(x,y,z) - use psb_base_mod, only : psb_dpk_, done, dzero - implicit none - real(psb_dpk_) :: b2 - real(psb_dpk_), intent(in) :: x,y,z - b2=done/sqrt((3*done)) - end function b2 - function b3(x,y,z) - use psb_base_mod, only : psb_dpk_, done, dzero - implicit none - real(psb_dpk_) :: b3 - real(psb_dpk_), intent(in) :: x,y,z - b3=done/sqrt((3*done)) - end function b3 - function c(x,y,z) - use psb_base_mod, only : psb_dpk_, done, dzero - implicit none - real(psb_dpk_) :: c - real(psb_dpk_), intent(in) :: x,y,z - c=dzero - end function c - function a1(x,y,z) - use psb_base_mod, only : psb_dpk_, done, dzero - implicit none - real(psb_dpk_) :: a1 - real(psb_dpk_), intent(in) :: x,y,z - a1=done/80 - end function a1 - function a2(x,y,z) - use psb_base_mod, only : psb_dpk_, done, dzero - implicit none - real(psb_dpk_) :: a2 - real(psb_dpk_), intent(in) :: x,y,z - a2=done/80 - end function a2 - function a3(x,y,z) - use psb_base_mod, only : psb_dpk_, done, dzero - implicit none - real(psb_dpk_) :: a3 - real(psb_dpk_), intent(in) :: x,y,z - a3=done/80 - end function a3 - function g(x,y,z) - use psb_base_mod, only : psb_dpk_, done, dzero - implicit none - real(psb_dpk_) :: g - real(psb_dpk_), intent(in) :: x,y,z - g = dzero - if (x == done) then - g = done - else if (x == dzero) then - g = exp(y**2-z**2) - end if - end function g - - - ! - ! subroutine to allocate and fill in the coefficient matrix and - ! the rhs. - ! - subroutine psb_d_gen_pde3d(ctxt,idim,a,bv,xv,desc_a,afmt,info,& - & f,amold,vmold,imold,partition,nrl,iv,tnd) - use psb_base_mod - use psb_util_mod - ! - ! Discretizes the partial differential equation - ! - ! a1 dd(u) a2 dd(u) a3 dd(u) b1 d(u) b2 d(u) b3 d(u) - ! - ------ - ------ - ------ + ----- + ------ + ------ + c u = f - ! dxdx dydy dzdz dx dy dz - ! - ! with Dirichlet boundary conditions - ! u = g - ! - ! on the unit cube 0<=x,y,z<=1. - ! - ! - ! Note that if b1=b2=b3=c=0., the PDE is the Laplace equation. - ! - implicit none - integer(psb_ipk_) :: idim - type(psb_dspmat_type) :: a - type(psb_d_vect_type) :: xv,bv - type(psb_desc_type) :: desc_a - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: info - character(len=*) :: afmt - procedure(d_func_3d), optional :: f - class(psb_d_base_sparse_mat), optional :: amold - class(psb_d_base_vect_type), optional :: vmold - class(psb_i_base_vect_type), optional :: imold - integer(psb_ipk_), optional :: partition, nrl,iv(:) - logical, optional :: tnd - ! Local variables. - - integer(psb_ipk_), parameter :: nb=20 - type(psb_d_csc_sparse_mat) :: acsc - type(psb_d_coo_sparse_mat) :: acoo - type(psb_d_csr_sparse_mat) :: acsr - real(psb_dpk_) :: zt(nb),x,y,z - integer(psb_ipk_) :: nnz,nr,nlr,i,j,ii,ib,k, partition_ - integer(psb_lpk_) :: m,n,glob_row,nt - integer(psb_ipk_) :: ix,iy,iz,ia,indx_owner - ! For 3D partition - ! Note: integer control variables going directly into an MPI call - ! must be 4 bytes, i.e. psb_mpk_ - integer(psb_mpk_) :: npdims(3), npp, minfo - integer(psb_ipk_) :: npx,npy,npz, iamx,iamy,iamz,mynx,myny,mynz - integer(psb_ipk_), allocatable :: bndx(:),bndy(:),bndz(:) - ! Process grid - integer(psb_ipk_) :: np, iam - integer(psb_ipk_) :: icoeff - integer(psb_lpk_), allocatable :: irow(:),icol(:),myidx(:) - real(psb_dpk_), allocatable :: val(:) - ! deltah dimension of each grid cell - ! deltat discretization time - real(psb_dpk_) :: deltah, sqdeltah, deltah2 - real(psb_dpk_), parameter :: rhs=dzero,one=done,zero=dzero - real(psb_dpk_) :: t0, t1, t2, t3, tasb, talc, ttot, tgen, tcdasb - integer(psb_ipk_) :: err_act - procedure(d_func_3d), pointer :: f_ - logical :: tnd_ - character(len=20) :: name, ch_err,tmpfmt - - info = psb_success_ - name = 'create_matrix' - call psb_erractionsave(err_act) - - call psb_info(ctxt, iam, np) - - - if (present(f)) then - f_ => f - else - f_ => d_null_func_3d - end if - - deltah = done/(idim+2) - sqdeltah = deltah*deltah - deltah2 = (2*done)* deltah - - if (present(partition)) then - if ((1<= partition).and.(partition <= 3)) then - partition_ = partition - else - write(*,*) 'Invalid partition choice ',partition,' defaulting to 3' - partition_ = 3 - end if - else - partition_ = 3 - end if - - ! initialize array descriptor and sparse matrix storage. provide an - ! estimate of the number of non zeroes - - m = (1_psb_lpk_*idim)*idim*idim - n = m - nnz = ((n*7)/(np)) - if(iam == psb_root_) write(psb_out_unit,'("Generating Matrix (size=",i0,")...")')n - t0 = psb_wtime() - select case(partition_) - case(1) - ! A BLOCK partition - if (present(nrl)) then - nr = nrl - else - ! - ! Using a simple BLOCK distribution. - ! - nt = (m+np-1)/np - nr = max(0,min(nt,m-(iam*nt))) - end if - - nt = nr - call psb_sum(ctxt,nt) - if (nt /= m) then - write(psb_err_unit,*) iam, 'Initialization error ',nr,nt,m - info = -1 - call psb_barrier(ctxt) - call psb_abort(ctxt) - return - end if - - ! - ! First example of use of CDALL: specify for each process a number of - ! contiguous rows - ! - call psb_cdall(ctxt,desc_a,info,nl=nr) - myidx = desc_a%get_global_indices() - nlr = size(myidx) - - case(2) - ! A partition defined by the user through IV - - if (present(iv)) then - if (size(iv) /= m) then - write(psb_err_unit,*) iam, 'Initialization error: wrong IV size',size(iv),m - info = -1 - call psb_barrier(ctxt) - call psb_abort(ctxt) - return - end if - else - write(psb_err_unit,*) iam, 'Initialization error: IV not present' - info = -1 - call psb_barrier(ctxt) - call psb_abort(ctxt) - return - end if - - ! - ! Second example of use of CDALL: specify for each row the - ! process that owns it - ! - call psb_cdall(ctxt,desc_a,info,vg=iv) - myidx = desc_a%get_global_indices() - nlr = size(myidx) - - case(3) - ! A 3-dimensional partition - - ! A nifty MPI function will split the process list - npdims = 0 - call mpi_dims_create(np,3,npdims,info) - npx = npdims(1) - npy = npdims(2) - npz = npdims(3) - - allocate(bndx(0:npx),bndy(0:npy),bndz(0:npz)) - ! We can reuse idx2ijk for process indices as well. - call idx2ijk(iamx,iamy,iamz,iam,npx,npy,npz,base=0) - ! Now let's split the 3D cube in hexahedra - call dist1Didx(bndx,idim,npx) - mynx = bndx(iamx+1)-bndx(iamx) - call dist1Didx(bndy,idim,npy) - myny = bndy(iamy+1)-bndy(iamy) - call dist1Didx(bndz,idim,npz) - mynz = bndz(iamz+1)-bndz(iamz) - - ! How many indices do I own? - nlr = mynx*myny*mynz - allocate(myidx(nlr)) - ! Now, let's generate the list of indices I own - nr = 0 - do i=bndx(iamx),bndx(iamx+1)-1 - do j=bndy(iamy),bndy(iamy+1)-1 - do k=bndz(iamz),bndz(iamz+1)-1 - nr = nr + 1 - call ijk2idx(myidx(nr),i,j,k,idim,idim,idim) - end do - end do - end do - if (nr /= nlr) then - write(psb_err_unit,*) iam,iamx,iamy,iamz, 'Initialization error: NR vs NLR ',& - & nr,nlr,mynx,myny,mynz - info = -1 - call psb_barrier(ctxt) - call psb_abort(ctxt) - end if - - ! - ! Third example of use of CDALL: specify for each process - ! the set of global indices it owns. - ! - call psb_cdall(ctxt,desc_a,info,vl=myidx) - - case default - write(psb_err_unit,*) iam, 'Initialization error: should not get here' - info = -1 - call psb_barrier(ctxt) - call psb_abort(ctxt) - return - end select - - - if (info == psb_success_) call psb_spall(a,desc_a,info,nnz=nnz,& - & dupl=psb_dupl_err_) - ! define rhs from boundary conditions; also build initial guess - if (info == psb_success_) call psb_geall(xv,desc_a,info) - if (info == psb_success_) call psb_geall(bv,desc_a,info) - - call psb_barrier(ctxt) - talc = psb_wtime()-t0 - - if (info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='allocation rout.' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - - ! we build an auxiliary matrix consisting of one row at a - ! time; just a small matrix. might be extended to generate - ! a bunch of rows per call. - ! - allocate(val(20*nb),irow(20*nb),& - &icol(20*nb),stat=info) - if (info /= psb_success_ ) then - info=psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - endif - - - ! loop over rows belonging to current process in a block - ! distribution. - - call psb_barrier(ctxt) - t1 = psb_wtime() - do ii=1, nlr,nb - ib = min(nb,nlr-ii+1) - icoeff = 1 - do k=1,ib - i=ii+k-1 - ! local matrix pointer - glob_row=myidx(i) - ! compute gridpoint coordinates - call idx2ijk(ix,iy,iz,glob_row,idim,idim,idim) - ! x, y, z coordinates - x = (ix-1)*deltah - y = (iy-1)*deltah - z = (iz-1)*deltah - zt(k) = f_(x,y,z) - ! internal point: build discretization - ! - ! term depending on (x-1,y,z) - ! - val(icoeff) = -a1(x,y,z)/sqdeltah-b1(x,y,z)/deltah2 - if (ix == 1) then - zt(k) = g(dzero,y,z)*(-val(icoeff)) + zt(k) - else - call ijk2idx(icol(icoeff),ix-1,iy,iz,idim,idim,idim) - irow(icoeff) = glob_row - icoeff = icoeff+1 - endif - ! term depending on (x,y-1,z) - val(icoeff) = -a2(x,y,z)/sqdeltah-b2(x,y,z)/deltah2 - if (iy == 1) then - zt(k) = g(x,dzero,z)*(-val(icoeff)) + zt(k) - else - call ijk2idx(icol(icoeff),ix,iy-1,iz,idim,idim,idim) - irow(icoeff) = glob_row - icoeff = icoeff+1 - endif - ! term depending on (x,y,z-1) - val(icoeff)=-a3(x,y,z)/sqdeltah-b3(x,y,z)/deltah2 - if (iz == 1) then - zt(k) = g(x,y,dzero)*(-val(icoeff)) + zt(k) - else - call ijk2idx(icol(icoeff),ix,iy,iz-1,idim,idim,idim) - irow(icoeff) = glob_row - icoeff = icoeff+1 - endif - - ! term depending on (x,y,z) - val(icoeff)=(2*done)*(a1(x,y,z)+a2(x,y,z)+a3(x,y,z))/sqdeltah & - & + c(x,y,z) - call ijk2idx(icol(icoeff),ix,iy,iz,idim,idim,idim) - irow(icoeff) = glob_row - icoeff = icoeff+1 - ! term depending on (x,y,z+1) - val(icoeff)=-a3(x,y,z)/sqdeltah+b3(x,y,z)/deltah2 - if (iz == idim) then - zt(k) = g(x,y,done)*(-val(icoeff)) + zt(k) - else - call ijk2idx(icol(icoeff),ix,iy,iz+1,idim,idim,idim) - irow(icoeff) = glob_row - icoeff = icoeff+1 - endif - ! term depending on (x,y+1,z) - val(icoeff)=-a2(x,y,z)/sqdeltah+b2(x,y,z)/deltah2 - if (iy == idim) then - zt(k) = g(x,done,z)*(-val(icoeff)) + zt(k) - else - call ijk2idx(icol(icoeff),ix,iy+1,iz,idim,idim,idim) - irow(icoeff) = glob_row - icoeff = icoeff+1 - endif - ! term depending on (x+1,y,z) - val(icoeff)=-a1(x,y,z)/sqdeltah+b1(x,y,z)/deltah2 - if (ix==idim) then - zt(k) = g(done,y,z)*(-val(icoeff)) + zt(k) - else - call ijk2idx(icol(icoeff),ix+1,iy,iz,idim,idim,idim) - irow(icoeff) = glob_row - icoeff = icoeff+1 - endif - - end do - call psb_spins(icoeff-1,irow,icol,val,a,desc_a,info) - if(info /= psb_success_) exit - call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),bv,desc_a,info) - if(info /= psb_success_) exit - zt(:)=dzero - call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),xv,desc_a,info) - if(info /= psb_success_) exit - end do - - tgen = psb_wtime()-t1 - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='insert rout.' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - - deallocate(val,irow,icol) - - call psb_barrier(ctxt) - t1 = psb_wtime() - call psb_cdasb(desc_a,info,mold=imold) - tcdasb = psb_wtime()-t1 - call psb_barrier(ctxt) - t1 = psb_wtime() - if (info == psb_success_) then - if (present(amold)) then - call psb_spasb(a,desc_a,info,mold=amold,bld_and=tnd) - else - call psb_spasb(a,desc_a,info,afmt=afmt,bld_and=tnd) - end if - end if - call psb_barrier(ctxt) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='asb rout.' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - if (info == psb_success_) call psb_geasb(xv,desc_a,info,mold=vmold) - if (info == psb_success_) call psb_geasb(bv,desc_a,info,mold=vmold) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='asb rout.' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - tasb = psb_wtime()-t1 - call psb_barrier(ctxt) - ttot = psb_wtime() - t0 - - call psb_amx(ctxt,talc) - call psb_amx(ctxt,tgen) - call psb_amx(ctxt,tasb) - call psb_amx(ctxt,ttot) - if(iam == psb_root_) then - tmpfmt = a%get_fmt() - write(psb_out_unit,'("The matrix has been generated and assembled in ",a3," format.")')& - & tmpfmt - write(psb_out_unit,'("-allocation time : ",es12.5)') talc - write(psb_out_unit,'("-coeff. gen. time : ",es12.5)') tgen - write(psb_out_unit,'("-desc asbly time : ",es12.5)') tcdasb - write(psb_out_unit,'("- mat asbly time : ",es12.5)') tasb - write(psb_out_unit,'("-total time : ",es12.5)') ttot - - end if - call psb_erractionrestore(err_act) - return - -9999 call psb_error_handler(ctxt,err_act) - - return - end subroutine psb_d_gen_pde3d - - -end module psb_d_pde3d_mod - - -program pdgenmv - use psb_base_mod - use psb_util_mod - use psb_ext_mod -#ifdef OPENACC - use psb_oacc_mod -#endif -#ifdef CUDA - use psb_cuda_mod -#endif - use psb_d_pde3d_mod - implicit none - - ! input parameters - character(len=5) :: acfmt, agfmt - integer :: idim - logical :: tnd - ! miscellaneous - real(psb_dpk_), parameter :: one = 1.d0 - real(psb_dpk_) :: t1, t2, tprec, flops, tflops,& - & tt1, tt2, gt1, gt2, gflops, bdwdth,& - & tcnvcsr, tcnvc1, tcnvgpu, tcnvg1 - - ! sparse matrix and preconditioner - type(psb_dspmat_type) :: a, aoacc, aux_a, acuda - ! descriptor - type(psb_desc_type) :: desc_a - ! dense matrices - type(psb_d_vect_type), target :: xv, bv, xoacc, boacc, xcuda,bcuda -#ifdef OPENACC - type(psb_d_vect_oacc) :: vomold - type(psb_i_vect_oacc) :: iomold -#endif -#ifdef CUDA - type(psb_d_vect_cuda) :: vgmold - type(psb_i_vect_cuda) :: igmold -#endif - real(psb_dpk_), allocatable :: x1(:), x2(:), x0(:) - ! blacs parameters - type(psb_ctxt_type) :: ctxt - integer :: iam, np - - ! solver parameters - integer(psb_epk_) :: amatsize, precsize, descsize, annz, nbytes - real(psb_dpk_) :: err, eps, tnv, tng,tdot, dnrm2,ddot - integer, parameter :: ntests=8, ngpu=4, ncnv=3 - type(psb_d_coo_sparse_mat), target :: acoo - type(psb_d_csr_sparse_mat), target :: acsr - type(psb_d_ell_sparse_mat), target :: aell - type(psb_d_hll_sparse_mat), target :: ahll - type(psb_d_dia_sparse_mat), target :: adia - type(psb_d_hdia_sparse_mat), target :: ahdia -#ifdef OPENACC - type(psb_d_oacc_ell_sparse_mat), target :: aelg - type(psb_d_oacc_csr_sparse_mat), target :: acsrg - type(psb_d_oacc_hll_sparse_mat), target :: ahlg -#endif -#ifdef CUDA - type(psb_d_cuda_elg_sparse_mat), target :: acelg - type(psb_d_cuda_csrg_sparse_mat), target :: accsrg - type(psb_d_cuda_hlg_sparse_mat), target :: achlg -#endif - class(psb_d_base_sparse_mat), pointer :: agmold, acmold, aomold - - ! other variables - logical, parameter :: dump=.false. - integer(psb_ipk_) :: info, i, j, nr, nrg - integer(psb_lpk_) :: ig - character(len=20) :: name,ch_err - character(len=40) :: fname - - info=psb_success_ - - - call psb_init(ctxt) - call psb_info(ctxt,iam,np) - -#ifdef OPENACC - call psb_oacc_init(ctxt) -#endif - -#ifdef CUDA - call psb_cuda_init(ctxt) -#endif - - if (iam < 0) then - ! This should not happen, but just in case - call psb_exit(ctxt) - stop - endif - if(psb_get_errstatus() /= 0) goto 9999 - name='pdegenmv-oacc' - ! - ! Hello world - ! - if (iam == psb_root_) then - write(*,*) 'Welcome to PSBLAS version: ',psb_version_string_ - write(*,*) 'This is the ',trim(name),' sample program' - end if -#ifdef OPENACC -!!$ write(*,*) 'Process ',iam,' running on device: ', psb_oacc_getDevice(),' out of', psb_oacc_getDeviceCount() -!!$ write(*,*) 'Process ',iam,' device ', psb_oacc_getDevice(),' is a: ', trim(psb_oacc_DeviceName()) -#endif -#ifdef CUDA - write(*,*) 'Process ',iam,' running on device: ', psb_cuda_getDevice(),' out of', psb_cuda_getDeviceCount() - write(*,*) 'Process ',iam,' device ', psb_cuda_getDevice(),' is a: ', trim(psb_cuda_DeviceName()) -#endif -!!$ call psb_oacc_DeviceSync() - call psb_cuda_DeviceSync() - ! - ! get parameters - ! - call get_parms(ctxt,acfmt,agfmt,idim,tnd) - call psb_init_timers() - ! - ! allocate and fill in the coefficient matrix and initial vectors - ! - call psb_barrier(ctxt) - t1 = psb_wtime() - call psb_gen_pde3d(ctxt,idim,a,bv,xv,desc_a,'CSR ',info,partition=3,tnd=tnd) - call psb_barrier(ctxt) - t2 = psb_wtime() - t1 - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='create_matrix' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - if (iam == psb_root_) write(psb_out_unit,'("Overall matrix creation time : ",es12.5)')t2 - if (iam == psb_root_) write(psb_out_unit,'(" ")') - - if (dump) then - write(fname,'(a,i3.3,a,i3.3,a,i3.3,a)') 'pde',idim,'-',iam,'-',np,'.mtx' - call a%print(fname,head='PDEGEN test matrix') - end if - - select case(psb_toupper(acfmt)) - case('ELL') - acmold => aell - case('HLL') - acmold => ahll - case('DIA') - acmold => adia - case('HDIA') - acmold => ahdia - case('CSR') - acmold => acsr - case('COO') - acmold => acoo - case default - write(*,*) 'Unknown format defaulting to HLL' - acmold => ahll - end select - call a%cscnv(info,mold=acmold) - if ((info /= 0).or.(psb_get_errstatus()/=0)) then - write(0,*) 'From cscnv ',info - call psb_error() - stop - end if - -#ifdef OPENACC - select case(psb_toupper(agfmt)) - case('ELG') - aomold => aelg - case('HLG') - aomold => ahlg - case('CSRG') - aomold => acsrg - case default - write(*,*) 'Unknown format defaulting to HLG' - aomold => ahlg - end select - call a%cscnv(aoacc,info,mold=aomold) - if ((info /= 0).or.(psb_get_errstatus()/=0)) then - write(0,*) 'From cscnv ',info - call psb_error() - stop - end if - call desc_a%cnv(mold=iomold) - - call psb_geasb(boacc,desc_a,info,scratch=.true.,mold=vomold) - call psb_geasb(xoacc,desc_a,info,scratch=.true.,mold=vomold) - nr = desc_a%get_local_rows() - nrg = desc_a%get_global_rows() - call psb_geall(x0,desc_a,info) - do i=1, nr - call desc_a%l2g(i,ig,info) - x0(i) = 1.0 + (1.0*ig)/(nrg**2) - end do - call a%cscnv(aux_a,info,mold=acoo) - tcnvcsr = 0 - tcnvgpu = 0 - call psb_geall(x1,desc_a,info) - do j=1, ncnv - call aux_a%cscnv(a,info,mold=acoo) - call psb_barrier(ctxt) - t1 = psb_wtime() - call a%cscnv(info,mold=acmold) - t2 = psb_Wtime() -t1 - call psb_amx(ctxt,t2) - tcnvcsr = tcnvcsr + t2 - if (j==1) tcnvc1 = t2 - call psb_geasb(x1,desc_a,info) - call xv%bld(x0) - call psb_geasb(bv,desc_a,info,scratch=.true.) - - - call aux_a%cscnv(aoacc,info,mold=acoo) - call xoacc%bld(x0,mold=vomold) - call psb_geasb(boacc,desc_a,info,scratch=.true.,mold=vomold) - call psb_barrier(ctxt) - t1 = psb_wtime() - call aoacc%cscnv(info,mold=aomold) -!!$ call psb_oacc_DeviceSync() - t2 = psb_Wtime() -t1 - call psb_amx(ctxt,t2) - if (j==1) tcnvg1 = t2 - tcnvgpu = tcnvgpu + t2 - end do - - call xv%set(x0) - call psb_barrier(ctxt) - t1 = psb_wtime() - do i=1,ntests - call psb_spmm(done,a,xv,dzero,bv,desc_a,info) - end do - call psb_barrier(ctxt) - t2 = psb_wtime() - t1 - call psb_amx(ctxt,t2) - - call xoacc%set(x0) - - ! FIXME: cache flush needed here - x1 = bv%get_vect() - x2 = boacc%get_vect() - - call psb_barrier(ctxt) - tt1 = psb_wtime() - do i=1,ntests - call psb_spmm(done,aoacc,xv,dzero,boacc,desc_a,info) - if ((info /= 0).or.(psb_get_errstatus()/=0)) then - write(0,*) 'From 1 spmm',info,i,ntests - call psb_error() - stop - end if - - end do -!!$ call psb_oacc_DeviceSync() - call psb_barrier(ctxt) - tt2 = psb_wtime() - tt1 - call psb_amx(ctxt,tt2) - x1 = bv%get_vect() - x2 = boacc%get_vect() - nr = desc_a%get_local_rows() - eps = maxval(abs(x1(1:nr)-x2(1:nr))) - call psb_amx(ctxt,eps) - if (iam==0) write(*,*) 'Max diff on xoaccPU',eps - - ! FIXME: cache flush needed here - call xoacc%set(x0) - call xoacc%sync() - call psb_barrier(ctxt) - gt1 = psb_wtime() - do i=1,ntests*ngpu - call psb_spmm(done,aoacc,xoacc,dzero,boacc,desc_a,info) - ! For timing purposes we need to make sure all threads - ! in the device are done. - if ((info /= 0).or.(psb_get_errstatus()/=0)) then - write(0,*) 'From 2 spmm',info,i,ntests - call psb_error() - stop - end if - - end do -!!$ call psb_oacc_DeviceSync() - call psb_barrier(ctxt) - gt2 = psb_wtime() - gt1 - call psb_amx(ctxt,gt2) - call boacc%sync() - x1 = bv%get_vect() - x2 = boacc%get_vect() - tnv = psb_genrm2(bv,desc_a,info) - tng = psb_genrm2(boacc,desc_a,info) - tdot = psb_gedot(boacc,boacc,desc_a,info) -!!$ write(0,*) ' bv ',tnv,' boacc ',tng, ' dot ',tdot,eps,& -!!$ & dnrm2(desc_a%get_local_rows(),x2,1),& -!!$ & ddot(desc_a%get_local_rows(),x1,1,x2,1) - call psb_geaxpby(-done,boacc,+done,bv,desc_a,info) - eps = psb_geamax(bv,desc_a,info) - - call psb_amx(ctxt,t2) - eps = maxval(abs(x1(1:nr)-x2(1:nr))) - call psb_amx(ctxt,eps) - if (iam==0) write(*,*) 'Max diff on GPU',eps - if (dump) then - write(fname,'(a,i3.3,a,i3.3,a)')'XCPU-out-',iam,'-',np,'.mtx' - call mm_array_write(x1(1:nr),'Local part CPU',info,filename=fname) - write(fname,'(a,i3.3,a,i3.3,a)')'XGPU-out-',iam,'-',np,'.mtx' - call mm_array_write(x2(1:nr),'Local part GPU',info,filename=fname) - end if - - annz = a%get_nzeros() - amatsize = a%sizeof() - descsize = psb_sizeof(desc_a) - call psb_sum(ctxt,nr) - call psb_sum(ctxt,annz) - call psb_sum(ctxt,amatsize) - call psb_sum(ctxt,descsize) - - if (iam == psb_root_) then - write(psb_out_unit,& - & '("Matrix: ell1 ",i0)') idim - write(psb_out_unit,& - &'("Test on : ",i20," processors")') np - write(psb_out_unit,& - &'("Size of matrix : ",i20," ")') nr - write(psb_out_unit,& - &'("Number of nonzeros : ",i20," ")') annz - write(psb_out_unit,& - &'("Memory occupation : ",i20," ")') amatsize - flops = ntests*(2.d0*annz) - tflops = flops - gflops = flops * ngpu - write(psb_out_unit,'("Storage type for A: ",a)') a%get_fmt() - write(psb_out_unit,'("Storage type for AOACC: ",a)') aoacc%get_fmt() - write(psb_out_unit,'("Time to convert A from COO to CPU (1): ",F20.9)')& - & tcnvc1 - write(psb_out_unit,'("Time to convert A from COO to CPU (t): ",F20.9)')& - & tcnvcsr - write(psb_out_unit,'("Time to convert A from COO to CPU (a): ",F20.9)')& - & tcnvcsr/ncnv - write(psb_out_unit,'("Time to convert A from COO to GPU (1): ",F20.9)')& - & tcnvg1 - write(psb_out_unit,'("Time to convert A from COO to GPU (t): ",F20.9)')& - & tcnvgpu - write(psb_out_unit,'("Time to convert A from COO to GPU (a): ",F20.9)')& - & tcnvgpu/ncnv - - write(psb_out_unit,& - & '("Number of flops (",i0," prod) : ",F20.0," ")') & - & ntests,flops - - flops = flops / (t2) - tflops = tflops / (tt2) - gflops = gflops / (gt2) - - write(psb_out_unit,'("Time for ",i6," products (s) (CPU) : ",F20.3)')& - & ntests,t2 - write(psb_out_unit,'("Time per product (ms) (CPU) : ",F20.3)')& - & t2*1.d3/(1.d0*ntests) - write(psb_out_unit,'("MFLOPS (CPU) : ",F20.3)')& - & flops/1.d6 - write(psb_out_unit,'("Time for ",i6," products (s) (xGPU) : ",F20.3)')& - & ntests, tt2 - write(psb_out_unit,'("Time per product (ms) (xGPU) : ",F20.3)')& - & tt2*1.d3/(1.d0*ntests) - write(psb_out_unit,'("MFLOPS (xGPU) : ",F20.3)')& - & tflops/1.d6 - - write(psb_out_unit,'("Time for ",i6," products (s) (GPU.) : ",F20.3)')& - & ngpu*ntests,gt2 - write(psb_out_unit,'("Time per product (ms) (GPU.) : ",F20.3)')& - & gt2*1.d3/(1.d0*ntests*ngpu) - write(psb_out_unit,'("MFLOPS (GPU.) : ",F20.3)')& - & gflops/1.d6 - ! - ! This computation assumes the data movement associated with CSR: - ! it is minimal in terms of coefficients. Other formats may either move - ! more data (padding etc.) or less data (if they can save on the indices). - ! - nbytes = nr*(2*psb_sizeof_dp + psb_sizeof_ip)+& - & annz*(psb_sizeof_dp + psb_sizeof_ip) - bdwdth = ntests*nbytes/(t2*1.d6) - write(psb_out_unit,*) - write(psb_out_unit,'("MBYTES/S sust. effective bandwidth (CPU) : ",F20.3)') bdwdth - bdwdth = ngpu*ntests*nbytes/(gt2*1.d6) - write(psb_out_unit,'("MBYTES/S sust. effective bandwidth (GPU) : ",F20.3)') bdwdth -!!$ bdwdth = psb_oacc_MemoryPeakBandwidth() - write(psb_out_unit,'("MBYTES/S peak bandwidth (GPU) : ",F20.3)') bdwdth - write(psb_out_unit,'("Storage type for DESC_A: ",a)') desc_a%indxmap%get_fmt() - write(psb_out_unit,'("Total memory occupation for DESC_A: ",i12)')descsize - end if -#endif - -#ifdef CUDA - select case(psb_toupper(agfmt)) - case('ELG') - agmold => acelg - case('HLG') - agmold => achlg - case('CSRG') - agmold => accsrg - case default - write(*,*) 'Unknown format defaulting to HLG' - agmold => achlg - end select - call a%cscnv(acuda,info,mold=agmold) - if ((info /= 0).or.(psb_get_errstatus()/=0)) then - write(0,*) 'From cscnv ',info - call psb_error() - stop - end if - call desc_a%cnv(mold=igmold) - call psb_geasb(bcuda,desc_a,info,scratch=.true.,mold=vgmold) - call psb_geasb(xcuda,desc_a,info,scratch=.true.,mold=vgmold) - nr = desc_a%get_local_rows() - nrg = desc_a%get_global_rows() - call psb_geall(x0,desc_a,info) - do i=1, nr - call desc_a%l2g(i,ig,info) - x0(i) = 1.0 + (1.0*ig)/(nrg**2) - end do - call a%cscnv(aux_a,info,mold=acoo) - tcnvcsr = 0 - tcnvgpu = 0 - call psb_geall(x1,desc_a,info) - do j=1, ncnv - call aux_a%cscnv(a,info,mold=acoo) - call psb_barrier(ctxt) - t1 = psb_wtime() - call a%cscnv(info,mold=acmold) - t2 = psb_Wtime() -t1 - call psb_amx(ctxt,t2) - tcnvcsr = tcnvcsr + t2 - if (j==1) tcnvc1 = t2 - call psb_geasb(x1,desc_a,info) - call xv%bld(x0) - call psb_geasb(bv,desc_a,info,scratch=.true.) - call aux_a%cscnv(acuda,info,mold=acoo) - call xcuda%bld(x0,mold=vgmold) - call psb_geasb(bcuda,desc_a,info,scratch=.true.,mold=vgmold) - call psb_barrier(ctxt) - t1 = psb_wtime() - call acuda%cscnv(info,mold=agmold) - call psb_cuda_DeviceSync() - t2 = psb_Wtime() -t1 - call psb_amx(ctxt,t2) - if (j==1) tcnvg1 = t2 - tcnvgpu = tcnvgpu + t2 - end do - call xv%set(x0) - call psb_barrier(ctxt) - t1 = psb_wtime() - do i=1,ntests - call psb_spmm(done,a,xv,dzero,bv,desc_a,info) - end do - call psb_barrier(ctxt) - t2 = psb_wtime() - t1 - call psb_amx(ctxt,t2) - - call xcuda%set(x0) - - ! FIXME: cache flush needed here - x1 = bv%get_vect() - x2 = bcuda%get_vect() - - call psb_barrier(ctxt) - tt1 = psb_wtime() - do i=1,ntests - call psb_spmm(done,acuda,xv,dzero,bcuda,desc_a,info) - if ((info /= 0).or.(psb_get_errstatus()/=0)) then - write(0,*) 'From 1 spmm',info,i,ntests - call psb_error() - stop - end if - - end do - call psb_cuda_DeviceSync() - call psb_barrier(ctxt) - tt2 = psb_wtime() - tt1 - call psb_amx(ctxt,tt2) - x1 = bv%get_vect() - x2 = bcuda%get_vect() - nr = desc_a%get_local_rows() - eps = maxval(abs(x1(1:nr)-x2(1:nr))) - call psb_amx(ctxt,eps) - if (iam==0) write(*,*) 'Max diff on xGPU',eps - - ! FIXME: cache flush needed here - call xcuda%set(x0) - call xcuda%sync() - call psb_barrier(ctxt) - gt1 = psb_wtime() - do i=1,ntests*ngpu - call psb_spmm(done,acuda,xcuda,dzero,bcuda,desc_a,info) - ! For timing purposes we need to make sure all threads - ! in the device are done. - if ((info /= 0).or.(psb_get_errstatus()/=0)) then - write(0,*) 'From 2 spmm',info,i,ntests - call psb_error() - stop - end if - - end do - - call psb_cuda_DeviceSync() - call psb_barrier(ctxt) - gt2 = psb_wtime() - gt1 - call psb_amx(ctxt,gt2) - call bcuda%sync() - x1 = bv%get_vect() - x2 = bcuda%get_vect() - tnv = psb_genrm2(bv,desc_a,info) - tng = psb_genrm2(bcuda,desc_a,info) - tdot = psb_gedot(bcuda,bcuda,desc_a,info) - write(0,*) ' bv ',tnv,' bcuda ',tng, ' dot ',tdot,eps,& - & dnrm2(desc_a%get_local_rows(),x2,1),& - & ddot(desc_a%get_local_rows(),x1,1,x2,1) - call psb_geaxpby(-done,bcuda,+done,bv,desc_a,info) - eps = psb_geamax(bv,desc_a,info) - - call psb_amx(ctxt,t2) - eps = maxval(abs(x1(1:nr)-x2(1:nr))) - call psb_amx(ctxt,eps) - if (iam==0) write(*,*) 'Max diff on GPU',eps - if (dump) then - write(fname,'(a,i3.3,a,i3.3,a)')'XCPU-out-',iam,'-',np,'.mtx' - call mm_array_write(x1(1:nr),'Local part CPU',info,filename=fname) - write(fname,'(a,i3.3,a,i3.3,a)')'XGPU-out-',iam,'-',np,'.mtx' - call mm_array_write(x2(1:nr),'Local part GPU',info,filename=fname) - end if - - annz = a%get_nzeros() - amatsize = a%sizeof() - descsize = psb_sizeof(desc_a) - call psb_sum(ctxt,nr) - call psb_sum(ctxt,annz) - call psb_sum(ctxt,amatsize) - call psb_sum(ctxt,descsize) - - if (iam == psb_root_) then - write(psb_out_unit,& - & '("Matrix: ell1 ",i0)') idim - write(psb_out_unit,& - &'("Test on : ",i20," processors")') np - write(psb_out_unit,& - &'("Size of matrix : ",i20," ")') nr - write(psb_out_unit,& - &'("Number of nonzeros : ",i20," ")') annz - write(psb_out_unit,& - &'("Memory occupation : ",i20," ")') amatsize - flops = ntests*(2.d0*annz) - tflops = flops - gflops = flops * ngpu - write(psb_out_unit,'("Storage type for A: ",a)') a%get_fmt() - write(psb_out_unit,'("Storage type for ACUDA: ",a)') acuda%get_fmt() - write(psb_out_unit,'("Time to convert A from COO to CPU (1): ",F20.9)')& - & tcnvc1 - write(psb_out_unit,'("Time to convert A from COO to CPU (t): ",F20.9)')& - & tcnvcsr - write(psb_out_unit,'("Time to convert A from COO to CPU (a): ",F20.9)')& - & tcnvcsr/ncnv - write(psb_out_unit,'("Time to convert A from COO to GPU (1): ",F20.9)')& - & tcnvg1 - write(psb_out_unit,'("Time to convert A from COO to GPU (t): ",F20.9)')& - & tcnvgpu - write(psb_out_unit,'("Time to convert A from COO to GPU (a): ",F20.9)')& - & tcnvgpu/ncnv - write(psb_out_unit,& - & '("Number of flops (",i0," prod) : ",F20.0," ")') & - & ntests,flops - - flops = flops / (t2) - tflops = tflops / (tt2) - gflops = gflops / (gt2) - - write(psb_out_unit,'("Time for ",i6," products (s) (CPU) : ",F20.3)')& - & ntests,t2 - write(psb_out_unit,'("Time per product (ms) (CPU) : ",F20.3)')& - & t2*1.d3/(1.d0*ntests) - write(psb_out_unit,'("MFLOPS (CPU) : ",F20.3)')& - & flops/1.d6 - write(psb_out_unit,'("Time for ",i6," products (s) (xGPU) : ",F20.3)')& - & ntests, tt2 - write(psb_out_unit,'("Time per product (ms) (xGPU) : ",F20.3)')& - & tt2*1.d3/(1.d0*ntests) - write(psb_out_unit,'("MFLOPS (xGPU) : ",F20.3)')& - & tflops/1.d6 - - write(psb_out_unit,'("Time for ",i6," products (s) (GPU.) : ",F20.3)')& - & ngpu*ntests,gt2 - write(psb_out_unit,'("Time per product (ms) (GPU.) : ",F20.3)')& - & gt2*1.d3/(1.d0*ntests*ngpu) - write(psb_out_unit,'("MFLOPS (GPU.) : ",F20.3)')& - & gflops/1.d6 - ! - ! This computation assumes the data movement associated with CSR: - ! it is minimal in terms of coefficients. Other formats may either move - ! more data (padding etc.) or less data (if they can save on the indices). - ! - nbytes = nr*(2*psb_sizeof_dp + psb_sizeof_ip)+& - & annz*(psb_sizeof_dp + psb_sizeof_ip) - bdwdth = ntests*nbytes/(t2*1.d6) - write(psb_out_unit,*) - write(psb_out_unit,'("MBYTES/S sust. effective bandwidth (CPU) : ",F20.3)') bdwdth - bdwdth = ngpu*ntests*nbytes/(gt2*1.d6) - write(psb_out_unit,'("MBYTES/S sust. effective bandwidth (GPU) : ",F20.3)') bdwdth - bdwdth = psb_cuda_MemoryPeakBandwidth() - write(psb_out_unit,'("MBYTES/S peak bandwidth (GPU) : ",F20.3)') bdwdth - write(psb_out_unit,'("Storage type for DESC_A: ",a)') desc_a%indxmap%get_fmt() - write(psb_out_unit,'("Total memory occupation for DESC_A: ",i12)')descsize - - end if -#endif - -#ifdef OPENACC - call psb_oacc_exit() -#endif -#ifdef CUDA - call psb_cuda_exit() -#endif - call psb_exit(ctxt) - stop - -9999 continue - call psb_error(ctxt) - -contains - ! - ! get iteration parameters from standard input - ! - subroutine get_parms(ctxt,acfmt,agfmt,idim,tnd) - type(psb_ctxt_type) :: ctxt - character(len=*) :: agfmt, acfmt - integer :: idim - logical :: tnd - integer :: np, iam - integer :: intbuf(10), ip - - call psb_info(ctxt, iam, np) - - if (iam == 0) then - write(*,*) 'CPU side format?' - read(psb_inp_unit,*) acfmt - write(*,*) 'OACC side format?' - read(psb_inp_unit,*) agfmt - write(*,*) 'Size of discretization cube?' - read(psb_inp_unit,*) idim - write(*,*) 'Try comm/comp overlap?' - read(psb_inp_unit,*) tnd - endif - call psb_bcast(ctxt,acfmt) - call psb_bcast(ctxt,agfmt) - call psb_bcast(ctxt,idim) - call psb_bcast(ctxt,tnd) - - if (iam == 0) then - write(psb_out_unit,'("Testing matrix : ell1")') - write(psb_out_unit,'("Grid dimensions : ",i4,"x",i4,"x",i4)')idim,idim,idim - write(psb_out_unit,'("Number of processors : ",i0)')np - write(psb_out_unit,'("Data distribution : BLOCK")') - write(psb_out_unit,'(" ")') - write(psb_out_unit,'("Storage formats ",a)') acfmt,' ',agfmt - write(psb_out_unit,'("Testing overlap ND ",l8)') tnd - end if - return - - end subroutine get_parms - -end program pdgenmv From 8292608125bf405e4a56d8c09f1fb9ddf11b4f50 Mon Sep 17 00:00:00 2001 From: sfilippone Date: Fri, 31 Oct 2025 14:33:50 +0100 Subject: [PATCH 36/37] Refactor test/openacc --- test/openacc/psb_d_pde3d_mod.F90 | 517 +++++++++++++++++++++++++++++++ 1 file changed, 517 insertions(+) create mode 100644 test/openacc/psb_d_pde3d_mod.F90 diff --git a/test/openacc/psb_d_pde3d_mod.F90 b/test/openacc/psb_d_pde3d_mod.F90 new file mode 100644 index 00000000..0fc75c30 --- /dev/null +++ b/test/openacc/psb_d_pde3d_mod.F90 @@ -0,0 +1,517 @@ +module psb_d_pde3d_mod + + + use psb_base_mod, only : psb_dpk_, psb_ipk_, psb_lpk_, psb_desc_type,& + & psb_dspmat_type, psb_d_vect_type, dzero,& + & psb_d_base_sparse_mat, psb_d_base_vect_type, & + & psb_i_base_vect_type, psb_l_base_vect_type + + interface + function d_func_3d(x,y,z) result(val) + import :: psb_dpk_ + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + end function d_func_3d + end interface + + interface psb_gen_pde3d + module procedure psb_d_gen_pde3d + end interface psb_gen_pde3d + +contains + + function d_null_func_3d(x,y,z) result(val) + + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + + val = dzero + + end function d_null_func_3d + ! + ! functions parametrizing the differential equation + ! + + ! + ! Note: b1, b2 and b3 are the coefficients of the first + ! derivative of the unknown function. The default + ! we apply here is to have them zero, so that the resulting + ! matrix is symmetric/hermitian and suitable for + ! testing with CG and FCG. + ! When testing methods for non-hermitian matrices you can + ! change the B1/B2/B3 functions to e.g. done/sqrt((3*done)) + ! + function b1(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: b1 + real(psb_dpk_), intent(in) :: x,y,z + b1=done/sqrt((3*done)) + end function b1 + function b2(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: b2 + real(psb_dpk_), intent(in) :: x,y,z + b2=done/sqrt((3*done)) + end function b2 + function b3(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: b3 + real(psb_dpk_), intent(in) :: x,y,z + b3=done/sqrt((3*done)) + end function b3 + function c(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: c + real(psb_dpk_), intent(in) :: x,y,z + c=dzero + end function c + function a1(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: a1 + real(psb_dpk_), intent(in) :: x,y,z + a1=done/80 + end function a1 + function a2(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: a2 + real(psb_dpk_), intent(in) :: x,y,z + a2=done/80 + end function a2 + function a3(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: a3 + real(psb_dpk_), intent(in) :: x,y,z + a3=done/80 + end function a3 + function g(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: g + real(psb_dpk_), intent(in) :: x,y,z + g = dzero + if (x == done) then + g = done + else if (x == dzero) then + g = exp(y**2-z**2) + end if + end function g + + + ! + ! subroutine to allocate and fill in the coefficient matrix and + ! the rhs. + ! + subroutine psb_d_gen_pde3d(ctxt,idim,a,bv,xv,desc_a,afmt,info,& + & f,amold,vmold,imold,partition,nrl,iv,tnd) + use psb_base_mod + use psb_util_mod + ! + ! Discretizes the partial differential equation + ! + ! a1 dd(u) a2 dd(u) a3 dd(u) b1 d(u) b2 d(u) b3 d(u) + ! - ------ - ------ - ------ + ----- + ------ + ------ + c u = f + ! dxdx dydy dzdz dx dy dz + ! + ! with Dirichlet boundary conditions + ! u = g + ! + ! on the unit cube 0<=x,y,z<=1. + ! + ! + ! Note that if b1=b2=b3=c=0., the PDE is the Laplace equation. + ! + implicit none + integer(psb_ipk_) :: idim + type(psb_dspmat_type) :: a + type(psb_d_vect_type) :: xv,bv + type(psb_desc_type) :: desc_a + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: info + character(len=*) :: afmt + procedure(d_func_3d), optional :: f + class(psb_d_base_sparse_mat), optional :: amold + class(psb_d_base_vect_type), optional :: vmold + class(psb_i_base_vect_type), optional :: imold + integer(psb_ipk_), optional :: partition, nrl,iv(:) + logical, optional :: tnd + ! Local variables. + + integer(psb_ipk_), parameter :: nb=20 + type(psb_d_csc_sparse_mat) :: acsc + type(psb_d_coo_sparse_mat) :: acoo + type(psb_d_csr_sparse_mat) :: acsr + real(psb_dpk_) :: zt(nb),x,y,z + integer(psb_ipk_) :: nnz,nr,nlr,i,j,ii,ib,k, partition_ + integer(psb_lpk_) :: m,n,glob_row,nt + integer(psb_ipk_) :: ix,iy,iz,ia,indx_owner + ! For 3D partition + ! Note: integer control variables going directly into an MPI call + ! must be 4 bytes, i.e. psb_mpk_ + integer(psb_mpk_) :: npdims(3), npp, minfo + integer(psb_ipk_) :: npx,npy,npz, iamx,iamy,iamz,mynx,myny,mynz + integer(psb_ipk_), allocatable :: bndx(:),bndy(:),bndz(:) + ! Process grid + integer(psb_ipk_) :: np, iam + integer(psb_ipk_) :: icoeff + integer(psb_lpk_), allocatable :: irow(:),icol(:),myidx(:) + real(psb_dpk_), allocatable :: val(:) + ! deltah dimension of each grid cell + ! deltat discretization time + real(psb_dpk_) :: deltah, sqdeltah, deltah2 + real(psb_dpk_), parameter :: rhs=dzero,one=done,zero=dzero + real(psb_dpk_) :: t0, t1, t2, t3, tasb, talc, ttot, tgen, tcdasb + integer(psb_ipk_) :: err_act + procedure(d_func_3d), pointer :: f_ + logical :: tnd_ + character(len=20) :: name, ch_err,tmpfmt + + info = psb_success_ + name = 'create_matrix' + call psb_erractionsave(err_act) + + call psb_info(ctxt, iam, np) + + + if (present(f)) then + f_ => f + else + f_ => d_null_func_3d + end if + + deltah = done/(idim+2) + sqdeltah = deltah*deltah + deltah2 = (2*done)* deltah + + if (present(partition)) then + if ((1<= partition).and.(partition <= 3)) then + partition_ = partition + else + write(*,*) 'Invalid partition choice ',partition,' defaulting to 3' + partition_ = 3 + end if + else + partition_ = 3 + end if + + ! initialize array descriptor and sparse matrix storage. provide an + ! estimate of the number of non zeroes + + m = (1_psb_lpk_*idim)*idim*idim + n = m + nnz = ((n*7)/(np)) + if(iam == psb_root_) write(psb_out_unit,'("Generating Matrix (size=",i0,")...")')n + t0 = psb_wtime() + select case(partition_) + case(1) + ! A BLOCK partition + if (present(nrl)) then + nr = nrl + else + ! + ! Using a simple BLOCK distribution. + ! + nt = (m+np-1)/np + nr = max(0,min(nt,m-(iam*nt))) + end if + + nt = nr + call psb_sum(ctxt,nt) + if (nt /= m) then + write(psb_err_unit,*) iam, 'Initialization error ',nr,nt,m + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end if + + ! + ! First example of use of CDALL: specify for each process a number of + ! contiguous rows + ! + call psb_cdall(ctxt,desc_a,info,nl=nr) + myidx = desc_a%get_global_indices() + nlr = size(myidx) + + case(2) + ! A partition defined by the user through IV + + if (present(iv)) then + if (size(iv) /= m) then + write(psb_err_unit,*) iam, 'Initialization error: wrong IV size',size(iv),m + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end if + else + write(psb_err_unit,*) iam, 'Initialization error: IV not present' + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end if + + ! + ! Second example of use of CDALL: specify for each row the + ! process that owns it + ! + call psb_cdall(ctxt,desc_a,info,vg=iv) + myidx = desc_a%get_global_indices() + nlr = size(myidx) + + case(3) + ! A 3-dimensional partition + + ! A nifty MPI function will split the process list + npdims = 0 + call mpi_dims_create(np,3,npdims,info) + npx = npdims(1) + npy = npdims(2) + npz = npdims(3) + + allocate(bndx(0:npx),bndy(0:npy),bndz(0:npz)) + ! We can reuse idx2ijk for process indices as well. + call idx2ijk(iamx,iamy,iamz,iam,npx,npy,npz,base=0) + ! Now let's split the 3D cube in hexahedra + call dist1Didx(bndx,idim,npx) + mynx = bndx(iamx+1)-bndx(iamx) + call dist1Didx(bndy,idim,npy) + myny = bndy(iamy+1)-bndy(iamy) + call dist1Didx(bndz,idim,npz) + mynz = bndz(iamz+1)-bndz(iamz) + + ! How many indices do I own? + nlr = mynx*myny*mynz + allocate(myidx(nlr)) + ! Now, let's generate the list of indices I own + nr = 0 + do i=bndx(iamx),bndx(iamx+1)-1 + do j=bndy(iamy),bndy(iamy+1)-1 + do k=bndz(iamz),bndz(iamz+1)-1 + nr = nr + 1 + call ijk2idx(myidx(nr),i,j,k,idim,idim,idim) + end do + end do + end do + if (nr /= nlr) then + write(psb_err_unit,*) iam,iamx,iamy,iamz, 'Initialization error: NR vs NLR ',& + & nr,nlr,mynx,myny,mynz + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + end if + + ! + ! Third example of use of CDALL: specify for each process + ! the set of global indices it owns. + ! + call psb_cdall(ctxt,desc_a,info,vl=myidx) + + case default + write(psb_err_unit,*) iam, 'Initialization error: should not get here' + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end select + + + if (info == psb_success_) call psb_spall(a,desc_a,info,nnz=nnz,& + & dupl=psb_dupl_err_) + ! define rhs from boundary conditions; also build initial guess + if (info == psb_success_) call psb_geall(xv,desc_a,info) + if (info == psb_success_) call psb_geall(bv,desc_a,info) + + call psb_barrier(ctxt) + talc = psb_wtime()-t0 + + if (info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='allocation rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + ! we build an auxiliary matrix consisting of one row at a + ! time; just a small matrix. might be extended to generate + ! a bunch of rows per call. + ! + allocate(val(20*nb),irow(20*nb),& + &icol(20*nb),stat=info) + if (info /= psb_success_ ) then + info=psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + + ! loop over rows belonging to current process in a block + ! distribution. + + call psb_barrier(ctxt) + t1 = psb_wtime() + do ii=1, nlr,nb + ib = min(nb,nlr-ii+1) + icoeff = 1 + do k=1,ib + i=ii+k-1 + ! local matrix pointer + glob_row=myidx(i) + ! compute gridpoint coordinates + call idx2ijk(ix,iy,iz,glob_row,idim,idim,idim) + ! x, y, z coordinates + x = (ix-1)*deltah + y = (iy-1)*deltah + z = (iz-1)*deltah + zt(k) = f_(x,y,z) + ! internal point: build discretization + ! + ! term depending on (x-1,y,z) + ! + val(icoeff) = -a1(x,y,z)/sqdeltah-b1(x,y,z)/deltah2 + if (ix == 1) then + zt(k) = g(dzero,y,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix-1,iy,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x,y-1,z) + val(icoeff) = -a2(x,y,z)/sqdeltah-b2(x,y,z)/deltah2 + if (iy == 1) then + zt(k) = g(x,dzero,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy-1,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x,y,z-1) + val(icoeff)=-a3(x,y,z)/sqdeltah-b3(x,y,z)/deltah2 + if (iz == 1) then + zt(k) = g(x,y,dzero)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy,iz-1,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + ! term depending on (x,y,z) + val(icoeff)=(2*done)*(a1(x,y,z)+a2(x,y,z)+a3(x,y,z))/sqdeltah & + & + c(x,y,z) + call ijk2idx(icol(icoeff),ix,iy,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + ! term depending on (x,y,z+1) + val(icoeff)=-a3(x,y,z)/sqdeltah+b3(x,y,z)/deltah2 + if (iz == idim) then + zt(k) = g(x,y,done)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy,iz+1,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x,y+1,z) + val(icoeff)=-a2(x,y,z)/sqdeltah+b2(x,y,z)/deltah2 + if (iy == idim) then + zt(k) = g(x,done,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy+1,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x+1,y,z) + val(icoeff)=-a1(x,y,z)/sqdeltah+b1(x,y,z)/deltah2 + if (ix==idim) then + zt(k) = g(done,y,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix+1,iy,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + end do + call psb_spins(icoeff-1,irow,icol,val,a,desc_a,info) + if(info /= psb_success_) exit + call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),bv,desc_a,info) + if(info /= psb_success_) exit + zt(:)=dzero + call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),xv,desc_a,info) + if(info /= psb_success_) exit + end do + + tgen = psb_wtime()-t1 + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='insert rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + deallocate(val,irow,icol) + + call psb_barrier(ctxt) + t1 = psb_wtime() + call psb_cdasb(desc_a,info,mold=imold) + tcdasb = psb_wtime()-t1 + call psb_barrier(ctxt) + t1 = psb_wtime() + if (info == psb_success_) then + if (present(amold)) then + call psb_spasb(a,desc_a,info,mold=amold,bld_and=tnd) + else + call psb_spasb(a,desc_a,info,afmt=afmt,bld_and=tnd) + end if + end if + call psb_barrier(ctxt) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='asb rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + if (info == psb_success_) call psb_geasb(xv,desc_a,info,mold=vmold) + if (info == psb_success_) call psb_geasb(bv,desc_a,info,mold=vmold) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='asb rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + tasb = psb_wtime()-t1 + call psb_barrier(ctxt) + ttot = psb_wtime() - t0 + + call psb_amx(ctxt,talc) + call psb_amx(ctxt,tgen) + call psb_amx(ctxt,tasb) + call psb_amx(ctxt,ttot) + if(iam == psb_root_) then + tmpfmt = a%get_fmt() + write(psb_out_unit,'("The matrix has been generated and assembled in ",a3," format.")')& + & tmpfmt + write(psb_out_unit,'("-allocation time : ",es12.5)') talc + write(psb_out_unit,'("-coeff. gen. time : ",es12.5)') tgen + write(psb_out_unit,'("-desc asbly time : ",es12.5)') tcdasb + write(psb_out_unit,'("- mat asbly time : ",es12.5)') tasb + write(psb_out_unit,'("-total time : ",es12.5)') ttot + + end if + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psb_d_gen_pde3d + + +end module psb_d_pde3d_mod + + From 3c791b537037b14ca41bd648eefad6bacf85e450 Mon Sep 17 00:00:00 2001 From: sfilippone Date: Fri, 14 Nov 2025 10:55:29 +0100 Subject: [PATCH 37/37] Fixed file renamed into CMakeLists --- base/CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/base/CMakeLists.txt b/base/CMakeLists.txt index c2b1fe8f..b7a7d22c 100644 --- a/base/CMakeLists.txt +++ b/base/CMakeLists.txt @@ -272,7 +272,7 @@ set(PSB_base_source_files tools/psb_zsprn.f90 tools/psb_get_overlap.f90 serial/psb_crwextd.f90 - serial/psb_zspspmm.f90 + serial/psb_zspspmm.F90 serial/psb_drwextd.f90 serial/psb_dnumbmm.f90 serial/psb_damax_s.f90 @@ -343,14 +343,14 @@ set(PSB_base_source_files serial/psb_dsymbmm.f90 serial/psb_samax_s.f90 serial/psb_lsame.f90 - serial/psb_dspspmm.f90 + serial/psb_dspspmm.F90 serial/psb_ssymbmm.f90 serial/psb_cgeprt.f90 serial/psb_sgeprt.f90 # serial/psi_i2_serial_impl.F90 serial/psi_e_serial_impl.F90 serial/psb_zsymbmm.f90 - serial/psb_cspspmm.f90 + serial/psb_cspspmm.F90 serial/psb_aspxpby.f90 serial/psi_s_serial_impl.F90 serial/psb_zamax_s.f90 @@ -359,7 +359,7 @@ set(PSB_base_source_files serial/psb_casum_s.f90 serial/psi_d_serial_impl.F90 serial/psi_c_serial_impl.F90 - serial/psb_sspspmm.f90 + serial/psb_sspspmm.F90 serial/psb_cnumbmm.f90 psblas/psb_damax.f90 psblas/psb_dspmm.f90