mirror of https://github.com/fredrikekre/HYPRE.jl
2 changed files with 77 additions and 0 deletions
@ -0,0 +1,76 @@
@@ -0,0 +1,76 @@
|
||||
# Matrix/vector representation |
||||
|
||||
HYPRE.jl defines the structs `HYPREMatrix` and `HYPREVector` representing HYPREs |
||||
datastructures. Specifically it uses the [IJ System |
||||
Interface](https://hypre.readthedocs.io/en/latest/api-int-ij.html) which can be used for |
||||
general sparse matrices. |
||||
|
||||
HYPRE.jl defines conversion methods from standard Julia datastructures to `HYPREMatrix` and |
||||
`HYPREVector`, respectively. |
||||
|
||||
## PartitionedArrays.jl (multi-process) |
||||
|
||||
HYPRE.jl integrates seemlessly with `PSparseMatrix` and `PVector` from the |
||||
[PartitionedArrays.jl](https://github.com/fverdugo/PartitionedArrays.jl) package. These can |
||||
be passed directly to `solve` and `solve!`. Internally this will construct a `HYPREMatrix` |
||||
and `HYPREVector`s and then convert the solution back to a `PVector`. |
||||
|
||||
The `HYPREMatrix` constructor supports both `SparseMatrixCSC` and `SparseMatrixCSR` as |
||||
storage backends for the `PSparseMatrix`. However, since HYPREs internal storage is also CSR |
||||
based it can be *slightly* more resource efficient to use `SparseMatrixCSR`. |
||||
|
||||
The constructors also supports both PartitionedArrays.jl backends: When using the `MPI` |
||||
backend the communicator of the `PSparseMatrix`/`PVector` is used also for the |
||||
`HYPREMatrix`/`HYPREVector`, and when using the `Sequential` backend it is assumed to be a |
||||
single-process setup, and the global communicator `MPI.COMM_WORLD` is used. |
||||
|
||||
**Example pseudocode** |
||||
|
||||
```julia |
||||
# Assemble linear system (see documentation for PartitionedArrays) |
||||
A = PSparseMatrix(...) |
||||
b = PVector(...) |
||||
|
||||
# Solve with zero initial guess |
||||
x = solve(solver, A, b) |
||||
|
||||
# Inplace solve with x as initial guess |
||||
x = PVector(...) |
||||
solve!(solver, x, A, b) |
||||
``` |
||||
|
||||
--- |
||||
|
||||
It is also possible to construct the arrays explicitly. This can save some resources when |
||||
performing multiple consecutive solves (multiple time steps, Newton iterations, etc). To |
||||
copy data back and forth between `PSparseMatrix`/`PVector` and `HYPREMatrix`/`HYPREVector` |
||||
use the `copy!` function. |
||||
|
||||
**Example pseudocode** |
||||
|
||||
```julia |
||||
A = PSparseMatrix(...) |
||||
x = PVector(...) |
||||
b = PVector(...) |
||||
|
||||
# Construct the HYPRE arrays |
||||
A_h = HYPREMatrix(A) |
||||
x_h = HYPREVector(x) |
||||
b_h = HYPREVector(b) |
||||
|
||||
# Solve |
||||
solve!(solver, x_h, A_h, b_h) |
||||
|
||||
# Copy solution back to x |
||||
copy!(x, x_h) |
||||
``` |
||||
|
||||
|
||||
## `SparseMatrixCSC` / `SparseMatrixCSR` (single-process) |
||||
|
||||
|
||||
## `SparseMatrixCSC` / `SparseMatrixCSR` (multi-process) |
||||
|
||||
!!! warning |
||||
This interface isn't finalized yet and is subject to change. |
||||
|
||||
Loading…
Reference in new issue