PointEdgeWave.H 10.4 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
6
     \\/     M anipulation  |
OpenFOAM bot's avatar
OpenFOAM bot committed
7
-------------------------------------------------------------------------------
OpenFOAM bot's avatar
OpenFOAM bot committed
8
    Copyright (C) 2011-2016 OpenFOAM Foundation
9
    Copyright (C) 2020 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 30 31

Class
    Foam::PointEdgeWave

Description
    Wave propagation of information through grid. Every iteration
32
    information goes through one layer of edges.
33 34

    Templated on information that is transferred.
35

36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
    Handles parallel and cyclics. Only parallel reasonably tested. Cyclics
    hardly tested.

    Note: whether to propagate depends on the return value of Type::update
    which returns true (i.e. propagate) if the value changes by more than a
    certain tolerance.

    Note: parallel is done in two steps:
      -# transfer patch points in offset notation, i.e. every patch
         point is denoted by a patchface label and an index in this face.
         Receiving end uses that fact that f[0] is shared and order is
         reversed.
      -# do all non-local shared points by means of reduce of data on them.

    Note: cyclics is with offset in patchface as well. Patch is divided into
    two sub patches and the point-point addressing is never explicitly
    calculated but instead use is made of the face-face correspondence.
    (it probably is more efficient to calculate a point-point
    correspondence at the start and then reuse this; task to be done)

SourceFiles
    PointEdgeWave.C

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

#ifndef PointEdgeWave_H
#define PointEdgeWave_H

64
#include "bitSet.H"
65
#include "scalarField.H"
66
#include "tensorField.H"
67 68 69 70 71 72

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

namespace Foam
{

73
// Forward Declarations
74
class polyMesh;
75
class polyPatch;
76 77 78 79 80 81 82 83 84 85 86 87

/*---------------------------------------------------------------------------*\
                        Class PointEdgeWaveName Declaration
\*---------------------------------------------------------------------------*/

TemplateName(PointEdgeWave);


/*---------------------------------------------------------------------------*\
                           Class PointEdgeWave Declaration
\*---------------------------------------------------------------------------*/

Henry's avatar
Henry committed
88
template<class Type, class TrackingData = int>
89 90 91 92
class PointEdgeWave
:
    public PointEdgeWaveName
{
93
    // Private Static Data
94 95

        //- Relative tolerance. Stop propagation if relative changes
Andrew Heather's avatar
Andrew Heather committed
96
        //  less than this tolerance (responsibility for checking this is
97 98 99
        //  up to Type implementation)
        static scalar propagationTol_;

100
        //- Default trackdata value to satisfy default template argument.
mattijs's avatar
mattijs committed
101
        static int dummyTrackData_;
102

103

104
    // Private Data
105 106

        //- Reference to mesh
107
        const polyMesh& mesh_;
108 109

        //- Wall information for all points
110
        UList<Type>& allPointInfo_;
111 112

        //- Information on all mesh edges
113 114 115 116
        UList<Type>& allEdgeInfo_;

        //- Additional data to be passed into container
        TrackingData& td_;
117 118

        //- Has point changed
119
        bitSet changedPoint_;
120 121 122 123 124 125 126 127

        //- List of changed points
        labelList changedPoints_;

        //- Number of changed points
        label nChangedPoints_;

        //- Edges that have changed
128 129
        bitSet changedEdge_;

130 131 132 133
        labelList changedEdges_;
        label nChangedEdges_;

        //- Number of cyclic patches
134
        label nCyclicPatches_;
135 136 137 138 139 140 141 142 143 144 145 146 147 148

        //- Number of evaluations
        label nEvals_;

        //- Number of unvisited edges/points
        label nUnvisitedPoints_;
        label nUnvisitedEdges_;


    // Private Member Functions

        //- Adapt pointInfo for leaving domain
        void leaveDomain
        (
149
            const polyPatch&,
150 151 152 153 154 155 156
            const List<label>& patchPointLabels,
            List<Type>& pointInfo
        ) const;

        //- Adapt pointInfo for entering domain
        void enterDomain
        (
157
            const polyPatch&,
158 159 160 161 162 163 164
            const List<label>& patchPointLabels,
            List<Type>& pointInfo
        ) const;

        //- Transform. Implementation referred to Type
        void transform
        (
165
            const polyPatch& patch,
166 167 168 169
            const tensorField& rotTensor,
            List<Type>& pointInfo
        ) const;

170 171
        //- Updates pointInfo with information from neighbour.
        //  Updates all statistics.
172 173
        bool updatePoint
        (
174
            const label pointi,
175 176 177 178 179
            const label neighbourEdgeI,
            const Type& neighbourInfo,
            Type& pointInfo
        );

180 181
        //- Updates pointInfo with information from same point.
        //  Updates all statistics.
182 183
        bool updatePoint
        (
184
            const label pointi,
185 186 187 188
            const Type& neighbourInfo,
            Type& pointInfo
        );

189 190
        //- Updates edgeInfo with information from neighbour.
        //  Updates all statistics.
191 192 193
        bool updateEdge
        (
            const label edgeI,
194
            const label neighbourPointi,
195 196 197 198
            const Type& neighbourInfo,
            Type& edgeInfo
        );

199

200 201 202
        // Parallel, cyclic

            //- Has patches of certain type?
Henry's avatar
Henry committed
203
            template<class PatchType>
204 205 206 207 208 209 210 211
            label countPatchType() const;

            //- Merge data from across processor boundaries
            void handleProcPatches();

            //- Merge data from across cyclic boundaries
            void handleCyclicPatches();

212 213 214
            //- Explicitly sync all collocated points
            label handleCollocatedPoints();

215

216 217
        //- No copy construct
        PointEdgeWave(const PointEdgeWave&) = delete;
218

219 220
        //- No copy assignment
        void operator=(const PointEdgeWave&) = delete;
221

Andrew Heather's avatar
Andrew Heather committed
222

223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248
public:

    // Static Functions

        //- Access to tolerance
        static scalar propagationTol()
        {
            return propagationTol_;
        }

        //- Change tolerance
        static void setPropagationTol(const scalar tol)
        {
            propagationTol_ = tol;
        }


    // Constructors

        //- Construct from mesh, list of changed points with the Type
        //  for these points. Gets work arrays to operate on, one of size
        //  number of mesh points, the other number of mesh edges.
        //  Iterates until nothing changes or maxIter reached.
        //  (maxIter can be 0)
        PointEdgeWave
        (
249
            const polyMesh& mesh,
250 251
            const labelList& initialPoints,
            const List<Type>& initialPointsInfo,
252 253 254 255
            UList<Type>& allPointInfo,
            UList<Type>& allEdgeInfo,
            const label maxIter,
            TrackingData& td = dummyTrackData_
256 257
        );

258 259 260 261 262
        //- Construct from mesh. Use setPointInfo and iterate() to do
        //  actual calculation
        PointEdgeWave
        (
            const polyMesh& mesh,
263 264 265
            UList<Type>& allPointInfo,
            UList<Type>& allEdgeInfo,
            TrackingData& td = dummyTrackData_
266 267
        );

268

269
    //- Destructor
270
    ~PointEdgeWave() = default;
271 272 273 274


    // Member Functions

275 276
        //- Access allPointInfo
        UList<Type>& allPointInfo() const
277 278 279 280
        {
            return allPointInfo_;
        }

281 282
        //- Access allEdgeInfo
        UList<Type>& allEdgeInfo() const
283 284 285 286
        {
            return allEdgeInfo_;
        }

287 288 289 290 291 292
        //- Additional data to be passed into container
        const TrackingData& data() const
        {
            return td_;
        }

293
        //- Number of unvisited edges, i.e. edges that were not (yet)
294 295 296 297
        //  reached from walking across mesh. This can happen from
        //  - not enough iterations done
        //  - a disconnected mesh
        //  - a mesh without walls in it
298
        label nUnvisitedEdges() const;
299

300
        label nUnvisitedPoints() const;
301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329

        //- Copy initial data into allPointInfo_
        void setPointInfo
        (
            const labelList& changedPoints,
            const List<Type>& changedPointsInfo
        );

        //- Propagate from point to edge. Returns total number of edges
        //  (over all processors) changed.
        label pointToEdge();

        //- Propagate from edge to point. Returns total number of points
        //  (over all processors) changed.
        label edgeToPoint();

        //- Iterate until no changes or maxIter reached. Returns actual
        //  number of iterations.
        label iterate(const label maxIter);
};


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

/*---------------------------------------------------------------------------*\
                        Class listUpdateOp Declaration
\*---------------------------------------------------------------------------*/

//- List update operation
Henry's avatar
Henry committed
330
template<class Type, class TrackingData = int>
331 332
class listUpdateOp
{
333 334 335 336 337
    //- Additional data to be passed into container

    const scalar tol_;

    TrackingData& td_;
338 339

public:
340

341 342 343 344 345
    listUpdateOp(const scalar tol, TrackingData& td)
    :
        tol_(tol),
        td_(td)
    {}
346 347 348 349 350

    void operator()(List<Type>& x, const List<Type>& y) const
    {
        forAll(x, i)
        {
351
            if (y[i].valid(td_))
352
            {
353
                x[i].updatePoint(y[i], tol_, td_);
354
            }
mattijs's avatar
mattijs committed
355
        }
356 357 358 359 360 361 362 363 364
    }
};

} // End namespace Foam


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

#ifdef NoRepository
365
    #include "PointEdgeWave.C"
366 367 368 369 370 371 372
#endif

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

#endif

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