Dune Core Modules (2.4.2)

superlu.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 #ifndef DUNE_ISTL_SUPERLU_HH
4 #define DUNE_ISTL_SUPERLU_HH
5 
6 #if HAVE_SUPERLU
7 #ifdef TRUE
8 #undef TRUE
9 #endif
10 #ifdef FALSE
11 #undef FALSE
12 #endif
13 #ifndef SUPERLU_NTYPE
14 #define SUPERLU_NTYPE 1
15 #endif
16 #ifdef SUPERLU_POST_2005_VERSION
17 
18 #if SUPERLU_NTYPE==0
19 #include "slu_sdefs.h"
20 #endif
21 
22 #if SUPERLU_NTYPE==1
23 #include "slu_ddefs.h"
24 #endif
25 
26 #if SUPERLU_NTYPE==2
27 #include "slu_cdefs.h"
28 #endif
29 
30 #if SUPERLU_NTYPE>=3
31 #include "slu_zdefs.h"
32 #endif
33 
34 #else
35 
36 #if SUPERLU_NTYPE==0
37 #include "ssp_defs.h"
38 #endif
39 
40 #if SUPERLU_NTYPE==1
41 #include "dsp_defs.h"
42 #warning Support for SuperLU older than SuperLU 3.0 from August 2005 is deprecated.
43 #endif
44 
45 #if SUPERLU_NTYPE==2
46 #include "csp_defs.h"
47 #endif
48 
49 #if SUPERLU_NTYPE>=3
50 #include "zsp_defs.h"
51 #endif
52 
53 #endif
54 #include "solvers.hh"
55 #include "supermatrix.hh"
56 #include <algorithm>
57 #include <functional>
58 #include "bcrsmatrix.hh"
59 #include "bvector.hh"
60 #include "istlexception.hh"
61 #include <dune/common/fmatrix.hh>
62 #include <dune/common/fvector.hh>
64 #include <dune/istl/solvertype.hh>
65 
66 namespace Dune
67 {
68 
79  template<class Matrix>
80  class SuperLU
81  {};
82 
83  template<class M, class T, class TM, class TD, class TA>
84  class SeqOverlappingSchwarz;
85 
86  template<class T, bool tag>
87  struct SeqOverlappingSchwarzAssemblerHelper;
88 
89  template<class T>
90  struct SuperLUSolveChooser
91  {};
92 
93  template<class T>
94  struct SuperLUDenseMatChooser
95  {};
96 
97  template<class T>
98  struct SuperLUQueryChooser
99  {};
100 
101  template<class T>
102  struct QuerySpaceChooser
103  {};
104 
105 #if SUPERLU_NTYPE==0
106  template<>
107  struct SuperLUDenseMatChooser<float>
108  {
109  static void create(SuperMatrix *mat, int n, int m, float *dat, int n1,
110  Stype_t stype, Dtype_t dtype, Mtype_t mtype)
111  {
112  sCreate_Dense_Matrix(mat, n, m, dat, n1, stype, dtype, mtype);
113 
114  }
115 
116  static void destroy(SuperMatrix*)
117  {}
118 
119  };
120  template<>
121  struct SuperLUSolveChooser<float>
122  {
123  static void solve(superlu_options_t *options, SuperMatrix *mat, int *perm_c, int *perm_r, int *etree,
124  char *equed, float *R, float *C, SuperMatrix *L, SuperMatrix *U,
125  void *work, int lwork, SuperMatrix *B, SuperMatrix *X,
126  float *rpg, float *rcond, float *ferr, float *berr,
127  mem_usage_t *memusage, SuperLUStat_t *stat, int *info)
128  {
129 #if SUPERLU_MIN_VERSION_5
130  GlobalLU_t gLU;
131  sgssvx(options, mat, perm_c, perm_r, etree, equed, R, C,
132  L, U, work, lwork, B, X, rpg, rcond, ferr, berr,
133  &gLU, memusage, stat, info);
134 #else
135  sgssvx(options, mat, perm_c, perm_r, etree, equed, R, C,
136  L, U, work, lwork, B, X, rpg, rcond, ferr, berr,
137  memusage, stat, info);
138 #endif
139  }
140  };
141 
142  template<>
143  struct QuerySpaceChooser<float>
144  {
145  static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t* memusage)
146  {
147  sQuerySpace(L,U,memusage);
148  }
149  };
150 
151 #endif
152 
153 #if SUPERLU_NTYPE==1
154 
155  template<>
156  struct SuperLUDenseMatChooser<double>
157  {
158  static void create(SuperMatrix *mat, int n, int m, double *dat, int n1,
159  Stype_t stype, Dtype_t dtype, Mtype_t mtype)
160  {
161  dCreate_Dense_Matrix(mat, n, m, dat, n1, stype, dtype, mtype);
162 
163  }
164 
165  static void destroy(SuperMatrix * /* mat */)
166  {}
167  };
168  template<>
169  struct SuperLUSolveChooser<double>
170  {
171  static void solve(superlu_options_t *options, SuperMatrix *mat, int *perm_c, int *perm_r, int *etree,
172  char *equed, double *R, double *C, SuperMatrix *L, SuperMatrix *U,
173  void *work, int lwork, SuperMatrix *B, SuperMatrix *X,
174  double *rpg, double *rcond, double *ferr, double *berr,
175  mem_usage_t *memusage, SuperLUStat_t *stat, int *info)
176  {
177 #if SUPERLU_MIN_VERSION_5
178  GlobalLU_t gLU;
179  dgssvx(options, mat, perm_c, perm_r, etree, equed, R, C,
180  L, U, work, lwork, B, X, rpg, rcond, ferr, berr,
181  &gLU, memusage, stat, info);
182 #else
183  dgssvx(options, mat, perm_c, perm_r, etree, equed, R, C,
184  L, U, work, lwork, B, X, rpg, rcond, ferr, berr,
185  memusage, stat, info);
186 #endif
187  }
188  };
189 
190  template<>
191  struct QuerySpaceChooser<double>
192  {
193  static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t* memusage)
194  {
195  dQuerySpace(L,U,memusage);
196  }
197  };
198 #endif
199 
200 #if SUPERLU_NTYPE>=3
201  template<>
202  struct SuperLUDenseMatChooser<std::complex<double> >
203  {
204  static void create(SuperMatrix *mat, int n, int m, std::complex<double> *dat, int n1,
205  Stype_t stype, Dtype_t dtype, Mtype_t mtype)
206  {
207  zCreate_Dense_Matrix(mat, n, m, reinterpret_cast<doublecomplex*>(dat), n1, stype, dtype, mtype);
208 
209  }
210 
211  static void destroy(SuperMatrix*)
212  {}
213  };
214 
215  template<>
216  struct SuperLUSolveChooser<std::complex<double> >
217  {
218  static void solve(superlu_options_t *options, SuperMatrix *mat, int *perm_c, int *perm_r, int *etree,
219  char *equed, double *R, double *C, SuperMatrix *L, SuperMatrix *U,
220  void *work, int lwork, SuperMatrix *B, SuperMatrix *X,
221  double *rpg, double *rcond, double *ferr, double *berr,
222  mem_usage_t *memusage, SuperLUStat_t *stat, int *info)
223  {
224 #if SUPERLU_MIN_VERSION_5
225  GlobalLU_t gLU;
226  zgssvx(options, mat, perm_c, perm_r, etree, equed, R, C,
227  L, U, work, lwork, B, X, rpg, rcond, ferr, berr,
228  &gLU, memusage, stat, info);
229 #else
230  zgssvx(options, mat, perm_c, perm_r, etree, equed, R, C,
231  L, U, work, lwork, B, X, rpg, rcond, ferr, berr,
232  memusage, stat, info);
233 #endif
234  }
235  };
236 
237  template<>
238  struct QuerySpaceChooser<std::complex<double> >
239  {
240  static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t* memusage)
241  {
242  zQuerySpace(L,U,memusage);
243  }
244  };
245 #endif
246 
247 #if SUPERLU_NTYPE==2
248  template<>
249  struct SuperLUDenseMatChooser<std::complex<float> >
250  {
251  static void create(SuperMatrix *mat, int n, int m, std::complex<float> *dat, int n1,
252  Stype_t stype, Dtype_t dtype, Mtype_t mtype)
253  {
254  cCreate_Dense_Matrix(mat, n, m, reinterpret_cast< ::complex*>(dat), n1, stype, dtype, mtype);
255 
256  }
257 
258  static void destroy(SuperMatrix* /* mat */)
259  {}
260  };
261 
262  template<>
263  struct SuperLUSolveChooser<std::complex<float> >
264  {
265  static void solve(superlu_options_t *options, SuperMatrix *mat, int *perm_c, int *perm_r, int *etree,
266  char *equed, float *R, float *C, SuperMatrix *L, SuperMatrix *U,
267  void *work, int lwork, SuperMatrix *B, SuperMatrix *X,
268  float *rpg, float *rcond, float *ferr, float *berr,
269  mem_usage_t *memusage, SuperLUStat_t *stat, int *info)
270  {
271 #if SUPERLU_MIN_VERSION_5
272  GlobalLU_t gLU;
273  cgssvx(options, mat, perm_c, perm_r, etree, equed, R, C,
274  L, U, work, lwork, B, X, rpg, rcond, ferr, berr,
275  &gLU, memusage, stat, info);
276 #else
277  cgssvx(options, mat, perm_c, perm_r, etree, equed, R, C,
278  L, U, work, lwork, B, X, rpg, rcond, ferr, berr,
279  memusage, stat, info);
280 #endif
281  }
282  };
283 
284  template<>
285  struct QuerySpaceChooser<std::complex<float> >
286  {
287  static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t* memusage)
288  {
289  cQuerySpace(L,U,memusage);
290  }
291  };
292 #endif
293 
307  template<typename T, typename A, int n, int m>
308  class SuperLU<BCRSMatrix<FieldMatrix<T,n,m>,A > >
309  : public InverseOperator<
310  BlockVector<FieldVector<T,m>,
311  typename A::template rebind<FieldVector<T,m> >::other>,
312  BlockVector<FieldVector<T,n>,
313  typename A::template rebind<FieldVector<T,n> >::other> >
314  {
315  public:
322  typedef SuperMatrixInitializer<BCRSMatrix<FieldMatrix<T,n,m>,A> > MatrixInitializer;
324  typedef Dune::BlockVector<
326  typename A::template rebind<FieldVector<T,m> >::other> domain_type;
328  typedef Dune::BlockVector<
330  typename A::template rebind<FieldVector<T,n> >::other> range_type;
345  explicit SuperLU(const Matrix& mat, bool verbose=false,
346  bool reusevector=true);
353  SuperLU();
354 
355  ~SuperLU();
356 
360  void apply(domain_type& x, range_type& b, InverseOperatorResult& res);
361 
365  void apply (domain_type& x, range_type& b, double reduction, InverseOperatorResult& res)
366  {
367  DUNE_UNUSED_PARAMETER(reduction);
368  apply(x,b,res);
369  }
370 
374  void apply(T* x, T* b);
375 
377  void setMatrix(const Matrix& mat);
378 
379  typename SuperLUMatrix::size_type nnz() const
380  {
381  return mat.nnz();
382  }
383 
384  template<class S>
385  void setSubMatrix(const Matrix& mat, const S& rowIndexSet);
386 
387  void setVerbosity(bool v);
388 
393  void free();
394 
395  const char* name() { return "SuperLU"; }
396  private:
397  friend class std::mem_fun_ref_t<void,SuperLU>;
398  template<class M,class X, class TM, class TD, class T1>
399  friend class SeqOverlappingSchwarz;
400  friend struct SeqOverlappingSchwarzAssemblerHelper<SuperLU<Matrix>,true>;
401 
402  SuperLUMatrix& getInternalMatrix() { return mat; }
403 
405  void decompose();
406 
407  SuperLUMatrix mat;
408  SuperMatrix L, U, B, X;
409  int *perm_c, *perm_r, *etree;
410  typename GetSuperLUType<T>::float_type *R, *C;
411  T *bstore;
412  superlu_options_t options;
413  char equed;
414  void *work;
415  int lwork;
416  bool first, verbose, reusevector;
417  };
418 
419  template<typename T, typename A, int n, int m>
420  SuperLU<BCRSMatrix<FieldMatrix<T,n,m>,A> >
421  ::~SuperLU()
422  {
423  if(mat.N()+mat.M()>0)
424  free();
425  }
426 
427  template<typename T, typename A, int n, int m>
428  void SuperLU<BCRSMatrix<FieldMatrix<T,n,m>,A> >::free()
429  {
430  delete[] perm_c;
431  delete[] perm_r;
432  delete[] etree;
433  delete[] R;
434  delete[] C;
435  if(lwork>=0) {
436  Destroy_SuperNode_Matrix(&L);
437  Destroy_CompCol_Matrix(&U);
438  }
439  lwork=0;
440  if(!first && reusevector) {
441  SUPERLU_FREE(B.Store);
442  SUPERLU_FREE(X.Store);
443  }
444  mat.free();
445  }
446 
447  template<typename T, typename A, int n, int m>
448  SuperLU<BCRSMatrix<FieldMatrix<T,n,m>,A> >
449  ::SuperLU(const Matrix& mat_, bool verbose_, bool reusevector_)
450  : work(0), lwork(0), first(true), verbose(verbose_),
451  reusevector(reusevector_)
452  {
453  setMatrix(mat_);
454 
455  }
456  template<typename T, typename A, int n, int m>
457  SuperLU<BCRSMatrix<FieldMatrix<T,n,m>,A> >::SuperLU()
458  : work(0), lwork(0),verbose(false),
459  reusevector(false)
460  {}
461  template<typename T, typename A, int n, int m>
462  void SuperLU<BCRSMatrix<FieldMatrix<T,n,m>,A> >::setVerbosity(bool v)
463  {
464  verbose=v;
465  }
466 
467  template<typename T, typename A, int n, int m>
468  void SuperLU<BCRSMatrix<FieldMatrix<T,n,m>,A> >::setMatrix(const Matrix& mat_)
469  {
470  if(mat.N()+mat.M()>0) {
471  free();
472  }
473  lwork=0;
474  work=0;
475  //a=&mat_;
476  mat=mat_;
477  decompose();
478  }
479 
480  template<typename T, typename A, int n, int m>
481  template<class S>
482  void SuperLU<BCRSMatrix<FieldMatrix<T,n,m>,A> >::setSubMatrix(const Matrix& mat_,
483  const S& mrs)
484  {
485  if(mat.N()+mat.M()>0) {
486  free();
487  }
488  lwork=0;
489  work=0;
490  //a=&mat_;
491  mat.setMatrix(mat_,mrs);
492  decompose();
493  }
494 
495  template<typename T, typename A, int n, int m>
496  void SuperLU<BCRSMatrix<FieldMatrix<T,n,m>,A> >::decompose()
497  {
498 
499  first = true;
500  perm_c = new int[mat.M()];
501  perm_r = new int[mat.N()];
502  etree = new int[mat.M()];
503  R = new typename GetSuperLUType<T>::float_type[mat.N()];
504  C = new typename GetSuperLUType<T>::float_type[mat.M()];
505 
506  set_default_options(&options);
507  // Do the factorization
508  B.ncol=0;
509  B.Stype=SLU_DN;
510  B.Dtype=GetSuperLUType<T>::type;
511  B.Mtype= SLU_GE;
512  DNformat fakeFormat;
513  fakeFormat.lda=mat.N();
514  B.Store=&fakeFormat;
515  X.Stype=SLU_DN;
516  X.Dtype=GetSuperLUType<T>::type;
517  X.Mtype= SLU_GE;
518  X.ncol=0;
519  X.Store=&fakeFormat;
520 
521  typename GetSuperLUType<T>::float_type rpg, rcond, ferr=1e10, berr=1e10;
522  int info;
523  mem_usage_t memusage;
524  SuperLUStat_t stat;
525 
526  StatInit(&stat);
527  SuperLUSolveChooser<T>::solve(&options, &static_cast<SuperMatrix&>(mat), perm_c, perm_r, etree, &equed, R, C,
528  &L, &U, work, lwork, &B, &X, &rpg, &rcond, &ferr,
529  &berr, &memusage, &stat, &info);
530 
531  if(verbose) {
532  dinfo<<"LU factorization: dgssvx() returns info "<< info<<std::endl;
533 
534  if ( info == 0 || info == n+1 ) {
535 
536  if ( options.PivotGrowth )
537  dinfo<<"Recip. pivot growth = "<<rpg<<std::endl;
538  if ( options.ConditionNumber )
539  dinfo<<"Recip. condition number = %e\n"<< rcond<<std::endl;
540  SCformat* Lstore = (SCformat *) L.Store;
541  NCformat* Ustore = (NCformat *) U.Store;
542  dinfo<<"No of nonzeros in factor L = "<< Lstore->nnz<<std::endl;
543  dinfo<<"No of nonzeros in factor U = "<< Ustore->nnz<<std::endl;
544  dinfo<<"No of nonzeros in L+U = "<< Lstore->nnz + Ustore->nnz - n<<std::endl;
545  QuerySpaceChooser<T>::querySpace(&L, &U, &memusage);
546  dinfo<<"L\\U MB "<<memusage.for_lu/1e6<<" \ttotal MB needed "<<memusage.total_needed/1e6
547  <<" \texpansions ";
548 
549 #ifdef HAVE_MEM_USAGE_T_EXPANSIONS
550  std::cout<<memusage.expansions<<std::endl;
551 #else
552  std::cout<<stat.expansions<<std::endl;
553 #endif
554  } else if ( info > 0 && lwork == -1 ) {
555  dinfo<<"** Estimated memory: "<< info - n<<std::endl;
556  }
557  if ( options.PrintStat ) StatPrint(&stat);
558  }
559  StatFree(&stat);
560  /*
561  NCformat* Ustore = (NCformat *) U.Store;
562  int k=0;
563  dPrint_CompCol_Matrix("U", &U);
564  for(int i=0; i < U.ncol; ++i, ++k){
565  std::cout<<i<<": ";
566  for(int c=Ustore->colptr[i]; c < Ustore->colptr[i+1]; ++c)
567  //if(Ustore->rowind[c]==i)
568  std::cout<<Ustore->rowind[c]<<"->"<<((double*)Ustore->nzval)[c]<<" ";
569  if(k==0){
570  //
571  k=-1;
572  }std::cout<<std::endl;
573  }
574  dPrint_SuperNode_Matrix("L", &L);
575  for(int i=0; i < U.ncol; ++i, ++k){
576  std::cout<<i<<": ";
577  for(int c=Ustore->colptr[i]; c < Ustore->colptr[i+1]; ++c)
578  //if(Ustore->rowind[c]==i)
579  std::cout<<Ustore->rowind[c]<<"->"<<((double*)Ustore->nzval)[c]<<" ";
580  if(k==0){
581  //
582  k=-1;
583  }std::cout<<std::endl;
584  } */
585  options.Fact = FACTORED;
586  }
587 
588  template<typename T, typename A, int n, int m>
589  void SuperLU<BCRSMatrix<FieldMatrix<T,n,m>,A> >
591  {
592  if (mat.N() != b.dim())
593  DUNE_THROW(ISTLError, "Size of right-hand-side vector b does not match the number of matrix rows!");
594  if (mat.M() != x.dim())
595  DUNE_THROW(ISTLError, "Size of solution vector x does not match the number of matrix columns!");
596  if (mat.M()+mat.N()==0)
597  DUNE_THROW(ISTLError, "Matrix of SuperLU is null!");
598 
599  SuperMatrix* mB = &B;
600  SuperMatrix* mX = &X;
601  SuperMatrix rB, rX;
602  if (reusevector) {
603  if(first) {
604  SuperLUDenseMatChooser<T>::create(&B, (int)mat.N(), 1, reinterpret_cast<T*>(&b[0]), (int)mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
605  SuperLUDenseMatChooser<T>::create(&X, (int)mat.N(), 1, reinterpret_cast<T*>(&x[0]), (int)mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
606  first=false;
607  }else{
608  ((DNformat*)B.Store)->nzval=&b[0];
609  ((DNformat*)X.Store)->nzval=&x[0];
610  }
611  } else {
612  SuperLUDenseMatChooser<T>::create(&rB, (int)mat.N(), 1, reinterpret_cast<T*>(&b[0]), (int)mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
613  SuperLUDenseMatChooser<T>::create(&rX, (int)mat.N(), 1, reinterpret_cast<T*>(&x[0]), (int)mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
614  mB = &rB;
615  mX = &rX;
616  }
617  typename GetSuperLUType<T>::float_type rpg, rcond, ferr=1e10, berr;
618  int info;
619  mem_usage_t memusage;
620  SuperLUStat_t stat;
621  /* Initialize the statistics variables. */
622  StatInit(&stat);
623  /*
624  range_type d=b;
625  a->usmv(-1, x, d);
626 
627  double def0=d.two_norm();
628  */
629 #ifdef SUPERLU_MIN_VERSION_4_3
630  options.IterRefine=SLU_DOUBLE;
631 #else
632  options.IterRefine=DOUBLE;
633 #endif
634 
635  SuperLUSolveChooser<T>::solve(&options, &static_cast<SuperMatrix&>(mat), perm_c, perm_r, etree, &equed, R, C,
636  &L, &U, work, lwork, mB, mX, &rpg, &rcond, &ferr, &berr,
637  &memusage, &stat, &info);
638 
639  res.iterations=1;
640 
641  /*
642  if(options.Equil==YES)
643  // undo scaling of right hand side
644  std::transform(reinterpret_cast<T*>(&b[0]),reinterpret_cast<T*>(&b[0])+mat.M(),
645  C, reinterpret_cast<T*>(&d[0]), std::divides<T>());
646  else
647  d=b;
648  a->usmv(-1, x, d);
649  res.reduction=d.two_norm()/def0;
650  res.conv_rate = res.reduction;
651  res.converged=(res.reduction<1e-10||d.two_norm()<1e-18);
652  */
653  res.converged=true;
654 
655  if(verbose) {
656 
657  dinfo<<"Triangular solve: dgssvx() returns info "<< info<<std::endl;
658 
659  if ( info == 0 || info == n+1 ) {
660 
661  if ( options.IterRefine ) {
662  std::cout<<"Iterative Refinement: steps="
663  <<stat.RefineSteps<<" FERR="<<ferr<<" BERR="<<berr<<std::endl;
664  }else
665  std::cout<<" FERR="<<ferr<<" BERR="<<berr<<std::endl;
666  } else if ( info > 0 && lwork == -1 ) {
667  std::cout<<"** Estimated memory: "<< info - n<<" bytes"<<std::endl;
668  }
669 
670  if ( options.PrintStat ) StatPrint(&stat);
671  }
672  StatFree(&stat);
673  if (!reusevector) {
674  SUPERLU_FREE(rB.Store);
675  SUPERLU_FREE(rX.Store);
676  }
677  }
678 
679  template<typename T, typename A, int n, int m>
680  void SuperLU<BCRSMatrix<FieldMatrix<T,n,m>,A> >
681  ::apply(T* x, T* b)
682  {
683  if(mat.N()+mat.M()==0)
684  DUNE_THROW(ISTLError, "Matrix of SuperLU is null!");
685 
686  SuperMatrix* mB = &B;
687  SuperMatrix* mX = &X;
688  SuperMatrix rB, rX;
689  if (reusevector) {
690  if(first) {
691  SuperLUDenseMatChooser<T>::create(&B, mat.N(), 1, b, mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
692  SuperLUDenseMatChooser<T>::create(&X, mat.N(), 1, x, mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
693  first=false;
694  }else{
695  ((DNformat*) B.Store)->nzval=b;
696  ((DNformat*)X.Store)->nzval=x;
697  }
698  } else {
699  SuperLUDenseMatChooser<T>::create(&rB, mat.N(), 1, b, mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
700  SuperLUDenseMatChooser<T>::create(&rX, mat.N(), 1, x, mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
701  mB = &rB;
702  mX = &rX;
703  }
704 
705  typename GetSuperLUType<T>::float_type rpg, rcond, ferr=1e10, berr;
706  int info;
707  mem_usage_t memusage;
708  SuperLUStat_t stat;
709  /* Initialize the statistics variables. */
710  StatInit(&stat);
711 
712 #ifdef SUPERLU_MIN_VERSION_4_3
713  options.IterRefine=SLU_DOUBLE;
714 #else
715  options.IterRefine=DOUBLE;
716 #endif
717 
718  SuperLUSolveChooser<T>::solve(&options, &static_cast<SuperMatrix&>(mat), perm_c, perm_r, etree, &equed, R, C,
719  &L, &U, work, lwork, mB, mX, &rpg, &rcond, &ferr, &berr,
720  &memusage, &stat, &info);
721 
722  if(verbose) {
723  dinfo<<"Triangular solve: dgssvx() returns info "<< info<<std::endl;
724 
725  if ( info == 0 || info == n+1 ) {
726 
727  if ( options.IterRefine ) {
728  dinfo<<"Iterative Refinement: steps="
729  <<stat.RefineSteps<<" FERR="<<ferr<<" BERR="<<berr<<std::endl;
730  }else
731  dinfo<<" FERR="<<ferr<<" BERR="<<berr<<std::endl;
732  } else if ( info > 0 && lwork == -1 ) {
733  dinfo<<"** Estimated memory: "<< info - n<<" bytes"<<std::endl;
734  }
735  if ( options.PrintStat ) StatPrint(&stat);
736  }
737 
738  StatFree(&stat);
739  if (!reusevector) {
740  SUPERLU_FREE(rB.Store);
741  SUPERLU_FREE(rX.Store);
742  }
743  }
746  template<typename T, typename A, int n, int m>
747  struct IsDirectSolver<SuperLU<BCRSMatrix<FieldMatrix<T,n,m>,A> > >
748  {
749  enum { value=true};
750  };
751 
752  template<typename T, typename A, int n, int m>
753  struct StoresColumnCompressed<SuperLU<BCRSMatrix<FieldMatrix<T,n,m>,A> > >
754  {
755  enum { value = true };
756  };
757 }
758 
759 // undefine macros from SuperLU's slu_util.h
760 #undef FIRSTCOL_OF_SNODE
761 #undef NO_MARKER
762 #undef NUM_TEMPV
763 #undef USER_ABORT
764 #undef USER_MALLOC
765 #undef SUPERLU_MALLOC
766 #undef USER_FREE
767 #undef SUPERLU_FREE
768 #undef CHECK_MALLOC
769 #undef SUPERLU_MAX
770 #undef SUPERLU_MIN
771 #undef L_SUB_START
772 #undef L_SUB
773 #undef L_NZ_START
774 #undef L_FST_SUPC
775 #undef U_NZ_START
776 #undef U_SUB
777 #undef TRUE
778 #undef FALSE
779 #undef EMPTY
780 #undef NODROP
781 #undef DROP_BASIC
782 #undef DROP_PROWS
783 #undef DROP_COLUMN
784 #undef DROP_AREA
785 #undef DROP_SECONDARY
786 #undef DROP_DYNAMIC
787 #undef DROP_INTERP
788 #undef MILU_ALPHA
789 
790 #endif // HAVE_SUPERLU
791 #endif // DUNE_SUPERLU_HH
Implementation of the BCRSMatrix class.
This file implements a vector space as a tensor product of a given vector space. The number of compon...
A sparse block matrix with compressed row storage.
Definition: bcrsmatrix.hh:413
A vector of blocks with memory management.
Definition: bvector.hh:253
A dense n x m matrix.
Definition: fmatrix.hh:67
vector space out of a tensor product of fields.
Definition: fvector.hh:94
derive error class from the base class in common
Definition: istlexception.hh:16
Abstract base class for all solvers.
Definition: solver.hh:79
A generic dynamic dense matrix.
Definition: matrix.hh:25
size_type M() const
Return the number of columns.
Definition: matrix.hh:165
size_type N() const
Return the number of rows.
Definition: matrix.hh:160
Dune::BlockVector< FieldVector< T, n >, typename A::template rebind< FieldVector< T, n > >::other > range_type
The type of the range of the solver.
Definition: superlu.hh:330
Dune::SuperLUMatrix< Matrix > SuperLUMatrix
The corresponding SuperLU Matrix type.
Definition: superlu.hh:320
Dune::BlockVector< FieldVector< T, m >, typename A::template rebind< FieldVector< T, m > >::other > domain_type
The type of the domain of the solver.
Definition: superlu.hh:326
void apply(domain_type &x, range_type &b, double reduction, InverseOperatorResult &res)
apply inverse operator, with given convergence criteria.
Definition: superlu.hh:365
SuperMatrixInitializer< BCRSMatrix< FieldMatrix< T, n, m >, A > > MatrixInitializer
Type of an associated initializer class.
Definition: superlu.hh:322
size_type dim() const
dimension of the vector space
Definition: bvector.hh:223
Implements a matrix constructed from a given type representing a field and compile-time given number ...
Implements a vector constructed from a given type representing a field and a compile-time given size.
#define DUNE_THROW(E, m)
Definition: exceptions.hh:243
DInfoType dinfo(std::cout)
Stream for informative output.
Definition: stdstreams.hh:138
Dune namespace.
Definition: alignment.hh:10
Implementations of the inverse operator interface.
Templates characterizing the type of a solver.
Standard Dune debug streams.
Statistics about the application of an inverse operator.
Definition: solver.hh:32
int iterations
Number of iterations.
Definition: solver.hh:50
bool converged
True if convergence criterion has been met.
Definition: solver.hh:56
#define DUNE_UNUSED_PARAMETER(parm)
A macro to mark intentional unused function parameters with.
Definition: unused.hh:18
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (May 16, 22:29, 2024)