diff --git a/base/modules/serial/psb_c_csc_mat_mod.f90 b/base/modules/serial/psb_c_csc_mat_mod.f90 index 2bb7982c..871cb3b5 100644 --- a/base/modules/serial/psb_c_csc_mat_mod.f90 +++ b/base/modules/serial/psb_c_csc_mat_mod.f90 @@ -87,6 +87,7 @@ module psb_c_csc_mat_mod procedure, pass(a) :: mv_from_coo => psb_c_mv_csc_from_coo procedure, pass(a) :: mv_to_fmt => psb_c_mv_csc_to_fmt procedure, pass(a) :: mv_from_fmt => psb_c_mv_csc_from_fmt + procedure, pass(a) :: clean_zeros => psb_c_csc_clean_zeros procedure, pass(a) :: csput_a => psb_c_csc_csput_a procedure, pass(a) :: get_diag => psb_c_csc_get_diag procedure, pass(a) :: csgetptn => psb_c_csc_csgetptn @@ -256,6 +257,19 @@ module psb_c_csc_mat_mod end subroutine psb_c_mv_csc_from_fmt end interface + ! + !> + !! \memberof psb_c_csc_sparse_mat + !! \see psb_c_base_mat_mod::psb_c_base_clean_zeros + ! + interface + subroutine psb_c_csc_clean_zeros(a, info) + import :: psb_ipk_, psb_c_csc_sparse_mat + class(psb_c_csc_sparse_mat), intent(inout) :: a + integer(psb_ipk_), intent(out) :: info + end subroutine psb_c_csc_clean_zeros + end interface + !> \memberof psb_c_csc_sparse_mat !! \see psb_c_base_mat_mod::psb_c_base_cp_from interface diff --git a/base/modules/serial/psb_c_csr_mat_mod.f90 b/base/modules/serial/psb_c_csr_mat_mod.f90 index af4f3165..7452d5aa 100644 --- a/base/modules/serial/psb_c_csr_mat_mod.f90 +++ b/base/modules/serial/psb_c_csr_mat_mod.f90 @@ -90,6 +90,7 @@ module psb_c_csr_mat_mod procedure, pass(a) :: mv_from_coo => psb_c_mv_csr_from_coo procedure, pass(a) :: mv_to_fmt => psb_c_mv_csr_to_fmt procedure, pass(a) :: mv_from_fmt => psb_c_mv_csr_from_fmt + procedure, pass(a) :: clean_zeros => psb_c_csr_clean_zeros procedure, pass(a) :: csput_a => psb_c_csr_csput_a procedure, pass(a) :: get_diag => psb_c_csr_get_diag procedure, pass(a) :: csgetptn => psb_c_csr_csgetptn @@ -259,6 +260,19 @@ module psb_c_csr_mat_mod end subroutine psb_c_csr_triu end interface + ! + !> + !! \memberof psb_c_csr_sparse_mat + !! \see psb_c_base_mat_mod::psb_c_base_clean_zeros + ! + interface + subroutine psb_c_csr_clean_zeros(a, info) + import :: psb_ipk_, psb_c_csr_sparse_mat + class(psb_c_csr_sparse_mat), intent(inout) :: a + integer(psb_ipk_), intent(out) :: info + end subroutine psb_c_csr_clean_zeros + end interface + !> \memberof psb_c_csr_sparse_mat !! \see psb_c_base_mat_mod::psb_c_base_cp_to_coo diff --git a/base/modules/serial/psb_d_csc_mat_mod.f90 b/base/modules/serial/psb_d_csc_mat_mod.f90 index 7e4d555c..cc917ef9 100644 --- a/base/modules/serial/psb_d_csc_mat_mod.f90 +++ b/base/modules/serial/psb_d_csc_mat_mod.f90 @@ -87,6 +87,7 @@ module psb_d_csc_mat_mod procedure, pass(a) :: mv_from_coo => psb_d_mv_csc_from_coo procedure, pass(a) :: mv_to_fmt => psb_d_mv_csc_to_fmt procedure, pass(a) :: mv_from_fmt => psb_d_mv_csc_from_fmt + procedure, pass(a) :: clean_zeros => psb_d_csc_clean_zeros procedure, pass(a) :: csput_a => psb_d_csc_csput_a procedure, pass(a) :: get_diag => psb_d_csc_get_diag procedure, pass(a) :: csgetptn => psb_d_csc_csgetptn @@ -256,6 +257,19 @@ module psb_d_csc_mat_mod end subroutine psb_d_mv_csc_from_fmt end interface + ! + !> + !! \memberof psb_d_csc_sparse_mat + !! \see psb_d_base_mat_mod::psb_d_base_clean_zeros + ! + interface + subroutine psb_d_csc_clean_zeros(a, info) + import :: psb_ipk_, psb_d_csc_sparse_mat + class(psb_d_csc_sparse_mat), intent(inout) :: a + integer(psb_ipk_), intent(out) :: info + end subroutine psb_d_csc_clean_zeros + end interface + !> \memberof psb_d_csc_sparse_mat !! \see psb_d_base_mat_mod::psb_d_base_cp_from interface diff --git a/base/modules/serial/psb_d_csr_mat_mod.f90 b/base/modules/serial/psb_d_csr_mat_mod.f90 index 8ba73b15..ae5ddfd3 100644 --- a/base/modules/serial/psb_d_csr_mat_mod.f90 +++ b/base/modules/serial/psb_d_csr_mat_mod.f90 @@ -90,6 +90,7 @@ module psb_d_csr_mat_mod procedure, pass(a) :: mv_from_coo => psb_d_mv_csr_from_coo procedure, pass(a) :: mv_to_fmt => psb_d_mv_csr_to_fmt procedure, pass(a) :: mv_from_fmt => psb_d_mv_csr_from_fmt + procedure, pass(a) :: clean_zeros => psb_d_csr_clean_zeros procedure, pass(a) :: csput_a => psb_d_csr_csput_a procedure, pass(a) :: get_diag => psb_d_csr_get_diag procedure, pass(a) :: csgetptn => psb_d_csr_csgetptn @@ -259,6 +260,19 @@ module psb_d_csr_mat_mod end subroutine psb_d_csr_triu end interface + ! + !> + !! \memberof psb_d_csr_sparse_mat + !! \see psb_d_base_mat_mod::psb_d_base_clean_zeros + ! + interface + subroutine psb_d_csr_clean_zeros(a, info) + import :: psb_ipk_, psb_d_csr_sparse_mat + class(psb_d_csr_sparse_mat), intent(inout) :: a + integer(psb_ipk_), intent(out) :: info + end subroutine psb_d_csr_clean_zeros + end interface + !> \memberof psb_d_csr_sparse_mat !! \see psb_d_base_mat_mod::psb_d_base_cp_to_coo diff --git a/base/modules/serial/psb_s_csc_mat_mod.f90 b/base/modules/serial/psb_s_csc_mat_mod.f90 index 9e936153..7a636f58 100644 --- a/base/modules/serial/psb_s_csc_mat_mod.f90 +++ b/base/modules/serial/psb_s_csc_mat_mod.f90 @@ -87,6 +87,7 @@ module psb_s_csc_mat_mod procedure, pass(a) :: mv_from_coo => psb_s_mv_csc_from_coo procedure, pass(a) :: mv_to_fmt => psb_s_mv_csc_to_fmt procedure, pass(a) :: mv_from_fmt => psb_s_mv_csc_from_fmt + procedure, pass(a) :: clean_zeros => psb_s_csc_clean_zeros procedure, pass(a) :: csput_a => psb_s_csc_csput_a procedure, pass(a) :: get_diag => psb_s_csc_get_diag procedure, pass(a) :: csgetptn => psb_s_csc_csgetptn @@ -256,6 +257,19 @@ module psb_s_csc_mat_mod end subroutine psb_s_mv_csc_from_fmt end interface + ! + !> + !! \memberof psb_s_csc_sparse_mat + !! \see psb_s_base_mat_mod::psb_s_base_clean_zeros + ! + interface + subroutine psb_s_csc_clean_zeros(a, info) + import :: psb_ipk_, psb_s_csc_sparse_mat + class(psb_s_csc_sparse_mat), intent(inout) :: a + integer(psb_ipk_), intent(out) :: info + end subroutine psb_s_csc_clean_zeros + end interface + !> \memberof psb_s_csc_sparse_mat !! \see psb_s_base_mat_mod::psb_s_base_cp_from interface diff --git a/base/modules/serial/psb_s_csr_mat_mod.f90 b/base/modules/serial/psb_s_csr_mat_mod.f90 index 2266ff50..e48fb7c1 100644 --- a/base/modules/serial/psb_s_csr_mat_mod.f90 +++ b/base/modules/serial/psb_s_csr_mat_mod.f90 @@ -90,6 +90,7 @@ module psb_s_csr_mat_mod procedure, pass(a) :: mv_from_coo => psb_s_mv_csr_from_coo procedure, pass(a) :: mv_to_fmt => psb_s_mv_csr_to_fmt procedure, pass(a) :: mv_from_fmt => psb_s_mv_csr_from_fmt + procedure, pass(a) :: clean_zeros => psb_s_csr_clean_zeros procedure, pass(a) :: csput_a => psb_s_csr_csput_a procedure, pass(a) :: get_diag => psb_s_csr_get_diag procedure, pass(a) :: csgetptn => psb_s_csr_csgetptn @@ -259,6 +260,19 @@ module psb_s_csr_mat_mod end subroutine psb_s_csr_triu end interface + ! + !> + !! \memberof psb_s_csr_sparse_mat + !! \see psb_s_base_mat_mod::psb_s_base_clean_zeros + ! + interface + subroutine psb_s_csr_clean_zeros(a, info) + import :: psb_ipk_, psb_s_csr_sparse_mat + class(psb_s_csr_sparse_mat), intent(inout) :: a + integer(psb_ipk_), intent(out) :: info + end subroutine psb_s_csr_clean_zeros + end interface + !> \memberof psb_s_csr_sparse_mat !! \see psb_s_base_mat_mod::psb_s_base_cp_to_coo diff --git a/base/modules/serial/psb_z_csc_mat_mod.f90 b/base/modules/serial/psb_z_csc_mat_mod.f90 index 4c7e050d..bbc3c456 100644 --- a/base/modules/serial/psb_z_csc_mat_mod.f90 +++ b/base/modules/serial/psb_z_csc_mat_mod.f90 @@ -87,6 +87,7 @@ module psb_z_csc_mat_mod procedure, pass(a) :: mv_from_coo => psb_z_mv_csc_from_coo procedure, pass(a) :: mv_to_fmt => psb_z_mv_csc_to_fmt procedure, pass(a) :: mv_from_fmt => psb_z_mv_csc_from_fmt + procedure, pass(a) :: clean_zeros => psb_z_csc_clean_zeros procedure, pass(a) :: csput_a => psb_z_csc_csput_a procedure, pass(a) :: get_diag => psb_z_csc_get_diag procedure, pass(a) :: csgetptn => psb_z_csc_csgetptn @@ -256,6 +257,19 @@ module psb_z_csc_mat_mod end subroutine psb_z_mv_csc_from_fmt end interface + ! + !> + !! \memberof psb_z_csc_sparse_mat + !! \see psb_z_base_mat_mod::psb_z_base_clean_zeros + ! + interface + subroutine psb_z_csc_clean_zeros(a, info) + import :: psb_ipk_, psb_z_csc_sparse_mat + class(psb_z_csc_sparse_mat), intent(inout) :: a + integer(psb_ipk_), intent(out) :: info + end subroutine psb_z_csc_clean_zeros + end interface + !> \memberof psb_z_csc_sparse_mat !! \see psb_z_base_mat_mod::psb_z_base_cp_from interface diff --git a/base/modules/serial/psb_z_csr_mat_mod.f90 b/base/modules/serial/psb_z_csr_mat_mod.f90 index 7dc58c04..8312d960 100644 --- a/base/modules/serial/psb_z_csr_mat_mod.f90 +++ b/base/modules/serial/psb_z_csr_mat_mod.f90 @@ -90,6 +90,7 @@ module psb_z_csr_mat_mod procedure, pass(a) :: mv_from_coo => psb_z_mv_csr_from_coo procedure, pass(a) :: mv_to_fmt => psb_z_mv_csr_to_fmt procedure, pass(a) :: mv_from_fmt => psb_z_mv_csr_from_fmt + procedure, pass(a) :: clean_zeros => psb_z_csr_clean_zeros procedure, pass(a) :: csput_a => psb_z_csr_csput_a procedure, pass(a) :: get_diag => psb_z_csr_get_diag procedure, pass(a) :: csgetptn => psb_z_csr_csgetptn @@ -259,6 +260,19 @@ module psb_z_csr_mat_mod end subroutine psb_z_csr_triu end interface + ! + !> + !! \memberof psb_z_csr_sparse_mat + !! \see psb_z_base_mat_mod::psb_z_base_clean_zeros + ! + interface + subroutine psb_z_csr_clean_zeros(a, info) + import :: psb_ipk_, psb_z_csr_sparse_mat + class(psb_z_csr_sparse_mat), intent(inout) :: a + integer(psb_ipk_), intent(out) :: info + end subroutine psb_z_csr_clean_zeros + end interface + !> \memberof psb_z_csr_sparse_mat !! \see psb_z_base_mat_mod::psb_z_base_cp_to_coo diff --git a/base/serial/impl/psb_c_csc_impl.f90 b/base/serial/impl/psb_c_csc_impl.f90 index 4e76fe2b..b74f36ae 100644 --- a/base/serial/impl/psb_c_csc_impl.f90 +++ b/base/serial/impl/psb_c_csc_impl.f90 @@ -2489,6 +2489,35 @@ subroutine psb_c_cp_csc_from_fmt(a,b,info) end subroutine psb_c_cp_csc_from_fmt +subroutine psb_c_csc_clean_zeros(a, info) + use psb_error_mod + use psb_c_csc_mat_mod, psb_protect_name => psb_c_csc_clean_zeros + implicit none + class(psb_c_csc_sparse_mat), intent(inout) :: a + integer(psb_ipk_) :: info + ! + integer(psb_ipk_) :: i, j, k, nc + integer(psb_ipk_), allocatable :: ilcp(:) + + info = 0 + nc = a%get_ncols() + ilcp = a%icp(:) + a%icp(1) = 1 + j = a%icp(1) + do i=1, nc + do k = ilcp(i), ilcp(i+1) -1 + if (a%val(k) /= czero) then + a%val(j) = a%val(k) + a%ia(j) = a%ia(k) + j = j + 1 + end if + end do + a%icp(i+1) = j + end do + call a%trim() +end subroutine psb_c_csc_clean_zeros + + subroutine psb_c_csc_mold(a,b,info) use psb_c_csc_mat_mod, psb_protect_name => psb_c_csc_mold use psb_error_mod diff --git a/base/serial/impl/psb_c_csr_impl.f90 b/base/serial/impl/psb_c_csr_impl.f90 index bb0d5309..dc126352 100644 --- a/base/serial/impl/psb_c_csr_impl.f90 +++ b/base/serial/impl/psb_c_csr_impl.f90 @@ -3321,6 +3321,34 @@ subroutine psb_c_cp_csr_from_fmt(a,b,info) end select end subroutine psb_c_cp_csr_from_fmt +subroutine psb_c_csr_clean_zeros(a, info) + use psb_error_mod + use psb_c_csr_mat_mod, psb_protect_name => psb_c_csr_clean_zeros + implicit none + class(psb_c_csr_sparse_mat), intent(inout) :: a + integer(psb_ipk_) :: info + ! + integer(psb_ipk_) :: i, j, k, nr + integer(psb_ipk_), allocatable :: ilrp(:) + + info = 0 + nr = a%get_nrows() + ilrp = a%irp(:) + a%irp(1) = 1 + j = a%irp(1) + do i=1, nr + do k = ilrp(i), ilrp(i+1) -1 + if (a%val(k) /= czero) then + a%val(j) = a%val(k) + a%ja(j) = a%ja(k) + j = j + 1 + end if + end do + a%irp(i+1) = j + end do + call a%trim() +end subroutine psb_c_csr_clean_zeros + subroutine psb_ccsrspspmm(a,b,c,info) use psb_c_mat_mod use psb_serial_mod, psb_protect_name => psb_ccsrspspmm diff --git a/base/serial/impl/psb_d_csc_impl.f90 b/base/serial/impl/psb_d_csc_impl.f90 index 4b46bc9a..d988d2d3 100644 --- a/base/serial/impl/psb_d_csc_impl.f90 +++ b/base/serial/impl/psb_d_csc_impl.f90 @@ -2489,6 +2489,35 @@ subroutine psb_d_cp_csc_from_fmt(a,b,info) end subroutine psb_d_cp_csc_from_fmt +subroutine psb_d_csc_clean_zeros(a, info) + use psb_error_mod + use psb_d_csc_mat_mod, psb_protect_name => psb_d_csc_clean_zeros + implicit none + class(psb_d_csc_sparse_mat), intent(inout) :: a + integer(psb_ipk_) :: info + ! + integer(psb_ipk_) :: i, j, k, nc + integer(psb_ipk_), allocatable :: ilcp(:) + + info = 0 + nc = a%get_ncols() + ilcp = a%icp(:) + a%icp(1) = 1 + j = a%icp(1) + do i=1, nc + do k = ilcp(i), ilcp(i+1) -1 + if (a%val(k) /= dzero) then + a%val(j) = a%val(k) + a%ia(j) = a%ia(k) + j = j + 1 + end if + end do + a%icp(i+1) = j + end do + call a%trim() +end subroutine psb_d_csc_clean_zeros + + subroutine psb_d_csc_mold(a,b,info) use psb_d_csc_mat_mod, psb_protect_name => psb_d_csc_mold use psb_error_mod diff --git a/base/serial/impl/psb_d_csr_impl.f90 b/base/serial/impl/psb_d_csr_impl.f90 index 868f0fe6..bc91e06a 100644 --- a/base/serial/impl/psb_d_csr_impl.f90 +++ b/base/serial/impl/psb_d_csr_impl.f90 @@ -3321,6 +3321,34 @@ subroutine psb_d_cp_csr_from_fmt(a,b,info) end select end subroutine psb_d_cp_csr_from_fmt +subroutine psb_d_csr_clean_zeros(a, info) + use psb_error_mod + use psb_d_csr_mat_mod, psb_protect_name => psb_d_csr_clean_zeros + implicit none + class(psb_d_csr_sparse_mat), intent(inout) :: a + integer(psb_ipk_) :: info + ! + integer(psb_ipk_) :: i, j, k, nr + integer(psb_ipk_), allocatable :: ilrp(:) + + info = 0 + nr = a%get_nrows() + ilrp = a%irp(:) + a%irp(1) = 1 + j = a%irp(1) + do i=1, nr + do k = ilrp(i), ilrp(i+1) -1 + if (a%val(k) /= dzero) then + a%val(j) = a%val(k) + a%ja(j) = a%ja(k) + j = j + 1 + end if + end do + a%irp(i+1) = j + end do + call a%trim() +end subroutine psb_d_csr_clean_zeros + subroutine psb_dcsrspspmm(a,b,c,info) use psb_d_mat_mod use psb_serial_mod, psb_protect_name => psb_dcsrspspmm diff --git a/base/serial/impl/psb_s_csc_impl.f90 b/base/serial/impl/psb_s_csc_impl.f90 index bf3fa900..2b976798 100644 --- a/base/serial/impl/psb_s_csc_impl.f90 +++ b/base/serial/impl/psb_s_csc_impl.f90 @@ -2489,6 +2489,35 @@ subroutine psb_s_cp_csc_from_fmt(a,b,info) end subroutine psb_s_cp_csc_from_fmt +subroutine psb_s_csc_clean_zeros(a, info) + use psb_error_mod + use psb_s_csc_mat_mod, psb_protect_name => psb_s_csc_clean_zeros + implicit none + class(psb_s_csc_sparse_mat), intent(inout) :: a + integer(psb_ipk_) :: info + ! + integer(psb_ipk_) :: i, j, k, nc + integer(psb_ipk_), allocatable :: ilcp(:) + + info = 0 + nc = a%get_ncols() + ilcp = a%icp(:) + a%icp(1) = 1 + j = a%icp(1) + do i=1, nc + do k = ilcp(i), ilcp(i+1) -1 + if (a%val(k) /= szero) then + a%val(j) = a%val(k) + a%ia(j) = a%ia(k) + j = j + 1 + end if + end do + a%icp(i+1) = j + end do + call a%trim() +end subroutine psb_s_csc_clean_zeros + + subroutine psb_s_csc_mold(a,b,info) use psb_s_csc_mat_mod, psb_protect_name => psb_s_csc_mold use psb_error_mod diff --git a/base/serial/impl/psb_s_csr_impl.f90 b/base/serial/impl/psb_s_csr_impl.f90 index 9a537360..b257bd64 100644 --- a/base/serial/impl/psb_s_csr_impl.f90 +++ b/base/serial/impl/psb_s_csr_impl.f90 @@ -3321,6 +3321,34 @@ subroutine psb_s_cp_csr_from_fmt(a,b,info) end select end subroutine psb_s_cp_csr_from_fmt +subroutine psb_s_csr_clean_zeros(a, info) + use psb_error_mod + use psb_s_csr_mat_mod, psb_protect_name => psb_s_csr_clean_zeros + implicit none + class(psb_s_csr_sparse_mat), intent(inout) :: a + integer(psb_ipk_) :: info + ! + integer(psb_ipk_) :: i, j, k, nr + integer(psb_ipk_), allocatable :: ilrp(:) + + info = 0 + nr = a%get_nrows() + ilrp = a%irp(:) + a%irp(1) = 1 + j = a%irp(1) + do i=1, nr + do k = ilrp(i), ilrp(i+1) -1 + if (a%val(k) /= szero) then + a%val(j) = a%val(k) + a%ja(j) = a%ja(k) + j = j + 1 + end if + end do + a%irp(i+1) = j + end do + call a%trim() +end subroutine psb_s_csr_clean_zeros + subroutine psb_scsrspspmm(a,b,c,info) use psb_s_mat_mod use psb_serial_mod, psb_protect_name => psb_scsrspspmm diff --git a/base/serial/impl/psb_z_csc_impl.f90 b/base/serial/impl/psb_z_csc_impl.f90 index 1abf68d3..b9c5898b 100644 --- a/base/serial/impl/psb_z_csc_impl.f90 +++ b/base/serial/impl/psb_z_csc_impl.f90 @@ -2489,6 +2489,35 @@ subroutine psb_z_cp_csc_from_fmt(a,b,info) end subroutine psb_z_cp_csc_from_fmt +subroutine psb_z_csc_clean_zeros(a, info) + use psb_error_mod + use psb_z_csc_mat_mod, psb_protect_name => psb_z_csc_clean_zeros + implicit none + class(psb_z_csc_sparse_mat), intent(inout) :: a + integer(psb_ipk_) :: info + ! + integer(psb_ipk_) :: i, j, k, nc + integer(psb_ipk_), allocatable :: ilcp(:) + + info = 0 + nc = a%get_ncols() + ilcp = a%icp(:) + a%icp(1) = 1 + j = a%icp(1) + do i=1, nc + do k = ilcp(i), ilcp(i+1) -1 + if (a%val(k) /= zzero) then + a%val(j) = a%val(k) + a%ia(j) = a%ia(k) + j = j + 1 + end if + end do + a%icp(i+1) = j + end do + call a%trim() +end subroutine psb_z_csc_clean_zeros + + subroutine psb_z_csc_mold(a,b,info) use psb_z_csc_mat_mod, psb_protect_name => psb_z_csc_mold use psb_error_mod diff --git a/base/serial/impl/psb_z_csr_impl.f90 b/base/serial/impl/psb_z_csr_impl.f90 index 502b7c5b..24cc1509 100644 --- a/base/serial/impl/psb_z_csr_impl.f90 +++ b/base/serial/impl/psb_z_csr_impl.f90 @@ -3321,6 +3321,34 @@ subroutine psb_z_cp_csr_from_fmt(a,b,info) end select end subroutine psb_z_cp_csr_from_fmt +subroutine psb_z_csr_clean_zeros(a, info) + use psb_error_mod + use psb_z_csr_mat_mod, psb_protect_name => psb_z_csr_clean_zeros + implicit none + class(psb_z_csr_sparse_mat), intent(inout) :: a + integer(psb_ipk_) :: info + ! + integer(psb_ipk_) :: i, j, k, nr + integer(psb_ipk_), allocatable :: ilrp(:) + + info = 0 + nr = a%get_nrows() + ilrp = a%irp(:) + a%irp(1) = 1 + j = a%irp(1) + do i=1, nr + do k = ilrp(i), ilrp(i+1) -1 + if (a%val(k) /= zzero) then + a%val(j) = a%val(k) + a%ja(j) = a%ja(k) + j = j + 1 + end if + end do + a%irp(i+1) = j + end do + call a%trim() +end subroutine psb_z_csr_clean_zeros + subroutine psb_zcsrspspmm(a,b,c,info) use psb_z_mat_mod use psb_serial_mod, psb_protect_name => psb_zcsrspspmm