@@ -27,12 +27,12 @@ namespace pfasst
2727
2828 template <typename scalar, typename time>
2929 size_t
30- WrapperSimplePhysicsSolver<scalar, time>::vector2d_to_array(const vector<vector<scalar>>& vec,
31- scalar* arr)
30+ WrapperSimplePhysicsSolver<scalar, time>::vector2d_to_array(const vector<scalar>& vec, scalar* arr)
3231 {
33- for (size_t p = 0 ; p < vec.size (); ++p) {
32+ const size_t npart = vec.size () / DIM;
33+ for (size_t p = 0 ; p < npart; ++p) {
3434 for (size_t d = 0 ; d < DIM; ++d) {
35- arr[p * DIM + d] = vec[p][ d];
35+ arr[p * DIM + d] = vec[p * DIM + d];
3636 }
3737 }
3838 return vec.size () * DIM;
@@ -95,11 +95,7 @@ namespace pfasst
9595 WrapperSimplePhysicsSolver<scalar, time>::unpack_2d(const scalar* packed,
9696 const size_t num_particles)
9797 {
98- ParticleCloudComponent<scalar> out (num_particles);
99- for (size_t p = 0 ; p < num_particles; ++p) {
100- out[p] = this ->unpack_1d (packed + (p * DIM), DIM);
101- }
102- return out;
98+ return this ->unpack_1d (packed, num_particles * DIM);
10399 }
104100
105101
@@ -111,11 +107,38 @@ namespace pfasst
111107 WrapperSimplePhysicsSolver<scalar, time>::~WrapperSimplePhysicsSolver ()
112108 {}
113109
110+ template <typename scalar, typename time>
111+ ParticleCloudComponent<scalar>
112+ WrapperSimplePhysicsSolver<scalar, time>::external_e_field_evaluate(const particle_cloud_type& particles, const time t)
113+ {
114+ CVLOG (6 , " Solver" ) << " 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+
114137 template <typename scalar, typename time>
115138 ParticleCloudComponent<scalar>
116139 WrapperSimplePhysicsSolver<scalar, time>::e_field_evaluate(const particle_cloud_type& particles, const time t)
117140 {
118- VLOG_FUNC_START ( " WrapperSimplePhysicsSolver " ) << " time =" << t;
141+ CVLOG ( 6 , " Solver " ) << " evaluating complete E-Field at t =" << t;
119142 size_t num_particles = particles->size ();
120143 assert (DIM == particles->dim ());
121144
@@ -135,15 +158,14 @@ namespace pfasst
135158 delete[] packed_charges;
136159 auto forces = this ->unpack_2d (packed_forces, num_particles);
137160 delete[] packed_forces;
138- VLOG_FUNC_END (" WrapperSimplePhysicsSolver" );
139161 return forces;
140162 }
141163
142164 template <typename scalar, typename time>
143165 ParticleCloudComponent<scalar>
144166 WrapperSimplePhysicsSolver<scalar, time>::b_field_evaluate(const particle_cloud_type& particles, const time t)
145167 {
146- VLOG_FUNC_START ( " WrapperSimplePhysicsSolver " ) << " time =" << t;
168+ CVLOG ( 6 , " Solver " ) << " evaluating B-Field at t =" << t;
147169 size_t num_particles = particles->size ();
148170 assert (DIM == particles->dim ());
149171
@@ -163,39 +185,36 @@ namespace pfasst
163185 delete[] packed_charges;
164186 auto forces = this ->unpack_2d (packed_forces, num_particles);
165187 delete[] packed_forces;
166- VLOG_FUNC_END (" WrapperSimplePhysicsSolver" );
167188 return forces;
168189 }
169190
170191 template <typename scalar, typename time>
171192 ParticleCloudComponent<scalar>
172193 WrapperSimplePhysicsSolver<scalar, time>::b_field_vecs(const particle_cloud_type& particles, const time t)
173194 {
174- VLOG_FUNC_START (" WrapperSimplePhysicsSolver" ) << " time=" << t;
175195 auto b_vecs = cloud_component_factory<scalar>(particles->size (), particles->dim ());
176196 for (size_t p = 0 ; p < particles->size (); ++p) {
177- b_vecs[p] = this ->get_b_field_vector () / particles->charges ()[p] / particles->masses ()[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));
178199 }
179- VLOG_FUNC_END (" WrapperSimplePhysicsSolver" );
180200 return b_vecs;
181201 }
182202
183203 template <typename scalar, typename time>
184204 ParticleCloudComponent<scalar>
185205 WrapperSimplePhysicsSolver<scalar, time>::force_evaluate(const particle_cloud_type& particles, const time t)
186206 {
187- VLOG_FUNC_START ( " WrapperSimplePhysicsSolver " ) << " time =" << t;
207+ CVLOG ( 6 , " Solver " ) << " compute total force at t =" << t;
188208 auto e_force = this ->e_field_evaluate (particles, t);
189209 auto b_force = this ->b_field_evaluate (particles, t);
190- VLOG_FUNC_END (" WrapperSimplePhysicsSolver" );
191210 return e_force + b_force;
192211 }
193212
194213 template <typename scalar, typename time>
195214 scalar
196215 WrapperSimplePhysicsSolver<scalar, time>::energy(const particle_cloud_type& particles, const time t)
197216 {
198- VLOG_FUNC_START ( " WrapperSimplePhysicsSolver " ) << " time =" << t;
217+ CVLOG ( 6 , " Solver " ) << " computing system's total energy at t =" << t;
199218 size_t num_particles = particles->size ();
200219 assert (DIM == particles->dim ());
201220
@@ -214,7 +233,6 @@ namespace pfasst
214233 delete[] packed_positions;
215234 delete[] packed_masses;
216235 delete[] packed_charges;
217- VLOG_FUNC_END (" WrapperSimplePhysicsSolver" )
218236 return energy;
219237 }
220238
0 commit comments