diff --git a/dev/api/index.html b/dev/api/index.html index a2454d1..ee01a6a 100644 --- a/dev/api/index.html +++ b/dev/api/index.html @@ -1,12 +1,12 @@ -API · HYPRE.jl

API

Initialization and configuration

HYPRE.InitFunction
Init(; finalize_atexit=true)

Wrapper around HYPRE_Init. If finalize_atexit is true a Julia exit hook is added, which calls HYPRE_Finalize. This method will also call MPI.Init unless MPI is already initialized.

Note: This function must be called before using HYPRE functions.

source

Matrix/vector creation

HYPRE.start_assemble!Function
HYPRE.start_assemble!(A::HYPREMatrix)                 -> HYPREMatrixAssembler
+API · HYPRE.jl

API

Initialization and configuration

HYPRE.InitFunction
Init(; finalize_atexit=true)

Wrapper around HYPRE_Init. If finalize_atexit is true a Julia exit hook is added, which calls HYPRE_Finalize. This method will also call MPI.Init unless MPI is already initialized.

Note: This function must be called before using HYPRE functions.

source

Matrix/vector creation

HYPRE.start_assemble!Function
HYPRE.start_assemble!(A::HYPREMatrix)                 -> HYPREMatrixAssembler
 HYPRE.start_assemble!(b::HYPREVector)                 -> HYPREVectorAssembler
-HYPRE.start_assemble!(A::HYPREMatrix, b::HYPREVector) -> HYPREAssembler

Initialize a new assembly for matrix A, vector b, or for both. This zeroes out any previous data in the arrays. Return a HYPREAssembler with allocated data buffers needed to perform the assembly efficiently.

See also: HYPRE.assemble!, HYPRE.finish_assemble!.

source
HYPRE.assemble!Function
HYPRE.assemble!(A::HYPREMatrixAssembler, i, j, a::Matrix)
+HYPRE.start_assemble!(A::HYPREMatrix, b::HYPREVector) -> HYPREAssembler

Initialize a new assembly for matrix A, vector b, or for both. This zeroes out any previous data in the arrays. Return a HYPREAssembler with allocated data buffers needed to perform the assembly efficiently.

See also: HYPRE.assemble!, HYPRE.finish_assemble!.

source
HYPRE.assemble!Function
HYPRE.assemble!(A::HYPREMatrixAssembler, i, j, a::Matrix)
 HYPRE.assemble!(A::HYPREVectorAssembler, i,    b::Vector)
 HYPRE.assemble!(A::HYPREAssembler,       ij,   a::Matrix, b::Vector)

Assemble (by adding) matrix contribution a, vector contribution b, into the underlying array(s) of the assembler at global row indices i and column indices j.

This is roughly equivalent to:

# A.A::HYPREMatrix
 A.A[i, j] += a
 
 # A.b::HYPREVector
-A.b[i] += b

See also: HYPRE.start_assemble!, HYPRE.finish_assemble!.

source
HYPRE.finish_assemble!Function
HYPRE.finish_assemble!(A::HYPREMatrixAssembler)
 HYPRE.finish_assemble!(A::HYPREVectorAssembler)
-HYPRE.finish_assemble!(A::HYPREAssembler)

Finish the assembly. This synchronizes the data between processors.

source

Solvers and preconditioners

HYPRE.solve!Function
solve!(solver::HYPRESolver, x::HYPREVector, A::HYPREMatrix, b::HYPREVector)

Solve the linear system A x = b using solver with x as the initial guess. The approximate solution is stored in x.

See also solve.

source
HYPRE.solveFunction
solve(solver::HYPRESolver, A::HYPREMatrix, b::HYPREVector) -> HYPREVector

Solve the linear system A x = b using solver and return the approximate solution.

This method allocates an initial guess/output vector x, initialized to 0.

See also solve!.

source
+HYPRE.finish_assemble!(A::HYPREAssembler)

Finish the assembly. This synchronizes the data between processors.

source

Solvers and preconditioners

HYPRE.solve!Function
solve!(solver::HYPRESolver, x::HYPREVector, A::HYPREMatrix, b::HYPREVector)

Solve the linear system A x = b using solver with x as the initial guess. The approximate solution is stored in x.

See also solve.

source
HYPRE.solveFunction
solve(solver::HYPRESolver, A::HYPREMatrix, b::HYPREVector) -> HYPREVector

Solve the linear system A x = b using solver and return the approximate solution.

This method allocates an initial guess/output vector x, initialized to 0.

See also solve!.

source
diff --git a/dev/index.html b/dev/index.html index fd6fa50..f3125e4 100644 --- a/dev/index.html +++ b/dev/index.html @@ -1,2 +1,2 @@ -Home · HYPRE.jl

HYPRE.jl

HYPRE.jl is a Julia wrapper for the HYPRE library, which provide parallel solvers for sparse linear systems.


High level interface

HYPRE.jl provide a high level interface to the HYPRE library. The goal of this interface is that the style and API should feel natural to most Julia programmers (it is "Julian"). In particular, you can use standard sparse matrices together with HYPRE's solvers through this interface.

The high level interface does not (currently) provide access to all of HYPREs functionality, but it can easily be combined with the low level interface when necessary.


Low level interface

HYPRE.jl also provide a low level interface for interacting with HYPRE. The goal of this interface is to stay close to the HYPRE C API. In fact, this interface is automatically generated based on HYPRE's header files, so this API maps one-to-one with the C API, see LibHYPRE C API for more details.

+Home · HYPRE.jl

HYPRE.jl

HYPRE.jl is a Julia wrapper for the HYPRE library, which provide parallel solvers for sparse linear systems.


High level interface

HYPRE.jl provide a high level interface to the HYPRE library. The goal of this interface is that the style and API should feel natural to most Julia programmers (it is "Julian"). In particular, you can use standard sparse matrices together with HYPRE's solvers through this interface.

The high level interface does not (currently) provide access to all of HYPREs functionality, but it can easily be combined with the low level interface when necessary.


Low level interface

HYPRE.jl also provide a low level interface for interacting with HYPRE. The goal of this interface is to stay close to the HYPRE C API. In fact, this interface is automatically generated based on HYPRE's header files, so this API maps one-to-one with the C API, see LibHYPRE C API for more details.

diff --git a/dev/libhypre/index.html b/dev/libhypre/index.html index f5c854a..4f18b49 100644 --- a/dev/libhypre/index.html +++ b/dev/libhypre/index.html @@ -1,2 +1,2 @@ -LibHYPRE C API · HYPRE.jl

LibHYPRE C API

The submodule HYPRE.LibHYPRE contains auto-generated bindings to the HYPRE library and give access to the HYPRE C API directly[1]. The module exports all HYPRE_* symbols. Function names and arguments are identical to the C-library – refer to the HYPRE manual for details.

The example program examples/ex5.jl is an (almost) line-to-line translation of the corresponding example program examples/ex5.c written in C, and showcases how HYPRE.jl can be used to interact with the HYPRE library directly.

Functions from the LibHYPRE submodule can be used together with the high level interface. This is useful when you need some functionality from the library which isn't exposed in the high level interface. Many functions require passing a reference to a matrix/vector or a solver. These can be obtained as follows:

C type signatureArgument to pass
HYPRE_IJMatrixA.ijmatrix where A::HYPREMatrix
HYPRE_ParCSRMatrixA.parmatrix where A::HYPREMatrix
HYPRE_IJVectorb.ijvector where b::HYPREVector
HYPRE_ParVectorb.parvector where b::HYPREVector
HYPRE_Solvers.solver where s::HYPRESolver
+LibHYPRE C API · HYPRE.jl

LibHYPRE C API

The submodule HYPRE.LibHYPRE contains auto-generated bindings to the HYPRE library and give access to the HYPRE C API directly[1]. The module exports all HYPRE_* symbols. Function names and arguments are identical to the C-library – refer to the HYPRE manual for details.

The example program examples/ex5.jl is an (almost) line-to-line translation of the corresponding example program examples/ex5.c written in C, and showcases how HYPRE.jl can be used to interact with the HYPRE library directly.

Functions from the LibHYPRE submodule can be used together with the high level interface. This is useful when you need some functionality from the library which isn't exposed in the high level interface. Many functions require passing a reference to a matrix/vector or a solver. These can be obtained as follows:

C type signatureArgument to pass
HYPRE_IJMatrixA.ijmatrix where A::HYPREMatrix
HYPRE_ParCSRMatrixA.parmatrix where A::HYPREMatrix
HYPRE_IJVectorb.ijvector where b::HYPREVector
HYPRE_ParVectorb.parvector where b::HYPREVector
HYPRE_Solvers.solver where s::HYPRESolver
diff --git a/dev/matrix-vector/index.html b/dev/matrix-vector/index.html index 8ead676..b7fe639 100644 --- a/dev/matrix-vector/index.html +++ b/dev/matrix-vector/index.html @@ -1,5 +1,5 @@ -Matrix/vector representation · HYPRE.jl

Matrix/vector representation

HYPRE.jl defines the structs HYPREMatrix and HYPREVector representing HYPREs datastructures. Specifically it uses the IJ System Interface which can be used for general sparse matrices.

HYPREMatrix and HYPREVector can be constructed either by assembling directly, or by first assembling into a Julia datastructure and the converting it. These various methods are outlined in the following sections:

Direct assembly (multi-/single-process)

Creating HYPREMatrix and/or HYPREVector directly is possible by first creating an assembler which is used to add all individual contributions to the matrix/vector. The required steps are:

  1. Create a new matrix and/or vector using the constructor.
  2. Create an assembler and initialize the assembling procedure using HYPRE.start_assemble!.
  3. Assemble all non-zero contributions (e.g. element matrix/vector in a finite element simulation) using HYPRE.assemble!.
  4. Finalize the assembly using HYPRE.finish_assemble!.

After these steps the matrix and vector are ready to pass to the solver. In case of multiple consecutive solves with the same sparsity pattern (e.g. multiple Newton steps, multiple time steps, ...) it is possible to reuse the same matrix by simply skipping the first step above.

Example pseudocode

# MPI communicator
+Matrix/vector representation · HYPRE.jl

Matrix/vector representation

HYPRE.jl defines the structs HYPREMatrix and HYPREVector representing HYPREs datastructures. Specifically it uses the IJ System Interface which can be used for general sparse matrices.

HYPREMatrix and HYPREVector can be constructed either by assembling directly, or by first assembling into a Julia datastructure and the converting it. These various methods are outlined in the following sections:

Direct assembly (multi-/single-process)

Creating HYPREMatrix and/or HYPREVector directly is possible by first creating an assembler which is used to add all individual contributions to the matrix/vector. The required steps are:

  1. Create a new matrix and/or vector using the constructor.
  2. Create an assembler and initialize the assembling procedure using HYPRE.start_assemble!.
  3. Assemble all non-zero contributions (e.g. element matrix/vector in a finite element simulation) using HYPRE.assemble!.
  4. Finalize the assembly using HYPRE.finish_assemble!.

After these steps the matrix and vector are ready to pass to the solver. In case of multiple consecutive solves with the same sparsity pattern (e.g. multiple Newton steps, multiple time steps, ...) it is possible to reuse the same matrix by simply skipping the first step above.

Example pseudocode

# MPI communicator
 comm = MPI.COMM_WORLD # MPI.COMM_SELF for single-process setups
 
 # Create empty matrix and vector -- this process owns rows ilower to iupper
@@ -48,4 +48,4 @@ x = solve(solver, A, b)
 
 # Inplace solve with x as initial guess
 x = zeros(length(b))
-solve!(solver, x, A, b)
+solve!(solver, x, A, b)
diff --git a/dev/search/index.html b/dev/search/index.html index 1daf920..3c3876b 100644 --- a/dev/search/index.html +++ b/dev/search/index.html @@ -1,2 +1,2 @@ -Search · HYPRE.jl

Loading search...

    +Search · HYPRE.jl

    Loading search...

      diff --git a/dev/solvers-preconditioners/index.html b/dev/solvers-preconditioners/index.html index 55e1062..007cc35 100644 --- a/dev/solvers-preconditioners/index.html +++ b/dev/solvers-preconditioners/index.html @@ -1,5 +1,5 @@ -Solvers and preconditioners · HYPRE.jl

      Solvers and preconditioners

      HYPRE.jl wraps most of HYPREs ParCSR solvers and preconditioners.

      The synopsis for creating and using HYPRE.jl's solver wrappers is the same for all solvers:

      1. Set up the linear system (see Matrix/vector representation)
      2. (Optional) Configure a preconditioner
      3. Configure a solver
      4. Use HYPRE.solve or HYPRE.solve! to solve the system

      Here is the corresponding pseudo-code:

      # 1. Setup up linear system
      +Solvers and preconditioners · HYPRE.jl

      Solvers and preconditioners

      HYPRE.jl wraps most of HYPREs ParCSR solvers and preconditioners.

      The synopsis for creating and using HYPRE.jl's solver wrappers is the same for all solvers:

      1. Set up the linear system (see Matrix/vector representation)
      2. (Optional) Configure a preconditioner
      3. Configure a solver
      4. Use HYPRE.solve or HYPRE.solve! to solve the system

      Here is the corresponding pseudo-code:

      # 1. Setup up linear system
       A = HYPREMatrix(...)
       b = HYPREVector(...)
       
      @@ -44,4 +44,4 @@ HYPRE_PCGSetPrecond(solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve,
       
       /* Solve */
       HYPRE_ParCSRPCGSetup(solver, A, b, x);
      -HYPRE_ParCSRPCGSolve(solver, A, b, x);
      +HYPRE_ParCSRPCGSolve(solver, A, b, x);