[Mpi3-p2p] Streaming example code

Daniel Holmes dholmes at staffmail.ed.ac.uk
Thu Jun 6 12:06:05 CDT 2013


Here's the code I just talked about.

Reference Information
=====================

http://www.openfoam.org/download
  git://github.com/OpenFOAM/OpenFOAM-2.2.x.git
   src/meshTools/algorithms/MeshWave/
    FaceCellWave.C
     void Foam::FaceCellWave<Type, TrackingData>::handleProcPatches()

Copyright and License
=====================

/*---------------------------------------------------------------------------*\
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2013 OpenFOAM Foundation
      \\/     M anipulation  |
-------------------------------------------------------------------------------
License
     This file is part of OpenFOAM.

     OpenFOAM is free software: you can redistribute it and/or modify it
     under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 3 of the License, or
     (at your option) any later version.

     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     for more details.

     You should have received a copy of the GNU General Public License
     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.

\*---------------------------------------------------------------------------*/

Example Source Code
===================

     PstreamBuffers pBufs(Pstream::nonBlocking);

     // Send all
     forAll(procPatches, i)
     {
         UOPstream toNeighbour(procPatch.neighbProcNo(), pBufs);
         toNeighbour
             << SubList<label>(sendFaces, nSendFaces)
             << SubList<Type>(sendFacesInfo, nSendFaces);
     }

     pBufs.finishedSends();

     // Receive all
     forAll(procPatches, i)
     {
         UIPstream fromNeighbour(procPatch.neighbProcNo(), pBufs);
         fromNeighbour >> receiveFaces >> receiveFacesInfo;
     }

Full Function Source Code for Context
=====================================

// Tranfer all the information to/from neighbouring processors
template<class Type, class TrackingData>
void Foam::FaceCellWave<Type, TrackingData>::handleProcPatches()
{
     const globalMeshData& pData = mesh_.globalData();

     // Which patches are processor patches
     const labelList& procPatches = pData.processorPatches();

     // Send all

     PstreamBuffers pBufs(Pstream::nonBlocking);

     forAll(procPatches, i)
     {
         label patchI = procPatches[i];

         const processorPolyPatch& procPatch =
             refCast<const 
processorPolyPatch>(mesh_.boundaryMesh()[patchI]);

         // Allocate buffers
         label nSendFaces;
         labelList sendFaces(procPatch.size());
         List<Type> sendFacesInfo(procPatch.size());

         // Determine which faces changed on current patch
         nSendFaces = getChangedPatchFaces
         (
             procPatch,
             0,
             procPatch.size(),
             sendFaces,
             sendFacesInfo
         );

         // Adapt wallInfo for leaving domain
         leaveDomain
         (
             procPatch,
             nSendFaces,
             sendFaces,
             sendFacesInfo
         );

         if (debug)
         {
             Pout<< " Processor patch " << patchI << ' ' << procPatch.name()
                 << " communicating with " << procPatch.neighbProcNo()
                 << "  Sending:" << nSendFaces
                 << endl;
         }

         UOPstream toNeighbour(procPatch.neighbProcNo(), pBufs);
         //writeFaces(nSendFaces, sendFaces, sendFacesInfo, toNeighbour);
         toNeighbour
             << SubList<label>(sendFaces, nSendFaces)
             << SubList<Type>(sendFacesInfo, nSendFaces);
     }

     pBufs.finishedSends();

     // Receive all

     forAll(procPatches, i)
     {
         label patchI = procPatches[i];

         const processorPolyPatch& procPatch =
             refCast<const 
processorPolyPatch>(mesh_.boundaryMesh()[patchI]);

         // Allocate buffers
         labelList receiveFaces;
         List<Type> receiveFacesInfo;

         {
             UIPstream fromNeighbour(procPatch.neighbProcNo(), pBufs);
             fromNeighbour >> receiveFaces >> receiveFacesInfo;
         }

         if (debug)
         {
             Pout<< " Processor patch " << patchI << ' ' << procPatch.name()
                 << " communicating with " << procPatch.neighbProcNo()
                 << "  Receiving:" << receiveFaces.size()
                 << endl;
         }

         // Apply transform to received data for non-parallel planes
         if (!procPatch.parallel())
         {
             transform
             (
                 procPatch.forwardT(),
                 receiveFaces.size(),
                 receiveFacesInfo
             );
         }

         // Adapt wallInfo for entering domain
         enterDomain
         (
             procPatch,
             receiveFaces.size(),
             receiveFaces,
             receiveFacesInfo
         );

         // Merge received info
         mergeFaceInfo
         (
             procPatch,
             receiveFaces.size(),
             receiveFaces,
             receiveFacesInfo
         );
     }
}



-- 
The University of Edinburgh is a charitable body, registered in
Scotland, with registration number SC005336.




More information about the mpiwg-p2p mailing list