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 
00328 inline const char *vtkStreamer::GetIntegrationDirectionAsString()
00329 {
00330   if ( this->IntegrationDirection == VTK_INTEGRATE_FORWARD ) 
00331     {
00332     return "IntegrateForward";
00333     }
00334   else if ( this->IntegrationDirection == VTK_INTEGRATE_BACKWARD ) 
00335     {
00336     return "IntegrateBackward";
00337     }
00338   else 
00339     {
00340     return "IntegrateBothDirections";
00341     }
00342 }
00344 
00345 #endif