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>
50 #include <Epetra_Comm.h>
52 #include <Teuchos_TimeMonitor.hpp>
62 double *tmp =
new double[nnew];
63 for(
int i=0; i<nold; i++)
74 if( TransposeMatrix_ )
delete TransposeMatrix_;
76 if( !OrigMatrixIsCrsMatrix_ )
86 #ifdef ENABLE_TRANSPOSE_TIMINGS
87 Teuchos::Time myTime(
"global");
88 Teuchos::TimeMonitor MM(myTime);
89 Teuchos::RCP<Teuchos::Time> mtime;
90 mtime=MM.getNewTimer(
"Transpose: CreateTransposeLocal 1");
96 if(OrigCrsMatrix) OrigMatrixIsCrsMatrix_ =
true;
97 else OrigMatrixIsCrsMatrix_ =
false;
99 const Epetra_Map & TransMap = orig.RowMatrixColMap();
100 int TransNnz = orig.NumMyNonzeros();
107 NumMyRows_ = orig.NumMyRows();
108 NumMyCols_ = orig.NumMyCols();
110 TransRowptr.Resize(NumMyCols_+1);
111 TransColind.
Resize(TransNnz);
113 std::vector<int> CurrentStart(NumMyCols_,0);
116 if (OrigMatrixIsCrsMatrix_)
120 for (i=0; i<NumMyRows_; i++)
123 if (err != 0)
throw OrigGraph.ReportError(
"ExtractMyRowView failed",err);
124 for (j=0; j<NumIndices; j++) ++CurrentStart[Indices_[j]];
130 MaxNumEntries_ = orig.MaxNumEntries();
131 delete [] Indices_;
delete [] Values_;
132 Indices_ =
new int[MaxNumEntries_];
133 Values_ =
new double[MaxNumEntries_];
135 for (i=0; i<NumMyRows_; i++)
137 err = orig.
ExtractMyRowCopy(i, MaxNumEntries_, NumIndices, Values_, Indices_);
139 std::cerr <<
"ExtractMyRowCopy failed."<<std::endl;
142 for (j=0; j<NumIndices; j++) ++CurrentStart[Indices_[j]];
148 for (i=1;i<NumMyCols_+1; i++) TransRowptr[i] = CurrentStart[i-1] + TransRowptr[i-1];
149 for (i=0;i<NumMyCols_; i++) CurrentStart[i] = TransRowptr[i];
152 for (i=0; i<NumMyRows_; i++)
154 if (OrigMatrixIsCrsMatrix_)
157 err = orig.ExtractMyRowCopy(i, MaxNumEntries_, NumIndices, Values_, Indices_);
159 std::cerr <<
"ExtractMyRowCopy failed."<<std::endl;
163 for (j=0; j<NumIndices; j++)
165 int idx = CurrentStart[Indices_[j]];
166 TransColind[idx] = i;
167 TransVals[idx] = Values_[j];
168 ++CurrentStart[Indices_[j]];
172 #ifdef ENABLE_TRANSPOSE_TIMINGS
174 mtime=MM.getNewTimer(
"Transpose: CreateTransposeLocal 2");
182 if(OrigMatrixIsCrsMatrix_ && OrigCrsMatrix->
Importer())
184 if(OrigMatrixIsCrsMatrix_ && OrigCrsMatrix->
Exporter())
187 #ifdef ENABLE_TRANSPOSE_TIMINGS
189 mtime=MM.getNewTimer(
"Transpose: CreateTransposeLocal 3");
196 throw TempTransA1->ReportError(
"ExpertStaticFillComplete failed.",err);
199 #ifdef ENABLE_TRANSPOSE_TIMINGS
214 if( !TransposeRowMap_ )
216 if( IgnoreNonLocalCols_ )
217 TransposeRowMap_ = (
Epetra_Map *) &(orig.OperatorRangeMap());
219 TransposeRowMap_ = (
Epetra_Map *) &(orig.OperatorDomainMap());
222 NumMyRows_ = orig.NumMyRows();
223 NumMyCols_ = orig.NumMyCols();
234 newObj_ = TransposeMatrix_ = TempTransA1;
238 #ifdef ENABLE_TRANSPOSE_TIMINGS
239 Teuchos::Time myTime(
"global");
240 Teuchos::TimeMonitor MM(myTime);
241 Teuchos::RCP<Teuchos::Time> mtime;
242 mtime=MM.getNewTimer(
"Transpose: Final FusedExport");
250 #ifdef ENABLE_TRANSPOSE_TIMINGS
264 bool DeleteExporter =
false;
269 TransposeExporter =
new Epetra_Export(TransposeMatrix_->DomainMap(),TransposeMatrix_->RowMap());
272 TransposeMatrix_->PutScalar(0.0);
274 EPETRA_CHK_ERR(TransposeMatrix_->Export(*TempTransA1, *TransposeExporter,
Add));
276 if(DeleteExporter)
delete TransposeExporter;
int Resize(int Length_in)
Transform< T, T >::NewTypeRef Transform_Composite< T >typename Transform< T, T >::OriginalTypeRef orig this origObj_
Epetra_IntSerialDenseVector & ExpertExtractIndexOffset()
~RowMatrix_Transpose()
Destructor.
int ExtractMyRowView(int MyRow, int &NumEntries, double *&Values, int *&Indices) const
void resize_doubles(int nold, int nnew, double *&d)
const Epetra_Import * Importer() const
NewTypeRef operator()(OriginalTypeRef orig)
Transpose Transform Operator.
int ExtractMyRowCopy(int LocalRow, int LenOfIndices, int &NumIndices, int *Indices) const
const Epetra_Export * Exporter() const
int ExtractMyRowView(int LocalRow, int &NumIndices, int *&Indices) const
Epetra_IntSerialDenseVector & ExpertExtractIndices()
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...
const Epetra_CrsGraph & Graph() const
int ExpertStaticFillComplete(const Epetra_Map &DomainMap, const Epetra_Map &RangeMap, const Epetra_Import *Importer=0, const Epetra_Export *Exporter=0, int NumMyDiagonals=-1)
double *& ExpertExtractValues()
bool rvs()
Reverse Data Migration.