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