NOTICE: This version of the NSF Unidata web site (archive.unidata.ucar.edu) is no longer being updated.
Current content can be found at unidata.ucar.edu.

To learn about what's going on, see About the Archive Site.

Re: splitting netcdf file into multiple files by date

Just found out that the method of using get_rec from
the original file and put_recs to the new file works.
I had a minor coding error causing the problem. Just
wanted to give you all an update in case this comes up
for some one else. Thank you for all of your
suggestions.
--- Selina Satterfield <satterfields2000@xxxxxxxxx>
wrote:

> I believe I found a way to split the file up into
> multiple files by data through code since I can't
> use
> a third party tool however the code seems to have an
> 80 file limit and I'm not sure why.
> 
> First I search for a date from a database within a
> SearchForTime function
> 
> //Get the coordinate variable for the unlimited
> dimension
>  
>
ncVarUnlimDim=ncFile->get_var(ncFile->rec_dim()->name());
>   
>   //Get the type of the unlimited dimension variable
>   ncTypeUnlimDim=ncVarUnlimDim->type();
>   
>   //Get number of values in unlimited dimension
>   lNumValsUnlimDim=ncVarUnlimDim->num_vals();
> //Scan for date based upon type
>   if(ncTypeUnlimDim==ncDouble)
>   {
>     //double date times may not match exactly
> created
> an epsilon to handle this
>     dHalfSec=dEpsilon/(double)timeUnitSec;
>    
> dRcdTime=_GetTimeAxisValDouble(strDateTime.c_str());
>     
>     //loop through unlimited dimension to find date
> time match or near match
>     for(iCount=0; iCount < lNumValsUnlimDim;
> iCount++)
>     {
>       if( fabs(dRcdTime -
> ncVarUnlimDim->as_double(iCount)) < dHalfSec)
>       {
>         break;
>       }
>     }
>   }
>   else if(ncTypeUnlimDim == ncFloat)
> 
> etc........
> 
> 
> 
> if there was a match
> 
>  //Matching time was found; set time index to this
> value
>     ncVarUnlimDim->set_cur((long)iCount);
>     timeIndex = iCount;
> 
> Then the AddTime function is called
> Which adds the date to the new file at location 0
> //Note all the dimensions, attitbutes, an variables
> were already created before this.
> 
> Then I have an AddData function which accepts the
> original file and the time index found in the
> Searchfortime function. However for some reason it
> dies after creating 80 files it is dying on the
> get_rec
> function. Do you all know any limitations on the
> get_rec function? Here is the code
> 
> for( int i=0 ; i< ncOrgFile->num_vars() ; i++ )
> {
>   NcVar * ncOrgVar = ncOrgFile->get_var(i);
>   NcVar * ncNewVar = ncFile->get_var(i);
>   
>   // Skip coordinate variables (i.e., variables with
> names
>         // that match dimension names)
>   if( strcmp(ncOrgVar->name(),
> ncOrgVar->get_dim(0)->name()) == 0)
>   {
>     continue;
>   }
>   NcValues* varOrgVals;
>  
>   varOrgVals = ncOrgVar->get_rec( orgTimeIndex );
>   ncOrgType = ncOrgVar->type();    
>   // Insert values at new location
>   NcBool rtn;
>   if( ncOrgType == ncByte )
>   {
>     ncbyte *copyVals = new
> ncbyte[varOrgVals->num()];
>     for(int k=0; k < varOrgVals->num() ;k++) 
>     { 
>       copyVals[k] = varOrgVals->as_ncbyte(k);
>     }
>     rtn = ncNewVar->put_rec( copyVals, timeIndex);
>     delete [] copyVals;
>   }
>   else if( ncOrgType ==  ncChar )
>   {
>     etc......
> }
> 
> --- t.hume@xxxxxxxxxx wrote:
> > Hi,
> > 
> > This is nasty, but it would be quick. Your C++
> > program could make a call
> > to the ncks utility (which is part of the NetCDF
> > operators). In C you
> > use the system function ... I guess it is similar
> or
> > the same in C++.
> > Compared to using the C++ interface, this will
> save
> > you many many lines
> > of code, at the expense of being a very inelegant
> > solution.
> > 
> > Tim Hume
> > 
> > 
> > On Mon, 11 Apr 2005 11:42:20 -0700 (PDT)
> > Selina Satterfield <satterfields2000@xxxxxxxxx>
> > wrote:
> > 
> > > I'm new to netCDF development and currently I
> have
> > a
> > > large number of netcdf files
> > > that contain multiple dimensions, variables ,
> and
> > data
> > > for a period of time.  Here is a cdl that I
> > generated
> > > with ncdump of one of the files
> > > 
> > > netcdf test {
> > > dimensions:
> > >   lat = 141 ;
> > >   lon = 360 ;
> > >   time = UNLIMITED ; // (31 currently)
> > > variables:
> > >   float lat(lat) ;
> > >           lat:long_name = "Latitude" ;
> > >           lat:units = "degrees_north" ;
> > >   float lon(lon) ;
> > >           lon:long_name = "Longitude" ;
> > >           lon:units = "degrees_east" ;
> > >   float time(time) ;
> > >           time:long_name = "Time" ;
> > >           time:units = "hours since 1997-01-01" ;
> > >   float age_rcnt_obs(time, lat, lon) ;
> > >           age_rcnt_obs:_FillValue = 999.f ;
> > >           age_rcnt_obs:long_name = "Age of Recent
> > Observation"
> > > ;
> > >           age_rcnt_obs:missing_value = 999.f ;
> > >           age_rcnt_obs:units = "Hours" ;
> > >           age_rcnt_obs:valid_max = 255.f ;
> > >           age_rcnt_obs:valid_min = 0.f ;
> > >   float anal_temp(time, lat, lon) ;
> > >           anal_temp:_FillValue = 9999.f ;
> > >           anal_temp:long_name = "Analysis Temperature" ;
> > >           anal_temp:missing_value = 999.9f ;
> > >           anal_temp:scale_factor = 0.1f ;
> > >           anal_temp:units = "Deg. C" ;
> > >           anal_temp:valid_max = 70.f ;
> > >           anal_temp:valid_min = -10.f ;
> > >   float avgrad(time, lat, lon) ;
> > >           etc.....;
> > > 
> > > // global attributes:
> > >           :title = "SST 100 KM FIELD" ;
> > > data:
> > > 
> > >  lat = -70, -69, -68, -67, -66, -65, -64, -63,
> > -62,
> > > -61, -60, -59, -58, -57, 
> > >     -56, -55, -54, -53, -52, -51, -50, -49, -48,
> > -47,
> > > -46, -45, -44, -43, 
> > >     etc..............;
> > > 
> > >  lon = -180, -179, -178, -177, -176, -175, -174,
> > -173,
> > > -172, -171, -170, 
> > >     -169, -168, -167, -166, -165, -164, -163,
> > -162,
> > > -161, -160, -159, -158, 
> > >     -157, -156, -155, -154, -153, -152, -151,
> > -150,
> > > -149, -148, -147, -146, 
> > >     -145, -144, -143, -142, -141, -140, -139,
> > -138,
> > > -137, -136, -135, -134, 
> > >     etc..............;
> > > 
> > >  time = 60600, 60624, 60648, 60672, 60696,
> 60720,
> > > 60744, 60768, 60792, 60816, 
> > >     60840, 60864, 60888, 60912, 60936, 60960,
> 
=== message truncated ==



                
__________________________________ 
Yahoo! Mail Mobile 
Take Yahoo! Mail with you! Check email on your mobile phone. 
http://mobile.yahoo.com/learn/mail 

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