diff options
| author | Ian Jauslin <ian@jauslin.org> | 2022-05-26 15:05:30 -0400 | 
|---|---|---|
| committer | Ian Jauslin <ian@jauslin.org> | 2022-05-26 15:05:30 -0400 | 
| commit | d4254c6b8e6d4a94a5448e771d8a0620f266cf05 (patch) | |
| tree | e17fe36f330b12bb998ced2f9c27aee8cfb7cb89 /src/main.c | |
| parent | 8877b63549a3655fa778f10f0c484ec238f1cece (diff) | |
choose initial condition on cli
Diffstat (limited to 'src/main.c')
| -rw-r--r-- | src/main.c | 84 | 
1 files changed, 76 insertions, 8 deletions
| @@ -8,6 +8,7 @@  #include <stdbool.h>  #include "navier-stokes.h"  #include "driving.h" +#include "init.h"  // structure to store parameters, to make it easier to pass parameters to CLI functions  typedef struct nstrophy_parameters { @@ -20,16 +21,20 @@ typedef struct nstrophy_parameters {    double delta;    double L;    unsigned int print_freq; +  int seed;  } nstrophy_parameters;  // usage message  int print_usage();  // read command line arguments -int read_args(int argc, const char* argv[], char** params, unsigned int* driving_force, unsigned int* command, unsigned int* nthreads); +int read_args(int argc, const char* argv[], char** params, unsigned int* driving_force, unsigned int* command, unsigned int* init, unsigned int* nthreads);  int read_params(char* param_str, nstrophy_parameters* parameters);  int set_parameter(char* lhs, char* rhs, nstrophy_parameters* parameters, bool* setN1, bool* setN2); +// set initial condition +_Complex double* set_init(unsigned int init, nstrophy_parameters parameters); +  #define COMMAND_UK 1  #define COMMAND_ENSTROPHY 2  #define COMMAND_QUIET 3 @@ -38,6 +43,9 @@ int set_parameter(char* lhs, char* rhs, nstrophy_parameters* parameters, bool* s  #define DRIVING_ZERO 1  #define DRIVING_TEST 2 +#define INIT_RANDOM 1 +#define INIT_GAUSSIAN 2 +  int main (    int argc, @@ -47,22 +55,26 @@ int main (    nstrophy_parameters parameters;    _Complex double (*g)(int,int);    int ret; -  unsigned int driving,command; +  unsigned int driving,command,init;    unsigned int nthreads=1; +  _Complex double* u0;    command=0;    driving=0; +  init=0;    // read command line arguments -  ret=read_args(argc, argv, ¶m_str, &driving, &command, &nthreads); +  ret=read_args(argc, argv, ¶m_str, &driving, &init, &command, &nthreads);    if(ret<0){      return(-1);    } +    // read params    ret=read_params(param_str, ¶meters);    if(ret<0){      return(-1);    } +    // set driving force    switch(driving){    case DRIVING_ZERO: @@ -77,30 +89,35 @@ int main (      break;    } +  // set initial condition +  u0=set_init(init, parameters); +    // run command    if (command==COMMAND_UK){ -    uk(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.nsteps, parameters.nu, parameters.delta, parameters.L, g, parameters.print_freq, nthreads); +    uk(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.nsteps, parameters.nu, parameters.delta, parameters.L, u0, g, parameters.print_freq, nthreads);    }    else if (command==COMMAND_ENERGY){ -    energy(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.nsteps, parameters.nu, parameters.delta, parameters.L, g, parameters.print_freq, nthreads); +    energy(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.nsteps, parameters.nu, parameters.delta, parameters.L, u0, g, parameters.print_freq, nthreads);    }    else if(command==COMMAND_ENSTROPHY){ -    enstrophy(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.nsteps, parameters.nu, parameters.delta, parameters.L, g, parameters.print_freq, nthreads); +    enstrophy(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.nsteps, parameters.nu, parameters.delta, parameters.L, u0, g, parameters.print_freq, nthreads);    }    else if(command==COMMAND_QUIET){ -    quiet(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.nsteps, parameters.nu, parameters.delta, parameters.L, g, nthreads); +    quiet(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.nsteps, parameters.nu, parameters.delta, parameters.L, u0, g, nthreads);    }    else if(command==0){      fprintf(stderr, "error: no command specified\n");      print_usage();    } +  free(u0); +    return(0);  }  // usage message  int print_usage(){ -  fprintf(stderr, "usage:\n       nstrophy [-p parameters] [-g driving_force] <command>\n\n"); +  fprintf(stderr, "usage:\n       nstrophy [-t nthreads] [-p parameters] [-g driving_force] [-i initial_condition] <command>\n\n");    return(0);  } @@ -108,11 +125,13 @@ int print_usage(){  #define CP_FLAG_PARAMS 1  #define CP_FLAG_DRIVING 2  #define CP_FLAG_NTHREADS 3 +#define CP_FLAG_INIT 4  int read_args(    int argc,    const char* argv[],    char** params,    unsigned int* driving_force, +  unsigned int* init,    unsigned int* command,    unsigned int* nthreads  ){ @@ -138,6 +157,9 @@ int read_args(  	case 't':  	  flag=CP_FLAG_NTHREADS;  	  break; +	case 'i': +	  flag=CP_FLAG_INIT; +	  break;  	default:  	  fprintf(stderr, "unrecognized option '-%c'\n", *ptr);  	  print_usage(); @@ -174,6 +196,20 @@ int read_args(        }        flag=0;      } +    // initial condition +    else if(flag==CP_FLAG_INIT){ +      if (strcmp(argv[i],"random")==0){ +	*init=INIT_RANDOM; +      } +      else if (strcmp(argv[i],"gaussian")==0){ +	*init=INIT_GAUSSIAN; +      } +      else{ +	fprintf(stderr, "error: unrecognized initial condition '%s'\n",argv[i]); +	return(-1); +      } +      flag=0; +    }      // computation to run      else{        if(strcmp(argv[i], "uk")==0){ @@ -226,6 +262,7 @@ int read_params(    parameters->L=2*M_PI;    parameters->nsteps=10000000;    parameters->print_freq=1000; +  parameters->seed=17;    if (param_str!=NULL){      // init @@ -389,6 +426,13 @@ int set_parameter(        return(-1);      }    } +  else if (strcmp(lhs,"random_seed")==0){ +    ret=sscanf(rhs,"%d",&(parameters->seed)); +    if(ret!=1){ +      fprintf(stderr, "error: parameter 'random_seed' should be an integer\n       got '%s'\n",rhs); +      return(-1); +    } +  }    else{      fprintf(stderr, "error: unrecognized parameter '%s'\n",lhs);      return(-1); @@ -396,3 +440,27 @@ int set_parameter(    return(0);  } + +// set initial condition +_Complex double* set_init( +  unsigned int init, +  nstrophy_parameters parameters +){ +  _Complex double* u0=calloc(sizeof(_Complex double),(2*parameters.K1+1)*(2*parameters.K2+1)); + +  switch(init){ +  case INIT_RANDOM: +    init_random(u0, parameters.K1, parameters.K2, parameters.seed); +    break; + +  case INIT_GAUSSIAN: +    init_gaussian(u0, parameters.K1, parameters.K2); +    break; + +  default: +    init_gaussian(u0, parameters.K1, parameters.K2); +    break; +  } +   +  return u0; +} | 
