From 8111f6e18d58c600c5c9e3ef332e34fe2d5765c2 Mon Sep 17 00:00:00 2001 From: mark <mark@opencfd> Date: Thu, 20 Oct 2016 08:32:05 +0200 Subject: [PATCH 1/4] ENH: add face area support into PrimitivePatch (issue #266) --- .../PrimitivePatch/PrimitivePatch.C | 48 ++++++++ .../PrimitivePatch/PrimitivePatch.H | 20 +++- .../PrimitivePatch/PrimitivePatchClear.C | 2 + .../PrimitivePatch/PrimitivePatchMeshData.C | 104 +++++++++++++++++- 4 files changed, 167 insertions(+), 7 deletions(-) diff --git a/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatch.C b/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatch.C index 04c3f9e62a..fdff5f05c3 100644 --- a/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatch.C +++ b/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatch.C @@ -58,6 +58,8 @@ PrimitivePatch localPointsPtr_(nullptr), localPointOrderPtr_(nullptr), faceCentresPtr_(nullptr), + faceAreasPtr_(nullptr), + magFaceAreasPtr_(nullptr), faceNormalsPtr_(nullptr), pointNormalsPtr_(nullptr) {} @@ -94,6 +96,8 @@ PrimitivePatch localPointsPtr_(nullptr), localPointOrderPtr_(nullptr), faceCentresPtr_(nullptr), + faceAreasPtr_(nullptr), + magFaceAreasPtr_(nullptr), faceNormalsPtr_(nullptr), pointNormalsPtr_(nullptr) {} @@ -131,6 +135,8 @@ PrimitivePatch localPointsPtr_(nullptr), localPointOrderPtr_(nullptr), faceCentresPtr_(nullptr), + faceAreasPtr_(nullptr), + magFaceAreasPtr_(nullptr), faceNormalsPtr_(nullptr), pointNormalsPtr_(nullptr) {} @@ -167,6 +173,8 @@ PrimitivePatch localPointsPtr_(nullptr), localPointOrderPtr_(nullptr), faceCentresPtr_(nullptr), + faceAreasPtr_(nullptr), + magFaceAreasPtr_(nullptr), faceNormalsPtr_(nullptr), pointNormalsPtr_(nullptr) {} @@ -524,6 +532,46 @@ faceCentres() const } +template +< + class Face, + template<class> class FaceList, + class PointField, + class PointType +> +const Foam::Field<PointType>& +Foam::PrimitivePatch<Face, FaceList, PointField, PointType>:: +faceAreas() const +{ + if (!faceAreasPtr_) + { + calcFaceAreas(); + } + + return *faceAreasPtr_; +} + + +template +< + class Face, + template<class> class FaceList, + class PointField, + class PointType +> +const Foam::Field<Foam::scalar>& +Foam::PrimitivePatch<Face, FaceList, PointField, PointType>:: +magFaceAreas() const +{ + if (!magFaceAreasPtr_) + { + calcMagFaceAreas(); + } + + return *magFaceAreasPtr_; +} + + template < class Face, diff --git a/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatch.H b/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatch.H index 5668e8f064..6e732b9fd8 100644 --- a/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatch.H +++ b/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatch.H @@ -168,6 +168,12 @@ private: //- Face centres mutable Field<PointType>* faceCentresPtr_; + //- Face area vectors + mutable Field<PointType>* faceAreasPtr_; + + //- Mag face area + mutable Field<scalar>* magFaceAreasPtr_; + //- Face unit normals mutable Field<PointType>* faceNormalsPtr_; @@ -210,6 +216,12 @@ private: //- Calculate face centres void calcFaceCentres() const; + //- Calculate face area vectors + void calcFaceAreas() const; + + //- Calculate face area magnitudes + void calcMagFaceAreas() const; + //- Calculate unit face normals void calcFaceNormals() const; @@ -381,7 +393,13 @@ public: //- Return face centres for patch const Field<PointType>& faceCentres() const; - //- Return face normals for patch + //- Return face area vectors for patch + const Field<PointType>& faceAreas() const; + + //- Return face area magnitudes for patch + const Field<scalar>& magFaceAreas() const; + + //- Return face unit normals for patch const Field<PointType>& faceNormals() const; //- Return point normals for patch diff --git a/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatchClear.C b/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatchClear.C index 3ac89f2c61..3a226c385d 100644 --- a/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatchClear.C +++ b/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatchClear.C @@ -47,6 +47,8 @@ clearGeom() deleteDemandDrivenData(localPointsPtr_); deleteDemandDrivenData(faceCentresPtr_); + deleteDemandDrivenData(faceAreasPtr_); + deleteDemandDrivenData(magFaceAreasPtr_); deleteDemandDrivenData(faceNormalsPtr_); deleteDemandDrivenData(pointNormalsPtr_); } diff --git a/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatchMeshData.C b/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatchMeshData.C index 10f758c648..50e4222be0 100644 --- a/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatchMeshData.C +++ b/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatchMeshData.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -52,7 +52,7 @@ calcMeshData() const if (meshPointsPtr_ || localFacesPtr_) { FatalErrorInFunction - << "meshPointsPtr_ or localFacesPtr_already allocated" + << "meshPointsPtr_ or localFacesPtr_ already allocated" << abort(FatalError); } @@ -210,7 +210,7 @@ calcLocalPoints() const if (localPointsPtr_) { FatalErrorInFunction - << "localPointsPtr_already allocated" + << "localPointsPtr_ already allocated" << abort(FatalError); } @@ -259,7 +259,7 @@ calcPointNormals() const if (pointNormalsPtr_) { FatalErrorInFunction - << "pointNormalsPtr_already allocated" + << "pointNormalsPtr_ already allocated" << abort(FatalError); } @@ -323,7 +323,7 @@ calcFaceCentres() const if (faceCentresPtr_) { FatalErrorInFunction - << "faceCentresPtr_already allocated" + << "faceCentresPtr_ already allocated" << abort(FatalError); } @@ -346,6 +346,98 @@ calcFaceCentres() const } +template +< + class Face, + template<class> class FaceList, + class PointField, + class PointType +> +void +Foam::PrimitivePatch<Face, FaceList, PointField, PointType>:: +calcMagFaceAreas() const +{ + if (debug) + { + Pout<< "PrimitivePatch<Face, FaceList, PointField, PointType>::" + "calcMagFaceAreas() : " + "calculating magFaceAreas in PrimitivePatch" + << endl; + } + + // It is an error to calculate these more than once. + if (magFaceAreasPtr_) + { + FatalErrorInFunction + << "magFaceAreasPtr_ already allocated" + << abort(FatalError); + } + + magFaceAreasPtr_ = new Field<scalar>(this->size()); + Field<scalar>& a = *magFaceAreasPtr_; + + forAll(a, facei) + { + a[facei] = this->operator[](facei).mag(points_); + } + + if (debug) + { + Pout<< "PrimitivePatch<Face, FaceList, PointField, PointType>::" + "calcMagFaceAreas() : " + "finished calculating magFaceAreas in PrimitivePatch" + << endl; + } +} + + +template +< + class Face, + template<class> class FaceList, + class PointField, + class PointType +> +void +Foam::PrimitivePatch<Face, FaceList, PointField, PointType>:: +calcFaceAreas() const +{ + if (debug) + { + Pout<< "PrimitivePatch<Face, FaceList, PointField, PointType>::" + "calcFaceAreas() : " + "calculating faceAreas in PrimitivePatch" + << endl; + } + + // It is considered an error to attempt to recalculate faceNormals + // if they have already been calculated. + if (faceAreasPtr_) + { + FatalErrorInFunction + << "faceAreasPtr_ already allocated" + << abort(FatalError); + } + + faceAreasPtr_ = new Field<PointType>(this->size()); + + Field<PointType>& n = *faceAreasPtr_; + + forAll(n, facei) + { + n[facei] = this->operator[](facei).normal(points_); + } + + if (debug) + { + Pout<< "PrimitivePatch<Face, FaceList, PointField, PointType>::" + "calcFaceAreas() : " + "finished calculating faceAreas in PrimitivePatch" + << endl; + } +} + + template < class Face, @@ -370,7 +462,7 @@ calcFaceNormals() const if (faceNormalsPtr_) { FatalErrorInFunction - << "faceNormalsPtr_already allocated" + << "faceNormalsPtr_ already allocated" << abort(FatalError); } -- GitLab From 769493d8aff9a5aea6e919c912bebe52d3a5f007 Mon Sep 17 00:00:00 2001 From: mark <mark@opencfd> Date: Thu, 20 Oct 2016 08:36:02 +0200 Subject: [PATCH 2/4] ENH: propogate face area support into surface-type meshes (issue #266) * MeshedSurface / surfMesh / triSurface - use shorter method names similar to those from volume meshes: Sf(), magSf(), Cf() instead of the longer ones from PrimitivePatch: faceAreas(), magFaceAreas(), faceCentres() - similar names throughout to ease switching between triSurface and MeshedSurface storage. --- .../surfaceMeshConvertTesting.C | 24 ++++++++++----- src/surfMesh/MeshedSurface/MeshedSurface.C | 16 ++++++---- src/surfMesh/MeshedSurface/MeshedSurface.H | 30 +++++++++++++++---- src/surfMesh/surfMesh/surfMesh.H | 19 ++++++++++++ src/surfMesh/surfMesh/surfMeshClear.C | 4 ++- src/surfMesh/surfMesh/surfMeshIO.C | 2 +- src/triSurface/triSurface/triSurface.H | 19 ++++++++++++ 7 files changed, 94 insertions(+), 20 deletions(-) diff --git a/applications/utilities/surface/surfaceMeshConvertTesting/surfaceMeshConvertTesting.C b/applications/utilities/surface/surfaceMeshConvertTesting/surfaceMeshConvertTesting.C index e0dcfcf0cc..edb8527698 100644 --- a/applications/utilities/surface/surfaceMeshConvertTesting/surfaceMeshConvertTesting.C +++ b/applications/utilities/surface/surfaceMeshConvertTesting/surfaceMeshConvertTesting.C @@ -161,7 +161,8 @@ int main(int argc, char *argv[]) Info<< "Read surface:" << endl; surf.writeStats(Info); - Info<< endl; + Info<< "Area : " << sum(surf.magSf()) << nl + << endl; // check: output to ostream, construct from istream { @@ -205,7 +206,8 @@ int main(int argc, char *argv[]) Info<< " with scaling " << scaleFactor << endl; surf.scalePoints(scaleFactor); surf.writeStats(Info); - Info<< endl; + Info<< "Area : " << sum(surf.magSf()) << nl + << endl; } if (optStdout) @@ -224,7 +226,8 @@ int main(int argc, char *argv[]) Info<< "Read surface:" << endl; surf.writeStats(Info); - Info<< endl; + Info<< "Area : " << sum(surf.magSf()) << nl + << endl; // check: output to ostream, construct from istream { @@ -268,7 +271,8 @@ int main(int argc, char *argv[]) Info<< " with scaling " << scaleFactor << endl; surf.scalePoints(scaleFactor); surf.writeStats(Info); - Info<< endl; + Info<< "Area : " << sum(surf.magSf()) << nl + << endl; } if (optStdout) @@ -286,7 +290,8 @@ int main(int argc, char *argv[]) Info<< "Read surface:" << endl; surf.writeStats(Info); - Info<< endl; + Info<< "Area : " << sum(surf.magSf()) << nl + << endl; // check: output to ostream, construct from istream { @@ -330,7 +335,8 @@ int main(int argc, char *argv[]) Info<< " with scaling " << scaleFactor << endl; surf.scalePoints(scaleFactor); surf.writeStats(Info); - Info<< endl; + Info<< "Area : " << sum(surf.magSf()) << nl + << endl; } if (optStdout) @@ -348,7 +354,8 @@ int main(int argc, char *argv[]) Info<< "Read surface:" << endl; surf.writeStats(Info); - Info<< endl; + Info<< "Area : " << sum(surf.magSf()) << nl + << endl; // check: output to ostream, construct from istream { @@ -392,7 +399,8 @@ int main(int argc, char *argv[]) Info<< " with scaling " << scaleFactor << endl; surf.scalePoints(scaleFactor); surf.writeStats(Info); - Info<< endl; + Info<< "Area : " << sum(surf.magSf()) << nl + << endl; } if (optStdout) diff --git a/src/surfMesh/MeshedSurface/MeshedSurface.C b/src/surfMesh/MeshedSurface/MeshedSurface.C index 825949ebd4..e6cd398505 100644 --- a/src/surfMesh/MeshedSurface/MeshedSurface.C +++ b/src/surfMesh/MeshedSurface/MeshedSurface.C @@ -431,7 +431,9 @@ Foam::MeshedSurface<Face>::MeshedSurface template<class Face> Foam::MeshedSurface<Face>::~MeshedSurface() -{} +{ + clear(); +} // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // @@ -500,6 +502,9 @@ void Foam::MeshedSurface<Face>::clear() template<class Face> void Foam::MeshedSurface<Face>::movePoints(const pointField& newPoints) { + // Changes areas, normals etc. + ParentType::clearGeom(); + // Adapt for new point position ParentType::movePoints(newPoints); @@ -511,9 +516,12 @@ void Foam::MeshedSurface<Face>::movePoints(const pointField& newPoints) template<class Face> void Foam::MeshedSurface<Face>::scalePoints(const scalar scaleFactor) { - // avoid bad scaling + // Avoid bad scaling if (scaleFactor > 0 && scaleFactor != 1.0) { + // Changes areas, normals etc. + ParentType::clearGeom(); + pointField newPoints(scaleFactor*this->points()); // Adapt for new point position @@ -586,7 +594,7 @@ void Foam::MeshedSurface<Face>::reset template<class Face> void Foam::MeshedSurface<Face>::cleanup(const bool verbose) { - // merge points (already done for STL, TRI) + // Merge points (already done for STL, TRI) stitchFaces(SMALL, verbose); checkFaces(verbose); @@ -943,8 +951,6 @@ Foam::label Foam::MeshedSurface<Face>::triangulate } - - template<class Face> Foam::MeshedSurface<Face> Foam::MeshedSurface<Face>::subsetMesh ( diff --git a/src/surfMesh/MeshedSurface/MeshedSurface.H b/src/surfMesh/MeshedSurface/MeshedSurface.H index 1362197d8c..9f3a34a80a 100644 --- a/src/surfMesh/MeshedSurface/MeshedSurface.H +++ b/src/surfMesh/MeshedSurface/MeshedSurface.H @@ -339,6 +339,31 @@ public: return zones_; } + //- Face area vectors (normals) + inline const vectorField& Sf() const + { + return ParentType::faceAreas(); + } + + //- Face area magnitudes + inline const scalarField& magSf() const + { + return ParentType::magFaceAreas(); + } + + //- Face centres + inline const vectorField& Cf() const + { + return ParentType::faceCentres(); + } + + + // Edit + + //- Clear all storage + virtual void clear(); + + //- Add surface zones virtual void addZones ( @@ -365,11 +390,6 @@ public: virtual void removeZones(); - // Edit - - //- Clear all storage - virtual void clear(); - //- Move points virtual void movePoints(const pointField&); diff --git a/src/surfMesh/surfMesh/surfMesh.H b/src/surfMesh/surfMesh/surfMesh.H index d8bbff5fe4..f936d3f46d 100644 --- a/src/surfMesh/surfMesh/surfMesh.H +++ b/src/surfMesh/surfMesh/surfMesh.H @@ -233,6 +233,25 @@ public: //- Check the surface zone definitions void checkZones(); + + //- Return face area vectors (normals) + inline const vectorField& Sf() const + { + return MeshReference::faceAreas(); + } + + //- Return face area magnitudes + inline const scalarField& magSf() const + { + return MeshReference::magFaceAreas(); + } + + //- Face centres + inline const vectorField& Cf() const + { + return MeshReference::faceCentres(); + } + //- Add surface zones void addZones ( diff --git a/src/surfMesh/surfMesh/surfMeshClear.C b/src/surfMesh/surfMesh/surfMeshClear.C index 179f202c2d..39bef03a02 100644 --- a/src/surfMesh/surfMesh/surfMeshClear.C +++ b/src/surfMesh/surfMesh/surfMeshClear.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -69,6 +69,8 @@ void Foam::surfMesh::clearAddressing() void Foam::surfMesh::clearOut() { + MeshReference::clearOut(); + clearGeom(); clearAddressing(); } diff --git a/src/surfMesh/surfMesh/surfMeshIO.C b/src/surfMesh/surfMesh/surfMeshIO.C index 5e7072e3a4..f2a5c54245 100644 --- a/src/surfMesh/surfMesh/surfMeshIO.C +++ b/src/surfMesh/surfMesh/surfMeshIO.C @@ -168,7 +168,7 @@ Foam::surfMesh::readUpdateState Foam::surfMesh::readUpdate() Info<< "Point motion" << endl; } - clearGeom(); + clearOut(); storedIOPoints().instance() = pointsInst; storedIOPoints() = pointIOField diff --git a/src/triSurface/triSurface/triSurface.H b/src/triSurface/triSurface/triSurface.H index c892fb22c0..0383c14a2b 100644 --- a/src/triSurface/triSurface/triSurface.H +++ b/src/triSurface/triSurface/triSurface.H @@ -335,6 +335,25 @@ public: const labelList& edgeOwner() const; + //- Face area vectors (normals) + inline const vectorField& Sf() const + { + return ParentType::faceAreas(); + } + + //- Face area magnitudes + inline const scalarField& magSf() const + { + return ParentType::magFaceAreas(); + } + + //- Face centres + inline const vectorField& Cf() const + { + return ParentType::faceCentres(); + } + + // Edit //- Move points -- GitLab From bd2e837278f00b280d7cc816ea73ed922351b20a Mon Sep 17 00:00:00 2001 From: mark <mark@opencfd> Date: Thu, 20 Oct 2016 08:58:27 +0200 Subject: [PATCH 3/4] ENH: propagate face area to sampling (issue #266) - make top-level Sf(), magSf(), Cf() pure virtual since the sub-classes will always be providing the face/point storage, with either triSurface or MeshedSurface in the background --- .../distanceSurface/distanceSurface.H | 19 ++++ .../isoSurface/sampledIsoSurface.H | 32 +++++- .../isoSurface/sampledIsoSurfaceCell.H | 23 +++- .../sampledCuttingPlane/sampledCuttingPlane.H | 31 +++++- .../sampledPatch/sampledPatch.H | 21 +++- .../sampledPlane/sampledPlane.H | 21 +++- .../sampledSurface/sampledSurface.C | 105 ------------------ .../sampledSurface/sampledSurface.H | 36 ++---- .../sampledTriSurfaceMesh.H | 20 +++- .../sampledThresholdCellFaces.H | 21 +++- 10 files changed, 185 insertions(+), 144 deletions(-) diff --git a/src/sampling/sampledSurface/distanceSurface/distanceSurface.H b/src/sampling/sampledSurface/distanceSurface/distanceSurface.H index 755eb818e4..407e8914db 100644 --- a/src/sampling/sampledSurface/distanceSurface/distanceSurface.H +++ b/src/sampling/sampledSurface/distanceSurface/distanceSurface.H @@ -193,6 +193,25 @@ public: return facesPtr_; } + //- Face area vectors + virtual const vectorField& Sf() const + { + return surface().Sf(); + } + + //- Face area magnitudes + virtual const scalarField& magSf() const + { + return surface().magSf(); + } + + //- Face centres + virtual const vectorField& Cf() const + { + return surface().Cf(); + } + + const triSurface& surface() const { if (cell_) diff --git a/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.H b/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.H index a0ea506337..19efe340b7 100644 --- a/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.H +++ b/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.H @@ -158,6 +158,11 @@ public: // Member Functions + const isoSurface& surface() const + { + return surfPtr_(); + } + //- Does the surface need an update? virtual bool needsUpdate() const; @@ -194,16 +199,32 @@ public: return facesPtr_; } + //- Face area magnitudes + virtual const vectorField& Sf() const + { + return surface().Sf(); + } - const isoSurface& surface() const + //- Face area magnitudes + virtual const scalarField& magSf() const { - return surfPtr_(); + return surface().magSf(); } - //- Lookup or read isoField. Sets volFieldPtr_ and pointFieldPtr_. + //- Face centres + virtual const vectorField& Cf() const + { + return surface().Cf(); + } + + + //- Lookup or read isoField. + // Sets volFieldPtr_ and pointFieldPtr_. void getIsoField(); + // Sample + //- Sample field on surface virtual tmp<scalarField> sample ( @@ -235,6 +256,8 @@ public: ) const; + // Interpolate + //- Interpolate field on surface virtual tmp<scalarField> interpolate ( @@ -265,6 +288,9 @@ public: const interpolation<tensor>& ) const; + + // Output + //- Write virtual void print(Ostream&) const; }; diff --git a/src/sampling/sampledSurface/isoSurface/sampledIsoSurfaceCell.H b/src/sampling/sampledSurface/isoSurface/sampledIsoSurfaceCell.H index b404976ee0..f7a267aa9d 100644 --- a/src/sampling/sampledSurface/isoSurface/sampledIsoSurfaceCell.H +++ b/src/sampling/sampledSurface/isoSurface/sampledIsoSurfaceCell.H @@ -54,6 +54,9 @@ class sampledIsoSurfaceCell public sampledSurface, public triSurface { + //- Private typedef for convenience + typedef triSurface MeshStorage; + // Private data //- Field to get isoSurface of @@ -145,7 +148,7 @@ public: //- Points of surface virtual const pointField& points() const { - return triSurface::points(); + return MeshStorage::points(); } //- Faces of surface @@ -165,6 +168,24 @@ public: return facesPtr_; } + //- Face area magnitudes + virtual const vectorField& Sf() const + { + return MeshStorage::Sf(); + } + + //- Face area magnitudes + virtual const scalarField& magSf() const + { + return MeshStorage::magSf(); + } + + //- Face centres + virtual const vectorField& Cf() const + { + return MeshStorage::Cf(); + } + //- Sample field on surface virtual tmp<scalarField> sample diff --git a/src/sampling/sampledSurface/sampledCuttingPlane/sampledCuttingPlane.H b/src/sampling/sampledSurface/sampledCuttingPlane/sampledCuttingPlane.H index eb50106b59..c4fb497767 100644 --- a/src/sampling/sampledSurface/sampledCuttingPlane/sampledCuttingPlane.H +++ b/src/sampling/sampledSurface/sampledCuttingPlane/sampledCuttingPlane.H @@ -141,6 +141,12 @@ public: // Member Functions + //const isoSurfaceCell& surface() const + const isoSurface& surface() const + { + return isoSurfPtr_(); + } + //- Does the surface need an update? virtual bool needsUpdate() const; @@ -176,13 +182,27 @@ public: return facesPtr_; } + //- Face area magnitudes + virtual const vectorField& Sf() const + { + return surface().Sf(); + } - //const isoSurfaceCell& surface() const - const isoSurface& surface() const + //- Face area magnitudes + virtual const scalarField& magSf() const { - return isoSurfPtr_(); + return surface().magSf(); } + //- Face centres + virtual const vectorField& Cf() const + { + return surface().Cf(); + } + + + // Sample + //- Sample field on surface virtual tmp<scalarField> sample ( @@ -214,6 +234,8 @@ public: ) const; + // Interpolate + //- Interpolate field on surface virtual tmp<scalarField> interpolate ( @@ -244,6 +266,9 @@ public: const interpolation<tensor>& ) const; + + // Output + //- Write virtual void print(Ostream&) const; }; diff --git a/src/sampling/sampledSurface/sampledPatch/sampledPatch.H b/src/sampling/sampledSurface/sampledPatch/sampledPatch.H index b16ddef634..e47d7494ba 100644 --- a/src/sampling/sampledSurface/sampledPatch/sampledPatch.H +++ b/src/sampling/sampledSurface/sampledPatch/sampledPatch.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -180,8 +180,27 @@ public: return MeshStorage::faces(); } + //- Face area vectors + virtual const vectorField& Sf() const + { + return MeshStorage::Sf(); + } + + //- Face area magnitudes + virtual const scalarField& magSf() const + { + return MeshStorage::magSf(); + } + + //- Face centres + virtual const vectorField& Cf() const + { + return MeshStorage::Cf(); + } + // Sample + //- Sample field on surface virtual tmp<scalarField> sample ( diff --git a/src/sampling/sampledSurface/sampledPlane/sampledPlane.H b/src/sampling/sampledSurface/sampledPlane/sampledPlane.H index 6746361c1e..6269d39d9a 100644 --- a/src/sampling/sampledSurface/sampledPlane/sampledPlane.H +++ b/src/sampling/sampledSurface/sampledPlane/sampledPlane.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -140,6 +140,25 @@ public: return cuttingPlane::faces(); } + //- Face area magnitudes + virtual const vectorField& Sf() const + { + return cuttingPlane::Sf(); + } + + //- Face area magnitudes + virtual const scalarField& magSf() const + { + return cuttingPlane::magSf(); + } + + //- Face centres + virtual const vectorField& Cf() const + { + return cuttingPlane::Cf(); + } + + //- For every face original cell in mesh const labelList& meshCells() const { diff --git a/src/sampling/sampledSurface/sampledSurface/sampledSurface.C b/src/sampling/sampledSurface/sampledSurface/sampledSurface.C index d1281cfb45..ddaea516a0 100644 --- a/src/sampling/sampledSurface/sampledSurface/sampledSurface.C +++ b/src/sampling/sampledSurface/sampledSurface/sampledSurface.C @@ -41,76 +41,10 @@ namespace Foam void Foam::sampledSurface::clearGeom() const { - deleteDemandDrivenData(SfPtr_); - deleteDemandDrivenData(magSfPtr_); - deleteDemandDrivenData(CfPtr_); area_ = -1; } -void Foam::sampledSurface::makeSf() const -{ - // It is an error to recalculate if the pointer is already set - if (SfPtr_) - { - FatalErrorInFunction - << "face area vectors already exist" - << abort(FatalError); - } - - const faceList& theFaces = faces(); - SfPtr_ = new vectorField(theFaces.size()); - - vectorField& values = *SfPtr_; - forAll(theFaces, facei) - { - values[facei] = theFaces[facei].normal(points()); - } -} - - -void Foam::sampledSurface::makeMagSf() const -{ - // It is an error to recalculate if the pointer is already set - if (magSfPtr_) - { - FatalErrorInFunction - << "mag face areas already exist" - << abort(FatalError); - } - - const faceList& theFaces = faces(); - magSfPtr_ = new scalarField(theFaces.size()); - - scalarField& values = *magSfPtr_; - forAll(theFaces, facei) - { - values[facei] = theFaces[facei].mag(points()); - } -} - - -void Foam::sampledSurface::makeCf() const -{ - // It is an error to recalculate if the pointer is already set - if (CfPtr_) - { - FatalErrorInFunction - << "face centres already exist" - << abort(FatalError); - } - - const faceList& theFaces = faces(); - CfPtr_ = new vectorField(theFaces.size()); - - vectorField& values = *CfPtr_; - forAll(theFaces, facei) - { - values[facei] = theFaces[facei].centre(points()); - } -} - - // * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * // Foam::autoPtr<Foam::sampledSurface> Foam::sampledSurface::New @@ -156,9 +90,6 @@ Foam::sampledSurface::sampledSurface name_(name), mesh_(mesh), interpolate_(interpolate), - SfPtr_(nullptr), - magSfPtr_(nullptr), - CfPtr_(nullptr), area_(-1) {} @@ -173,9 +104,6 @@ Foam::sampledSurface::sampledSurface name_(name), mesh_(mesh), interpolate_(dict.lookupOrDefault("interpolate", false)), - SfPtr_(nullptr), - magSfPtr_(nullptr), - CfPtr_(nullptr), area_(-1) { dict.readIfPresent("name", name_); @@ -192,39 +120,6 @@ Foam::sampledSurface::~sampledSurface() // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // -const Foam::vectorField& Foam::sampledSurface::Sf() const -{ - if (!SfPtr_) - { - makeSf(); - } - - return *SfPtr_; -} - - -const Foam::scalarField& Foam::sampledSurface::magSf() const -{ - if (!magSfPtr_) - { - makeMagSf(); - } - - return *magSfPtr_; -} - - -const Foam::vectorField& Foam::sampledSurface::Cf() const -{ - if (!CfPtr_) - { - makeCf(); - } - - return *CfPtr_; -} - - Foam::scalar Foam::sampledSurface::area() const { if (area_ < 0) diff --git a/src/sampling/sampledSurface/sampledSurface/sampledSurface.H b/src/sampling/sampledSurface/sampledSurface/sampledSurface.H index b0a19707a9..3ddf4c2980 100644 --- a/src/sampling/sampledSurface/sampledSurface/sampledSurface.H +++ b/src/sampling/sampledSurface/sampledSurface/sampledSurface.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -98,31 +98,10 @@ class sampledSurface // Demand-driven data - //- Face area vectors - mutable vectorField* SfPtr_; - - //- Mag face area vectors - mutable scalarField* magSfPtr_; - - //- Face centres - mutable vectorField* CfPtr_; - //- Total surface area mutable scalar area_; - // Make geometric data - - //- Make Sf - void makeSf() const; - - //- Make magSf - void makeMagSf() const; - - //- Make Cf - void makeCf() const; - - // Service methods //- Check field size matches surface size @@ -284,18 +263,19 @@ public: //- Faces of surface virtual const faceList& faces() const = 0; - //- Return face area vectors - virtual const vectorField& Sf() const; + //- Face area vectors + virtual const vectorField& Sf() const = 0; - //- Return face area magnitudes - virtual const scalarField& magSf() const; + //- Face area magnitudes + virtual const scalarField& magSf() const = 0; - //- Return face centres as vectorField - virtual const vectorField& Cf() const; + //- Face centres + virtual const vectorField& Cf() const = 0; //- The total surface area scalar area() const; + //- Integration of a field across the surface template<class Type> Type integrate(const Field<Type>&) const; diff --git a/src/sampling/sampledSurface/sampledTriSurfaceMesh/sampledTriSurfaceMesh.H b/src/sampling/sampledSurface/sampledTriSurfaceMesh/sampledTriSurfaceMesh.H index 6a41255075..1d62d0a02a 100644 --- a/src/sampling/sampledSurface/sampledTriSurfaceMesh/sampledTriSurfaceMesh.H +++ b/src/sampling/sampledSurface/sampledTriSurfaceMesh/sampledTriSurfaceMesh.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -216,6 +216,24 @@ public: return MeshStorage::faces(); } + //- Face area vectors + virtual const vectorField& Sf() const + { + return MeshStorage::Sf(); + } + + //- Face area magnitudes + virtual const scalarField& magSf() const + { + return MeshStorage::magSf(); + } + + //- Face centres + virtual const vectorField& Cf() const + { + return MeshStorage::Cf(); + } + //- Sample field on surface virtual tmp<scalarField> sample diff --git a/src/sampling/sampledSurface/thresholdCellFaces/sampledThresholdCellFaces.H b/src/sampling/sampledSurface/thresholdCellFaces/sampledThresholdCellFaces.H index 840a9920ad..2fa91d2345 100644 --- a/src/sampling/sampledSurface/thresholdCellFaces/sampledThresholdCellFaces.H +++ b/src/sampling/sampledSurface/thresholdCellFaces/sampledThresholdCellFaces.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -148,6 +148,25 @@ public: return MeshStorage::faces(); } + //- Face area vectors (normals) + virtual const vectorField& Sf() const + { + return MeshStorage::Sf(); + } + + //- Face area magnitudes + virtual const scalarField& magSf() const + { + return MeshStorage::magSf(); + } + + //- Face centres + virtual const vectorField& Cf() const + { + return MeshStorage::Cf(); + } + + //- Sample field on surface virtual tmp<scalarField> sample(const volScalarField&) const; -- GitLab From 9b81de4da6d39905bf84f765db98aacb57ac4d2c Mon Sep 17 00:00:00 2001 From: mark <mark@opencfd> Date: Thu, 3 Nov 2016 08:05:31 +0100 Subject: [PATCH 4/4] STYLE: note new magSf() for use in surfaceNoise - still needs to be applied and tested --- .../noiseModels/surfaceNoise/surfaceNoise.C | 43 ++++--------------- 1 file changed, 8 insertions(+), 35 deletions(-) diff --git a/src/randomProcesses/noise/noiseModels/surfaceNoise/surfaceNoise.C b/src/randomProcesses/noise/noiseModels/surfaceNoise/surfaceNoise.C index 860aafdae3..407473632f 100644 --- a/src/randomProcesses/noise/noiseModels/surfaceNoise/surfaceNoise.C +++ b/src/randomProcesses/noise/noiseModels/surfaceNoise/surfaceNoise.C @@ -301,14 +301,8 @@ Foam::scalar surfaceNoise::writeSurfaceData false ); - // TODO: Move faceAreas to demand-driven function in MeshedSurface - // scalarField faceAreas(surf.faces().size()); - // forAll(faceAreas, i) - // { - // faceAreas[i] = surf.faces()[i].mag(surf.points()); - // } - // - // areaAverage = sum(allData*faceAreas)/sum(faceAreas); + // TO BE VERIFIED: area-averaged values + // areaAverage = sum(allData*surf.magSf())/sum(surf.magSf()); areaAverage = sum(allData)/allData.size(); } Pstream::scatter(areaAverage); @@ -330,14 +324,8 @@ Foam::scalar surfaceNoise::writeSurfaceData false ); - // TODO: Move faceAreas to demand-driven function in MeshedSurface - // scalarField faceAreas(surf.faces().size()); - // forAll(faceAreas, i) - // { - // faceAreas[i] = surf.faces()[i].mag(surf.points()); - // } - // - // return sum(data*faceAreas)/sum(faceAreas); + // TO BE VERIFIED: area-averaged values + // return sum(data*surf.magSf())/sum(surf.magSf()); return sum(data)/data.size(); } } @@ -387,14 +375,8 @@ Foam::scalar surfaceNoise::surfaceAverage } } - // TODO: Move faceAreas to demand-driven function in MeshedSurface - scalarField faceAreas(surf.faces().size()); - forAll(faceAreas, i) - { - faceAreas[i] = surf.faces()[i].mag(surf.points()); - } - -// areaAverage = sum(allData*faceAreas)/sum(faceAreas); + // TO BE VERIFIED: area-averaged values + // areaAverage = sum(allData*surf.magSf())/sum(surf.magSf()); areaAverage = sum(allData)/allData.size(); } Pstream::scatter(areaAverage); @@ -405,14 +387,8 @@ Foam::scalar surfaceNoise::surfaceAverage { const meshedSurface& surf = readerPtr_->geometry(); - // TODO: Move faceAreas to demand-driven function in MeshedSurface - scalarField faceAreas(surf.faces().size()); - forAll(faceAreas, i) - { - faceAreas[i] = surf.faces()[i].mag(surf.points()); - } - -// return sum(data*faceAreas)/sum(faceAreas); + // TO BE VERIFIED: area-averaged values + // return sum(data*surf.magSf())/sum(surf.magSf()); return sum(data)/data.size(); } } @@ -550,9 +526,6 @@ void surfaceNoise::calculate() surfPSD13f[freqI][faceI] = PSD13f.y()[freqI]; surfPrms13f2[freqI][faceI] = Prms13f2.y()[freqI]; } - - // Free the storage for p -// p.clear(); } // Output directory for graphs -- GitLab