00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00077 #ifndef __vtkMPASReader_h
00078 #define __vtkMPASReader_h
00079
00080 #define MAX_VARS 100
00081 #define MAX_VAR_NAME 100
00082
00083 #include "vtkUnstructuredGridAlgorithm.h"
00084
00085 class vtkCallbackCommand;
00086 class vtkDataArraySelection;
00087 class vtkDoubleArray;
00088 class vtkStdString;
00089 class vtkStringArray;
00090
00091 class VTK_IO_EXPORT vtkMPASReader : public vtkUnstructuredGridAlgorithm
00092 {
00093 public:
00094 static vtkMPASReader *New();
00095 vtkTypeMacro(vtkMPASReader,vtkUnstructuredGridAlgorithm);
00096 void PrintSelf(ostream& os, vtkIndent indent);
00097
00099
00100 vtkSetStringMacro(FileName);
00101 vtkGetStringMacro(FileName);
00103
00105
00106 vtkGetMacro(maxCells, int);
00108
00110
00111 vtkGetMacro(maxPoints, int);
00113
00115
00116 vtkGetMacro(numCellVars, int);
00117 vtkGetMacro(numPointVars, int);
00119
00121
00122 vtkUnstructuredGrid *GetOutput();
00123 vtkUnstructuredGrid *GetOutput(int index);
00125
00127
00130 int GetNumberOfPointArrays();
00131 const char* GetPointArrayName(int index);
00132 int GetPointArrayStatus(const char* name);
00133 void SetPointArrayStatus(const char* name, int status);
00134 void DisableAllPointArrays();
00135 void EnableAllPointArrays();
00137
00138 int GetNumberOfCellArrays();
00139 const char* GetCellArrayName(int index);
00140 int GetCellArrayStatus(const char* name);
00141 void SetCellArrayStatus(const char* name, int status);
00142 void DisableAllCellArrays();
00143 void EnableAllCellArrays();
00144
00145 void SetVerticalLevel(int level);
00146 vtkGetVector2Macro(VerticalLevelRange, int);
00147
00148 void SetLayerThickness(int val);
00149 vtkGetVector2Macro(LayerThicknessRange, int);
00150
00151 void SetCenterLon(int val);
00152 vtkGetVector2Macro(CenterLonRange, int);
00153
00154 void SetProjectLatLon(bool val);
00155 vtkGetMacro(ProjectLatLon, bool);
00156
00157 void SetIsAtmosphere(bool val);
00158 vtkGetMacro(IsAtmosphere, bool);
00159
00160 void SetIsZeroCentered(bool val);
00161 vtkGetMacro(IsZeroCentered, bool);
00162
00163 void SetShowMultilayerView(bool val);
00164 vtkGetMacro(ShowMultilayerView, bool);
00165
00167 static int CanReadFile(const char *filename);
00168
00169 protected:
00170 vtkMPASReader();
00171 ~vtkMPASReader();
00172 void DestroyData();
00173
00174 char *FileName;
00175
00176
00177
00178
00179
00180
00181
00182
00183 vtkStdString* VariableName;
00184 int* VariableType;
00185
00186 int NumberOfTimeSteps;
00187 double* TimeSteps;
00188 double dTime;
00189
00190
00191
00192 vtkCallbackCommand* SelectionObserver;
00193
00194 int RequestData(vtkInformation *, vtkInformationVector **,
00195 vtkInformationVector *);
00196 int RequestInformation(vtkInformation *, vtkInformationVector **,
00197 vtkInformationVector *);
00198
00199
00200 static void SelectionCallback(vtkObject* caller, unsigned long eid,
00201 void* clientdata, void* calldata);
00202
00203 bool infoRequested;
00204 bool dataRequested;
00205
00206
00207
00208
00209 vtkDataArraySelection* PointDataArraySelection;
00210 vtkDataArraySelection* CellDataArraySelection;
00211
00212 vtkDoubleArray** cellVarDataArray;
00213 vtkDoubleArray** pointVarDataArray;
00214
00215 int VerticalLevelSelected;
00216 int VerticalLevelRange[2];
00217
00218 int LayerThickness;
00219 int LayerThicknessRange[2];
00220
00221 int CenterLon;
00222 int CenterLonRange[2];
00223
00224 bool ProjectLatLon;
00225 bool IsAtmosphere;
00226 bool IsZeroCentered;
00227 bool ShowMultilayerView;
00228
00229 bool includeTopography;
00230 bool doBugFix;
00231 double centerRad;
00232
00233
00234
00235 int maxNVertLevels;
00236 int numCells;
00237 int numPoints;
00238 int cellOffset;
00239 int pointOffset;
00240 int pointsPerCell;
00241 int currentExtraPoint;
00242 int currentExtraCell;
00243 double* pointX;
00244 double* pointY;
00245 double* pointZ;
00246 int modNumPoints;
00247 int modNumCells;
00248 int* origConnections;
00249 int* modConnections;
00250 int* cellMap;
00251 int* pointMap;
00252 int* maxLevelPoint;
00253 int maxCells;
00254 int maxPoints;
00255 int verticalIndex;
00256
00257
00258 int numCellVars;
00259 int numPointVars;
00260 double* pointVarData;
00261 double* cellVarData;
00262
00263 void SetDefaults();
00264 int GetNcDims();
00265 int CheckParams();
00266 int GetNcVars(const char* cellDimName, const char* pointDimName);
00267 int ReadAndOutputGrid(bool init);
00268 int ReadAndOutputVariableData();
00269 int BuildVarArrays();
00270 int AllocSphereGeometry();
00271 int AllocLatLonGeometry();
00272 void ShiftLonData();
00273 int AddMirrorPoint(int index, double dividerX);
00274 void FixPoints();
00275 int EliminateXWrap();
00276 void OutputPoints(bool init);
00277 void OutputCells(bool init);
00278 unsigned char GetCellType();
00279 void LoadGeometryData(int var, double dTime);
00280 int LoadPointVarData(int variable, double dTime);
00281 int LoadCellVarData(int variable, double dTime);
00282 int RegenerateGeometry();
00283
00284 private:
00285 vtkMPASReader(const vtkMPASReader&);
00286 void operator=(const vtkMPASReader&);
00287 class Internal;
00288 Internal *Internals;
00289
00290 };
00291
00292 #endif