Allow driving to be specified by file
This commit is contained in:
		
							
								
								
									
										70
									
								
								src/main.c
									
									
									
									
									
								
							
							
						
						
									
										70
									
								
								src/main.c
									
									
									
									
									
								
							@@ -34,17 +34,18 @@ typedef struct nstrophy_parameters {
 | 
			
		||||
  unsigned int driving;
 | 
			
		||||
  unsigned int init;
 | 
			
		||||
  FILE* initfile;
 | 
			
		||||
  FILE* drivingfile;
 | 
			
		||||
} nstrophy_parameters;
 | 
			
		||||
 | 
			
		||||
// usage message
 | 
			
		||||
int print_usage();
 | 
			
		||||
// print parameters
 | 
			
		||||
int print_params(nstrophy_parameters parameters, char* initfile_str, FILE* file);
 | 
			
		||||
int print_params(nstrophy_parameters parameters, char* initfile_str, char* drivingfile_str, FILE* file);
 | 
			
		||||
 | 
			
		||||
// read command line arguments
 | 
			
		||||
int read_args(int argc, const char* argv[], char** params, unsigned int* command, unsigned int* nthreads, char** savefile_str);
 | 
			
		||||
int read_params(char* param_str, nstrophy_parameters* parameters, char** initfile_str);
 | 
			
		||||
int set_parameter(char* lhs, char* rhs, nstrophy_parameters* parameters, bool* setN1, bool* setN2, char** initfile_str);
 | 
			
		||||
int read_params(char* param_str, nstrophy_parameters* parameters, char** initfile_str, char** drivingfile_str);
 | 
			
		||||
int set_parameter(char* lhs, char* rhs, nstrophy_parameters* parameters, bool* setN1, bool* setN2, char** initfile_str, char** drivingfile_str);
 | 
			
		||||
 | 
			
		||||
// set driving force
 | 
			
		||||
_Complex double* set_driving(nstrophy_parameters parameters);
 | 
			
		||||
@@ -60,6 +61,8 @@ void sig_handler (int signo);
 | 
			
		||||
 | 
			
		||||
#define DRIVING_ZERO 1
 | 
			
		||||
#define DRIVING_TEST 2
 | 
			
		||||
#define DRIVING_FILE 3
 | 
			
		||||
#define DRIVING_FILE_TXT 4
 | 
			
		||||
 | 
			
		||||
#define INIT_RANDOM 1
 | 
			
		||||
#define INIT_GAUSSIAN 2
 | 
			
		||||
@@ -90,6 +93,7 @@ int main (
 | 
			
		||||
  _Complex double *g;
 | 
			
		||||
  char* savefile_str=NULL;
 | 
			
		||||
  char* initfile_str=NULL;
 | 
			
		||||
  char* drivingfile_str=NULL;
 | 
			
		||||
  FILE* savefile=NULL;
 | 
			
		||||
 | 
			
		||||
  command=0;
 | 
			
		||||
@@ -101,7 +105,7 @@ int main (
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // read params
 | 
			
		||||
  ret=read_params(param_str, ¶meters, &initfile_str);
 | 
			
		||||
  ret=read_params(param_str, ¶meters, &initfile_str, &drivingfile_str);
 | 
			
		||||
  if(ret<0){
 | 
			
		||||
    return(-1);
 | 
			
		||||
  }
 | 
			
		||||
@@ -114,6 +118,14 @@ int main (
 | 
			
		||||
      return(-1);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  // open drivingfile
 | 
			
		||||
  if(drivingfile_str!=NULL){
 | 
			
		||||
    parameters.drivingfile=fopen(drivingfile_str,"r");
 | 
			
		||||
    if(parameters.drivingfile==NULL){
 | 
			
		||||
      fprintf(stderr,"Error opening file '%s' for reading: %s\n", drivingfile_str, strerror(errno));
 | 
			
		||||
      return(-1);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // set driving force
 | 
			
		||||
  g=set_driving(parameters);
 | 
			
		||||
@@ -124,6 +136,10 @@ int main (
 | 
			
		||||
  if (parameters.initfile!=NULL){
 | 
			
		||||
    fclose(parameters.initfile);
 | 
			
		||||
  }
 | 
			
		||||
  // close drivingfile
 | 
			
		||||
  if (parameters.drivingfile!=NULL){
 | 
			
		||||
    fclose(parameters.drivingfile);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // open savefile (do this after closing init file)
 | 
			
		||||
  if(savefile_str!=NULL){
 | 
			
		||||
@@ -135,13 +151,17 @@ int main (
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // print parameters
 | 
			
		||||
  print_params(parameters, initfile_str, stderr);
 | 
			
		||||
  print_params(parameters, initfile_str, stdout);
 | 
			
		||||
  print_params(parameters, initfile_str, drivingfile_str, stderr);
 | 
			
		||||
  print_params(parameters, initfile_str, drivingfile_str, stdout);
 | 
			
		||||
 | 
			
		||||
  // free initfile_str
 | 
			
		||||
  if(initfile_str!=NULL){
 | 
			
		||||
    free(initfile_str);
 | 
			
		||||
  }
 | 
			
		||||
  // free drivingfile_str
 | 
			
		||||
  if(drivingfile_str!=NULL){
 | 
			
		||||
    free(drivingfile_str);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // run command
 | 
			
		||||
  if (command==COMMAND_UK){
 | 
			
		||||
@@ -181,6 +201,7 @@ int print_usage(){
 | 
			
		||||
int print_params(
 | 
			
		||||
  nstrophy_parameters parameters,
 | 
			
		||||
  char* initfile_str,
 | 
			
		||||
  char* drivingfile_str,
 | 
			
		||||
  FILE* file
 | 
			
		||||
){
 | 
			
		||||
  fprintf(file,"# ");
 | 
			
		||||
@@ -200,6 +221,12 @@ int print_params(
 | 
			
		||||
  case DRIVING_ZERO:
 | 
			
		||||
    fprintf(file,", driving=zero");
 | 
			
		||||
    break;
 | 
			
		||||
  case DRIVING_FILE:
 | 
			
		||||
    fprintf(file,", driving=file:%s", drivingfile_str);
 | 
			
		||||
    break;
 | 
			
		||||
  case DRIVING_FILE_TXT:
 | 
			
		||||
    fprintf(file,", driving=file_txt:%s", drivingfile_str);
 | 
			
		||||
    break;
 | 
			
		||||
  default:
 | 
			
		||||
    fprintf(file,", driving=test");
 | 
			
		||||
    break;
 | 
			
		||||
@@ -316,7 +343,8 @@ int read_args(
 | 
			
		||||
int read_params(
 | 
			
		||||
  char* param_str,
 | 
			
		||||
  nstrophy_parameters* parameters,
 | 
			
		||||
  char** initfile_str
 | 
			
		||||
  char** initfile_str,
 | 
			
		||||
  char** drivingfile_str
 | 
			
		||||
){
 | 
			
		||||
  int ret;
 | 
			
		||||
  // pointer in params
 | 
			
		||||
@@ -345,6 +373,7 @@ int read_params(
 | 
			
		||||
  parameters->starting_time=0;
 | 
			
		||||
  parameters->seed=17;
 | 
			
		||||
  parameters->driving=DRIVING_TEST;
 | 
			
		||||
  parameters->drivingfile=NULL;
 | 
			
		||||
  parameters->init=INIT_GAUSSIAN;
 | 
			
		||||
  parameters->initfile=NULL;
 | 
			
		||||
 | 
			
		||||
@@ -367,7 +396,7 @@ int read_params(
 | 
			
		||||
	break;
 | 
			
		||||
      case ';':
 | 
			
		||||
	//set parameter
 | 
			
		||||
	ret=set_parameter(buffer_lhs, buffer_rhs, parameters, &setN1, &setN2, initfile_str);
 | 
			
		||||
	ret=set_parameter(buffer_lhs, buffer_rhs, parameters, &setN1, &setN2, initfile_str, drivingfile_str);
 | 
			
		||||
	if(ret<0){
 | 
			
		||||
	  return ret;
 | 
			
		||||
	}
 | 
			
		||||
@@ -394,7 +423,7 @@ int read_params(
 | 
			
		||||
 | 
			
		||||
    // set last param
 | 
			
		||||
    if (*param_str!='\0'){
 | 
			
		||||
      ret=set_parameter(buffer_lhs, buffer_rhs, parameters, &setN1, &setN2, initfile_str);
 | 
			
		||||
      ret=set_parameter(buffer_lhs, buffer_rhs, parameters, &setN1, &setN2, initfile_str, drivingfile_str);
 | 
			
		||||
      if(ret<0){
 | 
			
		||||
	return ret;
 | 
			
		||||
      }
 | 
			
		||||
@@ -424,7 +453,8 @@ int set_parameter(
 | 
			
		||||
  nstrophy_parameters* parameters,
 | 
			
		||||
  bool* setN1,
 | 
			
		||||
  bool* setN2,
 | 
			
		||||
  char** initfile_str
 | 
			
		||||
  char** initfile_str,
 | 
			
		||||
  char** drivingfile_str
 | 
			
		||||
){
 | 
			
		||||
  int ret;
 | 
			
		||||
 | 
			
		||||
@@ -551,6 +581,18 @@ int set_parameter(
 | 
			
		||||
    else if (strcmp(rhs,"test")==0){
 | 
			
		||||
      parameters->driving=DRIVING_TEST;
 | 
			
		||||
    }
 | 
			
		||||
    // matches any argument that starts with 'file:'
 | 
			
		||||
    else if (strncmp(rhs,"file:",5)==0){
 | 
			
		||||
      parameters->driving=DRIVING_FILE;
 | 
			
		||||
      *drivingfile_str=calloc(sizeof(char), strlen(rhs)-5+1);
 | 
			
		||||
      strcpy(*drivingfile_str, rhs+5);
 | 
			
		||||
    }
 | 
			
		||||
    // matches any argument that starts with 'file_txt:'
 | 
			
		||||
    else if (strncmp(rhs,"file_txt:",9)==0){
 | 
			
		||||
      parameters->driving=DRIVING_FILE_TXT;
 | 
			
		||||
      *drivingfile_str=calloc(sizeof(char), strlen(rhs)-9+1);
 | 
			
		||||
      strcpy(*drivingfile_str, rhs+9);
 | 
			
		||||
    }
 | 
			
		||||
    else{
 | 
			
		||||
      fprintf(stderr, "error: unrecognized driving force '%s'\n",rhs);
 | 
			
		||||
      return(-1);
 | 
			
		||||
@@ -603,6 +645,14 @@ _Complex double* set_driving(
 | 
			
		||||
    g_test(g, parameters.K1, parameters.K2);
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
  case DRIVING_FILE:
 | 
			
		||||
    init_file_bin(g, parameters.K1, parameters.K2, parameters.drivingfile);
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
  case DRIVING_FILE_TXT:
 | 
			
		||||
    init_file_txt(g, parameters.K1, parameters.K2, parameters.drivingfile);
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
  default:
 | 
			
		||||
    g_test(g, parameters.K1, parameters.K2);
 | 
			
		||||
    break;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user