44 #include <Epetra_Export.h> 45 #include <Epetra_CrsGraph.h> 46 #include <Epetra_CrsMatrix.h> 47 #include <Epetra_Map.h> 48 #include <Epetra_Import.h> 49 #include <Epetra_Export.h> 51 #include <Teuchos_TimeMonitor.hpp> 61 double *tmp =
new double[nnew];
62 for(
int i=0; i<nold; i++)
73 if( TransposeMatrix_ )
delete TransposeMatrix_;
75 if( !OrigMatrixIsCrsMatrix_ )
85 #ifdef ENABLE_TRANSPOSE_TIMINGS 86 Teuchos::Time myTime(
"global");
87 Teuchos::TimeMonitor MM(myTime);
88 Teuchos::RCP<Teuchos::Time> mtime;
89 mtime=MM.getNewTimer(
"Transpose: CreateTransposeLocal 1");
94 const Epetra_CrsMatrix * OrigCrsMatrix =
dynamic_cast<const Epetra_CrsMatrix*
>(&orig);
95 if(OrigCrsMatrix) OrigMatrixIsCrsMatrix_ =
true;
96 else OrigMatrixIsCrsMatrix_ =
false;
98 const Epetra_Map & TransMap = orig.RowMatrixColMap();
99 int TransNnz = orig.NumMyNonzeros();
102 Epetra_CrsMatrix *TempTransA1 =
new Epetra_CrsMatrix(Copy, TransMap,orig.RowMatrixRowMap(),0);
103 Epetra_IntSerialDenseVector & TransRowptr = TempTransA1->ExpertExtractIndexOffset();
104 Epetra_IntSerialDenseVector & TransColind = TempTransA1->ExpertExtractIndices();
105 double *& TransVals = TempTransA1->ExpertExtractValues();
106 NumMyRows_ = orig.NumMyRows();
107 NumMyCols_ = orig.NumMyCols();
109 TransRowptr.Resize(NumMyCols_+1);
110 TransColind.Resize(TransNnz);
112 std::vector<int> CurrentStart(NumMyCols_,0);
115 if (OrigMatrixIsCrsMatrix_)
117 const Epetra_CrsGraph & OrigGraph = OrigCrsMatrix->Graph();
119 for (i=0; i<NumMyRows_; i++)
121 err = OrigGraph.ExtractMyRowView(i, NumIndices, Indices_);
122 if (err != 0)
throw OrigGraph.ReportError(
"ExtractMyRowView failed",err);
123 for (j=0; j<NumIndices; j++) ++CurrentStart[Indices_[j]];
129 MaxNumEntries_ = orig.MaxNumEntries();
130 delete [] Indices_;
delete [] Values_;
131 Indices_ =
new int[MaxNumEntries_];
132 Values_ =
new double[MaxNumEntries_];
134 for (i=0; i<NumMyRows_; i++)
136 err = orig.ExtractMyRowCopy(i, MaxNumEntries_, NumIndices, Values_, Indices_);
138 std::cerr <<
"ExtractMyRowCopy failed."<<std::endl;
141 for (j=0; j<NumIndices; j++) ++CurrentStart[Indices_[j]];
147 for (i=1;i<NumMyCols_+1; i++) TransRowptr[i] = CurrentStart[i-1] + TransRowptr[i-1];
148 for (i=0;i<NumMyCols_; i++) CurrentStart[i] = TransRowptr[i];
151 for (i=0; i<NumMyRows_; i++)
153 if (OrigMatrixIsCrsMatrix_)
154 err = OrigCrsMatrix->ExtractMyRowView(i, NumIndices, Values_, Indices_);
156 err = orig.ExtractMyRowCopy(i, MaxNumEntries_, NumIndices, Values_, Indices_);
158 std::cerr <<
"ExtractMyRowCopy failed."<<std::endl;
162 for (j=0; j<NumIndices; j++)
164 int idx = CurrentStart[Indices_[j]];
165 TransColind[idx] = i;
166 TransVals[idx] = Values_[j];
167 ++CurrentStart[Indices_[j]];
171 #ifdef ENABLE_TRANSPOSE_TIMINGS 173 mtime=MM.getNewTimer(
"Transpose: CreateTransposeLocal 2");
179 Epetra_Import * myimport = 0;
180 Epetra_Export * myexport = 0;
181 if(OrigMatrixIsCrsMatrix_ && OrigCrsMatrix->Importer())
182 myexport =
new Epetra_Export(*OrigCrsMatrix->Importer());
183 if(OrigMatrixIsCrsMatrix_ && OrigCrsMatrix->Exporter())
184 myimport =
new Epetra_Import(*OrigCrsMatrix->Exporter());
186 #ifdef ENABLE_TRANSPOSE_TIMINGS 188 mtime=MM.getNewTimer(
"Transpose: CreateTransposeLocal 3");
193 err = TempTransA1->ExpertStaticFillComplete(orig.OperatorRangeMap(),orig.OperatorDomainMap(),myimport,myexport);
195 throw TempTransA1->ReportError(
"ExpertStaticFillComplete failed.",err);
198 #ifdef ENABLE_TRANSPOSE_TIMINGS 213 if( !TransposeRowMap_ )
215 if( IgnoreNonLocalCols_ )
216 TransposeRowMap_ = (Epetra_Map *) &(orig.OperatorRangeMap());
218 TransposeRowMap_ = (Epetra_Map *) &(orig.OperatorDomainMap());
221 NumMyRows_ = orig.NumMyRows();
222 NumMyCols_ = orig.NumMyCols();
231 if(!TempTransA1->Exporter()) {
233 newObj_ = TransposeMatrix_ = TempTransA1;
237 #ifdef ENABLE_TRANSPOSE_TIMINGS 238 Teuchos::Time myTime(
"global");
239 Teuchos::TimeMonitor MM(myTime);
240 Teuchos::RCP<Teuchos::Time> mtime;
241 mtime=MM.getNewTimer(
"Transpose: Final FusedExport");
247 TransposeMatrix_ =
new Epetra_CrsMatrix(*TempTransA1,*TempTransA1->Exporter(),0,TransposeRowMap_);
249 #ifdef ENABLE_TRANSPOSE_TIMINGS 262 const Epetra_Export * TransposeExporter=0;
263 bool DeleteExporter =
false;
265 if(TempTransA1->Exporter()) TransposeExporter = TempTransA1->Exporter();
268 TransposeExporter =
new Epetra_Export(TransposeMatrix_->DomainMap(),TransposeMatrix_->RowMap());
271 TransposeMatrix_->PutScalar(0.0);
273 EPETRA_CHK_ERR(TransposeMatrix_->Export(*TempTransA1, *TransposeExporter, Add));
275 if(DeleteExporter)
delete TransposeExporter;
EpetraExt::BlockCrsMatrix: A class for constructing a distributed block matrix.
~RowMatrix_Transpose()
Destructor.
void resize_doubles(int nold, int nnew, double *&d)
NewTypeRef operator()(OriginalTypeRef orig)
Transpose Transform Operator.
bool fwd()
Foward Data Migration.
Epetra_CrsMatrix * CreateTransposeLocal(OriginalTypeRef orig)
Local-only transpose operator. Don't use this unless you're sure you know what you're doing...
bool rvs()
Reverse Data Migration.