Skip to content

Commit 6d9d625

Browse files
committed
Refactor HeatSources to store std::vectors of ScanPathSegments
1 parent 456fa4e commit 6d9d625

File tree

8 files changed

+230
-136
lines changed

8 files changed

+230
-136
lines changed

source/CubeHeatSource.cc

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,9 @@
1313

1414
namespace adamantine
1515
{
16-
template <int dim, typename MemorySpaceType>
17-
CubeHeatSource<dim, MemorySpaceType>::CubeHeatSource(
18-
boost::property_tree::ptree const &database)
19-
: HeatSource<dim, MemorySpaceType>()
16+
template <int dim>
17+
CubeHeatSource<dim>::CubeHeatSource(boost::property_tree::ptree const &database)
18+
: HeatSource<dim, dealii::MemorySpace::Default>()
2019
{
2120
_start_time = database.get<double>("start_time");
2221
_end_time = database.get<double>("end_time");
@@ -32,16 +31,15 @@ CubeHeatSource<dim, MemorySpaceType>::CubeHeatSource(
3231
}
3332
}
3433

35-
template <int dim, typename MemorySpaceType>
36-
void CubeHeatSource<dim, MemorySpaceType>::update_time(double time)
34+
template <int dim>
35+
void CubeHeatSource<dim>::update_time(double time)
3736
{
3837
_source_on = ((time > _start_time) && (time < _end_time));
3938
}
4039

41-
template <int dim, typename MemorySpaceType>
42-
double
43-
CubeHeatSource<dim, MemorySpaceType>::value(dealii::Point<dim> const &point,
44-
double const /*height*/) const
40+
template <int dim>
41+
double CubeHeatSource<dim>::value(dealii::Point<dim> const &point,
42+
double const /*height*/) const
4543
{
4644
if (_source_on)
4745
{
@@ -62,14 +60,12 @@ CubeHeatSource<dim, MemorySpaceType>::value(dealii::Point<dim> const &point,
6260
return 0.;
6361
}
6462

65-
template <int dim, typename MemorySpaceType>
66-
double CubeHeatSource<dim, MemorySpaceType>::get_current_height(
67-
double const /*time*/) const
63+
template <int dim>
64+
double CubeHeatSource<dim>::get_current_height(double const /*time*/) const
6865
{
6966
return _max_point[axis<dim>::z];
7067
}
7168

7269
} // namespace adamantine
7370

74-
INSTANTIATE_DIM_DEVICE(CubeHeatSource)
75-
INSTANTIATE_DIM_HOST(CubeHeatSource)
71+
INSTANTIATE_DIM(CubeHeatSource)

source/CubeHeatSource.hh

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,17 @@
1010

1111
#include <HeatSource.hh>
1212

13+
#include <deal.II/base/memory_space.h>
14+
1315
namespace adamantine
1416
{
1517
/**
1618
* Cube heat source. This source does not represent a physical source, it is
1719
* used for verification purpose.
1820
*/
19-
template <int dim, typename MemorySpaceType>
20-
class CubeHeatSource final : public HeatSource<dim, MemorySpaceType>
21+
template <int dim>
22+
class CubeHeatSource final
23+
: public HeatSource<dim, dealii::MemorySpace::Default>
2124
{
2225
public:
2326
/**

source/HeatSource.hh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ public:
8888
*/
8989
virtual void set_beam_properties(boost::property_tree::ptree const &database);
9090

91+
BeamHeatSourceProperties get_beam_properties() const { return _beam; }
92+
9193
protected:
9294
/**
9395
* Structure of the physical properties of the beam heat source.

source/HeatSources.hh

Lines changed: 148 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,115 @@ public:
3131
*/
3232
HeatSources(boost::property_tree::ptree const &source_database);
3333

34+
HeatSources(
35+
Kokkos::View<ElectronBeamHeatSource<dim, MemorySpace> *,
36+
typename MemorySpace::kokkos_space>
37+
electron_beam_heat_sources,
38+
Kokkos::View<CubeHeatSource<dim> *, typename MemorySpace::kokkos_space>
39+
cube_heat_sources,
40+
Kokkos::View<GoldakHeatSource<dim, MemorySpace> *,
41+
typename MemorySpace::kokkos_space>
42+
goldak_heat_sources,
43+
std::vector<
44+
Kokkos::View<ScanPathSegment *, typename MemorySpace::kokkos_space>>
45+
electron_beam_scan_path_segments,
46+
std::vector<
47+
Kokkos::View<ScanPathSegment *, typename MemorySpace::kokkos_space>>
48+
goldak_scan_path_segments)
49+
: _electron_beam_heat_sources(electron_beam_heat_sources),
50+
_cube_heat_sources(cube_heat_sources),
51+
_goldak_heat_sources(goldak_heat_sources),
52+
_electron_beam_scan_path_segments(electron_beam_scan_path_segments),
53+
_goldak_scan_path_segments(goldak_scan_path_segments)
54+
{
55+
}
56+
3457
HeatSources<dealii::MemorySpace::Host, dim> copy_to_host() const
3558
{
36-
return {Kokkos::create_mirror_view_and_copy(Kokkos::HostSpace{},
37-
_electron_beam_heat_sources),
38-
Kokkos::create_mirror_view_and_copy(Kokkos::HostSpace{},
39-
_cube_heat_sources),
40-
Kokkos::create_mirror_view_and_copy(Kokkos::HostSpace{},
41-
_goldak_heat_sources)};
59+
if constexpr (std::is_same_v<MemorySpace, dealii::MemorySpace::Host>)
60+
return *this;
61+
else
62+
{
63+
std::vector<Kokkos::View<ScanPathSegment *, Kokkos::HostSpace>>
64+
host_electron_beam_scan_path_segments(
65+
_electron_beam_scan_path_segments.size());
66+
std::vector<Kokkos::View<ScanPathSegment *, Kokkos::HostSpace>>
67+
host_goldak_scan_path_segments(_goldak_scan_path_segments.size());
68+
69+
for (unsigned int i = 0; i < _electron_beam_scan_path_segments.size();
70+
++i)
71+
host_electron_beam_scan_path_segments[i] =
72+
Kokkos::create_mirror_view_and_copy(
73+
Kokkos::HostSpace{}, _electron_beam_scan_path_segments[i]);
74+
75+
for (unsigned int i = 0; i < _goldak_scan_path_segments.size(); ++i)
76+
host_goldak_scan_path_segments[i] = Kokkos::create_mirror_view_and_copy(
77+
Kokkos::HostSpace{}, _goldak_scan_path_segments[i]);
78+
79+
auto host_copy_electron_beam_heat_sources =
80+
Kokkos::create_mirror_view_and_copy(Kokkos::HostSpace{},
81+
_electron_beam_heat_sources);
82+
auto host_copy_goldak_heat_sources = Kokkos::create_mirror_view_and_copy(
83+
Kokkos::HostSpace{}, _goldak_heat_sources);
84+
85+
std::vector<BeamHeatSourceProperties> goldak_beams(
86+
_goldak_heat_sources.size());
87+
std::vector<BeamHeatSourceProperties> electron_beam_beams(
88+
_electron_beam_heat_sources.size());
89+
90+
for (unsigned int i = 0; i < _goldak_heat_sources.size(); ++i)
91+
goldak_beams.push_back(
92+
host_copy_goldak_heat_sources(i).get_beam_properties());
93+
for (unsigned int i = 0; i < _electron_beam_heat_sources.size(); ++i)
94+
electron_beam_beams.push_back(
95+
host_copy_electron_beam_heat_sources(i).get_beam_properties());
96+
97+
Kokkos::View<ElectronBeamHeatSource<dim, dealii::MemorySpace::Host> *,
98+
Kokkos::HostSpace>
99+
host_electron_beam_heat_sources(
100+
Kokkos::view_alloc(Kokkos::WithoutInitializing,
101+
"electron_beam_heat_sources"),
102+
_electron_beam_heat_sources.size());
103+
Kokkos::View<GoldakHeatSource<dim, dealii::MemorySpace::Host> *,
104+
Kokkos::HostSpace>
105+
host_goldak_heat_sources(
106+
Kokkos::view_alloc(Kokkos::WithoutInitializing,
107+
"goldak_heat_sources"),
108+
_goldak_heat_sources.size());
109+
110+
std::vector<GoldakHeatSource<dim, dealii::MemorySpace::Host>>
111+
goldak_heat_source_vector;
112+
for (unsigned int i = 0; i < _goldak_heat_sources.size(); ++i)
113+
goldak_heat_source_vector.emplace_back(
114+
goldak_beams[i], ScanPath<dealii::MemorySpace::Host>(
115+
host_goldak_scan_path_segments[i]));
116+
Kokkos::deep_copy(
117+
host_goldak_heat_sources,
118+
Kokkos::View<GoldakHeatSource<dim, dealii::MemorySpace::Host> *,
119+
Kokkos::HostSpace>(goldak_heat_source_vector.data(),
120+
goldak_heat_source_vector.size()));
121+
122+
std::vector<ElectronBeamHeatSource<dim, dealii::MemorySpace::Host>>
123+
electron_beam_heat_source_vector;
124+
for (unsigned int i = 0; i < _electron_beam_heat_sources.size(); ++i)
125+
electron_beam_heat_source_vector.emplace_back(
126+
electron_beam_beams[i],
127+
ScanPath<dealii::MemorySpace::Host>(
128+
host_electron_beam_scan_path_segments[i]));
129+
Kokkos::deep_copy(
130+
host_electron_beam_heat_sources,
131+
Kokkos::View<ElectronBeamHeatSource<dim, dealii::MemorySpace::Host> *,
132+
Kokkos::HostSpace>(
133+
electron_beam_heat_source_vector.data(),
134+
electron_beam_heat_source_vector.size()));
135+
136+
auto host_cube_heat_sources = Kokkos::create_mirror_view_and_copy(
137+
Kokkos::HostSpace{}, _cube_heat_sources);
138+
139+
return {host_electron_beam_heat_sources, host_cube_heat_sources,
140+
host_goldak_heat_sources, host_electron_beam_scan_path_segments,
141+
host_goldak_scan_path_segments};
142+
}
42143
}
43144

44145
/**
@@ -82,15 +183,16 @@ private:
82183
Kokkos::View<ElectronBeamHeatSource<dim, MemorySpace> *,
83184
typename MemorySpace::kokkos_space>
84185
_electron_beam_heat_sources;
85-
Kokkos::View<CubeHeatSource<dim, MemorySpace> *,
86-
typename MemorySpace::kokkos_space>
186+
Kokkos::View<CubeHeatSource<dim> *, typename MemorySpace::kokkos_space>
87187
_cube_heat_sources;
88188
Kokkos::View<GoldakHeatSource<dim, MemorySpace> *,
89189
typename MemorySpace::kokkos_space>
90190
_goldak_heat_sources;
91-
Kokkos::View<ScanPathSegment *, typename MemorySpace::kokkos_space>
191+
std::vector<
192+
Kokkos::View<ScanPathSegment *, typename MemorySpace::kokkos_space>>
92193
_electron_beam_scan_path_segments;
93-
Kokkos::View<ScanPathSegment *, typename MemorySpace::kokkos_space>
194+
std::vector<
195+
Kokkos::View<ScanPathSegment *, typename MemorySpace::kokkos_space>>
94196
_goldak_scan_path_segments;
95197
};
96198

@@ -103,26 +205,28 @@ HeatSources<MemorySpace, dim>::HeatSources(
103205
std::vector<BeamHeatSourceProperties> electron_beam_beams;
104206
std::vector<std::vector<ScanPathSegment>> goldak_scan_path_segments;
105207
std::vector<std::vector<ScanPathSegment>> electron_beam_scan_path_segments;
106-
std::vector<CubeHeatSource<dim, MemorySpace>> cube_heat_sources;
208+
std::vector<CubeHeatSource<dim>> cube_heat_sources;
107209

108210
for (unsigned int i = 0; i < n_beams; ++i)
109211
{
110212
boost::property_tree::ptree const &beam_database =
111213
source_database.get_child("beam_" + std::to_string(i));
112214
std::string type = beam_database.get<std::string>("type");
113-
std::vector<ScanPathSegment> scan_path_segments =
114-
ScanPath<MemorySpace>::extract_scan_paths(
115-
beam_database.get<std::string>("scan_path_file"),
116-
beam_database.get<std::string>("scan_path_file_format"));
117215
if (type == "goldak")
118216
{
119217
goldak_beams.emplace_back(beam_database);
120-
goldak_scan_path_segments.push_back(scan_path_segments);
218+
goldak_scan_path_segments.push_back(
219+
ScanPath<MemorySpace>::extract_scan_paths(
220+
beam_database.get<std::string>("scan_path_file"),
221+
beam_database.get<std::string>("scan_path_file_format")));
121222
}
122223
else if (type == "electron_beam")
123224
{
124225
electron_beam_beams.emplace_back(beam_database);
125-
electron_beam_scan_path_segments.push_back(scan_path_segments);
226+
electron_beam_scan_path_segments.push_back(
227+
ScanPath<MemorySpace>::extract_scan_paths(
228+
beam_database.get<std::string>("scan_path_file"),
229+
beam_database.get<std::string>("scan_path_file_format")));
126230
}
127231
else if (type == "cube")
128232
{
@@ -137,61 +241,37 @@ HeatSources<MemorySpace, dim>::HeatSources(
137241
}
138242

139243
std::vector<GoldakHeatSource<dim, MemorySpace>> goldak_heat_sources;
244+
for (unsigned int i = 0; i < goldak_scan_path_segments.size(); ++i)
140245
{
141-
std::vector<int> goldak_scan_path_segment_start(
142-
goldak_scan_path_segments.size() + 1);
143-
for (unsigned int i = 1; i < goldak_scan_path_segments.size() + 1; ++i)
144-
goldak_scan_path_segment_start[i] =
145-
goldak_scan_path_segment_start[i - 1] +
146-
goldak_scan_path_segments[i - 1].size();
147-
_goldak_scan_path_segments = decltype(_goldak_scan_path_segments)(
246+
_goldak_scan_path_segments.emplace_back(
148247
Kokkos::view_alloc(Kokkos::WithoutInitializing,
149-
"goldak_scan_path_segments"),
150-
goldak_scan_path_segment_start.back());
151-
for (unsigned int i = 0; i < goldak_scan_path_segments.size(); ++i)
152-
{
153-
auto goldak_scan_path_segment =
154-
Kokkos::subview(_goldak_scan_path_segments,
155-
Kokkos::pair(goldak_scan_path_segment_start[i],
156-
goldak_scan_path_segment_start[i + 1]));
157-
Kokkos::deep_copy(goldak_scan_path_segment,
158-
Kokkos::View<ScanPathSegment *, Kokkos::HostSpace>(
159-
goldak_scan_path_segments[i].data(),
160-
goldak_scan_path_segments[i].size()));
161-
goldak_heat_sources.emplace_back(
162-
goldak_beams[i], ScanPath<MemorySpace>(goldak_scan_path_segment));
163-
}
248+
"goldak_scan_path_segments_" + std::to_string(i)),
249+
goldak_scan_path_segments[i].size());
250+
Kokkos::deep_copy(_goldak_scan_path_segments.back(),
251+
Kokkos::View<ScanPathSegment *, Kokkos::HostSpace>(
252+
goldak_scan_path_segments[i].data(),
253+
goldak_scan_path_segments[i].size()));
254+
goldak_heat_sources.emplace_back(
255+
goldak_beams[i],
256+
ScanPath<MemorySpace>(_goldak_scan_path_segments.back()));
164257
}
165258

166259
std::vector<ElectronBeamHeatSource<dim, MemorySpace>>
167260
electron_beam_heat_sources;
261+
for (unsigned int i = 0; i < electron_beam_scan_path_segments.size(); ++i)
168262
{
169-
std::vector<int> electron_beam_scan_path_segment_start(
170-
electron_beam_scan_path_segments.size() + 1);
171-
for (unsigned int i = 1; i < electron_beam_scan_path_segments.size() + 1;
172-
++i)
173-
electron_beam_scan_path_segment_start[i] =
174-
electron_beam_scan_path_segment_start[i - 1] +
175-
electron_beam_scan_path_segments[i - 1].size();
176-
_electron_beam_scan_path_segments =
177-
decltype(_electron_beam_scan_path_segments)(
178-
Kokkos::view_alloc(Kokkos::WithoutInitializing,
179-
"electron_beam_scan_path_segments"),
180-
electron_beam_scan_path_segment_start.back());
181-
for (unsigned int i = 0; i < electron_beam_scan_path_segments.size(); ++i)
182-
{
183-
auto electron_beam_scan_path_segment = Kokkos::subview(
184-
_electron_beam_scan_path_segments,
185-
Kokkos::pair(electron_beam_scan_path_segment_start[i],
186-
electron_beam_scan_path_segment_start[i + 1]));
187-
Kokkos::deep_copy(electron_beam_scan_path_segment,
188-
Kokkos::View<ScanPathSegment *, Kokkos::HostSpace>(
189-
electron_beam_scan_path_segments[i].data(),
190-
electron_beam_scan_path_segments[i].size()));
191-
electron_beam_heat_sources.emplace_back(
192-
electron_beam_beams[i],
193-
ScanPath<MemorySpace>(electron_beam_scan_path_segment));
194-
}
263+
_electron_beam_scan_path_segments.emplace_back(
264+
Kokkos::view_alloc(Kokkos::WithoutInitializing,
265+
"electron_beam_scan_path_segments_" +
266+
std::to_string(i)),
267+
electron_beam_scan_path_segments[i].size());
268+
Kokkos::deep_copy(_electron_beam_scan_path_segments.back(),
269+
Kokkos::View<ScanPathSegment *, Kokkos::HostSpace>(
270+
electron_beam_scan_path_segments[i].data(),
271+
electron_beam_scan_path_segments[i].size()));
272+
electron_beam_heat_sources.emplace_back(
273+
electron_beam_beams[i],
274+
ScanPath<MemorySpace>(_electron_beam_scan_path_segments.back()));
195275
}
196276

197277
_goldak_heat_sources = decltype(_goldak_heat_sources)(
@@ -213,10 +293,9 @@ HeatSources<MemorySpace, dim>::HeatSources(
213293
Kokkos::View<ElectronBeamHeatSource<dim, MemorySpace> *,
214294
Kokkos::HostSpace>(electron_beam_heat_sources.data(),
215295
electron_beam_heat_sources.size()));
216-
Kokkos::deep_copy(
217-
_cube_heat_sources,
218-
Kokkos::View<CubeHeatSource<dim, MemorySpace> *, Kokkos::HostSpace>(
219-
cube_heat_sources.data(), cube_heat_sources.size()));
296+
Kokkos::deep_copy(_cube_heat_sources,
297+
Kokkos::View<CubeHeatSource<dim> *, Kokkos::HostSpace>(
298+
cube_heat_sources.data(), cube_heat_sources.size()));
220299
}
221300

222301
template <typename MemorySpace, int dim>
@@ -268,8 +347,6 @@ HeatSources<MemorySpace, dim>::get_scan_paths() const
268347
std::vector<ScanPath<MemorySpace>> scan_paths;
269348
for (unsigned int i = 0; i < _electron_beam_heat_sources.size(); ++i)
270349
scan_paths.push_back(_electron_beam_heat_sources(i).get_scan_path());
271-
for (unsigned int i = 0; i < _cube_heat_sources.size(); ++i)
272-
scan_paths.push_back(_cube_heat_sources(i).get_scan_path());
273350
for (unsigned int i = 0; i < _goldak_heat_sources.size(); ++i)
274351
scan_paths.push_back(_goldak_heat_sources(i).get_scan_path());
275352
return scan_paths;

tests/test_implicit_operator.cc

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,14 @@ BOOST_AUTO_TEST_CASE(implicit_operator)
7474
mat_prop_database);
7575

7676
boost::property_tree::ptree beam_database;
77-
beam_database.put("depth", 0.1);
78-
beam_database.put("absorption_efficiency", 0.1);
79-
beam_database.put("diameter", 1.0);
80-
beam_database.put("max_power", 10.);
81-
beam_database.put("scan_path_file", "scan_path.txt");
82-
beam_database.put("scan_path_file_format", "segment");
77+
beam_database.put("n_beams", 1);
78+
beam_database.put("beam_0.type", "goldak");
79+
beam_database.put("beam_0.depth", 0.1);
80+
beam_database.put("beam_0.absorption_efficiency", 0.1);
81+
beam_database.put("beam_0.diameter", 1.0);
82+
beam_database.put("beam_0.max_power", 10.);
83+
beam_database.put("beam_0.scan_path_file", "scan_path.txt");
84+
beam_database.put("beam_0.scan_path_file_format", "segment");
8385
adamantine::HeatSources<dealii::MemorySpace::Host, 2> heat_sources(
8486
beam_database);
8587

0 commit comments

Comments
 (0)