00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00035 #ifndef __vtkNetCDFCFReader_h
00036 #define __vtkNetCDFCFReader_h
00037
00038 #include "vtkNetCDFReader.h"
00039
00040 #include <vtkStdString.h>
00041
00042 class vtkImageData;
00043 class vtkPoints;
00044 class vtkRectilinearGrid;
00045 class vtkStructuredGrid;
00046 class vtkUnstructuredGrid;
00047
00048 class VTK_IO_EXPORT vtkNetCDFCFReader : public vtkNetCDFReader
00049 {
00050 public:
00051 vtkTypeMacro(vtkNetCDFCFReader, vtkNetCDFReader);
00052 static vtkNetCDFCFReader *New();
00053 virtual void PrintSelf(ostream &os, vtkIndent indent);
00054
00056
00060 vtkGetMacro(SphericalCoordinates, int);
00061 vtkSetMacro(SphericalCoordinates, int);
00062 vtkBooleanMacro(SphericalCoordinates, int);
00064
00066
00075 vtkGetMacro(VerticalScale, double);
00076 vtkSetMacro(VerticalScale, double);
00077 vtkGetMacro(VerticalBias, double);
00078 vtkSetMacro(VerticalBias, double);
00080
00082
00088 vtkGetMacro(OutputType, int);
00089 virtual void SetOutputType(int type);
00090 void SetOutputTypeToAutomatic() { this->SetOutputType(-1); }
00091 void SetOutputTypeToImage() { this->SetOutputType(VTK_IMAGE_DATA); }
00092 void SetOutputTypeToRectilinear() {this->SetOutputType(VTK_RECTILINEAR_GRID);}
00093 void SetOutputTypeToStructured() { this->SetOutputType(VTK_STRUCTURED_GRID); }
00094 void SetOutputTypeToUnstructured() {
00095 this->SetOutputType(VTK_UNSTRUCTURED_GRID);
00096 }
00098
00100 static int CanReadFile(const char *filename);
00101
00102 protected:
00103 vtkNetCDFCFReader();
00104 ~vtkNetCDFCFReader();
00105
00106 int SphericalCoordinates;
00107
00108 double VerticalScale;
00109 double VerticalBias;
00110
00111 int OutputType;
00112
00113 virtual int RequestDataObject(vtkInformation *request,
00114 vtkInformationVector **inputVector,
00115 vtkInformationVector *outputVector);
00116
00117 virtual int RequestInformation(vtkInformation *request,
00118 vtkInformationVector **inputVector,
00119 vtkInformationVector *outputVector);
00120
00121 virtual int RequestData(vtkInformation *request,
00122 vtkInformationVector **inputVector,
00123 vtkInformationVector *outputVector);
00124
00125
00127
00128 virtual int ReadMetaData(int ncFD);
00129 virtual int IsTimeDimension(int ncFD, int dimId);
00130 virtual vtkSmartPointer<vtkDoubleArray> GetTimeValues(int ncFD, int dimId);
00131
00133
00134
00135 class vtkDimensionInfo {
00136 public:
00137 vtkDimensionInfo() { };
00138 vtkDimensionInfo(int ncFD, int id);
00139 const char *GetName() const { return this->Name.c_str(); }
00140 enum UnitsEnum {
00141 UNDEFINED_UNITS,
00142 TIME_UNITS,
00143 LATITUDE_UNITS,
00144 LONGITUDE_UNITS,
00145 VERTICAL_UNITS
00146 };
00147 UnitsEnum GetUnits() const { return this->Units; }
00148 vtkSmartPointer<vtkDoubleArray> GetCoordinates() {return this->Coordinates;}
00149 vtkSmartPointer<vtkDoubleArray> GetBounds() { return this->Bounds; }
00150 bool GetHasRegularSpacing() const { return this->HasRegularSpacing; }
00151 double GetOrigin() const { return this->Origin; }
00152 double GetSpacing() const { return this->Spacing; }
00153 vtkSmartPointer<vtkStringArray> GetSpecialVariables() const {
00154 return this->SpecialVariables;
00155 }
00156 protected:
00157 vtkStdString Name;
00158 int DimId;
00159 vtkSmartPointer<vtkDoubleArray> Coordinates;
00160 vtkSmartPointer<vtkDoubleArray> Bounds;
00161 UnitsEnum Units;
00162 bool HasRegularSpacing;
00163 double Origin, Spacing;
00164 vtkSmartPointer<vtkStringArray> SpecialVariables;
00165 int LoadMetaData(int ncFD);
00166 };
00167 class vtkDimensionInfoVector;
00168 friend class vtkDimensionInfoVector;
00169 vtkDimensionInfoVector *DimensionInfo;
00170 vtkDimensionInfo *GetDimensionInfo(int dimension);
00171
00172 class vtkDependentDimensionInfo {
00173 public:
00174 vtkDependentDimensionInfo() : Valid(false) { };
00175 vtkDependentDimensionInfo(int ncFD, int varId, vtkNetCDFCFReader *parent);
00176 bool GetValid() const { return this->Valid; }
00177 bool GetHasBounds() const { return this->HasBounds; }
00178 bool GetCellsUnstructured() const { return this->CellsUnstructured; }
00179 vtkSmartPointer<vtkIntArray> GetGridDimensions() const {
00180 return this->GridDimensions;
00181 }
00182 vtkSmartPointer<vtkDoubleArray> GetLongitudeCoordinates() const {
00183 return this->LongitudeCoordinates;
00184 }
00185 vtkSmartPointer<vtkDoubleArray> GetLatitudeCoordinates() const {
00186 return this->LatitudeCoordinates;
00187 }
00188 vtkSmartPointer<vtkStringArray> GetSpecialVariables() const {
00189 return this->SpecialVariables;
00190 }
00191 protected:
00192 bool Valid;
00193 bool HasBounds;
00194 bool CellsUnstructured;
00195 vtkSmartPointer<vtkIntArray> GridDimensions;
00196 vtkSmartPointer<vtkDoubleArray> LongitudeCoordinates;
00197 vtkSmartPointer<vtkDoubleArray> LatitudeCoordinates;
00198 vtkSmartPointer<vtkStringArray> SpecialVariables;
00199 int LoadMetaData(int ncFD, int varId, vtkNetCDFCFReader *parent);
00200 int LoadCoordinateVariable(int ncFD, int varId, vtkDoubleArray *coords);
00201 int LoadBoundsVariable(int ncFD, int varId, vtkDoubleArray *coords);
00202 int LoadUnstructuredBoundsVariable(int ncFD, int varId,
00203 vtkDoubleArray *coords);
00204 };
00205 friend class vtkDependentDimensionInfo;
00206 class vtkDependentDimensionInfoVector;
00207 friend class vtkDependentDimensionInfoVector;
00208 vtkDependentDimensionInfoVector *DependentDimensionInfo;
00209
00210
00211
00212 vtkDependentDimensionInfo *FindDependentDimensionInfo(vtkIntArray *dims);
00213
00214
00216
00219 virtual void IdentifySphericalCoordinates(vtkIntArray *dimensions,
00220 int &longitudeDim,
00221 int &latitudeDim,
00222 int &verticalDim);
00224
00225 enum CoordinateTypesEnum {
00226 COORDS_UNIFORM_RECTILINEAR,
00227 COORDS_NONUNIFORM_RECTILINEAR,
00228 COORDS_REGULAR_SPHERICAL,
00229 COORDS_2D_EUCLIDEAN,
00230 COORDS_2D_SPHERICAL,
00231 COORDS_EUCLIDEAN_4SIDED_CELLS,
00232 COORDS_SPHERICAL_4SIDED_CELLS,
00233 COORDS_EUCLIDEAN_PSIDED_CELLS,
00234 COORDS_SPHERICAL_PSIDED_CELLS
00235 };
00236
00240 CoordinateTypesEnum CoordinateType(vtkIntArray *dimensions);
00241
00243 virtual bool DimensionsAreForPointData(vtkIntArray *dimensions);
00244
00246
00249 void ExtentForDimensionsAndPiece(int pieceNumber,
00250 int numberOfPieces,
00251 int ghostLevels,
00252 int extent[6]);
00254
00256 virtual void GetUpdateExtentForOutput(vtkDataSet *output, int extent[6]);
00257
00259
00260 void AddRectilinearCoordinates(vtkImageData *imageOutput);
00261 void AddRectilinearCoordinates(vtkRectilinearGrid *rectilinearOutput);
00262 void Add1DRectilinearCoordinates(vtkPoints *points, const int extent[6]);
00263 void Add2DRectilinearCoordinates(vtkPoints *points, const int extent[6]);
00264 void Add1DRectilinearCoordinates(vtkStructuredGrid *structuredOutput);
00265 void Add2DRectilinearCoordinates(vtkStructuredGrid *structuredOutput);
00266 void Add1DRectilinearCoordinates(vtkUnstructuredGrid *unstructuredOutput,
00267 const int extent[6]);
00268 void Add2DRectilinearCoordinates(vtkUnstructuredGrid *unstructuredOutput,
00269 const int extent[6]);
00271
00273
00274 void Add1DSphericalCoordinates(vtkPoints *points, const int extent[6]);
00275 void Add2DSphericalCoordinates(vtkPoints *points, const int extent[6]);
00276 void Add1DSphericalCoordinates(vtkStructuredGrid *structuredOutput);
00277 void Add2DSphericalCoordinates(vtkStructuredGrid *structuredOutput);
00278 void Add1DSphericalCoordinates(vtkUnstructuredGrid *unstructuredOutput,
00279 const int extent[6]);
00280 void Add2DSphericalCoordinates(vtkUnstructuredGrid *unstructuredOutput,
00281 const int extent[6]);
00283
00285
00287 void AddStructuredCells(vtkUnstructuredGrid *unstructuredOutput,
00288 const int extent[6]);
00290
00292
00293 void AddUnstructuredRectilinearCoordinates(
00294 vtkUnstructuredGrid *unstructuredOutput,
00295 const int extent[6]);
00296 void AddUnstructuredSphericalCoordinates(
00297 vtkUnstructuredGrid *unstructuredOutput,
00298 const int extent[6]);
00300
00301
00302 private:
00303 vtkNetCDFCFReader(const vtkNetCDFCFReader &);
00304 void operator=(const vtkNetCDFCFReader &);
00305 };
00306
00307 #endif //__vtkNetCDFCFReader_h
00308