//---------------------------------------------------------------------------- VectorReducer::VectorReducer(fei::SharedPtr<fei::Reducer> reducer, fei::SharedPtr<fei::Vector> target, bool isSolutionVector) : reducer_(reducer), target_(target), isSolution_(isSolutionVector) { localProc_ = fei::localProc(target->getVectorSpace()->getCommunicator()); numProcs_ = fei::numProcs(target->getVectorSpace()->getCommunicator()); fei::Vector_core* target_core = dynamic_cast<fei::Vector_core*>(target.get()); if (target_core == NULL) { throw std::runtime_error("fei::VectorReducer ERROR, target vector not dynamic_cast-able to fei::Vector_core."); } fei::SharedPtr<fei::VectorSpace> vecspace = target->getVectorSpace(); int numEqns = vecspace->getNumIndices_SharedAndOwned(); std::vector<int> eqns; vecspace->getIndices_SharedAndOwned(eqns); std::vector<int> overlap; for(int i=0; i<numEqns; ++i) { if (!reducer->isSlaveEqn(eqns[i])) { overlap.push_back(reducer->translateToReducedEqn(eqns[i])); } else { std::vector<int> masters; reducer->getSlaveMasterEqns(eqns[i], masters); for(unsigned j=0; j<masters.size(); ++j) { overlap.push_back(reducer->translateToReducedEqn(masters[j])); } } } target_core->setOverlap(overlap.size(), &overlap[0]); }