49#define CS_SDM_BY_BLOCK (1 << 0)
50#define CS_SDM_SYMMETRIC (1 << 1)
51#define CS_SDM_SHARED_VAL (1 << 2)
156 if (x == NULL || y == NULL)
159 for (
int i = 0; i < n; i++)
184 if (x == NULL || y == NULL)
187 for (
int i = 0; i < n; i++)
210 if (x == NULL || y == NULL)
213 for (
int i = 0; i < n; i++)
230 for (
int i = 1; i < mat->n_rows; i++) {
231 cs_real_t *m_i = mat->val + i*mat->n_rows;
232 for (
int j = 0; j < i; j++)
233 m_i[j] = mat->val[j*mat->n_rows + i];
311 int n_max_blocks_by_col,
312 const int max_row_block_sizes[],
313 const int max_col_block_sizes[]);
329 int n_max_blocks_by_col);
351 assert(array != NULL && m != NULL);
354 m->n_rows = m->n_max_rows = n_max_rows;
355 m->n_cols = m->n_max_cols = n_max_cols;
357 m->block_desc = NULL;
390 assert(n_rows <= mat->n_max_rows);
391 assert(n_cols <= mat->n_max_cols);
393 mat->n_rows = n_rows;
394 mat->n_cols = n_cols;
395 memset(mat->val, 0, n_rows*n_cols*
sizeof(
cs_real_t));
432 const int row_block_sizes[],
433 const int col_block_sizes[]);
478 const cs_sdm_t *send)
481 assert(recv->n_max_rows >= send->n_rows);
482 assert(recv->n_max_cols >= send->n_cols);
484 recv->flag = send->flag;
485 recv->n_rows = send->n_rows;
486 recv->n_cols = send->n_cols;
489 memcpy(recv->val, send->val,
sizeof(
cs_real_t)*send->n_rows*send->n_cols);
518static inline cs_sdm_t *
526 assert(col_block_id < m->block_desc->n_col_blocks);
527 assert(row_block_id < m->block_desc->n_row_blocks);
529 return m->block_desc->blocks
530 + row_block_id*m->block_desc->n_col_blocks + col_block_id;
549 assert(m != NULL && col_vals != NULL);
550 assert(col_id < m->n_cols);
553 for(
int i = 0; i < m->n_rows; i++, _col += m->n_cols)
573 const short int r_id,
574 const short int c_id,
580 assert(m != NULL && b != NULL);
581 assert(r_id >= 0 && c_id >= 0);
582 assert((r_id + nr) <= m->n_rows);
583 assert((c_id +
nc) <= m->n_cols);
584 assert(nr == b->n_rows &&
nc == b->n_cols);
586 const cs_real_t *_start = m->val + c_id + r_id*m->n_cols;
587 for (
short int i = 0; i < nr; i++, _start += m->n_cols)
607 for (
int i = 0; i < m->n_rows*m->n_cols; i++)
608 m->val[i] *= scaling;
626 assert(m != NULL && mt != NULL);
627 assert(m->n_rows == mt->n_cols && m->n_cols == mt->n_rows);
629 for (
short int i = 0; i < m->n_rows; i++) {
630 const cs_real_t *m_i = m->val + i*m->n_cols;
631 for (
short int j = 0; j < m->n_cols; j++)
632 mt->val[j*mt->n_cols + i] += m_i[j];
670 assert(mat != NULL && vec != NULL && mv != NULL);
671 assert(mat->n_rows == 3 && mat->n_cols == 3);
673 mv[0] = vec[0]*mat->val[0] + vec[1]*mat->val[1] + vec[2]*mat->val[2];
674 mv[1] = vec[0]*mat->val[3] + vec[1]*mat->val[4] + vec[2]*mat->val[5];
675 mv[2] = vec[0]*mat->val[6] + vec[1]*mat->val[7] + vec[2]*mat->val[8];
698 assert(a != NULL && b != NULL && c != NULL);
699 assert(a->n_cols == 3 && b->n_cols == 3 &&
700 a->n_rows == 1 && c->n_rows == 1 &&
701 c->n_cols == 1 && b->n_rows == 1);
703 c->val[0] += a->val[0]*b->val[0] + a->val[1]*b->val[1] + a->val[2]*b->val[2];
862 const cs_sdm_t *add);
877 const cs_sdm_t *add);
907 const cs_sdm_t *add);
922 const cs_sdm_t *add);
939 const short int r_id,
940 const short int c_id,
943 const cs_sdm_t *add);
960 const cs_sdm_t *add);
1308 const cs_sdm_t *mat);
1342 const cs_sdm_t *mat);
#define BEGIN_C_DECLS
Definition: cs_defs.h:542
double cs_real_t
Floating-point value.
Definition: cs_defs.h:342
#define END_C_DECLS
Definition: cs_defs.h:543
int cs_lnum_t
local mesh entity id
Definition: cs_defs.h:335
unsigned short int cs_flag_t
Definition: cs_defs.h:344
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:1662
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:768
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:1816
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:997
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:1966
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:1613
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:179
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:291
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:1996
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:137
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:623
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:364
static cs_sdm_t * cs_sdm_get_block(const cs_sdm_t *const m, int row_block_id, int col_block_id)
Get a specific block in a cs_sdm_t structure defined by block.
Definition: cs_sdm.h:519
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:1468
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:507
cs_sdm_t * cs_sdm_free(cs_sdm_t *mat)
Free a cs_sdm_t structure.
Definition: cs_sdm.cpp:332
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:1037
static void cs_sdm_map_array(int n_max_rows, int n_max_cols, cs_sdm_t *m, 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.h:346
void() cs_sdm_matvec_t(const cs_sdm_t *mat, const cs_real_t *vec, cs_real_t *mv)
Generic prototype for computing a dense matrix-vector product mv has been previously allocated.
Definition: cs_sdm.h:127
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:901
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:2364
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:1369
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:1178
void() cs_sdm_product_t(const cs_sdm_t *a, const cs_sdm_t *b, cs_sdm_t *c)
Generic prototype for computing a local dense matrix-product c = a*b where c has been previously allo...
Definition: cs_sdm.h:111
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:1722
void cs_sdm_add(cs_sdm_t *mat, const cs_sdm_t *add)
Add two small dense matrices: loc += add.
Definition: cs_sdm.cpp:1087
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:150
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:572
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:2103
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:1565
void cs_sdm_dump(cs_lnum_t parent_id, const cs_lnum_t *row_ids, const cs_lnum_t *col_ids, const cs_sdm_t *mat)
Dump a small dense matrix.
Definition: cs_sdm.cpp:2188
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:156
void cs_sdm_square_asymm(cs_sdm_t *mat)
Set the given matrix into its anti-symmetric part.
Definition: cs_sdm.cpp:1269
#define CS_SDM_SHARED_VAL
Definition: cs_sdm.h:51
static void cs_sdm_scale(cs_real_t scaling, cs_sdm_t *m)
Multiply a matrix with the scaling factor given as parameter.
Definition: cs_sdm.h:601
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:195
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:421
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:205
void cs_sdm_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.
Definition: cs_sdm.cpp:859
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:2032
static void cs_sdm_get_col(const cs_sdm_t *m, int col_id, cs_real_t *col_vals)
Get a copy of a column in a preallocated vector.
Definition: cs_sdm.h:544
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:1430
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:933
void cs_sdm_fprintf(FILE *fp, const char *fname, cs_real_t thd, const cs_sdm_t *m)
Print a cs_sdm_t structure not defined by block Print into the file f if given otherwise open a new f...
Definition: cs_sdm.cpp:2244
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:2293
static void cs_sdm_symm_ur(cs_sdm_t *mat)
Set the lower left according to the upper right part in order to get a symmetric matrix.
Definition: cs_sdm.h:227
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
static void cs_sdm_square_init(int n_rows, cs_sdm_t *mat)
Initialize a cs_sdm_t structure Case of a square matrix.
Definition: cs_sdm.h:409
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:1109
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:693
void cs_sdm_simple_dump(const cs_sdm_t *mat)
Dump a small dense matrix.
Definition: cs_sdm.cpp:2159
#define CS_SDM_BY_BLOCK
Definition: cs_sdm.h:49
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:477
void cs_sdm_block_square_asymm(cs_sdm_t *mat)
Set the given block matrix into its anti-symmetric part.
Definition: cs_sdm.cpp:1303
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:1197
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:1139
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:1528
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:229
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:173
static void cs_sdm_init(int n_rows, int n_cols, cs_sdm_t *mat)
Initialize a cs_sdm_t structure Case of a square matrix.
Definition: cs_sdm.h:385
static void cs_sdm_33_matvec(const cs_sdm_t *mat, const cs_real_t *vec, cs_real_t *mv)
Compute a dense 3x3 matrix-vector product mv has been previously allocated.
Definition: cs_sdm.h:665
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:1939
void cs_sdm_square_matvec(const cs_sdm_t *mat, const cs_real_t *vec, cs_real_t *mv)
Compute a dense matrix-vector product for a small square matrix mv has been previously allocated.
Definition: cs_sdm.cpp:823
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:962
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:1240
double precision, dimension(:,:,:), allocatable nc
Definition: atimbr.f90:109
int n_rows
Definition: cs_sdm.h:81
int n_cols
Definition: cs_sdm.h:85
int n_max_cols
Definition: cs_sdm.h:84
cs_flag_t flag
Definition: cs_sdm.h:77
cs_sdm_block_t * block_desc
Definition: cs_sdm.h:91
cs_real_t * val
Definition: cs_sdm.h:87
int n_max_rows
Definition: cs_sdm.h:80
int n_max_blocks_by_row
Definition: cs_sdm.h:61
cs_sdm_t * blocks
Definition: cs_sdm.h:69
int n_row_blocks
Definition: cs_sdm.h:62
int n_max_blocks_by_col
Definition: cs_sdm.h:63
int n_col_blocks
Definition: cs_sdm.h:64