/home/runner/work/amr-wind/amr-wind/amr-wind/wind_energy/actuator/disk/uniform_ct_ops.H Source File

AMR-Wind API: /home/runner/work/amr-wind/amr-wind/amr-wind/wind_energy/actuator/disk/uniform_ct_ops.H Source File
AMR-Wind API v0.1.0
CFD solver for wind plant simulations
Loading...
Searching...
No Matches
uniform_ct_ops.H
Go to the documentation of this file.
1#ifndef UNIFORM_CT_OPS_H
2#define UNIFORM_CT_OPS_H
3
4#include <numbers>
9#include "AMReX_REAL.H"
10
11using namespace amrex::literals;
13namespace uniformct {
14
15void parse_and_gather_params(const utils::ActParser& pp, UniformCtData& data);
17} // namespace uniformct
18
19template <>
29
30template <>
32{
33 void operator()(typename UniformCt::DataType& data)
34 {
35 if (!data.sim().helics().is_activated()) {
36 return;
37 }
38
39#ifdef AMR_WIND_USE_HELICS
40
41 const amrex::Real wind_direction =
42 -data.sim().helics().m_turbine_yaw_to_amrwind[data.info().id] +
43 90.0_rt;
44 const amrex::Real wind_direction_radian =
45 amr_wind::utils::radians(wind_direction);
46
47 auto& meta = data.meta();
48
49 meta.normal_vec[0] = std::cos(wind_direction_radian);
50 meta.normal_vec[1] = std::sin(wind_direction_radian);
51 meta.normal_vec[2] = 0.0_rt;
52
53 meta.sample_vec[0] = meta.normal_vec[0];
54 meta.sample_vec[1] = meta.normal_vec[1];
55 meta.sample_vec[2] = meta.normal_vec[2];
56
57 if (data.info().is_root_proc) {
58 std::cout << "turbine " << data.info().id
59 << " normal: " << meta.normal_vec[0] << ' '
60 << meta.normal_vec[1] << std::endl;
61 }
62
64#endif
65 }
66};
67// compute the total force over a given radial section
68// this will then be spread uniformly over that area in the
69// projection step
70template <>
72{
74 {
75 auto& grid = data.grid();
76 auto& ddata = data.meta();
77 const auto& normal = ddata.normal_vec;
78 const amrex::Real uInfSqr = base::compute_reference_velocity_sqr(ddata);
79 base::set_thrust_coefficient(ddata, uInfSqr);
80
81 const int npts = ddata.num_force_pts;
82 const amrex::Real rho = ddata.density;
83 const amrex::Real aeroPressure =
84 0.5_rt * uInfSqr * rho * ddata.current_ct;
85 const amrex::Real dr = ddata.dr;
86
87 for (int ip = 0; ip < npts; ++ip) {
88 const amrex::Real r = (ip + 0.5_rt) * dr;
89 const amrex::Real rp = r + (dr * 0.5_rt);
90 const amrex::Real rm = r - (dr * 0.5_rt);
91 const amrex::Real a =
92 std::numbers::pi_v<amrex::Real> * (rp * rp - rm * rm);
93 // disk force should always point in direction of the normal
94 grid.force[ip] = (aeroPressure * a) * normal;
95 }
96#ifdef AMR_WIND_USE_HELICS
97
98 if (data.info().is_root_proc && data.sim().helics().is_activated()) {
99
100 const amrex::Real ct = ddata.current_ct;
101 std::cout << "turbine" << data.info().id << " thrust: " << ct
102 << std::endl;
103 const amrex::Real cp = 0.5_rt * (ct + ct * std::sqrt(1.0_rt - ct));
104 const amrex::Real area = std::numbers::pi_v<amrex::Real> * 0.25_rt *
105 ddata.diameter * ddata.diameter;
106 const amrex::Real power =
107 cp * 0.5_rt * rho * std::pow(uInfSqr, 1.5_rt) * area;
108
110 power;
111 const amrex::Real turbine_angle = std::atan2(
112 ddata.reference_velocity[1], ddata.reference_velocity[0]);
113 data.sim()
114 .helics()
116 -amr_wind::utils::degrees(turbine_angle) + 270.0_rt;
117 }
118#endif
119 }
120};
121
122template <>
131template <>
133{
134private:
135 // cppcheck-suppress uninitMemberVarPrivate
138 std::string m_out_dir;
139
141 std::string m_nc_filename;
142
144 int m_out_freq{10};
145
146public:
148 const UniformCt::DataType& data)
149 : m_data(data)
150 {}
151 void operator()(UniformCt::DataType& /*unused*/) {}
153 {
154 pp.query("output_frequency", m_out_freq);
155 }
156 void prepare_outputs(const std::string& out_dir)
157 {
158 m_nc_filename = out_dir + "/" + m_data.info().label + ".nc";
160 m_nc_filename, m_data.meta(), m_data.info(), m_data.grid());
161 }
163 {
164 const auto& time = m_data.sim().time();
165 const int tidx = time.time_index();
166 if (tidx % m_out_freq != 0) {
167 return;
168 }
169
171 m_nc_filename, m_data.meta(), m_data.info(), m_data.grid(),
172 time.new_time());
173 }
174};
175} // namespace amr_wind::actuator::ops
176
177#endif /* UNIFORM_CT_OPS_H */
HelicsStorage & helics()
Definition CFDSim.H:120
amrex::Vector< amrex::Real > m_turbine_wind_direction_to_controller
Definition helics.H:39
amrex::Vector< amrex::Real > m_turbine_yaw_to_amrwind
Definition helics.H:40
amrex::Vector< amrex::Real > m_turbine_power_to_controller
Definition helics.H:38
bool is_activated() const
Definition helics.H:26
CFDSim & sim()
Definition actuator_types.H:214
ActTrait::GridType & grid()
Definition actuator_types.H:223
ActTrait::InfoType & info()
Definition actuator_types.H:217
ActTrait::MetaType & meta()
Definition actuator_types.H:229
void query(const std::string &name, vs::Vector &value) const
Definition MultiParser.H:59
void prepare_netcdf_file(const std::string &name, const DiskBaseData &data, const ActInfo &info, const ActGrid &grid)
Definition disk_ops.cpp:10
void write_netcdf(const std::string &name, const DiskBaseData &data, const ActInfo &info, const ActGrid &, const amrex::Real time)
Definition disk_ops.cpp:74
AMREX_INLINE void set_thrust_coefficient(DiskBaseData &data, const amrex::Real &uInfSqr)
Definition disk_ops.H:129
AMREX_INLINE amrex::Real compute_reference_velocity_sqr(DiskBaseData &data)
Definition disk_ops.H:116
void allocate_basic_grid_quantities(typename T::DataType &data)
Definition disk_ops.H:79
void do_parse_based_computations(ActDataHolder< T > &data)
Definition disk_ops.H:92
Definition uniform_ct_ops.cpp:8
void parse_and_gather_params(const utils::ActParser &pp, UniformCtData &data)
Definition uniform_ct_ops.cpp:53
void update_disk_points(UniformCt::DataType &data)
Definition uniform_ct_ops.cpp:65
Definition ActSrcLineOp.H:12
::amr_wind::utils::MultiParser ActParser
Definition ActParser.H:8
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real degrees(const amrex::Real rad_val)
Convert from radians to degrees.
Definition trig_ops.H:39
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real radians(const amrex::Real deg_val)
Convert from degrees to radians.
Definition trig_ops.H:32
int id
Unique integer identifier for the turbine.
Definition actuator_types.H:159
bool is_root_proc
Flag indicating whether this is root proc.
Definition actuator_types.H:165
Definition actuator_types.H:56
vs::Vector normal_vec
Definition ActuatorDisk.H:20
Definition UniformCt.H:12
ActDataHolder< UniformCt > DataType
Definition UniformCt.H:16
void operator()(UniformCt::DataType &data)
Definition uniform_ct_ops.H:73
Definition actuator_ops.H:61
void operator()(typename UniformCt::DataType &data)
Definition uniform_ct_ops.H:125
Definition actuator_ops.H:32
int m_out_freq
Output frequency (specified in input file)
Definition uniform_ct_ops.H:144
void operator()(UniformCt::DataType &)
Definition uniform_ct_ops.H:151
void read_io_options(const utils::ActParser &pp)
Definition uniform_ct_ops.H:152
const UniformCt::DataType & m_data
Definition uniform_ct_ops.H:136
std::string m_nc_filename
NetCDF output filename for this turbine.
Definition uniform_ct_ops.H:141
void prepare_outputs(const std::string &out_dir)
Definition uniform_ct_ops.H:156
ProcessOutputsOp(const UniformCt::DataType &data)
Definition uniform_ct_ops.H:147
std::string m_out_dir
Path to the output directory (specified by Actuator physics class)
Definition uniform_ct_ops.H:138
Definition actuator_ops.H:71
void operator()(UniformCt::DataType &data, const utils::ActParser &pp)
Definition uniform_ct_ops.H:22
Definition actuator_ops.H:19
void operator()(typename UniformCt::DataType &data)
Definition uniform_ct_ops.H:33
Definition actuator_ops.H:43