VTK
vtkExodusReader.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkExodusReader.h
5 
6  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7  All rights reserved.
8  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
15 /*----------------------------------------------------------------------------
16  Copyright (c) Sandia Corporation
17  See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details.
18 ----------------------------------------------------------------------------*/
19 
39 #ifndef __vtkExodusReader_h
40 #define __vtkExodusReader_h
41 
42 #define ARRAY_TYPE_NAMES_IN_CXX_FILE
43 
45 
46 class vtkIntArray;
47 class vtkFloatArray;
48 class vtkDataArray;
49 class vtkDataSet;
50 class vtkPoints;
51 class vtkExodusMetadata;
52 class vtkExodusModel;
53 class vtkExodusXMLParser;
54 
55 
56 #include "vtkDSPFilterGroup.h" //for USE_EXO_DSP_FILTERS
57 
58 
60 {
61 public:
62  static vtkExodusReader *New();
64  void PrintSelf(ostream& os, vtkIndent indent);
65 
67  int CanReadFile(const char* fname);
68 
70 
71  vtkSetStringMacro(FileName);
72  vtkGetStringMacro(FileName);
74 
76 
77  vtkSetStringMacro(XMLFileName);
78  vtkGetStringMacro(XMLFileName);
80 
82 
83  vtkSetMacro(TimeStep, int);
84  vtkGetMacro(TimeStep, int);
86 
88 
91  vtkSetMacro(GenerateBlockIdCellArray, int);
92  vtkGetMacro(GenerateBlockIdCellArray, int);
93  vtkBooleanMacro(GenerateBlockIdCellArray, int);
94  const char *GetBlockIdArrayName() { return "BlockId"; }
96 
97 
99 
102  vtkSetMacro(GenerateGlobalElementIdArray, int);
103  vtkGetMacro(GenerateGlobalElementIdArray, int);
104  vtkBooleanMacro(GenerateGlobalElementIdArray, int);
105 //BTX
106  enum {
107  SEARCH_TYPE_ELEMENT=0,
111  ID_NOT_FOUND=-234121312
112  };
113 //ETX
114  static const char *GetGlobalElementIdArrayName() { return "GlobalElementId"; }
115  static const char *GetPedigreeElementIdArrayName() { return "PedigreeElementId"; }
116  static int GetGlobalElementID( vtkDataSet *data, int localID );
117  static int GetGlobalElementID ( vtkDataSet *data, int localID,
118  int searchType );
120 
122 
126  vtkSetMacro(GenerateGlobalNodeIdArray, int);
127  vtkGetMacro(GenerateGlobalNodeIdArray, int);
128  vtkBooleanMacro(GenerateGlobalNodeIdArray, int);
129  static const char *GetGlobalNodeIdArrayName() { return "GlobalNodeId"; }
130  static const char *GetPedigreeNodeIdArrayName() { return "PedigreeNodeId"; }
131  static int GetGlobalNodeID( vtkDataSet *data, int localID );
132  static int GetGlobalNodeID( vtkDataSet *data, int localID,
133  int searchType );
135 
137 
141  vtkSetMacro(ApplyDisplacements, int);
142  vtkGetMacro(ApplyDisplacements, int);
143  vtkBooleanMacro(ApplyDisplacements, int);
144  vtkSetMacro(DisplacementMagnitude, float);
145  vtkGetMacro(DisplacementMagnitude, float);
147 
149 
150  vtkGetStringMacro(Title);
151  vtkGetMacro(Dimensionality, int);
152  vtkGetMacro(NumberOfTimeSteps, int);
153  int GetNumberOfElements() { return this->NumberOfUsedElements; }
154  vtkGetMacro(NumberOfNodeSets, int);
155  vtkGetMacro(NumberOfSideSets, int);
156  vtkGetMacro(NumberOfBlocks, int);
157  vtkGetVector2Macro(TimeStepRange, int);
158  vtkSetVector2Macro(TimeStepRange, int);
159  int GetNumberOfNodes() { return this->NumberOfUsedNodes; }
160  int GetNumberOfElementsInBlock(int block_idx);
161  int GetBlockId(int block_idx);
162  virtual int GetTotalNumberOfNodes() { return this->NumberOfNodesInFile; }
164 
165 
167 
172  int GetNumberOfPointArrays();
173  const char *GetPointArrayName(int index);
174  int GetPointArrayID( const char *name );
175  int GetPointArrayNumberOfComponents(int index);
176  void SetPointArrayStatus(int index, int flag);
177  void SetPointArrayStatus(const char*, int flag);
178  int GetPointArrayStatus(int index);
179  int GetPointArrayStatus(const char*);
181 
182  int GetNumberOfCellArrays();
183  const char *GetCellArrayName(int index);
184  int GetCellArrayID( const char *name );
185  int GetCellArrayNumberOfComponents(int index);
186  void SetCellArrayStatus(int index, int flag);
187  void SetCellArrayStatus(const char*, int flag);
188  int GetCellArrayStatus(int index);
189  int GetCellArrayStatus(const char*);
190  virtual int GetTotalNumberOfElements()
191  { return this->NumberOfElementsInFile; }
192 
194 
198  int GetNumberOfBlockArrays();
199  const char *GetBlockArrayName(int index);
200  int GetBlockArrayID( const char *name );
201  void SetBlockArrayStatus(int index, int flag);
202  void SetBlockArrayStatus(const char*, int flag);
203  int GetBlockArrayStatus(int index);
204  int GetBlockArrayStatus(const char*);
206 
207 
209 
216  int GetNumberOfNodeSetArrays(){return this->GetNumberOfNodeSets();}
217  int GetNodeSetArrayStatus(int index);
218  int GetNodeSetArrayStatus(const char* name);
219  void SetNodeSetArrayStatus(int index, int flag);
220  void SetNodeSetArrayStatus(const char* name, int flag);
221  const char *GetNodeSetArrayName(int index);
223 
224  int GetNumberOfSideSetArrays(){return this->GetNumberOfSideSets();}
225  int GetSideSetArrayStatus(int index);
226  int GetSideSetArrayStatus(const char* name);
227  void SetSideSetArrayStatus(int index, int flag);
228  void SetSideSetArrayStatus(const char* name, int flag);
229  const char *GetSideSetArrayName(int index);
230 
232 
236  int GetNumberOfPartArrays();
237  const char *GetPartArrayName(int arrayIdx);
238  int GetPartArrayID( const char *name );
239  const char *GetPartBlockInfo(int arrayIdx);
240  void SetPartArrayStatus(int index, int flag);
241  void SetPartArrayStatus(const char*, int flag);
242  int GetPartArrayStatus(int index);
243  int GetPartArrayStatus(const char*);
245 
246 
248 
252  int GetNumberOfMaterialArrays();
253  const char *GetMaterialArrayName(int arrayIdx);
254  int GetMaterialArrayID( const char *name );
255  void SetMaterialArrayStatus(int index, int flag);
256  void SetMaterialArrayStatus(const char*, int flag);
257  int GetMaterialArrayStatus(int index);
258  int GetMaterialArrayStatus(const char*);
260 
262 
266  int GetNumberOfAssemblyArrays();
267  const char *GetAssemblyArrayName(int arrayIdx);
268  int GetAssemblyArrayID( const char *name );
269  void SetAssemblyArrayStatus(int index, int flag);
270  void SetAssemblyArrayStatus(const char*, int flag);
271  int GetAssemblyArrayStatus(int index);
272  int GetAssemblyArrayStatus(const char*);
274 
276 
283  int GetNumberOfHierarchyArrays();
284  const char *GetHierarchyArrayName(int arrayIdx);
285  void SetHierarchyArrayStatus(int index, int flag);
286  void SetHierarchyArrayStatus(const char*, int flag);
287  int GetHierarchyArrayStatus(int index);
288  int GetHierarchyArrayStatus(const char*);
290 
292 
299  vtkGetMacro(HasModeShapes, int);
300  vtkSetMacro(HasModeShapes, int);
301  vtkBooleanMacro(HasModeShapes, int);
303 
304  vtkGetMacro(DisplayType,int);
305  virtual void SetDisplayType(int type);
306 
312  vtkBooleanMacro(ExodusModelMetadata, int);
313  vtkSetMacro(ExodusModelMetadata, int);
314  vtkGetMacro(ExodusModelMetadata, int);
315 
318  vtkExodusModel *GetExodusModel(){return this->ExodusModel;}
319 
327  vtkSetMacro(PackExodusModelOntoOutput, int);
328  vtkGetMacro(PackExodusModelOntoOutput, int);
329  vtkBooleanMacro(PackExodusModelOntoOutput, int);
330 
331 //BTX
333 
334  enum ArrayType {
335  CELL=0,
343  UNKNOWN_TYPE
344  };
345 //ETX
347 
349  int IsValidVariable( const char *type, const char *name );
350 
351 //BTX
353 
354  int GetNumberOfArrays( vtkExodusReader::ArrayType type );
355  const char *GetArrayName( vtkExodusReader::ArrayType type, int id );
356 //ETX
358 
360  int GetVariableID ( const char *type, const char *name );
361 
362  void SetAllAssemblyArrayStatus( int status );
363  void SetAllBlockArrayStatus( int status );
364  void SetAllCellArrayStatus( int status );
365  void SetAllHierarchyArrayStatus( int status );
366  void SetAllMaterialArrayStatus( int status );
367  void SetAllPartArrayStatus( int status );
368  void SetAllPointArrayStatus( int status );
369 //BTX
370  void SetAllArrayStatus ( vtkExodusReader::ArrayType type, int flag );
371  void SetArrayStatus ( vtkExodusReader::ArrayType type, const char *name,
372  int flag );
373 //ETX
374  void SetArrayStatus ( const char *type, const char *name, int flag )
375  {
376  this->SetArrayStatus( this->GetArrayTypeID(type), name, flag );
377  }
378 //BTX
379  int GetArrayStatus ( vtkExodusReader::ArrayType type, const char *name );
380 //ETX
381  int GetArrayStatus ( const char *type, const char *name )
382  {
383  return this->GetArrayStatus( this->GetArrayTypeID( type ), name );
384  }
385 
386  // Helper functions
387  static int StringsEqual(const char* s1, char* s2);
388  static void StringUppercase(const char* str, char* upperstr);
389  static char *StrDupWithNew(const char *s);
390 
391  // time series query functions
392  int GetTimeSeriesData( int ID, const char *vName, const char *vType,
393  vtkFloatArray *result );
394 
395 
396  //begin USE_EXO_DSP_FILTERS
397  int GetNumberOfVariableArrays();
398  const char *GetVariableArrayName(int a_which);
399  void EnableDSPFiltering();
400  void AddFilter(vtkDSPFilterDefinition *a_filter);
401  void StartAddingFilter();
402  void AddFilterInputVar(char *name);
403  void AddFilterOutputVar(char *name);
404  void AddFilterNumeratorWeight(double weight);
405  void AddFilterForwardNumeratorWeight(double weight);
406  void AddFilterDenominatorWeight(double weight);
407  void FinishAddingFilter();
408  void RemoveFilter(char *a_outputVariableName);
409  void GetDSPOutputArrays(int exoid, vtkUnstructuredGrid* output);
410 //BTX
411  vtkExodusReader::ArrayType GetArrayTypeID( const char *type );
412 
413 #ifdef ARRAY_TYPE_NAMES_IN_CXX_FILE
414  static const char *GetArrayTypeName( vtkExodusReader::ArrayType type );
415 #else
416  static const char *ArrayTypeNames[NUM_ARRAY_TYPES];
417 
418  static const char *GetArrayTypeName( vtkExodusReader::ArrayType type )
419  {
420  return ArrayTypeNames[type];
421  }
422 #endif
423 //ETX
424 
428  //end USE_EXO_DSP_FILTERS
429 
430 
431 
432 protected:
433  vtkExodusReader();
434  ~vtkExodusReader();
435 
436  void NewExodusModel();
437 
438  void ReadGeometry(int exoid, vtkUnstructuredGrid* output);
439  void ReadCells(int exoid, vtkUnstructuredGrid* output);
440  void ReadPoints(int exoid, vtkUnstructuredGrid* output);
441  void ReadArrays(int exoid, vtkUnstructuredGrid* output);
442  void ReadNodeAndSideSets(int exoid, vtkUnstructuredGrid* output);
443  vtkDataArray *ReadPointArray(int exoid, int varIndex);
444  vtkDataArray *ReadPointVector(int handle, int varIndex, int dim);
445  vtkDataArray *ReadCellArray(int exoid, int varIndex);
446  vtkDataArray *ReadCellVector(int handle, int varIndex, int dim);
447  void ReadNodeSetMetadata();
448  void ReadSideSetMetadata();
449 
450  // helper for finding IDs
451  static int GetIDHelper ( const char *arrayName, vtkDataSet *data, int localID,
452  int searchType );
453  static int GetGlobalID( const char *arrayName, vtkDataSet *data, int localID,
454  int searchType );
455 
456  // This method is a helper for determining the
457  // number of additional cell scalar field
458  // values needed to 'pad' for node and side sets
459  int GetExtraCellCountForNodeSideSets();
460 
461  // This method generates arrays like blockid, global nodeid
462  // and global element id
463  void GenerateExtraArrays(vtkUnstructuredGrid* output);
464 
465  // Parameters for controlling what is read in.
466  char *FileName;
467  char *XMLFileName;
468  int TimeStep;
470  double TimeValue;
476 
477  // Information specific for exodus files.
478  vtkSetStringMacro(Title);
479  char *Title;
493 
494  //1=display Block names
495  //2=display Part names
496  //3=display Material names
498 
499  //Parser that understands the xml part and material file
500  vtkExodusXMLParser *Parser;
501 
502  // **KEN** By VTK convention, metaData should be Metadata.
503 
505  // Scalar Array and Block Info
507  vtkExodusMetadata *MetaData;
508 
509 
511 
515  vtkSetStringMacro(CurrentFileName);
516  vtkSetStringMacro(CurrentXMLFileName);
518 
519  // Open the exodus file, and set some basic information
520  int OpenCurrentFile();
521 
522  // Close the exodus file
523  void CloseCurrentFile();
524 
525 
527  int TimeStepRange[2];
528 
529  // DataCache: this object keeps the points and cells
530  // around so they don't need to be re-read when the
531  // timestep changes or an scalar array is switched
533 
534  // Should I re-read in the geometry and topology of the dataset
536 
537  // vtkExodusModel needs to count changes in geometry, so it knows
538  // if geometry has changed since it last updated model data.
539 
541 
542  // PointMap keeps track of which points are actually
543  // used by the cells that are read in (blocks)
546  void SetUpPointMap(int num_points);
547  int GetPointMapIndex(int point_id);
548 
549  // Global element ID cache
551  void SetGlobalElementIdCache(int *list);
552 
553  // Time query function. Called by ExecuteInformation().
554  // Fills the TimestepValues array.
555  void GetAllTimes(vtkInformationVector *);
556 
558 
562 
563  double *TimeSteps;
564 
565  int RequestInformation(
567  int RequestData(
569 
570  // Used to determine current progress.
573 
574 private:
575  vtkExodusReader(const vtkExodusReader&); // Not implemented
576  void operator=(const vtkExodusReader&); // Not implemented
577 
578  void AddDisplacements(vtkUnstructuredGrid* output);
579  void RemoveBeginningAndTrailingSpaces(char **names, int len);
580 
581  void FixMetadataTruthTable(int *table, int len);
582 };
583 
584 #endif