/home/runner/work/kynema-sgf/kynema-sgf/src/wind_energy/actuator/turbine/kynema_fmb/turbine_kynema_fmb_ops.H Source File

Kynema-SGF API: /home/runner/work/kynema-sgf/kynema-sgf/src/wind_energy/actuator/turbine/kynema_fmb/turbine_kynema_fmb_ops.H Source File
Kynema-SGF API v0.1.0
CFD solver for wind plant simulations
Loading...
Searching...
No Matches
turbine_kynema_fmb_ops.H
Go to the documentation of this file.
1#ifndef TURBINE_KYNEMA_FMB_OPS_H
2#define TURBINE_KYNEMA_FMB_OPS_H
3
6#include "AMReX_REAL.H"
7
8using namespace amrex::literals;
9
11
12template <typename SrcTrait>
14{
15 void
17 {
18 auto& tf = data.meta().ext_data;
19 // Only one mode available for now
20 const std::string sim_mode{"init"};
21
22 if (sim_mode == "init") {
23 tf.sim_mode = ::ext_turb::SimMode::init;
24 amrex::Print() << "Initializing turbine:" << tf.tlabel << std::endl;
25 } else if (sim_mode == "replay") {
26 tf.sim_mode = ::ext_turb::SimMode::replay;
27 amrex::Print() << "Replaying turbine:" << tf.tlabel << std::endl;
28 } else if (sim_mode == "restart") {
29 tf.sim_mode = ::ext_turb::SimMode::restart;
30 amrex::Print() << "Restarting turbine:" << tf.tlabel << std::endl;
31 } else {
32 amrex::Abort(
33 "Actuator: Invalid Kynema simulation mode: " + sim_mode);
34 }
35
36 if (tf.sim_mode == ::ext_turb::SimMode::restart) {
37 pp.get("kynema_fmb_restart_file", tf.checkpoint_file);
38 } else {
39 pp.get("kynema_fmb_input_file", tf.input_file);
40 }
41
42 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
43 amrex::FileSystem::Exists(tf.input_file),
44 "turbine_kynema_fmb_ops: Cannot find Kynema-FMB input file: " +
45 tf.input_file);
46
47 pp.query(
48 "controller_shared_library_path", tf.controller_shared_lib_path);
49 pp.query("controller_input_file", tf.controller_input_file);
50
51 // Get hub height and turbine diameter from turbine input,
52 // not Kynema-SGF input file
53 const YAML::Node wio = YAML::LoadFile(tf.input_file);
54 {
55 const auto& wio_blade = wio["components"]["blade"];
56 const auto& ref_axis = wio_blade["reference_axis"];
57 const auto z_values =
58 ref_axis["z"]["values"].as<std::vector<amrex::Real>>();
59 data.info().rotor_diameter = 2.0_rt * z_values[z_values.size() - 1];
60 }
61 {
62 const auto& wio_tower = wio["components"]["tower"];
63 const auto& tower_ref_axis = wio_tower["reference_axis"];
64 const auto z_values =
65 tower_ref_axis["z"]["values"].as<std::vector<amrex::Real>>();
66 data.info().hub_height = z_values[z_values.size() - 1];
67 }
68
70
71 // Do Kynema-SGF inputs specific to kynema_fmb turbine
72 tf.fluid_density = data.meta().density;
73
74 tf.dt_ext = -1.;
75 pp.query("dt", tf.dt_ext);
76 if (tf.dt_ext < 0.0_rt) {
77 tf.dt_ext = tf.dt_cfd;
78 }
79
80 // Number of beam elements read in from file
81 pp.get("num_struct_nodes_blade", tf.num_blade_elem);
82 pp.get("num_struct_nodes_tower", tf.num_tower_elem);
83 // Initial or constant angular rotation speed
84 pp.query("rot_speed_radps", tf.rotational_speed);
85 if (!pp.contains("rot_speed_radps")) {
86 pp.query("rot_speed_rpm", tf.rotational_speed);
87 tf.rotational_speed *=
88 2.0_rt * std::numbers::pi_v<amrex::Real> / 60.0_rt;
89 }
90 // Initial generator speed
91 pp.query("generator_power_init", tf.generator_power);
92 // Initial wind speed
93 amrex::Vector<amrex::Real> vel_vec{tf.wind_speed, 0., 0.};
94 pp.queryarr("hub_wind_vector_init", vel_vec);
95 tf.wind_speed = std::sqrt(
96 vel_vec[0] * vel_vec[0] + vel_vec[1] * vel_vec[1] +
97 vel_vec[2] * vel_vec[2]);
98 // Initial or constant nacelle yaw
99 pp.query("yaw_rad", tf.yaw);
100 if (!pp.contains("yaw_rad")) {
101 pp.query("yaw_deg", tf.yaw);
102 tf.yaw *= std::numbers::pi_v<amrex::Real> / 180.0_rt;
103 }
104 // Generator efficiency
105 pp.query("generator_efficiency", tf.generator_efficiency);
106 }
107};
108
109template <>
115
116template <>
118 typename TurbineKynemaFMB::DataType& data,
119 amrex::Vector<int>& act_proc_count)
120{
123 ::ext_turb::KynemaFMBSolverData>(data, act_proc_count);
124}
125
126template <typename SrcTrait>
128{
130 {
131 BL_PROFILE("kynema-sgf::InitDataOp<TurbineKynemaFMB>");
133 }
134};
135
136template <typename SrcTrait>
138{
140 {
141 BL_PROFILE("kynema-sgf::actuator::UpdatePosOp<TurbineKynemaFMB>");
143 }
144};
145
146template <typename SrcTrait>
148{
150 {
151 BL_PROFILE("kynema-sgf::actuator::UpdateVelOp<TurbineKynemaFMB>");
153 }
154};
155
156template <typename SrcTrait>
158{
160 {
161 BL_PROFILE("kynema-sgf::actuator::ComputeForceOp<TurbineKynemaFMB>");
163 }
164};
165
166template <typename SrcTrait>
168{
169private:
171
173 std::string m_out_dir;
174
176 std::string m_nc_filename;
177
179 int m_out_freq{10};
180
181public:
183 : m_data(data)
184 {}
185
187 {
188 pp.query("output_frequency", m_out_freq);
189 }
190
191 void prepare_outputs(const std::string& out_dir)
192 {
193 m_nc_filename = out_dir + "/" + m_data.info().label + ".nc";
195 m_nc_filename, m_data.meta(), m_data.info(), m_data.grid());
196 }
197
199 {
200 const auto& time = m_data.sim().time();
201 const int tidx = time.time_index();
202 if ((m_out_freq > 0) && (tidx % m_out_freq != 0)) {
203 return;
204 }
205
207 m_nc_filename, m_data.meta(), m_data.info(), m_data.grid(),
208 time.new_time());
209 }
210};
211
212} // namespace kynema_sgf::actuator::ops
213
214#endif /* TURBINE_KYNEMA_FMB_OPS_H */
ActTrait::MetaType & meta()
Definition actuator_types.H:229
ActTrait::InfoType & info()
Definition actuator_types.H:217
void get(const std::string &name, vs::Vector &value) const
Definition MultiParser.H:44
bool contains(const std::string &name) const
Check if the keyword is present in either namespace.
Definition MultiParser.H:34
void queryarr(const std::string &name, T &value) const
Query a vector of values for the given keyword entry from either namespace.
Definition MultiParser.H:149
void query(const std::string &name, vs::Vector &value) const
Definition MultiParser.H:59
@ restart
Restart using external checkpoint files.
Definition external_base_types.H:15
@ replay
Replay using velocities stored in file.
Definition external_base_types.H:14
@ init
Clean start.
Definition external_base_types.H:13
Definition ActSrcLineOp.H:12
void determine_influenced_procs< TurbineKynemaFMB >(typename TurbineKynemaFMB::DataType &data)
Definition turbine_kynema_fmb_ops.H:110
void external_determine_root_proc(datatype &data, amrex::Vector< int > &act_proc_count)
Definition turbine_external_ops.H:66
void determine_root_proc< TurbineKynemaFMB >(typename TurbineKynemaFMB::DataType &data, amrex::Vector< int > &act_proc_count)
Definition turbine_kynema_fmb_ops.H:117
void read_ops(datatype &data, const utils::ActParser &pp)
Definition turbine_external_ops.H:16
void update_pos_op(datatype &data)
Definition turbine_external_ops.H:151
void update_vel_op(datatype &data)
Definition turbine_external_ops.H:175
void external_determine_influenced_procs(datatype &data)
Definition turbine_external_ops.H:47
void init_data_op(datatype &data)
Definition turbine_external_ops.H:96
void compute_force_op(datatype &data)
Definition turbine_external_ops.H:215
::kynema_sgf::utils::MultiParser ActParser
Definition ActParser.H:8
void prepare_netcdf_file(const std::string &ncfile, const TurbineBaseData &meta, const TurbineInfo &info, const ActGrid &grid)
Definition turbine_utils.cpp:63
void write_netcdf(const std::string &ncfile, const TurbineBaseData &meta, const TurbineInfo &info, const ActGrid &grid, const amrex::Real time)
Definition turbine_utils.cpp:130
TurbineFromExtSolver< ::ext_turb::KynemaFMBTurbine, ::ext_turb::KynemaFMBSolverData > TurbineKynemaFMB
Definition TurbineKynemaFMB.H:9
Definition kynema_fmb_types.H:272
Definition kynema_fmb_types.H:16
ActDataHolder< TurbineFromExtSolver< ::ext_turb::KynemaFMBTurbine, ::ext_turb::KynemaFMBSolverData > > DataType
Definition TurbineExternal.H:30
void operator()(typename TurbineKynemaFMB::DataType &data)
Definition turbine_kynema_fmb_ops.H:159
Definition actuator_ops.H:61
void operator()(TurbineKynemaFMB::DataType &data)
Definition turbine_kynema_fmb_ops.H:129
Definition actuator_ops.H:32
int m_out_freq
Output frequency (specified in input file)
Definition turbine_kynema_fmb_ops.H:179
TurbineKynemaFMB::DataType & m_data
Definition turbine_kynema_fmb_ops.H:170
void write_outputs()
Definition turbine_kynema_fmb_ops.H:198
void prepare_outputs(const std::string &out_dir)
Definition turbine_kynema_fmb_ops.H:191
std::string m_out_dir
Path to the output directory (specified by Actuator physics class)
Definition turbine_kynema_fmb_ops.H:173
ProcessOutputsOp(typename TurbineKynemaFMB::DataType &data)
Definition turbine_kynema_fmb_ops.H:182
void read_io_options(const utils::ActParser &pp)
Definition turbine_kynema_fmb_ops.H:186
std::string m_nc_filename
NetCDF output filename for this turbine.
Definition turbine_kynema_fmb_ops.H:176
void operator()(TurbineKynemaFMB::DataType &data, const utils::ActParser &pp)
Definition turbine_kynema_fmb_ops.H:16
Definition actuator_ops.H:19
void operator()(typename TurbineKynemaFMB::DataType &data)
Definition turbine_kynema_fmb_ops.H:139
Definition actuator_ops.H:43
void operator()(typename TurbineKynemaFMB::DataType &data)
Definition turbine_kynema_fmb_ops.H:149
Definition actuator_ops.H:54