From e5535835ec9fff44a82cc3931805a61fea28afc1 Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Sun, 31 Mar 2019 12:01:19 +0100 Subject: [PATCH] Implement clean_zeros for CSC and CSR --- base/modules/serial/psb_c_csc_mat_mod.f90 | 33 +++++++++++- base/modules/serial/psb_c_csr_mat_mod.f90 | 29 +++++++++++ base/modules/serial/psb_d_csc_mat_mod.f90 | 33 +++++++++++- base/modules/serial/psb_d_csr_mat_mod.f90 | 29 +++++++++++ base/modules/serial/psb_s_csc_mat_mod.f90 | 33 +++++++++++- base/modules/serial/psb_s_csr_mat_mod.f90 | 29 +++++++++++ base/modules/serial/psb_z_csc_mat_mod.f90 | 33 +++++++++++- base/modules/serial/psb_z_csr_mat_mod.f90 | 29 +++++++++++ base/serial/impl/psb_c_csc_impl.f90 | 60 +++++++++++++++++++++- base/serial/impl/psb_c_csr_impl.f90 | 61 +++++++++++++++++++++++ base/serial/impl/psb_d_csc_impl.f90 | 60 +++++++++++++++++++++- base/serial/impl/psb_d_csr_impl.f90 | 61 +++++++++++++++++++++++ base/serial/impl/psb_s_csc_impl.f90 | 60 +++++++++++++++++++++- base/serial/impl/psb_s_csr_impl.f90 | 61 +++++++++++++++++++++++ base/serial/impl/psb_z_csc_impl.f90 | 60 +++++++++++++++++++++- base/serial/impl/psb_z_csr_impl.f90 | 61 +++++++++++++++++++++++ 16 files changed, 720 insertions(+), 12 deletions(-) diff --git a/base/modules/serial/psb_c_csc_mat_mod.f90 b/base/modules/serial/psb_c_csc_mat_mod.f90 index 47256546..62f79c7b 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 @@ -142,10 +143,11 @@ module psb_c_csc_mat_mod procedure, pass(a) :: mv_from_coo => psb_lc_mv_csc_from_coo procedure, pass(a) :: mv_to_fmt => psb_lc_mv_csc_to_fmt procedure, pass(a) :: mv_from_fmt => psb_lc_mv_csc_from_fmt - procedure, pass(a) :: csput_a => psb_lc_csc_csput_a + procedure, pass(a) :: clean_zeros => psb_lc_csc_clean_zeros + procedure, pass(a) :: csput_a => psb_lc_csc_csput_a procedure, pass(a) :: get_diag => psb_lc_csc_get_diag procedure, pass(a) :: csgetptn => psb_lc_csc_csgetptn - procedure, pass(a) :: csgetrow => psb_lc_csc_csgetrow + procedure, pass(a) :: csgetrow => psb_lc_csc_csgetrow procedure, pass(a) :: get_nz_col => lc_csc_get_nz_col procedure, pass(a) :: reinit => psb_lc_csc_reinit procedure, pass(a) :: trim => psb_lc_csc_trim @@ -311,6 +313,20 @@ 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 + 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 @@ -702,6 +718,19 @@ module psb_c_csc_mat_mod end subroutine psb_lc_mv_csc_from_fmt end interface + ! + !> + !! \memberof psb_lc_csc_sparse_mat + !! \see psb_lc_base_mat_mod::psb_lc_base_clean_zeros + ! + interface + subroutine psb_lc_csc_clean_zeros(a, info) + import + class(psb_lc_csc_sparse_mat), intent(inout) :: a + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lc_csc_clean_zeros + end interface + !> \memberof psb_lc_csc_sparse_mat !! \see psb_lc_base_mat_mod::psb_lc_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 9d72a770..5e502eba 100644 --- a/base/modules/serial/psb_c_csr_mat_mod.f90 +++ b/base/modules/serial/psb_c_csr_mat_mod.f90 @@ -1,3 +1,4 @@ + ! ! Parallel Sparse BLAS version 3.5 ! (C) Copyright 2006-2018 @@ -90,6 +91,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 +261,18 @@ 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 + 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 @@ -599,6 +613,7 @@ module psb_c_csr_mat_mod procedure, pass(a) :: mv_from_coo => psb_lc_mv_csr_from_coo procedure, pass(a) :: mv_to_fmt => psb_lc_mv_csr_to_fmt procedure, pass(a) :: mv_from_fmt => psb_lc_mv_csr_from_fmt + procedure, pass(a) :: clean_zeros => psb_lc_csr_clean_zeros procedure, pass(a) :: csput_a => psb_lc_csr_csput_a procedure, pass(a) :: get_diag => psb_lc_csr_get_diag procedure, pass(a) :: csgetptn => psb_lc_csr_csgetptn @@ -775,7 +790,21 @@ module psb_c_csr_mat_mod class(psb_lc_coo_sparse_mat), optional, intent(out) :: l end subroutine psb_lc_csr_triu end interface + + ! + !> + !! \memberof psb_lc_csr_sparse_mat + !! \see psb_lc_base_mat_mod::psb_lc_base_clean_zeros + ! + interface + subroutine psb_lc_csr_clean_zeros(a, info) + import + class(psb_lc_csr_sparse_mat), intent(inout) :: a + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lc_csr_clean_zeros + end interface + !> \memberof psb_lc_csr_sparse_mat !! \see psb_lc_base_mat_mod::psb_lc_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 8d67e09a..9ab0c2fc 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 @@ -142,10 +143,11 @@ module psb_d_csc_mat_mod procedure, pass(a) :: mv_from_coo => psb_ld_mv_csc_from_coo procedure, pass(a) :: mv_to_fmt => psb_ld_mv_csc_to_fmt procedure, pass(a) :: mv_from_fmt => psb_ld_mv_csc_from_fmt - procedure, pass(a) :: csput_a => psb_ld_csc_csput_a + procedure, pass(a) :: clean_zeros => psb_ld_csc_clean_zeros + procedure, pass(a) :: csput_a => psb_ld_csc_csput_a procedure, pass(a) :: get_diag => psb_ld_csc_get_diag procedure, pass(a) :: csgetptn => psb_ld_csc_csgetptn - procedure, pass(a) :: csgetrow => psb_ld_csc_csgetrow + procedure, pass(a) :: csgetrow => psb_ld_csc_csgetrow procedure, pass(a) :: get_nz_col => ld_csc_get_nz_col procedure, pass(a) :: reinit => psb_ld_csc_reinit procedure, pass(a) :: trim => psb_ld_csc_trim @@ -311,6 +313,20 @@ 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 + 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 @@ -702,6 +718,19 @@ module psb_d_csc_mat_mod end subroutine psb_ld_mv_csc_from_fmt end interface + ! + !> + !! \memberof psb_ld_csc_sparse_mat + !! \see psb_ld_base_mat_mod::psb_ld_base_clean_zeros + ! + interface + subroutine psb_ld_csc_clean_zeros(a, info) + import + class(psb_ld_csc_sparse_mat), intent(inout) :: a + integer(psb_ipk_), intent(out) :: info + end subroutine psb_ld_csc_clean_zeros + end interface + !> \memberof psb_ld_csc_sparse_mat !! \see psb_ld_base_mat_mod::psb_ld_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 ce4b3e7c..c84ee4f2 100644 --- a/base/modules/serial/psb_d_csr_mat_mod.f90 +++ b/base/modules/serial/psb_d_csr_mat_mod.f90 @@ -1,3 +1,4 @@ + ! ! Parallel Sparse BLAS version 3.5 ! (C) Copyright 2006-2018 @@ -90,6 +91,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 +261,18 @@ 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 + 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 @@ -599,6 +613,7 @@ module psb_d_csr_mat_mod procedure, pass(a) :: mv_from_coo => psb_ld_mv_csr_from_coo procedure, pass(a) :: mv_to_fmt => psb_ld_mv_csr_to_fmt procedure, pass(a) :: mv_from_fmt => psb_ld_mv_csr_from_fmt + procedure, pass(a) :: clean_zeros => psb_ld_csr_clean_zeros procedure, pass(a) :: csput_a => psb_ld_csr_csput_a procedure, pass(a) :: get_diag => psb_ld_csr_get_diag procedure, pass(a) :: csgetptn => psb_ld_csr_csgetptn @@ -775,7 +790,21 @@ module psb_d_csr_mat_mod class(psb_ld_coo_sparse_mat), optional, intent(out) :: l end subroutine psb_ld_csr_triu end interface + + ! + !> + !! \memberof psb_ld_csr_sparse_mat + !! \see psb_ld_base_mat_mod::psb_ld_base_clean_zeros + ! + interface + subroutine psb_ld_csr_clean_zeros(a, info) + import + class(psb_ld_csr_sparse_mat), intent(inout) :: a + integer(psb_ipk_), intent(out) :: info + end subroutine psb_ld_csr_clean_zeros + end interface + !> \memberof psb_ld_csr_sparse_mat !! \see psb_ld_base_mat_mod::psb_ld_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 188950d2..54278539 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 @@ -142,10 +143,11 @@ module psb_s_csc_mat_mod procedure, pass(a) :: mv_from_coo => psb_ls_mv_csc_from_coo procedure, pass(a) :: mv_to_fmt => psb_ls_mv_csc_to_fmt procedure, pass(a) :: mv_from_fmt => psb_ls_mv_csc_from_fmt - procedure, pass(a) :: csput_a => psb_ls_csc_csput_a + procedure, pass(a) :: clean_zeros => psb_ls_csc_clean_zeros + procedure, pass(a) :: csput_a => psb_ls_csc_csput_a procedure, pass(a) :: get_diag => psb_ls_csc_get_diag procedure, pass(a) :: csgetptn => psb_ls_csc_csgetptn - procedure, pass(a) :: csgetrow => psb_ls_csc_csgetrow + procedure, pass(a) :: csgetrow => psb_ls_csc_csgetrow procedure, pass(a) :: get_nz_col => ls_csc_get_nz_col procedure, pass(a) :: reinit => psb_ls_csc_reinit procedure, pass(a) :: trim => psb_ls_csc_trim @@ -311,6 +313,20 @@ 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 + 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 @@ -702,6 +718,19 @@ module psb_s_csc_mat_mod end subroutine psb_ls_mv_csc_from_fmt end interface + ! + !> + !! \memberof psb_ls_csc_sparse_mat + !! \see psb_ls_base_mat_mod::psb_ls_base_clean_zeros + ! + interface + subroutine psb_ls_csc_clean_zeros(a, info) + import + class(psb_ls_csc_sparse_mat), intent(inout) :: a + integer(psb_ipk_), intent(out) :: info + end subroutine psb_ls_csc_clean_zeros + end interface + !> \memberof psb_ls_csc_sparse_mat !! \see psb_ls_base_mat_mod::psb_ls_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 e21a8476..14b41bff 100644 --- a/base/modules/serial/psb_s_csr_mat_mod.f90 +++ b/base/modules/serial/psb_s_csr_mat_mod.f90 @@ -1,3 +1,4 @@ + ! ! Parallel Sparse BLAS version 3.5 ! (C) Copyright 2006-2018 @@ -90,6 +91,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 +261,18 @@ 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 + 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 @@ -599,6 +613,7 @@ module psb_s_csr_mat_mod procedure, pass(a) :: mv_from_coo => psb_ls_mv_csr_from_coo procedure, pass(a) :: mv_to_fmt => psb_ls_mv_csr_to_fmt procedure, pass(a) :: mv_from_fmt => psb_ls_mv_csr_from_fmt + procedure, pass(a) :: clean_zeros => psb_ls_csr_clean_zeros procedure, pass(a) :: csput_a => psb_ls_csr_csput_a procedure, pass(a) :: get_diag => psb_ls_csr_get_diag procedure, pass(a) :: csgetptn => psb_ls_csr_csgetptn @@ -775,7 +790,21 @@ module psb_s_csr_mat_mod class(psb_ls_coo_sparse_mat), optional, intent(out) :: l end subroutine psb_ls_csr_triu end interface + + ! + !> + !! \memberof psb_ls_csr_sparse_mat + !! \see psb_ls_base_mat_mod::psb_ls_base_clean_zeros + ! + interface + subroutine psb_ls_csr_clean_zeros(a, info) + import + class(psb_ls_csr_sparse_mat), intent(inout) :: a + integer(psb_ipk_), intent(out) :: info + end subroutine psb_ls_csr_clean_zeros + end interface + !> \memberof psb_ls_csr_sparse_mat !! \see psb_ls_base_mat_mod::psb_ls_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 1f378036..c6586089 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 @@ -142,10 +143,11 @@ module psb_z_csc_mat_mod procedure, pass(a) :: mv_from_coo => psb_lz_mv_csc_from_coo procedure, pass(a) :: mv_to_fmt => psb_lz_mv_csc_to_fmt procedure, pass(a) :: mv_from_fmt => psb_lz_mv_csc_from_fmt - procedure, pass(a) :: csput_a => psb_lz_csc_csput_a + procedure, pass(a) :: clean_zeros => psb_lz_csc_clean_zeros + procedure, pass(a) :: csput_a => psb_lz_csc_csput_a procedure, pass(a) :: get_diag => psb_lz_csc_get_diag procedure, pass(a) :: csgetptn => psb_lz_csc_csgetptn - procedure, pass(a) :: csgetrow => psb_lz_csc_csgetrow + procedure, pass(a) :: csgetrow => psb_lz_csc_csgetrow procedure, pass(a) :: get_nz_col => lz_csc_get_nz_col procedure, pass(a) :: reinit => psb_lz_csc_reinit procedure, pass(a) :: trim => psb_lz_csc_trim @@ -311,6 +313,20 @@ 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 + 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 @@ -702,6 +718,19 @@ module psb_z_csc_mat_mod end subroutine psb_lz_mv_csc_from_fmt end interface + ! + !> + !! \memberof psb_lz_csc_sparse_mat + !! \see psb_lz_base_mat_mod::psb_lz_base_clean_zeros + ! + interface + subroutine psb_lz_csc_clean_zeros(a, info) + import + class(psb_lz_csc_sparse_mat), intent(inout) :: a + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lz_csc_clean_zeros + end interface + !> \memberof psb_lz_csc_sparse_mat !! \see psb_lz_base_mat_mod::psb_lz_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 9a9cdd26..6e62fa9c 100644 --- a/base/modules/serial/psb_z_csr_mat_mod.f90 +++ b/base/modules/serial/psb_z_csr_mat_mod.f90 @@ -1,3 +1,4 @@ + ! ! Parallel Sparse BLAS version 3.5 ! (C) Copyright 2006-2018 @@ -90,6 +91,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 +261,18 @@ 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 + 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 @@ -599,6 +613,7 @@ module psb_z_csr_mat_mod procedure, pass(a) :: mv_from_coo => psb_lz_mv_csr_from_coo procedure, pass(a) :: mv_to_fmt => psb_lz_mv_csr_to_fmt procedure, pass(a) :: mv_from_fmt => psb_lz_mv_csr_from_fmt + procedure, pass(a) :: clean_zeros => psb_lz_csr_clean_zeros procedure, pass(a) :: csput_a => psb_lz_csr_csput_a procedure, pass(a) :: get_diag => psb_lz_csr_get_diag procedure, pass(a) :: csgetptn => psb_lz_csr_csgetptn @@ -775,7 +790,21 @@ module psb_z_csr_mat_mod class(psb_lz_coo_sparse_mat), optional, intent(out) :: l end subroutine psb_lz_csr_triu end interface + + ! + !> + !! \memberof psb_lz_csr_sparse_mat + !! \see psb_lz_base_mat_mod::psb_lz_base_clean_zeros + ! + interface + subroutine psb_lz_csr_clean_zeros(a, info) + import + class(psb_lz_csr_sparse_mat), intent(inout) :: a + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lz_csr_clean_zeros + end interface + !> \memberof psb_lz_csr_sparse_mat !! \see psb_lz_base_mat_mod::psb_lz_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 179c60a0..c513e06b 100644 --- a/base/serial/impl/psb_c_csc_impl.f90 +++ b/base/serial/impl/psb_c_csc_impl.f90 @@ -2366,7 +2366,35 @@ subroutine psb_c_mv_csc_from_fmt(a,b,info) end subroutine psb_c_mv_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 + call a%sync() + 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() + call a%set_host() +end subroutine psb_c_csc_clean_zeros subroutine psb_c_cp_csc_from_fmt(a,b,info) use psb_const_mod @@ -4233,6 +4261,36 @@ subroutine psb_lc_cp_csc_from_fmt(a,b,info) end subroutine psb_lc_cp_csc_from_fmt +subroutine psb_lc_csc_clean_zeros(a, info) + use psb_error_mod + use psb_c_csc_mat_mod, psb_protect_name => psb_lc_csc_clean_zeros + implicit none + class(psb_lc_csc_sparse_mat), intent(inout) :: a + integer(psb_ipk_) :: info + ! + integer(psb_lpk_) :: i, j, k, nc + integer(psb_lpk_), allocatable :: ilcp(:) + + info = 0 + call a%sync() + 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() + call a%set_host() +end subroutine psb_lc_csc_clean_zeros + subroutine psb_lc_csc_mold(a,b,info) use psb_c_csc_mat_mod, psb_protect_name => psb_lc_csc_mold diff --git a/base/serial/impl/psb_c_csr_impl.f90 b/base/serial/impl/psb_c_csr_impl.f90 index 9afc3c59..60742158 100644 --- a/base/serial/impl/psb_c_csr_impl.f90 +++ b/base/serial/impl/psb_c_csr_impl.f90 @@ -3225,6 +3225,36 @@ 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 + call a%sync() + 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() + call a%set_host() +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 @@ -5323,6 +5353,37 @@ subroutine psb_lc_cp_csr_from_fmt(a,b,info) end select end subroutine psb_lc_cp_csr_from_fmt + +subroutine psb_lc_csr_clean_zeros(a, info) + use psb_error_mod + use psb_c_csr_mat_mod, psb_protect_name => psb_lc_csr_clean_zeros + implicit none + class(psb_lc_csr_sparse_mat), intent(inout) :: a + integer(psb_ipk_) :: info + ! + integer(psb_lpk_) :: i, j, k, nr + integer(psb_lpk_), allocatable :: ilrp(:) + + info = 0 + call a%sync() + 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() + call a%set_host() +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 diff --git a/base/serial/impl/psb_d_csc_impl.f90 b/base/serial/impl/psb_d_csc_impl.f90 index 8883d586..bb889f5d 100644 --- a/base/serial/impl/psb_d_csc_impl.f90 +++ b/base/serial/impl/psb_d_csc_impl.f90 @@ -2366,7 +2366,35 @@ subroutine psb_d_mv_csc_from_fmt(a,b,info) end subroutine psb_d_mv_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 + call a%sync() + 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() + call a%set_host() +end subroutine psb_d_csc_clean_zeros subroutine psb_d_cp_csc_from_fmt(a,b,info) use psb_const_mod @@ -4233,6 +4261,36 @@ subroutine psb_ld_cp_csc_from_fmt(a,b,info) end subroutine psb_ld_cp_csc_from_fmt +subroutine psb_ld_csc_clean_zeros(a, info) + use psb_error_mod + use psb_d_csc_mat_mod, psb_protect_name => psb_ld_csc_clean_zeros + implicit none + class(psb_ld_csc_sparse_mat), intent(inout) :: a + integer(psb_ipk_) :: info + ! + integer(psb_lpk_) :: i, j, k, nc + integer(psb_lpk_), allocatable :: ilcp(:) + + info = 0 + call a%sync() + 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() + call a%set_host() +end subroutine psb_ld_csc_clean_zeros + subroutine psb_ld_csc_mold(a,b,info) use psb_d_csc_mat_mod, psb_protect_name => psb_ld_csc_mold diff --git a/base/serial/impl/psb_d_csr_impl.f90 b/base/serial/impl/psb_d_csr_impl.f90 index 5ddec8b2..97cc78b6 100644 --- a/base/serial/impl/psb_d_csr_impl.f90 +++ b/base/serial/impl/psb_d_csr_impl.f90 @@ -3225,6 +3225,36 @@ 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 + call a%sync() + 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() + call a%set_host() +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 @@ -5323,6 +5353,37 @@ subroutine psb_ld_cp_csr_from_fmt(a,b,info) end select end subroutine psb_ld_cp_csr_from_fmt + +subroutine psb_ld_csr_clean_zeros(a, info) + use psb_error_mod + use psb_d_csr_mat_mod, psb_protect_name => psb_ld_csr_clean_zeros + implicit none + class(psb_ld_csr_sparse_mat), intent(inout) :: a + integer(psb_ipk_) :: info + ! + integer(psb_lpk_) :: i, j, k, nr + integer(psb_lpk_), allocatable :: ilrp(:) + + info = 0 + call a%sync() + 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() + call a%set_host() +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 diff --git a/base/serial/impl/psb_s_csc_impl.f90 b/base/serial/impl/psb_s_csc_impl.f90 index ecfa986d..98736c2b 100644 --- a/base/serial/impl/psb_s_csc_impl.f90 +++ b/base/serial/impl/psb_s_csc_impl.f90 @@ -2366,7 +2366,35 @@ subroutine psb_s_mv_csc_from_fmt(a,b,info) end subroutine psb_s_mv_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 + call a%sync() + 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() + call a%set_host() +end subroutine psb_s_csc_clean_zeros subroutine psb_s_cp_csc_from_fmt(a,b,info) use psb_const_mod @@ -4233,6 +4261,36 @@ subroutine psb_ls_cp_csc_from_fmt(a,b,info) end subroutine psb_ls_cp_csc_from_fmt +subroutine psb_ls_csc_clean_zeros(a, info) + use psb_error_mod + use psb_s_csc_mat_mod, psb_protect_name => psb_ls_csc_clean_zeros + implicit none + class(psb_ls_csc_sparse_mat), intent(inout) :: a + integer(psb_ipk_) :: info + ! + integer(psb_lpk_) :: i, j, k, nc + integer(psb_lpk_), allocatable :: ilcp(:) + + info = 0 + call a%sync() + 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() + call a%set_host() +end subroutine psb_ls_csc_clean_zeros + subroutine psb_ls_csc_mold(a,b,info) use psb_s_csc_mat_mod, psb_protect_name => psb_ls_csc_mold diff --git a/base/serial/impl/psb_s_csr_impl.f90 b/base/serial/impl/psb_s_csr_impl.f90 index a01336ed..7e4a64a2 100644 --- a/base/serial/impl/psb_s_csr_impl.f90 +++ b/base/serial/impl/psb_s_csr_impl.f90 @@ -3225,6 +3225,36 @@ 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 + call a%sync() + 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() + call a%set_host() +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 @@ -5323,6 +5353,37 @@ subroutine psb_ls_cp_csr_from_fmt(a,b,info) end select end subroutine psb_ls_cp_csr_from_fmt + +subroutine psb_ls_csr_clean_zeros(a, info) + use psb_error_mod + use psb_s_csr_mat_mod, psb_protect_name => psb_ls_csr_clean_zeros + implicit none + class(psb_ls_csr_sparse_mat), intent(inout) :: a + integer(psb_ipk_) :: info + ! + integer(psb_lpk_) :: i, j, k, nr + integer(psb_lpk_), allocatable :: ilrp(:) + + info = 0 + call a%sync() + 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() + call a%set_host() +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 diff --git a/base/serial/impl/psb_z_csc_impl.f90 b/base/serial/impl/psb_z_csc_impl.f90 index f3e604c1..c7c819a8 100644 --- a/base/serial/impl/psb_z_csc_impl.f90 +++ b/base/serial/impl/psb_z_csc_impl.f90 @@ -2366,7 +2366,35 @@ subroutine psb_z_mv_csc_from_fmt(a,b,info) end subroutine psb_z_mv_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 + call a%sync() + 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() + call a%set_host() +end subroutine psb_z_csc_clean_zeros subroutine psb_z_cp_csc_from_fmt(a,b,info) use psb_const_mod @@ -4233,6 +4261,36 @@ subroutine psb_lz_cp_csc_from_fmt(a,b,info) end subroutine psb_lz_cp_csc_from_fmt +subroutine psb_lz_csc_clean_zeros(a, info) + use psb_error_mod + use psb_z_csc_mat_mod, psb_protect_name => psb_lz_csc_clean_zeros + implicit none + class(psb_lz_csc_sparse_mat), intent(inout) :: a + integer(psb_ipk_) :: info + ! + integer(psb_lpk_) :: i, j, k, nc + integer(psb_lpk_), allocatable :: ilcp(:) + + info = 0 + call a%sync() + 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() + call a%set_host() +end subroutine psb_lz_csc_clean_zeros + subroutine psb_lz_csc_mold(a,b,info) use psb_z_csc_mat_mod, psb_protect_name => psb_lz_csc_mold diff --git a/base/serial/impl/psb_z_csr_impl.f90 b/base/serial/impl/psb_z_csr_impl.f90 index 0cf34879..038a1f47 100644 --- a/base/serial/impl/psb_z_csr_impl.f90 +++ b/base/serial/impl/psb_z_csr_impl.f90 @@ -3225,6 +3225,36 @@ 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 + call a%sync() + 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() + call a%set_host() +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 @@ -5323,6 +5353,37 @@ subroutine psb_lz_cp_csr_from_fmt(a,b,info) end select end subroutine psb_lz_cp_csr_from_fmt + +subroutine psb_lz_csr_clean_zeros(a, info) + use psb_error_mod + use psb_z_csr_mat_mod, psb_protect_name => psb_lz_csr_clean_zeros + implicit none + class(psb_lz_csr_sparse_mat), intent(inout) :: a + integer(psb_ipk_) :: info + ! + integer(psb_lpk_) :: i, j, k, nr + integer(psb_lpk_), allocatable :: ilrp(:) + + info = 0 + call a%sync() + 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() + call a%set_host() +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