00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00083 #ifndef __vtkStreamTracer_h
00084 #define __vtkStreamTracer_h
00085
00086 #include "vtkDataSetToPolyDataFilter.h"
00087
00088 #include "vtkInitialValueProblemSolver.h"
00089
00090 class vtkDataArray;
00091 class vtkFloatArray;
00092 class vtkGenericCell;
00093 class vtkIdList;
00094 class vtkIntArray;
00095 class vtkInterpolatedVelocityField;
00096
00097 class VTK_GRAPHICS_EXPORT vtkStreamTracer : public vtkDataSetToPolyDataFilter
00098 {
00099 public:
00100 vtkTypeRevisionMacro(vtkStreamTracer,vtkDataSetToPolyDataFilter);
00101 void PrintSelf(ostream& os, vtkIndent indent);
00102
00107 static vtkStreamTracer *New();
00108
00110
00113 vtkSetVector3Macro(StartPosition, float);
00114 vtkGetVector3Macro(StartPosition, float);
00116
00118
00119 void SetSource(vtkDataSet *source);
00120 vtkDataSet *GetSource();
00122
00123
00124 enum Units
00125 {
00126 TIME_UNIT,
00127 LENGTH_UNIT,
00128 CELL_LENGTH_UNIT
00129 };
00130
00131 enum Solvers
00132 {
00133 RUNGE_KUTTA2,
00134 RUNGE_KUTTA4,
00135 RUNGE_KUTTA45,
00136 NONE,
00137 UNKNOWN
00138 };
00139
00140 enum ReasonForTermination
00141 {
00142 OUT_OF_DOMAIN = vtkInitialValueProblemSolver::OUT_OF_DOMAIN,
00143 NOT_INITIALIZED = vtkInitialValueProblemSolver::NOT_INITIALIZED ,
00144 UNEXPECTED_VALUE = vtkInitialValueProblemSolver::UNEXPECTED_VALUE,
00145 OUT_OF_TIME = 4,
00146 OUT_OF_STEPS = 5,
00147 STAGNATION = 6
00148 };
00149
00150
00152
00158 void SetIntegrator(vtkInitialValueProblemSolver *);
00159 vtkGetObjectMacro ( Integrator, vtkInitialValueProblemSolver );
00160 void SetIntegratorType(int type);
00161 int GetIntegratorType();
00162 void SetIntegratorTypeToRungeKutta2()
00163 {this->SetIntegratorType(RUNGE_KUTTA2);};
00164 void SetIntegratorTypeToRungeKutta4()
00165 {this->SetIntegratorType(RUNGE_KUTTA4);};
00166 void SetIntegratorTypeToRungeKutta45()
00167 {this->SetIntegratorType(RUNGE_KUTTA45);};
00169
00171
00173 void SetMaximumPropagation(int unit, float max);
00174 void SetMaximumPropagation(float max);
00175 void SetMaximumPropagationUnit(int unit);
00176 int GetMaximumPropagationUnit();
00177 float GetMaximumPropagation();
00178 void SetMaximumPropagationUnitToTimeUnit()
00179 {this->SetMaximumPropagationUnit(TIME_UNIT);};
00180 void SetMaximumPropagationUnitToLengthUnit()
00181 {this->SetMaximumPropagationUnit(LENGTH_UNIT);};
00182 void SetMaximumPropagationUnitToCellLengthUnit()
00183 {this->SetMaximumPropagationUnit(CELL_LENGTH_UNIT);};
00185
00187
00190 void SetMinimumIntegrationStep(int unit, float step);
00191 void SetMinimumIntegrationStepUnit(int unit);
00192 void SetMinimumIntegrationStep(float step);
00193 int GetMinimumIntegrationStepUnit();
00194 float GetMinimumIntegrationStep();
00195 void SetMinimumIntegrationStepUnitToTimeUnit()
00196 {this->SetMinimumIntegrationStepUnit(TIME_UNIT);};
00197 void SetMinimumIntegrationStepUnitToLengthUnit()
00198 {this->SetMinimumIntegrationStepUnit(LENGTH_UNIT);};
00199 void SetMinimumIntegrationStepUnitToCellLengthUnit()
00200 {this->SetMinimumIntegrationStepUnit(CELL_LENGTH_UNIT);};
00202
00204
00207 void SetMaximumIntegrationStep(int unit, float step);
00208 void SetMaximumIntegrationStepUnit(int unit);
00209 void SetMaximumIntegrationStep(float step);
00210 int GetMaximumIntegrationStepUnit();
00211 float GetMaximumIntegrationStep();
00212 void SetMaximumIntegrationStepUnitToTimeUnit()
00213 {this->SetMaximumIntegrationStepUnit(TIME_UNIT);};
00214 void SetMaximumIntegrationStepUnitToLengthUnit()
00215 {this->SetMaximumIntegrationStepUnit(LENGTH_UNIT);};
00216 void SetMaximumIntegrationStepUnitToCellLengthUnit()
00217 {this->SetMaximumIntegrationStepUnit(CELL_LENGTH_UNIT);};
00219
00221
00224 void SetInitialIntegrationStep(int unit, float step);
00225 void SetInitialIntegrationStepUnit(int unit);
00226 void SetInitialIntegrationStep(float step);
00227 int GetInitialIntegrationStepUnit();
00228 float GetInitialIntegrationStep();
00229 void SetInitialIntegrationStepUnitToTimeUnit()
00230 {this->SetInitialIntegrationStepUnit(TIME_UNIT);};
00231 void SetInitialIntegrationStepUnitToLengthUnit()
00232 {this->SetInitialIntegrationStepUnit(LENGTH_UNIT);};
00233 void SetInitialIntegrationStepUnitToCellLengthUnit()
00234 {this->SetInitialIntegrationStepUnit(CELL_LENGTH_UNIT);};
00236
00238
00241 vtkSetMacro(MaximumError, float);
00242 vtkGetMacro(MaximumError, float);
00244
00246
00247 vtkSetMacro(MaximumNumberOfSteps, vtkIdType);
00248 vtkGetMacro(MaximumNumberOfSteps, vtkIdType);
00250
00252
00254 vtkSetMacro(TerminalSpeed, float);
00255 vtkGetMacro(TerminalSpeed, float);
00257
00258
00259 enum
00260 {
00261 FORWARD,
00262 BACKWARD,
00263 BOTH
00264 };
00265
00266
00268
00270 vtkSetClampMacro(IntegrationDirection, int, FORWARD, BOTH);
00271 vtkGetMacro(IntegrationDirection, int);
00272 void SetIntegrationDirectionToForward()
00273 {this->SetIntegrationDirection(FORWARD);};
00274 void SetIntegrationDirectionToBackward()
00275 {this->SetIntegrationDirection(BACKWARD);};
00276 void SetIntegrationDirectionToBoth()
00277 {this->SetIntegrationDirection(BOTH);};
00279
00281
00283 vtkSetMacro(ComputeVorticity, int);
00284 vtkGetMacro(ComputeVorticity, int);
00285 vtkBooleanMacro(ComputeVorticity, int);
00287
00289
00291 vtkSetMacro(RotationScale, float);
00292 vtkGetMacro(RotationScale, float);
00294
00296 void AddInput(vtkDataSet *in);
00297
00298 protected:
00299
00300 vtkStreamTracer();
00301 ~vtkStreamTracer();
00302
00303
00304 void AddInput(vtkDataObject *)
00305 { vtkErrorMacro( << "AddInput() must be called with a vtkDataSet not a vtkDataObject."); };
00306
00307 void Execute();
00308 void CalculateVorticity( vtkGenericCell* cell, float pcoords[3],
00309 vtkFloatArray* cellVectors, float vorticity[3] );
00310 void Integrate(vtkPolyData* output,
00311 vtkDataArray* seedSource,
00312 vtkIdList* seedIds,
00313 vtkIntArray* integrationDirections,
00314 float lastPoint[3]);
00315 int CheckInputs(vtkInterpolatedVelocityField*& func,
00316 int* maxCellSize);
00317
00318 vtkSetStringMacro(InputVectorsSelection);
00319 char *InputVectorsSelection;
00320
00321
00322
00323 float StartPosition[3];
00324
00325 static const float EPSILON;
00326 float TerminalSpeed;
00327
00328
00329 struct IntervalInformation
00330 {
00331 float Interval;
00332 int Unit;
00333 };
00334
00335 IntervalInformation MaximumPropagation;
00336 IntervalInformation MinimumIntegrationStep;
00337 IntervalInformation MaximumIntegrationStep;
00338 IntervalInformation InitialIntegrationStep;
00339
00340 void SetIntervalInformation(int unit, float interval,
00341 IntervalInformation& currentValues);
00342 void SetIntervalInformation(int unit,IntervalInformation& currentValues);
00343 static float ConvertToTime(IntervalInformation& interval,
00344 float cellLength, float speed);
00345 static float ConvertToLength(IntervalInformation& interval,
00346 float cellLength, float speed);
00347 static float ConvertToCellLength(IntervalInformation& interval,
00348 float cellLength, float speed);
00349 static float ConvertToUnit(IntervalInformation& interval, int unit,
00350 float cellLength, float speed);
00351 void ConvertIntervals(float& step, float& minStep, float& maxStep,
00352 int direction, float cellLength, float speed);
00353
00354
00355 void InitializeSeeds(vtkDataArray*& seeds,
00356 vtkIdList*& seedIds,
00357 vtkIntArray*& integrationDirections);
00358
00359 int IntegrationDirection;
00360
00361
00362 vtkInitialValueProblemSolver* Integrator;
00363
00364 float MaximumError;
00365 vtkIdType MaximumNumberOfSteps;
00366
00367 int ComputeVorticity;
00368 float RotationScale;
00369
00370 private:
00371 vtkStreamTracer(const vtkStreamTracer&);
00372 void operator=(const vtkStreamTracer&);
00373 };
00374
00375
00376 #endif
00377
00378