[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