From c00c3115284691e98d724e630aca7a41087502eb Mon Sep 17 00:00:00 2001 From: Ian Jauslin Date: Wed, 12 Apr 2023 19:05:01 -0400 Subject: Write restart command to savefile --- src/io.c | 39 +++++++++++++++++++++++++++++++++++++++ src/io.h | 3 +++ src/main.c | 13 +++++++++++-- src/navier-stokes.c | 31 +++++++++++++++++++++++++++---- src/navier-stokes.h | 2 +- 5 files changed, 81 insertions(+), 7 deletions(-) diff --git a/src/io.c b/src/io.c index 94816f9..cb14029 100644 --- a/src/io.c +++ b/src/io.c @@ -1,5 +1,6 @@ #include #include +#include #include "io.h" #include "navier-stokes.h" @@ -113,3 +114,41 @@ int read_u(_Complex double* u, int K1, int K2, FILE* file){ return 0; } + +// remove an entry from params string (inplace) +int remove_entry( + char* param_str, + char* entry +){ + char* ptr; + char* rw_ptr; + char* bfr; + char* entry_ptr=entry; + int go=1; + + for(ptr=param_str, rw_ptr=ptr; *ptr!='\0'; ptr++){ + for(bfr=ptr,entry_ptr=entry; *bfr==*entry_ptr; bfr++, entry_ptr++){ + // check if reached end of entry + if(*(bfr+1)=='=' && *(entry_ptr+1)=='\0'){ + go=0; + break; + } + } + if(go==1){ + *rw_ptr=*ptr; + rw_ptr++; + } + //reset + if(*ptr==';'){ + go=1; + } + } + *rw_ptr='\0'; + + // remove trailing ';' + if (param_str[strlen(param_str)-1]==';'){ + *(param_str+(strlen(param_str)-1))='\0'; + } + + return 0; +} diff --git a/src/io.h b/src/io.h index 6a35707..27110b7 100644 --- a/src/io.h +++ b/src/io.h @@ -9,4 +9,7 @@ int write_u(_Complex double* u, int K1, int K2, FILE* file); // read u from file int read_u(_Complex double* u, int K1, int K2, FILE* file); +// remove an entry from params string (inplace) +int remove_entry(char* param_str, char* entry); + #endif diff --git a/src/main.c b/src/main.c index 059755f..6ccb9f4 100644 --- a/src/main.c +++ b/src/main.c @@ -13,6 +13,8 @@ #include "init.h" #include "int_tools.h" +#include "io.h" + // structure to store parameters, to make it easier to pass parameters to CLI functions typedef struct nstrophy_parameters { double init_en; // initial value for the energy for ins and enstrophy for rns @@ -135,6 +137,11 @@ int main ( print_params(parameters, initfile_str, stderr); print_params(parameters, initfile_str, stdout); + // free initfile_str + if(initfile_str!=NULL){ + free(initfile_str); + } + // 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.irreversible, parameters.print_freq, parameters.starting_time, nthreads, savefile); @@ -142,7 +149,7 @@ int main ( else if(command==COMMAND_EEA){ // register signal handler to handle aborts signal(SIGINT, sig_handler); - eea(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.nsteps, parameters.nu, parameters.delta, parameters.L, u0, g, parameters.irreversible, parameters.print_freq, parameters.avg_window, parameters.starting_time, nthreads, savefile); + eea(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.nsteps, parameters.nu, parameters.delta, parameters.L, u0, g, parameters.irreversible, parameters.print_freq, parameters.avg_window, parameters.starting_time, nthreads, savefile, (char*)argv[0], param_str, savefile_str); } else if(command==COMMAND_QUIET){ quiet(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.nsteps, parameters.nu, parameters.delta, parameters.L, u0, g, parameters.irreversible, nthreads, savefile); @@ -217,6 +224,7 @@ int print_params( return 0; } + // read command line arguments #define CP_FLAG_PARAMS 1 #define CP_FLAG_NTHREADS 2 @@ -570,7 +578,8 @@ int set_parameter( // matches any argument that starts with 'file:' else if (strncmp(rhs,"file:",5)==0){ parameters->init=INIT_FILE; - *initfile_str=(char*)rhs+5; + *initfile_str=calloc(sizeof(char), strlen(rhs)-5); + strcpy(*initfile_str, rhs+5); } else{ fprintf(stderr, "error: unrecognized initial condition '%s'\n",rhs); diff --git a/src/navier-stokes.c b/src/navier-stokes.c index 0fe4407..5cee434 100644 --- a/src/navier-stokes.c +++ b/src/navier-stokes.c @@ -2,6 +2,7 @@ #include "io.h" #include #include +#include // compute solution as a function of time int uk( @@ -93,7 +94,11 @@ int eea( unsigned int running_avg_window, unsigned int starting_time, unsigned int nthreads, - FILE* savefile + FILE* savefile, + // for interrupt recovery + char* cmd_string, + char* params_string, + char* savefile_string ){ _Complex double* u; _Complex double* tmp1; @@ -186,9 +191,9 @@ int eea( avg_print_short_en+=enstrophy/short_len; } - if(t % print_freq ==0 && t>0){ + if(t % print_freq ==0 && t>starting_time){ // compute averages - if (t > running_avg_window) { + if (t > running_avg_window + starting_time) { avg_e=save_print_short_e[nr_print_in_window]*((double)short_len/running_avg_window); avg_a=save_print_short_a[nr_print_in_window]*((double)short_len/running_avg_window); avg_en=save_print_short_en[nr_print_in_window]*((double)short_len/running_avg_window); @@ -226,7 +231,7 @@ int eea( } } - if(t>running_avg_window && t%print_freq==0){ + if(t>running_avg_window + starting_time && t%print_freq==0){ fprintf(stderr,"%d % .8e % .8e % .8e % .8e % .8e % .8e % .8e\n",t,t*delta, avg_a, avg_e, avg_en, alpha, energy, enstrophy); printf("%8d % .15e % .15e % .15e % .15e % .15e % .15e % .15e\n",t,t*delta, avg_a, avg_e, avg_en, alpha, energy, enstrophy); } @@ -237,6 +242,24 @@ int eea( if (savefile==NULL){ savefile=stderr; } + fprintf(savefile,"# Interrupted computation. Resume with\n"); + // command to resume + fprintf(savefile,"#! "); + + fprintf(savefile, cmd_string); + + // params + // allocate buffer for params + char* params=calloc(sizeof(char), strlen(params_string)); + strcpy(params, params_string); + remove_entry(params, "starting_time"); + remove_entry(params, "init"); + remove_entry(params, "nsteps"); + fprintf(savefile," -p \"%s;starting_time=%u;nsteps=%u;init=file:%s\"", params, t+1, nsteps-t-1, savefile_string); + free(params); + + fprintf(savefile," energy\n"); + break; } } diff --git a/src/navier-stokes.h b/src/navier-stokes.h index 293be0d..66178b9 100644 --- a/src/navier-stokes.h +++ b/src/navier-stokes.h @@ -20,7 +20,7 @@ typedef struct fft_vects { int uk( int K1, int K2, int N1, int N2, unsigned int nsteps, double nu, double delta, double L, _Complex double* u0, _Complex double* g, bool irreversible, unsigned int print_freq, unsigned int starting_time, unsigned int nthreadsl, FILE* savefile); // compute energy, enstrophy and alpha -int eea( int K1, int K2, int N1, int N2, unsigned int nsteps, double nu, double delta, double L, _Complex double* u0, _Complex double* g, bool irreversible, unsigned int print_freq, unsigned int running_avg_window, unsigned int starting_time, unsigned int nthreads, FILE* savefile); +int eea( int K1, int K2, int N1, int N2, unsigned int nsteps, double nu, double delta, double L, _Complex double* u0, _Complex double* g, bool irreversible, unsigned int print_freq, unsigned int running_avg_window, unsigned int starting_time, unsigned int nthreads, FILE* savefile, char* cmd_string, char* params_string, char* savefile_string); // compute solution as a function of time, but do not print anything (useful for debugging) int quiet( int K1, int K2, int N1, int N2, unsigned int nsteps, double nu, double delta, double L, _Complex double* u0, _Complex double* g, bool irreversible, unsigned int nthreads, FILE* savefile); -- cgit v1.2.3-54-g00ecf