diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/removePoints.C b/src/dynamicMesh/polyTopoChange/polyTopoChange/removePoints.C index 78108a6523..382391e3a5 100644 --- a/src/dynamicMesh/polyTopoChange/polyTopoChange/removePoints.C +++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/removePoints.C @@ -203,12 +203,45 @@ Foam::label Foam::removePoints::countPointUsage pointCanBeDeleted[pointI] = true; nDeleted++; } - } edge0.clear(); edge1.clear(); + // Protect any points on faces that would collapse down to nothing + // No particular intelligence so might protect too many points + forAll(mesh_.faces(), faceI) + { + const face& f = mesh_.faces()[faceI]; + + label nCollapse = 0; + forAll(f, fp) + { + if (pointCanBeDeleted[f[fp]]) + { + nCollapse++; + } + } + + if ((f.size() - nCollapse) < 3) + { + // Just unmark enough points + forAll(f, fp) + { + if (pointCanBeDeleted[f[fp]]) + { + pointCanBeDeleted[f[fp]] = false; + --nCollapse; + if (nCollapse == 0) + { + break; + } + } + } + } + } + + // Point can be deleted only if all processors want to delete it syncTools::syncPointList (