54 Tscal gpart_mass = solver_config.gpart_mass;
57 using namespace shamrock::patch;
69 sink_update.compute_sph_forces();
71 if (solver_config.ext_force_config.ext_forces.empty()) {
81 auto &field = pdat.get_field<Tvec>(0);
82 field_xyz_refs.
add_obj(p.id_patch, std::ref(field));
84 field_xyz_edge.set_refs(field_xyz_refs);
87 set_field_xyz.evaluate();
95 auto &field = pdat.get_field<Tvec>(iaxyz_ext);
96 field_axyz_ext_refs.
add_obj(p.id_patch, std::ref(field));
98 field_axyz_ext_edge.set_refs(field_axyz_ext_refs);
100 set_field_axyz_ext.
set_edges(field_axyz_ext);
101 set_field_axyz_ext.evaluate();
109 sizes.indexes.add_obj(p.id_patch, pdat.get_obj_cnt());
113 set_sizes.evaluate();
119 constant_G.data = solver_config.get_constant_G();
124 std::vector<std::shared_ptr<shamrock::solvergraph::INode>> add_ext_forces_seq{};
126 for (
auto var_force : solver_config.ext_force_config.ext_forces) {
127 if (EF_PointMass *ext_force = std::get_if<EF_PointMass>(&var_force.val)) {
134 central_mass.data = ext_force->central_mass;
136 set_central_mass.
set_edges(central_mass);
140 central_pos.data = {};
145 add_force_central_grav_potential.set_edges(
146 constant_G, central_mass, central_pos, field_xyz, sizes, field_axyz_ext);
148 add_ext_forces_seq.push_back(
149 std::make_shared<shamrock::solvergraph::OperationSequence>(
151 std::vector<std::shared_ptr<shamrock::solvergraph::INode>>{
152 shambase::to_shared(std::move(set_central_pos)),
153 shambase::to_shared(std::move(set_central_mass)),
154 shambase::to_shared(std::move(add_force_central_grav_potential))}));
156 }
else if (EF_LenseThirring *ext_force = std::get_if<EF_LenseThirring>(&var_force.val)) {
163 central_mass.data = ext_force->central_mass;
165 set_central_mass.
set_edges(central_mass);
169 central_pos.data = {};
174 add_force_central_grav_potential.set_edges(
175 constant_G, central_mass, central_pos, field_xyz, sizes, field_axyz_ext);
177 add_ext_forces_seq.push_back(
178 std::make_shared<shamrock::solvergraph::OperationSequence>(
180 std::vector<std::shared_ptr<shamrock::solvergraph::INode>>{
181 shambase::to_shared(std::move(set_central_pos)),
182 shambase::to_shared(std::move(set_central_mass)),
183 shambase::to_shared(std::move(add_force_central_grav_potential))}));
186 EF_ShearingBoxForce *ext_force = std::get_if<EF_ShearingBoxForce>(&var_force.val)) {
191 eta.data = ext_force->eta;
196 add_force_shearing_box_inertial_part{};
197 add_force_shearing_box_inertial_part.set_edges(eta, field_xyz, sizes, field_axyz_ext);
199 add_ext_forces_seq.push_back(
200 std::make_shared<shamrock::solvergraph::OperationSequence>(
201 "Shearing box force",
202 std::vector<std::shared_ptr<shamrock::solvergraph::INode>>{
203 shambase::to_shared(std::move(set_eta)),
204 shambase::to_shared(std::move(add_force_shearing_box_inertial_part))}));
207 EF_VerticalDiscPotential *ext_force
208 = std::get_if<EF_VerticalDiscPotential>(&var_force.val)) {
214 set_central_mass([cmass = ext_force->central_mass](
216 central_mass.data = cmass;
218 set_central_mass.
set_edges(central_mass);
227 add_force_vertical_disc_potential.set_edges(
228 constant_G, central_mass, R0, field_xyz, sizes, field_axyz_ext);
230 add_ext_forces_seq.push_back(
231 std::make_shared<shamrock::solvergraph::OperationSequence>(
232 "Vertical disc potential",
233 std::vector<std::shared_ptr<shamrock::solvergraph::INode>>{
234 shambase::to_shared(std::move(set_R0)),
235 shambase::to_shared(std::move(set_central_mass)),
236 shambase::to_shared(std::move(add_force_vertical_disc_potential))}));
239 EF_VelocityDissipation *ext_force
240 = std::get_if<EF_VelocityDissipation>(&var_force.val)) {
247 set_constant_G.evaluate();
249 if (add_ext_forces_seq.size() > 0) {
251 "Add external forces", std::move(add_ext_forces_seq));
283 Tscal gpart_mass = solver_config.gpart_mass;
286 using namespace shamrock::patch;
300 auto axyz_ext = buf_axyz_ext.get_read_access(depends_list);
302 auto e = q.
submit(depends_list, [&](sycl::handler &cgh) {
303 shambase::parallel_for(
304 cgh, pdat.get_obj_cnt(),
"add ext force acc to acc", [=](
u64 gid) {
305 axyz[gid] += axyz_ext[gid];
310 buf_axyz_ext.complete_event_state(e);
313 if (solver_config.ext_force_config.ext_forces.empty()) {
318 using EF_PointMass =
typename SolverConfigExtForce::PointMass;
319 using EF_LenseThirring =
typename SolverConfigExtForce::LenseThirring;
321 using namespace shamrock::solvergraph;
324 auto set_constant_G = register_constant_set<Tscal>(solver_graph,
"constant_G", [&]() {
325 return solver_config.get_constant_G();
327 auto set_constant_c = register_constant_set<Tscal>(solver_graph,
"constant_c", [&]() {
328 return solver_config.get_constant_c();
331 bool is_G_needed =
false;
332 bool is_c_needed =
false;
334 for (
auto var_force : solver_config.ext_force_config.ext_forces) {
335 if (EF_PointMass *ext_force = std::get_if<EF_PointMass>(&var_force.val)) {
337 }
else if (EF_LenseThirring *ext_force = std::get_if<EF_LenseThirring>(&var_force.val)) {
341 EF_ShearingBoxForce *ext_force = std::get_if<EF_ShearingBoxForce>(&var_force.val)) {
343 EF_VerticalDiscPotential *ext_force
344 = std::get_if<EF_VerticalDiscPotential>(&var_force.val)) {
346 EF_VelocityDissipation *ext_force
347 = std::get_if<EF_VelocityDissipation>(&var_force.val)) {
353 std::vector<std::shared_ptr<shamrock::solvergraph::INode>> add_ext_forces_seq{};
356 add_ext_forces_seq.push_back(set_constant_G);
359 add_ext_forces_seq.push_back(set_constant_c);
371 auto &field = pdat.get_field<Tvec>(0);
372 field_xyz_refs.
add_obj(p.id_patch, std::ref(field));
374 field_xyz_edge.set_refs(field_xyz_refs);
382 auto &field = pdat.get_field<Tvec>(ivxyz);
383 field_vxyz_refs.
add_obj(p.id_patch, std::ref(field));
385 field_vxyz_edge.set_refs(field_vxyz_refs);
393 auto &field = pdat.get_field<Tvec>(iaxyz);
394 field_axyz_refs.
add_obj(p.id_patch, std::ref(field));
396 field_axyz_edge.set_refs(field_axyz_refs);
404 sizes.indexes.add_obj(p.id_patch, pdat.get_obj_cnt());
409 add_ext_forces_seq.push_back(set_field_xyz);
410 add_ext_forces_seq.push_back(set_field_vxyz);
411 add_ext_forces_seq.push_back(set_field_axyz);
412 add_ext_forces_seq.push_back(set_field_sizes);
414 for (
u32 i = 0; i < solver_config.ext_force_config.ext_forces.size(); i++) {
416 auto &var_force = solver_config.ext_force_config.ext_forces[i];
418 std::string prefix = shambase::format(
"ext_force_{}_", i);
420 if (EF_PointMass *ext_force = std::get_if<EF_PointMass>(&var_force.val)) {
422 }
else if (EF_LenseThirring *ext_force = std::get_if<EF_LenseThirring>(&var_force.val)) {
424 std::string prefix_cmass = prefix +
"cmass_";
425 std::string prefix_central_pos = prefix +
"central_pos_";
426 std::string prefix_a_spin = prefix +
"a_spin_";
427 std::string prefix_dir_spin = prefix +
"dir_spin_";
428 std::string prefix_lt = prefix +
"lt_";
430 auto set_cmass = register_constant_set<Tscal>(solver_graph, prefix_cmass, [&]() {
431 return ext_force->central_mass;
435 = register_constant_set<Tvec>(solver_graph, prefix_central_pos, [&]() {
436 return Tvec{0, 0, 0};
439 auto set_a_spin = register_constant_set<Tscal>(solver_graph, prefix_a_spin, [&]() {
440 return ext_force->a_spin;
443 auto set_dir_spin = register_constant_set<Tvec>(solver_graph, prefix_dir_spin, [&]() {
444 return ext_force->dir_spin;
462 add_ext_forces_seq.push_back(set_cmass);
463 add_ext_forces_seq.push_back(set_central_pos);
464 add_ext_forces_seq.push_back(set_a_spin);
465 add_ext_forces_seq.push_back(set_dir_spin);
469 EF_ShearingBoxForce *ext_force = std::get_if<EF_ShearingBoxForce>(&var_force.val)) {
471 std::string prefix_Omega_0 = prefix +
"Omega_0_";
472 std::string prefix_q = prefix +
"q_";
473 std::string prefix_shearing_box = prefix +
"shearing_box_";
475 auto set_Omega_0 = register_constant_set<Tscal>(solver_graph, prefix_Omega_0, [&]() {
476 return ext_force->Omega_0;
479 auto set_q = register_constant_set<Tscal>(solver_graph, prefix_q, [&]() {
483 auto add_force_shearing_box_non_inertial = solver_graph.
register_node(
495 add_ext_forces_seq.push_back(set_Omega_0);
496 add_ext_forces_seq.push_back(set_q);
497 add_ext_forces_seq.push_back(solver_graph.
get_node_ptr_base(prefix_shearing_box));
500 EF_VerticalDiscPotential *ext_force
501 = std::get_if<EF_VerticalDiscPotential>(&var_force.val)) {
503 EF_VelocityDissipation *ext_force
504 = std::get_if<EF_VelocityDissipation>(&var_force.val)) {
505 std::string prefix_eta = prefix +
"eta_";
506 std::string prefix_velocity_dissipation = prefix +
"velocity_dissipation_";
509 = register_constant_set<Tscal>(solver_graph, prefix_eta, [eta = ext_force->eta]() {
513 auto add_force_velocity_dissipation = solver_graph.
register_node(
514 prefix_velocity_dissipation,
523 add_ext_forces_seq.push_back(set_eta);
524 add_ext_forces_seq.push_back(
532 if (add_ext_forces_seq.size() > 0) {