1/*! \file
2A simple example of writing a netCDF file.
3
4This example writes some surface pressure and temperatures. It is
5intended to illustrate the use of the netCDF C API. The companion
6program sfc_pres_temp_rd.c shows how to read the netCDF data file
7created by this program.
8
9Copyright 2006 University Corporation for Atmospheric
10Research/Unidata.  See COPYRIGHT file for conditions of use.
11*/
12
13#include <stdio.h>
14#include <string.h>
15#include <netcdf.h>
16
17/* This is the name of the data file we will create. */
18#define FILE_NAME "sfc_pres_temp.nc"
19
20/* We are writing 2D data, a 6 x 12 lat-lon grid. We will need two
21 * netCDF dimensions. */
22#define NDIMS 2
23#define NLAT 6
24#define NLON 12
25#define LAT_NAME "latitude"
26#define LON_NAME "longitude"
27
28/* Names of things. */
29#define PRES_NAME "pressure"
30#define TEMP_NAME "temperature"
31#define UNITS "units"
32#define DEGREES_EAST "degrees_east"
33#define DEGREES_NORTH "degrees_north"
34
35/* These are used to construct some example data. */
36#define SAMPLE_PRESSURE 900
37#define SAMPLE_TEMP 9.0
38#define START_LAT 25.0
39#define START_LON -125.0
40
41/* Handle errors by printing an error message and exiting with a
42 * non-zero status. */
43#define ERR(e) {printf("Error: %s\n", nc_strerror(e)); return 2;}
44
45int
46main()
47{
48   int ncidlon_dimidlat_dimidpres_varidtemp_varid;
49
50/* In addition to the latitude and longitude dimensions, we will also
51   create latitude and longitude netCDF variables which will hold the
52   actual latitudes and longitudes. Since they hold data about the
53   coordinate system, the netCDF term for these is: "coordinate
54   variables." */
55   int lat_varidlon_varid;
56
57   int dimids[NDIMS];
58
59   /* We will write surface temperature and pressure fields. */
60   float pres_out[NLAT][NLON];
61   float temp_out[NLAT][NLON];
62   float lats[NLAT], lons[NLON];
63
64   /* It's good practice for each netCDF variable to carry a "units"
65    * attribute. */
66   char pres_units[] = "hPa";
67   char temp_units[] = "celsius";
68
69   /* Loop indexes. */
70   int latlon;
71
72   /* Error handling. */
73   int retval;
74
75   /* Create some pretend data. If this wasn't an example program, we
76    * would have some real data to write, for example, model
77    * output. */
78   for (lat = 0; lat < NLATlat++)
79      lats[lat] = START_LAT + 5.*lat;
80   for (lon = 0; lon < NLONlon++)
81      lons[lon] = START_LON + 5.*lon;
82
83   for (lat = 0; lat < NLATlat++)
84      for (lon = 0; lon < NLONlon++)
85      {
86  pres_out[lat][lon] = SAMPLE_PRESSURE + (lon * NLAT + lat);
87  temp_out[lat][lon] = SAMPLE_TEMP + .25 * (lon * NLAT + lat);
88      }
89
90   /* Create the file. */
91   if ((retval = nc_create(FILE_NAMENC_CLOBBER, &ncid)))
92      ERR(retval);
93
94   /* Define the dimensions. */
95   if ((retval = nc_def_dim(ncidLAT_NAMENLAT, &lat_dimid)))
96      ERR(retval);
97   if ((retval = nc_def_dim(ncidLON_NAMENLON, &lon_dimid)))
98      ERR(retval);
99
100   /* Define coordinate netCDF variables. They will hold the
101      coordinate information, that is, the latitudes and longitudes. A
102      varid is returned for each.*/
103   if ((retval = nc_def_var(ncidLAT_NAMENC_FLOAT, 1, &lat_dimid,
104     &lat_varid)))
105      ERR(retval);
106   if ((retval = nc_def_var(ncidLON_NAMENC_FLOAT, 1, &lon_dimid,
107     &lon_varid)))
108      ERR(retval);
109
110   /* Define units attributes for coordinate vars. This attaches a
111      text attribute to each of the coordinate variables, containing
112      the units. Note that we are not writing a trailing NULL, just
113      "units", because the reading program may be fortran which does
114      not use null-terminated strings. In general it is up to the
115      reading C program to ensure that it puts null-terminators on
116      strings where necessary.*/
117   if ((retval = nc_put_att_text(ncidlat_varidUNITS,
118  strlen(DEGREES_NORTH), DEGREES_NORTH)))
119      ERR(retval);
120   if ((retval = nc_put_att_text(ncidlon_varidUNITS,
121  strlen(DEGREES_EAST), DEGREES_EAST)))
122      ERR(retval);
123
124   /* Define the netCDF variables. The dimids array is used to pass
125      the dimids of the dimensions of the variables.*/
126   dimids[0] = lat_dimid;
127   dimids[1] = lon_dimid;
128   if ((retval = nc_def_var(ncidPRES_NAMENC_FLOATNDIMS,
129     dimids, &pres_varid)))
130      ERR(retval);
131   if ((retval = nc_def_var(ncidTEMP_NAMENC_FLOATNDIMS,
132     dimids, &temp_varid)))
133      ERR(retval);
134
135   /* Define units attributes for vars. */
136   if ((retval = nc_put_att_text(ncidpres_varidUNITS,
137  strlen(pres_units), pres_units)))
138      ERR(retval);
139   if ((retval = nc_put_att_text(ncidtemp_varidUNITS,
140  strlen(temp_units), temp_units)))
141      ERR(retval);
142
143   /* End define mode. */
144   if ((retval = nc_enddef(ncid)))
145      ERR(retval);
146
147   /* Write the coordinate variable data. This will put the latitudes
148      and longitudes of our data grid into the netCDF file. */
149   if ((retval = nc_put_var_float(ncidlat_varid, &lats[0])))
150      ERR(retval);
151   if ((retval = nc_put_var_float(ncidlon_varid, &lons[0])))
152      ERR(retval);
153
154   /* Write the pretend data. This will write our surface pressure and
155      surface temperature data. The arrays of data are the same size
156      as the netCDF variables we have defined. */
157   if ((retval = nc_put_var_float(ncidpres_varid, &pres_out[0][0])))
158      ERR(retval);
159   if ((retval = nc_put_var_float(ncidtemp_varid, &temp_out[0][0])))
160      ERR(retval);
161
162   /* Close the file. */
163   if ((retval = nc_close(ncid)))
164      ERR(retval);
165
166   printf("*** SUCCESS writing example file sfc_pres_temp.nc!\n");
167   return 0;
168}


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