From 690f58d2cbb43ed86ad916831b75adfcd69c4d37 Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Tue, 29 Nov 2016 17:14:56 +0100 Subject: [PATCH] ENH: support retention of original surface ids when sampling (related to issue #104) For example, surfaces ( helmet { type sampledTriSurfaceMesh; surface motorBike-passenger-helmet.obj; source cells; keepIds true; <<-- NEW } ); This will create an additional "Ids" field that can be used to sort or as a faceMap to recover the original face order. --- .../sampledSurfaces/sampledSurfaces.C | 32 +++++++++++++++++++ .../sampledSurfaces/sampledSurfaces.H | 3 ++ .../sampledSurfaces/sampledSurfacesGrouping.C | 1 - .../sampledSurfacesTemplates.C | 19 ++++------- .../sampledTriSurfaceMesh.C | 14 +++++++- .../sampledTriSurfaceMesh.H | 20 ++++++++++++ 6 files changed, 75 insertions(+), 14 deletions(-) diff --git a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.C b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.C index f15c61b363..3956856852 100644 --- a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.C +++ b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.C @@ -31,6 +31,7 @@ License #include "volPointInterpolation.H" #include "PatchTools.H" #include "mapPolyMesh.H" +#include "sampledTriSurfaceMesh.H" #include "addToRunTimeSelectionTable.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // @@ -84,6 +85,37 @@ void Foam::sampledSurfaces::writeGeometry() const } +void Foam::sampledSurfaces::writeOriginalIds() +{ + const word fieldName = "Ids"; + const fileName outputDir = outputPath_/time_.timeName(); + + forAll(*this, surfI) + { + const sampledSurface& s = operator[](surfI); + + if (isA(s)) + { + const sampledTriSurfaceMesh& surf = + dynamicCast(s); + + if (surf.keepIds()) + { + const labelList& idLst = surf.originalIds(); + + Field ids(idLst.size()); + forAll(idLst, i) + { + ids[i] = idLst[i]; + } + + writeSurface(ids, surfI, fieldName, outputDir); + } + } + } +} + + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // Foam::sampledSurfaces::sampledSurfaces diff --git a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.H b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.H index 1d9c9e730b..8d610dbb59 100644 --- a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.H +++ b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.H @@ -116,6 +116,9 @@ class sampledSurfaces //- Write geometry only void writeGeometry() const; + //- Write scalar field with original ids + void writeOriginalIds(); + //- Write sampled fieldName on surface and on outputDir path template void writeSurface diff --git a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfacesGrouping.C b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfacesGrouping.C index 4e25d84af0..143837a4eb 100644 --- a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfacesGrouping.C +++ b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfacesGrouping.C @@ -60,7 +60,6 @@ Foam::label Foam::sampledSurfaces::classifyFields() { // Check currently available fields wordList allFields = obr_.sortedNames(); - labelList indices = findStrings(fieldSelection_, allFields); forAll(fieldSelection_, i) { diff --git a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfacesTemplates.C b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfacesTemplates.C index ba39848aad..0dd8c248ef 100644 --- a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfacesTemplates.C +++ b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfacesTemplates.C @@ -49,9 +49,7 @@ void Foam::sampledSurfaces::writeSurface gatheredValues[Pstream::myProcNo()] = values; Pstream::gatherList(gatheredValues); - fileName sampleFile; - if (Pstream::master()) { // Combine values into single field @@ -181,24 +179,21 @@ void Foam::sampledSurfaces::sampleAndWrite template void Foam::sampledSurfaces::sampleAndWrite(const IOobjectList& objects) { - wordList names; + wordList fieldNames; if (loadFromFiles_) { - IOobjectList fieldObjects(objects.lookupClass(GeoField::typeName)); - names = fieldObjects.names(); + fieldNames = objects.sortedNames(GeoField::typeName, fieldSelection_); } else { - names = mesh_.thisDb().names(); + fieldNames = mesh_.thisDb().sortedNames(fieldSelection_); + + writeOriginalIds(); } - labelList nameIDs(findStrings(fieldSelection_, names)); - - wordHashSet fieldNames(wordList(names, nameIDs)); - - forAllConstIter(wordHashSet, fieldNames, iter) + forAll(fieldNames, fieldi) { - const word& fieldName = iter.key(); + const word& fieldName = fieldNames[fieldi]; if ((Pstream::master()) && verbose_) { diff --git a/src/sampling/sampledSurface/sampledTriSurfaceMesh/sampledTriSurfaceMesh.C b/src/sampling/sampledSurface/sampledTriSurfaceMesh/sampledTriSurfaceMesh.C index c1c08006d4..38fdc7c748 100644 --- a/src/sampling/sampledSurface/sampledTriSurfaceMesh/sampledTriSurfaceMesh.C +++ b/src/sampling/sampledSurface/sampledTriSurfaceMesh/sampledTriSurfaceMesh.C @@ -296,6 +296,11 @@ bool Foam::sampledTriSurfaceMesh::update(const meshSearch& meshSearcher) } + if (keepIds_) + { + originalIds_ = faceMap; + } + // Subset cellOrFaceLabels cellOrFaceLabels = UIndirectList