bool ReadAstro::open(const char *path) { assert(!m_ncfile); m_ncfile = new NcFile(path, NcFile::ReadOnly); if (!m_ncfile->is_valid()) { close(); sendError("failed to open NetCDF file %s", path); return false; } if (m_ncfile->get_format() == NcFile::BadFormat) { close(); sendError("bad NetCDF file"); return false; } fprintf(stderr, "dims=%d, vars=%d, attrs=%d\n", m_ncfile->num_dims(), m_ncfile->num_vars(), m_ncfile->num_atts()); for (int i = 0; i < m_ncfile->num_dims(); ++i) { fprintf(stderr, "%s: %ld\n", m_ncfile->get_dim(i)->name(), m_ncfile->get_dim(i)->size()); } for (int i = 0; i < m_ncfile->num_vars(); ++i) { fprintf(stderr, "%s: dims=%d atts=%d vals=%ld type=%d\n", m_ncfile->get_var(i)->name(), m_ncfile->get_var(i)->num_dims(), m_ncfile->get_var(i)->num_atts(), m_ncfile->get_var(i)->num_vals(), m_ncfile->get_var(i)->type()); //int dims = m_ncfile->get_var(i)->num_dims(); NcVar *var = m_ncfile->get_var(i); for (int j = 0; j < var->num_dims(); ++j) { fprintf(stderr, " %s: %ld edge=%ld\n", var->get_dim(j)->name(), var->get_dim(j)->size(), var->edges()[j]); } } for (int i = 0; i < m_ncfile->num_atts(); ++i) { fprintf(stderr, "%s\n", m_ncfile->get_att(i)->name()); } return true; }
void netcdf_mpas_report ( string filename ) //****************************************************************************80 // // Purpose: // // NETCDF_MPAS_REPORT reads an MPAS NETCDF grid file and reports. // // Discussion: // // In this example, we want to extract all the information from a file // of unknown type. // // Here, we are pretending we have no idea what's in the file, so we // have to go step by step, making inquiries to NETCDF. // // As we go, we print out what we have discovered. We don't attempt // to return any of the data. // // Licensing: // // This code is distributed under the GNU LGPL license. // // Modified: // // 29 December 2010 // // Author: // // John Burkardt // // Reference: // // Russ Rew, Glenn Davis, Steve Emmerson, Harvey Davies, Ed Hartne, // The NETCDF User's Guide, // Unidata Program Center, March 2009. // // Parameters: // // Input, string FILENAME, the name of the NETCDF file to examine. // { NcAtt *att; NcDim *dim; int i; int j; long int len; NcToken name; int num_atts; int num_dims; int num_vars; NcType type; NcDim *unlimdimid; NcVar *var; cout << "\n"; cout << "NETCDF_MPAS_REPORT:\n"; cout << " Report the information stored in a NETCDF\n"; cout << " file. Although we wish to examine a file containing\n"; cout << " grid data generated by MPAS, we will assume we do not\n"; cout << " have any idea of what is in the file. So we just read,\n"; cout << " inquire, and print out.\n"; cout << "\n"; cout << " The name of the file is \"" << filename << "\"\n"; // // Open the file. // NcFile ncid ( filename.c_str ( ), NcFile::ReadOnly ); // // Return information about the NETCDF file. // num_dims = ncid.num_dims ( ); num_vars = ncid.num_vars ( ); num_atts = ncid.num_atts ( ); unlimdimid = ncid.rec_dim ( ); cout << "\n"; cout << "PRIMARY PARAMETERS:\n"; cout << "\n"; cout << " The number of dimensions NUM_DIMS = " << num_dims << "\n"; cout << " The number of variables NUM_VARS = " << num_vars << "\n"; cout << " The number of global attributes NUM_ATTS = " << num_atts << "\n"; cout << " The unlimited dimension (if any) UNLIMDIMID = \"" << (*unlimdimid).name ( ) << "\"\n"; // // Retrieve global attributes. // First, we must evaluate the constant "NC_GLOBAL". // // nc_global = netcdf.getConstant ( 'NC_GLOBAL' ); cout << "\n"; cout << "GLOBAL ATTRIBUTES:\n"; cout << " Att --------Name-------- Type Len\n"; cout << "\n"; for ( i = 0; i < num_atts; i++ ) { att = ncid.get_att ( i ); name = (*att).name ( ); type = (*att).type ( ); len = (*att).num_vals ( ); cout << " " << setw(2) << i << " \"" << setw(18) << name << "\"" << " " << setw(4) << type << " " << setw(4) << len << "\n"; } // // Determine names and extents of dimensions. // Since each NAME is a char array, we make a cell array to hold them. // cout << "\n"; cout << "DIMENSIONS:\n"; cout << " Dim --------Name-------- Extent\n"; cout << "\n"; for ( i = 0; i < num_dims; i++ ) { dim = ncid.get_dim ( i ); name = (*dim).name ( ); len = (*dim).size ( ); cout << " " << setw(2) << i << " \"" << setw(18) << name << "\"" << " " << setw(6) << len << "\n"; } // // Get variable names, types, dimensions, number of attributes. // cout << "\n"; cout << "VARIABLES:\n"; cout << " Var --------Name-------- Type Natts Ndims Dims\n"; cout << "\n"; for ( i = 0; i < num_vars; i++ ) { var = ncid.get_var ( i ); name = (*var).name ( ); type = (*var).type ( ); num_dims = (*var).num_dims ( ); num_atts = (*var).num_atts ( ); cout << " " << setw(2) << i << " \"" << setw(18) << name << "\"" << " " << setw(4) << type << " " << setw(4) << num_atts << " " << setw(4) << num_dims << " "; for ( j = 0; j < num_dims; j++ ) { dim = (*var).get_dim ( j ); if ( j == 0 ) { cout << "["; } cout << (*dim).name ( ); if ( j < num_dims - 1 ) { cout <<","; } else { cout << "]"; } } cout << "\n"; } // // Close the file. // ncid.close ( ); return; }