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

Last change on this file since 5490 was 5490, checked in by jack, 14 years ago

More work on the SWWFile class.

File size: 2.6 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_vertices = this->nc_inq_dimlen_by_name("number_of_vertices");
23  this->number_of_volumes = this->nc_inq_dimlen_by_name("number_of_volumes");
24  this->x = shared_array<float>(new float[this->number_of_points]);
25  this->nc_get_var_float_by_name("x", this->x.get());
26  this->y = shared_array<float>(new float[this->number_of_points]);
27  this->nc_get_var_float_by_name("y", this->y.get());
28  this->volumes = shared_array<int>(new int[this->number_of_volumes *
29                                            this->number_of_vertices]);
30  this->nc_get_var_int_by_name("volumes", this->volumes.get());
31  this->compute_extents();
32}
33
34SWWFile::~SWWFile(void){
35  nc_close(this->netcdf_id);
36}
37
38void SWWFile::compute_extents(void){
39  this->minX = this->x[0];
40  this->maxX = this->x[0];
41  this->minY = this->y[0];
42  this->maxY = this->y[0];
43  for(int i = 1 ; i < this->number_of_points ; ++i){
44    if(this->x[i] < this->minX) this->minX = this->x[i];
45    if(this->x[i] > this->maxX) this->maxX = this->x[i];
46    if(this->y[i] < this->minY) this->minY = this->y[i];
47    if(this->y[i] > this->maxY) this->maxY = this->y[i];
48  }
49}
50
51void SWWFile::nc_get_var_float_by_name(const string &name, float array[]){
52  int ncstatus;
53  int varid;
54  if(((ncstatus = nc_inq_varid(this->netcdf_id,
55                               name.c_str(), &varid)) != NC_NOERR) ||
56     ((ncstatus = nc_get_var_float(this->netcdf_id,
57                                   varid, array)) != NC_NOERR))
58    throw nc_strerror(ncstatus);
59}
60
61void SWWFile::nc_get_var_int_by_name(const string &name, int array[]){
62  int ncstatus;
63  int varid;
64  if(((ncstatus = nc_inq_varid(this->netcdf_id,
65                               name.c_str(), &varid)) != NC_NOERR) ||
66     ((ncstatus = nc_get_var_int(this->netcdf_id,
67                                 varid, array)) != NC_NOERR))
68    throw nc_strerror(ncstatus);
69}
70
71size_t SWWFile::nc_inq_dimlen_by_name(const string &name){
72  int ncstatus;
73  int dimid;
74  size_t len;
75  if(((ncstatus = nc_inq_dimid(this->netcdf_id,
76                               name.c_str(), &dimid)) != NC_NOERR) ||
77     ((ncstatus = nc_inq_dimlen(this->netcdf_id,
78                                dimid, &len)) != NC_NOERR))
79    throw nc_strerror(ncstatus);
80  return len;
81}
Note: See TracBrowser for help on using the repository browser.