read_netcdf_xy.c

Go to the documentation of this file.
00001 /* ***************************************************** */
00002 /* read_netcdf_xy Read NetCDF X and Y dimensions.        */
00003 /* read_netcdf_xy.c                                      */
00004 /* ***************************************************** */
00005 /* Author: Christian Page, CERFACS, Toulouse, France.    */
00006 /* ***************************************************** */
00007 /* Date of creation: dec 2008                            */
00008 /* Last date of modification: dec 2008                   */
00009 /* ***************************************************** */
00010 /* Original version: 1.0                                 */
00011 /* Current revision:                                     */
00012 /* ***************************************************** */
00013 /* Revisions                                             */
00014 /* ***************************************************** */
00019 /* LICENSE BEGIN
00020 
00021 Copyright Cerfacs (Christian Page) (2015)
00022 
00023 christian.page@cerfacs.fr
00024 
00025 This software is a computer program whose purpose is to downscale climate
00026 scenarios using a statistical methodology based on weather regimes.
00027 
00028 This software is governed by the CeCILL license under French law and
00029 abiding by the rules of distribution of free software. You can use, 
00030 modify and/ or redistribute the software under the terms of the CeCILL
00031 license as circulated by CEA, CNRS and INRIA at the following URL
00032 "http://www.cecill.info". 
00033 
00034 As a counterpart to the access to the source code and rights to copy,
00035 modify and redistribute granted by the license, users are provided only
00036 with a limited warranty and the software's author, the holder of the
00037 economic rights, and the successive licensors have only limited
00038 liability. 
00039 
00040 In this respect, the user's attention is drawn to the risks associated
00041 with loading, using, modifying and/or developing or reproducing the
00042 software by the user in light of its specific status of free software,
00043 that may mean that it is complicated to manipulate, and that also
00044 therefore means that it is reserved for developers and experienced
00045 professionals having in-depth computer knowledge. Users are therefore
00046 encouraged to load and test the software's suitability as regards their
00047 requirements in conditions enabling the security of their systems and/or 
00048 data to be ensured and, more generally, to use and operate it in the 
00049 same conditions as regards security. 
00050 
00051 The fact that you are presently reading this means that you have had
00052 knowledge of the CeCILL license and that you accept its terms.
00053 
00054 LICENSE END */
00055 
00056 
00057 
00058 
00059 
00060 
00061 
00062 #include <io.h>
00063 
00065 int
00066 read_netcdf_xy(double **x, double **y, int *nx, int *ny, char *xname, char *yname, char *dimxname, char *dimyname, char *filename) {
00081   int istat; /* Diagnostic status */
00082 
00083   size_t dimval; /* Variable used to retrieve dimension length */
00084 
00085   int ncinid; /* NetCDF input file handle ID */
00086   int yinid; /* Y variable ID */
00087   int xinid; /* X variable ID */
00088   nc_type vartype; /* Type of the variable (NC_FLOAT, NC_DOUBLE, etc.) */
00089   int varndims; /* Number of dimensions of variable */
00090   int vardimids[NC_MAX_VAR_DIMS]; /* Variable dimension ids */
00091   int xdiminid; /* X dimension ID */
00092   int ydiminid; /* Y dimension ID */
00093 
00094   size_t start[3]; /* Start position to read */
00095   size_t count[3]; /* Number of elements to read */
00096 
00097   int ndims; /* Number of dimensions of y and x variables */
00098 
00099   /* Read data in NetCDF file */
00100 
00101   /* Open NetCDF file for reading */
00102   printf("%s: Reading info from NetCDF input file %s\n", __FILE__, filename);
00103   istat = nc_open(filename, NC_NOWRITE, &ncinid);  /* open for reading */
00104   if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00105 
00107   ndims = 1;
00108   
00109   /* Get dimensions length */
00110   istat = nc_inq_dimid(ncinid, dimyname, &ydiminid);  /* get ID for Y dimension */
00111   if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00112   istat = nc_inq_dimlen(ncinid, ydiminid, &dimval); /* get y length */
00113   if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00114   *ny = (int) dimval;
00115   
00116   istat = nc_inq_dimid(ncinid, dimxname, &xdiminid);  /* get ID for X dimension */
00117   if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00118   istat = nc_inq_dimlen(ncinid, xdiminid, &dimval); /* get x length */
00119   if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00120   *nx = (int) dimval;
00121   
00122   /* Get dimension ID */
00123   istat = nc_inq_varid(ncinid, yname, &yinid);  /* get ID for y variable */
00124   if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00125   /* Get y dimensions and type */
00126   istat = nc_inq_var(ncinid, yinid, (char *) NULL, &vartype, &varndims, vardimids, (int *) NULL); /* get variable information */
00127   if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);  
00128   if (varndims != ndims) {
00129     (void) fprintf(stderr, "Error NetCDF type and/or dimensions %d != %d.\n", varndims, ndims);
00130     istat = ncclose(ncinid);
00131     if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00132     return -1;
00133   }
00134 
00135   /* Get dimension ID */
00136   istat = nc_inq_varid(ncinid, xname, &xinid);  /* get ID for x variable */
00137   if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00138   /* Get x dimensions and type */
00139   istat = nc_inq_var(ncinid, xinid, (char *) NULL, &vartype, &varndims, vardimids, (int *) NULL); /* get variable information */
00140   if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);  
00141   if (varndims != ndims) {
00142     (void) fprintf(stderr, "Error NetCDF type and/or dimensions %d != %d.\n", varndims, ndims);
00143     istat = ncclose(ncinid);
00144     if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00145     return -1;
00146   }
00147 
00149   /* Allocate memory and set start and count */
00150   start[0] = 0;
00151   start[1] = 0;
00152   start[2] = 0;
00153   count[0] = (size_t) (*ny);
00154   count[1] = 0;
00155   count[2] = 0;
00156   (*y) = (double *) malloc((*ny) * sizeof(double));
00157   if ((*y) == NULL) alloc_error(__FILE__, __LINE__);
00158   
00159   /* Read values from netCDF variable */
00160   istat = nc_get_vara_double(ncinid, yinid, start, count, *y);
00161   if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00162   
00163   /* Allocate memory and set start and count */
00164   start[0] = 0;
00165   start[1] = 0;
00166   start[2] = 0;
00167   count[0] = (size_t) (*nx);
00168   count[1] = 0;
00169   count[2] = 0;
00170   (*x) = (double *) malloc((*nx) * sizeof(double));
00171   if ((*x) == NULL) alloc_error(__FILE__, __LINE__);
00172 
00173   /* Read values from netCDF variable */
00174   istat = nc_get_vara_double(ncinid, xinid, start, count, *x);
00175   if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00176 
00177   istat = ncclose(ncinid);
00178   if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00179 
00180   /* Success status */
00181   return 0;
00182 }

Generated on 12 May 2016 for DSCLIM by  doxygen 1.6.1