comac_desk_app/ThirdpartyLibs/Libs/windows-x86_64/vtk/include/vtkIOSSReader.h

613 lines
21 KiB
C
Raw Permalink Normal View History

2024-11-21 11:50:43 +08:00
/*=========================================================================
Program: Visualization Toolkit
Module: vtkIOSSReader.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.
=========================================================================*/
/*----------------------------------------------------------------------------
Copyright (c) Sandia Corporation
See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details.
----------------------------------------------------------------------------*/
/**
* @class vtkIOSSReader
* @brief Reader for IOSS (Sierra IO System)
*
* vtkIOSSReader is reader that uses the IOSS (Sierra IO System) library to
* read files. Currently, this reader support Exodus and CGNS file formats. IOSS
* imposes certain restrictions on these file formats and hence it may not be
* possible to open every Exodus or CGNS file using this reader. This is
* true especially for CGNS, more so than Exodus. In that case `vtkCGNSReader`
* may be more appropriate.
*
* @section SpecifyingFiles Specifying Files
*
* One can select a single file to read using `vtkIOSSReader::SetFileName`.
* With IOSS, however, it is not uncommon to have a collection of files named
* using standard patterns (described in Section @ref IossNamingConventions).
* To support this use-case, the reader automatically scans for additionally
* files internally. To disable this behaviour, call
* `vtkIOSSReader::ScanForRelatedFilesOff`.
*
* Alternatively, the list of files to be read can be explicitly specified using
* `vtkIOSSReader::AddFileName`. Then too, if `ScanForRelatedFiles` is `true`,
* the reader will search for related files for each of the files specified.
*
* Additionally, `FileRange` and `FileStride` may be used to limit to reading a
* subset of files.
*
* @section SelectingBlocksSets Selecting blocks and sets to read
*
* An IOSS file comprises of blocks and sets of various types. These are
* described by the enum `vtkIOSSReader::EntityType`.
*
* `vtkIOSSReader::GetEntitySelection` returns a `vtkDataArraySelection`
* instance for each of the entity types. This `vtkDataArraySelection` can be
* used to query the names for available blocks or sets and also select which
* ones to read.
*
* Typical usage is as follows:
*
* @code{.cpp}
*
* vtkNew<vtkIOSSReader> reader;
* reader->SetFileName(...);
* reader->UpdateInformation();
* reader->GetElementBlockSelection()->EnableArray("Block0");
* reader->GetEntitySelection(vtkIOSSReader::SIDESET)->DisableAllArrays();
* @endcode
*
* By default, all blocks are enabled, while all sets are disabled.
*
* In additional to selecting blocks and sets by name, if the file defines assemblies
* that organize these blocks and sets, then one can use selector expressions
* to enable blocks/sets as defined in the assemblies.
*
* A block (or set) is treated as enabled if it is either explicitly enabled using the
* block selection or implicitly enabled due to a selector specified on over the assemblies.
*
* Typical usage to select blocks by assembly alone is as follows:
*
* @code{.cpp}
* vtkNew<vtkIOSSReader> reader;
* reader->SetFileName(...);
* reader->UpdateInformation();
* reader->GetElementBlockSelection()->DisableAllArrays();
* ...
* reader->AddSelector("//Low");
* reader->AddSelector("//High");
* @endcode
*
* @section SelectingArrays Selecting arrays to read
*
* Similar to the block and set selection, arrays (or fields as IOSS refers to
* them) to read from each of the blocks or sets can be specified using the
* `vtkDataArraySelection` instance returned using
* `vtkIOSSReader::GetFieldSelection` (or one of its convenience variants).
*
* By default all arrays are enabled.
*
* @section IossNamingConventions IOSS Naming Conventions
*
* An IOSS complete dataset is referred to as a database. There can be multiple
* multiple timesteps in a single database. A single database may
* split among multiple files. When a database is split among multiple files,
* this is strictly spatial partitioning with each file storing part of the data
* for a specific partition. In this case, the files are named with suffix
* `.{NP}.{RANK}` where `{NP}` is the total number of partitions and `{RANK}`
* is the partition number. For example, if database named `can.e` is split among four
* files representing 4 partitions, it will be named as follows:
*
* @verbatim
* can.e.4.0
* can.e.4.1
* can.e.4.2
* can.e.4.3
* @endverbatim
*
* In this example, the database name is `can.e` while the `.4.[0-4]` suffix
* provides the partition information.
*
* Note, the database need not be split into multiple files. Thus, a writer may
* generate a single `can.e` file that has all the timesteps and paritions and
* still provide all information available when the database is split among
* multiple files.
*
* Multiple databases (with each stored in a single file or spatially split among files)
* can form a temporal sequence. This done by using another file naming
* convention. If the database name is followed by `-s.{RS}`, where `{RS}` is
* some number sequence), then the databases are treated as a temporal sequence
* with `{RS}` (called restart numbers) representing the temporal sequence
* order.
*
* The follow represents a temporal sequence:
*
* @verbatim
* mysimoutput.e-s.000
* mysimoutput.e-s.001
* mysimoutput.e-s.002
* @endverbatim
*
* You can use any number of digits for the restart number, but by convention
* the number used should be the same for all files. Also by convention, you can
* leave off the `-s.{RS}` suffix for the first file. The following
* sequence is internally the same as that above:
*
* @verbatim
* mysimoutput.e-s
* mysimoutput.e-s.001
* mysimoutput.e-s.002
* @endverbatim
*
* When a database in the temporal sequence is spatially split in multiple
* files, the corresponding filename is suffixed by the partition information.
* For example:
*
* @verbatim
* mysimoutput.e-s.2.0
* mysimoutput.e-s.2.1
* mysimoutput.e-s.001.2.0
* mysimoutput.e-s.001.2.1
* mysimoutput.e-s.002.2.0
* mysimoutput.e-s.002.2.1
* @endverbatim
*
* In this case, the filenames take the form `{DBNAME}-s.{RS}.{NP}.{RANK}`,
* where `{DBNAME}` is the database name, `{RS}` is the restart number,
* `{NP}` is the number of spatial partitions and `{RANK}` is the spatial partition number.
*
* @section References References
* * [Sierra IO System](http://gsjaardema.github.io/seacas/)
*/
#ifndef vtkIOSSReader_h
#define vtkIOSSReader_h
#include "vtkIOIOSSModule.h" // for export macros
#include "vtkNew.h" // for vtkNew
#include "vtkReaderAlgorithm.h"
#include <map> // for std::map
class vtkDataArraySelection;
class vtkDataAssembly;
class vtkMultiProcessController;
class vtkStringArray;
class VTKIOIOSS_EXPORT vtkIOSSReader : public vtkReaderAlgorithm
{
public:
static vtkIOSSReader* New();
vtkTypeMacro(vtkIOSSReader, vtkReaderAlgorithm);
void PrintSelf(ostream& os, vtkIndent indent) override;
///@{
/**
* API to set the filenames.
*/
void AddFileName(VTK_FILEPATH const char* fname);
void ClearFileNames();
VTK_FILEPATH const char* GetFileName(int index) const;
int GetNumberOfFileNames() const;
///@}
/**
* Set a single filename. Note, this will clear all existing filenames.
*/
void SetFileName(VTK_FILEPATH const char* fname);
///@{
/**
* Get/Set the IOSS database name to use for reading the file. If not
* specified (default), the reader will determine based on the file extension.
*/
vtkSetStringMacro(DatabaseTypeOverride);
vtkGetStringMacro(DatabaseTypeOverride);
///@}
///@{
/**
* When displacements are being applied, they are scaled by this amount. Set to 1 (default) for no
* scaling.
*/
void SetDisplacementMagnitude(double magnitude);
double GetDisplacementMagnitude();
///@}
///@{
/**
* When set to true, the reader can automatically locate and load additional
* files that are part of the collection.
*/
void SetScanForRelatedFiles(bool value);
vtkGetMacro(ScanForRelatedFiles, bool);
vtkBooleanMacro(ScanForRelatedFiles, bool);
///@}
///@{
/**
* This provides a mechanism to limit to reading to certain files in a
* spatially partitioned file-series. To just specific subset of files, one can
* always simply specify those files using `AddFileName` and then set
* `ScanForRelatedFiles` to false. Another way is to let the reader scan for all
* related files and then use `FileRange` and `FileStride` to limit which
* files are read.
*
* If the range is invalid, i.e. `FileRange[0] >= FileRange[1]`, it's assumed
* that no file-range overrides have been specified and both FileRange and
* FileStride will be ignored. When valid, only the chosen subset of files
* will be processed.
*/
vtkSetVector2Macro(FileRange, int);
vtkGetVector2Macro(FileRange, int);
vtkSetClampMacro(FileStride, int, 1, VTK_INT_MAX);
vtkGetMacro(FileStride, int);
///@}
///@{
/**
* When set to true, the reader will add a cell-data array for cells named
* 'file_id' which identifies the file number when reading spatially
* partitioned files.
*
* Default is false.
*/
vtkSetMacro(GenerateFileId, bool);
vtkGetMacro(GenerateFileId, bool);
vtkBooleanMacro(GenerateFileId, bool);
///@}
///@{
/**
* When set to true (default), the reader will read ids associated with
* elements.
*/
vtkSetMacro(ReadIds, bool);
vtkGetMacro(ReadIds, bool);
vtkBooleanMacro(ReadIds, bool);
///@}
///@{
/**
* Node related data, including point coordinates, point field data etc. is
* typically shared between all blocks and sets. By default, the reader will
* remove unused points for each block or set. To avoid this, set this flag to
* false.
*
* Default is true, unused points are removed.
*/
void SetRemoveUnusedPoints(bool);
vtkGetMacro(RemoveUnusedPoints, bool);
vtkBooleanMacro(RemoveUnusedPoints, bool);
///@}
///@{
/**
* When set to true (default), if an array named 'displacement' is present in
* the node field arrays, it will be used to transform the point coordinates.
*/
vtkSetMacro(ApplyDisplacements, bool);
vtkGetMacro(ApplyDisplacements, bool);
vtkBooleanMacro(ApplyDisplacements, bool);
///@}
///@{
/**
* When set to true (default), the reader will read global fields.
*/
vtkSetMacro(ReadGlobalFields, bool);
vtkGetMacro(ReadGlobalFields, bool);
vtkBooleanMacro(ReadGlobalFields, bool);
///@}
///@{
/**
* When set to true (default), the reader will read quality assurance and
* information fields.
*/
vtkSetMacro(ReadQAAndInformationRecords, bool);
vtkGetMacro(ReadQAAndInformationRecords, bool);
vtkBooleanMacro(ReadQAAndInformationRecords, bool);
///@}
///@{
/**
* Get/Set the controller to use when working in parallel. Initialized to
* `vtkMultiProcessController::GetGlobalController` in the constructor.
*
* The controller is used to using `ReadMetaData` stage to distribute the work
* of gathering meta-data from multiple files, if any, across ranks and then
* exchanging that information between all ranks.
*
* The actual reading of data is controlled by piece requests sent by the
* pipeline e.g. using `vtkAlgorithm::UpdatePiece`.
*/
void SetController(vtkMultiProcessController* controller);
vtkGetObjectMacro(Controller, vtkMultiProcessController);
///@}
///@{
/**
* IOSS databases support various properties that affect how the database is
* read. These properties can be set using this API. Note, it's best to call
* this before the first update to the reader since any change and the reader
* will flush all caches and close all open databases etc.
*/
void AddProperty(const char* name, int value);
void AddProperty(const char* name, double value);
void AddProperty(const char* name, void* value);
void AddProperty(const char* name, const char* value);
void RemoveProperty(const char* name);
void ClearProperties();
///@}
enum EntityType
{
NODEBLOCK,
EDGEBLOCK,
FACEBLOCK,
ELEMENTBLOCK,
STRUCTUREDBLOCK,
NODESET,
EDGESET,
FACESET,
ELEMENTSET,
SIDESET,
NUMBER_OF_ENTITY_TYPES,
BLOCK_START = NODEBLOCK,
BLOCK_END = NODESET,
SET_START = NODESET,
SET_END = NUMBER_OF_ENTITY_TYPES,
ENTITY_START = NODEBLOCK,
ENTITY_END = NUMBER_OF_ENTITY_TYPES,
};
static bool GetEntityTypeIsBlock(int type) { return (type >= BLOCK_START && type < BLOCK_END); }
static bool GetEntityTypeIsSet(int type) { return (type >= SET_START && type < SET_END); }
static const char* GetDataAssemblyNodeNameForEntityType(int type);
vtkDataArraySelection* GetEntitySelection(int type);
vtkDataArraySelection* GetNodeBlockSelection() { return this->GetEntitySelection(NODEBLOCK); }
vtkDataArraySelection* GetEdgeBlockSelection() { return this->GetEntitySelection(EDGEBLOCK); }
vtkDataArraySelection* GetFaceBlockSelection() { return this->GetEntitySelection(FACEBLOCK); }
vtkDataArraySelection* GetElementBlockSelection()
{
return this->GetEntitySelection(ELEMENTBLOCK);
}
vtkDataArraySelection* GetStructuredBlockSelection()
{
return this->GetEntitySelection(STRUCTUREDBLOCK);
}
vtkDataArraySelection* GetNodeSetSelection() { return this->GetEntitySelection(NODESET); }
vtkDataArraySelection* GetEdgeSetSelection() { return this->GetEntitySelection(EDGESET); }
vtkDataArraySelection* GetFaceSetSelection() { return this->GetEntitySelection(FACESET); }
vtkDataArraySelection* GetElementSetSelection() { return this->GetEntitySelection(ELEMENTSET); }
vtkDataArraySelection* GetSideSetSelection() { return this->GetEntitySelection(SIDESET); }
vtkDataArraySelection* GetFieldSelection(int type);
vtkDataArraySelection* GetNodeBlockFieldSelection() { return this->GetFieldSelection(NODEBLOCK); }
vtkDataArraySelection* GetEdgeBlockFieldSelection() { return this->GetFieldSelection(EDGEBLOCK); }
vtkDataArraySelection* GetFaceBlockFieldSelection() { return this->GetFieldSelection(FACEBLOCK); }
vtkDataArraySelection* GetElementBlockFieldSelection()
{
return this->GetFieldSelection(ELEMENTBLOCK);
}
vtkDataArraySelection* GetStructuredBlockFieldSelection()
{
return this->GetFieldSelection(STRUCTUREDBLOCK);
}
vtkDataArraySelection* GetNodeSetFieldSelection() { return this->GetFieldSelection(NODESET); }
vtkDataArraySelection* GetEdgeSetFieldSelection() { return this->GetFieldSelection(EDGESET); }
vtkDataArraySelection* GetFaceSetFieldSelection() { return this->GetFieldSelection(FACESET); }
vtkDataArraySelection* GetElementSetFieldSelection()
{
return this->GetFieldSelection(ELEMENTSET);
}
vtkDataArraySelection* GetSideSetFieldSelection() { return this->GetFieldSelection(SIDESET); }
void RemoveAllEntitySelections();
void RemoveAllFieldSelections();
void RemoveAllSelections()
{
this->RemoveAllEntitySelections();
this->RemoveAllFieldSelections();
}
///@{
/**
* In IOSS entity blocks/sets may have unique ids. These API provide access to
* the map between a entity name and its id, if any. Note, these are provided
* for information purposes only.
*/
const std::map<std::string, vtkTypeInt64>& GetEntityIdMap(int type) const;
const std::map<std::string, vtkTypeInt64>& GetNodeBlockIdMap() const
{
return this->GetEntityIdMap(NODEBLOCK);
}
const std::map<std::string, vtkTypeInt64>& GetEdgeBlockIdMap() const
{
return this->GetEntityIdMap(EDGEBLOCK);
}
const std::map<std::string, vtkTypeInt64>& GetFaceBlockIdMap() const
{
return this->GetEntityIdMap(FACEBLOCK);
}
const std::map<std::string, vtkTypeInt64>& GetElementBlockIdMap() const
{
return this->GetEntityIdMap(ELEMENTBLOCK);
}
const std::map<std::string, vtkTypeInt64>& GetStructuredBlockIdMap() const
{
return this->GetEntityIdMap(STRUCTUREDBLOCK);
}
const std::map<std::string, vtkTypeInt64>& GetNodeSetIdMap() const
{
return this->GetEntityIdMap(NODESET);
}
const std::map<std::string, vtkTypeInt64>& GetEdgeSetIdMap() const
{
return this->GetEntityIdMap(EDGESET);
}
const std::map<std::string, vtkTypeInt64>& GetFaceSetIdMap() const
{
return this->GetEntityIdMap(FACESET);
}
const std::map<std::string, vtkTypeInt64>& GetElementSetIdMap() const
{
return this->GetEntityIdMap(ELEMENTSET);
}
const std::map<std::string, vtkTypeInt64>& GetSideSetIdMap() const
{
return this->GetEntityIdMap(SIDESET);
}
///@}
///@{
/**
* This API is not really meant for public use and may change without notices.
* It is simply provided to make it easy to wrap the API in client-server
* wrappings for ParaView.
*/
vtkStringArray* GetEntityIdMapAsString(int type) const;
vtkStringArray* GetNodeBlockIdMapAsString() const
{
return this->GetEntityIdMapAsString(NODEBLOCK);
}
vtkStringArray* GetEdgeBlockIdMapAsString() const
{
return this->GetEntityIdMapAsString(EDGEBLOCK);
}
vtkStringArray* GetFaceBlockIdMapAsString() const
{
return this->GetEntityIdMapAsString(FACEBLOCK);
}
vtkStringArray* GetElementBlockIdMapAsString() const
{
return this->GetEntityIdMapAsString(ELEMENTBLOCK);
}
vtkStringArray* GetStructuredBlockIdMapAsString() const
{
return this->GetEntityIdMapAsString(STRUCTUREDBLOCK);
}
vtkStringArray* GetNodeSetIdMapAsString() const { return this->GetEntityIdMapAsString(NODESET); }
vtkStringArray* GetEdgeSetIdMapAsString() const { return this->GetEntityIdMapAsString(EDGESET); }
vtkStringArray* GetFaceSetIdMapAsString() const { return this->GetEntityIdMapAsString(FACESET); }
vtkStringArray* GetElementSetIdMapAsString() const
{
return this->GetEntityIdMapAsString(ELEMENTSET);
}
vtkStringArray* GetSideSetIdMapAsString() const { return this->GetEntityIdMapAsString(SIDESET); }
///@}
///@{
/**
* Assemblies provide yet another way of selection blocks/sets to load, if
* available in the dataset. If a block (or set) is enabled either in the
* block (or set) selection or using assembly selector then it is treated as
* enabled and will be read.
*
* This method returns the vtkDataAssembly. Since IOSS can have multiple
* assemblies, all are nested under the root "Assemblies" node.
*
* If the file has no assemblies, this will return nullptr.
*/
vtkDataAssembly* GetAssembly();
///@}
/**
* Whenever the assembly is changed, this tag gets changed. Note, users should
* not assume that this is monotonically increasing but instead simply rely on
* its value to determine if the assembly may have changed since last time.
*
* It is set to 0 whenever there's no valid assembly available.
*/
vtkGetMacro(AssemblyTag, int);
///@{
/**
* API to specify selectors that indicate which branches on the assembly are
* chosen.
*/
bool AddSelector(const char* selector);
void ClearSelectors();
void SetSelector(const char* selector);
///@}
///@{
/**
* API to access selectors.
*/
int GetNumberOfSelectors() const;
const char* GetSelector(int index) const;
///@}
///@{
/**
* Implementation for vtkReaderAlgorithm API
*/
int ReadMetaData(vtkInformation* metadata) override;
int ReadMesh(int piece, int npieces, int nghosts, int timestep, vtkDataObject* output) override;
int ReadPoints(int, int, int, int, vtkDataObject*) override { return 1; }
int ReadArrays(int, int, int, int, vtkDataObject*) override { return 1; }
///@}
/**
* Overridden to take into account mtimes for vtkDataArraySelection instances.
*/
vtkMTimeType GetMTime() override;
/**
* Runs a bunch of tests for file pattern matching.
*/
static bool DoTestFilePatternMatching();
/**
* Overridden to release handles at the end of each pass.
*/
vtkTypeBool ProcessRequest(
vtkInformation* request, vtkInformationVector** inInfo, vtkInformationVector* outInfo) override;
protected:
vtkIOSSReader();
~vtkIOSSReader() override;
int FillOutputPortInformation(int port, vtkInformation* info) override;
private:
vtkIOSSReader(const vtkIOSSReader&) = delete;
void operator=(const vtkIOSSReader&) = delete;
vtkNew<vtkDataArraySelection> EntitySelection[NUMBER_OF_ENTITY_TYPES];
vtkNew<vtkDataArraySelection> EntityFieldSelection[NUMBER_OF_ENTITY_TYPES];
std::map<std::string, vtkTypeInt64> EntityIdMap[NUMBER_OF_ENTITY_TYPES + 1];
vtkNew<vtkStringArray> EntityIdMapStrings[NUMBER_OF_ENTITY_TYPES + 1];
vtkMultiProcessController* Controller;
bool GenerateFileId;
bool ScanForRelatedFiles;
bool ReadIds;
bool RemoveUnusedPoints;
bool ApplyDisplacements;
bool ReadGlobalFields;
bool ReadQAAndInformationRecords;
char* DatabaseTypeOverride;
int AssemblyTag;
int FileRange[2];
int FileStride;
class vtkInternals;
vtkInternals* Internals;
static vtkInformationIntegerKey* ENTITY_TYPE();
};
#endif