Program listing for file numerics/src/tools/NumericsSparseMatrix.h#
Return to documentation for this file
1#ifndef NumericsSparseMatrix_H
2#define NumericsSparseMatrix_H
3
4
5
6#include <stdio.h>
7
8#include "CSparseMatrix.h"
9#include "NumericsDataVersion.h"
10#include "NumericsFwd.h"
11#include "SiconosConfig.h"
12
13
14typedef struct linalg_data_t {
15 int id;
16 void (*free_fn)(struct linalg_data_t*);
17} linalg_data_t;
18
19typedef enum { SN_LINALG_UNKNOWN, SN_LINALG_MKL } linalg_data_id;
20
21#if defined(__cplusplus) && !defined(BUILD_AS_CPP)
22extern "C" {
23#endif
24
25
26typedef enum {
27 NSM_CSPARSE,
28 NSM_MUMPS,
29 NSM_UMFPACK,
30 NSM_MKL_PARDISO,
31 NSM_SUPERLU,
32 NSM_SUPERLU_MT,
33 NSM_HSL
34} NSM_linear_solver;
35
36typedef void (*freeNSLSP)(void* p);
37
38
39typedef enum { NSM_CS_CSC = -1, NSM_CS_CSR = -2 } NumericsSparseTypesNZ;
40
41
42struct NSM_linear_solver_params {
43 NumericsMatrix* parent_matrix;
44 NSM_linear_solver solver;
45 NSM_linear_solver LDLT_solver;
46
47 void* linear_solver_data;
48 freeNSLSP solver_free_hook;
49
50 int* iWork;
51 int iWorkSize;
52 double* dWork;
53 int dWorkSize;
54
55 linalg_data_t* linalg_data;
56};
57
58
59typedef enum {
60 NSM_UNKNOWN,
61 NSM_TRIPLET,
62 NSM_CSC,
63 NSM_CSR,
64 NSM_HALF_TRIPLET
65} NumericsSparseOrigin;
66
67typedef NumericsSparseOrigin NSM_t;
68
69
70struct NumericsSparseMatrix {
71 CSparseMatrix* triplet;
72 CSparseMatrix* half_triplet;
73 CSparseMatrix* csc;
74 CSparseMatrix* trans_csc;
75 CSparseMatrix* csr;
76 CS_INT* diag_indx;
77 NSM_t origin;
78 NSM_linear_solver_params* linearSolverParams;
79
80
81 NumericsDataVersion versions[5];
82};
83
84
85void NSM_null(NumericsSparseMatrix* A);
86
87
88NumericsSparseMatrix* NSM_new(void);
89
90NumericsSparseMatrix* NSM_triplet_eye(unsigned int size);
91
92NumericsSparseMatrix* NSM_triplet_scalar(unsigned int size, double s);
93
94
95NumericsSparseMatrix* NSM_clear(NumericsSparseMatrix* A);
96
97
98void NSM_version_copy(const NumericsSparseMatrix* const A, NumericsSparseMatrix* B);
99
100
101void NSM_copy(NumericsSparseMatrix* A, NumericsSparseMatrix* B);
102
103
104void NSM_clear_p(void* p);
105
106
107double* NSM_data(NumericsSparseMatrix* A);
108
109
110static inline void* NSM_linear_solver_data(NSM_linear_solver_params* p) {
111 return p->linear_solver_data;
112}
113
114static inline double* NSM_workspace(NSM_linear_solver_params* p)
115
116{
117 return p->dWork;
118}
119
120
121size_t NSM_nnz(const CSparseMatrix* const A);
122
123
124CS_INT* NSM_diag_indices(NumericsMatrix* M);
125
126
127void NSM_extract_block(NumericsMatrix* M, double* blockM, size_t pos_row, size_t pos_col,
128 size_t block_row_size, size_t block_col_size);
129
130
131NSM_linear_solver_params* NSM_linearSolverParams_free(NSM_linear_solver_params* p);
132
133
134NSM_linear_solver_params* NSM_linearSolverParams_new(void);
135
136
137NSM_linear_solver_params* NSM_linearSolverParams(NumericsMatrix* A);
138
139
140void NSM_fix_csc(CSparseMatrix* A);
141
142void NSM_sort_csc(CSparseMatrix* A);
143
144
145unsigned NSM_origin(const NumericsSparseMatrix* M);
146
147
148CSparseMatrix* NSM_get_origin(const NumericsSparseMatrix* M);
149
150void NSM_write_in_file(const NumericsSparseMatrix* m, FILE* file);
151
152
153NumericsSparseMatrix* NSM_new_from_file(FILE* file);
154
155int NSM_to_dense(const NumericsSparseMatrix* const A, double* B);
156
157
158static inline version_t NSM_version(const NumericsSparseMatrix* M, NSM_t type) {
159 return NDV_value(&(M->versions[type]));
160}
161
162
163static inline NSM_t nsm_max(const NumericsSparseMatrix* M, NSM_t type1, NSM_t type2) {
164 return NSM_version(M, type2) > NSM_version(M, type1) ? type2 : type1;
165}
166
167
168static inline NSM_t NSM_latest_id(const NumericsSparseMatrix* M) {
169 assert(M);
170 return (nsm_max(M, nsm_max(M, nsm_max(M, NSM_TRIPLET, NSM_HALF_TRIPLET), NSM_CSC), NSM_CSR));
171}
172
173
174static inline version_t NSM_max_version(const NumericsSparseMatrix* M) {
175 return NSM_version(M, NSM_latest_id(M));
176}
177
178
179void NSM_set_version(NumericsSparseMatrix* M, NSM_t type, version_t value);
180
181
182void NSM_reset_versions(NumericsSparseMatrix* M);
183
184
185void NSM_reset_version(NumericsSparseMatrix* M, NSM_t type);
186
187
188void NSM_inc_version(NumericsSparseMatrix* M, NSM_t type);
189
190
191CSparseMatrix* NSM_latest(const NumericsSparseMatrix* M);
192
193
194static inline void NSM_version_sync(NumericsSparseMatrix* M) {
195 if (NSM_max_version(M) > 0) {
196 M->origin = NSM_latest_id(M);
197 assert(NSM_latest(M));
198 }
199}
200
201#if defined(__cplusplus) && !defined(BUILD_AS_CPP)
202}
203#endif
204
205#endif