Re: Help! NCUNLIM question

Harry Jenter writes:

> From owner-netcdfgroup@xxxxxxxxxxxxxxxx Sun Oct 20 15:51:52 1991
> Received: by unidata.ucar.edu id AA00287
>   (5.65c/IDA-1.4.4 for netcdfgroup-send); Sun, 20 Oct 1991 15:45:46 -0600
> Received: from isdres.er.usgs.gov by unidata.ucar.edu with SMTP id AA00283
>   (5.65c/IDA-1.4.4 for <netcdfgroup@xxxxxxxxxxxxxxxx>); Sun, 20 Oct 1991 
> 15:45:43 -0600
> Received: from stress.er.usgs.gov.noname by ISDRES.ER.USGS.GOV with SMTP; 
>           Sun, 20 Oct 1991 17:14:45 -0400 (EDT)
> Received: by stress.er.usgs.gov.noname (4.1/SMI-4.1)
>       id AA19222; Sun, 20 Oct 1991 17:14:01 EDT
> From: hjenter@xxxxxxxxxxxxxxxxxx (Harry Jenter (x5890))
> Message-Id: <9110202114.AA19222@xxxxxxxxxxxxxxxxxx.noname>
> Subject: Help! NCUNLIM question
> To: netcdfgroup@xxxxxxxxxxxxxxxx
> Date: Sun, 20 Oct 1991 17:14:01 EDT
> X-Mailer: ELM [version 2.3 PL11]
> Status: R
> 
> I am attempting to write a hyperslab with multiple values in the 
> record dimension. No matter how big the hyperslab is, I only get
> one value written in the array. I have written two little 
> programs to illustrate my problem.  I'd really appreciate any
> suggestions.  Thanks.
> 
> ------------------ cut here -------------------------
> THIS PIECE OF FORTRAN CODE IS NOT PRODUCING WHAT I EXPECT.
> ------------------ cut here -------------------------
>       Include '/usr/local/include/netcdf.inc'
>       Parameter (NDAT = 50)
>       Integer cdfid,xdim,xid,dims(1),corner(1),edges(1)
>       Real x(NDAT)
>       CDFID=NCCRE('test.cdf',NCCLOB,IRET)
>       xdim=NCDDEF(CDFID,'xdim',NCUNLIM,IRET)
>       dims(1)=xdim
>       xid=NCVDEF(CDFID,'level',NCFLOAT,1,dims,IRET)
>       Call NCENDF(CDFID,IRET)
>       do i=1,NDAT
>         x(i)=float(i)
>       end do
>       corner(1)=1
>       edges(1)=NDAT
>       Call NCVPT(CDFID,XID,corner,edges,x,IRET)
>       Call NCCLOS(CDFID,IRET)
>       END
> ------------------ cut here -------------------------
> THE OUTPUT
> ------------------ cut here -------------------------
> netcdf test {
> dimensions:
>       xdim = UNLIMITED ; // (1 currently)
> 
> variables:
>       float level(xdim) ;
> 
> data:
> 
>  level = 1 ;
> }

This is a bug. At the end of the is message find a patch (context diff) to
netcdf/src/putget.c. This change will also appear in subsequent general
releases of the netcdf.

Glenn P. Davis
UCAR / Unidata
PO Box 3000                   3300 Mitchell Lane, Suite 170
Boulder, CO 80307-3000        Boulder, CO  80301

(303) 497 8643

------ snip snip ----
*** /tmp/RCSAa02144     Mon Oct 21 15:14:19 1991
--- putget.c    Mon Oct 21 15:04:11 1991
***************
*** 2,8 ****
   *    Copyright 1988, University Corporation for Atmospheric Research
   *      See netcdf/README file for copying and redistribution conditions.
   */
! /*    $Id: putget.c,v 1.51 1991/10/08 19:20:09 davis Exp $ */
  
  #include      "local_nc.h"
  #include      "alloc.h"
--- 2,8 ----
   *    Copyright 1988, University Corporation for Atmospheric Research
   *      See netcdf/README file for copying and redistribution conditions.
   */
! /*    $Id: putget.c,v 1.52 1991/10/21 21:03:51 davis Exp $ */
  
  #include      "local_nc.h"
  #include      "alloc.h"
***************
*** 680,685 ****
--- 680,744 ----
  
  
  static
+ NCsimplerecio(handle, vp, start, edges, values)
+ NC *handle ;
+ NC_var *vp ;
+ long *start ;
+ long *edges ;
+ Void *values ;
+ {
+       long offset ;
+       long newrecs ;
+ 
+       /* 'start' should be verified as valid upon prior to entry to this
+        * routine
+        */
+       if(*edges <= 0)
+       {
+               NCadvise(NC_EINVALCOORDS, "%s: Invalid edge length %ld",
+                       vp->name->values, *edges) ;
+               return -1 ;
+       }
+ 
+       /* check to see if we are trying to read beyond the end */
+       newrecs = (*start + *edges) - handle->numrecs ;
+       if(handle->xdrs->x_op != XDR_ENCODE && newrecs > 0)
+       {
+               NCadvise(NC_EINVALCOORDS, "%s: Invalid Coordinates",
+                       vp->name->values) ;
+               return -1 ;
+       }
+ 
+       offset = NC_varoffset(handle, vp, start) ;
+ #ifdef VDEBUG
+       fprintf(stderr, "\t\t %s offset %d, *edges %lu\n",
+                               vp->name->values, offset, *edges ) ;
+       arrayp("\t\t coords", vp->assoc->count, start) ;
+ #endif
+ 
+       if(newrecs > 0)
+               handle->flags |= NC_NDIRTY ;
+ 
+       if(!xdr_NCvdata(handle->xdrs,
+                       offset, vp->type, 
+                       (unsigned)*edges, values))
+               return(-1) ;
+ 
+       if(newrecs > 0)
+       {
+               handle->numrecs += newrecs ;
+               if(handle->flags & NC_NSYNC) /* write out header->numrecs NOW */
+               {
+                       if(!xdr_numrecs(handle->xdrs, handle) )
+                               return(-1) ;
+                       handle->flags &= ~NC_NDIRTY ;
+               }
+       }
+       return(0) ;
+ }
+ 
+ 
+ static
  NCvario(handle, varid, start, edges, values)
  NC *handle ;
  int varid ;
***************
*** 718,723 ****
--- 777,790 ----
  
        if( !NCcoordck(handle, vp, start) )
                return(-1) ;
+ 
+       if( IS_RECVAR(vp) 
+               && vp->assoc->count == 1
+               && handle->recsize <= vp->len)
+       {
+               /* one dimensional   &&  the only 'record' variable  */
+               return(NCsimplerecio(handle, vp, start, edges, values)) ;
+       }
  
        /* find max contiguous, check sanity of edges */
        edp0 = NCvcmaxcontig(handle, vp, start, edges) ;


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