You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
538 lines
19 KiB
538 lines
19 KiB
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: $RCSfile: vtkExodusReader.h,v $
|
|
|
|
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.
|
|
----------------------------------------------------------------------------*/
|
|
|
|
// .NAME vtkExodusReader - Read exodus 2 files .ex2
|
|
// .SECTION Description
|
|
// vtkExodusReader is a unstructured grid source object that reads ExodusII
|
|
// files. Most of the meta data associated with the file is loaded when
|
|
// UpdateInformation is called. This includes information like Title, number
|
|
// of blocks, number and names of arrays. This data can be retrieved from
|
|
// methods in this reader. Separate arrays that are meant to be a single
|
|
// vector, are combined internally for convenience. To be combined, the array
|
|
// names have to be identical except for a trailing X,Y and Z (or x,y,z). By
|
|
// default cell and point arrays are not loaded. However, the user can flag
|
|
// arrays to load with the methods "SetPointArrayStatus" and
|
|
// "SetCellArrayStatus". The reader DOES NOT respond to piece requests
|
|
//
|
|
|
|
|
|
|
|
#ifndef __vtkExodusReader_h
|
|
#define __vtkExodusReader_h
|
|
|
|
#define ARRAY_TYPE_NAMES_IN_CXX_FILE
|
|
|
|
#include "vtkUnstructuredGridAlgorithm.h"
|
|
|
|
class vtkIntArray;
|
|
class vtkFloatArray;
|
|
class vtkDataArray;
|
|
class vtkDataSet;
|
|
class vtkPoints;
|
|
class vtkExodusMetadata;
|
|
class vtkExodusModel;
|
|
class vtkExodusXMLParser;
|
|
|
|
|
|
#include "vtkDSPFilterGroup.h" //for USE_EXO_DSP_FILTERS
|
|
|
|
|
|
class VTK_HYBRID_EXPORT vtkExodusReader : public vtkUnstructuredGridAlgorithm
|
|
{
|
|
public:
|
|
static vtkExodusReader *New();
|
|
vtkTypeRevisionMacro(vtkExodusReader,vtkUnstructuredGridAlgorithm);
|
|
void PrintSelf(ostream& os, vtkIndent indent);
|
|
|
|
// Description:
|
|
// Specify file name of the Exodus file.
|
|
vtkSetStringMacro(FileName);
|
|
vtkGetStringMacro(FileName);
|
|
|
|
// Description:
|
|
// Specify file name of the xml file.
|
|
void SetXMLFileName(const char *filename);
|
|
vtkGetStringMacro(XMLFileName);
|
|
|
|
// Description:
|
|
// Which TimeStep to read.
|
|
vtkSetMacro(TimeStep, int);
|
|
vtkGetMacro(TimeStep, int);
|
|
|
|
// Description:
|
|
// Extra cell data array that can be generated. By default, this array
|
|
// is ON. The value of the array is the integer id found
|
|
// in the exodus file. The name of the array is returned by
|
|
// GetBlockIdArrayName()
|
|
vtkSetMacro(GenerateBlockIdCellArray, int);
|
|
vtkGetMacro(GenerateBlockIdCellArray, int);
|
|
vtkBooleanMacro(GenerateBlockIdCellArray, int);
|
|
const char *GetBlockIdArrayName() { return "BlockId"; }
|
|
|
|
|
|
// Description:
|
|
// Extra cell data array that can be generated. By default, this array
|
|
// is off. The value of the array is the integer global id of the cell.
|
|
// The name of the array is returned by GetGlobalElementIdArrayName()
|
|
vtkSetMacro(GenerateGlobalElementIdArray, int);
|
|
vtkGetMacro(GenerateGlobalElementIdArray, int);
|
|
vtkBooleanMacro(GenerateGlobalElementIdArray, int);
|
|
//BTX
|
|
enum {
|
|
SEARCH_TYPE_ELEMENT=0,
|
|
SEARCH_TYPE_NODE,
|
|
SEARCH_TYPE_ELEMENT_THEN_NODE,
|
|
SEARCH_TYPE_NODE_THEN_ELEMENT,
|
|
ID_NOT_FOUND=-234121312
|
|
};
|
|
//ETX
|
|
static const char *GetGlobalElementIdArrayName() { return "GlobalElementId"; }
|
|
static int GetGlobalElementID( vtkDataSet *data, int localID );
|
|
static int GetGlobalElementID ( vtkDataSet *data, int localID,
|
|
int searchType );
|
|
|
|
// Description:
|
|
// Extra point data array that can be generated. By default, this array
|
|
// is ON. The value of the array is the integer id of the node.
|
|
// The id is relative to the entire data set.
|
|
// The name of the array is returned by GlobalNodeIdArrayName().
|
|
vtkSetMacro(GenerateGlobalNodeIdArray, int);
|
|
vtkGetMacro(GenerateGlobalNodeIdArray, int);
|
|
vtkBooleanMacro(GenerateGlobalNodeIdArray, int);
|
|
static const char *GetGlobalNodeIdArrayName() { return "GlobalNodeId"; }
|
|
static int GetGlobalNodeID( vtkDataSet *data, int localID );
|
|
static int GetGlobalNodeID( vtkDataSet *data, int localID,
|
|
int searchType );
|
|
|
|
// Description:
|
|
// Geometric locations can include displacements. By default,
|
|
// this is ON. The nodal positions are 'displaced' by the
|
|
// standard exodus displacment vector. If displacements
|
|
// are turned 'off', the user can explicitly add them by
|
|
// applying a warp filter.
|
|
vtkSetMacro(ApplyDisplacements, int);
|
|
vtkGetMacro(ApplyDisplacements, int);
|
|
vtkBooleanMacro(ApplyDisplacements, int);
|
|
vtkSetMacro(DisplacementMagnitude, float);
|
|
vtkGetMacro(DisplacementMagnitude, float);
|
|
|
|
// Description:
|
|
// Access to meta data generated by UpdateInformation.
|
|
vtkGetStringMacro(Title);
|
|
vtkGetMacro(Dimensionality, int);
|
|
vtkGetMacro(NumberOfTimeSteps, int);
|
|
int GetNumberOfElements() { return this->NumberOfUsedElements; }
|
|
vtkGetMacro(NumberOfNodeSets, int);
|
|
vtkGetMacro(NumberOfSideSets, int);
|
|
vtkGetMacro(NumberOfBlocks, int);
|
|
vtkGetVector2Macro(TimeStepRange, int);
|
|
vtkSetVector2Macro(TimeStepRange, int);
|
|
int GetNumberOfNodes() { return this->NumberOfUsedNodes; }
|
|
int GetNumberOfElementsInBlock(int block_idx);
|
|
int GetBlockId(int block_idx);
|
|
|
|
|
|
// Descriptions:
|
|
// By default arrays are not loaded. These methods allow the user to select
|
|
// which arrays they want to load. You can get information about the arrays
|
|
// by first caling UpdateInformation, and using GetPointArrayName ...
|
|
// (Developer Note) This meta data is all accessed through vtkExodusMetadata
|
|
int GetNumberOfPointArrays();
|
|
const char *GetPointArrayName(int index);
|
|
int GetPointArrayID( const char *name );
|
|
int GetPointArrayNumberOfComponents(int index);
|
|
void SetPointArrayStatus(int index, int flag);
|
|
void SetPointArrayStatus(const char*, int flag);
|
|
int GetPointArrayStatus(int index);
|
|
int GetPointArrayStatus(const char*);
|
|
|
|
int GetNumberOfCellArrays();
|
|
const char *GetCellArrayName(int index);
|
|
int GetCellArrayID( const char *name );
|
|
int GetCellArrayNumberOfComponents(int index);
|
|
void SetCellArrayStatus(int index, int flag);
|
|
void SetCellArrayStatus(const char*, int flag);
|
|
int GetCellArrayStatus(int index);
|
|
int GetCellArrayStatus(const char*);
|
|
|
|
// Descriptions:
|
|
// By default all blocks are loaded. These methods allow the user to select
|
|
// which blocks they want to load. You can get information about the blocks
|
|
// by first caling UpdateInformation, and using GetBlockArrayName ...
|
|
int GetNumberOfBlockArrays();
|
|
const char *GetBlockArrayName(int index);
|
|
int GetBlockArrayID( const char *name );
|
|
void SetBlockArrayStatus(int index, int flag);
|
|
void SetBlockArrayStatus(const char*, int flag);
|
|
int GetBlockArrayStatus(int index);
|
|
int GetBlockArrayStatus(const char*);
|
|
|
|
|
|
// Description:
|
|
// By default Node/Side sets are not loaded, These methods allow the user to
|
|
// select which Node/Side sets they want to load. NumberOfNodeSets and
|
|
// NumberOfSideSets (set by vtk macros) are stored in vtkExodusReader
|
|
// but other Node/Side set metadata are stored in vtkExodusMetaData
|
|
// Note: GetNumberOfNodeSetArrays and GetNumberOfSideSetArrays are
|
|
// just syntatic sugar for paraview server xml
|
|
int GetNumberOfNodeSetArrays(){return this->GetNumberOfNodeSets();}
|
|
int GetNodeSetArrayStatus(int index);
|
|
int GetNodeSetArrayStatus(const char* name);
|
|
void SetNodeSetArrayStatus(int index, int flag);
|
|
void SetNodeSetArrayStatus(const char* name, int flag);
|
|
const char *GetNodeSetArrayName(int index);
|
|
|
|
int GetNumberOfSideSetArrays(){return this->GetNumberOfSideSets();}
|
|
int GetSideSetArrayStatus(int index);
|
|
int GetSideSetArrayStatus(const char* name);
|
|
void SetSideSetArrayStatus(int index, int flag);
|
|
void SetSideSetArrayStatus(const char* name, int flag);
|
|
const char *GetSideSetArrayName(int index);
|
|
|
|
// Descriptions:
|
|
// By default all parts are loaded. These methods allow the user to select
|
|
// which parts they want to load. You can get information about the parts
|
|
// by first caling UpdateInformation, and using GetPartArrayName ...
|
|
int GetNumberOfPartArrays();
|
|
const char *GetPartArrayName(int arrayIdx);
|
|
int GetPartArrayID( const char *name );
|
|
const char *GetPartBlockInfo(int arrayIdx);
|
|
void SetPartArrayStatus(int index, int flag);
|
|
void SetPartArrayStatus(const char*, int flag);
|
|
int GetPartArrayStatus(int index);
|
|
int GetPartArrayStatus(const char*);
|
|
|
|
|
|
// Descriptions:
|
|
// By default all materials are loaded. These methods allow the user to
|
|
// select which materials they want to load. You can get information
|
|
// about the materials by first caling UpdateInformation, and using
|
|
// GetMaterialArrayName ...
|
|
int GetNumberOfMaterialArrays();
|
|
const char *GetMaterialArrayName(int arrayIdx);
|
|
int GetMaterialArrayID( const char *name );
|
|
void SetMaterialArrayStatus(int index, int flag);
|
|
void SetMaterialArrayStatus(const char*, int flag);
|
|
int GetMaterialArrayStatus(int index);
|
|
int GetMaterialArrayStatus(const char*);
|
|
|
|
// Descriptions:
|
|
// By default all assemblies are loaded. These methods allow the user to
|
|
// select which assemblies they want to load. You can get information
|
|
// about the assemblies by first caling UpdateInformation, and using
|
|
// GetAssemblyArrayName ...
|
|
int GetNumberOfAssemblyArrays();
|
|
const char *GetAssemblyArrayName(int arrayIdx);
|
|
int GetAssemblyArrayID( const char *name );
|
|
void SetAssemblyArrayStatus(int index, int flag);
|
|
void SetAssemblyArrayStatus(const char*, int flag);
|
|
int GetAssemblyArrayStatus(int index);
|
|
int GetAssemblyArrayStatus(const char*);
|
|
|
|
// Descriptions:
|
|
// By default all hierarchy entries are loaded. These methods allow
|
|
//the user to
|
|
// select which hierarchy entries they want to load. You can get information
|
|
// about the hierarchy entries by first caling UpdateInformation, and using
|
|
// GetHierarchyArrayName ...
|
|
//these methods do not call functions in metaData. They call functions on
|
|
//the ExodusXMLParser since it seemed silly to duplicate all the information
|
|
int GetNumberOfHierarchyArrays();
|
|
const char *GetHierarchyArrayName(int arrayIdx);
|
|
void SetHierarchyArrayStatus(int index, int flag);
|
|
void SetHierarchyArrayStatus(const char*, int flag);
|
|
int GetHierarchyArrayStatus(int index);
|
|
int GetHierarchyArrayStatus(const char*);
|
|
|
|
vtkGetMacro(DisplayType,int);
|
|
virtual void SetDisplayType(int type);
|
|
|
|
// Description:
|
|
// There is a great deal of model information lost when an Exodus II
|
|
// file is read in to a vtkUnstructuredGrid. Turn this option ON
|
|
// if you want this metadata to be read in to a vtkExodusModel object.
|
|
// The default is OFF.
|
|
|
|
vtkBooleanMacro(ExodusModelMetadata, int);
|
|
vtkSetMacro(ExodusModelMetadata, int);
|
|
vtkGetMacro(ExodusModelMetadata, int);
|
|
|
|
// Description:
|
|
// Returns the object which encapsulates the model metadata.
|
|
|
|
vtkExodusModel *GetExodusModel(){return this->ExodusModel;}
|
|
|
|
// Description:
|
|
// By default, the ExodusModel metadata (if requested with
|
|
// ExodusModelMetadataOn()) is also encoded into field arrays
|
|
// and attached to the output unstructured grid. Set this OFF
|
|
// if you don't want this to happen. (The vtkExodusIIWriter and
|
|
// the vtkEnSightWriter can unpack this metadata from the field
|
|
// arrays and use it when writing out Exodus or EnSight files.)
|
|
|
|
vtkSetMacro(PackExodusModelOntoOutput, int);
|
|
vtkGetMacro(PackExodusModelOntoOutput, int);
|
|
vtkBooleanMacro(PackExodusModelOntoOutput, int);
|
|
|
|
//BTX
|
|
// Descriptions:
|
|
// Syntactic sugar funtions.
|
|
enum ArrayType {
|
|
CELL=0,
|
|
POINT,
|
|
BLOCK,
|
|
PART,
|
|
MATERIAL,
|
|
ASSEMBLY,
|
|
HIERARCHY,
|
|
NUM_ARRAY_TYPES,
|
|
UNKNOWN_TYPE
|
|
};
|
|
//ETX
|
|
|
|
// Descriptions:
|
|
// return boolean indicating whether the type,name is a valid variable
|
|
int IsValidVariable( const char *type, const char *name );
|
|
|
|
//BTX
|
|
// Description:
|
|
// Named type accessor for array information
|
|
int GetNumberOfArrays( vtkExodusReader::ArrayType type );
|
|
const char *GetArrayName( vtkExodusReader::ArrayType type, int id );
|
|
//ETX
|
|
|
|
// Descriptions:
|
|
// Return the id of the type,name variable
|
|
int GetVariableID ( const char *type, const char *name );
|
|
|
|
void SetAllAssemblyArrayStatus( int status );
|
|
void SetAllBlockArrayStatus( int status );
|
|
void SetAllCellArrayStatus( int status );
|
|
void SetAllHierarchyArrayStatus( int status );
|
|
void SetAllMaterialArrayStatus( int status );
|
|
void SetAllPartArrayStatus( int status );
|
|
void SetAllPointArrayStatus( int status );
|
|
//BTX
|
|
void SetAllArrayStatus ( vtkExodusReader::ArrayType type, int flag );
|
|
void SetArrayStatus ( vtkExodusReader::ArrayType type, const char *name,
|
|
int flag );
|
|
//ETX
|
|
void SetArrayStatus ( const char *type, const char *name, int flag )
|
|
{
|
|
this->SetArrayStatus( this->GetArrayTypeID(type), name, flag );
|
|
}
|
|
//BTX
|
|
int GetArrayStatus ( vtkExodusReader::ArrayType type, const char *name );
|
|
//ETX
|
|
int GetArrayStatus ( const char *type, const char *name )
|
|
{
|
|
return this->GetArrayStatus( this->GetArrayTypeID( type ), name );
|
|
}
|
|
|
|
// Helper functions
|
|
static int StringsEqual(const char* s1, char* s2);
|
|
static void StringUppercase(const char* str, char* upperstr);
|
|
static char *StrDupWithNew(const char *s);
|
|
|
|
// time series query functions
|
|
int GetTimeSeriesData( int ID, const char *vName, const char *vType,
|
|
vtkFloatArray *result );
|
|
|
|
|
|
//begin USE_EXO_DSP_FILTERS
|
|
int GetNumberOfVariableArrays();
|
|
const char *GetVariableArrayName(int a_which);
|
|
void EnableDSPFiltering();
|
|
void AddFilter(vtkDSPFilterDefinition *a_filter);
|
|
void StartAddingFilter();
|
|
void AddFilterInputVar(char *name);
|
|
void AddFilterOutputVar(char *name);
|
|
void AddFilterNumeratorWeight(double weight);
|
|
void AddFilterForwardNumeratorWeight(double weight);
|
|
void AddFilterDenominatorWeight(double weight);
|
|
void FinishAddingFilter();
|
|
void RemoveFilter(char *a_outputVariableName);
|
|
void GetDSPOutputArrays(int exoid, vtkUnstructuredGrid* output);
|
|
//BTX
|
|
vtkExodusReader::ArrayType GetArrayTypeID( const char *type );
|
|
|
|
#ifdef ARRAY_TYPE_NAMES_IN_CXX_FILE
|
|
static const char *GetArrayTypeName( vtkExodusReader::ArrayType type );
|
|
#else
|
|
static const char *ArrayTypeNames[NUM_ARRAY_TYPES];
|
|
|
|
static const char *GetArrayTypeName( vtkExodusReader::ArrayType type )
|
|
{
|
|
return ArrayTypeNames[type];
|
|
}
|
|
#endif
|
|
//ETX
|
|
|
|
vtkDSPFilterDefinition *AddingFilter;
|
|
int DSPFilteringIsEnabled;
|
|
vtkDSPFilterGroup **DSPFilters;
|
|
//end USE_EXO_DSP_FILTERS
|
|
|
|
|
|
|
|
protected:
|
|
vtkExodusReader();
|
|
~vtkExodusReader();
|
|
|
|
void NewExodusModel();
|
|
|
|
void ReadGeometry(int exoid, vtkUnstructuredGrid* output);
|
|
void ReadCells(int exoid, vtkUnstructuredGrid* output);
|
|
void ReadPoints(int exoid, vtkUnstructuredGrid* output);
|
|
void ReadArrays(int exoid, vtkUnstructuredGrid* output);
|
|
void ReadNodeAndSideSets(int exoid, vtkUnstructuredGrid* output);
|
|
vtkDataArray *ReadPointArray(int exoid, int varIndex);
|
|
vtkDataArray *ReadPointVector(int handle, int varIndex, int dim);
|
|
vtkDataArray *ReadCellArray(int exoid, int varIndex);
|
|
vtkDataArray *ReadCellVector(int handle, int varIndex, int dim);
|
|
void ReadNodeSetMetadata();
|
|
void ReadSideSetMetadata();
|
|
|
|
// helper for finding IDs
|
|
static int GetIDHelper ( const char *arrayName, vtkDataSet *data, int localID,
|
|
int searchType );
|
|
static int GetGlobalID( const char *arrayName, vtkDataSet *data, int localID,
|
|
int searchType );
|
|
|
|
|
|
// This method is a helper for determining the
|
|
// number of additional cell scalar field
|
|
// values needed to 'pad' for node and side sets
|
|
int GetExtraCellCountForNodeSideSets();
|
|
|
|
// This method generates arrays like blockid, global nodeid
|
|
// and global element id
|
|
void GenerateExtraArrays(vtkUnstructuredGrid* output);
|
|
|
|
// Parameters for controlling what is read in.
|
|
char *FileName;
|
|
char *XMLFileName;
|
|
int TimeStep;
|
|
int ActualTimeStep;
|
|
int GenerateBlockIdCellArray;
|
|
int GenerateGlobalElementIdArray;
|
|
int GenerateGlobalNodeIdArray;
|
|
int ApplyDisplacements;
|
|
double DisplacementMagnitude;
|
|
|
|
// Information specific for exodus files.
|
|
vtkSetStringMacro(Title);
|
|
char *Title;
|
|
int Dimensionality;
|
|
int NumberOfNodeSets;
|
|
int NumberOfSideSets;
|
|
int NumberOfBlocks;
|
|
int NumberOfUsedNodes;
|
|
int NumberOfNodesInFile;
|
|
int NumberOfUsedElements;
|
|
int NumberOfElementsInFile;
|
|
int NumberOfTimeSteps;
|
|
int ExodusCPUWordSize;
|
|
int ExodusIOWordSize;
|
|
float ExodusVersion;
|
|
vtkIntArray *CellVarTruthTable;
|
|
|
|
//1=display Block names
|
|
//2=display Part names
|
|
//3=display Material names
|
|
int DisplayType;
|
|
|
|
//Parser that understands the xml part and material file
|
|
vtkExodusXMLParser *Parser;
|
|
|
|
// **KEN** By VTK convention, metaData should be Metadata.
|
|
|
|
////////////////////////////////////////
|
|
// Scalar Array and Block Info
|
|
////////////////////////////////////////
|
|
vtkExodusMetadata *MetaData;
|
|
|
|
|
|
// Descriptions:
|
|
// Store current file name and current handle.
|
|
int CurrentHandle;
|
|
char* CurrentFileName;
|
|
char* CurrentXMLFileName;
|
|
vtkSetStringMacro(CurrentFileName);
|
|
vtkSetStringMacro(CurrentXMLFileName);
|
|
|
|
// Open the exodus file, and set some basic information
|
|
int OpenCurrentFile();
|
|
|
|
// Close the exodus file
|
|
void CloseCurrentFile();
|
|
|
|
|
|
// Descriptions:
|
|
// Store the range of time steps
|
|
int TimeStepRange[2];
|
|
|
|
// DataCache: this object keeps the points and cells
|
|
// around so they don't need to be re-read when the
|
|
// timestep changes or an scalar array is switched
|
|
vtkUnstructuredGrid *DataCache;
|
|
|
|
// Should I re-read in the geometry and topology of the dataset
|
|
int RemakeDataCacheFlag;
|
|
|
|
// vtkExodusModel needs to count changes in geometry, so it knows
|
|
// if geometry has changed since it last updated model data.
|
|
|
|
int NewGeometryCount;
|
|
|
|
// PointMap keeps track of which points are actually
|
|
// used by the cells that are read in (blocks)
|
|
vtkIntArray *PointMap;
|
|
vtkIntArray *ReversePointMap;
|
|
void SetUpPointMap(int num_points);
|
|
int GetPointMapIndex(int point_id);
|
|
|
|
// Global element ID cache
|
|
int *GlobalElementIdCache;
|
|
void SetGlobalElementIdCache(int *list);
|
|
|
|
// Time query function. Called by ExecuteInformation().
|
|
// Fills the TimestepValues array.
|
|
void GetAllTimes(vtkInformationVector *);
|
|
|
|
vtkExodusModel *ExodusModel;
|
|
int PackExodusModelOntoOutput;
|
|
int ExodusModelMetadata;
|
|
|
|
int RequestInformation(
|
|
vtkInformation *, vtkInformationVector **, vtkInformationVector *);
|
|
int RequestData(
|
|
vtkInformation *, vtkInformationVector **, vtkInformationVector *);
|
|
|
|
private:
|
|
vtkExodusReader(const vtkExodusReader&); // Not implemented
|
|
void operator=(const vtkExodusReader&); // Not implemented
|
|
|
|
void AddDisplacements(vtkUnstructuredGrid* output);
|
|
void RemoveBeginningAndTrailingSpaces(char **names, int len);
|
|
|
|
void FixMetadataTruthTable(int *table, int len);
|
|
};
|
|
|
|
#endif
|
|
|