/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 // Initial or constant angular rotation speed
82 pp.query("rot_speed_radps", tf.rotational_speed);
83 if (!pp.contains("rot_speed_radps")) {
84 pp.query("rot_speed_rpm", tf.rotational_speed);
85 tf.rotational_speed *=
86 2.0_rt * static_cast<amrex::Real>(M_PI) / 60.0_rt;
87 }
88 // Initial generator speed
89 pp.query("generator_power_init", tf.generator_power);
90 // Initial wind speed
91 amrex::Vector<amrex::Real> vel_vec{tf.wind_speed, 0., 0.};
92 pp.queryarr("hub_wind_vector_init", vel_vec);
93 tf.wind_speed = std::sqrt(
94 vel_vec[0] * vel_vec[0] + vel_vec[1] * vel_vec[1] +
95 vel_vec[2] * vel_vec[2]);
96 // Initial or constant nacelle yaw
97 pp.query("yaw_rad", tf.yaw);
98 if (!pp.contains("yaw_rad")) {
99 pp.query("yaw_deg", tf.yaw);
100 tf.yaw *= static_cast<amrex::Real>(M_PI) / 180.0_rt;
101 }
102 // Generator efficiency
103 pp.query("generator_efficiency", tf.generator_efficiency);
104 }
105};
106
107template <>
113
114template <>
116 typename TurbineKynema::DataType& data, amrex::Vector<int>& act_proc_count)
117{
120 ::ext_turb::KynemaSolverData>(data, act_proc_count);
121}
122
123template <typename SrcTrait>
124struct InitDataOp<TurbineKynema, SrcTrait>
125{
127 {
128 BL_PROFILE("amr-wind::InitDataOp<TurbineKynema>");
130 }
131};
132
133template <typename SrcTrait>
134struct UpdatePosOp<TurbineKynema, SrcTrait>
135{
137 {
138 BL_PROFILE("amr-wind::actuator::UpdatePosOp<TurbineKynema>");
140 }
141};
142
143template <typename SrcTrait>
144struct UpdateVelOp<TurbineKynema, SrcTrait>
145{
147 {
148 BL_PROFILE("amr-wind::actuator::UpdateVelOp<TurbineKynema>");
150 }
151};
152
153template <typename SrcTrait>
155{
157 {
158 BL_PROFILE("amr-wind::actuator::ComputeForceOp<TurbineKynema>");
160 }
161};
162
163template <typename SrcTrait>
165{
166private:
168
170 std::string m_out_dir;
171
173 std::string m_nc_filename;
174
176 int m_out_freq{10};
177
178public:
180 : m_data(data)
181 {}
182
184 {
185 pp.query("output_frequency", m_out_freq);
186 }
187
188 void prepare_outputs(const std::string& out_dir)
189 {
190 m_nc_filename = out_dir + "/" + m_data.info().label + ".nc";
192 m_nc_filename, m_data.meta(), m_data.info(), m_data.grid());
193 }
194
196 {
197 const auto& time = m_data.sim().time();
198 const int tidx = time.time_index();
199 if ((m_out_freq > 0) && (tidx % m_out_freq != 0)) {
200 return;
201 }
202
204 m_nc_filename, m_data.meta(), m_data.info(), m_data.grid(),
205 time.new_time());
206 }
207};
208
209} // namespace amr_wind::actuator::ops
210
211#endif /* TURBINE_KYNEMA_OPS_H */
ActTrait::InfoType & info()
Definition actuator_types.H:217
ActTrait::MetaType & meta()
Definition actuator_types.H:223
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: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:108
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:115
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: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:14
@ replay
Replay using velocities stored in file.
Definition external_base_types.H:13
@ init
Clean start.
Definition external_base_types.H:12
ActDataHolder< TurbineFromExtSolver< ::ext_turb::KynemaTurbine, ::ext_turb::KynemaSolverData > > DataType
Definition TurbineExternal.H:30
void operator()(typename TurbineKynema::DataType &data)
Definition turbine_kynema_ops.H:156
Definition actuator_ops.H:61
void operator()(TurbineKynema::DataType &data)
Definition turbine_kynema_ops.H:126
Definition actuator_ops.H:32
std::string m_nc_filename
NetCDF output filename for this turbine.
Definition turbine_kynema_ops.H:173
std::string m_out_dir
Path to the output directory (specified by Actuator physics class)
Definition turbine_kynema_ops.H:170
void prepare_outputs(const std::string &out_dir)
Definition turbine_kynema_ops.H:188
ProcessOutputsOp(typename TurbineKynema::DataType &data)
Definition turbine_kynema_ops.H:179
int m_out_freq
Output frequency (specified in input file)
Definition turbine_kynema_ops.H:176
TurbineKynema::DataType & m_data
Definition turbine_kynema_ops.H:167
void read_io_options(const utils::ActParser &pp)
Definition turbine_kynema_ops.H:183
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:136
Definition actuator_ops.H:43
void operator()(typename TurbineKynema::DataType &data)
Definition turbine_kynema_ops.H:146
Definition actuator_ops.H:54
Definition kynema_types.H:274
Definition kynema_types.H:16