VTK
|
00001 /*========================================================================= 00002 00003 Program: Visualization Toolkit 00004 Module: vtkGenericStreamTracer.h 00005 00006 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen 00007 All rights reserved. 00008 See Copyright.txt or http://www.kitware.com/Copyright.htm for details. 00009 00010 This software is distributed WITHOUT ANY WARRANTY; without even 00011 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00012 PURPOSE. See the above copyright notice for more information. 00013 00014 =========================================================================*/ 00068 #ifndef __vtkGenericStreamTracer_h 00069 #define __vtkGenericStreamTracer_h 00070 00071 #include "vtkPolyDataAlgorithm.h" 00072 00073 #include "vtkInitialValueProblemSolver.h" // Needed for constants 00074 00075 class vtkDataArray; 00076 class vtkGenericAdaptorCell; 00077 class vtkIdList; 00078 class vtkIntArray; 00079 class vtkGenericInterpolatedVelocityField; 00080 class vtkDataSet; 00081 class vtkGenericAttribute; 00082 class vtkGenericDataSet; 00083 00084 class VTK_GENERIC_FILTERING_EXPORT vtkGenericStreamTracer : public vtkPolyDataAlgorithm 00085 { 00086 public: 00087 vtkTypeMacro(vtkGenericStreamTracer,vtkPolyDataAlgorithm); 00088 void PrintSelf(ostream& os, vtkIndent indent); 00089 00094 static vtkGenericStreamTracer *New(); 00095 00097 00100 vtkSetVector3Macro(StartPosition, double); 00101 vtkGetVector3Macro(StartPosition, double); 00103 00105 00106 void SetSource(vtkDataSet *source); 00107 vtkDataSet *GetSource(); 00109 00112 void SetSourceConnection(vtkAlgorithmOutput* algOutput); 00113 00114 int FillInputPortInformation(int port, vtkInformation* info); 00115 00116 //BTX 00117 enum Units 00118 { 00119 TIME_UNIT, 00120 LENGTH_UNIT, 00121 CELL_LENGTH_UNIT 00122 }; 00123 00124 enum Solvers 00125 { 00126 RUNGE_KUTTA2, 00127 RUNGE_KUTTA4, 00128 RUNGE_KUTTA45, 00129 NONE, 00130 UNKNOWN 00131 }; 00132 00133 enum ReasonForTermination 00134 { 00135 OUT_OF_DOMAIN = vtkInitialValueProblemSolver::OUT_OF_DOMAIN, 00136 NOT_INITIALIZED = vtkInitialValueProblemSolver::NOT_INITIALIZED , 00137 UNEXPECTED_VALUE = vtkInitialValueProblemSolver::UNEXPECTED_VALUE, 00138 OUT_OF_TIME = 4, 00139 OUT_OF_STEPS = 5, 00140 STAGNATION = 6 00141 }; 00142 //ETX 00143 00145 00151 void SetIntegrator(vtkInitialValueProblemSolver *); 00152 vtkGetObjectMacro ( Integrator, vtkInitialValueProblemSolver ); 00153 void SetIntegratorType(int type); 00154 int GetIntegratorType(); 00155 void SetIntegratorTypeToRungeKutta2() 00156 {this->SetIntegratorType(RUNGE_KUTTA2);}; 00157 void SetIntegratorTypeToRungeKutta4() 00158 {this->SetIntegratorType(RUNGE_KUTTA4);}; 00159 void SetIntegratorTypeToRungeKutta45() 00160 {this->SetIntegratorType(RUNGE_KUTTA45);}; 00162 00164 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 00252 00254 void SetIntegrationStepUnit(int unit) 00255 { 00256 this->SetInitialIntegrationStepUnit(unit); 00257 this->SetMinimumIntegrationStepUnit(unit); 00258 this->SetMaximumIntegrationStepUnit(unit); 00259 } 00261 00262 //BTX 00263 enum 00264 { 00265 FORWARD, 00266 BACKWARD, 00267 BOTH 00268 }; 00269 //ETX 00270 00272 00274 vtkSetClampMacro(IntegrationDirection, int, FORWARD, BOTH); 00275 vtkGetMacro(IntegrationDirection, int); 00276 void SetIntegrationDirectionToForward() 00277 {this->SetIntegrationDirection(FORWARD);}; 00278 void SetIntegrationDirectionToBackward() 00279 {this->SetIntegrationDirection(BACKWARD);}; 00280 void SetIntegrationDirectionToBoth() 00281 {this->SetIntegrationDirection(BOTH);}; 00283 00285 00287 vtkSetMacro(ComputeVorticity, int); 00288 vtkGetMacro(ComputeVorticity, int); 00289 vtkBooleanMacro(ComputeVorticity, int); 00291 00293 00295 vtkSetMacro(RotationScale, double); 00296 vtkGetMacro(RotationScale, double); 00298 00300 00303 vtkGetStringMacro(InputVectorsSelection); 00304 void SelectInputVectors(const char *fieldName) 00305 {this->SetInputVectorsSelection(fieldName);} 00307 00309 void AddInput(vtkGenericDataSet *in); 00310 00313 void SetInterpolatorPrototype(vtkGenericInterpolatedVelocityField* ivf); 00314 00315 protected: 00316 vtkGenericStreamTracer(); 00317 ~vtkGenericStreamTracer(); 00318 00319 // hide the superclass' AddInput() from the user and the compiler 00320 void AddInput(vtkDataObject *) 00321 { vtkErrorMacro( << "AddInput() must be called with a vtkGenericDataSet not a vtkDataObject."); }; 00322 00323 int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *); 00324 00326 00331 void CalculateVorticity(vtkGenericAdaptorCell* cell, 00332 double pcoords[3], 00333 vtkGenericAttribute *attribute, 00334 double vorticity[3]); 00336 00337 void Integrate(vtkGenericDataSet *input0, 00338 vtkPolyData* output, 00339 vtkDataArray* seedSource, 00340 vtkIdList* seedIds, 00341 vtkIntArray* integrationDirections, 00342 double lastPoint[3], 00343 vtkGenericInterpolatedVelocityField* func); 00344 void SimpleIntegrate(double seed[3], 00345 double lastPoint[3], 00346 double delt, 00347 vtkGenericInterpolatedVelocityField* func); 00348 int CheckInputs(vtkGenericInterpolatedVelocityField*& func, 00349 vtkInformationVector **inputVector); 00350 void GenerateNormals(vtkPolyData* output, double* firstNormal); 00351 00352 int GenerateNormalsInIntegrate; 00353 00354 vtkSetStringMacro(InputVectorsSelection); 00355 char *InputVectorsSelection; 00356 00357 00358 // starting from global x-y-z position 00359 double StartPosition[3]; 00360 00361 static const double EPSILON; 00362 double TerminalSpeed; 00363 00364 double LastUsedTimeStep; 00365 00366 //BTX 00367 struct IntervalInformation 00368 { 00369 double Interval; 00370 int Unit; 00371 }; 00372 00373 IntervalInformation MaximumPropagation; 00374 IntervalInformation MinimumIntegrationStep; 00375 IntervalInformation MaximumIntegrationStep; 00376 IntervalInformation InitialIntegrationStep; 00377 00378 void SetIntervalInformation(int unit, double interval, 00379 IntervalInformation& currentValues); 00380 void SetIntervalInformation(int unit,IntervalInformation& currentValues); 00381 static double ConvertToTime(IntervalInformation& interval, 00382 double cellLength, double speed); 00383 static double ConvertToLength(IntervalInformation& interval, 00384 double cellLength, double speed); 00385 static double ConvertToCellLength(IntervalInformation& interval, 00386 double cellLength, double speed); 00387 static double ConvertToUnit(IntervalInformation& interval, int unit, 00388 double cellLength, double speed); 00389 void ConvertIntervals(double& step, double& minStep, double& maxStep, 00390 int direction, double cellLength, double speed); 00391 //ETX 00392 00393 void InitializeSeeds(vtkDataArray*& seeds, 00394 vtkIdList*& seedIds, 00395 vtkIntArray*& integrationDirections); 00396 00397 int IntegrationDirection; 00398 00399 // Prototype showing the integrator type to be set by the user. 00400 vtkInitialValueProblemSolver* Integrator; 00401 00402 double MaximumError; 00403 vtkIdType MaximumNumberOfSteps; 00404 00405 int ComputeVorticity; 00406 double RotationScale; 00407 00408 vtkGenericInterpolatedVelocityField* InterpolatorPrototype; 00409 00410 private: 00411 vtkGenericStreamTracer(const vtkGenericStreamTracer&); // Not implemented. 00412 void operator=(const vtkGenericStreamTracer&); // Not implemented. 00413 }; 00414 00415 #endif