Write learning fields for later use. More...
#include <dsclim.h>
Go to the source code of this file.
Functions | |
int | write_learning_fields (data_struct *data) |
Write learning fields for later use. |
Write learning fields for later use.
Definition in file write_learning_fields.c.
int write_learning_fields | ( | data_struct * | data | ) |
Write learning fields for later use.
[in] | data | MASTER data structure. |
Definition at line 58 of file write_learning_fields.c.
References alloc_error(), learning_data_struct::class_clusters, conf_struct::clustname, data_struct::conf, info_struct::contact_email, info_struct::contact_name, info_struct::creator_email, info_struct::creator_name, info_struct::creator_url, learning_struct::data, time_vect_struct::day, conf_struct::eofname, FALSE, learning_struct::filename_save_clust_learn, learning_struct::filename_save_learn, learning_struct::filename_save_weight, handle_netcdf_error(), time_vect_struct::hour, data_struct::info, info_struct::institution, data_struct::learning, time_vect_struct::minutes, time_vect_struct::month, season_struct::nclusters, learning_struct::nomvar_class_clusters, learning_struct::nomvar_pc_normalized_var, learning_struct::nomvar_precip_index, learning_struct::nomvar_precip_index_obs, learning_struct::nomvar_precip_reg, learning_struct::nomvar_precip_reg_acor, learning_struct::nomvar_precip_reg_cst, learning_struct::nomvar_precip_reg_dist, learning_struct::nomvar_precip_reg_err, learning_struct::nomvar_precip_reg_rsq, learning_struct::nomvar_precip_reg_vif, learning_struct::nomvar_sup_index, learning_struct::nomvar_sup_index_mean, learning_struct::nomvar_sup_index_var, learning_struct::nomvar_sup_val, learning_struct::nomvar_time, learning_struct::nomvar_weight, reg_struct::npts, conf_struct::nseasons, learning_data_struct::ntime, info_struct::other_contact_email, info_struct::other_contact_name, learning_struct::pc_normalized_var, learning_data_struct::precip_index, learning_data_struct::precip_index_obs, learning_data_struct::precip_reg, learning_data_struct::precip_reg_autocor, learning_data_struct::precip_reg_cst, learning_data_struct::precip_reg_dist, learning_data_struct::precip_reg_err, learning_data_struct::precip_reg_rsq, learning_data_struct::precip_reg_vif, info_struct::processor, conf_struct::ptsname, learning_struct::rea_neof, data_struct::reg, conf_struct::season, season_struct::secondary_cov, time_vect_struct::seconds, info_struct::software, learning_data_struct::sup_index, learning_data_struct::sup_index_mean, learning_data_struct::sup_index_var, learning_struct::sup_lat, learning_struct::sup_latname, learning_struct::sup_lon, learning_struct::sup_lonname, learning_struct::sup_nlat, learning_struct::sup_nlon, learning_data_struct::sup_val, learning_data_struct::time, learning_data_struct::time_s, conf_struct::time_units, TRUE, learning_data_struct::weight, and time_vect_struct::year.
Referenced by wt_learning().
00058 { 00063 int istat; /* Diagnostic status */ 00064 00065 int ncoutid; /* NetCDF output file handle ID */ 00066 int *timedimoutid; /* NetCDF time dimension output ID */ 00067 int latdimoutid; /* NetCDF latitude dimension output ID */ 00068 int londimoutid; /* NetCDF longitude dimension output ID */ 00069 int sdimoutid; /* NetCDF season dimension output ID */ 00070 int eofdimoutid; /* NetCDF EOF dimension output ID */ 00071 int ptsdimoutid; /* NetCDF points dimension output ID */ 00072 int *clustdimoutid; /* NetCDF clusters dimension output ID */ 00073 int *weightdimoutid; /* NetCDF weight dimension output ID */ 00074 int *timeoutid; /* NetCDF time variable ID */ 00075 int latoutid; /* NetCDF latitude variable ID */ 00076 int lonoutid; /* NetCDF longitude variable ID */ 00077 int *cstoutid; /* NetCDF regression constant variable ID */ 00078 int *regoutid; /* NetCDF regression coefficients variable ID */ 00079 int *distoutid; /* NetCDF regression distances variable ID */ 00080 int *rrdoutid; /* NetCDF precipitation index variable ID */ 00081 int *rrooutid; /* NetCDF observed precipitation index variable ID */ 00082 int *taoutid; /* NetCDF secondary large-scale field index variable ID */ 00083 int *tadoutid; /* NetCDF secondary large-scale 2D field variable ID */ 00084 int *rsqoutid; /* NetCDF regression R^2 variable ID */ 00085 int *erroutid; /* NetCDF regression residuals variable ID */ 00086 int *acoroutid; /* NetCDF regression autocorrelation variable ID */ 00087 int *vifoutid; /* NetCDF regression VIF variable ID */ 00088 int pcoutid; /* NetCDF pc_normalized_var variable ID */ 00089 int tamoutid; /* NetCDF secondary large-scale field index mean variable ID */ 00090 int tavoutid; /* NetCDF secondary large-scale field index variance variable ID */ 00091 int *clustoutid; /* NetCDF clusters variable output ID */ 00092 int *weightoutid; /* NetCDF weight variable ID */ 00093 int vardimids[NC_MAX_VAR_DIMS]; /* NetCDF dimension IDs */ 00094 00095 size_t start[3]; /* Start element when writing */ 00096 size_t count[3]; /* Count of elements to write */ 00097 00098 char *tmpstr = NULL; /* Temporary string */ 00099 00100 ut_system *unitSystem = NULL; /* Unit System (udunits) */ 00101 ut_unit *dataunits = NULL; /* udunits variable */ 00102 00103 double fillvalue; 00104 float fillvaluef; 00105 char *nomvar = NULL; 00106 double *timeval = NULL; 00107 double *tancp_mean = NULL; 00108 double *tancp_var = NULL; 00109 double *bufd = NULL; 00110 00111 int s; 00112 int t; 00113 int ii; 00114 int cov_true = FALSE; /* Check if cov is TRUE in at least one season */ 00115 00116 tancp_mean = (double *) malloc(data->conf->nseasons * sizeof(double)); 00117 if (tancp_mean == NULL) alloc_error(__FILE__, __LINE__); 00118 tancp_var = (double *) malloc(data->conf->nseasons * sizeof(double)); 00119 if (tancp_var == NULL) alloc_error(__FILE__, __LINE__); 00120 00121 timedimoutid = (int *) malloc(data->conf->nseasons * sizeof(int)); 00122 if (timedimoutid == NULL) alloc_error(__FILE__, __LINE__); 00123 clustdimoutid = (int *) malloc(data->conf->nseasons * sizeof(int)); 00124 if (clustdimoutid == NULL) alloc_error(__FILE__, __LINE__); 00125 weightdimoutid = (int *) malloc(data->conf->nseasons * sizeof(int)); 00126 if (weightdimoutid == NULL) alloc_error(__FILE__, __LINE__); 00127 00128 timeoutid = (int *) malloc(data->conf->nseasons * sizeof(int)); 00129 if (timeoutid == NULL) alloc_error(__FILE__, __LINE__); 00130 cstoutid = (int *) malloc(data->conf->nseasons * sizeof(int)); 00131 if (cstoutid == NULL) alloc_error(__FILE__, __LINE__); 00132 regoutid = (int *) malloc(data->conf->nseasons * sizeof(int)); 00133 if (regoutid == NULL) alloc_error(__FILE__, __LINE__); 00134 distoutid = (int *) malloc(data->conf->nseasons * sizeof(int)); 00135 if (distoutid == NULL) alloc_error(__FILE__, __LINE__); 00136 rrdoutid = (int *) malloc(data->conf->nseasons * sizeof(int)); 00137 if (rrdoutid == NULL) alloc_error(__FILE__, __LINE__); 00138 rrooutid = (int *) malloc(data->conf->nseasons * sizeof(int)); 00139 if (rrooutid == NULL) alloc_error(__FILE__, __LINE__); 00140 taoutid = (int *) malloc(data->conf->nseasons * sizeof(int)); 00141 if (taoutid == NULL) alloc_error(__FILE__, __LINE__); 00142 tadoutid = (int *) malloc(data->conf->nseasons * sizeof(int)); 00143 if (tadoutid == NULL) alloc_error(__FILE__, __LINE__); 00144 clustoutid = (int *) malloc(data->conf->nseasons * sizeof(int)); 00145 if (clustoutid == NULL) alloc_error(__FILE__, __LINE__); 00146 weightoutid = (int *) malloc(data->conf->nseasons * sizeof(int)); 00147 if (weightoutid == NULL) alloc_error(__FILE__, __LINE__); 00148 rsqoutid = (int *) malloc(data->conf->nseasons * sizeof(int)); 00149 if (rsqoutid == NULL) alloc_error(__FILE__, __LINE__); 00150 erroutid = (int *) malloc(data->conf->nseasons * sizeof(int)); 00151 if (erroutid == NULL) alloc_error(__FILE__, __LINE__); 00152 acoroutid = (int *) malloc(data->conf->nseasons * sizeof(int)); 00153 if (acoroutid == NULL) alloc_error(__FILE__, __LINE__); 00154 vifoutid = (int *) malloc(data->conf->nseasons * sizeof(int)); 00155 if (vifoutid == NULL) alloc_error(__FILE__, __LINE__); 00156 00157 nomvar = (char *) malloc(200 * sizeof(char)); 00158 if (nomvar == NULL) alloc_error(__FILE__, __LINE__); 00159 tmpstr = (char *) malloc(200 * sizeof(char)); 00160 if (tmpstr == NULL) alloc_error(__FILE__, __LINE__); 00161 00162 istat = utInit(""); 00163 00164 /* Open NetCDF file for writing, overwrite and truncate existing file if any */ 00165 istat = nc_create(data->learning->filename_save_learn, NC_CLOBBER, &ncoutid); 00166 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00167 00168 /* Set global attributes */ 00169 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "processor", strlen(data->info->processor), data->info->processor); 00170 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "software", strlen(data->info->software), data->info->software); 00171 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "institution", strlen(data->info->institution), data->info->institution); 00172 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "creator_email", strlen(data->info->creator_email), data->info->creator_email); 00173 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "creator_url", strlen(data->info->creator_url), data->info->creator_url); 00174 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "creator_name", strlen(data->info->creator_name), data->info->creator_name); 00175 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "contact_email", strlen(data->info->contact_email), data->info->contact_email); 00176 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "contact_name", strlen(data->info->contact_name), data->info->contact_name); 00177 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "other_contact_email", strlen(data->info->other_contact_email), 00178 data->info->other_contact_email); 00179 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "other_contact_name", strlen(data->info->other_contact_name), 00180 data->info->other_contact_name); 00181 00182 fillvalue = -9999.9; 00183 fillvaluef = -9999.9; 00184 00185 for (s=0; s<data->conf->nseasons; s++) 00186 if (data->conf->season[s].secondary_cov == TRUE) cov_true = TRUE; 00187 00188 /* Set dimensions */ 00189 istat = nc_def_dim(ncoutid, "season", data->conf->nseasons, &sdimoutid); 00190 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00191 istat = nc_def_dim(ncoutid, data->conf->eofname, data->learning->rea_neof, &eofdimoutid); 00192 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00193 istat = nc_def_dim(ncoutid, data->conf->ptsname, data->reg->npts, &ptsdimoutid); 00194 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00195 if (cov_true == TRUE) { 00196 istat = nc_def_dim(ncoutid, data->learning->sup_latname, data->learning->sup_nlat, &latdimoutid); 00197 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00198 istat = nc_def_dim(ncoutid, data->learning->sup_lonname, data->learning->sup_nlon, &londimoutid); 00199 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00200 } 00201 00202 if (cov_true == TRUE) { 00203 /* Define lat and lon variables */ 00204 vardimids[0] = latdimoutid; 00205 istat = nc_def_var(ncoutid, data->learning->sup_latname, NC_DOUBLE, 1, vardimids, &latoutid); 00206 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00207 istat = sprintf(tmpstr, "degrees_north"); 00208 istat = nc_put_att_text(ncoutid, latoutid, "units", strlen(tmpstr), tmpstr); 00209 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00210 istat = sprintf(tmpstr, "latitude coordinate"); 00211 istat = nc_put_att_text(ncoutid, latoutid, "long_name", strlen(tmpstr), tmpstr); 00212 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00213 istat = sprintf(tmpstr, "latitude"); 00214 istat = nc_put_att_text(ncoutid, latoutid, "standard_name", strlen(tmpstr), tmpstr); 00215 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00216 00217 vardimids[0] = londimoutid; 00218 istat = nc_def_var(ncoutid, data->learning->sup_lonname, NC_DOUBLE, 1, vardimids, &lonoutid); 00219 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00220 istat = sprintf(tmpstr, "degrees_east"); 00221 istat = nc_put_att_text(ncoutid, lonoutid, "units", strlen(tmpstr), tmpstr); 00222 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00223 istat = sprintf(tmpstr, "longitude coordinate"); 00224 istat = nc_put_att_text(ncoutid, lonoutid, "long_name", strlen(tmpstr), tmpstr); 00225 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00226 istat = sprintf(tmpstr, "longitude"); 00227 istat = nc_put_att_text(ncoutid, lonoutid, "standard_name", strlen(tmpstr), tmpstr); 00228 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00229 } 00230 00231 for (s=0; s<data->conf->nseasons; s++) { 00232 00233 /* Define time dimensions and variables */ 00234 (void) sprintf(nomvar, "%s_%d", data->learning->nomvar_time, s+1); 00235 istat = nc_def_dim(ncoutid, nomvar, data->learning->data[s].ntime, &(timedimoutid[s])); 00236 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00237 00238 vardimids[0] = timedimoutid[s]; 00239 istat = nc_def_var(ncoutid, nomvar, NC_INT, 1, vardimids, &(timeoutid[s])); 00240 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00241 00242 istat = sprintf(tmpstr, "gregorian"); 00243 istat = nc_put_att_text(ncoutid, timeoutid[s], "calendar", strlen(tmpstr), tmpstr); 00244 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00245 istat = sprintf(tmpstr, "%s", data->conf->time_units); 00246 istat = nc_put_att_text(ncoutid, timeoutid[s], "units", strlen(tmpstr), tmpstr); 00247 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00248 istat = sprintf(tmpstr, "time in %s", data->conf->time_units); 00249 istat = nc_put_att_text(ncoutid, timeoutid[s], "long_name", strlen(tmpstr), tmpstr); 00250 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00251 00252 /* Define cluster dimensions */ 00253 (void) sprintf(nomvar, "%s_%d", data->conf->clustname, s+1); 00254 istat = nc_def_dim(ncoutid, nomvar, data->conf->season[s].nclusters, &(clustdimoutid[s])); 00255 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00256 00257 /* Define regression constant variables */ 00258 (void) sprintf(nomvar, "%s_%d", data->learning->nomvar_precip_reg_cst, s+1); 00259 vardimids[0] = ptsdimoutid; 00260 istat = nc_def_var(ncoutid, nomvar, NC_DOUBLE, 1, vardimids, &(cstoutid[s])); 00261 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00262 00263 istat = nc_put_att_double(ncoutid, cstoutid[s], "missing_value", NC_DOUBLE, 1, &fillvalue); 00264 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00265 istat = nc_put_att_text(ncoutid, cstoutid[s], "coordinates", strlen(data->conf->ptsname), data->conf->ptsname); 00266 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00267 istat = sprintf(tmpstr, "none"); 00268 istat = nc_put_att_text(ncoutid, cstoutid[s], "units", strlen(tmpstr), tmpstr); 00269 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00270 00271 /* Define regression coefficients variables */ 00272 (void) sprintf(nomvar, "%s_%d", data->learning->nomvar_precip_reg, s+1); 00273 vardimids[0] = clustdimoutid[s]; 00274 vardimids[1] = ptsdimoutid; 00275 istat = nc_def_var(ncoutid, nomvar, NC_DOUBLE, 2, vardimids, &(regoutid[s])); 00276 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00277 00278 istat = nc_put_att_double(ncoutid, regoutid[s], "missing_value", NC_DOUBLE, 1, &fillvalue); 00279 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00280 istat = sprintf(tmpstr, "%s %s_%d", data->conf->ptsname, data->learning->nomvar_class_clusters, s+1); 00281 istat = nc_put_att_text(ncoutid, regoutid[s], "coordinates", strlen(tmpstr), tmpstr); 00282 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00283 istat = sprintf(tmpstr, "none"); 00284 istat = nc_put_att_text(ncoutid, regoutid[s], "units", strlen(tmpstr), tmpstr); 00285 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00286 00287 /* Define regression distances variables */ 00288 if (data->learning->data[s].precip_reg_dist != NULL) { 00289 (void) sprintf(nomvar, "%s_%d", data->learning->nomvar_precip_reg_dist, s+1); 00290 vardimids[0] = timedimoutid[s]; 00291 vardimids[1] = clustdimoutid[s]; 00292 istat = nc_def_var(ncoutid, nomvar, NC_DOUBLE, 2, vardimids, &(distoutid[s])); 00293 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00294 00295 istat = nc_put_att_double(ncoutid, distoutid[s], "missing_value", NC_DOUBLE, 1, &fillvalue); 00296 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00297 istat = sprintf(tmpstr, "%s_%d %s_%d", data->learning->nomvar_time, s+1, data->learning->nomvar_class_clusters, s+1); 00298 istat = nc_put_att_text(ncoutid, distoutid[s], "coordinates", strlen(tmpstr), tmpstr); 00299 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00300 istat = sprintf(tmpstr, "none"); 00301 istat = nc_put_att_text(ncoutid, distoutid[s], "units", strlen(tmpstr), tmpstr); 00302 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00303 } 00304 00305 /* Define regression R^2 diagnostic */ 00306 (void) sprintf(nomvar, "%s_%d", data->learning->nomvar_precip_reg_rsq, s+1); 00307 vardimids[0] = ptsdimoutid; 00308 istat = nc_def_var(ncoutid, nomvar, NC_DOUBLE, 1, vardimids, &(rsqoutid[s])); 00309 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00310 00311 istat = nc_put_att_double(ncoutid, rsqoutid[s], "missing_value", NC_DOUBLE, 1, &fillvalue); 00312 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00313 istat = nc_put_att_text(ncoutid, rsqoutid[s], "coordinates", strlen(data->conf->ptsname), data->conf->ptsname); 00314 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00315 istat = sprintf(tmpstr, "none"); 00316 istat = nc_put_att_text(ncoutid, rsqoutid[s], "units", strlen(tmpstr), tmpstr); 00317 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00318 00319 /* Define regression residuals diagnostic */ 00320 if (data->learning->data[s].precip_reg_err != NULL) { 00321 (void) sprintf(nomvar, "%s_%d", data->learning->nomvar_precip_reg_err, s+1); 00322 vardimids[0] = timedimoutid[s]; 00323 vardimids[1] = ptsdimoutid; 00324 istat = nc_def_var(ncoutid, nomvar, NC_DOUBLE, 2, vardimids, &(erroutid[s])); 00325 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00326 00327 istat = nc_put_att_double(ncoutid, erroutid[s], "missing_value", NC_DOUBLE, 1, &fillvalue); 00328 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00329 istat = sprintf(tmpstr, "%s %s_%d", data->conf->ptsname, data->learning->nomvar_time, s+1); 00330 istat = nc_put_att_text(ncoutid, erroutid[s], "coordinates", strlen(tmpstr), tmpstr); 00331 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00332 istat = sprintf(tmpstr, "none"); 00333 istat = nc_put_att_text(ncoutid, erroutid[s], "units", strlen(tmpstr), tmpstr); 00334 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00335 } 00336 00337 /* Define regression autocorrelation diagnostic */ 00338 (void) sprintf(nomvar, "%s_%d", data->learning->nomvar_precip_reg_acor, s+1); 00339 vardimids[0] = ptsdimoutid; 00340 istat = nc_def_var(ncoutid, nomvar, NC_DOUBLE, 1, vardimids, &(acoroutid[s])); 00341 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00342 00343 istat = nc_put_att_double(ncoutid, acoroutid[s], "missing_value", NC_DOUBLE, 1, &fillvalue); 00344 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00345 istat = nc_put_att_text(ncoutid, acoroutid[s], "coordinates", strlen(data->conf->ptsname), data->conf->ptsname); 00346 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00347 istat = sprintf(tmpstr, "none"); 00348 istat = nc_put_att_text(ncoutid, acoroutid[s], "units", strlen(tmpstr), tmpstr); 00349 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00350 00351 /* Define regression VIF diagnostic */ 00352 (void) sprintf(nomvar, "%s_%d", data->learning->nomvar_precip_reg_vif, s+1); 00353 vardimids[0] = clustdimoutid[s]; 00354 istat = nc_def_var(ncoutid, nomvar, NC_DOUBLE, 1, vardimids, &(vifoutid[s])); 00355 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00356 00357 istat = nc_put_att_double(ncoutid, vifoutid[s], "missing_value", NC_DOUBLE, 1, &fillvalue); 00358 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00359 istat = nc_put_att_text(ncoutid, vifoutid[s], "coordinates", strlen(data->learning->nomvar_class_clusters), 00360 data->learning->nomvar_class_clusters); 00361 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00362 istat = sprintf(tmpstr, "none"); 00363 istat = nc_put_att_text(ncoutid, vifoutid[s], "units", strlen(tmpstr), tmpstr); 00364 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00365 00366 /* Define precipitation index variables */ 00367 (void) sprintf(nomvar, "%s_%d", data->learning->nomvar_precip_index, s+1); 00368 vardimids[0] = timedimoutid[s]; 00369 vardimids[1] = ptsdimoutid; 00370 istat = nc_def_var(ncoutid, nomvar, NC_DOUBLE, 2, vardimids, &(rrdoutid[s])); 00371 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00372 00373 istat = nc_put_att_double(ncoutid, rrdoutid[s], "missing_value", NC_DOUBLE, 1, &fillvalue); 00374 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00375 istat = sprintf(tmpstr, "%s %s_%d", data->conf->ptsname, data->learning->nomvar_time, s+1); 00376 istat = nc_put_att_text(ncoutid, rrdoutid[s], "coordinates", strlen(tmpstr), tmpstr); 00377 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00378 istat = sprintf(tmpstr, "none"); 00379 istat = nc_put_att_text(ncoutid, rrdoutid[s], "units", strlen(tmpstr), tmpstr); 00380 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00381 00382 /* Define precipitation index obs variables */ 00383 (void) sprintf(nomvar, "%s_%d", data->learning->nomvar_precip_index_obs, s+1); 00384 vardimids[0] = timedimoutid[s]; 00385 vardimids[1] = ptsdimoutid; 00386 istat = nc_def_var(ncoutid, nomvar, NC_DOUBLE, 2, vardimids, &(rrooutid[s])); 00387 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00388 00389 istat = nc_put_att_double(ncoutid, rrooutid[s], "missing_value", NC_DOUBLE, 1, &fillvalue); 00390 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00391 istat = sprintf(tmpstr, "%s %s_%d", data->conf->ptsname, data->learning->nomvar_time, s+1); 00392 istat = nc_put_att_text(ncoutid, rrooutid[s], "coordinates", strlen(tmpstr), tmpstr); 00393 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00394 istat = sprintf(tmpstr, "none"); 00395 istat = nc_put_att_text(ncoutid, rrooutid[s], "units", strlen(tmpstr), tmpstr); 00396 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00397 00398 /* Define sup_index (secondary large-scale field index for learning period) */ 00399 (void) sprintf(nomvar, "%s_%d", data->learning->nomvar_sup_index, s+1); 00400 vardimids[0] = timedimoutid[s]; 00401 istat = nc_def_var(ncoutid, nomvar, NC_DOUBLE, 1, vardimids, &(taoutid[s])); 00402 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00403 00404 istat = nc_put_att_double(ncoutid, taoutid[s], "missing_value", NC_DOUBLE, 1, &fillvalue); 00405 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00406 istat = sprintf(tmpstr, "%s_%d", data->learning->nomvar_time, s+1); 00407 istat = nc_put_att_text(ncoutid, taoutid[s], "coordinates", strlen(tmpstr), tmpstr); 00408 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00409 istat = sprintf(tmpstr, "none"); 00410 istat = nc_put_att_text(ncoutid, taoutid[s], "units", strlen(tmpstr), tmpstr); 00411 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00412 00413 /* Define sup_val (secondary large-scale 2D field for learning period) */ 00414 if (data->conf->season[s].secondary_cov == TRUE && data->learning->data[s].sup_val != NULL) { 00415 (void) sprintf(nomvar, "%s_%d", data->learning->nomvar_sup_val, s+1); 00416 vardimids[0] = timedimoutid[s]; 00417 vardimids[1] = latdimoutid; 00418 vardimids[2] = londimoutid; 00419 istat = nc_def_var(ncoutid, nomvar, NC_FLOAT, 3, vardimids, &(tadoutid[s])); 00420 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00421 00422 istat = nc_put_att_double(ncoutid, tadoutid[s], "missing_value", NC_FLOAT, 1, &fillvalue); 00423 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00424 istat = sprintf(tmpstr, "%s_%d %s %s", data->learning->nomvar_time, s+1, data->learning->sup_latname, data->learning->sup_lonname); 00425 istat = nc_put_att_text(ncoutid, tadoutid[s], "coordinates", strlen(tmpstr), tmpstr); 00426 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00427 istat = sprintf(tmpstr, "none"); 00428 istat = nc_put_att_text(ncoutid, tadoutid[s], "units", strlen(tmpstr), tmpstr); 00429 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00430 } 00431 } 00432 00433 /* Define pc_normalized_var */ 00434 (void) strcpy(nomvar, data->learning->nomvar_pc_normalized_var); 00435 vardimids[0] = eofdimoutid; 00436 istat = nc_def_var(ncoutid, nomvar, NC_DOUBLE, 1, vardimids, &pcoutid); 00437 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00438 00439 istat = nc_put_att_double(ncoutid, pcoutid, "missing_value", NC_DOUBLE, 1, &fillvalue); 00440 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00441 istat = nc_put_att_text(ncoutid, pcoutid, "coordinates", strlen(data->conf->eofname), data->conf->eofname); 00442 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00443 istat = sprintf(tmpstr, "none"); 00444 istat = nc_put_att_text(ncoutid, pcoutid, "units", strlen(tmpstr), tmpstr); 00445 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00446 00447 /* Define tancp_mean */ 00448 (void) strcpy(nomvar, data->learning->nomvar_sup_index_mean); 00449 vardimids[0] = sdimoutid; 00450 istat = nc_def_var(ncoutid, nomvar, NC_DOUBLE, 1, vardimids, &tamoutid); 00451 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00452 00453 istat = nc_put_att_double(ncoutid, tamoutid, "missing_value", NC_DOUBLE, 1, &fillvalue); 00454 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00455 istat = sprintf(tmpstr, "season"); 00456 istat = nc_put_att_text(ncoutid, tamoutid, "coordinates", strlen(tmpstr), tmpstr); 00457 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00458 istat = sprintf(tmpstr, "none"); 00459 istat = nc_put_att_text(ncoutid, tamoutid, "units", strlen(tmpstr), tmpstr); 00460 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00461 00462 /* Define tancp_var */ 00463 (void) strcpy(nomvar, data->learning->nomvar_sup_index_var); 00464 vardimids[0] = sdimoutid; 00465 istat = nc_def_var(ncoutid, nomvar, NC_DOUBLE, 1, vardimids, &tavoutid); 00466 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00467 00468 istat = nc_put_att_double(ncoutid, tavoutid, "missing_value", NC_DOUBLE, 1, &fillvalue); 00469 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00470 istat = sprintf(tmpstr, "season"); 00471 istat = nc_put_att_text(ncoutid, tavoutid, "coordinates", strlen(tmpstr), tmpstr); 00472 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00473 istat = sprintf(tmpstr, "none"); 00474 istat = nc_put_att_text(ncoutid, tavoutid, "units", strlen(tmpstr), tmpstr); 00475 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00476 00477 /* End definition mode */ 00478 istat = nc_enddef(ncoutid); 00479 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00480 00481 /* Write variables */ 00482 00483 if (cov_true == TRUE) { 00484 /* Write lat and lon */ 00485 start[0] = 0; 00486 start[1] = 0; 00487 start[2] = 0; 00488 count[0] = (size_t) data->learning->sup_nlat; 00489 count[1] = 0; 00490 count[2] = 0; 00491 istat = nc_put_vara_double(ncoutid, latoutid, start, count, data->learning->sup_lat); 00492 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00493 00494 start[0] = 0; 00495 start[1] = 0; 00496 start[2] = 0; 00497 count[0] = (size_t) data->learning->sup_nlon; 00498 count[1] = 0; 00499 count[2] = 0; 00500 istat = nc_put_vara_double(ncoutid, lonoutid, start, count, data->learning->sup_lon); 00501 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00502 } 00503 00504 /* Initialize udunits */ 00505 ut_set_error_message_handler(ut_ignore); 00506 unitSystem = ut_read_xml(NULL); 00507 ut_set_error_message_handler(ut_write_to_stderr); 00508 dataunits = ut_parse(unitSystem, data->conf->time_units, UT_ASCII); 00509 00510 timeval = NULL; 00511 for (s=0; s<data->conf->nseasons; s++) { 00512 00513 timeval = (double *) realloc(timeval, data->learning->data[s].ntime * sizeof(double)); 00514 if (timeval == NULL) alloc_error(__FILE__, __LINE__); 00515 00516 /* Compute time variable using actual units */ 00517 for (t=0; t<data->learning->data[s].ntime; t++) 00518 istat = utInvCalendar2(data->learning->data[s].time_s->year[t], data->learning->data[s].time_s->month[t], 00519 data->learning->data[s].time_s->day[t], data->learning->data[s].time_s->hour[t], 00520 data->learning->data[s].time_s->minutes[t], data->learning->data[s].time_s->seconds[t], 00521 dataunits, &(timeval[t])); 00522 00523 /* Write time */ 00524 start[0] = 0; 00525 start[1] = 0; 00526 start[2] = 0; 00527 count[0] = (size_t) data->learning->data[s].ntime; 00528 count[1] = 0; 00529 count[2] = 0; 00530 istat = nc_put_vara_double(ncoutid, timeoutid[s], start, count, timeval); 00531 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00532 00533 /* Write regression constants */ 00534 start[0] = 0; 00535 start[1] = 0; 00536 start[2] = 0; 00537 count[0] = (size_t) data->reg->npts; 00538 count[1] = 0; 00539 count[2] = 0; 00540 istat = nc_put_vara_double(ncoutid, cstoutid[s], start, count, data->learning->data[s].precip_reg_cst); 00541 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00542 00543 /* Write regressions coefficients */ 00544 start[0] = 0; 00545 start[1] = 0; 00546 start[2] = 0; 00547 count[0] = (size_t) data->conf->season[s].nclusters; 00548 count[1] = (size_t) data->reg->npts; 00549 count[2] = 0; 00550 istat = nc_put_vara_double(ncoutid, regoutid[s], start, count, data->learning->data[s].precip_reg); 00551 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00552 00553 /* Write regressions distances */ 00554 if (data->learning->data[s].precip_reg_dist != NULL) { 00555 start[0] = 0; 00556 start[1] = 0; 00557 start[2] = 0; 00558 count[0] = (size_t) data->learning->data[s].ntime; 00559 count[1] = (size_t) data->conf->season[s].nclusters; 00560 count[2] = 0; 00561 istat = nc_put_vara_double(ncoutid, distoutid[s], start, count, data->learning->data[s].precip_reg_dist); 00562 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00563 } 00564 00565 /* Write regression R^2 diagnostic */ 00566 start[0] = 0; 00567 start[1] = 0; 00568 start[2] = 0; 00569 count[0] = (size_t) data->reg->npts; 00570 count[1] = 0; 00571 count[2] = 0; 00572 istat = nc_put_vara_double(ncoutid, rsqoutid[s], start, count, data->learning->data[s].precip_reg_rsq); 00573 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00574 00575 if (data->learning->data[s].precip_reg_err != NULL) { 00576 /* Write regression residuals diagnostic */ 00577 start[0] = 0; 00578 start[1] = 0; 00579 start[2] = 0; 00580 count[0] = (size_t) data->learning->data[s].ntime; 00581 count[1] = (size_t) data->reg->npts; 00582 count[2] = 0; 00583 istat = nc_put_vara_double(ncoutid, erroutid[s], start, count, data->learning->data[s].precip_reg_err); 00584 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00585 } 00586 00587 /* Write regression autocorrelation diagnostic */ 00588 start[0] = 0; 00589 start[1] = 0; 00590 start[2] = 0; 00591 count[0] = (size_t) data->reg->npts; 00592 count[1] = 0; 00593 count[2] = 0; 00594 istat = nc_put_vara_double(ncoutid, acoroutid[s], start, count, data->learning->data[s].precip_reg_autocor); 00595 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00596 00597 /* Write regression VIF diagnostic */ 00598 start[0] = 0; 00599 start[1] = 0; 00600 start[2] = 0; 00601 count[0] = (size_t) data->conf->season[s].nclusters; 00602 count[1] = 0; 00603 count[2] = 0; 00604 istat = nc_put_vara_double(ncoutid, vifoutid[s], start, count, data->learning->data[s].precip_reg_vif); 00605 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00606 00607 /* Write precipitation index */ 00608 start[0] = 0; 00609 start[1] = 0; 00610 start[2] = 0; 00611 count[0] = (size_t) data->learning->data[s].ntime; 00612 count[1] = (size_t) data->reg->npts; 00613 count[2] = 0; 00614 istat = nc_put_vara_double(ncoutid, rrdoutid[s], start, count, data->learning->data[s].precip_index); 00615 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00616 00617 /* Write precipitation index obs */ 00618 start[0] = 0; 00619 start[1] = 0; 00620 start[2] = 0; 00621 count[0] = (size_t) data->learning->data[s].ntime; 00622 count[1] = (size_t) data->reg->npts; 00623 count[2] = 0; 00624 istat = nc_put_vara_double(ncoutid, rrooutid[s], start, count, data->learning->data[s].precip_index_obs); 00625 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00626 00627 /* Write secondary field index */ 00628 start[0] = 0; 00629 start[1] = 0; 00630 start[2] = 0; 00631 count[0] = (size_t) data->learning->data[s].ntime; 00632 count[1] = 0; 00633 count[2] = 0; 00634 istat = nc_put_vara_double(ncoutid, taoutid[s], start, count, data->learning->data[s].sup_index); 00635 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00636 00637 /* Write secondary field 2D field */ 00638 if (data->conf->season[s].secondary_cov == TRUE && data->learning->data[s].sup_val != NULL) { 00639 start[0] = 0; 00640 start[1] = 0; 00641 start[2] = 0; 00642 count[0] = (size_t) data->learning->data[s].ntime; 00643 count[1] = (size_t) data->learning->sup_nlat; 00644 count[2] = (size_t) data->learning->sup_nlon; 00645 istat = nc_put_vara_double(ncoutid, tadoutid[s], start, count, data->learning->data[s].sup_val); 00646 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00647 } 00648 00649 tancp_mean[s] = data->learning->data[s].sup_index_mean; 00650 tancp_var[s] = data->learning->data[s].sup_index_var; 00651 } 00652 00653 /* Write pc_normalized_var */ 00654 start[0] = 0; 00655 start[1] = 0; 00656 start[2] = 0; 00657 count[0] = (size_t) data->learning->rea_neof; 00658 count[1] = 0; 00659 count[2] = 0; 00660 bufd = (double *) malloc(data->learning->rea_neof * sizeof(double)); 00661 if (bufd == NULL) alloc_error(__FILE__, __LINE__); 00662 for (ii=0; ii<data->learning->rea_neof; ii++) 00663 bufd[ii] = sqrt(data->learning->pc_normalized_var[ii]); 00664 istat = nc_put_vara_double(ncoutid, pcoutid, start, count, bufd); 00665 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00666 (void) free(bufd); 00667 00668 /* Write tancp_mean */ 00669 start[0] = 0; 00670 start[1] = 0; 00671 start[2] = 0; 00672 count[0] = (size_t) data->conf->nseasons; 00673 count[1] = 0; 00674 count[2] = 0; 00675 istat = nc_put_vara_double(ncoutid, tamoutid, start, count, tancp_mean); 00676 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00677 00678 /* Write tancp_var */ 00679 start[0] = 0; 00680 start[1] = 0; 00681 start[2] = 0; 00682 count[0] = (size_t) data->conf->nseasons; 00683 count[1] = 0; 00684 count[2] = 0; 00685 istat = nc_put_vara_double(ncoutid, tavoutid, start, count, tancp_var); 00686 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00687 00688 00689 /* Close the output netCDF file */ 00690 istat = ncclose(ncoutid); 00691 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00692 00693 00694 00695 /* Open NetCDF file for writing, overwrite and truncate existing file if any */ 00696 istat = nc_create(data->learning->filename_save_weight, NC_CLOBBER, &ncoutid); 00697 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00698 00699 /* Set global attributes */ 00700 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "processor", strlen(data->info->processor), data->info->processor); 00701 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "institution", strlen(data->info->institution), data->info->institution); 00702 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "creator_email", strlen(data->info->creator_email), data->info->creator_email); 00703 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "creator_url", strlen(data->info->creator_url), data->info->creator_url); 00704 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "creator_name", strlen(data->info->creator_name), data->info->creator_name); 00705 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "contact_email", strlen(data->info->contact_email), data->info->contact_email); 00706 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "contact_name", strlen(data->info->contact_name), data->info->contact_name); 00707 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "other_contact_email", strlen(data->info->other_contact_email), 00708 data->info->other_contact_email); 00709 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "other_contact_name", strlen(data->info->other_contact_name), 00710 data->info->other_contact_name); 00711 00712 fillvalue = -9999.9; 00713 00714 /* Set dimensions */ 00715 istat = nc_def_dim(ncoutid, "season", data->conf->nseasons, &sdimoutid); 00716 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00717 istat = nc_def_dim(ncoutid, data->conf->eofname, data->learning->rea_neof, &eofdimoutid); 00718 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00719 00720 for (s=0; s<data->conf->nseasons; s++) { 00721 00722 /* Define weight dimensions and variables */ 00723 (void) sprintf(nomvar, "%s_%d", data->conf->clustname, s+1); 00724 istat = nc_def_dim(ncoutid, nomvar, data->conf->season[s].nclusters, &(weightdimoutid[s])); 00725 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00726 00727 vardimids[0] = weightdimoutid[s]; 00728 vardimids[1] = eofdimoutid; 00729 (void) sprintf(nomvar, "%s_%d", data->learning->nomvar_weight, s+1); 00730 istat = nc_def_var(ncoutid, nomvar, NC_DOUBLE, 2, vardimids, &(weightoutid[s])); 00731 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00732 00733 istat = nc_put_att_double(ncoutid, weightoutid[s], "missing_value", NC_DOUBLE, 1, &fillvalue); 00734 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00735 istat = sprintf(tmpstr, "%s %s_%d", data->conf->eofname, data->conf->clustname, s+1); 00736 istat = nc_put_att_text(ncoutid, weightoutid[s], "coordinates", strlen(tmpstr), tmpstr); 00737 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00738 istat = sprintf(tmpstr, "none"); 00739 istat = nc_put_att_text(ncoutid, weightoutid[s], "units", strlen(tmpstr), tmpstr); 00740 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00741 } 00742 00743 /* End definition mode */ 00744 istat = nc_enddef(ncoutid); 00745 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00746 00747 for (s=0; s<data->conf->nseasons; s++) { 00748 /* Write weights */ 00749 start[0] = 0; 00750 start[1] = 0; 00751 start[2] = 0; 00752 count[0] = (size_t) data->conf->season[s].nclusters; 00753 count[1] = (size_t) data->learning->rea_neof; 00754 count[2] = 0; 00755 istat = nc_put_vara_double(ncoutid, weightoutid[s], start, count, data->learning->data[s].weight); 00756 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00757 } 00758 00759 /* Close the output netCDF file */ 00760 istat = ncclose(ncoutid); 00761 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00762 00763 00764 /* Open NetCDF file for writing, overwrite and truncate existing file if any */ 00765 istat = nc_create(data->learning->filename_save_clust_learn, NC_CLOBBER, &ncoutid); 00766 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00767 00768 /* Set global attributes */ 00769 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "processor", strlen(data->info->processor), data->info->processor); 00770 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "institution", strlen(data->info->institution), data->info->institution); 00771 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "creator_email", strlen(data->info->creator_email), data->info->creator_email); 00772 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "creator_url", strlen(data->info->creator_url), data->info->creator_url); 00773 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "creator_name", strlen(data->info->creator_name), data->info->creator_name); 00774 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "contact_email", strlen(data->info->contact_email), data->info->contact_email); 00775 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "contact_name", strlen(data->info->contact_name), data->info->contact_name); 00776 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "other_contact_email", strlen(data->info->other_contact_email), 00777 data->info->other_contact_email); 00778 istat = nc_put_att_text(ncoutid, NC_GLOBAL, "other_contact_name", strlen(data->info->other_contact_name), 00779 data->info->other_contact_name); 00780 00781 fillvalue = -9999.9; 00782 00783 /* Set dimensions */ 00784 istat = nc_def_dim(ncoutid, "season", data->conf->nseasons, &sdimoutid); 00785 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00786 istat = nc_def_dim(ncoutid, data->conf->eofname, data->learning->rea_neof, &eofdimoutid); 00787 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00788 00789 for (s=0; s<data->conf->nseasons; s++) { 00790 00791 /* Define time dimensions and variables */ 00792 (void) sprintf(nomvar, "%s_%d", data->learning->nomvar_time, s+1); 00793 istat = nc_def_dim(ncoutid, nomvar, data->learning->data[s].ntime, &(timedimoutid[s])); 00794 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00795 00796 vardimids[0] = timedimoutid[s]; 00797 istat = nc_def_var(ncoutid, nomvar, NC_DOUBLE, 1, vardimids, &(timeoutid[s])); 00798 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00799 00800 istat = sprintf(tmpstr, "gregorian"); 00801 istat = nc_put_att_text(ncoutid, timeoutid[s], "calendar", strlen(tmpstr), tmpstr); 00802 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00803 istat = sprintf(tmpstr, "%s", data->conf->time_units); 00804 istat = nc_put_att_text(ncoutid, timeoutid[s], "units", strlen(tmpstr), tmpstr); 00805 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00806 istat = sprintf(tmpstr, "time in %s", data->conf->time_units); 00807 istat = nc_put_att_text(ncoutid, timeoutid[s], "long_name", strlen(tmpstr), tmpstr); 00808 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00809 00810 /* Define clust_learn variables */ 00811 (void) sprintf(nomvar, "%s_%d", data->learning->nomvar_class_clusters, s+1); 00812 vardimids[0] = timedimoutid[s]; 00813 istat = nc_def_var(ncoutid, nomvar, NC_DOUBLE, 1, vardimids, &(clustoutid[s])); 00814 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00815 00816 istat = nc_put_att_double(ncoutid, clustoutid[s], "missing_value", NC_DOUBLE, 1, &fillvalue); 00817 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00818 istat = sprintf(tmpstr, "%s_%d", data->learning->nomvar_time, s+1); 00819 istat = nc_put_att_text(ncoutid, clustoutid[s], "coordinates", strlen(tmpstr), tmpstr); 00820 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00821 istat = sprintf(tmpstr, "none"); 00822 istat = nc_put_att_text(ncoutid, clustoutid[s], "units", strlen(tmpstr), tmpstr); 00823 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00824 } 00825 00826 /* End definition mode */ 00827 istat = nc_enddef(ncoutid); 00828 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00829 00830 for (s=0; s<data->conf->nseasons; s++) { 00831 00832 timeval = (double *) realloc(timeval, data->learning->data[s].ntime * sizeof(double)); 00833 if (timeval == NULL) alloc_error(__FILE__, __LINE__); 00834 00835 /* Compute time variable using actual units */ 00836 for (t=0; t<data->learning->data[s].ntime; t++) 00837 istat = utInvCalendar2(data->learning->data[s].time_s->year[t], data->learning->data[s].time_s->month[t], 00838 data->learning->data[s].time_s->day[t], data->learning->data[s].time_s->hour[t], 00839 data->learning->data[s].time_s->minutes[t], data->learning->data[s].time_s->seconds[t], 00840 dataunits, &(timeval[t])); 00841 00842 /* Write clust_learn */ 00843 start[0] = 0; 00844 start[1] = 0; 00845 start[2] = 0; 00846 count[0] = (size_t) data->learning->data[s].ntime; 00847 count[1] = 0; 00848 count[2] = 0; 00849 istat = nc_put_vara_int(ncoutid, clustoutid[s], start, count, data->learning->data[s].class_clusters); 00850 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00851 00852 /* Write time */ 00853 start[0] = 0; 00854 start[1] = 0; 00855 start[2] = 0; 00856 count[0] = (size_t) data->learning->data[s].ntime; 00857 count[1] = 0; 00858 count[2] = 0; 00859 istat = nc_put_vara_double(ncoutid, timeoutid[s], start, count, data->learning->data[s].time); 00860 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00861 } 00862 00863 /* Close the output netCDF file */ 00864 istat = ncclose(ncoutid); 00865 if (istat != NC_NOERR) handle_netcdf_error(istat, __FILE__, __LINE__); 00866 00867 (void) ut_free(dataunits); 00868 (void) ut_free_system(unitSystem); 00869 00870 (void) free(nomvar); 00871 (void) free(tancp_mean); 00872 (void) free(tancp_var); 00873 (void) free(timeval); 00874 00875 (void) free(timedimoutid); 00876 (void) free(clustdimoutid); 00877 (void) free(weightdimoutid); 00878 00879 (void) free(timeoutid); 00880 (void) free(cstoutid); 00881 (void) free(regoutid); 00882 (void) free(distoutid); 00883 (void) free(rrdoutid); 00884 (void) free(rrooutid); 00885 (void) free(taoutid); 00886 (void) free(tadoutid); 00887 (void) free(clustoutid); 00888 (void) free(weightoutid); 00889 (void) free(rsqoutid); 00890 (void) free(erroutid); 00891 (void) free(acoroutid); 00892 (void) free(vifoutid); 00893 00894 (void) free(tmpstr); 00895 00896 return 0; 00897 }