1/* This is part of the netCDF package.
2   Copyright 2008 University Corporation for Atmospheric Research/Unidata.
3   See COPYRIGHT file for conditions of use.
4
5   This is a very simple example which writes a netCDF file with
6   single- and double-precision NaNs and infinities.
7
8   $Id: tst_nans.c,v 1.9 2009/09/14 20:50:45 russ Exp $
9*/
10#include <nc_tests.h>
11#include "err_macros.h"
12#include <stdlib.h>
13#include <stdio.h>
14#include <math.h>
15#include <netcdf.h>
16#include "isnan.h"
17
18#define FILE8_NAME "tst_nans.nc"
19#define FV_NAME _FillValue /* defined in netcdf.h */
20#define FV_NVALS 1
21#define ATT_NAME "att"
22#define NDIMS 1
23#define DIM_NAME "dim"
24#define NVALS 3
25#define F_NAME "fvar"
26#define D_NAME "dvar"
27
28#ifdef _MSC_VER
29#define NC_INFINITE (DBL_MAX+DBL_MAX)
30#define NC_FNAN (NC_INFINITE-NC_INFINITE)
31#define NC_DNAN (NC_INFINITE-NC_INFINITE)
32#define NC_FPINF NC_INFINITE
33#define NC_DPINF NC_INFINITE
34#else
35#define NC_FNAN (0.f/0.f)
36#define NC_DNAN (0.0/0.0)
37#define NC_FPINF (1.0f/0.0f)
38#define NC_DPINF (1.0/0.0)
39#endif
40
41
42int
43main(int argc, char **argv)
44{
45    int nciddimidfvariddvarid;
46    float fvals[NVALS], fvals_in[NVALS];
47    double dvals[NVALS], dvals_in[NVALS];
48
49
50    float fnan = NC_FNAN;/*(NC_INFINITE-NC_INFINITE);//0.f/0.f; */
51    double dnan = NC_DNAN;/*(NC_INFINITE-NC_INFINITE);//0.0/0.0; */
52    float fpinf = NC_FPINF;/*NC_INFINITE;//1.0f/0.0f; */
53    float fninf = -fpinf;
54    double dpinf = NC_DPINF;/*NC_INFINITE;//1.0/0.0; */
55    double dninf = -dpinf;
56    nc_type att_type;
57    size_t att_len;
58    float att_fvals[NVALS];
59    double att_dvals[NVALS];
60
61    printf("\n*** Testing NaN\n");
62    printf("*** creating NaN test file %s...", FILE8_NAME);
63    if (nc_create(FILE8_NAMENC_CLOBBER, &ncid)) ERR;
64
65    if (nc_def_dim(ncidDIM_NAMENVALS, &dimid)) ERR;
66
67    if (nc_def_var(ncidF_NAMENC_FLOATNDIMS, &dimid, &fvarid)) ERR;
68    if (nc_def_var(ncidD_NAMENC_DOUBLENDIMS, &dimid, &dvarid)) ERR;
69
70    fvals[0] = fninf;
71    fvals[1] = fnan;
72    fvals[2] = fpinf;
73    dvals[0] = dninf;
74    dvals[1] = dnan;
75    dvals[2] = dpinf;
76
77    /* Create float and double attributes */
78    if (nc_put_att_float(ncidfvaridFV_NAMENC_FLOATFV_NVALS, &fnan)) ERR;
79    if (nc_put_att_float(ncidfvaridATT_NAMENC_FLOATNVALSfvals)) ERR;
80    if (nc_put_att_double(nciddvaridFV_NAMENC_DOUBLEFV_NVALS, &dnan)) ERR;
81    if (nc_put_att_double(nciddvaridATT_NAMENC_DOUBLENVALSdvals)) ERR;
82
83    if (nc_enddef(ncid)) ERR;
84
85    /* Write float and double data */
86   if (nc_put_var_float(ncidfvaridfvals)) ERR;
87   if (nc_put_var_double(nciddvariddvals)) ERR;
88
89   if (nc_close(ncid)) ERR;
90
91   /* Check it out. */
92
93   /* Reopen the file. */
94   if (nc_open(FILE8_NAMENC_NOWRITE, &ncid)) ERR;
95   if (nc_inq_varid(ncidF_NAME, &fvarid)) ERR;
96   if (nc_inq_varid(ncidD_NAME, &dvarid)) ERR;
97   /* Check the values of the float attributes */
98   if (nc_inq_att(ncidfvaridFV_NAME, &att_type, &att_len)) ERR;
99   if (att_type != NC_FLOAT || att_len != FV_NVALSERR;
100   if (nc_get_att_float(ncidfvaridFV_NAMEatt_fvals)) ERR;
101   if (!isnan(att_fvals[0])) ERR;
102   if (nc_get_att_float(ncidfvaridATT_NAMEatt_fvals)) ERR;
103   if (!(isinf(att_fvals[0]) && att_fvals[0] < 0)) ERR;
104   if (!isnan(att_fvals[1])) ERR;
105   if (!(isinf(att_fvals[2]) && att_fvals[2] > 0)) ERR;
106   /* Check the values of double attributes */
107   if (nc_inq_att(nciddvaridFV_NAME, &att_type, &att_len)) ERR;
108   if (att_type != NC_DOUBLE || att_len != FV_NVALSERR;
109   if (nc_get_att_double(nciddvaridFV_NAMEatt_dvals)) ERR;
110   if (!isnan(att_dvals[0])) ERR;
111   if (nc_get_att_double(nciddvaridATT_NAMEatt_dvals)) ERR;
112   if (!(isinf(att_dvals[0]) && att_dvals[0] < 0)) ERR;
113   if (!isnan(att_dvals[1])) ERR;
114   if (!(isinf(att_dvals[2]) && att_dvals[2] > 0)) ERR;
115   /* Check values of float data */
116   if (nc_get_var_float(ncidfvaridfvals_in)) ERR;
117   if (!(isinf(fvals_in[0]) && fvals_in[0] < 0)) ERR;
118   if (!isnan(fvals_in[1])) ERR;
119   if (!(isinf(fvals_in[2]) && fvals_in[2] > 0)) ERR;
120   /* Check values of double data */
121   if (nc_get_var_double(nciddvariddvals_in)) ERR;
122   if (!(isinf(dvals_in[0]) && dvals_in[0] < 0)) ERR;
123   if (!isnan(dvals_in[1])) ERR;
124   if (!(isinf(dvals_in[2]) && dvals_in[2] > 0)) ERR;
125
126   if (nc_close(ncid)) ERR;
127
128   SUMMARIZE_ERR;
129   FINAL_RESULTS;
130}


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