Ian Jauslin
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIan Jauslin <ian@jauslin.org>2022-05-26 14:25:45 -0400
committerIan Jauslin <ian@jauslin.org>2022-05-26 14:25:45 -0400
commit8877b63549a3655fa778f10f0c484ec238f1cece (patch)
treed285461542b398a58ddfc2aa8f5a7be2b7d1178f /src
parent11af4a8ece4b6c313ddea3d1600d0c2bc871fe64 (diff)
use parameters struct for CLI parsing
Diffstat (limited to 'src')
-rw-r--r--src/main.c118
1 files changed, 55 insertions, 63 deletions
diff --git a/src/main.c b/src/main.c
index 3c617a3..531b9b5 100644
--- a/src/main.c
+++ b/src/main.c
@@ -9,14 +9,26 @@
#include "navier-stokes.h"
#include "driving.h"
+// structure to store parameters, to make it easier to pass parameters to CLI functions
+typedef struct nstrophy_parameters {
+ int K1;
+ int K2;
+ int N1;
+ int N2;
+ unsigned int nsteps;
+ double nu;
+ double delta;
+ double L;
+ unsigned int print_freq;
+} 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_params(char* params, int* K1, int* K2, int* N1, int* N2, unsigned int* nsteps, double* nu, double* delta, double* L, unsigned int* print_freq);
-int set_parameter(char* lhs, char* rhs, int* K1, int* K2, int* N1, int* N2, unsigned int* nsteps, double* nu, double* delta, double* L, unsigned int* print_freq, bool* setN1, bool* setN2);
-
+int read_params(char* param_str, nstrophy_parameters* parameters);
+int set_parameter(char* lhs, char* rhs, nstrophy_parameters* parameters, bool* setN1, bool* setN2);
#define COMMAND_UK 1
#define COMMAND_ENSTROPHY 2
@@ -31,27 +43,23 @@ int main (
int argc,
const char* argv[]
){
- char* params=NULL;
- int K1,K2;
- int N1,N2;
- unsigned int nsteps;
- double nu,delta,L;
+ char* param_str=NULL;
+ nstrophy_parameters parameters;
_Complex double (*g)(int,int);
int ret;
unsigned int driving,command;
- unsigned int print_freq;
unsigned int nthreads=1;
command=0;
driving=0;
// read command line arguments
- ret=read_args(argc, argv, &params, &driving, &command, &nthreads);
+ ret=read_args(argc, argv, &param_str, &driving, &command, &nthreads);
if(ret<0){
return(-1);
}
// read params
- ret=read_params(params, &K1, &K2, &N1, &N2, &nsteps, &nu, &delta, &L, &print_freq);
+ ret=read_params(param_str, &parameters);
if(ret<0){
return(-1);
}
@@ -71,16 +79,16 @@ int main (
// run command
if (command==COMMAND_UK){
- uk(K1, K2, N1, N2, nsteps, nu, delta, L, g, print_freq, nthreads);
+ uk(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.nsteps, parameters.nu, parameters.delta, parameters.L, g, parameters.print_freq, nthreads);
}
else if (command==COMMAND_ENERGY){
- energy(K1, K2, N1, N2, nsteps, nu, delta, L, g, print_freq, nthreads);
+ energy(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.nsteps, parameters.nu, parameters.delta, parameters.L, g, parameters.print_freq, nthreads);
}
else if(command==COMMAND_ENSTROPHY){
- enstrophy(K1, K2, N1, N2, nsteps, nu, delta, L, g, print_freq, nthreads);
+ enstrophy(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.nsteps, parameters.nu, parameters.delta, parameters.L, g, parameters.print_freq, nthreads);
}
else if(command==COMMAND_QUIET){
- quiet(K1, K2, N1, N2, nsteps, nu, delta, L, g, nthreads);
+ quiet(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.nsteps, parameters.nu, parameters.delta, parameters.L, g, nthreads);
}
else if(command==0){
fprintf(stderr, "error: no command specified\n");
@@ -193,16 +201,8 @@ int read_args(
// read parameters string
int read_params(
- char* params,
- int* K1,
- int* K2,
- int* N1,
- int* N2,
- unsigned int* nsteps,
- double* nu,
- double* delta,
- double* L,
- unsigned int* print_freq
+ char* param_str,
+ nstrophy_parameters* parameters
){
int ret;
// pointer in params
@@ -217,26 +217,26 @@ int read_params(
bool lhs=true;
// defaults
- *K1=16;
- *K2=*K1;
+ parameters->K1=16;
+ parameters->K2=parameters->K1;
//delta=2^-13
- *delta=0.0001220703125;
+ parameters->delta=0.0001220703125;
//nu=2^-11
- *nu=0.00048828125;
- *L=2*M_PI;
- *nsteps=10000000;
- *print_freq=1000;
+ parameters->nu=0.00048828125;
+ parameters->L=2*M_PI;
+ parameters->nsteps=10000000;
+ parameters->print_freq=1000;
- if (params!=NULL){
+ if (param_str!=NULL){
// init
- buffer_lhs=calloc(sizeof(char),strlen(params));
+ buffer_lhs=calloc(sizeof(char),strlen(param_str));
lhs_ptr=buffer_lhs;
*lhs_ptr='\0';
- buffer_rhs=calloc(sizeof(char),strlen(params));
+ buffer_rhs=calloc(sizeof(char),strlen(param_str));
rhs_ptr=buffer_rhs;
*rhs_ptr='\0';
- for(ptr=params;*ptr!='\0';ptr++){
+ for(ptr=param_str;*ptr!='\0';ptr++){
switch(*ptr){
case '=':
// reset buffer
@@ -246,7 +246,7 @@ int read_params(
break;
case ';':
//set parameter
- ret=set_parameter(buffer_lhs,buffer_rhs,K1,K2,N1,N2,nsteps,nu,delta,L,print_freq,&setN1,&setN2);
+ ret=set_parameter(buffer_lhs, buffer_rhs, parameters, &setN1, &setN2);
if(ret<0){
return ret;
}
@@ -272,8 +272,8 @@ int read_params(
}
// set last param
- if (*params!='\0'){
- ret=set_parameter(buffer_lhs,buffer_rhs,K1,K2,N1,N2,nsteps,nu,delta,L,print_freq,&setN1,&setN2);
+ if (*param_str!='\0'){
+ ret=set_parameter(buffer_lhs, buffer_rhs, parameters, &setN1, &setN2);
if(ret<0){
return ret;
}
@@ -286,10 +286,10 @@ int read_params(
// if N not set explicitly, set it
if (!setN1){
- *N1=4*(*K1)+1;
+ parameters->N1=4*(parameters->K1)+1;
}
if (!setN2){
- *N2=4*(*K2)+1;
+ parameters->N2=4*(parameters->K2)+1;
}
return(0);
@@ -300,44 +300,36 @@ int read_params(
int set_parameter(
char* lhs,
char* rhs,
- int* K1,
- int* K2,
- int* N1,
- int* N2,
- unsigned int* nsteps,
- double* nu,
- double* delta,
- double* L,
- unsigned int* print_freq,
+ nstrophy_parameters* parameters,
bool* setN1,
bool* setN2
){
int ret;
if (strcmp(lhs,"K1")==0){
- ret=sscanf(rhs,"%d",K1);
+ ret=sscanf(rhs,"%d",&(parameters->K1));
if(ret!=1){
fprintf(stderr, "error: parameter 'K1' should be an integer\n got '%s'\n",rhs);
return(-1);
}
}
else if (strcmp(lhs,"K2")==0){
- ret=sscanf(rhs,"%d",K2);
+ ret=sscanf(rhs,"%d",&(parameters->K2));
if(ret!=1){
fprintf(stderr, "error: parameter 'K2' should be an integer\n got '%s'\n",rhs);
return(-1);
}
}
else if (strcmp(lhs,"K")==0){
- ret=sscanf(rhs,"%d",K1);
+ ret=sscanf(rhs,"%d",&(parameters->K1));
if(ret!=1){
fprintf(stderr, "error: parameter 'K' should be an integer\n got '%s'\n",rhs);
return(-1);
}
- *K2=*K1;
+ parameters->K2=parameters->K1;
}
else if (strcmp(lhs,"N1")==0){
- ret=sscanf(rhs,"%d",N1);
+ ret=sscanf(rhs,"%d",&(parameters->N1));
if(ret!=1){
fprintf(stderr, "error: parameter 'N1' should be an integer\n got '%s'\n",rhs);
return(-1);
@@ -345,7 +337,7 @@ int set_parameter(
*setN1=true;
}
else if (strcmp(lhs,"N2")==0){
- ret=sscanf(rhs,"%d",N2);
+ ret=sscanf(rhs,"%d",&(parameters->N2));
if(ret!=1){
fprintf(stderr, "error: parameter 'N2' should be an integer\n got '%s'\n",rhs);
return(-1);
@@ -353,45 +345,45 @@ int set_parameter(
*setN2=true;
}
else if (strcmp(lhs,"N")==0){
- ret=sscanf(rhs,"%d",N1);
+ ret=sscanf(rhs,"%d",&(parameters->N1));
if(ret!=1){
fprintf(stderr, "error: parameter 'N' should be an integer\n got '%s'\n",rhs);
return(-1);
}
- *N2=*N1;
+ parameters->N2=parameters->N1;
*setN1=true;
*setN2=true;
}
else if (strcmp(lhs,"nsteps")==0){
- ret=sscanf(rhs,"%u",nsteps);
+ ret=sscanf(rhs,"%u",&(parameters->nsteps));
if(ret!=1){
fprintf(stderr, "error: parameter 'nsteps' should be an unsigned integer\n got '%s'\n",rhs);
return(-1);
}
}
else if (strcmp(lhs,"nu")==0){
- ret=sscanf(rhs,"%lf",nu);
+ ret=sscanf(rhs,"%lf",&(parameters->nu));
if(ret!=1){
fprintf(stderr, "error: parameter 'nu' should be a double\n got '%s'\n",rhs);
return(-1);
}
}
else if (strcmp(lhs,"delta")==0){
- ret=sscanf(rhs,"%lf",delta);
+ ret=sscanf(rhs,"%lf",&(parameters->delta));
if(ret!=1){
fprintf(stderr, "error: parameter 'delta' should be a double\n got '%s'\n",rhs);
return(-1);
}
}
else if (strcmp(lhs,"L")==0){
- ret=sscanf(rhs,"%lf",L);
+ ret=sscanf(rhs,"%lf",&(parameters->L));
if(ret!=1){
fprintf(stderr, "error: parameter 'L' should be a double\n got '%s'\n",rhs);
return(-1);
}
}
else if (strcmp(lhs,"print_freq")==0){
- ret=sscanf(rhs,"%u",print_freq);
+ ret=sscanf(rhs,"%u",&(parameters->print_freq));
if(ret!=1){
fprintf(stderr, "error: parameter 'print_freq' should be an unsigned integer\n got '%s'\n",rhs);
return(-1);