Re: [netcdfgroup] NcType problems on Ubuntu 16.04

I see the following in the API notes for netcdf::NcGroup::AddVar:


Adds a netCDF variable. The 
NcType<http://www.nrel.colostate.edu/projects/irc/public/Documents/Software/netCDF/cpp4/html/classnetcdf_1_1NcType.html>
 and 
NcDim<http://www.nrel.colostate.edu/projects/irc/public/Documents/Software/netCDF/cpp4/html/classnetcdf_1_1NcDim.html>
 objects must be non-null, and be defined in either the current group or a 
parent group. An 
NcNullType<http://www.nrel.colostate.edu/projects/irc/public/Documents/Software/netCDF/cpp4/html/classnetcdf_1_1NcNullType.html>
 exception is thrown if the 
NcType<http://www.nrel.colostate.edu/projects/irc/public/Documents/Software/netCDF/cpp4/html/classnetcdf_1_1NcType.html>
 object is invalid. An NcNullDim exception is thrown if the 
NcDim<http://www.nrel.colostate.edu/projects/irc/public/Documents/Software/netCDF/cpp4/html/classnetcdf_1_1NcDim.html>
 object is invalid.


So the NcType must be defined in the current or parent group.  How do I define 
a type in a group?  I cannot see an appropriate function for doing this.  Are 
types automatically "defined" in a group depending on what type of netCDF file 
has been opened (e.g. legacy, 3, 4 etc)?  I am opening the file as 
netCDF::NcFile::nc4.


Is this the correct way to add variables?  In netcdf version 4.1.3, both work.  
In version 4.4.0 the first one works, but the second one doesn't.


auto ncFloat = ncFile.getType("float",netCDF::NcGroup::ParentsAndCurrent);
std::vector<float> myFloats = { 1., 2., 3., 4., 5. };
auto ncDim = ncFile.addDim("myFloatsDim", myFloats.size());
auto ncVar = ncFile.addVar("myFloats", ncFloat, {ncDim});
ncVar.putVar(myFloats.data());


auto ncString = ncFile.getType("string",netCDF::NcGroup::ParentsAndCurrent);
std::vector<std::string> myStrings = { "a", "bb", "ccc", "dddd" };
auto ncDim = ncFile.addDim("myStringsDim", myStrings.size());
auto ncVar = ncFile.addVar("myStrings", ncString, {ncDim});
std::vector<const char *> myChars;
for ( auto s : myStrings )
   myChars.push_back( s.c_str() );
ncVar.putVar(myChars.data());

I am a bit confused as to why I am seeing this different behaviour with version 
4.4.0.


Best regards,

Daniel


________________________________
From: Potter, Daniel (Energy, Newcastle)
Sent: Monday, 5 December 2016 11:02 AM
To: elizabeth.fischer@xxxxxxxxxxxx
Cc: netcdfgroup@xxxxxxxxxxxxxxxx
Subject: Re: [netcdfgroup] NcType problems on Ubuntu 16.04


Hi Elizabeth,


Thank-you for your help and suggestion.


I have tried using NcGroup::getType(), but I still get exceptions when I used 
non-netCDF3 types.  e.g.:


    netCDF::NcFile ncFile("test.nc", netCDF::NcFile::replace, 
netCDF::NcFile::nc4);

    // works
    auto ncFloat = ncFile.getType("float",netCDF::NcGroup::ParentsAndCurrent);
    std::cout << "ncFloat.getName() = " << ncFloat.getName() << std::endl;

    // throws NcBadType
    auto ncString = ncFile.getType("string",netCDF::NcGroup::ParentsAndCurrent);
    std::cout << "ncString.getName() = " << ncString.getName() << std::endl;

    // throws NcBadType
    auto ncUint = ncFile.getType("uint",netCDF::NcGroup::ParentsAndCurrent);
    std::cout << "ncUint.getName() = " << ncUint.getName() << std::endl;


Again, this works on Ubuntu 14.04 with netCDF 4.1.3 but not on Ubuntu 16.04 
with netCDF 4.4.0.  As far as I can tell, this means I cannot make variables of 
type string, uint etc?


Best regards,

Daniel


________________________________
From: Elizabeth A. Fischer <elizabeth.fischer@xxxxxxxxxxxx>
Sent: Friday, 2 December 2016 5:07 PM
To: Potter, Daniel (Energy, Newcastle)
Cc: netcdfgroup@xxxxxxxxxxxxxxxx
Subject: Re: [netcdfgroup] NcType problems on Ubuntu 16.04

Daniel,

I believe you're using the "new" (NetCDF4) C++ interface?

It has known problems with NcType, specifically for any types not in the 
NetCDF3 data model.  I solved them by using strings instead of the symbolic 
enums; some of the API functions take strings.  If I need a NcType object, I 
use the following function to get one:

inline netCDF::NcType nc_type(netCDF::NcVar ncvar, std::string sntype)
    { return ncvar.getParentGroup().getType(sntype, 
netCDF::NcGroup::ParentsAndCurrent); }

-- Elizabeth