From 70b12e0bd0e804d98b1c34fc8688529643ad2052 Mon Sep 17 00:00:00 2001 From: Mark Olesen <Mark.Olesen@esi-group.com> Date: Fri, 26 Apr 2019 13:34:00 +0200 Subject: [PATCH] ENH: handle cellSet/cellZone updates in fvMeshSubsetProxy (#1294) - now also track if the cellSet or cellZone has changed on point motion. --- .../fvMeshSubsetProxy/fvMeshSubsetProxy.C | 43 +++++++++++++++---- .../fvMeshSubsetProxy/fvMeshSubsetProxy.H | 16 +++++-- 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/src/dynamicMesh/fvMeshSubsetProxy/fvMeshSubsetProxy.C b/src/dynamicMesh/fvMeshSubsetProxy/fvMeshSubsetProxy.C index 490cbceba35..740b6c584bb 100644 --- a/src/dynamicMesh/fvMeshSubsetProxy/fvMeshSubsetProxy.C +++ b/src/dynamicMesh/fvMeshSubsetProxy/fvMeshSubsetProxy.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2016-2018 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2016-2019 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -37,7 +37,8 @@ Foam::fvMeshSubsetProxy::fvMeshSubsetProxy(fvMesh& baseMesh) exposedPatchId_(-1), type_(NONE), name_(), - names_() + names_(), + selectedCells_() { if (useSubMesh()) { @@ -59,7 +60,8 @@ Foam::fvMeshSubsetProxy::fvMeshSubsetProxy exposedPatchId_(exposedPatchId), type_(selectionName.empty() ? NONE : type), name_(), - names_() + names_(), + selectedCells_() { if (type_ == ZONES) { @@ -91,7 +93,8 @@ Foam::fvMeshSubsetProxy::fvMeshSubsetProxy exposedPatchId_(exposedPatchId), type_(ZONES), name_(), - names_(zoneNames) + names_(zoneNames), + selectedCells_() { if (useSubMesh()) { @@ -112,7 +115,8 @@ Foam::fvMeshSubsetProxy::fvMeshSubsetProxy exposedPatchId_(exposedPatchId), type_(ZONES), name_(), - names_(std::move(zoneNames)) + names_(std::move(zoneNames)), + selectedCells_() { if (useSubMesh()) { @@ -123,12 +127,13 @@ Foam::fvMeshSubsetProxy::fvMeshSubsetProxy // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // -void Foam::fvMeshSubsetProxy::correct(bool verbose) +bool Foam::fvMeshSubsetProxy::correct(bool verbose) { if (type_ == NONE) { subsetter_.clear(); - return; + selectedCells_.clearStorage(); + return false; } const label nCells = baseMesh_.nCells(); @@ -171,7 +176,18 @@ void Foam::fvMeshSubsetProxy::correct(bool verbose) selectedCells = baseMesh_.cellZones().selection(names_); } - subsetter_.setCellSubset(selectedCells, exposedPatchId_); + + const bool changed = (selectedCells_ != selectedCells); + + // Use as a cached value for next time + selectedCells_.transfer(selectedCells); + + if (changed || selectedCells_.empty()) + { + subsetter_.setCellSubset(selectedCells_, exposedPatchId_); + } + + return returnReduce(changed, orOp<bool>()); } @@ -179,7 +195,16 @@ Foam::polyMesh::readUpdateState Foam::fvMeshSubsetProxy::readUpdate() { const polyMesh::readUpdateState meshState = baseMesh_.readUpdate(); - if + if (meshState == polyMesh::POINTS_MOVED) + { + if (correct(true)) + { + // The cellSet/cellZone changed on POINTS_MOVED, + // treat like TOPO_CHANGE + return polyMesh::TOPO_CHANGE; + } + } + else if ( meshState == polyMesh::TOPO_CHANGE || meshState == polyMesh::TOPO_PATCH_CHANGE diff --git a/src/dynamicMesh/fvMeshSubsetProxy/fvMeshSubsetProxy.H b/src/dynamicMesh/fvMeshSubsetProxy/fvMeshSubsetProxy.H index 5d127b249db..e0403739107 100644 --- a/src/dynamicMesh/fvMeshSubsetProxy/fvMeshSubsetProxy.H +++ b/src/dynamicMesh/fvMeshSubsetProxy/fvMeshSubsetProxy.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2016-2018 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2016-2019 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- | Copyright (C) 2011-2016 OpenFOAM Foundation @@ -91,6 +91,9 @@ private: //- Selection for multiple cell zones wordRes names_; + //- The (cached) cell selection + bitSet selectedCells_; + // Private Member Functions @@ -173,11 +176,18 @@ public: return name_; } + //- The current cell selection, when subsetting is active + inline const bitSet& selectedCells() const + { + return selectedCells_; + } + // Edit - //- Update of mesh subset - void correct(bool verbose = false); + //- Update of mesh subset. + // Return true if the subset changed from previous call. + bool correct(bool verbose = false); //- Read mesh. Correct on topo-change polyMesh::readUpdateState readUpdate(); -- GitLab