You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
235 lines
6.2 KiB
C
235 lines
6.2 KiB
C
3 weeks ago
|
/*=========================================================================
|
||
|
|
||
|
Program: Visualization Toolkit
|
||
|
Module: vtkAMRBaseParticlesReader.h
|
||
|
|
||
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
||
|
All rights reserved.
|
||
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
||
|
|
||
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
||
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||
|
PURPOSE. See the above copyright notice for more information.
|
||
|
|
||
|
=========================================================================*/
|
||
|
/**
|
||
|
* @class vtkAMRBaseParticlesReader
|
||
|
*
|
||
|
*
|
||
|
* An abstract base class that implements all the common functionality for
|
||
|
* all particle readers.
|
||
|
*/
|
||
|
|
||
|
#ifndef vtkAMRBaseParticlesReader_h
|
||
|
#define vtkAMRBaseParticlesReader_h
|
||
|
|
||
|
#include "vtkIOAMRModule.h" // For export macro
|
||
|
#include "vtkMultiBlockDataSetAlgorithm.h"
|
||
|
|
||
|
class vtkInformation;
|
||
|
class vtkInformationVector;
|
||
|
class vtkIndent;
|
||
|
class vtkMultiProcessController;
|
||
|
class vtkPolyData;
|
||
|
class vtkDataArraySelection;
|
||
|
class vtkCallbackCommand;
|
||
|
|
||
|
class VTKIOAMR_EXPORT vtkAMRBaseParticlesReader : public vtkMultiBlockDataSetAlgorithm
|
||
|
{
|
||
|
public:
|
||
|
vtkTypeMacro(vtkAMRBaseParticlesReader, vtkMultiBlockDataSetAlgorithm);
|
||
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set & Get the frequency.
|
||
|
*/
|
||
|
vtkGetMacro(Frequency, int);
|
||
|
vtkSetMacro(Frequency, int);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set & Get the multi-process controller.
|
||
|
*/
|
||
|
vtkGetMacro(Controller, vtkMultiProcessController*);
|
||
|
vtkSetMacro(Controller, vtkMultiProcessController*);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set & Get for filter location and boolean macro
|
||
|
*/
|
||
|
vtkSetMacro(FilterLocation, vtkTypeBool);
|
||
|
vtkGetMacro(FilterLocation, vtkTypeBool);
|
||
|
vtkBooleanMacro(FilterLocation, vtkTypeBool);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Get the data array selection tables used to configure which data
|
||
|
* arrays are loaded by the reader.
|
||
|
*/
|
||
|
vtkGetObjectMacro(ParticleDataArraySelection, vtkDataArraySelection);
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Get the number of particles arrays available in the input.
|
||
|
*/
|
||
|
int GetNumberOfParticleArrays();
|
||
|
|
||
|
/**
|
||
|
* Get the particle array name of the array associated with the given
|
||
|
* index.
|
||
|
*/
|
||
|
const char* GetParticleArrayName(int index);
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Get/Set whether the particle array status.
|
||
|
*/
|
||
|
int GetParticleArrayStatus(const char* name);
|
||
|
void SetParticleArrayStatus(const char* name, int status);
|
||
|
//@}
|
||
|
|
||
|
virtual void SetFileName(const char* fileName);
|
||
|
vtkGetStringMacro(FileName);
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Sets the min location
|
||
|
*/
|
||
|
inline void SetMinLocation(const double minx, const double miny, const double minz)
|
||
|
{
|
||
|
this->MinLocation[0] = minx;
|
||
|
this->MinLocation[1] = miny;
|
||
|
this->MinLocation[2] = minz;
|
||
|
}
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Sets the max location
|
||
|
*/
|
||
|
inline void SetMaxLocation(const double maxx, const double maxy, const double maxz)
|
||
|
{
|
||
|
this->MaxLocation[0] = maxx;
|
||
|
this->MaxLocation[1] = maxy;
|
||
|
this->MaxLocation[2] = maxz;
|
||
|
}
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Returns the total number of particles
|
||
|
*/
|
||
|
virtual int GetTotalNumberOfParticles() = 0;
|
||
|
|
||
|
protected:
|
||
|
vtkAMRBaseParticlesReader();
|
||
|
~vtkAMRBaseParticlesReader() override;
|
||
|
|
||
|
/**
|
||
|
* Reads the metadata, e.g., the number of blocks in the file.
|
||
|
* After the metadata is read, this->Initialized is set to true.
|
||
|
* Furthermore, to limit I/O, all concrete classes must make sure
|
||
|
* that this method returns immediately if this->Initialized is true.
|
||
|
*/
|
||
|
virtual void ReadMetaData() = 0;
|
||
|
|
||
|
/**
|
||
|
* Reads the particles corresponding to the block associated with the
|
||
|
* given supplied block index.
|
||
|
*/
|
||
|
virtual vtkPolyData* ReadParticles(const int blkIdx) = 0;
|
||
|
|
||
|
/**
|
||
|
* Filters particles by their location. If FilterLocation is ON, this
|
||
|
* method returns whether or not the particle with the supplied xyz
|
||
|
* coordinates class within the bounding box specified by the user using
|
||
|
* the SetMinLocation & SetMaxLocation.
|
||
|
*/
|
||
|
bool CheckLocation(const double x, const double y, const double z);
|
||
|
|
||
|
/**
|
||
|
* Determines whether this reader instance is running in parallel or not.
|
||
|
*/
|
||
|
bool IsParallel();
|
||
|
|
||
|
/**
|
||
|
* Determines if the block associated with the given block index belongs
|
||
|
* to the process that executes the current instance of the reader.
|
||
|
*/
|
||
|
bool IsBlockMine(const int blkIdx);
|
||
|
|
||
|
/**
|
||
|
* Given the block index, this method determines the process Id.
|
||
|
* If the reader instance is serial this method always returns 0.
|
||
|
* Otherwise, static block-cyclic-distribution is assumed and each
|
||
|
* block is assigned to a process according to blkIdx%N, where N is
|
||
|
* the total number of processes.
|
||
|
*/
|
||
|
int GetBlockProcessId(const int blkIdx);
|
||
|
|
||
|
/**
|
||
|
* Initializes the AMR Particles reader
|
||
|
* NOTE: must be called in the constructor of concrete classes.
|
||
|
*/
|
||
|
void Initialize();
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Standard Array selection variables & methods
|
||
|
*/
|
||
|
vtkDataArraySelection* ParticleDataArraySelection;
|
||
|
vtkCallbackCommand* SelectionObserver;
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Initializes the ParticleDataArraySelection object. This method
|
||
|
* only executes for an initial request in which case all arrays are
|
||
|
* deselected.
|
||
|
*/
|
||
|
void InitializeParticleDataSelections();
|
||
|
|
||
|
/**
|
||
|
* Sets up the ParticleDataArraySelection. Implemented
|
||
|
* by concrete classes.
|
||
|
*/
|
||
|
virtual void SetupParticleDataSelections() = 0;
|
||
|
|
||
|
/**
|
||
|
* Call-back registered with the SelectionObserver for selecting/deselecting
|
||
|
* particles
|
||
|
*/
|
||
|
static void SelectionModifiedCallback(
|
||
|
vtkObject* caller, unsigned long eid, void* clientdata, void* calldata);
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Standard pipeline operations
|
||
|
*/
|
||
|
int RequestData(vtkInformation* request, vtkInformationVector** inputVector,
|
||
|
vtkInformationVector* outputVector) override;
|
||
|
int FillOutputPortInformation(int port, vtkInformation* info) override;
|
||
|
//@}
|
||
|
|
||
|
int NumberOfBlocks;
|
||
|
|
||
|
vtkTypeBool FilterLocation;
|
||
|
double MinLocation[3];
|
||
|
double MaxLocation[3];
|
||
|
|
||
|
int Frequency;
|
||
|
vtkMultiProcessController* Controller;
|
||
|
|
||
|
bool InitialRequest;
|
||
|
bool Initialized;
|
||
|
char* FileName;
|
||
|
|
||
|
private:
|
||
|
vtkAMRBaseParticlesReader(const vtkAMRBaseParticlesReader&) = delete;
|
||
|
void operator=(const vtkAMRBaseParticlesReader&) = delete;
|
||
|
};
|
||
|
|
||
|
#endif /* vtkAMRBaseParticlesReader_h */
|