VTK
dox/GenericFiltering/vtkGenericStreamTracer.h
Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Visualization Toolkit
00004   Module:    vtkGenericStreamTracer.h
00005 
00006   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
00007   All rights reserved.
00008   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
00009 
00010      This software is distributed WITHOUT ANY WARRANTY; without even
00011      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
00012      PURPOSE.  See the above copyright notice for more information.
00013 
00014 =========================================================================*/
00068 #ifndef __vtkGenericStreamTracer_h
00069 #define __vtkGenericStreamTracer_h
00070 
00071 #include "vtkPolyDataAlgorithm.h"
00072 
00073 #include "vtkInitialValueProblemSolver.h" // Needed for constants
00074 
00075 class vtkDataArray;
00076 class vtkGenericAdaptorCell;
00077 class vtkIdList;
00078 class vtkIntArray;
00079 class vtkGenericInterpolatedVelocityField;
00080 class vtkDataSet;
00081 class vtkGenericAttribute;
00082 class vtkGenericDataSet;
00083 
00084 class VTK_GENERIC_FILTERING_EXPORT vtkGenericStreamTracer : public vtkPolyDataAlgorithm
00085 {
00086 public:
00087   vtkTypeMacro(vtkGenericStreamTracer,vtkPolyDataAlgorithm);
00088   void PrintSelf(ostream& os, vtkIndent indent);
00089 
00094   static vtkGenericStreamTracer *New();
00095   
00097 
00100   vtkSetVector3Macro(StartPosition, double);
00101   vtkGetVector3Macro(StartPosition, double);
00103 
00105 
00106   void SetSource(vtkDataSet *source);
00107   vtkDataSet *GetSource();
00109 
00112   void SetSourceConnection(vtkAlgorithmOutput* algOutput);
00113   
00114   int FillInputPortInformation(int port, vtkInformation* info);
00115   
00116 //BTX
00117   enum Units
00118   {
00119     TIME_UNIT,
00120     LENGTH_UNIT,
00121     CELL_LENGTH_UNIT
00122   };
00123 
00124   enum Solvers
00125   {
00126     RUNGE_KUTTA2,
00127     RUNGE_KUTTA4,
00128     RUNGE_KUTTA45,
00129     NONE,
00130     UNKNOWN
00131   };
00132 
00133   enum ReasonForTermination
00134   {
00135     OUT_OF_DOMAIN = vtkInitialValueProblemSolver::OUT_OF_DOMAIN,
00136     NOT_INITIALIZED = vtkInitialValueProblemSolver::NOT_INITIALIZED ,
00137     UNEXPECTED_VALUE = vtkInitialValueProblemSolver::UNEXPECTED_VALUE,
00138     OUT_OF_TIME = 4,
00139     OUT_OF_STEPS = 5,
00140     STAGNATION = 6
00141   };
00142 //ETX
00143 
00145 
00151   void SetIntegrator(vtkInitialValueProblemSolver *);
00152   vtkGetObjectMacro ( Integrator, vtkInitialValueProblemSolver );
00153   void SetIntegratorType(int type);
00154   int GetIntegratorType();
00155   void SetIntegratorTypeToRungeKutta2()
00156     {this->SetIntegratorType(RUNGE_KUTTA2);};
00157   void SetIntegratorTypeToRungeKutta4()
00158     {this->SetIntegratorType(RUNGE_KUTTA4);};
00159   void SetIntegratorTypeToRungeKutta45()
00160     {this->SetIntegratorType(RUNGE_KUTTA45);};
00162 
00164 
00166   void SetMaximumPropagation(int unit, double max);
00167   void SetMaximumPropagation(double max);
00168   void SetMaximumPropagationUnit(int unit);
00169   int GetMaximumPropagationUnit();
00170   double GetMaximumPropagation();
00171   void SetMaximumPropagationUnitToTimeUnit()
00172     {this->SetMaximumPropagationUnit(TIME_UNIT);};
00173   void SetMaximumPropagationUnitToLengthUnit()
00174     {this->SetMaximumPropagationUnit(LENGTH_UNIT);};
00175   void SetMaximumPropagationUnitToCellLengthUnit()
00176     {this->SetMaximumPropagationUnit(CELL_LENGTH_UNIT);};          
00178 
00180 
00183   void SetMinimumIntegrationStep(int unit, double step);
00184   void SetMinimumIntegrationStepUnit(int unit);
00185   void SetMinimumIntegrationStep(double step);
00186   int GetMinimumIntegrationStepUnit();
00187   double GetMinimumIntegrationStep();
00188   void SetMinimumIntegrationStepUnitToTimeUnit()
00189     {this->SetMinimumIntegrationStepUnit(TIME_UNIT);};
00190   void SetMinimumIntegrationStepUnitToLengthUnit()
00191     {this->SetMinimumIntegrationStepUnit(LENGTH_UNIT);};
00192   void SetMinimumIntegrationStepUnitToCellLengthUnit()
00193     {this->SetMinimumIntegrationStepUnit(CELL_LENGTH_UNIT);};
00195 
00197 
00200   void SetMaximumIntegrationStep(int unit, double step);
00201   void SetMaximumIntegrationStepUnit(int unit);
00202   void SetMaximumIntegrationStep(double step);
00203   int GetMaximumIntegrationStepUnit();
00204   double GetMaximumIntegrationStep();
00205   void SetMaximumIntegrationStepUnitToTimeUnit()
00206     {this->SetMaximumIntegrationStepUnit(TIME_UNIT);};
00207   void SetMaximumIntegrationStepUnitToLengthUnit()
00208     {this->SetMaximumIntegrationStepUnit(LENGTH_UNIT);};
00209   void SetMaximumIntegrationStepUnitToCellLengthUnit()
00210     {this->SetMaximumIntegrationStepUnit(CELL_LENGTH_UNIT);};
00212 
00214 
00217   void SetInitialIntegrationStep(int unit, double step);
00218   void SetInitialIntegrationStepUnit(int unit);
00219   void SetInitialIntegrationStep(double step);
00220   int GetInitialIntegrationStepUnit();
00221   double GetInitialIntegrationStep();
00222   void SetInitialIntegrationStepUnitToTimeUnit()
00223     {this->SetInitialIntegrationStepUnit(TIME_UNIT);};
00224   void SetInitialIntegrationStepUnitToLengthUnit()
00225     {this->SetInitialIntegrationStepUnit(LENGTH_UNIT);};
00226   void SetInitialIntegrationStepUnitToCellLengthUnit()
00227     {this->SetInitialIntegrationStepUnit(CELL_LENGTH_UNIT);};
00229 
00231 
00234   vtkSetMacro(MaximumError, double);
00235   vtkGetMacro(MaximumError, double);
00237 
00239 
00240   vtkSetMacro(MaximumNumberOfSteps, vtkIdType);
00241   vtkGetMacro(MaximumNumberOfSteps, vtkIdType);
00243 
00245 
00247   vtkSetMacro(TerminalSpeed, double);
00248   vtkGetMacro(TerminalSpeed, double);
00250 
00252 
00254   void SetIntegrationStepUnit(int unit)
00255     {
00256     this->SetInitialIntegrationStepUnit(unit);
00257     this->SetMinimumIntegrationStepUnit(unit);
00258     this->SetMaximumIntegrationStepUnit(unit);
00259     }
00261 
00262 //BTX
00263   enum
00264   {
00265     FORWARD,
00266     BACKWARD,
00267     BOTH
00268   };
00269 //ETX
00270 
00272 
00274   vtkSetClampMacro(IntegrationDirection, int, FORWARD, BOTH);
00275   vtkGetMacro(IntegrationDirection, int);
00276   void SetIntegrationDirectionToForward()
00277     {this->SetIntegrationDirection(FORWARD);};
00278   void SetIntegrationDirectionToBackward()
00279     {this->SetIntegrationDirection(BACKWARD);};
00280   void SetIntegrationDirectionToBoth()
00281     {this->SetIntegrationDirection(BOTH);};  
00283 
00285 
00287   vtkSetMacro(ComputeVorticity, int);
00288   vtkGetMacro(ComputeVorticity, int);
00289   vtkBooleanMacro(ComputeVorticity, int);
00291 
00293 
00295   vtkSetMacro(RotationScale, double);
00296   vtkGetMacro(RotationScale, double);
00298 
00300 
00303   vtkGetStringMacro(InputVectorsSelection);
00304   void SelectInputVectors(const char *fieldName) 
00305     {this->SetInputVectorsSelection(fieldName);}
00307   
00309   void AddInput(vtkGenericDataSet *in);
00310 
00313   void SetInterpolatorPrototype(vtkGenericInterpolatedVelocityField* ivf);
00314 
00315 protected:
00316   vtkGenericStreamTracer();
00317   ~vtkGenericStreamTracer();
00318 
00319   // hide the superclass' AddInput() from the user and the compiler
00320   void AddInput(vtkDataObject *) 
00321     { vtkErrorMacro( << "AddInput() must be called with a vtkGenericDataSet not a vtkDataObject."); };
00322   
00323   int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
00324 
00326 
00331   void CalculateVorticity(vtkGenericAdaptorCell* cell, 
00332                           double pcoords[3],
00333                           vtkGenericAttribute *attribute,
00334                           double vorticity[3]);
00336 
00337   void Integrate(vtkGenericDataSet *input0,
00338                  vtkPolyData* output,
00339                  vtkDataArray* seedSource, 
00340                  vtkIdList* seedIds,
00341                  vtkIntArray* integrationDirections,
00342                  double lastPoint[3],
00343                  vtkGenericInterpolatedVelocityField* func);
00344   void SimpleIntegrate(double seed[3], 
00345                        double lastPoint[3], 
00346                        double delt,
00347                        vtkGenericInterpolatedVelocityField* func);
00348   int CheckInputs(vtkGenericInterpolatedVelocityField*& func,
00349     vtkInformationVector **inputVector);
00350   void GenerateNormals(vtkPolyData* output, double* firstNormal);
00351 
00352   int GenerateNormalsInIntegrate;
00353 
00354   vtkSetStringMacro(InputVectorsSelection);
00355   char *InputVectorsSelection;
00356 
00357 
00358   // starting from global x-y-z position
00359   double StartPosition[3];
00360 
00361   static const double EPSILON;
00362   double TerminalSpeed;
00363 
00364   double LastUsedTimeStep;
00365 
00366 //BTX
00367   struct IntervalInformation
00368   {
00369     double Interval;
00370     int Unit;
00371   };
00372 
00373   IntervalInformation MaximumPropagation;
00374   IntervalInformation MinimumIntegrationStep;
00375   IntervalInformation MaximumIntegrationStep;
00376   IntervalInformation InitialIntegrationStep;
00377 
00378   void SetIntervalInformation(int unit, double interval,
00379                               IntervalInformation& currentValues);
00380   void SetIntervalInformation(int unit,IntervalInformation& currentValues);
00381   static double ConvertToTime(IntervalInformation& interval,
00382                              double cellLength, double speed);
00383   static double ConvertToLength(IntervalInformation& interval,
00384                                double cellLength, double speed);
00385   static double ConvertToCellLength(IntervalInformation& interval,
00386                                    double cellLength, double speed);
00387   static double ConvertToUnit(IntervalInformation& interval, int unit,
00388                              double cellLength, double speed);
00389   void ConvertIntervals(double& step, double& minStep, double& maxStep,
00390                         int direction, double cellLength, double speed);
00391 //ETX
00392 
00393   void InitializeSeeds(vtkDataArray*& seeds,
00394                        vtkIdList*& seedIds,
00395                        vtkIntArray*& integrationDirections);
00396   
00397   int IntegrationDirection;
00398 
00399   // Prototype showing the integrator type to be set by the user.
00400   vtkInitialValueProblemSolver* Integrator;
00401 
00402   double MaximumError;
00403   vtkIdType MaximumNumberOfSteps;
00404 
00405   int ComputeVorticity;
00406   double RotationScale;
00407 
00408   vtkGenericInterpolatedVelocityField* InterpolatorPrototype;
00409 
00410 private:
00411   vtkGenericStreamTracer(const vtkGenericStreamTracer&);  // Not implemented.
00412   void operator=(const vtkGenericStreamTracer&);  // Not implemented.
00413 };
00414 
00415 #endif