VTK
|
00001 /*========================================================================= 00002 00003 Program: Visualization Toolkit 00004 Module: $RCSfile: vtkExodusIIWriter.h,v $ 00005 00006 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen 00007 All rights reserved. 00008 See Copyright.txt or http://www.kitware.com/Copyright.htm 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 00070 #ifndef __vtkExodusIIWriter_h 00071 #define __vtkExodusIIWriter_h 00072 00073 #include "vtkWriter.h" 00074 #include "vtkSmartPointer.h" // For vtkSmartPointer 00075 00076 #include <vtkstd/vector> // For vector 00077 #include <vtkstd/map> // For map 00078 #include <vtkstd/string> // For string 00079 00080 class vtkModelMetadata; 00081 class vtkDoubleArray; 00082 class vtkIntArray; 00083 class vtkUnstructuredGrid; 00084 00085 class VTK_PARALLEL_EXPORT vtkExodusIIWriter : public vtkWriter 00086 { 00087 public: 00088 static vtkExodusIIWriter *New (); 00089 vtkTypeRevisionMacro (vtkExodusIIWriter, vtkWriter); 00090 void PrintSelf (ostream& os, vtkIndent indent); 00091 00100 void SetModelMetadata (vtkModelMetadata*); 00101 vtkGetObjectMacro(ModelMetadata, vtkModelMetadata); 00102 00108 vtkSetStringMacro(FileName); 00109 vtkGetStringMacro(FileName); 00110 00116 vtkSetMacro(StoreDoubles, int); 00117 vtkGetMacro(StoreDoubles, int); 00118 00122 vtkSetMacro(GhostLevel, int); 00123 vtkGetMacro(GhostLevel, int); 00124 00130 vtkSetMacro(WriteOutBlockIdArray, int); 00131 vtkGetMacro(WriteOutBlockIdArray, int); 00132 vtkBooleanMacro(WriteOutBlockIdArray, int); 00133 00138 vtkSetMacro(WriteOutGlobalNodeIdArray, int); 00139 vtkGetMacro(WriteOutGlobalNodeIdArray, int); 00140 vtkBooleanMacro(WriteOutGlobalNodeIdArray, int); 00141 00146 vtkSetMacro(WriteOutGlobalElementIdArray, int); 00147 vtkGetMacro(WriteOutGlobalElementIdArray, int); 00148 vtkBooleanMacro(WriteOutGlobalElementIdArray, int); 00149 00153 vtkSetMacro(WriteAllTimeSteps, int); 00154 vtkGetMacro(WriteAllTimeSteps, int); 00155 vtkBooleanMacro(WriteAllTimeSteps, int); 00156 00157 vtkSetStringMacro(BlockIdArrayName); 00158 vtkGetStringMacro(BlockIdArrayName); 00159 00160 protected: 00161 vtkExodusIIWriter (); 00162 ~vtkExodusIIWriter (); 00163 00164 vtkModelMetadata* ModelMetadata; 00165 00166 char *BlockIdArrayName; 00167 00168 char *FileName; 00169 int fid; 00170 00171 int NumberOfProcesses; 00172 int MyRank; 00173 00174 int PassDoubles; 00175 00176 int StoreDoubles; 00177 int GhostLevel; 00178 int WriteOutBlockIdArray; 00179 int WriteOutGlobalNodeIdArray; 00180 int WriteOutGlobalElementIdArray; 00181 int WriteAllTimeSteps; 00182 int NumberOfTimeSteps; 00183 00184 vtkDoubleArray* TimeValues; 00185 int CurrentTimeIndex; 00186 int FileTimeOffset; 00187 00188 //BTX 00189 vtkDataObject *OriginalInput; 00190 vtkstd::vector< vtkSmartPointer<vtkUnstructuredGrid> > FlattenedInput; 00191 vtkstd::vector< vtkSmartPointer<vtkUnstructuredGrid> > NewFlattenedInput; 00192 00193 vtkstd::vector< vtkIntArray* > BlockIdList; 00194 00195 struct Block 00196 { 00197 Block () : ElementStartIndex (-1), OutputIndex(-1) { } 00198 char *Name; 00199 int NumElements; 00200 int ElementStartIndex; 00201 int NodesPerElements; 00202 size_t GridIndex; 00203 // vtkstd::vector<int> CellIndex; 00204 int OutputIndex; 00205 int NumAttributes; 00206 float *BlockAttributes; // Owned by metamodel or null. Don't delete. 00207 }; 00208 vtkstd::map<int, Block> BlockInfoMap; 00209 int NumCells, NumPoints, MaxId; 00210 00211 vtkstd::vector<vtkIdType*> GlobalElementIdList; 00212 vtkstd::vector<vtkIdType*> GlobalNodeIdList; 00213 //ETX 00214 int AtLeastOneGlobalElementIdList; 00215 int AtLeastOneGlobalNodeIdList; 00216 00217 //BTX 00218 struct VariableInfo 00219 { 00220 int NumComponents; 00221 int InIndex; 00222 int ScalarOutOffset; 00223 vtkstd::vector<vtkstd::string> OutNames; 00224 }; 00225 vtkstd::map<vtkstd::string, VariableInfo> BlockVariableMap; 00226 vtkstd::map<vtkstd::string, VariableInfo> NodeVariableMap; 00227 int NumberOfScalarElementArrays; 00228 int NumberOfScalarNodeArrays; 00229 //ETX 00230 00231 //BTX 00232 vtkstd::vector< vtkstd::vector<int> > CellToElementOffset; 00233 //ETX 00234 // By BlockId, and within block ID by element variable, with variables 00235 // appearing in the same order in which they appear in OutputElementArrayNames 00236 00237 int *BlockElementVariableTruthTable; 00238 int AllVariablesDefinedInAllBlocks; 00239 00240 int BlockVariableTruthValue(int blockIdx, int varIdx); 00241 00242 //BTX 00243 char *StrDupWithNew (const char *s); 00244 void StringUppercase (vtkstd::string& str); 00245 //ETX 00246 00247 int ProcessRequest (vtkInformation* request, 00248 vtkInformationVector** inputVector, 00249 vtkInformationVector* outputVector); 00250 00251 int RequestInformation (vtkInformation* request, 00252 vtkInformationVector** inputVector, 00253 vtkInformationVector* outputVector); 00254 00255 int FillInputPortInformation (int port, vtkInformation* info); 00256 00257 int RequestData (vtkInformation* request, 00258 vtkInformationVector** inputVector, 00259 vtkInformationVector* outputVector); 00260 00261 void WriteData (); 00262 00263 int FlattenHierarchy (vtkDataObject* input, bool& changed); 00264 00265 int CreateNewExodusFile (); 00266 void CloseExodusFile (); 00267 00268 int IsDouble (); 00269 void RemoveGhostCells (); 00270 int CheckParameters (); 00271 int CheckInputArrays (); 00272 int ConstructBlockInfoMap (); 00273 int ConstructVariableInfoMaps (); 00274 int ParseMetadata (); 00275 int CreateDefaultMetadata (); 00276 char *GetCellTypeName (int t); 00277 00278 int CreateBlockIdMetadata(vtkModelMetadata *em); 00279 int CreateBlockVariableMetadata (vtkModelMetadata* em); 00280 00281 //BTX 00282 char **FlattenOutVariableNames ( 00283 int nScalarArrays, 00284 const vtkstd::map<vtkstd::string, VariableInfo>& variableMap); 00285 vtkstd::string CreateNameForScalarArray (const char *root, 00286 int component, 00287 int numComponents); 00288 00289 vtkstd::map<vtkIdType, vtkIdType> *LocalNodeIdMap; 00290 vtkstd::map<vtkIdType, vtkIdType> *LocalElementIdMap; 00291 //ETX 00292 vtkIdType GetNodeLocalId(vtkIdType id); 00293 vtkIdType GetElementLocalId(vtkIdType id); 00294 00295 int WriteInitializationParameters (); 00296 int WriteQARecords (); 00297 int WriteInformationRecords (); 00298 int WritePoints (); 00299 int WriteCoordinateNames (); 00300 int WriteGlobalPointIds (); 00301 int WriteBlockInformation (); 00302 int WriteGlobalElementIds (); 00303 int WriteVariableArrayNames (); 00304 int WriteNodeSetInformation (); 00305 int WriteSideSetInformation (); 00306 int WriteProperties (); 00307 int WriteNextTimeStep (); 00308 00309 //BTX 00310 void ExtractCellData (const char *name, int comp, vtkDataArray *buffer); 00311 int WriteCellData (int timestep, vtkDataArray *buffer); 00312 void ExtractPointData (const char *name, int comp, vtkDataArray *buffer); 00313 int WritePointData (int timestep, vtkDataArray *buffer); 00314 //ETX 00315 00316 00317 private: 00318 vtkExodusIIWriter (const vtkExodusIIWriter&); // Not Implemented 00319 void operator= (const vtkExodusIIWriter&); // Not Implemented 00320 }; 00321 00322 #endif