00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00071 #ifndef __vtkStreamTracer_h
00072 #define __vtkStreamTracer_h
00073
00074 #include "vtkPolyDataAlgorithm.h"
00075
00076 #include "vtkInitialValueProblemSolver.h"
00077
00078 class vtkCompositeDataSet;
00079 class vtkDataArray;
00080 class vtkDoubleArray;
00081 class vtkExecutive;
00082 class vtkGenericCell;
00083 class vtkIdList;
00084 class vtkIntArray;
00085 class vtkInterpolatedVelocityField;
00086
00087 class VTK_GRAPHICS_EXPORT vtkStreamTracer : public vtkPolyDataAlgorithm
00088 {
00089 public:
00090 vtkTypeRevisionMacro(vtkStreamTracer,vtkPolyDataAlgorithm);
00091 void PrintSelf(ostream& os, vtkIndent indent);
00092
00097 static vtkStreamTracer *New();
00098
00100
00103 vtkSetVector3Macro(StartPosition, double);
00104 vtkGetVector3Macro(StartPosition, double);
00106
00108
00110 void SetSource(vtkDataSet *source);
00111 vtkDataSet *GetSource();
00113
00116 void SetSourceConnection(vtkAlgorithmOutput* algOutput);
00117
00118
00119 enum Units
00120 {
00121 TIME_UNIT,
00122 LENGTH_UNIT,
00123 CELL_LENGTH_UNIT
00124 };
00125
00126 enum Solvers
00127 {
00128 RUNGE_KUTTA2,
00129 RUNGE_KUTTA4,
00130 RUNGE_KUTTA45,
00131 NONE,
00132 UNKNOWN
00133 };
00134
00135 enum ReasonForTermination
00136 {
00137 OUT_OF_DOMAIN = vtkInitialValueProblemSolver::OUT_OF_DOMAIN,
00138 NOT_INITIALIZED = vtkInitialValueProblemSolver::NOT_INITIALIZED ,
00139 UNEXPECTED_VALUE = vtkInitialValueProblemSolver::UNEXPECTED_VALUE,
00140 OUT_OF_TIME = 4,
00141 OUT_OF_STEPS = 5,
00142 STAGNATION = 6
00143 };
00144
00145
00147
00153 void SetIntegrator(vtkInitialValueProblemSolver *);
00154 vtkGetObjectMacro ( Integrator, vtkInitialValueProblemSolver );
00155 void SetIntegratorType(int type);
00156 int GetIntegratorType();
00157 void SetIntegratorTypeToRungeKutta2()
00158 {this->SetIntegratorType(RUNGE_KUTTA2);};
00159 void SetIntegratorTypeToRungeKutta4()
00160 {this->SetIntegratorType(RUNGE_KUTTA4);};
00161 void SetIntegratorTypeToRungeKutta45()
00162 {this->SetIntegratorType(RUNGE_KUTTA45);};
00164
00166
00169 void SetMaximumPropagation(int unit, double max);
00170 void SetMaximumPropagation(double max);
00171 void SetMaximumPropagationUnit(int unit);
00172 int GetMaximumPropagationUnit();
00173 double GetMaximumPropagation();
00174 void SetMaximumPropagationUnitToTimeUnit()
00175 {this->SetMaximumPropagationUnit(TIME_UNIT);};
00176 void SetMaximumPropagationUnitToLengthUnit()
00177 {this->SetMaximumPropagationUnit(LENGTH_UNIT);};
00178 void SetMaximumPropagationUnitToCellLengthUnit()
00179 {this->SetMaximumPropagationUnit(CELL_LENGTH_UNIT);};
00181
00183
00186 void SetMinimumIntegrationStep(int unit, double step);
00187 void SetMinimumIntegrationStepUnit(int unit);
00188 void SetMinimumIntegrationStep(double step);
00189 int GetMinimumIntegrationStepUnit();
00190 double GetMinimumIntegrationStep();
00191 void SetMinimumIntegrationStepUnitToTimeUnit()
00192 {this->SetMinimumIntegrationStepUnit(TIME_UNIT);};
00193 void SetMinimumIntegrationStepUnitToLengthUnit()
00194 {this->SetMinimumIntegrationStepUnit(LENGTH_UNIT);};
00195 void SetMinimumIntegrationStepUnitToCellLengthUnit()
00196 {this->SetMinimumIntegrationStepUnit(CELL_LENGTH_UNIT);};
00198
00200
00203 void SetMaximumIntegrationStep(int unit, double step);
00204 void SetMaximumIntegrationStepUnit(int unit);
00205 void SetMaximumIntegrationStep(double step);
00206 int GetMaximumIntegrationStepUnit();
00207 double GetMaximumIntegrationStep();
00208 void SetMaximumIntegrationStepUnitToTimeUnit()
00209 {this->SetMaximumIntegrationStepUnit(TIME_UNIT);};
00210 void SetMaximumIntegrationStepUnitToLengthUnit()
00211 {this->SetMaximumIntegrationStepUnit(LENGTH_UNIT);};
00212 void SetMaximumIntegrationStepUnitToCellLengthUnit()
00213 {this->SetMaximumIntegrationStepUnit(CELL_LENGTH_UNIT);};
00215
00217
00220 void SetInitialIntegrationStep(int unit, double step);
00221 void SetInitialIntegrationStepUnit(int unit);
00222 void SetInitialIntegrationStep(double step);
00223 int GetInitialIntegrationStepUnit();
00224 double GetInitialIntegrationStep();
00225 void SetInitialIntegrationStepUnitToTimeUnit()
00226 {this->SetInitialIntegrationStepUnit(TIME_UNIT);};
00227 void SetInitialIntegrationStepUnitToLengthUnit()
00228 {this->SetInitialIntegrationStepUnit(LENGTH_UNIT);};
00229 void SetInitialIntegrationStepUnitToCellLengthUnit()
00230 {this->SetInitialIntegrationStepUnit(CELL_LENGTH_UNIT);};
00232
00234
00237 vtkSetMacro(MaximumError, double);
00238 vtkGetMacro(MaximumError, double);
00240
00242
00243 vtkSetMacro(MaximumNumberOfSteps, vtkIdType);
00244 vtkGetMacro(MaximumNumberOfSteps, vtkIdType);
00246
00248
00250 vtkSetMacro(TerminalSpeed, double);
00251 vtkGetMacro(TerminalSpeed, double);
00253
00254
00255 enum
00256 {
00257 FORWARD,
00258 BACKWARD,
00259 BOTH
00260 };
00261
00262
00264
00266 vtkSetClampMacro(IntegrationDirection, int, FORWARD, BOTH);
00267 vtkGetMacro(IntegrationDirection, int);
00268 void SetIntegrationDirectionToForward()
00269 {this->SetIntegrationDirection(FORWARD);};
00270 void SetIntegrationDirectionToBackward()
00271 {this->SetIntegrationDirection(BACKWARD);};
00272 void SetIntegrationDirectionToBoth()
00273 {this->SetIntegrationDirection(BOTH);};
00275
00277
00279 vtkSetMacro(ComputeVorticity, int);
00280 vtkGetMacro(ComputeVorticity, int);
00281 vtkBooleanMacro(ComputeVorticity, int);
00283
00285
00287 vtkSetMacro(RotationScale, double);
00288 vtkGetMacro(RotationScale, double);
00290
00293 void SetInterpolatorPrototype(vtkInterpolatedVelocityField* ivf);
00294
00295 protected:
00296
00297 vtkStreamTracer();
00298 ~vtkStreamTracer();
00299
00300
00301 virtual vtkExecutive* CreateDefaultExecutive();
00302
00303
00304 void AddInput(vtkDataObject *)
00305 { vtkErrorMacro( << "AddInput() must be called with a vtkDataSet not a vtkDataObject."); };
00306
00307 virtual int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
00308 virtual int FillInputPortInformation(int, vtkInformation *);
00309
00310 void CalculateVorticity( vtkGenericCell* cell, double pcoords[3],
00311 vtkDoubleArray* cellVectors, double vorticity[3] );
00312 void Integrate(vtkDataSet *input,
00313 vtkPolyData* output,
00314 vtkDataArray* seedSource,
00315 vtkIdList* seedIds,
00316 vtkIntArray* integrationDirections,
00317 double lastPoint[3],
00318 vtkInterpolatedVelocityField* func,
00319 int maxCellSize,
00320 const char *vecFieldName,
00321 double& propagation,
00322 vtkIdType& numSteps);
00323 void SimpleIntegrate(double seed[3],
00324 double lastPoint[3],
00325 double delt,
00326 vtkInterpolatedVelocityField* func);
00327 int CheckInputs(vtkInterpolatedVelocityField*& func,
00328 int* maxCellSize);
00329 void GenerateNormals(vtkPolyData* output, double* firstNormal, const char *vecName);
00330
00331 int GenerateNormalsInIntegrate;
00332
00333
00334 double StartPosition[3];
00335
00336 static const double EPSILON;
00337 double TerminalSpeed;
00338
00339 double LastUsedTimeStep;
00340
00341
00342 struct IntervalInformation
00343 {
00344 double Interval;
00345 int Unit;
00346 };
00347
00348 IntervalInformation MaximumPropagation;
00349 IntervalInformation MinimumIntegrationStep;
00350 IntervalInformation MaximumIntegrationStep;
00351 IntervalInformation InitialIntegrationStep;
00352
00353 void SetIntervalInformation(int unit, double interval,
00354 IntervalInformation& currentValues);
00355 void SetIntervalInformation(int unit,IntervalInformation& currentValues);
00356 static double ConvertToTime(IntervalInformation& interval,
00357 double cellLength, double speed);
00358 static double ConvertToLength(IntervalInformation& interval,
00359 double cellLength, double speed);
00360 static double ConvertToCellLength(IntervalInformation& interval,
00361 double cellLength, double speed);
00362 static double ConvertToUnit(IntervalInformation& interval, int unit,
00363 double cellLength, double speed);
00364 void ConvertIntervals(double& step, double& minStep, double& maxStep,
00365 int direction, double cellLength, double speed);
00366
00367
00368 int SetupOutput(vtkInformation* inInfo,
00369 vtkInformation* outInfo);
00370 void InitializeSeeds(vtkDataArray*& seeds,
00371 vtkIdList*& seedIds,
00372 vtkIntArray*& integrationDirections,
00373 vtkDataSet *source);
00374
00375 int IntegrationDirection;
00376
00377
00378 vtkInitialValueProblemSolver* Integrator;
00379
00380 double MaximumError;
00381 vtkIdType MaximumNumberOfSteps;
00382
00383 int ComputeVorticity;
00384 double RotationScale;
00385
00386 vtkInterpolatedVelocityField* InterpolatorPrototype;
00387
00388 vtkCompositeDataSet* InputData;
00389
00390 private:
00391 vtkStreamTracer(const vtkStreamTracer&);
00392 void operator=(const vtkStreamTracer&);
00393 };
00394
00395
00396 #endif
00397
00398