mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
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.
This commit is contained in:
@ -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<sampledTriSurfaceMesh>(s))
|
||||
{
|
||||
const sampledTriSurfaceMesh& surf =
|
||||
dynamicCast<const sampledTriSurfaceMesh&>(s);
|
||||
|
||||
if (surf.keepIds())
|
||||
{
|
||||
const labelList& idLst = surf.originalIds();
|
||||
|
||||
Field<scalar> ids(idLst.size());
|
||||
forAll(idLst, i)
|
||||
{
|
||||
ids[i] = idLst[i];
|
||||
}
|
||||
|
||||
writeSurface(ids, surfI, fieldName, outputDir);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::sampledSurfaces::sampledSurfaces
|
||||
|
||||
@ -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<class Type>
|
||||
void writeSurface
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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<class GeoField>
|
||||
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<GeoField>();
|
||||
fieldNames = mesh_.thisDb().sortedNames<GeoField>(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_)
|
||||
{
|
||||
|
||||
@ -296,6 +296,11 @@ bool Foam::sampledTriSurfaceMesh::update(const meshSearch& meshSearcher)
|
||||
}
|
||||
|
||||
|
||||
if (keepIds_)
|
||||
{
|
||||
originalIds_ = faceMap;
|
||||
}
|
||||
|
||||
// Subset cellOrFaceLabels
|
||||
cellOrFaceLabels = UIndirectList<label>(cellOrFaceLabels, faceMap)();
|
||||
|
||||
@ -545,6 +550,8 @@ Foam::sampledTriSurfaceMesh::sampledTriSurfaceMesh
|
||||
),
|
||||
sampleSource_(sampleSource),
|
||||
needsUpdate_(true),
|
||||
keepIds_(false),
|
||||
originalIds_(),
|
||||
sampleElements_(0),
|
||||
samplePoints_(0)
|
||||
{}
|
||||
@ -573,6 +580,8 @@ Foam::sampledTriSurfaceMesh::sampledTriSurfaceMesh
|
||||
),
|
||||
sampleSource_(samplingSourceNames_[dict.lookup("source")]),
|
||||
needsUpdate_(true),
|
||||
keepIds_(dict.lookupOrDefault<Switch>("keepIds", false)),
|
||||
originalIds_(),
|
||||
sampleElements_(0),
|
||||
samplePoints_(0)
|
||||
{}
|
||||
@ -594,7 +603,7 @@ Foam::sampledTriSurfaceMesh::sampledTriSurfaceMesh
|
||||
name,
|
||||
mesh.time().constant(), // instance
|
||||
"triSurface", // local
|
||||
mesh, // registry
|
||||
mesh, // registry
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE,
|
||||
false
|
||||
@ -603,6 +612,8 @@ Foam::sampledTriSurfaceMesh::sampledTriSurfaceMesh
|
||||
),
|
||||
sampleSource_(samplingSourceNames_[sampleSourceName]),
|
||||
needsUpdate_(true),
|
||||
keepIds_(false),
|
||||
originalIds_(),
|
||||
sampleElements_(0),
|
||||
samplePoints_(0)
|
||||
{}
|
||||
@ -633,6 +644,7 @@ bool Foam::sampledTriSurfaceMesh::expire()
|
||||
sampledSurface::clearGeom();
|
||||
MeshStorage::clear();
|
||||
|
||||
originalIds_.clear();
|
||||
boundaryTreePtr_.clear();
|
||||
sampleElements_.clear();
|
||||
samplePoints_.clear();
|
||||
|
||||
@ -117,6 +117,13 @@ private:
|
||||
//- Track if the surface needs an update
|
||||
mutable bool needsUpdate_;
|
||||
|
||||
//- Retain element ids/order of original surface
|
||||
bool keepIds_;
|
||||
|
||||
//- List of element ids/order of the original surface,
|
||||
// when keepIds is active.
|
||||
labelList originalIds_;
|
||||
|
||||
//- Search tree for all non-coupled boundary faces
|
||||
mutable autoPtr<indexedOctree<treeDataFace>> boundaryTreePtr_;
|
||||
|
||||
@ -240,6 +247,19 @@ public:
|
||||
return MeshStorage::Cf();
|
||||
}
|
||||
|
||||
//- If element ids/order of the original surface are kept
|
||||
bool keepIds() const
|
||||
{
|
||||
return keepIds_;
|
||||
}
|
||||
|
||||
//- List of element ids/order of the original surface,
|
||||
// when keepIds is active.
|
||||
const labelList& originalIds() const
|
||||
{
|
||||
return originalIds_;
|
||||
}
|
||||
|
||||
|
||||
//- Sample field on surface
|
||||
virtual tmp<scalarField> sample
|
||||
|
||||
Reference in New Issue
Block a user