From 0cdb914b5764f692189ed2bc395e3b09ead758e4 Mon Sep 17 00:00:00 2001 From: Ian Jauslin Date: Fri, 27 May 2022 16:09:17 -0400 Subject: savefile and initfile --- src/main.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 71 insertions(+), 12 deletions(-) (limited to 'src/main.c') diff --git a/src/main.c b/src/main.c index e4152f0..92c53b9 100644 --- a/src/main.c +++ b/src/main.c @@ -6,6 +6,7 @@ #include #include #include +#include #include "navier-stokes.h" #include "driving.h" #include "init.h" @@ -28,17 +29,17 @@ typedef struct nstrophy_parameters { // usage message int print_usage(); // print parameters -int print_params(nstrophy_parameters parameters, unsigned int driving, unsigned int init, FILE* file); +int print_params(nstrophy_parameters parameters, unsigned int driving, unsigned int init, char* initfile_str, FILE* file); // read command line arguments -int read_args(int argc, const char* argv[], char** params, unsigned int* driving_force, unsigned int* command, unsigned int* init, unsigned int* nthreads); +int read_args(int argc, const char* argv[], char** params, unsigned int* driving_force, unsigned int* command, unsigned int* init, unsigned int* nthreads, char** savefile_str, char** initfile_str); int read_params(char* param_str, nstrophy_parameters* parameters); int set_parameter(char* lhs, char* rhs, nstrophy_parameters* parameters, bool* setN1, bool* setN2); // set driving force _Complex double* set_driving(unsigned int driving, nstrophy_parameters parameters); // set initial condition -_Complex double* set_init(unsigned int init, nstrophy_parameters parameters); +_Complex double* set_init(unsigned int init, nstrophy_parameters parameters, FILE* initfile); #define COMMAND_UK 1 #define COMMAND_EEA 2 @@ -49,6 +50,7 @@ _Complex double* set_init(unsigned int init, nstrophy_parameters parameters); #define INIT_RANDOM 1 #define INIT_GAUSSIAN 2 +#define INIT_FILE 3 int main ( @@ -62,13 +64,17 @@ int main ( unsigned int nthreads=1; _Complex double* u0; _Complex double *g; + char* savefile_str=NULL; + char* initfile_str=NULL; + FILE* savefile=NULL; + FILE* initfile=NULL; command=0; driving=0; init=0; // read command line arguments - ret=read_args(argc, argv, ¶m_str, &driving, &init, &command, &nthreads); + ret=read_args(argc, argv, ¶m_str, &driving, &init, &command, &nthreads, &savefile_str, &initfile_str); if(ret<0){ return(-1); } @@ -79,24 +85,47 @@ int main ( return(-1); } + // open initfile + if(initfile_str!=NULL){ + initfile=fopen(initfile_str,"r"); + if(initfile==NULL){ + fprintf(stderr,"Error opening file '%s' for reading: %s\n", initfile_str, strerror(errno)); + return(-1); + } + } + // set driving force g=set_driving(driving, parameters); // set initial condition - u0=set_init(init, parameters); + u0=set_init(init, parameters, initfile); + + // close initfile (do this early, so that it is possible to use the same file for init and save) + if (initfile!=NULL){ + fclose(initfile); + } + + // open savefile (do this after closing init file) + if(savefile_str!=NULL){ + savefile=fopen(savefile_str,"w"); + if(savefile==NULL){ + fprintf(stderr,"Error opening file '%s' for writing: %s\n", savefile_str, strerror(errno)); + return(-1); + } + } // print parameters - print_params(parameters, driving, init, stderr); - print_params(parameters, driving, init, stdout); + print_params(parameters, driving, init, initfile_str, stderr); + print_params(parameters, driving, init, initfile_str, stdout); // run command if (command==COMMAND_UK){ - uk(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.nsteps, parameters.nu, parameters.delta, parameters.L, u0, g, parameters.print_freq, nthreads); + uk(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.nsteps, parameters.nu, parameters.delta, parameters.L, u0, g, parameters.print_freq, nthreads, savefile); } else if(command==COMMAND_EEA){ - eea(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.nsteps, parameters.nu, parameters.delta, parameters.L, u0, g, parameters.print_freq, nthreads); + eea(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.nsteps, parameters.nu, parameters.delta, parameters.L, u0, g, parameters.print_freq, nthreads, savefile); } else if(command==COMMAND_QUIET){ - quiet(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.nsteps, parameters.nu, parameters.delta, parameters.L, u0, g, nthreads); + quiet(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.nsteps, parameters.nu, parameters.delta, parameters.L, u0, g, nthreads, savefile); } else if(command==0){ fprintf(stderr, "error: no command specified\n"); @@ -106,6 +135,11 @@ int main ( free(g); free(u0); + // close savefile + if (savefile!=NULL){ + fclose(savefile); + } + return(0); } @@ -120,6 +154,7 @@ int print_params( nstrophy_parameters parameters, unsigned int driving, unsigned int init, + char* initfile_str, FILE* file ){ fprintf(file,"# K1=%d, K2=%d, N1=%d, N2=%d, nu=%.15e, delta=%.15e, L=%.15e", parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.nu, parameters.delta, parameters.L); @@ -143,6 +178,9 @@ int print_params( case INIT_GAUSSIAN: fprintf(file,", init=gaussian"); break; + case INIT_FILE: + fprintf(file,", init=file:%s", initfile_str); + break; default: fprintf(file,", init=gaussian"); break; @@ -158,6 +196,7 @@ int print_params( #define CP_FLAG_DRIVING 2 #define CP_FLAG_NTHREADS 3 #define CP_FLAG_INIT 4 +#define CP_FLAG_SAVEFILE 5 int read_args( int argc, const char* argv[], @@ -165,7 +204,9 @@ int read_args( unsigned int* driving_force, unsigned int* init, unsigned int* command, - unsigned int* nthreads + unsigned int* nthreads, + char** savefile_str, + char** initfile_str ){ int i; int ret; @@ -192,6 +233,9 @@ int read_args( case 'i': flag=CP_FLAG_INIT; break; + case 's': + flag=CP_FLAG_SAVEFILE; + break; default: fprintf(stderr, "unrecognized option '-%c'\n", *ptr); print_usage(); @@ -236,12 +280,22 @@ int read_args( else if (strcmp(argv[i],"gaussian")==0){ *init=INIT_GAUSSIAN; } + // matches any argument that starts with 'file:' + else if (strncmp(argv[i],"file:",5)==0){ + *init=INIT_FILE; + *initfile_str=(char*)argv[i]+5; + } else{ fprintf(stderr, "error: unrecognized initial condition '%s'\n",argv[i]); return(-1); } flag=0; } + // savefile + else if(flag==CP_FLAG_SAVEFILE){ + *savefile_str=(char*)argv[i]; + flag=0; + } // computation to run else{ if(strcmp(argv[i], "uk")==0){ @@ -495,7 +549,8 @@ _Complex double* set_driving( // set initial condition _Complex double* set_init( unsigned int init, - nstrophy_parameters parameters + nstrophy_parameters parameters, + FILE* initfile ){ _Complex double* u0=calloc(sizeof(_Complex double),(2*parameters.K1+1)*(2*parameters.K2+1)); @@ -508,6 +563,10 @@ _Complex double* set_init( init_gaussian(u0, parameters.K1, parameters.K2); break; + case INIT_FILE: + init_file(u0, parameters.K1, parameters.K2, initfile); + break; + default: init_gaussian(u0, parameters.K1, parameters.K2); break; -- cgit v1.2.3-54-g00ecf