UmfPack.cxx
1 // Copyright (C) 2003-2009 Marc DuruflĂ©
2 //
3 // This file is part of the linear-algebra library Seldon,
4 // http://seldon.sourceforge.net/.
5 //
6 // Seldon is free software; you can redistribute it and/or modify it under the
7 // terms of the GNU Lesser General Public License as published by the Free
8 // Software Foundation; either version 2.1 of the License, or (at your option)
9 // any later version.
10 //
11 // Seldon is distributed in the hope that it will be useful, but WITHOUT ANY
12 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13 // FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
14 // more details.
15 //
16 // You should have received a copy of the GNU Lesser General Public License
17 // along with Seldon. If not, see http://www.gnu.org/licenses/.
18 
19 
20 #ifndef SELDON_FILE_UMFPACK_CXX
21 
22 #include "UmfPack.hxx"
23 
24 namespace Seldon
25 {
26 
28  template<class T>
30  {
31  Symbolic = NULL;
32  Numeric = NULL;
33  n = 0;
34 
35  // allocation of arrays Control and Info
36  Control.Reallocate(UMFPACK_CONTROL);
37  Info.Reallocate(UMFPACK_INFO);
38  Control.Zero();
39  Info.Zero();
40 
41  print_level = -1;
42  transpose = false;
43  status_facto = 0;
44  }
45 
46 
48  template<class T>
50  {
51  print_level = -1;
52  Control(UMFPACK_PRL) = 0;
53  }
54 
55 
57  template<class T>
59  {
60  print_level = 1;
61  Control(UMFPACK_PRL) = 2;
62  }
63 
64 
65  template<class T>
67  {
68  print_level = 2;
69  }
70 
71 
72  template<class T>
73  bool MatrixUmfPack_Base<T>::UseInteger8() const
74  {
75  if (sizeof(umfpack_int_t) == 8)
76  return true;
77 
78  return false;
79  }
80 
81 
82  template<class T>
83  int MatrixUmfPack_Base<T>::GetInfoFactorization() const
84  {
85  return status_facto;
86  }
87 
88 
89  template<class T>
90  size_t MatrixUmfPack_Base<T>::GetMemorySize() const
91  {
92  if (this->n > 0)
93  {
94  size_t size_mem = (this->Info(UMFPACK_SYMBOLIC_SIZE)
95  + this->Info(UMFPACK_NUMERIC_SIZE_ESTIMATE))
96  *size_t(this->Info(UMFPACK_SIZE_OF_UNIT));
97 
98  return size_mem;
99  }
100 
101  return 0;
102  }
103 
104 
105  template<class T>
107  {
108  Control(UMFPACK_ORDERING) = type;
109  }
110 
111 
112  template<class T>
113  void MatrixUmfPack_Base<T>::SetPermutation(const IVect& permut)
114  {
115  throw Undefined("MatrixUmfPack_Base::SetPermutation(const Vector&)");
116  }
117 
118 
121  {
122  ptr_ = NULL;
123  ind_ = NULL;
124  data_ = NULL;
125 #ifdef UMFPACK_INTSIZE64
126  umfpack_dl_defaults(this->Control.GetData());
127 #else
128  umfpack_di_defaults(this->Control.GetData());
129 #endif
130  this->HideMessages();
131  }
132 
133 
136  : MatrixUmfPack_Base<complex<double> >()
137  {
138  ptr_ = NULL;
139  ind_ = NULL;
140  data_real_ = NULL;
141  data_imag_ = NULL;
142 #ifdef UMFPACK_INTSIZE64
143  umfpack_zl_defaults(this->Control.GetData());
144 #else
145  umfpack_zi_defaults(this->Control.GetData());
146 #endif
147  this->HideMessages();
148  }
149 
150 
153  {
154  Clear();
155  }
156 
157 
160  {
162  allocator AllocatorInt;
163 
165  allocator Allocator;
166 
167  if (this->n > 0)
168  {
169  // memory used for matrix is released
170  AllocatorInt::deallocate(ptr_, this->n+1);
171  AllocatorInt::deallocate(ind_, this->n+1);
172  Allocator::deallocate(data_, this->n+1);
173 
174  // memory for numbering scheme is released
175 #ifdef UMFPACK_INTSIZE64
176  umfpack_dl_free_symbolic(&this->Symbolic) ;
177 #else
178  umfpack_di_free_symbolic(&this->Symbolic) ;
179 #endif
180 
181  // memory used by LU factorization is released
182 #ifdef UMFPACK_INTSIZE64
183  umfpack_dl_free_numeric(&this->Numeric) ;
184 #else
185  umfpack_di_free_numeric(&this->Numeric) ;
186 #endif
187 
188  this->n = 0;
189  this->Symbolic = NULL;
190  this->Numeric = NULL;
191  ptr_ = NULL;
192  ind_ = NULL;
193  data_ = NULL;
194  }
195  }
196 
197 
199  MatrixUmfPack<complex<double> >::~MatrixUmfPack()
200  {
201  Clear();
202  }
203 
204 
207  {
209  allocator AllocatorInt;
210 
212  allocator Allocator;
213 
214  if (this->n > 0)
215  {
216  // memory used for matrix is released
217  AllocatorInt::deallocate(ptr_, this->n+1);
218  AllocatorInt::deallocate(ind_, this->n+1);
219  Allocator::deallocate(data_real_, this->n+1);
220  Allocator::deallocate(data_imag_, this->n+1);
221 
222  // memory for numbering scheme is released
223 #ifdef UMFPACK_INTSIZE64
224  umfpack_zl_free_symbolic(&this->Symbolic) ;
225 #else
226  umfpack_zi_free_symbolic(&this->Symbolic) ;
227 #endif
228 
229  // memory used by LU factorization is released
230 #ifdef UMFPACK_INTSIZE64
231  umfpack_zl_free_numeric(&this->Numeric) ;
232 #else
233  umfpack_zi_free_numeric(&this->Numeric) ;
234 #endif
235 
236  this->n = 0;
237  this->Symbolic = NULL;
238  this->Numeric = NULL;
239 
240  ptr_ = NULL;
241  ind_ = NULL;
242  data_real_ = NULL;
243  data_imag_ = NULL;
244  }
245  }
246 
247 
249  template<class T0, class Prop, class Storage, class Allocator>
252  bool keep_matrix)
253  {
254  // we clear previous factorization
255  Clear();
256 
257  Vector<umfpack_int_t> Ptr, IndRow;
258  Vector<double> Val;
259 
260  // conversion to unsymmetric matrix in Column Sparse Column Format
261  General prop;
262  ConvertToCSC(mat, prop, Ptr, IndRow, Val, false);
263  if (!keep_matrix)
264  mat.Clear();
265 
266  FactorizeCSC(Ptr, IndRow, Val, false);
267  }
268 
269 
272  Vector<double>& Val, bool sym)
273  {
274  transpose = false;
275  this->n = Ptr.GetM()-1;
276 
277  // we retrieve pointers and nullify input vectors
278  ptr_ = Ptr.GetData();
279  ind_ = IndRow.GetData();
280  data_ = Val.GetData();
281  Ptr.Nullify(); IndRow.Nullify(); Val.Nullify();
282 
283  // symbolic factorization
284 #ifdef UMFPACK_INTSIZE64
285  umfpack_dl_symbolic(this->n, this->n, ptr_, ind_, data_, &this->Symbolic,
286  this->Control.GetData(), this->Info.GetData());
287 #else
288  umfpack_di_symbolic(this->n, this->n, ptr_, ind_, data_, &this->Symbolic,
289  this->Control.GetData(), this->Info.GetData());
290 #endif
291 
292  // numerical factorization
293 #ifdef UMFPACK_INTSIZE64
294  status_facto =
295  umfpack_dl_numeric(ptr_, ind_, data_,
296  this->Symbolic, &this->Numeric,
297  this->Control.GetData(), this->Info.GetData());
298 #else
299  status_facto =
300  umfpack_di_numeric(ptr_, ind_, data_,
301  this->Symbolic, &this->Numeric,
302  this->Control.GetData(), this->Info.GetData());
303 #endif
304 
305  // we display informations about the performed operation
306  if (print_level > 1)
307  {
308 #ifdef UMFPACK_INTSIZE64
309  umfpack_dl_report_status(this->Control.GetData(), status_facto);
310  umfpack_dl_report_info(this->Control.GetData(),this->Info.GetData());
311 #else
312  umfpack_di_report_status(this->Control.GetData(), status_facto);
313  umfpack_di_report_info(this->Control.GetData(),this->Info.GetData());
314 #endif
315  }
316 
317  if (print_level > 0)
318  {
319  int64_t size_mem = int64_t(this->Info(UMFPACK_SYMBOLIC_SIZE)
320  + this->Info(UMFPACK_NUMERIC_SIZE_ESTIMATE))
321  *int64_t(this->Info(UMFPACK_SIZE_OF_UNIT));
322 
323  cout << "Memory used to store LU factors: "
324  << double(size_mem)/(1024*1024) << " MB" << endl;
325  }
326  }
327 
328 
330  template<class Prop, class Allocator>
333  {
334  // we clear previous factorization
335  Clear();
336 
337  Vector<umfpack_int_t> Ptr, IndCol;
338  Vector<double> Val;
339 
340  // conversion to unsymmetric matrix in Column Sparse Row Format
341  General prop;
342  ConvertToCSR(mat, prop, Ptr, IndCol, Val);
343  mat.Clear();
344 
345  transpose = true;
346 
347  // we retrieve pointers of Acsc and nullify this object
348  this->n = Ptr.GetM()-1;
349  ptr_ = Ptr.GetData();
350  ind_ = IndCol.GetData();
351  data_ = Val.GetData();
352  Ptr.Nullify(); IndCol.Nullify(); Val.Nullify();
353 
354  // factorization with UmfPack
355 #ifdef UMFPACK_INTSIZE64
356  umfpack_dl_symbolic(this->n, this->n, ptr_, ind_, data_, &this->Symbolic,
357  this->Control.GetData(), this->Info.GetData());
358 #else
359  umfpack_di_symbolic(this->n, this->n, ptr_, ind_, data_, &this->Symbolic,
360  this->Control.GetData(), this->Info.GetData());
361 #endif
362 
363  }
364 
365 
367  template<class Prop, class Allocator>
370  {
371  // we copy values
372  double* data = mat.GetData();
373  for (int i = 0; i < mat.GetDataSize(); i++)
374  data_[i] = data[i];
375 
376 #ifdef UMFPACK_INTSIZE64
377  status_facto =
378  umfpack_dl_numeric(ptr_, ind_, data_,
379  this->Symbolic, &this->Numeric,
380  this->Control.GetData(), this->Info.GetData());
381 #else
382  status_facto =
383  umfpack_di_numeric(ptr_, ind_, data_,
384  this->Symbolic, &this->Numeric,
385  this->Control.GetData(), this->Info.GetData());
386 #endif
387 
388  // we display informations about the performed operation
389  if (print_level > 1)
390  {
391 #ifdef UMFPACK_INTSIZE64
392  umfpack_dl_report_status(this->Control.GetData(), status_facto);
393  umfpack_dl_report_info(this->Control.GetData(),this->Info.GetData());
394 #else
395  umfpack_di_report_status(this->Control.GetData(), status_facto);
396  umfpack_di_report_info(this->Control.GetData(),this->Info.GetData());
397 #endif
398  }
399  }
400 
401 
403  template<class Allocator2>
405  {
406  Solve(SeldonNoTrans, x);
407  }
408 
409 
410  template<class Allocator2>
413  {
414  Solve(TransA, x.GetData(), 1);
415  }
416 
417 
418  template<class Allocator2>
419  void MatrixUmfPack<double>::
420  Solve(const SeldonTranspose& TransA,
421  Matrix<double, General, ColMajor, Allocator2>& x)
422  {
423  Solve(TransA, x.GetData(), x.GetN());
424  }
425 
426 
427  void MatrixUmfPack<double>::Solve(const SeldonTranspose& TransA,
428  double* x_ptr, int nrhs)
429  {
430  // local copy of x
431  Vector<double> b(this->n);
432 
433  int sys = UMFPACK_Aat;
434  if (TransA.NoTrans())
435  {
436  if (!transpose)
437  sys = UMFPACK_A;
438  }
439  else
440  {
441  if (transpose)
442  sys = UMFPACK_A;
443  }
444 
445  int status = 0;
446  for (int k = 0; k < nrhs; k++)
447  {
448  for (int i = 0; i < this->n; i++)
449  b(i) = x_ptr[i + this->n*k];
450 
451 #ifdef UMFPACK_INTSIZE64
452  status
453  = umfpack_dl_solve(sys, ptr_, ind_, data_, &x_ptr[this->n*k],
454  b.GetData(), this->Numeric, this->Control.GetData(),
455  this->Info.GetData());
456 #else
457  status
458  = umfpack_di_solve(sys, ptr_, ind_, data_, &x_ptr[this->n*k],
459  b.GetData(), this->Numeric, this->Control.GetData(),
460  this->Info.GetData());
461 #endif
462  }
463 
464  // We display information about the performed operation.
465  if (print_level > 1)
466  umfpack_di_report_status(this->Control.GetData(), status);
467  }
468 
469 
471  template<class T0, class Prop, class Storage,class Allocator>
472  void MatrixUmfPack<complex<double> >::
474  bool keep_matrix)
475  {
476  Clear();
477 
478  Vector<umfpack_int_t> Ptr, IndRow;
480 
481  // conversion to CSC format
482  General prop;
483  ConvertToCSC(mat, prop, Ptr, IndRow, Val, false);
484  if (!keep_matrix)
485  mat.Clear();
486 
487  FactorizeCSC(Ptr, IndRow, Val, false);
488  }
489 
490 
492  ::FactorizeCSC(Vector<umfpack_int_t>& Ptr, Vector<umfpack_int_t>& IndRow,
493  Vector<complex<double> >& Val, bool sym)
494  {
495  transpose = false;
496  this->n = Ptr.GetM()-1;
497 
498  long nnz = IndRow.GetDataSize();
499  complex<double>* data = Val.GetData();
500  Vector<double> ValuesReal(nnz), ValuesImag(nnz);
501 
502  for (long i = 0; i < nnz; i++)
503  {
504  ValuesReal(i) = real(data[i]);
505  ValuesImag(i) = imag(data[i]);
506  }
507 
508  // we clear intermediary values Val
509  Val.Clear();
510 
511  // retrieve pointers and nullify Seldon vectors
512  data_real_ = ValuesReal.GetData();
513  data_imag_ = ValuesImag.GetData();
514  ptr_ = Ptr.GetData();
515  ind_ = IndRow.GetData();
516  ValuesReal.Nullify(); ValuesImag.Nullify();
517  Ptr.Nullify(); IndRow.Nullify();
518 
519  // we call UmfPack
520 #ifdef UMFPACK_INTSIZE64
521  umfpack_zl_symbolic(this->n, this->n, ptr_, ind_,
522  data_real_, data_imag_,
523  &this->Symbolic, this->Control.GetData(),
524  this->Info.GetData());
525 
526  status_facto
527  = umfpack_zl_numeric(ptr_, ind_, data_real_, data_imag_,
528  this->Symbolic, &this->Numeric,
529  this->Control.GetData(), this->Info.GetData());
530 #else
531  umfpack_zi_symbolic(this->n, this->n, ptr_, ind_,
532  data_real_, data_imag_,
533  &this->Symbolic, this->Control.GetData(),
534  this->Info.GetData());
535 
536  status_facto
537  = umfpack_zi_numeric(ptr_, ind_, data_real_, data_imag_,
538  this->Symbolic, &this->Numeric,
539  this->Control.GetData(), this->Info.GetData());
540 #endif
541 
542  if (print_level > 1)
543  {
544 #ifdef UMFPACK_INTSIZE64
545  umfpack_zl_report_status(this->Control.GetData(), status_facto);
546  umfpack_zl_report_info(this->Control.GetData(), this->Info.GetData());
547 #else
548  umfpack_zi_report_status(this->Control.GetData(), status_facto);
549  umfpack_zi_report_info(this->Control.GetData(), this->Info.GetData());
550 #endif
551  }
552 
553  if (print_level > 0)
554  {
555  int64_t size_mem = int64_t(this->Info(UMFPACK_SYMBOLIC_SIZE)
556  + this->Info(UMFPACK_NUMERIC_SIZE_ESTIMATE))
557  *int64_t(this->Info(UMFPACK_SIZE_OF_UNIT));
558 
559  cout << "Estimated memory used to store LU factors: "
560  << double(size_mem)/(1024*1024) << " MiB" << endl;
561  }
562  }
563 
564 
566  template<class Allocator2>
567  void MatrixUmfPack<complex<double> >::
568  Solve(Vector<complex<double>, VectFull, Allocator2>& x)
569  {
570  Solve(SeldonNoTrans, x);
571  }
572 
573 
575  template<class Allocator2>
577  Solve(const SeldonTranspose& TransA,
578  Vector<complex<double>, VectFull, Allocator2>& x)
579  {
580  Solve(TransA, x.GetData(), 1);
581  }
582 
583 
585  template<class Allocator2>
587  Solve(const SeldonTranspose& TransA,
588  Matrix<complex<double>, General, ColMajor, Allocator2>& x)
589  {
590  Solve(TransA, x.GetData(), x.GetN());
591  }
592 
593 
595  Solve(const SeldonTranspose& TransA, complex<double>* x_ptr, int nrhs)
596  {
597  // creation of vectors
598  Vector<double> b_real(this->n), b_imag(this->n);
599  Vector<double> x_real(this->n), x_imag(this->n);
600  x_real.Zero();
601  x_imag.Zero();
602 
603  int sys = UMFPACK_Aat;
604  if (TransA.NoTrans())
605  {
606  if (!transpose)
607  sys = UMFPACK_A;
608  }
609  else
610  {
611  if (transpose)
612  sys = UMFPACK_A;
613  }
614 
615  int status = 0;
616  for (int k = 0; k < nrhs; k++)
617  {
618 
619  for (int i = 0; i < this->n; i++)
620  {
621  b_real(i) = real(x_ptr[i + k*this->n]);
622  b_imag(i) = imag(x_ptr[i+k*this->n]);
623  }
624 
625 #ifdef UMFPACK_INTSIZE64
626  status
627  = umfpack_zl_solve(sys, ptr_, ind_, data_real_, data_imag_,
628  x_real.GetData(), x_imag.GetData(),
629  b_real.GetData(), b_imag.GetData(),
630  this->Numeric,
631  this->Control.GetData(), this->Info.GetData());
632 #else
633  status
634  = umfpack_zi_solve(sys, ptr_, ind_, data_real_, data_imag_,
635  x_real.GetData(), x_imag.GetData(),
636  b_real.GetData(), b_imag.GetData(),
637  this->Numeric,
638  this->Control.GetData(), this->Info.GetData());
639 #endif
640 
641  for (int i = 0; i < this->n; i++)
642  x_ptr[i+k*this->n] = complex<double>(x_real(i), x_imag(i));
643  }
644 
645  if (print_level > 1)
646  {
647 #ifdef UMFPACK_INTSIZE64
648  umfpack_zl_report_status(this->Control.GetData(), status);
649 #else
650  umfpack_zi_report_status(this->Control.GetData(), status);
651 #endif
652  }
653  }
654 
655 
657  template<class MatrixSparse, class T>
658  void GetLU(MatrixSparse& A, MatrixUmfPack<T>& mat_lu, bool keep_matrix, T& x)
659  {
660  mat_lu.FactorizeMatrix(A, keep_matrix);
661  }
662 
663 
665  template<class MatrixSparse, class T>
666  void GetLU(MatrixSparse& A, MatrixUmfPack<T>& mat_lu,
667  bool keep_matrix, complex<T>& x)
668  {
669  throw WrongArgument("GetLU(Matrix<complex<T> >& A, MatrixUmfPack<T>& mat_lu, bool)",
670  "The LU matrix must be complex");
671  }
672 
673 
675  template<class MatrixSparse, class T>
676  void GetLU(MatrixSparse& A, MatrixUmfPack<complex<T> >& mat_lu,
677  bool keep_matrix, T& x)
678  {
679  throw WrongArgument("GetLU(Matrix<T>& A, MatrixUmfPack<complex<T> >& mat_lu, bool)",
680  "The sparse matrix must be complex");
681  }
682 
683 
685  template<class T0, class Prop, class Storage, class Allocator, class T>
687  bool keep_matrix)
688  {
689  // we check if the type of non-zero entries of matrix A
690  // and of the UmfPack object (T) are different
691  // we call one of the GetLUs written above
692  // such a protection avoids to compile the factorisation of a complex
693  // matrix with a real UmfPack object
695  GetLU(A, mat_lu, keep_matrix, x);
696  }
697 
698 
700  template<class T, class Allocator>
702  {
703  mat_lu.Solve(x);
704  }
705 
706 
709  template<class T, class Allocator>
710  void SolveLU(const SeldonTranspose& TransA,
712  {
713  mat_lu.Solve(TransA, x);
714  }
715 
716 
718  template<class T, class Prop, class Allocator>
719  void SolveLU(MatrixUmfPack<T>& mat_lu,
721  {
722  mat_lu.Solve(SeldonNoTrans, x);
723  }
724 
725 
728  template<class T, class Prop, class Allocator>
729  void SolveLU(const SeldonTranspose& TransA,
731  {
732  mat_lu.Solve(TransA, x);
733  }
734 
735 
737  template<class Allocator>
738  void SolveLU(MatrixUmfPack<double>& mat_lu,
739  Vector<complex<double>, VectFull, Allocator>& x)
740  {
741  Matrix<double, General, ColMajor> y(x.GetM(), 2);
742 
743  for (int i = 0; i < x.GetM(); i++)
744  {
745  y(i, 0) = real(x(i));
746  y(i, 1) = imag(x(i));
747  }
748 
749  SolveLU(mat_lu, y);
750 
751  for (int i = 0; i < x.GetM(); i++)
752  x(i) = complex<double>(y(i, 0), y(i, 1));
753  }
754 
755 
757  template<class Allocator>
758  void SolveLU(const SeldonTranspose& TransA,
759  MatrixUmfPack<double>& mat_lu,
760  Vector<complex<double>, VectFull, Allocator>& x)
761  {
762  Matrix<double, General, ColMajor> y(x.GetM(), 2);
763 
764  for (int i = 0; i < x.GetM(); i++)
765  {
766  y(i, 0) = real(x(i));
767  y(i, 1) = imag(x(i));
768  }
769 
770  SolveLU(TransA, mat_lu, y);
771 
772  for (int i = 0; i < x.GetM(); i++)
773  x(i) = complex<double>(y(i, 0), y(i, 1));
774 
775  }
776 
777 
779  template<class Allocator>
780  void SolveLU(MatrixUmfPack<complex<double> >& mat_lu,
782  {
783  throw WrongArgument("SolveLU(MatrixPastix<complex<double> >, Vector<double>)",
784  "The result should be a complex vector");
785  }
786 
787 
789  template<class Allocator>
790  void SolveLU(const SeldonTranspose& TransA,
791  MatrixUmfPack<complex<double> >& mat_lu,
793  {
794  throw WrongArgument("SolveLU(MatrixPastix<complex<double> >, Vector<double>)",
795  "The result should be a complex vector");
796  }
797 
798 }
799 
800 #define SELDON_FILE_UMFPACK_CXX
801 #endif
Seldon::SeldonDefaultAllocator
Selection of default allocator depending on storage and value type.
Definition: Allocator.hxx:174
Seldon::SeldonTranspose
Definition: MatrixFlag.hxx:32
Seldon::MatrixUmfPack< double >::Solve
void Solve(Vector< double, VectFull, Allocator2 > &x)
resolution of A y = x (result is overwritten in x)
Definition: UmfPack.cxx:404
Seldon::Vector< int, VectFull >
Seldon::MatrixUmfPack_Base
< base class to solve linear system by using UmfPack
Definition: UmfPack.hxx:40
Seldon::MatrixUmfPack< double >
class to solve linear system in double precision with UmfPack
Definition: UmfPack.hxx:73
Seldon::MatrixUmfPack
empty class
Definition: UmfPack.hxx:67
Seldon::MatrixUmfPack_Base::SelectOrdering
void SelectOrdering(int type)
selects ordering to use in the interfaced solver
Definition: UmfPack.cxx:106
Seldon::MatrixUmfPack< double >::PerformAnalysis
void PerformAnalysis(Matrix< double, Prop, RowSparse, Allocator > &mat)
Symbolic factorization.
Definition: UmfPack.cxx:332
Seldon::Matrix
Definition: SeldonHeader.hxx:226
Seldon::VectFull
Definition: StorageInline.cxx:74
Seldon::transpose
const TinyMatrixTranspose< T, m, n, E > transpose(const TinyMatrixExpression< T, n, m, E > &u)
returns transpose(u)
Definition: TinyMatrixExpressionInline.cxx:559
Seldon::MatrixUmfPack_Base::MatrixUmfPack_Base
MatrixUmfPack_Base()
constructor
Definition: UmfPack.cxx:29
Seldon::MatrixUmfPack_Base::Numeric
void * Numeric
pointers of UmfPack objects
Definition: UmfPack.hxx:44
Seldon::Undefined
Definition: Errors.hxx:62
Seldon::General
Definition: Properties.hxx:26
Seldon::Vector< T, VectFull, Allocator >
Full vector class.
Definition: Vector.hxx:88
Seldon::GetLU
void GetLU(Matrix< T0, Prop0, Storage0, Allocator0 > &A)
Returns the LU factorization of a matrix.
Definition: Functions_Matrix.cxx:2073
Seldon::MatrixUmfPack_Base::n
int n
number of rows in the matrix
Definition: UmfPack.hxx:45
Seldon::WrongArgument
Definition: Errors.hxx:76
Seldon
Seldon namespace.
Definition: Array.cxx:24
Seldon::MatrixUmfPack_Base::HideMessages
void HideMessages()
no message will be displayed by UmfPack
Definition: UmfPack.cxx:49
Seldon::MatrixUmfPack_Base::ShowMessages
void ShowMessages()
normal amount of message displayed by UmfPack
Definition: UmfPack.cxx:58
Seldon::Matrix< T, Prop, ColMajor, Allocator >
Column-major full-matrix class.
Definition: Matrix_Pointers.hxx:176
Seldon::ColMajor
Definition: Storage.hxx:33