From 5884e649202f2e7a30fd0a40150dfa5bced5babb Mon Sep 17 00:00:00 2001 From: "Penn, John M 047828115" Date: Mon, 5 Oct 2020 14:16:50 -0500 Subject: [PATCH] Refactoring: eliminate assumption that independent variable is time. #1058 --- .../DoubleIntegral/DoubleIntegral.cpp | 8 +- .../SAIntegrator/include/SAIntegrator.hh | 52 +++--- .../SAIntegrator/src/SAIntegrator.cpp | 164 +++++++++--------- .../unittest/SAIntegrator_unittest.cc | 17 +- 4 files changed, 125 insertions(+), 116 deletions(-) diff --git a/trick_source/trick_utils/SAIntegrator/examples/DoubleIntegral/DoubleIntegral.cpp b/trick_source/trick_utils/SAIntegrator/examples/DoubleIntegral/DoubleIntegral.cpp index 33e5480b..91822b07 100644 --- a/trick_source/trick_utils/SAIntegrator/examples/DoubleIntegral/DoubleIntegral.cpp +++ b/trick_source/trick_utils/SAIntegrator/examples/DoubleIntegral/DoubleIntegral.cpp @@ -21,8 +21,8 @@ void deriv_x( double x, double state_x[], double derivs_x[], void* udata) { SA::RK2Integrator* integ_y = context->integ; integ_y->set_in_vars(state_y); integ_y->set_out_vars(state_y); - integ_y->setTime(context->start); - while (integ_y->getTime() <= context->end) { + integ_y->setIndyVar(context->start); + while (integ_y->getIndyVar() <= context->end) { integ_y->load(); integ_y->step(); integ_y->unload(); @@ -38,8 +38,8 @@ double doubleIntegral( double x_start, double x_end, double y_start, double y_en SA::RK2Integrator integ_y (dy, 2, NULL, NULL, deriv_y, NULL); IContext y_integ_context = {&integ_y, y_start, y_end}; SA::RK2Integrator integ_x (dx, 1, state_x, state_x, deriv_x, &y_integ_context); - integ_x.setTime(x_start); - while (integ_x.getTime()<=x_end) { // x-end + integ_x.setIndyVar(x_start); + while (integ_x.getIndyVar()<=x_end) { integ_x.load(); integ_x.step(); integ_x.unload(); diff --git a/trick_source/trick_utils/SAIntegrator/include/SAIntegrator.hh b/trick_source/trick_utils/SAIntegrator/include/SAIntegrator.hh index f58b170c..41f41614 100644 --- a/trick_source/trick_utils/SAIntegrator/include/SAIntegrator.hh +++ b/trick_source/trick_utils/SAIntegrator/include/SAIntegrator.hh @@ -3,20 +3,22 @@ namespace SA { class Integrator { protected: - double time; - double default_dt; - void * udata; + double indyVar; // Independent Variable + double default_h; // Default step-size + void * udata; // User data public: - Integrator(double dt, void* user_data): time(0.0), default_dt(dt), udata(user_data) {}; + Integrator(double h, void* user_data): indyVar(0.0), default_h(h), udata(user_data) {}; virtual ~Integrator() {} - virtual void step() { time += default_dt; }; // Integrate over implicit (default) time step (default: default_dt) + virtual void step() { indyVar += default_h; }; // Integrate over default step-size (default_h) virtual void load() = 0; virtual void unload() = 0; - double getTime() {return time;} - void setTime(double t) {time = t;} + double getIndyVar() {return indyVar;} + void setIndyVar(double t) {indyVar = t;} + double getTime() {return indyVar;} + void setTime(double t) {indyVar = t;} }; - typedef void (*derivsFunc)( double t, double state[], double derivs[], void* user_data); + typedef void (*derivsFunc)( double x, double state[], double derivs[], void* user_data); class FirstOrderODEIntegrator : public Integrator { protected: @@ -28,10 +30,10 @@ namespace SA { derivsFunc derivs_func; bool reset; - double last_dt; // What was the last step-size? For undo_step(). + double last_h; // What was the last step-size? For undo_step(). public: - FirstOrderODEIntegrator( double dt, int N, double* in_vars[], double* out_vars[], derivsFunc func, void* user_data); + FirstOrderODEIntegrator( double h, int N, double* in_vars[], double* out_vars[], derivsFunc func, void* user_data); ~FirstOrderODEIntegrator(); virtual void undo_step(); void load(); @@ -43,17 +45,17 @@ namespace SA { class FirstOrderODEVariableStepIntegrator : public FirstOrderODEIntegrator { public: - FirstOrderODEVariableStepIntegrator( double dt, int N, double* in_vars[], double* out_vars[], derivsFunc func, void* user_data); + FirstOrderODEVariableStepIntegrator( double h, int N, double* in_vars[], double* out_vars[], derivsFunc func, void* user_data); using Integrator::step; - virtual void step( double dt ); + virtual void step( double h ); }; class EulerIntegrator : public FirstOrderODEVariableStepIntegrator { public: double *derivs; - EulerIntegrator( double dt, int N, double* in_vars[], double* out_vars[], derivsFunc derivs_func, void* user_data); + EulerIntegrator( double h, int N, double* in_vars[], double* out_vars[], derivsFunc derivs_func, void* user_data); ~EulerIntegrator(); - void step( double dt); + void step( double h); void step(); }; @@ -62,9 +64,9 @@ namespace SA { double *wstate; double *derivs[2]; - HeunsMethod( double dt, int N, double* in_vars[], double* out_vars[], derivsFunc derivs_func, void* user_data); + HeunsMethod( double h, int N, double* in_vars[], double* out_vars[], derivsFunc derivs_func, void* user_data); ~HeunsMethod(); - void step( double dt); + void step( double h); void step(); }; @@ -73,9 +75,9 @@ namespace SA { double *wstate; double *derivs[2]; - RK2Integrator( double dt, int N, double* in_vars[], double* out_vars[], derivsFunc derivs_func, void* user_data); + RK2Integrator( double h, int N, double* in_vars[], double* out_vars[], derivsFunc derivs_func, void* user_data); ~RK2Integrator(); - void step( double dt); + void step( double h); void step(); }; @@ -84,9 +86,9 @@ namespace SA { double *wstate[3]; double *derivs[4]; - RK4Integrator( double dt, int N, double* in_vars[], double* out_vars[], derivsFunc derivs_func, void* user_data); + RK4Integrator( double h, int N, double* in_vars[], double* out_vars[], derivsFunc derivs_func, void* user_data); ~RK4Integrator(); - void step( double dt); + void step( double h); void step(); }; @@ -96,9 +98,9 @@ namespace SA { double *wstate[4]; double *derivs[4]; - RK3_8Integrator( double dt, int N, double* in_vars[], double* out_vars[], derivsFunc derivs_func, void* user_data); + RK3_8Integrator( double h, int N, double* in_vars[], double* out_vars[], derivsFunc derivs_func, void* user_data); ~RK3_8Integrator(); - void step( double dt); + void step( double h); void step(); }; @@ -137,7 +139,7 @@ namespace SA { // unsigned int currentHistorySize; // // public: - // ABMIntegrator(int history_size, double dt, int N, double* in_vars[], double* out_vars[], derivsFunc derivs_func, void* user_data); + // ABMIntegrator(int history_size, double h, int N, double* in_vars[], double* out_vars[], derivsFunc derivs_func, void* user_data); // ~ABMIntegrator(); // void step(); // void undo_step(); @@ -154,7 +156,7 @@ namespace SA { FirstOrderODEVariableStepIntegrator* priming_integrator; public: - ABM2Integrator( double dt, int N, double* in_vars[], double* out_vars[], derivsFunc derivs_func, void* user_data); + ABM2Integrator( double h, int N, double* in_vars[], double* out_vars[], derivsFunc derivs_func, void* user_data); ~ABM2Integrator(); void step(); void undo_step(); @@ -171,7 +173,7 @@ namespace SA { FirstOrderODEVariableStepIntegrator* priming_integrator; public: - ABM4Integrator( double dt, int N, double* in_vars[], double* out_vars[], derivsFunc derivs_func, void* user_data); + ABM4Integrator( double h, int N, double* in_vars[], double* out_vars[], derivsFunc derivs_func, void* user_data); ~ABM4Integrator(); void step(); void undo_step(); diff --git a/trick_source/trick_utils/SAIntegrator/src/SAIntegrator.cpp b/trick_source/trick_utils/SAIntegrator/src/SAIntegrator.cpp index 7e1abf85..e9ae2659 100644 --- a/trick_source/trick_utils/SAIntegrator/src/SAIntegrator.cpp +++ b/trick_source/trick_utils/SAIntegrator/src/SAIntegrator.cpp @@ -5,8 +5,8 @@ // ------------------------------------------------------------ -SA::FirstOrderODEIntegrator::FirstOrderODEIntegrator(double dt, int N, double* in_vars[], double* out_vars[], derivsFunc func, void* user_data) -: Integrator(dt, user_data) { +SA::FirstOrderODEIntegrator::FirstOrderODEIntegrator(double h, int N, double* in_vars[], double* out_vars[], derivsFunc func, void* user_data) +: Integrator(h, user_data) { state_size = N; orig_vars = in_vars; dest_vars = out_vars; @@ -49,45 +49,45 @@ void SA::FirstOrderODEIntegrator::undo_step() { for (int i=0 ; i -void deriv4( double t, double state[], double derivs[], void* udata) { +void deriv4( double t, + double state[] __attribute__((unused)), + double derivs[], + void* udata __attribute__((unused))) { double t2 = t*t; double t3 = t2*t; - derivs[0] = 3.0*t3 - 3.0*t2 - 3.0*t + 4.0; derivs[1] = 2.0*t3 + 1.0*t2 - 5.0*t + 7.0; derivs[2] = t3 + t2 + 5.0*t + 4.0; derivs[3] = t3 - 6.0*t2 + 4.0*t + 12.0; } -void deriv2( double t, double state[], double derivs[], void* udata) { +void deriv2( double t, + double state[] __attribute__((unused)), + double derivs[], + void* udata __attribute__((unused))) { derivs[0] = -2.0*t + 3.0; derivs[1] = 5.0*t + 4.0; @@ -21,8 +26,10 @@ void deriv2( double t, double state[], double derivs[], void* udata) { derivs[3] = 5.0*t + 4.0; } -void deriv1( double t, double state[], double derivs[], void* udata) { - +void deriv1( double t __attribute__((unused)), + double state[] __attribute__((unused)), + double derivs[], + void* udata __attribute__((unused))) { derivs[0] = 4.0; derivs[1] = -4.0; derivs[2] = M_PI;