From b6f92354d3abfb7a673b20d0ae8157680c98b1ec Mon Sep 17 00:00:00 2001 From: sfilippone Date: Fri, 2 Aug 2024 12:39:09 +0200 Subject: [PATCH] Reworked sample data generation --- samples/advanced/pdegen/Makefile | 12 ++- samples/advanced/pdegen/amg_d_pde2d.F90 | 10 +- ...base_mod.f90 => amg_d_pde2d_const_mod.f90} | 60 +++++------ .../pdegen/amg_d_pde2d_poisson_mod.f90 | 89 +++++++++++++++ samples/advanced/pdegen/amg_d_pde3d.F90 | 8 +- ...base_mod.f90 => amg_d_pde3d_const_mod.f90} | 4 +- .../pdegen/amg_d_pde3d_poisson_mod.f90 | 101 ++++++++++++++++++ samples/advanced/pdegen/amg_s_pde2d.F90 | 10 +- ...base_mod.f90 => amg_s_pde2d_const_mod.f90} | 60 +++++------ .../pdegen/amg_s_pde2d_poisson_mod.f90 | 89 +++++++++++++++ samples/advanced/pdegen/amg_s_pde3d.F90 | 8 +- ...base_mod.f90 => amg_s_pde3d_const_mod.f90} | 4 +- .../pdegen/amg_s_pde3d_poisson_mod.f90 | 101 ++++++++++++++++++ 13 files changed, 480 insertions(+), 76 deletions(-) rename samples/advanced/pdegen/{amg_d_pde2d_base_mod.f90 => amg_d_pde2d_const_mod.f90} (74%) create mode 100644 samples/advanced/pdegen/amg_d_pde2d_poisson_mod.f90 rename samples/advanced/pdegen/{amg_d_pde3d_base_mod.f90 => amg_d_pde3d_const_mod.f90} (97%) create mode 100644 samples/advanced/pdegen/amg_d_pde3d_poisson_mod.f90 rename samples/advanced/pdegen/{amg_s_pde2d_base_mod.f90 => amg_s_pde2d_const_mod.f90} (74%) create mode 100644 samples/advanced/pdegen/amg_s_pde2d_poisson_mod.f90 rename samples/advanced/pdegen/{amg_s_pde3d_base_mod.f90 => amg_s_pde3d_const_mod.f90} (97%) create mode 100644 samples/advanced/pdegen/amg_s_pde3d_poisson_mod.f90 diff --git a/samples/advanced/pdegen/Makefile b/samples/advanced/pdegen/Makefile index fc9a7f21..dbfb4946 100644 --- a/samples/advanced/pdegen/Makefile +++ b/samples/advanced/pdegen/Makefile @@ -8,10 +8,14 @@ FINCLUDES=$(FMFLAG). $(FMFLAG)$(AMGMODDIR) $(FMFLAG)$(AMGINCDIR) $(PSBLAS_INCLUD LINKOPT= EXEDIR=./runs -DGEN2D=amg_d_pde2d_base_mod.o amg_d_pde2d_exp_mod.o amg_d_pde2d_gauss_mod.o amg_d_pde2d_box_mod.o -DGEN3D=amg_d_pde3d_base_mod.o amg_d_pde3d_exp_mod.o amg_d_pde3d_gauss_mod.o amg_d_pde3d_box_mod.o -SGEN2D=amg_s_pde2d_base_mod.o amg_s_pde2d_exp_mod.o amg_s_pde2d_gauss_mod.o amg_s_pde2d_box_mod.o -SGEN3D=amg_s_pde3d_base_mod.o amg_s_pde3d_exp_mod.o amg_s_pde3d_gauss_mod.o amg_s_pde3d_box_mod.o +DGEN2D=amg_d_pde2d_poisson_mod.o amg_d_pde2d_const_mod.o amg_d_pde2d_exp_mod.o \ + amg_d_pde2d_gauss_mod.o amg_d_pde2d_box_mod.o +DGEN3D=amg_d_pde3d_poisson_mod.o amg_d_pde3d_const_mod.o amg_d_pde3d_exp_mod.o \ + amg_d_pde3d_gauss_mod.o amg_d_pde3d_box_mod.o +SGEN2D=amg_s_pde2d_poisson_mod.o amg_s_pde2d_const_mod.o amg_s_pde2d_exp_mod.o \ + amg_s_pde2d_gauss_mod.o amg_s_pde2d_box_mod.o +SGEN3D=amg_s_pde3d_poisson_mod.o amg_s_pde3d_const_mod.o amg_s_pde3d_exp_mod.o \ + amg_s_pde3d_gauss_mod.o amg_s_pde3d_box_mod.o all: amg_s_pde3d amg_d_pde3d amg_s_pde2d amg_d_pde2d diff --git a/samples/advanced/pdegen/amg_d_pde2d.F90 b/samples/advanced/pdegen/amg_d_pde2d.F90 index 63f73162..ec6de77f 100644 --- a/samples/advanced/pdegen/amg_d_pde2d.F90 +++ b/samples/advanced/pdegen/amg_d_pde2d.F90 @@ -69,7 +69,8 @@ program amg_d_pde2d use psb_krylov_mod use psb_util_mod use data_input - use amg_d_pde2d_base_mod + use amg_d_pde2d_poisson_mod + use amg_d_pde2d_const_mod use amg_d_pde2d_exp_mod use amg_d_pde2d_box_mod use amg_d_pde2d_gauss_mod @@ -248,9 +249,14 @@ program amg_d_pde2d call psb_barrier(ctxt) t1 = psb_wtime() select case(psb_toupper(trim(pdecoeff))) + case("POISSON") + call amg_gen_pde2d(ctxt,idim,a,b,x,desc_a,afmt,& + & a1_poisson,a2_poisson,& + & b1_poisson,b2_poisson,c_poisson,g_poisson,info) case("CONST") call amg_gen_pde2d(ctxt,idim,a,b,x,desc_a,afmt,& - & a1_base,a2_base,b1_base,b2_base,c_base,g_base,info) + & a1_const,a2_const,& + & b1_const,b2_const,c_const,g_const,info) case("EXP") call amg_gen_pde2d(ctxt,idim,a,b,x,desc_a,afmt,& & a1_exp,a2_exp,b1_exp,b2_exp,c_exp,g_exp,info) diff --git a/samples/advanced/pdegen/amg_d_pde2d_base_mod.f90 b/samples/advanced/pdegen/amg_d_pde2d_const_mod.f90 similarity index 74% rename from samples/advanced/pdegen/amg_d_pde2d_base_mod.f90 rename to samples/advanced/pdegen/amg_d_pde2d_const_mod.f90 index e6613370..85a5b52d 100644 --- a/samples/advanced/pdegen/amg_d_pde2d_base_mod.f90 +++ b/samples/advanced/pdegen/amg_d_pde2d_const_mod.f90 @@ -34,56 +34,56 @@ ! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ! POSSIBILITY OF SUCH DAMAGE. ! -module amg_d_pde2d_base_mod +module amg_d_pde2d_const_mod use psb_base_mod, only : psb_dpk_, dzero, done real(psb_dpk_), save, private :: epsilon=done/80 contains - subroutine pde_set_parm2d_base(dat) + subroutine pde_set_parm2d_const(dat) real(psb_dpk_), intent(in) :: dat epsilon = dat - end subroutine pde_set_parm2d_base + end subroutine pde_set_parm2d_const ! ! functions parametrizing the differential equation ! - function b1_base(x,y) + function b1_const(x,y) implicit none - real(psb_dpk_) :: b1_base + real(psb_dpk_) :: b1_const real(psb_dpk_), intent(in) :: x,y - b1_base = dzero/1.414_psb_dpk_ - end function b1_base - function b2_base(x,y) + b1_const = @ROONE@/1.414_psb_dpk_ + end function b1_const + function b2_const(x,y) implicit none - real(psb_dpk_) :: b2_base + real(psb_dpk_) :: b2_const real(psb_dpk_), intent(in) :: x,y - b2_base = dzero/1.414_psb_dpk_ - end function b2_base - function c_base(x,y) + b2_const = done/1.414_psb_dpk_ + end function b2_const + function c_const(x,y) implicit none - real(psb_dpk_) :: c_base + real(psb_dpk_) :: c_const real(psb_dpk_), intent(in) :: x,y - c_base = dzero - end function c_base - function a1_base(x,y) + c_const = dzero + end function c_const + function a1_const(x,y) implicit none - real(psb_dpk_) :: a1_base + real(psb_dpk_) :: a1_const real(psb_dpk_), intent(in) :: x,y - a1_base=done*epsilon - end function a1_base - function a2_base(x,y) + a1_const=done*epsilon + end function a1_const + function a2_const(x,y) implicit none - real(psb_dpk_) :: a2_base + real(psb_dpk_) :: a2_const real(psb_dpk_), intent(in) :: x,y - a2_base=done*epsilon - end function a2_base - function g_base(x,y) + a2_const=done*epsilon + end function a2_const + function g_const(x,y) implicit none - real(psb_dpk_) :: g_base + real(psb_dpk_) :: g_const real(psb_dpk_), intent(in) :: x,y - g_base = dzero + g_const = dzero if (x == done) then - g_base = done + g_const = done else if (x == dzero) then - g_base = done + g_const = done end if - end function g_base -end module amg_d_pde2d_base_mod + end function g_const +end module amg_d_pde2d_const_mod diff --git a/samples/advanced/pdegen/amg_d_pde2d_poisson_mod.f90 b/samples/advanced/pdegen/amg_d_pde2d_poisson_mod.f90 new file mode 100644 index 00000000..560df536 --- /dev/null +++ b/samples/advanced/pdegen/amg_d_pde2d_poisson_mod.f90 @@ -0,0 +1,89 @@ +! +! +! AMG4PSBLAS version 1.0 +! Algebraic Multigrid Package +! based on PSBLAS (Parallel Sparse BLAS version 3.7) +! +! (C) Copyright 2021 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Fabio Durastante +! +! 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_pde2d_poisson_mod + use psb_base_mod, only : psb_dpk_, dzero, done + real(psb_dpk_), save, private :: epsilon=done/80 +contains + subroutine pde_set_parm2d_poisson(dat) + real(psb_dpk_), intent(in) :: dat + epsilon = dat + end subroutine pde_set_parm2d_poisson + ! + ! functions parametrizing the differential equation + ! + function b1_poisson(x,y) + implicit none + real(psb_dpk_) :: b1_poisson + real(psb_dpk_), intent(in) :: x,y + b1_poisson = dzero + end function b1_poisson + function b2_poisson(x,y) + implicit none + real(psb_dpk_) :: b2_poisson + real(psb_dpk_), intent(in) :: x,y + b2_poisson = dzero + end function b2_poisson + function c_poisson(x,y) + implicit none + real(psb_dpk_) :: c_poisson + real(psb_dpk_), intent(in) :: x,y + c_poisson = dzero + end function c_poisson + function a1_poisson(x,y) + implicit none + real(psb_dpk_) :: a1_poisson + real(psb_dpk_), intent(in) :: x,y + a1_poisson=done*epsilon + end function a1_poisson + function a2_poisson(x,y) + implicit none + real(psb_dpk_) :: a2_poisson + real(psb_dpk_), intent(in) :: x,y + a2_poisson=done*epsilon + end function a2_poisson + function g_poisson(x,y) + implicit none + real(psb_dpk_) :: g_poisson + real(psb_dpk_), intent(in) :: x,y + g_poisson = dzero + if (x == done) then + g_poisson = done + else if (x == dzero) then + g_poisson = done + end if + end function g_poisson +end module amg_d_pde2d_poisson_mod diff --git a/samples/advanced/pdegen/amg_d_pde3d.F90 b/samples/advanced/pdegen/amg_d_pde3d.F90 index 31e5848b..2b94dd32 100644 --- a/samples/advanced/pdegen/amg_d_pde3d.F90 +++ b/samples/advanced/pdegen/amg_d_pde3d.F90 @@ -250,9 +250,13 @@ program amg_d_pde3d call psb_barrier(ctxt) t1 = psb_wtime() select case(psb_toupper(trim(pdecoeff))) - case("CONST") + case("POISSON") call amg_gen_pde3d(ctxt,idim,a,b,x,desc_a,afmt,& - & a1_base,a2_base,a3_base,b1_base,b2_base,b3_base,c_base,g_base,info) + & a1_poisson,a2_poisson,a3_poisson,& + & b1_poisson,b2_poisson,b3_poisson,c_poisson,g_poisson,info) + case("CONST") call amg_gen_pde3d(ctxt,idim,a,b,x,desc_a,afmt,& + & a1_const,a2_const,a3_const,& + & b1_const,b2_const,b3_const,c_const,g_const,info) case("EXP") call amg_gen_pde3d(ctxt,idim,a,b,x,desc_a,afmt,& & a1_exp,a2_exp,a3_exp,b1_exp,b2_exp,b3_exp,c_exp,g_exp,info) diff --git a/samples/advanced/pdegen/amg_d_pde3d_base_mod.f90 b/samples/advanced/pdegen/amg_d_pde3d_const_mod.f90 similarity index 97% rename from samples/advanced/pdegen/amg_d_pde3d_base_mod.f90 rename to samples/advanced/pdegen/amg_d_pde3d_const_mod.f90 index 4e954654..5650e120 100644 --- a/samples/advanced/pdegen/amg_d_pde3d_base_mod.f90 +++ b/samples/advanced/pdegen/amg_d_pde3d_const_mod.f90 @@ -49,13 +49,13 @@ contains implicit none real(psb_dpk_) :: b1_base real(psb_dpk_), intent(in) :: x,y,z - b1_base=dzero/sqrt(3.0_psb_dpk_) + b1_base=done/sqrt(3.0_psb_dpk_) end function b1_base function b2_base(x,y,z) implicit none real(psb_dpk_) :: b2_base real(psb_dpk_), intent(in) :: x,y,z - b2_base=dzero/sqrt(3.0_psb_dpk_) + b2_base=done/sqrt(3.0_psb_dpk_) end function b2_base function b3_base(x,y,z) implicit none diff --git a/samples/advanced/pdegen/amg_d_pde3d_poisson_mod.f90 b/samples/advanced/pdegen/amg_d_pde3d_poisson_mod.f90 new file mode 100644 index 00000000..d4b0049e --- /dev/null +++ b/samples/advanced/pdegen/amg_d_pde3d_poisson_mod.f90 @@ -0,0 +1,101 @@ +! +! +! AMG4PSBLAS version 1.0 +! Algebraic Multigrid Package +! based on PSBLAS (Parallel Sparse BLAS version 3.7) +! +! (C) Copyright 2021 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Fabio Durastante +! +! 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_pde3d_poisson_mod + use psb_base_mod, only : psb_dpk_, done, dzero + real(psb_dpk_), save, private :: epsilon=done/80 +contains + subroutine pde_set_parm3d_poisson(dat) + real(psb_dpk_), intent(in) :: dat + epsilon = dat + end subroutine pde_set_parm3d_poisson + ! + ! functions parametrizing the differential equation + ! + function b1_poisson(x,y,z) + implicit none + real(psb_dpk_) :: b1_poisson + real(psb_dpk_), intent(in) :: x,y,z + b1_poisson=dzero + end function b1_poisson + function b2_poisson(x,y,z) + implicit none + real(psb_dpk_) :: b2_poisson + real(psb_dpk_), intent(in) :: x,y,z + b2_poisson=dzero + end function b2_poisson + function b3_poisson(x,y,z) + implicit none + real(psb_dpk_) :: b3_poisson + real(psb_dpk_), intent(in) :: x,y,z + b3_poisson=dzero + end function b3_poisson + function c_poisson(x,y,z) + implicit none + real(psb_dpk_) :: c_poisson + real(psb_dpk_), intent(in) :: x,y,z + c_poisson=dzero + end function c_poisson + function a1_poisson(x,y,z) + implicit none + real(psb_dpk_) :: a1_poisson + real(psb_dpk_), intent(in) :: x,y,z + a1_poisson=epsilon + end function a1_poisson + function a2_poisson(x,y,z) + implicit none + real(psb_dpk_) :: a2_poisson + real(psb_dpk_), intent(in) :: x,y,z + a2_poisson=epsilon + end function a2_poisson + function a3_poisson(x,y,z) + implicit none + real(psb_dpk_) :: a3_poisson + real(psb_dpk_), intent(in) :: x,y,z + a3_poisson=epsilon + end function a3_poisson + function g_poisson(x,y,z) + implicit none + real(psb_dpk_) :: g_poisson + real(psb_dpk_), intent(in) :: x,y,z + g_poisson = dzero + if (x == done) then + g_poisson = done + else if (x == dzero) then + g_poisson = done + end if + end function g_poisson +end module amg_d_pde3d_poisson_mod diff --git a/samples/advanced/pdegen/amg_s_pde2d.F90 b/samples/advanced/pdegen/amg_s_pde2d.F90 index 516447d5..7cbf7ca3 100644 --- a/samples/advanced/pdegen/amg_s_pde2d.F90 +++ b/samples/advanced/pdegen/amg_s_pde2d.F90 @@ -69,7 +69,8 @@ program amg_s_pde2d use psb_krylov_mod use psb_util_mod use data_input - use amg_s_pde2d_base_mod + use amg_s_pde2d_poisson_mod + use amg_s_pde2d_const_mod use amg_s_pde2d_exp_mod use amg_s_pde2d_box_mod use amg_s_pde2d_gauss_mod @@ -248,9 +249,14 @@ program amg_s_pde2d call psb_barrier(ctxt) t1 = psb_wtime() select case(psb_toupper(trim(pdecoeff))) + case("POISSON") + call amg_gen_pde2d(ctxt,idim,a,b,x,desc_a,afmt,& + & a1_poisson,a2_poisson,& + & b1_poisson,b2_poisson,c_poisson,g_poisson,info) case("CONST") call amg_gen_pde2d(ctxt,idim,a,b,x,desc_a,afmt,& - & a1_base,a2_base,b1_base,b2_base,c_base,g_base,info) + & a1_const,a2_const,& + & b1_const,b2_const,c_const,g_const,info) case("EXP") call amg_gen_pde2d(ctxt,idim,a,b,x,desc_a,afmt,& & a1_exp,a2_exp,b1_exp,b2_exp,c_exp,g_exp,info) diff --git a/samples/advanced/pdegen/amg_s_pde2d_base_mod.f90 b/samples/advanced/pdegen/amg_s_pde2d_const_mod.f90 similarity index 74% rename from samples/advanced/pdegen/amg_s_pde2d_base_mod.f90 rename to samples/advanced/pdegen/amg_s_pde2d_const_mod.f90 index d5cbc6d0..27bd4741 100644 --- a/samples/advanced/pdegen/amg_s_pde2d_base_mod.f90 +++ b/samples/advanced/pdegen/amg_s_pde2d_const_mod.f90 @@ -34,56 +34,56 @@ ! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ! POSSIBILITY OF SUCH DAMAGE. ! -module amg_s_pde2d_base_mod +module amg_s_pde2d_const_mod use psb_base_mod, only : psb_spk_, szero, sone real(psb_spk_), save, private :: epsilon=sone/80 contains - subroutine pde_set_parm2d_base(dat) + subroutine pde_set_parm2d_const(dat) real(psb_spk_), intent(in) :: dat epsilon = dat - end subroutine pde_set_parm2d_base + end subroutine pde_set_parm2d_const ! ! functions parametrizing the differential equation ! - function b1_base(x,y) + function b1_const(x,y) implicit none - real(psb_spk_) :: b1_base + real(psb_spk_) :: b1_const real(psb_spk_), intent(in) :: x,y - b1_base = szero/1.414_psb_spk_ - end function b1_base - function b2_base(x,y) + b1_const = @ROONE@/1.414_psb_spk_ + end function b1_const + function b2_const(x,y) implicit none - real(psb_spk_) :: b2_base + real(psb_spk_) :: b2_const real(psb_spk_), intent(in) :: x,y - b2_base = szero/1.414_psb_spk_ - end function b2_base - function c_base(x,y) + b2_const = sone/1.414_psb_spk_ + end function b2_const + function c_const(x,y) implicit none - real(psb_spk_) :: c_base + real(psb_spk_) :: c_const real(psb_spk_), intent(in) :: x,y - c_base = szero - end function c_base - function a1_base(x,y) + c_const = szero + end function c_const + function a1_const(x,y) implicit none - real(psb_spk_) :: a1_base + real(psb_spk_) :: a1_const real(psb_spk_), intent(in) :: x,y - a1_base=sone*epsilon - end function a1_base - function a2_base(x,y) + a1_const=sone*epsilon + end function a1_const + function a2_const(x,y) implicit none - real(psb_spk_) :: a2_base + real(psb_spk_) :: a2_const real(psb_spk_), intent(in) :: x,y - a2_base=sone*epsilon - end function a2_base - function g_base(x,y) + a2_const=sone*epsilon + end function a2_const + function g_const(x,y) implicit none - real(psb_spk_) :: g_base + real(psb_spk_) :: g_const real(psb_spk_), intent(in) :: x,y - g_base = szero + g_const = szero if (x == sone) then - g_base = sone + g_const = sone else if (x == szero) then - g_base = sone + g_const = sone end if - end function g_base -end module amg_s_pde2d_base_mod + end function g_const +end module amg_s_pde2d_const_mod diff --git a/samples/advanced/pdegen/amg_s_pde2d_poisson_mod.f90 b/samples/advanced/pdegen/amg_s_pde2d_poisson_mod.f90 new file mode 100644 index 00000000..7b5eef10 --- /dev/null +++ b/samples/advanced/pdegen/amg_s_pde2d_poisson_mod.f90 @@ -0,0 +1,89 @@ +! +! +! AMG4PSBLAS version 1.0 +! Algebraic Multigrid Package +! based on PSBLAS (Parallel Sparse BLAS version 3.7) +! +! (C) Copyright 2021 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Fabio Durastante +! +! 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_pde2d_poisson_mod + use psb_base_mod, only : psb_spk_, szero, sone + real(psb_spk_), save, private :: epsilon=sone/80 +contains + subroutine pde_set_parm2d_poisson(dat) + real(psb_spk_), intent(in) :: dat + epsilon = dat + end subroutine pde_set_parm2d_poisson + ! + ! functions parametrizing the differential equation + ! + function b1_poisson(x,y) + implicit none + real(psb_spk_) :: b1_poisson + real(psb_spk_), intent(in) :: x,y + b1_poisson = szero + end function b1_poisson + function b2_poisson(x,y) + implicit none + real(psb_spk_) :: b2_poisson + real(psb_spk_), intent(in) :: x,y + b2_poisson = szero + end function b2_poisson + function c_poisson(x,y) + implicit none + real(psb_spk_) :: c_poisson + real(psb_spk_), intent(in) :: x,y + c_poisson = szero + end function c_poisson + function a1_poisson(x,y) + implicit none + real(psb_spk_) :: a1_poisson + real(psb_spk_), intent(in) :: x,y + a1_poisson=sone*epsilon + end function a1_poisson + function a2_poisson(x,y) + implicit none + real(psb_spk_) :: a2_poisson + real(psb_spk_), intent(in) :: x,y + a2_poisson=sone*epsilon + end function a2_poisson + function g_poisson(x,y) + implicit none + real(psb_spk_) :: g_poisson + real(psb_spk_), intent(in) :: x,y + g_poisson = szero + if (x == sone) then + g_poisson = sone + else if (x == szero) then + g_poisson = sone + end if + end function g_poisson +end module amg_s_pde2d_poisson_mod diff --git a/samples/advanced/pdegen/amg_s_pde3d.F90 b/samples/advanced/pdegen/amg_s_pde3d.F90 index be5d7b7d..3c24ae5f 100644 --- a/samples/advanced/pdegen/amg_s_pde3d.F90 +++ b/samples/advanced/pdegen/amg_s_pde3d.F90 @@ -250,9 +250,13 @@ program amg_s_pde3d call psb_barrier(ctxt) t1 = psb_wtime() select case(psb_toupper(trim(pdecoeff))) - case("CONST") + case("POISSON") call amg_gen_pde3d(ctxt,idim,a,b,x,desc_a,afmt,& - & a1_base,a2_base,a3_base,b1_base,b2_base,b3_base,c_base,g_base,info) + & a1_poisson,a2_poisson,a3_poisson,& + & b1_poisson,b2_poisson,b3_poisson,c_poisson,g_poisson,info) + case("CONST") call amg_gen_pde3d(ctxt,idim,a,b,x,desc_a,afmt,& + & a1_const,a2_const,a3_const,& + & b1_const,b2_const,b3_const,c_const,g_const,info) case("EXP") call amg_gen_pde3d(ctxt,idim,a,b,x,desc_a,afmt,& & a1_exp,a2_exp,a3_exp,b1_exp,b2_exp,b3_exp,c_exp,g_exp,info) diff --git a/samples/advanced/pdegen/amg_s_pde3d_base_mod.f90 b/samples/advanced/pdegen/amg_s_pde3d_const_mod.f90 similarity index 97% rename from samples/advanced/pdegen/amg_s_pde3d_base_mod.f90 rename to samples/advanced/pdegen/amg_s_pde3d_const_mod.f90 index 3dbd039f..b51b3748 100644 --- a/samples/advanced/pdegen/amg_s_pde3d_base_mod.f90 +++ b/samples/advanced/pdegen/amg_s_pde3d_const_mod.f90 @@ -49,13 +49,13 @@ contains implicit none real(psb_spk_) :: b1_base real(psb_spk_), intent(in) :: x,y,z - b1_base=szero/sqrt(3.0_psb_spk_) + b1_base=sone/sqrt(3.0_psb_spk_) end function b1_base function b2_base(x,y,z) implicit none real(psb_spk_) :: b2_base real(psb_spk_), intent(in) :: x,y,z - b2_base=szero/sqrt(3.0_psb_spk_) + b2_base=sone/sqrt(3.0_psb_spk_) end function b2_base function b3_base(x,y,z) implicit none diff --git a/samples/advanced/pdegen/amg_s_pde3d_poisson_mod.f90 b/samples/advanced/pdegen/amg_s_pde3d_poisson_mod.f90 new file mode 100644 index 00000000..5f561566 --- /dev/null +++ b/samples/advanced/pdegen/amg_s_pde3d_poisson_mod.f90 @@ -0,0 +1,101 @@ +! +! +! AMG4PSBLAS version 1.0 +! Algebraic Multigrid Package +! based on PSBLAS (Parallel Sparse BLAS version 3.7) +! +! (C) Copyright 2021 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Fabio Durastante +! +! 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_pde3d_poisson_mod + use psb_base_mod, only : psb_spk_, sone, szero + real(psb_spk_), save, private :: epsilon=sone/80 +contains + subroutine pde_set_parm3d_poisson(dat) + real(psb_spk_), intent(in) :: dat + epsilon = dat + end subroutine pde_set_parm3d_poisson + ! + ! functions parametrizing the differential equation + ! + function b1_poisson(x,y,z) + implicit none + real(psb_spk_) :: b1_poisson + real(psb_spk_), intent(in) :: x,y,z + b1_poisson=szero + end function b1_poisson + function b2_poisson(x,y,z) + implicit none + real(psb_spk_) :: b2_poisson + real(psb_spk_), intent(in) :: x,y,z + b2_poisson=szero + end function b2_poisson + function b3_poisson(x,y,z) + implicit none + real(psb_spk_) :: b3_poisson + real(psb_spk_), intent(in) :: x,y,z + b3_poisson=szero + end function b3_poisson + function c_poisson(x,y,z) + implicit none + real(psb_spk_) :: c_poisson + real(psb_spk_), intent(in) :: x,y,z + c_poisson=szero + end function c_poisson + function a1_poisson(x,y,z) + implicit none + real(psb_spk_) :: a1_poisson + real(psb_spk_), intent(in) :: x,y,z + a1_poisson=epsilon + end function a1_poisson + function a2_poisson(x,y,z) + implicit none + real(psb_spk_) :: a2_poisson + real(psb_spk_), intent(in) :: x,y,z + a2_poisson=epsilon + end function a2_poisson + function a3_poisson(x,y,z) + implicit none + real(psb_spk_) :: a3_poisson + real(psb_spk_), intent(in) :: x,y,z + a3_poisson=epsilon + end function a3_poisson + function g_poisson(x,y,z) + implicit none + real(psb_spk_) :: g_poisson + real(psb_spk_), intent(in) :: x,y,z + g_poisson = szero + if (x == sone) then + g_poisson = sone + else if (x == szero) then + g_poisson = sone + end if + end function g_poisson +end module amg_s_pde3d_poisson_mod