44#define CS_SDM_BY_BLOCK (1 << 0)
45#define CS_SDM_SYMMETRIC (1 << 1)
46#define CS_SDM_SHARED_VAL (1 << 2)
117 const int n_max_rows_,
118 const int n_max_cols_);
154 row(
const int row_i)
const
156 assert(0 <= row_i && row_i <
n_rows);
201 init(
const int nrows,
const int ncols);
213 init(
const int nrows);
262 get_block(
const int row_block_id,
const int col_block_id)
const
266 assert(col_block_id < block_desc->n_col_blocks);
267 assert(row_block_id < block_desc->n_row_blocks);
407 if (x == NULL || y == NULL)
410 for (
int i = 0; i < n; i++)
435 if (x == NULL || y == NULL)
438 for (
int i = 0; i < n; i++)
461 if (x == NULL || y == NULL)
464 for (
int i = 0; i < n; i++)
542 int n_max_blocks_by_col,
543 const int max_row_block_sizes[],
544 const int max_col_block_sizes[]);
560 int n_max_blocks_by_col);
592 const int row_block_sizes[],
593 const int col_block_sizes[]);
638 const cs_sdm_t *send)
641 assert(recv->n_max_rows >= send->n_rows);
642 assert(recv->n_max_cols >= send->n_cols);
644 recv->flag = send->flag;
645 recv->n_rows = send->n_rows;
646 recv->n_cols = send->n_cols;
649 std::memcpy(recv->val,
651 sizeof(
cs_real_t) * send->n_rows * send->n_cols);
684 const short int r_id,
685 const short int c_id,
691 assert(m != NULL && b != NULL);
692 assert(r_id >= 0 && c_id >= 0);
693 assert((r_id + nr) <= m->n_rows);
694 assert((c_id + nc) <= m->n_cols);
695 assert(nr == b->n_rows && nc == b->n_cols);
697 const cs_real_t *_start = m->val + c_id + r_id*m->n_cols;
698 for (
short int i = 0; i < nr; i++, _start += m->n_cols)
699 std::memcpy(b->val + i * nc, _start,
sizeof(
cs_real_t) * nc);
717 assert(m != NULL && mt != NULL);
718 assert(m->n_rows == mt->n_cols && m->n_cols == mt->n_rows);
720 for (
short int i = 0; i < m->n_rows; i++) {
721 const cs_real_t *m_i = m->val + i*m->n_cols;
722 for (
short int j = 0; j < m->n_cols; j++)
723 mt->val[j*mt->n_cols + i] += m_i[j];
764 assert(a != NULL && b != NULL && c != NULL);
765 assert(a->n_cols == 3 && b->n_cols == 3 &&
766 a->n_rows == 1 && c->n_rows == 1 &&
767 c->n_cols == 1 && b->n_rows == 1);
769 c->val[0] += a->val[0]*b->val[0] + a->val[1]*b->val[1] + a->val[2]*b->val[2];
896 const cs_sdm_t *add);
911 const cs_sdm_t *add);
943 const cs_sdm_t *add);
960 const short int r_id,
961 const short int c_id,
964 const cs_sdm_t *add);
981 const cs_sdm_t *add);
1314 const cs_sdm_t *mat);
double cs_real_t
Floating-point value.
Definition: cs_defs.h:332
int cs_lnum_t
local mesh entity id
Definition: cs_defs.h:325
unsigned short int cs_flag_t
Definition: cs_defs.h:334
void cs_sdm_44_ldlt_compute(const cs_sdm_t *m, cs_real_t facto[10])
LDL^T: Modified Cholesky decomposition of a 4x4 SPD matrix. For more reference, see for instance http...
Definition: cs_sdm.cpp:1546
void cs_sdm_block_multiply_rowrow_sym(const cs_sdm_t *a, const cs_sdm_t *b, cs_sdm_t *c)
Compute a row-row matrix product of a and b. It is basically equal to the classical a*b^T....
Definition: cs_sdm.cpp:766
void cs_sdm_ldlt_compute(const cs_sdm_t *m, cs_real_t *facto, cs_real_t *dkk)
LDL^T: Modified Cholesky decomposition of a SPD matrix. For more reference, see for instance http://m...
Definition: cs_sdm.cpp:1700
void cs_sdm_block_33_to_xyz(const cs_sdm_t *mb33, cs_sdm_t *mbxyz)
Convert a matrix with each entry is a 3x3 block into a matrix with a block for each component x,...
Definition: cs_sdm.cpp:458
void cs_sdm_block_add_mult(cs_sdm_t *mat, cs_real_t mult_coef, const cs_sdm_t *add)
Add two matrices defined by block: loc += mult_coef * add.
Definition: cs_sdm.cpp:911
void cs_sdm_44_ldlt_solve(const cs_real_t facto[10], const cs_real_t rhs[4], cs_real_t x[4])
Solve a 4x4 matrix with a modified Cholesky decomposition (L.D.L^T) The solution should be already al...
Definition: cs_sdm.cpp:1850
void cs_sdm_33_ldlt_compute(const cs_sdm_t *m, cs_real_t facto[6])
LDL^T: Modified Cholesky decomposition of a 3x3 SPD matrix. For more reference, see for instance http...
Definition: cs_sdm.cpp:1497
static void cs_sdm_scalvect(int n, const cs_real_t s, const cs_real_t x[], cs_real_t y[])
Multiply a small vector by a scalar coefficient: y = s x For very small array sizes (3,...
Definition: cs_sdm.h:430
cs_sdm_t * cs_sdm_block33_create(int n_max_blocks_by_row, int n_max_blocks_by_col)
Allocate and initialize a cs_sdm_t structure by block when the block size is constant and equal to 3.
Definition: cs_sdm.cpp:288
void cs_sdm_66_ldlt_solve(const cs_real_t f[21], const cs_real_t b[6], cs_real_t x[6])
Solve a 6x6 matrix with a modified Cholesky decomposition (L.D.L^T) The solution should be already al...
Definition: cs_sdm.cpp:1880
cs_sdm_t * cs_sdm_create(cs_flag_t flag, int n_max_rows, int n_max_cols)
Allocate and initialize a cs_sdm_t structure Most generic function to create a cs_sdm_t structure.
Definition: cs_sdm.cpp:133
static void cs_sdm_transpose_and_update(const cs_sdm_t *m, cs_sdm_t *mt)
transpose and copy a matrix into another one already shaped sub-matrix starting from (r_id,...
Definition: cs_sdm.h:714
void cs_sdm_block_init(cs_sdm_t *m, int n_row_blocks, int n_col_blocks, const int row_block_sizes[], const int col_block_sizes[])
Initialize the pattern of cs_sdm_t structure defined by block The matrix should have been allocated b...
Definition: cs_sdm.cpp:363
void cs_sdm_lu_compute(const cs_sdm_t *m, cs_real_t facto[])
LU factorization of a small dense matrix. Small means that the number m->n_rows is less than 100 for ...
Definition: cs_sdm.cpp:1353
cs_sdm_t * cs_sdm_block_create_copy(const cs_sdm_t *mref)
Allocate and initialize a cs_sdm_t structure w.r.t. to a given matrix.
Definition: cs_sdm.cpp:506
cs_sdm_t * cs_sdm_free(cs_sdm_t *mat)
Free a cs_sdm_t structure.
Definition: cs_sdm.cpp:331
void cs_sdm_block_matvec(const cs_sdm_t *mat, const cs_real_t *vec, cs_real_t *mv)
Compute a dense matrix-vector product for a rectangular matrix defined by block mv has been previousl...
Definition: cs_sdm.cpp:948
void cs_sdm_update_matvec(const cs_sdm_t *mat, const cs_real_t *vec, cs_real_t *mv)
Compute a dense matrix-vector product for a rectangular matrix mv has been previously allocated and i...
Definition: cs_sdm.cpp:819
void cs_sdm_block_fprintf(FILE *fp, const char *fname, cs_real_t thd, const cs_sdm_t *m)
Print a cs_sdm_t structure which is defined by block Print into the file f if given otherwise open a ...
Definition: cs_sdm.cpp:2113
void cs_sdm_33_sym_qr_compute(const cs_real_t m[9], cs_real_t Qt[9], cs_real_t R[6])
Decompose a matrix into the matrix product Q.R Case of a 3x3 symmetric matrix.
Definition: cs_sdm.cpp:1254
void cs_sdm_add_block_topleft(cs_sdm_t *mat, const short int nr, const short int nc, const cs_sdm_t *add)
Add a block of a matrix into a sub-matrix starting from (0, 0) with a size of nr rows and nc cols.
Definition: cs_sdm.cpp:1064
void cs_sdm_66_ldlt_compute(const cs_sdm_t *m, cs_real_t facto[21])
LDL^T: Modified Cholesky decomposition of a 6x6 SPD matrix. For more reference, see for instance http...
Definition: cs_sdm.cpp:1606
static cs_real_t cs_sdm_dot(int n, const cs_real_t x[], const cs_real_t y[])
Basic dot product for a small vector For very small array sizes (3, 4, 6) prefer functions in cs_math...
Definition: cs_sdm.h:401
static void cs_sdm_copy_block(const cs_sdm_t *m, const short int r_id, const short int c_id, const short int nr, const short int nc, cs_sdm_t *b)
Copy a block of a matrix into a sub-matrix starting from (r_id, c_id) with a size of nr rows and nc c...
Definition: cs_sdm.h:683
double cs_sdm_test_symmetry(const cs_sdm_t *mat)
Test if a matrix is symmetric. Return 0. if the extradiagonal differences are lower thann the machine...
Definition: cs_sdm.cpp:1987
void cs_sdm_lu_solve(cs_lnum_t n_rows, const cs_real_t facto[], const cs_real_t *rhs, cs_real_t *sol)
Solve a system A.sol = rhs using a LU factorization of A (a small dense matrix).
Definition: cs_sdm.cpp:1450
cs_sdm_t * cs_sdm_square_create(int n_max_rows)
Allocate and initialize a cs_sdm_t structure Case of a square matrix.
Definition: cs_sdm.cpp:152
void cs_sdm_square_asymm(cs_sdm_t *mat)
Set the given matrix into its anti-symmetric part.
Definition: cs_sdm.cpp:1155
void cs_sdm_multiply(const cs_sdm_t *a, const cs_sdm_t *b, cs_sdm_t *c)
Compute a local dense matrix-product c = a*b c has been previously allocated.
Definition: cs_sdm.cpp:583
cs_sdm_t * cs_sdm_create_transpose(cs_sdm_t *mat)
Define a new matrix which is its transpose.
Definition: cs_sdm.cpp:191
void cs_sdm_block33_init(cs_sdm_t *m, int n_row_blocks, int n_col_blocks)
Initialize the pattern of cs_sdm_t structure defined by 3x3 block The matrix should have been allocat...
Definition: cs_sdm.cpp:420
static void cs_sdm_add_scalvect(int n, const cs_real_t s, const cs_real_t x[], cs_real_t y[])
Multiply a small vector by a scalar coefficient: y += s x For very small array sizes (3,...
Definition: cs_sdm.h:456
void cs_sdm_ldlt_solve(int n_rows, const cs_real_t *facto, const cs_real_t *rhs, cs_real_t *sol)
Solve a SPD matrix with a L.D.L^T (Modified Cholesky decomposition) The solution should be already al...
Definition: cs_sdm.cpp:1916
void cs_sdm_block_multiply_rowrow(const cs_sdm_t *a, const cs_sdm_t *b, cs_sdm_t *c)
Compute a row-row matrix product of a and b. It is basically equal to the classical a*b^T....
Definition: cs_sdm.cpp:714
void cs_sdm_multiply_rowrow_sym(const cs_sdm_t *a, const cs_sdm_t *b, cs_sdm_t *c)
Compute a row-row matrix product of a and b. It is basically equal to the classical a*b^T....
Definition: cs_sdm.cpp:668
void cs_sdm_33_lu_compute(const cs_sdm_t *m, cs_real_t facto[9])
LU factorization of a small dense 3x3 matrix.
Definition: cs_sdm.cpp:1315
void cs_sdm_matvec_transposed(const cs_sdm_t *mat, const cs_real_t *vec, cs_real_t *mv)
Compute a dense matrix-vector product for a rectangular matrix which is transposed....
Definition: cs_sdm.cpp:849
void cs_sdm_block_dump(cs_lnum_t parent_id, const cs_sdm_t *mat)
Dump a small dense matrix defined by blocks.
Definition: cs_sdm.cpp:2043
void cs_sdm_multiply_rowrow(const cs_sdm_t *a, const cs_sdm_t *b, cs_sdm_t *c)
Compute a row-row matrix product of a and b. It is basically equal to the classical a*b^T....
Definition: cs_sdm.cpp:624
void cs_sdm_add_mult(cs_sdm_t *mat, cs_real_t alpha, const cs_sdm_t *add)
Add two small dense matrices: loc += alpha*add.
Definition: cs_sdm.cpp:995
static void cs_sdm_multiply_r1c3_rowrow(const cs_sdm_t *a, const cs_sdm_t *b, cs_sdm_t *c)
Compute a row-row matrix product of a and b. It is basically equal to the classical a*b^T....
Definition: cs_sdm.h:759
#define CS_SDM_BY_BLOCK
Definition: cs_sdm.h:44
static void cs_sdm_copy(cs_sdm_t *recv, const cs_sdm_t *send)
Copy a cs_sdm_t structure into another cs_sdm_t structure which has been already allocated.
Definition: cs_sdm.h:637
void cs_sdm_block_square_asymm(cs_sdm_t *mat)
Set the given block matrix into its anti-symmetric part.
Definition: cs_sdm.cpp:1189
void cs_sdm_square_add_transpose(cs_sdm_t *mat, cs_sdm_t *tr)
Define a new matrix by adding the given matrix with its transpose. Keep the transposed matrix for a f...
Definition: cs_sdm.cpp:1083
void cs_sdm_add_block(cs_sdm_t *mat, const short int r_id, const short int c_id, const short int nr, const short int nc, const cs_sdm_t *add)
Add a block of a matrix into a sub-matrix starting from (r_id, c_id) with a size of nr rows and nc co...
Definition: cs_sdm.cpp:1025
void cs_sdm_33_lu_solve(const cs_real_t facto[9], const cs_real_t rhs[3], cs_real_t sol[3])
Solve a system A.sol = rhs using a LU factorization of A (a small 3x3 dense matrix).
Definition: cs_sdm.cpp:1413
cs_sdm_t * cs_sdm_block_create(int n_max_blocks_by_row, int n_max_blocks_by_col, const int max_row_block_sizes[], const int max_col_block_sizes[])
Allocate and initialize a cs_sdm_t structure.
Definition: cs_sdm.cpp:225
cs_sdm_t * cs_sdm_create_copy(const cs_sdm_t *m)
Allocate a cs_sdm_t structure and initialized it with the copy of the matrix m in input.
Definition: cs_sdm.cpp:169
void cs_sdm_33_ldlt_solve(const cs_real_t facto[6], const cs_real_t rhs[3], cs_real_t sol[3])
Solve a 3x3 matrix with a modified Cholesky decomposition (L.D.L^T) The solution should be already al...
Definition: cs_sdm.cpp:1823
void cs_sdm_block_add(cs_sdm_t *mat, const cs_sdm_t *add)
Add two matrices defined by block: loc += add.
Definition: cs_sdm.cpp:878
void cs_sdm_square_2symm(cs_sdm_t *mat)
Set the given matrix to two times its symmetric part mat --> mat + mat_tr = 2*symm(mat)
Definition: cs_sdm.cpp:1126
Definition: cs_algorithm.h:51
cs_sdm_t sdm_t
Definition: cs_sdm.h:379
int n_rows
Definition: cs_sdm.h:76
_cs_sdm_t(const int n_max_rows_)
Constructor for a square matrix.
Definition: cs_sdm.cpp:2189
int n_cols
Definition: cs_sdm.h:80
cs_real_t & operator()(const int i, const int j)
Modifiy the value (i,j) of the matric.
Definition: cs_sdm.cpp:2253
cs_real_t * row(const int row_i) const
Return a pointer on row.
Definition: cs_sdm.h:154
void map_array(int n_max_rows_, int n_max_cols_, cs_real_t *array)
Map an array into a predefined cs_sdm_t structure. This array is shared and the lifecycle of this arr...
Definition: cs_sdm.cpp:2572
int n_max_cols
Definition: cs_sdm.h:79
_cs_sdm_t & operator+=(const _cs_sdm_t &add)
Add two small dense matrices: loc += add.
Definition: cs_sdm.cpp:2386
void symmetrize_ur()
Set the lower left according to the upper right part in order to get a symmetric matrix.
Definition: cs_sdm.cpp:2348
cs_sdm_t * get_block(const int row_block_id, const int col_block_id) const
Get a specific block in a cs_sdm_t structure defined by block.
Definition: cs_sdm.h:262
void init(const int nrows, const int ncols)
Initialize matrix.
Definition: cs_sdm.cpp:2291
cs_flag_t flag
Definition: cs_sdm.h:72
void dot(const cs_real_t vec[], cs_real_t mv[]) const
Compute a dense matrix-vector product for a small square matrix mv has been previously allocated.
Definition: cs_sdm.cpp:2410
_cs_sdm_t & operator=(const _cs_sdm_t &)=delete
cs_sdm_block_t * block_desc
Definition: cs_sdm.h:86
cs_real_t * val
Definition: cs_sdm.h:82
int n_max_rows
Definition: cs_sdm.h:75
cs_real_t * data() const
Return a pointer on the values.
Definition: cs_sdm.h:223
void dump() const
Dump a small dense matrix.
Definition: cs_sdm.cpp:2438
int size() const
Return the size of the matrix.
Definition: cs_sdm.h:138
_cs_sdm_t & operator*=(const cs_real_t &scaling)
Multiply a matrix with the scaling factor given as parameter.
Definition: cs_sdm.cpp:2367
~_cs_sdm_t()
Destructor.
Definition: cs_sdm.cpp:2169
_cs_sdm_t transpose() const
Transpose a matrix.
Definition: cs_sdm.cpp:2326
int n_max_blocks_by_row
Definition: cs_sdm.h:56
cs_sdm_t * blocks
Definition: cs_sdm.h:64
int n_row_blocks
Definition: cs_sdm.h:57
int n_max_blocks_by_col
Definition: cs_sdm.h:58
int n_col_blocks
Definition: cs_sdm.h:59