/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 or constant nacelle yaw
85 pp.query("yaw_rad", tf.yaw);
86 if (!pp.contains("yaw_rad")) {
87 pp.query("yaw_deg", tf.yaw);
88 tf.yaw *= M_PI / 180.;
89 }
90 }
91};
92
93template <>
99
100template <>
102 typename TurbineKynema::DataType& data, amrex::Vector<int>& act_proc_count)
103{
106 ::ext_turb::KynemaSolverData>(data, act_proc_count);
107}
108
109template <typename SrcTrait>
110struct InitDataOp<TurbineKynema, SrcTrait>
111{
113 {
114 BL_PROFILE("amr-wind::InitDataOp<TurbineKynema>");
116 }
117};
118
119template <typename SrcTrait>
120struct UpdatePosOp<TurbineKynema, SrcTrait>
121{
123 {
124 BL_PROFILE("amr-wind::actuator::UpdatePosOp<TurbineKynema>");
126 }
127};
128
129template <typename SrcTrait>
130struct UpdateVelOp<TurbineKynema, SrcTrait>
131{
133 {
134 BL_PROFILE("amr-wind::actuator::UpdateVelOp<TurbineKynema>");
136 }
137};
138
139template <typename SrcTrait>
141{
143 {
144 BL_PROFILE("amr-wind::actuator::ComputeForceOp<TurbineKynema>");
146 }
147};
148
149template <typename SrcTrait>
151{
152private:
154
156 std::string m_out_dir;
157
159 std::string m_nc_filename;
160
162 int m_out_freq{10};
163
164public:
166 : m_data(data)
167 {}
168
170 {
171 pp.query("output_frequency", m_out_freq);
172 }
173
174 void prepare_outputs(const std::string& out_dir)
175 {
176 m_nc_filename = out_dir + "/" + m_data.info().label + ".nc";
178 m_nc_filename, m_data.meta(), m_data.info(), m_data.grid());
179 }
180
182 {
183 const auto& time = m_data.sim().time();
184 const int tidx = time.time_index();
185 if ((m_out_freq > 0) && (tidx % m_out_freq != 0)) {
186 return;
187 }
188
190 m_nc_filename, m_data.meta(), m_data.info(), m_data.grid(),
191 time.new_time());
192 }
193};
194
195} // namespace amr_wind::actuator::ops
196
197#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
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:94
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:101
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:142
Definition actuator_ops.H:61
void operator()(TurbineKynema::DataType &data)
Definition turbine_kynema_ops.H:112
Definition actuator_ops.H:32
std::string m_nc_filename
NetCDF output filename for this turbine.
Definition turbine_kynema_ops.H:159
std::string m_out_dir
Path to the output directory (specified by Actuator physics class)
Definition turbine_kynema_ops.H:156
void prepare_outputs(const std::string &out_dir)
Definition turbine_kynema_ops.H:174
ProcessOutputsOp(typename TurbineKynema::DataType &data)
Definition turbine_kynema_ops.H:165
int m_out_freq
Output frequency (specified in input file)
Definition turbine_kynema_ops.H:162
TurbineKynema::DataType & m_data
Definition turbine_kynema_ops.H:153
void read_io_options(const utils::ActParser &pp)
Definition turbine_kynema_ops.H:169
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:122
Definition actuator_ops.H:43
void operator()(typename TurbineKynema::DataType &data)
Definition turbine_kynema_ops.H:132
Definition actuator_ops.H:54
Definition kynema_types.H:269
Definition kynema_types.H:14