diff --git a/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalPoints.C b/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalPoints.C index 0b12acd728b4162fcb63821afbf383454e2974cf..96895ff92d1f9e30e521f4210bb933bd745af3a5 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) + label index = findSamePoint(myInfo, nbrInfo[i]); + + if (index == -1) { - if (myInfo[myI] == info) + // 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]) { - // Fully identical. We already have nbrInfo. - myIndex = myI; + // Everything same (so also transform). Nothing changed. } - else if - ( - globalIndexAndTransform::processor(myInfo[myI]) == nbrProcI - && globalIndexAndTransform::index(myInfo[myI]) == nbrIndex - ) + else { - // Only differing is the transform. label myTransform = globalIndexAndTransform::transformIndex ( - myInfo[myI] + myInfo[index] + ); + label nbrTransform = globalIndexAndTransform::transformIndex + ( + nbrInfo[i] ); - // Combine mine and nbr transform - label t = globalTransforms_.mergeTransformIndex + // Different transform. See which is 'simplest'. + label minTransform = globalTransforms_.minimumTransformIndex ( - nbrTransform, - myTransform + myTransform, + nbrTransform ); - myIndex = myI; - if (t != myTransform) + if (minTransform != myTransform) { - // Same point but different transformation - newInfo[myI] = globalIndexAndTransform::encode - ( - nbrProcI, - nbrIndex, - t - ); + // Use nbr info. + newInfo[index] = nbrInfo[i]; anyChanged = true; - break; } } } - - if (myIndex == -1) - { - // New point - newInfo[newI++] = 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<label>::iterator procPointA = meshToProcPoint_.find(localA); - labelPairList infoA; if (procPointA != meshToProcPoint_.end()) { - infoA = addSendTransform + const labelPairList infoA = addSendTransform ( cycPatch.index(), procPoints_[procPointA()] ); + + if (mergeInfo(infoA, localB)) + { + changedPoints.insert(localB); + } } // Same for info on pointB Map<label>::iterator procPointB = meshToProcPoint_.find(localB); - labelPairList infoB; if (procPointB != meshToProcPoint_.end()) { - infoB = addSendTransform + const labelPairList infoB = addSendTransform ( cycPatch.neighbPatchID(), procPoints_[procPointB()] ); - } - - if (infoA.size()) - { - if (mergeInfo(infoA, localB)) - { - //Pout<< " Combined info at point " - // << mesh_.points()[meshPointB] - // << " now " << endl; - //printProcPoints - //( - // patchToMeshPoint, - // procPoints_[meshToProcPoint_[localB]] - //); - changedPoints.insert(localB); - } - } - if (infoB.size()) - { if (mergeInfo(infoB, localA)) { - //Pout<< " Combined info at point " - // << mesh_.points()[meshPointA] - // << " now " << endl; - //printProcPoints - //( - // patchToMeshPoint, - // procPoints_[meshToProcPoint_[localA]] - //); changedPoints.insert(localA); } } @@ -845,6 +849,9 @@ void Foam::globalPoints::calculateSharedPoints { Pout<< "globalPoints::calculateSharedPoints(..) : " << "doing processor to processor communication to get sharedPoints" + << endl + << " keepAllPoints :" << keepAllPoints << endl + << " mergeSeparated:" << mergeSeparated << endl << endl; } @@ -951,7 +958,7 @@ void Foam::globalPoints::calculateSharedPoints // printProcPoints(patchToMeshPoint, pointInfo); // Pout<< endl; //} - // + // Remove direct neighbours from point equivalences. if (!keepAllPoints) diff --git a/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalPoints.H b/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalPoints.H index 9f75bb025f58137bd6c4eaf5b1102e0a00842a85..a46cca3fbb902f611eed651a10699976b36db644 100644 --- a/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalPoints.H +++ b/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalPoints.H @@ -143,6 +143,13 @@ class globalPoints // information is collected. static label countPatchPoints(const polyBoundaryMesh&); + //- Find index of same processor+index + label findSamePoint + ( + const labelPairList& allInfo, + const labelPair& info + ) const; + labelPairList addSendTransform ( const label patchI, diff --git a/src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransform.C b/src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransform.C index 2c51317d22f0e79678f646311622c089144afb8f..f220ee2e72c8cbf46f265a8118b6e7232bcf6612 100644 --- a/src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransform.C +++ b/src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransform.C @@ -136,7 +136,19 @@ void Foam::globalIndexAndTransform::determineTransforms() { const polyPatch& pp = patches[patchI]; - if (isA<coupledPolyPatch>(pp)) + // Note: special check for unordered cyclics. These are in fact + // transform bcs and should probably be split off. + if + ( + isA<coupledPolyPatch>(pp) + && !( + isA<cyclicPolyPatch>(pp) + && ( + refCast<const cyclicPolyPatch>(pp).transform() + == cyclicPolyPatch::NOORDERING + ) + ) + ) { const coupledPolyPatch& cpp = refCast<const coupledPolyPatch>(pp); @@ -164,21 +176,19 @@ void Foam::globalIndexAndTransform::determineTransforms() ) == 0 ) { + if (nextTrans == 6) + { + FatalErrorIn + ( + "void Foam::globalIndexAndTransform::" + "determineTransforms()" + ) << "More than six unsigned transforms" + << " detected:" << nl << transforms_ + << exit(FatalError); + } transforms_[nextTrans] = transform; maxTol[nextTrans++] = cpp.matchTolerance(); } - - if (nextTrans > 6) - { - FatalErrorIn - ( - "void Foam::globalIndexAndTransform::" - "determineTransforms()" - ) - << "More than six unsigned transforms detected:" - << nl << transforms_ - << exit(FatalError); - } } } } @@ -206,21 +216,19 @@ void Foam::globalIndexAndTransform::determineTransforms() ) == 0 ) { + if (nextTrans == 6) + { + FatalErrorIn + ( + "void Foam::globalIndexAndTransform::" + "determineTransforms()" + ) << "More than six unsigned transforms" + << " detected:" << nl << transforms_ + << exit(FatalError); + } transforms_[nextTrans] = transform; maxTol[nextTrans++] = cpp.matchTolerance(); } - - if (nextTrans > 6) - { - FatalErrorIn - ( - "void Foam::globalIndexAndTransform::" - "determineTransforms()" - ) - << "More than six unsigned transforms detected:" - << nl << transforms_ - << exit(FatalError); - } } } } @@ -363,7 +371,19 @@ void Foam::globalIndexAndTransform::determinePatchTransformSign() // Pout<< nl << patchI << " " << pp.name() << endl; - if (isA<coupledPolyPatch>(pp)) + // Note: special check for unordered cyclics. These are in fact + // transform bcs and should probably be split off. + if + ( + isA<coupledPolyPatch>(pp) + && !( + isA<cyclicPolyPatch>(pp) + && ( + refCast<const cyclicPolyPatch>(pp).transform() + == cyclicPolyPatch::NOORDERING + ) + ) + ) { const coupledPolyPatch& cpp = refCast<const coupledPolyPatch>(pp); diff --git a/src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransformI.H b/src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransformI.H index 7de6eab86ce59ac218c9545d02e80faa096d5d1b..741416c42660eaaef6a82f878c209bc7aaac780f 100644 --- a/src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransformI.H +++ b/src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransformI.H @@ -267,85 +267,47 @@ Foam::label Foam::globalIndexAndTransform::addToTransformIndex } -Foam::label Foam::globalIndexAndTransform::mergeTransformIndex +Foam::label Foam::globalIndexAndTransform::minimumTransformIndex ( const label transformIndex0, const label transformIndex1 ) const { - FixedList<label, 3> permutation0 = decodeTransformIndex(transformIndex0); - FixedList<label, 3> permutation1 = decodeTransformIndex(transformIndex1); - - forAll(permutation0, i) + if (transformIndex0 == transformIndex1) { - if (permutation0[i] == 0) - { - // Take over whatever sign 1 has - permutation0[i] = permutation1[i]; - } - else if (permutation1[i] != 0 && permutation0[i] != permutation1[i]) - { - FatalErrorIn - ( - "Foam::label " - "Foam::globalIndexAndTransform::addToTransformIndex\n" - "(\n" - "const label,\n" - "const label\n" - ") const\n" - ) << "More than one patch accessing the same transform " - << "but not of the same sign." << endl - << "Trying to combine two transforms " << transformIndex0 - << " with signs " << permutation0 - << " and " << transformIndex1 - << " with signs " << permutation1 - << exit(FatalError); - } + return transformIndex0; } - return encodeTransformIndex(permutation0); -} -Foam::label Foam::globalIndexAndTransform::minimumTransformIndex -( - const label transformIndex0, - const label transformIndex1 -) const -{ + // Count number of transforms FixedList<label, 3> permutation0 = decodeTransformIndex(transformIndex0); - FixedList<label, 3> permutation1 = decodeTransformIndex(transformIndex1); - + label n0 = 0; forAll(permutation0, i) { - if (permutation0[i] == 0) + if (permutation0[i] != 0) { - // 0 wins. + n0++; } - else if (permutation1[i] == 0) + } + + FixedList<label, 3> permutation1 = decodeTransformIndex(transformIndex1); + label n1 = 0; + forAll(permutation1, i) + { + if (permutation1[i] != 0) { - // 0 wins. - permutation0[i] = permutation1[i]; - } - else if (permutation0[i] != permutation1[i]) - { - FatalErrorIn - ( - "Foam::label " - "Foam::globalIndexAndTransform::minimumTransformIndex\n" - "(\n" - "const label,\n" - "const label\n" - ") const\n" - ) << "More than one patch accessing the same transform " - << "but not of the same sign." << endl - << "Trying to combine two transforms " << transformIndex0 - << " with signs " << permutation0 - << " and " << transformIndex1 - << " with signs " << permutation1 - << exit(FatalError); + n1++; } } - return encodeTransformIndex(permutation0); + + if (n0 <= n1) + { + return transformIndex0; + } + else + { + return transformIndex1; + } }