void ParallelBlockCommunicator2D::duplicateOverlaps(MultiBlock2D& multiBlock, modif::ModifT whichData) const { MultiBlockManagement2D const& multiBlockManagement = multiBlock.getMultiBlockManagement(); PeriodicitySwitch2D const& periodicity = multiBlock.periodicity(); // Implement a caching mechanism for the communication structure. if (overlapsModified) { overlapsModified = false; LocalMultiBlockInfo2D const& localInfo = multiBlockManagement.getLocalInfo(); std::vector<Overlap2D> overlaps(multiBlockManagement.getLocalInfo().getNormalOverlaps()); for (pluint iOverlap=0; iOverlap<localInfo.getPeriodicOverlaps().size(); ++iOverlap) { PeriodicOverlap2D const& pOverlap = localInfo.getPeriodicOverlaps()[iOverlap]; if (periodicity.get(pOverlap.normalX,pOverlap.normalY)) { overlaps.push_back(pOverlap.overlap); } } delete communication; communication = new CommunicationStructure2D ( overlaps, multiBlockManagement, multiBlockManagement, multiBlock.sizeOfCell() ); } communicate(*communication, multiBlock, multiBlock, whichData); }
void SerialBlockCommunicator2D::duplicateOverlaps(MultiBlock2D& multiBlock, modif::ModifT whichData) const { MultiBlockManagement2D const& multiBlockManagement = multiBlock.getMultiBlockManagement(); LocalMultiBlockInfo2D const& localInfo = multiBlockManagement.getLocalInfo(); // Non-periodic communication for (pluint iOverlap=0; iOverlap<localInfo.getNormalOverlaps().size(); ++iOverlap) { copyOverlap(localInfo.getNormalOverlaps()[iOverlap], multiBlock, multiBlock, whichData); } // Periodic communication PeriodicitySwitch2D const& periodicity = multiBlock.periodicity(); for (pluint iOverlap=0; iOverlap<localInfo.getPeriodicOverlaps().size(); ++iOverlap) { PeriodicOverlap2D const& pOverlap = localInfo.getPeriodicOverlaps()[iOverlap]; if (periodicity.get(pOverlap.normalX, pOverlap.normalY)) { copyOverlap(pOverlap.overlap, multiBlock, multiBlock, whichData); } } }