00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef SELDON_FILE_PASTIX_HXX
00020
00021
00022 extern "C"
00023 {
00024 #define _COMPLEX_H
00025
00026 #include "pastix.h"
00027 }
00028
00029 namespace Seldon
00030 {
00031
00032 template<class T>
00033 class MatrixPastix
00034 {
00035 protected :
00037 pastix_data_t* pastix_data;
00039 pastix_int_t iparm[64];
00041 double dparm[64];
00043 pastix_int_t n;
00045 Vector<pastix_int_t> perm, invp;
00047 Vector<pastix_int_t> col_num;
00049 bool distributed;
00051 int print_level;
00053 bool refine_solution;
00054
00055 public :
00056
00057 MatrixPastix();
00058 ~MatrixPastix();
00059
00060 void Clear();
00061
00062 void CallPastix(const MPI_Comm&, pastix_int_t* colptr, pastix_int_t* row,
00063 T* val, T* b, pastix_int_t nrhs);
00064
00065 void HideMessages();
00066 void ShowMessages();
00067 void ShowFullHistory();
00068
00069 void SelectOrdering(int type);
00070 void SetPermutation(const IVect& permut);
00071
00072 void RefineSolution();
00073 void DoNotRefineSolution();
00074
00075 template<class T0, class Prop, class Storage, class Allocator, class Tint>
00076 void FindOrdering(Matrix<T0, Prop, Storage, Allocator> & mat,
00077 Vector<Tint>& numbers, bool keep_matrix = false);
00078
00079 template<class Storage, class Allocator>
00080 void FactorizeMatrix(Matrix<T, General, Storage, Allocator> & mat,
00081 bool keep_matrix = false);
00082
00083 template<class Storage, class Allocator>
00084 void FactorizeMatrix(Matrix<T, Symmetric, Storage, Allocator> & mat,
00085 bool keep_matrix = false);
00086
00087 template<class Allocator2>
00088 void Solve(Vector<T, VectFull, Allocator2>& x);
00089
00090 template<class Allocator2, class Transpose_status>
00091 void Solve(const Transpose_status& TransA,
00092 Vector<T, VectFull, Allocator2>& x);
00093
00094 void SetNumberThreadPerNode(int num_thread);
00095
00096 template<class Alloc1, class Alloc2, class Alloc3, class Tint>
00097 void FactorizeDistributedMatrix(MPI::Comm& comm_facto,
00098 Vector<pastix_int_t, VectFull, Alloc1>&,
00099 Vector<pastix_int_t, VectFull, Alloc2>&,
00100 Vector<T, VectFull, Alloc3>&,
00101 const Vector<Tint>& glob_number,
00102 bool sym, bool keep_matrix = false);
00103
00104 template<class Allocator2, class Tint>
00105 void SolveDistributed(MPI::Comm& comm_facto,
00106 Vector<T, Vect_Full, Allocator2>& x,
00107 const Vector<Tint>& glob_num);
00108
00109 template<class Allocator2, class Transpose_status, class Tint>
00110 void SolveDistributed(MPI::Comm& comm_facto,
00111 const Transpose_status& TransA,
00112 Vector<T, Vect_Full, Allocator2>& x,
00113 const Vector<Tint>& glob_num);
00114
00115 };
00116
00117 }
00118
00119 #define SELDON_FILE_PASTIX_HXX
00120 #endif
00121