source: anuga_work/development/anugavis/src/sww_file.cc @ 5598

Last change on this file since 5598 was 5598, checked in by jack, 16 years ago

Progress on height quantities.

File size: 3.0 KB
Line 
1#ifdef HAVE_CONFIG_H
2#  include "config.h"
3#endif
4
5#include <string>
6#ifdef HAVE_SYS_TYPES_H
7#  include <sys/types.h>
8#endif
9#include <boost/shared_array.hpp>
10#include <netcdf.h>
11#include "sww_file.hh"
12
13using boost::shared_array;
14using std::string;
15
16SWWFile::SWWFile(const string &file_name){
17  int ncstatus;
18  if((ncstatus = nc_open(file_name.c_str(),
19                         NC_SHARE, &this->netcdf_id)) != NC_NOERR)
20    throw nc_strerror(ncstatus);
21  this->number_of_points = this->nc_inq_dimlen_by_name("number_of_points");
22  this->number_of_timesteps =
23    this->nc_inq_dimlen_by_name("number_of_timesteps");
24  this->number_of_vertices = this->nc_inq_dimlen_by_name("number_of_vertices");
25  this->number_of_volumes = this->nc_inq_dimlen_by_name("number_of_volumes");
26  this->x = shared_array<float>(new float[this->number_of_points]);
27  this->nc_get_var_float_by_name("x", this->x.get());
28  this->y = shared_array<float>(new float[this->number_of_points]);
29  this->nc_get_var_float_by_name("y", this->y.get());
30  this->volumes = shared_array<int>(new int[this->number_of_volumes *
31                                            this->number_of_vertices]);
32  this->nc_get_var_int_by_name("volumes", this->volumes.get());
33  this->compute_extents();
34}
35
36SWWFile::~SWWFile(void){
37  nc_close(this->netcdf_id);
38}
39
40int SWWFile::nc_inq_varndims_by_name(const string &name) const{
41  int ncstatus;
42  int dimid;
43  int ndims;
44  if(((ncstatus = nc_inq_varid(this->netcdf_id,
45                               name.c_str(), &dimid)) != NC_NOERR) ||
46     ((ncstatus = nc_inq_varndims(this->netcdf_id,
47                                  dimid, &ndims)) != NC_NOERR))
48    throw nc_strerror(ncstatus);
49  return ndims;
50}
51
52void SWWFile::compute_extents(void){
53  this->minX = this->x[0];
54  this->maxX = this->x[0];
55  this->minY = this->y[0];
56  this->maxY = this->y[0];
57  for(int i = 1 ; i < this->number_of_points ; ++i){
58    if(this->x[i] < this->minX) this->minX = this->x[i];
59    if(this->x[i] > this->maxX) this->maxX = this->x[i];
60    if(this->y[i] < this->minY) this->minY = this->y[i];
61    if(this->y[i] > this->maxY) this->maxY = this->y[i];
62  }
63}
64
65void SWWFile::nc_get_var_float_by_name(const string &name, float array[]) const{
66  int ncstatus;
67  int varid;
68  if(((ncstatus = nc_inq_varid(this->netcdf_id,
69                               name.c_str(), &varid)) != NC_NOERR) ||
70     ((ncstatus = nc_get_var_float(this->netcdf_id,
71                                   varid, array)) != NC_NOERR))
72    throw nc_strerror(ncstatus);
73}
74
75void SWWFile::nc_get_var_int_by_name(const string &name, int array[]) const{
76  int ncstatus;
77  int varid;
78  if(((ncstatus = nc_inq_varid(this->netcdf_id,
79                               name.c_str(), &varid)) != NC_NOERR) ||
80     ((ncstatus = nc_get_var_int(this->netcdf_id,
81                                 varid, array)) != NC_NOERR))
82    throw nc_strerror(ncstatus);
83}
84
85size_t SWWFile::nc_inq_dimlen_by_name(const string &name) const{
86  int ncstatus;
87  int dimid;
88  size_t len;
89  if(((ncstatus = nc_inq_dimid(this->netcdf_id,
90                               name.c_str(), &dimid)) != NC_NOERR) ||
91     ((ncstatus = nc_inq_dimlen(this->netcdf_id,
92                                dimid, &len)) != NC_NOERR))
93    throw nc_strerror(ncstatus);
94  return len;
95}
Note: See TracBrowser for help on using the repository browser.