8 #define UNUSED(expr) (void)(expr)
18 template<
typename scalar,
typename time>
22 for (
size_t i = 0; i < vec.size(); ++i) {
28 template<
typename scalar,
typename time>
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];
38 return vec.size() *
DIM;
41 template<
typename scalar,
typename time>
45 return this->vector2d_to_array(particles->positions(), packed);
48 template<
typename scalar,
typename time>
52 return this->vector2d_to_array(particles->velocities(), packed);
55 template<
typename scalar,
typename time>
59 return this->vector_to_array(particles->charges(), packed);
62 template<
typename scalar,
typename time>
66 return this->vector_to_array(particles->masses(), packed);
69 template<
typename scalar,
typename time>
72 scalar* packed_positions, scalar* packed_velocities,
73 scalar* packed_charges, scalar* packed_masses)
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);
82 template<
typename scalar,
typename time>
86 vector<scalar> out(num_particles);
87 for (
size_t p = 0; p < num_particles; ++p) {
93 template<
typename scalar,
typename time>
96 const size_t num_particles)
98 return this->unpack_1d(packed, num_particles *
DIM);
102 template<
typename scalar,
typename time>
106 template<
typename scalar,
typename time>
110 template<
typename scalar,
typename time>
114 ML_CVLOG(6,
"SolverBinding",
"evaluating external E-Field at t=" << t);
115 size_t num_particles = particles->size();
116 assert(
DIM == particles->dim());
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);
125 scalar* packed_forces =
new scalar[num_particles *
DIM];
127 this->config.get(), packed_forces);
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;
137 template<
typename scalar,
typename time>
141 ML_CVLOG(6,
"SolverBinding",
"evaluating complete E-Field at t=" << t);
142 size_t num_particles = particles->size();
143 assert(
DIM == particles->dim());
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);
152 scalar* packed_forces =
new scalar[num_particles *
DIM];
154 this->config.get(), packed_forces);
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;
164 template<
typename scalar,
typename time>
168 ML_CVLOG(6,
"SolverBinding",
"evaluating B-Field at t=" << t);
169 size_t num_particles = particles->size();
170 assert(
DIM == particles->dim());
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);
179 scalar* packed_forces =
new scalar[num_particles *
DIM];
181 this->config.get(), packed_forces);
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;
191 template<
typename scalar,
typename time>
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));
203 template<
typename scalar,
typename time>
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;
213 template<
typename scalar,
typename time>
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());
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);
231 num_particles, t, this->config.get());
232 delete[] packed_velocities;
233 delete[] packed_positions;
234 delete[] packed_masses;
235 delete[] packed_charges;
239 template<
typename scalar,
typename time>
242 scalar* packed_vec =
new scalar[
DIM];
244 auto vec = this->unpack_1d(packed_vec,
DIM);
249 template<
typename scalar,
typename time>
253 this->config = config;
256 template<
typename scalar,
typename time>
260 return this->config->omega_e;
263 template<
typename scalar,
typename time>
267 return this->config->omega_b;
270 template<
typename scalar,
typename time>
274 return this->config->epsilon;
277 template<
typename precision,
typename time>
280 os <<
"WrapperSimplePhysicsSolver()";
284 template<
typename scalar,
typename time>
287 wrapper->set_config(make_shared<solver::SimplePhysicsSolverConfig>());
290 template<
typename scalar,
typename time,
typename ArgT>
296 template<
typename scalar,
typename time,
typename ArgT,
typename... ArgsT>
300 setup(wrapper, args...);
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)
virtual void log(el::base::type::ostream_t &os) const
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 scalar omega_e() const
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)
virtual scalar epsilon() const
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
virtual scalar energy(const particle_cloud_type &particles, const time t) override
virtual ~WrapperSimplePhysicsSolver()
virtual size_t pack_charges(const particle_cloud_type &particles, scalar *packed) override
virtual scalar omega_b() const
WrapperSimplePhysicsSolver()
#define ML_CVLOG(verbose_level, logger_id, x)
same as CVLOG(verbosity, logger, x) from easylogging++
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
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 ParticleComponent< scalar > get_b_field_vector() override
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)