This file is indexed.

/usr/include/freefoam/meshTools/surfaceFeatures.H is in libfreefoam-dev 0.1.0+dfsg-1build1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 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
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
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
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
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
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
/*---------------------------------------------------------------------------*\
  =========                 |
  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
   \\    /   O peration     |
    \\  /    A nd           | Copyright (C) 1991-2010 OpenCFD Ltd.
     \\/     M anipulation  |
-------------------------------------------------------------------------------
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 <http://www.gnu.org/licenses/>.

Class
    Foam::surfaceFeatures

Description
    Holds feature edges/points of surface.

    Feature edges are stored in one list and sorted:
        0 .. externalStart_-1               : region edges
        externalStart_ .. internalStart_-1  : external edges
        internalStart_ .. size-1            : internal edges


    NOTE: angle is included angle, not feature angle and is in degrees.
    The included angle is the smallest angle between two planes. For coplanar
    faces it is 180, for straight angles it is 90. To pick up straight edges
    only use included angle of 91 degrees


SourceFiles
    surfaceFeatures.C

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

#ifndef surfaceFeatures_H
#define surfaceFeatures_H

#include <OpenFOAM/pointField.H>
#include <OpenFOAM/Map.H>
#include <OpenFOAM/HashSet.H>
#include <meshTools/pointIndexHit.H>
#include <OpenFOAM/edgeList.H>
#include <OpenFOAM/typeInfo.H>

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

namespace Foam
{

// Forward declaration of classes
class triSurface;

/*---------------------------------------------------------------------------*\
                           Class surfaceFeatures Declaration
\*---------------------------------------------------------------------------*/

class surfaceFeatures
{
public:

        enum edgeStatus
        {
            NONE,
            REGION,
            EXTERNAL,
            INTERNAL
        };


private:

    //- label and scalar; used in path walking
    class labelScalar
    {
    public:
        label n_;
        scalar len_;

        labelScalar(const label n, const scalar len)
        :
            n_(n),
            len_(len)
        {}
    };


    // Private data

        //- Reference to surface
        const triSurface& surf_;

        //- Labels of points that are features
        labelList featurePoints_;

        //- Labels of edges that are features
        labelList featureEdges_;

        //- Start of external edges in featureEdges_
        label externalStart_;

        //- Start of internal edges in featureEdges_
        label internalStart_;


    // Private Member Functions

        //- Return nearest point on edge (start..end). Also classify nearest:
        //  index=-1: nearest on mid of edge. index=0:nearest on edge.start()
        //  index=1: nearest on edge.end().
        static pointIndexHit edgeNearest
        (
            const point& start,
            const point& end,
            const point& sample
        );


        //- Construct feature points where more than 2 feature edges meet
        void calcFeatPoints(const List<edgeStatus>&);

        //- Choose next unset feature edge.
        label nextFeatEdge
        (
            const List<edgeStatus>& edgeStat,
            const labelList& featVisited,
            const label unsetVal,
            const label prevEdgeI,
            const label vertI
        ) const;

        //- Walk connected feature edges. Marks edges in featVisited.
        labelScalar walkSegment
        (
            const bool mark,
            const List<edgeStatus>& edgeStat,
            const label startEdgeI,
            const label startPointI,
            const label currentFeatI,
            labelList& featVisited
        );

public:

    ClassName("surfaceFeatures");

    // Constructors

        //- Construct from surface
        surfaceFeatures(const triSurface&);

        //- Construct from components
        surfaceFeatures
        (
            const triSurface&,
            const labelList& featurePoints,
            const labelList& featureEdges,
            const label externalStart,
            const label internalStart
        );

        //- Construct from surface, angle and min cumulative length and/or
        //  number of elements
        surfaceFeatures
        (
            const triSurface&,
            const scalar includedAngle,
            const scalar minLen = 0,
            const label minElems = 0
        );

        //- Construct from dictionary
        surfaceFeatures(const triSurface&, const dictionary& dict);

        //- Construct from file
        surfaceFeatures(const triSurface&, const fileName& fName);

        //- Construct as copy
        surfaceFeatures(const surfaceFeatures&);


    // Member Functions

        // Access

            inline const triSurface& surface() const
            {
                return surf_;
            }

            //- Return feature point list
            inline const labelList& featurePoints() const
            {
                return featurePoints_;
            }

            //- Return feature edge list
            inline const labelList& featureEdges() const
            {
                return featureEdges_;
            }

            //- start of external edges
            inline label externalStart() const
            {
                return externalStart_;
            }

            //- start of internal edges
            inline label internalStart() const
            {
                return internalStart_;
            }

            //- Return number of region edges
            inline label nRegionEdges() const
            {
                return externalStart_;
            }

            //- Return number of external edges
            inline label nExternalEdges() const
            {
                return internalStart_ - externalStart_;
            }

            //- Return number of internal edges
            inline label nInternalEdges() const
            {
                return featureEdges_.size() - internalStart_;
            }

            //- Helper function: select a subset of featureEdges_
            labelList selectFeatureEdges
            (
                const bool regionEdges,
                const bool externalEdges,
                const bool internalEdges
            ) const;


        // Edit

            //- Find feature edges using provided included angle
            void findFeatures(const scalar includedAngle);

            //- Delete small sets of edges. Edges are stringed up and any
            //  string of length < minLen (or nElems < minElems) is deleted.
            void trimFeatures(const scalar minLen, const label minElems);

            //- From member feature edges to status per edge.
            List<edgeStatus> toStatus() const;

            //- Set from status per edge
            void setFromStatus(const List<edgeStatus>&);


        // Find

            //- Find nearest sample for selected surface points (usually the
            //  set of featurePoints). Return map from index in
            //  samples to surface point. Do not include points that are further
            //  than maxDist away (separate maxDist for every sample)
            Map<label> nearestSamples
            (
                const labelList& selectedPoints,
                const pointField& samples,
                const scalarField& maxDist
            ) const;

            //- Find nearest sample for regularly sampled points along the
            //  selected (surface) edges. Return map from sample to edge.
            //  maxDist is distance below which gets snapped.
            //  Edge gets sampled at points sampleDist[sampleI] apart.
            //  (with a maximum of 10 samples per edge)
            Map<label> nearestSamples
            (
                const labelList& selectedEdges,
                const pointField& samples,
                const scalarField& sampleDist,
                const scalarField& maxDist,
                const scalar minSampleDist = 0.1
            ) const;

            //- Like nearestSamples but now gets nearest point on
            //  sample-edge instead of nearest sample-point itself.
            //  Return map from sample edge to feature edge.
            Map<pointIndexHit> nearestEdges
            (
                const labelList& selectedEdges,
                const edgeList& sampleEdges,
                const labelList& selectedSampleEdges,
                const pointField& samplePoints,
                const scalarField& sampleDist,
                const scalarField& maxDist,
                const scalar minSampleDist = 0.1
            ) const;


            //- Find nearest surface edge (out of selectedEdges) for
            //  each sample point.
            //  Sets:
            //  - edgeLabel : label of surface edge.
            //  - edgePoint : exact position of nearest point on edge.
            //  - edgeEndPoint : -1, 0, 1 depending on whether edgePoint is
            //                  on inside/start/end of edge
            void nearestSurfEdge
            (
                const labelList& selectedEdges,
                const pointField& samples,
                const vector& searchSpan,   // search span
                labelList& edgeLabel,
                labelList& edgeEndPoint,
                pointField& edgePoint
            ) const;


            //- Find nearest surface edge (out of selectedEdges) for each
            // sample edge.
            //  Sets:
            //  - edgeLabel         : label of surface edge.
            //  - pointOnEdge       : exact position of nearest point on edge.
            //  - pointOnFeature    : exact position on sample edge.
            void nearestSurfEdge
            (
                const labelList& selectedEdges,
                const edgeList& sampleEdges,
                const labelList& selectedSampleEdges,
                const pointField& samplePoints,
                const vector& searchSpan,   // search span

                labelList& edgeLabel,       // label of surface edge or -1
                pointField& pointOnEdge,    // point on above edge
                pointField& pointOnFeature  // point on sample edge
            ) const;


        // Write

            //- Write as dictionary
            void writeDict(Ostream&) const;

            //- Write as dictionary to file
            void write(const fileName& fName) const;

            //- Write to separate OBJ files (region, external, internal edges,
            //  feature points) for visualization
            void writeObj(const fileName& prefix) const;



    // Member Operators

        void operator=(const surfaceFeatures&);


};


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

} // End namespace Foam

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

#endif

// ************************ vim: set sw=4 sts=4 et: ************************ //