/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
4#include <numbers>
5#include <yaml-cpp/yaml.h>
8#include "AMReX_REAL.H"
9
10using namespace amrex::literals;
11
13
14template <typename SrcTrait>
16{
17 void
19 {
20 auto& tf = data.meta().ext_data;
21 // Always need an input file
22 pp.get("kynema_fmb_input_file", tf.input_file);
23 // Get hub height and turbine diameter from turbine input,
24 // not Kynema-SGF input file
25 const YAML::Node wio = YAML::LoadFile(tf.input_file);
26 {
27 const auto& wio_blade = wio["components"]["blade"];
28 const auto& ref_axis = wio_blade["reference_axis"];
29 const auto z_values =
30 ref_axis["z"]["values"].as<std::vector<amrex::Real>>();
31 data.info().rotor_diameter = 2.0_rt * z_values[z_values.size() - 1];
32 }
33 {
34 const auto& wio_tower = wio["components"]["tower"];
35 const auto& tower_ref_axis = wio_tower["reference_axis"];
36 const auto z_values =
37 tower_ref_axis["z"]["values"].as<std::vector<amrex::Real>>();
38 data.info().hub_height = z_values[z_values.size() - 1];
39 }
40
42
43 // Avoid using directly specified "modes"
44 // Use a restart file if included
45
46 pp.query("kynema_fmb_restart_step", tf.checkpoint_file);
47
48 std::string sim_mode = "init";
49 if (!tf.checkpoint_file.empty()) {
50 std::string checkpoint_dir = ".";
51 pp.query("kynema_fmb_restart_directory", checkpoint_dir);
52 int checkpoint_step = std::stoi(tf.checkpoint_file);
53 tf.time_index = checkpoint_step;
54 tf.checkpoint_file =
55 checkpoint_dir + "/" +
56 sgf_fmb::checkpoint_filename(checkpoint_step, tf.tlabel);
57 sim_mode = "restart";
58 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
59 amrex::FileSystem::Exists(tf.checkpoint_file),
60 "turbine_kynema_fmb_ops: Cannot find Kynema-FMB checkpoint "
61 "file: " +
62 tf.checkpoint_file);
63 }
64 if (sim_mode == "init") {
65 tf.sim_mode = ::ext_turb::SimMode::init;
66 amrex::Print() << "Initializing turbine: " << tf.tlabel
67 << std::endl;
68 } else {
69 tf.sim_mode = ::ext_turb::SimMode::restart;
70 amrex::Print() << "Restarting turbine: " << tf.tlabel << std::endl;
71 }
72
73 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
74 amrex::FileSystem::Exists(tf.input_file),
75 "turbine_kynema_fmb_ops: Cannot find Kynema-FMB input file: " +
76 tf.input_file);
77
78 pp.query(
79 "controller_shared_library_path", tf.controller_shared_lib_path);
80 pp.query("controller_input_file", tf.controller_input_file);
81
82 // Do Kynema-SGF inputs specific to kynema_fmb turbine
83 tf.fluid_density = data.meta().density;
84
85 tf.dt_ext = -1.;
86 pp.query("dt", tf.dt_ext);
87 if (tf.dt_ext < 0.0_rt) {
88 tf.dt_ext = tf.dt_cfd;
89 }
90
91 // One-way coupling flag for aerodynamic loads
92 pp.query("decouple_structure_from_aero_loading", tf.one_way_coupled);
93
94 // Number of beam elements read in from file
95 pp.get("num_struct_nodes_blade", tf.num_blade_elem);
96 pp.get("num_struct_nodes_tower", tf.num_tower_elem);
97 // Section refinement for blades and tower
98 pp.query("section_ref_blade", tf.section_refinement_blade);
99 pp.query("section_ref_tower", tf.section_refinement_tower);
100 // Initial or constant angular rotation speed
101 pp.query("rot_speed_radps", tf.rotational_speed);
102 if (!pp.contains("rot_speed_radps")) {
103 pp.query("rot_speed_rpm", tf.rotational_speed);
104 tf.rotational_speed *=
105 2.0_rt * std::numbers::pi_v<amrex::Real> / 60.0_rt;
106 }
107 // Initial generator speed
108 pp.query("generator_power_init", tf.generator_power);
109 // Initial wind speed
110 amrex::Vector<amrex::Real> vel_vec{tf.wind_speed, 0., 0.};
111 pp.queryarr("hub_wind_vector_init", vel_vec);
112 tf.wind_speed = std::sqrt(
113 vel_vec[0] * vel_vec[0] + vel_vec[1] * vel_vec[1] +
114 vel_vec[2] * vel_vec[2]);
115 // Initial or constant nacelle yaw
116 pp.query("yaw_rad", tf.yaw);
117 if (!pp.contains("yaw_rad")) {
118 pp.query("yaw_deg", tf.yaw);
119 tf.yaw *= std::numbers::pi_v<amrex::Real> / 180.0_rt;
120 }
121 // Generator efficiency
122 pp.query("generator_efficiency", tf.generator_efficiency);
123 }
124};
125
126template <>
132
133template <>
135 typename TurbineKynemaFMB::DataType& data,
136 amrex::Vector<int>& act_proc_count)
137{
140 ::ext_turb::KynemaFMBSolverData>(data, act_proc_count);
141}
142
143template <typename SrcTrait>
145{
147 {
148 BL_PROFILE("kynema-sgf::InitDataOp<TurbineKynemaFMB>");
150 }
151};
152
153template <typename SrcTrait>
155{
157 {
158 BL_PROFILE("kynema-sgf::actuator::UpdatePosOp<TurbineKynemaFMB>");
160 }
161};
162
163template <typename SrcTrait>
165{
167 {
168 BL_PROFILE("kynema-sgf::actuator::UpdateVelOp<TurbineKynemaFMB>");
170 }
171};
172
173template <typename SrcTrait>
175{
177 {
178 BL_PROFILE("kynema-sgf::actuator::ComputeForceOp<TurbineKynemaFMB>");
180 }
181};
182
183template <typename SrcTrait>
185{
186private:
188
190 std::string m_out_dir;
191
193 std::string m_nc_filename;
194
196 int m_out_freq{10};
197
198public:
200 : m_data(data)
201 {}
202
204 {
205 pp.query("output_frequency", m_out_freq);
206 }
207
208 void prepare_outputs(const std::string& out_dir)
209 {
210 m_nc_filename = out_dir + "/" + m_data.info().label + ".nc";
212 m_nc_filename, m_data.meta(), m_data.info(), m_data.grid());
213 }
214
216 {
217 const auto& time = m_data.sim().time();
218 const int tidx = time.time_index();
219 if ((m_out_freq > 0) && (tidx % m_out_freq != 0)) {
220 return;
221 }
222
224 m_nc_filename, m_data.meta(), m_data.info(), m_data.grid(),
225 time.new_time());
226 }
227};
228
229} // namespace kynema_sgf::actuator::ops
230
231#endif /* TURBINE_KYNEMA_FMB_OPS_H */
ActTrait::MetaType & meta()
Definition actuator_types.H:267
ActTrait::InfoType & info()
Definition actuator_types.H:255
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:162
void query(const std::string &name, vs::Vector &value) const
Definition MultiParser.H:62
@ restart
Restart using external checkpoint files.
Definition external_base_types.H:16
@ init
Clean start.
Definition external_base_types.H:14
Definition ActSrcLineOp.H:12
void determine_influenced_procs< TurbineKynemaFMB >(typename TurbineKynemaFMB::DataType &data)
Definition turbine_kynema_fmb_ops.H:127
void external_determine_root_proc(datatype &data, amrex::Vector< int > &act_proc_count)
Definition turbine_external_ops.H:67
void determine_root_proc< TurbineKynemaFMB >(typename TurbineKynemaFMB::DataType &data, amrex::Vector< int > &act_proc_count)
Definition turbine_kynema_fmb_ops.H:134
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:154
void update_vel_op(datatype &data)
Definition turbine_external_ops.H:178
void external_determine_influenced_procs(datatype &data)
Definition turbine_external_ops.H:46
void init_data_op(datatype &data)
Definition turbine_external_ops.H:97
void compute_force_op(datatype &data)
Definition turbine_external_ops.H:218
::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
static std::string checkpoint_filename(int time_index, std::string turbine_name)
Definition kynema_fmb_types.H:25
Definition kynema_fmb_types.H:168
Definition kynema_fmb_types.H:39
ActDataHolder< TurbineFromExtSolver< ::ext_turb::KynemaFMBTurbine, ::ext_turb::KynemaFMBSolverData > > DataType
Definition TurbineExternal.H:31
void operator()(typename TurbineKynemaFMB::DataType &data)
Definition turbine_kynema_fmb_ops.H:176
Definition actuator_ops.H:64
void operator()(TurbineKynemaFMB::DataType &data)
Definition turbine_kynema_fmb_ops.H:146
Definition actuator_ops.H:35
int m_out_freq
Output frequency (specified in input file)
Definition turbine_kynema_fmb_ops.H:196
TurbineKynemaFMB::DataType & m_data
Definition turbine_kynema_fmb_ops.H:187
void write_outputs()
Definition turbine_kynema_fmb_ops.H:215
void prepare_outputs(const std::string &out_dir)
Definition turbine_kynema_fmb_ops.H:208
std::string m_out_dir
Path to the output directory (specified by Actuator physics class)
Definition turbine_kynema_fmb_ops.H:190
ProcessOutputsOp(typename TurbineKynemaFMB::DataType &data)
Definition turbine_kynema_fmb_ops.H:199
void read_io_options(const utils::ActParser &pp)
Definition turbine_kynema_fmb_ops.H:203
std::string m_nc_filename
NetCDF output filename for this turbine.
Definition turbine_kynema_fmb_ops.H:193
void operator()(TurbineKynemaFMB::DataType &data, const utils::ActParser &pp)
Definition turbine_kynema_fmb_ops.H:18
Definition actuator_ops.H:22
void operator()(typename TurbineKynemaFMB::DataType &data)
Definition turbine_kynema_fmb_ops.H:156
Definition actuator_ops.H:46
void operator()(typename TurbineKynemaFMB::DataType &data)
Definition turbine_kynema_fmb_ops.H:166
Definition actuator_ops.H:57