Ian Jauslin
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Jauslin <ian.jauslin@rutgers.edu>2023-04-12 19:05:01 -0400
committerIan Jauslin <ian.jauslin@rutgers.edu>2023-04-12 19:05:01 -0400
commitc00c3115284691e98d724e630aca7a41087502eb (patch)
treee1f7f43d7c9a08bd2cb4e1ebace506cf2478d0fc
parent0b0894839d190eaba30fa5497838c9a201a21d83 (diff)
Write restart command to savefile
-rw-r--r--src/io.c39
-rw-r--r--src/io.h3
-rw-r--r--src/main.c13
-rw-r--r--src/navier-stokes.c31
-rw-r--r--src/navier-stokes.h2
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 <stdbool.h>
#include <stdlib.h>
+#include <string.h>
#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 <math.h>
#include <stdlib.h>
+#include <string.h>
// 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);