51 auto edges = get_edges();
53 auto dev_sched = shamsys::instance::get_compute_scheduler_ptr();
55 Tscal C_1_fluid = edges.C_1_fluid.value;
56 Tscal pmass = edges.pmass.value;
57 Tscal hfactd = edges.hfactd.value;
62 edges.hpart.get_spans(),
63 edges.soundspeed.get_spans(),
64 edges.s_j.get_spans(),
65 edges.Ts_j.get_spans()},
67 edges.part_counts.indexes,
68 [C_1_fluid, pmass, hfactd, nbins = this->nbins](
71 const Tscal *soundspeed,
75 u32 id_a_d = id_a * nbins;
77 Tscal h_a = hpart[id_a];
78 Tscal rho_a = shamrock::sph::rho_h(pmass, h_a, hfactd);
80 Tscal cs_a = soundspeed[id_a];
81 Tscal cs2_a = cs_a * cs_a;
83 auto rho_dust = [&](
int j) {
84 auto tmp = s_j[id_a_d + j];
88 auto epsilon_j = [&](
int j) {
89 return rho_dust(j) / rho_a;
93 for (
int j = 0; j < nbins; j++) {
94 sum_eps += epsilon_j(j);
97 Tscal cs_tilde_2_a = cs2_a * (1 - sum_eps);
99 Tscal cs4_over_h2 = cs2_a * cs2_a / (h_a * h_a);
101 Tscal cfl_tmp = std::numeric_limits<Tscal>::infinity();
103 for (
int j = 0; j < nbins; j++) {
104 Tscal eps_j_a = epsilon_j(j);
105 Tscal eps2_j_a = eps_j_a * eps_j_a;
107 Tscal Ts_j_a = Ts_j[id_a_d + j];
108 Tscal Ts2_j_a = Ts_j_a * Ts_j_a;
110 Tscal dt_j = h_a / sycl::sqrt(cs_tilde_2_a + Ts2_j_a * eps2_j_a * cs4_over_h2);
111 cfl_tmp = sycl::min(cfl_tmp, dt_j);
114 cfl_tmp *= C_1_fluid;
116 cfl_dt[id_a] = sycl::min(cfl_dt[id_a], cfl_tmp);