This file is indexed.

/usr/include/paraview/vtkRectilinearGridConnectivity.h is in paraview-dev 5.0.1+dfsg1-4.

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
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
/*=========================================================================

  Program:   Visualization Toolkit
  Module:    vtkRectilinearGridConnectivity.h

  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
  All rights reserved.
  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.

     This software is distributed WITHOUT ANY WARRANTY; without even
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
     PURPOSE.  See the above copyright notice for more information.

=========================================================================*/
// .NAME vtkRectilinearGridConnectivity - Extracts material fragments from 
//  multi-block vtkRectilinearGrid datasets based on the selected volume 
//  fraction array(s) and a fraction isovalue and integrates the associated
//  attributes.
//
// .SECTION Description
//  Given one or multiple vtkRectilinearGrid datasets with one or multiple
//  volume fraction arrays (representing some materials) and possibly other
//  attributes (like pressure, density, and et al) as the cell data, this
//  filter extracts fragments from the dual grids (with the aforementioned
//  values as the point data) based on the (at least one) selected fraction
//  array(s) in combination with a specified fraction value and integrates
//  the attributes (e.g., volume, pressure, density) across the surface of 
//  each fragment. Each material, made up of one or multiple disconnected
//  fragments, is exported to the output vtkMultiBlockDataSet as a single
//  block that is a vtkPolyData storing the exterior polygons of the fragment
//  (s) and the associated cell data attributes as the integrated result (of
//  the fragment) in terms of the volume, pressure, density, and et al. 
//
//  This filter differs from a closely related filter vtkGridConnectivity in
//  that the former extracts fragments at a sub-cell resolution to create
//  relatively smooth surfaces while the latter works at the cell granularity
//  (a whole cell is taken as either inside or outside a fragment) to cause
//  staircasing artifacts. In fact, an extended 256-entry marching cubes 
//  LUT is designed for generating cube faces (either truncated by iso-lines
//  or not) in addition to iso-triangles. These two kinds of polygons in 
//  combination represent the surface(s) of the greater-than-isovalue sub-
//  volume(s) extracted in a cube. 
//  
//  vtkRectilinearGridConnectivity performs fragments extraction using a
//  three-level mechanism, i.e., intra-process intra-block, intra-process
//  inter-block, and inter-process in increasing order, with the fragments
//  extracted (in the form of polygons stored as a vtkPolyData) at a lower
//  level submitted to its upper level for further extraction (specifically
//  by combining multiple disconnected fragments into a single one wherever
//  possible). Since a fragment is represented by means of its exterior faces
//  / polygons, extracting fragments turns into the task of detecting and
//  removing internal faces (an internal face is the one shared by two sub-
//  volumes or fragments) in a way of combining the associated sub-volumes or
//  fragments. For the fragemnts extraction conducted at any level, the 
//  polygons of the input (e.g., greater-than-isovalue sub-volumes resulting 
//  from marching cubes for the lowest level extraction) are pushed to a face
//  hash (that accepts the three smallest point Ids of a polygon: triangle, 
//  quad, or pentagon) on a per sub-volume or fragment basis. Once the face 
//  hash detects an internal face, an entry is added to an equivalence set 
//  (by means of class vtkEquivalenceSet) to correlate the two fragment Ids 
//  that are attached to the two associated sub-volumes or fragments' polygons. 
//  After resolving the equivalence set, each face that remains in the face 
//  hash (internal faces are masked as invalid) is updated with a resolved 
//  fragment Id. In this way the original complete polygons (triangles, quads, 
//  pentagons) pointed to by the remaining hashed faces with the same resolved
//  fragment Id are retrieved from the input vtkPolyData and hence combined by
//  means of the same fragemnt Id.
// 
// .SECTION See Also
//  vtkGridConnectivity vtkExtractCTHPart vtkPolyData vtkRectilinearGrid
//  vtkMultiBlockDataSetAlgorithm 


#ifndef vtkRectilinearGridConnectivity_h
#define vtkRectilinearGridConnectivity_h

#include "vtkPVVTKExtensionsDefaultModule.h" //needed for exports
#include "vtkMultiBlockDataSetAlgorithm.h"

class vtkPolyData;
class vtkDoubleArray;
class vtkInformation;
class vtkEquivalenceSet;
class vtkRectilinearGrid;
class vtkInformationVector;
class vtkMultiProcessController;
class vtkIncrementalOctreePointLocator;
class vtkRectilinearGridConnectivityFaceHash;
class vtkRectilinearGridConnectivityInternal;


class VTKPVVTKEXTENSIONSDEFAULT_EXPORT vtkRectilinearGridConnectivity : 
          public vtkMultiBlockDataSetAlgorithm
{
public:

  vtkTypeMacro( vtkRectilinearGridConnectivity,
                        vtkMultiBlockDataSetAlgorithm );
  static vtkRectilinearGridConnectivity * New();
  void   PrintSelf( ostream & os, vtkIndent indent );
  
  // Description:
  // Set / get the volume fraction value [0, 1] used for extracting fragments.
  vtkSetClampMacro( VolumeFractionSurfaceValue, double, 0.0, 1.0 );
  vtkGetMacro( VolumeFractionSurfaceValue, double );
  
  // Description:
  // Remove all volume array names.
  void  RemoveAllVolumeArrayNames();
  
  // Description:
  // Remove double-type volume array names.
  void  RemoveDoubleVolumeArrayNames();
    
  // Description: 
  // Remove float-type volume array names.
  void  RemoveFloatVolumeArrayNames();
  
  // Description:
  // Remove unsigned char-type volume array names.
  void  RemoveUnsignedCharVolumeArrayNames();
  
  // Description:
  // Add a double-type volume array name to the selection list.
  void  AddDoubleVolumeArrayName( char * arayName );
  
  // Description:
  // Add a float-type volume array name to the selection list.
  void  AddFloatVolumeArrayName( char * arayName );
  
  // Description:
  // Add an unsigned char-type volume array name to the selection list.
  void  AddUnsignedCharVolumeArrayName( char * arayName );
  
  // Description:
  // Add a volume array (of any type) name to the selection list.
  void  AddVolumeArrayName( char * arayName ); 
  
protected:

  vtkRectilinearGridConnectivity();
  ~vtkRectilinearGridConnectivity();
  
  int                         DualGridsReady;
  int                         NumberOfBlocks;
  double                      DataBlocksTime;
  double                      DualGridBounds[6];
  double                      VolumeFractionSurfaceValue;
  vtkDoubleArray            * FragmentValues;
  vtkEquivalenceSet         * EquivalenceSet;
  vtkRectilinearGrid       ** DualGridBlocks;
  vtkMultiProcessController * Controller;
  vtkRectilinearGridConnectivityFaceHash * FaceHash;
  vtkRectilinearGridConnectivityInternal * Internal;
  
  
  virtual vtkExecutive   * CreateDefaultExecutive();
  virtual int FillInputPortInformation( int, vtkInformation * );
  virtual int RequestData( vtkInformation        * request,
                           vtkInformationVector ** inputVector,
                           vtkInformationVector  * outputVector );
  
  
  // ---------------------------------------------------------------------- //
  // --------------------------- Volume  arrays --------------------------- //
  // ---------------------------------------------------------------------- //
  
  
  // Description:
  // Get the number of selected volume fraction arrays.
  int   GetNumberOfVolumeFractionArrays();
  
  // Description:
  // Get the number of all volume arrays (not necessarily selected as the
  // ones for extracting fragemnts).
  int   GetNumberOfVolumeArrays();
  
  // Description:
  // Get the name of a selected volume fraction array specified by arrayIdx.
  const char* GetVolumeFractionArrayName( int arrayIdx );
  
  // Description:
  // This function determines whether the specified name (arayName) refers to 
  // a selected volume fraction array (1) or not (0).
  bool  IsVolumeFractionArray( const char * arayName );
  
  // Description:
  // This function determines whether the specified name (arayName) refers to
  // a volume array (1) or not (0). Note the array is not necessarily a 
  // selected one used for extracting fragments.
  bool  IsVolumeArray( const char * arayName );
  
  // Description:
  // This function checks the consistency between a number (numGrids) of 
  // vtkRectilinearGrid blocks (recGrids, the original ones still with cell 
  // data attributes) in terms of the number of data attributes and specific 
  // data attribute array names. It also checks the consistency of multiple 
  // (unless one) volume fraction arrays in the data type. This function 
  // returns 1 for consistency and 0 for inconsistency.
  int   CheckVolumeDataArrays( vtkRectilinearGrid ** recGrids, int numGrids );
       
                           
  // ---------------------------------------------------------------------- //
  // ----------- Dual grids generation and fragments extraction ----------- //
  // ---------------------------------------------------------------------- //
  
  
  // Description:
  // Given an input vtkRectilinearGrid dataset (rectGrid) with cell data 
  // attributes, this function creates a dual vtkRectilinearGrid dataset with
  // point data attributes.
  void CreateDualRectilinearGrid
       ( vtkRectilinearGrid * rectGrid, vtkRectilinearGrid * dualGrid );
          
  // Description:
  // Given numBlcks vtkRectilinearGrid blocks with point data attributes 
  // (i.e.,the dual grid version of the original blocks with cell data 
  // attributes), the bounding box (boundBox) covering these blocks, and
  // a selected volume fraction array specified by the material index 
  // (partIndx), this function extracts fragments based on this volume 
  // fraction array and exports the result to a vtkPolyData (polyData).
  void ExtractFragments( vtkRectilinearGrid ** dualGrds, int numBlcks, 
       double boundBox[6], unsigned char partIndx, vtkPolyData * polyData );
       
       
  // ---------------------------------------------------------------------- //
  // ------------- Common functions  for fragments extraction ------------- //
  // ---------------------------------------------------------------------- //
       
       
  // Description:
  // Given the raw fragment index (fragIndx) of either an original sub-volume 
  // extracted from marching cubes of a block or a macro-volume (combination 
  // of intra-process inter-block sub-volumes), the number (numComps) of all 
  // integrated components (of multiple cell data attributes), and the array 
  // (attrVals) storing the specific integrated values, this function 
  // integrates the attributes based on the fragment index, specifically by 
  // accumulating the input integration values to the target entry (specified 
  // by the fragment index) of a global integration array. In this way, 
  // different sub-volumes or macro-volumes belonging to the same fragment 
  // have their integrated results summed together.
  void IntegrateFragmentAttributes
       ( int fragIndx, int numComps, double * attrVals );
  
  // Description:
  // This function resolves the equivalence set (intra-process intra-block,
  // intra-process inter-block, or inter-process), followed by the face 
  // fragment Ids and integrated fragment attributes.
  void ResolveEquivalentFragments();
  
  // Description:
  // With the equivalence set (intra-process intra-block, intra-process inter-
  // block, or inter-process) resolved in advance, this function updates each 
  // face / polygon stored in the face hash with a resolved fragment Id. In
  // this way, polygons of multiple sub-volumes or macro-volumes that have
  // different (old) fragment Ids are automatically grouped into a single 
  // entity (macro-volume or fragment, respectively) by being assigned with the
  // same (new) fragment Id.
  void ResolveFaceFragmentIds();
  
  // Description:
  // With the equivalence set (intra-process intra-block, intra-process inter-
  // block, or inter-process) resolved in advance, this function integrates
  // cell data attributes based on the fragment Id. Specifically, multiple
  // entries (of the old array of integrated attributes) with the same fragment
  // Id have their integration results summed together and are then combined
  // into a single entry (of the new shortened array of integrated attributes).
  void ResolveIntegratedFragmentAttributes();
       
  
  // ---------------------------------------------------------------------- //
  // ----------- Intra-process intra-block fragments extraction ----------- //
  // ---------------------------------------------------------------------- //
  
  
  // Descrption:
  // Give a vtkRectilinearGrid data block (rectGrid, the dual version of an 
  // original input block) with point data attributes (including some volume 
  // fraction arrays and others like pressure, density, or velocity vector), 
  // the name of a selected volume fraction array (fracName, through which to 
  // extract fragments), and a specified volume fraction iso-value (isoValue), 
  // this function performs the marching-cubes algorithm based on the volume 
  // fraction array and the iso-value to produce greater-than-isovalue sub-
  // volumes (or polyhedra) by employing an extended 256-entry lookup table. 
  // These resulting polyhedra are stored in the output vtkPolyData (plyHedra).
  // All point data attribues except for non-selected volume fraction arrays 
  // are integrated when marching cubes. The integrated attribute arrays are 
  // attached to the polyhedra's faces as the cell data.
  void ExtractFragmentPolyhedra( vtkRectilinearGrid * rectGrid, 
       const char * fracName, double isoValue, vtkPolyData * plyHedra );
       
  // Description:
  // Given a vtkPolyData (plyHedra) storing the polygons of the greater-than-
  // isovalue sub-volumes (or polyhedra) extracted from a data block, this 
  // function initializes the size of the face hash (with the number of points
  // of the polyhedra) used to maintain the polygons of the polyhedra.
  void InitializeFaceHash( vtkPolyData * plyHedra );
  
  // Description:
  // Given a data block index (blockIdx) and a vtkPolyData (plyHedra) storing
  // the polygons of the greater-than-isovalue sub-volumes (or polyhedra) that
  // are extracted from the block, this function pushes the polygons on a per 
  // sub-volume basis to the face hash (the sub-volume Ids are used to group 
  // polygons into sub-volumes). For each internal polygon / face shared by 
  // two sub-volumes, an entry is added to the (intra-process intra-block) 
  // equivalence set to associate the fragment Ids assigned to the two sub-
  // volumes' polygons. 
  void AddPolygonsToFaceHash( int blockIdx, vtkPolyData * plyHedra );
  
  // Description:
  // Given the index of the data block (blockIdx), the vtkPolyData (plyHedra)
  // storing the polygons / faces of the greater-than-isovalue sub-volumes 
  // (or polyhedra) extracted from this block via marching cubes, and a global
  // (intra-process inter-block) point locator, the function extracts fragments
  // from this block by initializing the face hash with the raw polygons 
  // extracted from the block (via marching cubes), pushing these polygons to 
  // the face hash on a per sub-volume basis, detecting internal faces or 
  // polygons, registering faces to the intra-process intra-block equivalence 
  // set by the intermediate fragment Id, resolving the equivalence set, 
  // updating the fragment Id of each polygon, and integrating cell data 
  // attributes based on the fragment Id, grouping / re-arranging the 'valid'
  // faces (as opposed to those removed internal faces) in the face hash by the
  // fragment Id (to construct macro-volumes), accessing the full version of 
  // each valid face from the original polyhedra, and attaching the fragment Id
  // as well as other integrated cell data attributes to each cell in the output
  // vtkPolyData data (polygons) where each point is assigned with a global 
  // (intra-process inter-block) Id (via a global point locator gPtIdGen) used
  // for subsequent combination of fragments extracted from multiple blocks. 
  // Argument maxFSize returns the maximum number of faces a macro-volume 
  // (combination of sub-volumes) may contain in a block.
  void ExtractFragmentPolygons( int blockIdx, int & maxFsize, 
       vtkPolyData * plyHedra, vtkPolyData * polygons, 
       vtkIncrementalOctreePointLocator * gPtIdGen );
  
  
  // ---------------------------------------------------------------------- //
  // ----------- Intra-process inter-block fragments extraction ----------- //
  // ---------------------------------------------------------------------- //
  
 
  // Description:
  // Given a number (numPolys) of vtkPolyData objects (plyDatas) storing the
  // fragments extracted from the multiple data blocks, this function inits
  // the face hash (with the maximum global inter-block point Id: a point data
  // attribute attached to each point of these vtkPolyData objects) that is 
  // used to combine these intermediate fragments.
  void InitializeFaceHash( vtkPolyData ** plyDatas, int numPolys );
  
  // Description:
  // Given a number (numPolys) of vtkPolyData objects (plyDatas) storing the 
  // initial fragments (macro-volumes --- combination of greater-than-isovalue
  // sub-volumes) extracted from multiple blocks and an array of values 
  // (maxFsize) storing the maximum number of faces that a macro-volume may 
  // contain in each block (used to allocate appropriate memory for buffering 
  // the polygons of a macro-volume), this function pushes these polygons on a
  // per macro-volume basis to the face hash (fragment Ids are used to group 
  // polygons to macro-volumes), detects internal faces / polygons, and then
  // registers polygons to the (intra-process inter-block) equivalence set by
  // the intermediate fragment Id. For each internal polygon / face shared by
  // two macro-volumes, an entry is added to the equivalence set to associate 
  // the fragment Ids assigned to the two macro-volumes' polygons. 
  void AddPolygonsToFaceHash
       ( vtkPolyData ** plyDatas, int * maxFsize, int numPolys );
       
  // Description:
  // With the intra-process inter-block equivalence set resolved, intra-process
  // inter-block fragment Ids resolved, and cell data attributes integrated by 
  // the fragment Id, this function retrieves the face hash for the 'valid' 
  // faces (as opposed to those removed internal faces), accesses their full 
  // version from the vtkPolyData objects ('surfaces') that store the polygons
  // of intermediate fragments extracted from multiple ('numSurfs') data blocks,
  // and exports these complete yet 'valid' polygons to the output vtkPolyData
  // ('polyData') while attaching the index of the material (partIndx, i.e. the
  // volume fraction array used to extract fragments) to each polygon as a cell
  // data attribute. In a word, this function exports a combined version of the
  // fragements extracted from multiple blocks assigned to a single process.
  void GenerateOutputFromSingleProcess( vtkPolyData ** surfaces, int numSurfs, 
       unsigned char partIndx, vtkPolyData * polyData );
  
  
  // ---------------------------------------------------------------------- //
  // ----------------- Inter-process fragments extraction ----------------- //
  // ---------------------------------------------------------------------- //
  
  
  // Description:
  // Given the vtkPolyData (fragPoly) storing the fragments extracted from a
  // single process (assigned with either one block or multiple blocks), this
  // function groups / re-arranges the polygons by the (intra-process inter-
  // block) fragment Id, determines the maximum number (maxFsize) of polygons
  // (belonging to a fragment) with the same fragment Id, and exports the re-
  // arranged polygons with the associated fragment Ids and all integrated cell
  // data attributes to the output inter-process vtkPolyData (procPoly) where 
  // each point is assigned with a global inter-process point Id (through a 
  // global point locator 'gPtIdGen') as the point data attribute used later 
  // for combining the fragments across multiple processes.
  void CreateInterProcessPolygons
       ( vtkPolyData * fragPoly, vtkPolyData * procPoly, 
         vtkIncrementalOctreePointLocator * gPtIdGen, int & maxFsize );
       
  // Description:
  // Given a number (numProcs) of vtkPolyData objects (procPlys) storing the 
  // (initial) fragments extracted from multiple processes and an array of 
  // values (maxFsize) storing the maximum number of faces that an initial 
  // fragment may contain on each process (used to allocate appropriate memory
  // for buffering the polygons of an intial fragment), this function pushes 
  // these polygons to the face hash on a per fragment basis (the fragment Ids
  // are used to group polygons into initial fragments), detects internal faces
  // / polygons, and registers polygons to the inter-process equivalence set by
  // the intermediate fragment Id. For each internal polygon / face shared by 
  // two initial fragments, an entry is added to the equivalence set in a way to
  // associate the fragment Ids assigned to the two initial fragments' polygons. 
  // Note each face in the face hash is assigned with a process Id that is used
  // later to retrieve the source vtkPolyData for the target complete polygon 
  // if the face remains in the face hash after removing internal faces.
  void AddInterProcessPolygonsToFaceHash
       ( vtkPolyData ** procPlys, int * maxFsize, int numProcs );
       
  // Description:
  // With the inter-process equivalence set resolved, inter-process fragment 
  // Ids resolved, and cell data attributes integrated by the fragment Id, this
  // function retrieves the face hash for the 'valid' faces (as opposed to the
  // removed internal faces), accesses their complete version (according to the
  // information stored in the face) from the vtkPolyData objects (procPlys) 
  // that store the polygons of the fragments extracted from multiple (numProcs)
  // processes, and exports these complete 'valid' polygons to the output 
  // vtkPolyData (polyData) while attaching the index of the material (partIndx, 
  // corresponding to the volume fraction array used to extract the fragments) 
  // to each polygon as a cell data attribute. In a word, this function exports
  // a combined version of the fragements extracted from multiple processes (of
  // which each is assigned with either one block or multiple blocks).
  void GenerateOutputFromMultiProcesses( vtkPolyData ** procPlys, 
       int numProcs, unsigned char partIndx, vtkPolyData * polyData );
  
  
private:
  vtkRectilinearGridConnectivity
                  ( const vtkRectilinearGridConnectivity & );  // Not implemented.
  void operator = ( const vtkRectilinearGridConnectivity & );  // Not implemented.
};

#endif