PFASST++
wrapper_simple_physics_solver_impl.hpp
Go to the documentation of this file.
2 
4 namespace solver = simple_physics_solver;
5 
6 #include <pfasst/logging.hpp>
7 
8 #define UNUSED(expr) (void)(expr)
9 
10 namespace pfasst
11 {
12  namespace examples
13  {
14  namespace boris
15  {
16  namespace bindings
17  {
18  template<typename scalar, typename time>
19  size_t
20  WrapperSimplePhysicsSolver<scalar, time>::vector_to_array(const vector<scalar>& vec, scalar* arr)
21  {
22  for (size_t i = 0; i < vec.size(); ++i) {
23  arr[i] = vec[i];
24  }
25  return vec.size();
26  }
27 
28  template<typename scalar, typename time>
29  size_t
30  WrapperSimplePhysicsSolver<scalar, time>::vector2d_to_array(const vector<scalar>& vec, scalar* arr)
31  {
32  const size_t npart = vec.size() / DIM;
33  for (size_t p = 0; p < npart; ++p) {
34  for (size_t d = 0; d < DIM; ++d) {
35  arr[p * DIM + d] = vec[p * DIM + d];
36  }
37  }
38  return vec.size() * DIM;
39  }
40 
41  template<typename scalar, typename time>
42  size_t
44  {
45  return this->vector2d_to_array(particles->positions(), packed);
46  }
47 
48  template<typename scalar, typename time>
49  size_t
51  {
52  return this->vector2d_to_array(particles->velocities(), packed);
53  }
54 
55  template<typename scalar, typename time>
56  size_t
58  {
59  return this->vector_to_array(particles->charges(), packed);
60  }
61 
62  template<typename scalar, typename time>
63  size_t
65  {
66  return this->vector_to_array(particles->masses(), packed);
67  }
68 
69  template<typename scalar, typename time>
70  size_t
72  scalar* packed_positions, scalar* packed_velocities,
73  scalar* packed_charges, scalar* packed_masses)
74  {
75  size_t size = this->pack_positions(particles, packed_positions);
76  this->pack_velocities(particles, packed_velocities);
77  this->pack_charges(particles, packed_charges);
78  this->pack_masses(particles, packed_masses);
79  return size;
80  }
81 
82  template<typename scalar, typename time>
83  vector<scalar>
84  WrapperSimplePhysicsSolver<scalar, time>::unpack_1d(const scalar* packed, const size_t num_particles)
85  {
86  vector<scalar> out(num_particles);
87  for (size_t p = 0; p < num_particles; ++p) {
88  out[p] = packed[p];
89  }
90  return out;
91  }
92 
93  template<typename scalar, typename time>
96  const size_t num_particles)
97  {
98  return this->unpack_1d(packed, num_particles * DIM);
99  }
100 
101 
102  template<typename scalar, typename time>
104  {}
105 
106  template<typename scalar, typename time>
108  {}
109 
110  template<typename scalar, typename time>
113  {
114  ML_CVLOG(6, "SolverBinding", "evaluating external E-Field at t=" << t);
115  size_t num_particles = particles->size();
116  assert(DIM == particles->dim());
117 
118  scalar* packed_positions = new scalar[num_particles * DIM];
119  scalar* packed_masses = new scalar[num_particles];
120  scalar* packed_charges = new scalar[num_particles];
121  this->pack_positions(particles, packed_positions);
122  this->pack_masses(particles, packed_masses);
123  this->pack_charges(particles, packed_charges);
124 
125  scalar* packed_forces = new scalar[num_particles * DIM];
126  solver::evaluate_external_e_field(packed_positions, packed_charges, packed_masses, num_particles, t,
127  this->config.get(), packed_forces);
128 
129  delete[] packed_positions;
130  delete[] packed_masses;
131  delete[] packed_charges;
132  auto forces = this->unpack_2d(packed_forces, num_particles);
133  delete[] packed_forces;
134  return forces;
135  }
136 
137  template<typename scalar, typename time>
140  {
141  ML_CVLOG(6, "SolverBinding", "evaluating complete E-Field at t=" << t);
142  size_t num_particles = particles->size();
143  assert(DIM == particles->dim());
144 
145  scalar* packed_positions = new scalar[num_particles * DIM];
146  scalar* packed_masses = new scalar[num_particles];
147  scalar* packed_charges = new scalar[num_particles];
148  this->pack_positions(particles, packed_positions);
149  this->pack_masses(particles, packed_masses);
150  this->pack_charges(particles, packed_charges);
151 
152  scalar* packed_forces = new scalar[num_particles * DIM];
153  solver::evaluate_e_field(packed_positions, packed_charges, packed_masses, num_particles, t,
154  this->config.get(), packed_forces);
155 
156  delete[] packed_positions;
157  delete[] packed_masses;
158  delete[] packed_charges;
159  auto forces = this->unpack_2d(packed_forces, num_particles);
160  delete[] packed_forces;
161  return forces;
162  }
163 
164  template<typename scalar, typename time>
167  {
168  ML_CVLOG(6, "SolverBinding", "evaluating B-Field at t=" << t);
169  size_t num_particles = particles->size();
170  assert(DIM == particles->dim());
171 
172  scalar* packed_velocities = new scalar[num_particles * DIM];
173  scalar* packed_masses = new scalar[num_particles];
174  scalar* packed_charges = new scalar[num_particles];
175  this->pack_velocities(particles, packed_velocities);
176  this->pack_masses(particles, packed_masses);
177  this->pack_charges(particles, packed_charges);
178 
179  scalar* packed_forces = new scalar[num_particles * DIM];
180  solver::evaluate_b_field(packed_velocities, packed_charges, packed_masses, num_particles, t,
181  this->config.get(), packed_forces);
182 
183  delete[] packed_velocities;
184  delete[] packed_masses;
185  delete[] packed_charges;
186  auto forces = this->unpack_2d(packed_forces, num_particles);
187  delete[] packed_forces;
188  return forces;
189  }
190 
191  template<typename scalar, typename time>
194  {
195  auto b_vecs = cloud_component_factory<scalar>(particles->size(), particles->dim());
196  for (size_t p = 0; p < particles->size(); ++p) {
197  auto bvec = this->get_b_field_vector() / particles->charges()[p] / particles->masses()[p];
198  std::copy(bvec.cbegin(), bvec.cend(), b_vecs.begin() + (p * DIM));
199  }
200  return b_vecs;
201  }
202 
203  template<typename scalar, typename time>
206  {
207  ML_CVLOG(6, "SolverBinding", "compute total force at t=" << t);
208  auto e_force = this->e_field_evaluate(particles, t);
209  auto b_force = this->b_field_evaluate(particles, t);
210  return e_force + b_force;
211  }
212 
213  template<typename scalar, typename time>
214  scalar
216  {
217  ML_CVLOG(6, "SolverBinding", "computing system's total energy at t=" << t);
218  size_t num_particles = particles->size();
219  assert(DIM == particles->dim());
220 
221  scalar* packed_velocities = new scalar[num_particles * DIM];
222  scalar* packed_positions = new scalar[num_particles * DIM];
223  scalar* packed_masses = new scalar[num_particles];
224  scalar* packed_charges = new scalar[num_particles];
225  this->pack_positions(particles, packed_positions);
226  this->pack_velocities(particles, packed_velocities);
227  this->pack_masses(particles, packed_masses);
228  this->pack_charges(particles, packed_charges);
229 
230  auto energy = solver::compute_energy(packed_positions, packed_velocities, packed_charges, packed_masses,
231  num_particles, t, this->config.get());
232  delete[] packed_velocities;
233  delete[] packed_positions;
234  delete[] packed_masses;
235  delete[] packed_charges;
236  return energy;
237  }
238 
239  template<typename scalar, typename time>
241  {
242  scalar* packed_vec = new scalar[DIM];
243  solver::get_b_field_vector(this->config.get(), packed_vec);
244  auto vec = this->unpack_1d(packed_vec, DIM);
245  delete[] packed_vec;
246  return vec;
247  }
248 
249  template<typename scalar, typename time>
250  void
251  WrapperSimplePhysicsSolver<scalar, time>::set_config(shared_ptr<solver::SimplePhysicsSolverConfig> config)
252  {
253  this->config = config;
254  }
255 
256  template<typename scalar, typename time>
257  scalar
259  {
260  return this->config->omega_e;
261  }
262 
263  template<typename scalar, typename time>
264  scalar
266  {
267  return this->config->omega_b;
268  }
269 
270  template<typename scalar, typename time>
271  scalar
273  {
274  return this->config->epsilon;
275  }
276 
277  template<typename precision, typename time>
278  void WrapperSimplePhysicsSolver<precision, time>::log(el::base::type::ostream_t& os) const
279  {
280  os << "WrapperSimplePhysicsSolver()";
281  }
282 
283 
284  template<typename scalar, typename time>
286  {
287  wrapper->set_config(make_shared<solver::SimplePhysicsSolverConfig>());
288  }
289 
290  template<typename scalar, typename time, typename ArgT>
291  void setup(shared_ptr<WrapperSimplePhysicsSolver<scalar, time>> wrapper, ArgT arg)
292  {
293  UNUSED(wrapper); UNUSED(arg);
294  }
295 
296  template<typename scalar, typename time, typename ArgT, typename... ArgsT>
297  void setup(shared_ptr<WrapperSimplePhysicsSolver<scalar, time>> wrapper, ArgT arg, ArgsT... args)
298  {
299  setup(wrapper, arg);
300  setup(wrapper, args...);
301  }
302  } // ::pfasst::examples::boris::bindings
303  } // ::pfasst::examples::boris
304  } // ::pfasst::examples
305 } // ::pfasst
virtual size_t pack_masses(const particle_cloud_type &particles, scalar *packed) override
void evaluate_external_e_field(const double *positions, const double *charges, const double *masses, const size_t num_particles, const double t, const SimplePhysicsSolverConfig *config, double *forces)
void setup(shared_ptr< WrapperInterface< scalar, time >> wrapper)
virtual size_t pack_velocities(const particle_cloud_type &particles, scalar *packed) override
virtual ParticleCloudComponent< scalar > force_evaluate(const particle_cloud_type &particles, const time t) override
virtual size_t pack_positions(const particle_cloud_type &particles, scalar *packed) override
virtual size_t vector2d_to_array(const vector< scalar > &vec, scalar *arr)
virtual size_t pack_all(const particle_cloud_type &particles, scalar *packed_positions, scalar *packed_velocities, scalar *packed_charges, scalar *packed_masses) override
vector< precision > ParticleCloudComponent
void get_b_field_vector(const SimplePhysicsSolverConfig *config, double *b_field_vector)
void evaluate_b_field(const double *velocities, const double *charges, const double *masses, const size_t num_particles, const double t, const SimplePhysicsSolverConfig *config, double *forces)
virtual ParticleCloudComponent< scalar > external_e_field_evaluate(const particle_cloud_type &particles, const time t) override
vector< precision > ParticleComponent
Definition: particle.hpp:27
virtual scalar energy(const particle_cloud_type &particles, const time t) override
#define DIM
virtual size_t pack_charges(const particle_cloud_type &particles, scalar *packed) override
#define ML_CVLOG(verbose_level, logger_id, x)
same as CVLOG(verbosity, logger, x) from easylogging++
Definition: logging.hpp:131
virtual ParticleCloudComponent< scalar > unpack_2d(const scalar *packed, const size_t num_particles)
virtual vector< scalar > unpack_1d(const scalar *packed, const size_t num_particles)
shared_ptr< ParticleCloud< scalar > > particle_cloud_type
tuple t
Definition: plot.py:12
virtual void set_config(shared_ptr< solver::SimplePhysicsSolverConfig > config)
virtual ParticleCloudComponent< scalar > b_field_vecs(const particle_cloud_type &particles, const time t) override
virtual ParticleCloudComponent< scalar > e_field_evaluate(const particle_cloud_type &particles, const time t) override
double compute_energy(const double *positions, const double *velocities, const double *charges, const double *masses, const size_t num_particles, const double t, const SimplePhysicsSolverConfig *config)
virtual size_t vector_to_array(const vector< scalar > &vec, scalar *arr)
virtual ParticleCloudComponent< scalar > b_field_evaluate(const particle_cloud_type &particles, const time t) override
void evaluate_e_field(const double *positions, const double *charges, const double *masses, const size_t num_particles, const double t, const SimplePhysicsSolverConfig *config, double *forces)
#define UNUSED(expr)