VTK
|
00001 /*========================================================================= 00002 00003 Program: ParaView 00004 Module: vtkModelMetadata.h 00005 00006 Copyright (c) Kitware, Inc. 00007 All rights reserved. 00008 See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details. 00009 00010 This software is distributed WITHOUT ANY WARRANTY; without even 00011 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00012 PURPOSE. See the above copyright notice for more information. 00013 00014 =========================================================================*/ 00015 /*---------------------------------------------------------------------------- 00016 Copyright (c) Sandia Corporation 00017 See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details. 00018 ----------------------------------------------------------------------------*/ 00019 00074 #ifndef __vtkModelMetadata_h 00075 #define __vtkModelMetadata_h 00076 00077 #include "vtkObject.h" 00078 00079 class vtkDataSet; 00080 class vtkCharArray; 00081 class vtkIdTypeArray; 00082 class vtkIntArray; 00083 class vtkFloatArray; 00084 class vtkIntArray; 00085 class vtkModelMetadataSTLCloak; 00086 00087 class VTK_GRAPHICS_EXPORT vtkModelMetadata : public vtkObject 00088 { 00089 public: 00090 vtkTypeMacro(vtkModelMetadata, vtkObject); 00091 virtual void PrintSelf(ostream &os, vtkIndent indent); 00092 static vtkModelMetadata *New(); 00093 00098 virtual void PrintGlobalInformation(); 00099 00110 virtual void PrintLocalInformation(); 00111 00113 00114 vtkSetStringMacro(Title); 00115 const char *GetTitle() const {return this->Title;} 00117 00119 void SetInformationLines(int numLines, char **lines); 00120 00122 void AddInformationLine(char *info); 00123 00126 int GetInformationLines(char ***lines) const; 00127 00129 00130 int GetNumberOfInformationLines() const { 00131 return this->NumberOfInformationLines;} 00133 00137 void SetQARecords(int numberOfRecords, char *QARecords[][4]); 00138 00142 void AddQARecord(char *name, char *version, char *date, char *time); 00143 00145 00146 void GetQARecord(int which, char **name, char **version, 00147 char **date, char **time) const; 00149 00151 int GetNumberOfQARecords() const {return this->NumberOfQARecords;} 00152 00154 00157 vtkSetMacro(TimeStepIndex, int); 00158 int GetTimeStepIndex() const {return this->TimeStepIndex;} 00160 00162 00165 void SetTimeSteps(int numberOfTimeSteps, float *timeStepValues); 00166 int GetNumberOfTimeSteps() const {return this->NumberOfTimeSteps;} 00168 00170 float *GetTimeStepValues() const {return this->TimeStepValues;} 00171 00173 00174 void SetCoordinateNames(int dimension, char **); 00175 char **GetCoordinateNames() const {return this->CoordinateNames;} 00177 00180 int GetDimension() const {return this->Dimension;} 00181 00183 00185 vtkSetMacro(NumberOfBlocks, int); 00186 int GetNumberOfBlocks() const {return this->NumberOfBlocks;} 00188 00190 00192 void SetBlockIds(int *); 00193 int *GetBlockIds() const {return this->BlockIds;} 00195 00197 00200 void SetBlockElementType(char **); 00201 char **GetBlockElementType() const {return this->BlockElementType;} 00203 00205 00208 int SetBlockNumberOfElements(int *nelts); 00209 int *GetBlockNumberOfElements()const{return this->BlockNumberOfElements;} 00211 00213 00216 void SetBlockNodesPerElement(int *); 00217 int *GetBlockNodesPerElement()const{return this->BlockNodesPerElement;} 00219 00221 00224 void SetBlockElementIdList(int *); 00225 int *GetBlockElementIdList() const {return this->BlockElementIdList;} 00227 00229 int GetSumElementsPerBlock() const {return this->SumElementsPerBlock;} 00230 00233 int *GetBlockElementIdListIndex()const {return this->BlockElementIdListIndex;} 00234 00236 00239 int SetBlockNumberOfAttributesPerElement(int *natts); 00240 int *GetBlockNumberOfAttributesPerElement()const {return this->BlockNumberOfAttributesPerElement;} 00242 00244 00247 void SetBlockAttributes(float *); 00248 float *GetBlockAttributes()const {return this->BlockAttributes;} 00250 00252 00253 int GetSizeBlockAttributeArray() const { 00254 return this->SizeBlockAttributeArray;} 00256 00259 int *GetBlockAttributesIndex() const {return this->BlockAttributesIndex;} 00260 00262 00264 vtkSetMacro(NumberOfNodeSets, int); 00265 int GetNumberOfNodeSets() const {return this->NumberOfNodeSets;} 00267 00269 00272 void SetNodeSetIds(int *); 00273 int *GetNodeSetIds() const {return this->NodeSetIds;} 00275 00277 00280 int SetNodeSetSize(int *); 00281 int *GetNodeSetSize() const {return this->NodeSetSize;} 00283 00285 00289 void SetNodeSetNodeIdList(int *); 00290 int *GetNodeSetNodeIdList() const {return this->NodeSetNodeIdList;} 00292 00294 00298 int SetNodeSetNumberOfDistributionFactors(int *); 00299 int *GetNodeSetNumberOfDistributionFactors() const 00300 {return this->NodeSetNumberOfDistributionFactors;} 00302 00304 00307 void SetNodeSetDistributionFactors(float *); 00308 float *GetNodeSetDistributionFactors() const { 00309 return this->NodeSetDistributionFactors;} 00311 00313 int GetSumNodesPerNodeSet() const {return this->SumNodesPerNodeSet;} 00314 00316 int GetSumDistFactPerNodeSet() const {return this->SumDistFactPerNodeSet;} 00317 00319 00321 int *GetNodeSetNodeIdListIndex() const { 00322 return this->NodeSetNodeIdListIndex;} 00324 00326 00328 int *GetNodeSetDistributionFactorIndex() const { 00329 return this->NodeSetDistributionFactorIndex;} 00331 00333 00335 vtkSetMacro(NumberOfSideSets, int); 00336 int GetNumberOfSideSets() const {return this->NumberOfSideSets;} 00338 00340 00342 void SetSideSetIds(int *); 00343 int *GetSideSetIds() const {return this->SideSetIds;} 00345 00347 00350 int SetSideSetSize(int *sizes); 00351 int *GetSideSetSize() const {return this->SideSetSize;} 00353 00355 00359 int SetSideSetNumberOfDistributionFactors(int *df); 00360 int *GetSideSetNumberOfDistributionFactors() const { 00361 return this->SideSetNumberOfDistributionFactors;} 00363 00365 00369 void SetSideSetElementList(int *); 00370 int *GetSideSetElementList() const {return this->SideSetElementList;} 00372 00374 00379 void SetSideSetSideList(int *); 00380 int *GetSideSetSideList() const {return this->SideSetSideList;} 00382 00384 00388 void SetSideSetNumDFPerSide(int *numNodes); 00389 int *GetSideSetNumDFPerSide() const {return this->SideSetNumDFPerSide;} 00391 00393 00401 void SetSideSetDistributionFactors(float *); 00402 float *GetSideSetDistributionFactors() const { 00403 return this->SideSetDistributionFactors;} 00405 00407 int GetSumSidesPerSideSet() const {return this->SumSidesPerSideSet;} 00408 00410 int GetSumDistFactPerSideSet() const {return this->SumDistFactPerSideSet;} 00411 00414 int *GetSideSetListIndex() const {return this->SideSetListIndex;} 00415 00417 00419 int *GetSideSetDistributionFactorIndex() const { 00420 return this->SideSetDistributionFactorIndex;} 00422 00424 00425 int GetNumberOfBlockProperties() const { 00426 return this->NumberOfBlockProperties;} 00428 00430 00431 void SetBlockPropertyNames(int numProp, char **names); 00432 char **GetBlockPropertyNames() const {return this->BlockPropertyNames;} 00434 00436 00438 void SetBlockPropertyValue(int *); 00439 int *GetBlockPropertyValue() const {return this->BlockPropertyValue;} 00441 00443 00444 int GetNumberOfNodeSetProperties() const { 00445 return this->NumberOfNodeSetProperties;} 00447 00449 00450 void SetNodeSetPropertyNames(int numProp, char **names); 00451 char **GetNodeSetPropertyNames() const {return this->NodeSetPropertyNames;} 00453 00455 00457 void SetNodeSetPropertyValue(int *); 00458 int *GetNodeSetPropertyValue() const {return this->NodeSetPropertyValue;} 00460 00462 00463 int GetNumberOfSideSetProperties() const { 00464 return this->NumberOfSideSetProperties;} 00466 00468 00469 void SetSideSetPropertyNames(int numProp, char **names); 00470 char **GetSideSetPropertyNames() const {return this->SideSetPropertyNames;} 00472 00474 00476 void SetSideSetPropertyValue(int *); 00477 int *GetSideSetPropertyValue() const {return this->SideSetPropertyValue;} 00479 00481 00482 int GetNumberOfGlobalVariables() const { 00483 return this->NumberOfGlobalVariables;} 00485 00487 00488 void SetGlobalVariableNames(int numVarNames, char **n); 00489 char **GetGlobalVariableNames() const {return this->GlobalVariableNames;} 00491 00493 00495 void SetGlobalVariableValue(float *f); 00496 float *GetGlobalVariableValue() const {return this->GlobalVariableValue;} 00498 00500 00509 void SetElementVariableInfo(int numOrigNames, char **origNames, 00510 int numNames, char **names, int *numComp, 00511 int *map); 00513 00515 00524 void SetNodeVariableInfo(int numOrigNames, char **origNames, 00525 int numNames, char **names, int *numComp, 00526 int *map); 00528 00530 00534 void SetElementVariableTruthTable(int *); 00535 int *GetElementVariableTruthTable() const { 00536 return this->ElementVariableTruthTable;} 00538 00540 00542 vtkSetMacro(AllVariablesDefinedInAllBlocks, int); 00543 vtkBooleanMacro(AllVariablesDefinedInAllBlocks, int); 00544 int GetAllVariablesDefinedInAllBlocks() const { 00545 return this->AllVariablesDefinedInAllBlocks;} 00547 00554 int ElementVariableIsDefinedInBlock(char *varname, int blockId); 00555 00557 00569 int GetOriginalNumberOfElementVariables() const { 00570 return this->OriginalNumberOfElementVariables;} 00571 char **GetOriginalElementVariableNames() const { 00572 return this->OriginalElementVariableNames;} 00573 int GetNumberOfElementVariables() const { 00574 return this->NumberOfElementVariables;} 00575 char **GetElementVariableNames() const { 00576 return this->ElementVariableNames;} 00577 int *GetElementVariableNumberOfComponents() const { 00578 return this->ElementVariableNumberOfComponents;} 00579 int *GetMapToOriginalElementVariableNames() const { 00580 return this->MapToOriginalElementVariableNames;} 00582 00583 int GetOriginalNumberOfNodeVariables() const { 00584 return this->OriginalNumberOfNodeVariables;} 00585 char **GetOriginalNodeVariableNames() const { 00586 return this->OriginalNodeVariableNames;} 00587 int GetNumberOfNodeVariables() const { 00588 return this->NumberOfNodeVariables;} 00589 char **GetNodeVariableNames() const { 00590 return this->NodeVariableNames;} 00591 int *GetNodeVariableNumberOfComponents() const { 00592 return this->NodeVariableNumberOfComponents;} 00593 int *GetMapToOriginalNodeVariableNames() const { 00594 return this->MapToOriginalNodeVariableNames;} 00595 00600 char *FindOriginalElementVariableName(const char *name, int component); 00601 00606 char *FindOriginalNodeVariableName(const char *name, int component); 00607 00610 static int HasMetadata(vtkDataSet *grid); 00611 00614 static void RemoveMetadata(vtkDataSet *grid); 00615 00617 void Pack(vtkDataSet *ugrid); 00618 00623 int Unpack(vtkDataSet *ugrid, int deleteIt); 00624 00626 00637 int AddUGridElementVariable(char *ugridVarName, char *origName, int numComponents); 00638 int RemoveUGridElementVariable(char *ugridVarName); 00640 00641 int AddUGridNodeVariable(char *ugridVarName, char *origName, int numComponents); 00642 int RemoveUGridNodeVariable(char *ugridVarName); 00643 00652 int MergeModelMetadata(const vtkModelMetadata *em); 00653 00657 int MergeGlobalInformation(const vtkModelMetadata *em); 00658 00660 00665 vtkModelMetadata *ExtractModelMetadata(vtkIdTypeArray *globalCellIdList, 00666 vtkDataSet *grid); 00668 00671 vtkModelMetadata *ExtractGlobalMetadata(); 00672 00674 00683 void FreeAllGlobalData(); 00684 void FreeAllLocalData(); 00685 void FreeBlockDependentData(); 00686 void FreeOriginalElementVariableNames(); 00687 void FreeOriginalNodeVariableNames(); 00688 void FreeUsedElementVariableNames(); 00689 void FreeUsedNodeVariableNames(); 00690 void FreeUsedElementVariables(); 00691 void FreeUsedNodeVariables(); 00693 00695 void Reset(); 00696 00699 int GetBlockLocalIndex(int id); 00700 00701 protected: 00702 vtkModelMetadata(); 00703 ~vtkModelMetadata(); 00704 00705 private: 00706 void InitializeAllMetadata(); 00707 void InitializeAllIvars(); 00708 00709 void FreeAllMetadata(); 00710 void FreeAllIvars(); 00711 00712 void FreeQARecords(); 00713 00714 int BuildBlockElementIdListIndex(); 00715 int BuildBlockAttributesIndex(); 00716 int BuildNodeSetNodeIdListIndex(); 00717 int BuildNodeSetDistributionFactorIndex(); 00718 int BuildSideSetListIndex(); 00719 int BuildSideSetDistributionFactorIndex(); 00720 00721 int InitializeFromSizeArray(vtkIntArray *ia, int &maxStr, int &maxLine); 00722 vtkIntArray *PackSizeArray(int maxStr, int maxLine); 00723 int InitializeFromIntArray(vtkModelMetadata *sizes, vtkIntArray *ia); 00724 vtkIntArray *PackIntArray(); 00725 int InitializeFromCharArray(vtkModelMetadata *sizes, 00726 vtkCharArray *uca, int maxStr, int maxLine); 00727 vtkCharArray *PackCharArray(int maxStr, int maxLine); 00728 int InitializeFromFloatArray(vtkFloatArray *fa); 00729 vtkFloatArray *PackFloatArray(); 00730 00731 static char *StrDupWithNew(const char *s); 00732 00733 static char *WriteLines(char *p, int maxLines, int maxLen, char **lines); 00734 static char *ReadLines(char ***to, int maxLines, 00735 int maxLen, char *from); 00736 static char **CopyLines(char **lines, int num); 00737 static int *CopyInts(int *vals, int num); 00738 00739 static int FindNameOnList(char *name, char **list, int listLen); 00740 00741 int MergeIdLists(int numSubLists, 00742 int *id1, int *id1Idx, int id1Len, 00743 float *dist1, int *dist1Idx, int dist1Len, 00744 int *id2, int *id2Idx, int id2Len, 00745 float *dist2, int *dist2Idx, int dist2Len, 00746 int **idNew, int **idNewIdx, int *idNewLen, 00747 float **distNew, int **distNewIdx, int *distNewLen); 00748 00749 int AppendFloatLists(int numSubLists, 00750 float *id1, int *id1Idx, int id1Len, 00751 float *id2, int *id2Idx, int id2Len, 00752 float **idNew, int **idNewIdx, int *idNewLen); 00753 00754 int AppendIntegerLists(int numSubLists, 00755 int *id1, int *id1Idx, int id1Len, 00756 int *id2, int *id2Idx, int id2Len, 00757 int **idNew, int **idNewIdx, int *idNewLen); 00758 00759 void ExtractCellsFromBlockData(vtkModelMetadataSTLCloak *idset, 00760 vtkModelMetadata *mmd); 00761 void ExtractNodesFromNodeSetData(vtkModelMetadataSTLCloak *idset, 00762 vtkModelMetadata *mmd); 00763 void ExtractSidesFromSideSetData(vtkModelMetadataSTLCloak *idset, 00764 vtkModelMetadata *mmd); 00765 00766 void ShowFloats(const char *what, int num, float *f); 00767 void ShowLines(const char *what, int num, char **l); 00768 void ShowIntArray(const char *what, int numx, int numy, int *id); 00769 void ShowInts(const char *what, int num, int *id); 00770 void ShowListsOfInts(const char *what, int *list, 00771 int nlists, int *idx, int len, int verbose); 00772 void ShowListsOfFloats(const char *what, float *list, 00773 int nlists, int *idx, int len, int verbose); 00774 00775 void SetOriginalElementVariableNames(int nvars, char **names); 00776 void SetElementVariableNames(int nvars, char **names); 00777 void SetElementVariableNumberOfComponents(int *comp); 00778 void SetMapToOriginalElementVariableNames(int *map); 00779 00780 void SetOriginalNodeVariableNames(int nvars, char **names); 00781 void SetNodeVariableNames(int nvars, char **names); 00782 void SetNodeVariableNumberOfComponents(int *comp); 00783 void SetMapToOriginalNodeVariableNames(int *map); 00784 00785 int CalculateMaximumLengths(int &maxString, int &maxLine); 00786 00787 // Fields in Exodus II file and their size (defined in exodusII.h) 00788 // (G - global fields, relevant to entire file or file set) 00789 // (L - local fields, they differ depending on which cells and nodes are 00790 // in a file of a partitioned set, or are read in from file) 00791 00792 char *Title; // (G) 00793 00794 int NumberOfQARecords; // (G) 00795 //BTX 00796 char *(*QARecord)[4]; // NumberOfQARecords * 4 (G) 00797 //ETX 00798 00799 int NumberOfInformationLines; // (G) 00800 char **InformationLine; // (G) 00801 00802 int Dimension; // (G) 00803 char **CoordinateNames; // (at most 3 of these) (G) 00804 00805 // Time steps 00806 00807 int TimeStepIndex; // starting at 0 (Exodus file starts at 1) 00808 int NumberOfTimeSteps; // (G) 00809 float *TimeStepValues; // (G) 00810 00811 // Block information - arrays that are input with Set* 00812 00813 int NumberOfBlocks; // (G) 00814 00815 int *BlockIds; // NumberOfBlocks (G) (start at 1) 00816 char **BlockElementType; // NumberOfBlocks (G) 00817 int *BlockNumberOfElements; // NumberOfBlocks (L) 00818 int *BlockNodesPerElement; // NumberOfBlocks (G) 00819 int *BlockNumberOfAttributesPerElement;// NumberOfBlocks (G) 00820 int *BlockElementIdList; // SumElementsPerBlock (L) 00821 float *BlockAttributes; // SizeBlockAttributeArray (L) 00822 00823 // Block information - values that we calculate 00824 00825 int SumElementsPerBlock; 00826 int SizeBlockAttributeArray; 00827 00828 int *BlockElementIdListIndex; // NumberOfBlocks 00829 int *BlockAttributesIndex; // NumberOfBlocks 00830 00831 vtkModelMetadataSTLCloak *BlockIdIndex; // computed map 00832 00833 // Node Sets - arrays that are input to the class with Set* 00834 00835 int NumberOfNodeSets; // (G) 00836 00837 int *NodeSetIds; // NumberOfNodeSets (G) 00838 int *NodeSetSize; // NumberOfNodeSets (L) 00839 int *NodeSetNumberOfDistributionFactors; // NNS (L) (NSNDF[i] is 0 or NSS[i]) 00840 int *NodeSetNodeIdList; // SumNodesPerNodeSet (L) 00841 float *NodeSetDistributionFactors; // SumDistFactPerNodeSet (L) 00842 00843 // Node Sets - values or arrays that the class computes 00844 00845 int SumNodesPerNodeSet; 00846 int SumDistFactPerNodeSet; 00847 00848 int *NodeSetNodeIdListIndex; // NumberOfNodeSets 00849 int *NodeSetDistributionFactorIndex; // NumberOfNodeSets 00850 00851 // Side Sets - input to class with Set* 00852 00853 int NumberOfSideSets; // (G) 00854 00855 int *SideSetIds; // NumberOfSideSets (G) 00856 int *SideSetSize; // NumberOfSideSets (L) 00857 int *SideSetNumberOfDistributionFactors; // NSS (L) (SSNDF[i] = 0 or NumNodesInSide) 00858 int *SideSetElementList; // SumSidesPerSideSet (L) 00859 int *SideSetSideList; // SumSidesPerSideSet (L) 00860 int *SideSetNumDFPerSide; // SumSidesPerSideSet (L) 00861 float *SideSetDistributionFactors; // SumDistFactPerSideSet (L) 00862 00863 // Side Sets - calculated by class 00864 00865 int SumSidesPerSideSet; 00866 int SumDistFactPerSideSet; 00867 00868 int *SideSetListIndex; // NumberOfSideSets 00869 int *SideSetDistributionFactorIndex; // NumberOfSideSets 00870 00871 // Other properties, provided as input with Set* 00872 00873 int NumberOfBlockProperties; // (G) 00874 char **BlockPropertyNames; // one per property (G) 00875 int *BlockPropertyValue; // NumBlocks * NumBlockProperties (G) 00876 00877 int NumberOfNodeSetProperties; // (G) 00878 char **NodeSetPropertyNames; // one per property (G) 00879 int *NodeSetPropertyValue; // NumNodeSets * NumNodeSetProperties (G) 00880 00881 int NumberOfSideSetProperties; // (G) 00882 char **SideSetPropertyNames; // one per property (G) 00883 int *SideSetPropertyValue; // NumSideSets * NumSideSetProperties (G) 00884 00885 // Global variables, 1 value per time step per variable. We store 00886 // these as floats, even if they are doubles in the file. The values 00887 // are global in the sense that they apply to the whole data set, but 00888 // the are local in the sense that they can change with each time step. 00889 // For the purpose of this object, which represents a particular 00890 // time step, they are therefore considered "local". (Since they need 00891 // to be updated everytime another read is done from the file.) 00892 00893 int NumberOfGlobalVariables; // (G) 00894 char **GlobalVariableNames; // (G) NumberOfGlobalVariables 00895 float *GlobalVariableValue; // (G) NumberOfGlobalVariables 00896 00897 // The element and node arrays in the file were all scalar arrays. 00898 // Those with similar names were combined into vectors in VTK. Here 00899 // are all the original names from the Exodus file, the names given 00900 // the variables in the VTK ugrid, and a mapping from the VTK names 00901 // to the Exodus names. 00902 00903 int OriginalNumberOfElementVariables; // (G) 00904 char **OriginalElementVariableNames; // (G) OriginalNumberOfElementVariables 00905 int NumberOfElementVariables; // (G) 00906 int MaxNumberOfElementVariables; // (G) 00907 char **ElementVariableNames; // (G) MaxNumberOfElementVariables 00908 int *ElementVariableNumberOfComponents; // (G) MaxNumberOfElementVariables 00909 int *MapToOriginalElementVariableNames; // (G) MaxNumberOfElementVariables 00910 00911 int OriginalNumberOfNodeVariables; // (G) 00912 char **OriginalNodeVariableNames; // (G) OriginalNumberOfNodeVariables 00913 int NumberOfNodeVariables; // (G) 00914 int MaxNumberOfNodeVariables; // (G) 00915 char **NodeVariableNames; // (G) NumberOfNodeVariables 00916 int *NodeVariableNumberOfComponents; // (G) NumberOfNodeVariables 00917 int *MapToOriginalNodeVariableNames; // (G) NumberOfNodeVariables 00918 00919 int *ElementVariableTruthTable; // (G) NumBlocks*OrigNumberOfElementVariables 00920 int AllVariablesDefinedInAllBlocks; 00921 00922 private: 00923 vtkModelMetadata(const vtkModelMetadata&); // Not implemented 00924 void operator=(const vtkModelMetadata&); // Not implemented 00925 }; 00926 #endif