00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00052 #ifndef __vtkStreamer_h
00053 #define __vtkStreamer_h
00054
00055 #include "vtkPolyDataAlgorithm.h"
00056
00057 class vtkInitialValueProblemSolver;
00058 class vtkMultiThreader;
00059
00060 #define VTK_INTEGRATE_FORWARD 0
00061 #define VTK_INTEGRATE_BACKWARD 1
00062 #define VTK_INTEGRATE_BOTH_DIRECTIONS 2
00063
00064 class VTK_GRAPHICS_EXPORT vtkStreamer : public vtkPolyDataAlgorithm
00065 {
00066 public:
00067 vtkTypeMacro(vtkStreamer,vtkPolyDataAlgorithm);
00068 void PrintSelf(ostream& os, vtkIndent indent);
00069
00073 void SetStartLocation(vtkIdType cellId, int subId, double pcoords[3]);
00074
00076
00079 void SetStartLocation(vtkIdType cellId, int subId, double r, double s,
00080 double t);
00082
00085 vtkIdType GetStartLocation(int& subId, double pcoords[3]);
00086
00090 void SetStartPosition(double x[3]);
00091
00095 void SetStartPosition(double x, double y, double z);
00096
00098 double *GetStartPosition();
00099
00101
00102 void SetSource(vtkDataSet *source);
00103 vtkDataSet *GetSource();
00105
00107
00108 vtkSetClampMacro(MaximumPropagationTime,double,0.0,VTK_DOUBLE_MAX);
00109 vtkGetMacro(MaximumPropagationTime,double);
00111
00113
00114 vtkSetClampMacro(IntegrationDirection,int,
00115 VTK_INTEGRATE_FORWARD,VTK_INTEGRATE_BOTH_DIRECTIONS);
00116 vtkGetMacro(IntegrationDirection,int);
00117 void SetIntegrationDirectionToForward()
00118 {this->SetIntegrationDirection(VTK_INTEGRATE_FORWARD);};
00119 void SetIntegrationDirectionToBackward()
00120 {this->SetIntegrationDirection(VTK_INTEGRATE_BACKWARD);};
00121 void SetIntegrationDirectionToIntegrateBothDirections()
00122 {this->SetIntegrationDirection(VTK_INTEGRATE_BOTH_DIRECTIONS);};
00123 const char *GetIntegrationDirectionAsString();
00125
00127
00129 vtkSetClampMacro(IntegrationStepLength,double,0.0000001,VTK_DOUBLE_MAX);
00130 vtkGetMacro(IntegrationStepLength,double);
00132
00134
00136 vtkSetMacro(SpeedScalars,int);
00137 vtkGetMacro(SpeedScalars,int);
00138 vtkBooleanMacro(SpeedScalars,int);
00140
00142
00147 vtkSetMacro(OrientationScalars, int);
00148 vtkGetMacro(OrientationScalars, int);
00149 vtkBooleanMacro(OrientationScalars, int);
00151
00153
00155 vtkSetClampMacro(TerminalSpeed,double,0.0,VTK_DOUBLE_MAX);
00156 vtkGetMacro(TerminalSpeed,double);
00158
00160
00165 vtkSetMacro(Vorticity,int);
00166 vtkGetMacro(Vorticity,int);
00167 vtkBooleanMacro(Vorticity,int);
00169
00170 vtkSetMacro( NumberOfThreads, int );
00171 vtkGetMacro( NumberOfThreads, int );
00172
00173 vtkSetMacro( SavePointInterval, double );
00174 vtkGetMacro( SavePointInterval, double );
00175
00177
00181 void SetIntegrator(vtkInitialValueProblemSolver *);
00182 vtkGetObjectMacro ( Integrator, vtkInitialValueProblemSolver );
00184
00186
00188 vtkSetMacro(Epsilon,double);
00189 vtkGetMacro(Epsilon,double);
00191
00192 protected:
00194
00197 vtkStreamer();
00198 ~vtkStreamer();
00200
00201
00202 void Integrate(vtkDataSet *input, vtkDataSet *source);
00203
00204
00205 int StartFrom;
00206
00207
00208 vtkIdType StartCell;
00209 int StartSubId;
00210 double StartPCoords[3];
00211
00212
00213 double StartPosition[3];
00214
00215
00216
00217
00218
00219
00220 class StreamPoint {
00221 public:
00222 double x[3];
00223 vtkIdType cellId;
00224 int subId;
00225 double p[3];
00226 double v[3];
00227 double speed;
00228 double s;
00229 double t;
00230 double d;
00231 double omega;
00232 double theta;
00233 };
00234
00235 class StreamArray;
00236 friend class StreamArray;
00237 class StreamArray {
00238 public:
00239 StreamArray();
00240 ~StreamArray()
00241 {
00242 if (this->Array)
00243 {
00244 delete [] this->Array;
00245 }
00246 };
00247 vtkIdType GetNumberOfPoints() {return this->MaxId + 1;};
00248 StreamPoint *GetStreamPoint(vtkIdType i) {return this->Array + i;};
00249 vtkIdType InsertNextStreamPoint()
00250 {
00251 if ( ++this->MaxId >= this->Size )
00252 {
00253 this->Resize(this->MaxId);
00254 }
00255 return this->MaxId;
00256 }
00257 StreamPoint *Resize(vtkIdType sz);
00258 void Reset() {this->MaxId = -1;};
00259
00260 StreamPoint *Array;
00261 vtkIdType MaxId;
00262 vtkIdType Size;
00263 vtkIdType Extend;
00264 double Direction;
00265 };
00266
00267
00268
00269
00270 StreamArray *Streamers;
00271 vtkIdType NumberOfStreamers;
00272
00273
00274 double MaximumPropagationTime;
00275
00276
00277 int IntegrationDirection;
00278
00279
00280 double IntegrationStepLength;
00281
00282
00283 int Vorticity;
00284
00285
00286 double TerminalSpeed;
00287
00288
00289 int SpeedScalars;
00290
00291
00292 int OrientationScalars;
00293
00294
00295 vtkInitialValueProblemSolver* Integrator;
00296
00297
00298
00299 double Epsilon;
00300
00301
00302
00303
00304 double SavePointInterval;
00305
00306 static VTK_THREAD_RETURN_TYPE ThreadedIntegrate( void *arg );
00307
00309
00311 vtkGetMacro( NumberOfStreamers, vtkIdType );
00312 StreamArray *GetStreamers() { return this->Streamers; };
00314
00315 void InitializeThreadedIntegrate();
00316 vtkMultiThreader *Threader;
00317 int NumberOfThreads;
00318
00319 virtual int FillInputPortInformation(int port, vtkInformation *info);
00320
00321 private:
00322 vtkStreamer(const vtkStreamer&);
00323 void operator=(const vtkStreamer&);
00324 };
00325
00327 inline const char *vtkStreamer::GetIntegrationDirectionAsString()
00328 {
00329 if ( this->IntegrationDirection == VTK_INTEGRATE_FORWARD )
00330 {
00331 return "IntegrateForward";
00332 }
00333 else if ( this->IntegrationDirection == VTK_INTEGRATE_BACKWARD )
00334 {
00335 return "IntegrateBackward";
00336 }
00337 else
00338 {
00339 return "IntegrateBothDirections";
00340 }
00341 }
00342
00343 #endif