[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[netCDF #QZX-374600]: netcdf cxx and arrays
- Subject: [netCDF #QZX-374600]: netcdf cxx and arrays
- Date: Wed, 03 Jun 2015 10:34:44 -0600
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