33#ifndef GKO_PUBLIC_CORE_PRECONDITIONER_JACOBI_HPP_
34#define GKO_PUBLIC_CORE_PRECONDITIONER_JACOBI_HPP_
37#include <ginkgo/core/base/array.hpp>
38#include <ginkgo/core/base/lin_op.hpp>
39#include <ginkgo/core/matrix/csr.hpp>
40#include <ginkgo/core/matrix/dense.hpp>
41#include <ginkgo/core/matrix/diagonal.hpp>
50namespace preconditioner {
62template <
typename IndexType>
151 GKO_ATTRIBUTES IndexType
212template <
typename ValueType = default_precision,
typename IndexType =
int32>
225 using value_type = ValueType;
226 using index_type = IndexType;
251 return storage_scheme_;
403 struct storage_optimization_type {
405 : is_block_wise{false}, of_all_blocks{p}
408 storage_optimization_type(
410 : is_block_wise{block_wise_opt.get_num_elems() > 0},
411 block_wise{block_wise_opt}
414 storage_optimization_type(
416 : is_block_wise{block_wise_opt.get_num_elems() > 0},
417 block_wise{std::move(block_wise_opt)}
423 precision_reduction of_all_blocks;
536 explicit Jacobi(std::shared_ptr<const Executor> exec)
554 std::shared_ptr<const LinOp> system_matrix)
557 parameters_{factory->get_parameters()},
558 storage_scheme_{
this->compute_storage_scheme(
559 parameters_.max_block_size, parameters_.max_block_stride)},
560 num_blocks_{parameters_.block_pointers.get_num_elems() - 1},
562 storage_scheme_.compute_storage_space(
563 parameters_.block_pointers.get_num_elems() - 1)),
569 this->generate(system_matrix.get(), parameters_.
skip_sorting);
585 if (
auto hip_exec = std::dynamic_pointer_cast<const gko::HipExecutor>(
587 default_block_stride =
hip_exec->get_warp_size();
597 GKO_NOT_SUPPORTED(
this);
602 GKO_NOT_SUPPORTED(
this);
606 const auto block_offset = max_block_size;
608 const auto group_offset = max_block_size *
block_stride;
609 return {
static_cast<index_type
>(block_offset),
610 static_cast<index_type
>(group_offset),
623 void generate(
const LinOp* system_matrix,
bool skip_sorting);
632 void detect_blocks(
const matrix::Csr<ValueType, IndexType>* system_matrix);
634 void apply_impl(
const LinOp* b, LinOp* x)
const override;
636 void apply_impl(
const LinOp* alpha,
const LinOp* b,
const LinOp* beta,
637 LinOp* x)
const override;
640 block_interleaved_storage_scheme<index_type> storage_scheme_{};
642 array<value_type> blocks_;
ConvertibleTo interface is used to mark that the implementer can be converted to the object of Result...
Definition polymorphic_object.hpp:499
The EnableLinOp mixin can be used to provide sensible default implementations of the majority of the ...
Definition lin_op.hpp:908
This mixin inherits from (a subclass of) PolymorphicObject and provides a base implementation of a ne...
Definition polymorphic_object.hpp:691
Definition lin_op.hpp:146
std::shared_ptr< const Executor > get_executor() const noexcept
Returns the Executor of the object.
Definition polymorphic_object.hpp:263
Linear operators which support transposition should implement the Transposable interface.
Definition lin_op.hpp:462
A LinOp implementing this interface can write its data to a matrix_data structure.
Definition lin_op.hpp:689
An array is a container which encapsulates fixed-sized arrays, stored on the Executor tied to the arr...
Definition array.hpp:187
const value_type * get_const_data() const noexcept
Returns a constant pointer to the block of memory used to store the elements of the array.
Definition array.hpp:655
size_type get_num_elems() const noexcept
Returns the number of elements in the array.
Definition array.hpp:637
void set_executor(std::shared_ptr< const Executor > exec)
Changes the Executor of the array, moving the allocated data to the new Executor.
Definition array.hpp:673
Dense is a matrix format which explicitly stores all values of the matrix.
Definition dense.hpp:136
This class is used to encode storage precisions of low precision algorithms.
Definition types.hpp:272
Definition jacobi.hpp:527
A block-Jacobi preconditioner is a block-diagonal linear operator, obtained by inverting the diagonal...
Definition jacobi.hpp:216
const block_interleaved_storage_scheme< index_type > & get_storage_scheme() const noexcept
Returns the storage scheme used for storing Jacobi blocks.
Definition jacobi.hpp:248
std::unique_ptr< LinOp > conj_transpose() const override
Returns a LinOp representing the conjugate transpose of the Transposable object.
Jacobi(const Jacobi &other)
Copy-constructs a Jacobi preconditioner.
const remove_complex< value_type > * get_conditioning() const noexcept
Returns an array of 1-norm condition numbers of the blocks.
Definition jacobi.hpp:279
Jacobi(Jacobi &&other)
Move-assigns a Jacobi preconditioner.
std::unique_ptr< LinOp > transpose() const override
Returns a LinOp representing the transpose of the Transposable object.
const value_type * get_blocks() const noexcept
Returns the pointer to the memory used for storing the block data.
Definition jacobi.hpp:265
void write(mat_data &data) const override
Writes a matrix to a matrix_data structure.
Jacobi & operator=(Jacobi &&other)
Move-assigns a Jacobi preconditioner.
Jacobi & operator=(const Jacobi &other)
Copy-assigns a Jacobi preconditioner.
size_type get_num_stored_elements() const noexcept
Returns the number of elements explicitly stored in the matrix.
Definition jacobi.hpp:289
size_type get_num_blocks() const noexcept
Returns the number of blocks of the operator.
Definition jacobi.hpp:238
#define GKO_CREATE_FACTORY_PARAMETERS(_parameters_name, _factory_name)
This Macro will generate a new type containing the parameters for the factory _factory_name.
Definition abstract_factory.hpp:308
#define GKO_FACTORY_PARAMETER_SCALAR(_name, _default)
Creates a scalar factory parameter in the factory parameters structure.
Definition abstract_factory.hpp:473
#define GKO_ENABLE_BUILD_METHOD(_factory_name)
Defines a build method for the factory, simplifying its construction by removing the repetitive typin...
Definition abstract_factory.hpp:422
#define GKO_ENABLE_LIN_OP_FACTORY(_lin_op, _parameters_name, _factory_name)
This macro will generate a default implementation of a LinOpFactory for the LinOp subclass it is defi...
Definition lin_op.hpp:1046
#define GKO_FACTORY_PARAMETER_VECTOR(_name,...)
Creates a vector factory parameter in the factory parameters structure.
Definition abstract_factory.hpp:489
The Ginkgo namespace.
Definition abstract_factory.hpp:48
constexpr T one()
Returns the multiplicative identity for T.
Definition math.hpp:803
typename detail::remove_complex_s< T >::type remove_complex
Obtain the type which removed the complex of complex/scalar type or the template parameter of class b...
Definition math.hpp:354
constexpr uint32 get_significant_bit(const T &n, uint32 hint=0u) noexcept
Returns the position of the most significant bit of the number.
Definition math.hpp:1161
std::uint32_t uint32
32-bit unsigned integral type.
Definition types.hpp:160
constexpr int64 ceildiv(int64 num, int64 den)
Performs integer division with rounding up.
Definition math.hpp:641
std::size_t size_type
Integral type used for allocation quantities.
Definition types.hpp:120
constexpr T get_superior_power(const T &base, const T &limit, const T &hint=T{1}) noexcept
Returns the smallest power of base not smaller than limit.
Definition math.hpp:1179
This structure is used as an intermediate data type to store a sparse matrix.
Definition matrix_data.hpp:155
storage_optimization_type storage_optimization
The precisions to use for the blocks of the matrix.
Definition jacobi.hpp:496
uint32 max_block_size
Maximal size of diagonal blocks.
Definition jacobi.hpp:340
gko::array< index_type > block_pointers
Starting (row / column) indexes of individual blocks.
Definition jacobi.hpp:398
bool skip_sorting
true means it is known that the matrix given to this factory will be sorted first by row,...
Definition jacobi.hpp:370
Defines the parameters of the interleaved block storage scheme used by block-Jacobi blocks.
Definition jacobi.hpp:63
IndexType get_block_offset(IndexType block_id) const noexcept
Returns the offset of the block with the given ID within its group.
Definition jacobi.hpp:139
IndexType get_group_offset(IndexType block_id) const noexcept
Returns the offset of the group belonging to the block with the given ID.
Definition jacobi.hpp:127
uint32 group_power
Then base 2 power of the group.
Definition jacobi.hpp:88
IndexType get_stride() const noexcept
Returns the stride between columns of the block.
Definition jacobi.hpp:163
IndexType group_offset
The offset between two block groups.
Definition jacobi.hpp:81
IndexType get_global_block_offset(IndexType block_id) const noexcept
Returns the offset of the block with the given ID.
Definition jacobi.hpp:152
IndexType block_offset
The offset between consecutive blocks within the group.
Definition jacobi.hpp:76
size_type compute_storage_space(size_type num_blocks) const noexcept
Computes the storage space required for the requested number of blocks.
Definition jacobi.hpp:113
IndexType get_group_size() const noexcept
Returns the number of elements in the group.
Definition jacobi.hpp:95