Commit 8f68f6c1 authored by Andrew Bauer's avatar Andrew Bauer Committed by Kitware Robot

Merge topic 'particlepath_cleanup'

585a7c9e Particle path improvements intended for in situ processing.
Acked-by: Kitware Robot's avatarKitware Robot <kwrobot@kitware.com>
Reviewed-by: Berk Geveci's avatarBerk Geveci <berk.geveci@kitware.com>
Merge-request: !654
parents 0295dfbf 585a7c9e
/*========================================================================= /*=========================================================================
Program: Visualization Toolkit Program: Visualization Toolkit
Module: vtkParticlePathFilter.cxx Module: vtkParticlePathFilter.cxx
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved. All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details. See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information. PURPOSE. See the above copyright notice for more information.
=========================================================================*/ =========================================================================*/
#include "vtkParticlePathFilter.h" #include "vtkParticlePathFilter.h"
...@@ -35,6 +35,7 @@ void ParticlePathFilterInternal::Initialize(vtkParticleTracerBase* filter) ...@@ -35,6 +35,7 @@ void ParticlePathFilterInternal::Initialize(vtkParticleTracerBase* filter)
this->Filter = filter; this->Filter = filter;
this->Filter->SetForceReinjectionEveryNSteps(0); this->Filter->SetForceReinjectionEveryNSteps(0);
this->Filter->SetIgnorePipelineTime(1); this->Filter->SetIgnorePipelineTime(1);
this->ClearCache = false;
} }
void ParticlePathFilterInternal::Reset() void ParticlePathFilterInternal::Reset()
...@@ -43,15 +44,15 @@ void ParticlePathFilterInternal::Reset() ...@@ -43,15 +44,15 @@ void ParticlePathFilterInternal::Reset()
this->Paths.clear(); this->Paths.clear();
} }
int ParticlePathFilterInternal::OutputParticles(vtkPolyData* particles, bool clearCache) int ParticlePathFilterInternal::OutputParticles(vtkPolyData* particles)
{ {
if(!this->Filter->Output || clearCache) if(!this->Filter->Output || this->ClearCache)
{ {
this->Filter->Output = vtkSmartPointer<vtkPolyData>::New(); this->Filter->Output = vtkSmartPointer<vtkPolyData>::New();
this->Filter->Output->SetPoints(vtkSmartPointer<vtkPoints>::New()); this->Filter->Output->SetPoints(vtkSmartPointer<vtkPoints>::New());
this->Filter->Output->GetPointData()->CopyAllocate(particles->GetPointData()); this->Filter->Output->GetPointData()->CopyAllocate(particles->GetPointData());
} }
if(clearCache) if(this->ClearCache)
{ // clear cache no matter what { // clear cache no matter what
this->Paths.clear(); this->Paths.clear();
} }
...@@ -137,7 +138,6 @@ vtkParticlePathFilter::vtkParticlePathFilter() ...@@ -137,7 +138,6 @@ vtkParticlePathFilter::vtkParticlePathFilter()
this->It.Initialize(this); this->It.Initialize(this);
this->SimulationTime = NULL; this->SimulationTime = NULL;
this->SimulationTimeStep = NULL; this->SimulationTimeStep = NULL;
this->ClearCache = false;
} }
vtkParticlePathFilter::~vtkParticlePathFilter() vtkParticlePathFilter::~vtkParticlePathFilter()
...@@ -163,12 +163,11 @@ void vtkParticlePathFilter::ResetCache() ...@@ -163,12 +163,11 @@ void vtkParticlePathFilter::ResetCache()
void vtkParticlePathFilter::PrintSelf(ostream& os, vtkIndent indent) void vtkParticlePathFilter::PrintSelf(ostream& os, vtkIndent indent)
{ {
Superclass::PrintSelf(os,indent); Superclass::PrintSelf(os,indent);
os << indent << "ClearCache: " << this->ClearCache << endl;
} }
int vtkParticlePathFilter::OutputParticles(vtkPolyData* particles) int vtkParticlePathFilter::OutputParticles(vtkPolyData* particles)
{ {
return this->It.OutputParticles(particles, this->ClearCache); return this->It.OutputParticles(particles);
} }
void vtkParticlePathFilter::InitializeExtraPointDataArrays(vtkPointData* outputPD) void vtkParticlePathFilter::InitializeExtraPointDataArrays(vtkPointData* outputPD)
......
...@@ -35,13 +35,24 @@ public: ...@@ -35,13 +35,24 @@ public:
ParticlePathFilterInternal():Filter(NULL){} ParticlePathFilterInternal():Filter(NULL){}
void Initialize(vtkParticleTracerBase* filter); void Initialize(vtkParticleTracerBase* filter);
virtual ~ParticlePathFilterInternal(){} virtual ~ParticlePathFilterInternal(){}
virtual int OutputParticles(vtkPolyData* poly, bool clearCache); virtual int OutputParticles(vtkPolyData* poly);
void SetClearCache(bool clearCache)
{
this->ClearCache = clearCache;
}
bool GetClearCache()
{
return this->ClearCache;
}
void Finalize(); void Finalize();
void Reset(); void Reset();
private: private:
vtkParticleTracerBase* Filter; vtkParticleTracerBase* Filter;
// Paths doesn't seem to work properly. it is meant to make connecting lines
// for the particles
std::vector<vtkSmartPointer<vtkIdList> > Paths; std::vector<vtkSmartPointer<vtkIdList> > Paths;
bool ClearCache; // false by default
}; };
class VTKFILTERSFLOWPATHS_EXPORT vtkParticlePathFilter: public vtkParticleTracerBase class VTKFILTERSFLOWPATHS_EXPORT vtkParticlePathFilter: public vtkParticleTracerBase
...@@ -52,12 +63,6 @@ public: ...@@ -52,12 +63,6 @@ public:
static vtkParticlePathFilter *New(); static vtkParticlePathFilter *New();
// Description:
// Set/get whether or not to clear out cache of previous time steps.
// Default value is false. Clearing the cache is aimed towards in situ use.
vtkSetMacro(ClearCache, bool);
vtkGetMacro(ClearCache, bool);
protected: protected:
vtkParticlePathFilter(); vtkParticlePathFilter();
~vtkParticlePathFilter(); ~vtkParticlePathFilter();
...@@ -76,9 +81,6 @@ protected: ...@@ -76,9 +81,6 @@ protected:
private: private:
vtkDoubleArray* SimulationTime; vtkDoubleArray* SimulationTime;
vtkIntArray* SimulationTimeStep; vtkIntArray* SimulationTimeStep;
bool ClearCache;
}; };
#endif #endif
...@@ -320,6 +320,12 @@ int vtkParticleTracerBase::RequestUpdateExtent( ...@@ -320,6 +320,12 @@ int vtkParticleTracerBase::RequestUpdateExtent(
for(int i=0; i<this->GetNumberOfInputPorts(); i++) for(int i=0; i<this->GetNumberOfInputPorts(); i++)
{ {
vtkInformation* info = this->GetInputPortInformation(i);
if(info->Get(vtkAlgorithm::INPUT_IS_OPTIONAL()) &&
this->GetNumberOfInputConnections(i) == 0)
{
continue;
}
vtkAlgorithm* inputAlgorithm = this->GetInputAlgorithm(i,0); vtkAlgorithm* inputAlgorithm = this->GetInputAlgorithm(i,0);
vtkStreamingDemandDrivenPipeline* sddp = vtkStreamingDemandDrivenPipeline::SafeDownCast(inputAlgorithm->GetExecutive()); vtkStreamingDemandDrivenPipeline* sddp = vtkStreamingDemandDrivenPipeline::SafeDownCast(inputAlgorithm->GetExecutive());
if(sddp) if(sddp)
...@@ -474,6 +480,23 @@ int vtkParticleTracerBase::InitializeInterpolator() ...@@ -474,6 +480,23 @@ int vtkParticleTracerBase::InitializeInterpolator()
return VTK_OK; return VTK_OK;
} }
//---------------------------------------------------------------------------
std::vector<vtkDataSet*> vtkParticleTracerBase::GetSeedSources(
vtkInformationVector* inputVector, int vtkNotUsed(timeStep))
{
int numSources = inputVector->GetNumberOfInformationObjects();
std::vector<vtkDataSet*> seedSources;
for (int idx=0; idx<numSources; ++idx)
{
if(vtkInformation *inInfo = inputVector->GetInformationObject(idx))
{
vtkDataObject* dobj = inInfo->Get(vtkDataObject::DATA_OBJECT());
seedSources.push_back(vtkDataSet::SafeDownCast(dobj));
}
}
return seedSources;
}
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
int vtkParticleTracerBase::UpdateDataCache(vtkDataObject *data) int vtkParticleTracerBase::UpdateDataCache(vtkDataObject *data)
{ {
...@@ -653,8 +676,6 @@ void vtkParticleTracerBase::AssignSeedsToProcessors( ...@@ -653,8 +676,6 @@ void vtkParticleTracerBase::AssignSeedsToProcessors(
// Assign unique identifiers taking into account uneven distribution // Assign unique identifiers taking into account uneven distribution
// across processes and seeds which were rejected // across processes and seeds which were rejected
this->AssignUniqueIds(localSeedPoints); this->AssignUniqueIds(localSeedPoints);
//
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
...@@ -776,23 +797,10 @@ vtkPolyData* vtkParticleTracerBase::Execute(vtkInformationVector** inputVector) ...@@ -776,23 +797,10 @@ vtkPolyData* vtkParticleTracerBase::Execute(vtkInformationVector** inputVector)
output->SetVerts(this->ParticleCells); output->SetVerts(this->ParticleCells);
vtkDebugMacro(<< "Finished allocating point arrays "); vtkDebugMacro(<< "Finished allocating point arrays ");
///
// How many Seed point sources are connected? // How many Seed point sources are connected?
// Copy the sources into a vector for later use // Copy the sources into a vector for later use
//
int numSources = inputVector[1]->GetNumberOfInformationObjects(); std::vector<vtkDataSet*> seedSources = this->GetSeedSources(inputVector[1], this->CurrentTimeStep);
std::vector<vtkDataSet*> seedSources;
for (int idx=0; idx<numSources; ++idx)
{
vtkDataObject *dobj = 0;
vtkInformation *inInfo = inputVector[1]->GetInformationObject(idx);
if (inInfo)
{
dobj = inInfo->Get(vtkDataObject::DATA_OBJECT());
seedSources.push_back(vtkDataSet::SafeDownCast(dobj));
}
}
// //
// Setup some variables // Setup some variables
...@@ -814,6 +822,8 @@ vtkPolyData* vtkParticleTracerBase::Execute(vtkInformationVector** inputVector) ...@@ -814,6 +822,8 @@ vtkPolyData* vtkParticleTracerBase::Execute(vtkInformationVector** inputVector)
this->LocalSeeds.clear(); this->LocalSeeds.clear();
} }
this->AddRestartSeeds(inputVector);
for (size_t i=0; i<seedSources.size(); i++) for (size_t i=0; i<seedSources.size(); i++)
{ {
this->AssignSeedsToProcessors(this->CurrentTimeValue,seedSources[i], static_cast<int>(i), this->AssignSeedsToProcessors(this->CurrentTimeValue,seedSources[i], static_cast<int>(i),
......
...@@ -218,7 +218,7 @@ public: ...@@ -218,7 +218,7 @@ public:
vtkBooleanMacro(DisableResetCache,int); vtkBooleanMacro(DisableResetCache,int);
// Description: // Description:
// Provide support for multiple see sources // Provide support for multiple seed sources
void AddSourceConnection(vtkAlgorithmOutput* input); void AddSourceConnection(vtkAlgorithmOutput* input);
void RemoveAllSources(); void RemoveAllSources();
...@@ -236,7 +236,6 @@ public: ...@@ -236,7 +236,6 @@ public:
int IgnorePipelineTime; //whether to use the pipeline time for termination int IgnorePipelineTime; //whether to use the pipeline time for termination
int DisableResetCache; //whether to enable ResetCache() method int DisableResetCache; //whether to enable ResetCache() method
vtkParticleTracerBase(); vtkParticleTracerBase();
virtual ~vtkParticleTracerBase(); virtual ~vtkParticleTracerBase();
...@@ -292,6 +291,11 @@ public: ...@@ -292,6 +291,11 @@ public:
virtual int OutputParticles(vtkPolyData* poly)=0; //every iteration virtual int OutputParticles(vtkPolyData* poly)=0; //every iteration
virtual void Finalize(){} //the last iteration virtual void Finalize(){} //the last iteration
// Description:
// Method to get the data set seed sources.
// For in situ we want to override how the seed sources are made available.
virtual std::vector<vtkDataSet*> GetSeedSources(vtkInformationVector* inputVector, int timeStep);
// //
// Initialization of input (vector-field) geometry // Initialization of input (vector-field) geometry
// //
...@@ -314,8 +318,8 @@ public: ...@@ -314,8 +318,8 @@ public:
// they belong to. This saves us retesting at every injection time // they belong to. This saves us retesting at every injection time
// providing 1) The volumes are static, 2) the seed points are static // providing 1) The volumes are static, 2) the seed points are static
// If either are non static, then this step is skipped. // If either are non static, then this step is skipped.
virtual void AssignSeedsToProcessors(double time, virtual void AssignSeedsToProcessors(
vtkDataSet *source, int sourceID, int ptId, double time, vtkDataSet *source, int sourceID, int ptId,
vtkParticleTracerBaseNamespace::ParticleVector &localSeedPoints, vtkParticleTracerBaseNamespace::ParticleVector &localSeedPoints,
int &localAssignedCount); int &localAssignedCount);
...@@ -411,7 +415,13 @@ public: ...@@ -411,7 +415,13 @@ public:
virtual void AppendToExtraPointDataArrays(vtkParticleTracerBaseNamespace::ParticleInformation &) {} virtual void AppendToExtraPointDataArrays(vtkParticleTracerBaseNamespace::ParticleInformation &) {}
vtkTemporalInterpolatedVelocityField* GetInterpolator(); vtkTemporalInterpolatedVelocityField* GetInterpolator();
private:
// Description:
// For restarts of particle paths, we add in the ability to add in
// particles from a previous computation that we will still advect.
virtual void AddRestartSeeds(vtkInformationVector** /*inputVector*/) {}
private:
// Description: // Description:
// Hide this because we require a new interpolator type // Hide this because we require a new interpolator type
void SetInterpolatorPrototype(vtkAbstractInterpolatedVelocityField*) {} void SetInterpolatorPrototype(vtkAbstractInterpolatedVelocityField*) {}
...@@ -509,7 +519,6 @@ private: ...@@ -509,7 +519,6 @@ private:
friend class StreaklineFilterInternal; friend class StreaklineFilterInternal;
static const double Epsilon; static const double Epsilon;
}; };
#endif #endif
/*========================================================================= /*=========================================================================
Program: Visualization Toolkit Program: Visualization Toolkit
Module: vtkPParticlePathFilter.cxx Module: vtkPParticlePathFilter.cxx
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved. All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details. See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information. PURPOSE. See the above copyright notice for more information.
=========================================================================*/ =========================================================================*/
#include "vtkPParticlePathFilter.h" #include "vtkPParticlePathFilter.h"
#include "vtkObjectFactory.h"
#include "vtkPointData.h" #include "vtkPointData.h"
#include "vtkCellArray.h" #include "vtkCellArray.h"
#include "vtkCharArray.h" #include "vtkCharArray.h"
...@@ -21,6 +21,7 @@ PURPOSE. See the above copyright notice for more information. ...@@ -21,6 +21,7 @@ PURPOSE. See the above copyright notice for more information.
#include "vtkDoubleArray.h" #include "vtkDoubleArray.h"
#include "vtkFloatArray.h" #include "vtkFloatArray.h"
#include "vtkNew.h" #include "vtkNew.h"
#include "vtkObjectFactory.h"
#include <cassert> #include <cassert>
vtkStandardNewMacro(vtkPParticlePathFilter); vtkStandardNewMacro(vtkPParticlePathFilter);
...@@ -30,7 +31,6 @@ vtkPParticlePathFilter::vtkPParticlePathFilter() ...@@ -30,7 +31,6 @@ vtkPParticlePathFilter::vtkPParticlePathFilter()
this->It.Initialize(this); this->It.Initialize(this);
this->SimulationTime = NULL; this->SimulationTime = NULL;
this->SimulationTimeStep = NULL; this->SimulationTimeStep = NULL;
this->ClearCache = false;
} }
vtkPParticlePathFilter::~vtkPParticlePathFilter() vtkPParticlePathFilter::~vtkPParticlePathFilter()
...@@ -55,7 +55,6 @@ void vtkPParticlePathFilter::ResetCache() ...@@ -55,7 +55,6 @@ void vtkPParticlePathFilter::ResetCache()
void vtkPParticlePathFilter::PrintSelf(ostream& os, vtkIndent indent) void vtkPParticlePathFilter::PrintSelf(ostream& os, vtkIndent indent)
{ {
Superclass::PrintSelf(os,indent); Superclass::PrintSelf(os,indent);
os << indent << "ClearCache: " << this->ClearCache << endl;
} }
int vtkPParticlePathFilter::OutputParticles(vtkPolyData* particles) int vtkPParticlePathFilter::OutputParticles(vtkPolyData* particles)
...@@ -101,8 +100,9 @@ int vtkPParticlePathFilter::OutputParticles(vtkPolyData* particles) ...@@ -101,8 +100,9 @@ int vtkPParticlePathFilter::OutputParticles(vtkPolyData* particles)
} }
} }
this->It.OutputParticles(tailPoly.GetPointer(), this->ClearCache); this->It.OutputParticles(tailPoly.GetPointer());
return this->It.OutputParticles(particles, false); // we've already cleared cache in the first call
return this->It.OutputParticles(particles); // we've already cleared cache in the first call
} }
void vtkPParticlePathFilter::InitializeExtraPointDataArrays(vtkPointData* outputPD) void vtkPParticlePathFilter::InitializeExtraPointDataArrays(vtkPointData* outputPD)
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
// .NAME vtkPParticlePathFilter - A Parallel Particle tracer for unsteady vector fields // .NAME vtkPParticlePathFilter - A Parallel Particle tracer for unsteady vector fields
// .SECTION Description // .SECTION Description
// vtkPParticlePathFilter is a filter that integrates a vector field to generate // vtkPParticlePathFilter is a filter that integrates a vector field to generate
// // path lines.
// //
// .SECTION See Also // .SECTION See Also
// vtkPParticlePathFilterBase has the details of the algorithms // vtkPParticlePathFilterBase has the details of the algorithms
...@@ -24,7 +24,6 @@ ...@@ -24,7 +24,6 @@
#ifndef vtkPParticlePathFilter_h #ifndef vtkPParticlePathFilter_h
#define vtkPParticlePathFilter_h #define vtkPParticlePathFilter_h
#include "vtkPParticleTracerBase.h" #include "vtkPParticleTracerBase.h"
#include "vtkParticlePathFilter.h" //for utility #include "vtkParticlePathFilter.h" //for utility
...@@ -37,12 +36,6 @@ public: ...@@ -37,12 +36,6 @@ public:
static vtkPParticlePathFilter *New(); static vtkPParticlePathFilter *New();
// Description:
// Set/get whether or not to clear out cache of previous time steps.
// Default value is false. Clearing the cache is aimed towards in situ use.
vtkSetMacro(ClearCache, bool);
vtkGetMacro(ClearCache, bool);
protected: protected:
vtkPParticlePathFilter(); vtkPParticlePathFilter();
~vtkPParticlePathFilter(); ~vtkPParticlePathFilter();
...@@ -54,15 +47,11 @@ protected: ...@@ -54,15 +47,11 @@ protected:
void Finalize(); void Finalize();
ParticlePathFilterInternal It; ParticlePathFilterInternal It;
private:
vtkPParticlePathFilter(const vtkPParticlePathFilter&); // Not implemented.
void operator=(const vtkPParticlePathFilter&); // Not implemented
vtkDoubleArray* SimulationTime; vtkDoubleArray* SimulationTime;
vtkIntArray* SimulationTimeStep; vtkIntArray* SimulationTimeStep;
bool ClearCache; private:
vtkPParticlePathFilter(const vtkPParticlePathFilter&); // Not implemented.
void operator=(const vtkPParticlePathFilter&); // Not implemented
}; };
#endif #endif
/*========================================================================= /*=========================================================================
Program: Visualization Toolkit Program: Visualization Toolkit
Module: vtkParticleTracerBase.cxx Module: vtkParticleTracerBase.cxx
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved. All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details. See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information. PURPOSE. See the above copyright notice for more information.
=========================================================================*/ =========================================================================*/
#include "vtkPParticleTracerBase.h" #include "vtkPParticleTracerBase.h"
...@@ -118,8 +118,8 @@ bool vtkPParticleTracerBase::SendParticleToAnotherProcess( ...@@ -118,8 +118,8 @@ bool vtkPParticleTracerBase::SendParticleToAnotherProcess(
info.CurrentPosition.x[3]>(this->GetCacheDataTime(1)+eps)) info.CurrentPosition.x[3]>(this->GetCacheDataTime(1)+eps))
{ {
vtkErrorMacro(<< "Unexpected time value in MPISendList - expected (" vtkErrorMacro(<< "Unexpected time value in MPISendList - expected ("
<< this->GetCacheDataTime(0) << "-" << this->GetCacheDataTime(1) << ") got " << this->GetCacheDataTime(0) << "-" << this->GetCacheDataTime(1) << ") got "
<< info.CurrentPosition.x[3]); << info.CurrentPosition.x[3]);
} }
if (this->MPISendList.capacity()<(this->MPISendList.size()+1)) if (this->MPISendList.capacity()<(this->MPISendList.size()+1))
...@@ -171,7 +171,7 @@ void vtkPParticleTracerBase::AssignSeedsToProcessors( ...@@ -171,7 +171,7 @@ void vtkPParticleTracerBase::AssignSeedsToProcessors(
info.ErrorCode = 0; info.ErrorCode = 0;
info.PointId = -1; info.PointId = -1;
info.TailPointId = -1; info.TailPointId = -1;
} }
// //
// Check all Seeds on all processors for classification // Check all Seeds on all processors for classification
// //
...@@ -248,14 +248,15 @@ void vtkPParticleTracerBase::AssignUniqueIds( ...@@ -248,14 +248,15 @@ void vtkPParticleTracerBase::AssignUniqueIds(
this->UniqueIdCounter += recvNumParticles[i]; this->UniqueIdCounter += recvNumParticles[i];
} }
} }
else { else
{
for (vtkIdType i=0; i<numParticles; i++) for (vtkIdType i=0; i<numParticles; i++)
{ {
localSeedPoints[i].UniqueParticleId = localSeedPoints[i].UniqueParticleId =
this->UniqueIdCounter + particleCountOffset + i; this->UniqueIdCounter + particleCountOffset + i;
} }
this->UniqueIdCounter += numParticles; this->UniqueIdCounter += numParticles;
} }
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
...@@ -416,6 +417,7 @@ int vtkPParticleTracerBase::RequestUpdateExtent( ...@@ -416,6 +417,7 @@ int vtkPParticleTracerBase::RequestUpdateExtent(
sourceInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_PIECES(), sourceInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_PIECES(),
1); 1);
} }