From b35be9ea88dd3d28710f213afb3f63b7748ce5a6 Mon Sep 17 00:00:00 2001 From: Ian Jauslin Date: Mon, 24 Apr 2023 12:22:29 -0400 Subject: Allow driving to be specified by file --- src/driving.c | 23 ++++++++++++++++++++ src/driving.h | 6 +++++ src/main.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++--------- 3 files changed, 89 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/driving.c b/src/driving.c index c329848..7920d45 100644 --- a/src/driving.c +++ b/src/driving.c @@ -1,5 +1,6 @@ #include "driving.h" #include "navier-stokes.h" +#include "io.h" #include // test driving function @@ -35,3 +36,25 @@ int g_zero( return 0; } + +// From file +// txt input +int driving_file_txt ( + _Complex double* g, + int K1, + int K2, + FILE* file +){ + read_vec(g, K1, K2, file); + return 0; +} +// binary input +int driving_file_bin ( + _Complex double* g, + int K1, + int K2, + FILE* file +){ + read_vec_bin(g, K1, K2, file); + return 0; +} diff --git a/src/driving.h b/src/driving.h index 1d07812..05523c0 100644 --- a/src/driving.h +++ b/src/driving.h @@ -1,7 +1,13 @@ #ifndef DRIVING_H #define DRIVING_H +#include + int g_zero(_Complex double* g, int K1, int K2); int g_test(_Complex double* g, int K1, int K2); +// From file +int driving_file_txt ( _Complex double* g, int K1, int K2, FILE* file); +int driving_file_bin ( _Complex double* g, int K1, int K2, FILE* file); + #endif diff --git a/src/main.c b/src/main.c index 54a2c6a..7b3cdf2 100644 --- a/src/main.c +++ b/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; -- cgit v1.2.3-54-g00ecf