NetCDF4 C++ API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Test_CreateFileNc3.cpp

Test of class CreateFileNc3.

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
#include <iostream>
using std::cout;
using std::endl;
#include "netcdf4"
using namespace netcdf;
#include <memory>
#include <algorithm>
//-----------------------------------------------------------------------------
// configuration
char const * const ncFileName = "netcdf3_classic.nc";
//-----------------------------------------------------------------------------
std::vector<float> & lat,
std::vector<float> & lon)
{
lat.resize ( 360 );
for ( int i = 0; i < 360; ++i )
lat[i] = i + 0.5f;
lon.resize ( 720 );
for ( int i = 0; i < 720; ++i )
lon[i] = i + 0.5f;
}
//-----------------------------------------------------------------------------
std::auto_ptr<NcFile> CreateNcFile (
std::string const & fileName )
{
std::auto_ptr<NcFile> pNcFile (
new NcFile ( fileName, NcFile::Replace, NcFile::Classic ) );
NcDim latDim = pNcFile->AddDim ( "lat", 360 );
NcDim lonDim = pNcFile->AddDim ( "lon", 720 );
NcDim timeDim = pNcFile->AddDim ( "time" );
NcVar var1 = pNcFile->AddVar ( "lat", ncFloat, latDim );
float const latRange[] = { -90.0f, 90.0f };
var1.PutAtt( "valid_range", ncFloat, 2, latRange );
NcVar var2 = pNcFile->AddVar ( "lon", ncFloat, lonDim );
float const lonRange[] = { -180.0f, 180.0f };
var2.PutAtt( "valid_range", ncFloat, 2, lonRange );
std::vector<NcDim> dimArray;
dimArray.push_back(timeDim); // unlimited dim is first
dimArray.push_back(latDim);
dimArray.push_back(lonDim);
NcVar var3 = pNcFile->AddVar ( "amount", ncFloat, dimArray );
float const amountRange[] = { 0.0f, 999.0f };
var3.PutAtt( "valid_range", ncFloat, 2, amountRange );
pNcFile->ToDataMode();
return pNcFile;
}
//-----------------------------------------------------------------------------
void AddData (
NcFile & ncFile,
std::vector<float> const & lat,
std::vector<float> const & lon)
{
NcVar latNcVar = ncFile.GetVar("lat");
//latNcVar.Put( (const float*) lat.data() ); // old method
latNcVar.Put ( lat ); // new method
NcVar lonNcVar = ncFile.GetVar("lon");
//lonNcVar.Put( (const float*) lon.data() ); // old method
lonNcVar.Put ( lon ); // new method
}
//-----------------------------------------------------------------------------
void ReadData (
NcFile & ncFile,
std::vector<float> & lat,
std::vector<float> & lon)
{
NcVar latNcVar = ncFile.GetVar("lat");
latNcVar.Get ( lat ); // new method
NcVar lonNcVar = ncFile.GetVar("lon");
lonNcVar.Get ( lon ); // new method
}
//-----------------------------------------------------------------------------
int main ()
{
cout << "Test of class NcFile to create a classic NetCDF3 file." << endl;
try
{
std::vector<float> lat, lon;
MakeLatLonData (lat, lon);
cout << "Creating file: " << ncFileName << endl;
std::auto_ptr<NcFile> pNcFile = CreateNcFile (ncFileName);
cout << "Add data to file..." << endl;
AddData ( *pNcFile, lat, lon );
cout << "Read data from file..." << endl;
std::vector<float> latIn, lonIn;
ReadData ( *pNcFile, latIn, lonIn );
// are lat values equal?
bool areEqual = latIn.size() == lat.size();
if ( areEqual )
areEqual = std::equal( lat.begin(), lat.end(), latIn.begin() );
cout << "variable lat: original == input ? "
<< ( areEqual ? "yes" : "no" )
<< endl;
// are lon values equal?
areEqual = lonIn.size() == lon.size();
if ( areEqual )
areEqual = std::equal( lon.begin(), lon.end(), lonIn.begin() );
cout << "variable lon: original == input ? "
<< ( areEqual ? "yes" : "no" )
<< endl;
}
catch (std::exception const & e)
{
cout << "Exception: " << e.what() << endl;
}
catch (...)
{
cout << "Error: unknown error." << endl;
}
cout << "\n all done!" << endl;
return 0;
}
//-----------------------------------------------------------------------------