88#include < complex>
99#include < vector>
1010
11- #include < pfasst/encap/imex .hpp>
11+ #include < pfasst/encap/imex_sweeper .hpp>
1212#include " fft.hpp"
1313
1414#define pi 3.1415926535897932385
@@ -20,7 +20,7 @@ using pfasst::encap::Encapsulation;
2020
2121
2222template <typename scalar, typename time>
23- class AdvectionDiffusionSweeper : public pfasst ::imex::IMEX <scalar,time> {
23+ class AdvectionDiffusionSweeper : public pfasst ::encap::IMEXSweeper <scalar,time> {
2424
2525 using dvector = pfasst::encap::VectorEncapsulation<scalar,time>;
2626 FFT<scalar,time> fft;
@@ -30,6 +30,7 @@ class AdvectionDiffusionSweeper : public pfasst::imex::IMEX<scalar,time> {
3030 scalar v = 1.0 ;
3131 time t0 = 1.0 ;
3232 scalar nu = 0.02 ;
33+ int nf1evals = 0 ;
3334
3435public:
3536
@@ -42,7 +43,11 @@ class AdvectionDiffusionSweeper : public pfasst::imex::IMEX<scalar,time> {
4243 ddx[i] = complex <scalar>(0.0 , 1.0 ) * kx;
4344 lap[i] = (kx*kx < 1e-13 ) ? 0.0 : -kx*kx;
4445 }
46+ }
4547
48+ ~AdvectionDiffusionSweeper ()
49+ {
50+ cout << " number of f1 evals: " << nf1evals << endl;
4651 }
4752
4853 void exact (Encapsulation<scalar,time>* q, scalar t)
@@ -66,7 +71,7 @@ class AdvectionDiffusionSweeper : public pfasst::imex::IMEX<scalar,time> {
6671 }
6772 }
6873
69- void echo_error (time t)
74+ void echo_error (time t, bool predict= false )
7075 {
7176 auto & qend = *dynamic_cast <dvector*>(this ->get_state (this ->get_nodes ().size ()-1 ));
7277 auto qex = dvector (qend.size ());
@@ -79,18 +84,18 @@ class AdvectionDiffusionSweeper : public pfasst::imex::IMEX<scalar,time> {
7984 if (d > max)
8085 max = d;
8186 }
82- cout << " err: " << scientific << max << " (" << qend.size () << " )" << endl;
87+ cout << " err: " << scientific << max << " (" << qend.size () << " , " << predict << " )" << endl;
8388 }
8489
85- void predict (time t, time dt)
90+ void predict (time t, time dt, bool initial )
8691 {
87- pfasst::imex::IMEX <scalar,time>::predict (t, dt);
88- echo_error (t+dt);
92+ pfasst::encap::IMEXSweeper <scalar,time>::predict (t, dt, initial );
93+ echo_error (t+dt, true );
8994 }
9095
9196 void sweep (time t, time dt)
9297 {
93- pfasst::imex::IMEX <scalar,time>::sweep (t, dt);
98+ pfasst::encap::IMEXSweeper <scalar,time>::sweep (t, dt);
9499 echo_error (t+dt);
95100 }
96101
@@ -105,6 +110,8 @@ class AdvectionDiffusionSweeper : public pfasst::imex::IMEX<scalar,time> {
105110 for (int i=0 ; i<q.size (); i++)
106111 z[i] *= c * ddx[i];
107112 fft.backward (f);
113+
114+ nf1evals++;
108115 }
109116
110117 void f2eval (Encapsulation<scalar,time> *F, Encapsulation<scalar,time> *Q, time t)
0 commit comments