#include "IO/netcdf.h" #include "common/Utilities.h" #include "ProfilerApp.h" #ifdef USE_NETCDF #include #define CHECK_NC_ERR( ERR ) \ do { \ if ( ERR != NC_NOERR ) { \ std::string msg = "Error calling netcdf routine: "; \ msg += nc_strerror( ERR ); \ ERROR( msg ); \ } \ } while (0) namespace netcdf { // Function to reverse an array template inline std::vector reverse( const std::vector& x ) { std::vector y(x.size()); for (size_t i=0; i getDimVar( int fid, int varid ) { int ndim = 0; int err = nc_inq_varndims( fid, varid, &ndim ); CHECK_NC_ERR( err ); std::vector dims(ndim,0); int dimid[64] = {-1}; err = nc_inq_vardimid( fid, varid, dimid ); CHECK_NC_ERR( err ); for (int i=0; i getVarDim( int fid, const std::string& var ) { return getDimVar( fid, getVarID( fid, var ) ); } std::vector getAttDim( int fid, const std::string& att ) { std::vector dim(1,0); int err = nc_inq_attlen( fid, NC_GLOBAL, att.c_str(), dim.data() ); return dim; } std::vector getVarNames( int fid ) { int nvar; int err = nc_inq( fid, NULL, &nvar, NULL, NULL ); CHECK_NC_ERR( err ); std::vector vars(nvar); for (int i=0; i getAttNames( int fid ) { int natt; int err = nc_inq( fid, NULL, NULL, &natt, NULL ); CHECK_NC_ERR( err ); std::vector att(natt); for (int i=0; i Array getVar( int fid, const std::string& var ) { PROFILE_START("getVar"); Array x( reverse(getVarDim(fid,var)) ); int err = nc_get_var_ushort( fid, getVarID(fid,var), x.get() ); CHECK_NC_ERR( err ); PROFILE_STOP("getVar"); return x; } template<> Array getVar( int fid, const std::string& var ) { PROFILE_START("getVar"); Array x( reverse(getVarDim(fid,var)) ); int err = nc_get_var_short( fid, getVarID(fid,var), x.get() ); CHECK_NC_ERR( err ); PROFILE_STOP("getVar"); return x; } template<> Array getVar( int fid, const std::string& var ) { PROFILE_START("getVar"); Array x( reverse(getVarDim(fid,var)) ); int err = nc_get_var_uint( fid, getVarID(fid,var), x.get() ); CHECK_NC_ERR( err ); PROFILE_STOP("getVar"); return x; } template<> Array getVar( int fid, const std::string& var ) { PROFILE_START("getVar"); Array x( reverse(getVarDim(fid,var)) ); int err = nc_get_var_int( fid, getVarID(fid,var), x.get() ); CHECK_NC_ERR( err ); PROFILE_STOP("getVar"); return x; } template<> Array getVar( int fid, const std::string& var ) { PROFILE_START("getVar"); Array x( reverse(getVarDim(fid,var)) ); int err = nc_get_var_float( fid, getVarID(fid,var), x.get() ); CHECK_NC_ERR( err ); PROFILE_STOP("getVar"); return x; } template<> Array getVar( int fid, const std::string& var ) { PROFILE_START("getVar"); Array x( reverse(getVarDim(fid,var)) ); int err = nc_get_var_double( fid, getVarID(fid,var), x.get() ); CHECK_NC_ERR( err ); PROFILE_STOP("getVar"); return x; } template<> Array getVar( int fid, const std::string& var ) { PROFILE_START("getVar"); Array x( reverse(getVarDim(fid,var)) ); int err = nc_get_var_text( fid, getVarID(fid,var), x.get() ); CHECK_NC_ERR( err ); PROFILE_STOP("getVar"); return x; } template<> Array getVar( int fid, const std::string& var ) { PROFILE_START("getVar"); Array tmp = getVar( fid, var ); std::vector dim = tmp.size(); if ( dim.size() == 1 ) dim[0] = 1; else dim.erase( dim.begin() ); Array text(dim); for (size_t i=0; i"); return text; } /**************************************************** * Read an attribute * ****************************************************/ template<> Array getAtt( int fid, const std::string& att ) { PROFILE_START("getAtt"); Array x( getAttDim(fid,att) ); int err = nc_get_att_double( fid, NC_GLOBAL, att.c_str(), x.get() ); CHECK_NC_ERR( err ); PROFILE_STOP("getAtt"); return x; } template<> Array getAtt( int fid, const std::string& att ) { PROFILE_START("getAtt"); char *tmp = new char[getAttDim(fid,att)[0]]; Array x(1); x(0) = tmp; delete [] tmp; PROFILE_STOP("getAtt"); return x; } }; // netcdf namespace #else #endif