Save analog data information for further use. More...
#include <dsclim.h>
Go to the source code of this file.
Functions | |
void | save_analog_data (analog_day_struct analog_days, double *delta, double **delta_dayschoice, double *dist, int *cluster, double *time_ls, char *filename, data_struct *data) |
Save analog data information for further use. |
Save analog data information for further use.
Definition in file save_analog_data.c.
void save_analog_data | ( | analog_day_struct | analog_days, | |
double * | delta, | |||
double ** | delta_dayschoice, | |||
double * | dist, | |||
int * | cluster, | |||
double * | time_ls, | |||
char * | filename, | |||
data_struct * | data | |||
) |
Save analog data information for further use.
[in] | analog_days | Analog days time indexes and dates with corresponding dates being downscaled. |
[in] | delta | Temperature difference to apply to analog day data. |
[in] | delta_dayschoice | Temperature difference to apply to analog day data, for all ndayschoice analogs. |
[in] | dist | Distance to cluster associated with each downscaled/analog day. |
[in] | cluster | Cluster number associated with each downscaled/analog day. |
[in] | time_ls | Time values in udunit |
[in] | filename | Analog days output filename. |
[in] | data | MASTER data structure. |
Definition at line 58 of file save_analog_data.c.
References alloc_error(), analog_day_struct::analog_dayschoice, data_struct::conf, info_struct::contact_email, info_struct::contact_name, info_struct::creator_email, info_struct::creator_name, info_struct::creator_url, tstruct::day, analog_day_struct::day, analog_day_struct::day_s, handle_netcdf_error(), data_struct::info, info_struct::institution, analog_day_struct::metric_norm, tstruct::month, analog_day_struct::month, analog_day_struct::month_s, analog_day_struct::ndayschoice, analog_day_struct::ntime, info_struct::other_contact_email, info_struct::other_contact_name, info_struct::processor, info_struct::software, analog_day_struct::time, conf_struct::time_units, tstruct::year, analog_day_struct::year, and analog_day_struct::year_s.
Referenced by wt_downscaling().
00059 { 00071 int istat; /* Diagnostic status */ 00072 00073 int ncoutid; /* NetCDF output file handle ID */ 00074 int timedimoutid; /* NetCDF time dimension output ID */ 00075 int timeoutid; /* NetCDF time variable ID */ 00076 int ndayschoicedimoutid; /* NetCDF ndayschoice dimension output ID */ 00077 int ndayschoiceoutid; /* NetCDF ndayschoice variable ID */ 00078 int analogoutid; /* NetCDF analog dates variable ID */ 00079 int analogyearoutid; /* NetCDF analog dates variable ID */ 00080 int analogmonthoutid; /* NetCDF analog dates variable ID */ 00081 int analogdayoutid; /* NetCDF analog dates variable ID */ 00082 int analogyearndaysoutid; /* NetCDF analog ndayschoice dates variable ID */ 00083 int analogmonthndaysoutid; /* NetCDF analog ndayschoice dates variable ID */ 00084 int analogdayndaysoutid; /* NetCDF analog ndayschoice dates variable ID */ 00085 int metricoutid; /* NetCDF analog normalized metric variable ID */ 00086 int downscaledyearoutid; /* NetCDF downscaled dates variable ID */ 00087 int downscaledmonthoutid; /* NetCDF downscaled dates variable ID */ 00088 int downscaleddayoutid; /* NetCDF downscaled dates variable ID */ 00089 int distoutid; /* NetCDF cluster distance variable ID */ 00090 int clusteroutid; /* NetCDF cluster number variable ID */ 00091 int deltatoutid; /* NetCDF delta T variable ID */ 00092 int deltatndaysoutid; /* NetCDF delta T ndayschoice variable ID */ 00093 int vardimids[NC_MAX_VAR_DIMS]; /* NetCDF dimension IDs */ 00094 00095 int *buftmp = NULL; /* Temporary int buffer for writing data */ 00096 float *buftmpf = NULL; /* Temporary float buffer for writing data */ 00097 // double *buftmpd = NULL; /* Temporary double buffer for writing data */ 00098 int maxndays; /* Maximum number of days selected for any particular date */ 00099 00100 size_t start[2]; /* Start element when writing */ 00101 size_t count[2]; /* Count of elements to write */ 00102 00103 int fillvaluei; /* Missing value */ 00104 float fillvaluef; /* Missing value */ 00105 00106 char *tmpstr = NULL; /* Temporary string */ 00107 00108 int t; /* Time loop counter */ 00109 int i; /* Loop counter */ 00110 00111 tmpstr = (char *) malloc(200 * sizeof(char)); 00112 if (tmpstr == NULL) alloc_error(__FILE__, __LINE__); 00113 00114 /* Open NetCDF file for writing, overwrite and truncate existing file if any */ 00115 istat = nc_create(filename, NC_CLOBBER, &ncoutid); 00116 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00117 00118 /* Set global attributes */ 00119 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "processor", strlen(data->info->processor), data->info->processor); 00120 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "software", strlen(data->info->software), data->info->software); 00121 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "institution", strlen(data->info->institution), data->info->institution); 00122 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "creator_email", strlen(data->info->creator_email), data->info->creator_email); 00123 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "creator_url", strlen(data->info->creator_url), data->info->creator_url); 00124 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "creator_name", strlen(data->info->creator_name), data->info->creator_name); 00125 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "contact_email", strlen(data->info->contact_email), data->info->contact_email); 00126 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "contact_name", strlen(data->info->contact_name), data->info->contact_name); 00127 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "other_contact_email", strlen(data->info->other_contact_email), 00128 data->info->other_contact_email); 00129 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "other_contact_name", strlen(data->info->other_contact_name), 00130 data->info->other_contact_name); 00131 00132 /* Set dimensions */ 00133 istat = nc_def_dim(ncoutid, "time", NC_UNLIMITED, &timedimoutid); 00134 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00135 00136 vardimids[0] = timedimoutid; 00137 istat = nc_def_var(ncoutid, "time", NC_INT, 1, vardimids, &timeoutid); 00138 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00139 00140 istat = sprintf(tmpstr, "gregorian"); 00141 istat = nc_put_att_text(ncoutid, timeoutid, "calendar", strlen(tmpstr), tmpstr); 00142 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00143 istat = sprintf(tmpstr, "%s", data->conf->time_units); 00144 istat = nc_put_att_text(ncoutid, timeoutid, "units", strlen(tmpstr), tmpstr); 00145 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00146 istat = sprintf(tmpstr, "time in %s", data->conf->time_units); 00147 istat = nc_put_att_text(ncoutid, timeoutid, "long_name", strlen(tmpstr), tmpstr); 00148 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00149 00150 /* Find maximum number of days in the first selection of analog days to have constant dimension size */ 00151 maxndays = analog_days.ndayschoice[0]; 00152 for (t=0; t<analog_days.ntime; t++) 00153 if (maxndays < analog_days.ndayschoice[t]) 00154 maxndays = analog_days.ndayschoice[t]; 00155 istat = nc_def_dim(ncoutid, "ndayschoice", maxndays, &ndayschoicedimoutid); 00156 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00157 00158 vardimids[0] = timedimoutid; 00159 istat = nc_def_var(ncoutid, "ndayschoice", NC_INT, 1, vardimids, &ndayschoiceoutid); 00160 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00161 00162 istat = sprintf(tmpstr, "Number of analog days selected"); 00163 istat = nc_put_att_text(ncoutid, ndayschoiceoutid, "long_name", strlen(tmpstr), tmpstr); 00164 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00165 00166 /* Set variables */ 00167 00168 /* Define downscaled day variable: year */ 00169 vardimids[0] = timedimoutid; 00170 istat = nc_def_var(ncoutid, "downscaled_date_year", NC_INT, 1, vardimids, &downscaledyearoutid); 00171 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00172 00173 fillvaluei = -1; 00174 istat = nc_put_att_int(ncoutid, downscaledyearoutid, "missing_value", NC_INT, 1, &fillvaluei); 00175 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00176 (void) sprintf(tmpstr, "time"); 00177 istat = nc_put_att_text(ncoutid, downscaledyearoutid, "coordinates", strlen(tmpstr), tmpstr); 00178 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00179 (void) sprintf(tmpstr, "%s", "year"); 00180 istat = nc_put_att_text(ncoutid, downscaledyearoutid, "units", strlen(tmpstr), tmpstr); 00181 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00182 (void) strcpy(tmpstr, "Downscaled date: year"); 00183 istat = nc_put_att_text(ncoutid, downscaledyearoutid, "long_name", strlen(tmpstr), tmpstr); 00184 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00185 00186 /* Define downscaled day variable: month */ 00187 vardimids[0] = timedimoutid; 00188 istat = nc_def_var(ncoutid, "downscaled_date_month", NC_INT, 1, vardimids, &downscaledmonthoutid); 00189 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00190 00191 fillvaluei = -1; 00192 istat = nc_put_att_int(ncoutid, downscaledmonthoutid, "missing_value", NC_INT, 1, &fillvaluei); 00193 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00194 (void) sprintf(tmpstr, "time"); 00195 istat = nc_put_att_text(ncoutid, downscaledmonthoutid, "coordinates", strlen(tmpstr), tmpstr); 00196 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00197 (void) sprintf(tmpstr, "%s", "month"); 00198 istat = nc_put_att_text(ncoutid, downscaledmonthoutid, "units", strlen(tmpstr), tmpstr); 00199 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00200 (void) strcpy(tmpstr, "Downscaled date: month"); 00201 istat = nc_put_att_text(ncoutid, downscaledmonthoutid, "long_name", strlen(tmpstr), tmpstr); 00202 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00203 00204 /* Define downscaled day variable: day */ 00205 vardimids[0] = timedimoutid; 00206 istat = nc_def_var(ncoutid, "downscaled_date_day", NC_INT, 1, vardimids, &downscaleddayoutid); 00207 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00208 00209 fillvaluei = -1; 00210 istat = nc_put_att_int(ncoutid, downscaleddayoutid, "missing_value", NC_INT, 1, &fillvaluei); 00211 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00212 (void) sprintf(tmpstr, "time"); 00213 istat = nc_put_att_text(ncoutid, downscaleddayoutid, "coordinates", strlen(tmpstr), tmpstr); 00214 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00215 (void) sprintf(tmpstr, "%s", "day"); 00216 istat = nc_put_att_text(ncoutid, downscaleddayoutid, "units", strlen(tmpstr), tmpstr); 00217 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00218 (void) strcpy(tmpstr, "Downscaled date: day"); 00219 istat = nc_put_att_text(ncoutid, downscaleddayoutid, "long_name", strlen(tmpstr), tmpstr); 00220 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00221 00222 /* Define analog day time variable */ 00223 vardimids[0] = timedimoutid; 00224 istat = nc_def_var(ncoutid, "analog_date", NC_INT, 1, vardimids, &analogoutid); 00225 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00226 00227 fillvaluei = -1; 00228 istat = nc_put_att_int(ncoutid, analogoutid, "missing_value", NC_INT, 1, &fillvaluei); 00229 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00230 (void) sprintf(tmpstr, "time"); 00231 istat = nc_put_att_text(ncoutid, analogoutid, "coordinates", strlen(tmpstr), tmpstr); 00232 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00233 (void) sprintf(tmpstr, "%s", data->conf->time_units); 00234 istat = nc_put_att_text(ncoutid, analogoutid, "units", strlen(tmpstr), tmpstr); 00235 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00236 (void) strcpy(tmpstr, "Analog date"); 00237 istat = nc_put_att_text(ncoutid, analogoutid, "long_name", strlen(tmpstr), tmpstr); 00238 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00239 00240 /* Define analog day variable: year */ 00241 vardimids[0] = timedimoutid; 00242 istat = nc_def_var(ncoutid, "analog_date_year", NC_INT, 1, vardimids, &analogyearoutid); 00243 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00244 00245 fillvaluei = -1; 00246 istat = nc_put_att_int(ncoutid, analogyearoutid, "missing_value", NC_INT, 1, &fillvaluei); 00247 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00248 (void) sprintf(tmpstr, "time"); 00249 istat = nc_put_att_text(ncoutid, analogyearoutid, "coordinates", strlen(tmpstr), tmpstr); 00250 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00251 (void) sprintf(tmpstr, "%s", "year"); 00252 istat = nc_put_att_text(ncoutid, analogyearoutid, "units", strlen(tmpstr), tmpstr); 00253 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00254 (void) strcpy(tmpstr, "Analog date: year"); 00255 istat = nc_put_att_text(ncoutid, analogyearoutid, "long_name", strlen(tmpstr), tmpstr); 00256 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00257 00258 /* Define analog day variable: month */ 00259 vardimids[0] = timedimoutid; 00260 istat = nc_def_var(ncoutid, "analog_date_month", NC_INT, 1, vardimids, &analogmonthoutid); 00261 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00262 00263 fillvaluei = -1; 00264 istat = nc_put_att_int(ncoutid, analogmonthoutid, "missing_value", NC_INT, 1, &fillvaluei); 00265 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00266 (void) sprintf(tmpstr, "time"); 00267 istat = nc_put_att_text(ncoutid, analogmonthoutid, "coordinates", strlen(tmpstr), tmpstr); 00268 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00269 (void) sprintf(tmpstr, "%s", "month"); 00270 istat = nc_put_att_text(ncoutid, analogmonthoutid, "units", strlen(tmpstr), tmpstr); 00271 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00272 (void) strcpy(tmpstr, "Analog date: month"); 00273 istat = nc_put_att_text(ncoutid, analogmonthoutid, "long_name", strlen(tmpstr), tmpstr); 00274 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00275 00276 /* Define analog day variable: day */ 00277 vardimids[0] = timedimoutid; 00278 istat = nc_def_var(ncoutid, "analog_date_day", NC_INT, 1, vardimids, &analogdayoutid); 00279 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00280 00281 fillvaluei = -1; 00282 istat = nc_put_att_int(ncoutid, analogdayoutid, "missing_value", NC_INT, 1, &fillvaluei); 00283 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00284 (void) sprintf(tmpstr, "time"); 00285 istat = nc_put_att_text(ncoutid, analogdayoutid, "coordinates", strlen(tmpstr), tmpstr); 00286 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00287 (void) sprintf(tmpstr, "%s", "day"); 00288 istat = nc_put_att_text(ncoutid, analogdayoutid, "units", strlen(tmpstr), tmpstr); 00289 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00290 (void) strcpy(tmpstr, "Analog date: day"); 00291 istat = nc_put_att_text(ncoutid, analogdayoutid, "long_name", strlen(tmpstr), tmpstr); 00292 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00293 00294 /* Define analog delta Temperature variable */ 00295 vardimids[0] = timedimoutid; 00296 istat = nc_def_var(ncoutid, "analog_delta_t", NC_FLOAT, 1, vardimids, &deltatoutid); 00297 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00298 00299 fillvaluef = -9999.0; 00300 istat = nc_put_att_float(ncoutid, deltatoutid, "missing_value", NC_FLOAT, 1, &fillvaluef); 00301 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00302 (void) sprintf(tmpstr, "time"); 00303 istat = nc_put_att_text(ncoutid, deltatoutid, "coordinates", strlen(tmpstr), tmpstr); 00304 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00305 (void) strcpy(tmpstr, "K"); 00306 istat = nc_put_att_text(ncoutid, deltatoutid, "units", strlen(tmpstr), tmpstr); 00307 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00308 (void) strcpy(tmpstr, "Delta of Temperature"); 00309 istat = nc_put_att_text(ncoutid, deltatoutid, "long_name", strlen(tmpstr), tmpstr); 00310 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00311 00312 /* Define analog delta Temperature ndayschoice variable */ 00313 vardimids[0] = timedimoutid; 00314 vardimids[1] = ndayschoicedimoutid; 00315 istat = nc_def_var(ncoutid, "analog_ndays_delta_t", NC_FLOAT, 2, vardimids, &deltatndaysoutid); 00316 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00317 00318 fillvaluef = -9999.0; 00319 istat = nc_put_att_float(ncoutid, deltatndaysoutid, "missing_value", NC_FLOAT, 1, &fillvaluef); 00320 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00321 (void) sprintf(tmpstr, "time ndayschoice"); 00322 istat = nc_put_att_text(ncoutid, deltatndaysoutid, "coordinates", strlen(tmpstr), tmpstr); 00323 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00324 (void) strcpy(tmpstr, "K"); 00325 istat = nc_put_att_text(ncoutid, deltatndaysoutid, "units", strlen(tmpstr), tmpstr); 00326 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00327 (void) strcpy(tmpstr, "Delta of Temperature ndays"); 00328 istat = nc_put_att_text(ncoutid, deltatndaysoutid, "long_name", strlen(tmpstr), tmpstr); 00329 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00330 00331 /* Define cluster distance variable */ 00332 vardimids[0] = timedimoutid; 00333 istat = nc_def_var(ncoutid, "cluster_distance", NC_FLOAT, 1, vardimids, &distoutid); 00334 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00335 00336 fillvaluef = -9999.0; 00337 istat = nc_put_att_float(ncoutid, distoutid, "missing_value", NC_FLOAT, 1, &fillvaluef); 00338 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00339 (void) sprintf(tmpstr, "time"); 00340 istat = nc_put_att_text(ncoutid, distoutid, "coordinates", strlen(tmpstr), tmpstr); 00341 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00342 (void) strcpy(tmpstr, "none"); 00343 istat = nc_put_att_text(ncoutid, distoutid, "units", strlen(tmpstr), tmpstr); 00344 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00345 (void) strcpy(tmpstr, "Normalized distance to cluster"); 00346 istat = nc_put_att_text(ncoutid, distoutid, "long_name", strlen(tmpstr), tmpstr); 00347 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00348 00349 /* Define cluster number variable */ 00350 vardimids[0] = timedimoutid; 00351 istat = nc_def_var(ncoutid, "cluster", NC_INT, 1, vardimids, &clusteroutid); 00352 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00353 00354 fillvaluei = -1; 00355 istat = nc_put_att_int(ncoutid, clusteroutid, "missing_value", NC_INT, 1, &fillvaluei); 00356 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00357 (void) sprintf(tmpstr, "time"); 00358 istat = nc_put_att_text(ncoutid, clusteroutid, "coordinates", strlen(tmpstr), tmpstr); 00359 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00360 (void) strcpy(tmpstr, "none"); 00361 istat = nc_put_att_text(ncoutid, clusteroutid, "units", strlen(tmpstr), tmpstr); 00362 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00363 (void) strcpy(tmpstr, "Cluster number"); 00364 istat = nc_put_att_text(ncoutid, clusteroutid, "long_name", strlen(tmpstr), tmpstr); 00365 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00366 00367 /* Define ndayschoice analog day variable: year */ 00368 vardimids[0] = timedimoutid; 00369 vardimids[1] = ndayschoicedimoutid; 00370 istat = nc_def_var(ncoutid, "analog_ndays_date_year", NC_INT, 2, vardimids, &analogyearndaysoutid); 00371 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00372 00373 fillvaluei = 0; 00374 istat = nc_put_att_int(ncoutid, analogyearndaysoutid, "missing_value", NC_INT, 1, &fillvaluei); 00375 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00376 (void) sprintf(tmpstr, "time ndayschoice"); 00377 istat = nc_put_att_text(ncoutid, analogyearndaysoutid, "coordinates", strlen(tmpstr), tmpstr); 00378 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00379 (void) sprintf(tmpstr, "%s", "year"); 00380 istat = nc_put_att_text(ncoutid, analogyearndaysoutid, "units", strlen(tmpstr), tmpstr); 00381 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00382 (void) strcpy(tmpstr, "Analog ndays date: year"); 00383 istat = nc_put_att_text(ncoutid, analogyearndaysoutid, "long_name", strlen(tmpstr), tmpstr); 00384 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00385 00386 /* Define ndayschoice analog day variable: month */ 00387 vardimids[0] = timedimoutid; 00388 vardimids[1] = ndayschoicedimoutid; 00389 istat = nc_def_var(ncoutid, "analog_ndays_date_month", NC_INT, 2, vardimids, &analogmonthndaysoutid); 00390 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00391 00392 fillvaluei = 0; 00393 istat = nc_put_att_int(ncoutid, analogmonthndaysoutid, "missing_value", NC_INT, 1, &fillvaluei); 00394 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00395 (void) sprintf(tmpstr, "time ndayschoice"); 00396 istat = nc_put_att_text(ncoutid, analogmonthndaysoutid, "coordinates", strlen(tmpstr), tmpstr); 00397 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00398 (void) sprintf(tmpstr, "%s", "month"); 00399 istat = nc_put_att_text(ncoutid, analogmonthndaysoutid, "units", strlen(tmpstr), tmpstr); 00400 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00401 (void) strcpy(tmpstr, "Analog ndays date: month"); 00402 istat = nc_put_att_text(ncoutid, analogmonthndaysoutid, "long_name", strlen(tmpstr), tmpstr); 00403 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00404 00405 /* Define ndayschoice analog day variable: day */ 00406 vardimids[0] = timedimoutid; 00407 vardimids[1] = ndayschoicedimoutid; 00408 istat = nc_def_var(ncoutid, "analog_ndays_date_day", NC_INT, 2, vardimids, &analogdayndaysoutid); 00409 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00410 00411 fillvaluei = 0; 00412 istat = nc_put_att_int(ncoutid, analogdayndaysoutid, "missing_value", NC_INT, 1, &fillvaluei); 00413 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00414 (void) sprintf(tmpstr, "time ndayschoice"); 00415 istat = nc_put_att_text(ncoutid, analogdayndaysoutid, "coordinates", strlen(tmpstr), tmpstr); 00416 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00417 (void) sprintf(tmpstr, "%s", "day"); 00418 istat = nc_put_att_text(ncoutid, analogdayndaysoutid, "units", strlen(tmpstr), tmpstr); 00419 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00420 (void) strcpy(tmpstr, "Analog ndays date: day"); 00421 istat = nc_put_att_text(ncoutid, analogdayndaysoutid, "long_name", strlen(tmpstr), tmpstr); 00422 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00423 00424 /* Define ndayschoice normalized metric */ 00425 vardimids[0] = timedimoutid; 00426 vardimids[1] = ndayschoicedimoutid; 00427 istat = nc_def_var(ncoutid, "analog_metric_norm", NC_FLOAT, 2, vardimids, &metricoutid); 00428 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00429 00430 fillvaluef = 0.0; 00431 istat = nc_put_att_float(ncoutid, metricoutid, "missing_value", NC_FLOAT, 1, &fillvaluef); 00432 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00433 (void) sprintf(tmpstr, "time ndayschoice"); 00434 istat = nc_put_att_text(ncoutid, metricoutid, "coordinates", strlen(tmpstr), tmpstr); 00435 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00436 (void) sprintf(tmpstr, "%s", "metric"); 00437 istat = nc_put_att_text(ncoutid, metricoutid, "units", strlen(tmpstr), tmpstr); 00438 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00439 (void) strcpy(tmpstr, "Analog normalized metric"); 00440 istat = nc_put_att_text(ncoutid, metricoutid, "long_name", strlen(tmpstr), tmpstr); 00441 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00442 00443 /* End definition mode */ 00444 istat = nc_enddef(ncoutid); 00445 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00446 00447 /* Write variables */ /* Write time */ 00448 start[0] = 0; 00449 start[1] = 0; 00450 count[0] = (size_t) analog_days.ntime; 00451 count[1] = 0; 00452 istat = nc_put_vara_double(ncoutid, timeoutid, start, count, time_ls); 00453 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00454 00455 /* Write ndayschoice */ 00456 start[0] = 0; 00457 start[1] = 0; 00458 count[0] = (size_t) analog_days.ntime; 00459 count[1] = 0; 00460 istat = nc_put_vara_int(ncoutid, ndayschoiceoutid, start, count, analog_days.ndayschoice); 00461 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00462 00463 /* Write downscaled dates */ 00464 start[0] = 0; 00465 start[1] = 0; 00466 count[0] = (size_t) analog_days.ntime; 00467 count[1] = 0; 00468 istat = nc_put_vara_int(ncoutid, downscaledyearoutid, start, count, analog_days.year_s); 00469 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00470 istat = nc_put_vara_int(ncoutid, downscaledmonthoutid, start, count, analog_days.month_s); 00471 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00472 istat = nc_put_vara_int(ncoutid, downscaleddayoutid, start, count, analog_days.day_s); 00473 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00474 00475 /* Write analog dates */ 00476 start[0] = 0; 00477 start[1] = 0; 00478 count[0] = (size_t) analog_days.ntime; 00479 count[1] = 0; 00480 istat = nc_put_vara_int(ncoutid, analogoutid, start, count, analog_days.time); 00481 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00482 istat = nc_put_vara_int(ncoutid, analogyearoutid, start, count, analog_days.year); 00483 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00484 istat = nc_put_vara_int(ncoutid, analogmonthoutid, start, count, analog_days.month); 00485 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00486 istat = nc_put_vara_int(ncoutid, analogdayoutid, start, count, analog_days.day); 00487 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00488 00489 /* Write ndayschoice analog dates */ 00490 start[0] = 0; 00491 start[1] = 0; 00492 count[0] = (size_t) analog_days.ntime; 00493 count[1] = (size_t) maxndays; 00494 /* Build 2D array */ 00495 buftmp = (int *) calloc(analog_days.ntime * maxndays, sizeof(int)); 00496 if (buftmp == NULL) alloc_error(__FILE__, __LINE__); 00497 for (t=0; t<analog_days.ntime; t++) 00498 for (i=0; i<analog_days.ndayschoice[t]; i++) 00499 buftmp[i+t*maxndays] = analog_days.analog_dayschoice[t][i].year; 00500 istat = nc_put_vara_int(ncoutid, analogyearndaysoutid, start, count, buftmp); 00501 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00502 for (t=0; t<analog_days.ntime; t++) 00503 for (i=0; i<analog_days.ndayschoice[t]; i++) 00504 buftmp[i+t*maxndays] = analog_days.analog_dayschoice[t][i].month; 00505 istat = nc_put_vara_int(ncoutid, analogmonthndaysoutid, start, count, buftmp); 00506 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00507 for (t=0; t<analog_days.ntime; t++) 00508 for (i=0; i<analog_days.ndayschoice[t]; i++) 00509 buftmp[i+t*maxndays] = analog_days.analog_dayschoice[t][i].day; 00510 istat = nc_put_vara_int(ncoutid, analogdayndaysoutid, start, count, buftmp); 00511 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00512 (void) free(buftmp); 00513 00514 /* Write analog normalized metric */ 00515 start[0] = 0; 00516 start[1] = 0; 00517 count[0] = (size_t) analog_days.ntime; 00518 count[1] = (size_t) maxndays; 00519 buftmpf = (float *) calloc(analog_days.ntime * maxndays, sizeof(float)); 00520 if (buftmpf == NULL) alloc_error(__FILE__, __LINE__); 00521 for (t=0; t<analog_days.ntime; t++) 00522 for (i=0; i<analog_days.ndayschoice[t]; i++) 00523 buftmpf[i+t*maxndays] = analog_days.metric_norm[t][i]; 00524 istat = nc_put_vara_float(ncoutid, metricoutid, start, count, buftmpf); 00525 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00526 (void) free(buftmpf); 00527 00528 /* Write delta of temperature */ 00529 start[0] = 0; 00530 start[1] = 0; 00531 count[0] = (size_t) analog_days.ntime; 00532 count[1] = 0; 00533 istat = nc_put_vara_double(ncoutid, deltatoutid, start, count, delta); 00534 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00535 00536 /* Write ndayschoice delta of temperature */ 00537 start[0] = 0; 00538 start[1] = 0; 00539 count[0] = (size_t) analog_days.ntime; 00540 count[1] = (size_t) maxndays; 00541 buftmpf = (float *) calloc(analog_days.ntime * maxndays, sizeof(float)); 00542 if (buftmpf == NULL) alloc_error(__FILE__, __LINE__); 00543 for (t=0; t<analog_days.ntime; t++) 00544 for (i=0; i<analog_days.ndayschoice[t]; i++) 00545 buftmpf[i+t*maxndays] = (float) delta_dayschoice[t][i]; 00546 istat = nc_put_vara_float(ncoutid, deltatndaysoutid, start, count, buftmpf); 00547 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00548 (void) free(buftmpf); 00549 00550 /* Write cluster distance */ 00551 start[0] = 0; 00552 start[1] = 0; 00553 count[0] = (size_t) analog_days.ntime; 00554 count[1] = 0; 00555 istat = nc_put_vara_double(ncoutid, distoutid, start, count, dist); 00556 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00557 00558 /* Write cluster number */ 00559 start[0] = 0; 00560 start[1] = 0; 00561 count[0] = (size_t) analog_days.ntime; 00562 count[1] = 0; 00563 istat = nc_put_vara_int(ncoutid, clusteroutid, start, count, cluster); 00564 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00565 00566 /* Close the output netCDF file */ 00567 istat = ncclose(ncoutid); 00568 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00569 00570 (void) free(tmpstr); 00571 }