Make N be the smallest power of 2 larger than 3*K+1
This commit is contained in:
		
							
								
								
									
										51
									
								
								src/main.c
									
									
									
									
									
								
							
							
						
						
									
										51
									
								
								src/main.c
									
									
									
									
									
								
							@@ -9,6 +9,7 @@
 | 
			
		||||
#include "navier-stokes.h"
 | 
			
		||||
#include "driving.h"
 | 
			
		||||
#include "init.h"
 | 
			
		||||
#include "int_tools.h"
 | 
			
		||||
 | 
			
		||||
// structure to store parameters, to make it easier to pass parameters to CLI functions
 | 
			
		||||
typedef struct nstrophy_parameters {
 | 
			
		||||
@@ -26,6 +27,8 @@ typedef struct nstrophy_parameters {
 | 
			
		||||
 | 
			
		||||
// usage message
 | 
			
		||||
int print_usage();
 | 
			
		||||
// print parameters
 | 
			
		||||
int print_params(nstrophy_parameters parameters, unsigned int driving, unsigned int init, FILE* file);
 | 
			
		||||
 | 
			
		||||
// read command line arguments
 | 
			
		||||
int read_args(int argc, const char* argv[], char** params, unsigned int* driving_force, unsigned int* command, unsigned int* init, unsigned int* nthreads);
 | 
			
		||||
@@ -82,6 +85,10 @@ int main (
 | 
			
		||||
  // set initial condition
 | 
			
		||||
  u0=set_init(init, parameters);
 | 
			
		||||
 | 
			
		||||
  // print parameters
 | 
			
		||||
  print_params(parameters, driving, init, stderr);
 | 
			
		||||
  print_params(parameters, driving, init, stdout);
 | 
			
		||||
 | 
			
		||||
  // 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.print_freq, nthreads);
 | 
			
		||||
@@ -112,6 +119,44 @@ int print_usage(){
 | 
			
		||||
  return(0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// print parameters
 | 
			
		||||
int print_params(
 | 
			
		||||
  nstrophy_parameters parameters,
 | 
			
		||||
  unsigned int driving,
 | 
			
		||||
  unsigned int init,
 | 
			
		||||
  FILE* file
 | 
			
		||||
){
 | 
			
		||||
  fprintf(file,"# K1=%d, K2=%d, N1=%d, N2=%d, nu=%.15e, delta=%.15e, L=%.15e", parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.nu, parameters.delta, parameters.L);
 | 
			
		||||
 | 
			
		||||
  switch(driving){
 | 
			
		||||
  case DRIVING_TEST:
 | 
			
		||||
    fprintf(file,", driving=test");
 | 
			
		||||
    break;
 | 
			
		||||
  case DRIVING_ZERO:
 | 
			
		||||
    fprintf(file,", driving=zero");
 | 
			
		||||
    break;
 | 
			
		||||
  default:
 | 
			
		||||
    fprintf(file,", driving=test");
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  switch(init){
 | 
			
		||||
  case INIT_RANDOM:
 | 
			
		||||
    fprintf(file,", init=random");
 | 
			
		||||
    break;
 | 
			
		||||
  case INIT_GAUSSIAN:
 | 
			
		||||
    fprintf(file,", init=gaussian");
 | 
			
		||||
    break;
 | 
			
		||||
  default:
 | 
			
		||||
    fprintf(file,", init=gaussian");
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fprintf(file,"\n");
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// read command line arguments
 | 
			
		||||
#define CP_FLAG_PARAMS 1
 | 
			
		||||
#define CP_FLAG_DRIVING 2
 | 
			
		||||
@@ -312,12 +357,12 @@ int read_params(
 | 
			
		||||
    free(buffer_rhs);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // if N not set explicitly, set it
 | 
			
		||||
  // if N not set explicitly, set it to the smallest power of 2 that is >3*K+1 (the fft is faster on vectors whose length is a power of 2)
 | 
			
		||||
  if (!setN1){
 | 
			
		||||
    parameters->N1=4*(parameters->K1)+1;
 | 
			
		||||
    parameters->N1=smallest_pow2(3*(parameters->K1));
 | 
			
		||||
  }
 | 
			
		||||
  if (!setN2){
 | 
			
		||||
    parameters->N2=4*(parameters->K2)+1;
 | 
			
		||||
    parameters->N2=smallest_pow2(3*(parameters->K2));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return(0);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user