Program listing for file numerics/src/tools/NumericsSparseMatrix.h

Program listing for file numerics/src/tools/NumericsSparseMatrix.h#

  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