VTK  9.0.1
vtkTemporalStreamTracer.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkTemporalStreamTracer.h
5 
6  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7  All rights reserved.
8  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
32 #ifndef vtkTemporalStreamTracer_h
33 #define vtkTemporalStreamTracer_h
34 
35 #include "vtkConfigure.h" // For legacy defines
36 #include "vtkSetGet.h" // For legacy macros
37 #ifndef VTK_LEGACY_REMOVE
38 
39 #include "vtkFiltersFlowPathsModule.h" // For export macro
40 #include "vtkSmartPointer.h" // For protected ivars.
41 #include "vtkStreamTracer.h"
42 
43 #include <list> // STL Header
44 #include <vector> // STL Header
45 
47 
49 class vtkDataArray;
50 class vtkDoubleArray;
51 class vtkGenericCell;
52 class vtkIntArray;
54 class vtkPoints;
55 class vtkCellArray;
56 class vtkDoubleArray;
57 class vtkFloatArray;
58 class vtkIntArray;
59 class vtkCharArray;
61 
63 {
64 typedef struct
65 {
66  double x[4];
67 } Position;
68 typedef struct
69 {
70  // These are used during iteration
72  int CachedDataSetId[2];
73  vtkIdType CachedCellId[2];
75  // These are computed scalars we might display
76  int SourceID;
81  // These are useful to track for debugging etc
82  int ErrorCode;
83  float age;
84  // these are needed across time steps to compute vorticity
85  float rotation;
86  float angularVel;
87  float time;
88  float speed;
90 
91 typedef std::vector<ParticleInformation> ParticleVector;
92 typedef ParticleVector::iterator ParticleIterator;
93 typedef std::list<ParticleInformation> ParticleDataList;
94 typedef ParticleDataList::iterator ParticleListIterator;
95 };
96 
97 class VTKFILTERSFLOWPATHS_EXPORT vtkTemporalStreamTracer : public vtkStreamTracer
98 {
99 public:
101  void PrintSelf(ostream& os, vtkIndent indent) override;
102 
106  static vtkTemporalStreamTracer* New();
107 
109 
114  vtkSetMacro(TimeStep, unsigned int);
115  vtkGetMacro(TimeStep, unsigned int);
117 
119 
123  vtkSetMacro(IgnorePipelineTime, vtkTypeBool);
124  vtkGetMacro(IgnorePipelineTime, vtkTypeBool);
125  vtkBooleanMacro(IgnorePipelineTime, vtkTypeBool);
127 
129 
136  vtkSetMacro(TimeStepResolution, double);
137  vtkGetMacro(TimeStepResolution, double);
139 
141 
150  vtkSetMacro(ForceReinjectionEveryNSteps, int);
151  vtkGetMacro(ForceReinjectionEveryNSteps, int);
153 
154  enum Units
155  {
157  TERMINATION_STEP_UNIT
158  };
159 
161 
167  vtkSetMacro(TerminationTime, double);
168  vtkGetMacro(TerminationTime, double);
170 
172 
176  vtkSetMacro(TerminationTimeUnit, int);
177  vtkGetMacro(TerminationTimeUnit, int);
178  void SetTerminationTimeUnitToTimeUnit() { this->SetTerminationTimeUnit(TERMINATION_TIME_UNIT); }
179  void SetTerminationTimeUnitToStepUnit() { this->SetTerminationTimeUnit(TERMINATION_STEP_UNIT); }
181 
183 
191  vtkSetMacro(StaticSeeds, vtkTypeBool);
192  vtkGetMacro(StaticSeeds, vtkTypeBool);
193  vtkBooleanMacro(StaticSeeds, vtkTypeBool);
195 
197 
205  vtkSetMacro(StaticMesh, vtkTypeBool);
206  vtkGetMacro(StaticMesh, vtkTypeBool);
207  vtkBooleanMacro(StaticMesh, vtkTypeBool);
209 
211 
217  virtual void SetParticleWriter(vtkAbstractParticleWriter* pw);
218  vtkGetObjectMacro(ParticleWriter, vtkAbstractParticleWriter);
220 
222 
226  vtkSetStringMacro(ParticleFileName);
227  vtkGetStringMacro(ParticleFileName);
229 
231 
235  vtkSetMacro(EnableParticleWriting, vtkTypeBool);
236  vtkGetMacro(EnableParticleWriting, vtkTypeBool);
237  vtkBooleanMacro(EnableParticleWriting, vtkTypeBool);
239 
241 
244  void AddSourceConnection(vtkAlgorithmOutput* input);
245  void RemoveAllSources();
247 
248 protected:
249  VTK_LEGACY(vtkTemporalStreamTracer());
250  ~vtkTemporalStreamTracer() override;
251 
252  //
253  // Make sure the pipeline knows what type we expect as input
254  //
255  int FillInputPortInformation(int port, vtkInformation* info) override;
256 
257  //
258  // The usual suspects
259  //
261  vtkInformationVector* outputVector) override;
262 
263  //
264  // Store any information we need in the output and fetch what we can
265  // from the input
266  //
267  int RequestInformation(vtkInformation* request, vtkInformationVector** inputVector,
268  vtkInformationVector* outputVector) override;
269 
270  //
271  // Compute input time steps given the output step
272  //
273  int RequestUpdateExtent(vtkInformation* request, vtkInformationVector** inputVector,
274  vtkInformationVector* outputVector) override;
275 
276  //
277  // what the pipeline calls for each time step
278  //
279  int RequestData(vtkInformation* request, vtkInformationVector** inputVector,
280  vtkInformationVector* outputVector) override;
281 
282  //
283  // these routines are internally called to actually generate the output
284  //
285  virtual int ProcessInput(vtkInformationVector** inputVector);
286 
287  virtual int GenerateOutput(
288  vtkInformationVector** inputVector, vtkInformationVector* outputVector);
289 
290  //
291  // Initialization of input (vector-field) geometry
292  //
293  int InitializeInterpolator();
294  int SetTemporalInput(vtkDataObject* td, int index);
295 
296  //
297 
302  void TestParticles(vtkTemporalStreamTracerNamespace::ParticleVector& candidates,
304 
311  virtual void AssignSeedsToProcessors(vtkDataSet* source, int sourceID, int ptId,
312  vtkTemporalStreamTracerNamespace::ParticleVector& LocalSeedPoints, int& LocalAssignedCount);
313 
318  virtual void AssignUniqueIds(vtkTemporalStreamTracerNamespace::ParticleVector& LocalSeedPoints);
319 
324  void UpdateParticleList(vtkTemporalStreamTracerNamespace::ParticleVector& candidates);
325 
330  virtual void TransmitReceiveParticles(
332  vtkTemporalStreamTracerNamespace::ParticleVector& received, bool removeself);
333 
338  double currenttime, double terminationtime, vtkInitialValueProblemSolver* integrator);
339 
346  bool RetryWithPush(
347  vtkTemporalStreamTracerNamespace::ParticleInformation& info, double velocity[3], double delT);
348 
349  // if the particle is added to send list, then returns value is 1,
350  // if it is kept on this process after a retry return value is 0
351  bool SendParticleToAnotherProcess(
352  vtkTemporalStreamTracerNamespace::ParticleInformation& info, double point1[4], double delT);
353 
354  void AddParticleToMPISendList(vtkTemporalStreamTracerNamespace::ParticleInformation& info);
355 
361  bool ComputeDomainExitLocation(
362  double pos[4], double p2[4], double intersection[4], vtkGenericCell* cell);
363 
364  //
365 
366  //
367  // Track internally which round of RequestData it is--between 0 and 2
369 
370  // Track which process we are
373 
374  // Important for Caching of Cells/Ids/Weights etc
378 
379  // Support 'pipeline' time or manual SetTimeStep
380  unsigned int TimeStep;
381  unsigned int ActualTimeStep;
384 
385  std::vector<double> InputTimeValues;
386  std::vector<double> OutputTimeValues;
387 
388  // more time management
389  double EarliestTime;
390  double CurrentTimeSteps[2];
392 
393  // Particle termination after time
396 
397  // Particle injection+Reinjection
402 
403  // Particle writing to disk
407 
408  // The main lists which are held during operation- between time step updates
409  unsigned int NumberOfParticles;
412 
413  //
414  // Scalar arrays that are generated as each particle is updated
415  //
428 
429  // The output geometry
432 
433  // List used for transmitting between processors during parallel operation
435 
436  // The velocity interpolator
438 
439  // The input datasets which are stored by time step 0 and 1
441  vtkSmartPointer<vtkDataSet> DataReferenceT[2];
442 
443  // Cache bounds info for each dataset we will use repeatedly
444  typedef struct
445  {
446  double b[6];
447  } bounds;
448  std::vector<bounds> CachedBounds[2];
449 
450  // utility function we use to test if a point is inside any of our local datasets
451  bool InsideBounds(double point[]);
452 
453  // global Id counter used to give particles a stamp
456  // for debugging only;
457  int substeps;
458 
459 private:
464 
465 private:
467  void operator=(const vtkTemporalStreamTracer&) = delete;
468 };
469 
470 #endif // VTK_LEGACY_REMOVE
471 
472 #endif
vtkPoints
represent and manipulate 3D points
Definition: vtkPoints.h:33
vtkTemporalStreamTracerNamespace::ParticleInformation::SourceID
int SourceID
Definition: vtkTemporalStreamTracer.h:76
vtkTemporalStreamTracer::UpdatePieceId
int UpdatePieceId
Definition: vtkTemporalStreamTracer.h:371
vtkTemporalStreamTracer::ReinjectionFlag
bool ReinjectionFlag
Definition: vtkTemporalStreamTracer.h:399
vtkTemporalStreamTracerNamespace::ParticleInformation::InjectedPointId
int InjectedPointId
Definition: vtkTemporalStreamTracer.h:78
vtkTemporalStreamTracer::OutputPointData
vtkSmartPointer< vtkPointData > OutputPointData
Definition: vtkTemporalStreamTracer.h:426
vtkTemporalStreamTracer::ForceReinjectionEveryNSteps
int ForceReinjectionEveryNSteps
Definition: vtkTemporalStreamTracer.h:398
vtkTemporalStreamTracerNamespace::ParticleInformation::rotation
float rotation
Definition: vtkTemporalStreamTracer.h:85
vtkTemporalStreamTracerNamespace::ParticleInformation::TimeStepAge
int TimeStepAge
Definition: vtkTemporalStreamTracer.h:77
vtkTemporalStreamTracerNamespace::ParticleInformation::CurrentPosition
Position CurrentPosition
Definition: vtkTemporalStreamTracer.h:71
vtkIdType
int vtkIdType
Definition: vtkType.h:338
vtkFloatArray
dynamic, self-adjusting array of float
Definition: vtkFloatArray.h:35
vtkTemporalStreamTracer::ParticleHistories
vtkTemporalStreamTracerNamespace::ParticleDataList ParticleHistories
Definition: vtkTemporalStreamTracer.h:410
vtkTemporalStreamTracerNamespace::ParticleInformation::UniqueParticleId
int UniqueParticleId
Definition: vtkTemporalStreamTracer.h:80
vtkTemporalStreamTracer::InputTimeValues
std::vector< double > InputTimeValues
Definition: vtkTemporalStreamTracer.h:385
vtkTemporalStreamTracer::NumberOfParticles
unsigned int NumberOfParticles
Definition: vtkTemporalStreamTracer.h:409
vtkInformationVector
Store zero or more vtkInformation instances.
Definition: vtkInformationVector.h:35
vtkTemporalStreamTracerNamespace::ParticleInformation::ErrorCode
int ErrorCode
Definition: vtkTemporalStreamTracer.h:82
vtkTemporalStreamTracer::UniqueIdCounterMPI
vtkIdType UniqueIdCounterMPI
Definition: vtkTemporalStreamTracer.h:455
vtkTimeStamp
record modification and/or execution time
Definition: vtkTimeStamp.h:32
vtkTemporalStreamTracer::SetTerminationTimeUnitToStepUnit
void SetTerminationTimeUnitToStepUnit()
Definition: vtkTemporalStreamTracer.h:179
vtkTemporalStreamTracer::StaticSeeds
vtkTypeBool StaticSeeds
Definition: vtkTemporalStreamTracer.h:377
vtkPolyDataAlgorithm::RequestUpdateExtent
virtual int RequestUpdateExtent(vtkInformation *, vtkInformationVector **, vtkInformationVector *)
This is called by the superclass.
vtkTemporalStreamTracer::UniqueIdCounter
vtkIdType UniqueIdCounter
Definition: vtkTemporalStreamTracer.h:454
vtkStreamTracer::RequestData
int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *) override
This is called by the superclass.
vtkStreamTracer.h
vtkTemporalStreamTracer::TERMINATION_TIME_UNIT
@ TERMINATION_TIME_UNIT
Definition: vtkTemporalStreamTracer.h:156
vtkTemporalStreamTracer::TimeStepResolution
double TimeStepResolution
Definition: vtkTemporalStreamTracer.h:391
vtkTemporalStreamTracerNamespace::Position
Definition: vtkTemporalStreamTracer.h:64
vtkSmartPointer< vtkFloatArray >
vtkTemporalStreamTracer::ParticleAge
vtkSmartPointer< vtkFloatArray > ParticleAge
Definition: vtkTemporalStreamTracer.h:416
vtkTemporalStreamTracer
A Parallel Particle tracer for unsteady vector fields.
Definition: vtkTemporalStreamTracer.h:97
vtkTemporalStreamTracer::UpdateNumPieces
int UpdateNumPieces
Definition: vtkTemporalStreamTracer.h:372
vtkDataArray
abstract superclass for arrays of numeric data
Definition: vtkDataArray.h:49
vtkMultiBlockDataSet
Composite dataset that organizes datasets into blocks.
Definition: vtkMultiBlockDataSet.h:45
vtkTemporalStreamTracer::EarliestTime
double EarliestTime
Definition: vtkTemporalStreamTracer.h:389
vtkTemporalStreamTracerNamespace::ParticleInformation::InjectedStepId
int InjectedStepId
Definition: vtkTemporalStreamTracer.h:79
vtkTemporalStreamTracer::Interpolator
vtkSmartPointer< vtkTemporalInterpolatedVelocityField > Interpolator
Definition: vtkTemporalStreamTracer.h:437
vtkTemporalStreamTracer::InjectedStepIds
vtkSmartPointer< vtkIntArray > InjectedStepIds
Definition: vtkTemporalStreamTracer.h:420
vtkStreamTracer::FillInputPortInformation
int FillInputPortInformation(int, vtkInformation *) override
Fill the input port information objects for this algorithm.
vtkStreamTracer::PrintSelf
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
vtkCharArray
dynamic, self-adjusting array of char
Definition: vtkCharArray.h:35
vtkX3D::port
@ port
Definition: vtkX3D.h:453
vtkTemporalStreamTracer::ParticleFileName
char * ParticleFileName
Definition: vtkTemporalStreamTracer.h:405
vtkX3D::point
@ point
Definition: vtkX3D.h:242
vtkPolyDataAlgorithm::ProcessRequest
vtkTypeBool ProcessRequest(vtkInformation *, vtkInformationVector **, vtkInformationVector *) override
see vtkAlgorithm for details
vtkTemporalStreamTracer::TerminationTime
double TerminationTime
Definition: vtkTemporalStreamTracer.h:394
vtkTemporalStreamTracer::ActualTimeStep
unsigned int ActualTimeStep
Definition: vtkTemporalStreamTracer.h:381
vtkTemporalStreamTracer::AllFixedGeometry
int AllFixedGeometry
Definition: vtkTemporalStreamTracer.h:375
vtkTemporalStreamTracer::bounds
Definition: vtkTemporalStreamTracer.h:444
vtkTemporalStreamTracer::ParticleVorticity
vtkSmartPointer< vtkFloatArray > ParticleVorticity
Definition: vtkTemporalStreamTracer.h:422
vtkTemporalStreamTracer::NumberOfInputTimeSteps
unsigned int NumberOfInputTimeSteps
Definition: vtkTemporalStreamTracer.h:383
vtkMultiProcessController
Multiprocessing communication superclass.
Definition: vtkMultiProcessController.h:75
vtkTemporalStreamTracer::ParticleInjectionTime
vtkTimeStamp ParticleInjectionTime
Definition: vtkTemporalStreamTracer.h:401
vtkIndent
a simple class to control print indentation
Definition: vtkIndent.h:33
vtkCellArray
object to represent cell connectivity
Definition: vtkCellArray.h:179
vtkIntArray
dynamic, self-adjusting array of int
Definition: vtkIntArray.h:39
vtkSmartPointer.h
vtkAbstractParticleWriter
abstract class to write particle data to file
Definition: vtkAbstractParticleWriter.h:37
vtkTemporalStreamTracer::IgnorePipelineTime
vtkTypeBool IgnorePipelineTime
Definition: vtkTemporalStreamTracer.h:382
vtkTemporalStreamTracer::MPISendList
vtkTemporalStreamTracerNamespace::ParticleVector MPISendList
Definition: vtkTemporalStreamTracer.h:434
vtkStreamTracer
Streamline generator.
Definition: vtkStreamTracer.h:102
vtkTemporalStreamTracer::InjectedPointIds
vtkSmartPointer< vtkIntArray > InjectedPointIds
Definition: vtkTemporalStreamTracer.h:419
vtkTemporalStreamTracerNamespace::ParticleInformation::angularVel
float angularVel
Definition: vtkTemporalStreamTracer.h:86
vtkTemporalStreamTracerNamespace::ParticleInformation::speed
float speed
Definition: vtkTemporalStreamTracer.h:88
vtkTemporalStreamTracer::TimeStep
unsigned int TimeStep
Definition: vtkTemporalStreamTracer.h:380
vtkTemporalStreamTracer::ParticleWriter
vtkAbstractParticleWriter * ParticleWriter
Definition: vtkTemporalStreamTracer.h:404
vtkTemporalStreamTracer::EnableParticleWriting
vtkTypeBool EnableParticleWriting
Definition: vtkTemporalStreamTracer.h:406
vtkTemporalStreamTracerNamespace::ParticleInformation::age
float age
Definition: vtkTemporalStreamTracer.h:83
vtkDataSet
abstract class to specify dataset behavior
Definition: vtkDataSet.h:56
vtkAbstractInterpolatedVelocityField
An abstract class for obtaining the interpolated velocity values at a point.
Definition: vtkAbstractInterpolatedVelocityField.h:82
vtkTemporalStreamTracer::ParticleIds
vtkSmartPointer< vtkIntArray > ParticleIds
Definition: vtkTemporalStreamTracer.h:417
vtkInformation
Store vtkAlgorithm input/output information.
Definition: vtkInformation.h:73
vtkStreamTracer::Units
Units
Definition: vtkStreamTracer.h:153
vtkTemporalStreamTracer::ParticleCells
vtkSmartPointer< vtkCellArray > ParticleCells
Definition: vtkTemporalStreamTracer.h:430
vtkX3D::info
@ info
Definition: vtkX3D.h:382
vtkTemporalStreamTracerNamespace::ParticleVector
std::vector< ParticleInformation > ParticleVector
Definition: vtkTemporalStreamTracer.h:91
vtkTemporalStreamTracerNamespace
Definition: vtkTemporalStreamTracer.h:62
vtkTemporalStreamTracer::ParticleAngularVel
vtkSmartPointer< vtkFloatArray > ParticleAngularVel
Definition: vtkTemporalStreamTracer.h:424
vtkTemporalStreamTracerNamespace::ParticleListIterator
ParticleDataList::iterator ParticleListIterator
Definition: vtkTemporalStreamTracer.h:94
vtkTemporalStreamTracerNamespace::ParticleInformation
Definition: vtkTemporalStreamTracer.h:68
vtkTemporalStreamTracer::OutputTimeValues
std::vector< double > OutputTimeValues
Definition: vtkTemporalStreamTracer.h:386
vtkAlgorithmOutput
Proxy object to connect input/output ports.
Definition: vtkAlgorithmOutput.h:36
vtkTemporalStreamTracer::OutputCoordinates
vtkSmartPointer< vtkPoints > OutputCoordinates
Definition: vtkTemporalStreamTracer.h:431
vtkTemporalInterpolatedVelocityField
A helper class for interpolating between times during particle tracing.
Definition: vtkTemporalInterpolatedVelocityField.h:69
vtkTemporalStreamTracer::SetTerminationTimeUnitToTimeUnit
void SetTerminationTimeUnitToTimeUnit()
Definition: vtkTemporalStreamTracer.h:178
vtkTemporalStreamTracerNamespace::ParticleDataList
std::list< ParticleInformation > ParticleDataList
Definition: vtkTemporalStreamTracer.h:93
vtkGenericCell
provides thread-safe access to cells
Definition: vtkGenericCell.h:36
vtkTemporalStreamTracer::ReinjectionCounter
int ReinjectionCounter
Definition: vtkTemporalStreamTracer.h:400
vtkDoubleArray
dynamic, self-adjusting array of double
Definition: vtkDoubleArray.h:35
source
boost::graph_traits< vtkGraph * >::vertex_descriptor source(boost::graph_traits< vtkGraph * >::edge_descriptor e, vtkGraph *)
Definition: vtkBoostGraphAdapter.h:959
vtkTemporalStreamTracer::RequestIndex
int RequestIndex
Definition: vtkTemporalStreamTracer.h:368
vtkTemporalStreamTracerNamespace::ParticleInformation::time
float time
Definition: vtkTemporalStreamTracer.h:87
vtkTemporalStreamTracer::ParticleSourceIds
vtkSmartPointer< vtkCharArray > ParticleSourceIds
Definition: vtkTemporalStreamTracer.h:418
vtkTemporalStreamTracer::InterpolationCount
int InterpolationCount
Definition: vtkTemporalStreamTracer.h:427
vtkTemporalStreamTracer::TerminationTimeUnit
int TerminationTimeUnit
Definition: vtkTemporalStreamTracer.h:395
vtkInitialValueProblemSolver
Integrate a set of ordinary differential equations (initial value problem) in time.
Definition: vtkInitialValueProblemSolver.h:40
vtkTemporalStreamTracer::cellVectors
vtkSmartPointer< vtkDoubleArray > cellVectors
Definition: vtkTemporalStreamTracer.h:425
vtkDataObject
general representation of visualization data
Definition: vtkDataObject.h:59
vtkTemporalStreamTracer::substeps
int substeps
Definition: vtkTemporalStreamTracer.h:457
vtkTemporalStreamTracerNamespace::ParticleIterator
ParticleVector::iterator ParticleIterator
Definition: vtkTemporalStreamTracer.h:92
vtkTemporalStreamTracer::LocalSeeds
vtkTemporalStreamTracerNamespace::ParticleVector LocalSeeds
Definition: vtkTemporalStreamTracer.h:411
vtkX3D::index
@ index
Definition: vtkX3D.h:252
vtkTemporalStreamTracer::StaticMesh
vtkTypeBool StaticMesh
Definition: vtkTemporalStreamTracer.h:376
vtkTemporalStreamTracer::ParticleRotation
vtkSmartPointer< vtkFloatArray > ParticleRotation
Definition: vtkTemporalStreamTracer.h:423
vtkStreamTracer::New
static vtkStreamTracer * New()
Construct object to start from position (0,0,0), with forward integration, terminal speed 1....
vtkStreamTracer::SetInterpolatorPrototype
void SetInterpolatorPrototype(vtkAbstractInterpolatedVelocityField *ivf)
The object used to interpolate the velocity field during integration is of the same class as this pro...
vtkTypeBool
int vtkTypeBool
Definition: vtkABI.h:69
vtkPolyDataAlgorithm::RequestInformation
virtual int RequestInformation(vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector)
vtkTemporalStreamTracer::ErrorCodeArray
vtkSmartPointer< vtkIntArray > ErrorCodeArray
Definition: vtkTemporalStreamTracer.h:421
vtkTemporalStreamTracerNamespace::ParticleInformation::LocationState
int LocationState
Definition: vtkTemporalStreamTracer.h:74