|
EpetraExt
Development
|
00001 //@HEADER 00002 // *********************************************************************** 00003 // 00004 // EpetraExt: Epetra Extended - Linear Algebra Services Package 00005 // Copyright (2011) Sandia Corporation 00006 // 00007 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, 00008 // the U.S. Government retains certain rights in this software. 00009 // 00010 // Redistribution and use in source and binary forms, with or without 00011 // modification, are permitted provided that the following conditions are 00012 // met: 00013 // 00014 // 1. Redistributions of source code must retain the above copyright 00015 // notice, this list of conditions and the following disclaimer. 00016 // 00017 // 2. Redistributions in binary form must reproduce the above copyright 00018 // notice, this list of conditions and the following disclaimer in the 00019 // documentation and/or other materials provided with the distribution. 00020 // 00021 // 3. Neither the name of the Corporation nor the names of the 00022 // contributors may be used to endorse or promote products derived from 00023 // this software without specific prior written permission. 00024 // 00025 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY 00026 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00027 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 00028 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE 00029 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00030 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 00031 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00032 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00033 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00034 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00035 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00036 // 00037 // Questions? Contact Michael A. Heroux (maherou@sandia.gov) 00038 // 00039 // *********************************************************************** 00040 //@HEADER 00041 00042 #ifndef EpetraExt_LINEARPROBLEM_BTF_H 00043 #define EpetraExt_LINEARPROBLEM_BTF_H 00044 00045 #include <EpetraExt_Transform.h> 00046 00047 #include <vector> 00048 #include <map> 00049 #include <set> 00050 00051 class Epetra_LinearProblem; 00052 class Epetra_VbrMatrix; 00053 class Epetra_MultiVector; 00054 class Epetra_Vector; 00055 class Epetra_CrsMatrix; 00056 class Epetra_CrsGraph; 00057 class Epetra_Map; 00058 class Epetra_BlockMap; 00059 class Epetra_SerialDenseMatrix; 00060 00061 namespace EpetraExt { 00062 00063 class LinearProblem_BTF : public SameTypeTransform<Epetra_LinearProblem> { 00064 00065 public: 00066 00067 ~LinearProblem_BTF(); 00068 00069 LinearProblem_BTF( double thres = 0.0, 00070 int verbose = 0 ) 00071 : NewMap_(0), 00072 NewMatrix_(0), 00073 NewGraph_(0), 00074 NewLHS_(0), 00075 NewRHS_(0), 00076 NewProblem_(0), 00077 OrigGraph_(0), 00078 OrigMatrix_(0), 00079 OrigRHS_(0), 00080 OrigLHS_(0), 00081 OrigProblem_(0), 00082 threshold_(thres), 00083 verbose_(verbose), 00084 changedLP_(false) 00085 {} 00086 00087 NewTypeRef operator()( OriginalTypeRef orig ); 00088 00089 bool fwd(); 00090 bool rvs(); 00091 00092 bool changedLP() { return changedLP_; } 00093 00094 private: 00095 00096 void deleteNewObjs_(); 00097 00098 Epetra_BlockMap * NewMap_; 00099 00100 Epetra_LinearProblem * NewProblem_; 00101 00102 Epetra_VbrMatrix * NewMatrix_; 00103 Epetra_CrsGraph * NewGraph_; 00104 00105 Epetra_MultiVector * NewLHS_; 00106 Epetra_MultiVector * NewRHS_; 00107 00108 Epetra_Map * OrigRowMap_; 00109 Epetra_Map * OrigColMap_; 00110 Epetra_LinearProblem * OrigProblem_; 00111 Epetra_CrsGraph * OrigGraph_; 00112 Epetra_CrsMatrix * OrigMatrix_; 00113 Epetra_MultiVector * OrigLHS_; 00114 Epetra_MultiVector * OrigRHS_; 00115 00116 std::vector<int> OldGlobalElements_; 00117 00118 std::vector< std::set<int> > ZeroElements_; 00119 00120 std::vector< std::vector<Epetra_SerialDenseMatrix*> > Blocks_; 00121 std::vector<int> BlockDim_; 00122 std::vector<int> BlockCnt_; 00123 std::map<int,int> BlockRowMap_; 00124 std::map<int,int> SubBlockRowMap_; 00125 std::map<int,int> BlockColMap_; 00126 std::map<int,int> SubBlockColMap_; 00127 00128 std::vector< std::vector<int> > NewBlockRows_; 00129 00130 const double threshold_; 00131 const int verbose_; 00132 00133 bool changedLP_; 00134 }; 00135 00136 } //namespace EpetraExt 00137 00138 #endif //EpetraExt_LINEARPROBLEM_BTF_H
1.7.6.1