sampledSet.H 8.41 KB
Newer Older
1 2 3 4
/*---------------------------------------------------------------------------*\
  =========                 |
  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
   \\    /   O peration     |
OpenFOAM bot's avatar
OpenFOAM bot committed
5
    \\  /    A nd           | www.openfoam.com
OpenFOAM bot's avatar
OpenFOAM bot committed
6 7
     \\/     M anipulation  |
-------------------------------------------------------------------------------
OpenFOAM bot's avatar
OpenFOAM bot committed
8 9
    Copyright (C) 2011-2016 OpenFOAM Foundation
    Copyright (C) 2017-2018 OpenCFD Ltd.
10 11 12 13
-------------------------------------------------------------------------------
License
    This file is part of OpenFOAM.

14 15 16 17
    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.
18 19 20 21 22 23 24

    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
25
    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
26 27 28 29

Class
    Foam::sampledSet

30
Group
31
    grpUtilitiesFunctionObjects
32

33 34 35 36 37 38 39 40 41
Description
    Holds list of sampling points which is filled at construction time.
    Various implementations of this base class to e.g. get sampling points
    at uniform distance along a line (uniformSet) or directly specified
    (cloudSet)

    Each 'sampledSet' has a name and a specifier of how the axis should be
    write (x/y/z component or all 3 components)

42 43 44 45 46 47
    For a dictionary specification:
    \table
        Property | Description                             | Required | Default
        axis     | x, y, z, xyz, distance                  | yes      |
    \endtable

48 49 50 51 52 53 54 55
SourceFiles
    sampledSet.C

\*---------------------------------------------------------------------------*/

#ifndef sampledSet_H
#define sampledSet_H

56
#include "coordSet.H"
57 58 59 60 61 62 63 64 65
#include "typeInfo.H"
#include "runTimeSelectionTables.H"
#include "autoPtr.H"

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

namespace Foam
{

66
// Forward declarations
67 68 69 70
class polyMesh;
class meshSearch;

/*---------------------------------------------------------------------------*\
71
                         Class sampledSet Declaration
72 73 74 75 76 77 78 79 80 81 82 83
\*---------------------------------------------------------------------------*/

class sampledSet
:
    public coordSet
{
    // Private data

        //- Reference to mesh
        const polyMesh& mesh_;

        //- Reference to mesh searching class
84
        const meshSearch& searchEngine_;
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100


protected:

        //- Segment numbers
        labelList segments_;

        //- Cell numbers
        labelList cells_;

        //- Face numbers (-1 if not known)
        labelList faces_;


    // Protected Member Functions

101 102 103
        //- Check for consistent sizing
        void checkDimensions() const;

104 105 106
        //- Returns cell next to boundary face
        label getBoundaryCell(const label) const;

Andrew Heather's avatar
Andrew Heather committed
107
        //- Returns the neighbour cell or the owner if face in on the boundary
108 109
        label getNeighbourCell(const label) const;

110 111 112
        //- Return the cell in which the point on the sample line
        //  resides if found otherwise return -1
        label pointInCell(const point& p, const label samplei) const;
113 114 115

        //- Calculates inproduct of face normal and vector sample-face centre
        //  <0 if sample inside.
116
        scalar calcSign(const label facei, const point& sample) const;
117 118 119 120

        //- Returns face label (or -1) of face which is close to sample
        label findNearFace
        (
121
            const label celli,
122 123 124 125
            const point& sample,
            const scalar smallDist
        ) const;

126
        //- Moves sample in direction of -n to it is 'inside' of facei
127 128 129
        point pushIn
        (
            const point& sample,
130
            const label facei
131 132 133 134
        ) const;

        //- Calculates start of tracking given samplePt and first boundary
        //  intersection
135
        //  (bPoint, bFacei) (bFacei == -1 if no boundary intersection)
136
        //  Returns true if trackPt is valid sampling point. Sets trackPt,
137
        //  trackFacei, trackCelli (-1 if no tracking point found)
138 139 140 141
        bool getTrackingPoint
        (
            const point& samplePt,
            const point& bPoint,
142
            const label bFacei,
143
            const scalar smallDist,
144 145

            point& trackPt,
146 147
            label& trackCelli,
            label& trackFacei
148 149
        ) const;

150
        //- Set sample data. Copy list contents.
151 152 153 154 155 156 157 158 159
        void setSamples
        (
            const List<point>& samplingPts,
            const labelList& samplingCells,
            const labelList& samplingFaces,
            const labelList& samplingSegments,
            const scalarList& samplingCurveDist
        );

160 161 162 163 164 165 166 167 168
        //- Set sample data. Move list contents.
        void setSamples
        (
            List<point>&& samplingPts,
            labelList&& samplingCells,
            labelList&& samplingFaces,
            labelList&& samplingSegments,
            scalarList&& samplingCurveDist
        );
169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185

public:

    //- Runtime type information
    TypeName("sampledSet");


    // Declare run-time constructor selection table

        declareRunTimeSelectionTable
        (
            autoPtr,
            sampledSet,
            word,
            (
                const word& name,
                const polyMesh& mesh,
186
                const meshSearch& searchEngine,
187 188 189 190 191 192 193 194 195 196 197
                const dictionary& dict
            ),
            (name, mesh, searchEngine, dict)
        );


        //- Class used for the read-construction of
        //  PtrLists of sampledSet
        class iNew
        {
            const polyMesh& mesh_;
198
            const meshSearch& searchEngine_;
199 200 201

        public:

202
            iNew(const polyMesh& mesh, const meshSearch& searchEngine)
203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
            :
                mesh_(mesh),
                searchEngine_(searchEngine)
            {}

            autoPtr<sampledSet> operator()(Istream& is) const
            {
                word name(is);
                dictionary dict(is);
                return sampledSet::New(name, mesh_, searchEngine_, dict);
            }
        };


    // Constructors

219 220 221 222 223 224 225 226 227
        //- Construct from components
        sampledSet
        (
            const word& name,
            const polyMesh& mesh,
            const meshSearch& searchEngine,
            const coordSet::coordFormat axisType
        );

228 229 230 231 232
        //- Construct from components
        sampledSet
        (
            const word& name,
            const polyMesh& mesh,
233
            const meshSearch& searchEngine,
234 235 236 237 238 239 240 241
            const word& axis
        );

        //- Construct from dictionary
        sampledSet
        (
            const word& name,
            const polyMesh& mesh,
242
            const meshSearch& searchEngine,
243 244 245 246 247 248
            const dictionary& dict
        );

        //- Clone
        autoPtr<sampledSet> clone() const
        {
249
            NotImplemented;
250
            return nullptr;
251 252 253 254 255 256 257 258 259 260
        }


    // Selectors

        //- Return a reference to the selected sampledSet
        static autoPtr<sampledSet> New
        (
            const word& name,
            const polyMesh& mesh,
261
            const meshSearch& searchEngine,
262 263 264 265
            const dictionary& dict
        );


266
    //- Destructor
267
    virtual ~sampledSet() = default;
268 269 270 271 272 273 274 275 276


    // Member Functions

        const polyMesh& mesh() const
        {
            return mesh_;
        }

277
        const meshSearch& searchEngine() const
278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298
        {
            return searchEngine_;
        }

        const labelList& segments() const
        {
            return segments_;
        }

        const labelList& cells() const
        {
            return cells_;
        }

        const labelList& faces() const
        {
            return faces_;
        }

        //- Output for debugging
        Ostream& write(Ostream&) const;
299

300 301
        //- Helper: gather onto master and sort.
        //  \return (on master) gathered set and overall sort order
302 303 304 305 306
        autoPtr<coordSet> gather
        (
            labelList& indexSet,
            labelList& allSegments
        ) const;
307 308 309 310 311 312 313 314 315 316 317 318
};


// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

} // End namespace Foam

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

#endif

// ************************************************************************* //