/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2016 OpenFOAM Foundation Copyright (C) 2016-2022 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. OpenFOAM is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. OpenFOAM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenFOAM. If not, see . Class Foam::sampledCuttingPlane Description A sampledSurface defined by a plane using an iso-surface algorithm to \a cut the mesh. This is often embedded as part of a sampled surfaces function object. Usage Example of function object partial specification: \verbatim surfaces { surface1 { type cuttingPlane; point ...; normal ...; } } \endverbatim Where the sub-entries comprise: \table Property | Description | Required | Default type | cuttingPlane | yes | planeType | Plane description (pointAndNormal etc) | no | offsets | Offsets of the origin in the normal direction | no | (0) isoMethod | Iso-algorithm (cell/topo/point) | no | topo bounds | limit with bounding box | no | zone | limit to cell zone (name or regex) | no | zones | limit to cell zones (names, regexs) | no | exposedPatchName | name for zone subset | optional | regularise | Face simplification (enum or bool) | no | true mergeTol | tolerance for merging points | no | 1e-6 coordinateSystem | define plane within given cartesian system | no | transform | define plane within given cartesian system | no | \endtable Note The keyword \c zones has priority over \c zone. SeeAlso Foam::plane SourceFiles sampledCuttingPlane.C \*---------------------------------------------------------------------------*/ #ifndef Foam_sampledCuttingPlane_H #define Foam_sampledCuttingPlane_H #include "sampledSurface.H" #include "plane.H" #include "fvMeshSubset.H" #include "isoSurfaceBase.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam { /*---------------------------------------------------------------------------*\ Class sampledCuttingPlane Declaration \*---------------------------------------------------------------------------*/ class sampledCuttingPlane : public sampledSurface { // Private Data //- Plane const plane plane_; //- The offsets to the plane - defaults to (0). List offsets_; //- Parameters (filtering etc) for iso-surface isoSurfaceParams isoParams_; //- Whether to recalculate cell values as average of point values bool average_; //- Use simple sub-meshing in algorithm itself bool simpleSubMesh_; //- The zone or zones in which cutting is to occur wordRes zoneNames_; //- For zones: patch to put exposed faces into mutable word exposedPatchName_; //- Track if the surface needs an update mutable bool needsUpdate_; // Sampling geometry. Directly stored or via an iso-surface (ALGO_POINT) //- The extracted surface (direct storage) mutable meshedSurface surface_; //- For every face the original cell in mesh (direct storage) mutable labelList meshCells_; //- Constructed iso-surface (ALGO_POINT), for interpolators autoPtr isoSurfacePtr_; // Mesh Subsetting //- Cached subMesh for (pre-)subset of cell zones mutable autoPtr subMeshPtr_; //- Cached ignore cells for (post-)subset of cell zones mutable autoPtr ignoreCellsPtr_; // Fields //- Distance to cell centres autoPtr cellDistancePtr_; //- Distance to points scalarField pointDistance_; // Private Member Functions //- Define plane from dictionary entry and apply any coordinate //- transformations static plane definePlane(const polyMesh& mesh, const dictionary& dict); //- Check and warn if bounding box does not intersect mesh or plane void checkBoundsIntersection ( const plane& pln, const boundBox& meshBb ) const; //- Fill cellDistance, pointDistance fields for the specified plane void setDistanceFields(const plane& pln); //- Collect iso-surfaces into a single surface (No point merging) void combineSurfaces(PtrList& isoSurfPtrs); //- Create iso surface void createGeometry(); //- Sample volume field onto surface faces template tmp> sampleOnFaces ( const interpolation& sampler ) const; //- Interpolate volume field onto surface points template tmp> sampleOnPoints ( const interpolation& interpolator ) const; //- Use isoSurfacePtr_ for point interpolation template tmp> sampleOnIsoSurfacePoints ( const interpolation& interpolator ) const; protected: // Protected Member Functions //- Is currently backed by an isoSurfacePtr_ bool hasIsoSurface() const { return bool(isoSurfacePtr_); } public: //- Runtime type information TypeName("sampledCuttingPlane"); // Constructors //- Construct from dictionary sampledCuttingPlane ( const word& name, const polyMesh& mesh, const dictionary& dict ); //- Destructor virtual ~sampledCuttingPlane() = default; // Member Functions //- Does the surface need an update? virtual bool needsUpdate() const; //- Mark the surface as needing an update. // May also free up unneeded data. // Return false if surface was already marked as expired. virtual bool expire(); //- Update the surface as required. // Do nothing (and return false) if no update was needed virtual bool update(); //- The current surface geometry const meshedSurface& surface() const { if (isoSurfacePtr_) { return *isoSurfacePtr_; } return surface_; } //- For each face, the original cell in mesh const labelList& meshCells() const { if (isoSurfacePtr_) { return isoSurfacePtr_->meshCells(); } return meshCells_; } //- Points of surface virtual const pointField& points() const { return surface().points(); } //- Faces of surface virtual const faceList& faces() const { return surface().surfFaces(); } //- Per-face zone/region information virtual const labelList& zoneIds() const { return labelList::null(); } //- Face area magnitudes 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(); } // Sample //- Sample volume field onto surface faces virtual tmp sample ( const interpolation& sampler ) const; //- Sample volume field onto surface faces virtual tmp sample ( const interpolation& sampler ) const; //- Sample volume field onto surface faces virtual tmp sample ( const interpolation& sampler ) const; //- Sample volume field onto surface faces virtual tmp sample ( const interpolation& sampler ) const; //- Sample volume field onto surface faces virtual tmp sample ( const interpolation& sampler ) const; // Interpolate //- Interpolate volume field onto surface points virtual tmp interpolate ( const interpolation& interpolator ) const; //- Interpolate volume field onto surface points virtual tmp interpolate ( const interpolation& interpolator ) const; //- Interpolate volume field onto surface points virtual tmp interpolate ( const interpolation& interpolator ) const; //- Interpolate volume field onto surface points virtual tmp interpolate ( const interpolation& interpolator ) const; //- Interpolate volume field onto surface points virtual tmp interpolate ( const interpolation& interpolator ) const; // Output //- Print information virtual void print(Ostream& os, int level=0) const; }; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #ifdef NoRepository #include "sampledCuttingPlaneTemplates.C" #endif // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #endif // ************************************************************************* //