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 vtkStructuredGrid;
00043
00044 class VTK_IO_EXPORT vtkNetCDFCFReader : public vtkNetCDFReader
00045 {
00046 public:
00047 vtkTypeMacro(vtkNetCDFCFReader, vtkNetCDFReader);
00048 static vtkNetCDFCFReader *New();
00049 virtual void PrintSelf(ostream &os, vtkIndent indent);
00050
00052
00056 vtkGetMacro(SphericalCoordinates, int);
00057 vtkSetMacro(SphericalCoordinates, int);
00058 vtkBooleanMacro(SphericalCoordinates, int);
00060
00062
00071 vtkGetMacro(VerticalScale, double);
00072 vtkSetMacro(VerticalScale, double);
00073 vtkGetMacro(VerticalBias, double);
00074 vtkSetMacro(VerticalBias, double);
00076
00078 static int CanReadFile(const char *filename);
00079
00080 protected:
00081 vtkNetCDFCFReader();
00082 ~vtkNetCDFCFReader();
00083
00084 int SphericalCoordinates;
00085
00086 double VerticalScale;
00087 double VerticalBias;
00088
00089 virtual int RequestDataObject(vtkInformation *request,
00090 vtkInformationVector **inputVector,
00091 vtkInformationVector *outputVector);
00092
00093 virtual int RequestData(vtkInformation *request,
00094 vtkInformationVector **inputVector,
00095 vtkInformationVector *outputVector);
00096
00097
00099
00100 virtual int ReadMetaData(int ncFD);
00101 virtual int IsTimeDimension(int ncFD, int dimId);
00102 virtual vtkSmartPointer<vtkDoubleArray> GetTimeValues(int ncFD, int dimId);
00104
00105
00106
00107 class vtkDimensionInfo {
00108 public:
00109 vtkDimensionInfo() { };
00110 vtkDimensionInfo(int ncFD, int id);
00111 const char *GetName() const { return this->Name.c_str(); }
00112 enum UnitsEnum {
00113 UNDEFINED_UNITS,
00114 TIME_UNITS,
00115 LATITUDE_UNITS,
00116 LONGITUDE_UNITS,
00117 VERTICAL_UNITS
00118 };
00119 UnitsEnum GetUnits() const { return this->Units; }
00120 vtkSmartPointer<vtkDoubleArray> GetCoordinates() {return this->Coordinates;}
00121 vtkSmartPointer<vtkDoubleArray> GetBounds() { return this->Bounds; }
00122 bool GetHasRegularSpacing() const { return this->HasRegularSpacing; }
00123 double GetOrigin() const { return this->Origin; }
00124 double GetSpacing() const { return this->Spacing; }
00125 vtkSmartPointer<vtkStringArray> GetSpecialVariables() const {
00126 return this->SpecialVariables;
00127 }
00128 protected:
00129 vtkStdString Name;
00130 int DimId;
00131 vtkSmartPointer<vtkDoubleArray> Coordinates;
00132 vtkSmartPointer<vtkDoubleArray> Bounds;
00133 UnitsEnum Units;
00134 bool HasRegularSpacing;
00135 double Origin, Spacing;
00136 vtkSmartPointer<vtkStringArray> SpecialVariables;
00137 int LoadMetaData(int ncFD);
00138 };
00139 class vtkDimensionInfoVector;
00140 friend class vtkDimensionInfoVector;
00141 vtkDimensionInfoVector *DimensionInfo;
00142 vtkDimensionInfo *GetDimensionInfo(int dimension);
00143
00144 class vtkDependentDimensionInfo {
00145 public:
00146 vtkDependentDimensionInfo() : Valid(false) { };
00147 vtkDependentDimensionInfo(int ncFD, int varId, vtkNetCDFCFReader *parent);
00148 bool GetValid() const { return this->Valid; }
00149 bool GetHasBounds() const { return this->HasBounds; }
00150 vtkSmartPointer<vtkIntArray> GetGridDimensions() const {
00151 return this->GridDimensions;
00152 }
00153 vtkSmartPointer<vtkDoubleArray> GetLongitudeCoordinates() const {
00154 return this->LongitudeCoordinates;
00155 }
00156 vtkSmartPointer<vtkDoubleArray> GetLatitudeCoordinates() const {
00157 return this->LatitudeCoordinates;
00158 }
00159 vtkSmartPointer<vtkStringArray> GetSpecialVariables() const {
00160 return this->SpecialVariables;
00161 }
00162 protected:
00163 bool Valid;
00164 bool HasBounds;
00165 vtkSmartPointer<vtkIntArray> GridDimensions;
00166 vtkSmartPointer<vtkDoubleArray> LongitudeCoordinates;
00167 vtkSmartPointer<vtkDoubleArray> LatitudeCoordinates;
00168 vtkSmartPointer<vtkStringArray> SpecialVariables;
00169 int LoadMetaData(int ncFD, int varId, vtkNetCDFCFReader *parent);
00170 int LoadCoordinateVariable(int ncFD, int varId, vtkDoubleArray *coords);
00171 int LoadBoundsVariable(int ncFD, int varId, vtkDoubleArray *coords);
00172 };
00173 friend class vtkDependentDimensionInfo;
00174 class vtkDependentDimensionInfoVector;
00175 friend class vtkDependentDimensionInfoVector;
00176 vtkDependentDimensionInfoVector *DependentDimensionInfo;
00177
00178
00179
00180 vtkDependentDimensionInfo *FindDependentDimensionInfo(vtkIntArray *dims);
00181 vtkDependentDimensionInfo *FindDependentDimensionInfo(const int *dims,
00182 int numDims);
00183
00184
00186
00189 virtual void IdentifySphericalCoordinates(const int *dimensions,
00190 int numDimensions,
00191 int &longitudeDim,
00192 int &latitudeDim,
00193 int &verticalDim);
00195
00197
00199 bool CoordinatesAreSpherical(const int *dimensions, int numDimensions)
00200 {
00201 if (this->FindDependentDimensionInfo(dimensions, numDimensions) != NULL)
00202 {
00203 return true;
00204 }
00206
00207 int longitudeDim, latitudeDim, verticalDim;
00208 this->IdentifySphericalCoordinates(dimensions, numDimensions,
00209 longitudeDim, latitudeDim, verticalDim);
00210 if ( (longitudeDim != -1) && (latitudeDim != -1)
00211 && ((numDimensions == 2) || (verticalDim != -1)) )
00212 {
00213 return true;
00214 }
00215 else
00216 {
00217 return false;
00218 }
00219 }
00220
00222
00223 virtual bool DimensionsAreForPointData(const int *dimensions,
00224 int numDimensions)
00225 {
00226 if (!this->SphericalCoordinates) return true;
00227 if (!this->CoordinatesAreSpherical(dimensions, numDimensions)) return true;
00229
00230
00231
00232 vtkDependentDimensionInfo *info
00233 = this->FindDependentDimensionInfo(dimensions, numDimensions);
00234 if (info && !info->GetHasBounds()) return true;
00235
00236 return false;
00237 }
00238
00240
00241 void Add1DSphericalCoordinates(vtkStructuredGrid *structOutput);
00242 void Add2DSphericalCoordinates(vtkStructuredGrid *structOutput);
00244
00245
00246 private:
00247 vtkNetCDFCFReader(const vtkNetCDFCFReader &);
00248 void operator=(const vtkNetCDFCFReader &);
00249 };
00250
00251 #endif //__vtkNetCDFCFReader_h
00252