44 #include "Epetra_Map.h"
51 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
54 const vector<int> & RowStencil,
58 BaseGraph_( BaseGraph ),
59 RowStencil_int_( vector< vector<int> >(1,RowStencil) ),
60 RowIndices_int_( vector<int>(1,rowIndex) ),
67 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
70 const vector<long long> & RowStencil,
74 BaseGraph_( BaseGraph ),
75 RowStencil_LL_( vector< vector<long long> >(1,RowStencil) ),
76 RowIndices_LL_( vector<long long>(1,rowIndex) ),
84 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
87 const vector< vector<int> > & RowStencil,
88 const vector<int> & RowIndices,
91 BaseGraph_( BaseGraph ),
92 RowStencil_int_( RowStencil ),
93 RowIndices_int_( RowIndices ),
99 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
102 const vector< vector<long long> > & RowStencil,
103 const vector<long long> & RowIndices,
106 BaseGraph_( BaseGraph ),
107 RowStencil_LL_( RowStencil ),
108 RowIndices_LL_( RowIndices ),
121 BaseGraph_( BaseGraph ),
122 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
126 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
130 ROffset_(
BlockUtility::CalculateOffset64(BaseGraph.RowMap())),
131 COffset_(
BlockUtility::CalculateOffset64(BaseGraph.ColMap()))
133 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
138 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
143 throw "EpetraExt::BlockCrsMatrix::BlockCrsMatrix: Error, Global indices unknown.";
147 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
150 const vector< vector<int> > & RowStencil,
151 const vector<int> & RowIndices,
154 BaseGraph_(
Copy, BaseMatrix.RowMatrixRowMap(), 1 ),
155 RowStencil_int_( RowStencil ),
156 RowIndices_int_( RowIndices ),
157 ROffset_(
BlockUtility::CalculateOffset64(BaseMatrix.RowMatrixRowMap())),
158 COffset_(
BlockUtility::CalculateOffset64(BaseMatrix.RowMatrixColMap()))
163 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
166 const vector< vector<long long> > & RowStencil,
167 const vector<long long> & RowIndices,
169 :
Epetra_CrsMatrix(
Copy, *(BlockUtility::GenerateBlockGraph( BaseMatrix, RowStencil, RowIndices, GlobalComm )) ),
170 BaseGraph_(
Copy, BaseMatrix.RowMatrixRowMap(), 1 ),
171 RowStencil_LL_( RowStencil ),
172 RowIndices_LL_( RowIndices ),
173 ROffset_(BlockUtility::CalculateOffset64(BaseMatrix.RowMatrixRowMap())),
174 COffset_(BlockUtility::CalculateOffset64(BaseMatrix.RowMatrixColMap()))
182 BaseGraph_( Matrix.BaseGraph_ ),
183 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
184 RowStencil_int_( Matrix.RowStencil_int_ ),
185 RowIndices_int_( Matrix.RowIndices_int_ ),
187 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
188 RowStencil_LL_( Matrix.RowStencil_LL_ ),
189 RowIndices_LL_( Matrix.RowIndices_LL_ ),
191 ROffset_( Matrix.ROffset_ ),
192 COffset_( Matrix.COffset_ )
202 template<
typename int_type>
203 void BlockCrsMatrix::TLoadBlock(
const Epetra_RowMatrix & BaseMatrix,
const int_type Row,
const int_type Col)
205 std::vector<int_type>& RowIndices_ = TRowIndices<int_type>();
206 std::vector< std::vector<int_type> >& RowStencil_ = TRowStencil<int_type>();
207 int_type RowOffset = RowIndices_[(std::size_t)Row] *
ROffset_;
208 int_type ColOffset = (RowIndices_[(std::size_t)Row] + RowStencil_[(std::size_t)Row][(std::
size_t)Col]) *
COffset_;
219 vector<
int> Indices_local(MaxIndices);
220 vector<int_type> Indices_global(MaxIndices);
221 vector<
double> vals(MaxIndices);
225 for (
int i=0; i<BaseMap.NumMyElements(); i++) {
226 BaseMatrix.
ExtractMyRowCopy( i, MaxIndices, NumIndices, &vals[0], &Indices_local[0] );
229 for(
int l = 0; l < NumIndices; ++l )
230 Indices_global[l] = ColOffset + (int_type) BaseColMap.GID64(Indices_local[l]);
232 int_type BaseRow = (int_type) BaseMap.GID64(i);
233 ierr = this->
ReplaceGlobalValues(BaseRow + RowOffset, NumIndices, &vals[0], &Indices_global[0]);
234 if (ierr != 0) std::cout <<
"WARNING BlockCrsMatrix::LoadBlock ReplaceGlobalValues err = " << ierr <<
235 "\n\t Row " << BaseRow + RowOffset <<
"Col start" << Indices_global[0] << std::endl;
240 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
244 return TLoadBlock<int>(BaseMatrix, Row, Col);
246 throw "EpetraExt::BlockCrsMatrix::LoadBlock: Global indices not int";
250 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
254 return TLoadBlock<long long>(BaseMatrix, Row, Col);
256 throw "EpetraExt::BlockCrsMatrix::LoadBlock: Global indices not long long";
261 template<
typename int_type>
262 void BlockCrsMatrix::TSumIntoBlock(
double alpha,
const Epetra_RowMatrix & BaseMatrix,
const int_type Row,
const int_type Col)
264 std::vector<int_type>& RowIndices_ = TRowIndices<int_type>();
265 std::vector< std::vector<int_type> >& RowStencil_ = TRowStencil<int_type>();
266 int_type RowOffset = RowIndices_[(std::size_t)Row] *
ROffset_;
267 int_type ColOffset = (RowIndices_[(std::size_t)Row] + RowStencil_[(std::size_t)Row][(std::
size_t)Col]) * COffset_;
277 int MaxIndices = BaseMatrix.MaxNumEntries();
278 vector<
int> Indices_local(MaxIndices);
279 vector<int_type> Indices_global(MaxIndices);
280 vector<
double> vals(MaxIndices);
284 for (
int i=0; i<BaseMap.NumMyElements(); i++) {
285 BaseMatrix.
ExtractMyRowCopy( i, MaxIndices, NumIndices, &vals[0], &Indices_local[0] );
288 for(
int l = 0; l < NumIndices; ++l ) {
289 Indices_global[l] = ColOffset + (int_type) BaseColMap.GID64(Indices_local[l]);
293 int_type BaseRow = (int_type) BaseMap.GID64(i);
294 ierr = this->
SumIntoGlobalValues(BaseRow + RowOffset, NumIndices, &vals[0], &Indices_global[0]);
296 std::cout <<
"WARNING BlockCrsMatrix::SumIntoBlock SumIntoGlobalValues "
297 "err = " << ierr << std::endl <<
"\t Row " << BaseRow + RowOffset <<
298 "Col start" << Indices_global[0] << std::endl;
303 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
307 return TSumIntoBlock<int>(alpha, BaseMatrix, Row, Col);
309 throw "EpetraExt::BlockCrsMatrix::SumIntoBlock: Global indices not int";
313 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
317 return TSumIntoBlock<long long>(alpha, BaseMatrix, Row, Col);
319 throw "EpetraExt::BlockCrsMatrix::SumIntoBlock: Global indices not long long";
324 template<
typename int_type>
325 void BlockCrsMatrix::TSumIntoGlobalBlock(
double alpha,
const Epetra_RowMatrix & BaseMatrix,
const int_type Row,
const int_type Col)
327 int_type RowOffset = Row *
ROffset_;
328 int_type ColOffset = Col *
COffset_;
339 vector<int> Indices_local(MaxIndices);
340 vector<int_type> Indices_global(MaxIndices);
341 vector<double> vals(MaxIndices);
346 BaseMatrix.
ExtractMyRowCopy( i, MaxIndices, NumIndices, &vals[0], &Indices_local[0] );
349 for(
int l = 0; l < NumIndices; ++l ) {
350 Indices_global[l] = ColOffset + (int_type) BaseColMap.GID64(Indices_local[l]);
354 int_type BaseRow = (int_type) BaseMap.GID64(i);
355 ierr = this->
SumIntoGlobalValues(BaseRow + RowOffset, NumIndices, &vals[0], &Indices_global[0]);
357 std::cout <<
"WARNING BlockCrsMatrix::SumIntoBlock SumIntoGlobalValues "
358 <<
"err = " << ierr << std::endl
359 <<
"\t Row " << BaseRow + RowOffset
360 <<
" Col start" << Indices_global[0] << std::endl;
365 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
369 return TSumIntoGlobalBlock<int>(alpha, BaseMatrix, Row, Col);
371 throw "EpetraExt::BlockCrsMatrix::SumIntoGlobalBlock: Global indices not int";
375 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
379 return TSumIntoGlobalBlock<long long>(alpha, BaseMatrix, Row, Col);
381 throw "EpetraExt::BlockCrsMatrix::SumIntoGlobalBlock: Global indices not long long";
387 template<
typename int_type>
388 void BlockCrsMatrix::TBlockSumIntoGlobalValues(
const int_type BaseRow,
int NumIndices,
389 double* vals,
const int_type* Indices,
const int_type Row,
const int_type Col)
392 std::vector<int_type>& RowIndices_ = TRowIndices<int_type>();
393 std::vector< std::vector<int_type> >& RowStencil_ = TRowStencil<int_type>();
394 int_type RowOffset = RowIndices_[(std::size_t)Row] * ROffset_;
395 int_type ColOffset = (RowIndices_[(std::size_t)Row] + RowStencil_[(std::size_t)Row][(std::
size_t)Col]) * COffset_;
398 vector<int_type> OffsetIndices(NumIndices);
399 for(
int l = 0; l < NumIndices; ++l ) OffsetIndices[l] = Indices[l] + ColOffset;
402 vals, &OffsetIndices[0]);
405 std::cout <<
"WARNING BlockCrsMatrix::BlockSumIntoGlobalValues err = "
406 << ierr << std::endl <<
"\t Row " << BaseRow + RowOffset
407 <<
" Col start" << Indices[0] << std::endl;
411 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
413 double* vals,
const int* Indices,
const int Row,
const int Col)
416 return TBlockSumIntoGlobalValues<int>(BaseRow, NumIndices, vals, Indices, Row, Col);
418 throw "EpetraExt::BlockCrsMatrix::BlockSumIntoGlobalValues: Global indices not int";
422 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
424 double* vals,
const long long* Indices,
const long long Row,
const long long Col)
427 return TBlockSumIntoGlobalValues<long long>(BaseRow, NumIndices, vals, Indices, Row, Col);
429 throw "EpetraExt::BlockCrsMatrix::BlockSumIntoGlobalValues: Global indices not long long";
434 template<
typename int_type>
435 void BlockCrsMatrix::TBlockReplaceGlobalValues(
const int_type BaseRow,
int NumIndices,
436 double* vals,
const int_type* Indices,
const int_type Row,
const int_type Col)
439 std::vector<int_type>& RowIndices_ = TRowIndices<int_type>();
440 std::vector< std::vector<int_type> >& RowStencil_ = TRowStencil<int_type>();
441 int_type RowOffset = RowIndices_[(std::size_t)Row] * ROffset_;
442 int_type ColOffset = (RowIndices_[(std::size_t)Row] + RowStencil_[(std::size_t)Row][(std::
size_t)Col]) * COffset_;
445 vector<int_type> OffsetIndices(NumIndices);
446 for(
int l = 0; l < NumIndices; ++l ) OffsetIndices[l] = Indices[l] + ColOffset;
449 vals, &OffsetIndices[0]);
452 std::cout <<
"WARNING BlockCrsMatrix::BlockReplaceGlobalValues err = "
453 << ierr <<
"\n\t Row " << BaseRow + RowOffset <<
"Col start"
454 << Indices[0] << std::endl;
458 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
460 double* vals,
const int* Indices,
const int Row,
const int Col)
463 return TBlockReplaceGlobalValues<int>(BaseRow, NumIndices, vals, Indices, Row, Col);
465 throw "EpetraExt::BlockCrsMatrix::BlockReplaceGlobalValues: Global indices not int";
469 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
471 double* vals,
const long long* Indices,
const long long Row,
const long long Col)
474 return TBlockReplaceGlobalValues<long long>(BaseRow, NumIndices, vals, Indices, Row, Col);
476 throw "EpetraExt::BlockCrsMatrix::BlockReplaceGlobalValues: Global indices not long long";
481 template<
typename int_type>
482 void BlockCrsMatrix::TBlockExtractGlobalRowView(
const int_type BaseRow,
489 std::vector<int_type>& RowIndices_ = TRowIndices<int_type>();
490 std::vector< std::vector<int_type> >& RowStencil_ = TRowStencil<int_type>();
491 int_type RowOffset = RowIndices_[(std::size_t)Row] * ROffset_;
492 int_type ColOffset = (RowIndices_[(std::size_t)Row] + RowStencil_[(std::size_t)Row][(std::
size_t)Col]) * COffset_;
500 NumEntries -= ColOffset;
503 std::cout <<
"WARNING BlockCrsMatrix::BlockExtractGlobalRowView err = "
504 << ierr <<
"\n\t Row " << BaseRow + RowOffset
505 <<
" Col " << Col+ColOffset << std::endl;
509 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
511 double*& vals,
const int Row,
const int Col)
514 return TBlockExtractGlobalRowView<int>(BaseRow, NumEntries, vals, Row, Col);
516 throw "EpetraExt::BlockCrsMatrix::BlockExtractGlobalRowView: Global indices not int";
520 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
522 double*& vals,
const long long Row,
const long long Col)
525 return TBlockExtractGlobalRowView<long long>(BaseRow, NumEntries, vals, Row, Col);
527 throw "EpetraExt::BlockCrsMatrix::BlockExtractGlobalRowView: Global indices not long long";
533 template<
typename int_type>
534 void BlockCrsMatrix::TExtractBlock(
Epetra_CrsMatrix & BaseMatrix,
const int_type Row,
const int_type Col)
536 std::vector<int_type>& RowIndices_ = TRowIndices<int_type>();
537 std::vector< std::vector<int_type> >& RowStencil_ = TRowStencil<int_type>();
538 int_type RowOffset = RowIndices_[(std::size_t)Row] * ROffset_;
539 int_type ColOffset = (RowIndices_[(std::size_t)Row] + RowStencil_[(std::size_t)Row][(std::
size_t)Col]) * COffset_;
549 int MaxIndices = BaseMatrix.MaxNumEntries();
550 vector<int_type> Indices(MaxIndices);
551 vector<
double> vals(MaxIndices);
560 for (
int i=0; i<BaseMap.NumMyElements(); i++) {
563 int_type BaseRow = (int_type) BaseMap.GID64(i);
565 ierr = this->
ExtractMyRowView(myBlkBaseRow, BlkNumIndices, BlkValues, BlkIndices);
569 for(
int l = 0; l < BlkNumIndices; ++l ) {
571 indx = icol - ColOffset;
572 if (indx >= 0 && indx < COffset_) {
573 Indices[NumIndices] = indx;
574 vals[NumIndices] = BlkValues[l];
584 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
588 return TExtractBlock<int>(BaseMatrix, Row, Col);
590 throw "EpetraExt::BlockCrsMatrix::ExtractBlock: Global indices not int";
594 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
598 return TExtractBlock<long long>(BaseMatrix, Row, Col);
600 throw "EpetraExt::BlockCrsMatrix::ExtractBlock: Global indices not long long";
void LoadBlock(const Epetra_RowMatrix &BaseMatrix, const int Row, const int Col)
Routine for loading a base matrices values into the large Block Matrix The Row and Col arguments are ...
virtual int ReplaceGlobalValues(int GlobalRow, int NumEntries, const double *Values, const int *Indices)
virtual const Epetra_Map & RowMatrixRowMap() const =0
virtual int SumIntoGlobalValues(int GlobalRow, int NumEntries, const double *Values, const int *Indices)
bool GlobalIndicesLongLong() const
std::vector< std::vector< int > > RowStencil_int_
static void GenerateRowStencil(const Epetra_CrsGraph &LocalBlockGraph, std::vector< int > RowIndices, std::vector< std::vector< int > > &RowStencil)
Generate stencil arrays from a local block graph.
const Epetra_Map & RowMatrixRowMap() const
void BlockReplaceGlobalValues(const int BaseRow, int NumIndices, double *Values, const int *Indices, const int Row, const int Col)
std::vector< long long > RowIndices_LL_
const Epetra_BlockMap & ColMap() const
void ExtractBlock(Epetra_CrsMatrix &BaseMatrix, const int Row, const int Col)
bool GlobalIndicesInt() const
static long long CalculateOffset64(const Epetra_BlockMap &BaseMap)
int ExtractMyRowView(int MyRow, int &NumEntries, double *&Values, int *&Indices) const
void BlockExtractGlobalRowView(const int BaseRow, int &NumEntries, double *&Values, const int Row, const int Col)
int NumMyElements() const
virtual int MaxNumEntries() const =0
std::vector< std::vector< long long > > RowStencil_LL_
int ExtractGlobalRowView(int GlobalRow, int &NumEntries, double *&Values, int *&Indices) const
int MaxNumEntries() const
std::vector< int > RowIndices_int_
void SumIntoGlobalBlock(double alpha, const Epetra_RowMatrix &BaseMatrix, const int Row, const int Col)
Routine for summing base matrices values into the large Block Matrix The Row and Col arguments are gl...
const Epetra_BlockMap & RowMap() const
virtual ~BlockCrsMatrix()
Destructor.
BlockCrsMatrix(const Epetra_CrsGraph &BaseGraph, const std::vector< int > &RowStencil, int RowIndex, const Epetra_Comm &GlobalComm)
BlockCrsMatrix constuctor with one block row per processor.
const Epetra_Map & RowMatrixColMap() const
void SumIntoBlock(double alpha, const Epetra_RowMatrix &BaseMatrix, const int Row, const int Col)
Routine for summing base matrices values into the large Block Matrix The Row and Col arguments are in...
virtual int ExtractMyRowCopy(int MyRow, int Length, int &NumEntries, double *Values, int *Indices) const =0
void BlockSumIntoGlobalValues(const int BaseRow, int NumIndices, double *Values, const int *Indices, const int Row, const int Col)
Sum Entries into Block matrix using base-matrix numbering plus block Row and Col The Row and Col argu...
virtual const Epetra_Map & RowMatrixColMap() const =0
static Epetra_CrsGraph * GenerateBlockGraph(const Epetra_CrsGraph &BaseGraph, const std::vector< std::vector< int > > &RowStencil, const std::vector< int > &RowIndices, const Epetra_Comm &GlobalComm)
BlockCrsMatrix constuctor.