Shamrock 2025.10.0
Astrophysical Code
Loading...
Searching...
No Matches
GetFieldRefFromLayer.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
19
20#include "shambase/memory.hpp"
24#include <memory>
25
26#define NODE_EDGES(X_RO, X_RW) \
27 /* ------------------- inputs ------------------- */ \
28 X_RO(shamrock::solvergraph::IPatchDataLayerRefs, source) \
29 \
30 /* ------------------- outputs ------------------- */ \
31 X_RW(shamrock::solvergraph::FieldRefs<T>, out_ref)
32
33namespace shamrock::solvergraph {
34
35 template<class T>
36 class GetFieldRefFromLayer : public INode {
37
38 u32 field_idx;
39
40 public:
41 GetFieldRefFromLayer(u32 field_idx) : field_idx(field_idx) {}
42
43 GetFieldRefFromLayer(
44 shamrock::patch::PatchDataLayerLayout &layout, const std::string &field_name)
45 : GetFieldRefFromLayer(layout.get_field_idx<T>(field_name)) {}
46
47 GetFieldRefFromLayer(
48 const std::shared_ptr<shamrock::patch::PatchDataLayerLayout> &layout,
49 const std::string &field_name)
50 : GetFieldRefFromLayer(shambase::get_check_ref(layout), field_name) {}
51
52 EXPAND_NODE_EDGES(NODE_EDGES)
53
55 auto edges = get_edges();
56
57 edges.out_ref.set_refs(
58 edges.source.get_const_refs()
59 .template map<std::reference_wrapper<PatchDataField<T>>>(
60 [&](u64 id_patch, shamrock::patch::PatchDataLayer &pdat) {
61 return std::ref(pdat.get_field<T>(field_idx));
62 }));
63 }
64
65 std::string _impl_get_label() const { return "GetFieldRefFromLayer"; }
66
67 std::string _impl_get_tex() const { return "TODO"; }
68 };
69} // namespace shamrock::solvergraph
70
71#undef NODE_EDGES
Defines the PatchDataLayerRefs class for managing distributed references to patch data layers.
std::uint32_t u32
32 bit unsigned integer
std::uint64_t u64
64 bit unsigned integer
u32 get_field_idx(const std::string &field_name) const
Get the field id if matching name & type.
PatchDataLayer container class, the layout is described in patchdata_layout.
std::string _impl_get_label() const
get the label of the node
std::string _impl_get_tex() const
get the tex of the node
T & get_check_ref(const std::unique_ptr< T > &ptr, SourceLocation loc=SourceLocation())
Takes a std::unique_ptr and returns a reference to the object it holds. It throws a std::runtime_erro...
Definition memory.hpp:112