Due to the current gap in continued funding from the U.S. National Science Foundation (NSF), the NSF Unidata Program Center has temporarily paused most operations. See NSF Unidata Pause in Most Operations for details.

Re: [netcdfgroup] How to represent this data in NetCDF

Hi,

On 30.07.2012, at 20:53, Dave Allured wrote:

> Define each "object" independently, except all objects have one
> dimension in common.  There will be no formal "array of objects", but
> you can access them automatically in a program, via an array of
> variable names.
> 
> This is a simplistic view of what I think you requested.  Will this work?
> 
> dimensions:
>  d = 30 ;
>  nx = 5 ;
>  ny = 7 ;
>  nz = 11 ;
> variables:
>  float x(nx,d) ;
>  float y(ny,d) ;
>  float z(nz,d) ;

I was trying to avoid the creation of one dimension per variable. Apart from 
that, I've done it just so, one variable per object, last dimension d is 
constant, N varies. 
Here is the code I used. It runs through without any exceptions but the error 
checking is also non-existent (yet). However, it does not create any variables. 
I'm going to add error-code checks today, but perhaps someone could tell me at 
first glance what went wrong:

        using std::stringstream;
        
        // use mix of C++ and C - API, because the C++ API has no 
        // support for variable length arrays :(
        
        NcFile *file = new NcFile( path.c_str(), NcFile::Replace );
        
        if ( ! file->is_valid() )
        {
            std::cerr << "Error opening output file at " << path << std::endl;
            
            exit(-1);
        }
        
        // Create dimensions
        
        NcDim *dim = file->add_dim("dim", (int) 
featureSpace->coordinate_system->size() );
        NcDim *N = file->add_dim( "N", clusters.size() );
        
        // Create attributes
        
        file->add_att( "num_clusters", (int) clusters.size() );
        file->add_att( "source", featureSpace->filename().c_str() );
        file->add_att( "parameters", parameters.c_str() );
        file->close();

        
        // Open the file with the C API as well

        int retval, ncid;
        
        if ( ! nc_open( path.c_str(), NC_WRITE, &ncid ) )
        {
            cerr << "Error opening file " << path << "for writing" << endl;
            
            exit( -1 );
        }
        
        // Add cluster variables
        
        for ( size_t ci = 0; ci < clusters.size(); ci++ )
        {
            stringstream ss(stringstream::in | stringstream::out);
            
            // Create variable
            ss << "cluster_" << ci;
            
            // Declare a variable length array type
            
            nc_type type_id, base_type;
            size_t type_size;
            char type_name[255];

            nc_def_vlen( ncid, "cluster_type", NC_DOUBLE, &type_id );
            
            nc_inq_vlen( ncid, type_id, &type_name[0], &type_size, &base_type );
            
            // Create a variable with the new VLEN type

            int var_id, dim_id;
            
            nc_inq_dimid( ncid, "dim", &dim_id );
            
            int dims[1] = {dim_id};
            
            nc_def_var( ncid, ss.str().c_str(), type_id, 1, dims, &var_id );
            
            // write attributes mode, size, id
            
            vector<T> mode = clusters[ci].mode;
            
            ss.clear();
            
            // mode
            
            for (size_t i = 0; i < mode.size(); i++ ) 
            { 
                ss << mode[i] << " "; 
            };
            
            const char *mode_values[1] = {ss.str().c_str()};
            
            nc_put_att( ncid, var_id, "mode", NC_STRING, 1, mode_values );
            
            // size
            
            int size_values[1] = {(int) clusters[ci].points.size()}; 
            
            nc_put_att_int( ncid, var_id, "size", NC_INT, 1, size_values );
            
            // id
            
            const char *id_values[1] = {clusters[ci].id.c_str()};
            
            nc_put_att( ncid, var_id, "id", NC_STRING, 1, id_values );
            
            // allocate memory and write the cluster away
            
            double 
data[clusters[ci].points.size()][featureSpace->coordinate_system->size()];

            for ( size_t pi = 0; pi < clusters[ci].points.size(); pi++ )
            {
                Point<T> *p = clusters[ci].points[pi];
                
                for ( size_t di = 0; di < 
featureSpace->coordinate_system->size(); di++ )
                {
                    data[pi][di] = p->coordinate[di];
                }
            }
            
            size_t start=0, len=clusters[ci].points.size();
            
            nc_put_vara_double( ncid, var_id, &start, &len, &data[0][0] );
            
//            var->put( &data[0][0] );
        }
        
        nc_close( ncid );

Thanks in advance!

J.
  • 2012 messages navigation, sorted by:
    1. Thread
    2. Subject
    3. Author
    4. Date
    5. ↑ Table Of Contents
  • Search the netcdfgroup archives: