dsclim.c File Reference

Downscaling climate scenarios program. More...

#include <dsclim.h>
Include dependency graph for dsclim.c:

Go to the source code of this file.

Functions

void show_usage (char *pgm)
 C prototypes.
short int show_license ()
 Show license so user can accept or deny it.
int main (int argc, char **argv)
 Main program.

Detailed Description

Downscaling climate scenarios program.

Definition in file dsclim.c.


Function Documentation

int main ( int  argc,
char **  argv 
)

Main program.

Parameters:
[in] argc Number of command-line arguments.
[in] argv Vector of command-line argument strings.
Returns:
Status.

Definition at line 69 of file dsclim.c.

References alloc_error(), banner(), data_struct::conf, period_struct::downscale, FALSE, reg_struct::filename, free_main_data(), conf_struct::learning_maskfile, load_conf(), conf_struct::nperiods, conf_struct::output_only, conf_struct::period, conf_struct::period_ctrl, read_mask(), read_regression_points(), data_struct::reg, data_struct::secondary_mask, show_license(), show_usage(), TRUE, mask_struct::use_mask, wt_downscaling(), and wt_learning().

00070 {
00078   int i; /* Loop counter */
00079   int istat = 0; /* Return status */
00080   data_struct *data = NULL; /* Main data structure */
00081   short int license_accept = 0; /* If user has accepted license or not */
00082   short int downscale = TRUE; /* If we want to downscale at least one period, excluding control */
00083   
00084   /* Command-line arguments variables */
00085   char fileconf[500]; /* Configuration filename */
00086 
00087   /* Show license so user can accept or deny it. */
00088   license_accept = show_license();
00089   if (license_accept == 1)
00090     (void) printf("\n\nYou accepted the license and its terms: the program can continue!\nYou will not have to input again the acceptance of the license\nand its terms for further use of the program in the current account.\n\n");
00091   else if (license_accept != 2) {
00092     (void) printf("\n\nYou did not accept the license and its terms: the program cannot continue. It must exit now.\n\n");
00093     (void) exit(0);
00094   }
00095   /* license_accept == 2 when user had already accepted the license in a previous execution of the program. */
00096 
00097   /* Print BEGIN banner */
00098   (void) banner(PACKAGE_NAME, PACKAGE_VERSION, "BEGIN");
00099 
00100   /* Allocate memory */
00101   data = (data_struct *) malloc(sizeof(data_struct));
00102   if (data == NULL) alloc_error(__FILE__, __LINE__);
00103 
00104   /* Get command-line arguments and set appropriate variables */
00105   (void) printf("\n**** PROCESS COMMAND-LINE ARGUMENTS ****\n\n");
00106   if (argc <= 1) {
00107     (void) show_usage(PACKAGE_NAME);
00108     (void) banner(PACKAGE_NAME, "ABORT", "END");
00109     (void) exit(1);
00110   }
00111   else
00112     /* Decode command-line arguments */
00113     for (i=1; i<argc; i++) {
00114       if ( !strcmp(argv[i], "-conf") )
00115         (void) strcpy(fileconf, argv[++i]);
00116       else if ( !strcmp(argv[i], "--version") ) {
00117         (void) printf("%s version %s\n\n", PACKAGE_NAME, PACKAGE_VERSION);
00118         (void) banner(PACKAGE_NAME, "OK", "END");
00119         (void) exit(0);
00120       }
00121       else {
00122         (void) fprintf(stderr, "%s:: Wrong arg %s.\n\n", PACKAGE_NAME, argv[i]);
00123         (void) show_usage(PACKAGE_NAME);
00124         (void) banner(PACKAGE_NAME, "ABORT", "END");
00125         (void) exit(1);
00126       }
00127     }
00128 
00129   /* Read and store configuration file in memory */
00130   /* Allocate memory for main data structures */
00131   (void) printf("\n**** LOADING CONFIGURATION ****\n\n");
00132   istat = load_conf(data, fileconf);
00133   if (istat != 0) {
00134     (void) fprintf(stderr, "%s: Error in loading configuration file. Aborting.\n", __FILE__);
00135     (void) banner(PACKAGE_NAME, "ABORT", "END");
00136     (void) abort();
00137   }
00138 
00139 
00140   /* Generate analog data only if we are not reading it off disk */
00141   if (data->conf->output_only == FALSE) {
00142     
00143     /* Read regression points positions if needed */
00144     if (data->reg->filename != NULL) {
00145       (void) printf("\n**** READING REGRESSION POSITIONS ****\n\n");
00146       istat = read_regression_points(data->reg);
00147       if (istat != 0) {
00148         (void) fprintf(stderr, "%s: Error in reading regression points positions. Aborting.\n", __FILE__);
00149         (void) banner(PACKAGE_NAME, "ABORT", "END");
00150         (void) abort();
00151       }
00152     }
00153 
00154     /* Read mask for secondary large-scale fields if needed */
00155     if (data->secondary_mask->use_mask == TRUE) {
00156       (void) printf("\n**** SECONDARY LARGE-SCALE FIELDS MASK ****\n\n");
00157       istat = read_mask(data->secondary_mask);
00158       if (istat != 0) {
00159         (void) fprintf(stderr, "%s: Error in reading secondary large-scale mask file. Aborting.\n", __FILE__);
00160         (void) banner(PACKAGE_NAME, "ABORT", "END");
00161         (void) abort();
00162       }
00163     }
00164     
00165     /* Read mask for learning fields if needed */
00166     if (data->conf->learning_maskfile->use_mask == TRUE) {
00167       (void) printf("\n**** LEARNING FIELDS MASK ****\n\n");
00168       istat = read_mask(data->conf->learning_maskfile);
00169       if (istat != 0) {
00170         (void) fprintf(stderr, "%s: Error in reading learning mask file. Aborting.\n", __FILE__);
00171         (void) banner(PACKAGE_NAME, "ABORT", "END");
00172         (void) abort();
00173       }
00174     }
00175 
00176     /* If wanted, generate learning data */
00177     (void) printf("\n**** LEARNING ****\n\n");
00178     istat = wt_learning(data);
00179     if (istat != 0) {
00180       (void) fprintf(stderr, "%s: Error in computing or reading learning data needed for downscaling. Aborting.\n", __FILE__);
00181       (void) banner(PACKAGE_NAME, "ABORT", "END");
00182       (void) abort();
00183     }
00184   }
00185   
00186   /* Perform downscaling */
00187   downscale = FALSE;
00188   for (i=0; i<data->conf->nperiods; i++)
00189     if (data->conf->period[i].downscale == TRUE)
00190       downscale = TRUE;
00191   if (data->conf->period_ctrl->downscale == TRUE || downscale == TRUE) {
00192     (void) printf("\n**** DOWNSCALING ****\n\n");
00193     if (data->conf->output_only == TRUE)
00194       (void) printf("****WARNING: Configuration for reading analog dates and writing data ONLY!\n\n");
00195     istat = wt_downscaling(data);
00196     if (istat != 0) {
00197       (void) fprintf(stderr, "%s: Error in performing downscaling. Aborting.\n", __FILE__);
00198       (void) banner(PACKAGE_NAME, "ABORT", "END");
00199       (void) abort();
00200     }
00201   }
00202   
00203   /* Free main data structure */
00204   (void) printf("\n**** FREE MEMORY ****\n\n");
00205   (void) free_main_data(data);
00206   (void) free(data);
00207 
00208   /* Print END banner */
00209   (void) banner(PACKAGE_NAME, "OK", "END");
00210   
00211   return 0;
00212 }

short int show_license (  ) 

Show license so user can accept or deny it.

Returns:
license_accept

Definition at line 231 of file dsclim.c.

References alloc_error(), and MAXPATH.

Referenced by main().

00231                {
00236   short int license_accept = 0;
00237   int istat = -1;
00238   const char license[5000] = "\nCopyright Cerfacs (Christian Page) (2010)\n\nchristian.page@cerfacs.fr\n\nThis software is a computer program whose purpose is to downscale climate\nscenarios using a statistical methodology based on weather regimes.\n\nThis software is governed by the CeCILL license under French law and\nabiding by the rules of distribution of free software. You can use, \nmodify and/ or redistribute the software under the terms of the CeCILL\nlicense as circulated by CEA, CNRS and INRIA at the following URL\n\"http://www.cecill.info\". \n\nAs a counterpart to the access to the source code and rights to copy,\nmodify and redistribute granted by the license, users are provided only\nwith a limited warranty and the software's author, the holder of the\neconomic rights, and the successive licensors have only limited\nliability. \n\nIn this respect, the user's attention is drawn to the risks associated\nwith loading, using, modifying and/or developing or reproducing the\nsoftware by the user in light of its specific status of free software,\nthat may mean that it is complicated to manipulate, and that also\ntherefore means that it is reserved for developers and experienced\nprofessionals having in-depth computer knowledge. Users are therefore\nencouraged to load and test the software's suitability as regards their\nrequirements in conditions enabling the security of their systems and/or \ndata to be ensured and, more generally, to use and operate it in the \nsame conditions as regards security. \n\nTo further continue, you must accept the CeCILL license and its terms.\n\n";
00239   char *dsclim_lic_file = NULL; /* dsclim license check file */
00240   char *dsclim_lic = NULL; /* dsclim license check */
00241   FILE *ifile = NULL; /* File for license acceptance */
00242 
00243   /* Let user accepts license */
00244   dsclim_lic_file = (char *) malloc(MAXPATH * sizeof(char));
00245   if (dsclim_lic_file == NULL) alloc_error(__FILE__, __LINE__);
00246   (void) sprintf(dsclim_lic_file, "%s/%s", getenv("HOME"), ".dsclim_lic");
00247 
00248   if ( access(dsclim_lic_file, F_OK) != 0 ) {
00249     dsclim_lic = (char *) malloc(10 * sizeof(char));
00250     if (dsclim_lic == NULL) alloc_error(__FILE__, __LINE__);
00251     /* User never had the license acceptance */
00252     (void) fprintf(stdout, license);
00253     (void) fprintf(stdout, "Do you accept or deny the license? [Type accept or deny]: ");
00254     /* Read input from user */
00255     istat = scanf("%7s", dsclim_lic);
00256     if ( !strcmp(dsclim_lic, "accept") ) {
00257       license_accept = 1;
00258       ifile = fopen(dsclim_lic_file, "w");
00259       if (ifile == NULL)
00260         (void) fprintf(stderr, "%s: Failed to write license acceptance file.\n", __FILE__);
00261       (void) fprintf(ifile, license);
00262       (void) fprintf(ifile, "The user accepted the dsclim license and its terms.\n\n");
00263       (void) fclose(ifile);
00264     }
00265     (void) free(dsclim_lic);
00266   }
00267   else
00268     license_accept = 2;
00269 
00270   (void) free(dsclim_lic_file);
00271   
00272   return license_accept;
00273 }

void show_usage ( char *  pgm  ) 

C prototypes.

Local Subroutines.

Show usage for program command-line arguments.

Parameters:
[in] pgm Program name.

Definition at line 219 of file dsclim.c.

Referenced by main().

00219                       {
00224   (void) fprintf(stderr, "%s:: usage:\n", pgm);
00225   (void) fprintf(stderr, "-conf: configuration file\n");
00226 
00227 }


Generated on 12 May 2016 for DSCLIM by  doxygen 1.6.1