From 0bf223bcb90f154a0e471af7638b25755b246c5f Mon Sep 17 00:00:00 2001 From: Ian Jauslin Date: Wed, 5 Apr 2023 20:33:38 -0400 Subject: Reversible equation --- src/main.c | 22 ++++++++++++--- src/navier-stokes.c | 77 +++++++++++++++++++++++++++++++++++++++++------------ src/navier-stokes.h | 17 ++++++------ 3 files changed, 87 insertions(+), 29 deletions(-) (limited to 'src') diff --git a/src/main.c b/src/main.c index 853f172..f60a38e 100644 --- a/src/main.c +++ b/src/main.c @@ -14,6 +14,7 @@ // structure to store parameters, to make it easier to pass parameters to CLI functions typedef struct nstrophy_parameters { + bool irreversible; int K1; int K2; int N1; @@ -120,13 +121,13 @@ int main ( // 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, parameters.starting_time, nthreads, savefile); + uk(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.nsteps, parameters.nu, parameters.delta, parameters.L, u0, g, parameters.irreversible, parameters.print_freq, parameters.starting_time, nthreads, savefile); } else if(command==COMMAND_EEA){ - eea(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.nsteps, parameters.nu, parameters.delta, parameters.L, u0, g, parameters.print_freq, parameters.starting_time, nthreads, savefile); + eea(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.nsteps, parameters.nu, parameters.delta, parameters.L, u0, g, parameters.irreversible, parameters.print_freq, parameters.starting_time, nthreads, savefile); } else if(command==COMMAND_QUIET){ - quiet(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.nsteps, parameters.nu, parameters.delta, parameters.L, u0, g, nthreads, savefile); + quiet(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.nsteps, parameters.nu, parameters.delta, parameters.L, u0, g, parameters.irreversible, nthreads, savefile); } else if(command==0){ fprintf(stderr, "error: no command specified\n"); @@ -337,6 +338,7 @@ int read_params( bool lhs=true; // defaults + parameters->irreversible=true; parameters->K1=16; parameters->K2=parameters->K1; //delta=2^-13 @@ -428,7 +430,19 @@ int set_parameter( ){ int ret; - if (strcmp(lhs,"K1")==0){ + if (strcmp(lhs,"equation")==0){ + if (strcmp(rhs,"irreversible")==0){ + parameters->irreversible=true; + } + else if (strcmp(rhs,"reversible")==0){ + parameters->irreversible=false; + } + else { + fprintf(stderr, "error: 'equation' should be 'irreversible' or 'reversible'\n got '%s'\n",rhs); + return(-1); + } + } + else if (strcmp(lhs,"K1")==0){ ret=sscanf(rhs,"%d",&(parameters->K1)); if(ret!=1){ fprintf(stderr, "error: parameter 'K1' should be an integer\n got '%s'\n",rhs); diff --git a/src/navier-stokes.c b/src/navier-stokes.c index 1980207..07eb343 100644 --- a/src/navier-stokes.c +++ b/src/navier-stokes.c @@ -15,6 +15,7 @@ int uk( double L, _Complex double* u0, _Complex double* g, + bool irreversible, unsigned int print_freq, unsigned int starting_time, unsigned int nthreads, @@ -48,7 +49,7 @@ int uk( // iterate for(t=starting_time;t +#include #include #define M_PI 3.14159265358979323846 @@ -13,13 +14,13 @@ typedef struct fft_vects { } fft_vect; // compute u_k -int uk( int K1, int K2, int N1, int N2, unsigned int nsteps, double nu, double delta, double L, _Complex double* u0, _Complex double* g, unsigned int print_freq, unsigned int starting_time, unsigned int nthreadsl, FILE* savefile); +int uk( int K1, int K2, int N1, int N2, unsigned int nsteps, double nu, double delta, double L, _Complex double* u0, _Complex double* g, bool irreversible, unsigned int print_freq, unsigned int starting_time, unsigned int nthreadsl, FILE* savefile); // compute energy, enstrophy and alpha -int eea( int K1, int K2, int N1, int N2, unsigned int nsteps, double nu, double delta, double L, _Complex double* u0, _Complex double* g, unsigned int print_freq, unsigned int starting_time, unsigned int nthreads, FILE* savefile); +int eea( int K1, int K2, int N1, int N2, unsigned int nsteps, double nu, double delta, double L, _Complex double* u0, _Complex double* g, bool irreversible, unsigned int print_freq, unsigned int starting_time, unsigned int nthreads, FILE* savefile); // compute solution as a function of time, but do not print anything (useful for debugging) -int quiet( int K1, int K2, int N1, int N2, unsigned int nsteps, double nu, double delta, double L, _Complex double* u0, _Complex double* g, unsigned int nthreads, FILE* savefile); +int quiet( int K1, int K2, int N1, int N2, unsigned int nsteps, double nu, double delta, double L, _Complex double* u0, _Complex double* g, bool irreversible, unsigned int nthreads, FILE* savefile); // initialize vectors for computation @@ -30,11 +31,11 @@ int ns_free_tmps( _Complex double* u, _Complex double* tmp1, _Complex double *tm // copy u0 to u int copy_u( _Complex double* u, _Complex double* u0, int K1, int K2); -// next time step for Irreversible Navier-Stokes equation -int ins_step( _Complex double* u, int K1, int K2, int N1, int N2, double nu, double delta, double L, _Complex double* g, fft_vect fft1, fft_vect fft2,fft_vect ifft, _Complex double* tmp1, _Complex double *tmp2, _Complex double *tmp3); +// next time step for Irreversible/reversible Navier-Stokes equation +int ns_step( _Complex double* u, int K1, int K2, int N1, int N2, double nu, double delta, double L, _Complex double* g, fft_vect fft1, fft_vect fft2,fft_vect ifft, _Complex double* tmp1, _Complex double *tmp2, _Complex double *tmp3, bool irreversible); -// right side of Irreversible Navier-Stokes equation -int ins_rhs( _Complex double* out, _Complex double* u, int K1, int K2, int N1, int N2, double nu, double L, _Complex double* g, fft_vect fft1, fft_vect fft2, fft_vect ifft); +// right side of Irreversible/reversible Navier-Stokes equation +int ns_rhs( _Complex double* out, _Complex double* u, int K1, int K2, int N1, int N2, double nu, double L, _Complex double* g, fft_vect fft1, fft_vect fft2, fft_vect ifft, bool irreversible); // convolution term in right side of equation int ns_T( _Complex double* u, int K1, int K2, int N1, int N2, fft_vect fft1, fft_vect fft2, fft_vect ifft); @@ -43,7 +44,7 @@ int ns_T( _Complex double* u, int K1, int K2, int N1, int N2, fft_vect fft1, fft int ns_T_nofft( _Complex double* out, _Complex double* u, int K1, int K2, int N1, int N2); // compute alpha -double compute_alpha( _Complex double* u, int K1, int K2, _Complex double* g); +double compute_alpha( _Complex double* u, int K1, int K2, int N1, int N2, _Complex double* g, double L, _Complex double* T); // compute energy double compute_energy( _Complex double* u, int K1, int K2); // compute enstrophy -- cgit v1.2.3-54-g00ecf