00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include "EpetraExt_BlockVector.h"
00030 #include "EpetraExt_BlockUtility.h"
00031 #include "Epetra_Map.h"
00032 #include "Epetra_Comm.h"
00033
00034 namespace EpetraExt {
00035
00036
00037
00038 BlockVector::BlockVector(
00039 const Epetra_BlockMap & BaseMap,
00040 const Epetra_BlockMap & GlobalMap)
00041 : Epetra_Vector( GlobalMap ),
00042 BaseMap_( BaseMap ),
00043 Offset_( BlockUtility::CalculateOffset( BaseMap ) )
00044 {
00045 }
00046
00047
00048
00049 BlockVector::BlockVector(const BlockVector& Source)
00050 : Epetra_Vector( dynamic_cast<const Epetra_Vector &>(Source) ),
00051 BaseMap_( Source.BaseMap_ ),
00052 Offset_( Source.Offset_ )
00053 {
00054 }
00055
00056
00057 BlockVector::~BlockVector()
00058 {
00059 }
00060
00061
00062 int BlockVector::ExtractBlockValues(Epetra_Vector & BaseVector, int GlobalBlockRow) const
00063 {
00064 int IndexOffset = GlobalBlockRow * Offset_;
00065 int localIndex=0;
00066
00067
00068
00069 for (int i=0; i<BaseMap_.NumMyElements(); i++) {
00070 localIndex = this->Map().LID((IndexOffset + BaseMap_.GID(i)));
00071 if (localIndex==-1) {
00072 cout << "Error in BlockVector::GetBlock: " << i << " "
00073 << IndexOffset << " " << BaseMap_.GID(i) << endl;
00074 return -1;
00075 }
00076 BaseVector[i] = Values_[localIndex];
00077 }
00078
00079 return 0;
00080 }
00081
00082
00083 int BlockVector::LoadBlockValues(const Epetra_Vector & BaseVector, int GlobalBlockRow)
00084 {
00085 int IndexOffset = GlobalBlockRow * Offset_;
00086 int localIndex=0;
00087
00088
00089
00090 for (int i=0; i<BaseMap_.NumMyElements(); i++) {
00091 localIndex = this->Map().LID((IndexOffset + BaseMap_.GID(i)));
00092 if (localIndex==-1) {
00093 cout << "Error in BlockVector::GetBlock: " << i << " "
00094 << IndexOffset << " " << BaseMap_.GID(i) << endl;
00095 return -1;
00096 }
00097 (*this)[localIndex] = BaseVector[i];
00098 }
00099
00100 return 0;
00101 }
00102
00103 int BlockVector::BlockSumIntoGlobalValues(int NumIndices, double* Values,
00104 int* Indices, int GlobalBlockRow)
00105 {
00106 int IndexOffset = GlobalBlockRow * Offset_;
00107 int localIndex=0;
00108
00109
00110
00111 for (int i=0; i<NumIndices; i++) {
00112 localIndex = this->Map().LID((IndexOffset + Indices[i]));
00113 if (localIndex==-1) {
00114 cout << "Error in BlockVector::BlockSumIntoGlobalValues: " << i
00115 << " " << IndexOffset << " " << Indices[i] << endl;
00116 return -1;
00117 }
00118 (*this)[localIndex] += Values[i];
00119 }
00120
00121 return 0;
00122 }
00123
00124 int BlockVector::BlockReplaceGlobalValues(int NumIndices, double* Values,
00125 int* Indices, int GlobalBlockRow)
00126 {
00127 int IndexOffset = GlobalBlockRow * Offset_;
00128 int localIndex=0;
00129
00130
00131
00132 for (int i=0; i<NumIndices; i++) {
00133 localIndex = this->Map().LID((IndexOffset + Indices[i]));
00134 if (localIndex==-1) {
00135 cout << "Error in BlockVector::BlockReplaceGlobalValues: " << i
00136 << " " << IndexOffset << " " << Indices[i] << endl;
00137 return -1;
00138 }
00139 (*this)[localIndex] = Values[i];
00140 }
00141
00142 return 0;
00143 }
00144
00145
00146 }