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()) {
75 auto field_xyz = shamrock::solvergraph::FieldRefs<Tvec>::make_shared(
"",
"");
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();
89 auto field_axyz_ext = shamrock::solvergraph::FieldRefs<Tvec>::make_shared(
"",
"");
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();
103 auto sizes = shamrock::solvergraph::Indexes<u32>::make_shared(
"",
"");
109 sizes.indexes.add_obj(p.id_patch, pdat.
get_obj_cnt());
113 set_sizes.evaluate();
115 auto constant_G = shamrock::solvergraph::IDataEdge<Tscal>::make_shared(
"",
"");
116 auto constant_c = shamrock::solvergraph::IDataEdge<Tscal>::make_shared(
"",
"");
120 constant_G.data = solver_config.get_constant_G();
125 constant_c.data = solver_config.get_constant_c();
129 set_constant_c.set_edges(constant_c);
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)));
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)) {
138 auto central_mass = shamrock::solvergraph::IDataEdge<Tscal>::make_shared(
"",
"");
139 auto central_pos = shamrock::solvergraph::IDataEdge<Tvec>::make_shared(
"",
"");
142 set_central_mass([cmass = ext_force->central_mass](
144 central_mass.data = cmass;
146 set_central_mass.
set_edges(central_mass);
149 set_central_pos([cpos = ext_force->central_pos](
151 central_pos.data = cpos;
156 add_force_central_grav_potential.set_edges(
157 constant_G, central_mass, central_pos, field_xyz, sizes, field_axyz_ext);
159 add_ext_forces_seq.push_back(
160 std::make_shared<shamrock::solvergraph::OperationSequence>(
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))}));
167 }
else if (EF_PN_PW *ext_force = std::get_if<EF_PN_PW>(&var_force.val)) {
169 auto central_mass = shamrock::solvergraph::IDataEdge<Tscal>::make_shared(
"",
"");
170 auto central_pos = shamrock::solvergraph::IDataEdge<Tvec>::make_shared(
"",
"");
173 set_central_mass([cmass = ext_force->central_mass](
175 central_mass.data = cmass;
177 set_central_mass.
set_edges(central_mass);
180 set_central_pos([cpos = ext_force->central_pos](
182 central_pos.data = cpos;
187 add_force_paczynski_wiita.set_edges(
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))}));
204 }
else if (EF_LenseThirring *ext_force = std::get_if<EF_LenseThirring>(&var_force.val)) {
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(
"",
"");
211 set_central_mass([cmass = ext_force->central_mass](
213 central_mass.data = cmass;
215 set_central_mass.
set_edges(central_mass);
218 set_central_pos([cpos = ext_force->central_pos](
220 central_pos.data = cpos;
225 set_central_vel([cvel = ext_force->central_vel](
227 central_vel.data = cvel;
232 add_force_central_grav_potential.set_edges(
233 constant_G, central_mass, central_pos, field_xyz, sizes, field_axyz_ext);
235 add_ext_forces_seq.push_back(
236 std::make_shared<shamrock::solvergraph::OperationSequence>(
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))}));
244 EF_ShearingBoxForce *ext_force = std::get_if<EF_ShearingBoxForce>(&var_force.val)) {
246 auto eta = shamrock::solvergraph::IDataEdge<Tscal>::make_shared(
"",
"");
249 eta.data = ext_force->eta;
254 add_force_shearing_box_inertial_part{};
255 add_force_shearing_box_inertial_part.set_edges(eta, field_xyz, sizes, field_axyz_ext);
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))}));
265 EF_VerticalDiscPotential *ext_force
266 = std::get_if<EF_VerticalDiscPotential>(&var_force.val)) {
268 auto central_mass = shamrock::solvergraph::IDataEdge<Tscal>::make_shared(
"",
"");
269 auto R0 = shamrock::solvergraph::IDataEdge<Tscal>::make_shared(
"",
"");
272 set_central_mass([cmass = ext_force->central_mass](
274 central_mass.data = cmass;
276 set_central_mass.
set_edges(central_mass);
285 add_force_vertical_disc_potential.set_edges(
286 constant_G, central_mass, R0, field_xyz, sizes, field_axyz_ext);
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))}));
297 EF_VelocityDissipation *ext_force
298 = std::get_if<EF_VelocityDissipation>(&var_force.val)) {
305 if (add_ext_forces_seq.size() > 0) {
307 "Add external forces", std::move(add_ext_forces_seq));
339 Tscal gpart_mass = solver_config.gpart_mass;
342 using namespace shamrock::patch;
356 auto axyz_ext = buf_axyz_ext.get_read_access(depends_list);
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];
366 buf_axyz_ext.complete_event_state(e);
369 if (solver_config.ext_force_config.ext_forces.empty()) {
374 using EF_PointMass =
typename SolverConfigExtForce::PointMass;
375 using EF_PN_PW =
typename SolverConfigExtForce::PN_PW;
376 using EF_LenseThirring =
typename SolverConfigExtForce::LenseThirring;
378 using namespace shamrock::solvergraph;
381 auto set_constant_G = register_constant_set<Tscal>(solver_graph,
"constant_G", [&]() {
382 return solver_config.get_constant_G();
384 auto set_constant_c = register_constant_set<Tscal>(solver_graph,
"constant_c", [&]() {
385 return solver_config.get_constant_c();
388 bool is_G_needed =
false;
389 bool is_c_needed =
false;
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)) {
394 }
else if (EF_PN_PW *ext_force = std::get_if<EF_PN_PW>(&var_force.val)) {
397 }
else if (EF_LenseThirring *ext_force = std::get_if<EF_LenseThirring>(&var_force.val)) {
401 EF_ShearingBoxForce *ext_force = std::get_if<EF_ShearingBoxForce>(&var_force.val)) {
403 EF_VerticalDiscPotential *ext_force
404 = std::get_if<EF_VerticalDiscPotential>(&var_force.val)) {
406 EF_VelocityDissipation *ext_force
407 = std::get_if<EF_VelocityDissipation>(&var_force.val)) {
413 std::vector<std::shared_ptr<shamrock::solvergraph::INode>> add_ext_forces_seq{};
416 add_ext_forces_seq.push_back(set_constant_G);
419 add_ext_forces_seq.push_back(set_constant_c);
431 auto &field = pdat.get_field<Tvec>(0);
432 field_xyz_refs.
add_obj(p.id_patch, std::ref(field));
434 field_xyz_edge.set_refs(field_xyz_refs);
442 auto &field = pdat.get_field<Tvec>(ivxyz);
443 field_vxyz_refs.
add_obj(p.id_patch, std::ref(field));
445 field_vxyz_edge.set_refs(field_vxyz_refs);
453 auto &field = pdat.get_field<Tvec>(iaxyz);
454 field_axyz_refs.
add_obj(p.id_patch, std::ref(field));
456 field_axyz_edge.set_refs(field_axyz_refs);
464 sizes.indexes.add_obj(p.id_patch, pdat.
get_obj_cnt());
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);
474 for (
u32 i = 0; i < solver_config.ext_force_config.ext_forces.size(); i++) {
476 auto &var_force = solver_config.ext_force_config.ext_forces[i];
478 std::string prefix = sham::format(
"ext_force_{}_", i);
480 if (EF_PointMass *ext_force = std::get_if<EF_PointMass>(&var_force.val)) {
482 }
else if (EF_PN_PW *ext_force = std::get_if<EF_PN_PW>(&var_force.val)) {
484 }
else if (EF_LenseThirring *ext_force = std::get_if<EF_LenseThirring>(&var_force.val)) {
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_";
493 auto set_cmass = register_constant_set<Tscal>(solver_graph, prefix_cmass, [&]() {
494 return ext_force->central_mass;
498 = register_constant_set<Tvec>(solver_graph, prefix_central_pos, [&]() {
499 return ext_force->central_pos;
503 = register_constant_set<Tvec>(solver_graph, prefix_central_vel, [&]() {
504 return ext_force->central_vel;
507 auto set_a_spin = register_constant_set<Tscal>(solver_graph, prefix_a_spin, [&]() {
508 return ext_force->a_spin;
511 auto set_dir_spin = register_constant_set<Tvec>(solver_graph, prefix_dir_spin, [&]() {
512 return ext_force->dir_spin;
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);
540 EF_ShearingBoxForce *ext_force = std::get_if<EF_ShearingBoxForce>(&var_force.val)) {
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_";
546 auto set_Omega_0 = register_constant_set<Tscal>(solver_graph, prefix_Omega_0, [&]() {
547 return ext_force->Omega_0;
550 auto set_q = register_constant_set<Tscal>(solver_graph, prefix_q, [&]() {
554 auto add_force_shearing_box_non_inertial = solver_graph.
register_node(
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));
571 EF_VerticalDiscPotential *ext_force
572 = std::get_if<EF_VerticalDiscPotential>(&var_force.val)) {
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_";
580 = register_constant_set<Tscal>(solver_graph, prefix_eta, [eta = ext_force->eta]() {
584 auto add_force_velocity_dissipation = solver_graph.
register_node(
585 prefix_velocity_dissipation,
594 add_ext_forces_seq.push_back(set_eta);
595 add_ext_forces_seq.push_back(
603 if (add_ext_forces_seq.size() > 0) {