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.

147 lines
4.3 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkCGNSFileSeriesReader.h
Copyright (c) Kitware, Inc.
All rights reserved.
See Copyright.txt or http://www.paraview.org/HTML/Copyright.html 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 vtkCGNSFileSeriesReader
* @brief Adds support for reading temporal or partitioned CGNS files.
*
* vtkCGNSFileSeriesReader is a meta-reader that add support for reading
* CGNS file series using vtkCGNSReader. We encounter two types of file series
* with CGNS:
* \li 1. temporal file series - where each file is simply a single timestep.
* \li 2. partitioned file series - where each file corresponds to data dumped
* out from a rank but has all timesteps.
*
* vtkCGNSFileSeriesReader determines the nature of the file series
* encountered and reads the files accordingly. For partitioned files, the
* files are distributed among data-processing ranks, while for temporal file
* series, blocks are distributed among data-processing ranks (using logic in
* vtkCGNSReader itself).
*
* @sa vtkFileSeriesHelper
*/
#ifndef vtkCGNSFileSeriesReader_h
#define vtkCGNSFileSeriesReader_h
#include "vtkMultiBlockDataSetAlgorithm.h"
#include "vtkNew.h" // for vtkNew.
#include <string> // for std::string
#include <vector> // for std::vector
class vtkCGNSReader;
class vtkCGNSSubsetInclusionLattice;
class vtkFileSeriesHelper;
class vtkMultiProcessController;
class vtkCGNSFileSeriesReader : public vtkMultiBlockDataSetAlgorithm
{
public:
static vtkCGNSFileSeriesReader* New();
vtkTypeMacro(vtkCGNSFileSeriesReader, vtkMultiBlockDataSetAlgorithm);
void PrintSelf(ostream& os, vtkIndent indent) override;
///@{
/**
* Get/Set the controller.
*/
void SetController(vtkMultiProcessController* controller);
vtkGetObjectMacro(Controller, vtkMultiProcessController);
///@}
///@{
/**
* Get/Set the reader.
*/
virtual void SetReader(vtkCGNSReader* reader);
vtkGetObjectMacro(Reader, vtkCGNSReader);
///@}
/**
* Test a file for readability. Ensure that vtkCGNSFileSeriesReader::SetReader
* is called before using this method.
*/
int CanReadFile(const char* filename);
///@{
/**
* Add/remove files names in the file series.
*/
void AddFileName(const char* fname);
void RemoveAllFileNames();
///@}
///@{
/**
* If true, then treat file series like it does not contain any time step
* values. False by default.
*/
vtkGetMacro(IgnoreReaderTime, bool);
vtkSetMacro(IgnoreReaderTime, bool);
vtkBooleanMacro(IgnoreReaderTime, bool);
///@}
/**
* Returns the filename being used for current timesteps.
* This is only reasonable for temporal file series. For a partitioned file
* series, this will return the filename being used on the current rank.
*/
const char* GetCurrentFileName() const;
/**
* Overridden to setup the `Reader` and then forward the pass to the reader.
*/
int ProcessRequest(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
protected:
vtkCGNSFileSeriesReader();
~vtkCGNSFileSeriesReader() override;
/**
* Handles the RequestData pass.
*/
int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
/**
* Update `this->ActiveFiles`, a collection of files to be read to satisfy the
* current request.
*
* @returns false if the update failed for some reason, otherwise true.
*/
bool UpdateActiveFileSet(vtkInformation* info);
/**
* Select the file from `this->ActiveFiles` at the given index and set that on
* `this->Reader`.
*/
void ChooseActiveFile(int index);
vtkNew<vtkFileSeriesHelper> FileSeriesHelper;
vtkCGNSReader* Reader;
bool IgnoreReaderTime;
private:
vtkCGNSFileSeriesReader(const vtkCGNSFileSeriesReader&) = delete;
void operator=(const vtkCGNSFileSeriesReader&) = delete;
void OnReaderModifiedEvent();
vtkMultiProcessController* Controller;
unsigned long ReaderObserverId;
bool InProcessRequest;
std::vector<std::string> ActiveFiles;
};
#endif