9#include <fei_VectorReducer.hpp>
10#include <fei_VectorSpace.hpp>
11#include <fei_Vector_core.hpp>
12#include <fei_Vector.hpp>
13#include <fei_CommUtils.hpp>
16#define fei_file "fei_VectorReducer.cpp"
18#include <fei_ErrMacros.hpp>
25 bool isSolutionVector)
28 isSolution_(isSolutionVector)
30 localProc_ =
fei::localProc(target->getVectorSpace()->getCommunicator());
31 numProcs_ =
fei::numProcs(target->getVectorSpace()->getCommunicator());
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);
62VectorReducer::~VectorReducer()
67int VectorReducer::putScalar(
double scalar)
69 return(target_->putScalar(scalar));
73int VectorReducer::update(
double a,
const fei::Vector* x,
double b)
75 return(target_->update(a, x, b));
79int VectorReducer::scatterToOverlap()
81 return(target_->scatterToOverlap());
85int VectorReducer::gatherFromOverlap(
bool accumulate)
87 reducer_->assembleReducedVector(isSolution_, *target_);
88 target_->setCommSizes();
89 return(target_->gatherFromOverlap(accumulate));
93int VectorReducer::sumIn(
int numValues,
94 const int* indices,
const double* values,
97 return(reducer_->addVectorValues(numValues, indices, values,
true,
98 isSolution_, vectorIndex, *target_));
102int VectorReducer::copyIn(
int numValues,
103 const int* indices,
const double* values,
106 return(reducer_->addVectorValues(numValues, indices, values,
false,
107 isSolution_, vectorIndex, *target_));
111int VectorReducer::giveToUnderlyingVector(
int numValues,
113 const double* values,
117 int err = reducer_->addVectorValues(numValues, indices, values, sumInto,
118 isSolution_, vectorIndex, *target_);
123int VectorReducer::sumInFieldData(
int fieldID,
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));
143int VectorReducer::copyInFieldData(
int fieldID,
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));
163int VectorReducer::copyInFieldDataLocalIDs(
int fieldID,
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));
183int VectorReducer::copyOut_FE(
int nodeNumber,
int dofOffset,
190int VectorReducer::copyOutFieldData(
int fieldID,
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));
210int VectorReducer::writeToFile(
const char* filename,
211 bool matrixMarketFormat)
213 return( target_->writeToFile(filename, matrixMarketFormat) );
217int VectorReducer::writeToStream(FEI_OSTREAM& ostrm,
218 bool matrixMarketFormat)
220 return( target_->writeToStream(ostrm, matrixMarketFormat) );
224int VectorReducer::copyOut(
int numValues,
227 int vectorIndex)
const
229 int err = reducer_->copyOutVectorValues(numValues, indices, values,
230 isSolution_, vectorIndex,
236int VectorReducer::sumIntoFEVector(
int blockID,
239 const int* nodeNumbers,
240 const int* numIndicesPerNode,
241 const double* values)
void setOverlap(int numRemoteEqns=0, const int *remoteEqns=NULL)
int localProc(MPI_Comm comm)
int numProcs(MPI_Comm comm)