diff --git a/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalPoints.C b/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalPoints.C index 0b12acd728..96895ff92d 100644 --- a/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalPoints.C +++ b/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalPoints.C @@ -57,6 +57,30 @@ Foam::label Foam::globalPoints::countPatchPoints } +Foam::label Foam::globalPoints::findSamePoint +( + const labelPairList& allInfo, + const labelPair& info +) const +{ + const label procI = globalIndexAndTransform::processor(info); + const label index = globalIndexAndTransform::index(info); + + forAll(allInfo, i) + { + if + ( + globalIndexAndTransform::processor(allInfo[i]) == procI + && globalIndexAndTransform::index(allInfo[i]) == index + ) + { + return i; + } + } + return -1; +} + + Foam::labelPairList Foam::globalPoints::addSendTransform ( const label patchI, @@ -67,6 +91,15 @@ Foam::labelPairList Foam::globalPoints::addSendTransform forAll(info, i) { + //Pout<< " adding send transform to" << nl + // << " proc:" << globalIndexAndTransform::processor(info[i]) + // << nl + // << " index:" << globalIndexAndTransform::index(info[i]) << nl + // << " trafo:" + // << globalTransforms_.decodeTransformIndex + // (globalIndexAndTransform::transformIndex(info[i])) + // << endl; + sendInfo[i] = globalIndexAndTransform::encode ( globalIndexAndTransform::processor(info[i]), @@ -129,72 +162,63 @@ bool Foam::globalPoints::mergeInfo { bool anyChanged = false; + // Extend to make space for the nbrInfo (trimmed later) labelPairList newInfo(myInfo); label newI = newInfo.size(); newInfo.setSize(newI + nbrInfo.size()); forAll(nbrInfo, i) { - const labelPair& info = nbrInfo[i]; - label nbrProcI = globalIndexAndTransform::processor(info); - label nbrIndex = globalIndexAndTransform::index(info); - label nbrTransform = globalIndexAndTransform::transformIndex(info); - // Check if already have information about nbr point. There are two // possibilities: // - information found about same point but different transform. // Combine transforms // - information not found. - label myIndex = -1; - forAll(myInfo, myI) - { - if (myInfo[myI] == info) - { - // Fully identical. We already have nbrInfo. - myIndex = myI; - } - else if - ( - globalIndexAndTransform::processor(myInfo[myI]) == nbrProcI - && globalIndexAndTransform::index(myInfo[myI]) == nbrIndex - ) - { - // Only differing is the transform. - label myTransform = globalIndexAndTransform::transformIndex - ( - myInfo[myI] - ); + label index = findSamePoint(myInfo, nbrInfo[i]); - // Combine mine and nbr transform - label t = globalTransforms_.mergeTransformIndex - ( - nbrTransform, - myTransform - ); - myIndex = myI; - - if (t != myTransform) - { - // Same point but different transformation - newInfo[myI] = globalIndexAndTransform::encode - ( - nbrProcI, - nbrIndex, - t - ); - anyChanged = true; - break; - } - } - } - - if (myIndex == -1) + if (index == -1) { // New point newInfo[newI++] = nbrInfo[i]; anyChanged = true; } + else + { + // Same point. So we already have a connection between localPointI + // and the nbrIndex. Two situations: + // - same transform + // - one transform takes two steps, the other just a single. + if (myInfo[index] == nbrInfo[i]) + { + // Everything same (so also transform). Nothing changed. + } + else + { + label myTransform = globalIndexAndTransform::transformIndex + ( + myInfo[index] + ); + label nbrTransform = globalIndexAndTransform::transformIndex + ( + nbrInfo[i] + ); + + // Different transform. See which is 'simplest'. + label minTransform = globalTransforms_.minimumTransformIndex + ( + myTransform, + nbrTransform + ); + + if (minTransform != myTransform) + { + // Use nbr info. + newInfo[index] = nbrInfo[i]; + anyChanged = true; + } + } + } } newInfo.setSize(newI); @@ -327,7 +351,7 @@ void Foam::globalPoints::printProcPoints label index = globalIndexAndTransform::index(pointInfo[i]); label trafoI = globalIndexAndTransform::transformIndex(pointInfo[i]); - Pout<< "proc:" << procI; + Pout<< " proc:" << procI; Pout<< " localpoint:"; Pout<< index; Pout<< " through transform:" @@ -386,6 +410,10 @@ void Foam::globalPoints::initOwnPoints ) ); + //Pout<< "For point "<< pp.points()[meshPointI] + // << " inserting info " << knownInfo + // << endl; + // Update changedpoints info. if (storeInitialInfo(knownInfo, localPointI)) { @@ -636,58 +664,34 @@ void Foam::globalPoints::receivePatchPoints Map