From 159d2bdb1acd3449586b08a39e57d3d4b94b6b2a Mon Sep 17 00:00:00 2001 From: Cirdans-Home Date: Thu, 26 Nov 2020 12:59:08 +0100 Subject: [PATCH] Added modules and implementation for INVK solver --- amgprec/Makefile | 16 +- amgprec/amg_c_invk_solver.f90 | 154 ++++++++++++++++++ amgprec/amg_d_invk_solver.f90 | 154 ++++++++++++++++++ amgprec/amg_s_invk_solver.f90 | 154 ++++++++++++++++++ amgprec/amg_z_invk_solver.f90 | 154 ++++++++++++++++++ amgprec/impl/solver/amg_c_invk_solver_bld.f90 | 93 +++++++++++ .../impl/solver/amg_c_invk_solver_check.f90 | 64 ++++++++ .../impl/solver/amg_c_invk_solver_clone.f90 | 90 ++++++++++ .../impl/solver/amg_c_invk_solver_cseti.f90 | 69 ++++++++ .../impl/solver/amg_c_invk_solver_descr.f90 | 73 +++++++++ .../impl/solver/amg_c_invk_solver_seti.f90 | 69 ++++++++ amgprec/impl/solver/amg_d_invk_solver_bld.f90 | 93 +++++++++++ .../impl/solver/amg_d_invk_solver_check.f90 | 64 ++++++++ .../impl/solver/amg_d_invk_solver_clone.f90 | 90 ++++++++++ .../impl/solver/amg_d_invk_solver_cseti.f90 | 69 ++++++++ .../impl/solver/amg_d_invk_solver_descr.f90 | 73 +++++++++ .../impl/solver/amg_d_invk_solver_seti.f90 | 69 ++++++++ amgprec/impl/solver/amg_s_invk_solver_bld.f90 | 93 +++++++++++ .../impl/solver/amg_s_invk_solver_check.f90 | 64 ++++++++ .../impl/solver/amg_s_invk_solver_clone.f90 | 90 ++++++++++ .../impl/solver/amg_s_invk_solver_cseti.f90 | 69 ++++++++ .../impl/solver/amg_s_invk_solver_descr.f90 | 73 +++++++++ .../impl/solver/amg_s_invk_solver_seti.f90 | 69 ++++++++ amgprec/impl/solver/amg_z_invk_solver_bld.f90 | 93 +++++++++++ .../impl/solver/amg_z_invk_solver_check.f90 | 64 ++++++++ .../impl/solver/amg_z_invk_solver_clone.f90 | 90 ++++++++++ .../impl/solver/amg_z_invk_solver_cseti.f90 | 69 ++++++++ .../impl/solver/amg_z_invk_solver_descr.f90 | 73 +++++++++ .../impl/solver/amg_z_invk_solver_seti.f90 | 69 ++++++++ 29 files changed, 2460 insertions(+), 4 deletions(-) create mode 100644 amgprec/amg_c_invk_solver.f90 create mode 100644 amgprec/amg_d_invk_solver.f90 create mode 100644 amgprec/amg_s_invk_solver.f90 create mode 100644 amgprec/amg_z_invk_solver.f90 create mode 100644 amgprec/impl/solver/amg_c_invk_solver_bld.f90 create mode 100644 amgprec/impl/solver/amg_c_invk_solver_check.f90 create mode 100644 amgprec/impl/solver/amg_c_invk_solver_clone.f90 create mode 100644 amgprec/impl/solver/amg_c_invk_solver_cseti.f90 create mode 100644 amgprec/impl/solver/amg_c_invk_solver_descr.f90 create mode 100644 amgprec/impl/solver/amg_c_invk_solver_seti.f90 create mode 100644 amgprec/impl/solver/amg_d_invk_solver_bld.f90 create mode 100644 amgprec/impl/solver/amg_d_invk_solver_check.f90 create mode 100644 amgprec/impl/solver/amg_d_invk_solver_clone.f90 create mode 100644 amgprec/impl/solver/amg_d_invk_solver_cseti.f90 create mode 100644 amgprec/impl/solver/amg_d_invk_solver_descr.f90 create mode 100644 amgprec/impl/solver/amg_d_invk_solver_seti.f90 create mode 100644 amgprec/impl/solver/amg_s_invk_solver_bld.f90 create mode 100644 amgprec/impl/solver/amg_s_invk_solver_check.f90 create mode 100644 amgprec/impl/solver/amg_s_invk_solver_clone.f90 create mode 100644 amgprec/impl/solver/amg_s_invk_solver_cseti.f90 create mode 100644 amgprec/impl/solver/amg_s_invk_solver_descr.f90 create mode 100644 amgprec/impl/solver/amg_s_invk_solver_seti.f90 create mode 100644 amgprec/impl/solver/amg_z_invk_solver_bld.f90 create mode 100644 amgprec/impl/solver/amg_z_invk_solver_check.f90 create mode 100644 amgprec/impl/solver/amg_z_invk_solver_clone.f90 create mode 100644 amgprec/impl/solver/amg_z_invk_solver_cseti.f90 create mode 100644 amgprec/impl/solver/amg_z_invk_solver_descr.f90 create mode 100644 amgprec/impl/solver/amg_z_invk_solver_seti.f90 diff --git a/amgprec/Makefile b/amgprec/Makefile index a204bf3a..60cb43d1 100644 --- a/amgprec/Makefile +++ b/amgprec/Makefile @@ -14,7 +14,8 @@ DMODOBJS=amg_d_prec_type.o \ amg_d_gs_solver.o amg_d_mumps_solver.o \ amg_d_base_aggregator_mod.o \ amg_d_dec_aggregator_mod.o amg_d_symdec_aggregator_mod.o \ - amg_d_ainv_solver.o amg_d_base_ainv_mod.o + amg_d_ainv_solver.o amg_d_base_ainv_mod.o \ + amg_d_invk_solver.o #amg_d_bcmatch_aggregator_mod.o SMODOBJS=amg_s_prec_type.o amg_s_ilu_fact_mod.o \ @@ -24,7 +25,8 @@ SMODOBJS=amg_s_prec_type.o amg_s_ilu_fact_mod.o \ amg_s_gs_solver.o amg_s_mumps_solver.o \ amg_s_base_aggregator_mod.o \ amg_s_dec_aggregator_mod.o amg_s_symdec_aggregator_mod.o \ - amg_s_ainv_solver.o amg_s_base_ainv_mod.o + amg_s_ainv_solver.o amg_s_base_ainv_mod.o \ + amg_s_invk_solver.o ZMODOBJS=amg_z_prec_type.o amg_z_ilu_fact_mod.o \ amg_z_inner_mod.o amg_z_ilu_solver.o amg_z_diag_solver.o amg_z_jac_smoother.o amg_z_as_smoother.o \ @@ -33,7 +35,8 @@ ZMODOBJS=amg_z_prec_type.o amg_z_ilu_fact_mod.o \ amg_z_gs_solver.o amg_z_mumps_solver.o \ amg_z_base_aggregator_mod.o \ amg_z_dec_aggregator_mod.o amg_z_symdec_aggregator_mod.o \ - amg_z_ainv_solver.o amg_z_base_ainv_mod.o + amg_z_ainv_solver.o amg_z_base_ainv_mod.o \ + amg_z_invk_solver.o CMODOBJS=amg_c_prec_type.o amg_c_ilu_fact_mod.o \ amg_c_inner_mod.o amg_c_ilu_solver.o amg_c_diag_solver.o amg_c_jac_smoother.o amg_c_as_smoother.o \ @@ -42,7 +45,8 @@ CMODOBJS=amg_c_prec_type.o amg_c_ilu_fact_mod.o \ amg_c_gs_solver.o amg_c_mumps_solver.o \ amg_c_base_aggregator_mod.o \ amg_c_dec_aggregator_mod.o amg_c_symdec_aggregator_mod.o \ - amg_c_ainv_solver.o amg_c_base_ainv_mod.o + amg_c_ainv_solver.o amg_c_base_ainv_mod.o \ + amg_c_invk_solver.o @@ -174,6 +178,10 @@ amg_s_ainv_solver.o: amg_base_ainv_mod.o amg_s_base_ainv_mod.o amg_d_ainv_solver.o: amg_base_ainv_mod.o amg_d_base_ainv_mod.o amg_c_ainv_solver.o: amg_base_ainv_mod.o amg_c_base_ainv_mod.o amg_z_ainv_solver.o: amg_base_ainv_mod.o amg_z_base_ainv_mod.o +amg_s_invk_solver.o: amg_base_ainv_mod.o amg_s_base_ainv_mod.o +amg_d_invk_solver.o: amg_base_ainv_mod.o amg_d_base_ainv_mod.o +amg_c_invk_solver.o: amg_base_ainv_mod.o amg_c_base_ainv_mod.o +amg_z_invk_solver.o: amg_base_ainv_mod.o amg_z_base_ainv_mod.o veryclean: clean /bin/rm -f $(LIBNAME) diff --git a/amgprec/amg_c_invk_solver.f90 b/amgprec/amg_c_invk_solver.f90 new file mode 100644 index 00000000..43e588f4 --- /dev/null +++ b/amgprec/amg_c_invk_solver.f90 @@ -0,0 +1,154 @@ +! +! +! AMG-AINV: Approximate Inverse plugin for +! AMG4PSBLAS version 1.0 +! +! (C) Copyright 2020 +! +! Salvatore Filippone University of Rome Tor Vergata +! +! 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 AMG4PSBLAS 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 AMG4PSBLAS 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. +! +! +! +! +! +! +! + +module amg_c_invk_solver + + use amg_c_base_solver_mod + use amg_c_base_ainv_mod + use psb_base_mod, only : psb_c_vect_type + + type, extends(amg_c_base_ainv_solver_type) :: amg_c_invk_solver_type + integer(psb_ipk_) :: fill_in, inv_fill + contains + procedure, pass(sv) :: check => amg_c_invk_solver_check + procedure, pass(sv) :: clone => amg_c_invk_solver_clone + procedure, pass(sv) :: build => amg_c_invk_solver_bld + procedure, pass(sv) :: cseti => amg_c_invk_solver_cseti + procedure, pass(sv) :: descr => amg_c_invk_solver_descr + procedure, pass(sv) :: default => c_invk_solver_default + end type amg_c_invk_solver_type + + + private :: c_invk_solver_default + + + interface + subroutine amg_c_invk_solver_clone(sv,svout,info) + import :: psb_desc_type, psb_cspmat_type, psb_c_base_sparse_mat, & + & amg_c_base_solver_type, psb_spk_, amg_c_invk_solver_type, psb_ipk_ + Implicit None + class(amg_c_invk_solver_type), intent(inout) :: sv + class(amg_c_base_solver_type), allocatable, intent(inout) :: svout + integer(psb_ipk_), intent(out) :: info + end subroutine amg_c_invk_solver_clone + end interface + + interface + subroutine amg_c_invk_solver_bld(a,desc_a,sv,info,b,amold,vmold,imold) + import :: psb_desc_type, psb_cspmat_type, psb_c_base_sparse_mat, & + & psb_c_vect_type, psb_c_base_vect_type, psb_spk_, & + & amg_c_invk_solver_type, psb_i_base_vect_type, psb_ipk_ + + Implicit None + + ! Arguments + type(psb_cspmat_type), intent(in), target :: a + Type(psb_desc_type), Intent(inout) :: desc_a + class(amg_c_invk_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(out) :: info + type(psb_cspmat_type), intent(in), target, optional :: b + class(psb_c_base_sparse_mat), intent(in), optional :: amold + class(psb_c_base_vect_type), intent(in), optional :: vmold + class(psb_i_base_vect_type), intent(in), optional :: imold + end subroutine amg_c_invk_solver_bld + end interface + + interface + subroutine amg_c_invk_solver_check(sv,info) + import :: psb_spk_, amg_c_invk_solver_type, psb_ipk_ + + Implicit None + + ! Arguments + class(amg_c_invk_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(out) :: info + end subroutine amg_c_invk_solver_check + end interface + + interface + subroutine amg_c_invk_solver_cseti(sv,what,val,info,idx) + import :: psb_desc_type, psb_cspmat_type, psb_c_base_sparse_mat, & + & psb_ipk_, psb_c_vect_type, psb_c_base_vect_type, psb_spk_, & + & amg_c_invk_solver_type + + Implicit None + + ! Arguments + class(amg_c_invk_solver_type), intent(inout) :: sv + character(len=*), intent(in) :: what + integer(psb_ipk_), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: idx + end subroutine amg_c_invk_solver_cseti + end interface + + interface + subroutine amg_c_invk_solver_descr(sv,info,iout,coarse) + import :: psb_spk_, amg_c_invk_solver_type, psb_ipk_ + + Implicit None + + ! Arguments + class(amg_c_invk_solver_type), intent(in) :: sv + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: iout + logical, intent(in), optional :: coarse + + end subroutine amg_c_invk_solver_descr + end interface + +contains + + subroutine c_invk_solver_default(sv) + + !use psb_base_mod + + Implicit None + + ! Arguments + class(amg_c_invk_solver_type), intent(inout) :: sv + + sv%fill_in = 0 + sv%inv_fill = 0 + + return + end subroutine c_invk_solver_default + +end module amg_c_invk_solver diff --git a/amgprec/amg_d_invk_solver.f90 b/amgprec/amg_d_invk_solver.f90 new file mode 100644 index 00000000..ca980d09 --- /dev/null +++ b/amgprec/amg_d_invk_solver.f90 @@ -0,0 +1,154 @@ +! +! +! AMG-AINV: Approximate Inverse plugin for +! AMG4PSBLAS version 1.0 +! +! (C) Copyright 2020 +! +! Salvatore Filippone University of Rome Tor Vergata +! +! 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 AMG4PSBLAS 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 AMG4PSBLAS 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. +! +! +! +! +! +! +! + +module amg_d_invk_solver + + use amg_d_base_solver_mod + use amg_d_base_ainv_mod + use psb_base_mod, only : psb_d_vect_type + + type, extends(amg_d_base_ainv_solver_type) :: amg_d_invk_solver_type + integer(psb_ipk_) :: fill_in, inv_fill + contains + procedure, pass(sv) :: check => amg_d_invk_solver_check + procedure, pass(sv) :: clone => amg_d_invk_solver_clone + procedure, pass(sv) :: build => amg_d_invk_solver_bld + procedure, pass(sv) :: cseti => amg_d_invk_solver_cseti + procedure, pass(sv) :: descr => amg_d_invk_solver_descr + procedure, pass(sv) :: default => d_invk_solver_default + end type amg_d_invk_solver_type + + + private :: d_invk_solver_default + + + interface + subroutine amg_d_invk_solver_clone(sv,svout,info) + import :: psb_desc_type, psb_dspmat_type, psb_d_base_sparse_mat, & + & amg_d_base_solver_type, psb_dpk_, amg_d_invk_solver_type, psb_ipk_ + Implicit None + class(amg_d_invk_solver_type), intent(inout) :: sv + class(amg_d_base_solver_type), allocatable, intent(inout) :: svout + integer(psb_ipk_), intent(out) :: info + end subroutine amg_d_invk_solver_clone + end interface + + interface + subroutine amg_d_invk_solver_bld(a,desc_a,sv,info,b,amold,vmold,imold) + import :: psb_desc_type, psb_dspmat_type, psb_d_base_sparse_mat, & + & psb_d_vect_type, psb_d_base_vect_type, psb_dpk_, & + & amg_d_invk_solver_type, psb_i_base_vect_type, psb_ipk_ + + Implicit None + + ! Arguments + type(psb_dspmat_type), intent(in), target :: a + Type(psb_desc_type), Intent(inout) :: desc_a + class(amg_d_invk_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(out) :: info + type(psb_dspmat_type), intent(in), target, optional :: b + class(psb_d_base_sparse_mat), intent(in), optional :: amold + class(psb_d_base_vect_type), intent(in), optional :: vmold + class(psb_i_base_vect_type), intent(in), optional :: imold + end subroutine amg_d_invk_solver_bld + end interface + + interface + subroutine amg_d_invk_solver_check(sv,info) + import :: psb_dpk_, amg_d_invk_solver_type, psb_ipk_ + + Implicit None + + ! Arguments + class(amg_d_invk_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(out) :: info + end subroutine amg_d_invk_solver_check + end interface + + interface + subroutine amg_d_invk_solver_cseti(sv,what,val,info,idx) + import :: psb_desc_type, psb_dspmat_type, psb_d_base_sparse_mat, & + & psb_ipk_, psb_d_vect_type, psb_d_base_vect_type, psb_dpk_, & + & amg_d_invk_solver_type + + Implicit None + + ! Arguments + class(amg_d_invk_solver_type), intent(inout) :: sv + character(len=*), intent(in) :: what + integer(psb_ipk_), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: idx + end subroutine amg_d_invk_solver_cseti + end interface + + interface + subroutine amg_d_invk_solver_descr(sv,info,iout,coarse) + import :: psb_dpk_, amg_d_invk_solver_type, psb_ipk_ + + Implicit None + + ! Arguments + class(amg_d_invk_solver_type), intent(in) :: sv + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: iout + logical, intent(in), optional :: coarse + + end subroutine amg_d_invk_solver_descr + end interface + +contains + + subroutine d_invk_solver_default(sv) + + !use psb_base_mod + + Implicit None + + ! Arguments + class(amg_d_invk_solver_type), intent(inout) :: sv + + sv%fill_in = 0 + sv%inv_fill = 0 + + return + end subroutine d_invk_solver_default + +end module amg_d_invk_solver diff --git a/amgprec/amg_s_invk_solver.f90 b/amgprec/amg_s_invk_solver.f90 new file mode 100644 index 00000000..f7540cf7 --- /dev/null +++ b/amgprec/amg_s_invk_solver.f90 @@ -0,0 +1,154 @@ +! +! +! AMG-AINV: Approximate Inverse plugin for +! AMG4PSBLAS version 1.0 +! +! (C) Copyright 2020 +! +! Salvatore Filippone University of Rome Tor Vergata +! +! 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 AMG4PSBLAS 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 AMG4PSBLAS 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. +! +! +! +! +! +! +! + +module amg_s_invk_solver + + use amg_s_base_solver_mod + use amg_s_base_ainv_mod + use psb_base_mod, only : psb_s_vect_type + + type, extends(amg_s_base_ainv_solver_type) :: amg_s_invk_solver_type + integer(psb_ipk_) :: fill_in, inv_fill + contains + procedure, pass(sv) :: check => amg_s_invk_solver_check + procedure, pass(sv) :: clone => amg_s_invk_solver_clone + procedure, pass(sv) :: build => amg_s_invk_solver_bld + procedure, pass(sv) :: cseti => amg_s_invk_solver_cseti + procedure, pass(sv) :: descr => amg_s_invk_solver_descr + procedure, pass(sv) :: default => s_invk_solver_default + end type amg_s_invk_solver_type + + + private :: s_invk_solver_default + + + interface + subroutine amg_s_invk_solver_clone(sv,svout,info) + import :: psb_desc_type, psb_sspmat_type, psb_s_base_sparse_mat, & + & amg_s_base_solver_type, psb_spk_, amg_s_invk_solver_type, psb_ipk_ + Implicit None + class(amg_s_invk_solver_type), intent(inout) :: sv + class(amg_s_base_solver_type), allocatable, intent(inout) :: svout + integer(psb_ipk_), intent(out) :: info + end subroutine amg_s_invk_solver_clone + end interface + + interface + subroutine amg_s_invk_solver_bld(a,desc_a,sv,info,b,amold,vmold,imold) + import :: psb_desc_type, psb_sspmat_type, psb_s_base_sparse_mat, & + & psb_s_vect_type, psb_s_base_vect_type, psb_spk_, & + & amg_s_invk_solver_type, psb_i_base_vect_type, psb_ipk_ + + Implicit None + + ! Arguments + type(psb_sspmat_type), intent(in), target :: a + Type(psb_desc_type), Intent(inout) :: desc_a + class(amg_s_invk_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(out) :: info + type(psb_sspmat_type), intent(in), target, optional :: b + class(psb_s_base_sparse_mat), intent(in), optional :: amold + class(psb_s_base_vect_type), intent(in), optional :: vmold + class(psb_i_base_vect_type), intent(in), optional :: imold + end subroutine amg_s_invk_solver_bld + end interface + + interface + subroutine amg_s_invk_solver_check(sv,info) + import :: psb_spk_, amg_s_invk_solver_type, psb_ipk_ + + Implicit None + + ! Arguments + class(amg_s_invk_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(out) :: info + end subroutine amg_s_invk_solver_check + end interface + + interface + subroutine amg_s_invk_solver_cseti(sv,what,val,info,idx) + import :: psb_desc_type, psb_sspmat_type, psb_s_base_sparse_mat, & + & psb_ipk_, psb_s_vect_type, psb_s_base_vect_type, psb_spk_, & + & amg_s_invk_solver_type + + Implicit None + + ! Arguments + class(amg_s_invk_solver_type), intent(inout) :: sv + character(len=*), intent(in) :: what + integer(psb_ipk_), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: idx + end subroutine amg_s_invk_solver_cseti + end interface + + interface + subroutine amg_s_invk_solver_descr(sv,info,iout,coarse) + import :: psb_spk_, amg_s_invk_solver_type, psb_ipk_ + + Implicit None + + ! Arguments + class(amg_s_invk_solver_type), intent(in) :: sv + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: iout + logical, intent(in), optional :: coarse + + end subroutine amg_s_invk_solver_descr + end interface + +contains + + subroutine s_invk_solver_default(sv) + + !use psb_base_mod + + Implicit None + + ! Arguments + class(amg_s_invk_solver_type), intent(inout) :: sv + + sv%fill_in = 0 + sv%inv_fill = 0 + + return + end subroutine s_invk_solver_default + +end module amg_s_invk_solver diff --git a/amgprec/amg_z_invk_solver.f90 b/amgprec/amg_z_invk_solver.f90 new file mode 100644 index 00000000..9cf02aff --- /dev/null +++ b/amgprec/amg_z_invk_solver.f90 @@ -0,0 +1,154 @@ +! +! +! AMG-AINV: Approximate Inverse plugin for +! AMG4PSBLAS version 1.0 +! +! (C) Copyright 2020 +! +! Salvatore Filippone University of Rome Tor Vergata +! +! 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 AMG4PSBLAS 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 AMG4PSBLAS 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. +! +! +! +! +! +! +! + +module amg_z_invk_solver + + use amg_z_base_solver_mod + use amg_z_base_ainv_mod + use psb_base_mod, only : psb_z_vect_type + + type, extends(amg_z_base_ainv_solver_type) :: amg_z_invk_solver_type + integer(psb_ipk_) :: fill_in, inv_fill + contains + procedure, pass(sv) :: check => amg_z_invk_solver_check + procedure, pass(sv) :: clone => amg_z_invk_solver_clone + procedure, pass(sv) :: build => amg_z_invk_solver_bld + procedure, pass(sv) :: cseti => amg_z_invk_solver_cseti + procedure, pass(sv) :: descr => amg_z_invk_solver_descr + procedure, pass(sv) :: default => z_invk_solver_default + end type amg_z_invk_solver_type + + + private :: z_invk_solver_default + + + interface + subroutine amg_z_invk_solver_clone(sv,svout,info) + import :: psb_desc_type, psb_zspmat_type, psb_z_base_sparse_mat, & + & amg_z_base_solver_type, psb_dpk_, amg_z_invk_solver_type, psb_ipk_ + Implicit None + class(amg_z_invk_solver_type), intent(inout) :: sv + class(amg_z_base_solver_type), allocatable, intent(inout) :: svout + integer(psb_ipk_), intent(out) :: info + end subroutine amg_z_invk_solver_clone + end interface + + interface + subroutine amg_z_invk_solver_bld(a,desc_a,sv,info,b,amold,vmold,imold) + import :: psb_desc_type, psb_zspmat_type, psb_z_base_sparse_mat, & + & psb_z_vect_type, psb_z_base_vect_type, psb_dpk_, & + & amg_z_invk_solver_type, psb_i_base_vect_type, psb_ipk_ + + Implicit None + + ! Arguments + type(psb_zspmat_type), intent(in), target :: a + Type(psb_desc_type), Intent(inout) :: desc_a + class(amg_z_invk_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(out) :: info + type(psb_zspmat_type), intent(in), target, optional :: b + class(psb_z_base_sparse_mat), intent(in), optional :: amold + class(psb_z_base_vect_type), intent(in), optional :: vmold + class(psb_i_base_vect_type), intent(in), optional :: imold + end subroutine amg_z_invk_solver_bld + end interface + + interface + subroutine amg_z_invk_solver_check(sv,info) + import :: psb_dpk_, amg_z_invk_solver_type, psb_ipk_ + + Implicit None + + ! Arguments + class(amg_z_invk_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(out) :: info + end subroutine amg_z_invk_solver_check + end interface + + interface + subroutine amg_z_invk_solver_cseti(sv,what,val,info,idx) + import :: psb_desc_type, psb_zspmat_type, psb_z_base_sparse_mat, & + & psb_ipk_, psb_z_vect_type, psb_z_base_vect_type, psb_dpk_, & + & amg_z_invk_solver_type + + Implicit None + + ! Arguments + class(amg_z_invk_solver_type), intent(inout) :: sv + character(len=*), intent(in) :: what + integer(psb_ipk_), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: idx + end subroutine amg_z_invk_solver_cseti + end interface + + interface + subroutine amg_z_invk_solver_descr(sv,info,iout,coarse) + import :: psb_dpk_, amg_z_invk_solver_type, psb_ipk_ + + Implicit None + + ! Arguments + class(amg_z_invk_solver_type), intent(in) :: sv + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: iout + logical, intent(in), optional :: coarse + + end subroutine amg_z_invk_solver_descr + end interface + +contains + + subroutine z_invk_solver_default(sv) + + !use psb_base_mod + + Implicit None + + ! Arguments + class(amg_z_invk_solver_type), intent(inout) :: sv + + sv%fill_in = 0 + sv%inv_fill = 0 + + return + end subroutine z_invk_solver_default + +end module amg_z_invk_solver diff --git a/amgprec/impl/solver/amg_c_invk_solver_bld.f90 b/amgprec/impl/solver/amg_c_invk_solver_bld.f90 new file mode 100644 index 00000000..2c2eb6ea --- /dev/null +++ b/amgprec/impl/solver/amg_c_invk_solver_bld.f90 @@ -0,0 +1,93 @@ +! +! +! AMG-AINV: Approximate Inverse plugin for +! AMG4PSBLAS version 1.0 +! +! (C) Copyright 2020 +! +! Salvatore Filippone University of Rome Tor Vergata +! +! 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 AMG4PSBLAS 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 AMG4PSBLAS 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. +! +! +subroutine amx_c_invk_solver_bld(a,desc_a,sv,info,b,amold,vmold,imold) + + + use psb_base_mod + use psb_c_invk_fact_mod ! This module contains the construction routines + + use amx_c_invk_solver, amg_protect_name => amx_c_invk_solver_bld + + Implicit None + + ! Arguments + type(psb_cspmat_type), intent(in), target :: a + Type(psb_desc_type), Intent(inout) :: desc_a + class(amx_c_invk_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(out) :: info + type(psb_cspmat_type), intent(in), target, optional :: b + class(psb_c_base_sparse_mat), intent(in), optional :: amold + class(psb_c_base_vect_type), intent(in), optional :: vmold + class(psb_i_base_vect_type), intent(in), optional :: imold + + ! Local variables + integer(psb_ipk_) :: n_row,n_col, nrow_a, nztota + complex(psb_spk_), pointer :: ww(:), aux(:), tx(:),ty(:) + integer(psb_ipk_) :: np,me,i, err_act, debug_unit, debug_level + type(psb_ctxt_type) :: ctxt + character(len=20) :: name='c_invk_solver_bld', ch_err + + info=psb_success_ + call psb_erractionsave(err_act) + debug_unit = psb_get_debug_unit() + debug_level = psb_get_debug_level() + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (debug_level >= psb_debug_outer_) & + & write(debug_unit,*) me,' ',trim(name),' start' + + + call psb_invk_bld(a,sv%fill_in,sv%inv_fill,& + & sv%w,sv%d,sv%z,desc_a,info,b) + + + if ((info == psb_success_) .and.present(amold)) then + call sv%w%cscnv(info,mold=amold) + if (info == psb_success_) & + & call sv%z%cscnv(info,mold=amold) + end if + + if (info == psb_success_) then + call sv%dv%bld(sv%d,mold=vmold) + end if + if (debug_level >= psb_debug_outer_) & + & write(debug_unit,*) me,' ',trim(name),' end' + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amx_c_invk_solver_bld diff --git a/amgprec/impl/solver/amg_c_invk_solver_check.f90 b/amgprec/impl/solver/amg_c_invk_solver_check.f90 new file mode 100644 index 00000000..b23b71b5 --- /dev/null +++ b/amgprec/impl/solver/amg_c_invk_solver_check.f90 @@ -0,0 +1,64 @@ +! +! +! AMG-AINV: Approximate Inverse plugin for +! AMG4PSBLAS version 1.0 +! +! (C) Copyright 2020 +! +! Salvatore Filippone University of Rome Tor Vergata +! +! 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 AMG4PSBLAS 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 AMG4PSBLAS 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. +! +! +subroutine amx_c_invk_solver_check(sv,info) + + + use psb_base_mod + use amx_c_invk_solver, amg_protect_name => amx_c_invk_solver_check + + Implicit None + + ! Arguments + class(amx_c_invk_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(out) :: info + Integer(Psb_Ipk_) :: err_act + character(len=20) :: name='c_invk_solver_check' + + call psb_erractionsave(err_act) + info = psb_success_ + + call amg_check_def(sv%fill_in,& + & 'Level',izero,is_int_non_negative) + call amg_check_def(sv%inv_fill,& + & 'Level',izero,is_int_non_negative) + + if (info /= psb_success_) goto 9999 + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amx_c_invk_solver_check diff --git a/amgprec/impl/solver/amg_c_invk_solver_clone.f90 b/amgprec/impl/solver/amg_c_invk_solver_clone.f90 new file mode 100644 index 00000000..e6da4ae6 --- /dev/null +++ b/amgprec/impl/solver/amg_c_invk_solver_clone.f90 @@ -0,0 +1,90 @@ +! +! +! AMG4PSBLAS version 1.0 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.0) +! +! (C) Copyright 2008,2009,2010,2010,2012 +! +! Salvatore Filippone University of Rome Tor Vergata +! Alfredo Buttari CNRS-IRIT, Toulouse +! Pasqua D'Ambra ICAR-CNR, Naples +! Daniela di Serafino Second University of Naples +! +! 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 AMG4PSBLAS 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 AMG4PSBLAS 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. +! +! +subroutine amx_c_invk_solver_clone(sv,svout,info) + + use psb_base_mod + use amx_c_invk_solver, amg_protect_name => amx_c_invk_solver_clone + + Implicit None + + ! Arguments + class(amx_c_invk_solver_type), intent(inout) :: sv + class(amx_c_base_solver_type), allocatable, intent(inout) :: svout + integer(psb_ipk_), intent(out) :: info + ! Local variables + integer(psb_ipk_) :: err_act + + + info=psb_success_ + call psb_erractionsave(err_act) + + if (allocated(svout)) then + call svout%free(info) + if (info == psb_success_) deallocate(svout, stat=info) + end if + if (info == psb_success_) & + & allocate(amx_c_invk_solver_type :: svout, stat=info) + if (info /= 0) then + info = psb_err_alloc_dealloc_ + goto 9999 + end if + select type(svo => svout) + type is (amx_c_invk_solver_type) + svo%fill_in = sv%fill_in + svo%inv_fill = sv%inv_fill + call psb_safe_ab_cpy(sv%d,svo%d,info) + if (info == psb_success_) & + & call sv%dv%clone(svo%dv,info) + if (info == psb_success_) & + & call sv%w%clone(svo%w,info) + if (info == psb_success_) & + & call sv%z%clone(svo%z,info) + + class default + info = psb_err_internal_error_ + end select + + if (info /= 0) goto 9999 + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amx_c_invk_solver_clone diff --git a/amgprec/impl/solver/amg_c_invk_solver_cseti.f90 b/amgprec/impl/solver/amg_c_invk_solver_cseti.f90 new file mode 100644 index 00000000..8b03eb8f --- /dev/null +++ b/amgprec/impl/solver/amg_c_invk_solver_cseti.f90 @@ -0,0 +1,69 @@ +! +! +! AMG-AINV: Approximate Inverse plugin for +! AMG4PSBLAS version 1.0 +! +! (C) Copyright 2020 +! +! Salvatore Filippone University of Rome Tor Vergata +! +! 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 AMG4PSBLAS 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 AMG4PSBLAS 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. +! +! +subroutine amx_c_invk_solver_cseti(sv,what,val,info,idx) + + use psb_base_mod + use amx_c_invk_solver, amg_protect_name => amx_c_invk_solver_cseti + + Implicit None + + ! Arguments + class(amx_c_invk_solver_type), intent(inout) :: sv + character(len=*), intent(in) :: what + integer(psb_ipk_), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: idx + ! + integer(psb_ipk_) :: err_act + character(len=20) :: name='d_invk_solver_cseti' + + info = psb_success_ + call psb_erractionsave(err_act) + + select case(psb_toupper(what)) + case('SUB_FILLIN') + sv%fill_in = val + case('INV_FILLIN') + sv%inv_fill = val + case default + call sv%amx_c_base_solver_type%set(what,val,info) + end select + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amx_c_invk_solver_cseti diff --git a/amgprec/impl/solver/amg_c_invk_solver_descr.f90 b/amgprec/impl/solver/amg_c_invk_solver_descr.f90 new file mode 100644 index 00000000..cd07eb5b --- /dev/null +++ b/amgprec/impl/solver/amg_c_invk_solver_descr.f90 @@ -0,0 +1,73 @@ +! +! +! AMG-AINV: Approximate Inverse plugin for +! AMG4PSBLAS version 1.0 +! +! (C) Copyright 2020 +! +! Salvatore Filippone University of Rome Tor Vergata +! +! 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 AMG4PSBLAS 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 AMG4PSBLAS 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. +! +! +subroutine amx_c_invk_solver_descr(sv,info,iout,coarse) + + + use psb_base_mod + use amx_c_invk_solver, amg_protect_name => amx_c_invk_solver_descr + + Implicit None + + ! Arguments + class(amx_c_invk_solver_type), intent(in) :: sv + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: iout + logical, intent(in), optional :: coarse + + ! Local variables + integer(psb_ipk_) :: err_act + integer(psb_ipk_) :: me, np + type(psb_ctxt_type) :: ctxt + character(len=20), parameter :: name='amx_c_invk_solver_descr' + integer(psb_ipk_) :: iout_ + + call psb_erractionsave(err_act) + info = psb_success_ + if (present(iout)) then + iout_ = iout + else + iout_ = 6 + endif + + write(iout_,*) ' INVK Approximate Inverse with ILU(N) ' + write(iout_,*) ' Fill level :',sv%fill_in + write(iout_,*) ' Inverse fill level :',sv%inv_fill + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amx_c_invk_solver_descr diff --git a/amgprec/impl/solver/amg_c_invk_solver_seti.f90 b/amgprec/impl/solver/amg_c_invk_solver_seti.f90 new file mode 100644 index 00000000..995937d6 --- /dev/null +++ b/amgprec/impl/solver/amg_c_invk_solver_seti.f90 @@ -0,0 +1,69 @@ +! +! +! AMG-AINV: Approximate Inverse plugin for +! AMG4PSBLAS version 1.0 +! +! (C) Copyright 2020 +! +! Salvatore Filippone University of Rome Tor Vergata +! +! 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 AMG4PSBLAS 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 AMG4PSBLAS 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. +! +! +subroutine amx_c_invk_solver_seti(sv,what,val,info) + + + use psb_base_mod + use amx_c_invk_solver, amg_protect_name => amx_c_invk_solver_seti + + Implicit None + + ! Arguments + class(amx_c_invk_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(in) :: what + integer(psb_ipk_), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + ! + integer(psb_ipk_) :: err_act + character(len=20) :: name='d_invk_solver_seti' + + info = psb_success_ + call psb_erractionsave(err_act) + + select case(what) + case(amg_sub_fillin_) + sv%fill_in = val + case(amg_inv_fillin_) + sv%inv_fill = val + case default + call sv%amx_c_base_solver_type%set(what,val,info) + end select + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amx_c_invk_solver_seti diff --git a/amgprec/impl/solver/amg_d_invk_solver_bld.f90 b/amgprec/impl/solver/amg_d_invk_solver_bld.f90 new file mode 100644 index 00000000..2b1a44e6 --- /dev/null +++ b/amgprec/impl/solver/amg_d_invk_solver_bld.f90 @@ -0,0 +1,93 @@ +! +! +! AMG-AINV: Approximate Inverse plugin for +! AMG4PSBLAS version 1.0 +! +! (C) Copyright 2020 +! +! Salvatore Filippone University of Rome Tor Vergata +! +! 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 AMG4PSBLAS 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 AMG4PSBLAS 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. +! +! +subroutine amx_d_invk_solver_bld(a,desc_a,sv,info,b,amold,vmold,imold) + + + use psb_base_mod + use psb_d_invk_fact_mod ! This module contains the construction routines + + use amx_d_invk_solver, amg_protect_name => amx_d_invk_solver_bld + + Implicit None + + ! Arguments + type(psb_dspmat_type), intent(in), target :: a + Type(psb_desc_type), Intent(inout) :: desc_a + class(amx_d_invk_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(out) :: info + type(psb_dspmat_type), intent(in), target, optional :: b + class(psb_d_base_sparse_mat), intent(in), optional :: amold + class(psb_d_base_vect_type), intent(in), optional :: vmold + class(psb_i_base_vect_type), intent(in), optional :: imold + + ! Local variables + integer(psb_ipk_) :: n_row,n_col, nrow_a, nztota + real(psb_dpk_), pointer :: ww(:), aux(:), tx(:),ty(:) + integer(psb_ipk_) :: np,me,i, err_act, debug_unit, debug_level + type(psb_ctxt_type) :: ctxt + character(len=20) :: name='d_invk_solver_bld', ch_err + + info=psb_success_ + call psb_erractionsave(err_act) + debug_unit = psb_get_debug_unit() + debug_level = psb_get_debug_level() + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (debug_level >= psb_debug_outer_) & + & write(debug_unit,*) me,' ',trim(name),' start' + + + call psb_invk_bld(a,sv%fill_in,sv%inv_fill,& + & sv%w,sv%d,sv%z,desc_a,info,b) + + + if ((info == psb_success_) .and.present(amold)) then + call sv%w%cscnv(info,mold=amold) + if (info == psb_success_) & + & call sv%z%cscnv(info,mold=amold) + end if + + if (info == psb_success_) then + call sv%dv%bld(sv%d,mold=vmold) + end if + if (debug_level >= psb_debug_outer_) & + & write(debug_unit,*) me,' ',trim(name),' end' + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amx_d_invk_solver_bld diff --git a/amgprec/impl/solver/amg_d_invk_solver_check.f90 b/amgprec/impl/solver/amg_d_invk_solver_check.f90 new file mode 100644 index 00000000..af69c492 --- /dev/null +++ b/amgprec/impl/solver/amg_d_invk_solver_check.f90 @@ -0,0 +1,64 @@ +! +! +! AMG-AINV: Approximate Inverse plugin for +! AMG4PSBLAS version 1.0 +! +! (C) Copyright 2020 +! +! Salvatore Filippone University of Rome Tor Vergata +! +! 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 AMG4PSBLAS 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 AMG4PSBLAS 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. +! +! +subroutine amx_d_invk_solver_check(sv,info) + + + use psb_base_mod + use amx_d_invk_solver, amg_protect_name => amx_d_invk_solver_check + + Implicit None + + ! Arguments + class(amx_d_invk_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(out) :: info + Integer(Psb_Ipk_) :: err_act + character(len=20) :: name='d_invk_solver_check' + + call psb_erractionsave(err_act) + info = psb_success_ + + call amg_check_def(sv%fill_in,& + & 'Level',izero,is_int_non_negative) + call amg_check_def(sv%inv_fill,& + & 'Level',izero,is_int_non_negative) + + if (info /= psb_success_) goto 9999 + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amx_d_invk_solver_check diff --git a/amgprec/impl/solver/amg_d_invk_solver_clone.f90 b/amgprec/impl/solver/amg_d_invk_solver_clone.f90 new file mode 100644 index 00000000..370f8468 --- /dev/null +++ b/amgprec/impl/solver/amg_d_invk_solver_clone.f90 @@ -0,0 +1,90 @@ +! +! +! AMG4PSBLAS version 1.0 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.0) +! +! (C) Copyright 2008,2009,2010,2010,2012 +! +! Salvatore Filippone University of Rome Tor Vergata +! Alfredo Buttari CNRS-IRIT, Toulouse +! Pasqua D'Ambra ICAR-CNR, Naples +! Daniela di Serafino Second University of Naples +! +! 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 AMG4PSBLAS 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 AMG4PSBLAS 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. +! +! +subroutine amx_d_invk_solver_clone(sv,svout,info) + + use psb_base_mod + use amx_d_invk_solver, amg_protect_name => amx_d_invk_solver_clone + + Implicit None + + ! Arguments + class(amx_d_invk_solver_type), intent(inout) :: sv + class(amx_d_base_solver_type), allocatable, intent(inout) :: svout + integer(psb_ipk_), intent(out) :: info + ! Local variables + integer(psb_ipk_) :: err_act + + + info=psb_success_ + call psb_erractionsave(err_act) + + if (allocated(svout)) then + call svout%free(info) + if (info == psb_success_) deallocate(svout, stat=info) + end if + if (info == psb_success_) & + & allocate(amx_d_invk_solver_type :: svout, stat=info) + if (info /= 0) then + info = psb_err_alloc_dealloc_ + goto 9999 + end if + select type(svo => svout) + type is (amx_d_invk_solver_type) + svo%fill_in = sv%fill_in + svo%inv_fill = sv%inv_fill + call psb_safe_ab_cpy(sv%d,svo%d,info) + if (info == psb_success_) & + & call sv%dv%clone(svo%dv,info) + if (info == psb_success_) & + & call sv%w%clone(svo%w,info) + if (info == psb_success_) & + & call sv%z%clone(svo%z,info) + + class default + info = psb_err_internal_error_ + end select + + if (info /= 0) goto 9999 + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amx_d_invk_solver_clone diff --git a/amgprec/impl/solver/amg_d_invk_solver_cseti.f90 b/amgprec/impl/solver/amg_d_invk_solver_cseti.f90 new file mode 100644 index 00000000..2d7567c1 --- /dev/null +++ b/amgprec/impl/solver/amg_d_invk_solver_cseti.f90 @@ -0,0 +1,69 @@ +! +! +! AMG-AINV: Approximate Inverse plugin for +! AMG4PSBLAS version 1.0 +! +! (C) Copyright 2020 +! +! Salvatore Filippone University of Rome Tor Vergata +! +! 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 AMG4PSBLAS 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 AMG4PSBLAS 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. +! +! +subroutine amx_d_invk_solver_cseti(sv,what,val,info,idx) + + use psb_base_mod + use amx_d_invk_solver, amg_protect_name => amx_d_invk_solver_cseti + + Implicit None + + ! Arguments + class(amx_d_invk_solver_type), intent(inout) :: sv + character(len=*), intent(in) :: what + integer(psb_ipk_), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: idx + ! + integer(psb_ipk_) :: err_act + character(len=20) :: name='d_invk_solver_cseti' + + info = psb_success_ + call psb_erractionsave(err_act) + + select case(psb_toupper(what)) + case('SUB_FILLIN') + sv%fill_in = val + case('INV_FILLIN') + sv%inv_fill = val + case default + call sv%amx_d_base_solver_type%set(what,val,info) + end select + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amx_d_invk_solver_cseti diff --git a/amgprec/impl/solver/amg_d_invk_solver_descr.f90 b/amgprec/impl/solver/amg_d_invk_solver_descr.f90 new file mode 100644 index 00000000..ee5558fd --- /dev/null +++ b/amgprec/impl/solver/amg_d_invk_solver_descr.f90 @@ -0,0 +1,73 @@ +! +! +! AMG-AINV: Approximate Inverse plugin for +! AMG4PSBLAS version 1.0 +! +! (C) Copyright 2020 +! +! Salvatore Filippone University of Rome Tor Vergata +! +! 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 AMG4PSBLAS 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 AMG4PSBLAS 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. +! +! +subroutine amx_d_invk_solver_descr(sv,info,iout,coarse) + + + use psb_base_mod + use amx_d_invk_solver, amg_protect_name => amx_d_invk_solver_descr + + Implicit None + + ! Arguments + class(amx_d_invk_solver_type), intent(in) :: sv + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: iout + logical, intent(in), optional :: coarse + + ! Local variables + integer(psb_ipk_) :: err_act + integer(psb_ipk_) :: me, np + type(psb_ctxt_type) :: ctxt + character(len=20), parameter :: name='amx_d_invk_solver_descr' + integer(psb_ipk_) :: iout_ + + call psb_erractionsave(err_act) + info = psb_success_ + if (present(iout)) then + iout_ = iout + else + iout_ = 6 + endif + + write(iout_,*) ' INVK Approximate Inverse with ILU(N) ' + write(iout_,*) ' Fill level :',sv%fill_in + write(iout_,*) ' Inverse fill level :',sv%inv_fill + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amx_d_invk_solver_descr diff --git a/amgprec/impl/solver/amg_d_invk_solver_seti.f90 b/amgprec/impl/solver/amg_d_invk_solver_seti.f90 new file mode 100644 index 00000000..8644e8a4 --- /dev/null +++ b/amgprec/impl/solver/amg_d_invk_solver_seti.f90 @@ -0,0 +1,69 @@ +! +! +! AMG-AINV: Approximate Inverse plugin for +! AMG4PSBLAS version 1.0 +! +! (C) Copyright 2020 +! +! Salvatore Filippone University of Rome Tor Vergata +! +! 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 AMG4PSBLAS 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 AMG4PSBLAS 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. +! +! +subroutine amx_d_invk_solver_seti(sv,what,val,info) + + + use psb_base_mod + use amx_d_invk_solver, amg_protect_name => amx_d_invk_solver_seti + + Implicit None + + ! Arguments + class(amx_d_invk_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(in) :: what + integer(psb_ipk_), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + ! + integer(psb_ipk_) :: err_act + character(len=20) :: name='d_invk_solver_seti' + + info = psb_success_ + call psb_erractionsave(err_act) + + select case(what) + case(amg_sub_fillin_) + sv%fill_in = val + case(amg_inv_fillin_) + sv%inv_fill = val + case default + call sv%amx_d_base_solver_type%set(what,val,info) + end select + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amx_d_invk_solver_seti diff --git a/amgprec/impl/solver/amg_s_invk_solver_bld.f90 b/amgprec/impl/solver/amg_s_invk_solver_bld.f90 new file mode 100644 index 00000000..f840a6d2 --- /dev/null +++ b/amgprec/impl/solver/amg_s_invk_solver_bld.f90 @@ -0,0 +1,93 @@ +! +! +! AMG-AINV: Approximate Inverse plugin for +! AMG4PSBLAS version 1.0 +! +! (C) Copyright 2020 +! +! Salvatore Filippone University of Rome Tor Vergata +! +! 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 AMG4PSBLAS 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 AMG4PSBLAS 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. +! +! +subroutine amx_s_invk_solver_bld(a,desc_a,sv,info,b,amold,vmold,imold) + + + use psb_base_mod + use psb_s_invk_fact_mod ! This module contains the construction routines + + use amx_s_invk_solver, amg_protect_name => amx_s_invk_solver_bld + + Implicit None + + ! Arguments + type(psb_sspmat_type), intent(in), target :: a + Type(psb_desc_type), Intent(inout) :: desc_a + class(amx_s_invk_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(out) :: info + type(psb_sspmat_type), intent(in), target, optional :: b + class(psb_s_base_sparse_mat), intent(in), optional :: amold + class(psb_s_base_vect_type), intent(in), optional :: vmold + class(psb_i_base_vect_type), intent(in), optional :: imold + + ! Local variables + integer(psb_ipk_) :: n_row,n_col, nrow_a, nztota + real(psb_spk_), pointer :: ww(:), aux(:), tx(:),ty(:) + integer(psb_ipk_) :: np,me,i, err_act, debug_unit, debug_level + type(psb_ctxt_type) :: ctxt + character(len=20) :: name='s_invk_solver_bld', ch_err + + info=psb_success_ + call psb_erractionsave(err_act) + debug_unit = psb_get_debug_unit() + debug_level = psb_get_debug_level() + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (debug_level >= psb_debug_outer_) & + & write(debug_unit,*) me,' ',trim(name),' start' + + + call psb_invk_bld(a,sv%fill_in,sv%inv_fill,& + & sv%w,sv%d,sv%z,desc_a,info,b) + + + if ((info == psb_success_) .and.present(amold)) then + call sv%w%cscnv(info,mold=amold) + if (info == psb_success_) & + & call sv%z%cscnv(info,mold=amold) + end if + + if (info == psb_success_) then + call sv%dv%bld(sv%d,mold=vmold) + end if + if (debug_level >= psb_debug_outer_) & + & write(debug_unit,*) me,' ',trim(name),' end' + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amx_s_invk_solver_bld diff --git a/amgprec/impl/solver/amg_s_invk_solver_check.f90 b/amgprec/impl/solver/amg_s_invk_solver_check.f90 new file mode 100644 index 00000000..736061c5 --- /dev/null +++ b/amgprec/impl/solver/amg_s_invk_solver_check.f90 @@ -0,0 +1,64 @@ +! +! +! AMG-AINV: Approximate Inverse plugin for +! AMG4PSBLAS version 1.0 +! +! (C) Copyright 2020 +! +! Salvatore Filippone University of Rome Tor Vergata +! +! 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 AMG4PSBLAS 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 AMG4PSBLAS 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. +! +! +subroutine amx_s_invk_solver_check(sv,info) + + + use psb_base_mod + use amx_s_invk_solver, amg_protect_name => amx_s_invk_solver_check + + Implicit None + + ! Arguments + class(amx_s_invk_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(out) :: info + Integer(Psb_Ipk_) :: err_act + character(len=20) :: name='s_invk_solver_check' + + call psb_erractionsave(err_act) + info = psb_success_ + + call amg_check_def(sv%fill_in,& + & 'Level',izero,is_int_non_negative) + call amg_check_def(sv%inv_fill,& + & 'Level',izero,is_int_non_negative) + + if (info /= psb_success_) goto 9999 + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amx_s_invk_solver_check diff --git a/amgprec/impl/solver/amg_s_invk_solver_clone.f90 b/amgprec/impl/solver/amg_s_invk_solver_clone.f90 new file mode 100644 index 00000000..87fa0221 --- /dev/null +++ b/amgprec/impl/solver/amg_s_invk_solver_clone.f90 @@ -0,0 +1,90 @@ +! +! +! AMG4PSBLAS version 1.0 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.0) +! +! (C) Copyright 2008,2009,2010,2010,2012 +! +! Salvatore Filippone University of Rome Tor Vergata +! Alfredo Buttari CNRS-IRIT, Toulouse +! Pasqua D'Ambra ICAR-CNR, Naples +! Daniela di Serafino Second University of Naples +! +! 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 AMG4PSBLAS 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 AMG4PSBLAS 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. +! +! +subroutine amx_s_invk_solver_clone(sv,svout,info) + + use psb_base_mod + use amx_s_invk_solver, amg_protect_name => amx_s_invk_solver_clone + + Implicit None + + ! Arguments + class(amx_s_invk_solver_type), intent(inout) :: sv + class(amx_s_base_solver_type), allocatable, intent(inout) :: svout + integer(psb_ipk_), intent(out) :: info + ! Local variables + integer(psb_ipk_) :: err_act + + + info=psb_success_ + call psb_erractionsave(err_act) + + if (allocated(svout)) then + call svout%free(info) + if (info == psb_success_) deallocate(svout, stat=info) + end if + if (info == psb_success_) & + & allocate(amx_s_invk_solver_type :: svout, stat=info) + if (info /= 0) then + info = psb_err_alloc_dealloc_ + goto 9999 + end if + select type(svo => svout) + type is (amx_s_invk_solver_type) + svo%fill_in = sv%fill_in + svo%inv_fill = sv%inv_fill + call psb_safe_ab_cpy(sv%d,svo%d,info) + if (info == psb_success_) & + & call sv%dv%clone(svo%dv,info) + if (info == psb_success_) & + & call sv%w%clone(svo%w,info) + if (info == psb_success_) & + & call sv%z%clone(svo%z,info) + + class default + info = psb_err_internal_error_ + end select + + if (info /= 0) goto 9999 + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amx_s_invk_solver_clone diff --git a/amgprec/impl/solver/amg_s_invk_solver_cseti.f90 b/amgprec/impl/solver/amg_s_invk_solver_cseti.f90 new file mode 100644 index 00000000..0485807f --- /dev/null +++ b/amgprec/impl/solver/amg_s_invk_solver_cseti.f90 @@ -0,0 +1,69 @@ +! +! +! AMG-AINV: Approximate Inverse plugin for +! AMG4PSBLAS version 1.0 +! +! (C) Copyright 2020 +! +! Salvatore Filippone University of Rome Tor Vergata +! +! 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 AMG4PSBLAS 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 AMG4PSBLAS 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. +! +! +subroutine amx_s_invk_solver_cseti(sv,what,val,info,idx) + + use psb_base_mod + use amx_s_invk_solver, amg_protect_name => amx_s_invk_solver_cseti + + Implicit None + + ! Arguments + class(amx_s_invk_solver_type), intent(inout) :: sv + character(len=*), intent(in) :: what + integer(psb_ipk_), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: idx + ! + integer(psb_ipk_) :: err_act + character(len=20) :: name='d_invk_solver_cseti' + + info = psb_success_ + call psb_erractionsave(err_act) + + select case(psb_toupper(what)) + case('SUB_FILLIN') + sv%fill_in = val + case('INV_FILLIN') + sv%inv_fill = val + case default + call sv%amx_s_base_solver_type%set(what,val,info) + end select + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amx_s_invk_solver_cseti diff --git a/amgprec/impl/solver/amg_s_invk_solver_descr.f90 b/amgprec/impl/solver/amg_s_invk_solver_descr.f90 new file mode 100644 index 00000000..9aee44bf --- /dev/null +++ b/amgprec/impl/solver/amg_s_invk_solver_descr.f90 @@ -0,0 +1,73 @@ +! +! +! AMG-AINV: Approximate Inverse plugin for +! AMG4PSBLAS version 1.0 +! +! (C) Copyright 2020 +! +! Salvatore Filippone University of Rome Tor Vergata +! +! 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 AMG4PSBLAS 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 AMG4PSBLAS 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. +! +! +subroutine amx_s_invk_solver_descr(sv,info,iout,coarse) + + + use psb_base_mod + use amx_s_invk_solver, amg_protect_name => amx_s_invk_solver_descr + + Implicit None + + ! Arguments + class(amx_s_invk_solver_type), intent(in) :: sv + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: iout + logical, intent(in), optional :: coarse + + ! Local variables + integer(psb_ipk_) :: err_act + integer(psb_ipk_) :: me, np + type(psb_ctxt_type) :: ctxt + character(len=20), parameter :: name='amx_s_invk_solver_descr' + integer(psb_ipk_) :: iout_ + + call psb_erractionsave(err_act) + info = psb_success_ + if (present(iout)) then + iout_ = iout + else + iout_ = 6 + endif + + write(iout_,*) ' INVK Approximate Inverse with ILU(N) ' + write(iout_,*) ' Fill level :',sv%fill_in + write(iout_,*) ' Inverse fill level :',sv%inv_fill + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amx_s_invk_solver_descr diff --git a/amgprec/impl/solver/amg_s_invk_solver_seti.f90 b/amgprec/impl/solver/amg_s_invk_solver_seti.f90 new file mode 100644 index 00000000..c1654ca0 --- /dev/null +++ b/amgprec/impl/solver/amg_s_invk_solver_seti.f90 @@ -0,0 +1,69 @@ +! +! +! AMG-AINV: Approximate Inverse plugin for +! AMG4PSBLAS version 1.0 +! +! (C) Copyright 2020 +! +! Salvatore Filippone University of Rome Tor Vergata +! +! 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 AMG4PSBLAS 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 AMG4PSBLAS 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. +! +! +subroutine amx_s_invk_solver_seti(sv,what,val,info) + + + use psb_base_mod + use amx_s_invk_solver, amg_protect_name => amx_s_invk_solver_seti + + Implicit None + + ! Arguments + class(amx_s_invk_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(in) :: what + integer(psb_ipk_), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + ! + integer(psb_ipk_) :: err_act + character(len=20) :: name='d_invk_solver_seti' + + info = psb_success_ + call psb_erractionsave(err_act) + + select case(what) + case(amg_sub_fillin_) + sv%fill_in = val + case(amg_inv_fillin_) + sv%inv_fill = val + case default + call sv%amx_s_base_solver_type%set(what,val,info) + end select + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amx_s_invk_solver_seti diff --git a/amgprec/impl/solver/amg_z_invk_solver_bld.f90 b/amgprec/impl/solver/amg_z_invk_solver_bld.f90 new file mode 100644 index 00000000..3ae5556c --- /dev/null +++ b/amgprec/impl/solver/amg_z_invk_solver_bld.f90 @@ -0,0 +1,93 @@ +! +! +! AMG-AINV: Approximate Inverse plugin for +! AMG4PSBLAS version 1.0 +! +! (C) Copyright 2020 +! +! Salvatore Filippone University of Rome Tor Vergata +! +! 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 AMG4PSBLAS 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 AMG4PSBLAS 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. +! +! +subroutine amx_z_invk_solver_bld(a,desc_a,sv,info,b,amold,vmold,imold) + + + use psb_base_mod + use psb_z_invk_fact_mod ! This module contains the construction routines + + use amx_z_invk_solver, amg_protect_name => amx_z_invk_solver_bld + + Implicit None + + ! Arguments + type(psb_zspmat_type), intent(in), target :: a + Type(psb_desc_type), Intent(inout) :: desc_a + class(amx_z_invk_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(out) :: info + type(psb_zspmat_type), intent(in), target, optional :: b + class(psb_z_base_sparse_mat), intent(in), optional :: amold + class(psb_z_base_vect_type), intent(in), optional :: vmold + class(psb_i_base_vect_type), intent(in), optional :: imold + + ! Local variables + integer(psb_ipk_) :: n_row,n_col, nrow_a, nztota + complex(psb_dpk_), pointer :: ww(:), aux(:), tx(:),ty(:) + integer(psb_ipk_) :: np,me,i, err_act, debug_unit, debug_level + type(psb_ctxt_type) :: ctxt + character(len=20) :: name='z_invk_solver_bld', ch_err + + info=psb_success_ + call psb_erractionsave(err_act) + debug_unit = psb_get_debug_unit() + debug_level = psb_get_debug_level() + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (debug_level >= psb_debug_outer_) & + & write(debug_unit,*) me,' ',trim(name),' start' + + + call psb_invk_bld(a,sv%fill_in,sv%inv_fill,& + & sv%w,sv%d,sv%z,desc_a,info,b) + + + if ((info == psb_success_) .and.present(amold)) then + call sv%w%cscnv(info,mold=amold) + if (info == psb_success_) & + & call sv%z%cscnv(info,mold=amold) + end if + + if (info == psb_success_) then + call sv%dv%bld(sv%d,mold=vmold) + end if + if (debug_level >= psb_debug_outer_) & + & write(debug_unit,*) me,' ',trim(name),' end' + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amx_z_invk_solver_bld diff --git a/amgprec/impl/solver/amg_z_invk_solver_check.f90 b/amgprec/impl/solver/amg_z_invk_solver_check.f90 new file mode 100644 index 00000000..89eaf6e7 --- /dev/null +++ b/amgprec/impl/solver/amg_z_invk_solver_check.f90 @@ -0,0 +1,64 @@ +! +! +! AMG-AINV: Approximate Inverse plugin for +! AMG4PSBLAS version 1.0 +! +! (C) Copyright 2020 +! +! Salvatore Filippone University of Rome Tor Vergata +! +! 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 AMG4PSBLAS 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 AMG4PSBLAS 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. +! +! +subroutine amx_z_invk_solver_check(sv,info) + + + use psb_base_mod + use amx_z_invk_solver, amg_protect_name => amx_z_invk_solver_check + + Implicit None + + ! Arguments + class(amx_z_invk_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(out) :: info + Integer(Psb_Ipk_) :: err_act + character(len=20) :: name='z_invk_solver_check' + + call psb_erractionsave(err_act) + info = psb_success_ + + call amg_check_def(sv%fill_in,& + & 'Level',izero,is_int_non_negative) + call amg_check_def(sv%inv_fill,& + & 'Level',izero,is_int_non_negative) + + if (info /= psb_success_) goto 9999 + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amx_z_invk_solver_check diff --git a/amgprec/impl/solver/amg_z_invk_solver_clone.f90 b/amgprec/impl/solver/amg_z_invk_solver_clone.f90 new file mode 100644 index 00000000..e38cdb41 --- /dev/null +++ b/amgprec/impl/solver/amg_z_invk_solver_clone.f90 @@ -0,0 +1,90 @@ +! +! +! AMG4PSBLAS version 1.0 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.0) +! +! (C) Copyright 2008,2009,2010,2010,2012 +! +! Salvatore Filippone University of Rome Tor Vergata +! Alfredo Buttari CNRS-IRIT, Toulouse +! Pasqua D'Ambra ICAR-CNR, Naples +! Daniela di Serafino Second University of Naples +! +! 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 AMG4PSBLAS 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 AMG4PSBLAS 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. +! +! +subroutine amx_z_invk_solver_clone(sv,svout,info) + + use psb_base_mod + use amx_z_invk_solver, amg_protect_name => amx_z_invk_solver_clone + + Implicit None + + ! Arguments + class(amx_z_invk_solver_type), intent(inout) :: sv + class(amx_z_base_solver_type), allocatable, intent(inout) :: svout + integer(psb_ipk_), intent(out) :: info + ! Local variables + integer(psb_ipk_) :: err_act + + + info=psb_success_ + call psb_erractionsave(err_act) + + if (allocated(svout)) then + call svout%free(info) + if (info == psb_success_) deallocate(svout, stat=info) + end if + if (info == psb_success_) & + & allocate(amx_z_invk_solver_type :: svout, stat=info) + if (info /= 0) then + info = psb_err_alloc_dealloc_ + goto 9999 + end if + select type(svo => svout) + type is (amx_z_invk_solver_type) + svo%fill_in = sv%fill_in + svo%inv_fill = sv%inv_fill + call psb_safe_ab_cpy(sv%d,svo%d,info) + if (info == psb_success_) & + & call sv%dv%clone(svo%dv,info) + if (info == psb_success_) & + & call sv%w%clone(svo%w,info) + if (info == psb_success_) & + & call sv%z%clone(svo%z,info) + + class default + info = psb_err_internal_error_ + end select + + if (info /= 0) goto 9999 + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amx_z_invk_solver_clone diff --git a/amgprec/impl/solver/amg_z_invk_solver_cseti.f90 b/amgprec/impl/solver/amg_z_invk_solver_cseti.f90 new file mode 100644 index 00000000..99d2cc4d --- /dev/null +++ b/amgprec/impl/solver/amg_z_invk_solver_cseti.f90 @@ -0,0 +1,69 @@ +! +! +! AMG-AINV: Approximate Inverse plugin for +! AMG4PSBLAS version 1.0 +! +! (C) Copyright 2020 +! +! Salvatore Filippone University of Rome Tor Vergata +! +! 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 AMG4PSBLAS 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 AMG4PSBLAS 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. +! +! +subroutine amx_z_invk_solver_cseti(sv,what,val,info,idx) + + use psb_base_mod + use amx_z_invk_solver, amg_protect_name => amx_z_invk_solver_cseti + + Implicit None + + ! Arguments + class(amx_z_invk_solver_type), intent(inout) :: sv + character(len=*), intent(in) :: what + integer(psb_ipk_), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: idx + ! + integer(psb_ipk_) :: err_act + character(len=20) :: name='d_invk_solver_cseti' + + info = psb_success_ + call psb_erractionsave(err_act) + + select case(psb_toupper(what)) + case('SUB_FILLIN') + sv%fill_in = val + case('INV_FILLIN') + sv%inv_fill = val + case default + call sv%amx_z_base_solver_type%set(what,val,info) + end select + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amx_z_invk_solver_cseti diff --git a/amgprec/impl/solver/amg_z_invk_solver_descr.f90 b/amgprec/impl/solver/amg_z_invk_solver_descr.f90 new file mode 100644 index 00000000..2169370f --- /dev/null +++ b/amgprec/impl/solver/amg_z_invk_solver_descr.f90 @@ -0,0 +1,73 @@ +! +! +! AMG-AINV: Approximate Inverse plugin for +! AMG4PSBLAS version 1.0 +! +! (C) Copyright 2020 +! +! Salvatore Filippone University of Rome Tor Vergata +! +! 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 AMG4PSBLAS 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 AMG4PSBLAS 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. +! +! +subroutine amx_z_invk_solver_descr(sv,info,iout,coarse) + + + use psb_base_mod + use amx_z_invk_solver, amg_protect_name => amx_z_invk_solver_descr + + Implicit None + + ! Arguments + class(amx_z_invk_solver_type), intent(in) :: sv + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: iout + logical, intent(in), optional :: coarse + + ! Local variables + integer(psb_ipk_) :: err_act + integer(psb_ipk_) :: me, np + type(psb_ctxt_type) :: ctxt + character(len=20), parameter :: name='amx_z_invk_solver_descr' + integer(psb_ipk_) :: iout_ + + call psb_erractionsave(err_act) + info = psb_success_ + if (present(iout)) then + iout_ = iout + else + iout_ = 6 + endif + + write(iout_,*) ' INVK Approximate Inverse with ILU(N) ' + write(iout_,*) ' Fill level :',sv%fill_in + write(iout_,*) ' Inverse fill level :',sv%inv_fill + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amx_z_invk_solver_descr diff --git a/amgprec/impl/solver/amg_z_invk_solver_seti.f90 b/amgprec/impl/solver/amg_z_invk_solver_seti.f90 new file mode 100644 index 00000000..94bee2d1 --- /dev/null +++ b/amgprec/impl/solver/amg_z_invk_solver_seti.f90 @@ -0,0 +1,69 @@ +! +! +! AMG-AINV: Approximate Inverse plugin for +! AMG4PSBLAS version 1.0 +! +! (C) Copyright 2020 +! +! Salvatore Filippone University of Rome Tor Vergata +! +! 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 AMG4PSBLAS 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 AMG4PSBLAS 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. +! +! +subroutine amx_z_invk_solver_seti(sv,what,val,info) + + + use psb_base_mod + use amx_z_invk_solver, amg_protect_name => amx_z_invk_solver_seti + + Implicit None + + ! Arguments + class(amx_z_invk_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(in) :: what + integer(psb_ipk_), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + ! + integer(psb_ipk_) :: err_act + character(len=20) :: name='d_invk_solver_seti' + + info = psb_success_ + call psb_erractionsave(err_act) + + select case(what) + case(amg_sub_fillin_) + sv%fill_in = val + case(amg_inv_fillin_) + sv%inv_fill = val + case default + call sv%amx_z_base_solver_type%set(what,val,info) + end select + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amx_z_invk_solver_seti