44 #include <Epetra_Export.h> 
   45 #include <Epetra_LinearProblem.h> 
   46 #include <Epetra_CrsGraph.h> 
   47 #include <Epetra_CrsMatrix.h> 
   48 #include <Epetra_MultiVector.h> 
   49 #include <Epetra_Vector.h> 
   50 #include <Epetra_IntVector.h> 
   51 #include <Epetra_Map.h> 
   52 #include <Epetra_Comm.h> 
   63   if( Exporter_ ) 
delete Exporter_;
 
   65   if( NewProblem_ ) 
delete NewProblem_;
 
   66   if( NewRHS_ ) 
delete NewRHS_;
 
   67   if( NewLHS_ ) 
delete NewLHS_;
 
   68   if( NewMatrix_ ) 
delete NewMatrix_;
 
   69   if( NewGraph_ ) 
delete NewGraph_;
 
   70   if( NewRowMap_ ) 
delete NewRowMap_;
 
   71   if( NewColMap_ ) 
delete NewColMap_;
 
   73   if( ULHS_ ) 
delete ULHS_;
 
   74   if( RLHS_ ) 
delete RLHS_;
 
   75   if( LLHS_ ) 
delete LLHS_;
 
   76   if( URHS_ ) 
delete URHS_;
 
   77   if( RRHS_ ) 
delete RRHS_;
 
   78   if( LRHS_ ) 
delete LRHS_;
 
   80   if( UUMatrix_ ) 
delete UUMatrix_;
 
   81   if( URMatrix_ ) 
delete URMatrix_;
 
   82   if( ULMatrix_ ) 
delete ULMatrix_;
 
   83   if( RRMatrix_ ) 
delete RRMatrix_;
 
   84   if( RLMatrix_ ) 
delete RLMatrix_;
 
   85   if( LLMatrix_ ) 
delete LLMatrix_;
 
   87   if( UUGraph_ ) 
delete UUGraph_;
 
   88   if( URGraph_ ) 
delete URGraph_;
 
   89   if( ULGraph_ ) 
delete ULGraph_;
 
   90   if( RRGraph_ ) 
delete RRGraph_;
 
   91   if( RLGraph_ ) 
delete RLGraph_;
 
   92   if( LLGraph_ ) 
delete LLGraph_;
 
   94   if( UExporter_ ) 
delete UExporter_;
 
   95   if( RExporter_ ) 
delete RExporter_;
 
   96   if( LExporter_ ) 
delete LExporter_;
 
   98   if( UMap_ ) 
delete UMap_;
 
   99   if( RMap_ ) 
delete RMap_;
 
  100   if( LMap_ ) 
delete LMap_;
 
  112   OldGraph_  = &OldMatrix_->
Graph();
 
  113   OldRHS_    = orig.GetRHS();
 
  114   OldLHS_    = orig.GetLHS();
 
  115   OldRowMap_ = &OldMatrix_->
RowMap();
 
  119   if( !OldMatrix_ ) ierr = -2;
 
  120   if( !OldRHS_ )    ierr = -3;
 
  121   if( !OldLHS_ )    ierr = -4;
 
  124   if( degree_ != 1 ) ierr = -6;
 
  129   vector<int> ColNZCnt( NRows );
 
  130   vector<int> CS_RowIndices( NRows );
 
  136   for( 
int i = 0; i < NRows; ++i )
 
  140     for( 
int j = 0; j < NumIndices; ++j )
 
  142       ++ColNZCnt[ Indices[j] ];
 
  143       CS_RowIndices[ Indices[j] ] = i;
 
  146     if( NumIndices == 1 ) RS_Map[i] = Indices[0];
 
  151     cout << 
"-------------------------\n";
 
  152     cout << 
"Row Singletons\n";
 
  153     for( map<int,int>::iterator itM = RS_Map.begin(); itM != RS_Map.end(); ++itM )
 
  154       cout << (*itM).first << 
"\t" << (*itM).second << endl;
 
  155     cout << 
"Col Counts\n";
 
  156     for( 
int i = 0; i < NRows; ++i )
 
  157       cout << i << 
"\t" << ColNZCnt[i] << 
"\t" << CS_RowIndices[i] << endl;
 
  158     cout << 
"-------------------------\n";
 
  164   for( 
int i = 0; i < NRows; ++i )
 
  165     if( ColNZCnt[i] == 1 )
 
  167       int RowIndex = CS_RowIndices[i];
 
  168       if( RS_Map.count(i) && RS_Map[i] == RowIndex )
 
  171         RS_Set.insert( RowIndex );
 
  177     cout << 
"-------------------------\n";
 
  178     cout << 
"Singletons: " << CS_Set.size() << endl;
 
  179     set<int>::iterator itRS = RS_Set.begin();
 
  180     set<int>::iterator itCS = CS_Set.begin();
 
  181     set<int>::iterator endRS = RS_Set.end();
 
  182     set<int>::iterator endCS = CS_Set.end();
 
  183     for( ; itRS != endRS; ++itRS, ++itCS )
 
  184       cout << *itRS << 
"\t" << *itCS << endl;
 
  185     cout << 
"-------------------------\n";
 
  189   int NSingletons = CS_Set.size();
 
  190   int NReducedRows = NRows - 2* NSingletons; 
 
  191   vector<int> ReducedIndices( NReducedRows );
 
  192   vector<int> CSIndices( NSingletons );
 
  193   vector<int> RSIndices( NSingletons );
 
  197   for( 
int i = 0; i < NRows; ++i )
 
  199     int GlobalIndex = OldRowMap_->
GID(i);
 
  200     if     ( RS_Set.count(i) ) RSIndices[RS_Loc++] = GlobalIndex;
 
  201     else if( CS_Set.count(i) ) CSIndices[CS_Loc++] = GlobalIndex;
 
  202     else                       ReducedIndices[Reduced_Loc++] = GlobalIndex;
 
  205   vector<int> RowPermutedIndices( NRows );
 
  206   copy( RSIndices.begin(), RSIndices.end(), RowPermutedIndices.begin() );
 
  207   copy( ReducedIndices.begin(), ReducedIndices.end(), RowPermutedIndices.begin() + NSingletons );
 
  208   copy( CSIndices.begin(), CSIndices.end(), RowPermutedIndices.begin() + NReducedRows + NSingletons );
 
  210   vector<int> ColPermutedIndices( NRows );
 
  211   copy( CSIndices.begin(), CSIndices.end(), ColPermutedIndices.begin() );
 
  212   copy( ReducedIndices.begin(), ReducedIndices.end(), ColPermutedIndices.begin() + NSingletons );
 
  213   copy( RSIndices.begin(), RSIndices.end(), ColPermutedIndices.begin() + NReducedRows + NSingletons );
 
  215   UMap_ = 
new Epetra_Map( NSingletons, NSingletons, &RSIndices[0], IndexBase, CommObj );
 
  216   RMap_ = 
new Epetra_Map( NReducedRows, NReducedRows, &ReducedIndices[0], IndexBase, CommObj );
 
  217   LMap_ = 
new Epetra_Map( NSingletons, NSingletons, &CSIndices[0], IndexBase, CommObj );
 
  219   NewRowMap_ = 
new Epetra_Map( NRows, NRows, &RowPermutedIndices[0], IndexBase, CommObj );
 
  220   NewColMap_ = 
new Epetra_Map( NRows, NRows, &ColPermutedIndices[0], IndexBase, CommObj );
 
  226   NewRHS_->Export( *OldRHS_, *Exporter_, 
Insert );
 
  229   NewLHS_->Export( *OldLHS_, *Exporter_, 
Insert );
 
  234   cout << 
"Permuted Graph:\n" << *NewGraph_;
 
  237   NewMatrix_->Export( *OldMatrix_, *Exporter_, 
Insert );
 
  239   cout << 
"Permuted Matrix:\n" << *NewMatrix_;
 
  244 cout << 
"UExporter:\n" << *UExporter_;
 
  245 cout << 
"RExporter:\n" << *RExporter_;
 
  246 cout << 
"LExporter:\n" << *LExporter_;
 
  249   ULHS_->Export( *OldLHS_, *LExporter_, 
Insert );
 
  250   cout << 
"ULHS:\n" << *ULHS_;
 
  253   RLHS_->Export( *OldLHS_, *RExporter_, 
Insert );
 
  254   cout << 
"RLHS:\n" << *RLHS_;
 
  257   LLHS_->Export( *OldLHS_, *UExporter_, 
Insert );
 
  258   cout << 
"LLHS:\n" << *LLHS_;
 
  261   URHS_->Export( *OldRHS_, *UExporter_, 
Insert );
 
  262   cout << 
"URHS:\n" << *URHS_;
 
  265   RRHS_->Export( *OldRHS_, *RExporter_, 
Insert );
 
  266   cout << 
"RRHS:\n" << *RRHS_;
 
  269   LRHS_->Export( *OldRHS_, *LExporter_, 
Insert );
 
  270   cout << 
"LRHS:\n" << *LRHS_;
 
  275   cout << 
"UUGraph:\n" << *UUGraph_;
 
  278   UUMatrix_->Export( *OldMatrix_, *UExporter_, 
Insert );
 
  280   cout << 
"UUMatrix:\n" << *UUMatrix_;
 
  285   cout << 
"URGraph:\n" << *URGraph_;
 
  288   URMatrix_->Export( *OldMatrix_, *UExporter_, 
Insert );
 
  290   cout << 
"URMatrix:\n" << *URMatrix_;
 
  295   cout << 
"ULGraph:\n" << *ULGraph_;
 
  298   ULMatrix_->Export( *OldMatrix_, *UExporter_, 
Insert );
 
  300   cout << 
"ULMatrix:\n" << *ULMatrix_;
 
  305   cout << 
"RRGraph:\n" << *RRGraph_;
 
  308   RRMatrix_->Export( *OldMatrix_, *RExporter_, 
Insert );
 
  310   cout << 
"RRMatrix:\n" << *RRMatrix_;
 
  315   cout << 
"RLGraph:\n" << *RLGraph_;
 
  318   RLMatrix_->Export( *OldMatrix_, *RExporter_, 
Insert );
 
  320   cout << 
"RLMatrix:\n" << *RLMatrix_;
 
  325   cout << 
"LLGraph:\n" << *LLGraph_;
 
  328   LLMatrix_->Export( *OldMatrix_, *LExporter_, 
Insert );
 
  330   cout << 
"LLMatrix:\n" << *LLMatrix_;
 
  334     cout << 
"Full System Characteristics:" << endl
 
  335          << 
"----------------------------" << endl
 
  336          << 
" Dimension                   = " << NRows << endl
 
  339          << 
"Reduced System Characteristics:" << endl
 
  340          << 
" Dimension                   = " << NReducedRows << endl
 
  341          << 
" NNZs                        = " << RRMatrix_->NumGlobalNonzeros() << endl
 
  342          << 
" Max Num Row Entries         = " << RRMatrix_->GlobalMaxNumEntries() << endl
 
  343          << 
"Singleton Info:" << endl
 
  344          << 
" Num Singleton                 = " << NSingletons << endl
 
  346          << 
" % Reduction in Dimension    = " << 100.0*(NRows-NReducedRows)/NRows << endl
 
  347          << 
" % Reduction in NNZs         = " << (OldMatrix_->
NumGlobalNonzeros()-RRMatrix_->NumGlobalNonzeros())/100.0 << endl
 
  348          << 
"-------------------------------" << endl;
 
  355   cout << 
"done with SC\n";
 
  364   if( verbose_ ) cout << 
"LP_SC::fwd()\n";
 
  365   if( verbose_ ) cout << 
"LP_SC::fwd() : Exporting to New LHS\n";
 
  366   ULHS_->Export( *OldLHS_, *LExporter_, 
Insert );
 
  367   RLHS_->Export( *OldLHS_, *RExporter_, 
Insert );
 
  368   LLHS_->Export( *OldLHS_, *UExporter_, 
Insert );
 
  370   if( verbose_ ) cout << 
"LP_SC::fwd() : Exporting to New RHS\n";
 
  371   URHS_->Export( *OldRHS_, *UExporter_, 
Insert );
 
  372   RRHS_->Export( *OldRHS_, *RExporter_, 
Insert );
 
  373   LRHS_->Export( *OldRHS_, *LExporter_, 
Insert );
 
  375   UUMatrix_->Export( *OldMatrix_, *UExporter_, 
Insert );
 
  376   URMatrix_->Export( *OldMatrix_, *UExporter_, 
Insert );
 
  377   ULMatrix_->Export( *OldMatrix_, *UExporter_, 
Insert );
 
  378   RRMatrix_->Export( *OldMatrix_, *RExporter_, 
Insert );
 
  379   RLMatrix_->Export( *OldMatrix_, *RExporter_, 
Insert );
 
  380   LLMatrix_->Export( *OldMatrix_, *LExporter_, 
Insert );
 
  385   LLRecipDiag.Reciprocal( LLDiag );
 
  387   if( verbose_ ) cout << 
"LP_SC::fwd() : Forming LLHS\n";
 
  388   LLDiag.Multiply( 1.0, LLRecipDiag, *LRHS_, 0.0 );
 
  390   for( 
int i = 0; i < LSize; ++i ) (*LLHS_)[0][i] = LLDiag[i];
 
  392   if( verbose_ ) cout << 
"LP_SC::fwd() : Updating RRHS\n";
 
  394   RLMatrix_->
Multiply( 
false, *LLHS_, RUpdate );
 
  395   RRHS_->Update( -1.0, RUpdate, 1.0 );
 
  397   if( verbose_ ) cout << 
"LP_SC::fwd() : Updating URHS\n";
 
  399   ULMatrix_->
Multiply( 
false, *LLHS_, UUpdate );
 
  400   URHS_->Update( -1.0, UUpdate, 1.0 );
 
  409   if( verbose_ ) cout << 
"LP_SC::rvs()\n";
 
  410   if( verbose_ ) cout << 
"LP_SC::rvs() : Updating URHS\n";
 
  412   URMatrix_->
Multiply( 
false, *RLHS_, UUpdate );
 
  413   URHS_->Update( -1.0, UUpdate, 1.0 );
 
  418   UURecipDiag.Reciprocal( UUDiag );
 
  420   if( verbose_ ) cout << 
"LP_SC::rvs() : Forming ULHS\n";
 
  421   UUDiag.Multiply( 1.0, UURecipDiag, *URHS_, 0.0 );
 
  423   for( 
int i = 0; i < USize; ++i ) (*ULHS_)[0][i] = UUDiag[i];
 
  425   if( verbose_ ) cout << 
"LP_SC::rvs() : Importing to Old LHS\n";
 
  426   OldLHS_->Import( *ULHS_, *LExporter_, 
Insert );
 
  427   OldLHS_->Import( *RLHS_, *RExporter_, 
Insert );
 
  428   OldLHS_->Import( *LLHS_, *UExporter_, 
Insert );
 
bool DistributedGlobal() const 
 
int ExtractDiagonalCopy(Epetra_Vector &Diagonal) const 
 
int Multiply(bool TransA, const Epetra_Vector &x, Epetra_Vector &y) const 
 
int GlobalMaxNumEntries() const 
 
int FillComplete(bool OptimizeDataStorage=true)
 
bool fwd()
Forward transfer of data from orig object input in the operator() method call to the new object creat...
 
const Epetra_Map & RowMap() const 
 
int NumMyElements() const 
 
int Export(const Epetra_SrcDistObject &A, const Epetra_Import &Importer, Epetra_CombineMode CombineMode, const Epetra_OffsetIndex *Indexor=0)
 
NewTypeRef operator()(OriginalTypeRef orig)
Analysis of transform operation on original object and construction of new object. 
 
int NumGlobalNonzeros() const 
 
const Epetra_Comm & Comm() const 
 
int ExtractMyRowView(int LocalRow, int &NumIndices, int *&Indices) const 
 
~LinearProblem_StaticCondensation()
 
const Epetra_CrsGraph & Graph() const 
 
bool rvs()
Reverse transfer of data from new object created in the operator() method call to the orig object inp...