1 /* This is part of the netCDF package.
2    Copyright 2006 University Corporation for Atmospheric Research/Unidata.
3    See COPYRIGHT file for conditions of use.
4 
5    This is an example which reads some 4D pressure and temperature
6    values. The data file read by this program is produced by the
7    companion program pres_temp_4D_wr.cpp. It is intended to illustrate
8    the use of the netCDF C++ API.
9 
10    This program is part of the netCDF tutorial:
11    http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial
12 
13    Full documentation of the netCDF C++ API can be found at:
14    http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-cxx
15 
16    $Id: pres_temp_4D_rd.cpp,v 1.5 2010/02/11 22:36:42 russ Exp $
17 */
18 
19 #include <iostream>
20 #include <netcdf>
21 using namespace std;
22 using namespace netCDF;
23 using namespace netCDF::exceptions;
24 
25 // We are writing 4D data, a 2 x 6 x 12 lvl-lat-lon grid, with 2
26 // timesteps of data.
27 static const int NLVL = 2;
28 static const int NLAT = 6;
29 static const int NLON = 12;
30 static const int NREC = 2;
31 
32 // These are used to construct some example data.
33 static const float SAMPLE_PRESSURE = 900.0;
34 static const float SAMPLE_TEMP = 9.0;
35 static const float START_LAT = 25.0;
36 static const float START_LON = -125.0;
37 
38 
39 // Return this code to the OS in case of failure.
40 static const int NC_ERR = 2;
41 
main()42 int main()
43 {
44    // These arrays will store the latitude and longitude values.
45    float lats[NLAT], lons[NLON];
46 
47    // These arrays will hold the data we will read in. We will only
48    // need enough space to hold one timestep of data; one record.
49    float pres_in[NLVL][NLAT][NLON];
50    float temp_in[NLVL][NLAT][NLON];
51 
52    try
53    {
54    // Open the file.
55      NcFile dataFile("pres_temp_4D.nc", NcFile::read);
56 
57    // Get the latitude and longitude variables and read data.
58    NcVar latVar, lonVar;
59    latVar = dataFile.getVar("latitude");
60    if(latVar.isNull()) return NC_ERR;
61    lonVar = dataFile.getVar("longitude");
62    if(lonVar.isNull()) return NC_ERR;
63    lonVar.getVar(lons);
64    latVar.getVar(lats);
65 
66    // Check the coordinate variable data.
67    for (int lat = 0; lat < NLAT; lat++)
68        if (lats[lat] != START_LAT + 5. * lat)
69 	 return NC_ERR;
70 
71    for (int lon = 0; lon < NLON; lon++)
72       if (lons[lon] != START_LON + 5. * lon)
73  	return NC_ERR;
74 
75    // Get the pressure and temperature variables and read data one time step at a time
76    NcVar presVar, tempVar;
77    presVar = dataFile.getVar("pressure");
78    if(presVar.isNull()) return NC_ERR;
79    tempVar = dataFile.getVar("temperature");
80    if(tempVar.isNull()) return NC_ERR;
81 
82    vector<size_t> startp,countp;
83    startp.push_back(0);
84    startp.push_back(0);
85    startp.push_back(0);
86    startp.push_back(0);
87    countp.push_back(1);
88    countp.push_back(NLVL);
89    countp.push_back(NLAT);
90    countp.push_back(NLON);
91    for (size_t rec = 0; rec < NREC; rec++)
92    {
93      // Read the data one record at a time.
94      startp[0]=rec;
95      presVar.getVar(startp,countp,pres_in);
96      tempVar.getVar(startp,countp,temp_in);
97 
98      int i=0;  //used in the data generation loop
99      for (int lvl = 0; lvl < NLVL; lvl++)
100        for (int lat = 0; lat < NLAT; lat++)
101 	 for (int lon = 0; lon < NLON; lon++)
102 	   {
103 	     if(pres_in[lvl][lat][lon] != (float) (SAMPLE_PRESSURE + i)) return NC_ERR;
104 	     if(temp_in[lvl][lat][lon] != (float)(SAMPLE_TEMP + i++)) return NC_ERR;
105 	   }
106 
107    } // next record
108 
109    // The file is automatically closed by the destructor. This frees
110    // up any internal netCDF resources associated with the file, and
111    // flushes any buffers.
112 
113    // cout << "*** SUCCESS reading example file pres_temp_4D.nc!" << endl;
114    return 0;
115 
116    }
117    catch(NcException& e)
118    {
119       e.what();
120       cout<<"FAILURE**************************"<<endl;
121       return NC_ERR;
122    }
123 
124 }
125