Read analog data from input NetCDF file. More...
#include <dsclim.h>
Go to the source code of this file.
Functions | |
void | read_analog_data (analog_day_struct *analog_days, double **delta, double **time_ls, char *filename, char *timename) |
Read analog data from NetCDF input file. |
Read analog data from input NetCDF file.
Definition in file read_analog_data.c.
void read_analog_data | ( | analog_day_struct * | analog_days, | |
double ** | delta, | |||
double ** | time_ls, | |||
char * | filename, | |||
char * | timename | |||
) |
Read analog data from NetCDF input file.
[out] | analog_days | Analog days time indexes and dates with corresponding dates being downscaled. |
[out] | delta | Temperature difference to apply to analog day data. |
[out] | time_ls | Time values in udunit. |
[in] | filename | Analog days output filename. |
[in] | timename | Time dimension name in NetCDF file. |
Definition at line 66 of file read_analog_data.c.
References alloc_error(), analog_day_struct::day, analog_day_struct::day_s, handle_netcdf_error(), analog_day_struct::month, analog_day_struct::month_s, analog_day_struct::ntime, analog_day_struct::year, and analog_day_struct::year_s.
Referenced by wt_downscaling().
00067 { 00076 int istat; /* Diagnostic status */ 00077 00078 int ncinid; /* NetCDF input file handle ID */ 00079 int timediminid; /* NetCDF time dimension output ID */ 00080 int timeinid; /* NetCDF time variable ID */ 00081 int atimeinid; /* NetCDF analog dates variable ID */ 00082 int ayearinid; /* NetCDF analog dates variable ID */ 00083 int amonthinid; /* NetCDF analog dates variable ID */ 00084 int adayinid; /* NetCDF analog dates variable ID */ 00085 int dyearinid; /* NetCDF downscaled dates variable ID */ 00086 int dmonthinid; /* NetCDF downscaled dates variable ID */ 00087 int ddayinid; /* NetCDF downscaled dates variable ID */ 00088 int deltatinid; /* NetCDF delta T variable ID */ 00089 00090 size_t start[1]; /* Start element when reading */ 00091 size_t count[1]; /* Count of elements to read */ 00092 size_t ntime; /* Time dimension length */ 00093 00094 istat = nc_open(filename, NC_NOWRITE, &ncinid); /* open for reading */ 00095 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00096 00097 istat = nc_inq_dimid(ncinid, timename, &timediminid); /* get ID for time dimension */ 00098 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00099 istat = nc_inq_dimlen(ncinid, timediminid, &ntime); /* get time dimension length */ 00100 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00101 analog_days->ntime = ntime; 00102 00103 istat = nc_inq_varid(ncinid, timename, &timeinid); /* get time variable ID */ 00104 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00105 00106 istat = nc_inq_varid(ncinid, "downscaled_date_year", &dyearinid); /* get variable ID */ 00107 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00108 istat = nc_inq_varid(ncinid, "downscaled_date_month", &dmonthinid); /* get variable ID */ 00109 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00110 istat = nc_inq_varid(ncinid, "downscaled_date_day", &ddayinid); /* get variable ID */ 00111 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00112 00113 istat = nc_inq_varid(ncinid, "analog_date", &atimeinid); /* get variable ID */ 00114 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00115 istat = nc_inq_varid(ncinid, "analog_date_year", &ayearinid); /* get variable ID */ 00116 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00117 istat = nc_inq_varid(ncinid, "analog_date_month", &amonthinid); /* get variable ID */ 00118 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00119 istat = nc_inq_varid(ncinid, "analog_date_day", &adayinid); /* get variable ID */ 00120 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00121 00122 istat = nc_inq_varid(ncinid, "analog_delta_t", &deltatinid); /* get variable ID */ 00123 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00124 00125 /* Allocate memory and set start and count */ 00126 start[0] = 0; 00127 count[0] = (size_t) analog_days->ntime; 00128 00129 /* Read values from netCDF variables */ 00130 00131 analog_days->year_s = (int *) malloc(analog_days->ntime * sizeof(int)); 00132 if (analog_days->year_s == NULL) alloc_error(__FILE__, __LINE__); 00133 istat = nc_get_vara_int(ncinid, dyearinid, start, count, analog_days->year_s); 00134 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00135 00136 analog_days->month_s = (int *) malloc(analog_days->ntime * sizeof(int)); 00137 if (analog_days->month_s == NULL) alloc_error(__FILE__, __LINE__); 00138 istat = nc_get_vara_int(ncinid, dmonthinid, start, count, analog_days->month_s); 00139 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00140 00141 analog_days->day_s = (int *) malloc(analog_days->ntime * sizeof(int)); 00142 if (analog_days->day_s == NULL) alloc_error(__FILE__, __LINE__); 00143 istat = nc_get_vara_int(ncinid, ddayinid, start, count, analog_days->day_s); 00144 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00145 00146 analog_days->year = (int *) malloc(analog_days->ntime * sizeof(int)); 00147 if (analog_days->year == NULL) alloc_error(__FILE__, __LINE__); 00148 istat = nc_get_vara_int(ncinid, ayearinid, start, count, analog_days->year); 00149 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00150 00151 analog_days->month = (int *) malloc(analog_days->ntime * sizeof(int)); 00152 if (analog_days->month == NULL) alloc_error(__FILE__, __LINE__); 00153 istat = nc_get_vara_int(ncinid, amonthinid, start, count, analog_days->month); 00154 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00155 00156 analog_days->day = (int *) malloc(analog_days->ntime * sizeof(int)); 00157 if (analog_days->day == NULL) alloc_error(__FILE__, __LINE__); 00158 istat = nc_get_vara_int(ncinid, adayinid, start, count, analog_days->day); 00159 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00160 00161 (*delta) = (double *) malloc(analog_days->ntime * sizeof(double)); 00162 if ((*delta) == NULL) alloc_error(__FILE__, __LINE__); 00163 istat = nc_get_vara_double(ncinid, deltatinid, start, count, *delta); 00164 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00165 00166 (*time_ls) = (double *) malloc(analog_days->ntime * sizeof(double)); 00167 if ((*time_ls) == NULL) alloc_error(__FILE__, __LINE__); 00168 istat = nc_get_vara_double(ncinid, timeinid, start, count, *time_ls); 00169 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00170 00171 /* Close the input netCDF file. */ 00172 istat = ncclose(ncinid); 00173 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00174 }