63 auto edges = get_edges();
65 auto &part_counts = edges.part_counts.indexes;
68 edges.hpart.check_sizes(part_counts);
69 edges.grad_P_on_rho.check_sizes(part_counts);
70 edges.s_j.check_sizes(part_counts);
71 edges.t_j.check_sizes(part_counts);
74 edges.delta_v.ensure_sizes(part_counts);
76 const Tscal pmass = edges.gpart_mass.value;
78 auto total_specie_count = part_counts.template map<u32>([&](
u64 id,
u32 count) {
85 shamsys::instance::get_compute_scheduler_ptr(),
87 edges.hpart.get_spans(),
88 edges.grad_P_on_rho.get_spans(),
89 edges.s_j.get_spans(),
90 edges.t_j.get_spans()},
93 [pmass, ndust = ndust](
95 const Tscal *__restrict hpart,
96 const Tvec *__restrict grad_P_on_rho,
97 const Tscal *__restrict s_j,
98 const Tscal *__restrict t_j,
99 Tvec *__restrict delta_v
101 u32 id_a = thread_id / ndust;
102 u32 jdust = thread_id % ndust;
104 Tscal h_a = hpart[id_a];
105 Tvec grad_P_on_rho_a = grad_P_on_rho[id_a];
106 Tscal sj_a = s_j[thread_id];
107 Tscal tj_a = t_j[thread_id];
109 using namespace shamrock::sph;
110 Tscal rho_a = rho_h(pmass, h_a, Kernel::hfactd);
112 auto epsilon = [&](Tscal sj) {
113 return sj * sj / rho_a;
116 Tscal eps_j_a = epsilon(sj_a);
130 for (
u32 k = 0; k < ndust; k++) {
131 Tscal sk_a = s_j[id_a * ndust + k];
132 Tscal eps_k_a = epsilon(sk_a);
136 Tvec grad_P_on_rho_g_a = grad_P_on_rho_a / (1 - sum_eps);
138 delta_v[thread_id] = tj_a * grad_P_on_rho_g_a;