Main Page Class Hierarchy Alphabetical List Compound List File List Compound Members File Members Related Pages

# Graphics/vtkStreamer.h

Go to the documentation of this file.

    00001 /*=========================================================================
    00002
    00003   Program:   Visualization Toolkit
    00004   Module:    $RCSfile: vtkStreamer.h,v $
    00005   Language:  C++
    00006
    00007   Copyright (c) 1993-2002 Ken Martin, Will Schroeder, Bill Lorensen
    00008   All rights reserved.
    00009   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
    00010
    00011      This software is distributed WITHOUT ANY WARRANTY; without even
    00012      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
    00013      PURPOSE.  See the above copyright notice for more information.
    00014
    00015 =========================================================================*/
    00070 #ifndef __vtkStreamer_h
    00071 #define __vtkStreamer_h
    00072
    00073 #include "vtkDataSetToPolyDataFilter.h"
    00074
    00075 class vtkInitialValueProblemSolver;
    00076 class vtkMultiThreader;
    00077
    00078 #define VTK_INTEGRATE_FORWARD 0
    00079 #define VTK_INTEGRATE_BACKWARD 1
    00080 #define VTK_INTEGRATE_BOTH_DIRECTIONS 2
    00081
    00082 class VTK_GRAPHICS_EXPORT vtkStreamer : public vtkDataSetToPolyDataFilter
    00083 {
    00084 public:
    00085   vtkTypeRevisionMacro(vtkStreamer,vtkDataSetToPolyDataFilter);
    00086   void PrintSelf(ostream& os, vtkIndent indent);
    00087
    00091   void SetStartLocation(vtkIdType cellId, int subId, float pcoords[3]);
    00092
    00094
    00097   void SetStartLocation(vtkIdType cellId, int subId, float r, float s,
    00098                         float t);
    00100
    00103   vtkIdType GetStartLocation(int& subId, float pcoords[3]);
    00104
    00108   void SetStartPosition(float x[3]);
    00109
    00113   void SetStartPosition(float x, float y, float z);
    00114
    00116   float *GetStartPosition();
    00117
    00119
    00120   void SetSource(vtkDataSet *source);
    00121   vtkDataSet *GetSource();
    00123
    00125
    00126   vtkSetClampMacro(MaximumPropagationTime,float,0.0,VTK_LARGE_FLOAT);
    00127   vtkGetMacro(MaximumPropagationTime,float);
    00129
    00131
    00132   vtkSetClampMacro(IntegrationDirection,int,
    00133                    VTK_INTEGRATE_FORWARD,VTK_INTEGRATE_BOTH_DIRECTIONS);
    00134   vtkGetMacro(IntegrationDirection,int);
    00135   void SetIntegrationDirectionToForward()
    00136     {this->SetIntegrationDirection(VTK_INTEGRATE_FORWARD);};
    00137   void SetIntegrationDirectionToBackward()
    00138     {this->SetIntegrationDirection(VTK_INTEGRATE_BACKWARD);};
    00139   void SetIntegrationDirectionToIntegrateBothDirections()
    00140     {this->SetIntegrationDirection(VTK_INTEGRATE_BOTH_DIRECTIONS);};
    00141   const char *GetIntegrationDirectionAsString();
    00143
    00145
    00147   vtkSetClampMacro(IntegrationStepLength,float,0.0000001,VTK_LARGE_FLOAT);
    00148   vtkGetMacro(IntegrationStepLength,float);
    00150
    00152
    00154   vtkSetMacro(SpeedScalars,int);
    00155   vtkGetMacro(SpeedScalars,int);
    00156   vtkBooleanMacro(SpeedScalars,int);
    00158
    00160
    00165   vtkSetMacro(OrientationScalars, int);
    00166   vtkGetMacro(OrientationScalars, int);
    00167   vtkBooleanMacro(OrientationScalars, int);
    00169
    00171
    00173   vtkSetClampMacro(TerminalSpeed,float,0.0,VTK_LARGE_FLOAT);
    00174   vtkGetMacro(TerminalSpeed,float);
    00176
    00178
    00183   vtkSetMacro(Vorticity,int);
    00184   vtkGetMacro(Vorticity,int);
    00185   vtkBooleanMacro(Vorticity,int);
    00187
    00188   vtkSetMacro( NumberOfThreads, int );
    00189   vtkGetMacro( NumberOfThreads, int );
    00190
    00191   vtkSetMacro( SavePointInterval, float );
    00192   vtkGetMacro( SavePointInterval, float );
    00193
    00195
    00199   void SetIntegrator(vtkInitialValueProblemSolver *);
    00200   vtkGetObjectMacro ( Integrator, vtkInitialValueProblemSolver );
    00202
    00203 protected:
    00205
    00208   vtkStreamer();
    00209   ~vtkStreamer();
    00211
    00212   // Integrate data
    00213   void Integrate();
    00214
    00215   // Special method for computing streamer vorticity
    00216   void ComputeVorticity();
    00217
    00218   // Controls where streamlines start from (either position or location).
    00219   int StartFrom;
    00220
    00221   // Starting from cell location
    00222   vtkIdType StartCell;
    00223   int StartSubId;
    00224   float StartPCoords[3];
    00225
    00226   // starting from global x-y-z position
    00227   float StartPosition[3];
    00228
    00229   //
    00230   // Special classes for manipulating data
    00231   //
    00232   //BTX - begin tcl exclude
    00233   //
    00234   class StreamPoint {
    00235   public:
    00236     float   x[3];    // position
    00237     vtkIdType     cellId;  // cell
    00238     int     subId;   // cell sub id
    00239     float   p[3];    // parametric coords in cell
    00240     float   v[3];    // velocity
    00241     float   speed;   // velocity norm
    00242     float   s;       // scalar value
    00243     float   t;       // time travelled so far
    00244     float   d;       // distance travelled so far
    00245     float   omega;   // stream vorticity, if computed
    00246     float   theta;    // rotation angle, if vorticity is computed
    00247   };
    00248
    00249   class StreamArray;
    00250   friend class StreamArray;
    00251   class StreamArray { //;prevent man page generation
    00252   public:
    00253     StreamArray();
    00254     ~StreamArray()
    00255       {
    00256         if (this->Array)
    00257           {
    00258           delete [] this->Array;
    00259           }
    00260       };
    00261     vtkIdType GetNumberOfPoints() {return this->MaxId + 1;};
    00262     StreamPoint *GetStreamPoint(vtkIdType i) {return this->Array + i;};
    00263     vtkIdType InsertNextStreamPoint()
    00264       {
    00265         if ( ++this->MaxId >= this->Size )
    00266           {
    00267           this->Resize(this->MaxId);
    00268           }
    00269         return this->MaxId; //return offset from array
    00270       }
    00271     StreamPoint *Resize(vtkIdType sz); //reallocates data
    00272     void Reset() {this->MaxId = -1;};
    00273
    00274     StreamPoint *Array;  // pointer to data
    00275     vtkIdType MaxId;        // maximum index inserted thus far
    00276     vtkIdType Size;         // allocated size of data
    00277     vtkIdType Extend;       // grow array by this amount
    00278     float Direction;        // integration direction
    00279   };
    00280   //ETX
    00281   //
    00282
    00283   //array of streamers
    00284   StreamArray *Streamers;
    00285   vtkIdType NumberOfStreamers;
    00286
    00287   // length of Streamer is generated by time, or by MaximumSteps
    00288   float MaximumPropagationTime;
    00289
    00290   // integration direction
    00291   int IntegrationDirection;
    00292
    00293   // the length (fraction of cell size) of integration steps
    00294   float IntegrationStepLength;
    00295
    00296   // boolean controls whether vorticity is computed
    00297   int Vorticity;
    00298
    00299   // terminal propagation speed
    00300   float TerminalSpeed;
    00301
    00302   // boolean controls whether data scalars or velocity magnitude are used
    00303   int SpeedScalars;
    00304
    00305   // boolean controls whether data scalars or vorticity orientation are used
    00306   int OrientationScalars;
    00307
    00308   // Prototype showing the integrator type to be set by the user.
    00309   vtkInitialValueProblemSolver* Integrator;
    00310
    00311   // Interval with which the stream points will be stored.
    00312   // Useful in reducing the memory footprint. Since the initial
    00313   // value is small, by default, it will store all/most points.
    00314   float SavePointInterval;
    00315
    00316   static  VTK_THREAD_RETURN_TYPE ThreadedIntegrate( void *arg );
    00317
    00319
    00321   vtkGetMacro( NumberOfStreamers, int );
    00322   StreamArray *GetStreamers() { return this->Streamers; };
    00324
    00325   void InitializeThreadedIntegrate();
    00326   vtkMultiThreader           *Threader;
    00327   int                        NumberOfThreads;
    00328
    00329 private:
    00330   vtkStreamer(const vtkStreamer&);  // Not implemented.
    00331   void operator=(const vtkStreamer&);  // Not implemented.
    00332 };
    00333
    00335 inline const char *vtkStreamer::GetIntegrationDirectionAsString(void)
    00336 {
    00337   if ( this->IntegrationDirection == VTK_INTEGRATE_FORWARD )
    00338     {
    00339     return "IntegrateForward";
    00340     }
    00341   else if ( this->IntegrationDirection == VTK_INTEGRATE_BACKWARD )
    00342     {
    00343     return "IntegrateBackward";
    00344     }
    00345   else
    00346     {
    00347     return "IntegrateBothDirections";
    00348     }
    00349 }
    00350
    00351 #endif
    00352
    00353