/home/runner/work/kynema-sgf/kynema-sgf/src/wind_energy/actuator/ActuatorModel.H Source File

Kynema-SGF API: /home/runner/work/kynema-sgf/kynema-sgf/src/wind_energy/actuator/ActuatorModel.H Source File
Kynema-SGF API v0.1.0
CFD solver for wind plant simulations
Loading...
Searching...
No Matches
ActuatorModel.H
Go to the documentation of this file.
1#ifndef ACTUATORMODEL_H
2#define ACTUATORMODEL_H
3
4#include "src/core/Factory.H"
11
12namespace kynema_sgf {
13
14class CFDSim;
15
16namespace actuator {
17
29 : public Factory<ActuatorModel, CFDSim&, const std::string&, const int>
30{
31public:
32 static std::string base_identifier() { return "ActuatorModel"; }
33
34 ~ActuatorModel() override = default;
35
36 [[nodiscard]] virtual const std::string& label() const = 0;
37
38 [[nodiscard]] virtual int id() const = 0;
39
40 [[nodiscard]] virtual const ActInfo& info() const = 0;
41
42 virtual ActInfo& info() = 0;
43
44 virtual void read_inputs(const utils::ActParser&) = 0;
45
46 virtual void determine_influenced_procs() = 0;
47
48 virtual void determine_root_proc(amrex::Vector<int>&) = 0;
49
50 virtual void init_actuator_source() = 0;
51
52 [[nodiscard]] virtual int num_velocity_points() const = 0;
53
54 virtual void update_positions(VecSlice&) = 0;
55
56 virtual void update_fields(const VecSlice&, const RealSlice&) = 0;
57
58 virtual void compute_forces() = 0;
59
60 virtual void compute_source_term(
61 int lev, const amrex::MFIter& mfi, const amrex::Geometry& geom) = 0;
62
63 virtual void prepare_outputs(const std::string&) = 0;
64
65 virtual void write_outputs() = 0;
66
67 [[nodiscard]] virtual amrex::Vector<ActuatorRefinementGeometry>
68 refinement_geometries(amrex::Real time) const = 0;
69
70 [[nodiscard]] virtual std::optional<motion::RigidTransform>
71 reference_frame(amrex::Real time) const = 0;
72};
73
88template <typename ActTrait, typename SrcTrait = ActSrcLine>
89class ActModel : public ActuatorModel::Register<ActModel<ActTrait, SrcTrait>>
90{
91private:
93 typename ActTrait::DataType m_data;
94
97
100
101public:
102 static std::string identifier()
103 {
104 return ActTrait::identifier() + SrcTrait::identifier();
105 }
106
112 ActModel(CFDSim& sim, const std::string& label, const int id)
114 {}
115
117 [[nodiscard]] const std::string& label() const override
118 {
119 return m_data.info().label;
120 }
121
123 [[nodiscard]] int id() const override { return m_data.info().id; }
124
126 [[nodiscard]] const ActInfo& info() const override { return m_data.info(); }
127
129 ActInfo& info() override { return m_data.info(); }
130
132 [[nodiscard]] const auto& meta() const { return m_data.meta(); }
133
135 [[nodiscard]] const auto& grid() const { return m_data.grid(); }
136
137 void read_inputs(const utils::ActParser& pp) override
138 {
140 m_out_op.read_io_options(pp);
141 }
142
147
148 void determine_root_proc(amrex::Vector<int>& act_proc_count) override;
149
150 [[nodiscard]] int num_velocity_points() const override;
151
152 void update_positions(VecSlice& pos) override
153 {
155 const auto& vpos = m_data.grid().vel_pos;
156 std::copy(vpos.begin(), vpos.end(), pos.begin());
157 }
158
159 void update_fields(const VecSlice& vel, const RealSlice& density) override
160 {
161 std::copy(vel.begin(), vel.end(), m_data.grid().vel.begin());
162 std::copy(
163 density.begin(), density.end(), m_data.grid().density.begin());
165 }
166
167 void compute_forces() override
168 {
170 m_src_op.setup_op();
171 }
172
174 const int lev,
175 const amrex::MFIter& mfi,
176 const amrex::Geometry& geom) override
177 {
178 m_src_op(lev, mfi, geom);
179 }
180
181 void prepare_outputs(const std::string& out_dir) override
182 {
183 m_out_op.prepare_outputs(out_dir);
184 }
185
186 void write_outputs() override { m_out_op.write_outputs(); }
187
188 [[nodiscard]] amrex::Vector<ActuatorRefinementGeometry>
189 refinement_geometries(const amrex::Real time) const override
190 {
192 }
193
194 [[nodiscard]] std::optional<motion::RigidTransform>
195 reference_frame(const amrex::Real time) const override
196 {
198 }
199
200 void init_actuator_source() override
201 {
203 m_src_op.initialize();
204 }
205};
206
207template <typename ActTrait, typename SrcTrait>
209 amrex::Vector<int>& act_proc_count)
210{
212 {
213 // Sanity checks
214 const auto& linfo = m_data.info();
215 const auto& plist = linfo.procs;
216 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
217 linfo.root_proc > -1,
218 "linfo.root_proc = " + std::to_string(linfo.root_proc));
219 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
220 plist.find(linfo.root_proc) != plist.end(),
221 "linfo.root_proc = " + std::to_string(linfo.root_proc) +
222 ", plist.size() = " + std::to_string(plist.size()));
223 }
224}
225
226template <typename ActTrait, typename SrcTrait>
228{
229 const auto& linfo = m_data.info();
230 auto& grid = m_data.grid();
231
232 return (linfo.sample_vel_in_proc) ? grid.vel.size() : 0;
233}
234
235} // namespace actuator
236} // namespace kynema_sgf
237
238#endif /* ACTUATORMODEL_H */
Definition CFDSim.H:55
std::optional< motion::RigidTransform > reference_frame(const amrex::Real time) const override
Definition ActuatorModel.H:195
const auto & meta() const
Return the meta info object for this actuator instance.
Definition ActuatorModel.H:132
void compute_source_term(const int lev, const amrex::MFIter &mfi, const amrex::Geometry &geom) override
Definition ActuatorModel.H:173
ActTrait::DataType m_data
Instance that holds all data related to a particular actuator type.
Definition ActuatorModel.H:93
ActInfo & info() override
Return the core info object for this actuator instance.
Definition ActuatorModel.H:129
static std::string identifier()
Definition ActuatorModel.H:102
void determine_root_proc(amrex::Vector< int > &act_proc_count) override
Definition ActuatorModel.H:208
void init_actuator_source() override
Definition ActuatorModel.H:200
ops::ActSrcOp< ActTrait, SrcTrait > m_src_op
Source computation operator.
Definition ActuatorModel.H:96
const ActInfo & info() const override
Return the core info object for this actuator instance.
Definition ActuatorModel.H:126
const auto & grid() const
Return the actuator grid for inspection and diagnostics.
Definition ActuatorModel.H:135
int num_velocity_points() const override
Definition ActuatorModel.H:227
void update_positions(VecSlice &pos) override
Definition ActuatorModel.H:152
void determine_influenced_procs() override
Definition ActuatorModel.H:143
void compute_forces() override
Definition ActuatorModel.H:167
amrex::Vector< ActuatorRefinementGeometry > refinement_geometries(const amrex::Real time) const override
Definition ActuatorModel.H:189
ActModel(CFDSim &sim, const std::string &label, const int id)
Definition ActuatorModel.H:112
void read_inputs(const utils::ActParser &pp) override
Definition ActuatorModel.H:137
void update_fields(const VecSlice &vel, const RealSlice &density) override
Definition ActuatorModel.H:159
ops::ProcessOutputsOp< ActTrait, SrcTrait > m_out_op
Outputs processor.
Definition ActuatorModel.H:99
void write_outputs() override
Definition ActuatorModel.H:186
const std::string & label() const override
Return the unique identifier (name) for this instance.
Definition ActuatorModel.H:117
void prepare_outputs(const std::string &out_dir) override
Definition ActuatorModel.H:181
int id() const override
Return the unique tag (integer ID) for this instance.
Definition ActuatorModel.H:123
Definition ActuatorModel.H:30
virtual void update_fields(const VecSlice &, const RealSlice &)=0
virtual void determine_root_proc(amrex::Vector< int > &)=0
virtual void prepare_outputs(const std::string &)=0
virtual std::optional< motion::RigidTransform > reference_frame(amrex::Real time) const =0
virtual void update_positions(VecSlice &)=0
virtual void determine_influenced_procs()=0
virtual void read_inputs(const utils::ActParser &)=0
virtual const std::string & label() const =0
virtual void compute_source_term(int lev, const amrex::MFIter &mfi, const amrex::Geometry &geom)=0
virtual amrex::Vector< ActuatorRefinementGeometry > refinement_geometries(amrex::Real time) const =0
virtual int num_velocity_points() const =0
virtual const ActInfo & info() const =0
static std::string base_identifier()
Definition ActuatorModel.H:32
Definition actuator_ops.H:71
void determine_root_proc(typename T::DataType &, amrex::Vector< int > &)
Definition actuator_opsI.H:32
void determine_influenced_procs(typename T::DataType &)
Definition actuator_opsI.H:12
::kynema_sgf::utils::MultiParser ActParser
Definition ActParser.H:8
Definition MovingPlaneSampler.H:6
::kynema_sgf::utils::Slice< kynema_sgf::vs::Vector > VecSlice
Definition actuator_types.H:94
::kynema_sgf::utils::Slice< amrex::Real > RealSlice
Definition actuator_types.H:92
This test case is intended as an evaluation of the momentum advection scheme.
Definition BCInterface.cpp:12
Definition actuator_types.H:185
Definition actuator_ops.H:64
Definition actuator_ops.H:35
Definition actuator_ops.H:22
Definition actuator_ops.H:46
Definition actuator_ops.H:57
AMREX_GPU_HOST_DEVICE iterator end()
Definition Slice.H:57
AMREX_GPU_HOST_DEVICE iterator begin()
Definition Slice.H:56