// -*- c++ -*- /*========================================================================= Program: Visualization Toolkit Module: vtkNetCDFCFReader.h Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. See Copyright.txt or http://www.kitware.com/Copyright.htm for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ /*------------------------------------------------------------------------- Copyright 2008 Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains certain rights in this software. -------------------------------------------------------------------------*/ /** * @class vtkNetCDFCFReader * * * * Reads netCDF files that follow the CF convention. Details on this convention * can be found at . * */ #ifndef vtkNetCDFCFReader_h #define vtkNetCDFCFReader_h #include "vtkIONetCDFModule.h" // For export macro #include "vtkNetCDFReader.h" #include "vtkStdString.h" // Used for ivars. class vtkImageData; class vtkPoints; class vtkRectilinearGrid; class vtkStructuredGrid; class vtkUnstructuredGrid; class VTKIONETCDF_EXPORT vtkNetCDFCFReader : public vtkNetCDFReader { public: vtkTypeMacro(vtkNetCDFCFReader, vtkNetCDFReader); static vtkNetCDFCFReader* New(); void PrintSelf(ostream& os, vtkIndent indent) override; //@{ /** * If on (the default), then 3D data with latitude/longitude dimensions * will be read in as curvilinear data shaped like spherical coordinates. * If false, then the data will always be read in Cartesian coordinates. */ vtkGetMacro(SphericalCoordinates, vtkTypeBool); vtkSetMacro(SphericalCoordinates, vtkTypeBool); vtkBooleanMacro(SphericalCoordinates, vtkTypeBool); //@} //@{ /** * The scale and bias of the vertical component of spherical coordinates. It * is common to write the vertical component with respect to something other * than the center of the sphere (for example, the surface). In this case, it * might be necessary to scale and/or bias the vertical height. The height * will become height*scale + bias. Keep in mind that if the positive * attribute of the vertical dimension is down, then the height is negated. * By default the scale is 1 and the bias is 0 (that is, no change). The * scaling will be adjusted if it results in invalid (negative) vertical * values. */ vtkGetMacro(VerticalScale, double); vtkSetMacro(VerticalScale, double); vtkGetMacro(VerticalBias, double); vtkSetMacro(VerticalBias, double); //@} //@{ /** * Set/get the data type of the output. The index used is taken from the list * of VTK data types in vtkType.h. Valid types are VTK_IMAGE_DATA, * VTK_RECTILINEAR_GRID, VTK_STRUCTURED_GRID, and VTK_UNSTRUCTURED_GRID. In * addition you can set the type to -1 (the default), and this reader will * pick the data type best suited for the dimensions being read. */ vtkGetMacro(OutputType, int); virtual void SetOutputType(int type); void SetOutputTypeToAutomatic() { this->SetOutputType(-1); } void SetOutputTypeToImage() { this->SetOutputType(VTK_IMAGE_DATA); } void SetOutputTypeToRectilinear() { this->SetOutputType(VTK_RECTILINEAR_GRID); } void SetOutputTypeToStructured() { this->SetOutputType(VTK_STRUCTURED_GRID); } void SetOutputTypeToUnstructured() { this->SetOutputType(VTK_UNSTRUCTURED_GRID); } //@} /** * Returns true if the given file can be read. */ static int CanReadFile(const char* filename); protected: vtkNetCDFCFReader(); ~vtkNetCDFCFReader() override; vtkTypeBool SphericalCoordinates; double VerticalScale; double VerticalBias; int OutputType; int RequestDataObject(vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) override; int RequestInformation(vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) override; int RequestData(vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) override; //@{ /** * Interprets the special conventions of COARDS. */ int ReadMetaData(int ncFD) override; int IsTimeDimension(int ncFD, int dimId) override; vtkSmartPointer GetTimeValues(int ncFD, int dimId) override; //@} class vtkDimensionInfo { public: vtkDimensionInfo() {} vtkDimensionInfo(int ncFD, int id); const char* GetName() const { return this->Name.c_str(); } enum UnitsEnum { UNDEFINED_UNITS, TIME_UNITS, LATITUDE_UNITS, LONGITUDE_UNITS, VERTICAL_UNITS }; UnitsEnum GetUnits() const { return this->Units; } vtkSmartPointer GetCoordinates() { return this->Coordinates; } vtkSmartPointer GetBounds() { return this->Bounds; } bool GetHasRegularSpacing() const { return this->HasRegularSpacing; } double GetOrigin() const { return this->Origin; } double GetSpacing() const { return this->Spacing; } vtkSmartPointer GetSpecialVariables() const { return this->SpecialVariables; } protected: vtkStdString Name; int DimId; vtkSmartPointer Coordinates; vtkSmartPointer Bounds; UnitsEnum Units; bool HasRegularSpacing; double Origin, Spacing; vtkSmartPointer SpecialVariables; int LoadMetaData(int ncFD); }; class vtkDimensionInfoVector; friend class vtkDimensionInfoVector; vtkDimensionInfoVector* DimensionInfo; vtkDimensionInfo* GetDimensionInfo(int dimension); class vtkDependentDimensionInfo { public: vtkDependentDimensionInfo() : Valid(false) { } vtkDependentDimensionInfo(int ncFD, int varId, vtkNetCDFCFReader* parent); bool GetValid() const { return this->Valid; } bool GetHasBounds() const { return this->HasBounds; } bool GetCellsUnstructured() const { return this->CellsUnstructured; } vtkSmartPointer GetGridDimensions() const { return this->GridDimensions; } vtkSmartPointer GetLongitudeCoordinates() const { return this->LongitudeCoordinates; } vtkSmartPointer GetLatitudeCoordinates() const { return this->LatitudeCoordinates; } vtkSmartPointer GetSpecialVariables() const { return this->SpecialVariables; } protected: bool Valid; bool HasBounds; bool CellsUnstructured; vtkSmartPointer GridDimensions; vtkSmartPointer LongitudeCoordinates; vtkSmartPointer LatitudeCoordinates; vtkSmartPointer SpecialVariables; int LoadMetaData(int ncFD, int varId, vtkNetCDFCFReader* parent); int LoadCoordinateVariable(int ncFD, int varId, vtkDoubleArray* coords); int LoadBoundsVariable(int ncFD, int varId, vtkDoubleArray* coords); int LoadUnstructuredBoundsVariable(int ncFD, int varId, vtkDoubleArray* coords); }; friend class vtkDependentDimensionInfo; class vtkDependentDimensionInfoVector; friend class vtkDependentDimensionInfoVector; vtkDependentDimensionInfoVector* DependentDimensionInfo; // Finds the dependent dimension information for the given set of dimensions. // Returns nullptr if no information has been recorded. vtkDependentDimensionInfo* FindDependentDimensionInfo(vtkIntArray* dims); /** * Given the list of dimensions, identify the longitude, latitude, and * vertical dimensions. -1 is returned for any not found. The results depend * on the values in this->DimensionInfo. */ virtual void IdentifySphericalCoordinates( vtkIntArray* dimensions, int& longitudeDim, int& latitudeDim, int& verticalDim); enum CoordinateTypesEnum { COORDS_UNIFORM_RECTILINEAR, COORDS_NONUNIFORM_RECTILINEAR, COORDS_REGULAR_SPHERICAL, COORDS_2D_EUCLIDEAN, COORDS_2D_SPHERICAL, COORDS_EUCLIDEAN_4SIDED_CELLS, COORDS_SPHERICAL_4SIDED_CELLS, COORDS_EUCLIDEAN_PSIDED_CELLS, COORDS_SPHERICAL_PSIDED_CELLS }; /** * Based on the given dimensions and the current state of the reader, returns * how the coordinates should be interpreted. The returned value is one of * the CoordinateTypesEnum identifiers. */ CoordinateTypesEnum CoordinateType(vtkIntArray* dimensions); /** * Returns false for spherical dimensions, which should use cell data. */ bool DimensionsAreForPointData(vtkIntArray* dimensions) override; /** * Convenience function that takes piece information and then returns a set of * extents to load based on this->WholeExtent. The result is returned in * extent. */ void ExtentForDimensionsAndPiece( int pieceNumber, int numberOfPieces, int ghostLevels, int extent[6]); /** * Overridden to retrieve stored extent for unstructured data. */ void GetUpdateExtentForOutput(vtkDataSet* output, int extent[6]) override; //@{ /** * Internal methods for setting rectilinear coordinates. */ void AddRectilinearCoordinates(vtkImageData* imageOutput); void AddRectilinearCoordinates(vtkRectilinearGrid* rectilinearOutput); void FakeRectilinearCoordinates(vtkRectilinearGrid* rectilinearOutput); void Add1DRectilinearCoordinates(vtkPoints* points, const int extent[6]); void Add2DRectilinearCoordinates(vtkPoints* points, const int extent[6]); void Add1DRectilinearCoordinates(vtkStructuredGrid* structuredOutput); void Add2DRectilinearCoordinates(vtkStructuredGrid* structuredOutput); void FakeStructuredCoordinates(vtkStructuredGrid* structuredOutput); void Add1DRectilinearCoordinates(vtkUnstructuredGrid* unstructuredOutput, const int extent[6]); void Add2DRectilinearCoordinates(vtkUnstructuredGrid* unstructuredOutput, const int extent[6]); //@} //@{ /** * Internal methods for setting spherical coordinates. */ void Add1DSphericalCoordinates(vtkPoints* points, const int extent[6]); void Add2DSphericalCoordinates(vtkPoints* points, const int extent[6]); void Add1DSphericalCoordinates(vtkStructuredGrid* structuredOutput); void Add2DSphericalCoordinates(vtkStructuredGrid* structuredOutput); void Add1DSphericalCoordinates(vtkUnstructuredGrid* unstructuredOutput, const int extent[6]); void Add2DSphericalCoordinates(vtkUnstructuredGrid* unstructuredOutput, const int extent[6]); //@} /** * Internal method for building unstructred cells that match structured cells. */ void AddStructuredCells(vtkUnstructuredGrid* unstructuredOutput, const int extent[6]); //@{ /** * Internal methods for creating unstructured cells. */ void AddUnstructuredRectilinearCoordinates( vtkUnstructuredGrid* unstructuredOutput, const int extent[6]); void AddUnstructuredSphericalCoordinates( vtkUnstructuredGrid* unstructuredOutput, const int extent[6]); //@} private: vtkNetCDFCFReader(const vtkNetCDFCFReader&) = delete; void operator=(const vtkNetCDFCFReader&) = delete; }; #endif // vtkNetCDFCFReader_h