51 using ParentType = Dune::BlockVector<FieldVector>;
52 using BlockVector = Dune::BlockVector<FieldVector>;
60 : ParentType(overlap.numDomestic()), overlap_(&overlap)
68 , numIndicesSendBuff_(
obv.numIndicesSendBuff_)
69 , indicesSendBuff_(
obv.indicesSendBuff_)
70 , indicesRecvBuff_(
obv.indicesRecvBuff_)
71 , valuesSendBuff_(
obv.valuesSendBuff_)
72 , valuesRecvBuff_(
obv.valuesRecvBuff_)
73 , overlap_(
obv.overlap_)
86 using ParentType::operator=;
94 ParentType::operator=(
obv);
95 numIndicesSendBuff_ =
obv.numIndicesSendBuff_;
96 indicesSendBuff_ =
obv.indicesSendBuff_;
97 indicesRecvBuff_ =
obv.indicesRecvBuff_;
98 valuesSendBuff_ =
obv.valuesSendBuff_;
99 valuesRecvBuff_ =
obv.valuesRecvBuff_;
100 overlap_ =
obv.overlap_;
108 template <
class BlockVector>
111 size_t numDomestic = overlap_->numDomestic();
132 template <
class NativeBlockVector>
135 Index numDomestic = overlap_->numDomestic();
141 (*this)[
static_cast<unsigned>(
domRowIdx)] = 0.0;
155 template <
class NativeBlockVector>
159 size_t numNative = overlap_->numNative();
178 for (
const auto peerRank: overlap_->peerSet())
179 sendEntries_(peerRank);
182 for (
const auto peerRank: overlap_->peerSet())
183 receiveFromMaster_(peerRank);
196 for (
const auto peerRank: overlap_->peerSet())
197 sendEntries_(peerRank);
200 for (
const auto peerRank: overlap_->peerSet())
201 receiveAdd_(peerRank);
209 for (
unsigned i = 0; i < this->size(); ++i) {
210 std::cout <<
"row " << i << (overlap_->isLocal(i) ?
" " :
"*")
211 <<
": " << (*
this)[i] <<
"\n" << std::flush;
216 void createBuffers_()
220 typename PeerSet::const_iterator
peerIt;
221 typename PeerSet::const_iterator
peerEndIt = overlap_->peerSet().end();
224 peerIt = overlap_->peerSet().begin();
226 ProcessRank peerRank = *
peerIt;
228 size_t numEntries = overlap_->foreignOverlapSize(peerRank);
229 numIndicesSendBuff_[peerRank] = std::make_shared<MpiBuffer<unsigned> >(1);
230 indicesSendBuff_[peerRank] = std::make_shared<MpiBuffer<Index> >(
numEntries);
231 valuesSendBuff_[peerRank] = std::make_shared<MpiBuffer<FieldVector> >(
numEntries);
236 Index
domRowIdx = overlap_->foreignOverlapOffsetToDomesticIdx(peerRank, i);
241 (*numIndicesSendBuff_[peerRank])[0] =
static_cast<unsigned>(
numEntries);
242 numIndicesSendBuff_[peerRank]->send(peerRank);
249 peerIt = overlap_->peerSet().begin();
259 indicesRecvBuff_[peerRank] = std::shared_ptr<MpiBuffer<Index> >(
261 valuesRecvBuff_[peerRank] = std::shared_ptr<MpiBuffer<FieldVector> >(
269 for (
unsigned i = 0; i !=
numRows; ++i) {
278 peerIt = overlap_->peerSet().begin();
281 numIndicesSendBuff_[peerRank]->wait();
282 indicesSendBuff_[peerRank]->wait();
294 void sendEntries_(ProcessRank peerRank)
299 for (
unsigned i = 0; i < indices.size(); ++i)
300 values[i] = (*
this)[
static_cast<unsigned>(indices[i])];
302 values.send(peerRank);
305 void waitSendFinished_()
307 typename PeerSet::const_iterator
peerIt;
308 typename PeerSet::const_iterator
peerEndIt = overlap_->peerSet().end();
311 peerIt = overlap_->peerSet().begin();
314 valuesSendBuff_[peerRank]->wait();
318 void receiveFromMaster_(ProcessRank peerRank)
324 values.receive(peerRank);
327 for (
unsigned j = 0; j < indices.size(); ++j) {
329 if (overlap_->masterRank(
domRowIdx) == peerRank) {
330 (*this)[
static_cast<unsigned>(
domRowIdx)] = values[j];
335 void receiveAdd_(ProcessRank peerRank)
341 values.receive(peerRank);
344 for (
unsigned j = 0; j < indices.size(); ++j) {
346 (*this)[
static_cast<unsigned>(
domRowIdx)] += values[j];
350 std::map<ProcessRank, std::shared_ptr<MpiBuffer<unsigned> > > numIndicesSendBuff_;
351 std::map<ProcessRank, std::shared_ptr<MpiBuffer<Index> > > indicesSendBuff_;
352 std::map<ProcessRank, std::shared_ptr<MpiBuffer<Index> > > indicesRecvBuff_;
353 std::map<ProcessRank, std::shared_ptr<MpiBuffer<FieldVector> > > valuesSendBuff_;
354 std::map<ProcessRank, std::shared_ptr<MpiBuffer<FieldVector> > > valuesRecvBuff_;
356 const Overlap *overlap_;
void assign(const NativeBlockVector &nativeBlockVector)
Assign an overlapping block vector from a non-overlapping one, border entries are assigned using thei...
Definition overlappingblockvector.hh:133
void assignAddBorder(const BlockVector &nativeBlockVector)
Assign an overlapping block vector from a non-overlapping one, border entries are added.
Definition overlappingblockvector.hh:109