1/*********************************************************************
2 *   Copyright 1993, UCAR/Unidata
3 *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
4 *   $Header: /upc/share/CVS/netcdf-3/nctest/vputget.c,v 1.13 2006/10/31 16:19:49 ed Exp $
5 *********************************************************************/
6
7#include <config.h>
8#include <stdio.h>
9#include <stdlib.h> /* for free() */
10#include "netcdf.h"
11#include "testcdf.h" /* defines in-memory test cdf structure */
12#include "add.h" /* functions to update in-memory netcdf */
13#include "val.h"
14#include "error.h"
15#include "tests.h"
16#include "emalloc.h"
17
18#undef max
19#define max(AB) ((A) > (B) ? (A) : (B))
20
21
22/*
23 * For every variable in open netcdf, puts and gets three hypercubes
24 * of data of the appropriate type, comparing values from get to
25 * values put to check that both ncvarput and ncvarget worked.  The
26 * three hypercubes are
27 *    - a large hypercube from (0, 0, ...) to the far corner (diagonally
28 *      opposite (0, 0, ...),
29 *    - a size 1 hypercube from the far corner with edge lengths of 1
30 *      in every direction, and
31 *    - a hypercube starting about 1/3 of the way along the diagonal
32 *      from (0,0,...) extending 1/3 of the way in every direction
33 *      toward the far corner.
34 */
35
36int
37test_varputget(cdfid)
38     int cdfid; /* handle of netcdf open and in data mode */
39{
40    int nerrs = 0;
41    static char pname[] = "test_varputget";
42    int idieiv; /* loop indices */
43    int ne = 3; /* number of test hypercubes for each var */
44    struct cdfhc { /* a hypercube with generic values */
45 long cor[MAX_NC_DIMS]; /* netcdf coordinates for lower corner */
46    long edg[MAX_NC_DIMS]; /* netcdf edge lengths to upper corner */
47 void *vals; /* pointer to block of values */
48    } hc[3], tmp; /* test hypercubes */
49    int nel[3]; /* number of elements in hypercube */
50
51    for (iv = 0; iv < test.nvarsiv++) { /* for each var in netcdf */
52 for (ie = 0; ie < neie++)
53   nel[ie] = 1; /* to compute space for hypercube values */
54
55 for (id = 0; id < test.vars[iv].ndimsid++) { /* set cubes */
56
57     /* max dimension size, 5 for records */
58     int dsize = (int)test.dims[test.vars[iv].dims[id]].size;
59     if (dsize == NC_UNLIMITED)
60       dsize = 5;
61
62     /* start at "lower-left" corner, do whole variable */
63     hc[0].cor[id] = 0;
64     hc[0].edg[id] = dsize;
65     nel[0] *= hc[0].edg[id];
66
67     /* start at "upper-right" corner, do one point */
68     hc[1].cor[id] = dsize - 1;
69     hc[1].edg[id] = 1;
70     nel[1] *= hc[1].edg[id];
71
72     /* start about 1/3 way along diagonal, do 1/3 in each direction */
73     hc[2].cor[id] = dsize/3;
74     hc[2].edg[id] = max (dsize/3, 1);
75     nel[2] *= hc[2].edg[id];
76 }
77 for (ie = 0; ie < neie++) { /* for each of ne points */
78
79     /* allocate space for the cube of values */
80     hc[ie].vals = emalloc(nel[ie]*nctypelen(test.vars[iv].type) + 8);
81     tmp.vals = emalloc(nel[ie]*nctypelen(test.vars[iv].type) + 8);
82
83     /* fill allocated space with different values of right type */
84     val_fill(test.vars[iv].typenel[ie], hc[ie].vals);
85
86 if(ncvarput (cdfidivhc[ie].corhc[ie].edghc[ie].vals)
87    == -1) {
88     error("%s: ncvarput failed for point %d, variable %s",
89   pnameietest.vars[iv].name);
90     nerrs++;
91     errvar(&test, &test.vars[iv]);
92     (void)fprintf(stderr,"  corner = (");
93     for (id = 0 ; id < test.vars[iv].ndimsid++)
94       (void)fprintf(stderr,"%ld%s",(long)hc[ie].cor[id],
95     (id < test.vars[iv].ndims-1) ? ", " : "");
96     (void)fprintf(stderr,")\n");
97     (void)fprintf(stderr,"  edge = (");
98     for (id = 0 ; id < test.vars[iv].ndimsid++)
99       (void)fprintf(stderr,"%ld%s",(long)hc[ie].edg[id],
100     (id < test.vars[iv].ndims-1) ? ", " : "");
101     (void)fprintf(stderr,")\n");
102 }
103 else {
104     add_data(&testivhc[ie].corhc[ie].edg); /* keep test in sync */
105     if(ncvarget (cdfidivhc[ie].corhc[ie].edgtmp.vals)
106        == -1) {
107 error("%s: ncvarget failed for point %d, variable %s",
108       pnameietest.vars[iv].name);
109 nerrs++;
110     }
111     else {
112 if (val_cmp(test.vars[iv].typenel[ie],
113     hc[ie].valstmp.vals) != 0) {
114     error("%s: bad values returned from ncvarget",
115   pname);
116     nerrs++;
117     errvar(&test, &test.vars[iv]); /* describe var */
118 }
119     }
120 }
121     free (hc[ie].vals);
122     free (tmp.vals);
123 }
124    }
125    return nerrs;
126}


HyperKWIC - Version 7.20DA executed at 11:37 on 27 Oct 2017 | Polyhedron Solutions - INTERNAL USE | COMMERCIAL (Any O/S) SN 4AKIed