/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
8#include "AMReX_REAL.H"
9
10using namespace amrex::literals;
12namespace uniformct {
13
14void parse_and_gather_params(const utils::ActParser& pp, UniformCtData& data);
16} // namespace uniformct
17
18template <>
28
29template <>
31{
32 void operator()(typename UniformCt::DataType& data)
33 {
34 if (!data.sim().helics().is_activated()) {
35 return;
36 }
37
38#ifdef AMR_WIND_USE_HELICS
39
40 const amrex::Real wind_direction =
41 -data.sim().helics().m_turbine_yaw_to_amrwind[data.info().id] +
42 90.0_rt;
43 const amrex::Real wind_direction_radian =
44 amr_wind::utils::radians(wind_direction);
45
46 auto& meta = data.meta();
47
48 meta.normal_vec[0] = std::cos(wind_direction_radian);
49 meta.normal_vec[1] = std::sin(wind_direction_radian);
50 meta.normal_vec[2] = 0.0_rt;
51
52 meta.sample_vec[0] = meta.normal_vec[0];
53 meta.sample_vec[1] = meta.normal_vec[1];
54 meta.sample_vec[2] = meta.normal_vec[2];
55
56 if (data.info().is_root_proc) {
57 std::cout << "turbine " << data.info().id
58 << " normal: " << meta.normal_vec[0] << ' '
59 << meta.normal_vec[1] << std::endl;
60 }
61
63#endif
64 }
65};
66// compute the total force over a given radial section
67// this will then be spread uniformly over that area in the
68// projection step
69template <>
71{
73 {
74 auto& grid = data.grid();
75 auto& ddata = data.meta();
76 const auto& normal = ddata.normal_vec;
77 const amrex::Real uInfSqr = base::compute_reference_velocity_sqr(ddata);
78 base::set_thrust_coefficient(ddata, uInfSqr);
79
80 const int npts = ddata.num_force_pts;
81 const amrex::Real rho = ddata.density;
82 const amrex::Real aeroPressure =
83 0.5_rt * uInfSqr * rho * ddata.current_ct;
84 const amrex::Real dr = ddata.dr;
85
86 for (int ip = 0; ip < npts; ++ip) {
87 const amrex::Real r = (ip + 0.5_rt) * dr;
88 const amrex::Real rp = r + dr * 0.5_rt;
89 const amrex::Real rm = r - dr * 0.5_rt;
90 const amrex::Real a = ::amr_wind::utils::pi() * (rp * rp - rm * rm);
91 // disk force should always point in direction of the normal
92 grid.force[ip] = (aeroPressure * a) * normal;
93 }
94#ifdef AMR_WIND_USE_HELICS
95
96 if (data.info().is_root_proc && data.sim().helics().is_activated()) {
97
98 const amrex::Real ct = ddata.current_ct;
99 std::cout << "turbine" << data.info().id << " thrust: " << ct
100 << std::endl;
101 const amrex::Real cp = 0.5_rt * (ct + ct * std::sqrt(1.0_rt - ct));
102 const amrex::Real area = amr_wind::utils::pi() * 0.25_rt *
103 ddata.diameter * ddata.diameter;
104 const amrex::Real power =
105 cp * 0.5_rt * rho * std::pow(uInfSqr, 1.5_rt) * area;
106
108 power;
109 const amrex::Real turbine_angle = std::atan2(
110 ddata.reference_velocity[1], ddata.reference_velocity[0]);
111 data.sim()
112 .helics()
114 -amr_wind::utils::degrees(turbine_angle) + 270.0_rt;
115 }
116#endif
117 }
118};
119
120template <>
129template <>
131{
132private:
133 // cppcheck-suppress uninitMemberVarPrivate
136 std::string m_out_dir;
137
139 std::string m_nc_filename;
140
142 int m_out_freq{10};
143
144public:
146 const UniformCt::DataType& data)
147 : m_data(data)
148 {}
149 void operator()(UniformCt::DataType& /*unused*/) {}
151 {
152 pp.query("output_frequency", m_out_freq);
153 }
154 void prepare_outputs(const std::string& out_dir)
155 {
156 m_nc_filename = out_dir + "/" + m_data.info().label + ".nc";
158 m_nc_filename, m_data.meta(), m_data.info(), m_data.grid());
159 }
161 {
162 const auto& time = m_data.sim().time();
163 const int tidx = time.time_index();
164 if (tidx % m_out_freq != 0) {
165 return;
166 }
167
169 m_nc_filename, m_data.meta(), m_data.info(), m_data.grid(),
170 time.new_time());
171 }
172};
173} // namespace amr_wind::actuator::ops
174
175#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:220
ActTrait::InfoType & info()
Definition actuator_types.H:217
ActTrait::MetaType & meta()
Definition actuator_types.H:223
void query(const std::string &name, vs::Vector &value) const
Definition MultiParser.H:56
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
void set_thrust_coefficient(DiskBaseData &data, const amrex::Real &uInfSqr)
Definition disk_ops.H:130
void allocate_basic_grid_quantities(typename T::DataType &data)
Definition disk_ops.H:80
amrex::Real compute_reference_velocity_sqr(DiskBaseData &data)
Definition disk_ops.H:117
void do_parse_based_computations(ActDataHolder< T > &data)
Definition disk_ops.H:93
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:44
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE constexpr amrex::Real pi()
Return as an amrex::Real.
Definition trig_ops.H:18
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real radians(const amrex::Real deg_val)
Convert from degrees to radians.
Definition trig_ops.H:37
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:72
Definition actuator_ops.H:61
void operator()(typename UniformCt::DataType &data)
Definition uniform_ct_ops.H:123
Definition actuator_ops.H:32
int m_out_freq
Output frequency (specified in input file)
Definition uniform_ct_ops.H:142
void operator()(UniformCt::DataType &)
Definition uniform_ct_ops.H:149
void read_io_options(const utils::ActParser &pp)
Definition uniform_ct_ops.H:150
const UniformCt::DataType & m_data
Definition uniform_ct_ops.H:134
std::string m_nc_filename
NetCDF output filename for this turbine.
Definition uniform_ct_ops.H:139
void prepare_outputs(const std::string &out_dir)
Definition uniform_ct_ops.H:154
ProcessOutputsOp(const UniformCt::DataType &data)
Definition uniform_ct_ops.H:145
std::string m_out_dir
Path to the output directory (specified by Actuator physics class)
Definition uniform_ct_ops.H:136
Definition actuator_ops.H:71
void operator()(UniformCt::DataType &data, const utils::ActParser &pp)
Definition uniform_ct_ops.H:21
Definition actuator_ops.H:19
void operator()(typename UniformCt::DataType &data)
Definition uniform_ct_ops.H:32
Definition actuator_ops.H:43