00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00071 #ifndef __vtkExodusIIWriter_h
00072 #define __vtkExodusIIWriter_h
00073
00074
00075 #include "vtkWriter.h"
00076
00077 #include <vtkstd/map>
00078
00079 class vtkUnstructuredGrid;
00080 class vtkFloatArray;
00081 class vtkDoubleArray;
00082 class vtkDataArray;
00083 class vtkUnsignedCharArray;
00084 class vtkIntArray;
00085 class vtkIdTypeArray;
00086 class vtkModelMetadata;
00087
00088 class VTK_PARALLEL_EXPORT vtkExodusIIWriter : public vtkWriter
00089 {
00090 public:
00091 static vtkExodusIIWriter *New();
00092 vtkTypeRevisionMacro(vtkExodusIIWriter,vtkWriter);
00093 void PrintSelf(ostream& os, vtkIndent indent);
00094
00097 void SetInput(vtkUnstructuredGrid *ug);
00098 vtkUnstructuredGrid *GetInput();
00099
00108 virtual void SetModelMetadata(vtkModelMetadata*);
00109 vtkGetObjectMacro(ModelMetadata, vtkModelMetadata);
00110
00120 vtkModelMetadata* GetOrCreateModelMetadata();
00121
00127 vtkSetStringMacro(FileName);
00128 vtkGetStringMacro(FileName);
00129
00135 vtkSetMacro(StoreDoubles, int);
00136 vtkGetMacro(StoreDoubles, int);
00137
00141 vtkSetMacro(GhostLevel, int);
00142 vtkGetMacro(GhostLevel, int);
00143
00152 vtkSetStringMacro(BlockIdArrayName);
00153 vtkGetStringMacro(BlockIdArrayName);
00154
00159 vtkSetMacro(WriteOutBlockIdArray, int);
00160 vtkGetMacro(WriteOutBlockIdArray, int);
00161 vtkBooleanMacro(WriteOutBlockIdArray, int);
00162
00167 vtkSetMacro(WriteOutGlobalNodeIdArray, int);
00168 vtkGetMacro(WriteOutGlobalNodeIdArray, int);
00169 vtkBooleanMacro(WriteOutGlobalNodeIdArray, int);
00170
00175 vtkSetMacro(WriteOutGlobalElementIdArray, int);
00176 vtkGetMacro(WriteOutGlobalElementIdArray, int);
00177 vtkBooleanMacro(WriteOutGlobalElementIdArray, int);
00178
00182 vtkSetMacro(WriteAllTimeSteps, int);
00183 vtkGetMacro(WriteAllTimeSteps, int);
00184 vtkBooleanMacro(WriteAllTimeSteps, int);
00185
00186
00192 void SetAllBlockIds(int numEntries, int *blockIds);
00193
00199 vtkSetMacro(ErrorStatus, int);
00200 vtkGetMacro(ErrorStatus, int);
00201
00202 protected:
00203
00204 vtkExodusIIWriter();
00205 ~vtkExodusIIWriter();
00206
00207 virtual int ProcessRequest(vtkInformation *request,
00208 vtkInformationVector **inputVector,
00209 vtkInformationVector *outputVector);
00210 virtual int RequestData(vtkInformation *request,
00211 vtkInformationVector **inputVector,
00212 vtkInformationVector *outputVector);
00213 virtual int RequestInformation( vtkInformation *request,
00214 vtkInformationVector **inputVector,
00215 vtkInformationVector *outputVector);
00216
00217 virtual int FillInputPortInformation(int port, vtkInformation* info);
00218
00219 void WriteData();
00220
00221 vtkExodusIIWriter(const vtkExodusIIWriter&);
00222 void operator=(const vtkExodusIIWriter&);
00223
00224 vtkSetStringMacro(MyFileName);
00225 vtkGetStringMacro(MyFileName);
00226
00228
00231 vtkSetMacro(MyRank, int);
00232 vtkGetMacro(MyRank, int);
00234
00235 void StringUppercase(const char* str, char* upperstr);
00236
00237 private:
00238 static char *StrDupWithNew(const char *s);
00239
00240 void RemoveGhostCells();
00241
00242 void SetPassDoubles();
00243
00244 int CheckParameters();
00245 int CreateExodusModel();
00246 int CreateBlockIdInformationFromCellTypes(vtkModelMetadata *em);
00247 int CreateBlockIdInformation(vtkModelMetadata *em);
00248
00249 static char **FlattenOutVariableNames(int narrays, int nScalarArrays,
00250 char **nms, int *numComponents);
00251 static void CreateNamesForScalarArrays(const char *root, char **nms,
00252 int numComponents);
00253 static char *GetCellTypeName(int t);
00254 static int FindCellType(int blockId, int *blockIdList, unsigned char *cellTypeList,
00255 int nCells);
00256
00257 int CreateNewExodusFile();
00258 int OpenExodusFile();
00259 void CloseExodusFile();
00260
00261 void InitializeVariableArrayNames();
00262 void ClearVariableArrayNames();
00263 void SetNewNodeVariableNames(vtkDataArray *da, char **nm);
00264 void SetNewElementVariableNames(vtkDataArray *da, char **nm);
00265
00266 void InitializeBlockLists();
00267 void ClearBlockLists();
00268 int WriteBlockVariables();
00269
00270 vtkstd::map<int, int> *BuildBlockElementSearchStructure(int block);
00271
00272
00273 int WriteInitializationParameters();
00274 int WriteQARecords();
00275 int WriteInformationRecords();
00276 int WritePoints();
00277 int WriteCoordinateNames();
00278 int WriteGlobalPointIds();
00279 int WriteGlobalElementIds();
00280 int WriteBlockInformation();
00281 int WriteVariableArrayNames();
00282 int WriteNodeSetInformation();
00283 int WriteSideSetInformation();
00284 int WriteProperties();
00285
00286 int WriteNextTimeStep();
00287 float *ExtractComponentF(vtkDataArray *da, int comp, int *idx);
00288 double *ExtractComponentD(vtkDataArray *da, int comp, int *idx);
00289
00290 vtkModelMetadata *ModelMetadata;
00291
00292 int PassDoubles;
00293
00294 int StoreDoubles;
00295
00296 int fid;
00297
00298 char *FileName;
00299 char *MyFileName;
00300
00301
00302
00303
00304
00305
00306 int *InputBlockIds;
00307 int InputBlockIdsLength;
00308
00309
00310
00311 vtkIdType *GlobalElementIdList;
00312
00313 vtkstd::map<vtkIdType, vtkIdType> *LocalElementIdMap;
00314
00315 vtkIdType GetElementLocalId(vtkIdType i);
00316 int WriteOutGlobalElementIdArray;
00317
00318
00319
00320 vtkIdType *GlobalNodeIdList;
00321
00322 vtkstd::map<vtkIdType, vtkIdType> *LocalNodeIdMap;
00323
00324 vtkIdType GetNodeLocalId(vtkIdType i);
00325 int WriteOutGlobalNodeIdArray;
00326
00327
00328
00329 char *BlockIdArrayName;
00330 int *BlockIdList;
00331 int WriteOutBlockIdArray;
00332
00333 int NumberOfElementBlocks;
00334 int *BlockIds;
00335
00336 vtkstd::map<int, int> *LocalBlockIndexMap;
00337
00338 int GetBlockLocalIndex(int i);
00339 int *BlockElementStart;
00340 int *ElementIndex;
00341
00342 char **BlockElementType;
00343 int *NumberOfElementsPerBlock;
00344 int *NumberOfNodesPerElementInBlock;
00345 int *NumberOfAttributesPerElementInBlock;
00346 float **BlockElementAttributesF;
00347 double **BlockElementAttributesD;
00348 int **BlockElementConnectivity;
00349
00350
00351
00352
00353 int *BlockElementVariableTruthTable;
00354 int AllVariablesDefinedInAllBlocks;
00355
00356 int BlockVariableTruthValue(int blockIdx, int varIdx);
00357
00358
00359
00360 int NumberOfScalarElementArrays;
00361 char **InputElementArrayNames;
00362 char **OutputElementArrayNames;
00363 int *InputElementArrayComponent;
00364
00365
00366
00367 int NumberOfScalarNodeArrays;
00368 char **InputNodeArrayNames;
00369 char **OutputNodeArrayNames;
00370 int *InputNodeArrayComponent;
00371
00372
00373
00374 int NumberOfProcesses;
00375 int MyRank;
00376
00377
00378
00379 vtkUnstructuredGrid *MyInput;
00380
00381
00382
00383 int GhostLevel;
00384
00385 int ErrorStatus;
00386
00387 int CurrentTimeIndex;
00388 int NumberOfTimeSteps;
00389 int WriteAllTimeSteps;
00390 vtkDoubleArray *TimeValues;
00391 };
00392
00393 #endif