VTK  9.5.20251126
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
190
191#ifndef vtkStreamTracer_h
192#define vtkStreamTracer_h
193
194#include "vtkFiltersFlowPathsModule.h" // For export macro
195#include "vtkPolyDataAlgorithm.h"
196
197#include "vtkDataSetAttributesFieldList.h" // Needed to identify common data arrays
198#include "vtkInitialValueProblemSolver.h" // Needed for constants
199
200VTK_ABI_NAMESPACE_BEGIN
203class vtkDataArray;
205class vtkDoubleArray;
206class vtkExecutive;
207class vtkGenericCell;
208class vtkIdList;
209class vtkIntArray;
210class vtkPoints;
211
212VTK_ABI_NAMESPACE_END
213#include <vector> // for std::vector
214
215// Helper struct to convert between different length scales.
216VTK_ABI_NAMESPACE_BEGIN
217struct VTKFILTERSFLOWPATHS_EXPORT vtkIntervalInformation
218{
219 double Interval;
220 int Unit;
221
222 static double ConvertToLength(double interval, int unit, double cellLength);
223 static double ConvertToLength(vtkIntervalInformation& interval, double cellLength);
224};
225
237 void* clientdata, vtkPoints* points, vtkDataArray* velocity, int integrationDirection);
238
239class VTKFILTERSFLOWPATHS_EXPORT vtkStreamTracer : public vtkPolyDataAlgorithm
240{
241public:
250
252
256 void PrintSelf(ostream& os, vtkIndent indent) override;
258
260
265 vtkSetVector3Macro(StartPosition, double);
266 vtkGetVector3Macro(StartPosition, double);
268
270
279
286
287 // The previously-supported TIME_UNIT is excluded in this current
288 // enumeration definition because the underlying step size is ALWAYS in
289 // arc length unit (LENGTH_UNIT) while the 'real' time interval (virtual
290 // for steady flows) that a particle actually takes to trave in a single
291 // step is obtained by dividing the arc length by the LOCAL speed. The
292 // overall elapsed time (i.e., the life span) of the particle is the sum
293 // of those individual step-wise time intervals. The arc-length-to-time
294 // conversion only occurs for vorticity computation and for generating a
295 // point data array named 'IntegrationTime'.
296 enum Units
297 {
300 };
301
310
321
323
335 void SetIntegratorType(int type);
341
352
360
362
365 vtkSetMacro(MaximumPropagation, double);
366 vtkGetMacro(MaximumPropagation, double);
368
377
379
386 vtkSetMacro(InitialIntegrationStep, double);
387 vtkGetMacro(InitialIntegrationStep, double);
389
391
397 vtkSetMacro(MinimumIntegrationStep, double);
398 vtkGetMacro(MinimumIntegrationStep, double);
400
402
408 vtkSetMacro(MaximumIntegrationStep, double);
409 vtkGetMacro(MaximumIntegrationStep, double);
411
413
416 vtkSetMacro(MaximumError, double);
417 vtkGetMacro(MaximumError, double);
419
421
432
434
438 vtkSetMacro(TerminalSpeed, double);
439 vtkGetMacro(TerminalSpeed, double);
441
443
447 vtkGetMacro(SurfaceStreamlines, bool);
448 vtkSetMacro(SurfaceStreamlines, bool);
449 vtkBooleanMacro(SurfaceStreamlines, bool);
451
452 enum
453 {
457 };
458
459 enum
460 {
463 };
464
466
473 vtkSetClampMacro(IntegrationDirection, int, FORWARD, BOTH);
474 vtkGetMacro(IntegrationDirection, int);
479
481
486 vtkSetMacro(ComputeVorticity, bool);
487 vtkGetMacro(ComputeVorticity, bool);
489
491
495 vtkSetMacro(RotationScale, double);
496 vtkGetMacro(RotationScale, double);
498
509
519 void SetInterpolatorType(int interpType);
520
522
526 vtkGetMacro(ForceSerialExecution, bool);
527 vtkSetMacro(ForceSerialExecution, bool);
528 vtkBooleanMacro(ForceSerialExecution, bool);
530
540 CustomTerminationCallbackType callback, void* clientdata, int reasonForTermination);
541
545
551 double& step, double& minStep, double& maxStep, int direction, double cellLength);
552
554
558 void GenerateNormals(vtkPolyData* output, double* firstNormal, const char* vecName);
560 vtkGenericCell* cell, double pcoords[3], vtkDoubleArray* cellVectors, double vorticity[3]);
562
564
574 vtkSetMacro(UseLocalSeedSource, bool);
575 vtkGetMacro(UseLocalSeedSource, bool);
576 vtkBooleanMacro(UseLocalSeedSource, bool);
578
579protected:
582
583 // Create a default executive.
585
586 // hide the superclass' AddInput() from the user and the compiler
588 {
589 vtkErrorMacro(<< "AddInput() must be called with a vtkDataSet not a vtkDataObject.");
590 }
591
594
595 void Integrate(vtkPointData* inputData, vtkPolyData* output, vtkDataArray* seedSource,
596 vtkIdList* seedIds, vtkIntArray* integrationDirections,
597 vtkAbstractInterpolatedVelocityField* func, int maxCellSize, int vecType,
598 const char* vecFieldName, double& propagation, vtkIdType& numSteps, double& integrationTime,
599 std::vector<CustomTerminationCallbackType>& customTerminationCallback,
600 std::vector<void*>& customTerminationClientData, std::vector<int>& customReasonForTermination);
601
602 double SimpleIntegrate(double seed[3], double lastPoint[3], double stepSize,
605
607
608 // starting from global x-y-z position
609 double StartPosition[3];
610
611 static const double EPSILON;
613
614 // Used by subclasses, leave alone
616
621
623 void InitializeSeeds(vtkDataArray*& seeds, vtkIdList*& seedIds,
624 vtkIntArray*& integrationDirections, vtkDataSet* source);
625
628
629 // Prototype showing the integrator type to be set by the user.
631
634
637
638 // Compute streamlines only on surface.
640
642
643 // These are used to manage complex input types such as
644 // multiblock / composite datasets. Basically the filter input is
645 // converted to a composite dataset, and the point data attributes
646 // are intersected to produce a common set of output data arrays.
647 vtkCompositeDataSet* InputData; // convert input data to composite dataset
648 vtkDataSetAttributesFieldList InputPD; // intersect attributes of all datasets
649 bool
650 HasMatchingPointAttributes; // does the point data in the multiblocks have the same attributes?
651
652 // Control execution as serial or threaded
654 bool SerialExecution; // internal use to combine information
655
656 std::vector<CustomTerminationCallbackType> CustomTerminationCallback;
657 std::vector<void*> CustomTerminationClientData;
659
660 // Only relevant for this derived parallel version of vtkStreamTracer,
661 // but needs to be defined in this class to have a uniform interface
662 // between this class and the parallel override vtkPStreamTracer
664
665 friend class PStreamTracerUtils;
666
667private:
668 vtkStreamTracer(const vtkStreamTracer&) = delete;
669 void operator=(const vtkStreamTracer&) = delete;
671};
672
673VTK_ABI_NAMESPACE_END
674#endif
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:166
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:133
a simple class to control print indentation
Definition vtkIndent.h:108
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
represent and manipulate point attribute data
represent and manipulate 3D points
Definition vtkPoints.h:139
concrete dataset represents vertices, lines, polygons, and triangle strips
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
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
vtkAbstractInterpolatedVelocityField * InterpolatorPrototype
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
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.
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)
~vtkStreamTracer() override
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
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:367