PFASST++
boris_sdc.cpp
Go to the documentation of this file.
1 #include <memory>
2 
3 #include <pfasst.hpp>
4 #include <pfasst/config.hpp>
5 #include <pfasst/logging.hpp>
7 
8 #include "particle.hpp"
9 #include "particle_cloud.hpp"
12 #include "boris_sweeper.hpp"
13 
14 
15 namespace pfasst
16 {
17  namespace examples
18  {
19  namespace boris
20  {
21  template<typename scalar>
22  error_map<scalar> run_boris_sdc(const size_t nsteps, const scalar dt, const size_t nnodes,
23  const size_t nparticles, const size_t niters,
24  const double abs_res_tol, const double rel_res_tol)
25  {
26  SDC<> sdc;
27 
28  const double mass = 1.0;
29  const double charge = 1.0;
30 
31  auto quad = quadrature::quadrature_factory<double>(nnodes, quadrature::QuadratureType::GaussLobatto);
32  auto factory = make_shared<ParticleCloudFactory<double>>(nparticles, 3, mass, charge);
33 
34  shared_ptr<bindings::WrapperInterface<double, double>> impl_solver = \
35  make_shared<bindings::WrapperSimplePhysicsSolver<double, double>>();
36  bindings::setup(dynamic_pointer_cast<bindings::WrapperSimplePhysicsSolver<double, double>>(impl_solver));
37 
38  string data_file = "s" + to_string(nsteps) + "_i" + to_string(niters) + "_dt" + to_string(dt) + "_m" + to_string(nnodes) + "_p" + to_string(nparticles) + ".csv";
39  auto sweeper = make_shared<BorisSweeper<double, double>>(impl_solver, data_file);
40 
41  sweeper->set_quadrature(quad);
42  sweeper->set_factory(factory);
43  sweeper->set_residual_tolerances(abs_res_tol, rel_res_tol);
44 
45  sdc.add_level(sweeper);
46  sdc.set_duration(0.0, nsteps*dt, dt, niters);
47  sdc.setup();
48 
49  shared_ptr<Particle<double>> center = make_shared<Particle<double>>();
50  center->pos()[0] = 10;
51  center->vel()[0] = 100;
52  center->vel()[2] = 100;
53 
54  shared_ptr<ParticleCloud<double>> q0 = dynamic_pointer_cast<ParticleCloud<double>>(sweeper->get_start_state());
55  q0->distribute_around_center(center);
56  ML_CLOG(INFO, "Boris", OUT::green << "Initial Particle: "
57  << *(dynamic_pointer_cast<ParticleCloud<double>>(sweeper->get_start_state())));
58 
59  sweeper->set_initial_energy();
60  sdc.run();
61 
62  return sweeper->get_errors();
63  }
64  } // ::pfasst::examples::boris
65  } // ::pfasst::examples
66 } // ::pfasst
67 
68 #ifndef PFASST_UNIT_TESTING
69 int main(int argc, char** argv)
70 {
71  pfasst::init(argc, argv,
72  pfasst::examples::boris::init_opts<>,
73  pfasst::examples::boris::init_logs<>);
74 
75  const size_t nsteps = pfasst::config::get_value<size_t>("num_steps", 1);
76  const double dt = pfasst::config::get_value<double>("delta_step", 0.015625);
77  const size_t nnodes = pfasst::config::get_value<size_t>("num_nodes", 5);
78  const size_t nparticles = pfasst::config::get_value<size_t>("num_particles", 1);
79  const size_t niters = pfasst::config::get_value<size_t>("num_iter", 2);
80  const double abs_res_tol = pfasst::config::get_value<double>("abs_res_tol", 0.0);
81  const double rel_res_tol = pfasst::config::get_value<double>("rel_res_tol", 0.0);
82 
83  ML_CLOG(INFO, "Boris", "nsteps=" << nsteps << ", "
84  << "dt=" << dt << ", "
85  << "nnodes=" << nnodes << ", "
86  << "nparticles=" << nparticles << ", "
87  << "niter=" << niters << ", "
88  << "abs res=" << abs_res_tol << ", "
89  << "rel res=" << rel_res_tol);
90 
91  pfasst::examples::boris::run_boris_sdc<double>(nsteps, dt, nnodes, nparticles, niters, abs_res_tol, rel_res_tol);
92 }
93 #endif
error_map< scalar > run_boris_sdc(const size_t nsteps, const scalar dt, const size_t nnodes, const size_t nparticles, const size_t niters, const double abs_res_tol, const double rel_res_tol)
Definition: boris_mlsdc.cpp:24
void setup(shared_ptr< WrapperInterface< scalar, time >> wrapper)
#define ML_CLOG(level, logger_id, x)
same as CLOG(level, logger, x) from easylogging++
Definition: logging.hpp:117
static void init(int argc, char **argv, std::function< void()> opts=nullptr, std::function< void()> logs=nullptr)
Definition: pfasst.hpp:13
static const string green
Definition: logging.hpp:53
int main(int argc, char **argv)
Definition: boris_sdc.cpp:69
float dt
Definition: plot.py:10