Tatooine
sample_to_grid.h
Go to the documentation of this file.
1#ifndef TATOOINE_FLOWEXPLORER_SAMPLE_TO_GRID_H
2#define TATOOINE_FLOWEXPLORER_SAMPLE_TO_GRID_H
3//==============================================================================
4#include <tatooine/field.h>
7#include <tatooine/visit.h>
8//==============================================================================
10//==============================================================================
11struct sample_to_grid : ui::node<sample_to_grid> {
12 private:
13 std::variant<std::monostate,
17 std::variant<std::monostate,
26
27 public:
29 : ui::node<sample_to_grid>{"Field Sampler", s},
31 nonuniform_rectilinear_grid<real_type, 2>,
32 nonuniform_rectilinear_grid<real_type, 3>>("Discretized Domain")},
33 m_field_pin{&this->template insert_input_pin<
34 polymorphic::scalarfield<real_type, 2>,
38 //----------------------------------------------------------------------------
39 virtual ~sample_to_grid() = default;
40 //----------------------------------------------------------------------------
41 auto time() const -> auto const& { return m_time; }
42 auto time() -> auto& { return m_time; }
43 //----------------------------------------------------------------------------
44 template <typename... Ts>
45 auto set_field(ui::output_pin& other_pin) {
46 (
47 [&] {
48 if (other_pin.type() == typeid(Ts)) {
49 m_field = dynamic_cast<Ts*>(&other_pin.get_as<Ts>());
50 }
51 }(),
52 ...);
53 }
54 //----------------------------------------------------------------------------
55 auto on_pin_connected(ui::input_pin& this_pin, ui::output_pin& other_pin)
56 -> void {
57 if (this_pin == *m_field_pin) {
58 set_field<polymorphic::scalarfield<real_type, 2>,
62 } else if (this_pin == *m_discretized_domain_pin) {
63 if (other_pin.type() == typeid(nonuniform_rectilinear_grid<real_type, 2>)) {
66 &other_pin.node());
67 } else if (other_pin.type() ==
71 &other_pin.node());
72 }
73 }
74 if (m_discretized_domain.index() > 0 && m_field.index() > 0) {
75 sample();
76 }
77}
78 //----------------------------------------------------------------------------
79 auto sample() -> void {
80 field_domain_do([&](auto& field, auto& domain) {
81 using field_t = std::decay_t<decltype(field)>;
82 using domain_t = std::decay_t<decltype(domain)>;
83 if constexpr (field_t::num_dimensions() == domain_t::num_dimensions()) {
84 if (domain.vertices().size() > 0) {
85 discretize(field, domain, this->title(), time());
86 }
87 }
88 });
89 }
90 //----------------------------------------------------------------------------
91 auto on_property_changed() -> void {
92 if (m_field.index() > 0 && m_discretized_domain.index() > 0) {
93 sample();
94 }
95 }
96 //----------------------------------------------------------------------------
97 template <typename F>
98 auto domain_do(F&& f) {
99 visit(
100 [&](auto domain) {
101 if constexpr (!is_same<std::monostate,
102 std::decay_t<decltype(domain)>>) {
103 f(*domain);
104 }
105 },
107 }
108 //----------------------------------------------------------------------------
109 template <typename F>
110 auto field_do(F&& f) {
111 visit(
112 [&](auto field) {
113 if constexpr (!is_same<std::monostate,
114 std::decay_t<decltype(field)>>) {
115 f(*field);
116 }
117 },
118 m_field);
119 }
120 //----------------------------------------------------------------------------
121 template <typename F>
122 auto field_domain_do(F&& f) -> void {
123 visit(
124 [&](auto field, auto domain) {
125 if constexpr (!is_same<std::monostate, decltype(field)> &&
126 !is_same<std::monostate, decltype(domain)>) {
127 f(*field, *domain);
128 }
129 },
131 }
132 //----------------------------------------------------------------------------
133 auto on_title_changed(std::string const& old_title) -> void override {
134 if (m_field.index() > 0 && m_discretized_domain.index() > 0) {
135 domain_do([&](auto& domain) {
136 domain.rename_vertex_property(old_title, this->title());
137 });
138 }
139 }
140 //----------------------------------------------------------------------------
142 domain_do([&](auto& domain) {
143 domain.remove_vertex_property(this->title());
144 });
145 if (&pin == m_field_pin) {
146 m_field = std::monostate{};
147 } else if (&pin == m_discretized_domain_pin) {
148 m_discretized_domain = std::monostate{};
149 }
150 }
151};
152//==============================================================================
153} // namespace tatooine::flowexplorer::nodes
154//==============================================================================
157 TATOOINE_REFLECTION_INSERT_METHOD(time, time()));
158#endif
Definition: abcflow.h:7
auto discretize(polymorphic::field< VReal, NumDimensions, Tensor > const &f, rectilinear_grid< SpatialDimensions... > const &discretized_domain, arithmetic auto const t, execution_policy_tag auto const pol) -> auto
Definition: discretize_field.h:92
detail::rectilinear_grid::creator_t< std::vector< Real >, N > nonuniform_rectilinear_grid
Definition: rectilinear_grid.h:1922
static constexpr auto is_same
Definition: type_traits.h:42
constexpr auto visit(Visitor &&visitor, Variant0 &&variant0, Variant1 &&variant1, Variants &&... variants) -> void
Definition: visit.h:14
TATOOINE_FLOWEXPLORER_REGISTER_NODE(tatooine::flowexplorer::nodes::sample_to_grid, TATOOINE_REFLECTION_INSERT_METHOD(time, time()))
Definition: field.h:134
Definition: sample_to_grid.h:11
sample_to_grid(flowexplorer::scene &s)
Definition: sample_to_grid.h:28
auto time() -> auto &
Definition: sample_to_grid.h:42
auto sample() -> void
Definition: sample_to_grid.h:79
ui::input_pin * m_field_pin
Definition: sample_to_grid.h:25
std::variant< std::monostate, polymorphic::scalarfield< real_type, 2 > *, polymorphic::scalarfield< real_type, 3 > *, polymorphic::vectorfield< real_type, 2 > *, polymorphic::vectorfield< real_type, 3 > * > m_field
Definition: sample_to_grid.h:22
auto on_pin_connected(ui::input_pin &this_pin, ui::output_pin &other_pin) -> void
Definition: sample_to_grid.h:55
auto field_do(F &&f)
Definition: sample_to_grid.h:110
auto field_domain_do(F &&f) -> void
Definition: sample_to_grid.h:122
std::variant< std::monostate, nonuniform_rectilinear_grid< real_type, 2 > *, nonuniform_rectilinear_grid< real_type, 3 > * > m_discretized_domain
Definition: sample_to_grid.h:16
auto domain_do(F &&f)
Definition: sample_to_grid.h:98
auto on_property_changed() -> void
Definition: sample_to_grid.h:91
auto on_title_changed(std::string const &old_title) -> void override
Definition: sample_to_grid.h:133
real_type m_time
Definition: sample_to_grid.h:23
auto time() const -> auto const &
Definition: sample_to_grid.h:41
auto on_pin_disconnected(ui::input_pin &pin) -> void
Definition: sample_to_grid.h:141
auto set_field(ui::output_pin &other_pin)
Definition: sample_to_grid.h:45
ui::input_pin * m_discretized_domain_pin
Definition: sample_to_grid.h:24
Definition: scene.h:17
auto title() const -> auto const &
Definition: node.h:69
auto insert_input_pin(std::string const &title, icon_type const t=icon_type::flow) -> auto &
Definition: node.h:49
Definition: node.h:382
virtual auto type() const -> std::type_info const &=0
auto get_as() -> T &
Definition: pin.h:142
Definition: field.h:13