[5490] | 1 | #ifdef HAVE_CONFIG_H |
---|
| 2 | # include "config.h" |
---|
| 3 | #endif |
---|
| 4 | |
---|
[5487] | 5 | #include <string> |
---|
[5490] | 6 | #ifdef HAVE_SYS_TYPES_H |
---|
| 7 | # include <sys/types.h> |
---|
| 8 | #endif |
---|
| 9 | #include <boost/shared_array.hpp> |
---|
[5487] | 10 | #include <netcdf.h> |
---|
[5488] | 11 | #include "sww_file.hh" |
---|
[5487] | 12 | |
---|
[5490] | 13 | using boost::shared_array; |
---|
[5487] | 14 | using std::string; |
---|
| 15 | |
---|
[5488] | 16 | SWWFile::SWWFile(const string &file_name){ |
---|
[5487] | 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); |
---|
[5490] | 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(); |
---|
[5487] | 32 | } |
---|
| 33 | |
---|
[5488] | 34 | SWWFile::~SWWFile(void){ |
---|
[5487] | 35 | nc_close(this->netcdf_id); |
---|
| 36 | } |
---|
[5490] | 37 | |
---|
| 38 | void 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 | |
---|
| 51 | void 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 | |
---|
| 61 | void 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 | |
---|
| 71 | size_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 | } |
---|