Shamrock 2025.10.0
Astrophysical Code
Loading...
Searching...
No Matches
ComputeCFLDustDrift.hpp
Go to the documentation of this file.
1// -------------------------------------------------------//
2//
3// SHAMROCK code for hydrodynamics
4// Copyright (c) 2021-2026 Timothée David--Cléris <tim.shamrock@proton.me>
5// SPDX-License-Identifier: CeCILL Free Software License Agreement v2.1
6// Shamrock is licensed under the CeCILL 2.1 License, see LICENSE for more information
7//
8// -------------------------------------------------------//
9
10#pragma once
11
18
26
27#define NODE_EDGES(X_RO, X_RW) \
28 X_RO(shamrock::solvergraph::Indexes<u32>, part_counts) \
29 X_RO(shamrock::solvergraph::ScalarEdge<Tscal>, C_drift) \
30 X_RO(shamrock::solvergraph::ScalarEdge<Tscal>, cfl_density_threshold) \
31 X_RO(shamrock::solvergraph::ScalarEdge<Tscal>, pmass) \
32 X_RO(shamrock::solvergraph::ScalarEdge<Tscal>, hfactd) \
33 X_RO(shamrock::solvergraph::IFieldSpan<Tscal>, hpart) \
34 X_RO(shamrock::solvergraph::IFieldSpan<Tscal>, s_j) \
35 X_RO(shamrock::solvergraph::IFieldSpan<Tvec>, delta_v) \
36 X_RW(shamrock::solvergraph::IFieldSpan<Tscal>, cfl_dt)
37
38template<class Tvec>
39class ComputeCFLDustDrift : public shamrock::solvergraph::INode {
40
41 using Tscal = shambase::VecComponent<Tvec>;
42
43 u32 nbins;
44
45 public:
46 ComputeCFLDustDrift(u32 nbins) : nbins(nbins) {}
47
48 EXPAND_NODE_EDGES(NODE_EDGES)
49
51 auto edges = get_edges();
52
53 auto dev_sched = shamsys::instance::get_compute_scheduler_ptr();
54
55 Tscal C_drift = edges.C_drift.value;
56 Tscal cfl_density_threshold = edges.cfl_density_threshold.value;
57
58 Tscal pmass = edges.pmass.value;
59 Tscal hfactd = edges.hfactd.value;
60
62 dev_sched,
64 edges.hpart.get_spans(), edges.delta_v.get_spans(), edges.s_j.get_spans()},
65 sham::DDMultiRef{edges.cfl_dt.get_spans()},
66 edges.part_counts.indexes,
67 [C_drift, cfl_density_threshold, pmass, hfactd, nbins = this->nbins](
68 u32 id_a,
69 const Tscal *hpart,
70 const Tvec *delta_v,
71 const Tscal *s_j,
72 Tscal *cfl_dt) {
73 u32 id_a_d = id_a * nbins;
74
75 Tscal h_a = hpart[id_a];
76 Tscal rho_a = shamrock::sph::rho_h(pmass, h_a, hfactd);
77
78 auto rho_dust = [&](int j) {
79 auto tmp = s_j[id_a_d + j];
80 return tmp * tmp;
81 };
82
83 auto epsilon_j = [&](Tscal rho_d_j) {
84 return rho_d_j / rho_a;
85 };
86
87 Tvec eps_dv{};
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];
91 }
92
93 Tscal cfl_tmp = std::numeric_limits<Tscal>::infinity();
94
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);
102 }
103 }
104 }
105
106 cfl_tmp *= C_drift;
107
108 cfl_dt[id_a] = sycl::min(cfl_dt[id_a], cfl_tmp);
109 });
110 }
111
112 inline virtual std::string _impl_get_label() const { return "ComputeCFLDustDrift"; };
113
114 inline virtual std::string _impl_get_tex() const { return "C_{\\rm drift}"; };
115};
116
117#undef NODE_EDGES
Header file describing a Node Instance.
std::uint32_t u32
32 bit unsigned integer
virtual std::string _impl_get_tex() const
get the tex of the node
virtual std::string _impl_get_label() const
get the label of the node
void _impl_evaluate_internal()
evaluate the node
Inode is node between data edges, takes multiple inputs, multiple outputs.
Definition INode.hpp:31
void distributed_data_kernel_call(sham::DeviceScheduler_ptr dev_sched, RefIn in, RefOut in_out, const shambase::DistributedData< index_t > &thread_counts, Functor &&func)
A variant of sham::kernel_call for distributed data.
A variant of sham::MultiRef for distributed data.