Shamrock 2025.10.0
Astrophysical Code
Loading...
Searching...
No Matches
ExternalForces.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
17
18#include "shambase/memory.hpp"
21#include "shamcomm/logs.hpp"
38
39namespace shambase {
40
41 template<class T>
42 std::shared_ptr<T> to_shared(T &&t) {
43 return std::make_shared<T>(std::forward<T>(t));
44 }
45} // namespace shambase
46
47template<class Tvec, template<class> class SPHKernel>
49
50 StackEntry stack_loc{};
51
52 sham::DeviceQueue &q = shamsys::instance::get_compute_scheduler().get_queue();
53
54 Tscal gpart_mass = solver_config.gpart_mass;
55
56 using namespace shamrock;
57 using namespace shamrock::patch;
58
59 PatchDataLayerLayout &pdl = scheduler().pdl_old();
60
61 const u32 iaxyz_ext = pdl.get_field_idx<Tvec>("axyz_ext");
62 modules::SinkParticlesUpdate<Tvec, SPHKernel> sink_update(context, solver_config, storage);
63
64 scheduler().for_each_patchdata_nonempty([&](Patch cur_p, PatchDataLayer &pdat) {
65 PatchDataField<Tvec> &field = pdat.get_field<Tvec>(iaxyz_ext);
66 field.field_raz();
67 });
68
69 sink_update.compute_sph_forces();
70
71 if (solver_config.ext_force_config.ext_forces.empty()) {
72 return;
73 }
74
75 auto field_xyz = shamrock::solvergraph::FieldRefs<Tvec>::make_shared("", "");
76
78 [&](shamrock::solvergraph::FieldRefs<Tvec> &field_xyz_edge) {
80 scheduler().for_each_patchdata_nonempty([&](const Patch p, PatchDataLayer &pdat) {
81 auto &field = pdat.get_field<Tvec>(0);
82 field_xyz_refs.add_obj(p.id_patch, std::ref(field));
83 });
84 field_xyz_edge.set_refs(field_xyz_refs);
85 });
86 set_field_xyz.set_edges(field_xyz);
87 set_field_xyz.evaluate();
88
89 auto field_axyz_ext = shamrock::solvergraph::FieldRefs<Tvec>::make_shared("", "");
90
92 [&](shamrock::solvergraph::FieldRefs<Tvec> &field_axyz_ext_edge) {
94 scheduler().for_each_patchdata_nonempty([&](const Patch p, PatchDataLayer &pdat) {
95 auto &field = pdat.get_field<Tvec>(iaxyz_ext);
96 field_axyz_ext_refs.add_obj(p.id_patch, std::ref(field));
97 });
98 field_axyz_ext_edge.set_refs(field_axyz_ext_refs);
99 });
100 set_field_axyz_ext.set_edges(field_axyz_ext);
101 set_field_axyz_ext.evaluate();
102
103 auto sizes = shamrock::solvergraph::Indexes<u32>::make_shared("", "");
104
107 sizes.indexes = {};
108 scheduler().for_each_patchdata_nonempty([&](const Patch p, PatchDataLayer &pdat) {
109 sizes.indexes.add_obj(p.id_patch, pdat.get_obj_cnt());
110 });
111 });
112 set_sizes.set_edges(sizes);
113 set_sizes.evaluate();
114
115 auto constant_G = shamrock::solvergraph::IDataEdge<Tscal>::make_shared("", "");
116 auto constant_c = shamrock::solvergraph::IDataEdge<Tscal>::make_shared("", "");
117
120 constant_G.data = solver_config.get_constant_G();
121 });
122
125 constant_c.data = solver_config.get_constant_c();
126 });
127
128 set_constant_G.set_edges(constant_G);
129 set_constant_c.set_edges(constant_c);
130
131 std::vector<std::shared_ptr<shamrock::solvergraph::INode>> add_ext_forces_seq{};
132 add_ext_forces_seq.push_back(shambase::to_shared(std::move(set_constant_G)));
133 add_ext_forces_seq.push_back(shambase::to_shared(std::move(set_constant_c)));
134
135 for (auto var_force : solver_config.ext_force_config.ext_forces) {
136 if (EF_PointMass *ext_force = std::get_if<EF_PointMass>(&var_force.val)) {
137
138 auto central_mass = shamrock::solvergraph::IDataEdge<Tscal>::make_shared("", "");
139 auto central_pos = shamrock::solvergraph::IDataEdge<Tvec>::make_shared("", "");
140
142 set_central_mass([cmass = ext_force->central_mass](
144 central_mass.data = cmass;
145 });
146 set_central_mass.set_edges(central_mass);
147
149 set_central_pos([cpos = ext_force->central_pos](
151 central_pos.data = cpos;
152 });
153 set_central_pos.set_edges(central_pos);
154
155 common::modules::AddForceCentralGravPotential<Tvec> add_force_central_grav_potential;
156 add_force_central_grav_potential.set_edges(
157 constant_G, central_mass, central_pos, field_xyz, sizes, field_axyz_ext);
158
159 add_ext_forces_seq.push_back(
160 std::make_shared<shamrock::solvergraph::OperationSequence>(
161 "Point mass",
162 std::vector<std::shared_ptr<shamrock::solvergraph::INode>>{
163 shambase::to_shared(std::move(set_central_pos)),
164 shambase::to_shared(std::move(set_central_mass)),
165 shambase::to_shared(std::move(add_force_central_grav_potential))}));
166
167 } else if (EF_PN_PW *ext_force = std::get_if<EF_PN_PW>(&var_force.val)) {
168
169 auto central_mass = shamrock::solvergraph::IDataEdge<Tscal>::make_shared("", "");
170 auto central_pos = shamrock::solvergraph::IDataEdge<Tvec>::make_shared("", "");
171
173 set_central_mass([cmass = ext_force->central_mass](
175 central_mass.data = cmass;
176 });
177 set_central_mass.set_edges(central_mass);
178
180 set_central_pos([cpos = ext_force->central_pos](
182 central_pos.data = cpos;
183 });
184 set_central_pos.set_edges(central_pos);
185
186 common::modules::AddForcePaczynskiWiita<Tvec> add_force_paczynski_wiita;
187 add_force_paczynski_wiita.set_edges(
188 constant_G,
189 constant_c,
190 central_mass,
191 central_pos,
192 field_xyz,
193 sizes,
194 field_axyz_ext);
195
196 add_ext_forces_seq.push_back(
197 std::make_shared<shamrock::solvergraph::OperationSequence>(
198 "Pseudo-Newtonian PW",
199 std::vector<std::shared_ptr<shamrock::solvergraph::INode>>{
200 shambase::to_shared(std::move(set_central_pos)),
201 shambase::to_shared(std::move(set_central_mass)),
202 shambase::to_shared(std::move(add_force_paczynski_wiita))}));
203
204 } else if (EF_LenseThirring *ext_force = std::get_if<EF_LenseThirring>(&var_force.val)) {
205
206 auto central_mass = shamrock::solvergraph::IDataEdge<Tscal>::make_shared("", "");
207 auto central_pos = shamrock::solvergraph::IDataEdge<Tvec>::make_shared("", "");
208 auto central_vel = shamrock::solvergraph::IDataEdge<Tvec>::make_shared("", "");
209
211 set_central_mass([cmass = ext_force->central_mass](
213 central_mass.data = cmass;
214 });
215 set_central_mass.set_edges(central_mass);
216
218 set_central_pos([cpos = ext_force->central_pos](
220 central_pos.data = cpos;
221 });
222 set_central_pos.set_edges(central_pos);
223
225 set_central_vel([cvel = ext_force->central_vel](
227 central_vel.data = cvel;
228 });
229 set_central_vel.set_edges(central_vel);
230
231 common::modules::AddForceCentralGravPotential<Tvec> add_force_central_grav_potential;
232 add_force_central_grav_potential.set_edges(
233 constant_G, central_mass, central_pos, field_xyz, sizes, field_axyz_ext);
234
235 add_ext_forces_seq.push_back(
236 std::make_shared<shamrock::solvergraph::OperationSequence>(
237 "Point mass",
238 std::vector<std::shared_ptr<shamrock::solvergraph::INode>>{
239 shambase::to_shared(std::move(set_central_pos)),
240 shambase::to_shared(std::move(set_central_mass)),
241 shambase::to_shared(std::move(add_force_central_grav_potential))}));
242
243 } else if (
244 EF_ShearingBoxForce *ext_force = std::get_if<EF_ShearingBoxForce>(&var_force.val)) {
245
246 auto eta = shamrock::solvergraph::IDataEdge<Tscal>::make_shared("", "");
249 eta.data = ext_force->eta;
250 });
251 set_eta.set_edges(eta);
252
254 add_force_shearing_box_inertial_part{};
255 add_force_shearing_box_inertial_part.set_edges(eta, field_xyz, sizes, field_axyz_ext);
256
257 add_ext_forces_seq.push_back(
258 std::make_shared<shamrock::solvergraph::OperationSequence>(
259 "Shearing box force",
260 std::vector<std::shared_ptr<shamrock::solvergraph::INode>>{
261 shambase::to_shared(std::move(set_eta)),
262 shambase::to_shared(std::move(add_force_shearing_box_inertial_part))}));
263
264 } else if (
265 EF_VerticalDiscPotential *ext_force
266 = std::get_if<EF_VerticalDiscPotential>(&var_force.val)) {
267
268 auto central_mass = shamrock::solvergraph::IDataEdge<Tscal>::make_shared("", "");
269 auto R0 = shamrock::solvergraph::IDataEdge<Tscal>::make_shared("", "");
270
272 set_central_mass([cmass = ext_force->central_mass](
274 central_mass.data = cmass;
275 });
276 set_central_mass.set_edges(central_mass);
277
279 [r = ext_force->R0](shamrock::solvergraph::IDataEdge<Tscal> &R0) {
280 R0.data = r; // no support for offset yet
281 });
282 set_R0.set_edges(R0);
283
284 common::modules::AddForceVerticalDiscPotential<Tvec> add_force_vertical_disc_potential;
285 add_force_vertical_disc_potential.set_edges(
286 constant_G, central_mass, R0, field_xyz, sizes, field_axyz_ext);
287
288 add_ext_forces_seq.push_back(
289 std::make_shared<shamrock::solvergraph::OperationSequence>(
290 "Vertical disc potential",
291 std::vector<std::shared_ptr<shamrock::solvergraph::INode>>{
292 shambase::to_shared(std::move(set_R0)),
293 shambase::to_shared(std::move(set_central_mass)),
294 shambase::to_shared(std::move(add_force_vertical_disc_potential))}));
295
296 } else if (
297 EF_VelocityDissipation *ext_force
298 = std::get_if<EF_VelocityDissipation>(&var_force.val)) {
299
300 } else {
301 shambase::throw_unimplemented("this force is not handled, yet ...");
302 }
303 }
304
305 if (add_ext_forces_seq.size() > 0) {
307 "Add external forces", std::move(add_ext_forces_seq));
308 seq.evaluate();
309 }
310}
311
312template<class T>
313std::shared_ptr<shamrock::solvergraph::INode> register_constant_set(
314 shamrock::solvergraph::SolverGraph &solver_graph, std::string name, std::function<T()> getter) {
315 solver_graph.register_edge(name, shamrock::solvergraph::IDataEdge<T>("", ""));
316
317 solver_graph.register_node(
318 "set_" + name,
321 edge.data = getter();
322 }));
323
324 solver_graph
326 "set_" + name)
327 .set_edges(solver_graph.get_edge_ptr_base(name));
328
329 return solver_graph.get_node_ptr_base("set_" + name);
330}
331
332template<class Tvec, template<class> class SPHKernel>
334
335 StackEntry stack_loc{};
336
337 sham::DeviceQueue &q = shamsys::instance::get_compute_scheduler().get_queue();
338
339 Tscal gpart_mass = solver_config.gpart_mass;
340
341 using namespace shamrock;
342 using namespace shamrock::patch;
343
344 PatchDataLayerLayout &pdl = scheduler().pdl_old();
345
346 const u32 iaxyz = pdl.get_field_idx<Tvec>("axyz");
347 const u32 ivxyz = pdl.get_field_idx<Tvec>("vxyz");
348 const u32 iaxyz_ext = pdl.get_field_idx<Tvec>("axyz_ext");
349
350 scheduler().for_each_patchdata_nonempty([&](Patch cur_p, PatchDataLayer &pdat) {
351 sham::DeviceBuffer<Tvec> &buf_axyz = pdat.get_field_buf_ref<Tvec>(iaxyz);
352 sham::DeviceBuffer<Tvec> &buf_axyz_ext = pdat.get_field_buf_ref<Tvec>(iaxyz_ext);
353
354 sham::EventList depends_list;
355 auto axyz = buf_axyz.get_write_access(depends_list);
356 auto axyz_ext = buf_axyz_ext.get_read_access(depends_list);
357
358 auto e = q.submit(depends_list, [&](sycl::handler &cgh) {
359 shambase::parallel_for(
360 cgh, pdat.get_obj_cnt(), "add ext force acc to acc", [=](u64 gid) {
361 axyz[gid] += axyz_ext[gid];
362 });
363 });
364
365 buf_axyz.complete_event_state(e);
366 buf_axyz_ext.complete_event_state(e);
367 });
368
369 if (solver_config.ext_force_config.ext_forces.empty()) {
370 return; // skip if no external forces
371 }
372
373 using SolverConfigExtForce = typename Config::ExtForceConfig;
374 using EF_PointMass = typename SolverConfigExtForce::PointMass;
375 using EF_PN_PW = typename SolverConfigExtForce::PN_PW;
376 using EF_LenseThirring = typename SolverConfigExtForce::LenseThirring;
377
378 using namespace shamrock::solvergraph;
379 SolverGraph solver_graph{};
380
381 auto set_constant_G = register_constant_set<Tscal>(solver_graph, "constant_G", [&]() {
382 return solver_config.get_constant_G();
383 });
384 auto set_constant_c = register_constant_set<Tscal>(solver_graph, "constant_c", [&]() {
385 return solver_config.get_constant_c();
386 });
387
388 bool is_G_needed = false;
389 bool is_c_needed = false;
390
391 for (auto var_force : solver_config.ext_force_config.ext_forces) {
392 if (EF_PointMass *ext_force = std::get_if<EF_PointMass>(&var_force.val)) {
393
394 } else if (EF_PN_PW *ext_force = std::get_if<EF_PN_PW>(&var_force.val)) {
395 is_G_needed = true;
396 is_c_needed = true;
397 } else if (EF_LenseThirring *ext_force = std::get_if<EF_LenseThirring>(&var_force.val)) {
398 is_G_needed = true;
399 is_c_needed = true;
400 } else if (
401 EF_ShearingBoxForce *ext_force = std::get_if<EF_ShearingBoxForce>(&var_force.val)) {
402 } else if (
403 EF_VerticalDiscPotential *ext_force
404 = std::get_if<EF_VerticalDiscPotential>(&var_force.val)) {
405 } else if (
406 EF_VelocityDissipation *ext_force
407 = std::get_if<EF_VelocityDissipation>(&var_force.val)) {
408 } else {
409 shambase::throw_unimplemented("this force is not handled, yet ...");
410 }
411 }
412
413 std::vector<std::shared_ptr<shamrock::solvergraph::INode>> add_ext_forces_seq{};
414
415 if (is_G_needed) {
416 add_ext_forces_seq.push_back(set_constant_G);
417 }
418 if (is_c_needed) {
419 add_ext_forces_seq.push_back(set_constant_c);
420 }
421
422 auto field_xyz = solver_graph.register_edge("field_xyz", FieldRefs<Tvec>("", ""));
423 auto field_vxyz = solver_graph.register_edge("field_vxyz", FieldRefs<Tvec>("", ""));
424 auto field_axyz = solver_graph.register_edge("field_axyz", FieldRefs<Tvec>("", ""));
425 auto field_sizes = solver_graph.register_edge("field_sizes", Indexes<u32>("", ""));
426
427 auto set_field_xyz = solver_graph.register_node(
428 "set_field_xyz", NodeSetEdge<FieldRefs<Tvec>>([&](FieldRefs<Tvec> &field_xyz_edge) {
429 DDPatchDataFieldRef<Tvec> field_xyz_refs = {};
430 scheduler().for_each_patchdata_nonempty([&](const Patch p, PatchDataLayer &pdat) {
431 auto &field = pdat.get_field<Tvec>(0);
432 field_xyz_refs.add_obj(p.id_patch, std::ref(field));
433 });
434 field_xyz_edge.set_refs(field_xyz_refs);
435 }));
436 shambase::get_check_ref(set_field_xyz).set_edges(field_xyz);
437
438 auto set_field_vxyz = solver_graph.register_node(
439 "set_field_vxyz", NodeSetEdge<FieldRefs<Tvec>>([&](FieldRefs<Tvec> &field_vxyz_edge) {
440 DDPatchDataFieldRef<Tvec> field_vxyz_refs = {};
441 scheduler().for_each_patchdata_nonempty([&](const Patch p, PatchDataLayer &pdat) {
442 auto &field = pdat.get_field<Tvec>(ivxyz);
443 field_vxyz_refs.add_obj(p.id_patch, std::ref(field));
444 });
445 field_vxyz_edge.set_refs(field_vxyz_refs);
446 }));
447 shambase::get_check_ref(set_field_vxyz).set_edges(field_vxyz);
448
449 auto set_field_axyz = solver_graph.register_node(
450 "set_field_axyz", NodeSetEdge<FieldRefs<Tvec>>([&](FieldRefs<Tvec> &field_axyz_edge) {
451 DDPatchDataFieldRef<Tvec> field_axyz_refs = {};
452 scheduler().for_each_patchdata_nonempty([&](const Patch p, PatchDataLayer &pdat) {
453 auto &field = pdat.get_field<Tvec>(iaxyz);
454 field_axyz_refs.add_obj(p.id_patch, std::ref(field));
455 });
456 field_axyz_edge.set_refs(field_axyz_refs);
457 }));
458 shambase::get_check_ref(set_field_axyz).set_edges(field_axyz);
459
460 auto set_field_sizes = solver_graph.register_node(
461 "set_field_sizes", NodeSetEdge<Indexes<u32>>([&](Indexes<u32> &sizes) {
462 sizes.indexes = {};
463 scheduler().for_each_patchdata_nonempty([&](const Patch p, PatchDataLayer &pdat) {
464 sizes.indexes.add_obj(p.id_patch, pdat.get_obj_cnt());
465 });
466 }));
467 shambase::get_check_ref(set_field_sizes).set_edges(field_sizes);
468
469 add_ext_forces_seq.push_back(set_field_xyz);
470 add_ext_forces_seq.push_back(set_field_vxyz);
471 add_ext_forces_seq.push_back(set_field_axyz);
472 add_ext_forces_seq.push_back(set_field_sizes);
473
474 for (u32 i = 0; i < solver_config.ext_force_config.ext_forces.size(); i++) {
475
476 auto &var_force = solver_config.ext_force_config.ext_forces[i];
477
478 std::string prefix = sham::format("ext_force_{}_", i);
479
480 if (EF_PointMass *ext_force = std::get_if<EF_PointMass>(&var_force.val)) {
481
482 } else if (EF_PN_PW *ext_force = std::get_if<EF_PN_PW>(&var_force.val)) {
483
484 } else if (EF_LenseThirring *ext_force = std::get_if<EF_LenseThirring>(&var_force.val)) {
485
486 std::string prefix_cmass = prefix + "cmass_";
487 std::string prefix_central_pos = prefix + "central_pos_";
488 std::string prefix_central_vel = prefix + "central_vel_";
489 std::string prefix_a_spin = prefix + "a_spin_";
490 std::string prefix_dir_spin = prefix + "dir_spin_";
491 std::string prefix_lt = prefix + "lt_";
492
493 auto set_cmass = register_constant_set<Tscal>(solver_graph, prefix_cmass, [&]() {
494 return ext_force->central_mass;
495 });
496
497 auto set_central_pos
498 = register_constant_set<Tvec>(solver_graph, prefix_central_pos, [&]() {
499 return ext_force->central_pos;
500 });
501
502 auto set_central_vel
503 = register_constant_set<Tvec>(solver_graph, prefix_central_vel, [&]() {
504 return ext_force->central_vel;
505 });
506
507 auto set_a_spin = register_constant_set<Tscal>(solver_graph, prefix_a_spin, [&]() {
508 return ext_force->a_spin;
509 });
510
511 auto set_dir_spin = register_constant_set<Tvec>(solver_graph, prefix_dir_spin, [&]() {
512 return ext_force->dir_spin;
513 });
514
515 auto add_force_lense_thirring = solver_graph.register_node(
517 shambase::get_check_ref(add_force_lense_thirring)
518 .set_edges(
519 solver_graph.get_edge_ptr<IDataEdge<Tscal>>("constant_G"),
520 solver_graph.get_edge_ptr<IDataEdge<Tscal>>("constant_c"),
521 solver_graph.get_edge_ptr<IDataEdge<Tscal>>(prefix_cmass),
522 solver_graph.get_edge_ptr<IDataEdge<Tvec>>(prefix_central_pos),
523 solver_graph.get_edge_ptr<IDataEdge<Tvec>>(prefix_central_vel),
524 solver_graph.get_edge_ptr<IDataEdge<Tscal>>(prefix_a_spin),
525 solver_graph.get_edge_ptr<IDataEdge<Tvec>>(prefix_dir_spin),
526 solver_graph.get_edge_ptr<IFieldSpan<Tvec>>("field_xyz"),
527 solver_graph.get_edge_ptr<IFieldSpan<Tvec>>("field_vxyz"),
528 solver_graph.get_edge_ptr<Indexes<u32>>("field_sizes"),
529 solver_graph.get_edge_ptr<IFieldSpan<Tvec>>("field_axyz"));
530
531 add_ext_forces_seq.push_back(set_cmass);
532 add_ext_forces_seq.push_back(set_central_pos);
533 add_ext_forces_seq.push_back(set_a_spin);
534 add_ext_forces_seq.push_back(set_dir_spin);
535 // set_central_vel is intentionally not run: the external force's central object is
536 // stationary, so central_vel stays null.
537 add_ext_forces_seq.push_back(solver_graph.get_node_ptr_base(prefix_lt));
538
539 } else if (
540 EF_ShearingBoxForce *ext_force = std::get_if<EF_ShearingBoxForce>(&var_force.val)) {
541
542 std::string prefix_Omega_0 = prefix + "Omega_0_";
543 std::string prefix_q = prefix + "q_";
544 std::string prefix_shearing_box = prefix + "shearing_box_";
545
546 auto set_Omega_0 = register_constant_set<Tscal>(solver_graph, prefix_Omega_0, [&]() {
547 return ext_force->Omega_0;
548 });
549
550 auto set_q = register_constant_set<Tscal>(solver_graph, prefix_q, [&]() {
551 return ext_force->q;
552 });
553
554 auto add_force_shearing_box_non_inertial = solver_graph.register_node(
555 prefix_shearing_box,
557 shambase::get_check_ref(add_force_shearing_box_non_inertial)
558 .set_edges(
559 solver_graph.get_edge_ptr<IDataEdge<Tscal>>(prefix_Omega_0),
560 solver_graph.get_edge_ptr<IDataEdge<Tscal>>(prefix_q),
561 solver_graph.get_edge_ptr<IFieldSpan<Tvec>>("field_xyz"),
562 solver_graph.get_edge_ptr<IFieldSpan<Tvec>>("field_vxyz"),
563 solver_graph.get_edge_ptr<Indexes<u32>>("field_sizes"),
564 solver_graph.get_edge_ptr<IFieldSpan<Tvec>>("field_axyz"));
565
566 add_ext_forces_seq.push_back(set_Omega_0);
567 add_ext_forces_seq.push_back(set_q);
568 add_ext_forces_seq.push_back(solver_graph.get_node_ptr_base(prefix_shearing_box));
569
570 } else if (
571 EF_VerticalDiscPotential *ext_force
572 = std::get_if<EF_VerticalDiscPotential>(&var_force.val)) {
573 } else if (
574 EF_VelocityDissipation *ext_force
575 = std::get_if<EF_VelocityDissipation>(&var_force.val)) {
576 std::string prefix_eta = prefix + "eta_";
577 std::string prefix_velocity_dissipation = prefix + "velocity_dissipation_";
578
579 auto set_eta
580 = register_constant_set<Tscal>(solver_graph, prefix_eta, [eta = ext_force->eta]() {
581 return eta;
582 });
583
584 auto add_force_velocity_dissipation = solver_graph.register_node(
585 prefix_velocity_dissipation,
587 shambase::get_check_ref(add_force_velocity_dissipation)
588 .set_edges(
589 solver_graph.get_edge_ptr<IDataEdge<Tscal>>(prefix_eta),
590 solver_graph.get_edge_ptr<IFieldSpan<Tvec>>("field_vxyz"),
591 solver_graph.get_edge_ptr<Indexes<u32>>("field_sizes"),
592 solver_graph.get_edge_ptr<IFieldSpan<Tvec>>("field_axyz"));
593
594 add_ext_forces_seq.push_back(set_eta);
595 add_ext_forces_seq.push_back(
596 solver_graph.get_node_ptr_base(prefix_velocity_dissipation));
597
598 } else {
599 shambase::throw_unimplemented("this force is not handled, yet ...");
600 }
601 }
602
603 if (add_ext_forces_seq.size() > 0) {
604 OperationSequence seq("Add external forces", std::move(add_ext_forces_seq));
605 seq.evaluate();
606 }
607}
608
609using namespace shammath;
613
Adds the acceleration from a central gravitational potential (point mass).
Adds the Lense-Thirring force acceleration.
Adds the acceleration from a Paczynski Wiita (1980) pseudo-newtonian potential.
Adds the inertial part of the acceleration for a shearing box force.
Adds the non-inertial part of the acceleration for a shearing box force.
Adds the acceleration from a velocity dissipation force.
Adds the acceleration from a vertical disc potential.
shambase::DistributedData< PatchDataFieldRef< T > > DDPatchDataFieldRef
Alias for a DistributedData of PatchDataFieldRefs.
Node that applies a custom function to modify connected edges.
Declare a class to register and retrieve nodes and edges from a unique container.
std::uint32_t u32
32 bit unsigned integer
std::uint64_t u64
64 bit unsigned integer
A buffer allocated in USM (Unified Shared Memory).
void complete_event_state(sycl::event e) const
Complete the event state of the buffer.
T * get_write_access(sham::EventList &depends_list, SourceLocation src_loc=SourceLocation{})
Get a read-write pointer to the buffer's data.
A SYCL queue associated with a device and a context.
sycl::event submit(Fct &&fct)
Submits a kernel to the SYCL queue.
Class to manage a list of SYCL events.
Definition EventList.hpp:32
iterator add_obj(u64 id, T &&obj)
Adds a new object to the collection.
void add_ext_forces()
add external forces to the particle acceleration, note that forces dependant on velocity shlould be a...
void compute_ext_forces_indep_v()
is ran once per timestep, it computes the forces that are independant of velocity
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.
u32 get_obj_cnt() const
get the number of objects (particles) stored in this layer
Interface for a solver graph edge representing a field as spans.
void evaluate()
Evaluate the node.
Definition INode.hpp:156
A node that applies a custom function to modify connected edges.
void set_edges(std::shared_ptr< IEdge > to_set)
Set the edges of the node.
A graph container for managing solver nodes and edges with type-safe access.
std::shared_ptr< INode > & get_node_ptr_base(const std::string &name)
Retrieve a node by name as a shared pointer to the base interface.
std::shared_ptr< T > get_edge_ptr(const std::string &name)
Get a typed shared pointer to an edge by name.
std::shared_ptr< T > register_edge(const std::string &name, T &&edge)
Register an edge with automatic type deduction and shared pointer creation.
std::shared_ptr< IEdge > & get_edge_ptr_base(const std::string &name)
Retrieve an edge by name as a shared pointer to the base interface.
std::shared_ptr< T > register_node(const std::string &name, T &&node)
Register a node with automatic type deduction and shared pointer creation.
T & get_node_ref(const std::string &name)
Get a typed reference to a node by name.
namespace for basic c++ utilities
T & get_check_ref(const std::unique_ptr< T > &ptr, SourceLocation loc=SourceLocation())
Takes a std::unique_ptr and returns a reference to the object it holds. It throws a std::runtime_erro...
Definition memory.hpp:112
void throw_unimplemented(SourceLocation loc=SourceLocation{})
Throw a std::runtime_error saying that the function is unimplemented.
namespace for math utility
Definition AABB.hpp:26
namespace for the main framework
Definition __init__.py:1
sph kernels
shambase::details::BasicStackEntry StackEntry
Alias for shambase::details::BasicStackEntry.
shammodels::ExtForceConfig< Tvec > ExtForceConfig
External force configuration.
Patch object that contain generic patch information.
Definition Patch.hpp:33