00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00068 #ifndef __vtkStreamTracer_h
00069 #define __vtkStreamTracer_h
00070
00071 #include "vtkDataSetToPolyDataFilter.h"
00072
00073 #include "vtkInitialValueProblemSolver.h"
00074
00075 class vtkDataArray;
00076 class vtkDoubleArray;
00077 class vtkGenericCell;
00078 class vtkIdList;
00079 class vtkIntArray;
00080 class vtkInterpolatedVelocityField;
00081
00082 class VTK_GRAPHICS_EXPORT vtkStreamTracer : public vtkDataSetToPolyDataFilter
00083 {
00084 public:
00085 vtkTypeRevisionMacro(vtkStreamTracer,vtkDataSetToPolyDataFilter);
00086 void PrintSelf(ostream& os, vtkIndent indent);
00087
00092 static vtkStreamTracer *New();
00093
00095
00098 vtkSetVector3Macro(StartPosition, double);
00099 vtkGetVector3Macro(StartPosition, double);
00101
00103
00104 void SetSource(vtkDataSet *source);
00105 vtkDataSet *GetSource();
00107
00108
00109 enum Units
00110 {
00111 TIME_UNIT,
00112 LENGTH_UNIT,
00113 CELL_LENGTH_UNIT
00114 };
00115
00116 enum Solvers
00117 {
00118 RUNGE_KUTTA2,
00119 RUNGE_KUTTA4,
00120 RUNGE_KUTTA45,
00121 NONE,
00122 UNKNOWN
00123 };
00124
00125 enum ReasonForTermination
00126 {
00127 OUT_OF_DOMAIN = vtkInitialValueProblemSolver::OUT_OF_DOMAIN,
00128 NOT_INITIALIZED = vtkInitialValueProblemSolver::NOT_INITIALIZED ,
00129 UNEXPECTED_VALUE = vtkInitialValueProblemSolver::UNEXPECTED_VALUE,
00130 OUT_OF_TIME = 4,
00131 OUT_OF_STEPS = 5,
00132 STAGNATION = 6
00133 };
00134
00135
00137
00143 void SetIntegrator(vtkInitialValueProblemSolver *);
00144 vtkGetObjectMacro ( Integrator, vtkInitialValueProblemSolver );
00145 void SetIntegratorType(int type);
00146 int GetIntegratorType();
00147 void SetIntegratorTypeToRungeKutta2()
00148 {this->SetIntegratorType(RUNGE_KUTTA2);};
00149 void SetIntegratorTypeToRungeKutta4()
00150 {this->SetIntegratorType(RUNGE_KUTTA4);};
00151 void SetIntegratorTypeToRungeKutta45()
00152 {this->SetIntegratorType(RUNGE_KUTTA45);};
00154
00156
00158 void SetMaximumPropagation(int unit, double max);
00159 void SetMaximumPropagation(double max);
00160 void SetMaximumPropagationUnit(int unit);
00161 int GetMaximumPropagationUnit();
00162 double GetMaximumPropagation();
00163 void SetMaximumPropagationUnitToTimeUnit()
00164 {this->SetMaximumPropagationUnit(TIME_UNIT);};
00165 void SetMaximumPropagationUnitToLengthUnit()
00166 {this->SetMaximumPropagationUnit(LENGTH_UNIT);};
00167 void SetMaximumPropagationUnitToCellLengthUnit()
00168 {this->SetMaximumPropagationUnit(CELL_LENGTH_UNIT);};
00170
00172
00175 void SetMinimumIntegrationStep(int unit, double step);
00176 void SetMinimumIntegrationStepUnit(int unit);
00177 void SetMinimumIntegrationStep(double step);
00178 int GetMinimumIntegrationStepUnit();
00179 double GetMinimumIntegrationStep();
00180 void SetMinimumIntegrationStepUnitToTimeUnit()
00181 {this->SetMinimumIntegrationStepUnit(TIME_UNIT);};
00182 void SetMinimumIntegrationStepUnitToLengthUnit()
00183 {this->SetMinimumIntegrationStepUnit(LENGTH_UNIT);};
00184 void SetMinimumIntegrationStepUnitToCellLengthUnit()
00185 {this->SetMinimumIntegrationStepUnit(CELL_LENGTH_UNIT);};
00187
00189
00192 void SetMaximumIntegrationStep(int unit, double step);
00193 void SetMaximumIntegrationStepUnit(int unit);
00194 void SetMaximumIntegrationStep(double step);
00195 int GetMaximumIntegrationStepUnit();
00196 double GetMaximumIntegrationStep();
00197 void SetMaximumIntegrationStepUnitToTimeUnit()
00198 {this->SetMaximumIntegrationStepUnit(TIME_UNIT);};
00199 void SetMaximumIntegrationStepUnitToLengthUnit()
00200 {this->SetMaximumIntegrationStepUnit(LENGTH_UNIT);};
00201 void SetMaximumIntegrationStepUnitToCellLengthUnit()
00202 {this->SetMaximumIntegrationStepUnit(CELL_LENGTH_UNIT);};
00204
00206
00209 void SetInitialIntegrationStep(int unit, double step);
00210 void SetInitialIntegrationStepUnit(int unit);
00211 void SetInitialIntegrationStep(double step);
00212 int GetInitialIntegrationStepUnit();
00213 double GetInitialIntegrationStep();
00214 void SetInitialIntegrationStepUnitToTimeUnit()
00215 {this->SetInitialIntegrationStepUnit(TIME_UNIT);};
00216 void SetInitialIntegrationStepUnitToLengthUnit()
00217 {this->SetInitialIntegrationStepUnit(LENGTH_UNIT);};
00218 void SetInitialIntegrationStepUnitToCellLengthUnit()
00219 {this->SetInitialIntegrationStepUnit(CELL_LENGTH_UNIT);};
00221
00223
00226 vtkSetMacro(MaximumError, double);
00227 vtkGetMacro(MaximumError, double);
00229
00231
00232 vtkSetMacro(MaximumNumberOfSteps, vtkIdType);
00233 vtkGetMacro(MaximumNumberOfSteps, vtkIdType);
00235
00237
00239 vtkSetMacro(TerminalSpeed, double);
00240 vtkGetMacro(TerminalSpeed, double);
00242
00243
00244 enum
00245 {
00246 FORWARD,
00247 BACKWARD,
00248 BOTH
00249 };
00250
00251
00253
00255 vtkSetClampMacro(IntegrationDirection, int, FORWARD, BOTH);
00256 vtkGetMacro(IntegrationDirection, int);
00257 void SetIntegrationDirectionToForward()
00258 {this->SetIntegrationDirection(FORWARD);};
00259 void SetIntegrationDirectionToBackward()
00260 {this->SetIntegrationDirection(BACKWARD);};
00261 void SetIntegrationDirectionToBoth()
00262 {this->SetIntegrationDirection(BOTH);};
00264
00266
00268 vtkSetMacro(ComputeVorticity, int);
00269 vtkGetMacro(ComputeVorticity, int);
00270 vtkBooleanMacro(ComputeVorticity, int);
00272
00274
00276 vtkSetMacro(RotationScale, double);
00277 vtkGetMacro(RotationScale, double);
00279
00281
00284 vtkGetStringMacro(InputVectorsSelection);
00285 void SelectInputVectors(const char *fieldName)
00286 {this->SetInputVectorsSelection(fieldName);}
00288
00290 void AddInput(vtkDataSet *in);
00291
00292 protected:
00293
00294 vtkStreamTracer();
00295 ~vtkStreamTracer();
00296
00297
00298 void AddInput(vtkDataObject *)
00299 { vtkErrorMacro( << "AddInput() must be called with a vtkDataSet not a vtkDataObject."); };
00300
00301 void Execute();
00302 void CalculateVorticity( vtkGenericCell* cell, double pcoords[3],
00303 vtkDoubleArray* cellVectors, double vorticity[3] );
00304 void Integrate(vtkPolyData* output,
00305 vtkDataArray* seedSource,
00306 vtkIdList* seedIds,
00307 vtkIntArray* integrationDirections,
00308 double lastPoint[3],
00309 vtkInterpolatedVelocityField* func,
00310 int maxCellSize);
00311 void SimpleIntegrate(double seed[3],
00312 double lastPoint[3],
00313 double delt,
00314 vtkInterpolatedVelocityField* func);
00315 int CheckInputs(vtkInterpolatedVelocityField*& func,
00316 int* maxCellSize);
00317 void GenerateNormals(vtkPolyData* output, double* firstNormal);
00318
00319 int GenerateNormalsInIntegrate;
00320
00321 vtkSetStringMacro(InputVectorsSelection);
00322 char *InputVectorsSelection;
00323
00324
00325
00326 double StartPosition[3];
00327
00328 static const double EPSILON;
00329 double TerminalSpeed;
00330
00331 double LastUsedTimeStep;
00332
00333
00334 struct IntervalInformation
00335 {
00336 double Interval;
00337 int Unit;
00338 };
00339
00340 IntervalInformation MaximumPropagation;
00341 IntervalInformation MinimumIntegrationStep;
00342 IntervalInformation MaximumIntegrationStep;
00343 IntervalInformation InitialIntegrationStep;
00344
00345 void SetIntervalInformation(int unit, double interval,
00346 IntervalInformation& currentValues);
00347 void SetIntervalInformation(int unit,IntervalInformation& currentValues);
00348 static double ConvertToTime(IntervalInformation& interval,
00349 double cellLength, double speed);
00350 static double ConvertToLength(IntervalInformation& interval,
00351 double cellLength, double speed);
00352 static double ConvertToCellLength(IntervalInformation& interval,
00353 double cellLength, double speed);
00354 static double ConvertToUnit(IntervalInformation& interval, int unit,
00355 double cellLength, double speed);
00356 void ConvertIntervals(double& step, double& minStep, double& maxStep,
00357 int direction, double cellLength, double speed);
00358
00359
00360 void InitializeSeeds(vtkDataArray*& seeds,
00361 vtkIdList*& seedIds,
00362 vtkIntArray*& integrationDirections);
00363
00364 int IntegrationDirection;
00365
00366
00367 vtkInitialValueProblemSolver* Integrator;
00368
00369 double MaximumError;
00370 vtkIdType MaximumNumberOfSteps;
00371
00372 int ComputeVorticity;
00373 double RotationScale;
00374
00375 private:
00376 vtkStreamTracer(const vtkStreamTracer&);
00377 void operator=(const vtkStreamTracer&);
00378 };
00379
00380
00381 #endif
00382
00383