1 /*========================================================================= 2 3 Program: Visualization Toolkit 4 Module: vtkPLagrangianParticleTracker.h 5 6 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen 7 All rights reserved. 8 See Copyright.txt or http://www.kitware.com/Copyright.htm for details. 9 10 This software is distributed WITHOUT ANY WARRANTY; without even 11 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 12 PURPOSE. See the above copyright notice for more information. 13 14 =========================================================================*/ 15 /** 16 * @class vtkPLagrangianParticleTracker 17 * @brief parallel Lagrangian particle tracker 18 * 19 * This class implements parallel Lagrangian particle tracker. 20 * The implementation is as follows: 21 * First seeds input is parsed to create particle in each rank 22 * Particles which are not contained by the flow in a rank are sent to other ranks 23 * which can potentially contain it and will grab only if they actually contain it 24 * Then each rank begin integrating. 25 * When a particle goes out of domain, the particle will be sent to other ranks 26 * the same way. 27 * When a rank runs out of particle, it waits for other potentiel particles 28 * from other ranks. 29 * When all ranks run out of particles, integration is over. 30 * The master rank takes care of communications between rank regarding integration termination 31 * particles are directly streamed rank to rank, without going through the master 32 * 33 * @sa 34 * vtkStreamTracer 35 */ 36 37 #ifndef vtkPLagrangianParticleTracker_h 38 #define vtkPLagrangianParticleTracker_h 39 40 #include "vtkFiltersParallelFlowPathsModule.h" // For export macro 41 #include "vtkLagrangianParticleTracker.h" 42 #include "vtkSmartPointer.h" // for ivars 43 44 class MasterFlagManager; 45 class ParticleStreamManager; 46 class RankFlagManager; 47 class vtkMPIController; 48 class vtkMultiBlockDataSet; 49 class vtkUnstructuredGrid; 50 51 class VTKFILTERSPARALLELFLOWPATHS_EXPORT vtkPLagrangianParticleTracker : 52 public vtkLagrangianParticleTracker 53 { 54 public: 55 vtkTypeMacro(vtkPLagrangianParticleTracker, vtkLagrangianParticleTracker); 56 virtual void PrintSelf(ostream& os, vtkIndent indent) override; 57 static vtkPLagrangianParticleTracker* New(); 58 59 protected: 60 vtkPLagrangianParticleTracker(); 61 ~vtkPLagrangianParticleTracker(); 62 63 virtual int RequestUpdateExtent(vtkInformation *, vtkInformationVector **, 64 vtkInformationVector *) override; 65 66 void GenerateParticles(const vtkBoundingBox* bounds, vtkDataSet* seeds, 67 vtkDataArray* initialVelocities, vtkDataArray* initialIntegrationTimes, 68 vtkPointData* seedData, int nVar, std::queue<vtkLagrangianParticle*>& particles) override; 69 70 /** 71 * Flags description : 72 * Worker flag working : the worker has at least one particle in it's queue and 73 is currently integrating it. 74 * Worker flag empty : the worker has no more particle in it's queue and is 75 activelly waiting for more particle to integrate from other ranks. 76 * Worker flag finished : the worker has received a master empty flag and after 77 checking one last time, still doesn't have any particle to integrate. It is 78 now just waiting for master to send the master finished flag. 79 * Master flag working : there is at least one worker or the master that have one 80 or more particle to integrate. 81 * Master flag empty : all ranks, including master, have no more particles to integrate 82 * Master flag finished : all workers ranks have sent the worker flag finished 83 */ 84 virtual void GetParticleFeed(std::queue<vtkLagrangianParticle*>& particleQueue) override; 85 virtual int Integrate(vtkLagrangianParticle*, std::queue<vtkLagrangianParticle*>& particleQueue, 86 vtkPolyData* particlePathsOutput, vtkIdList* particlePathPointId, 87 vtkDataObject* interactionOutput) override; 88 89 void SendParticle(vtkLagrangianParticle* particle); 90 void ReceiveParticles(std::queue<vtkLagrangianParticle*>& particleQueue); 91 92 bool FinalizeOutputs(vtkPolyData* particlePathsOutput, 93 vtkDataObject* interractionOutput) override; 94 95 bool CheckParticlePathsRenderingThreshold(vtkPolyData* particlePathsOutput) override; 96 97 bool UpdateSurfaceCacheIfNeeded(vtkDataObject*& surfaces) override; 98 99 /** 100 * Get an unique id for a particle 101 */ 102 virtual vtkIdType GetNewParticleId() override; 103 104 //@{ 105 /** 106 * Get the complete number of created particles 107 */ 108 vtkGetMacro(ParticleCounter, vtkIdType); 109 //@} 110 111 vtkSmartPointer<vtkUnstructuredGrid> TmpSurfaceInput; 112 vtkSmartPointer<vtkMultiBlockDataSet> TmpSurfaceInputMB; 113 vtkMPIController* Controller; 114 ParticleStreamManager* StreamManager; 115 MasterFlagManager* MFlagManager; 116 RankFlagManager* RFlagManager; 117 118 private: 119 vtkPLagrangianParticleTracker(const vtkPLagrangianParticleTracker&) = delete; // Not implemented. 120 void operator=(const vtkPLagrangianParticleTracker&) = delete; // Not implemented. 121 }; 122 #endif 123