From fd1fd164370d3cdb441f931d2cba90ffdc655bc5 Mon Sep 17 00:00:00 2001 From: mattijs Date: Mon, 16 Mar 2009 10:45:01 +0000 Subject: [PATCH] decomposed cyclics handling --- .../processor/processorPointPatchField.C | 54 +++++++++++++------ 1 file changed, 37 insertions(+), 17 deletions(-) diff --git a/src/OpenFOAM/fields/pointPatchFields/constraint/processor/processorPointPatchField.C b/src/OpenFOAM/fields/pointPatchFields/constraint/processor/processorPointPatchField.C index 02fb26d52c..1d34feed6a 100644 --- a/src/OpenFOAM/fields/pointPatchFields/constraint/processor/processorPointPatchField.C +++ b/src/OpenFOAM/fields/pointPatchFields/constraint/processor/processorPointPatchField.C @@ -100,15 +100,32 @@ void processorPointPatchField::initSwapAdd(Field& pField) const { if (Pstream::parRun()) { + // Get internal field into my point order Field pf(this->patchInternalField(pField)); - OPstream::write - ( - Pstream::blocking, - procPatch_.neighbProcNo(), - reinterpret_cast(pf.begin()), - pf.byteSize() - ); + // Normally points will be ordered same on both sides due to + // the point numbering by decomposePar. However this will not be + // the case for meshes changed in parallel. + + // Reorder into neighbour point order. Note that one side can have + // more or less points than other side if partically decomposed + // cyclics are present. + + const labelList& nbrPts = procPatch_.procPolyPatch().neighbPoints(); + + Field nbrf(this->size(), pTraits::zero); + + forAll(nbrPts, i) + { + label nbrPointI = nbrPts[i]; + if (nbrPointI >= 0 && nbrPointI < nbrf.size()) + { + nbrf[nbrPointI] = pf[i]; + } + } + + OPstream toNbr(Pstream::blocking, procPatch_.neighbProcNo()); + toNbr << nbrf; } } @@ -119,23 +136,26 @@ void processorPointPatchField::swapAdd(Field& pField) const if (Pstream::parRun()) { Field pnf(this->size()); + { + // We do not know the number of points on the other side + // so cannot use Pstream::read. + IPstream fromNbr + ( + Pstream::blocking, + procPatch_.neighbProcNo() + ); + fromNbr >> pnf; + } - IPstream::read - ( - Pstream::blocking, - procPatch_.neighbProcNo(), - reinterpret_cast(pnf.begin()), - pnf.byteSize() - ); + pnf.setSize(this->size(), pTraits::zero); if (doTransform()) { + const processorPolyPatch& ppp = procPatch_.procPolyPatch(); + const tensorField& forwardT = ppp.forwardT(); const labelList& nonGlobalPatchPoints = procPatch_.nonGlobalPatchPoints(); - - const processorPolyPatch& ppp = procPatch_.procPolyPatch(); const labelListList& pointFaces = ppp.pointFaces(); - const tensorField& forwardT = ppp.forwardT(); if (forwardT.size() == 1) {