00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00037 #ifndef __vtkSLACReader_h
00038 #define __vtkSLACReader_h
00039
00040 #include "vtkMultiBlockDataSetAlgorithm.h"
00041
00042 #include "vtkSmartPointer.h"
00043
00044 class vtkDataArraySelection;
00045 class vtkIdTypeArray;
00046 class vtkInformationIntegerKey;
00047 class vtkInformationObjectBaseKey;
00048
00049 class VTK_IO_EXPORT vtkSLACReader : public vtkMultiBlockDataSetAlgorithm
00050 {
00051 public:
00052 vtkTypeMacro(vtkSLACReader, vtkMultiBlockDataSetAlgorithm);
00053 static vtkSLACReader *New();
00054 virtual void PrintSelf(ostream &os, vtkIndent indent);
00055
00056 vtkGetStringMacro(MeshFileName);
00057 vtkSetStringMacro(MeshFileName);
00058
00060
00064 virtual void AddModeFileName(const char *fname);
00065 virtual void RemoveAllModeFileNames();
00066 virtual unsigned int GetNumberOfModeFileNames();
00067 virtual const char *GetModeFileName(unsigned int idx);
00069
00071
00073 vtkGetMacro(ReadInternalVolume, int);
00074 vtkSetMacro(ReadInternalVolume, int);
00075 vtkBooleanMacro(ReadInternalVolume, int);
00077
00079
00081 vtkGetMacro(ReadExternalSurface, int);
00082 vtkSetMacro(ReadExternalSurface, int);
00083 vtkBooleanMacro(ReadExternalSurface, int);
00085
00087
00089 vtkGetMacro(ReadMidpoints, int);
00090 vtkSetMacro(ReadMidpoints, int);
00091 vtkBooleanMacro(ReadMidpoints, int);
00093
00095
00096 virtual int GetNumberOfVariableArrays();
00097 virtual const char *GetVariableArrayName(int idx);
00098 virtual int GetVariableArrayStatus(const char *name);
00099 virtual void SetVariableArrayStatus(const char *name, int status);
00101
00103 static int CanReadFile(const char *filename);
00104
00107 static vtkInformationIntegerKey *IS_INTERNAL_VOLUME();
00108
00111 static vtkInformationIntegerKey *IS_EXTERNAL_SURFACE();
00112
00114
00118 static vtkInformationObjectBaseKey *POINTS();
00119 static vtkInformationObjectBaseKey *POINT_DATA();
00121
00122
00124
00127 class VTK_IO_EXPORT EdgeEndpoints
00128 {
00129 public:
00130 EdgeEndpoints() : MinEndPoint(-1), MaxEndPoint(-1) {}
00131 EdgeEndpoints(vtkIdType endpointA, vtkIdType endpointB) {
00132 if (endpointA < endpointB)
00133 {
00134 this->MinEndPoint = endpointA; this->MaxEndPoint = endpointB;
00135 }
00136 else
00137 {
00138 this->MinEndPoint = endpointB; this->MaxEndPoint = endpointA;
00139 }
00140 }
00141 inline vtkIdType GetMinEndPoint() const { return this->MinEndPoint; }
00142 inline vtkIdType GetMaxEndPoint() const { return this->MaxEndPoint; }
00143 inline bool operator==(const EdgeEndpoints &other) const {
00144 return ( (this->GetMinEndPoint() == other.GetMinEndPoint())
00145 && (this->GetMaxEndPoint() == other.GetMaxEndPoint()) );
00146 }
00147 protected:
00148 vtkIdType MinEndPoint;
00149 vtkIdType MaxEndPoint;
00150 };
00152
00154
00155 class VTK_IO_EXPORT MidpointCoordinates
00156 {
00157 public:
00158 MidpointCoordinates() {}
00159 MidpointCoordinates(const double coord[3], vtkIdType id) {
00160 this->Coordinate[0] = coord[0];
00161 this->Coordinate[1] = coord[1];
00162 this->Coordinate[2] = coord[2];
00163 this->ID = id;
00164 }
00165 double Coordinate[3];
00166 vtkIdType ID;
00167 };
00169
00170 enum {
00171 SURFACE_OUTPUT = 0,
00172 VOLUME_OUTPUT = 1,
00173 NUM_OUTPUTS = 2
00174 };
00175
00176
00177 protected:
00178 vtkSLACReader();
00179 ~vtkSLACReader();
00180
00181
00182 class vtkInternal;
00183 vtkInternal *Internal;
00184
00185
00186
00187 friend class vtkInternal;
00188
00189 char *MeshFileName;
00190
00191 int ReadInternalVolume;
00192 int ReadExternalSurface;
00193 int ReadMidpoints;
00194
00196 bool ReadModeData;
00197
00199 bool TimeStepModes;
00200
00202
00203 bool FrequencyModes;
00204
00205
00206
00207 double Frequency;
00208
00209
00210 double Phase;
00212
00213
00214
00215 virtual int RequestInformation(vtkInformation *request,
00216 vtkInformationVector **inputVector,
00217 vtkInformationVector *outputVector);
00218
00219 virtual int RequestData(vtkInformation *request,
00220 vtkInformationVector **inputVector,
00221 vtkInformationVector *outputVector);
00222
00224
00225 static void SelectionModifiedCallback(vtkObject *caller, unsigned long eid,
00226 void *clientdata, void *calldata);
00228
00230
00235 virtual vtkIdType GetNumTuplesInVariable(int ncFD, int varId,
00236 int expectedNumComponents);
00238
00241 virtual int CheckTetrahedraWinding(int meshFD);
00242
00244
00246 virtual int ReadConnectivity(int meshFD, vtkMultiBlockDataSet *surfaceOutput,
00247 vtkMultiBlockDataSet *volumeOutput);
00249
00251
00252 virtual int ReadTetrahedronInteriorArray(int meshFD,
00253 vtkIdTypeArray *connectivity);
00254 virtual int ReadTetrahedronExteriorArray(int meshFD,
00255 vtkIdTypeArray *connectivity);
00257
00258
00261 virtual vtkSmartPointer<vtkDataArray> ReadPointDataArray(int ncFD, int varId);
00262
00263
00264
00266
00267 enum {
00268 NumPerTetInt = 5,
00269 NumPerTetExt = 9
00270 };
00272
00273
00274
00276
00277 class VTK_IO_EXPORT MidpointCoordinateMap
00278 {
00279 public:
00280 MidpointCoordinateMap();
00281 ~MidpointCoordinateMap();
00283
00284 void AddMidpoint(const EdgeEndpoints &edge,
00285 const MidpointCoordinates &midpoint);
00286 void RemoveMidpoint(const EdgeEndpoints &edge);
00287 void RemoveAllMidpoints();
00288 vtkIdType GetNumberOfMidpoints() const;
00289
00292 MidpointCoordinates *FindMidpoint(const EdgeEndpoints &edge);
00293
00294 protected:
00295 class vtkInternal;
00296 vtkInternal *Internal;
00297
00298 private:
00299
00300 MidpointCoordinateMap(const MidpointCoordinateMap &);
00301 void operator=(const MidpointCoordinateMap &);
00302 };
00303
00305
00306 class VTK_IO_EXPORT MidpointIdMap
00307 {
00308 public:
00309 MidpointIdMap();
00310 ~MidpointIdMap();
00312
00313 void AddMidpoint(const EdgeEndpoints &edge, vtkIdType midpoint);
00314 void RemoveMidpoint(const EdgeEndpoints &edge);
00315 void RemoveAllMidpoints();
00316 vtkIdType GetNumberOfMidpoints() const;
00317
00320 vtkIdType *FindMidpoint(const EdgeEndpoints &edge);
00321
00323
00324 void InitTraversal();
00325
00326
00327 bool GetNextMidpoint(EdgeEndpoints &edge, vtkIdType &midpoint);
00329
00330 protected:
00331 class vtkInternal;
00332 vtkInternal *Internal;
00333
00334 private:
00335
00336 MidpointIdMap(const MidpointIdMap &);
00337 void operator=(const MidpointIdMap &);
00338 };
00339
00340
00343 virtual int ReadCoordinates(int meshFD, vtkMultiBlockDataSet *output);
00344
00346
00349 virtual int ReadMidpointCoordinates(int meshFD, vtkMultiBlockDataSet *output,
00350 MidpointCoordinateMap &map);
00352
00354
00357 virtual int ReadMidpointData(int meshFD, vtkMultiBlockDataSet *output,
00358 MidpointIdMap &map);
00360
00362
00364 virtual int RestoreMeshCache(vtkMultiBlockDataSet *surfaceOutput,
00365 vtkMultiBlockDataSet *volumeOutput,
00366 vtkMultiBlockDataSet *compositeOutput);
00368
00371 virtual int ReadFieldData(int modeFD, vtkMultiBlockDataSet *output);
00372
00374
00376 virtual int InterpolateMidpointData(vtkMultiBlockDataSet *output,
00377 MidpointIdMap &map);
00379
00383 vtkTimeStamp MeshReadTime;
00384
00387 virtual int MeshUpToDate();
00388
00389 private:
00390 vtkSLACReader(const vtkSLACReader &);
00391 void operator=(const vtkSLACReader &);
00392 };
00393
00394 #endif //__vtkSLACReader_h