3 #ifndef DUNE_ISTL_SUPERMATRIX_HH
4 #define DUNE_ISTL_SUPERMATRIX_HH
10 #include <dune/common/fmatrix.hh>
11 #include <dune/common/fvector.hh>
12 #include <dune/common/typetraits.hh>
34 static void create(SuperMatrix *
mat,
int n,
int m,
int offset,
35 float *values,
int *rowindex,
int* colindex,
36 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
38 sCreate_CompCol_Matrix(
mat, n, m, offset, values, rowindex, colindex,
44 struct SuperMatrixPrinter<float>
46 static void print(
char* name, SuperMatrix*
mat)
48 sPrint_CompCol_Matrix(name,
mat);
55 struct SuperMatrixCreateSparseChooser<double>
57 static void create(SuperMatrix *
mat,
int n,
int m,
int offset,
58 double *values,
int *rowindex,
int* colindex,
59 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
61 dCreate_CompCol_Matrix(
mat, n, m, offset, values, rowindex, colindex,
67 struct SuperMatrixPrinter<double>
69 static void print(
char* name, SuperMatrix*
mat)
71 dPrint_CompCol_Matrix(name,
mat);
78 struct SuperMatrixCreateSparseChooser<std::complex<float> >
80 static void create(SuperMatrix *
mat,
int n,
int m,
int offset,
81 std::complex<float> *values,
int *rowindex,
int* colindex,
82 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
84 cCreate_CompCol_Matrix(
mat, n, m, offset,
reinterpret_cast< ::complex*
>(values),
85 rowindex, colindex, stype, dtype, mtype);
90 struct SuperMatrixPrinter<std::complex<float> >
92 static void print(
char* name, SuperMatrix*
mat)
94 cPrint_CompCol_Matrix(name,
mat);
101 struct SuperMatrixCreateSparseChooser<std::complex<double> >
103 static void create(SuperMatrix *
mat,
int n,
int m,
int offset,
104 std::complex<double> *values,
int *rowindex,
int* colindex,
105 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
107 zCreate_CompCol_Matrix(
mat, n, m, offset,
reinterpret_cast<doublecomplex*
>(values),
108 rowindex, colindex, stype, dtype, mtype);
113 struct SuperMatrixPrinter<std::complex<double> >
115 static void print(
char* name, SuperMatrix*
mat)
117 zPrint_CompCol_Matrix(name,
mat);
134 std::is_same<T,float>::value ? SLU_S :
135 ( std::is_same<T,std::complex<double> >::value ? SLU_Z :
136 ( std::is_same<T,std::complex<float> >::value ? SLU_C : SLU_D ));
185 template<
class B,
class TA,
int n,
int m>
189 template<
class M,
class X,
class TM,
class TD,
class T1>
213 if (this->N_+this->M_*this->Nnz_ != 0)
218 operator SuperMatrix&()
224 operator const SuperMatrix&()
const
233 ::create(&A, this->N_, this->M_, this->colstart[this->N_],
234 this->values,this->rowindex, this->colstart, SLU_NC,
243 ::create(&A, this->N_, this->M_, this->colstart[this->N_],
244 this->values,this->rowindex, this->colstart, SLU_NC,
257 if(this->N_+this->M_+this->Nnz_!=0)
259 this->N_=mrs.size()*n;
260 this->M_=mrs.size()*m;
280 SUPERLU_FREE(A.Store);
286 template<
class T,
class A,
int n,
int m>
290 template<
class I,
class S,
class D>
307 ::create(&slumat->A, slumat->N_, slumat->M_, slumat->colstart[this->cols],
308 slumat->values,slumat->rowindex, slumat->colstart, SLU_NC,
315 #endif // HAVE_SUPERLU