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