43 #include "Epetra_Map.h" 
   44 #include "Epetra_Comm.h" 
   50 template<
typename int_type>
 
   53         const int_type * RowIndices,
 
   58   int_type BaseIndex = (int_type) BaseMap.IndexBase64();
 
   60     Offset = BlockUtility::TCalculateOffset<int_type>(BaseMap);
 
   64   int TotalSize = NumBlockRows * Size;
 
   65   vector<int_type> GIDs(Size);
 
   68   vector<int_type> GlobalGIDs( TotalSize );
 
   69   for( 
int i = 0; i < NumBlockRows; ++i )
 
   71     for( 
int j = 0; j < Size; ++j )
 
   72       GlobalGIDs[i*Size+j] = GIDs[j] + RowIndices[i] * Offset;
 
   76   int_type TotalSize_int_type = TotalSize;
 
   77   GlobalComm.
SumAll( &TotalSize_int_type, &GlobalSize, 1 );
 
   80     new Epetra_Map( GlobalSize, TotalSize, &GlobalGIDs[0], BaseIndex,
 
   87 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES 
   90         const int * RowIndices,
 
   96     return TGenerateBlockMap<int>(BaseMap, RowIndices, NumBlockRows, GlobalComm, Offset);
 
   98     throw "EpetraExt::BlockUtility::GenerateBlockMap: Global Indices not int.";
 
  102 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES 
  105         const long long * RowIndices,
 
  111     return TGenerateBlockMap<long long>(BaseMap, RowIndices, NumBlockRows, GlobalComm, Offset);
 
  113     throw "EpetraExt::BlockUtility::GenerateBlockMap: Global Indices not long long.";
 
  117 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES 
  120         const std::vector<int>& RowIndices,
 
  129 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES 
  132         const std::vector<long long>& RowIndices,
 
  148 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES 
  157 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES 
  160                           BlockMap.MyGlobalElements64(),
 
  166     throw "EpetraExt::BlockUtility::GenerateBlockMap: Error Global Indices unknown.";
 
  170 template<
typename int_type>
 
  173         const vector< vector<int_type> > & RowStencil,
 
  174         const vector<int_type> & RowIndices,
 
  179   int_type BaseIndex = (int_type) BaseMap.IndexBase64();
 
  180   int_type Offset = BlockUtility::TCalculateOffset<int_type>(BaseMap);
 
  183   int NumBlockRows = RowIndices.size();
 
  185   int TotalSize = NumBlockRows * Size;
 
  186   vector<int_type> GIDs(Size);
 
  189   vector<int_type> GlobalGIDs( TotalSize );
 
  190   for( 
int i = 0; i < NumBlockRows; ++i )
 
  192     for( 
int j = 0; j < Size; ++j )
 
  193       GlobalGIDs[i*Size+j] = GIDs[j] + RowIndices[i] * Offset;
 
  197   int_type TotalSize_int_type = TotalSize;
 
  198   GlobalComm.
SumAll( &TotalSize_int_type, &GlobalSize, 1 );
 
  200   Epetra_Map GlobalMap( GlobalSize, TotalSize, &GlobalGIDs[0], BaseIndex, GlobalComm );
 
  203   vector<int_type> Indices(MaxIndices);
 
  207                                dynamic_cast<Epetra_BlockMap&>(GlobalMap),
 
  210   for( 
int i = 0; i < NumBlockRows; ++i )
 
  212     int StencilSize = RowStencil[i].size();
 
  213     for( 
int j = 0; j < Size; ++j )
 
  215       int_type BaseRow = (int_type) BaseMap.GID64(j);
 
  216       int_type GlobalRow = (int_type) GlobalMap.GID64(j+i*Size);
 
  219       for( 
int k = 0; k < StencilSize; ++k )
 
  221         int_type ColOffset = (RowIndices[i]+RowStencil[i][k]) * Offset;
 
  222         if( k > 0 ) ColOffset -= (RowIndices[i]+RowStencil[i][k-1]) * Offset;
 
  224         for( 
int l = 0; l < NumIndices; ++l )
 
  225           Indices[l] += ColOffset;
 
  237 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES 
  240         const vector< vector<int> > & RowStencil,
 
  241         const vector<int> & RowIndices,
 
  245     return TGenerateBlockGraph<int>(BaseGraph, RowStencil, RowIndices, GlobalComm);
 
  247     throw "EpetraExt::BlockUtility::GenerateBlockGraph: Error Global Indices not int.";
 
  251 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES 
  254         const vector< vector<long long> > & RowStencil,
 
  255         const vector<long long> & RowIndices,
 
  259     return TGenerateBlockGraph<long long>(BaseGraph, RowStencil, RowIndices, GlobalComm);
 
  261     throw "EpetraExt::BlockUtility::GenerateBlockGraph: Error Global Indices not long long.";
 
  266 template<
typename int_type>
 
  269         const vector< vector<int_type> > & RowStencil,
 
  270         const vector<int_type> & RowIndices,
 
  276   int_type BaseIndex = (int_type) BaseMap.IndexBase64();
 
  277   int_type Offset = BlockUtility::TCalculateOffset<int_type>(BaseMap);
 
  280   int NumBlockRows = RowIndices.size();
 
  282   int TotalSize = NumBlockRows * Size;
 
  283   vector<int_type> GIDs(Size);
 
  286   vector<int_type> GlobalGIDs( TotalSize );
 
  287   for( 
int i = 0; i < NumBlockRows; ++i )
 
  289     for( 
int j = 0; j < Size; ++j )
 
  290       GlobalGIDs[i*Size+j] = GIDs[j] + RowIndices[i] * Offset;
 
  294   int_type TotalSize_int_type = TotalSize;
 
  295   GlobalComm.
SumAll( &TotalSize_int_type, &GlobalSize, 1 );
 
  297   Epetra_Map GlobalMap( GlobalSize, TotalSize, &GlobalGIDs[0], BaseIndex, GlobalComm );
 
  300   vector<int> Indices_local(MaxIndices);
 
  301   vector<int_type> Indices_global(MaxIndices);
 
  302   vector<double> Values(MaxIndices);
 
  306                                dynamic_cast<Epetra_BlockMap&>(GlobalMap),
 
  309   for( 
int i = 0; i < NumBlockRows; ++i )
 
  311     int StencilSize = RowStencil[i].size();
 
  312     for( 
int j = 0; j < Size; ++j )
 
  314       int_type GlobalRow = (int_type) GlobalMap.GID64(j+i*Size);
 
  316       BaseMatrix.
ExtractMyRowCopy( j, MaxIndices, NumIndices, &Values[0], &Indices_local[0] );
 
  317       for( 
int l = 0; l < NumIndices; ++l ) Indices_global[l] = (int_type) BaseColMap.GID64(Indices_local[l]);
 
  319       for( 
int k = 0; k < StencilSize; ++k )
 
  321         int_type ColOffset = (RowIndices[i]+RowStencil[i][k]) * Offset;
 
  322         if( k > 0 ) ColOffset -= (RowIndices[i]+RowStencil[i][k-1]) * Offset;
 
  324         for( 
int l = 0; l < NumIndices; ++l )
 
  325           Indices_global[l] += ColOffset;
 
  337 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES 
  340         const vector< vector<int> > & RowStencil,
 
  341         const vector<int> & RowIndices,
 
  345     return TGenerateBlockGraph<int>(BaseMatrix, RowStencil, RowIndices, GlobalComm);
 
  347     throw "EpetraExt::BlockUtility::GenerateBlockGraph: Error Global Indices not int.";
 
  351 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES 
  354         const vector< vector<long long> > & RowStencil,
 
  355         const vector<long long> & RowIndices,
 
  359     return TGenerateBlockGraph<long long>(BaseMatrix, RowStencil, RowIndices, GlobalComm);
 
  361     throw "EpetraExt::BlockUtility::GenerateBlockGraph: Error Global Indices not long long.";
 
  366 template<
typename int_type>
 
  374   int_type ROffset = BlockUtility::TCalculateOffset<int_type>(BaseRowMap);
 
  376   int_type COffset = BlockUtility::TCalculateOffset<int_type>(BaseColMap);
 
  383   vector<int_type> RowIndices(NumBlockRows);
 
  384   BlockRowMap.MyGlobalElements(&RowIndices[0]);
 
  393   vector<int_type> Indices(MaxIndices);
 
  396                                dynamic_cast<Epetra_BlockMap&>(*GlobalRowMap),
 
  399   int NumBlockIndices, NumBaseIndices;
 
  400   int *BlockIndices, *BaseIndices;
 
  401   for( 
int i = 0; i < NumBlockRows; ++i )
 
  405     for( 
int j = 0; j < Size; ++j )
 
  407       int_type GlobalRow = (int_type) GlobalRowMap->GID64(j+i*Size);
 
  410       for( 
int k = 0; k < NumBlockIndices; ++k )
 
  412         int_type ColOffset = (int_type) BlockColMap.GID64(BlockIndices[k]) * COffset;
 
  414         for( 
int l = 0; l < NumBaseIndices; ++l )
 
  415           Indices[l] = (int_type) BaseGraph.GCID64(BaseIndices[l]) + ColOffset;
 
  432   GlobalGraph->
FillComplete(*GlobalDomainMap, *GlobalRangeMap);
 
  434   delete GlobalDomainMap;
 
  435   delete GlobalRangeMap;
 
  446 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES 
  448     return TGenerateBlockGraph<int>(BaseGraph, LocalBlockGraph, GlobalComm);
 
  451 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES 
  453       return TGenerateBlockGraph<long long>(BaseGraph, LocalBlockGraph, GlobalComm);
 
  456     throw "EpetraExt::BlockUtility::GenerateBlockGraph: Error Global Indices unknown.";
 
  460 template<
typename int_type>
 
  461 void BlockUtility::TGenerateRowStencil(
const Epetra_CrsGraph& LocalBlockGraph,
 
  462                                       std::vector<int_type> RowIndices,
 
  463                                       std::vector< std::vector<int_type> >& RowStencil)
 
  466   int NumMyRows = LocalBlockGraph.
NumMyRows();
 
  467   RowIndices.resize(NumMyRows);
 
  472   RowStencil.resize(NumMyRows);
 
  474     for (
int i=0; i<NumMyRows; i++) {
 
  475       int_type Row = RowIndices[i];
 
  477       RowStencil[i].resize(NumCols);
 
  480       for (
int k=0; k<NumCols; k++)
 
  481         RowStencil[i][k] -= Row;
 
  485     for (
int i=0; i<NumMyRows; i++) {
 
  487     std::vector<int> RowStencil_local(NumCols);
 
  488       RowStencil[i].resize(NumCols);
 
  490                                        &RowStencil_local[0]);
 
  491       for (
int k=0; k<NumCols; k++)
 
  492         RowStencil[i][k] = (int_type) ((int) (LocalBlockGraph.GCID64(RowStencil_local[k]) - RowIndices[i]));
 
  497 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES 
  499                                       std::vector<int> RowIndices,
 
  500                                       std::vector< std::vector<int> >& RowStencil)
 
  503     BlockUtility::TGenerateRowStencil<int>(LocalBlockGraph, RowIndices, RowStencil);
 
  505     throw "EpetraExt::BlockUtility::GenerateRowStencil: Global Indices not int.";
 
  509 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES 
  511                                       std::vector<long long> RowIndices,
 
  512                                       std::vector< std::vector<long long> >& RowStencil)
 
  515     BlockUtility::TGenerateRowStencil<long long>(LocalBlockGraph, RowIndices, RowStencil);
 
  517     throw "EpetraExt::BlockUtility::GenerateRowStencil: Global Indices not long long.";
 
  523 template<
typename int_type>
 
  524 int_type BlockUtility::TCalculateOffset(
const Epetra_BlockMap & BaseMap)
 
  526   int_type MaxGID = (int_type) BaseMap.MaxAllGID64();
 
  536 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES 
  540     return TCalculateOffset<int>(BaseMap);
 
  542     throw "EpetraExt::BlockUtility::GenerateBlockMap: Global Indices not int.";
 
  548   return TCalculateOffset<long long>(BaseMap);
 
const Epetra_BlockMap & RangeMap() const 
 
virtual const Epetra_Map & RowMatrixRowMap() const =0
 
int NumGlobalIndices(long long Row) const 
 
bool GlobalIndicesLongLong() const 
 
int MyGlobalElements(int *MyGlobalElementList) const 
 
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_BlockMap & ColMap() const 
 
bool GlobalIndicesInt() const 
 
const Epetra_BlockMap & DomainMap() const 
 
static long long CalculateOffset64(const Epetra_BlockMap &BaseMap)
 
virtual int SumAll(double *PartialSums, double *GlobalSums, int Count) const =0
 
int NumMyElements() const 
 
virtual int MaxNumEntries() const =0
 
static int CalculateOffset(const Epetra_BlockMap &BaseMap)
Routine for calculating Offset for creating unique global IDs for Block representation. 
 
int ExtractMyRowCopy(int LocalRow, int LenOfIndices, int &NumIndices, int *Indices) const 
 
bool IndicesAreGlobal() const 
 
const Epetra_BlockMap & RowMap() const 
 
int ExtractGlobalRowCopy(int GlobalRow, int LenOfIndices, int &NumIndices, int *Indices) const 
 
int InsertGlobalIndices(int GlobalRow, int NumIndices, int *Indices)
 
int ExtractMyRowView(int LocalRow, int &NumIndices, int *&Indices) const 
 
int NumMyIndices(int Row) const 
 
int MaxNumIndices() const 
 
virtual int ExtractMyRowCopy(int MyRow, int Length, int &NumEntries, double *Values, int *Indices) const =0
 
static Epetra_Map * GenerateBlockMap(const Epetra_BlockMap &BaseMap, const int *RowIndices, int num_indices, const Epetra_Comm &GlobalComm, int Offset=0)
 
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.