You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
182 lines
5.9 KiB
C
182 lines
5.9 KiB
C
3 weeks ago
|
/*=========================================================================
|
||
|
|
||
|
Program: Visualization Toolkit
|
||
|
Module: vtkNetCDFCAMReader.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.
|
||
|
|
||
|
=========================================================================*/
|
||
|
/**
|
||
|
* @class vtkNetCDFCAMReader
|
||
|
* @brief Read unstructured NetCDF CAM files.
|
||
|
*
|
||
|
* Reads in a NetCDF CAM (Community Atmospheric Model) file and
|
||
|
* produces and unstructured grid. The grid is actually unstructured
|
||
|
* in the X and Y directions and rectilinear in the Z direction. If we
|
||
|
* read one layer we produce quad cells otherwise we produce hex
|
||
|
* cells. The reader requires 2 NetCDF files: the main file has all
|
||
|
* attributes, the connectivity file has point positions and cell
|
||
|
* connectivity information.
|
||
|
*/
|
||
|
|
||
|
#ifndef vtkNetCDFCAMReader_h
|
||
|
#define vtkNetCDFCAMReader_h
|
||
|
|
||
|
#include "vtkIONetCDFModule.h" // For export macro
|
||
|
#include "vtkUnstructuredGridAlgorithm.h"
|
||
|
|
||
|
class vtkCallbackCommand;
|
||
|
class vtkDataArraySelection;
|
||
|
|
||
|
class VTKIONETCDF_EXPORT vtkNetCDFCAMReader : public vtkUnstructuredGridAlgorithm
|
||
|
{
|
||
|
public:
|
||
|
static vtkNetCDFCAMReader* New();
|
||
|
vtkTypeMacro(vtkNetCDFCAMReader, vtkUnstructuredGridAlgorithm);
|
||
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
||
|
|
||
|
/**
|
||
|
* Returns 1 if this file can be read and 0 if the file cannot be read.
|
||
|
* Because NetCDF CAM files come in pairs and we only check one of the
|
||
|
* files, the result is not definitive. Invalid files may still return 1
|
||
|
* although a valid file will never return 0.
|
||
|
*/
|
||
|
static int CanReadFile(const char* fileName);
|
||
|
|
||
|
void SetFileName(const char* fileName);
|
||
|
vtkGetStringMacro(FileName);
|
||
|
|
||
|
void SetConnectivityFileName(const char* fileName);
|
||
|
vtkGetStringMacro(ConnectivityFileName);
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set whether to read a single layer, midpoint layers or interface layers.
|
||
|
* VERTICAL_DIMENSION_SINGLE_LAYER (0) indicates that only a single
|
||
|
* layer will be read in. The NetCDF variables loaded will be the
|
||
|
* ones with dimensions (time, ncol).
|
||
|
* VERTICAL_DIMENSION_MIDPOINT_LAYERS (1) indicates that variables defined
|
||
|
* on midpoint layers will be read in. These are variables with dimensions
|
||
|
* (time, lev, ncol).
|
||
|
* VERTICAL_DIMENSION_INTERFACE_LAYERS (2) indicates that variables
|
||
|
* defined on interface layers will be read in. These are variables with
|
||
|
* dimensions (time, ilev, ncol).
|
||
|
*/
|
||
|
enum VerticalDimension
|
||
|
{
|
||
|
VERTICAL_DIMENSION_SINGLE_LAYER,
|
||
|
VERTICAL_DIMENSION_MIDPOINT_LAYERS,
|
||
|
VERTICAL_DIMENSION_INTERFACE_LAYERS,
|
||
|
VERTICAL_DIMENSION_COUNT
|
||
|
};
|
||
|
vtkSetClampMacro(VerticalDimension, int, 0, 2);
|
||
|
vtkGetMacro(VerticalDimension, int);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* If SingleXXXLayer is 1, we'll load only the layer specified by
|
||
|
* XXXLayerIndex. Otherwise, we load all layers. We do that for
|
||
|
* midpoint layer variables ( which have dimension 'lev') or for
|
||
|
* interface layer variables (which have dimension 'ilev').
|
||
|
*/
|
||
|
vtkBooleanMacro(SingleMidpointLayer, vtkTypeBool);
|
||
|
vtkSetMacro(SingleMidpointLayer, vtkTypeBool);
|
||
|
vtkGetMacro(SingleMidpointLayer, vtkTypeBool);
|
||
|
vtkSetMacro(MidpointLayerIndex, int);
|
||
|
vtkGetMacro(MidpointLayerIndex, int);
|
||
|
vtkGetVector2Macro(MidpointLayersRange, int);
|
||
|
|
||
|
vtkBooleanMacro(SingleInterfaceLayer, vtkTypeBool);
|
||
|
vtkSetMacro(SingleInterfaceLayer, vtkTypeBool);
|
||
|
vtkGetMacro(SingleInterfaceLayer, vtkTypeBool);
|
||
|
vtkSetMacro(InterfaceLayerIndex, int);
|
||
|
vtkGetMacro(InterfaceLayerIndex, int);
|
||
|
vtkGetVector2Macro(InterfaceLayersRange, int);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* The following methods allow selective reading of variables.
|
||
|
* By default, ALL data variables on the nodes are read.
|
||
|
*/
|
||
|
int GetNumberOfPointArrays();
|
||
|
const char* GetPointArrayName(int index);
|
||
|
int GetPointArrayStatus(const char* name);
|
||
|
void SetPointArrayStatus(const char* name, int status);
|
||
|
void DisableAllPointArrays();
|
||
|
void EnableAllPointArrays();
|
||
|
//@}
|
||
|
|
||
|
protected:
|
||
|
vtkNetCDFCAMReader();
|
||
|
~vtkNetCDFCAMReader() override;
|
||
|
|
||
|
int RequestInformation(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
|
||
|
|
||
|
int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
|
||
|
|
||
|
int RequestUpdateExtent(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
|
||
|
|
||
|
/**
|
||
|
* Returns true for success. Based on the piece, number of pieces,
|
||
|
* number of levels of cells, and the number of cells per level, gives
|
||
|
* a partitioned space of levels and cells.
|
||
|
*/
|
||
|
bool GetPartitioning(size_t piece, size_t numPieces, size_t numCellLevels,
|
||
|
size_t numCellsPerLevel, size_t& beginCellLevel, size_t& endCellLevel, size_t& beginCell,
|
||
|
size_t& endCell);
|
||
|
|
||
|
void BuildVarArray();
|
||
|
static void SelectionCallback(
|
||
|
vtkObject* caller, unsigned long eid, void* clientdata, void* calldata);
|
||
|
|
||
|
private:
|
||
|
vtkNetCDFCAMReader(const vtkNetCDFCAMReader&) = delete;
|
||
|
void operator=(const vtkNetCDFCAMReader&) = delete;
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* The file name of the file that contains all of the point
|
||
|
* data (coordinates and fields).
|
||
|
*/
|
||
|
char* FileName;
|
||
|
char* CurrentFileName;
|
||
|
vtkSetStringMacro(CurrentFileName);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* The file name that contains the cell connectivity information.
|
||
|
*/
|
||
|
char* ConnectivityFileName;
|
||
|
char* CurrentConnectivityFileName;
|
||
|
vtkSetStringMacro(CurrentConnectivityFileName);
|
||
|
//@}
|
||
|
|
||
|
int VerticalDimension;
|
||
|
double* TimeSteps;
|
||
|
size_t NumberOfTimeSteps;
|
||
|
vtkDataArraySelection* PointDataArraySelection;
|
||
|
vtkCallbackCommand* SelectionObserver;
|
||
|
|
||
|
vtkTypeBool SingleMidpointLayer;
|
||
|
int MidpointLayerIndex;
|
||
|
int MidpointLayersRange[2];
|
||
|
|
||
|
vtkTypeBool SingleInterfaceLayer;
|
||
|
int InterfaceLayerIndex;
|
||
|
int InterfaceLayersRange[2];
|
||
|
|
||
|
class Internal;
|
||
|
Internal* Internals;
|
||
|
};
|
||
|
|
||
|
#endif
|