Ejemplo n.º 1
0
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);
}