VTK  9.7.20260805
vtkStreamTracer.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2// SPDX-License-Identifier: BSD-3-Clause
81
82#ifndef vtkStreamTracer_h
83#define vtkStreamTracer_h
84
85#include "vtkDeprecation.h" // VTK_DEPRECATED_IN_9_7_0
86#include "vtkFiltersFlowPathsModule.h" // For export macro
88
89#include "vtkDataSetAttributesFieldList.h" // Needed to identify common data arrays
90#include "vtkInitialValueProblemSolver.h" // Needed for constants
91
92VTK_ABI_NAMESPACE_BEGIN
96class vtkDataArray;
98class vtkDoubleArray;
99class vtkExecutive;
100class vtkGenericCell;
101class vtkIdList;
102class vtkIntArray;
103class vtkPoints;
104
105VTK_ABI_NAMESPACE_END
106#include <vector> // for std::vector
107
108// Helper struct to convert between different length scales.
109VTK_ABI_NAMESPACE_BEGIN
110struct VTKFILTERSFLOWPATHS_EXPORT vtkIntervalInformation
111{
112 double Interval;
113 int Unit;
114
115 static double ConvertToLength(double interval, int unit, double cellLength);
116 static double ConvertToLength(vtkIntervalInformation& interval, double cellLength);
117};
118
130 void* clientdata, vtkPoints* points, vtkDataArray* velocity, int integrationDirection);
131
132class VTKFILTERSFLOWPATHS_EXPORT vtkStreamTracer : public vtkPolyDataAlgorithm
133{
134public:
143
145
149 void PrintSelf(ostream& os, vtkIndent indent) override;
151
153
158 vtkSetVector3Macro(StartPosition, double);
159 vtkGetVector3Macro(StartPosition, double);
161
163
172
179
180 // The previously-supported TIME_UNIT is excluded in this current
181 // enumeration definition because the underlying step size is ALWAYS in
182 // arc length unit (LENGTH_UNIT) while the 'real' time interval (virtual
183 // for steady flows) that a particle actually takes to trave in a single
184 // step is obtained by dividing the arc length by the LOCAL speed. The
185 // overall elapsed time (i.e., the life span) of the particle is the sum
186 // of those individual step-wise time intervals. The arc-length-to-time
187 // conversion only occurs for vorticity computation and for generating a
188 // point data array named 'IntegrationTime'.
189 enum Units
190 {
193 };
194
203
214
216
228 void SetIntegratorType(int type);
234
244 VTK_DEPRECATED_IN_9_7_0("Use SetCellLocatorToJumpAndWalkCellLocator() instead")
246
253 VTK_DEPRECATED_IN_9_7_0("Use SetCellLocatorToStaticCellLocator() instead")
255
257
260 vtkSetMacro(MaximumPropagation, double);
261 vtkGetMacro(MaximumPropagation, double);
263
272
274
281 vtkSetMacro(InitialIntegrationStep, double);
282 vtkGetMacro(InitialIntegrationStep, double);
284
286
292 vtkSetMacro(MinimumIntegrationStep, double);
293 vtkGetMacro(MinimumIntegrationStep, double);
295
297
303 vtkSetMacro(MaximumIntegrationStep, double);
304 vtkGetMacro(MaximumIntegrationStep, double);
306
308
311 vtkSetMacro(MaximumError, double);
312 vtkGetMacro(MaximumError, double);
314
316
327
329
333 vtkSetMacro(TerminalSpeed, double);
334 vtkGetMacro(TerminalSpeed, double);
336
338
342 vtkGetMacro(SurfaceStreamlines, bool);
343 vtkSetMacro(SurfaceStreamlines, bool);
344 vtkBooleanMacro(SurfaceStreamlines, bool);
346
347 enum
348 {
352 };
353
354 enum
355 {
357 "Use SetCellLocatorToJumpAndWalkCellLocator() instead"),
359 "Use SetCellLocatorToStaticCellLocator() instead")
360 };
361
363
370 vtkSetClampMacro(IntegrationDirection, int, FORWARD, BOTH);
371 vtkGetMacro(IntegrationDirection, int);
376
378
383 vtkSetMacro(ComputeVorticity, bool);
384 vtkGetMacro(ComputeVorticity, bool);
386
388
392 vtkSetMacro(RotationScale, double);
393 vtkGetMacro(RotationScale, double);
395
405 VTK_DEPRECATED_IN_9_7_0("Use SetCellLocator(vtkAbstractCellLocator*) instead")
407
417 VTK_DEPRECATED_IN_9_7_0("Use SetCellLocator(vtkAbstractCellLocator*) instead")
418 void SetInterpolatorType(int interpType);
419
421
431
433
437 vtkGetMacro(ForceSerialExecution, bool);
438 vtkSetMacro(ForceSerialExecution, bool);
439 vtkBooleanMacro(ForceSerialExecution, bool);
441
451 CustomTerminationCallbackType callback, void* clientdata, int reasonForTermination);
452
456
462 double& step, double& minStep, double& maxStep, int direction, double cellLength);
463
465
469 void GenerateNormals(vtkPolyData* output, double* firstNormal, const char* vecName);
471 vtkGenericCell* cell, double pcoords[3], vtkDoubleArray* cellVectors, double vorticity[3]);
473
475
485 vtkSetMacro(UseLocalSeedSource, bool);
486 vtkGetMacro(UseLocalSeedSource, bool);
487 vtkBooleanMacro(UseLocalSeedSource, bool);
489
490protected:
492 ~vtkStreamTracer() override;
493
494 // Create a default executive.
496
497 // hide the superclass' AddInput() from the user and the compiler
499 {
500 vtkErrorMacro(<< "AddInput() must be called with a vtkDataSet not a vtkDataObject.");
501 }
502
505
506 void Integrate(vtkPointData* inputData, vtkPolyData* output, vtkDataArray* seedSource,
507 vtkIdList* seedIds, vtkIntArray* integrationDirections,
508 vtkAbstractInterpolatedVelocityField* func, int maxCellSize, int vecType,
509 const char* vecFieldName, double& propagation, vtkIdType& numSteps, double& integrationTime,
510 std::vector<CustomTerminationCallbackType>& customTerminationCallback,
511 std::vector<void*>& customTerminationClientData, std::vector<int>& customReasonForTermination);
512
513 double SimpleIntegrate(double seed[3], double lastPoint[3], double stepSize,
516
518
519 // starting from global x-y-z position
520 double StartPosition[3];
521
522 static const double EPSILON;
524
525 // Used by subclasses, leave alone
527
532
534 void InitializeSeeds(vtkDataArray*& seeds, vtkIdList*& seedIds,
535 vtkIntArray*& integrationDirections, vtkDataSet* source);
536
539
540 // Prototype showing the integrator type to be set by the user.
542
545
548
549 // Compute streamlines only on surface.
551
553
554 // These are used to manage complex input types such as
555 // multiblock / composite datasets. Basically the filter input is
556 // converted to a composite dataset, and the point data attributes
557 // are intersected to produce a common set of output data arrays.
558 vtkCompositeDataSet* InputData; // convert input data to composite dataset
559 vtkDataSetAttributesFieldList InputPD; // intersect attributes of all datasets
560 bool
561 HasMatchingPointAttributes; // does the point data in the multiblocks have the same attributes?
562
563 // Control execution as serial or threaded
565 bool SerialExecution; // internal use to combine information
566
567 std::vector<CustomTerminationCallbackType> CustomTerminationCallback;
568 std::vector<void*> CustomTerminationClientData;
570
571 // Only relevant for this derived parallel version of vtkStreamTracer,
572 // but needs to be defined in this class to have a uniform interface
573 // between this class and the parallel override vtkPStreamTracer
575
576 friend class PStreamTracerUtils;
577
578private:
579 vtkStreamTracer(const vtkStreamTracer&) = delete;
580 void operator=(const vtkStreamTracer&) = delete;
581};
582
583VTK_ABI_NAMESPACE_END
584#endif
an abstract base class for locators which find cells
An abstract class for obtaining the interpolated velocity values at a point.
Proxy object to connect input/output ports.
abstract superclass for composite (multi-block or AMR) datasets
general representation of visualization data
helps manage arrays from multiple vtkDataSetAttributes.
represent and manipulate attribute data in a dataset
abstract class to specify dataset behavior
Definition vtkDataSet.h:56
dynamic, self-adjusting array of double
Superclass for all pipeline executives in VTK.
provides thread-safe access to cells
list of point or cell ids
Definition vtkIdList.h:26
a simple class to control print indentation
Definition vtkIndent.h:29
Store zero or more vtkInformation instances.
Store vtkAlgorithm input/output information.
Integrate a set of ordinary differential equations (initial value problem) in time.
dynamic, self-adjusting array of int
Definition vtkIntArray.h:36
represent and manipulate point attribute data
represent and manipulate 3D points
Definition vtkPoints.h:31
concrete dataset represents vertices, lines, polygons, and triangle strips
Definition vtkPolyData.h:72
void SetIntegratorTypeToRungeKutta45()
Set/get the integrator type to be used for streamline generation.
double StartPosition[3]
int FillInputPortInformation(int, vtkInformation *) override
Fill the input port information objects for this algorithm.
int SetupOutput(vtkInformation *inInfo, vtkInformation *outInfo)
std::vector< void * > CustomTerminationClientData
friend class PStreamTracerUtils
virtual void SetCellLocator(vtkAbstractCellLocator *)
Set / get the cell locator used to perform the FindCell() operation for vtkPointSet.
vtkDataSetAttributesFieldList InputPD
void SetSourceData(vtkDataSet *source)
Specify the source object used to generate starting points (seeds).
vtkDataSet * GetSource()
Specify the source object used to generate starting points (seeds).
double InitialIntegrationStep
virtual void SetCellLocatorToStaticCellLocator()
Set / get the cell locator used to perform the FindCell() operation for vtkPointSet.
void SetInterpolatorTypeToCellLocator()
Set the velocity field interpolator type to one that uses a cell locator to perform spatial searching...
void PrintSelf(ostream &os, vtkIndent indent) override
Standard methods to obtain type information and print object state.
void CalculateVorticity(vtkGenericCell *cell, double pcoords[3], vtkDoubleArray *cellVectors, double vorticity[3])
Helper methods to generate normals on streamlines.
double MinimumIntegrationStep
void SetIntegratorTypeToRungeKutta4()
Set/get the integrator type to be used for streamline generation.
void SetIntegrator(vtkInitialValueProblemSolver *)
Set/get the integrator type to be used for streamline generation.
void SetSourceConnection(vtkAlgorithmOutput *algOutput)
Specify the source object used to generate starting points (seeds).
std::vector< int > CustomReasonForTermination
int CheckInputs(vtkAbstractInterpolatedVelocityField *&func, int *maxCellSize)
@ INTERPOLATOR_WITH_DATASET_POINT_LOCATOR
virtual void SetCellLocatorToJumpAndWalkCellLocator()
Set / get the cell locator used to perform the FindCell() operation for vtkPointSet.
void ConvertIntervals(double &step, double &minStep, double &maxStep, int direction, double cellLength)
The following methods should not be called by the user.
void GenerateNormals(vtkPolyData *output, double *firstNormal, const char *vecName)
Helper methods to generate normals on streamlines.
vtkAbstractCellLocator * CellLocator
virtual void SetIntegrationDirection(int)
Specify whether the streamline is integrated in the upstream or downstream direction,...
static const double EPSILON
vtkIdType MaximumNumberOfSteps
void SetIntegrationDirectionToForward()
Specify whether the streamline is integrated in the upstream or downstream direction,...
std::vector< CustomTerminationCallbackType > CustomTerminationCallback
static vtkStreamTracer * New()
Construct the object to start from position (0,0,0), with forward integration, terminal speed 1....
vtkCompositeDataSet * InputData
void SetInterpolatorType(int interpType)
Set the type of the velocity field interpolator to determine whether INTERPOLATOR_WITH_DATASET_POINT_...
double MaximumIntegrationStep
int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *) override
This is called by the superclass.
vtkExecutive * CreateDefaultExecutive() override
Create a default executive.
void Integrate(vtkPointData *inputData, vtkPolyData *output, vtkDataArray *seedSource, vtkIdList *seedIds, vtkIntArray *integrationDirections, vtkAbstractInterpolatedVelocityField *func, int maxCellSize, int vecType, const char *vecFieldName, double &propagation, vtkIdType &numSteps, double &integrationTime, std::vector< CustomTerminationCallbackType > &customTerminationCallback, std::vector< void * > &customTerminationClientData, std::vector< int > &customReasonForTermination)
void SetIntegrationDirectionToBackward()
Specify whether the streamline is integrated in the upstream or downstream direction,...
void SetInterpolatorTypeToDataSetPointLocator()
Set the velocity field interpolator type to one that uses a point locator to perform local spatial se...
int GetIntegratorType()
Set/get the integrator type to be used for streamline generation.
void AddCustomTerminationCallback(CustomTerminationCallbackType callback, void *clientdata, int reasonForTermination)
Adds a custom termination callback.
void InitializeSeeds(vtkDataArray *&seeds, vtkIdList *&seedIds, vtkIntArray *&integrationDirections, vtkDataSet *source)
void SetIntegratorTypeToRungeKutta2()
Set/get the integrator type to be used for streamline generation.
void SetIntegrationDirectionToBoth()
Specify whether the streamline is integrated in the upstream or downstream direction,...
double SimpleIntegrate(double seed[3], double lastPoint[3], double stepSize, vtkAbstractInterpolatedVelocityField *func)
void AddInput(vtkDataObject *)
vtkInitialValueProblemSolver * Integrator
void SetInterpolatorPrototype(vtkAbstractInterpolatedVelocityField *ivf)
The object used to interpolate the velocity field during integration is of the same class as this pro...
void SetIntegrationStepUnit(int unit)
Specify a uniform integration step unit for MinimumIntegrationStep, InitialIntegrationStep,...
void SetIntegratorType(int type)
Set/get the integrator type to be used for streamline generation.
static double ConvertToLength(double interval, int unit, double cellLength)
static double ConvertToLength(vtkIntervalInformation &interval, double cellLength)
boost::graph_traits< vtkGraph * >::vertex_descriptor source(boost::graph_traits< vtkGraph * >::edge_descriptor e, vtkGraph *)
#define vtkDataArray
#define VTK_DEPRECATED_IN_9_7_0(reason)
bool(* CustomTerminationCallbackType)(void *clientdata, vtkPoints *points, vtkDataArray *velocity, int integrationDirection)
Used to specify custom conditions which are evaluated to determine whether a streamline should be ter...
int vtkIdType
Definition vtkType.h:363