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)
28 const double mass = 1.0;
29 const double charge = 1.0;
32 auto factory = make_shared<ParticleCloudFactory<double>>(nparticles, 3, mass, charge);
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));
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);
41 sweeper->set_quadrature(quad);
42 sweeper->set_factory(factory);
43 sweeper->set_residual_tolerances(abs_res_tol, rel_res_tol);
45 sdc.add_level(sweeper);
46 sdc.set_duration(0.0, nsteps*dt, dt, niters);
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;
54 shared_ptr<ParticleCloud<double>> q0 = dynamic_pointer_cast<ParticleCloud<double>>(sweeper->get_start_state());
55 q0->distribute_around_center(center);
57 << *(dynamic_pointer_cast<ParticleCloud<double>>(sweeper->get_start_state())));
59 sweeper->set_initial_energy();
62 return sweeper->get_errors();
68 #ifndef PFASST_UNIT_TESTING
69 int main(
int argc,
char** argv)
72 pfasst::examples::boris::init_opts<>,
73 pfasst::examples::boris::init_logs<>);
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);
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);
91 pfasst::examples::boris::run_boris_sdc<double>(nsteps,
dt, nnodes, nparticles, niters, abs_res_tol, rel_res_tol);
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)
void setup(shared_ptr< WrapperInterface< scalar, time >> wrapper)
#define ML_CLOG(level, logger_id, x)
same as CLOG(level, logger, x) from easylogging++
static void init(int argc, char **argv, std::function< void()> opts=nullptr, std::function< void()> logs=nullptr)
static const string green
int main(int argc, char **argv)