@@ -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
222301template <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;
0 commit comments