From d4254c6b8e6d4a94a5448e771d8a0620f266cf05 Mon Sep 17 00:00:00 2001 From: Ian Jauslin Date: Thu, 26 May 2022 15:05:30 -0400 Subject: choose initial condition on cli --- src/main.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 76 insertions(+), 8 deletions(-) (limited to 'src/main.c') diff --git a/src/main.c b/src/main.c index 531b9b5..27ed314 100644 --- a/src/main.c +++ b/src/main.c @@ -8,6 +8,7 @@ #include #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] \n\n"); + fprintf(stderr, "usage:\n nstrophy [-t nthreads] [-p parameters] [-g driving_force] [-i initial_condition] \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; +} -- cgit v1.2.3-54-g00ecf