From 06f8f83114cca17e7d88f19c0dfd176221791d28 Mon Sep 17 00:00:00 2001 From: sfilippone Date: Tue, 23 Dec 2025 11:21:53 +0100 Subject: [PATCH] Update documentation for release --- docs/amg4psblas_1.2-guide.pdf | Bin 1878092 -> 1878728 bytes docs/html/index.html | 2 +- docs/html/userhtml.html | 2 +- docs/html/userhtmlli1.html | 34 +- docs/html/userhtmlse1.html | 66 +- docs/html/userhtmlse3.html | 92 +-- docs/html/userhtmlse4.html | 132 ++-- docs/html/userhtmlse5.html | 1199 ++++++++++++++++----------------- docs/html/userhtmlse7.html | 4 + docs/html/userhtmlse8.html | 73 +- docs/src/abstract.tex | 42 +- docs/src/building.tex | 17 +- docs/src/gettingstarted.tex | 20 +- docs/src/license.tex | 69 +- docs/src/overview.tex | 68 +- docs/src/userguide.tex | 2 +- docs/src/userhtml.tex | 2 +- docs/src/userinterface.tex | 73 +- 18 files changed, 975 insertions(+), 922 deletions(-) diff --git a/docs/amg4psblas_1.2-guide.pdf b/docs/amg4psblas_1.2-guide.pdf index 6cead832cd95c3011697007ddaa2fcab47bad00d..faec7bbe1e5eb071e10df540e393eefe4f85fa97 100644 GIT binary patch delta 55231 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 delta 54031 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

Xg8UtQi8B_!&qT8U9Kq*fvC1C!4N`aOULhI8q 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

)=SS^9`-H9=QOv}5;3gKCD6CedA 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 diff --git a/docs/html/index.html b/docs/html/index.html index 05e3ea7c..4ed148b0 100644 --- a/docs/html/index.html +++ b/docs/html/index.html @@ -31,7 +31,7 @@ class="cmr-12">University of Rome Tor-Vergata and IAC-CNR
Software version: 1.2
December 31st, 2025 +class="cmr-12">December 23rd, 2025 diff --git a/docs/html/userhtml.html b/docs/html/userhtml.html index 05e3ea7c..4ed148b0 100644 --- a/docs/html/userhtml.html +++ b/docs/html/userhtml.html @@ -31,7 +31,7 @@ class="cmr-12">University of Rome Tor-Vergata and IAC-CNR
Software version: 1.2
December 31st, 2025 +class="cmr-12">December 23rd, 2025 diff --git a/docs/html/userhtmlli1.html b/docs/html/userhtmlli1.html index 328c05e6..43007b4d 100644 --- a/docs/html/userhtmlli1.html +++ b/docs/html/userhtmlli1.html @@ -72,32 +72,34 @@ class="small-caps">n class="cmcsc-10x-x-120">PSBLAS) is a package of parallel algebraic multilevel preconditioners included in the PSCToolkit (Parallel Sparse Computation Toolkit) software framework. It is a progress +class="cmr-12">PSCToolkit (Parallel Sparse Computation Toolkit) software framework. It of a software development project started in 2007, named MLD2P4, which originally +class="cmr-12">is an evolutiuon of a software development project started in 2007, named implemented a multilevel version of some domain decomposition preconditioners of +class="cmr-12">MLD2P4, which originally implemented a multilevel version of some domain additive-Schwarz type, and was based on a parallel decoupled version of the well known +class="cmr-12">decomposition preconditioners of additive-Schwarz type, and was based on a parallel smoothed aggregation method to generate the multilevel hierarchy of coarser +class="cmr-12">decoupled version of the well known smoothed aggregation method to generate the matrices. In the last years, within the context of the EU-H2020 EoCoE project +class="cmr-12">multilevel hierarchy of coarser matrices. In the last few years the package (Energy Oriented Center of Excellence), the package was extended for including +class="cmr-12">was extended for including new algorithms and functionalities for the setup new algorithms and functionalities for the setup and application new AMG +class="cmr-12">and application new AMG preconditioners with the final aims of improving preconditioners with the final aims of improving efficiency and scalability when tens of +class="cmr-12">efficiency and scalability when tens of thousands cores are used, and of boosting thousands cores are used, and of boosting reliability in dealing with general +class="cmr-12">reliability in dealing with general symmetric positive definite linear systems; these symmetric positive definite linear systems. Due to the significant number +class="cmr-12">developments have been supported in the context of the EU-H2020 EoCoE +project (Energy Oriented Center of Excellence). Due to the significant number of changes and the increase in scope, we decided to rename the package as AMG4PSBLAS. -

AMG4PSBLAS has been designed to provide scalable and easy-to-use preconditioners in the context of the PSBLAS (Parallel Sparse Basic Linear Algebra @@ -111,14 +113,14 @@ class="cmr-12">algebraic approach; therefore users level interfaces assume that class="cmr-12">and preconditioners are represented as PSBLAS distributed sparse matrices. AMG4PSBLAS enables the user to easily specify different features of an algebraic -multilevel preconditioner, thus allowing to experiment with different preconditioners for +multilevel preconditioner, thus allowing to experiment with different preconditioners for the problem and parallel computers at hand. -

The package employs object-oriented design techniques in Fortran 2003, with parallel implementation is based on a Single Program Multiple Dat class="cmr-12">paradigm; the inter-process communication is based on MPI and is managed mainly through PSBLAS. -

This guide provides a brief description of the functionalities and the user interface of AMG4PSBLAS. diff --git a/docs/html/userhtmlse1.html b/docs/html/userhtmlse1.html index ae661559..f42c44aa 100644 --- a/docs/html/userhtmlse1.html +++ b/docs/html/userhtmlse1.html @@ -100,18 +100,18 @@ src="userhtml0x.png" alt="Ax = b, id="x4-3001r1"> (1) -

where A is a square, real or complex, sparse symmetric positive definite (s.p.d) matrix. -

The preconditioners implemented in AMG4PSBLAS are obtained by combining 3 different types of AMG cycles with smoothers and coarsest-level solvers. Available +class="cmr-12">different types of AMG cycles with smoothers and coarsest-level solvers. We provide a multigrid cycles include the V-, W-, and a version of a Krylov-type cycle +class="cmr-12">number of multigrid cycles, including the V-, W-, and a version of a Krylov-type cycle (K-cycle) 14]. -

An algebraic approach is used to generate a hierarchy of coarse-level matrices and operators, without explicitly using any information on the geometry of the original @@ -150,7 +150,7 @@ class="cmr-12">problem, e.g., the discretization of a PDE. To this end, two diff class="cmr-12">strategies, based on aggregation, are available:

-

Either exact or approximate solvers can be used on the coarsest-level system. We provide interfaces to various parallel and sequential sparse LU factorizations from external @@ -210,7 +210,7 @@ class="cmr-12">parallel weighted Jacobi, hybrid Gauss-Seidel, block-Jacobi solve class="cmr-12">preconditioned Krylov methods; all smoothers can be also exploited as one-level preconditioners. -

AMG4PSBLAS is written in Fortran 2003, following an object-oriented design Single and double precision implementations of AMG4PSBLAS are ava class="cmr-12">for both the real and the complex case, which can be used through a single interface. -

AMG4PSBLAS has been designed to implement scalable and easy-to-use +

AMG4PSBLAS has been designed to implement scalable and easy-to-use multilevel multilevel preconditioners in the context of the PSBLAS (Parallel Sparse BLAS) +class="cmr-12">preconditioners in the context of the PSBLAS (Parallel Sparse BLAS) computational computational frameworkframework [ 22]. PSBLAS provides basic linear algebra operators +class="cmr-12">. PSBLAS provides basic linear algebra operators and data and data management facilities for distributed sparse matrices, kernels for +class="cmr-12">management facilities for distributed sparse matrices, kernels for sequential incomplete sequential incomplete factorizations needed for the parallel block-Jacobi and +class="cmr-12">factorizations needed for the parallel block-Jacobi and additive Schwarz smoothers, and additive Schwarz smoothers, and parallel Krylov solvers which can be used with +class="cmr-12">parallel Krylov solvers which can be used with the AMG4PSBLAS preconditioners. the AMG4PSBLAS preconditioners. The choice of PSBLAS has been mainly +class="cmr-12">The choice of PSBLAS has been mainly motivated by the need of having a portable motivated by the need of having a portable and efficient software infrastructure +class="cmr-12">and efficient software infrastructure implementing “de facto” standard parallel sparse implementing “de facto” standard parallel sparse linear algebra kernels, to +class="cmr-12">linear algebra kernels, to pursue goals such as performance, portability, modularity pursue goals such as performance, portability, modularity ed extensibility +class="cmr-12">ed extensibility in the development of the preconditioner package. On the in the development of the preconditioner package. On the other hand, the +class="cmr-12">other hand, the implementation of AMG4PSBLAS, which was driven by the implementation of AMG4PSBLAS, which was driven by the need to face the exascale +class="cmr-12">need to face the exascale challenge, has led to some important revisions and challenge, has led to some important revisions and extentions of the PSBLAS +class="cmr-12">extentions of the PSBLAS infrastructure. The inter-process comunication infrastructure. The inter-process comunication required by AMG4PSBLAS +class="cmr-12">required by AMG4PSBLAS is encapsulated in the PSBLAS routines; therefore, is encapsulated in the PSBLAS routines; therefore, AMG4PSBLAS can be +class="cmr-12">AMG4PSBLAS can be run on any parallel machine where PSBLAS implementations run on any parallel machine where PSBLAS implementations are available. +class="cmr-12">are available. The most recent version of PSBLAS (release 3.9) includes a plug-in for In the most recent version of PSBLAS (release 3.7), a plug-in for GPU is -included; it includes CUDA versions of main vector operations and of sparse +class="cmr-12">GPU; it contains CUDA versions of main vector operations and of sparse matrix-vector multiplication, so that Krylov methods coupled with AMG4PSBLAS preconditioners relying on Jacobi and block-Jacobi smoothers with class="cmr-12">approximate inverses on the blocks can be efficiently executed on cluster of GPUs. -

AMG4PSBLAS has a layered and modular software architecture where three main layers can be identified. The lower layer consists of the PSBLAS kernels, the middle one implements the construction and application phases of the preconditioners, and the +upper one provides a uniform interface to all the preconditioners. This architecture -upper one provides a uniform interface to all the preconditioners. This architecture allows for different levels of use of the package: few black-box routines at the upper  6). -

This guide is organized as follows. General information on the distribution of the source code is reported in Section. Most Fortran compilers provide this feature; in particular, thi supported by the GNU Fortran compiler, for which we recommend to use at least version 4.8. The software defines data types and interfaces for real and complex data, +class="cmr-12">version 12. The software defines data types and interfaces for real and complex data, in in both single and double precision. +class="cmr-12">both single and double precision.

Building AMG4PSBLAS requires some base libraries (see Section “developer” part; in order to build AMG4PSBLAS you ne class="cmr-12">the base and optional software used by AMG4PSBLAS is given in the next sections. -

+

3.1 Prerequisites

-

The following base libraries are needed:

-

+

BLAS

-

[18for including -fPIC compilation option in the make.inc file of th library.

-

+

MPI

-

[25A version of MPI is available on most high-performance computing< systems.

-

+

PSBLAS

-

[21; version class="cmr-12">3.9.0 (or later) is required. Indeed, all the prerequisites listed so far are also prerequisites of PSBLAS.

-

Please note that the four previous libraries must have Fortran interfaces compatible with AMG4PSBLAS; usually this means that they should all be built with the same compiler being used for AMG4PSBLAS. -

If you want to use the PSBLAS support for NVIDIA GPUs, you will also need a working version of the CUDA Toolkit that is compatible with the @@ -214,7 +214,7 @@ class="cmr-12">options:

 ./configure --enable-cuda --with-cudadir=${CUDA_HOME} --with-cudacc=xx,yy,zz
 
-

Previous versions required you to have the auxiliary libraries SPGPU and PSBLAS-EXT compiled, this is no longer necessary because they have been integrated @@ -226,24 +226,24 @@ class="cmr-12"> 4.2. -

+

3.2 Optional third party libraries

-

We provide interfaces to the following third-party software libraries; note that these are optional, but if you enable them some defaults for multilevel preconditioners may change to reflect their presence. -

+

-

+

UMFPACK

-

[16provide the right path to the BLAS and LAPACK libraries class="cmtt-12">SuiteSparse_config/SuiteSparse_config.mk file.

-

+

MUMPS

-

[2solution for single and double precision, real and complex data. versions 4.10.0 and 5.0.1.

-

+

SuperLU

-

[17data. We tested versions 4.3 and 5.0. If you installed BLAS from remember to define the BLASLIB variable in the make.inc file.

-

+

SuperLU_Dist

-

[28parallel graph partitioning and fill-reducing matrix ordering, av href="glaros.dtc.umn.edu/gkhome/metis/parmetis/overview" class="url" >glaros.dtc.umn.edu/gkhome/metis/parmetis/overview.

-

+

3.3 Configuration options

-

In order to build AMG4PSBLAS, the first step is to use the configure script in the main directory to generate the necessary makefile. -

As a minimal example consider the following: @@ -360,7 +360,7 @@ class="cmr-12">As a minimal example consider the following:

 ./configure --with-psblas=PSB-INSTALL-DIR
 
-

which assumes that the various MPI compilers and support libraries are available in the standard directories on the system, and specifies only the PSBLAS install directory @@ -374,7 +374,7 @@ class="cmtt-12">./configure --help, which produces:

produces:  
configure/issues>.
    
-

For instance, if a user has built and installed PSBLAS 3.7 under the

For instance, if a user has built and installed PSBLAS 3.9 under the /opt directory and is might be configured with:

-./configure --with-psblas=/opt/psblas-3.7/ \
+./configure --with-psblas=/opt/psblas-3.9/ \
 --with-umfpackincdir=/usr/include/suitesparse/
 
-

Once the configure script has completed execution, it will have generated the file Make.inc which will then be used by all Makefiles in the directory tree; t class="cmr-12">copied in the install directory under the name Make.inc.AMG4PSBLAS. -

To use the MUMPS solver package, the user has to add the appropriate options to the configure script; by default we are looking for the libraries --with-extra-libs configure option. -

To build the library the user will now enter @@ -3962,7 +3962,7 @@ class="cmr-12">To build the library the user will now enter

 make
 
-

followed (optionally) by @@ -3970,12 +3970,12 @@ class="cmr-12">followed (optionally) by

 make install
 
-

+

3.4 Bug reporting

-

If you find any bugs in our codes, please report them through our issues page on
https://github.com/psctoolkit/psctoolkit/issues
-

To enable us to track the bug, please provide a log from the failing application, the test conditions, and ideally a self-contained test program reproducing the issue. -

+

3.5 Example and test programs

-

The package contains a samples directory, divided in two subdirs subdirectories. Their purpose is as follows:

-

+

simple

-

contains a set of simple example programs with a predefined choice of preconditioners, selectable via integer values. These are intended to get acquainted with the multilevel preconditioners available in AMG4PSBLAS.

-

+

advanced

-

contains a set of more sophisticated examples that will allow the user, via the input files in the runs subdirectories, to experiment with the full range of preconditioners implemented in the package.

-

The fileread directories contain sample programs that read sparse matrices from files, diff --git a/docs/html/userhtmlse4.html b/docs/html/userhtmlse4.html index 286b0483..493821fa 100644 --- a/docs/html/userhtmlse4.html +++ b/docs/html/userhtmlse4.html @@ -351,7 +351,7 @@ class="content">Preconditioner types, corresponding strings and default choices.


-

Note that the module amg_prec_mod, containing the definition of the preconditioner 4.1).
-

Remark 1. Coarsest-level solvers based on the LU factorization, such as those problems. However, this does not necessarily correspond to the sh on parallel computers. +

Remark 2. Memory allocation on GPUs is a costly operation implying a +synchronization; therefore, it is convenient to preallocate internal preconditioner +workspace with the method prec%allocate_wrk(info) before invoking an iterative +method, and release it upon exit with prec%deallocate_wrk(info).

4.1 Examples

-

The code reported in Figure and ps class="cmr-12">must be used by the example program. -

The part of the code dealing with reading and assembling the sparse matrix and the right-hand side vector and the deallocation of the relevant data structures, performed @@ -451,7 +464,7 @@ href="userhtmlli3.html#XPSBLASGUIDE">21]. -

The setup and application of the default multilevel preconditioner for the real single precision and the complex, single and double precision, versions are obtained @@ -461,6 +474,9 @@ class="cmr-12"> 5 for + + + details). If these versions are installed, the corresponding codes are available in . -


@@ -478,7 +494,7 @@ class="cmr-12">.
-

+

@@ -535,7 +551,7 @@ class="cmr-12">.   call psb_exit(ctxt)   stop

-

+

@@ -548,7 +564,7 @@ class="content">setup and application of the default multilevel preconditioner (


-

Different versions of the multilevel preconditioner can be obtained by changing the default values of the preconditioner parameters. The code reported in Figure2 shows how to set a V-cycle preconditioner which applies 1 block-Jacobi sweep as pre- +class="cmr-12">how to set a V-cycle preconditioner which applies 1 block-Jacobi sweep as pre- and and post-smoother, and solves the coarsest-level system with 8 block-Jacobi +class="cmr-12">post-smoother, and solves the coarsest-level system with 8 block-Jacobi sweeps. Note sweeps. Note that the ILU(0) factorization (plus triangular solve) is used as +class="cmr-12">that the ILU(0) factorization (plus triangular solve) is used as local solver for the local solver for the block-Jacobi sweeps, since this is the default associated +class="cmr-12">block-Jacobi sweeps, since this is the default associated with block-Jacobi and set with block-Jacobi and set byby P%init. Furthermore, specifying block-Jacobi as -coarsest-level solver implies that the coarsest-level matrix is distributed among +class="cmr-12">. Furthermore, specifying block-Jacobi as coarsest-level solver implies that the processes. Figurethe coarsest-level matrix is distributed among the processes. Figure 3 shows how to set a W-cycle preconditioner using the +class="cmr-12">shows how Coarsening based on Compatible Weighted Matching, aggregates of size at +class="cmr-12">to set a W-cycle preconditioner using the Coarsening based on Compatible most 8 and smoothed prolongators. It applies 2 hybrid Gauss-Seidel sweeps as +class="cmr-12">Weighted Matching, aggregates of size at most 8 and smoothed prolongators. It pre- and post-smoother, and solves the coarsest-level system with the parallel +class="cmr-12">applies 2 hybrid Gauss-Seidel sweeps as pre- and post-smoother, and solves the flexible Conjugate Gradient method (KRM) coupled with the block-Jacobi +class="cmr-12">coarsest-level system with the parallel flexible Conjugate Gradient method (KRM) preconditioner having ILU(0) on the blocks. Default parameters are used for stopping +class="cmr-12">coupled with the block-Jacobi preconditioner having ILU(0) on the blocks, with criterion of the coarsest solver. Note that, also in this case, specifying KRM as +class="cmr-12">default parameters used for the coarsest solver. Note that specifying KRM as coarsest-level solver implies that the coarsest-level matrix is distributed among the processes. -

The code fragments shown in Figures are included in the example program class="cmr-12">file amg_dexample_ml.f90 too. -

Finally, Figure nonsymmetric. The corresponding example program is available in t amg_dexample_1lev.f90. -

For all the previous preconditioners, example programs where the sparse matrix and the right-hand side are generated by discretizing a PDE with Dirichlet @@ -631,7 +645,7 @@ class="cmr-12">. -


@@ -639,7 +653,7 @@ class="cmr-12">.
-

+

 ... ...
 ! build a V-cycle preconditioner with 1 block-Jacobi sweep (with
@@ -653,7 +667,7 @@ class="cmr-12">.
   call P%smoothers_build(A,desc_A,info)
 ... ...
 
-

+


Listing 2: setup of a multilevel preconditioner based on the default decoupled coarsening
@@ -664,7 +678,7 @@ class="content">setup of a multilevel preconditioner based on the default decoup -


@@ -672,7 +686,7 @@ class="content">setup of a multilevel preconditioner based on the default decoup
-

+

 ... ...
 ! build a W-cycle preconditioner with 2 hybrid Gauss-Seidel sweeps
@@ -692,7 +706,7 @@ class="content">setup of a multilevel preconditioner based on the default decoup
   call P%smoothers_build(A,desc_A,info)
 ... ...
 
-

+


Listing 3: setup of a multilevel preconditioner based on the coupled coarsening using @@ -704,7 +718,7 @@ weighted matching
-


@@ -712,7 +726,7 @@ weighted matching
-

+

 ... ...
 ! set RAS with overlap 2 and ILU(0) on the local blocks
@@ -723,7 +737,7 @@ weighted matching
! solve Ax=b with preconditioned BiCGSTAB   call psb_krylov(’BICGSTAB’,A,P,b,x,tol,desc_A,info) -

+


Listing 4: setup of a one-level Schwarz preconditioner.
@@ -735,7 +749,7 @@ class="content">setup of a one-level Schwarz preconditioner.

The code discussed here shows how to set up a program exploiting the combined GPU capabilities of PSBLAS and AMG4PSBLAS. The code example is available in the @@ -743,14 +757,14 @@ class="cmr-12">capabilities of PSBLAS and AMG4PSBLAS. The code example is availa class="cmr-12">source distribution directory amg4psblas/examples/gpu. -

First of all, we need to include the appropriate modules and declare some auxiliary variables: -


@@ -758,7 +772,7 @@ class="cmr-12">variables:
-

+

 program amg_dexample_gpu
   use psb_base_mod
@@ -777,7 +791,7 @@ program amg_dexample_gpu
 
  
 
-

+


Listing 5: setup of a GPU-enabled test program part one.
@@ -785,7 +799,7 @@ class="content">setup of a GPU-enabled test program part one.

In this particular example we are choosing to employ a HLG data structure for @@ -793,14 +807,14 @@ class="cmr-12">data structure for class="cmr-12">sparse matrices on GPUs; for more information please refer to the PSBLAS users’ guide. -

We then have to initialize the GPU environment, and pass the appropriate MOLD variables to the build methods (see also the PSBLAS users’ guide). -


@@ -808,7 +822,7 @@ class="cmr-12">variables to the build methods (see also the PSBLAS users’
-

+

   call psb_init(ctxt)
   call psb_info(ctxt,iam,np)
@@ -823,7 +837,7 @@ class="cmr-12">variables to the build methods (see also the PSBLAS users’
 
  
 
-

+


Listing 6: setup of a GPU-enabled test program part two.
@@ -831,7 +845,7 @@ class="content">setup of a GPU-enabled test program part two.

Finally, we convert the input matrix, the descriptor and the vectors to use a GPU-enabled internal storage format. We then preallocate the preconditioner @@ -842,7 +856,7 @@ class="cmr-12">GPU environment -


@@ -850,7 +864,7 @@ class="cmr-12">GPU environment
-

+

   call desc_a%cnv(mold=igmold)
   call a%cscnv(info,mold=agmold)
@@ -877,7 +891,7 @@ class="cmr-12">GPU environment
 
  
 
-

+


Listing 7: setup of a GPU-enabled test program part three.
@@ -885,7 +899,7 @@ class="content">setup of a GPU-enabled test program part three.

It is very important to employ smoothers and coarsest solvers that are suited to the GPU, i.e. methods that do NOT employ triangular system solve kernels. Methods that @@ -893,30 +907,30 @@ class="cmr-12">GPU, i.e. methods that do NOT employ triangular system solve kern class="cmr-12">satisfy this constraint include:

  • -

    JACOBI

  • -

    BJAC with the following methods on the local blocks:

    • -

      INVK

    • -

      INVT

    • -

      AINV

  • -

    POLY

-

and their 1 point-Jacobi, hybrid (forward) Gauss-Seidel, and hybrid backward class="cmr-12">the previous smoothers can be defined just by setting SMOOTHER_TYPE to certain specific values (see Tablescertain specific values (see Table 7accelerated using the specified polynomial smoothing technique. B 1-Jacobi smoother serves as the base smoother, offering theoretical guarantees on the +class="cmr-12">-Jacobi smoother serves as the base smoother, offering theoretical guarantees resulting convergence factoron the resulting convergence factor [ 27]. Alternative combinations are experimental and +class="cmr-12">. Alternative combinations are lack established guarantees.
experimental.
-

Remark 4. Many of the coarsest-level solvers apply to a specific coarsest-matrix layout; therefore, setting the solver after the layout may change the layout to either distributed or replicated. Similarly, setting the layout after the solver may change the +class="cmr-12">distributed or replicated, and similarly, setting the layout after the solver may solver. -

More precisely, UMFPACK and SuperLU require the coarsest-level matrix to be +class="cmr-12">change the solver. More specifically, UMFPACK and SuperLU require the replicated, while SuperLU_Dist and KRM require it to be distributed. In these cases, +class="cmr-12">coarsest-level matrix to be replicated, while SuperLU_Dist and KRM require it to setting the coarsest-level solver implies that the layout is redefined according to the +class="cmr-12">be distributed; therefore, setting the coarsest-level solver implies that the solver, ovverriding any previous settings. MUMPS, point-Jacobi, hybrid Gauss-Seidel +class="cmr-12">layout is redefined according to the solver, ovverriding any previous settings. and block-Jacobi can be applied to replicated and distributed matrices, thus their +class="cmr-12">MUMPS, point-Jacobi, hybrid Gauss-Seidel and block-Jacobi can be applied to choice does not modify any previously specified layout. It is worth noting that, when +class="cmr-12">replicated and distributed matrices, thus their choice does not modify any the matrix is replicated, the point-Jacobi, hybrid Gauss-Seidel and block-Jacobi solvers +class="cmr-12">previously specified layout. It is worth noting that, when the matrix is replicated, and their the point-Jacobi, hybrid Gauss-Seidel and block-Jacobi solvers and their 1- - +versions reduce to the corresponding local solver objects (see Remark 2). +class="cmr-12"> 2). For the For the point-Jacobi and Gauss-Seidel solvers, these objects correspond to a point-Jacobi and Gauss-Seidel solvers, these objects correspond to a single point-Jacobi sweep and a single Gauss-Seidel sweep, respectively, which are very poor solvers. -

On the other hand, the distributed layout can be used with any solver but +

On the other hand, the distributed layout can be used with any solver except and UMFPACK and SuperLU; therefore, if any of these two solvers has already been +class="cmr-12">SuperLU; therefore, if any of these two solvers has already been selected, the selected, the coarsest-level solver is changed to block-Jacobi, with the previously chosen +class="cmr-12">coarsest-level solver is changed to block-Jacobi, with the previously chosen solver solver applied to the local blocks. Likewise, the replicated layout can be used with any +class="cmr-12">applied to the local blocks. Likewise, the replicated layout can be used with any solver solver but SuperLubut SuperLu_Dist and KRM; therefore, if SuperLu_Dist or KRM have been previously set, the coarsest-level solver is changed to the default sequential solver. -

In a parallel setting with many cores, we suggest to the users to change the default coarsest solver for using the KRM choice, i.e. a parallel distributed iterative solution of @@ -615,7 +614,7 @@ class="cmr-12">the coarsest system based on Krylov methods. -

Remark 4. The argument idx can be used to allow finer control for those solvers; @@ -635,7 +634,7 @@ class="cmr-12">. -


@@ -643,7 +642,7 @@ class="cmr-12">.
-

+

+class="td11">

1

Parameters defining the aggregation algorithm.


@@ -948,7 +947,7 @@ class="content">Parameters defining the aggregation algorithm.

+






what

what

dtype

val

val

deault

cots






ML_CYCLE

character(len=*)

VCYCLE -

WCYCLE -

KCYCLE -

ADD

VCYCLE

Multilevel cycle: V-cycle, W-cycle, K-cycle, +class="td11">

ML_CYCLE

character(len=*)

VCYCLE +

WCYCLE +

KCYCLE +

ADD

VCYCLE

Multilevel cycle: V-cycle, W-cycle, K-cycle, and additive composition.






CYCLE_SWEEPS

integer

Any integer -

number

CYCLE_SWEEPS

integer

Any integer +

number 1

1

Number of multilevel cycles.

Number of multilevel cycles.






-


@@ -731,7 +730,7 @@ applied.
-

+

@@ -745,7 +744,7 @@ id="TBL-5-4">






what

what

dtype

val

val

deault

cots






MIN_COARSE_SIZE_PER_PROCESS

integer

Any number -

MIN_COARSE_SIZE_PER_PROCESS

integer

Any number +

> 0

200

Coarse size threshold per process. The +class="td11">

200

Coarse size threshold per process. The aggregation stops if the global number of variables of the computed coarsest matrix is lower than or equal to this @@ -793,13 +792,13 @@ processes (see Note).






MIN_COARSE_SIZE

integer

Any number -

MIN_COARSE_SIZE

integer

Any number +

> 0

-1

Coarse size threshold. The aggregation +class="td11">

-1

Coarse size threshold. The aggregation stops if the global number of variables of the computed coarsest matrix is lower than or equal to this @@ -809,13 +808,13 @@ ignored in favour of the default for






MIN_CR_RATIO

real

Any number -

MIN_CR_RATIO

real

Any number +

> 1

1.5

Minimum coarsening ratio. The +class="td11">

1.5

Minimum coarsening ratio. The aggregation stops if the ratio between the global matrix dimensions at two consecutive levels is lower than or @@ -823,30 +822,30 @@ equal to this threshold (see Note).






MAX_LEVS

integer

Any integer -

number

MAX_LEVS

integer

Any integer +

number > 1

20

Maximum number of levels. The +class="td11">

20

Maximum number of levels. The aggregation stops if the number of levels reaches this value (see Note).






PAR_AGGR_ALG

character(len=*)

PAR_AGGR_ALG

character(len=*)

’DECOUPLED’, ’SYMDEC’, ’COUPLED’

’DECOUPLED’

Parallel aggregation algorithm. -

the SYMDEC option applies decoupled +class="td11">

Parallel aggregation algorithm. +

the SYMDEC option applies decoupled aggregation to the sparsity pattern of A + T .






AGGR_TYPE

character(len=*)

SOC1, +class="td11">

AGGR_TYPE

character(len=*)

SOC1, SOC2, MATCHBOXP

SOC1

Type +class="td11">

SOC1

Type of aggregation algorithm: currently, for the decoupled aggregation we implement two measures of strength @@ -878,18 +877,18 @@ href="userhtmlli3.html#XMatchBoxP">9].






AGGR_SIZE

integer

Any integer -

power of 2, +class="td11">

AGGR_SIZE

integer

Any integer +

power of 2, with aggr_size 2

4

Maximum size of aggregates when +class="td11">

4

Maximum size of aggregates when the coupled aggregation based on matching is applied. For aggressive coarsening with size of aggregate @@ -901,12 +900,12 @@ class="cmtt-10x-x-109">’MATCHBOXP’






AGGR_PROL

character(len=*)

SMOOTHED, +class="td11">

AGGR_PROL

character(len=*)

SMOOTHED, UNSMOOTHED

SMOOTHED

Prolongator used by the aggregation +class="td11">

SMOOTHED

Prolongator used by the aggregation algorithm: smoothed or unsmoothed (i.e., tentative prolongator).

Parameters defining the aggregation algorithm (continued).


@@ -1068,7 +1067,7 @@ class="content">Parameters defining the aggregation algorithm (continued). -

+

@@ -1082,7 +1081,7 @@ id="TBL-7-4">

@@ -1332,7 +1331,7 @@ class="content">Parameters defining the solver at the coarsest level (continued) -


@@ -1340,7 +1339,7 @@ class="content">Parameters defining the solver at the coarsest level (continued)
-

+

@@ -1354,7 +1353,7 @@ id="TBL-8-4">

+class="td11">

The stopping tolerance.

Additional parameters defining the solver at the coarsest level. -


@@ -1639,7 +1638,7 @@ class="content">Additional parameters defining the solver at the coarsest level.
-

+






what

what

dtype

val

val

deault

cots






AGGR_ORD

character(len=*)

AGGR_ORD

character(len=*)

’NATURAL’ -

’DEGREE’

’NATURAL’

Initial ordering of indices for +class="td11">

Initial ordering of indices for the decoupled aggregation algorithm: either natural ordering or sorted by descending degrees of the nodes in the @@ -1008,30 +1007,30 @@ matrix graph.






AGGR_THRESH

real(kind_parameter)

Any real -

number 

AGGR_THRESH

real(kind_parameter)

Any real +

number  [0,1]

0.01

The threshold

0.01

The threshold θ in the strength of connection algorithm. See also the note at the bottom of this table.






AGGR_FILTER

character(len=*)

AGGR_FILTER

character(len=*)

’FILTER’ -

’NOFILTER’

’NOFILTER’

Matrix used in computing the smoothed +class="td11">

Matrix used in computing the smoothed prolongator: filtered or unfiltered.











what

what

dtype

val

val

deault

cots






COARSE_MAT

character(len=*)

DIST -

REPL

REPL

Coarsest matrix layout: distributed among the +class="td11">

COARSE_MAT

character(len=*)

DIST +

REPL

REPL

Coarsest matrix layout: distributed among the processes or replicated on each of them.






COARSE_SOLVE

character(len=*)

MUMPS -

UMF -

SLU -

SLUDIST -

ILU -

JACOBI -

GS -

BJAC -

KRM -

L1-JACOBI -

L1-BJAC -

L1-FBGS

See Note.

Solver used at the coarsest level: sequential +class="td11">

COARSE_SOLVE

character(len=*)

MUMPS +

UMF +

SLU +

SLUDIST +

ILU +

JACOBI +

GS +

BJAC +

KRM +

L1-JACOBI +

L1-BJAC +

L1-FBGS

See Note.

Solver used at the coarsest level: sequential LU from MUMPS, UMFPACK, or SuperLU (plus triangular solve); distributed LU from MUMPS or SuperLU_Dist (plus triangular solve); @@ -1170,20 +1169,20 @@ double precision.






COARSE_SUBSOLVE

character(len=*)

ILU -

ILUT -

MILU -

MUMPS -

SLU -

SLUDIST -

UMF -

INVT -

INVK -

AINV

See Note.

Solver for the diagonal blocks of the coarsest +class="td11">

COARSE_SUBSOLVE

character(len=*)

ILU +

ILUT +

MILU +

MUMPS +

SLU +

SLUDIST +

UMF +

INVT +

INVK +

AINV

See Note.

Solver for the diagonal blocks of the coarsest matrix, in case the block Jacobi solver is chosen as coarsest-level solver: ILU(p), ILU(ILU otherwise.






what

what

dtype

val

val

deault

cos






COARSE_SWEEPS

integer

Any +class="td11">

COARSE_SWEEPS

integer

Any integer number > 0

10

Number of sweeps when JACOBI, GS or BJAC is +class="td11">

10

Number of sweeps when JACOBI, GS or BJAC is chosen as coarsest-level solver.






COARSE_FILLIN

integer

Any +class="td11">

COARSE_FILLIN

integer

Any integer number 0

0

Fill-in level

0

Fill-in level p of the ILU factorizations and first fill-in for the approximate inverses.






COARSE_ILUTHRS

real(kind_parameter)

Any real +class="td11">

COARSE_ILUTHRS

real(kind_parameter)

Any real number 0

0

Drop tolerance

0

Drop tolerance t in the ILU(p,t) factorization and first drop-tolerance for the approximate inverses.






what

what

dtype

val

val

deault

cots






BJAC_STOP

character(len=*)

FALSE -

TRUE

FALSE

Select whether to use a stopping criterion for +class="td11">

BJAC_STOP

character(len=*)

FALSE +

TRUE

FALSE

Select whether to use a stopping criterion for the Block-Jacobi method used as a coarse solver.






BJAC_TRACE

character(len=*)

FALSE -

TRUE

FALSE

Select whether to print a trace for the +class="td11">

BJAC_TRACE

character(len=*)

FALSE +

TRUE

FALSE

Select whether to print a trace for the calculated residual for the Block-Jacobi method used as a coarse solver.






BJAC_ITRACE

integer

Any integer -

BJAC_ITRACE

integer

Any integer +

> 0

-1

Number of iterations after which a trace is to +class="td11">

-1

Number of iterations after which a trace is to be printed.






BJAC_RESCHECK

integer

Any integer -

BJAC_RESCHECK

integer

Any integer +

> 0

-1

Number of iterations after which a residual is +class="td11">

-1

Number of iterations after which a residual is to be calculated.






BJAC_STOPTOL

real(kind_parameter)

Any real -

BJAC_STOPTOL

real(kind_parameter)

Any real +

< 1

0

Tolerance for the stopping criterion on the +class="td11">

0

Tolerance for the stopping criterion on the residual.






KRM_METHOD

character(len=*)

CG -

FCG -

CGS -

CGR -

BICG -

BICGSTAB -

BICGSTABL -

RGMRES

FCG

A string that defines the iterative method to +class="td11">

KRM_METHOD

character(len=*)

CG +

FCG +

CGS +

CGR +

BICG +

BICGSTAB +

BICGSTABL +

RGMRES

FCG

A string that defines the iterative method to be used when employing a Krylov method KRM as a coarse solver. CG the Conjugate @@ -1482,24 +1481,24 @@ information.






KRM_KPREC

character(len=*)

Table 

KRM_KPREC

character(len=*)

Table 1

BJAC

The one-level +class="td11">

BJAC

The one-level preconditioners from the Table 1 can be used for the coarse Krylov solver.






KRM_SUB_SOLVE

character(len=*)

Table 

KRM_SUB_SOLVE

character(len=*)

Table 5

ILU

Solver for the diagonal blocks of the coarsest +class="td11">

ILU

Solver for the diagonal blocks of the coarsest matrix preconditioner, in case the block Jacobi solver is chosen as KRM_KPREC: ILU(5 applies here.






KRM_GLOBAL

character(len=*)

TRUE, +class="td11">

KRM_GLOBAL

character(len=*)

TRUE, FALSE

FALSE

Choose between a global Krylov solver, all +class="td11">

FALSE

Choose between a global Krylov solver, all unknowns on a single node, or a distributed one. The default choice is the distributed solver.






KRM_EPS

real(kind_parameter)

Real

KRM_EPS

real(kind_parameter)

Real < 1

10

10-6

The stopping tolerance.






KRM_IRST

integer

Integer -

KRM_IRST

integer

Integer +

1

30

An integer specifying the restart parameter. +class="td11">

30

An integer specifying the restart parameter. This is employed for the BiCGSTABL or RGMRES @@ -1560,12 +1559,12 @@ methods, otherwise it is ignored.






KRM_ISTOPC

integer

Integers +class="td11">

KRM_ISTOPC

integer

Integers 1,2,3

2

If

2

If 1 then the method uses the normwise backward error in the infinity norm; if 2, the @@ -1578,24 +1577,24 @@ for the details.






KRM_ITMAX

integer

Integer -

KRM_ITMAX

integer

Integer +

1

40

The maximum number of iterations to +class="td11">

40

The maximum number of iterations to perform.






KRM_ITRACE

integer

Integer -

KRM_ITRACE

integer

Integer +

0

-1

If

-1

If > 0 print out an informational message about convergence every KRM_ITRACE iterations. If = 0 print a @@ -1603,13 +1602,13 @@ message in case of convergence failure.






KRM_FILLIN

integer

Integer -

KRM_FILLIN

integer

Integer +

0

0

Fill-in level

0

Fill-in level p of the ILU factorizations and first fill-in for the approximate inverses.






what

what

dtype

val

val

deault

cots






SMOOTHER_TYPE

character(len=*)

JACOBI -

GS -

BGS -

BJAC -

AS -

L1-JACOBI -

L1-BJAC -

L1-FBGS -

POLY

FBGS

SMOOTHER_TYPE

character(len=*)

JACOBI +

GS +

BGS +

BJAC +

AS +

L1-JACOBI +

L1-BJAC +

L1-FBGS +

POLY

FBGS

Type of smoother used in the multilevel preconditioner: point-Jacobi, hybrid @@ -1726,26 +1725,26 @@ class="cmr-10">] class="cmr-10">and Remark 3 (p. 21). -

It is ignored by one-level preconditioners.






SUB_SOLVE

character(len=*)

JACOBI +class="td11">

SUB_SOLVE

character(len=*)

JACOBI GS -

BGS -

ILU -

ILUT -

MILU -

MUMPS -

SLU -

UMF -

INVT -

INVK -

AINV

BGS +

ILU +

ILUT +

MILU +

MUMPS +

SLU +

UMF +

INVT +

INVK +

AINV

GS and BGS multilevel class="cmr-10">preconditioners, respectively -

ILU for block-Jacobi and Additive Schwarz class="cmr-10">one-level preconditioners

The local solver to be used with the smoother or one-level preconditioner (see @@ -1823,18 +1822,18 @@ class="cmr-10">Note for details on hybrid Gauss-Seidel.






SMOOTHER_SWEEPS

integer

SMOOTHER_SWEEPS

integer

Any integer -

number 0

1

Number of sweeps of the smoother or one-level preconditioner. In the multilevel @@ -1852,11 +1851,11 @@ class="cmr-10">respectively. Is ignored if the smoother is






POLY_DEGREE

integer

POLY_DEGREE

integer

Any integer -

number and 30

1

Degree of the polynomial accelerator, is equal to the number of matrix-vector @@ -1893,7 +1892,7 @@ preconditioner. -


@@ -1901,7 +1900,7 @@ preconditioner.
-

+






what

what

dtype

val

val

deault

cots






SUB_OVR

integer

SUB_OVR

integer

Any integer -

number 0

1

Number of overlap layers, for Additive Schwarz only.

SUB_RESTR

character(len=*)

HALO -

NONE

HALO

SUB_RESTR

character(len=*)

HALO +

NONE

HALO

Type of restriction operator, for Additive Schwarz only: for taking into account the overlap, NONE for neglecting it. -

Note that HALO must be chosen for the @@ -1987,12 +1986,12 @@ class="cmr-10">its RAS variant.






SUB_PROL

character(len=*)

SUM -

NONE

NONE

SUB_PROL

character(len=*)

SUM +

NONE

NONE

Type of prolongation operator, for Additive Schwarz only: SUM contributions from the overlap, for neglecting them. -

Note that SUM must be chosen for the for its RAS variant.






SUB_FILLIN

integer

SUB_FILLIN

integer

Any integer -

number 0

0

Fill-in level p of the incomplete LU @@ -2032,18 +2031,18 @@ class="cmr-10">factorizations.






SUB_ILUTHRS

real(kind_parameter)

SUB_ILUTHRS

real(kind_parameter)

Any real number 0

0

Drop tolerance t in the ILU(factorization.






MUMPS_LOC_GLOB

character(len=*)

LOCAL_SOLVER -

GLOBAL_SOLVER

GLOBAL_SOLVER

MUMPS_LOC_GLOB

character(len=*)

LOCAL_SOLVER +

GLOBAL_SOLVER

GLOBAL_SOLVER

Whether MUMPS should be used as a distributed solver, or as a serial solver acting @@ -2070,15 +2069,15 @@ class="cmr-10">process.






MUMPS_IPAR_ENTRY

integer

MUMPS_IPAR_ENTRY

integer

Any integer number

0

Set an entry in the MUMPS integer control array, as chosen via the idx argument.






MUMPS_RPAR_ENTRY

real

MUMPS_RPAR_ENTRY

real

Any real number

0

Set an entry in the MUMPS real control array, as chosen via the idx Parameters defining the smoother or the details of the one-level -


@@ -2126,7 +2125,7 @@ class="content">Parameters defining the smoother or the details of the one-level
-

+






what

what

dtype

val

val

deault

cots






POLY_VARIANT

character(len=*)

CHEB_4 -

CHEB_4_OPT -

CHEB_1_OPT

CHEB_4

POLY_VARIANT

character(len=*)

CHEB_4 +

CHEB_4_OPT +

CHEB_1_OPT

CHEB_4

Select the type of polynomial accelerator. @@ -2226,11 +2225,11 @@ class="cmr-10">-kind.






POLY_RHO_ESTIMATE

character(len=*)

POLY_RHO_EST_POWER

POLY_RHO_EST_POWER

POLY_RHO_ESTIMATE

character(len=*)

POLY_RHO_EST_POWER

POLY_RHO_EST_POWER

Algorithm for estimating the spectral @@ -2253,17 +2252,17 @@ class="cmr-10">two following options.






POLY_RHO_ESTIMATE_ITERATIONS

integer

POLY_RHO_ESTIMATE_ITERATIONS

integer

Any integer -

number 1

20

Number of iterations for the spectral radius @@ -2272,19 +2271,19 @@ class="cmr-10">estimate.






POLY_RHO_BA

real(kind_parameter)

POLY_RHO_BA

real(kind_parameter)

Any real -

number (0,1]

1

Sets an estimate of the spectral radius of @@ -2317,10 +2316,10 @@ class="cmr-12">Method hierarchy_build

-

-

call p%hierarchy_build(a,desc_a,info)
+

+

call p%hierarchy_build(a,desc_a,info)

-

This method builds the hierarchy of matrices and restriction/prolongation operators for the multilevel preconditioner p, according to the requirements made by the user class="cmr-12">through the methods init and set. -

Arguments

Arguments id="TBL-12-1">

a

type(psb_

a

type(psb_xspmat_type), intent(in).

The sparse matrix structure containing the local part of the matrix to be preconditioned. Note that ].

desc_a

type(psb_desc_type), intent(in)

desc_a

type(psb_desc_type), intent(in).

The communication descriptor of a. See the PSBLAS User’s Guide ].

info

integer, intent(out)

info

integer, intent(out).

Error code. If no error, 0 is returned. See Section Method smoothers_build

-

This method builds the smoothers and the coarsest-level solvers for the multilevel preconditioner p 5.3). -

Arguments

Arguments id="TBL-13-1"> @@ -2542,10 +2541,10 @@ class="cmr-12">5.5 Method build
-

-

call p%build(a,desc_a,info[,amold,vmold,imold])
+

+

call p%build(a,desc_a,info[,amold,vmold,imold])

-

This method builds the preconditioner p according to the requirements made by the and class="cmr-12">, whose nomenclature would however be somewhat unnatural when dealing with simple one-level preconditioners. -

Arguments

a

type(psb_

a

type(psb_xspmat_type), intent(in).

The sparse matrix structure containing the local part of the matrix to be preconditioned. Note that ].

desc_a

type(psb_desc_type), intent(in)

desc_a

type(psb_desc_type), intent(in).

The communication descriptor of a. See the PSBLAS User’s Guide ].

info

integer, intent(out)

info

integer, intent(out).

Error code. If no error, 0 is returned. See Section 7 for details.

amold

class(psb_

amold

class(psb_x_base_sparse_mat), intent(in), optional.

The desired dynamic type for internal matrix components; this allows e.g. running on GPUs; it needs not be the same on all @@ -2507,26 +2506,26 @@ class="cmr-12">].

vmold

class(psb_

vmold

class(psb_x_base_vect_type), intent(in), optional.

The desired dynamic type for internal vector components; this allows e.g. running on GPUs.

imold

class(psb_i_base_vect_type), intent(in), optional

imold

class(psb_i_base_vect_type), intent(in), optional.

The desired dynamic type for internal integer vector components; this allows e.g. running on GPUs.

Arguments id="TBL-14-1">

a

type(psb_

a

type(psb_xspmat_type), intent(in).

The sparse matrix structure containing the local part of the matrix to be preconditioned. Note that ].

desc_a

type(psb_desc_type), intent(in)

desc_a

type(psb_desc_type), intent(in).

The communication descriptor of a. See the PSBLAS User’s Guide ].

info

integer, intent(out)

info

integer, intent(out).

Error code. If no error, 0 is returned. See Section 7 for details.

amold

class(psb_

amold

class(psb_x_base_sparse_mat), intent(in), optional.

The desired dynamic type for internal matrix components; this allows e.g. running on GPUs; it needs not be the same on all @@ -2654,33 +2653,33 @@ class="cmr-12">].

vmold

class(psb_

vmold

class(psb_x_base_vect_type), intent(in), optional.

The desired dynamic type for internal vector components; this allows e.g. running on GPUs.

imold

class(psb_i_base_vect_type), intent(in), optional

imold

class(psb_i_base_vect_type), intent(in), optional.

The desired dynamic type for internal integer vector components; this allows e.g. running on GPUs.

-

The method can be used to build multilevel preconditioners too. @@ -2691,10 +2690,10 @@ class="cmr-12">5.6 Method apply

-

This method computes y = and class="cmr-12">hence it is completely transparent to the user, who will almost never invoke it directly. -

Arguments

Arguments id="TBL-15-1"> +class="td11">

trans

x

x

type(kind_parameter), dimension(:), intent(in)—.

The local part of the vector x. Note that , single/double class="cmr-12">precision version of AMG4PSBLAS under use.

y

y

type(kind_parameter), dimension(:), intent(out)—.

The local part of the vector y. Note that , single/double class="cmr-12">precision version of AMG4PSBLAS under use.

desc_a

type(psb_desc_type), intent(in)

desc_a

type(psb_desc_type), intent(in).

The communication descriptor associated to the matrix to be preconditioned.

info

integer, intent(out)

info

integer, intent(out).

Error code. If no error, 0 is returned. See Section 7 for details.

trans

character(len=1), optional, intent(in).

character(len=1), optional, intent(in).

If trans = N,n then 1).

work

work

type(kind_parameter), dimension(:), optional, target—.

Workspace. Its size should be at least 4 * psb_cd_get_local_ cols(desc_a) (see the PSBLAS User’s Guide). Note that 5.7 Method free

-

This method deallocates the preconditioner data structure p. -

Arguments

Arguments id="TBL-16-1">

info

integer, intent(out)

info

integer, intent(out).

Error code. If no error, 0 is returned. See Section 5.8 Method descr

-

This method prints a description of the preconditioner p to the standard output or to a , or b class="cmr-12">, have been called. -

Arguments

Arguments id="TBL-17-1">

info

integer, intent(out)

info

integer, intent(out).

Error code. If no error, 0 is returned. See Section 7 for details.

iout

integer, intent(in), optional

iout

integer, intent(in), optional.

The id of the file where the preconditioner description will be printed; the default is the standard output.

root

integer, intent(in), optional

root

integer, intent(in), optional.

The id of the process where the preconditioner description will be printed; the default is psb_root_.

verbosity

integer, intent(in), optional

verbosity

integer, intent(in), optional.

The verbosity level of the description. Default value is 0. For values higher than 0, it prints out further information, e.g., for @@ -3009,31 +3008,31 @@ class="cmr-12">matrices on every process.

-

+

5.9 Auxiliary Methods

-

Various functionalities are implemented as additional methods of the preconditioner object. -

+

5.9.1 Method: dump
-

-

call p%dump(info[,istart,iend,prefix,head,ac,rp,smoother,solver,global_num])
+

+

call p%dump(info[,istart,iend,prefix,head,ac,rp,smoother,solver,global_num])

-

Dump on file.

Dump on file. +

Arguments

Arguments id="TBL-18-1">

info

integer, intent(out)

info

integer, intent(out).

Error code. If no error, 0 is returned. See Section 7 for details.

amold

class(psb_

amold

class(psb_x_base_sparse_mat), intent(in), optional.

The desired dynamic type for internal matrix components; this allows e.g. running on GPUs; it needs not be the same on all @@ -3076,19 +3075,19 @@ class="cmr-12">.

-

+

5.9.2 Method: clone
-

-

call p%clone(pout,info)
+

+

call p%clone(pout,info)

-

Create a (deep) copy of the preconditioner object.

Create a (deep) copy of the preconditioner object. +

Arguments

Arguments id="TBL-19-1">

pout

type(amg_

pout

type(amg_xprec_type), intent(out).

The copy of the preconditioner data structure. Note that x must @@ -3115,13 +3114,13 @@ class="cmr-12">, single/double precision class="cmr-12">version of AMG4PSBLAS under use.

info

integer, intent(out)

info

integer, intent(out).

Error code. If no error, 0 is returned. See Section for details.

-

+

5.9.3 Method: sizeof
-

-

sz = p%sizeof([global])
+

+

sz = p%sizeof([global])

Method: sizeof id="TBL-20-1">

global

logical, optional

global

logical, optional.

Whether the global or local preconditioner memory occupation is desired. Default: .false.Return memory footprint in bytes. -

+

5.9.4 Method: allocate_wrk
-

-

call p%allocate_wrk(info[, vmold])
+

+

call p%allocate_wrk(info[, vmold])

-

Allocate internal work vectors. Each application of the preconditioner uses a number of work vectors which are allocated internally as necessary; therefore allocation and @@ -3202,7 +3201,7 @@ class="cmr-12">taken care of based on the dynamic type of the argument to the apply method. -

Arguments

Arguments id="TBL-21-1">

info

integer, intent(out)

info

integer, intent(out).

Error code. If no error, 0 is returned. See Section 7 for details.

vmold

class(psb_

vmold

class(psb_x_base_vect_type), intent(in), optional.

The desired dynamic type for internal vector components; this allows e.g. running on GPUs.

-

+

5.9.5 Method: deallocate_wrk
-

-

call p%deallocate_wrk(info)
+

+

call p%deallocate_wrk(info)
call p%free_wrk(info)

-

Deallocate internal work vectors.

Deallocate internal work vectors. +

Arguments

Arguments id="TBL-22-1">

info

integer, intent(out)

info

integer, intent(out).

Error code. If no error, 0 is returned. See Section . +

+ + + diff --git a/docs/html/userhtmlse8.html b/docs/html/userhtmlse8.html index 0b786932..67408b51 100644 --- a/docs/html/userhtmlse8.html +++ b/docs/html/userhtmlse8.html @@ -38,46 +38,47 @@ class="cmr-12">AMG4PSBLAS is freely distributable under the following copyright

 
-                           AMG4PSBLAS  version 1.0
-              Algebraic MultiGrid Preconditioners Package
-             based on PSBLAS (Parallel Sparse BLAS version 3.7)
 
-  (C) Copyright 2021
-
-  Pasqua D’Ambra         IAC-CNR, IT
-  Fabio Durastante       University of Pisa and IAC-CNR, IT
-  Salvatore Filippone    University of Rome Tor-Vergata and IAC-CNR, IT
-
-  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 MLD2P4 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 MLD2P4 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.
+                             AMG4PSBLAS version 1.2
+    Algebraic Multigrid Package
+               based on PSBLAS (Parallel Sparse BLAS version 3.9)
+
+    (C) Copyright 2025
+
+        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.
 
 
-

+

-

AMG4PSBLAS is an evolution of MLD2P4, whose license we reproduce here to abide by its terms: @@ -123,7 +124,7 @@ class="cmr-12">abide by its terms:   POSSIBILITY OF SUCH DAMAGE. -

AMG4PSBLAS is distributed together with (a small part of) the graph-matching @@ -183,7 +184,7 @@ class="cmr-12">here. // // ************************************************************************ -

+

diff --git a/docs/src/abstract.tex b/docs/src/abstract.tex index 74e85b80..d074fa1e 100644 --- a/docs/src/abstract.tex +++ b/docs/src/abstract.tex @@ -4,30 +4,42 @@ \fi \textsc{AMG4PSBLAS (Algebraic MultiGrid Preconditioners Package -based on PSBLAS}) is a package of parallel algebraic multilevel preconditioners included in the PSCToolkit (Parallel Sparse Computation Toolkit) software framework. -It is a progress of a software development project started in 2007, named MLD2P4, which originally implemented a -multilevel version of some domain decomposition preconditioners of additive-Schwarz type, and was based on a parallel decoupled version of the well known smoothed +based on PSBLAS}) is a package of parallel algebraic multilevel +preconditioners included in the PSCToolkit (Parallel Sparse +Computation Toolkit) software framework. +It is an evolutiuon of a software development project started in 2007, +named MLD2P4, which originally implemented a +multilevel version of some domain decomposition preconditioners of +additive-Schwarz type, and was based on a parallel decoupled version +of the well known smoothed aggregation method to generate the multilevel hierarchy of coarser matrices. -In the last years, within the context of the EU-H2020 EoCoE project (Energy Oriented Center of Excellence), the package was extended for including new algorithms and -functionalities for the setup and application new AMG preconditioners with the final aims of improving efficiency and scalability when tens of thousands cores are -used, and of boosting reliability in dealing with general symmetric positive definite linear systems. -Due to the significant number of changes and the increase in scope, we decided to rename the package as AMG4PSBLAS. +In the last few years the package was extended for +including new algorithms and +functionalities for the setup and application new AMG preconditioners +with the final aims of improving efficiency and scalability when tens +of thousands cores are used, and of boosting reliability in dealing +with general symmetric positive definite linear systems; these +developments have been supported in the context of the EU-H2020 EoCoE +project (Energy Oriented Center of Excellence). +Due to the significant number of changes and the increase in scope, we +decided to rename the package as AMG4PSBLAS. -AMG4PSBLAS has been designed to provide scalable and easy-to-use preconditioners -in the context of the PSBLAS (Parallel Sparse Basic Linear Algebra Subprograms) -computational framework and can be used in conjuction with the Krylov solvers -available in this framework. +AMG4PSBLAS has been designed to provide scalable and easy-to-use +preconditioners in the context of the PSBLAS (Parallel Sparse Basic +Linear Algebra Subprograms) computational framework and can be used in +conjuction with the Krylov solvers available in this framework. Our package is based on a completely algebraic approach; therefore users level interfaces assume that the system matrix and preconditioners are represented as PSBLAS distributed sparse matrices. AMG4PSBLAS enables the user to easily specify different -features of an algebraic multilevel preconditioner, thus allowing to experiment -with different preconditioners for the problem and parallel computers at hand. +features of an algebraic multilevel preconditioner, thus allowing to +experiment with different preconditioners for the problem and parallel +computers at hand. The package employs object-oriented design techniques in -Fortran~2003, with interfaces to additional third party libraries +Fortran~2003, with interfaces to additional third party libraries such as MUMPS, UMFPACK, SuperLU, and SuperLU\_Dist, which -can be exploited in building multilevel preconditioners. The parallel +can be exploited in building multilevel preconditioners. The parallel implementation is based on a Single Program Multiple Data (SPMD) paradigm; the inter-process communication is based on MPI and is managed mainly through PSBLAS. diff --git a/docs/src/building.tex b/docs/src/building.tex index a4b6aba5..f3a15583 100644 --- a/docs/src/building.tex +++ b/docs/src/building.tex @@ -13,19 +13,20 @@ must support the Fortran~2003 standard plus the extension \verb|MOLD=| feature, which enhances the usability of \verb|ALLOCATE|. Most Fortran compilers provide this feature; in particular, this is supported by the GNU Fortran compiler, for which we -recommend to use at least version 4.8. +recommend to use at least version 12. The software defines data types and interfaces for real and complex data, in both single and double precision. Building AMG4PSBLAS requires some base libraries (see -Section~\ref{sec:prerequisites}); interfaces to optional third-party +Section~\ref{sec:prerequisites}); interfaces to optional third-party libraries, which extend the functionalities of AMG4PSBLAS (see -Section~\ref{sec:third-party}), are also available. A number of Linux -distributions (e.g., Ubuntu, Fedora, CentOS) provide precompiled +Section~\ref{sec:third-party}), are also available. A number of Linux +distributions (e.g., Ubuntu, Fedora, CentOS) provide precompiled packages for the prerequisite and optional software. In many cases these packages are split between a runtime part and a ``developer'' part; in order to build AMG4PSBLAS you need both. A description of the -base and optional software used by AMG4PSBLAS is given in the next sections. +base and optional software used by AMG4PSBLAS is given in the next +sections. \subsection{Prerequisites\label{sec:prerequisites}} @@ -157,17 +158,17 @@ The full set of options may be looked at by issuing the command \else \lstinputlisting{../configureout.txt} \fi -For instance, if a user has built and installed PSBLAS 3.7 under the +For instance, if a user has built and installed PSBLAS 3.9 under the \verb|/opt| directory and is using the SuiteSparse package (which includes UMFPACK), then AMG4PSBLAS might be configured with: \ifpdf \begin{minted}[breaklines=true,bgcolor=bg,fontsize=\small]{console} -./configure --with-psblas=/opt/psblas-3.7/ --with-umfpackincdir=/usr/include/suitesparse/ +./configure --with-psblas=/opt/psblas-3.9/ --with-umfpackincdir=/usr/include/suitesparse/ \end{minted} \else \begin{verbatim} -./configure --with-psblas=/opt/psblas-3.7/ \ +./configure --with-psblas=/opt/psblas-3.9/ \ --with-umfpackincdir=/usr/include/suitesparse/ \end{verbatim} \fi diff --git a/docs/src/gettingstarted.tex b/docs/src/gettingstarted.tex index 4e1678a2..52b34a3d 100644 --- a/docs/src/gettingstarted.tex +++ b/docs/src/gettingstarted.tex @@ -94,7 +94,6 @@ Multilevel &\fortinline|'ML'| & V-cycle with one hybrid forward Gauss- \label{tab:precinit}} \end{center} \end{table} - Note that the module \fortinline|amg_prec_mod|, containing the definition of the preconditioner data type and the interfaces to the routines of AMG4PSBLAS, must be used in any program calling such routines. @@ -110,6 +109,12 @@ a standard discretization of basic scalar elliptic PDE problems. However, this does not necessarily correspond to the shortest execution time on parallel~computers. +\textbf{Remark 2.} Memory allocation on GPUs is a costly operation +implying a synchronization; therefore, it is convenient to preallocate +internal preconditioner workspace with the method +\verb|prec%allocate_wrk(info)| before invoking an iterative method, +and release it upon exit with \verb|prec%deallocate_wrk(info)|. + \subsection{Examples\label{sec:examples}} @@ -140,7 +145,6 @@ for the real single precision and the complex, single and double precision, versions are obtained with straightforward modifications of the previous example (see Section~\ref{sec:userinterface} for details). If these versions are installed, the corresponding codes are available in \verb|samples/simple/file|\-\verb|read|. - \begin{listing}[tbp] \begin{center} \begin{minipage}{.90\textwidth} @@ -260,7 +264,6 @@ stop \label{fig:ex1}} \end{center} \end{listing} - Different versions of the multilevel preconditioner can be obtained by changing the default values of the preconditioner parameters. The code reported in Figure~\ref{fig:ex2} shows how to set a V-cycle preconditioner @@ -272,10 +275,15 @@ with block-Jacobi and set by~\fortinline|P%init|. Furthermore, specifying block-Jacobi as coarsest-level solver implies that the coarsest-level matrix is distributed among the processes. -Figure~\ref{fig:ex3} shows how to set a W-cycle preconditioner using the Coarsening based on Compatible Weighted Matching, aggregates of size at most $8$ and smoothed prolongators. It applies +Figure~\ref{fig:ex3} shows how to set a W-cycle preconditioner using +the Coarsening based on Compatible Weighted Matching, aggregates of +size at most $8$ and smoothed prolongators. It applies 2 hybrid Gauss-Seidel sweeps as pre- and post-smoother, -and solves the coarsest-level system with the parallel flexible Conjugate Gradient method (KRM) coupled with the block-Jacobi preconditioner having ILU(0) on the blocks. Default parameters are used for stopping criterion of the coarsest solver. -Note that, also in this case, specifying KRM as coarsest-level +and solves the coarsest-level system with the parallel flexible +Conjugate Gradient method (KRM) coupled with the block-Jacobi +preconditioner having ILU(0) on the blocks, with default parameters +used for the coarsest solver. +Note that specifying KRM as coarsest-level solver implies that the coarsest-level matrix is distributed among the processes. %It is specified that the coarsest-level diff --git a/docs/src/license.tex b/docs/src/license.tex index a1d6574c..9662ea3a 100644 --- a/docs/src/license.tex +++ b/docs/src/license.tex @@ -6,40 +6,41 @@ AMG4PSBLAS is freely distributable under the following copyright terms: {\small \begin{verbatim} - - AMG4PSBLAS version 1.0 - Algebraic MultiGrid Preconditioners Package - based on PSBLAS (Parallel Sparse BLAS version 3.7) - - (C) Copyright 2021 - - Pasqua D'Ambra IAC-CNR, IT - Fabio Durastante University of Pisa and IAC-CNR, IT - Salvatore Filippone University of Rome Tor-Vergata and IAC-CNR, IT - - 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 MLD2P4 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 MLD2P4 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. + + + AMG4PSBLAS version 1.2 + Algebraic Multigrid Package + based on PSBLAS (Parallel Sparse BLAS version 3.9) + + (C) Copyright 2025 + + 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. \end{verbatim} } diff --git a/docs/src/overview.tex b/docs/src/overview.tex index ef31a157..c3c3fd16 100644 --- a/docs/src/overview.tex +++ b/docs/src/overview.tex @@ -3,7 +3,9 @@ {\textsc{\ref{sec:overview} General Overview}} The \textsc{Algebraic MultiGrid Preconditioners Package based on -PSBLAS} (\textsc{AMG\-4\-PSBLAS}) provides parallel Algebraic MultiGrid (AMG) preconditioners (see, e.g., \cite{Briggs2000,Stuben_01}), +PSBLAS} (\textsc{AMG\-4\-PSBLAS}) provides parallel Algebraic +MultiGrid (AMG) preconditioners (see, e.g., +\cite{Briggs2000,Stuben_01}), to be used in the iterative solution of linear systems, \begin{equation} Ax=b, @@ -18,12 +20,14 @@ where $A$ is a square, real or complex, sparse symmetric positive definite (s.p. The preconditioners implemented in AMG4PSBLAS are obtained by combining 3 different types of AMG cycles with smoothers and coarsest-level -solvers. Available multigrid cycles include the V-, W-, and a version of a Krylov-type cycle +solvers. We provide a number of multigrid cycles, including the V-, +W-, and a version of a Krylov-type cycle (K-cycle)~\cite{Briggs2000,Notay2008}; they can be combined with Jacobi, hybrid %\footnote{see Note 2 in Table~\ref{tab:p_coarse}, p.~28.} forward/backward Gauss-Seidel, block-Jacobi and additive Schwarz -smoothers with various versions of local incomplete factorizations and approximate inverses +smoothers with various versions of local incomplete factorizations and +approximate inverses on the blocks. The Jacobi, block-Jacobi and Gauss-Seidel smoothers are also available in the $\ell_1$ version~\cite{DDF2020}. @@ -41,7 +45,8 @@ two different coarsening strategies, based on aggregation, are available: and described in detail in~\cite{DDF2020}; \end{itemize} Either exact or approximate solvers can be used on the coarsest-level -system. We provide interfaces to various parallel and sequential sparse LU factorizations from external +system. We provide interfaces to various parallel and sequential +sparse LU factorizations from external packages, sequential native incomplete LU and approximate inverse factorizations, parallel weighted Jacobi, hybrid Gauss-Seidel, block-Jacobi solvers and calls to preconditioned Krylov methods; all @@ -74,36 +79,41 @@ important revisions and extentions of the PSBLAS infrastructure. The inter-process comunication required by AMG4PSBLAS is encapsulated in the PSBLAS routines; therefore, AMG4PSBLAS can be run on any parallel machine where PSBLAS -implementations are available. In the most recent version of PSBLAS -(release 3.7), a plug-in for GPU is included; it includes CUDA +implementations are available. The most recent version of PSBLAS +(release 3.9) includes a plug-in for GPU; it contains CUDA versions of main vector operations and of sparse matrix-vector multiplication, so that Krylov methods coupled with AMG4PSBLAS -preconditioners relying on Jacobi and block-Jacobi smoothers with -sparse approximate inverses on the blocks can be efficiently executed +preconditioners relying on Jacobi and block-Jacobi smoothers with +sparse approximate inverses on the blocks can be efficiently executed on cluster of GPUs. -AMG4PSBLAS has a layered and modular software architecture where three main layers can be -identified. The lower layer consists of the PSBLAS kernels, the middle one implements -the construction and application phases of the preconditioners, and the upper one -provides a uniform interface to all the preconditioners. -This architecture allows for different levels of use of the package: -few black-box routines at the upper layer allow all users to easily -build and apply any preconditioner available in AMG4PSBLAS; -facilities are also available allowing expert users to extend the set of smoothers -and solvers for building new versions of the preconditioners (see -Section~\ref{sec:adding}). +AMG4PSBLAS has a layered and modular software architecture where three +main layers can be identified. The lower layer consists of the PSBLAS +kernels, the middle one implements the construction and application +phases of the preconditioners, and the upper one provides a uniform +interface to all the preconditioners. This architecture allows for +different levels of use of the package: few black-box routines at the +upper layer allow all users to easily build and apply any +preconditioner available in AMG4PSBLAS; facilities are also available +allowing expert users to extend the set of smoothers and solvers for +building new versions of the preconditioners (see +Section~\ref{sec:adding}). -This guide is organized as follows. General information on the distribution of the source -code is reported in Section~\ref{sec:distribution}, while details on the configuration -and installation of the package are given in Section~\ref{sec:building}. The basics for building and applying the -preconditioners with the Krylov solvers implemented in PSBLAS are reported -in~Section~\ref{sec:started}, where the Fortran codes of a few sample programs -are also shown. A reference guide for the user interface routines is provided -in Section~\ref{sec:userinterface}. Information on the extension of the package -through the addition of new smoothers and solvers is reported in Section~\ref{sec:adding}. -The error handling mechanism used by the package -is briefly described in Section~\ref{sec:errors}. The copyright terms concerning the -distribution and modification of AMG4PSBLAS are reported in Appendix~\ref{sec:license}. +This guide is organized as follows. General information on the +distribution of the source code is reported in +Section~\ref{sec:distribution}, while details on the configuration and +installation of the package are given in +Section~\ref{sec:building}. The basics for building and applying the +preconditioners with the Krylov solvers implemented in PSBLAS are +reported in~Section~\ref{sec:started}, where the Fortran codes of a +few sample programs are also shown. A reference guide for the user +interface routines is provided in +Section~\ref{sec:userinterface}. Information on the extension of the +package through the addition of new smoothers and solvers is reported +in Section~\ref{sec:adding}. The error handling mechanism used by the +package is briefly described in Section~\ref{sec:errors}. The +copyright terms concerning the distribution and modification of +AMG4PSBLAS are reported in Appendix~\ref{sec:license}. %%% Local Variables: %%% mode: latex diff --git a/docs/src/userguide.tex b/docs/src/userguide.tex index 88bffece..9ee2d4cc 100644 --- a/docs/src/userguide.tex +++ b/docs/src/userguide.tex @@ -154,7 +154,7 @@ Preconditioners Package based on PSBLAS} \flushright \large Software version: 1.2\\ %\todaym -\large December 31st, 2025 +\large December 23rd, 2025 \end{minipage}} %\addtolength{\textwidth}{\centeroffset} \vspace{\stretch{2}} diff --git a/docs/src/userhtml.tex b/docs/src/userhtml.tex index 37dcd98c..fed11d47 100644 --- a/docs/src/userhtml.tex +++ b/docs/src/userhtml.tex @@ -114,7 +114,7 @@ %\today Software version: 1.2\\ %\today - December 31st, 2025 + December 23rd, 2025 \clearpage \ \\ \thispagestyle{empty} diff --git a/docs/src/userinterface.tex b/docs/src/userinterface.tex index 3fbcb832..f313980c 100644 --- a/docs/src/userinterface.tex +++ b/docs/src/userinterface.tex @@ -160,7 +160,7 @@ the smoothers. However, for simplicity, shortcuts are provided to set all versions of point-Jacobi, hybrid (forward) Gauss-Seidel, and hybrid backward Gauss-Seidel, i.e., the previous smoothers can be defined just by setting \fortinline|'SMOOTHER_TYPE'| to certain specific -values (see Tables~\ref{tab:p_smoother}), without the need to set +values (see Table~\ref{tab:p_smoother}), without the need to set \fortinline|'SUB_SOLVE'| as well. The smoother and solver objects are arranged in a @@ -182,47 +182,50 @@ the polynomial used. Consequently, the \fortinline|'SMOOTHER_SWEEPS'| option is the \fortinline|'POLY_DEGREE'| option. This smoother is paired with a base smoother object, whose iterations are accelerated using the specified polynomial smoothing technique. By default, the $\ell_1$-Jacobi smoother serves as the base smoother, offering theoretical -guarantees on the resulting convergence factor~\cite{DDFMT2024,LOTTES}. Alternative combinations -are experimental and lack established guarantees.\\ +guarantees on the resulting convergence +factor~\cite{DDFMT2024,LOTTES}. Alternative combinations are +experimental.\\ +% and lack established guarantees.\\ \textbf{Remark 4.} Many of the coarsest-level solvers apply to a -specific coarsest-matrix layout; -therefore, setting the solver after the layout may change the layout -to either distributed or replicated. -Similarly, setting the layout after the solver may change the solver. - -More precisely, UMFPACK and SuperLU require the coarsest-level -matrix to be replicated, while SuperLU\_Dist and KRM require it to be distributed. -In these cases, setting the coarsest-level solver implies that -the layout is redefined according to the solver, ovverriding any +specific coarsest-matrix layout; therefore, setting the solver after +the layout may change the layout to either distributed or replicated, +and similarly, setting the layout after the solver may change the +solver. More specifically, UMFPACK and SuperLU require the coarsest-level +matrix to be replicated, while SuperLU\_Dist and KRM require it to be +distributed; therefore, setting the coarsest-level solver implies +that the layout is redefined according to the solver, ovverriding any previous settings. MUMPS, point-Jacobi, hybrid Gauss-Seidel and block-Jacobi can be applied to replicated and distributed matrices, thus their choice does not modify any previously specified layout. It is worth noting that, when the matrix is replicated, -the point-Jacobi, hybrid Gauss-Seidel and block-Jacobi solvers and their $\ell_1-$ versions -reduce to the corresponding local solver objects (see Remark~2). -For the point-Jacobi and Gauss-Seidel solvers, these objects -correspond to a \emph{single} point-Jacobi sweep and a \emph{single} -Gauss-Seidel sweep, respectively, which are very poor solvers. - -On the other hand, the distributed layout can be used with any solver -but UMFPACK and SuperLU; therefore, if any of these two solvers has already -been selected, the coarsest-level solver is changed to block-Jacobi, -with the previously chosen solver applied to the local blocks. -Likewise, the replicated layout can be used with any solver but SuperLu\_Dist and KRM; -therefore, if SuperLu\_Dist or KRM have been previously set, the coarsest-level -solver is changed to the default sequential solver. - -In a parallel setting with many cores, we suggest to the users to change the default -coarsest solver for using the KRM choice, i.e. a parallel distributed iterative solution of the -coarsest system based on Krylov methods. - -\textbf{Remark 4.} The argument \fortinline|idx| can be used to allow finer -control for those solvers; for instance, by specifying the keyword -\fortinline|'MUMPS_IPAR_ENTRY'| and an appropriate value for \fortinline|idx|, it is -possible to set any entry in the MUMPS integer control array. -See also Sec.~\ref{sec:adding}. +the point-Jacobi, hybrid Gauss-Seidel and block-Jacobi solvers and +their $\ell_1-$ versions reduce to the corresponding local solver +objects (see Remark~2). For the point-Jacobi and Gauss-Seidel solvers, +these objects correspond to a \emph{single} point-Jacobi sweep and a +\emph{single} Gauss-Seidel sweep, respectively, which are very poor +solvers. + +On the other hand, the distributed layout can be used with any solver +except and SuperLU; therefore, if any of these two solvers has +already been selected, the coarsest-level solver is changed to +block-Jacobi, with the previously chosen solver applied to the local +blocks. Likewise, the replicated layout can be used with any solver +but SuperLu\_Dist and KRM; therefore, if SuperLu\_Dist or KRM have +been previously set, the coarsest-level solver is changed to the +default sequential solver. + +In a parallel setting with many cores, we suggest to the users to +change the default coarsest solver for using the KRM choice, i.e. a +parallel distributed iterative solution of the coarsest system based +on Krylov methods. + +\textbf{Remark 4.} The argument \fortinline|idx| can be used to allow +finer control for those solvers; for instance, by specifying the +keyword \fortinline|'MUMPS_IPAR_ENTRY'| and an appropriate value for +\fortinline|idx|, it is possible to set any entry in the MUMPS integer +control array. See also Sec.~\ref{sec:adding}. %The \verb|what,val| pairs described here are those of the predefined %moother/solver objects; newly developed solvers may define new pairs %according to their needs.