void SerialBlockCommunicator2D::copyOverlap ( Overlap2D const& overlap, MultiBlock2D const& fromMultiBlock, MultiBlock2D& toMultiBlock, modif::ModifT whichData ) const { MultiBlockManagement2D const& fromManagement = fromMultiBlock.getMultiBlockManagement(); MultiBlockManagement2D const& toManagement = toMultiBlock.getMultiBlockManagement(); plint fromEnvelopeWidth = fromManagement.getEnvelopeWidth(); plint toEnvelopeWidth = toManagement.getEnvelopeWidth(); SparseBlockStructure2D const& fromSparseBlock = fromManagement.getSparseBlockStructure(); SparseBlockStructure2D const& toSparseBlock = toManagement.getSparseBlockStructure(); plint originalId = overlap.getOriginalId(); plint overlapId = overlap.getOverlapId(); SmartBulk2D originalBulk(fromSparseBlock, fromEnvelopeWidth, originalId); SmartBulk2D overlapBulk(toSparseBlock, toEnvelopeWidth, overlapId); Box2D originalCoords(originalBulk.toLocal(overlap.getOriginalCoordinates())); Box2D overlapCoords(overlapBulk.toLocal(overlap.getOverlapCoordinates())); PLB_PRECONDITION(originalCoords.x1-originalCoords.x0 == overlapCoords.x1-overlapCoords.x0); PLB_PRECONDITION(originalCoords.y1-originalCoords.y0 == overlapCoords.y1-overlapCoords.y0); AtomicBlock2D const* originalBlock = &fromMultiBlock.getComponent(originalId); AtomicBlock2D* overlapBlock = &toMultiBlock.getComponent(overlapId); plint deltaX = originalCoords.x0 - overlapCoords.x0; plint deltaY = originalCoords.y0 - overlapCoords.y0; overlapBlock -> getDataTransfer().attribute(overlapCoords, deltaX, deltaY, *originalBlock, whichData); }
CommunicationStructure2D::CommunicationStructure2D ( std::vector<Overlap2D> const& overlaps, MultiBlockManagement2D const& originManagement, MultiBlockManagement2D const& destinationManagement, plint sizeOfCell ) { plint fromEnvelopeWidth = originManagement.getEnvelopeWidth(); plint toEnvelopeWidth = destinationManagement.getEnvelopeWidth(); SparseBlockStructure2D const& fromSparseBlock = originManagement.getSparseBlockStructure(); SparseBlockStructure2D const& toSparseBlock = destinationManagement.getSparseBlockStructure(); SendRecvPool sendPool, recvPool; for (pluint iOverlap=0; iOverlap<overlaps.size(); ++iOverlap) { Overlap2D const& overlap = overlaps[iOverlap]; CommunicationInfo2D info; info.fromBlockId = overlap.getOriginalId(); info.toBlockId = overlap.getOverlapId(); SmartBulk2D originalBulk(fromSparseBlock, fromEnvelopeWidth, info.fromBlockId); SmartBulk2D overlapBulk(toSparseBlock, toEnvelopeWidth, info.toBlockId); Box2D originalCoordinates(overlap.getOriginalCoordinates()); Box2D overlapCoordinates(overlap.getOverlapCoordinates()); info.fromDomain = originalBulk.toLocal(originalCoordinates); info.toDomain = overlapBulk.toLocal(overlapCoordinates); info.absoluteOffset = Dot2D ( overlapCoordinates.x0 - originalCoordinates.x0, overlapCoordinates.y0 - originalCoordinates.y0 ); plint lx = info.fromDomain.x1-info.fromDomain.x0+1; plint ly = info.fromDomain.y1-info.fromDomain.y0+1; PLB_PRECONDITION(lx == info.toDomain.x1-info.toDomain.x0+1); PLB_PRECONDITION(ly == info.toDomain.y1-info.toDomain.y0+1); plint numberOfCells = lx*ly; ThreadAttribution const& fromAttribution = originManagement.getThreadAttribution(); ThreadAttribution const& toAttribution = destinationManagement.getThreadAttribution(); info.fromProcessId = fromAttribution.getMpiProcess(info.fromBlockId); info.toProcessId = toAttribution.getMpiProcess(info.toBlockId); if ( fromAttribution.isLocal(info.fromBlockId) && toAttribution.isLocal(info.toBlockId)) { sendRecvPackage.push_back(info); } else if (fromAttribution.isLocal(info.fromBlockId)) { sendPackage.push_back(info); sendPool.subscribeMessage(info.toProcessId, numberOfCells*sizeOfCell); } else if (toAttribution.isLocal(info.toBlockId)) { recvPackage.push_back(info); recvPool.subscribeMessage(info.fromProcessId, numberOfCells*sizeOfCell); } } sendComm = SendPoolCommunicator(sendPool); recvComm = RecvPoolCommunicator(recvPool); }