51 auto edges = get_edges();
53 auto dev_sched = shamsys::instance::get_compute_scheduler_ptr();
55 Tscal C_drift = edges.C_drift.value;
56 Tscal cfl_density_threshold = edges.cfl_density_threshold.value;
58 Tscal pmass = edges.pmass.value;
59 Tscal hfactd = edges.hfactd.value;
64 edges.hpart.get_spans(), edges.delta_v.get_spans(), edges.s_j.get_spans()},
66 edges.part_counts.indexes,
67 [C_drift, cfl_density_threshold, pmass, hfactd, nbins = this->nbins](
73 u32 id_a_d = id_a * nbins;
75 Tscal h_a = hpart[id_a];
76 Tscal rho_a = shamrock::sph::rho_h(pmass, h_a, hfactd);
78 auto rho_dust = [&](
int j) {
79 auto tmp = s_j[id_a_d + j];
83 auto epsilon_j = [&](Tscal rho_d_j) {
84 return rho_d_j / rho_a;
88 for (
int j = 0; j < nbins; j++) {
89 Tscal rho_d_j_a = rho_dust(j);
90 eps_dv += epsilon_j(rho_d_j_a) * delta_v[id_a_d + j];
93 Tscal cfl_tmp = std::numeric_limits<Tscal>::infinity();
95 for (
int j = 0; j < nbins; j++) {
96 Tscal rho_d_j_a = rho_dust(j);
97 if (rho_d_j_a > cfl_density_threshold) {
98 Tvec drift_v_j_a = delta_v[id_a_d + j] - eps_dv;
99 Tscal drift_v_j_a_norm = sycl::length(drift_v_j_a);
100 if (drift_v_j_a_norm > 0) {
101 cfl_tmp = sycl::min(cfl_tmp, h_a / drift_v_j_a_norm);
108 cfl_dt[id_a] = sycl::min(cfl_dt[id_a], cfl_tmp);