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 vtkTypeRevisionMacro(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
00185 protected:
00187
00190 vtkStreamer();
00191 ~vtkStreamer();
00193
00194
00195 void Integrate(vtkDataSet *input, vtkDataSet *source);
00196
00197
00198 int StartFrom;
00199
00200
00201 vtkIdType StartCell;
00202 int StartSubId;
00203 double StartPCoords[3];
00204
00205
00206 double StartPosition[3];
00207
00208
00209
00210
00211
00212
00213 class StreamPoint {
00214 public:
00215 double x[3];
00216 vtkIdType cellId;
00217 int subId;
00218 double p[3];
00219 double v[3];
00220 double speed;
00221 double s;
00222 double t;
00223 double d;
00224 double omega;
00225 double theta;
00226 };
00227
00228 class StreamArray;
00229 friend class StreamArray;
00230 class StreamArray {
00231 public:
00232 StreamArray();
00233 ~StreamArray()
00234 {
00235 if (this->Array)
00236 {
00237 delete [] this->Array;
00238 }
00239 };
00240 vtkIdType GetNumberOfPoints() {return this->MaxId + 1;};
00241 StreamPoint *GetStreamPoint(vtkIdType i) {return this->Array + i;};
00242 vtkIdType InsertNextStreamPoint()
00243 {
00244 if ( ++this->MaxId >= this->Size )
00245 {
00246 this->Resize(this->MaxId);
00247 }
00248 return this->MaxId;
00249 }
00250 StreamPoint *Resize(vtkIdType sz);
00251 void Reset() {this->MaxId = -1;};
00252
00253 StreamPoint *Array;
00254 vtkIdType MaxId;
00255 vtkIdType Size;
00256 vtkIdType Extend;
00257 double Direction;
00258 };
00259
00260
00261
00262
00263 StreamArray *Streamers;
00264 vtkIdType NumberOfStreamers;
00265
00266
00267 double MaximumPropagationTime;
00268
00269
00270 int IntegrationDirection;
00271
00272
00273 double IntegrationStepLength;
00274
00275
00276 int Vorticity;
00277
00278
00279 double TerminalSpeed;
00280
00281
00282 int SpeedScalars;
00283
00284
00285 int OrientationScalars;
00286
00287
00288 vtkInitialValueProblemSolver* Integrator;
00289
00290
00291
00292
00293 double SavePointInterval;
00294
00295 static VTK_THREAD_RETURN_TYPE ThreadedIntegrate( void *arg );
00296
00298
00300 vtkGetMacro( NumberOfStreamers, int );
00301 StreamArray *GetStreamers() { return this->Streamers; };
00303
00304 void InitializeThreadedIntegrate();
00305 vtkMultiThreader *Threader;
00306 int NumberOfThreads;
00307
00308 virtual int FillInputPortInformation(int port, vtkInformation *info);
00309
00310 private:
00311 vtkStreamer(const vtkStreamer&);
00312 void operator=(const vtkStreamer&);
00313 };
00314
00316 inline const char *vtkStreamer::GetIntegrationDirectionAsString()
00317 {
00318 if ( this->IntegrationDirection == VTK_INTEGRATE_FORWARD )
00319 {
00320 return "IntegrateForward";
00321 }
00322 else if ( this->IntegrationDirection == VTK_INTEGRATE_BACKWARD )
00323 {
00324 return "IntegrateBackward";
00325 }
00326 else
00327 {
00328 return "IntegrateBothDirections";
00329 }
00330 }
00331
00332 #endif