Skip to content

Commit 2d5e876

Browse files
committed
Merge pull request #152 from torbjoernk/feature/boris-linearized-cloud
Boris-(ML)SDC and MPI preparations
2 parents 061cfb0 + e022e3f commit 2d5e876

25 files changed

+2406
-1286
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
/include/pfasst/site_config.hpp
77

88
.python-version
9+
__pycache__
10+
.ipynb_checkpoints
911
/run
1012

1113
# Created by http://www.gitignore.io

examples/advection_diffusion/serial_mlsdc.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ namespace pfasst
3939
size_t nnodes = config::get_value<size_t>("num_nodes", 5);
4040
size_t ndofs = config::get_value<size_t>("spatial_dofs", 128);
4141

42+
const double abs_res_tol = pfasst::config::get_value<double>("abs_res_tol", 0.0);
43+
const double rel_res_tol = pfasst::config::get_value<double>("rel_res_tol", 0.0);
44+
4245
/*
4346
* build space/time discretisation levels and add them to mlsdc
4447
* controller. this loop adds the finest level first, and
@@ -53,6 +56,7 @@ namespace pfasst
5356

5457
sweeper->set_quadrature(quad);
5558
sweeper->set_factory(factory);
59+
sweeper->set_residual_tolerances(abs_res_tol, rel_res_tol);
5660

5761
mlsdc.add_level(sweeper, transfer);
5862

examples/boris/Boris_SDC_Plots.ipynb

Lines changed: 179 additions & 0 deletions
Large diffs are not rendered by default.

examples/boris/CMakeLists.txt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
set(examples_to_install ${examples_to_install})
22

33
message(STATUS " boris")
4+
5+
option(pfasst_BORIS_SAME_LEVELS "Use identical levels with MLSDC" ON)
6+
47
include_directories(
58
${3rdparty_INCLUDES}
69
${pfasst_INCLUDES}
@@ -9,6 +12,7 @@ add_subdirectory(bindings)
912

1013
set(boris_examples
1114
boris_sdc
15+
boris_mlsdc
1216
)
1317

1418
foreach(example ${boris_examples})
@@ -26,4 +30,19 @@ foreach(example ${boris_examples})
2630
endif()
2731
endforeach(example)
2832

33+
if(pfasst_BORIS_SAME_LEVELS)
34+
get_target_property(boris_mlsdc_definitions boris_mlsdc COMPILE_DEFINITIONS)
35+
if(${boris_mlsdc_definitions})
36+
list(APPEND boris_mlsdc_definitions "BORIS_SAME_LEVELS")
37+
else()
38+
set(boris_mlsdc_definitions "BORIS_SAME_LEVELS")
39+
endif()
40+
set_target_properties(boris_mlsdc PROPERTIES COMPILE_DEFINITIONS ${boris_mlsdc_definitions})
41+
endif()
42+
43+
add_feature_info(Dummy-Boris-MLSDC
44+
pfasst_BORIS_SAME_LEVELS
45+
"use identical levels for Boris-MLSDC"
46+
)
47+
2948
set(examples_to_install ${examples_to_install} ${boris_examples} PARENT_SCOPE)

examples/boris/bindings/simple_physics_solver.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ namespace simple_physics_solver
3636
const size_t num_particles, const double t,
3737
const SimplePhysicsSolverConfig* config,
3838
double* exyz, double* phis);
39-
39+
4040
void evaluate_e_field(const double* positions, const double* charges, const double* masses,
4141
const size_t num_particles, const double t,
4242
const SimplePhysicsSolverConfig* config,

examples/boris/bindings/wrapper_interface.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ namespace pfasst
4343
public:
4444
virtual ~WrapperInterface() {}
4545

46+
virtual ParticleCloudComponent<scalar>
47+
external_e_field_evaluate(const particle_cloud_type& particles, const time t) = 0;
48+
4649
virtual ParticleCloudComponent<scalar>
4750
e_field_evaluate(const particle_cloud_type& particles, const time t) = 0;
4851

examples/boris/bindings/wrapper_simple_physics_solver.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ namespace pfasst
3636

3737
protected:
3838
virtual size_t vector_to_array(const vector<scalar>& vec, scalar* arr);
39-
virtual size_t vector2d_to_array(const vector<vector<scalar>>& vec, scalar* arr);
39+
virtual size_t vector2d_to_array(const vector<scalar>& vec, scalar* arr);
4040

4141
virtual size_t pack_positions(const particle_cloud_type& particles, scalar* packed) override;
4242

@@ -58,6 +58,7 @@ namespace pfasst
5858
WrapperSimplePhysicsSolver();
5959
virtual ~WrapperSimplePhysicsSolver();
6060

61+
virtual ParticleCloudComponent<scalar> external_e_field_evaluate(const particle_cloud_type& particles, const time t) override;
6162
virtual ParticleCloudComponent<scalar> e_field_evaluate(const particle_cloud_type& particles, const time t) override;
6263
virtual ParticleCloudComponent<scalar> b_field_evaluate(const particle_cloud_type& particles, const time t) override;
6364
virtual ParticleCloudComponent<scalar> force_evaluate(const particle_cloud_type& particles, const time t) override;

examples/boris/bindings/wrapper_simple_physics_solver_impl.hpp

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)