16#define fei_file "fei_VectorReducer.cpp"
25 bool isSolutionVector)
28 isSolution_(isSolutionVector)
34 if (target_core == NULL) {
35 throw std::runtime_error(
"fei::VectorReducer ERROR, target vector not dynamic_cast-able to fei::Vector_core.");
39 int numEqns = vecspace->getNumIndices_SharedAndOwned();
40 std::vector<int> eqns;
41 vecspace->getIndices_SharedAndOwned(eqns);
43 std::vector<int> overlap;
44 for(
int i=0; i<numEqns; ++i) {
45 if (!reducer->isSlaveEqn(eqns[i])) {
46 overlap.push_back(reducer->translateToReducedEqn(eqns[i]));
49 std::vector<int> masters;
50 reducer->getSlaveMasterEqns(eqns[i], masters);
51 for(
unsigned j=0; j<masters.size(); ++j) {
52 overlap.push_back(reducer->translateToReducedEqn(masters[j]));
57 int* overlap_ptr = overlap.empty() ? NULL : &overlap[0];
58 target_core->
setOverlap(overlap.size(), overlap_ptr);
94 const int* indices,
const double* values,
103 const int* indices,
const double* values,
113 const double* values,
131 int fieldSize = vspace->getFieldSize(fieldID);
132 int numIndices = numIDs*fieldSize;
133 std::vector<int> indices(numIndices);
134 int err = vspace->getGlobalIndices(numIDs, IDs, idType, fieldID, &indices[0]);
136 throw std::runtime_error(
"fei::VectorReducer::sumInFieldData ERROR in vspace->getGlobalIndices.");
139 return(
sumIn(numIndices, &indices[0], data, vectorIndex));
151 int fieldSize = vspace->getFieldSize(fieldID);
152 int numIndices = numIDs*fieldSize;
153 std::vector<int> indices(numIndices);
154 int err = vspace->getGlobalIndices(numIDs, IDs, idType, fieldID, &indices[0]);
156 throw std::runtime_error(
"fei::VectorReducer::copyInFieldData ERROR in vspace->getGlobalIndices.");
159 return(
copyIn(numIndices, &indices[0], data, vectorIndex));
171 int fieldSize = vspace->getFieldSize(fieldID);
172 int numIndices = numIDs*fieldSize;
173 std::vector<int> indices(numIndices);
174 int err = vspace->getGlobalIndicesLocalIDs(numIDs, localIDs, idType, fieldID, &indices[0]);
176 throw std::runtime_error(
"fei::VectorReducer::copyInFieldData ERROR in vspace->getGlobalIndices.");
179 return(
copyIn(numIndices, &indices[0], data, vectorIndex));
198 int fieldSize = vspace->getFieldSize(fieldID);
199 int numIndices = numIDs*fieldSize;
200 std::vector<int> indices(numIndices);
201 int err = vspace->getGlobalIndices(numIDs, IDs, idType, fieldID, &indices[0]);
203 throw std::runtime_error(
"fei::VectorReducer::copyOutFieldData ERROR in vspace->getGlobalIndices.");
206 return(
copyOut(numIndices, &indices[0], data, vectorIndex));
211 bool matrixMarketFormat)
218 bool matrixMarketFormat)
227 int vectorIndex)
const
239 const int* nodeNumbers,
240 const int* numIndicesPerNode,
241 const double* values)
int addVectorValues(int numValues, const int *globalIndices, const double *values, bool sum_into, bool soln_vector, int vectorIndex, fei::Vector &feivec)
void assembleReducedVector(bool soln_vector, fei::Vector &feivec)
int copyOutVectorValues(int numValues, const int *globalIndices, double *values, bool soln_vector, int vectorIndex, fei::Vector &feivec)
fei::SharedPtr< fei::Reducer > reducer_
int copyOutFieldData(int fieldID, int idType, int numIDs, const int *IDs, double *data, int vectorIndex=0)
int copyOut_FE(int nodeNumber, int dofOffset, double &value)
VectorReducer(fei::SharedPtr< fei::Reducer > reducer, fei::SharedPtr< fei::Vector > target, bool isSolutionVector=false)
int sumInFieldData(int fieldID, int idType, int numIDs, const int *IDs, const double *data, int vectorIndex=0)
int writeToStream(FEI_OSTREAM &ostrm, bool matrixMarketFormat=true)
int copyOut(int numValues, const int *indices, double *values, int vectorIndex=0) const
int sumIn(int numValues, const int *indices, const double *values, int vectorIndex=0)
int update(double a, const fei::Vector *x, double b)
int copyIn(int numValues, const int *indices, const double *values, int vectorIndex=0)
int gatherFromOverlap(bool accumulate=true)
int sumIntoFEVector(int blockID, int connOffset, int numNodes, const int *nodeNumbers, const int *numIndicesPerNode, const double *values)
int giveToUnderlyingVector(int numValues, const int *indices, const double *values, bool sumInto=true, int vectorIndex=0)
int copyInFieldDataLocalIDs(int fieldID, int idType, int numIDs, const int *localIDs, const double *data, int vectorIndex=0)
int copyInFieldData(int fieldID, int idType, int numIDs, const int *IDs, const double *data, int vectorIndex=0)
int writeToFile(const char *filename, bool matrixMarketFormat=true)
fei::SharedPtr< fei::Vector > target_
int putScalar(double scalar)
void setOverlap(int numRemoteEqns=0, const int *remoteEqns=NULL)
virtual int putScalar(double scalar)=0
virtual int scatterToOverlap()=0
virtual int update(double a, const fei::Vector *x, double b)=0
virtual void setCommSizes()=0
virtual fei::SharedPtr< fei::VectorSpace > getVectorSpace() const =0
virtual int writeToStream(FEI_OSTREAM &ostrm, bool matrixMarketFormat=true)=0
virtual int writeToFile(const char *filename, bool matrixMarketFormat=true)=0
virtual int gatherFromOverlap(bool accumulate=true)=0
int localProc(MPI_Comm comm)
int numProcs(MPI_Comm comm)