@@ -43,6 +43,14 @@ public:
4343 */
4444 void update_time (double time);
4545
46+ /* *
47+ * Update the scan paths for all heat sources reading again from the
48+ * respective files.
49+ */
50+ template <typename Dummy = MemorySpaceType>
51+ std::enable_if_t <std::is_same_v<Dummy, dealii::MemorySpace::Host>>
52+ update_scan_paths ();
53+
4654 /* *
4755 * Compute the cumulative heat source at a given point at a given time given
4856 * the current height of the object being manufactured.
@@ -77,6 +85,11 @@ private:
7785 friend class HeatSources <dim, dealii::MemorySpace::Default>;
7886 friend class HeatSources <dim, dealii::MemorySpace::Host>;
7987
88+ /* *
89+ * Private helper for update_scan_paths
90+ */
91+ void internal_update_scan_paths ();
92+
8093 /* *
8194 * Private constructor used by copy_to_host.
8295 */
@@ -117,17 +130,70 @@ private:
117130 std::vector<int > _electron_beam_indices;
118131 std::vector<int > _cube_indices;
119132 std::vector<int > _goldak_indices;
133+
134+ std::vector<std::string> _goldak_scan_files;
135+ std::vector<std::string> _electron_beam_scan_files;
136+ std::vector<std::string> _goldak_scan_formats;
137+ std::vector<std::string> _electron_beam_scan_formats;
120138};
121139
140+ template <int dim, typename MemorySpaceType>
141+ void HeatSources<dim, MemorySpaceType>::internal_update_scan_paths()
142+ {
143+ std::vector<ScanPathSegment> scan_path_segments;
144+ _goldak_scan_path_segments.clear ();
145+ for (unsigned int i = 0 ; i < _goldak_indices.size (); ++i)
146+ {
147+ scan_path_segments = ScanPath<MemorySpaceType>::extract_scan_paths (
148+ _goldak_scan_files[i], _goldak_scan_formats[i]);
149+ _goldak_scan_path_segments.emplace_back (
150+ Kokkos::view_alloc (Kokkos::WithoutInitializing,
151+ " goldak_scan_path_segments_" + std::to_string (i)),
152+ scan_path_segments.size ());
153+ Kokkos::deep_copy (
154+ _goldak_scan_path_segments.back (),
155+ Kokkos::View<ScanPathSegment *, Kokkos::HostSpace>(
156+ scan_path_segments.data (), scan_path_segments.size ()));
157+ }
158+ _electron_beam_scan_path_segments.clear ();
159+ for (unsigned int i = 0 ; i < _electron_beam_indices.size (); ++i)
160+ {
161+ scan_path_segments = ScanPath<MemorySpaceType>::extract_scan_paths (
162+ _electron_beam_scan_files[i], _electron_beam_scan_formats[i]);
163+ _electron_beam_scan_path_segments.emplace_back (
164+ Kokkos::view_alloc (Kokkos::WithoutInitializing,
165+ " electron_beam_scan_path_segments_" +
166+ std::to_string (i)),
167+ scan_path_segments.size ());
168+ Kokkos::deep_copy (
169+ _electron_beam_scan_path_segments.back (),
170+ Kokkos::View<ScanPathSegment *, Kokkos::HostSpace>(
171+ scan_path_segments.data (), scan_path_segments.size ()));
172+ }
173+ }
174+
175+ template <int dim, typename MemorySpaceType>
176+ template <typename Dummy>
177+ std::enable_if_t <std::is_same_v<Dummy, dealii::MemorySpace::Host>>
178+ HeatSources<dim, MemorySpaceType>::update_scan_paths()
179+ {
180+ internal_update_scan_paths ();
181+
182+ for (unsigned int i = 0 ; i < _goldak_heat_sources.size (); ++i)
183+ _goldak_heat_sources (i).set_scan_path (
184+ ScanPath<MemorySpaceType>{_goldak_scan_path_segments[i]});
185+ for (unsigned int i = 0 ; i < _electron_beam_heat_sources.size (); ++i)
186+ _electron_beam_heat_sources (i).set_scan_path (
187+ ScanPath<MemorySpaceType>{_electron_beam_scan_path_segments[i]});
188+ }
189+
122190template <int dim, typename MemorySpaceType>
123191HeatSources<dim, MemorySpaceType>::HeatSources(
124192 boost::property_tree::ptree const &source_database)
125193{
126194 unsigned int const n_beams = source_database.get <unsigned int >(" n_beams" );
127195 std::vector<BeamHeatSourceProperties> goldak_beams;
128196 std::vector<BeamHeatSourceProperties> electron_beam_beams;
129- std::vector<std::vector<ScanPathSegment>> goldak_scan_path_segments;
130- std::vector<std::vector<ScanPathSegment>> electron_beam_scan_path_segments;
131197 std::vector<CubeHeatSource<dim>> cube_heat_sources;
132198
133199 for (unsigned int i = 0 ; i < n_beams; ++i)
@@ -138,20 +204,20 @@ HeatSources<dim, MemorySpaceType>::HeatSources(
138204 if (type == " goldak" )
139205 {
140206 goldak_beams.emplace_back (beam_database);
141- goldak_scan_path_segments.push_back (
142- ScanPath<MemorySpaceType>::extract_scan_paths (
143- beam_database.get <std::string>(" scan_path_file" ),
144- beam_database.get <std::string>(" scan_path_file_format" )));
145207 _goldak_indices.push_back (i);
208+ _goldak_scan_files.push_back (
209+ beam_database.get <std::string>(" scan_path_file" ));
210+ _goldak_scan_formats.push_back (
211+ beam_database.get <std::string>(" scan_path_file_format" ));
146212 }
147213 else if (type == " electron_beam" )
148214 {
149215 electron_beam_beams.emplace_back (beam_database);
150- electron_beam_scan_path_segments.push_back (
151- ScanPath<MemorySpaceType>::extract_scan_paths (
152- beam_database.get <std::string>(" scan_path_file" ),
153- beam_database.get <std::string>(" scan_path_file_format" )));
154216 _electron_beam_indices.push_back (i);
217+ _electron_beam_scan_files.push_back (
218+ beam_database.get <std::string>(" scan_path_file" ));
219+ _electron_beam_scan_formats.push_back (
220+ beam_database.get <std::string>(" scan_path_file_format" ));
155221 }
156222 else if (type == " cube" )
157223 {
@@ -166,35 +232,20 @@ HeatSources<dim, MemorySpaceType>::HeatSources(
166232 }
167233 }
168234
235+ internal_update_scan_paths ();
236+
169237 std::vector<GoldakHeatSource<dim, MemorySpaceType>> goldak_heat_sources;
170- for (unsigned int i = 0 ; i < goldak_scan_path_segments .size (); ++i)
238+ for (unsigned int i = 0 ; i < goldak_beams .size (); ++i)
171239 {
172- _goldak_scan_path_segments.emplace_back (
173- Kokkos::view_alloc (Kokkos::WithoutInitializing,
174- " goldak_scan_path_segments_" + std::to_string (i)),
175- goldak_scan_path_segments[i].size ());
176- Kokkos::deep_copy (_goldak_scan_path_segments.back (),
177- Kokkos::View<ScanPathSegment *, Kokkos::HostSpace>(
178- goldak_scan_path_segments[i].data (),
179- goldak_scan_path_segments[i].size ()));
180240 goldak_heat_sources.emplace_back (
181241 goldak_beams[i],
182242 ScanPath<MemorySpaceType>(_goldak_scan_path_segments.back ()));
183243 }
184244
185245 std::vector<ElectronBeamHeatSource<dim, MemorySpaceType>>
186246 electron_beam_heat_sources;
187- for (unsigned int i = 0 ; i < electron_beam_scan_path_segments .size (); ++i)
247+ for (unsigned int i = 0 ; i < electron_beam_beams .size (); ++i)
188248 {
189- _electron_beam_scan_path_segments.emplace_back (
190- Kokkos::view_alloc (Kokkos::WithoutInitializing,
191- " electron_beam_scan_path_segments_" +
192- std::to_string (i)),
193- electron_beam_scan_path_segments[i].size ());
194- Kokkos::deep_copy (_electron_beam_scan_path_segments.back (),
195- Kokkos::View<ScanPathSegment *, Kokkos::HostSpace>(
196- electron_beam_scan_path_segments[i].data (),
197- electron_beam_scan_path_segments[i].size ()));
198249 electron_beam_heat_sources.emplace_back (
199250 electron_beam_beams[i],
200251 ScanPath<MemorySpaceType>(_electron_beam_scan_path_segments.back ()));
0 commit comments