Fix interruption of lyapunov
This commit is contained in:
@ -52,6 +52,8 @@ int lyapunov(
|
||||
unsigned int nthreads,
|
||||
double* flow0,
|
||||
double* lyapunov_avg0,
|
||||
double prevtime, // the previous time at which a QR decomposition was performed
|
||||
double lyapunov_startingtime, // the time at which the lyapunov exponent computation was started (useful in interrupted computation)
|
||||
FILE* savefile,
|
||||
FILE* utfile,
|
||||
// for interrupt recovery
|
||||
@ -105,9 +107,6 @@ int lyapunov(
|
||||
double step=delta;
|
||||
double next_step=step;
|
||||
|
||||
// save times at which Lyapunov exponents are computed
|
||||
double prevtime=starting_time;
|
||||
|
||||
// iterate
|
||||
time=starting_time;
|
||||
while(final_time<0 || time<final_time){
|
||||
@ -155,8 +154,8 @@ int lyapunov(
|
||||
// average lyapunov
|
||||
for(i=0; i<MATSIZE; i++){
|
||||
// exclude inf
|
||||
if((! isinf(lyapunov[i])) && (time>starting_time)){
|
||||
lyapunov_avg[i]=lyapunov_avg[i]*(prevtime-starting_time)/(time-starting_time)+lyapunov[i]*(time-prevtime)/(time-starting_time);
|
||||
if((! isinf(lyapunov[i])) && (time>lyapunov_startingtime)){
|
||||
lyapunov_avg[i]=lyapunov_avg[i]*(prevtime-lyapunov_startingtime)/(time-lyapunov_startingtime)+lyapunov[i]*(time-prevtime)/(time-lyapunov_startingtime);
|
||||
}
|
||||
}
|
||||
|
||||
@ -176,20 +175,20 @@ int lyapunov(
|
||||
|
||||
// reset prevtime
|
||||
prevtime=time;
|
||||
}
|
||||
|
||||
// catch abort signal
|
||||
if (g_abort){
|
||||
// print u to stderr if no savefile
|
||||
if (savefile==NULL){
|
||||
savefile=stderr;
|
||||
}
|
||||
break;
|
||||
// catch abort signal
|
||||
if (g_abort){
|
||||
// print u to stderr if no savefile
|
||||
if (savefile==NULL){
|
||||
savefile=stderr;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(savefile!=NULL){
|
||||
lyapunov_save_state(flow, u, lyapunov_avg, savefile, K1, K2, cmd_string, params_string, savefile_string, utfile_string, utfile, COMMAND_LYAPUNOV, algorithm, step, time, nthreads);
|
||||
lyapunov_save_state(flow, u, lyapunov_avg, prevtime, lyapunov_startingtime, savefile, K1, K2, cmd_string, params_string, savefile_string, utfile_string, utfile, COMMAND_LYAPUNOV, algorithm, step, time, nthreads);
|
||||
}
|
||||
|
||||
// save final u to utfile in txt format
|
||||
@ -781,6 +780,8 @@ int lyapunov_save_state(
|
||||
double* flow,
|
||||
_Complex double* u,
|
||||
double* lyapunov_avg,
|
||||
double prevtime,
|
||||
double lyapunov_startingtime,
|
||||
FILE* savefile,
|
||||
int K1,
|
||||
int K2,
|
||||
@ -801,6 +802,10 @@ int lyapunov_save_state(
|
||||
if(savefile!=stderr && savefile!=stdout){
|
||||
// save tangent flow
|
||||
write_mat2_bin(flow,K1,K2,savefile);
|
||||
// save time of QR decomposition
|
||||
fwrite(&prevtime, sizeof(double), 1, savefile);
|
||||
// save time at which the lyapunov computation started
|
||||
fwrite(&lyapunov_startingtime, sizeof(double), 1, savefile);
|
||||
// save lyapunov averages
|
||||
write_vec2_bin(lyapunov_avg,K1,K2,savefile);
|
||||
}
|
||||
|
Reference in New Issue
Block a user