34 namespace advection_diffusion
44 const size_t niters,
const size_t nsteps,
const double dt,
45 const size_t ndofs_f,
const size_t ndofs_c,
46 const size_t nnodes_f,
const size_t nnodes_c)
48 ML_CLOG(INFO,
"Advec",
"abs_res_tol: " << abs_res_tol <<
", "
49 <<
"rel_res_tol: " << rel_res_tol <<
", "
50 <<
"niter: " << niters <<
", "
51 <<
"nsteps: " << nsteps <<
", "
52 <<
"dt: " << dt <<
", "
53 <<
"ndofs (f-c): " << ndofs_f <<
"-" << ndofs_c <<
", "
54 <<
"nnodes (f-c): " << nnodes_f <<
"-" << nnodes_c);
60 auto factory_c = make_shared<VectorFactory<double>>(ndofs_c);
61 auto sweeper_c = make_shared<AdvectionDiffusionSweeper<>>(ndofs_c);
62 auto transfer_c = make_shared<SpectralTransfer1D<>>();
64 sweeper_c->set_quadrature(quad_c);
65 sweeper_c->set_factory(factory_c);
66 sweeper_c->set_residual_tolerances(abs_res_tol, rel_res_tol);
69 auto factory_f = make_shared<VectorFactory<double>>(ndofs_f);
70 auto sweeper_f = make_shared<AdvectionDiffusionSweeper<>>(ndofs_f);
71 auto transfer_f = make_shared<SpectralTransfer1D<>>();
73 sweeper_f->set_quadrature(quad_f);
74 sweeper_f->set_factory(factory_f);
75 sweeper_f->set_residual_tolerances(abs_res_tol, rel_res_tol);
77 ML_LOG(INFO,
"expected quadrature error: " << quad_c->expected_error() <<
" (" << nnodes_c <<
")");
78 ML_LOG(INFO,
"expected quadrature error: " << quad_f->expected_error() <<
" (" << nnodes_f <<
")");
84 auto q0 = sweeper_f->get_start_state();
85 sweeper_f->exact(q0, 0.0);
102 #ifndef PFASST_UNIT_TESTING
103 int main(
int argc,
char** argv)
105 MPI_Init(&argc, &argv);
110 const double tend = pfasst::config::get_value<double>(
"tend", 0.04);
111 const double dt = pfasst::config::get_value<double>(
"dt", 0.01);
112 const size_t nnodes_f = pfasst::config::get_value<size_t>(
"num_nodes", 5);
113 const size_t ndofs_f = pfasst::config::get_value<size_t>(
"spatial_dofs", 128);
114 const size_t niters = pfasst::config::get_value<size_t>(
"num_iter", 4);
115 const double abs_res_tol = pfasst::config::get_value<double>(
"abs_res_tol", 0.0);
116 const double rel_res_tol = pfasst::config::get_value<double>(
"rel_res_tol", 0.0);
118 const size_t nsteps = tend /
dt;
119 const size_t nnodes_c = (nnodes_f + 1) / 2;
120 const size_t ndofs_c = ndofs_f / 2;
124 ndofs_f, ndofs_c, nnodes_f, nnodes_c);
virtual void set_options(bool all_sweepers=true)
Set options from command line etc.
map< tuple< size_t, size_t >, double > error_map
virtual void add_level(shared_ptr< ISweeper< time >> sweeper, shared_ptr< ITransfer< time >> transfer=shared_ptr< ITransfer< time >>(nullptr), bool coarse=true)
Adding a level to the controller.
#define ML_CLOG(level, logger_id, x)
same as CLOG(level, logger, x) from easylogging++
Implementation of the PFASST algorithm as described in .
static void init(int argc, char **argv, std::function< void()> opts=nullptr, std::function< void()> logs=nullptr)
virtual void set_nsweeps(vector< size_t > nsweeps)
Set desired number of sweeps for each level independently.
#define ML_LOG(level, x)
same as LOG(level, x) from easylogging++
virtual void set_duration(time t0, time tend, time dt, size_t niters)
Set basic time scope of the Controller.
error_map run_mpi_pfasst(const double abs_res_tol, const double rel_res_tol, const size_t niters, const size_t nsteps, const double dt, const size_t ndofs_f, const size_t ndofs_c, const size_t nnodes_f, const size_t nnodes_c)
Advection/diffusion example using an encapsulated IMEX sweeper.
virtual void setup() override
Basic setup routine for this controller.
shared_ptr< IQuadrature< precision > > quadrature_factory(const size_t nnodes, const QuadratureType qtype)
Instantiates quadrature handler for given number of nodes and type descriptor.
shared_ptr< R > get_finest()
Get coarsest level.
virtual void set_comm(ICommunicator *comm)
Set communicator.
Encapsulations (short encaps) are the central data type for all PFASST++ algorithms.
int main(int argc, char **argv)
advection-diffusion sweeper with semi-implicit time-integration.
virtual void run() override
Solve ODE using PFASST.