• Main Page
  • Related Pages
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

dox/GenericFiltering/vtkGenericStreamTracer.h

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Visualization Toolkit
00004   Module:    $RCSfile: vtkGenericStreamTracer.h,v $
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   vtkTypeRevisionMacro(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   
00110   int FillInputPortInformation(int port, vtkInformation* info);
00111   
00112 //BTX
00113   enum Units
00114   {
00115     TIME_UNIT,
00116     LENGTH_UNIT,
00117     CELL_LENGTH_UNIT
00118   };
00119 
00120   enum Solvers
00121   {
00122     RUNGE_KUTTA2,
00123     RUNGE_KUTTA4,
00124     RUNGE_KUTTA45,
00125     NONE,
00126     UNKNOWN
00127   };
00128 
00129   enum ReasonForTermination
00130   {
00131     OUT_OF_DOMAIN = vtkInitialValueProblemSolver::OUT_OF_DOMAIN,
00132     NOT_INITIALIZED = vtkInitialValueProblemSolver::NOT_INITIALIZED ,
00133     UNEXPECTED_VALUE = vtkInitialValueProblemSolver::UNEXPECTED_VALUE,
00134     OUT_OF_TIME = 4,
00135     OUT_OF_STEPS = 5,
00136     STAGNATION = 6
00137   };
00138 //ETX
00139 
00141 
00147   void SetIntegrator(vtkInitialValueProblemSolver *);
00148   vtkGetObjectMacro ( Integrator, vtkInitialValueProblemSolver );
00149   void SetIntegratorType(int type);
00150   int GetIntegratorType();
00151   void SetIntegratorTypeToRungeKutta2()
00152     {this->SetIntegratorType(RUNGE_KUTTA2);};
00153   void SetIntegratorTypeToRungeKutta4()
00154     {this->SetIntegratorType(RUNGE_KUTTA4);};
00155   void SetIntegratorTypeToRungeKutta45()
00156     {this->SetIntegratorType(RUNGE_KUTTA45);};
00158 
00160 
00162   void SetMaximumPropagation(int unit, double max);
00163   void SetMaximumPropagation(double max);
00164   void SetMaximumPropagationUnit(int unit);
00165   int GetMaximumPropagationUnit();
00166   double GetMaximumPropagation();
00167   void SetMaximumPropagationUnitToTimeUnit()
00168     {this->SetMaximumPropagationUnit(TIME_UNIT);};
00169   void SetMaximumPropagationUnitToLengthUnit()
00170     {this->SetMaximumPropagationUnit(LENGTH_UNIT);};
00171   void SetMaximumPropagationUnitToCellLengthUnit()
00172     {this->SetMaximumPropagationUnit(CELL_LENGTH_UNIT);};          
00174 
00176 
00179   void SetMinimumIntegrationStep(int unit, double step);
00180   void SetMinimumIntegrationStepUnit(int unit);
00181   void SetMinimumIntegrationStep(double step);
00182   int GetMinimumIntegrationStepUnit();
00183   double GetMinimumIntegrationStep();
00184   void SetMinimumIntegrationStepUnitToTimeUnit()
00185     {this->SetMinimumIntegrationStepUnit(TIME_UNIT);};
00186   void SetMinimumIntegrationStepUnitToLengthUnit()
00187     {this->SetMinimumIntegrationStepUnit(LENGTH_UNIT);};
00188   void SetMinimumIntegrationStepUnitToCellLengthUnit()
00189     {this->SetMinimumIntegrationStepUnit(CELL_LENGTH_UNIT);};
00191 
00193 
00196   void SetMaximumIntegrationStep(int unit, double step);
00197   void SetMaximumIntegrationStepUnit(int unit);
00198   void SetMaximumIntegrationStep(double step);
00199   int GetMaximumIntegrationStepUnit();
00200   double GetMaximumIntegrationStep();
00201   void SetMaximumIntegrationStepUnitToTimeUnit()
00202     {this->SetMaximumIntegrationStepUnit(TIME_UNIT);};
00203   void SetMaximumIntegrationStepUnitToLengthUnit()
00204     {this->SetMaximumIntegrationStepUnit(LENGTH_UNIT);};
00205   void SetMaximumIntegrationStepUnitToCellLengthUnit()
00206     {this->SetMaximumIntegrationStepUnit(CELL_LENGTH_UNIT);};
00208 
00210 
00213   void SetInitialIntegrationStep(int unit, double step);
00214   void SetInitialIntegrationStepUnit(int unit);
00215   void SetInitialIntegrationStep(double step);
00216   int GetInitialIntegrationStepUnit();
00217   double GetInitialIntegrationStep();
00218   void SetInitialIntegrationStepUnitToTimeUnit()
00219     {this->SetInitialIntegrationStepUnit(TIME_UNIT);};
00220   void SetInitialIntegrationStepUnitToLengthUnit()
00221     {this->SetInitialIntegrationStepUnit(LENGTH_UNIT);};
00222   void SetInitialIntegrationStepUnitToCellLengthUnit()
00223     {this->SetInitialIntegrationStepUnit(CELL_LENGTH_UNIT);};
00225 
00227 
00230   vtkSetMacro(MaximumError, double);
00231   vtkGetMacro(MaximumError, double);
00233 
00235 
00236   vtkSetMacro(MaximumNumberOfSteps, vtkIdType);
00237   vtkGetMacro(MaximumNumberOfSteps, vtkIdType);
00239 
00241 
00243   vtkSetMacro(TerminalSpeed, double);
00244   vtkGetMacro(TerminalSpeed, double);
00246 
00247 //BTX
00248   enum
00249   {
00250     FORWARD,
00251     BACKWARD,
00252     BOTH
00253   };
00254 //ETX
00255 
00257 
00259   vtkSetClampMacro(IntegrationDirection, int, FORWARD, BOTH);
00260   vtkGetMacro(IntegrationDirection, int);
00261   void SetIntegrationDirectionToForward()
00262     {this->SetIntegrationDirection(FORWARD);};
00263   void SetIntegrationDirectionToBackward()
00264     {this->SetIntegrationDirection(BACKWARD);};
00265   void SetIntegrationDirectionToBoth()
00266     {this->SetIntegrationDirection(BOTH);};  
00268 
00270 
00272   vtkSetMacro(ComputeVorticity, int);
00273   vtkGetMacro(ComputeVorticity, int);
00274   vtkBooleanMacro(ComputeVorticity, int);
00276 
00278 
00280   vtkSetMacro(RotationScale, double);
00281   vtkGetMacro(RotationScale, double);
00283 
00285 
00288   vtkGetStringMacro(InputVectorsSelection);
00289   void SelectInputVectors(const char *fieldName) 
00290     {this->SetInputVectorsSelection(fieldName);}
00292   
00294   void AddInput(vtkGenericDataSet *in);
00295 
00298   void SetInterpolatorPrototype(vtkGenericInterpolatedVelocityField* ivf);
00299 
00300 protected:
00301   vtkGenericStreamTracer();
00302   ~vtkGenericStreamTracer();
00303 
00304   // hide the superclass' AddInput() from the user and the compiler
00305   void AddInput(vtkDataObject *) 
00306     { vtkErrorMacro( << "AddInput() must be called with a vtkGenericDataSet not a vtkDataObject."); };
00307   
00308   int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
00309 
00311 
00316   void CalculateVorticity(vtkGenericAdaptorCell* cell, 
00317                           double pcoords[3],
00318                           vtkGenericAttribute *attribute,
00319                           double vorticity[3]);
00321 
00322   void Integrate(vtkGenericDataSet *input0,
00323                  vtkPolyData* output,
00324                  vtkDataArray* seedSource, 
00325                  vtkIdList* seedIds,
00326                  vtkIntArray* integrationDirections,
00327                  double lastPoint[3],
00328                  vtkGenericInterpolatedVelocityField* func);
00329   void SimpleIntegrate(double seed[3], 
00330                        double lastPoint[3], 
00331                        double delt,
00332                        vtkGenericInterpolatedVelocityField* func);
00333   int CheckInputs(vtkGenericInterpolatedVelocityField*& func,
00334     vtkInformationVector **inputVector);
00335   void GenerateNormals(vtkPolyData* output, double* firstNormal);
00336 
00337   int GenerateNormalsInIntegrate;
00338 
00339   vtkSetStringMacro(InputVectorsSelection);
00340   char *InputVectorsSelection;
00341 
00342 
00343   // starting from global x-y-z position
00344   double StartPosition[3];
00345 
00346   static const double EPSILON;
00347   double TerminalSpeed;
00348 
00349   double LastUsedTimeStep;
00350 
00351 //BTX
00352   struct IntervalInformation
00353   {
00354     double Interval;
00355     int Unit;
00356   };
00357 
00358   IntervalInformation MaximumPropagation;
00359   IntervalInformation MinimumIntegrationStep;
00360   IntervalInformation MaximumIntegrationStep;
00361   IntervalInformation InitialIntegrationStep;
00362 
00363   void SetIntervalInformation(int unit, double interval,
00364                               IntervalInformation& currentValues);
00365   void SetIntervalInformation(int unit,IntervalInformation& currentValues);
00366   static double ConvertToTime(IntervalInformation& interval,
00367                              double cellLength, double speed);
00368   static double ConvertToLength(IntervalInformation& interval,
00369                                double cellLength, double speed);
00370   static double ConvertToCellLength(IntervalInformation& interval,
00371                                    double cellLength, double speed);
00372   static double ConvertToUnit(IntervalInformation& interval, int unit,
00373                              double cellLength, double speed);
00374   void ConvertIntervals(double& step, double& minStep, double& maxStep,
00375                         int direction, double cellLength, double speed);
00376 //ETX
00377 
00378   void InitializeSeeds(vtkDataArray*& seeds,
00379                        vtkIdList*& seedIds,
00380                        vtkIntArray*& integrationDirections);
00381   
00382   int IntegrationDirection;
00383 
00384   // Prototype showing the integrator type to be set by the user.
00385   vtkInitialValueProblemSolver* Integrator;
00386 
00387   double MaximumError;
00388   vtkIdType MaximumNumberOfSteps;
00389 
00390   int ComputeVorticity;
00391   double RotationScale;
00392 
00393   vtkGenericInterpolatedVelocityField* InterpolatorPrototype;
00394 
00395 private:
00396   vtkGenericStreamTracer(const vtkGenericStreamTracer&);  // Not implemented.
00397   void operator=(const vtkGenericStreamTracer&);  // Not implemented.
00398 };
00399 
00400 #endif

Generated by  doxygen 1.7.1