Overhaul of lyapunov exponents
This commit is contained in:
		
							
								
								
									
										61
									
								
								src/main.c
									
									
									
									
									
								
							
							
						
						
									
										61
									
								
								src/main.c
									
									
									
									
									
								
							@@ -56,10 +56,12 @@ typedef struct nstrophy_parameters {
 | 
			
		||||
  unsigned int driving;
 | 
			
		||||
  unsigned int init;
 | 
			
		||||
  unsigned int algorithm;
 | 
			
		||||
  unsigned int algorithm_lyapunov;
 | 
			
		||||
  bool keep_en_cst;
 | 
			
		||||
  FILE* initfile;
 | 
			
		||||
  FILE* drivingfile;
 | 
			
		||||
  double lyapunov_reset;
 | 
			
		||||
  unsigned int lyapunov_trigger;
 | 
			
		||||
  double D_epsilon;
 | 
			
		||||
  bool print_alpha;
 | 
			
		||||
} nstrophy_parameters;
 | 
			
		||||
@@ -296,7 +298,7 @@ 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.nu, parameters.D_epsilon, 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.starting_time, nthreads);
 | 
			
		||||
    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);
 | 
			
		||||
  }
 | 
			
		||||
  else if(command==0){
 | 
			
		||||
    fprintf(stderr, "error: no command specified\n");
 | 
			
		||||
@@ -576,6 +578,9 @@ int set_default_params(
 | 
			
		||||
  parameters->initfile=NULL;
 | 
			
		||||
  parameters->algorithm=ALGORITHM_RK4;
 | 
			
		||||
  parameters->keep_en_cst=false;
 | 
			
		||||
  parameters->algorithm_lyapunov=ALGORITHM_RK4;
 | 
			
		||||
  // default lyapunov_reset will be print_time (set later) for now set target to 0 to indicate it hasn't been set explicitly
 | 
			
		||||
  parameters->lyapunov_trigger=0;
 | 
			
		||||
 | 
			
		||||
  parameters->print_alpha=false;
 | 
			
		||||
  
 | 
			
		||||
@@ -648,6 +653,12 @@ int read_params(
 | 
			
		||||
    parameters->N2=smallest_pow2(3*(parameters->K2));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // if lyapunov_reset or lyapunov_maxu are not set explicitly
 | 
			
		||||
  if(parameters->lyapunov_trigger==0){
 | 
			
		||||
    parameters->lyapunov_trigger=LYAPUNOV_TRIGGER_TIME;
 | 
			
		||||
    parameters->lyapunov_reset=parameters->print_freq;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return(0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -841,13 +852,6 @@ int set_parameter(
 | 
			
		||||
      return(-1);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  else if (strcmp(lhs,"lyapunov_reset")==0){
 | 
			
		||||
    ret=sscanf(rhs,"%lf",&(parameters->lyapunov_reset));
 | 
			
		||||
    if(ret!=1){
 | 
			
		||||
      fprintf(stderr, "error: parameter 'lyapunov_reset' should be a double\n       got '%s'\n",rhs);
 | 
			
		||||
      return(-1);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  else if (strcmp(lhs,"D_epsilon")==0){
 | 
			
		||||
    ret=sscanf(rhs,"%lf",&(parameters->D_epsilon));
 | 
			
		||||
    if(ret!=1){
 | 
			
		||||
@@ -940,6 +944,47 @@ int set_parameter(
 | 
			
		||||
    }
 | 
			
		||||
    parameters->print_alpha=(tmp==1);
 | 
			
		||||
  }
 | 
			
		||||
  else if (strcmp(lhs,"lyapunov_reset")==0){
 | 
			
		||||
    if(parameters->lyapunov_trigger==LYAPUNOV_TRIGGER_SIZE){
 | 
			
		||||
      fprintf(stderr, "error: cannot use 'lyapunov_reset' and 'lyapunov_maxu' in the same run:\n  'lyapunov_reset' is to be used to renormalize the tangent flow at fixed times, 'lyapunov_maxu' is to be used to renormalize the tangent flow when the matrix exceeds a certain size.");
 | 
			
		||||
      return(-1);
 | 
			
		||||
    }
 | 
			
		||||
    parameters->lyapunov_trigger=LYAPUNOV_TRIGGER_TIME;
 | 
			
		||||
    ret=sscanf(rhs,"%lf",&(parameters->lyapunov_reset));
 | 
			
		||||
    if(ret!=1){
 | 
			
		||||
      fprintf(stderr, "error: parameter 'lyapunov_reset' should be a double\n       got '%s'\n",rhs);
 | 
			
		||||
      return(-1);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  else if (strcmp(lhs,"lyapunov_maxu")==0){
 | 
			
		||||
    if(parameters->lyapunov_trigger==LYAPUNOV_TRIGGER_TIME){
 | 
			
		||||
      fprintf(stderr, "error: cannot use 'lyapunov_maxu' and 'lyapunov_reset' in the same run:\n  'lyapunov_reset' is to be used to renormalize the tangent flow at fixed times, 'lyapunov_maxu' is to be used to renormalize the tangent flow when the matrix exceeds a certain size.");
 | 
			
		||||
      return(-1);
 | 
			
		||||
    }
 | 
			
		||||
    parameters->lyapunov_trigger=LYAPUNOV_TRIGGER_SIZE;
 | 
			
		||||
    ret=sscanf(rhs,"%lf",&(parameters->lyapunov_reset));
 | 
			
		||||
    if(ret!=1){
 | 
			
		||||
      fprintf(stderr, "error: parameter 'lyapunov_maxu' should be a double\n       got '%s'\n",rhs);
 | 
			
		||||
      return(-1);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  // algorithm for tangent flow (for lyapunov)
 | 
			
		||||
  else if (strcmp(lhs,"algorithm_lyapunov")==0){
 | 
			
		||||
    if (strcmp(rhs,"RK4")==0){
 | 
			
		||||
      parameters->algorithm_lyapunov=ALGORITHM_RK4;
 | 
			
		||||
    }
 | 
			
		||||
    else if (strcmp(rhs,"RK2")==0){
 | 
			
		||||
      parameters->algorithm_lyapunov=ALGORITHM_RK2;
 | 
			
		||||
    }
 | 
			
		||||
    else if (strcmp(rhs,"RKF45")==0 || strcmp(rhs,"RKDP45")==0 || strcmp(rhs,"RKBS32")==0){
 | 
			
		||||
      fprintf(stderr, "error: cannot use an adaptove step algorithm for the tangent flow (Lyapunov exponents); must be one of 'RK4' or 'RK2', got:'%s'\n",rhs);
 | 
			
		||||
      return(-1);
 | 
			
		||||
    }
 | 
			
		||||
    else{
 | 
			
		||||
      fprintf(stderr, "error: unrecognized algorithm '%s'\n",rhs);
 | 
			
		||||
      return(-1);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  else{
 | 
			
		||||
    fprintf(stderr, "error: unrecognized parameter '%s'\n",lhs);
 | 
			
		||||
    return(-1);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user