33 using Tscal = shambase::VecComponent<Tvec>;
36 using Solver = Solver<Tvec, SPHKernel>;
43 : model(model), ctx(model.ctx), solver(model.solver) {};
45 auto get_angular_momentum() -> Tvec {
47 auto dev_sched_ptr = shamsys::instance::get_compute_scheduler_ptr();
50 const u32 ivxyz = sched.pdl_old().template get_field_idx<Tvec>(
"vxyz");
51 const u32 ixyz = sched.pdl_old().template get_field_idx<Tvec>(
"xyz");
52 const Tscal pmass = solver.solver_config.gpart_mass;
54 Tvec angular_momentum = {};
58 sched.for_each_patchdata_nonempty(
60 u32 len = pdat.get_obj_cnt();
62 angular_momentum_part.
resize(len);
74 const Tvec *__restrict xyz,
75 const Tvec *__restrict vxyz,
76 Tvec *__restrict angular_momentum_part) {
77 angular_momentum_part[i] = pmass * sycl::cross(xyz[i], vxyz[i]);
84 Tvec tot_angular_momentum = shamalgs::collective::allreduce_sum(angular_momentum);
86 if (!solver.storage.sinks.is_empty()) {
87 for (
auto &sink : solver.storage.sinks.get()) {
89 += sink.mass * sycl::cross(sink.pos, sink.velocity) + sink.angular_momentum;
93 return tot_angular_momentum;