12#ifndef ARCCORE_ALINA_BLOCKCSRBACKEND_H
13#define ARCCORE_ALINA_BLOCKCSRBACKEND_H
26#include "arccore/alina/AlinaUtils.h"
27#include "arccore/alina/ValueTypeInterface.h"
28#include "arccore/alina/BuiltinBackend.h"
29#include "arccore/alina/SkylineLUSolver.h"
30#include "arccore/alina/BlockCSRMatrix.h"
38namespace Arcane::Alina::backend
49template <
typename real>
52 typedef real value_type;
53 typedef ptrdiff_t index_type;
54 typedef ptrdiff_t col_type;
55 typedef ptrdiff_t ptr_type;
58 typedef typename BuiltinBackend<real>::vector vector;
59 typedef typename BuiltinBackend<real>::vector matrix_diagonal;
76 : ARCCORE_ALINA_PARAMS_IMPORT_VALUE(p, block_size)
78 p.check_params( {
"block_size" });
82 ARCCORE_ALINA_PARAMS_EXPORT_VALUE(p, path, block_size);
86 static std::string name() {
return "block_crs"; }
89 static std::shared_ptr<matrix>
90 copy_matrix(std::shared_ptr<
typename BuiltinBackend<real>::matrix> A,
93 return std::make_shared<matrix>(*A, prm.
block_size);
97 static std::shared_ptr<vector>
100 return std::make_shared<vector>(x);
103 static std::shared_ptr<vector>
106 return std::make_shared<vector>(x);
110 static std::shared_ptr<vector>
117 static std::shared_ptr<vector>
120 return std::make_shared<vector>(size);
123 static std::shared_ptr<direct_solver>
124 create_solver(std::shared_ptr<
typename BuiltinBackend<real>::matrix> A,
127 return std::make_shared<direct_solver>(*A);
134template <
typename V,
typename C,
typename P>
143template <
typename V,
typename C,
typename P>
152template <
typename V,
typename C,
typename P>
157 return A.ptr.back() * A.block_size * A.block_size;
164template <
typename Alpha,
typename Beta,
typename V,
typename C,
typename P,
class Vec1,
class Vec2>
169 static void apply(Alpha alpha,
const matrix& A,
const Vec1& x, Beta beta, Vec2& y)
171 const size_t nb = A.brows;
172 const size_t na = A.nrows;
173 const size_t ma = A.ncols;
174 const size_t b1 = A.block_size;
175 const size_t b2 = b1 * b1;
177 if (!math::is_zero(beta)) {
180 for (ptrdiff_t i = begin; i < (begin + size); ++i) {
191 for (ptrdiff_t ib = begin; ib < (begin + size); ++ib) {
192 for (P jb = A.ptr[ib], eb = A.ptr[ib + 1]; jb < eb; ++jb) {
193 size_t x0 = A.col[jb] * b1;
195 block_prod(b1, std::min(b1, ma - x0), std::min(b1, na - y0),
196 alpha, &A.val[jb * b2], &x[x0], &y[y0]);
202 static void block_prod(
size_t dim,
size_t nx,
size_t ny,
203 Alpha alpha,
const V* A,
const V* x, V* y)
205 for (
size_t i = 0; i < ny; ++i, ++y) {
208 for (
size_t j = 0; j < dim; ++j, ++A, ++xx)
219template <
typename V,
typename C,
typename P,
class Vec1,
class Vec2,
class Vec3>
224 static void apply(
const Vec1& rhs,
const matrix& A,
const Vec2& x, Vec3& r)
226 typedef typename math::scalar_of<V>::type S;
227 const auto one = math::identity<S>();
228 backend::copy(rhs, r);
229 backend::spmv(-one, A, x, one, r);
Direct solver that uses Skyline LU factorization.
Informations d'exécution d'une boucle.
void arccoreParallelFor(const ComplexForLoopRanges< RankValue > &loop_ranges, const ForLoopRunInfo &run_info, const LambdaType &lambda_function, const ReducerArgs &... reducer_args)
Applique en concurrence la fonction lambda lambda_function sur l'intervalle d'itération donné par loo...
std::int32_t Int32
Type entier signé sur 32 bits.
Sparse matrix in Block CSR format.
Int32 block_size
Block size to use with the created matrices.
block_crs backend definition.
static std::shared_ptr< vector > create_vector(size_t size, const params &)
Create vector of the specified size.
static std::shared_ptr< vector > copy_vector(std::shared_ptr< vector > x, const params &)
Copy vector from builtin backend.
static std::shared_ptr< matrix > copy_matrix(std::shared_ptr< typename BuiltinBackend< real >::matrix > A, const params &prm)
Copy matrix from builtin backend.
static std::shared_ptr< vector > copy_vector(const vector &x, const params &)
Copy vector from builtin backend.
Implementation for function returning the number of columns in a matrix.
Implementation for function returning the number of nonzeros in a matrix.
Implementation for residual error compuatation.
Implementation for function returning the number of rows in a matrix.
Implementation for matrix-vector product.