VTK
dox/Graphics/vtkModelMetadata.h
Go to the documentation of this file.
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