Shamrock 2025.10.0
Astrophysical Code
Loading...
Searching...
No Matches
VTKDump.cpp
Go to the documentation of this file.
1// -------------------------------------------------------//
2//
3// SHAMROCK code for hydrodynamics
4// Copyright (c) 2021-2026 Timothée David--Cléris <tim.shamrock@proton.me>
5// SPDX-License-Identifier: CeCILL Free Software License Agreement v2.1
6// Shamrock is licensed under the CeCILL 2.1 License, see LICENSE for more information
7//
8// -------------------------------------------------------//
9
26
27// Use shared VTK dump utilities
33
35
36 template<class Tvec, template<class> class SPHKernel>
37 void VTKDump<Tvec, SPHKernel>::do_dump(std::string filename, bool add_patch_world_id) {
38
39 StackEntry stack_loc{};
40
41 using namespace shamrock;
42 using namespace shamrock::patch;
43 shamrock::SchedulerUtility utility(scheduler());
44
45 PatchDataLayerLayout &pdl = scheduler().pdl_old();
46 const u32 ixyz = pdl.get_field_idx<Tvec>("xyz");
47 const u32 ivxyz = pdl.get_field_idx<Tvec>("vxyz");
48 const u32 iaxyz = pdl.get_field_idx<Tvec>("axyz");
49 const u32 iuint = pdl.get_field_idx<Tscal>("uint");
50 const u32 iduint = pdl.get_field_idx<Tscal>("duint");
51 const u32 ihpart = pdl.get_field_idx<Tscal>("hpart");
52 ComputeField<Tscal> density = utility.make_compute_field<Tscal>("rho", 1);
53
54 scheduler().for_each_patchdata_nonempty([&](const Patch p, PatchDataLayer &pdat) {
55 shamlog_debug_ln("sph::vtk", "compute rho field for patch ", p.id_patch);
56
57 auto &buf_hpart = pdat.get_field<Tscal>(ihpart).get_buf();
58
59 auto sptr = shamsys::instance::get_compute_scheduler_ptr();
60 auto &q = sptr->get_queue();
61
62 sham::EventList depends_list;
63 const Tscal *acc_h = buf_hpart.get_read_access(depends_list);
64 auto acc_rho = density.get_buf(p.id_patch).get_write_access(depends_list);
65
66 auto e = q.submit(depends_list, [&](sycl::handler &cgh) {
67 const Tscal part_mass = solver_config.gpart_mass;
68
69 cgh.parallel_for(sycl::range<1>{pdat.get_obj_cnt()}, [=](sycl::item<1> item) {
70 u32 gid = (u32) item.get_id();
71 using namespace shamrock::sph;
72 Tscal rho_ha = rho_h(part_mass, acc_h[gid], Kernel::hfactd);
73 acc_rho[gid] = rho_ha;
74 });
75 });
76
77 buf_hpart.complete_event_state(e);
78 density.get_buf(p.id_patch).complete_event_state(e);
79 });
80
81 shamrock::LegacyVtkWriter writer = start_dump<Tvec>(scheduler(), filename);
82 writer.add_point_data_section();
83
84 u32 fnum = 0;
85 if (add_patch_world_id) {
86 fnum += 2;
87 }
88 fnum++;
89 fnum++;
90 fnum++;
91 fnum++;
92 fnum++;
93
94 if (solver_config.has_field_alphaAV()) {
95 fnum++;
96 }
97
98 if (solver_config.has_field_divv()) {
99 fnum++;
100 }
101
102 if (solver_config.has_field_curlv()) {
103 fnum++;
104 }
105
106 if (solver_config.has_field_soundspeed()) {
107 fnum++;
108 }
109
110 if (solver_config.has_field_dtdivv()) {
111 fnum++;
112 }
113
114 if (solver_config.compute_luminosity) {
115 fnum++;
116 }
117
118 if (solver_config.dust_config.has_epsilon_field()) {
119 const u32 ndust = solver_config.dust_config.get_dust_nvar();
120 fnum += ndust;
121 }
122
123 if (solver_config.dust_config.has_deltav_field()) {
124 const u32 ndust = solver_config.dust_config.get_dust_nvar();
125 fnum += ndust;
126 }
127
128 writer.add_field_data_section(fnum);
129
130 if (add_patch_world_id) {
131 vtk_dump_add_patch_id(scheduler(), writer);
132 vtk_dump_add_worldrank(scheduler(), writer);
133 }
134
135 vtk_dump_add_field<Tscal>(scheduler(), writer, ihpart, "h");
136 vtk_dump_add_field<Tscal>(scheduler(), writer, iuint, "u");
137 vtk_dump_add_field<Tvec>(scheduler(), writer, ivxyz, "v");
138 vtk_dump_add_field<Tvec>(scheduler(), writer, iaxyz, "a");
139
140 if (solver_config.has_field_alphaAV()) {
141 const u32 ialpha_AV = pdl.get_field_idx<Tscal>("alpha_AV");
142 vtk_dump_add_field<Tscal>(scheduler(), writer, ialpha_AV, "alpha_AV");
143 }
144
145 if (solver_config.has_field_divv()) {
146 const u32 idivv = pdl.get_field_idx<Tscal>("divv");
147 vtk_dump_add_field<Tscal>(scheduler(), writer, idivv, "divv");
148 }
149
150 if (solver_config.has_field_dtdivv()) {
151 const u32 idtdivv = pdl.get_field_idx<Tscal>("dtdivv");
152 vtk_dump_add_field<Tscal>(scheduler(), writer, idtdivv, "dtdivv");
153 }
154
155 if (solver_config.has_field_curlv()) {
156 const u32 icurlv = pdl.get_field_idx<Tvec>("curlv");
157 vtk_dump_add_field<Tvec>(scheduler(), writer, icurlv, "curlv");
158 }
159
160 if (solver_config.has_field_soundspeed()) {
161 const u32 isoundspeed = pdl.get_field_idx<Tscal>("soundspeed");
162 vtk_dump_add_field<Tscal>(scheduler(), writer, isoundspeed, "soundspeed");
163 }
164
165 if (solver_config.compute_luminosity) {
166 const u32 iluminosity = pdl.get_field_idx<Tscal>("luminosity");
167 vtk_dump_add_field<Tscal>(scheduler(), writer, iluminosity, "luminosity");
168 }
169
170 vtk_dump_add_compute_field(scheduler(), writer, density, "rho");
171
172 if (solver_config.dust_config.has_epsilon_field()) {
173 const u32 iepsilon = pdl.get_field_idx<Tscal>("epsilon");
174 const u32 ndust = solver_config.dust_config.get_dust_nvar();
175
176 for (u32 idust = 0; idust < ndust; idust++) {
177 ComputeField<Tscal> tmp_epsilon
178 = utility.make_compute_field<Tscal>("tmp_epsilon", 1);
179
180 scheduler().for_each_patchdata_nonempty([&](const Patch p, PatchDataLayer &pdat) {
181 shamlog_debug_ln(
182 "sph::vtk",
183 "compute extract epsilon field with idust =",
184 idust,
185 p.id_patch);
186
187 auto &buf_epsilon = pdat.get_field<Tscal>(iepsilon);
188 PatchDataFieldSpan<Tscal> span_epsilon{buf_epsilon, 0, pdat.get_obj_cnt()};
189
190 auto sptr = shamsys::instance::get_compute_scheduler_ptr();
191 auto &q = sptr->get_queue();
192
194 q,
195 sham::MultiRef{span_epsilon},
196 sham::MultiRef{tmp_epsilon.get_buf(p.id_patch)},
197 pdat.get_obj_cnt(),
198 [&, idust](u32 i, auto epsilon_field, Tscal *acc_epsilon) {
199 acc_epsilon[i] = epsilon_field(i, idust);
200 });
201 });
202
203 vtk_dump_add_compute_field(
204 scheduler(), writer, tmp_epsilon, "epsilon_" + std::to_string(idust));
205 }
206 }
207
208 if (solver_config.dust_config.has_deltav_field()) {
209 const u32 ideltav = pdl.get_field_idx<Tvec>("deltav");
210 const u32 ndust = solver_config.dust_config.get_dust_nvar();
211
212 for (u32 idust = 0; idust < ndust; idust++) {
213 ComputeField<Tvec> tmp_deltav = utility.make_compute_field<Tvec>("tmp_deltav", 1);
214
215 scheduler().for_each_patchdata_nonempty([&](const Patch p, PatchDataLayer &pdat) {
216 shamlog_debug_ln(
217 "sph::vtk", "compute extract deltav field with idust =", idust, p.id_patch);
218
219 auto &buf_deltav = pdat.get_field<Tvec>(ideltav);
220 PatchDataFieldSpan<Tvec> span_deltav{buf_deltav, 0, pdat.get_obj_cnt()};
221
222 auto sptr = shamsys::instance::get_compute_scheduler_ptr();
223 auto &q = sptr->get_queue();
224
226 q,
227 sham::MultiRef{span_deltav},
228 sham::MultiRef{tmp_deltav.get_buf(p.id_patch)},
229 pdat.get_obj_cnt(),
230 [&, idust](u32 i, auto deltav_field, Tvec *acc_deltav) {
231 acc_deltav[i] = deltav_field(i, idust);
232 });
233 });
234
235 vtk_dump_add_compute_field(
236 scheduler(), writer, tmp_deltav, "deltav_" + std::to_string(idust));
237 }
238 }
239 }
240
241} // namespace shammodels::sph::modules
242
243using namespace shammath;
244
248
Shared VTK dump utilities for SPH-based models.
void vtk_dump_add_compute_field(PatchScheduler &sched, shamrock::LegacyVtkWriter &writer, shamrock::ComputeField< T > &field, const std::string &field_dump_name)
Add a compute field to VTK dump.
void vtk_dump_add_field(PatchScheduler &sched, shamrock::LegacyVtkWriter &writer, u32 field_idx, const std::string &field_dump_name)
Add a data field to VTK dump.
shamrock::LegacyVtkWriter start_dump(PatchScheduler &sched, const std::string &dump_name)
Start a VTK dump by writing particle positions.
void vtk_dump_add_patch_id(PatchScheduler &sched, shamrock::LegacyVtkWriter &writer)
Add patch ID field to VTK dump.
void vtk_dump_add_worldrank(PatchScheduler &sched, shamrock::LegacyVtkWriter &writer)
Add world rank field to VTK dump.
std::uint32_t u32
32 bit unsigned integer
Class to manage a list of SYCL events.
Definition EventList.hpp:31
Module for writing VTK format output files.
Definition VTKDump.hpp:33
void do_dump(std::string filename, bool add_patch_world_id)
Writes particle data to VTK file for visualization.
Definition VTKDump.cpp:37
Represents a span of data within a PatchDataField.
ComputeField< T > make_compute_field(std::string new_name, u32 nvar)
create a compute field and init it to zeros
u32 get_field_idx(const std::string &field_name) const
Get the field id if matching name & type.
PatchDataLayer container class, the layout is described in patchdata_layout.
void kernel_call(sham::DeviceQueue &q, RefIn in, RefOut in_out, u32 n, Functor &&func, SourceLocation &&callsite=SourceLocation{})
Submit a kernel to a SYCL queue.
namespace for math utility
Definition AABB.hpp:26
namespace for the sph model modules
namespace for the main framework
Definition __init__.py:1
A class that references multiple buffers or similar objects.
Patch object that contain generic patch information.
Definition Patch.hpp:33