1 #ifndef SUPERMATRIX_MUMPS_HPP 2 #define SUPERMATRIX_MUMPS_HPP 5 #include "parallel.hpp" 6 #include "supermatrix.hpp" 11 struct sparse_matrix_t{
20 const int SPARSE_MATRIX_TYPE_GENERAL = 0;
21 const int SPARSE_OPERATION_NON_TRANSPOSE = 0;
27 const int SPARSE_INDEX_BASE_ZERO = 0;
28 const int SPARSE_INDEX_BASE_ONE = 1;
30 void mkl_sparse_z_create_coo(sparse_matrix_t*,
int,
int,
int,
int,
const int*,
const int*,complex*);
31 void mkl_sparse_destroy(sparse_matrix_t&);
32 void mkl_sparse_z_mv(
int,complex,sparse_matrix_t,
const matrix_descr&,
const complex*,complex,complex*);
43 mkl::sparse_matrix_t pointer;
50 mkl_sparse_destroy(pointer);
54 typedef std::vector<std::pair<int,complex> > Multiplier_column_data;
56 typedef std::vector<Multiplier_column_data> Multiplier_data;
60 size_t nnz()
const{
return 0;};
64 std::unique_ptr<Multiplier_data> data;
68 std::unique_ptr<Multiplier_data>);
72 fail(
"Insert not valid in Multiplier Phase!\n");};
74 fail(
"Add not valid in Multiplier Phase!\n");};
76 fail(
"Get not valid in Multiplier Phase!\n");
return complex(0.,0.);};
78 void addmyselfto(
Matrix&)
const{
79 fail(
"Matrix Add not valid in Multiplier Phase!\n");
87 p_const_iterator_factory provide_const_iterator()
const{
91 void Apply(
const complex* phi,
92 complex* result)
const;
93 void Apply( complex* result)
const;
94 void Output(std::ostream& os)
const;
95 void obtain_Diagonal(complex* diag);
97 std::unique_ptr<super_Matrix_strategy> deep_copy(
98 STD_TR1::shared_ptr<super_Matrix> new_mat
99 )
const { fail(
"Multiplier Matrix cannot be cloned");
100 return std::unique_ptr<super_Matrix_strategy>(
104 status my_status()
const{
return Multiply;};
110 std::shared_ptr<mklMultiplier_data> data;
115 size_t nnz()
const{
return data->nnz;};
119 const complex* get_raw_storage()
const {
return &(data->values[0]);};
120 complex* get_modifiable_raw_storage(){
return &(data->values[0]);};
122 const int* get_row_data()
const {
return &(data->irn[0]);};
123 const int* get_col_data()
const {
return &(data->jcn[0]);};
125 int* get_modifiable_row_data() {
return &(data->irn[0]);};
126 int* get_modifiable_col_data() {
return &(data->jcn[0]);};
131 std::shared_ptr<const mklMultiplier_data> data;
136 size_t nnz()
const{
return data->nnz;};
140 const complex* get_raw_storage()
const {
return &(data->values[0]);};
142 const int* get_row_data()
const {
return &(data->irn[0]);};
143 const int* get_col_data()
const {
return &(data->jcn[0]);};
147 std::shared_ptr<mklMultiplier_data> data;
153 std::unique_ptr<mklMultiplier_data>);
157 fail(
"Insert not valid in Multiplier Phase!\n");};
159 fail(
"Add not valid in Multiplier Phase!\n");};
161 fail(
"Get not valid in Multiplier Phase!\n");
return complex(0.,0.);};
163 void addmyselfto(
Matrix&)
const{
164 fail(
"Matrix Add not valid in Multiplier Phase!\n");
172 p_const_iterator_factory provide_const_iterator()
const {
176 void Apply(
const complex* phi,
177 complex* result)
const;
178 void Apply( complex* result)
const;
179 void Output(std::ostream& os)
const;
180 void obtain_Diagonal(complex* diag);
182 std::unique_ptr<super_Matrix_strategy> deep_copy(
183 STD_TR1::shared_ptr<super_Matrix> new_mat
184 )
const { fail(
"Multiplier Matrix cannot be cloned");
185 return std::unique_ptr<super_Matrix_strategy>(
189 status my_status()
const{
return Multiply;};
196 std::vector<int> irn;
197 std::vector<int> jcn;
202 std::unique_ptr<MUMPS_matrix> mp;
207 std::unique_ptr<MUMPS_matrix>);
210 bool is_distributed()
const {
return distributed;};
215 p_const_iterator_factory provide_const_iterator()
const{
219 void addmyselfto(
Matrix&)
const{
220 fail(
"Matrix Add not valid in Baked Phase!\n");
227 void obtain_Diagonal(complex* diag);
231 void Apply(
const complex* phi,
232 complex* result)
const;
233 void Apply( complex* result)
const;
234 void Output(std::ostream& os)
const;
236 std::unique_ptr<super_Matrix_strategy> deep_copy(
237 STD_TR1::shared_ptr<super_Matrix> new_mat
240 status my_status()
const{
return Baked;};
242 std::unique_ptr<MUMPS_matrix> release();
249 std::unique_ptr<MUMPS_matrix> mp;
251 std::unique_ptr<MUMPS_pimpl> id;
258 std::unique_ptr<MUMPS_matrix>);
265 p_const_iterator_factory provide_const_iterator()
const{
270 fail(
"Insert not valid in Factorized Phase!\n");};
272 fail(
"Add not valid in Factorized Phase!\n");};
274 fail(
"Get not valid in Factorized Phase!\n");
return complex(0.,0.);};
276 fail(
"Scale not valid in Factorized Phase!\n");};
278 void addmyselfto(
Matrix&)
const{
279 fail(
"Matrix Add not valid in Factorized Phase!\n");
282 bool is_distributed()
const {
return distributed;};
284 void obtain_Diagonal(complex* diag);
286 void SolveDiagonal();
288 void Apply(
const complex* phi,
289 complex* result)
const;
290 void Apply( complex* result)
const;
291 void Output(std::ostream& os)
const {
292 fail(
"Output not valid in Factorized Phase!\n");};
294 status my_status()
const{
return Factorized_dist;};
296 std::unique_ptr<super_Matrix_strategy> deep_copy(
297 STD_TR1::shared_ptr<super_Matrix> new_mat
298 )
const { fail(
"Factorized Matrix cannot be cloned");
299 return std::unique_ptr<super_Matrix_strategy>(
306 static std::unique_ptr<MUMPS_matrix > get_fact(MPI_Comm,
const super_Matrix_SetUp&,
bool);
307 static std::unique_ptr<Multiplier_data > get_mult(MPI_Comm,
const super_Matrix_SetUp&);
308 static std::unique_ptr<mklMultiplier_data > get_mkl_mult(MPI_Comm,
const super_Matrix_SetUp&);
p_iterator_factory provide_iterator()
Return an iterator factory over matrix elements.
Definition: supermatrix_MUMPS.hpp:84
Definition: supermatrix_MUMPS.cpp:63
Definition: supermatrix_MUMPS.hpp:304
Definition: supermatrix.hpp:18
Definition: supermatrix_MUMPS.hpp:146
General interface to inversion of large, sparse Matrices.
Definition: supermatrix.hpp:106
Definition: minimize.hpp:10
Definition: supermatrix_MUMPS.hpp:109
Definition: supermatrix_MUMPS.hpp:247
Definition: supermatrix.hpp:209
Base Matrix class for access to 2D number grids.
Definition: matrix.hpp:82
Definition: supermatrix_MUMPS.hpp:130
p_iterator_factory provide_iterator()
Return an iterator factory over matrix elements.
Definition: supermatrix_MUMPS.hpp:262
Definition: supermatrix_MUMPS.hpp:63
p_iterator_factory provide_iterator()
Return an iterator factory over matrix elements.
Definition: supermatrix_MUMPS.hpp:169
Definition: supermatrix_MUMPS.hpp:37
Definition: supermatrix_MUMPS.hpp:200
Definition: supermatrix_MUMPS.hpp:58
Definition: supermatrix.hpp:23
p_iterator_factory provide_iterator()
Return an iterator factory over matrix elements.
Definition: supermatrix_MUMPS.hpp:212
Definition: supermatrix_MUMPS.hpp:193