Fix interruption of lyapunov
This commit is contained in:
		
							
								
								
									
										22
									
								
								src/main.c
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								src/main.c
									
									
									
									
									
								
							@@ -85,7 +85,7 @@ _Complex double* set_driving(nstrophy_parameters parameters);
 | 
			
		||||
// set initial condition
 | 
			
		||||
_Complex double* set_init(nstrophy_parameters* parameters);
 | 
			
		||||
// set initial tangent flow for lyapunov exponents
 | 
			
		||||
int set_lyapunov_flow_init( double** lyapunov_flow0, double** lyapunov_avg0, nstrophy_parameters parameters);
 | 
			
		||||
int set_lyapunov_flow_init( double** lyapunov_flow0, double** lyapunov_avg0, double* lyapunov_prevtime, double* lyapunov_startingtime, nstrophy_parameters parameters);
 | 
			
		||||
 | 
			
		||||
// signal handler
 | 
			
		||||
void sig_handler (int signo);
 | 
			
		||||
@@ -121,6 +121,8 @@ int main (
 | 
			
		||||
  _Complex double *g;
 | 
			
		||||
  double* lyapunov_flow0;
 | 
			
		||||
  double* lyapunov_avg0;
 | 
			
		||||
  double lyapunov_prevtime;
 | 
			
		||||
  double lyapunov_startingtime;
 | 
			
		||||
  dstring savefile_str;
 | 
			
		||||
  dstring utfile_str;
 | 
			
		||||
  dstring initfile_str;
 | 
			
		||||
@@ -232,7 +234,7 @@ int main (
 | 
			
		||||
  u0=set_init(¶meters);
 | 
			
		||||
  // set initial condition for the lyapunov flow
 | 
			
		||||
  if (command==COMMAND_LYAPUNOV){
 | 
			
		||||
    set_lyapunov_flow_init(&lyapunov_flow0, &lyapunov_avg0, parameters);
 | 
			
		||||
    set_lyapunov_flow_init(&lyapunov_flow0, &lyapunov_avg0, &lyapunov_prevtime, &lyapunov_startingtime, parameters);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // if init_enstrophy is not set in the parameters, then compute it from the initial condition
 | 
			
		||||
@@ -315,7 +317,10 @@ int main (
 | 
			
		||||
    quiet(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.final_time, parameters.nu, parameters.delta, parameters.L, parameters.adaptive_tolerance, parameters.adaptive_factor, parameters.max_delta, parameters.adaptive_cost, parameters.starting_time, u0, g, parameters.irreversible, parameters.keep_en_cst, parameters.init_enstrophy, parameters.algorithm, nthreads, savefile);
 | 
			
		||||
  }
 | 
			
		||||
  else if(command==COMMAND_LYAPUNOV){
 | 
			
		||||
    lyapunov(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.final_time, parameters.lyapunov_reset, parameters.lyapunov_trigger, parameters.nu, parameters.delta, parameters.L, parameters.adaptive_tolerance, parameters.adaptive_factor, parameters.max_delta, parameters.adaptive_cost, u0, g, parameters.irreversible, parameters.keep_en_cst, parameters.init_enstrophy, parameters.algorithm, parameters.algorithm_lyapunov, parameters.starting_time, nthreads, lyapunov_flow0, lyapunov_avg0, savefile, utfile, (char*)argv[0], dstring_to_str_noinit(¶m_str), dstring_to_str_noinit(&savefile_str), dstring_to_str_noinit(&utfile_str));
 | 
			
		||||
    // register signal handler to handle aborts
 | 
			
		||||
    signal(SIGINT, sig_handler);
 | 
			
		||||
    signal(SIGTERM, sig_handler);
 | 
			
		||||
    lyapunov(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.final_time, parameters.lyapunov_reset, parameters.lyapunov_trigger, parameters.nu, parameters.delta, parameters.L, parameters.adaptive_tolerance, parameters.adaptive_factor, parameters.max_delta, parameters.adaptive_cost, u0, g, parameters.irreversible, parameters.keep_en_cst, parameters.init_enstrophy, parameters.algorithm, parameters.algorithm_lyapunov, parameters.starting_time, nthreads, lyapunov_flow0, lyapunov_avg0, lyapunov_prevtime, lyapunov_startingtime, savefile, utfile, (char*)argv[0], dstring_to_str_noinit(¶m_str), dstring_to_str_noinit(&savefile_str), dstring_to_str_noinit(&utfile_str));
 | 
			
		||||
  }
 | 
			
		||||
  else if(command==0){
 | 
			
		||||
    fprintf(stderr, "error: no command specified\n");
 | 
			
		||||
@@ -1170,6 +1175,8 @@ _Complex double* set_init(
 | 
			
		||||
int set_lyapunov_flow_init(
 | 
			
		||||
  double** lyapunov_flow0,
 | 
			
		||||
  double** lyapunov_avg0,
 | 
			
		||||
  double* lyapunov_prevtime,
 | 
			
		||||
  double* lyapunov_startingtime,
 | 
			
		||||
  nstrophy_parameters parameters
 | 
			
		||||
){
 | 
			
		||||
  *lyapunov_flow0=calloc(4*(parameters.K1*(2*parameters.K2+1)+parameters.K2)*(parameters.K1*(2*parameters.K2+1)+parameters.K2),sizeof(double));
 | 
			
		||||
@@ -1178,6 +1185,10 @@ int set_lyapunov_flow_init(
 | 
			
		||||
  if(parameters.init_flow_file){
 | 
			
		||||
    // read flow
 | 
			
		||||
    read_mat2_bin(*lyapunov_flow0, parameters.K1, parameters.K2, parameters.initfile);
 | 
			
		||||
    // read time of last QR decomposition
 | 
			
		||||
    fread(lyapunov_prevtime, sizeof(double), 1, parameters.initfile);
 | 
			
		||||
    // read time at which lyapunov computation was started
 | 
			
		||||
    fread(lyapunov_startingtime, sizeof(double), 1, parameters.initfile);
 | 
			
		||||
    // read averages
 | 
			
		||||
    read_vec2_bin(*lyapunov_avg0, parameters.K1, parameters.K2, parameters.initfile);
 | 
			
		||||
  } else {
 | 
			
		||||
@@ -1192,6 +1203,11 @@ int set_lyapunov_flow_init(
 | 
			
		||||
	}
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    // init prevtime
 | 
			
		||||
    *lyapunov_prevtime=parameters.starting_time;
 | 
			
		||||
    // init starting_time
 | 
			
		||||
    *lyapunov_startingtime=parameters.starting_time;
 | 
			
		||||
    // init averages
 | 
			
		||||
    for(i=0;i<2*(parameters.K1*(2*parameters.K2+1)+parameters.K2);i++){
 | 
			
		||||
      (*lyapunov_avg0)[i]=0;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user