Fix running averages for adaptive step, and base print_freq and final_time on times

This commit is contained in:
2023-05-16 00:00:18 -04:00
parent 5db3680b31
commit 5ede4f1084
6 changed files with 90 additions and 157 deletions

View File

@@ -23,7 +23,6 @@ limitations under the License.
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>
#include <errno.h>
#include "constants.cpp"
@@ -42,15 +41,14 @@ typedef struct nstrophy_parameters {
int K2;
int N1;
int N2;
unsigned int nsteps;
double final_time;
double nu;
double delta;
double L;
double adaptive_tolerance;
double adaptive_factor;
uint64_t print_freq;
double print_freq;
int seed;
uint64_t starting_step;
double starting_time;
unsigned int driving;
unsigned int init;
@@ -67,7 +65,7 @@ int print_params(nstrophy_parameters parameters, char* initfile_str, char* drivi
// read command line arguments
int read_args(int argc, const char* argv[], char** params, unsigned int* command, unsigned int* nthreads, char** savefile_str);
int read_params(char* param_str, nstrophy_parameters* parameters, char** initfile_str, char** drivingfile_str);
int set_parameter(char* lhs, char* rhs, nstrophy_parameters* parameters, bool* setN1, bool* setN2, bool* set_starting_time, char** initfile_str, char** drivingfile_str);
int set_parameter(char* lhs, char* rhs, nstrophy_parameters* parameters, bool* setN1, bool* setN2, char** initfile_str, char** drivingfile_str);
// set driving force
_Complex double* set_driving(nstrophy_parameters parameters);
@@ -172,15 +170,15 @@ 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, parameters.adaptive_tolerance, parameters.adaptive_factor, u0, g, parameters.irreversible, parameters.algorithm, parameters.print_freq, parameters.starting_step, parameters.starting_time, nthreads, savefile);
uk(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.final_time, parameters.nu, parameters.delta, parameters.L, parameters.adaptive_tolerance, parameters.adaptive_factor, u0, g, parameters.irreversible, parameters.algorithm, parameters.print_freq, parameters.starting_time, nthreads, savefile);
}
else if(command==COMMAND_ENSTROPHY){
// register signal handler to handle aborts
signal(SIGINT, sig_handler);
enstrophy(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.nsteps, parameters.nu, parameters.delta, parameters.L, parameters.adaptive_tolerance, parameters.adaptive_factor, u0, g, parameters.irreversible, parameters.algorithm, parameters.print_freq, parameters.starting_step, parameters.starting_time, nthreads, savefile, (char*)argv[0], param_str, savefile_str);
enstrophy(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.final_time, parameters.nu, parameters.delta, parameters.L, parameters.adaptive_tolerance, parameters.adaptive_factor, u0, g, parameters.irreversible, parameters.algorithm, parameters.print_freq, parameters.starting_time, nthreads, savefile, (char*)argv[0], param_str, savefile_str);
}
else if(command==COMMAND_QUIET){
quiet(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.nsteps, parameters.nu, parameters.delta, parameters.L, parameters.adaptive_tolerance, parameters.adaptive_factor, parameters.starting_step, u0, g, parameters.irreversible, parameters.algorithm, nthreads, savefile);
quiet(parameters.K1, parameters.K2, parameters.N1, parameters.N2, parameters.final_time, parameters.nu, parameters.delta, parameters.L, parameters.adaptive_tolerance, parameters.adaptive_factor, parameters.starting_time, u0, g, parameters.irreversible, parameters.algorithm, nthreads, savefile);
}
else if(command==0){
fprintf(stderr, "error: no command specified\n");
@@ -377,7 +375,6 @@ int read_params(
// whether N was set explicitly
bool setN1=false;
bool setN2=false;
bool set_starting_time=false;
// whether lhs (false is rhs)
bool lhs=true;
@@ -393,10 +390,9 @@ int read_params(
parameters->L=2*M_PI;
parameters->adaptive_tolerance=1e-11;
parameters->adaptive_factor=0.9;
parameters->nsteps=10000000;
parameters->print_freq=1000;
parameters->final_time=100000;
parameters->print_freq=1;
parameters->starting_time=0;
parameters->starting_step=0;
parameters->seed=17;
parameters->driving=DRIVING_TEST;
parameters->drivingfile=NULL;
@@ -423,7 +419,7 @@ int read_params(
break;
case ';':
//set parameter
ret=set_parameter(buffer_lhs, buffer_rhs, parameters, &setN1, &setN2, &set_starting_time, initfile_str, drivingfile_str);
ret=set_parameter(buffer_lhs, buffer_rhs, parameters, &setN1, &setN2, initfile_str, drivingfile_str);
if(ret<0){
return ret;
}
@@ -450,7 +446,7 @@ int read_params(
// set last param
if (*param_str!='\0'){
ret=set_parameter(buffer_lhs, buffer_rhs, parameters, &setN1, &setN2, &set_starting_time, initfile_str, drivingfile_str);
ret=set_parameter(buffer_lhs, buffer_rhs, parameters, &setN1, &setN2, initfile_str, drivingfile_str);
if(ret<0){
return ret;
}
@@ -469,10 +465,6 @@ int read_params(
parameters->N2=smallest_pow2(3*(parameters->K2));
}
// if starting_time not set explicitly and algorithm is not adaptive, set it to delta*starting_step
if (!set_starting_time && parameters->algorithm<ALGORITHM_ADAPTIVE_THRESHOLD){
parameters->starting_time=parameters->delta*parameters->starting_step;
}
return(0);
}
@@ -484,7 +476,6 @@ int set_parameter(
nstrophy_parameters* parameters,
bool* setN1,
bool* setN2,
bool* set_starting_time,
char** initfile_str,
char** drivingfile_str
){
@@ -557,10 +548,10 @@ int set_parameter(
*setN1=true;
*setN2=true;
}
else if (strcmp(lhs,"nsteps")==0){
ret=sscanf(rhs,"%u",&(parameters->nsteps));
else if (strcmp(lhs,"final_time")==0){
ret=sscanf(rhs,"%lf",&(parameters->final_time));
if(ret!=1){
fprintf(stderr, "error: parameter 'nsteps' should be an unsigned integer\n got '%s'\n",rhs);
fprintf(stderr, "error: parameter 'final_time' should be a double\n got '%s'\n",rhs);
return(-1);
}
}
@@ -600,9 +591,9 @@ int set_parameter(
}
}
else if (strcmp(lhs,"print_freq")==0){
ret=sscanf(rhs,"%lu",&(parameters->print_freq));
ret=sscanf(rhs,"%lf",&(parameters->print_freq));
if(ret!=1){
fprintf(stderr, "error: parameter 'print_freq' should be an unsigned integer\n got '%s'\n",rhs);
fprintf(stderr, "error: parameter 'print_freq' should be a double\n got '%s'\n",rhs);
return(-1);
}
}
@@ -613,20 +604,12 @@ int set_parameter(
return(-1);
}
}
else if (strcmp(lhs,"starting_step")==0){
ret=sscanf(rhs,"%lu",&(parameters->starting_step));
if(ret!=1){
fprintf(stderr, "error: parameter 'starting_step' should be a long unsigned integer\n got '%s'\n",rhs);
return(-1);
}
}
else if (strcmp(lhs,"starting_time")==0){
ret=sscanf(rhs,"%lf",&(parameters->starting_time));
if(ret!=1){
fprintf(stderr, "error: parameter 'starting_time' should be a double\n got '%s'\n",rhs);
return(-1);
}
*set_starting_time=true;
}
else if (strcmp(lhs,"driving")==0){
if (strcmp(rhs,"zero")==0){
@@ -747,11 +730,11 @@ _Complex double* set_init(
case INIT_FILE:
init_file_bin(u0, parameters->K1, parameters->K2, parameters->initfile);
// read start time
fread(&(parameters->starting_time), sizeof(double), 1, parameters->initfile);
if(parameters->algorithm>ALGORITHM_ADAPTIVE_THRESHOLD){
// read delta
fread(&(parameters->delta), sizeof(double), 1, parameters->initfile);
// read start time
fread(&(parameters->starting_time), sizeof(double), 1, parameters->initfile);
}
break;