00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef EpetraExt_LINEARPROBLEM_BTF_H
00030 #define EpetraExt_LINEARPROBLEM_BTF_H
00031
00032 #include <EpetraExt_Transform.h>
00033
00034 #include <vector>
00035 #include <map>
00036 #include <set>
00037
00038 class Epetra_LinearProblem;
00039 class Epetra_VbrMatrix;
00040 class Epetra_MultiVector;
00041 class Epetra_Vector;
00042 class Epetra_CrsMatrix;
00043 class Epetra_CrsGraph;
00044 class Epetra_Map;
00045 class Epetra_BlockMap;
00046 class Epetra_SerialDenseMatrix;
00047
00048 namespace EpetraExt {
00049
00050 class LinearProblem_BTF : public SameTypeTransform<Epetra_LinearProblem> {
00051
00052 public:
00053
00054 ~LinearProblem_BTF();
00055
00056 LinearProblem_BTF( double thres = 0.0,
00057 int verbose = 0 )
00058 : NewMap_(0),
00059 NewMatrix_(0),
00060 NewGraph_(0),
00061 NewLHS_(0),
00062 NewRHS_(0),
00063 NewProblem_(0),
00064 OrigGraph_(0),
00065 OrigMatrix_(0),
00066 OrigRHS_(0),
00067 OrigLHS_(0),
00068 OrigProblem_(0),
00069 threshold_(thres),
00070 verbose_(verbose),
00071 changedLP_(false)
00072 {}
00073
00074 NewTypeRef operator()( OriginalTypeRef orig );
00075
00076 bool fwd();
00077 bool rvs();
00078
00079 bool changedLP() { return changedLP_; }
00080
00081 private:
00082
00083 void deleteNewObjs_();
00084
00085 Epetra_BlockMap * NewMap_;
00086
00087 Epetra_LinearProblem * NewProblem_;
00088
00089 Epetra_VbrMatrix * NewMatrix_;
00090 Epetra_CrsGraph * NewGraph_;
00091
00092 Epetra_MultiVector * NewLHS_;
00093 Epetra_MultiVector * NewRHS_;
00094
00095 Epetra_Map * OrigRowMap_;
00096 Epetra_Map * OrigColMap_;
00097 Epetra_LinearProblem * OrigProblem_;
00098 Epetra_CrsGraph * OrigGraph_;
00099 Epetra_CrsMatrix * OrigMatrix_;
00100 Epetra_MultiVector * OrigLHS_;
00101 Epetra_MultiVector * OrigRHS_;
00102
00103 std::vector<int> OldGlobalElements_;
00104
00105 std::vector< std::set<int> > ZeroElements_;
00106
00107 std::vector< std::vector<Epetra_SerialDenseMatrix*> > Blocks_;
00108 std::vector<int> BlockDim_;
00109 std::vector<int> BlockCnt_;
00110 std::map<int,int> BlockRowMap_;
00111 std::map<int,int> SubBlockRowMap_;
00112 std::map<int,int> BlockColMap_;
00113 std::map<int,int> SubBlockColMap_;
00114
00115 std::vector< std::vector<int> > NewBlockRows_;
00116
00117 const double threshold_;
00118 const int verbose_;
00119
00120 bool changedLP_;
00121 };
00122
00123 }
00124
00125 #endif //EpetraExt_LINEARPROBLEM_BTF_H