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 "vtkPolyDataAlgorithm.h"
00072
00073 #include "vtkInitialValueProblemSolver.h"
00074
00075 class vtkCompositeDataSet;
00076 class vtkDataArray;
00077 class vtkDoubleArray;
00078 class vtkExecutive;
00079 class vtkGenericCell;
00080 class vtkIdList;
00081 class vtkIntArray;
00082 class vtkInterpolatedVelocityField;
00083
00084 class VTK_GRAPHICS_EXPORT vtkStreamTracer : public vtkPolyDataAlgorithm
00085 {
00086 public:
00087 vtkTypeRevisionMacro(vtkStreamTracer,vtkPolyDataAlgorithm);
00088 void PrintSelf(ostream& os, vtkIndent indent);
00089
00094 static vtkStreamTracer *New();
00095
00097
00100 vtkSetVector3Macro(StartPosition, double);
00101 vtkGetVector3Macro(StartPosition, double);
00103
00105
00107 void SetSource(vtkDataSet *source);
00108 vtkDataSet *GetSource();
00110
00113 void SetSourceConnection(vtkAlgorithmOutput* algOutput);
00114
00115
00116 enum Units
00117 {
00118 TIME_UNIT,
00119 LENGTH_UNIT,
00120 CELL_LENGTH_UNIT
00121 };
00122
00123 enum Solvers
00124 {
00125 RUNGE_KUTTA2,
00126 RUNGE_KUTTA4,
00127 RUNGE_KUTTA45,
00128 NONE,
00129 UNKNOWN
00130 };
00131
00132 enum ReasonForTermination
00133 {
00134 OUT_OF_DOMAIN = vtkInitialValueProblemSolver::OUT_OF_DOMAIN,
00135 NOT_INITIALIZED = vtkInitialValueProblemSolver::NOT_INITIALIZED ,
00136 UNEXPECTED_VALUE = vtkInitialValueProblemSolver::UNEXPECTED_VALUE,
00137 OUT_OF_TIME = 4,
00138 OUT_OF_STEPS = 5,
00139 STAGNATION = 6
00140 };
00141
00142
00144
00150 void SetIntegrator(vtkInitialValueProblemSolver *);
00151 vtkGetObjectMacro ( Integrator, vtkInitialValueProblemSolver );
00152 void SetIntegratorType(int type);
00153 int GetIntegratorType();
00154 void SetIntegratorTypeToRungeKutta2()
00155 {this->SetIntegratorType(RUNGE_KUTTA2);};
00156 void SetIntegratorTypeToRungeKutta4()
00157 {this->SetIntegratorType(RUNGE_KUTTA4);};
00158 void SetIntegratorTypeToRungeKutta45()
00159 {this->SetIntegratorType(RUNGE_KUTTA45);};
00161
00163
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
00251
00252 enum
00253 {
00254 FORWARD,
00255 BACKWARD,
00256 BOTH
00257 };
00258
00259
00261
00263 vtkSetClampMacro(IntegrationDirection, int, FORWARD, BOTH);
00264 vtkGetMacro(IntegrationDirection, int);
00265 void SetIntegrationDirectionToForward()
00266 {this->SetIntegrationDirection(FORWARD);};
00267 void SetIntegrationDirectionToBackward()
00268 {this->SetIntegrationDirection(BACKWARD);};
00269 void SetIntegrationDirectionToBoth()
00270 {this->SetIntegrationDirection(BOTH);};
00272
00274
00276 vtkSetMacro(ComputeVorticity, int);
00277 vtkGetMacro(ComputeVorticity, int);
00278 vtkBooleanMacro(ComputeVorticity, int);
00280
00282
00284 vtkSetMacro(RotationScale, double);
00285 vtkGetMacro(RotationScale, double);
00287
00290 void SetInterpolatorPrototype(vtkInterpolatedVelocityField* ivf);
00291
00292 protected:
00293
00294 vtkStreamTracer();
00295 ~vtkStreamTracer();
00296
00297
00298 virtual vtkExecutive* CreateDefaultExecutive();
00299
00300
00301 void AddInput(vtkDataObject *)
00302 { vtkErrorMacro( << "AddInput() must be called with a vtkDataSet not a vtkDataObject."); };
00303
00304 virtual int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
00305 virtual int FillInputPortInformation(int, vtkInformation *);
00306
00307 void CalculateVorticity( vtkGenericCell* cell, double pcoords[3],
00308 vtkDoubleArray* cellVectors, double vorticity[3] );
00309 void Integrate(vtkDataSet *input,
00310 vtkPolyData* output,
00311 vtkDataArray* seedSource,
00312 vtkIdList* seedIds,
00313 vtkIntArray* integrationDirections,
00314 double lastPoint[3],
00315 vtkInterpolatedVelocityField* func,
00316 int maxCellSize,
00317 const char *vecFieldName,
00318 double& propagation,
00319 vtkIdType& numSteps);
00320 void SimpleIntegrate(double seed[3],
00321 double lastPoint[3],
00322 double delt,
00323 vtkInterpolatedVelocityField* func);
00324 int CheckInputs(vtkInterpolatedVelocityField*& func,
00325 int* maxCellSize);
00326 void GenerateNormals(vtkPolyData* output, double* firstNormal, const char *vecName);
00327
00328 int GenerateNormalsInIntegrate;
00329
00330
00331 double StartPosition[3];
00332
00333 static const double EPSILON;
00334 double TerminalSpeed;
00335
00336 double LastUsedTimeStep;
00337
00338
00339 struct IntervalInformation
00340 {
00341 double Interval;
00342 int Unit;
00343 };
00344
00345 IntervalInformation MaximumPropagation;
00346 IntervalInformation MinimumIntegrationStep;
00347 IntervalInformation MaximumIntegrationStep;
00348 IntervalInformation InitialIntegrationStep;
00349
00350 void SetIntervalInformation(int unit, double interval,
00351 IntervalInformation& currentValues);
00352 void SetIntervalInformation(int unit,IntervalInformation& currentValues);
00353 static double ConvertToTime(IntervalInformation& interval,
00354 double cellLength, double speed);
00355 static double ConvertToLength(IntervalInformation& interval,
00356 double cellLength, double speed);
00357 static double ConvertToCellLength(IntervalInformation& interval,
00358 double cellLength, double speed);
00359 static double ConvertToUnit(IntervalInformation& interval, int unit,
00360 double cellLength, double speed);
00361 void ConvertIntervals(double& step, double& minStep, double& maxStep,
00362 int direction, double cellLength, double speed);
00363
00364
00365 int SetupOutput(vtkInformation* inInfo,
00366 vtkInformation* outInfo);
00367 void InitializeSeeds(vtkDataArray*& seeds,
00368 vtkIdList*& seedIds,
00369 vtkIntArray*& integrationDirections,
00370 vtkDataSet *source);
00371
00372 int IntegrationDirection;
00373
00374
00375 vtkInitialValueProblemSolver* Integrator;
00376
00377 double MaximumError;
00378 vtkIdType MaximumNumberOfSteps;
00379
00380 int ComputeVorticity;
00381 double RotationScale;
00382
00383 vtkInterpolatedVelocityField* InterpolatorPrototype;
00384
00385 vtkCompositeDataSet* InputData;
00386
00387 private:
00388 vtkStreamTracer(const vtkStreamTracer&);
00389 void operator=(const vtkStreamTracer&);
00390 };
00391
00392
00393 #endif
00394
00395