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