37 auto edges = get_edges();
39 auto dev_sched = shamsys::instance::get_compute_scheduler_ptr();
42 Tscal gpart_mass = edges.gpart_mass.data;
43 Tscal dt = edges.dt.data;
47 bool had_accretion =
false;
48 std::string log =
"sink accretion :";
50 auto &sink_positions = edges.sink_positions.data;
51 auto &sink_velocities = edges.sink_velocities.data;
52 auto &sink_accelerations = edges.sink_accelerations.data;
53 auto &sink_angmom = edges.sink_angmom.data;
54 auto &sink_mass = edges.sink_mass.data;
56 u32 sink_count = shambase::narrow_or_throw<u32>(sink_positions.size());
57 for (
u32 i_sink = 0; i_sink < sink_count; i_sink++) {
59 Tvec r_sink = sink_positions[i_sink];
60 Tvec v_sink = sink_velocities[i_sink];
64 Tvec s_acc_mxyz = {0, 0, 0};
65 Tvec s_acc_pxyz = {0, 0, 0};
66 Tvec s_acc_maxyz = {0, 0, 0};
67 Tvec s_acc_lxyz = {0, 0, 0};
69 edges.part_counts.indexes.for_each([&](
u64 id_patch,
u32 Nobj) {
72 auto &acc_table = edges.sink_accretion_table.get_spans().get(id_patch);
79 [i_sink](
u32 id_a,
const u32 *__restrict acc_table,
u32 *__restrict acc_flag) {
80 acc_flag[id_a] = (acc_table[id_a] == i_sink) ? 1 : 0;
85 auto &pos_data = edges.positions.get_spans().get(id_patch);
86 auto &vel_data = edges.velocities.get_spans().get(id_patch);
87 auto &acc_data = edges.accelerations.get_spans().get(id_patch);
90 if (id_list_accrete.get_size() > 0) {
91 u32 Naccrete = shambase::narrow_or_throw<u32>(id_list_accrete.get_size());
93 Tscal acc_mass = gpart_mass * Naccrete;
105 [r_sink, v_sink, gpart_mass, dt](
107 const Tvec *__restrict xyz,
108 const Tvec *__restrict vxyz,
109 const Tvec *__restrict axyz,
110 const u32 *__restrict id_acc,
111 Tvec *__restrict accretion_p,
112 Tvec *__restrict accretion_mr,
113 Tvec *__restrict accretion_ma,
114 Tvec *__restrict accretion_l) {
115 u32 i_a = id_acc[id_a];
119 accretion_p[id_a] = gpart_mass * v;
120 accretion_mr[id_a] = gpart_mass * r;
121 accretion_ma[id_a] = gpart_mass * a;
127 accretion_l[id_a] = gpart_mass * sycl::cross(r - r_sink, v - v_sink);
135 s_acc_mass += acc_mass;
136 s_acc_pxyz += acc_pxyz;
137 s_acc_mxyz += acc_mxyz;
138 s_acc_maxyz += acc_maxyz;
139 s_acc_lxyz += acc_lxyz;
143 Tscal sum_acc_mass = shamalgs::collective::allreduce_sum(s_acc_mass);
146 if (sum_acc_mass <= 0) {
150 Tvec sum_acc_pxyz = shamalgs::collective::allreduce_sum(s_acc_pxyz);
151 Tvec sum_acc_mxyz = shamalgs::collective::allreduce_sum(s_acc_mxyz);
152 Tvec sum_acc_maxyz = shamalgs::collective::allreduce_sum(s_acc_maxyz);
153 Tvec sum_acc_lxyz = shamalgs::collective::allreduce_sum(s_acc_lxyz);
155 Tscal old_mass = sink_mass[i_sink];
156 Tvec old_pos = sink_positions[i_sink];
157 Tvec old_vel = sink_velocities[i_sink];
158 Tvec old_acc = sink_accelerations[i_sink];
159 Tvec old_ang = sink_angmom[i_sink];
162 Tscal new_mass = old_mass + sum_acc_mass;
163 Tvec new_pos = (sum_acc_mxyz + old_pos * old_mass) / (old_mass + sum_acc_mass);
164 Tvec new_vel = (sum_acc_pxyz + old_vel * old_mass) / (old_mass + sum_acc_mass);
165 Tvec new_acc = (sum_acc_maxyz + old_acc * old_mass) / (old_mass + sum_acc_mass);
166 Tvec new_ang_mom = old_ang + sum_acc_lxyz
167 - new_mass * sycl::cross(new_pos - old_pos, new_vel - old_vel);
170 sink_mass[i_sink] = new_mass;
171 sink_positions[i_sink] = new_pos;
172 sink_velocities[i_sink] = new_vel;
173 sink_angmom[i_sink] = new_ang_mom;
174 sink_accelerations[i_sink] = new_acc;
176 had_accretion =
true;
178 "\n id {} deltas : mass={} r={} v={} l={}",
183 new_ang_mom - old_ang);
Accrete flagged SPH particles onto sinks (mass, CoM, spin, etc.).