30 inline static const std::string name =
"std::vector<" + get_type_name<T>() +
">";
38 using Tscal = shambase::VecComponent<Tvec>;
40 std::vector<Tvec> &pos;
41 std::vector<Tvec> &vel;
42 std::vector<Tvec> &acc_sph;
43 std::vector<Tvec> &acc_ext;
44 std::vector<Tscal> &mass;
45 std::vector<Tvec> &angular_momentum;
46 std::vector<Tscal> &accretion_radius;
48 inline bool has_sinks()
const {
return !pos.empty(); }
49 inline size_t size()
const {
return pos.size(); }
55 inline void ensure_sync_data_edge(
57 const std::string &name,
58 const std::string &tex_symbol,
64 edge->data = std::move(init_value);
69 inline T &get_sync_data(
71 return sync.template get_edge_ref<shamrock::solvergraph::IDataEdgeSerializable<T>>(name)
82 using Tscal = shambase::VecComponent<Tvec>;
84 details::ensure_sync_data_edge<std::vector<Tvec>>(
85 sync,
"sink_pos",
"\\bf{r}_{\\mathrm{sink}}", {});
86 details::ensure_sync_data_edge<std::vector<Tvec>>(
87 sync,
"sink_vel",
"\\bf{v}_{\\mathrm{sink}}", {});
88 details::ensure_sync_data_edge<std::vector<Tvec>>(
89 sync,
"sink_acc_sph",
"\\bf{a}_{\\mathrm{sink, sph}}", {});
90 details::ensure_sync_data_edge<std::vector<Tvec>>(
91 sync,
"sink_acc_ext",
"\\bf{a}_{\\mathrm{sink, ext}}", {});
92 details::ensure_sync_data_edge<std::vector<Tscal>>(
93 sync,
"sink_mass",
"m_{\\mathrm{sink}}", {});
94 details::ensure_sync_data_edge<std::vector<Tvec>>(
95 sync,
"sink_angular_momentum",
"\\bf{L}_{\\mathrm{sink}}", {});
96 details::ensure_sync_data_edge<std::vector<Tscal>>(
97 sync,
"sink_accretion_radius",
"r_{\\mathrm{accretion}}", {});
106 return details::get_sync_data<std::vector<Tvec>>(sync,
"sink_pos");
111 return details::get_sync_data<std::vector<Tvec>>(sync,
"sink_vel");
115 inline std::vector<Tvec> &get_sink_acc_sph(
117 return details::get_sync_data<std::vector<Tvec>>(sync,
"sink_acc_sph");
121 inline std::vector<Tvec> &get_sink_acc_ext(
122 shamrock::solvergraph::SolverGraphSerializable &sync) {
123 return details::get_sync_data<std::vector<Tvec>>(sync,
"sink_acc_ext");
127 inline std::vector<shambase::VecComponent<Tvec>> &get_sink_mass(
128 shamrock::solvergraph::SolverGraphSerializable &sync) {
129 return details::get_sync_data<std::vector<shambase::VecComponent<Tvec>>>(sync,
"sink_mass");
133 inline std::vector<Tvec> &get_sink_angular_momentum(
134 shamrock::solvergraph::SolverGraphSerializable &sync) {
135 return details::get_sync_data<std::vector<Tvec>>(sync,
"sink_angular_momentum");
139 inline std::vector<shambase::VecComponent<Tvec>> &get_sink_accretion_radius(
140 shamrock::solvergraph::SolverGraphSerializable &sync) {
141 return details::get_sync_data<std::vector<shambase::VecComponent<Tvec>>>(
142 sync,
"sink_accretion_radius");
166 get_sink_vel<Tvec>(sync),
167 get_sink_acc_sph<Tvec>(sync),
168 get_sink_acc_ext<Tvec>(sync),
169 get_sink_mass<Tvec>(sync),
170 get_sink_angular_momentum<Tvec>(sync),
171 get_sink_accretion_radius<Tvec>(sync),
180 std::vector<SinkParticle<Tvec>> out;
181 out.reserve(e.size());
182 for (
size_t i = 0; i < e.size(); i++) {
190 e.angular_momentum[i],
191 e.accretion_radius[i],
208 e.angular_momentum.clear();
209 e.accretion_radius.clear();
211 e.pos.reserve(sinks.size());
212 e.vel.reserve(sinks.size());
213 e.acc_sph.reserve(sinks.size());
214 e.acc_ext.reserve(sinks.size());
215 e.mass.reserve(sinks.size());
216 e.angular_momentum.reserve(sinks.size());
217 e.accretion_radius.reserve(sinks.size());
219 for (
const auto &s : sinks) {
220 e.pos.push_back(s.pos);
221 e.vel.push_back(s.velocity);
222 e.acc_sph.push_back(s.sph_acceleration);
223 e.acc_ext.push_back(s.ext_acceleration);
224 e.mass.push_back(s.mass);
225 e.angular_momentum.push_back(s.angular_momentum);
226 e.accretion_radius.push_back(s.accretion_radius);
236 typename SinkEdges<Tvec>::Tscal mass,
239 typename SinkEdges<Tvec>::Tscal accretion_radius) {
241 e.pos.push_back(pos);
242 e.vel.push_back(velocity);
243 e.acc_sph.push_back({});
244 e.acc_ext.push_back({});
245 e.mass.push_back(mass);
246 e.angular_momentum.push_back({});
247 e.accretion_radius.push_back(accretion_radius);
Declare a class to register and retrieve nodes and edges from a unique container.
bool has_edge(const std::string &name) const
Check whether an edge with the given name exists.
std::shared_ptr< T > register_edge(const std::string &name, T &&edge)
Register an edge with automatic type deduction and shared pointer creation.
Namespace for internal details of the logs module.
namespace for basic c++ utilities
namespace for the sph model
bool has_sinks(shamrock::solvergraph::SolverGraphSerializable &sync)
Check whether any sinks are present by inspecting sink_pos only.
std::vector< SinkParticle< Tvec > > to_sink_particles(const SinkEdges< Tvec > &e)
Build an AoS sink list from the current SoA edges (Python API / dump helpers).
std::vector< Tvec > & get_sink_pos(shamrock::solvergraph::SolverGraphSerializable &sync)
Named SoA getters (edges must already exist; call ensure_sink_edges first). Prefer these when a funct...
void ensure_sink_edges(shamrock::solvergraph::SolverGraphSerializable &sync)
Register sink SoA synchronized edges if missing (idempotent).
SinkEdges< Tvec > get_sink_edges(shamrock::solvergraph::SolverGraphSerializable &sync)
Fetch mutable references to the sink SoA synchronized edges.
void add_sink(SinkEdges< Tvec > &e, typename SinkEdges< Tvec >::Tscal mass, Tvec pos, Tvec velocity, typename SinkEdges< Tvec >::Tscal accretion_radius)
Append one sink to the SoA edges.
void set_sink_particles(SinkEdges< Tvec > &e, const std::vector< SinkParticle< Tvec > > &sinks)
Replace SoA sink edge contents from an AoS sink list (legacy dump migration).
Contains traits and utilities for backend related types.