31 class AnalysisAngularMomentum {
33 using Tscal = shambase::VecComponent<Tvec>;
34 static constexpr u32 dim = shambase::VectorProperties<Tvec>::dimension;
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);
91 for (
size_t i = 0; i < mass.size(); i++) {
92 tot_angular_momentum += mass[i] * sycl::cross(pos[i], vel[i]) + ang[i];
96 return tot_angular_momentum;