// { dg-do assemble }
|
// { dg-do assemble }
|
// Gets ICE 40.
|
// Gets ICE 40.
|
|
|
#include
|
#include
|
#include
|
#include
|
#include
|
#include
|
|
|
using namespace std;
|
using namespace std;
|
|
|
class ODEsolver
|
class ODEsolver
|
{
|
{
|
private:
|
private:
|
void eulerODE(vector& y, double& t, double& dt);
|
void eulerODE(vector& y, double& t, double& dt);
|
void midpointODE(vector& y, double& t, double& dt);
|
void midpointODE(vector& y, double& t, double& dt);
|
|
|
protected:
|
protected:
|
void (ODEsolver::*useMethod)(vector&, double&, double&);
|
void (ODEsolver::*useMethod)(vector&, double&, double&);
|
void init();
|
void init();
|
|
|
public:
|
public:
|
ODEsolver();
|
ODEsolver();
|
void timeloop(vector& y, double ts, double te, double dt);
|
void timeloop(vector& y, double ts, double te, double dt);
|
};
|
};
|
|
|
|
|
ODEsolver::ODEsolver()
|
ODEsolver::ODEsolver()
|
{
|
{
|
init();
|
init();
|
}
|
}
|
|
|
|
|
void ODEsolver::eulerODE(vector& y, double& t, double& dt)
|
void ODEsolver::eulerODE(vector& y, double& t, double& dt)
|
{
|
{
|
y[0] = dt * 2.;
|
y[0] = dt * 2.;
|
}
|
}
|
|
|
void ODEsolver::midpointODE(vector& y, double& t, double& dt)
|
void ODEsolver::midpointODE(vector& y, double& t, double& dt)
|
{
|
{
|
y[0] = dt * 3.;
|
y[0] = dt * 3.;
|
}
|
}
|
|
|
|
|
|
|
void ODEsolver::init()
|
void ODEsolver::init()
|
{
|
{
|
ODEsolver::useMethod = &ODEsolver::midpointODE;
|
ODEsolver::useMethod = &ODEsolver::midpointODE;
|
}
|
}
|
|
|
void ODEsolver::timeloop(vector& y, double ts, double te, double dt)
|
void ODEsolver::timeloop(vector& y, double ts, double te, double dt)
|
{
|
{
|
(ODEsolver::useMethod)(y,ts,dt); // { dg-error "" } should use this->*
|
(ODEsolver::useMethod)(y,ts,dt); // { dg-error "" } should use this->*
|
}
|
}
|
|
|
int main (int nargs, char** args)
|
int main (int nargs, char** args)
|
{
|
{
|
ODEsolver solver;
|
ODEsolver solver;
|
vector y(2); double t_start=5.; double t_end=7.; double dt=2.;
|
vector y(2); double t_start=5.; double t_end=7.; double dt=2.;
|
solver.timeloop(y,t_start,t_end,dt);
|
solver.timeloop(y,t_start,t_end,dt);
|
cout << y[0] << endl;
|
cout << y[0] << endl;
|
return(0);
|
return(0);
|
}
|
}
|
|
|