read_learning_obs_eof.c

Go to the documentation of this file.
00001 /* ***************************************************** */
00002 /* read_learning_obs_eof Read observation data EOFs for  */
00003 /* learning period.                                      */
00004 /* read_learning_obs_eof.c                               */
00005 /* ***************************************************** */
00006 /* Author: Christian Page, CERFACS, Toulouse, France.    */
00007 /* ***************************************************** */
00008 /* Date of creation: dec 2008                            */
00009 /* Last date of modification: dec 2008                   */
00010 /* ***************************************************** */
00011 /* Original version: 1.0                                 */
00012 /* Current revision:                                     */
00013 /* ***************************************************** */
00014 /* Revisions                                             */
00015 /* ***************************************************** */
00020 /* LICENSE BEGIN
00021 
00022 Copyright Cerfacs (Christian Page) (2015)
00023 
00024 christian.page@cerfacs.fr
00025 
00026 This software is a computer program whose purpose is to downscale climate
00027 scenarios using a statistical methodology based on weather regimes.
00028 
00029 This software is governed by the CeCILL license under French law and
00030 abiding by the rules of distribution of free software. You can use, 
00031 modify and/ or redistribute the software under the terms of the CeCILL
00032 license as circulated by CEA, CNRS and INRIA at the following URL
00033 "http://www.cecill.info". 
00034 
00035 As a counterpart to the access to the source code and rights to copy,
00036 modify and redistribute granted by the license, users are provided only
00037 with a limited warranty and the software's author, the holder of the
00038 economic rights, and the successive licensors have only limited
00039 liability. 
00040 
00041 In this respect, the user's attention is drawn to the risks associated
00042 with loading, using, modifying and/or developing or reproducing the
00043 software by the user in light of its specific status of free software,
00044 that may mean that it is complicated to manipulate, and that also
00045 therefore means that it is reserved for developers and experienced
00046 professionals having in-depth computer knowledge. Users are therefore
00047 encouraged to load and test the software's suitability as regards their
00048 requirements in conditions enabling the security of their systems and/or 
00049 data to be ensured and, more generally, to use and operate it in the 
00050 same conditions as regards security. 
00051 
00052 The fact that you are presently reading this means that you have had
00053 knowledge of the CeCILL license and that you accept its terms.
00054 
00055 LICENSE END */
00056 
00057 
00058 
00059 
00060 
00061 
00062 
00063 #include <dsclim.h>
00064 
00066 int
00067 read_learning_obs_eof(data_struct *data) {
00074   int istat; /* Diagnostic status */
00075   int neof; /* EOF dimension for main large-scale fields in input file */
00076   int ntime; /* Time dimension for main large-scale fields in input file */
00077   double *time = NULL;
00078   char *cal_type = NULL; /* Calendar type (udunits) */
00079   char *time_units = NULL; /* Time units (udunits) */
00080   double *buf = NULL;
00081   int i;
00082   int t;
00083   int eof;
00084 
00085   if (data->learning->obs_neof != 0) {
00086   /* Only read variable if considering observation EOFs */
00087     
00088   /* Read EOF */
00089     istat = read_netcdf_var_2d(&buf, (info_field_struct *) NULL, (proj_struct *) NULL,
00090                                data->learning->obs->filename_eof, data->learning->obs->nomvar_eof,
00091                                data->learning->obs_eofname, data->learning->obs_timename, &neof, &ntime, TRUE);
00092     if (istat != 0) {
00093       /* In case of failure */
00094       (void) free(buf);
00095       return istat;
00096     }
00097     if (data->learning->obs_neof != neof) {
00098       (void) fprintf(stderr, "%s: ERROR: Number of EOFs (%d) for observation %s field from EOF file (%s) is not equal to number of EOFs specified in XML configuration file for observation fields (%d)!\n", __FILE__, neof,
00099                      data->learning->obs->nomvar_eof, data->learning->obs->filename_eof, data->learning->obs_neof);
00100       (void) free(buf);
00101       return -1;
00102     }
00103     /* Re-order array with time as fastest varying dimension */
00104     data->learning->obs->eof = malloc(neof*ntime * sizeof(double));
00105     if (data->learning->obs->eof == NULL) alloc_error(__FILE__, __LINE__);
00106     for (eof=0; eof<neof; eof++)
00107       for (t=0; t<ntime; t++)
00108         data->learning->obs->eof[t+eof*ntime] = buf[eof+t*neof];
00109     (void) free(buf);
00110 
00111     /* Read Singular Values */
00112     istat = read_netcdf_var_1d(&(data->learning->obs->sing), (info_field_struct *) NULL,
00113                                data->learning->obs->filename_eof, data->learning->obs->nomvar_sing,
00114                                data->learning->obs_eofname, &neof, TRUE);
00115     if (istat != 0) {
00116       /* In case of failure */
00117       return istat;
00118     }
00119     if (data->learning->obs_neof != neof) {
00120       (void) fprintf(stderr, "%s: ERROR: Number of EOFs (%d) for observation %s field from EOF file (%s) is not equal to number of EOFs specified in XML configuration file for observation fields (%d)!\n", __FILE__, neof,
00121                      data->learning->obs->nomvar_sing, data->learning->obs->filename_eof, data->learning->obs_neof);
00122       return -1;
00123     }
00124   }
00125   
00126   /* Get time information */
00127   istat = get_time_info(data->learning->obs->time_s, &time, &time_units, &cal_type,
00128                         &ntime, data->learning->obs->filename_eof, data->learning->nomvar_time, TRUE);
00129   (void) free(cal_type);
00130   (void) free(time_units);
00131   (void) free(time);
00132   if (istat < 0) {
00133     (void) free(data->learning->obs->time_s);
00134     return -1;
00135   }
00136 
00137   data->learning->ntime = ntime;
00138   data->learning->obs->ntime = ntime;
00139 
00140   /* Copy into main time structure */
00141   data->learning->time_s->year = (int *) malloc(ntime * sizeof(int));
00142   if (data->learning->time_s->year == NULL) alloc_error(__FILE__, __LINE__);
00143   data->learning->time_s->month = (int *) malloc(ntime * sizeof(int));
00144   if (data->learning->time_s->month == NULL) alloc_error(__FILE__, __LINE__);
00145   data->learning->time_s->day = (int *) malloc(ntime * sizeof(int));
00146   if (data->learning->time_s->day == NULL) alloc_error(__FILE__, __LINE__);
00147   data->learning->time_s->hour = (int *) malloc(ntime * sizeof(int));
00148   if (data->learning->time_s->hour == NULL) alloc_error(__FILE__, __LINE__);
00149   data->learning->time_s->minutes = (int *) malloc(ntime * sizeof(int));
00150   if (data->learning->time_s->minutes == NULL) alloc_error(__FILE__, __LINE__);
00151   data->learning->time_s->seconds = (double *) malloc(ntime * sizeof(double));
00152   if (data->learning->time_s->seconds == NULL) alloc_error(__FILE__, __LINE__);
00153 
00154   for (i=0; i<ntime; i++) {
00155     data->learning->time_s->year[i] = data->learning->obs->time_s->year[i];
00156     data->learning->time_s->month[i] = data->learning->obs->time_s->month[i];
00157     data->learning->time_s->day[i] = data->learning->obs->time_s->day[i];
00158     data->learning->time_s->hour[i] = data->learning->obs->time_s->hour[i];
00159     data->learning->time_s->minutes[i] = data->learning->obs->time_s->minutes[i];
00160     data->learning->time_s->seconds[i] = data->learning->obs->time_s->seconds[i];
00161   }
00162 
00163   /* Diagnostic status */
00164   return 0;
00165 }

Generated on 12 May 2016 for DSCLIM by  doxygen 1.6.1