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