/home/runner/work/amr-wind/amr-wind/amr-wind/wind_energy/actuator/turbine/kynema/turbine_kynema_ops.H Source File

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