PFASST++
boris_sweeper.hpp
Go to the documentation of this file.
1 
6 #ifndef _EXAMPLES__BORIS__BORIS_SWEEPER__HPP_
7 #define _EXAMPLES__BORIS__BORIS_SWEEPER__HPP_
8 
9 #include <array>
10 #include <cassert>
11 #include <cmath>
12 #include <cstdio>
13 #include <complex>
14 #include <cstdlib>
15 #include <ios>
16 #include <iostream>
17 #include <map>
18 #include <vector>
19 using namespace std;
20 
21 #include <Eigen/Core>
22 
23 #include <boost/format.hpp>
24 
25 #include <pfasst.hpp>
26 #include <pfasst/config.hpp>
27 #include <pfasst/logging.hpp>
29 
30 #include "particle.hpp"
31 #include "particle_cloud.hpp"
32 #include "particle_util.hpp"
34 
35 
36 namespace pfasst
37 {
38  namespace examples
39  {
52  namespace boris
53  {
54  using namespace pfasst::encap;
55 
56  template<typename coeff>
57  using Vector3d = Eigen::Array<coeff, 3, 1>;
58 
59  template<typename coeff>
60  using Matrix3d = Eigen::Matrix<coeff, 3, 3, Eigen::RowMajor>;
61 
62  template<typename coeff>
63  using Matrix = Eigen::Matrix<coeff, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>;
64 
65  typedef pair<size_t, size_t> error_index;
66 
67  template<typename scalar>
68  class ParticleError :
69  public el::Loggable
70  {
71  public:
72  scalar x;
73  scalar y;
74  scalar z;
75  scalar u;
76  scalar v;
77  scalar w;
78 
79  virtual void log(el::base::type::ostream_t& os) const override;
80  };
81 
82  template<typename scalar>
83  struct ErrorTuple
84  {
86  scalar e_drift;
87  scalar res;
88  };
89 
90  template<typename scalar>
91  using error_map = map<error_index, ErrorTuple<scalar>>;
92 
93 
94  template<typename precision = pfasst::time_precision>
95  static void init_opts();
96 
97  template<typename precision = pfasst::time_precision>
98  static void init_logs();
99 
100 
101  class LogIndent
102  {
103  private:
104  array<size_t, 9> vlog_levels;
105 
106  public:
107  LogIndent();
108  virtual ~LogIndent();
109 
110  void increment(const size_t vlevel);
111  void decrement(const size_t vlevel);
112  const string indent(const size_t vlevel) const;
113  };
114 
115 
119  template<
120  typename scalar,
121  typename time
122  >
124  : public EncapSweeper<time>
125  {
126  public:
131 
132  private:
133  shared_ptr<bindings::WrapperInterface<scalar, time>> impl_solver;
136  shared_ptr<encap_type> exact_cache;
137  shared_ptr<LogIndent> log_indent;
138 
139  protected:
140  vector<shared_ptr<encap_type>> particles;
141  vector<shared_ptr<encap_type>> saved_particles;
142  shared_ptr<encap_type> start_particles;
143  shared_ptr<encap_type> end_particles;
144 
145  vector<shared_ptr<acceleration_type>> tau_q_corrections;
146  vector<shared_ptr<acceleration_type>> tau_qq_corrections;
147  vector<acceleration_type> forces;
148  vector<acceleration_type> saved_forces;
149  vector<acceleration_type> b_vecs;
150  vector<acceleration_type> saved_b_vecs;
151 
153  vector<scalar> energy_evals;
154  size_t f_evals;
155 
156  bool coarse;
157 
158  vector<velocity_type> s_integrals;
159  vector<position_type> ss_integrals;
160 
162  vector<time> delta_nodes;
163 
172 
173  ofstream data_stream;
174 
175  boost::format log_fmt;
177  boost::format data_stream_fmt;
178 
179  acceleration_type build_rhs(const size_t m, const bool previous = false) const;
180  scalar compute_residual_max();
181  void write_center_to_file(const size_t iter, const size_t sweep, const ParticleComponent<scalar>& center,
182  const scalar energy, const scalar drift, const scalar residual);
183  void write_particle_cloud_to_file(const size_t iter, const size_t sweep, const shared_ptr<encap_type>& cloud,
184  const scalar energy, const scalar drift, const scalar residual,
185  const bool with_center = true);
186  void update_position(const size_t m, const time dt, const time ds);
187  void update_velocity(const size_t m, const time ds, const vector<time>& nodes);
188 
189  public:
192  const string& data_file);
193  BorisSweeper(const BorisSweeper<scalar, time>& other) = delete;
194  BorisSweeper(BorisSweeper<scalar, time>&& other) = delete;
195 
196  virtual ~BorisSweeper();
198 
200  virtual void set_state(shared_ptr<const encap_type> u0, size_t m);
201  virtual void set_start_state(shared_ptr<const encap_type> u0);
202  virtual shared_ptr<Encapsulation<time>> get_state(size_t m) const override;
203  virtual shared_ptr<Encapsulation<time>> get_start_state() const;
204  virtual shared_ptr<acceleration_type> get_tau_q_as_force(size_t m) const;
205  virtual shared_ptr<acceleration_type> get_tau_qq_as_force(size_t m) const;
206  virtual shared_ptr<Encapsulation<time>> get_saved_state(size_t m) const override;
207  virtual void set_initial_energy();
209 
211  virtual void exact(shared_ptr<Encapsulation<time>> q, time t);
212  virtual void exact(shared_ptr<encap_type> q, const time t);
213  virtual void exact(encap_type& q, const time t);
214  virtual void echo_error(const time t, bool predict = false);
215  virtual error_map<scalar> get_errors() const;
217 
219  virtual void setup(bool coarse = false) override;
220  virtual void integrate(time dt, vector<shared_ptr<Encapsulation<time>>> dst) const override;
221  virtual void integrate(time dt, vector<shared_ptr<acceleration_type>> dst_q,
222  vector<shared_ptr<acceleration_type>> dst_qq) const;
223  virtual void residual(time dt, vector<shared_ptr<Encapsulation<time>>> dst) const override;
224  virtual void advance() override;
225  virtual void evaluate(size_t m);
226  virtual void predict(bool initial) override;
227  virtual void sweep() override;
228  virtual void save(bool initial_only=false) override;
229  virtual void spread() override;
231 
233  virtual void post_sweep() override;
234  virtual void post_predict() override;
235  virtual void post_step() override;
237 
239  virtual void post(ICommunicator* comm, int tag) override;
240  virtual void send(ICommunicator* comm, int tag, bool blocking) override;
241  virtual void recv(ICommunicator* comm, int tag, bool blocking) override;
242  virtual void broadcast(ICommunicator* comm) override;
244 
246  virtual void boris_solve(const time tm, const time t_next, const time ds, const size_t m,
247  const velocity_type& c_k_term);
249  };
250  } // ::pfasst::examples::boris
251  } // ::pfasst::examples
252 } // ::pfasst
253 
254 
255 #include "boris_sweeper_impl.hpp"
256 
257 #endif // _EXAMPLES__BORIS__BORIS_SWEEPER__HPP_
Eigen::Array< coeff, 3, 1 > Vector3d
vector< acceleration_type > saved_forces
shared_ptr< encap_type > end_particles
vector< shared_ptr< acceleration_type > > tau_qq_corrections
Host based encapsulated base sweeper.
map< error_index, ErrorTuple< scalar >> error_map
pair< size_t, size_t > error_index
void setup(shared_ptr< WrapperInterface< scalar, time >> wrapper)
ParticleCloudComponent< scalar > position_type
STL namespace.
static void init_logs()
vector< shared_ptr< encap_type > > particles
shared_ptr< encap_type > exact_cache
vector< precision > ParticleCloudComponent
vector< acceleration_type > saved_b_vecs
vector< precision > ParticleComponent
Definition: particle.hpp:27
vector< position_type > ss_integrals
vector< acceleration_type > b_vecs
vector< shared_ptr< acceleration_type > > tau_q_corrections
vector< acceleration_type > forces
ParticleCloudComponent< scalar > velocity_type
Data/solution encapsulation.
Eigen::Matrix< coeff, 3, 3, Eigen::RowMajor > Matrix3d
shared_ptr< encap_type > start_particles
shared_ptr< bindings::WrapperInterface< scalar, time > > impl_solver
ParticleCloudComponent< scalar > acceleration_type
Encapsulations (short encaps) are the central data type for all PFASST++ algorithms.
tuple t
Definition: plot.py:12
Abstract interface for communicators.
Definition: interfaces.hpp:70
Eigen::Matrix< coeff, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor > Matrix
vector< shared_ptr< encap_type > > saved_particles
static void init_opts()
float dt
Definition: plot.py:10
vector< time > delta_nodes
delta_nodes[m] = nodes[m] - nodes[m-1]