00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062 #include <io.h>
00063
00065 int
00066 read_netcdf_dims_eof(double **lon, double **lat, int *nlon, int *nlat, int *neof, char *coords,
00067 char *lonname, char *latname, char *dimxname, char *dimyname, char *eofname, char *filename) {
00085 int istat;
00086
00087 size_t dimval;
00088
00089 int ncinid;
00090 int latinid;
00091 int loninid;
00092 nc_type vartype;
00093 int varndims;
00094 int vardimids[NC_MAX_VAR_DIMS];
00095 int eofdiminid;
00096 int londiminid;
00097 int latdiminid;
00098
00099 size_t start[3];
00100 size_t count[3];
00101
00102 double *tmpd = NULL;
00103
00104 int i;
00105 int j;
00106 int ndims;
00107
00108
00109
00110
00111 printf("%s: Reading info from NetCDF input file %s\n", __FILE__, filename);
00112 istat = nc_open(filename, NC_NOWRITE, &ncinid);
00113 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00114
00115 if ( !strcmp(coords, "1D") ) {
00117 ndims = 1;
00118
00119
00120 istat = nc_inq_dimid(ncinid, dimyname, &latdiminid);
00121 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00122 istat = nc_inq_dimlen(ncinid, latdiminid, &dimval);
00123 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00124 *nlat = (int) dimval;
00125
00126 istat = nc_inq_dimid(ncinid, dimxname, &londiminid);
00127 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00128 istat = nc_inq_dimlen(ncinid, londiminid, &dimval);
00129 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00130 *nlon = (int) dimval;
00131 }
00132 else {
00134 ndims = 2;
00135
00136
00137 istat = nc_inq_dimid(ncinid, dimyname, &latdiminid);
00138 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00139 istat = nc_inq_dimlen(ncinid, latdiminid, &dimval);
00140 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00141 *nlat = (int) dimval;
00142
00143 istat = nc_inq_dimid(ncinid, dimxname, &londiminid);
00144 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00145 istat = nc_inq_dimlen(ncinid, londiminid, &dimval);
00146 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00147 *nlon = (int) dimval;
00148 }
00149
00150
00151 istat = nc_inq_dimid(ncinid, eofname, &eofdiminid);
00152 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00153 istat = nc_inq_dimlen(ncinid, eofdiminid, &dimval);
00154 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00155 *neof = (int) dimval;
00156
00157
00158 istat = nc_inq_varid(ncinid, latname, &latinid);
00159 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00160
00161 istat = nc_inq_var(ncinid, latinid, (char *) NULL, &vartype, &varndims, vardimids, (int *) NULL);
00162 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00163 if (varndims != ndims) {
00164 (void) fprintf(stderr, "Error NetCDF type and/or dimensions %d != %d.\n", varndims, ndims);
00165 istat = ncclose(ncinid);
00166 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00167 return -1;
00168 }
00169 istat = nc_inq_varid(ncinid, lonname, &loninid);
00170 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00171
00172 istat = nc_inq_var(ncinid, loninid, (char *) NULL, &vartype, &varndims, vardimids, (int *) NULL);
00173 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00174 if (varndims != ndims) {
00175 (void) fprintf(stderr, "Error NetCDF type and/or dimensions %d != %d.\n", varndims, ndims);
00176 istat = ncclose(ncinid);
00177 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00178 return -1;
00179 }
00180
00182 if ( !strcmp(coords, "1D") ) {
00183
00184 start[0] = 0;
00185 start[1] = 0;
00186 start[2] = 0;
00187 count[0] = (size_t) (*nlat);
00188 count[1] = 0;
00189 count[2] = 0;
00190 (*lat) = (double *) malloc((*nlat) * (*nlon) * sizeof(double));
00191 if ((*lat) == NULL) alloc_error(__FILE__, __LINE__);
00192 tmpd = (double *) malloc((*nlat) * sizeof(double));
00193 if (tmpd == NULL) alloc_error(__FILE__, __LINE__);
00194
00195
00196 istat = nc_get_vara_double(ncinid, latinid, start, count, tmpd);
00197 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00198 for (j=0; j<(*nlat); j++)
00199 for (i=0; i<(*nlon); i++)
00200 (*lat)[i+j*(*nlon)] = tmpd[j];
00201
00202
00203 start[0] = 0;
00204 start[1] = 0;
00205 start[2] = 0;
00206 count[0] = (size_t) (*nlon);
00207 count[1] = 0;
00208 count[2] = 0;
00209 (*lon) = (double *) malloc((*nlat) * (*nlon) * sizeof(double));
00210 if ((*lon) == NULL) alloc_error(__FILE__, __LINE__);
00211 tmpd = (double *) realloc(tmpd, (*nlon) * sizeof(double));
00212 if (tmpd == NULL) alloc_error(__FILE__, __LINE__);
00213
00214
00215 istat = nc_get_vara_double(ncinid, loninid, start, count, tmpd);
00216 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00217 for (j=0; j<(*nlat); j++)
00218 for (i=0; i<(*nlon); i++)
00219 (*lon)[i+j*(*nlon)] = tmpd[i];
00220
00221 (void) free(tmpd);
00222
00223 }
00224 else {
00225
00226 start[0] = 0;
00227 start[1] = 0;
00228 start[2] = 0;
00229 count[0] = (size_t) (*nlat);
00230 count[1] = (size_t) (*nlon);
00231 count[2] = 0;
00232 (*lat) = (double *) malloc((*nlat) * (*nlon) * sizeof(double));
00233 if ((*lat) == NULL) alloc_error(__FILE__, __LINE__);
00234
00235
00236 istat = nc_get_vara_double(ncinid, latinid, start, count, (*lat));
00237 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00238
00239
00240 start[0] = 0;
00241 start[1] = 0;
00242 start[2] = 0;
00243 count[0] = (size_t) (*nlat);
00244 count[1] = (size_t) (*nlon);
00245 count[2] = 0;
00246 (*lon) = (double *) malloc((*nlat) * (*nlon) * sizeof(double));
00247 if ((*lon) == NULL) alloc_error(__FILE__, __LINE__);
00248
00249
00250 istat = nc_get_vara_double(ncinid, loninid, start, count, (*lon));
00251 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00252 }
00253
00254 istat = ncclose(ncinid);
00255 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__);
00256
00257
00258 return 0;
00259 }