00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00026 #ifndef __vtkTemporalStreamTracer_h
00027 #define __vtkTemporalStreamTracer_h
00028
00029 #include "vtkSmartPointer.h"
00030 #include "vtkStreamTracer.h"
00031
00032
00033 #include <vtkstd/vector>
00034 #include <vtkstd/list>
00035
00036
00037 class vtkMultiProcessController;
00038
00039 class vtkCompositeDataSet;
00040 class vtkDataArray;
00041 class vtkDoubleArray;
00042 class vtkGenericCell;
00043 class vtkIntArray;
00044 class vtkTemporalInterpolatedVelocityField;
00045 class vtkPoints;
00046 class vtkCellArray;
00047 class vtkDoubleArray;
00048 class vtkFloatArray;
00049 class vtkIntArray;
00050 class vtkAbstractParticleWriter;
00051
00052
00053 namespace vtkTemporalStreamTracerNamespace
00054 {
00055 typedef struct { double x[4]; } Position;
00056 typedef struct {
00057
00058 int Counter;
00059 int Index;
00060 bool Wrap;
00061 Position CurrentPosition;
00062 int CachedDataSet[2];
00063 vtkIdType CachedCellId[2];
00064
00065 int SourceID;
00066 int InjectedPointId;
00067 float UniqueParticleId;
00068
00069 float rotation;
00070 float angularVel;
00071 float time;
00072 } ParticleInformation;
00073
00074 typedef vtkstd::vector<ParticleInformation> ParticleList;
00075 typedef vtkstd::list<ParticleInformation> ParticleDataList;
00076 typedef ParticleDataList::iterator ParticleIterator;
00077
00078 class vtkTemporalStreamTracerInternals {
00079 public:
00080 };
00081 };
00082
00083
00084
00085 class VTK_PARALLEL_EXPORT vtkTemporalStreamTracer : public vtkStreamTracer
00086 {
00087 public:
00088
00089 vtkTypeRevisionMacro(vtkTemporalStreamTracer,vtkStreamTracer);
00090 void PrintSelf(ostream& os, vtkIndent indent);
00091
00093 static vtkTemporalStreamTracer *New();
00094
00096
00099 vtkSetMacro(TimeStep,unsigned int);
00100 vtkGetMacro(TimeStep,unsigned int);
00102
00104
00106 vtkSetMacro(IgnorePipelineTime, int);
00107 vtkGetMacro(IgnorePipelineTime, int);
00108 vtkBooleanMacro(IgnorePipelineTime, int);
00110
00112
00117 vtkSetMacro(TimeStepResolution,double);
00118 vtkGetMacro(TimeStepResolution,double);
00120
00122
00129 vtkSetMacro(ForceReinjectionEveryNSteps,int);
00130 vtkGetMacro(ForceReinjectionEveryNSteps,int);
00132
00134
00138 void SetSource2(vtkDataSet *source);
00139 vtkDataSet *GetSource2();
00141
00146 void SetSource2Connection(vtkAlgorithmOutput* algOutput);
00147
00149
00157 vtkSetMacro(EnableSource1,int);
00158 vtkGetMacro(EnableSource1,int);
00159 vtkBooleanMacro(EnableSource1,int);
00160 vtkSetMacro(EnableSource2,int);
00161 vtkGetMacro(EnableSource2,int);
00162 vtkBooleanMacro(EnableSource2,int);
00164
00166
00170 virtual void SetController(vtkMultiProcessController* controller);
00171 vtkGetObjectMacro(Controller, vtkMultiProcessController);
00173
00175
00179 virtual void SetParticleWriter(vtkAbstractParticleWriter *pw);
00180 vtkGetObjectMacro(ParticleWriter, vtkAbstractParticleWriter);
00182
00184
00186 vtkSetStringMacro(ParticleFileName);
00187 vtkGetStringMacro(ParticleFileName);
00189
00191
00193 vtkSetMacro(EnableParticleWriting,int);
00194 vtkGetMacro(EnableParticleWriting,int);
00195 vtkBooleanMacro(EnableParticleWriting,int);
00197
00198 protected:
00199
00200 vtkTemporalStreamTracer();
00201 ~vtkTemporalStreamTracer();
00202
00203
00204
00205
00206 virtual int FillInputPortInformation(int port, vtkInformation* info);
00207
00208
00209
00210
00211 virtual int ProcessRequest(vtkInformation* request,
00212 vtkInformationVector** inputVector,
00213 vtkInformationVector* outputVector);
00214
00215
00216
00217
00218
00219 virtual int RequestInformation(vtkInformation* request,
00220 vtkInformationVector** inputVector,
00221 vtkInformationVector* outputVector);
00222
00223
00224
00225
00226 virtual int RequestUpdateExtent(vtkInformation* request,
00227 vtkInformationVector** inputVector,
00228 vtkInformationVector* outputVector);
00229
00230
00231
00232
00233 virtual int RequestData(vtkInformation* request,
00234 vtkInformationVector** inputVector,
00235 vtkInformationVector* outputVector);
00236
00237
00238 int InitializeInterpolator();
00239 int SetupInputs(vtkInformation* inInfo, vtkInformation* outInfo);
00240
00241
00242
00243
00245
00247 void InjectSeeds(vtkDataSet *source, int sourceID, int injectionID,
00248 vtkTemporalStreamTracerNamespace::ParticleList *inputlist,
00249 vtkTemporalStreamTracerNamespace::ParticleList &candidates, vtkTemporalStreamTracerNamespace::ParticleList *outofdomain);
00251
00252 void UpdateSeeds(vtkTemporalStreamTracerNamespace::ParticleList &candidates);
00253
00254 void TransmitReceiveParticles(
00255 vtkTemporalStreamTracerNamespace::ParticleList &outofdomain, vtkTemporalStreamTracerNamespace::ParticleList &received, bool removeself);
00256
00257 void IntegrateParticle(
00258 vtkTemporalStreamTracerNamespace::ParticleIterator &it,
00259 double currenttime, double terminationtime,
00260 vtkInitialValueProblemSolver* integrator);
00261
00262 void GenerateOutputLines(vtkPolyData *output);
00263 bool DoParticleSendTasks(vtkTemporalStreamTracerNamespace::ParticleInformation &info, double point1[4], double velocity[3], double delT);
00264 bool DoParticleSendTasks(vtkTemporalStreamTracerNamespace::ParticleInformation &info, double point1[4], double delT);
00265 bool ComputeDomainExitLocation(
00266 double pos[4], double p2[4], double intersection[4],
00267 vtkGenericCell *cell);
00268 void AddParticleToMPISendList(vtkTemporalStreamTracerNamespace::ParticleInformation &info);
00269
00270
00271
00272
00273
00274 int UpdatePiece;
00275 int UpdateNumPieces;
00276
00277
00278 int EnableSource1;
00279 int EnableSource2;
00280
00281
00282 int AllFixedGeometry;
00283 int NoFixedGeometry;
00284
00285
00286 int MaxCellSize;
00287
00288
00289 unsigned int TimeStep;
00290 unsigned int ActualTimeStep;
00291 unsigned int NumberOfInputTimeSteps;
00292
00293 vtkstd::vector<double> InputTimeValues;
00294 vtkstd::vector<double> OutputTimeValues;
00295
00296
00297 double EarliestTime;
00298 double CurrentTimeSteps[2];
00299 double TimeStepResolution;
00300 int ForceReinjectionEveryNSteps;
00301 bool ReinjectionFlag;
00302 int ReinjectionCounter;
00303 int IgnorePipelineTime;
00304
00305 vtkAbstractParticleWriter *ParticleWriter;
00306 char *ParticleFileName;
00307 int EnableParticleWriting;
00308
00309 vtkTimeStamp ParticleInjectionTime;
00310 vtkTimeStamp SeedInjectionTime;
00311
00312
00313 unsigned int NumberOfParticles;
00314 vtkTemporalStreamTracerNamespace::ParticleDataList ParticleHistories;
00315
00316
00317
00318 vtkSmartPointer<vtkPoints> OutputCoordinates;
00319 vtkSmartPointer<vtkCellArray> ParticleCells;
00320
00321
00322
00323 vtkSmartPointer<vtkIntArray> ParticleIds;
00324 vtkSmartPointer<vtkIntArray> ParticleSourceIds;
00325 vtkSmartPointer<vtkIntArray> InjectedPointIds;
00326 vtkSmartPointer<vtkDoubleArray> cellVectors;
00327 vtkSmartPointer<vtkFloatArray> ParticleTime;
00328 vtkSmartPointer<vtkFloatArray> ParticleVorticity;
00329 vtkSmartPointer<vtkFloatArray> ParticleRotation;
00330 vtkSmartPointer<vtkFloatArray> ParticleAngularVel;
00331 vtkSmartPointer<vtkPointData> OutputPointData;
00332 vtkSmartPointer<vtkPointData> OutputPointDataT1;
00333 vtkSmartPointer<vtkPointData> OutputPointDataT2;
00334
00335 vtkTemporalStreamTracerNamespace::ParticleList MPISendList;
00336
00337 vtkSmartPointer<vtkTemporalInterpolatedVelocityField> Interpolator;
00338 vtkCompositeDataSet *InputDataT[2];
00339 vtkDataSet *DataReferenceT[2];
00340
00341
00342 typedef struct {
00343 double b[6];
00344 } bounds;
00345 vtkstd::vector<bounds> CachedBounds[2];
00346 vtkstd::vector<bool> GeometryFixed[2];
00347
00348 bool InsideBounds(double point[]);
00349
00350
00351
00352
00353 vtkMultiProcessController* Controller;
00354 static vtkIdType UniqueIdCounter;
00355
00356 private:
00358 void SetInterpolatorPrototype(vtkInterpolatedVelocityField*) {};
00359
00360 private:
00361 vtkTemporalStreamTracer(const vtkTemporalStreamTracer&);
00362 void operator=(const vtkTemporalStreamTracer&);
00363 };
00364
00365
00366 #endif
00367
00368