LADEL main
Sparse LDL factorization package with rank 1 and rowadd/rowdel updates
ladel_matmat.c
Go to the documentation of this file.
1#include "ladel_constants.h"
2#include "ladel_global.h"
3#include "ladel_types.h"
4#include "ladel_copy.h"
5#include "ladel_matmat.h"
6
8{
9 return ladel_mat_mat_transpose_advanced(M, M_transpose, NULL, TRUE, work);
10}
11
13{
14 return ladel_mat_mat_transpose_advanced(M, M_transpose, NULL, FALSE, work);
15}
16
18{
19 return ladel_mat_mat_transpose_advanced(M, M_transpose, diag, TRUE, work);
20}
21
23{
24 if (!M || !M_transpose || !work) return NULL;
25
26 ladel_int col, row, row2, index, index2, MMt_nnz = 0;
27 ladel_int *touched = work->array_int_ncol_flag;
29
30 /* Count nnz in M*M_tranpose */
31 for (col = 0; col < M_transpose->ncol; col++)
32 {
33 work->flag++; /*this makes it so that touched==work->flag is false everywhere*/
34 LADEL_FOR(index, M_transpose, col)
35 {
36 row = M_transpose->i[index];
37 LADEL_FOR(index2, M, row)
38 {
39 row2 = M->i[index2];
40 if (row2 > col) break;
41 if (touched[row2] != work->flag)
42 {
43 touched[row2] = work->flag;
44 MMt_nnz++;
45 }
46 }
47 }
48 }
49
50 ladel_sparse_matrix *MMt = ladel_sparse_alloc(M->nrow, M->nrow, MMt_nnz, UPPER, values && M->values, FALSE);
51 if (!MMt) return NULL;
52
53 /* Compute M*diag*M_transpose */
54 if (MMt->values) for (index = 0; index < MMt_nnz; index++) MMt->x[index] = 0;
55 MMt->p[0] = 0;
56 MMt_nnz = -1;
57
58 for (col = 0; col < M_transpose->ncol; col++)
59 {
60 work->flag++;
61 LADEL_FOR(index, M_transpose, col)
62 {
63 row = M_transpose->i[index];
64 LADEL_FOR(index2, M, row)
65 {
66 row2 = M->i[index2];
67
68 if (row2 > col) break;
69 if (touched[row2] != work->flag)
70 {
71 MMt_nnz++;
72 touched[row2] = work->flag;
73 MMt->i[MMt_nnz] = row2;
74 }
75 if (MMt->values)
76 MMt_col[row2] += (diag) ? M->x[index2]*diag[row]*M_transpose->x[index] : M->x[index2]*M_transpose->x[index];
77 }
78 }
79 MMt->p[col+1] = MMt_nnz+1;
80
81 if (MMt->values)
82 {
83 LADEL_FOR(index, MMt, col)
84 {
85 MMt->x[index] = MMt_col[MMt->i[index]];
86 MMt_col[MMt->i[index]] = 0;
87 }
88 }
89 }
90
91 return MMt;
92}
#define TRUE
For booleans.
#define FALSE
For booleans.
#define UPPER
Use only upper part of matrix.
#define LADEL_FOR(index, M, col)
Loop through a column of a sparse matrix.
Constants and macros used in LADEL.
Routines to copy matrices and vectors.
Memory allocation routines.
ladel_sparse_matrix * ladel_sparse_alloc(ladel_int nrow, ladel_int ncol, ladel_int nzmax, ladel_int symmetry, ladel_int values, ladel_int nz)
Allocate a sparse matrix.
Definition: ladel_global.c:101
ladel_sparse_matrix * ladel_mat_diag_mat_transpose(const ladel_sparse_matrix *M, const ladel_sparse_matrix *M_transpose, const ladel_double *diag, ladel_work *work)
Computes .
Definition: ladel_matmat.c:17
ladel_sparse_matrix * ladel_mat_mat_transpose_pattern(const ladel_sparse_matrix *M, const ladel_sparse_matrix *M_transpose, ladel_work *work)
Computes the pattern of .
Definition: ladel_matmat.c:12
ladel_sparse_matrix * ladel_mat_mat_transpose(const ladel_sparse_matrix *M, const ladel_sparse_matrix *M_transpose, ladel_work *work)
Computes .
Definition: ladel_matmat.c:7
ladel_sparse_matrix * ladel_mat_mat_transpose_advanced(const ladel_sparse_matrix *M, const ladel_sparse_matrix *M_transpose, const ladel_double *diag, ladel_int values, ladel_work *work)
Core mat_mat_transpose function with all options (diag and value/pattern).
Definition: ladel_matmat.c:22
Routines to compute matrix matrix products. For now only and , with a diagonal matrix,...
Structures and types used in LADEL routines.
int64_t ladel_int
Type for integer numbers (default: int64_t)
Definition: ladel_types.h:24
double ladel_double
Type for floating point numbers (default: double)
Definition: ladel_types.h:20
Sparse matrix in compressed column storage.
Definition: ladel_types.h:35
ladel_int ncol
number of columns
Definition: ladel_types.h:38
ladel_double * x
numerical values (size nzmax)
Definition: ladel_types.h:42
ladel_int * p
column pointers (size ncol+1)
Definition: ladel_types.h:40
ladel_int values
has numerical values
Definition: ladel_types.h:45
ladel_int nrow
number of rows
Definition: ladel_types.h:37
ladel_int * i
row pointers (size nzmax)
Definition: ladel_types.h:41
Workspace required for various routines in LADEL.
Definition: ladel_types.h:109
ladel_int flag
Flag used to mark nodes, used in conjunction with array_int_ncol_flag.
Definition: ladel_types.h:121
ladel_int * array_int_ncol_flag
An array of ncol integers, assumed to be < flag.
Definition: ladel_types.h:120
ladel_double * array_double_all_zeros_ncol1
An array of ncol doubles, on input and output this should be all zeros.
Definition: ladel_types.h:122