48 template<
class sendOp,
class combineOp,
class T,
class ListType>
51 std::map<label, LongList<T> > sMap;
61 template<
class T,
class ListType,
class scatterOp,
class gatherOp>
62 void whisperReduce(
const ListType& neis,
const scatterOp& sop, gatherOp& gop)
83 fromOtherProc >> receivedData;
91 const label neiProc = below[belowI];
108 fromOtherProc >> receivedData;
116 const label neiProc = above[aboveI];
127 template<
class T,
class ListType>
130 const std::map<label, ListType>& m,
137 if( !contiguous<T>() )
140 typename std::map<label, ListType>::const_iterator iter;
144 for(iter=m.begin();iter!=m.end();++iter)
148 toOtherProc << iter->second.size();
151 for(iter=m.begin();iter!=m.end();++iter)
159 receiveData.
insert(iter->first);
167 for(iter=m.begin();iter!=m.end();++iter)
169 const ListType& dts = iter->second;
171 if( dts.size() == 0 )
184 for(iter=m.begin();iter!=m.end();++iter)
186 if( !receiveData.
found(iter->first) )
190 data.appendFromStream(fromOtherProc);
200 for(iter=m.begin();iter!=m.end();++iter)
204 if( !receiveData.
found(iter->first) )
210 data.appendFromStream(fromOtherProc);
217 for(iter=m.begin();iter!=m.end();++iter)
222 const ListType& dts = iter->second;
224 if( dts.size() == 0 )
238 typename std::map<label, ListType>::const_reverse_iterator riter;
239 for(riter=m.rbegin();riter!=m.rend();++riter)
243 if( !receiveData.
found(riter->first) )
249 data.appendFromStream(fromOtherProc);
256 for(riter=m.rbegin();riter!=m.rend();++riter)
261 const ListType& dts = riter->second;
263 if( dts.size() == 0 )
280 "template<class T, class ListType>"
282 "(const std::map<label, ListType>& m, LongList<T>& data,"
283 " const Pstream::commsTypes commsType)"
287 # ifdef DEBUGExchangeMap
289 for(iter=m.begin();iter!=m.end();++iter)
290 nReceived[iter->first] += iter->second.
size();
299 template<
class T,
class ListType>
302 const std::map<label, ListType>& m,
308 if( !contiguous<T>() )
311 typename std::map<label, ListType>::const_iterator iter;
314 for(iter=m.begin();iter!=m.end();++iter)
316 const ListType& dataToSend = iter->second;
322 dataToSend.byteSize()
324 toOtherProc << dataToSend;
328 for(iter=m.begin();iter!=m.end();++iter)
330 mOut.insert(std::make_pair(iter->first,
List<T>()));
331 List<T>& dataToReceive = mOut[iter->first];
334 fromOtherProc >> dataToReceive;
338 template<
class RowType,
template<
class ListTypeArg>
class GraphType>
341 const GraphType<RowType>& addr,
342 GraphType<RowType>& reverseAddr
345 reverseAddr.setSize(0);
348 label minRow(INT_MAX), maxRow(0);
352 # pragma omp parallel
357 label localMinRow(minRow), localMaxRow(0);
359 # pragma omp for schedule(guided)
363 const RowType&
row = addr[rowI];
375 # pragma omp critical
390 dataForOtherThreads.
setSize(omp_get_num_threads());
392 dataForOtherThreads.
setSize(1);
395 reverseAddr.setSize(maxRow);
399 const label nProcs = omp_get_num_threads();
400 const label procNo = omp_get_thread_num();
402 const label nProcs = 1;
403 const label procNo = 0;
412 for(
label i=0;i<maxRow;++i)
415 const label range = (maxRow - minRow) / nProcs + 1;
425 const RowType&
row = addr[rowI];
431 const label procI = (entryI - minRow) /
range;
432 if( procI != procNo )
434 dataForOtherThreads[procNo][procI].
append
441 ++nAppearances[entryI];
451 for(
label i=0;i<nProcs;++i)
453 const std::map<label, DynList<labelPair, 64> >&
data =
454 dataForOtherThreads[i];
456 std::map<label, DynList<labelPair, 64> >::const_iterator it =
459 if( it !=
data.end() )
464 ++nAppearances[entries[j].first()];
475 reverseAddr[i].
setSize(nAppearances[i]);
481 for(
label i=0;i<procNo;++i)
483 const std::map<label, DynList<labelPair, 64> >&
data =
484 dataForOtherThreads[i];
485 std::map<label, DynList<labelPair, 64> >::const_iterator it =
488 if( it !=
data.end() )
494 const label entryI = entries[j].first();
495 reverseAddr[entryI][nAppearances[entryI]++] =
507 const RowType&
row = addr[rowI];
515 reverseAddr[entryI][nAppearances[entryI]++] = rowI;
521 for(
label i=procNo+1;i<nProcs;++i)
523 const std::map<label, DynList<labelPair, 64> >&
data =
524 dataForOtherThreads[i];
525 std::map<label, DynList<labelPair, 64> >::const_iterator it =
528 if( it !=
data.end() )
534 const label entryI = entries[j].first();
535 reverseAddr[entryI][nAppearances[entryI]++] =