From 606f4e95672083ecde3b5129348d81ab6a0a8032 Mon Sep 17 00:00:00 2001 From: Cirdans-Home Date: Thu, 26 Nov 2020 14:19:09 +0100 Subject: [PATCH] Added modules and implementation for INVT/INVK solver --- amgprec/Makefile | 12 +- amgprec/amg_c_invk_solver.f90 | 14 ++ amgprec/amg_c_invt_solver.f90 | 194 ++++++++++++++++++ amgprec/amg_d_invk_solver.f90 | 14 ++ amgprec/amg_d_invt_solver.f90 | 194 ++++++++++++++++++ amgprec/amg_s_invk_solver.f90 | 14 ++ amgprec/amg_s_invt_solver.f90 | 194 ++++++++++++++++++ amgprec/amg_z_invk_solver.f90 | 14 ++ amgprec/amg_z_invt_solver.f90 | 194 ++++++++++++++++++ amgprec/impl/solver/Makefile | 58 +++++- amgprec/impl/solver/amg_c_invk_solver_bld.f90 | 8 +- .../impl/solver/amg_c_invk_solver_check.f90 | 8 +- .../impl/solver/amg_c_invk_solver_clone.f90 | 14 +- .../impl/solver/amg_c_invk_solver_cseti.f90 | 10 +- .../impl/solver/amg_c_invk_solver_descr.f90 | 10 +- .../impl/solver/amg_c_invk_solver_seti.f90 | 12 +- amgprec/impl/solver/amg_c_invt_solver_bld.f90 | 97 +++++++++ .../impl/solver/amg_c_invt_solver_check.f90 | 69 +++++++ .../impl/solver/amg_c_invt_solver_clone.f90 | 92 +++++++++ .../impl/solver/amg_c_invt_solver_cseti.f90 | 69 +++++++ .../impl/solver/amg_c_invt_solver_csetr.f90 | 69 +++++++ .../impl/solver/amg_c_invt_solver_descr.f90 | 74 +++++++ .../impl/solver/amg_c_invt_solver_seti.f90 | 70 +++++++ .../impl/solver/amg_c_invt_solver_setr.f90 | 69 +++++++ amgprec/impl/solver/amg_d_invk_solver_bld.f90 | 8 +- .../impl/solver/amg_d_invk_solver_check.f90 | 8 +- .../impl/solver/amg_d_invk_solver_clone.f90 | 14 +- .../impl/solver/amg_d_invk_solver_cseti.f90 | 10 +- .../impl/solver/amg_d_invk_solver_descr.f90 | 10 +- .../impl/solver/amg_d_invk_solver_seti.f90 | 12 +- amgprec/impl/solver/amg_d_invt_solver_bld.f90 | 97 +++++++++ .../impl/solver/amg_d_invt_solver_check.f90 | 69 +++++++ .../impl/solver/amg_d_invt_solver_clone.f90 | 92 +++++++++ .../impl/solver/amg_d_invt_solver_cseti.f90 | 69 +++++++ .../impl/solver/amg_d_invt_solver_csetr.f90 | 69 +++++++ .../impl/solver/amg_d_invt_solver_descr.f90 | 74 +++++++ .../impl/solver/amg_d_invt_solver_seti.f90 | 70 +++++++ .../impl/solver/amg_d_invt_solver_setr.f90 | 69 +++++++ amgprec/impl/solver/amg_s_invk_solver_bld.f90 | 8 +- .../impl/solver/amg_s_invk_solver_check.f90 | 8 +- .../impl/solver/amg_s_invk_solver_clone.f90 | 14 +- .../impl/solver/amg_s_invk_solver_cseti.f90 | 10 +- .../impl/solver/amg_s_invk_solver_descr.f90 | 10 +- .../impl/solver/amg_s_invk_solver_seti.f90 | 12 +- amgprec/impl/solver/amg_s_invt_solver_bld.f90 | 97 +++++++++ .../impl/solver/amg_s_invt_solver_check.f90 | 69 +++++++ .../impl/solver/amg_s_invt_solver_clone.f90 | 92 +++++++++ .../impl/solver/amg_s_invt_solver_cseti.f90 | 69 +++++++ .../impl/solver/amg_s_invt_solver_csetr.f90 | 69 +++++++ .../impl/solver/amg_s_invt_solver_descr.f90 | 74 +++++++ .../impl/solver/amg_s_invt_solver_seti.f90 | 70 +++++++ .../impl/solver/amg_s_invt_solver_setr.f90 | 69 +++++++ amgprec/impl/solver/amg_z_invk_solver_bld.f90 | 8 +- .../impl/solver/amg_z_invk_solver_check.f90 | 8 +- .../impl/solver/amg_z_invk_solver_clone.f90 | 14 +- .../impl/solver/amg_z_invk_solver_cseti.f90 | 10 +- .../impl/solver/amg_z_invk_solver_descr.f90 | 10 +- .../impl/solver/amg_z_invk_solver_seti.f90 | 12 +- amgprec/impl/solver/amg_z_invt_solver_bld.f90 | 97 +++++++++ .../impl/solver/amg_z_invt_solver_check.f90 | 69 +++++++ .../impl/solver/amg_z_invt_solver_clone.f90 | 92 +++++++++ .../impl/solver/amg_z_invt_solver_cseti.f90 | 69 +++++++ .../impl/solver/amg_z_invt_solver_csetr.f90 | 69 +++++++ .../impl/solver/amg_z_invt_solver_descr.f90 | 74 +++++++ .../impl/solver/amg_z_invt_solver_seti.f90 | 70 +++++++ .../impl/solver/amg_z_invt_solver_setr.f90 | 69 +++++++ 66 files changed, 3457 insertions(+), 129 deletions(-) create mode 100644 amgprec/amg_c_invt_solver.f90 create mode 100644 amgprec/amg_d_invt_solver.f90 create mode 100644 amgprec/amg_s_invt_solver.f90 create mode 100644 amgprec/amg_z_invt_solver.f90 create mode 100644 amgprec/impl/solver/amg_c_invt_solver_bld.f90 create mode 100644 amgprec/impl/solver/amg_c_invt_solver_check.f90 create mode 100644 amgprec/impl/solver/amg_c_invt_solver_clone.f90 create mode 100644 amgprec/impl/solver/amg_c_invt_solver_cseti.f90 create mode 100644 amgprec/impl/solver/amg_c_invt_solver_csetr.f90 create mode 100644 amgprec/impl/solver/amg_c_invt_solver_descr.f90 create mode 100644 amgprec/impl/solver/amg_c_invt_solver_seti.f90 create mode 100644 amgprec/impl/solver/amg_c_invt_solver_setr.f90 create mode 100644 amgprec/impl/solver/amg_d_invt_solver_bld.f90 create mode 100644 amgprec/impl/solver/amg_d_invt_solver_check.f90 create mode 100644 amgprec/impl/solver/amg_d_invt_solver_clone.f90 create mode 100644 amgprec/impl/solver/amg_d_invt_solver_cseti.f90 create mode 100644 amgprec/impl/solver/amg_d_invt_solver_csetr.f90 create mode 100644 amgprec/impl/solver/amg_d_invt_solver_descr.f90 create mode 100644 amgprec/impl/solver/amg_d_invt_solver_seti.f90 create mode 100644 amgprec/impl/solver/amg_d_invt_solver_setr.f90 create mode 100644 amgprec/impl/solver/amg_s_invt_solver_bld.f90 create mode 100644 amgprec/impl/solver/amg_s_invt_solver_check.f90 create mode 100644 amgprec/impl/solver/amg_s_invt_solver_clone.f90 create mode 100644 amgprec/impl/solver/amg_s_invt_solver_cseti.f90 create mode 100644 amgprec/impl/solver/amg_s_invt_solver_csetr.f90 create mode 100644 amgprec/impl/solver/amg_s_invt_solver_descr.f90 create mode 100644 amgprec/impl/solver/amg_s_invt_solver_seti.f90 create mode 100644 amgprec/impl/solver/amg_s_invt_solver_setr.f90 create mode 100644 amgprec/impl/solver/amg_z_invt_solver_bld.f90 create mode 100644 amgprec/impl/solver/amg_z_invt_solver_check.f90 create mode 100644 amgprec/impl/solver/amg_z_invt_solver_clone.f90 create mode 100644 amgprec/impl/solver/amg_z_invt_solver_cseti.f90 create mode 100644 amgprec/impl/solver/amg_z_invt_solver_csetr.f90 create mode 100644 amgprec/impl/solver/amg_z_invt_solver_descr.f90 create mode 100644 amgprec/impl/solver/amg_z_invt_solver_seti.f90 create mode 100644 amgprec/impl/solver/amg_z_invt_solver_setr.f90 diff --git a/amgprec/Makefile b/amgprec/Makefile index 60cb43d1..d839eef8 100644 --- a/amgprec/Makefile +++ b/amgprec/Makefile @@ -15,7 +15,7 @@ DMODOBJS=amg_d_prec_type.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_invk_solver.o + amg_d_invk_solver.o amg_d_invt_solver.o #amg_d_bcmatch_aggregator_mod.o SMODOBJS=amg_s_prec_type.o amg_s_ilu_fact_mod.o \ @@ -26,7 +26,7 @@ SMODOBJS=amg_s_prec_type.o amg_s_ilu_fact_mod.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_invk_solver.o + amg_s_invk_solver.o amg_s_invt_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 \ @@ -36,7 +36,7 @@ ZMODOBJS=amg_z_prec_type.o amg_z_ilu_fact_mod.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_invk_solver.o + amg_z_invk_solver.o amg_z_invt_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 \ @@ -46,7 +46,7 @@ CMODOBJS=amg_c_prec_type.o amg_c_ilu_fact_mod.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_invk_solver.o + amg_c_invk_solver.o amg_c_invt_solver.o @@ -182,6 +182,10 @@ 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 +amg_s_invt_solver.o: amg_base_ainv_mod.o amg_s_base_ainv_mod.o +amg_d_invt_solver.o: amg_base_ainv_mod.o amg_d_base_ainv_mod.o +amg_c_invt_solver.o: amg_base_ainv_mod.o amg_c_base_ainv_mod.o +amg_z_invt_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 index 43e588f4..44ad0a77 100644 --- a/amgprec/amg_c_invk_solver.f90 +++ b/amgprec/amg_c_invk_solver.f90 @@ -51,6 +51,8 @@ module amg_c_invk_solver 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) :: seti => amg_c_invk_solver_seti + generic, public :: set => seti procedure, pass(sv) :: descr => amg_c_invk_solver_descr procedure, pass(sv) :: default => c_invk_solver_default end type amg_c_invk_solver_type @@ -134,6 +136,18 @@ module amg_c_invk_solver end subroutine amg_c_invk_solver_descr end interface + interface + subroutine amg_c_invk_solver_seti(sv,what,val,info) + import :: amg_c_invk_solver_type, psb_ipk_ + Implicit none + ! Arguments + class(amg_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 + end subroutine amg_c_invk_solver_seti + end interface + contains subroutine c_invk_solver_default(sv) diff --git a/amgprec/amg_c_invt_solver.f90 b/amgprec/amg_c_invt_solver.f90 new file mode 100644 index 00000000..2cec974c --- /dev/null +++ b/amgprec/amg_c_invt_solver.f90 @@ -0,0 +1,194 @@ +! +! +! 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_invt_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_invt_solver_type + integer(psb_ipk_) :: fill_in, inv_fill + real(psb_spk_) :: thresh, inv_thresh + contains + procedure, pass(sv) :: check => amg_c_invt_solver_check + procedure, pass(sv) :: clone => amg_c_invt_solver_clone + procedure, pass(sv) :: build => amg_c_invt_solver_bld + procedure, pass(sv) :: cseti => amg_c_invt_solver_cseti + procedure, pass(sv) :: csetr => amg_c_invt_solver_csetr + procedure, pass(sv) :: seti => amg_c_invt_solver_seti + procedure, pass(sv) :: setr => amg_c_invt_solver_setr + generic, public :: set => seti, setr + procedure, pass(sv) :: descr => amg_c_invt_solver_descr + procedure, pass(sv) :: default => c_invt_solver_default + end type amg_c_invt_solver_type + + private :: c_invt_solver_default + + + interface + subroutine amg_c_invt_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_invt_solver_type, psb_ipk_ + Implicit None + class(amg_c_invt_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_invt_solver_clone + end interface + + interface + subroutine amg_c_invt_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_invt_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_invt_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_invt_solver_bld + end interface + + interface + subroutine amg_c_invt_solver_check(sv,info) + import :: amg_c_invt_solver_type, psb_ipk_ + + Implicit None + + ! Arguments + class(amg_c_invt_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(out) :: info + end subroutine amg_c_invt_solver_check + end interface + + interface + subroutine amg_c_invt_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_invt_solver_type + Implicit None + ! Arguments + class(amg_c_invt_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_invt_solver_cseti + end interface + + interface + subroutine amg_c_invt_solver_csetr(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_invt_solver_type + Implicit None + ! Arguments + class(amg_c_invt_solver_type), intent(inout) :: sv + character(len=*), intent(in) :: what + real(psb_spk_), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: idx + end subroutine amg_c_invt_solver_csetr + end interface + + interface + subroutine amg_c_invt_solver_descr(sv,info,iout,coarse) + import :: psb_spk_, amg_c_invt_solver_type, psb_ipk_ + + Implicit None + + ! Arguments + class(amg_c_invt_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_invt_solver_descr + end interface + + interface + subroutine amg_c_invt_solver_setr(sv,what,val,info) + import :: amg_c_invt_solver_type, psb_spk_, psb_ipk_ + Implicit none + ! Arguments + class(amg_c_invt_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(in) :: what + real(psb_spk_), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + end subroutine amg_c_invt_solver_setr + end interface + + interface + subroutine amg_c_invt_solver_seti(sv,what,val,info) + import :: amg_c_invt_solver_type, psb_ipk_ + Implicit none + ! Arguments + class(amg_c_invt_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(in) :: what + integer(psb_ipk_), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + end subroutine + end interface + +contains + + subroutine c_invt_solver_default(sv) + + !use psb_base_mod + + Implicit None + + ! Arguments + class(amg_c_invt_solver_type), intent(inout) :: sv + + sv%fill_in = 0 + sv%inv_fill = 0 + sv%thresh = szero + sv%inv_thresh = szero + + return + end subroutine c_invt_solver_default + +end module amg_c_invt_solver diff --git a/amgprec/amg_d_invk_solver.f90 b/amgprec/amg_d_invk_solver.f90 index ca980d09..d2d08537 100644 --- a/amgprec/amg_d_invk_solver.f90 +++ b/amgprec/amg_d_invk_solver.f90 @@ -51,6 +51,8 @@ module amg_d_invk_solver 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) :: seti => amg_d_invk_solver_seti + generic, public :: set => seti procedure, pass(sv) :: descr => amg_d_invk_solver_descr procedure, pass(sv) :: default => d_invk_solver_default end type amg_d_invk_solver_type @@ -134,6 +136,18 @@ module amg_d_invk_solver end subroutine amg_d_invk_solver_descr end interface + interface + subroutine amg_d_invk_solver_seti(sv,what,val,info) + import :: amg_d_invk_solver_type, psb_ipk_ + Implicit none + ! Arguments + class(amg_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 + end subroutine amg_d_invk_solver_seti + end interface + contains subroutine d_invk_solver_default(sv) diff --git a/amgprec/amg_d_invt_solver.f90 b/amgprec/amg_d_invt_solver.f90 new file mode 100644 index 00000000..fecf4f27 --- /dev/null +++ b/amgprec/amg_d_invt_solver.f90 @@ -0,0 +1,194 @@ +! +! +! 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_invt_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_invt_solver_type + integer(psb_ipk_) :: fill_in, inv_fill + real(psb_dpk_) :: thresh, inv_thresh + contains + procedure, pass(sv) :: check => amg_d_invt_solver_check + procedure, pass(sv) :: clone => amg_d_invt_solver_clone + procedure, pass(sv) :: build => amg_d_invt_solver_bld + procedure, pass(sv) :: cseti => amg_d_invt_solver_cseti + procedure, pass(sv) :: csetr => amg_d_invt_solver_csetr + procedure, pass(sv) :: seti => amg_d_invt_solver_seti + procedure, pass(sv) :: setr => amg_d_invt_solver_setr + generic, public :: set => seti, setr + procedure, pass(sv) :: descr => amg_d_invt_solver_descr + procedure, pass(sv) :: default => d_invt_solver_default + end type amg_d_invt_solver_type + + private :: d_invt_solver_default + + + interface + subroutine amg_d_invt_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_invt_solver_type, psb_ipk_ + Implicit None + class(amg_d_invt_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_invt_solver_clone + end interface + + interface + subroutine amg_d_invt_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_invt_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_invt_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_invt_solver_bld + end interface + + interface + subroutine amg_d_invt_solver_check(sv,info) + import :: amg_d_invt_solver_type, psb_ipk_ + + Implicit None + + ! Arguments + class(amg_d_invt_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(out) :: info + end subroutine amg_d_invt_solver_check + end interface + + interface + subroutine amg_d_invt_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_invt_solver_type + Implicit None + ! Arguments + class(amg_d_invt_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_invt_solver_cseti + end interface + + interface + subroutine amg_d_invt_solver_csetr(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_invt_solver_type + Implicit None + ! Arguments + class(amg_d_invt_solver_type), intent(inout) :: sv + character(len=*), intent(in) :: what + real(psb_dpk_), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: idx + end subroutine amg_d_invt_solver_csetr + end interface + + interface + subroutine amg_d_invt_solver_descr(sv,info,iout,coarse) + import :: psb_dpk_, amg_d_invt_solver_type, psb_ipk_ + + Implicit None + + ! Arguments + class(amg_d_invt_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_invt_solver_descr + end interface + + interface + subroutine amg_d_invt_solver_setr(sv,what,val,info) + import :: amg_d_invt_solver_type, psb_dpk_, psb_ipk_ + Implicit none + ! Arguments + class(amg_d_invt_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(in) :: what + real(psb_dpk_), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + end subroutine amg_d_invt_solver_setr + end interface + + interface + subroutine amg_d_invt_solver_seti(sv,what,val,info) + import :: amg_d_invt_solver_type, psb_ipk_ + Implicit none + ! Arguments + class(amg_d_invt_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(in) :: what + integer(psb_ipk_), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + end subroutine + end interface + +contains + + subroutine d_invt_solver_default(sv) + + !use psb_base_mod + + Implicit None + + ! Arguments + class(amg_d_invt_solver_type), intent(inout) :: sv + + sv%fill_in = 0 + sv%inv_fill = 0 + sv%thresh = dzero + sv%inv_thresh = dzero + + return + end subroutine d_invt_solver_default + +end module amg_d_invt_solver diff --git a/amgprec/amg_s_invk_solver.f90 b/amgprec/amg_s_invk_solver.f90 index f7540cf7..6ea2a43f 100644 --- a/amgprec/amg_s_invk_solver.f90 +++ b/amgprec/amg_s_invk_solver.f90 @@ -51,6 +51,8 @@ module amg_s_invk_solver 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) :: seti => amg_s_invk_solver_seti + generic, public :: set => seti procedure, pass(sv) :: descr => amg_s_invk_solver_descr procedure, pass(sv) :: default => s_invk_solver_default end type amg_s_invk_solver_type @@ -134,6 +136,18 @@ module amg_s_invk_solver end subroutine amg_s_invk_solver_descr end interface + interface + subroutine amg_s_invk_solver_seti(sv,what,val,info) + import :: amg_s_invk_solver_type, psb_ipk_ + Implicit none + ! Arguments + class(amg_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 + end subroutine amg_s_invk_solver_seti + end interface + contains subroutine s_invk_solver_default(sv) diff --git a/amgprec/amg_s_invt_solver.f90 b/amgprec/amg_s_invt_solver.f90 new file mode 100644 index 00000000..64a3e87d --- /dev/null +++ b/amgprec/amg_s_invt_solver.f90 @@ -0,0 +1,194 @@ +! +! +! 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_invt_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_invt_solver_type + integer(psb_ipk_) :: fill_in, inv_fill + real(psb_spk_) :: thresh, inv_thresh + contains + procedure, pass(sv) :: check => amg_s_invt_solver_check + procedure, pass(sv) :: clone => amg_s_invt_solver_clone + procedure, pass(sv) :: build => amg_s_invt_solver_bld + procedure, pass(sv) :: cseti => amg_s_invt_solver_cseti + procedure, pass(sv) :: csetr => amg_s_invt_solver_csetr + procedure, pass(sv) :: seti => amg_s_invt_solver_seti + procedure, pass(sv) :: setr => amg_s_invt_solver_setr + generic, public :: set => seti, setr + procedure, pass(sv) :: descr => amg_s_invt_solver_descr + procedure, pass(sv) :: default => s_invt_solver_default + end type amg_s_invt_solver_type + + private :: s_invt_solver_default + + + interface + subroutine amg_s_invt_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_invt_solver_type, psb_ipk_ + Implicit None + class(amg_s_invt_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_invt_solver_clone + end interface + + interface + subroutine amg_s_invt_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_invt_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_invt_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_invt_solver_bld + end interface + + interface + subroutine amg_s_invt_solver_check(sv,info) + import :: amg_s_invt_solver_type, psb_ipk_ + + Implicit None + + ! Arguments + class(amg_s_invt_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(out) :: info + end subroutine amg_s_invt_solver_check + end interface + + interface + subroutine amg_s_invt_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_invt_solver_type + Implicit None + ! Arguments + class(amg_s_invt_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_invt_solver_cseti + end interface + + interface + subroutine amg_s_invt_solver_csetr(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_invt_solver_type + Implicit None + ! Arguments + class(amg_s_invt_solver_type), intent(inout) :: sv + character(len=*), intent(in) :: what + real(psb_spk_), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: idx + end subroutine amg_s_invt_solver_csetr + end interface + + interface + subroutine amg_s_invt_solver_descr(sv,info,iout,coarse) + import :: psb_spk_, amg_s_invt_solver_type, psb_ipk_ + + Implicit None + + ! Arguments + class(amg_s_invt_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_invt_solver_descr + end interface + + interface + subroutine amg_s_invt_solver_setr(sv,what,val,info) + import :: amg_s_invt_solver_type, psb_spk_, psb_ipk_ + Implicit none + ! Arguments + class(amg_s_invt_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(in) :: what + real(psb_spk_), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + end subroutine amg_s_invt_solver_setr + end interface + + interface + subroutine amg_s_invt_solver_seti(sv,what,val,info) + import :: amg_s_invt_solver_type, psb_ipk_ + Implicit none + ! Arguments + class(amg_s_invt_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(in) :: what + integer(psb_ipk_), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + end subroutine + end interface + +contains + + subroutine s_invt_solver_default(sv) + + !use psb_base_mod + + Implicit None + + ! Arguments + class(amg_s_invt_solver_type), intent(inout) :: sv + + sv%fill_in = 0 + sv%inv_fill = 0 + sv%thresh = szero + sv%inv_thresh = szero + + return + end subroutine s_invt_solver_default + +end module amg_s_invt_solver diff --git a/amgprec/amg_z_invk_solver.f90 b/amgprec/amg_z_invk_solver.f90 index 9cf02aff..86bf6f41 100644 --- a/amgprec/amg_z_invk_solver.f90 +++ b/amgprec/amg_z_invk_solver.f90 @@ -51,6 +51,8 @@ module amg_z_invk_solver 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) :: seti => amg_z_invk_solver_seti + generic, public :: set => seti procedure, pass(sv) :: descr => amg_z_invk_solver_descr procedure, pass(sv) :: default => z_invk_solver_default end type amg_z_invk_solver_type @@ -134,6 +136,18 @@ module amg_z_invk_solver end subroutine amg_z_invk_solver_descr end interface + interface + subroutine amg_z_invk_solver_seti(sv,what,val,info) + import :: amg_z_invk_solver_type, psb_ipk_ + Implicit none + ! Arguments + class(amg_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 + end subroutine amg_z_invk_solver_seti + end interface + contains subroutine z_invk_solver_default(sv) diff --git a/amgprec/amg_z_invt_solver.f90 b/amgprec/amg_z_invt_solver.f90 new file mode 100644 index 00000000..b8609bc7 --- /dev/null +++ b/amgprec/amg_z_invt_solver.f90 @@ -0,0 +1,194 @@ +! +! +! 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_invt_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_invt_solver_type + integer(psb_ipk_) :: fill_in, inv_fill + real(psb_dpk_) :: thresh, inv_thresh + contains + procedure, pass(sv) :: check => amg_z_invt_solver_check + procedure, pass(sv) :: clone => amg_z_invt_solver_clone + procedure, pass(sv) :: build => amg_z_invt_solver_bld + procedure, pass(sv) :: cseti => amg_z_invt_solver_cseti + procedure, pass(sv) :: csetr => amg_z_invt_solver_csetr + procedure, pass(sv) :: seti => amg_z_invt_solver_seti + procedure, pass(sv) :: setr => amg_z_invt_solver_setr + generic, public :: set => seti, setr + procedure, pass(sv) :: descr => amg_z_invt_solver_descr + procedure, pass(sv) :: default => z_invt_solver_default + end type amg_z_invt_solver_type + + private :: z_invt_solver_default + + + interface + subroutine amg_z_invt_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_invt_solver_type, psb_ipk_ + Implicit None + class(amg_z_invt_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_invt_solver_clone + end interface + + interface + subroutine amg_z_invt_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_invt_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_invt_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_invt_solver_bld + end interface + + interface + subroutine amg_z_invt_solver_check(sv,info) + import :: amg_z_invt_solver_type, psb_ipk_ + + Implicit None + + ! Arguments + class(amg_z_invt_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(out) :: info + end subroutine amg_z_invt_solver_check + end interface + + interface + subroutine amg_z_invt_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_invt_solver_type + Implicit None + ! Arguments + class(amg_z_invt_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_invt_solver_cseti + end interface + + interface + subroutine amg_z_invt_solver_csetr(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_invt_solver_type + Implicit None + ! Arguments + class(amg_z_invt_solver_type), intent(inout) :: sv + character(len=*), intent(in) :: what + real(psb_dpk_), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: idx + end subroutine amg_z_invt_solver_csetr + end interface + + interface + subroutine amg_z_invt_solver_descr(sv,info,iout,coarse) + import :: psb_dpk_, amg_z_invt_solver_type, psb_ipk_ + + Implicit None + + ! Arguments + class(amg_z_invt_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_invt_solver_descr + end interface + + interface + subroutine amg_z_invt_solver_setr(sv,what,val,info) + import :: amg_z_invt_solver_type, psb_dpk_, psb_ipk_ + Implicit none + ! Arguments + class(amg_z_invt_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(in) :: what + real(psb_dpk_), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + end subroutine amg_z_invt_solver_setr + end interface + + interface + subroutine amg_z_invt_solver_seti(sv,what,val,info) + import :: amg_z_invt_solver_type, psb_ipk_ + Implicit none + ! Arguments + class(amg_z_invt_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(in) :: what + integer(psb_ipk_), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + end subroutine + end interface + +contains + + subroutine z_invt_solver_default(sv) + + !use psb_base_mod + + Implicit None + + ! Arguments + class(amg_z_invt_solver_type), intent(inout) :: sv + + sv%fill_in = 0 + sv%inv_fill = 0 + sv%thresh = dzero + sv%inv_thresh = dzero + + return + end subroutine z_invt_solver_default + +end module amg_z_invt_solver diff --git a/amgprec/impl/solver/Makefile b/amgprec/impl/solver/Makefile index fe449cd5..2ad66c71 100644 --- a/amgprec/impl/solver/Makefile +++ b/amgprec/impl/solver/Makefile @@ -244,7 +244,63 @@ amg_z_base_ainv_solver_apply.o \ amg_z_base_ainv_solver_cnv.o \ amg_z_base_ainv_solver_dmp.o \ amg_z_base_ainv_solver_free.o \ -amg_z_base_ainv_update_a.o +amg_z_base_ainv_update_a.o \ +amg_d_invt_solver_bld.o \ +amg_d_invt_solver_check.o \ +amg_d_invt_solver_clone.o \ +amg_d_invt_solver_cseti.o \ +amg_d_invt_solver_csetr.o \ +amg_d_invt_solver_descr.o \ +amg_d_invt_solver_seti.o \ +amg_d_invt_solver_setr.o \ +amg_d_invk_solver_bld.o \ +amg_d_invk_solver_check.o \ +amg_d_invk_solver_clone.o \ +amg_d_invk_solver_cseti.o \ +amg_d_invk_solver_descr.o \ +amg_d_invk_solver_seti.o \ +amg_s_invt_solver_bld.o \ +amg_s_invt_solver_check.o \ +amg_s_invt_solver_clone.o \ +amg_s_invt_solver_cseti.o \ +amg_s_invt_solver_csetr.o \ +amg_s_invt_solver_descr.o \ +amg_s_invt_solver_seti.o \ +amg_s_invt_solver_setr.o \ +amg_s_invk_solver_bld.o \ +amg_s_invk_solver_check.o \ +amg_s_invk_solver_clone.o \ +amg_s_invk_solver_cseti.o \ +amg_s_invk_solver_descr.o \ +amg_s_invk_solver_seti.o \ +amg_c_invt_solver_bld.o \ +amg_c_invt_solver_check.o \ +amg_c_invt_solver_clone.o \ +amg_c_invt_solver_cseti.o \ +amg_c_invt_solver_csetr.o \ +amg_c_invt_solver_descr.o \ +amg_c_invt_solver_seti.o \ +amg_c_invt_solver_setr.o \ +amg_c_invk_solver_bld.o \ +amg_c_invk_solver_check.o \ +amg_c_invk_solver_clone.o \ +amg_c_invk_solver_cseti.o \ +amg_c_invk_solver_descr.o \ +amg_c_invk_solver_seti.o \ +amg_z_invt_solver_bld.o \ +amg_z_invt_solver_check.o \ +amg_z_invt_solver_clone.o \ +amg_z_invt_solver_cseti.o \ +amg_z_invt_solver_csetr.o \ +amg_z_invt_solver_descr.o \ +amg_z_invt_solver_seti.o \ +amg_z_invt_solver_setr.o \ +amg_z_invk_solver_bld.o \ +amg_z_invk_solver_check.o \ +amg_z_invk_solver_clone.o \ +amg_z_invk_solver_cseti.o \ +amg_z_invk_solver_descr.o \ +amg_z_invk_solver_seti.o LIBNAME=libamg_prec.a diff --git a/amgprec/impl/solver/amg_c_invk_solver_bld.f90 b/amgprec/impl/solver/amg_c_invk_solver_bld.f90 index 2c2eb6ea..30956c75 100644 --- a/amgprec/impl/solver/amg_c_invk_solver_bld.f90 +++ b/amgprec/impl/solver/amg_c_invk_solver_bld.f90 @@ -32,20 +32,20 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -subroutine amx_c_invk_solver_bld(a,desc_a,sv,info,b,amold,vmold,imold) +subroutine amg_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 + use amg_c_invk_solver, amg_protect_name => amg_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 + 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 @@ -90,4 +90,4 @@ subroutine amx_c_invk_solver_bld(a,desc_a,sv,info,b,amold,vmold,imold) 9999 call psb_error_handler(err_act) return -end subroutine amx_c_invk_solver_bld +end subroutine amg_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 index b23b71b5..991ff25a 100644 --- a/amgprec/impl/solver/amg_c_invk_solver_check.f90 +++ b/amgprec/impl/solver/amg_c_invk_solver_check.f90 @@ -32,16 +32,16 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -subroutine amx_c_invk_solver_check(sv,info) +subroutine amg_c_invk_solver_check(sv,info) use psb_base_mod - use amx_c_invk_solver, amg_protect_name => amx_c_invk_solver_check + use amg_c_invk_solver, amg_protect_name => amg_c_invk_solver_check Implicit None ! Arguments - class(amx_c_invk_solver_type), intent(inout) :: sv + class(amg_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' @@ -61,4 +61,4 @@ subroutine amx_c_invk_solver_check(sv,info) 9999 call psb_error_handler(err_act) return -end subroutine amx_c_invk_solver_check +end subroutine amg_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 index e6da4ae6..8642a637 100644 --- a/amgprec/impl/solver/amg_c_invk_solver_clone.f90 +++ b/amgprec/impl/solver/amg_c_invk_solver_clone.f90 @@ -36,16 +36,16 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -subroutine amx_c_invk_solver_clone(sv,svout,info) +subroutine amg_c_invk_solver_clone(sv,svout,info) use psb_base_mod - use amx_c_invk_solver, amg_protect_name => amx_c_invk_solver_clone + use amg_c_invk_solver, amg_protect_name => amg_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 + 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 ! Local variables integer(psb_ipk_) :: err_act @@ -59,13 +59,13 @@ subroutine amx_c_invk_solver_clone(sv,svout,info) if (info == psb_success_) deallocate(svout, stat=info) end if if (info == psb_success_) & - & allocate(amx_c_invk_solver_type :: svout, stat=info) + & allocate(amg_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) + type is (amg_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) @@ -87,4 +87,4 @@ subroutine amx_c_invk_solver_clone(sv,svout,info) 9999 call psb_error_handler(err_act) return -end subroutine amx_c_invk_solver_clone +end subroutine amg_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 index 8b03eb8f..0033e202 100644 --- a/amgprec/impl/solver/amg_c_invk_solver_cseti.f90 +++ b/amgprec/impl/solver/amg_c_invk_solver_cseti.f90 @@ -32,15 +32,15 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -subroutine amx_c_invk_solver_cseti(sv,what,val,info,idx) +subroutine amg_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 + use amg_c_invk_solver, amg_protect_name => amg_c_invk_solver_cseti Implicit None ! Arguments - class(amx_c_invk_solver_type), intent(inout) :: sv + 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 @@ -58,7 +58,7 @@ subroutine amx_c_invk_solver_cseti(sv,what,val,info,idx) case('INV_FILLIN') sv%inv_fill = val case default - call sv%amx_c_base_solver_type%set(what,val,info) + call sv%amg_c_base_solver_type%set(what,val,info) end select call psb_erractionrestore(err_act) @@ -66,4 +66,4 @@ subroutine amx_c_invk_solver_cseti(sv,what,val,info,idx) 9999 call psb_error_handler(err_act) return -end subroutine amx_c_invk_solver_cseti +end subroutine amg_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 index cd07eb5b..31777e5f 100644 --- a/amgprec/impl/solver/amg_c_invk_solver_descr.f90 +++ b/amgprec/impl/solver/amg_c_invk_solver_descr.f90 @@ -32,16 +32,16 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -subroutine amx_c_invk_solver_descr(sv,info,iout,coarse) +subroutine amg_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 + use amg_c_invk_solver, amg_protect_name => amg_c_invk_solver_descr Implicit None ! Arguments - class(amx_c_invk_solver_type), intent(in) :: sv + 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 @@ -50,7 +50,7 @@ subroutine amx_c_invk_solver_descr(sv,info,iout,coarse) 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' + character(len=20), parameter :: name='amg_c_invk_solver_descr' integer(psb_ipk_) :: iout_ call psb_erractionsave(err_act) @@ -70,4 +70,4 @@ subroutine amx_c_invk_solver_descr(sv,info,iout,coarse) 9999 call psb_error_handler(err_act) return -end subroutine amx_c_invk_solver_descr +end subroutine amg_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 index 995937d6..52c23eb8 100644 --- a/amgprec/impl/solver/amg_c_invk_solver_seti.f90 +++ b/amgprec/impl/solver/amg_c_invk_solver_seti.f90 @@ -1,4 +1,4 @@ -! +! ! ! AMG-AINV: Approximate Inverse plugin for ! AMG4PSBLAS version 1.0 @@ -32,16 +32,16 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -subroutine amx_c_invk_solver_seti(sv,what,val,info) +subroutine amg_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 + use amg_c_invk_solver, amg_protect_name => amg_c_invk_solver_seti Implicit None ! Arguments - class(amx_c_invk_solver_type), intent(inout) :: sv + class(amg_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 @@ -58,7 +58,7 @@ subroutine amx_c_invk_solver_seti(sv,what,val,info) case(amg_inv_fillin_) sv%inv_fill = val case default - call sv%amx_c_base_solver_type%set(what,val,info) + ! call sv%amg_c_base_solver_type%set(what,val,info) end select call psb_erractionrestore(err_act) @@ -66,4 +66,4 @@ subroutine amx_c_invk_solver_seti(sv,what,val,info) 9999 call psb_error_handler(err_act) return -end subroutine amx_c_invk_solver_seti +end subroutine amg_c_invk_solver_seti diff --git a/amgprec/impl/solver/amg_c_invt_solver_bld.f90 b/amgprec/impl/solver/amg_c_invt_solver_bld.f90 new file mode 100644 index 00000000..88732da2 --- /dev/null +++ b/amgprec/impl/solver/amg_c_invt_solver_bld.f90 @@ -0,0 +1,97 @@ +! +! +! 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 amg_c_invt_solver_bld(a,desc_a,sv,info,b,amold,vmold,imold) + + use psb_base_mod + use psb_c_invt_fact_mod ! This module contains the construction routines + use amg_c_invt_solver, amg_protect_name => amg_c_invt_solver_bld + + Implicit None + + ! Arguments + type(psb_cspmat_type), intent(in), target :: a + Type(psb_desc_type), Intent(inout) :: desc_a + class(amg_c_invt_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='amg_c_invt_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_invt_bld(a,sv%fill_in,sv%inv_fill,& + & sv%thresh,sv%inv_thresh,& + & 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 (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name) + goto 9999 + 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 amg_c_invt_solver_bld diff --git a/amgprec/impl/solver/amg_c_invt_solver_check.f90 b/amgprec/impl/solver/amg_c_invt_solver_check.f90 new file mode 100644 index 00000000..e4e0b9e1 --- /dev/null +++ b/amgprec/impl/solver/amg_c_invt_solver_check.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 amg_c_invt_solver_check(sv,info) + + + use psb_base_mod + use amg_c_invt_solver, amg_protect_name => amg_c_invt_solver_check + + Implicit None + + ! Arguments + class(amg_c_invt_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(out) :: info + ! + Integer(Psb_Ipk_) :: err_act + character(len=20) :: name='amg_c_invt_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) + call amg_check_def(sv%thresh,& + & 'Eps',szero,is_legal_s_fact_thrs) + call amg_check_def(sv%inv_thresh,& + & 'Eps',szero,is_legal_s_fact_thrs) + + if (info /= psb_success_) goto 9999 + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amg_c_invt_solver_check diff --git a/amgprec/impl/solver/amg_c_invt_solver_clone.f90 b/amgprec/impl/solver/amg_c_invt_solver_clone.f90 new file mode 100644 index 00000000..0f758764 --- /dev/null +++ b/amgprec/impl/solver/amg_c_invt_solver_clone.f90 @@ -0,0 +1,92 @@ +! +! +! 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 amg_c_invt_solver_clone(sv,svout,info) + + use psb_base_mod + use amg_c_invt_solver, amg_protect_name => amg_c_invt_solver_clone + + Implicit None + + ! Arguments + class(amg_c_invt_solver_type), intent(inout) :: sv + class(amg_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(amg_c_invt_solver_type :: svout, stat=info) + if (info /= 0) then + info = psb_err_alloc_dealloc_ + goto 9999 + end if + select type(svo => svout) + type is (amg_c_invt_solver_type) + svo%fill_in = sv%fill_in + svo%inv_fill = sv%inv_fill + svo%thresh = sv%thresh + svo%inv_thresh = sv%inv_thresh + 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 amg_c_invt_solver_clone diff --git a/amgprec/impl/solver/amg_c_invt_solver_cseti.f90 b/amgprec/impl/solver/amg_c_invt_solver_cseti.f90 new file mode 100644 index 00000000..8670f97a --- /dev/null +++ b/amgprec/impl/solver/amg_c_invt_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 amg_c_invt_solver_cseti(sv,what,val,info,idx) + + use psb_base_mod + use amg_c_invt_solver, amg_protect_name => amg_c_invt_solver_cseti + + Implicit None + + ! Arguments + class(amg_c_invt_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='amg_c_invt_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%amg_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 amg_c_invt_solver_cseti diff --git a/amgprec/impl/solver/amg_c_invt_solver_csetr.f90 b/amgprec/impl/solver/amg_c_invt_solver_csetr.f90 new file mode 100644 index 00000000..317b6719 --- /dev/null +++ b/amgprec/impl/solver/amg_c_invt_solver_csetr.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 amg_c_invt_solver_csetr(sv,what,val,info,idx) + + use psb_base_mod + use amg_c_invt_solver, amg_protect_name => amg_c_invt_solver_csetr + + Implicit None + + ! Arguments + class(amg_c_invt_solver_type), intent(inout) :: sv + character(len=*), intent(in) :: what + real(psb_spk_), 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='amg_c_invt_solver_csetr' + + call psb_erractionsave(err_act) + info = psb_success_ + + select case(psb_toupper(what)) + case('SUB_ILUTHRS') + sv%thresh = val + case('INV_THRESH') + sv%inv_thresh = val + case default + call sv%amg_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 amg_c_invt_solver_csetr diff --git a/amgprec/impl/solver/amg_c_invt_solver_descr.f90 b/amgprec/impl/solver/amg_c_invt_solver_descr.f90 new file mode 100644 index 00000000..cf6a3837 --- /dev/null +++ b/amgprec/impl/solver/amg_c_invt_solver_descr.f90 @@ -0,0 +1,74 @@ +! +! +! 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 amg_c_invt_solver_descr(sv,info,iout,coarse) + + + use psb_base_mod + use amg_c_invt_solver, amg_protect_name => amg_c_invt_solver_descr + + Implicit None + + ! Arguments + class(amg_c_invt_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_) :: ictxt, me, np + character(len=20), parameter :: name='amg_c_invt_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_,*) ' INVT Approximate Inverse with ILU(T,P) ' + write(iout_,*) ' Fill level :',sv%fill_in + write(iout_,*) ' Fill threshold :',sv%thresh + write(iout_,*) ' Inverse fill level :',sv%inv_fill + write(iout_,*) ' Inverse fill threshold :',sv%inv_thresh + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amg_c_invt_solver_descr diff --git a/amgprec/impl/solver/amg_c_invt_solver_seti.f90 b/amgprec/impl/solver/amg_c_invt_solver_seti.f90 new file mode 100644 index 00000000..3cd19581 --- /dev/null +++ b/amgprec/impl/solver/amg_c_invt_solver_seti.f90 @@ -0,0 +1,70 @@ +! +! +! 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 amg_c_invt_solver_seti(sv,what,val,info) + + + use psb_base_mod + use amg_c_invt_solver, amg_protect_name => amg_c_invt_solver_seti + + Implicit None + + ! Arguments + class(amg_c_invt_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='amg_c_invt_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 +!!$ write(0,*) name,': Error: invalid WHAT' +!!$ info = -2 + end select + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amg_c_invt_solver_seti diff --git a/amgprec/impl/solver/amg_c_invt_solver_setr.f90 b/amgprec/impl/solver/amg_c_invt_solver_setr.f90 new file mode 100644 index 00000000..eec1287f --- /dev/null +++ b/amgprec/impl/solver/amg_c_invt_solver_setr.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 amg_c_invt_solver_setr(sv,what,val,info) + + + use psb_base_mod + use amg_c_invt_solver, amg_protect_name => amg_c_invt_solver_setr + + Implicit None + + ! Arguments + class(amg_c_invt_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(in) :: what + real(psb_spk_), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + ! + Integer(Psb_Ipk_) :: err_act + character(len=20) :: name='amg_c_invt_solver_setr' + + call psb_erractionsave(err_act) + info = psb_success_ + + select case(what) + case(amg_sub_iluthrs_) + sv%thresh = val + case(amg_inv_thresh_) + sv%inv_thresh = val + case default + ! call sv%amg_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 amg_c_invt_solver_setr diff --git a/amgprec/impl/solver/amg_d_invk_solver_bld.f90 b/amgprec/impl/solver/amg_d_invk_solver_bld.f90 index 2b1a44e6..598d87d3 100644 --- a/amgprec/impl/solver/amg_d_invk_solver_bld.f90 +++ b/amgprec/impl/solver/amg_d_invk_solver_bld.f90 @@ -32,20 +32,20 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -subroutine amx_d_invk_solver_bld(a,desc_a,sv,info,b,amold,vmold,imold) +subroutine amg_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 + use amg_d_invk_solver, amg_protect_name => amg_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 + 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 @@ -90,4 +90,4 @@ subroutine amx_d_invk_solver_bld(a,desc_a,sv,info,b,amold,vmold,imold) 9999 call psb_error_handler(err_act) return -end subroutine amx_d_invk_solver_bld +end subroutine amg_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 index af69c492..0f1d44a0 100644 --- a/amgprec/impl/solver/amg_d_invk_solver_check.f90 +++ b/amgprec/impl/solver/amg_d_invk_solver_check.f90 @@ -32,16 +32,16 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -subroutine amx_d_invk_solver_check(sv,info) +subroutine amg_d_invk_solver_check(sv,info) use psb_base_mod - use amx_d_invk_solver, amg_protect_name => amx_d_invk_solver_check + use amg_d_invk_solver, amg_protect_name => amg_d_invk_solver_check Implicit None ! Arguments - class(amx_d_invk_solver_type), intent(inout) :: sv + class(amg_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' @@ -61,4 +61,4 @@ subroutine amx_d_invk_solver_check(sv,info) 9999 call psb_error_handler(err_act) return -end subroutine amx_d_invk_solver_check +end subroutine amg_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 index 370f8468..df0c7e79 100644 --- a/amgprec/impl/solver/amg_d_invk_solver_clone.f90 +++ b/amgprec/impl/solver/amg_d_invk_solver_clone.f90 @@ -36,16 +36,16 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -subroutine amx_d_invk_solver_clone(sv,svout,info) +subroutine amg_d_invk_solver_clone(sv,svout,info) use psb_base_mod - use amx_d_invk_solver, amg_protect_name => amx_d_invk_solver_clone + use amg_d_invk_solver, amg_protect_name => amg_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 + 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 ! Local variables integer(psb_ipk_) :: err_act @@ -59,13 +59,13 @@ subroutine amx_d_invk_solver_clone(sv,svout,info) if (info == psb_success_) deallocate(svout, stat=info) end if if (info == psb_success_) & - & allocate(amx_d_invk_solver_type :: svout, stat=info) + & allocate(amg_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) + type is (amg_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) @@ -87,4 +87,4 @@ subroutine amx_d_invk_solver_clone(sv,svout,info) 9999 call psb_error_handler(err_act) return -end subroutine amx_d_invk_solver_clone +end subroutine amg_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 index 2d7567c1..587b1727 100644 --- a/amgprec/impl/solver/amg_d_invk_solver_cseti.f90 +++ b/amgprec/impl/solver/amg_d_invk_solver_cseti.f90 @@ -32,15 +32,15 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -subroutine amx_d_invk_solver_cseti(sv,what,val,info,idx) +subroutine amg_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 + use amg_d_invk_solver, amg_protect_name => amg_d_invk_solver_cseti Implicit None ! Arguments - class(amx_d_invk_solver_type), intent(inout) :: sv + 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 @@ -58,7 +58,7 @@ subroutine amx_d_invk_solver_cseti(sv,what,val,info,idx) case('INV_FILLIN') sv%inv_fill = val case default - call sv%amx_d_base_solver_type%set(what,val,info) + call sv%amg_d_base_solver_type%set(what,val,info) end select call psb_erractionrestore(err_act) @@ -66,4 +66,4 @@ subroutine amx_d_invk_solver_cseti(sv,what,val,info,idx) 9999 call psb_error_handler(err_act) return -end subroutine amx_d_invk_solver_cseti +end subroutine amg_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 index ee5558fd..db0b70db 100644 --- a/amgprec/impl/solver/amg_d_invk_solver_descr.f90 +++ b/amgprec/impl/solver/amg_d_invk_solver_descr.f90 @@ -32,16 +32,16 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -subroutine amx_d_invk_solver_descr(sv,info,iout,coarse) +subroutine amg_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 + use amg_d_invk_solver, amg_protect_name => amg_d_invk_solver_descr Implicit None ! Arguments - class(amx_d_invk_solver_type), intent(in) :: sv + 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 @@ -50,7 +50,7 @@ subroutine amx_d_invk_solver_descr(sv,info,iout,coarse) 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' + character(len=20), parameter :: name='amg_d_invk_solver_descr' integer(psb_ipk_) :: iout_ call psb_erractionsave(err_act) @@ -70,4 +70,4 @@ subroutine amx_d_invk_solver_descr(sv,info,iout,coarse) 9999 call psb_error_handler(err_act) return -end subroutine amx_d_invk_solver_descr +end subroutine amg_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 index 8644e8a4..61ba5c51 100644 --- a/amgprec/impl/solver/amg_d_invk_solver_seti.f90 +++ b/amgprec/impl/solver/amg_d_invk_solver_seti.f90 @@ -1,4 +1,4 @@ -! +! ! ! AMG-AINV: Approximate Inverse plugin for ! AMG4PSBLAS version 1.0 @@ -32,16 +32,16 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -subroutine amx_d_invk_solver_seti(sv,what,val,info) +subroutine amg_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 + use amg_d_invk_solver, amg_protect_name => amg_d_invk_solver_seti Implicit None ! Arguments - class(amx_d_invk_solver_type), intent(inout) :: sv + class(amg_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 @@ -58,7 +58,7 @@ subroutine amx_d_invk_solver_seti(sv,what,val,info) case(amg_inv_fillin_) sv%inv_fill = val case default - call sv%amx_d_base_solver_type%set(what,val,info) + ! call sv%amg_d_base_solver_type%set(what,val,info) end select call psb_erractionrestore(err_act) @@ -66,4 +66,4 @@ subroutine amx_d_invk_solver_seti(sv,what,val,info) 9999 call psb_error_handler(err_act) return -end subroutine amx_d_invk_solver_seti +end subroutine amg_d_invk_solver_seti diff --git a/amgprec/impl/solver/amg_d_invt_solver_bld.f90 b/amgprec/impl/solver/amg_d_invt_solver_bld.f90 new file mode 100644 index 00000000..6cdec717 --- /dev/null +++ b/amgprec/impl/solver/amg_d_invt_solver_bld.f90 @@ -0,0 +1,97 @@ +! +! +! 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 amg_d_invt_solver_bld(a,desc_a,sv,info,b,amold,vmold,imold) + + use psb_base_mod + use psb_d_invt_fact_mod ! This module contains the construction routines + use amg_d_invt_solver, amg_protect_name => amg_d_invt_solver_bld + + Implicit None + + ! Arguments + type(psb_dspmat_type), intent(in), target :: a + Type(psb_desc_type), Intent(inout) :: desc_a + class(amg_d_invt_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='amg_d_invt_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_invt_bld(a,sv%fill_in,sv%inv_fill,& + & sv%thresh,sv%inv_thresh,& + & 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 (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name) + goto 9999 + 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 amg_d_invt_solver_bld diff --git a/amgprec/impl/solver/amg_d_invt_solver_check.f90 b/amgprec/impl/solver/amg_d_invt_solver_check.f90 new file mode 100644 index 00000000..d4b9e161 --- /dev/null +++ b/amgprec/impl/solver/amg_d_invt_solver_check.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 amg_d_invt_solver_check(sv,info) + + + use psb_base_mod + use amg_d_invt_solver, amg_protect_name => amg_d_invt_solver_check + + Implicit None + + ! Arguments + class(amg_d_invt_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(out) :: info + ! + Integer(Psb_Ipk_) :: err_act + character(len=20) :: name='amg_d_invt_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) + call amg_check_def(sv%thresh,& + & 'Eps',dzero,is_legal_d_fact_thrs) + call amg_check_def(sv%inv_thresh,& + & 'Eps',dzero,is_legal_d_fact_thrs) + + if (info /= psb_success_) goto 9999 + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amg_d_invt_solver_check diff --git a/amgprec/impl/solver/amg_d_invt_solver_clone.f90 b/amgprec/impl/solver/amg_d_invt_solver_clone.f90 new file mode 100644 index 00000000..f5ba7f6b --- /dev/null +++ b/amgprec/impl/solver/amg_d_invt_solver_clone.f90 @@ -0,0 +1,92 @@ +! +! +! 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 amg_d_invt_solver_clone(sv,svout,info) + + use psb_base_mod + use amg_d_invt_solver, amg_protect_name => amg_d_invt_solver_clone + + Implicit None + + ! Arguments + class(amg_d_invt_solver_type), intent(inout) :: sv + class(amg_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(amg_d_invt_solver_type :: svout, stat=info) + if (info /= 0) then + info = psb_err_alloc_dealloc_ + goto 9999 + end if + select type(svo => svout) + type is (amg_d_invt_solver_type) + svo%fill_in = sv%fill_in + svo%inv_fill = sv%inv_fill + svo%thresh = sv%thresh + svo%inv_thresh = sv%inv_thresh + 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 amg_d_invt_solver_clone diff --git a/amgprec/impl/solver/amg_d_invt_solver_cseti.f90 b/amgprec/impl/solver/amg_d_invt_solver_cseti.f90 new file mode 100644 index 00000000..76cbe3d4 --- /dev/null +++ b/amgprec/impl/solver/amg_d_invt_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 amg_d_invt_solver_cseti(sv,what,val,info,idx) + + use psb_base_mod + use amg_d_invt_solver, amg_protect_name => amg_d_invt_solver_cseti + + Implicit None + + ! Arguments + class(amg_d_invt_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='amg_d_invt_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%amg_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 amg_d_invt_solver_cseti diff --git a/amgprec/impl/solver/amg_d_invt_solver_csetr.f90 b/amgprec/impl/solver/amg_d_invt_solver_csetr.f90 new file mode 100644 index 00000000..6ba9d572 --- /dev/null +++ b/amgprec/impl/solver/amg_d_invt_solver_csetr.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 amg_d_invt_solver_csetr(sv,what,val,info,idx) + + use psb_base_mod + use amg_d_invt_solver, amg_protect_name => amg_d_invt_solver_csetr + + Implicit None + + ! Arguments + class(amg_d_invt_solver_type), intent(inout) :: sv + character(len=*), intent(in) :: what + real(psb_dpk_), 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='amg_d_invt_solver_csetr' + + call psb_erractionsave(err_act) + info = psb_success_ + + select case(psb_toupper(what)) + case('SUB_ILUTHRS') + sv%thresh = val + case('INV_THRESH') + sv%inv_thresh = val + case default + call sv%amg_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 amg_d_invt_solver_csetr diff --git a/amgprec/impl/solver/amg_d_invt_solver_descr.f90 b/amgprec/impl/solver/amg_d_invt_solver_descr.f90 new file mode 100644 index 00000000..abb4e9f0 --- /dev/null +++ b/amgprec/impl/solver/amg_d_invt_solver_descr.f90 @@ -0,0 +1,74 @@ +! +! +! 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 amg_d_invt_solver_descr(sv,info,iout,coarse) + + + use psb_base_mod + use amg_d_invt_solver, amg_protect_name => amg_d_invt_solver_descr + + Implicit None + + ! Arguments + class(amg_d_invt_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_) :: ictxt, me, np + character(len=20), parameter :: name='amg_d_invt_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_,*) ' INVT Approximate Inverse with ILU(T,P) ' + write(iout_,*) ' Fill level :',sv%fill_in + write(iout_,*) ' Fill threshold :',sv%thresh + write(iout_,*) ' Inverse fill level :',sv%inv_fill + write(iout_,*) ' Inverse fill threshold :',sv%inv_thresh + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amg_d_invt_solver_descr diff --git a/amgprec/impl/solver/amg_d_invt_solver_seti.f90 b/amgprec/impl/solver/amg_d_invt_solver_seti.f90 new file mode 100644 index 00000000..6690f4a8 --- /dev/null +++ b/amgprec/impl/solver/amg_d_invt_solver_seti.f90 @@ -0,0 +1,70 @@ +! +! +! 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 amg_d_invt_solver_seti(sv,what,val,info) + + + use psb_base_mod + use amg_d_invt_solver, amg_protect_name => amg_d_invt_solver_seti + + Implicit None + + ! Arguments + class(amg_d_invt_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='amg_d_invt_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 +!!$ write(0,*) name,': Error: invalid WHAT' +!!$ info = -2 + end select + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amg_d_invt_solver_seti diff --git a/amgprec/impl/solver/amg_d_invt_solver_setr.f90 b/amgprec/impl/solver/amg_d_invt_solver_setr.f90 new file mode 100644 index 00000000..059c76f2 --- /dev/null +++ b/amgprec/impl/solver/amg_d_invt_solver_setr.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 amg_d_invt_solver_setr(sv,what,val,info) + + + use psb_base_mod + use amg_d_invt_solver, amg_protect_name => amg_d_invt_solver_setr + + Implicit None + + ! Arguments + class(amg_d_invt_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(in) :: what + real(psb_dpk_), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + ! + Integer(Psb_Ipk_) :: err_act + character(len=20) :: name='amg_d_invt_solver_setr' + + call psb_erractionsave(err_act) + info = psb_success_ + + select case(what) + case(amg_sub_iluthrs_) + sv%thresh = val + case(amg_inv_thresh_) + sv%inv_thresh = val + case default + ! call sv%amg_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 amg_d_invt_solver_setr diff --git a/amgprec/impl/solver/amg_s_invk_solver_bld.f90 b/amgprec/impl/solver/amg_s_invk_solver_bld.f90 index f840a6d2..b7779bdb 100644 --- a/amgprec/impl/solver/amg_s_invk_solver_bld.f90 +++ b/amgprec/impl/solver/amg_s_invk_solver_bld.f90 @@ -32,20 +32,20 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -subroutine amx_s_invk_solver_bld(a,desc_a,sv,info,b,amold,vmold,imold) +subroutine amg_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 + use amg_s_invk_solver, amg_protect_name => amg_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 + 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 @@ -90,4 +90,4 @@ subroutine amx_s_invk_solver_bld(a,desc_a,sv,info,b,amold,vmold,imold) 9999 call psb_error_handler(err_act) return -end subroutine amx_s_invk_solver_bld +end subroutine amg_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 index 736061c5..e301a02e 100644 --- a/amgprec/impl/solver/amg_s_invk_solver_check.f90 +++ b/amgprec/impl/solver/amg_s_invk_solver_check.f90 @@ -32,16 +32,16 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -subroutine amx_s_invk_solver_check(sv,info) +subroutine amg_s_invk_solver_check(sv,info) use psb_base_mod - use amx_s_invk_solver, amg_protect_name => amx_s_invk_solver_check + use amg_s_invk_solver, amg_protect_name => amg_s_invk_solver_check Implicit None ! Arguments - class(amx_s_invk_solver_type), intent(inout) :: sv + class(amg_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' @@ -61,4 +61,4 @@ subroutine amx_s_invk_solver_check(sv,info) 9999 call psb_error_handler(err_act) return -end subroutine amx_s_invk_solver_check +end subroutine amg_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 index 87fa0221..f3a62aa6 100644 --- a/amgprec/impl/solver/amg_s_invk_solver_clone.f90 +++ b/amgprec/impl/solver/amg_s_invk_solver_clone.f90 @@ -36,16 +36,16 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -subroutine amx_s_invk_solver_clone(sv,svout,info) +subroutine amg_s_invk_solver_clone(sv,svout,info) use psb_base_mod - use amx_s_invk_solver, amg_protect_name => amx_s_invk_solver_clone + use amg_s_invk_solver, amg_protect_name => amg_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 + 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 ! Local variables integer(psb_ipk_) :: err_act @@ -59,13 +59,13 @@ subroutine amx_s_invk_solver_clone(sv,svout,info) if (info == psb_success_) deallocate(svout, stat=info) end if if (info == psb_success_) & - & allocate(amx_s_invk_solver_type :: svout, stat=info) + & allocate(amg_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) + type is (amg_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) @@ -87,4 +87,4 @@ subroutine amx_s_invk_solver_clone(sv,svout,info) 9999 call psb_error_handler(err_act) return -end subroutine amx_s_invk_solver_clone +end subroutine amg_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 index 0485807f..6f180353 100644 --- a/amgprec/impl/solver/amg_s_invk_solver_cseti.f90 +++ b/amgprec/impl/solver/amg_s_invk_solver_cseti.f90 @@ -32,15 +32,15 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -subroutine amx_s_invk_solver_cseti(sv,what,val,info,idx) +subroutine amg_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 + use amg_s_invk_solver, amg_protect_name => amg_s_invk_solver_cseti Implicit None ! Arguments - class(amx_s_invk_solver_type), intent(inout) :: sv + 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 @@ -58,7 +58,7 @@ subroutine amx_s_invk_solver_cseti(sv,what,val,info,idx) case('INV_FILLIN') sv%inv_fill = val case default - call sv%amx_s_base_solver_type%set(what,val,info) + call sv%amg_s_base_solver_type%set(what,val,info) end select call psb_erractionrestore(err_act) @@ -66,4 +66,4 @@ subroutine amx_s_invk_solver_cseti(sv,what,val,info,idx) 9999 call psb_error_handler(err_act) return -end subroutine amx_s_invk_solver_cseti +end subroutine amg_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 index 9aee44bf..212ff6be 100644 --- a/amgprec/impl/solver/amg_s_invk_solver_descr.f90 +++ b/amgprec/impl/solver/amg_s_invk_solver_descr.f90 @@ -32,16 +32,16 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -subroutine amx_s_invk_solver_descr(sv,info,iout,coarse) +subroutine amg_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 + use amg_s_invk_solver, amg_protect_name => amg_s_invk_solver_descr Implicit None ! Arguments - class(amx_s_invk_solver_type), intent(in) :: sv + 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 @@ -50,7 +50,7 @@ subroutine amx_s_invk_solver_descr(sv,info,iout,coarse) 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' + character(len=20), parameter :: name='amg_s_invk_solver_descr' integer(psb_ipk_) :: iout_ call psb_erractionsave(err_act) @@ -70,4 +70,4 @@ subroutine amx_s_invk_solver_descr(sv,info,iout,coarse) 9999 call psb_error_handler(err_act) return -end subroutine amx_s_invk_solver_descr +end subroutine amg_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 index c1654ca0..f6f1efee 100644 --- a/amgprec/impl/solver/amg_s_invk_solver_seti.f90 +++ b/amgprec/impl/solver/amg_s_invk_solver_seti.f90 @@ -1,4 +1,4 @@ -! +! ! ! AMG-AINV: Approximate Inverse plugin for ! AMG4PSBLAS version 1.0 @@ -32,16 +32,16 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -subroutine amx_s_invk_solver_seti(sv,what,val,info) +subroutine amg_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 + use amg_s_invk_solver, amg_protect_name => amg_s_invk_solver_seti Implicit None ! Arguments - class(amx_s_invk_solver_type), intent(inout) :: sv + class(amg_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 @@ -58,7 +58,7 @@ subroutine amx_s_invk_solver_seti(sv,what,val,info) case(amg_inv_fillin_) sv%inv_fill = val case default - call sv%amx_s_base_solver_type%set(what,val,info) + ! call sv%amg_s_base_solver_type%set(what,val,info) end select call psb_erractionrestore(err_act) @@ -66,4 +66,4 @@ subroutine amx_s_invk_solver_seti(sv,what,val,info) 9999 call psb_error_handler(err_act) return -end subroutine amx_s_invk_solver_seti +end subroutine amg_s_invk_solver_seti diff --git a/amgprec/impl/solver/amg_s_invt_solver_bld.f90 b/amgprec/impl/solver/amg_s_invt_solver_bld.f90 new file mode 100644 index 00000000..e0ebd1ce --- /dev/null +++ b/amgprec/impl/solver/amg_s_invt_solver_bld.f90 @@ -0,0 +1,97 @@ +! +! +! 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 amg_s_invt_solver_bld(a,desc_a,sv,info,b,amold,vmold,imold) + + use psb_base_mod + use psb_s_invt_fact_mod ! This module contains the construction routines + use amg_s_invt_solver, amg_protect_name => amg_s_invt_solver_bld + + Implicit None + + ! Arguments + type(psb_sspmat_type), intent(in), target :: a + Type(psb_desc_type), Intent(inout) :: desc_a + class(amg_s_invt_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='amg_s_invt_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_invt_bld(a,sv%fill_in,sv%inv_fill,& + & sv%thresh,sv%inv_thresh,& + & 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 (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name) + goto 9999 + 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 amg_s_invt_solver_bld diff --git a/amgprec/impl/solver/amg_s_invt_solver_check.f90 b/amgprec/impl/solver/amg_s_invt_solver_check.f90 new file mode 100644 index 00000000..41ec3b14 --- /dev/null +++ b/amgprec/impl/solver/amg_s_invt_solver_check.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 amg_s_invt_solver_check(sv,info) + + + use psb_base_mod + use amg_s_invt_solver, amg_protect_name => amg_s_invt_solver_check + + Implicit None + + ! Arguments + class(amg_s_invt_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(out) :: info + ! + Integer(Psb_Ipk_) :: err_act + character(len=20) :: name='amg_s_invt_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) + call amg_check_def(sv%thresh,& + & 'Eps',szero,is_legal_s_fact_thrs) + call amg_check_def(sv%inv_thresh,& + & 'Eps',szero,is_legal_s_fact_thrs) + + if (info /= psb_success_) goto 9999 + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amg_s_invt_solver_check diff --git a/amgprec/impl/solver/amg_s_invt_solver_clone.f90 b/amgprec/impl/solver/amg_s_invt_solver_clone.f90 new file mode 100644 index 00000000..f85bc74d --- /dev/null +++ b/amgprec/impl/solver/amg_s_invt_solver_clone.f90 @@ -0,0 +1,92 @@ +! +! +! 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 amg_s_invt_solver_clone(sv,svout,info) + + use psb_base_mod + use amg_s_invt_solver, amg_protect_name => amg_s_invt_solver_clone + + Implicit None + + ! Arguments + class(amg_s_invt_solver_type), intent(inout) :: sv + class(amg_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(amg_s_invt_solver_type :: svout, stat=info) + if (info /= 0) then + info = psb_err_alloc_dealloc_ + goto 9999 + end if + select type(svo => svout) + type is (amg_s_invt_solver_type) + svo%fill_in = sv%fill_in + svo%inv_fill = sv%inv_fill + svo%thresh = sv%thresh + svo%inv_thresh = sv%inv_thresh + 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 amg_s_invt_solver_clone diff --git a/amgprec/impl/solver/amg_s_invt_solver_cseti.f90 b/amgprec/impl/solver/amg_s_invt_solver_cseti.f90 new file mode 100644 index 00000000..7b9b6c70 --- /dev/null +++ b/amgprec/impl/solver/amg_s_invt_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 amg_s_invt_solver_cseti(sv,what,val,info,idx) + + use psb_base_mod + use amg_s_invt_solver, amg_protect_name => amg_s_invt_solver_cseti + + Implicit None + + ! Arguments + class(amg_s_invt_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='amg_s_invt_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%amg_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 amg_s_invt_solver_cseti diff --git a/amgprec/impl/solver/amg_s_invt_solver_csetr.f90 b/amgprec/impl/solver/amg_s_invt_solver_csetr.f90 new file mode 100644 index 00000000..c9d11958 --- /dev/null +++ b/amgprec/impl/solver/amg_s_invt_solver_csetr.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 amg_s_invt_solver_csetr(sv,what,val,info,idx) + + use psb_base_mod + use amg_s_invt_solver, amg_protect_name => amg_s_invt_solver_csetr + + Implicit None + + ! Arguments + class(amg_s_invt_solver_type), intent(inout) :: sv + character(len=*), intent(in) :: what + real(psb_spk_), 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='amg_s_invt_solver_csetr' + + call psb_erractionsave(err_act) + info = psb_success_ + + select case(psb_toupper(what)) + case('SUB_ILUTHRS') + sv%thresh = val + case('INV_THRESH') + sv%inv_thresh = val + case default + call sv%amg_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 amg_s_invt_solver_csetr diff --git a/amgprec/impl/solver/amg_s_invt_solver_descr.f90 b/amgprec/impl/solver/amg_s_invt_solver_descr.f90 new file mode 100644 index 00000000..3a94f69e --- /dev/null +++ b/amgprec/impl/solver/amg_s_invt_solver_descr.f90 @@ -0,0 +1,74 @@ +! +! +! 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 amg_s_invt_solver_descr(sv,info,iout,coarse) + + + use psb_base_mod + use amg_s_invt_solver, amg_protect_name => amg_s_invt_solver_descr + + Implicit None + + ! Arguments + class(amg_s_invt_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_) :: ictxt, me, np + character(len=20), parameter :: name='amg_s_invt_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_,*) ' INVT Approximate Inverse with ILU(T,P) ' + write(iout_,*) ' Fill level :',sv%fill_in + write(iout_,*) ' Fill threshold :',sv%thresh + write(iout_,*) ' Inverse fill level :',sv%inv_fill + write(iout_,*) ' Inverse fill threshold :',sv%inv_thresh + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amg_s_invt_solver_descr diff --git a/amgprec/impl/solver/amg_s_invt_solver_seti.f90 b/amgprec/impl/solver/amg_s_invt_solver_seti.f90 new file mode 100644 index 00000000..7fa8567d --- /dev/null +++ b/amgprec/impl/solver/amg_s_invt_solver_seti.f90 @@ -0,0 +1,70 @@ +! +! +! 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 amg_s_invt_solver_seti(sv,what,val,info) + + + use psb_base_mod + use amg_s_invt_solver, amg_protect_name => amg_s_invt_solver_seti + + Implicit None + + ! Arguments + class(amg_s_invt_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='amg_s_invt_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 +!!$ write(0,*) name,': Error: invalid WHAT' +!!$ info = -2 + end select + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amg_s_invt_solver_seti diff --git a/amgprec/impl/solver/amg_s_invt_solver_setr.f90 b/amgprec/impl/solver/amg_s_invt_solver_setr.f90 new file mode 100644 index 00000000..d8bb8052 --- /dev/null +++ b/amgprec/impl/solver/amg_s_invt_solver_setr.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 amg_s_invt_solver_setr(sv,what,val,info) + + + use psb_base_mod + use amg_s_invt_solver, amg_protect_name => amg_s_invt_solver_setr + + Implicit None + + ! Arguments + class(amg_s_invt_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(in) :: what + real(psb_spk_), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + ! + Integer(Psb_Ipk_) :: err_act + character(len=20) :: name='amg_s_invt_solver_setr' + + call psb_erractionsave(err_act) + info = psb_success_ + + select case(what) + case(amg_sub_iluthrs_) + sv%thresh = val + case(amg_inv_thresh_) + sv%inv_thresh = val + case default + ! call sv%amg_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 amg_s_invt_solver_setr diff --git a/amgprec/impl/solver/amg_z_invk_solver_bld.f90 b/amgprec/impl/solver/amg_z_invk_solver_bld.f90 index 3ae5556c..175fd8f6 100644 --- a/amgprec/impl/solver/amg_z_invk_solver_bld.f90 +++ b/amgprec/impl/solver/amg_z_invk_solver_bld.f90 @@ -32,20 +32,20 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -subroutine amx_z_invk_solver_bld(a,desc_a,sv,info,b,amold,vmold,imold) +subroutine amg_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 + use amg_z_invk_solver, amg_protect_name => amg_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 + 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 @@ -90,4 +90,4 @@ subroutine amx_z_invk_solver_bld(a,desc_a,sv,info,b,amold,vmold,imold) 9999 call psb_error_handler(err_act) return -end subroutine amx_z_invk_solver_bld +end subroutine amg_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 index 89eaf6e7..1c282de3 100644 --- a/amgprec/impl/solver/amg_z_invk_solver_check.f90 +++ b/amgprec/impl/solver/amg_z_invk_solver_check.f90 @@ -32,16 +32,16 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -subroutine amx_z_invk_solver_check(sv,info) +subroutine amg_z_invk_solver_check(sv,info) use psb_base_mod - use amx_z_invk_solver, amg_protect_name => amx_z_invk_solver_check + use amg_z_invk_solver, amg_protect_name => amg_z_invk_solver_check Implicit None ! Arguments - class(amx_z_invk_solver_type), intent(inout) :: sv + class(amg_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' @@ -61,4 +61,4 @@ subroutine amx_z_invk_solver_check(sv,info) 9999 call psb_error_handler(err_act) return -end subroutine amx_z_invk_solver_check +end subroutine amg_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 index e38cdb41..050c9cd9 100644 --- a/amgprec/impl/solver/amg_z_invk_solver_clone.f90 +++ b/amgprec/impl/solver/amg_z_invk_solver_clone.f90 @@ -36,16 +36,16 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -subroutine amx_z_invk_solver_clone(sv,svout,info) +subroutine amg_z_invk_solver_clone(sv,svout,info) use psb_base_mod - use amx_z_invk_solver, amg_protect_name => amx_z_invk_solver_clone + use amg_z_invk_solver, amg_protect_name => amg_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 + 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 ! Local variables integer(psb_ipk_) :: err_act @@ -59,13 +59,13 @@ subroutine amx_z_invk_solver_clone(sv,svout,info) if (info == psb_success_) deallocate(svout, stat=info) end if if (info == psb_success_) & - & allocate(amx_z_invk_solver_type :: svout, stat=info) + & allocate(amg_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) + type is (amg_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) @@ -87,4 +87,4 @@ subroutine amx_z_invk_solver_clone(sv,svout,info) 9999 call psb_error_handler(err_act) return -end subroutine amx_z_invk_solver_clone +end subroutine amg_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 index 99d2cc4d..b3e2c1ba 100644 --- a/amgprec/impl/solver/amg_z_invk_solver_cseti.f90 +++ b/amgprec/impl/solver/amg_z_invk_solver_cseti.f90 @@ -32,15 +32,15 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -subroutine amx_z_invk_solver_cseti(sv,what,val,info,idx) +subroutine amg_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 + use amg_z_invk_solver, amg_protect_name => amg_z_invk_solver_cseti Implicit None ! Arguments - class(amx_z_invk_solver_type), intent(inout) :: sv + 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 @@ -58,7 +58,7 @@ subroutine amx_z_invk_solver_cseti(sv,what,val,info,idx) case('INV_FILLIN') sv%inv_fill = val case default - call sv%amx_z_base_solver_type%set(what,val,info) + call sv%amg_z_base_solver_type%set(what,val,info) end select call psb_erractionrestore(err_act) @@ -66,4 +66,4 @@ subroutine amx_z_invk_solver_cseti(sv,what,val,info,idx) 9999 call psb_error_handler(err_act) return -end subroutine amx_z_invk_solver_cseti +end subroutine amg_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 index 2169370f..042199c5 100644 --- a/amgprec/impl/solver/amg_z_invk_solver_descr.f90 +++ b/amgprec/impl/solver/amg_z_invk_solver_descr.f90 @@ -32,16 +32,16 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -subroutine amx_z_invk_solver_descr(sv,info,iout,coarse) +subroutine amg_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 + use amg_z_invk_solver, amg_protect_name => amg_z_invk_solver_descr Implicit None ! Arguments - class(amx_z_invk_solver_type), intent(in) :: sv + 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 @@ -50,7 +50,7 @@ subroutine amx_z_invk_solver_descr(sv,info,iout,coarse) 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' + character(len=20), parameter :: name='amg_z_invk_solver_descr' integer(psb_ipk_) :: iout_ call psb_erractionsave(err_act) @@ -70,4 +70,4 @@ subroutine amx_z_invk_solver_descr(sv,info,iout,coarse) 9999 call psb_error_handler(err_act) return -end subroutine amx_z_invk_solver_descr +end subroutine amg_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 index 94bee2d1..f5299d6a 100644 --- a/amgprec/impl/solver/amg_z_invk_solver_seti.f90 +++ b/amgprec/impl/solver/amg_z_invk_solver_seti.f90 @@ -1,4 +1,4 @@ -! +! ! ! AMG-AINV: Approximate Inverse plugin for ! AMG4PSBLAS version 1.0 @@ -32,16 +32,16 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -subroutine amx_z_invk_solver_seti(sv,what,val,info) +subroutine amg_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 + use amg_z_invk_solver, amg_protect_name => amg_z_invk_solver_seti Implicit None ! Arguments - class(amx_z_invk_solver_type), intent(inout) :: sv + class(amg_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 @@ -58,7 +58,7 @@ subroutine amx_z_invk_solver_seti(sv,what,val,info) case(amg_inv_fillin_) sv%inv_fill = val case default - call sv%amx_z_base_solver_type%set(what,val,info) + ! call sv%amg_z_base_solver_type%set(what,val,info) end select call psb_erractionrestore(err_act) @@ -66,4 +66,4 @@ subroutine amx_z_invk_solver_seti(sv,what,val,info) 9999 call psb_error_handler(err_act) return -end subroutine amx_z_invk_solver_seti +end subroutine amg_z_invk_solver_seti diff --git a/amgprec/impl/solver/amg_z_invt_solver_bld.f90 b/amgprec/impl/solver/amg_z_invt_solver_bld.f90 new file mode 100644 index 00000000..f1a65e52 --- /dev/null +++ b/amgprec/impl/solver/amg_z_invt_solver_bld.f90 @@ -0,0 +1,97 @@ +! +! +! 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 amg_z_invt_solver_bld(a,desc_a,sv,info,b,amold,vmold,imold) + + use psb_base_mod + use psb_z_invt_fact_mod ! This module contains the construction routines + use amg_z_invt_solver, amg_protect_name => amg_z_invt_solver_bld + + Implicit None + + ! Arguments + type(psb_zspmat_type), intent(in), target :: a + Type(psb_desc_type), Intent(inout) :: desc_a + class(amg_z_invt_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='amg_z_invt_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_invt_bld(a,sv%fill_in,sv%inv_fill,& + & sv%thresh,sv%inv_thresh,& + & 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 (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name) + goto 9999 + 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 amg_z_invt_solver_bld diff --git a/amgprec/impl/solver/amg_z_invt_solver_check.f90 b/amgprec/impl/solver/amg_z_invt_solver_check.f90 new file mode 100644 index 00000000..761734d7 --- /dev/null +++ b/amgprec/impl/solver/amg_z_invt_solver_check.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 amg_z_invt_solver_check(sv,info) + + + use psb_base_mod + use amg_z_invt_solver, amg_protect_name => amg_z_invt_solver_check + + Implicit None + + ! Arguments + class(amg_z_invt_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(out) :: info + ! + Integer(Psb_Ipk_) :: err_act + character(len=20) :: name='amg_z_invt_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) + call amg_check_def(sv%thresh,& + & 'Eps',dzero,is_legal_d_fact_thrs) + call amg_check_def(sv%inv_thresh,& + & 'Eps',dzero,is_legal_d_fact_thrs) + + if (info /= psb_success_) goto 9999 + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amg_z_invt_solver_check diff --git a/amgprec/impl/solver/amg_z_invt_solver_clone.f90 b/amgprec/impl/solver/amg_z_invt_solver_clone.f90 new file mode 100644 index 00000000..76257ae9 --- /dev/null +++ b/amgprec/impl/solver/amg_z_invt_solver_clone.f90 @@ -0,0 +1,92 @@ +! +! +! 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 amg_z_invt_solver_clone(sv,svout,info) + + use psb_base_mod + use amg_z_invt_solver, amg_protect_name => amg_z_invt_solver_clone + + Implicit None + + ! Arguments + class(amg_z_invt_solver_type), intent(inout) :: sv + class(amg_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(amg_z_invt_solver_type :: svout, stat=info) + if (info /= 0) then + info = psb_err_alloc_dealloc_ + goto 9999 + end if + select type(svo => svout) + type is (amg_z_invt_solver_type) + svo%fill_in = sv%fill_in + svo%inv_fill = sv%inv_fill + svo%thresh = sv%thresh + svo%inv_thresh = sv%inv_thresh + 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 amg_z_invt_solver_clone diff --git a/amgprec/impl/solver/amg_z_invt_solver_cseti.f90 b/amgprec/impl/solver/amg_z_invt_solver_cseti.f90 new file mode 100644 index 00000000..b61adf17 --- /dev/null +++ b/amgprec/impl/solver/amg_z_invt_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 amg_z_invt_solver_cseti(sv,what,val,info,idx) + + use psb_base_mod + use amg_z_invt_solver, amg_protect_name => amg_z_invt_solver_cseti + + Implicit None + + ! Arguments + class(amg_z_invt_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='amg_z_invt_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%amg_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 amg_z_invt_solver_cseti diff --git a/amgprec/impl/solver/amg_z_invt_solver_csetr.f90 b/amgprec/impl/solver/amg_z_invt_solver_csetr.f90 new file mode 100644 index 00000000..30f1479c --- /dev/null +++ b/amgprec/impl/solver/amg_z_invt_solver_csetr.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 amg_z_invt_solver_csetr(sv,what,val,info,idx) + + use psb_base_mod + use amg_z_invt_solver, amg_protect_name => amg_z_invt_solver_csetr + + Implicit None + + ! Arguments + class(amg_z_invt_solver_type), intent(inout) :: sv + character(len=*), intent(in) :: what + real(psb_dpk_), 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='amg_z_invt_solver_csetr' + + call psb_erractionsave(err_act) + info = psb_success_ + + select case(psb_toupper(what)) + case('SUB_ILUTHRS') + sv%thresh = val + case('INV_THRESH') + sv%inv_thresh = val + case default + call sv%amg_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 amg_z_invt_solver_csetr diff --git a/amgprec/impl/solver/amg_z_invt_solver_descr.f90 b/amgprec/impl/solver/amg_z_invt_solver_descr.f90 new file mode 100644 index 00000000..61f8ee37 --- /dev/null +++ b/amgprec/impl/solver/amg_z_invt_solver_descr.f90 @@ -0,0 +1,74 @@ +! +! +! 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 amg_z_invt_solver_descr(sv,info,iout,coarse) + + + use psb_base_mod + use amg_z_invt_solver, amg_protect_name => amg_z_invt_solver_descr + + Implicit None + + ! Arguments + class(amg_z_invt_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_) :: ictxt, me, np + character(len=20), parameter :: name='amg_z_invt_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_,*) ' INVT Approximate Inverse with ILU(T,P) ' + write(iout_,*) ' Fill level :',sv%fill_in + write(iout_,*) ' Fill threshold :',sv%thresh + write(iout_,*) ' Inverse fill level :',sv%inv_fill + write(iout_,*) ' Inverse fill threshold :',sv%inv_thresh + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amg_z_invt_solver_descr diff --git a/amgprec/impl/solver/amg_z_invt_solver_seti.f90 b/amgprec/impl/solver/amg_z_invt_solver_seti.f90 new file mode 100644 index 00000000..bc4bca10 --- /dev/null +++ b/amgprec/impl/solver/amg_z_invt_solver_seti.f90 @@ -0,0 +1,70 @@ +! +! +! 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 amg_z_invt_solver_seti(sv,what,val,info) + + + use psb_base_mod + use amg_z_invt_solver, amg_protect_name => amg_z_invt_solver_seti + + Implicit None + + ! Arguments + class(amg_z_invt_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='amg_z_invt_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 +!!$ write(0,*) name,': Error: invalid WHAT' +!!$ info = -2 + end select + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return +end subroutine amg_z_invt_solver_seti diff --git a/amgprec/impl/solver/amg_z_invt_solver_setr.f90 b/amgprec/impl/solver/amg_z_invt_solver_setr.f90 new file mode 100644 index 00000000..49fd2c4d --- /dev/null +++ b/amgprec/impl/solver/amg_z_invt_solver_setr.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 amg_z_invt_solver_setr(sv,what,val,info) + + + use psb_base_mod + use amg_z_invt_solver, amg_protect_name => amg_z_invt_solver_setr + + Implicit None + + ! Arguments + class(amg_z_invt_solver_type), intent(inout) :: sv + integer(psb_ipk_), intent(in) :: what + real(psb_dpk_), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + ! + Integer(Psb_Ipk_) :: err_act + character(len=20) :: name='amg_z_invt_solver_setr' + + call psb_erractionsave(err_act) + info = psb_success_ + + select case(what) + case(amg_sub_iluthrs_) + sv%thresh = val + case(amg_inv_thresh_) + sv%inv_thresh = val + case default + ! call sv%amg_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 amg_z_invt_solver_setr