[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[netCDF #QZX-374600]: netcdf cxx and arrays



Hi Mathieu,

The pres_temp_4D_rd.cpp example you are looking at is for the old
legacy netCDF-3 C++ software, which is no longer supported. You
probably want to instead use the current netCDF-4 C++ software
contributed for us to distribute by its developer, Lynton Appel. It's
omnly supported on a "best-effort" level, but I believe it conforms
to the current C++ standard.  It's documented here:

  http://www.unidata.ucar.edu/netcdf/docs/cxx4/

and is available for download from here:

  http://github.com/Unidata/netcdf-cxx4/releases/tag/v4.2.1

and there are a few examples of its use here:

  http://www.unidata.ucar.edu/netcdf/docs/cxx4/examples.html

There have been 77 commits since the last formal release, mostly
fixing bugs and making the code more portable, so I would
recommend getting the latest developer's snapshot from the github
link above and working with that.

To build the library from a github snapshot from the source, you'll
have to generate a "configure" script by running 

  $ autoreconf -if

in the source directory containing the configure.ac file.

I hope his helps ...

--Russ


> the examples of netcdf cxx given in pres_temp_4D_rd.cpp,
> and others uses the following kind of declarations for the
> arrays:
> 
> static const int NLVL = 2;
> static const int NLAT = 6;
> static const int NLON = 12;
> float pres_in[NLVL][NLAT][NLON];
> 
> the problem is that usually, one does not know the size
> of arrays before compile time!
> 
> The solution I am using right now is to use variable length arrays (VLA):
> i.e. I have code of the following kind:
> /* reading dimensions */
> int eta_rho=GrdArr.GrdArrRho.LON.rows();
> int xi_rho =GrdArr.GrdArrRho.LON.cols();
> /* Declaring variable */
> float XfieldC[eta_rho][xi_rho];
> the problem is that VLA are not part of the standard and their use is
> discouraged.
> 
> On the other hands legal kind of format like
> float **Xfield;
> float **XfieldB;
> Xfield=(float**)malloc(eta_rho*sizeof(float*));
> for (int i=0; i<eta_rho; i++) {
> Xfield[i]=(float*)malloc(xi_rho*sizeof(float));
> }
> XfieldB=new float*[eta_rho];
> for (int i=0; i<eta_rho; i++) {
> XfieldB[i]=new float[xi_rho];
> }
> are not working and incoherent results of the kind
> lat =
> 8.69092e-38, 0, 3.058333e-38, 0, 3.058517e-38, 0, 3.0587e-38, 0,
> 3.058884e-38, 0, 3.059068e-38, 0, 3.059252e-38, 0, 3.059436e-38, 0,
> 3.05962e-38, 0, 3.059804e-38, 0, 3.059987e-38, 0, 3.060171e-38, 0,
> 3.060355e-38, 0, 3.060539e-38, 0, 3.060723e-38, 0, 3.060907e-38, 0,
> 3.061091e-38, 0, 3.061274e-38, 0, 3.061458e-38, 0, 3.061642e-38, 0,
> 3.061826e-38, 0, 3.06201e-38, 0, 3.062194e-38, 0, 3.062377e-38, 0,
> 3.062561e-38, 0, 3.062745e-38, 0, 3.062929e-38, 0, 3.063113e-38, 0,
> 3.063297e-38, 0, 3.063481e-38, 0, 3.063664e-38, 0, 3.063848e-38, 0,
> 3.064032e-38, 0, 3.064216e-38, 0, 3.0644e-38, 0, 3.064584e-38, 0,
> showing incorrect alignments.
> 
> Is there a way to use netcdf-cxx that is respecting the standard?
> 
> Thank you very much in advance.
> 
> Mathieu
> 
> 
Russ Rew                                         UCAR Unidata Program
address@hidden                      http://www.unidata.ucar.edu



Ticket Details
===================
Ticket ID: QZX-374600
Department: Support netCDF
Priority: Normal
Status: Closed