choose initial condition on cli
This commit is contained in:
84
src/main.c
84
src/main.c
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user