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.

454 lines
13 KiB
C

/*=========================================================================
Program: Visualization Toolkit
Module: vtkOpenFOAMReader.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 vtkOpenFOAMReader
* @brief reads a dataset in OpenFOAM format
*
* vtkOpenFOAMReader creates a multiblock dataset. It reads mesh
* information and time dependent data. The polyMesh folders contain
* mesh information. The time folders contain transient data for the
* cells. Each folder can contain any number of data files.
*
* @par Thanks:
* Thanks to Terry Jordan of SAIC at the National Energy
* Technology Laboratory who developed this class.
* Please address all comments to Terry Jordan (terry.jordan@sa.netl.doe.gov).
* GUI Based selection of mesh regions and fields available in the case,
* minor bug fixes, strict memory allocation checks,
* minor performance enhancements by Philippose Rajan (sarith@rocketmail.com).
*
* Token-based FoamFile format lexer/parser,
* performance/stability/compatibility enhancements, gzipped file
* support, lagrangian field support, variable timestep support,
* builtin cell-to-point filter, pointField support, polyhedron
* decomposition support, OF 1.5 extended format support, multiregion
* support, old mesh format support, parallelization support for
* decomposed cases in conjunction with vtkPOpenFOAMReader, et. al. by
* Takuya Oshima of Niigata University, Japan (oshima@eng.niigata-u.ac.jp).
*
* Misc cleanup, bugfixes, improvements
* Mark Olesen (OpenCFD Ltd.)
*/
#ifndef vtkOpenFOAMReader_h
#define vtkOpenFOAMReader_h
#include "vtkIOGeometryModule.h" // For export macro
#include "vtkMultiBlockDataSetAlgorithm.h"
class vtkCollection;
class vtkCharArray;
class vtkDataArraySelection;
class vtkDoubleArray;
class vtkStdString;
class vtkStringArray;
class vtkOpenFOAMReaderPrivate;
class VTKIOGEOMETRY_EXPORT vtkOpenFOAMReader : public vtkMultiBlockDataSetAlgorithm
{
public:
static vtkOpenFOAMReader* New();
vtkTypeMacro(vtkOpenFOAMReader, vtkMultiBlockDataSetAlgorithm);
void PrintSelf(ostream&, vtkIndent) override;
/**
* Determine if the file can be read with this reader.
*/
int CanReadFile(const char*);
//@{
/**
* Set/Get the filename.
*/
vtkSetStringMacro(FileName);
vtkGetStringMacro(FileName);
//@}
/**
* Get the number of cell arrays available in the input.
*/
int GetNumberOfCellArrays(void)
{
return this->GetNumberOfSelectionArrays(this->CellDataArraySelection);
}
/**
* Get/Set whether the cell array with the given name is to
* be read.
*/
int GetCellArrayStatus(const char* name)
{
return this->GetSelectionArrayStatus(this->CellDataArraySelection, name);
}
void SetCellArrayStatus(const char* name, int status)
{
this->SetSelectionArrayStatus(this->CellDataArraySelection, name, status);
}
/**
* Get the name of the cell array with the given index in
* the input.
*/
const char* GetCellArrayName(int index)
{
return this->GetSelectionArrayName(this->CellDataArraySelection, index);
}
/**
* Turn on/off all cell arrays.
*/
void DisableAllCellArrays() { this->DisableAllSelectionArrays(this->CellDataArraySelection); }
void EnableAllCellArrays() { this->EnableAllSelectionArrays(this->CellDataArraySelection); }
/**
* Get the number of point arrays available in the input.
*/
int GetNumberOfPointArrays(void)
{
return this->GetNumberOfSelectionArrays(this->PointDataArraySelection);
}
/**
* Get/Set whether the point array with the given name is to
* be read.
*/
int GetPointArrayStatus(const char* name)
{
return this->GetSelectionArrayStatus(this->PointDataArraySelection, name);
}
void SetPointArrayStatus(const char* name, int status)
{
this->SetSelectionArrayStatus(this->PointDataArraySelection, name, status);
}
/**
* Get the name of the point array with the given index in
* the input.
*/
const char* GetPointArrayName(int index)
{
return this->GetSelectionArrayName(this->PointDataArraySelection, index);
}
/**
* Turn on/off all point arrays.
*/
void DisableAllPointArrays() { this->DisableAllSelectionArrays(this->PointDataArraySelection); }
void EnableAllPointArrays() { this->EnableAllSelectionArrays(this->PointDataArraySelection); }
/**
* Get the number of Lagrangian arrays available in the input.
*/
int GetNumberOfLagrangianArrays(void)
{
return this->GetNumberOfSelectionArrays(this->LagrangianDataArraySelection);
}
/**
* Get/Set whether the Lagrangian array with the given name is to
* be read.
*/
int GetLagrangianArrayStatus(const char* name)
{
return this->GetSelectionArrayStatus(this->LagrangianDataArraySelection, name);
}
void SetLagrangianArrayStatus(const char* name, int status)
{
this->SetSelectionArrayStatus(this->LagrangianDataArraySelection, name, status);
}
/**
* Get the name of the Lagrangian array with the given index in
* the input.
*/
const char* GetLagrangianArrayName(int index)
{
return this->GetSelectionArrayName(this->LagrangianDataArraySelection, index);
}
/**
* Turn on/off all Lagrangian arrays.
*/
void DisableAllLagrangianArrays()
{
this->DisableAllSelectionArrays(this->LagrangianDataArraySelection);
}
void EnableAllLagrangianArrays()
{
this->EnableAllSelectionArrays(this->LagrangianDataArraySelection);
}
/**
* Get the number of Patches (including Internal Mesh) available in the input.
*/
int GetNumberOfPatchArrays(void)
{
return this->GetNumberOfSelectionArrays(this->PatchDataArraySelection);
}
/**
* Get/Set whether the Patch with the given name is to
* be read.
*/
int GetPatchArrayStatus(const char* name)
{
return this->GetSelectionArrayStatus(this->PatchDataArraySelection, name);
}
void SetPatchArrayStatus(const char* name, int status)
{
this->SetSelectionArrayStatus(this->PatchDataArraySelection, name, status);
}
/**
* Get the name of the Patch with the given index in
* the input.
*/
const char* GetPatchArrayName(int index)
{
return this->GetSelectionArrayName(this->PatchDataArraySelection, index);
}
/**
* Turn on/off all Patches including the Internal Mesh.
*/
void DisableAllPatchArrays() { this->DisableAllSelectionArrays(this->PatchDataArraySelection); }
void EnableAllPatchArrays() { this->EnableAllSelectionArrays(this->PatchDataArraySelection); }
//@{
/**
* Set/Get whether to create cell-to-point translated data for cell-type data
*/
vtkSetMacro(CreateCellToPoint, vtkTypeBool);
vtkGetMacro(CreateCellToPoint, vtkTypeBool);
vtkBooleanMacro(CreateCellToPoint, vtkTypeBool);
//@}
//@{
/**
* Set/Get whether mesh is to be cached.
*/
vtkSetMacro(CacheMesh, vtkTypeBool);
vtkGetMacro(CacheMesh, vtkTypeBool);
vtkBooleanMacro(CacheMesh, vtkTypeBool);
//@}
//@{
/**
* Set/Get whether polyhedra are to be decomposed.
*/
vtkSetMacro(DecomposePolyhedra, vtkTypeBool);
vtkGetMacro(DecomposePolyhedra, vtkTypeBool);
vtkBooleanMacro(DecomposePolyhedra, vtkTypeBool);
//@}
// Option for reading old binary lagrangian/positions format
//@{
/**
* Set/Get whether the lagrangian/positions have additional data or not.
* For historical reasons, PositionsIsIn13Format is used to denote that
* the positions only have x,y,z value and the cell of the enclosing cell.
* In OpenFOAM 1.4-2.4, positions included facei and stepFraction information.
*/
vtkSetMacro(PositionsIsIn13Format, vtkTypeBool);
vtkGetMacro(PositionsIsIn13Format, vtkTypeBool);
vtkBooleanMacro(PositionsIsIn13Format, vtkTypeBool);
//@}
//@{
/**
* Ignore 0/ time directory, which is normally missing Lagrangian fields
* and may have many dictionary functionality that we cannot easily handle.
*/
vtkSetMacro(SkipZeroTime, bool);
vtkGetMacro(SkipZeroTime, bool);
vtkBooleanMacro(SkipZeroTime, bool);
//@}
//@{
/**
* Determine if time directories are to be listed according to controlDict
*/
vtkSetMacro(ListTimeStepsByControlDict, vtkTypeBool);
vtkGetMacro(ListTimeStepsByControlDict, vtkTypeBool);
vtkBooleanMacro(ListTimeStepsByControlDict, vtkTypeBool);
//@}
//@{
/**
* Add dimensions to array names
*/
vtkSetMacro(AddDimensionsToArrayNames, vtkTypeBool);
vtkGetMacro(AddDimensionsToArrayNames, vtkTypeBool);
vtkBooleanMacro(AddDimensionsToArrayNames, vtkTypeBool);
//@}
//@{
/**
* Set/Get whether zones will be read.
*/
vtkSetMacro(ReadZones, vtkTypeBool);
vtkGetMacro(ReadZones, vtkTypeBool);
vtkBooleanMacro(ReadZones, vtkTypeBool);
//@}
//@{
/**
* If true, labels are expected to be 64-bit, rather than 32.
*/
virtual void SetUse64BitLabels(bool val);
vtkGetMacro(Use64BitLabels, bool);
vtkBooleanMacro(Use64BitLabels, bool);
//@}
//@{
/**
* If true, data of the internal mesh are copied to the cell zones.
* Default is false.
*/
vtkGetMacro(CopyDataToCellZones, bool);
vtkSetMacro(CopyDataToCellZones, bool);
vtkBooleanMacro(CopyDataToCellZones, bool);
//@}
//@{
/**
* If true, floats are expected to be 64-bit, rather than 32. Note that
* vtkFloatArrays may still be used in the output if this is true. This flag
* is only used to ensure that binary data is correctly parsed.
*/
virtual void SetUse64BitFloats(bool val);
vtkGetMacro(Use64BitFloats, bool);
vtkBooleanMacro(Use64BitFloats, bool);
//@}
void SetRefresh()
{
this->Refresh = true;
this->Modified();
}
void SetParent(vtkOpenFOAMReader* parent) { this->Parent = parent; }
int MakeInformationVector(vtkInformationVector*, const vtkStdString&);
bool SetTimeValue(const double);
vtkDoubleArray* GetTimeValues();
int MakeMetaDataAtTimeStep(const bool);
friend class vtkOpenFOAMReaderPrivate;
protected:
// refresh flag
bool Refresh;
// for creating cell-to-point translated data
vtkTypeBool CreateCellToPoint;
// for caching mesh
vtkTypeBool CacheMesh;
// for decomposing polyhedra on-the-fly
vtkTypeBool DecomposePolyhedra;
// for lagrangian/positions without extra data (OF 1.4 - 2.4)
vtkTypeBool PositionsIsIn13Format;
// for reading point/face/cell-Zones
vtkTypeBool ReadZones;
// Ignore 0/ directory
bool SkipZeroTime;
// determine if time directories are listed according to controlDict
vtkTypeBool ListTimeStepsByControlDict;
// add dimensions to array names
vtkTypeBool AddDimensionsToArrayNames;
// Expect label size to be 64-bit integers instead of 32-bit.
bool Use64BitLabels;
// Expect float data to be 64-bit floats instead of 32-bit.
// Note that vtkFloatArrays may still be used -- this just tells the reader how to
// parse the binary data.
bool Use64BitFloats;
// The data of internal mesh are copied to cell zones
bool CopyDataToCellZones;
char* FileName;
vtkCharArray* CasePath;
vtkCollection* Readers;
// DataArraySelection for Patch / Region Data
vtkDataArraySelection* PatchDataArraySelection;
vtkDataArraySelection* CellDataArraySelection;
vtkDataArraySelection* PointDataArraySelection;
vtkDataArraySelection* LagrangianDataArraySelection;
// old selection status
vtkMTimeType PatchSelectionMTimeOld;
vtkMTimeType CellSelectionMTimeOld;
vtkMTimeType PointSelectionMTimeOld;
vtkMTimeType LagrangianSelectionMTimeOld;
// preserved old information
vtkStdString* FileNameOld;
bool SkipZeroTimeOld;
int ListTimeStepsByControlDictOld;
int CreateCellToPointOld;
int DecomposePolyhedraOld;
int PositionsIsIn13FormatOld;
int AddDimensionsToArrayNamesOld;
int ReadZonesOld;
bool Use64BitLabelsOld;
bool Use64BitFloatsOld;
// paths to Lagrangians
vtkStringArray* LagrangianPaths;
// number of reader instances
int NumberOfReaders;
// index of the active reader
int CurrentReaderIndex;
vtkOpenFOAMReader();
~vtkOpenFOAMReader() override;
int RequestInformation(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
void CreateCasePath(vtkStdString&, vtkStdString&);
void SetTimeInformation(vtkInformationVector*, vtkDoubleArray*);
void CreateCharArrayFromString(vtkCharArray*, const char*, vtkStdString&);
void UpdateStatus();
void UpdateProgress(double);
private:
vtkOpenFOAMReader* Parent;
vtkOpenFOAMReader(const vtkOpenFOAMReader&) = delete;
void operator=(const vtkOpenFOAMReader&) = delete;
int GetNumberOfSelectionArrays(vtkDataArraySelection*);
int GetSelectionArrayStatus(vtkDataArraySelection*, const char*);
void SetSelectionArrayStatus(vtkDataArraySelection*, const char*, int);
const char* GetSelectionArrayName(vtkDataArraySelection*, int);
void DisableAllSelectionArrays(vtkDataArraySelection*);
void EnableAllSelectionArrays(vtkDataArraySelection*);
void AddSelectionNames(vtkDataArraySelection*, vtkStringArray*);
};
#endif