55#define PFASST_ENABLE_GNUPLOT
66
77#include < algorithm>
8- #include < cmath>
98#include < complex>
9+ #include < cmath>
1010#include < map>
11+ #include < tuple>
1112
1213#include < pfasst.hpp>
1314#include < pfasst-imex.hpp>
@@ -35,7 +36,7 @@ typedef double scalar;
3536
3637using namespace std ;
3738using pfasst::encap::Encapsulation;
38- using dvector = pfasst::encap::VectorEncapsulation<double ,double >;
39+ using dvector = pfasst::encap::VectorEncapsulation<scalar ,double >;
3940
4041//
4142// fft helper
@@ -102,7 +103,7 @@ class ADIMEX : public pfasst::imex::IMEX<time> {
102103 vector<complex <scalar>> ddx, lap;
103104
104105 scalar v = 1.0 ;
105- scalar t0 = 1.0 ;
106+ time t0 = 1.0 ;
106107 scalar nu = 0.02 ;
107108
108109public:
@@ -191,7 +192,7 @@ class ADIMEX : public pfasst::imex::IMEX<time> {
191192 fft.backward (f);
192193 }
193194
194- void f2comp (Encapsulation<scalar> *F, Encapsulation<scalar> *Q, scalar t, scalar dt, Encapsulation<scalar> *RHS)
195+ void f2comp (Encapsulation<scalar> *F, Encapsulation<scalar> *Q, time t, time dt, Encapsulation<scalar> *RHS)
195196 {
196197 auto & f = *dynamic_cast <dvector*>(F);
197198 auto & q = *dynamic_cast <dvector*>(Q);
@@ -208,8 +209,8 @@ class ADIMEX : public pfasst::imex::IMEX<time> {
208209
209210};
210211
211- template <typename scalar>
212- class ADTRANS : public pfasst ::encap::PolyInterpMixin<scalar > {
212+ template <typename scalar, typename time >
213+ class ADTRANS : public pfasst ::encap::PolyInterpMixin<time > {
213214public:
214215
215216 void interpolate (Encapsulation<scalar> *dst, const Encapsulation<scalar> *src) {
@@ -250,15 +251,23 @@ class ADTRANS : public pfasst::encap::PolyInterpMixin<scalar> {
250251// main
251252//
252253
254+ template <typename scalar, typename argsT, typename controllerT, typename buildT>
255+ void auto_add (controllerT c, vector<pair<int ,string>> nodes, vector<argsT> args, buildT build) {
256+ for (int l=0 ; l<nodes.size (); l++) {
257+ auto nds = pfasst::compute_nodes<double >(get<0 >(nodes[l]), get<1 >(nodes[l]));
258+ tuple<pfasst::ISweeper*,pfasst::ITransfer*,pfasst::encap::EncapsulationFactory<scalar>*> t = build (args[l]);
259+ }
260+ }
261+
253262int main (int argc, char **argv)
254263{
255264 int ndofs = 256 ;
256265 int nnodes = 5 ;
257266
258267 if (nlevs == 1 ) {
259- pfasst::SDC<scalar > sdc;
268+ pfasst::SDC<double > sdc;
260269
261- auto nodes = pfasst::compute_nodes<scalar >(nnodes, " gauss-lobatto" );
270+ auto nodes = pfasst::compute_nodes<double >(nnodes, " gauss-lobatto" );
262271 auto * factory = new pfasst::encap::VectorFactory<scalar,double >(ndofs);
263272 auto * sweeper = new ADIMEX<scalar>(ndofs);
264273
@@ -275,13 +284,25 @@ int main(int argc, char **argv)
275284
276285 sdc.run ();
277286 } else {
278- pfasst::MLSDC<scalar> mlsdc;
287+ pfasst::MLSDC<double > mlsdc;
288+
289+ // vector<pair<int,string>> nodes = { { 3, "gauss-lobatto" }, { 5, "gauss-lobatto" } };
290+ // vector<int> ndofs = { 256, 512 };
291+
292+ auto builder = [] (int nx) {
293+ auto * factory = new pfasst::encap::VectorFactory<scalar,double >(nx);
294+ auto * sweeper = new ADIMEX<scalar>(nx);
295+ auto * transfer = new ADTRANS<scalar,double >();
296+ return make_tuple (sweeper, transfer, factory);
297+ };
298+
299+ // auto_add<scalar>(mlsdc, nodes, ndofs, builder);
279300
280301 for (int l=0 ; l<nlevs; l++) {
281- auto nodes = pfasst::compute_nodes<scalar >(nnodes, " gauss-lobatto" );
302+ auto nodes = pfasst::compute_nodes<double >(nnodes, " gauss-lobatto" );
282303 auto * factory = new pfasst::encap::VectorFactory<scalar,double >(ndofs);
283304 auto * sweeper = new ADIMEX<scalar>(ndofs);
284- auto * transfer = new ADTRANS<scalar>();
305+ auto * transfer = new ADTRANS<scalar, double >();
285306
286307 sweeper->set_nodes (nodes);
287308 sweeper->set_factory (factory);
0 commit comments