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

AMR-Wind API: /home/runner/work/amr-wind/amr-wind/amr-wind/wind_energy/actuator/disk/disk_ops.H Source File
AMR-Wind API v0.1.0
CFD solver for wind plant simulations
Loading...
Searching...
No Matches
disk_ops.H
Go to the documentation of this file.
1#ifndef DISK_OPS_H
2#define DISK_OPS_H
3
8#include "AMReX_REAL.H"
9
10using namespace amrex::literals;
11
12namespace amr_wind::actuator {
13namespace disk {
14// refactor these when we add more disk types later
16 const std::string& name,
17 const DiskBaseData& data,
18 const ActInfo& info,
19 const ActGrid& grid);
20
21void write_netcdf(
22 const std::string& name,
23 const DiskBaseData& data,
24 const ActInfo& info,
25 const ActGrid& /*unused*/,
26 amrex::Real time);
27} // namespace disk
28
29namespace ops {
30namespace base {
31
33{
34public:
35 AreaComputer(amrex::Real radius, int num_r, int num_theta);
36
37 [[nodiscard]] amrex::Real area_section(int iRadius) const;
38
39 [[nodiscard]] amrex::Real weight(int iRadius) const;
40
41private:
42 const amrex::Real m_area;
43 const amrex::Real m_geometry_factor;
44};
45
47
49 const utils::ActParser& pp,
50 const std::string& p1,
51 const std::string& p2,
52 std::ostringstream& ss);
54 const utils::ActParser& pp,
55 const std::string& independent,
56 const std::string& dependent,
57 std::ostringstream& ss);
59 const utils::ActParser& pp,
60 const std::string& p1,
61 const std::string& p2,
62 std::ostringstream& ss);
63
64void check_error_stream(const std::ostringstream& error_collector);
65
67
69
70std::ostringstream check_for_parse_conflicts(const utils::ActParser& pp);
71
73
74void final_checks(const DiskBaseData& meta);
75
76amrex::RealBox compute_bounding_box(const DiskBaseData& meta);
77
78template <typename T>
79void allocate_basic_grid_quantities(typename T::DataType& data)
80{
81 auto& grid = data.grid();
82 auto& meta = data.meta();
83 // only resize the members we are going to use
84 grid.pos.resize(meta.num_force_pts);
85 grid.force.resize(meta.num_force_pts);
86 grid.vel.resize(meta.num_vel_pts);
87 grid.vel_pos.resize(meta.num_vel_pts);
88 grid.density.resize(meta.num_vel_pts);
89}
90
91template <typename T>
93{
94 auto& meta = data.meta();
95 auto& info = data.info();
96
98 info.bound_box = compute_bounding_box(meta);
99}
100
102 const DiskBaseData& meta,
103 VecList& points,
104 const vs::Vector& cylAxis,
105 int offset,
106 amrex::Real dOffset);
107
108template <typename T>
109void parse_and_gather_params(const utils::ActParser& pp, T& metaData)
110{
112 required_parameters(metaData, pp);
113 optional_parameters(metaData, pp);
114}
115
116AMREX_INLINE amrex::Real compute_reference_velocity_sqr(DiskBaseData& data)
117{
118 const auto& normal = data.normal_vec;
119 // only use velocity components normal to disk
120 // make sure uInfSqr is always positive by squaring the projection of
121 // reference_velocity onto the normal
122 return (data.reference_velocity & normal) *
123 (data.reference_velocity & normal);
124}
125
126// we use a setter function since we want to cache this variable for netcdf
127// output
128AMREX_INLINE void
129set_thrust_coefficient(DiskBaseData& data, const amrex::Real& uInfSqr)
130{
131 const amrex::Real uInfMag = std::sqrt(uInfSqr);
133 data.table_velocity, data.thrust_coeff, uInfMag);
134}
135
136} // namespace base
137
138template <typename ActTrait>
140 ActTrait,
142 std::enable_if_t<std::is_base_of_v<DiskType, ActTrait>>>
143{
144 void operator()(typename ActTrait::DataType& data)
145 {
146 auto& meta = data.meta();
147 const auto& grid = data.grid();
148 meta.reference_velocity = {0.0_rt, 0.0_rt, 0.0_rt};
149 meta.mean_disk_velocity = {0.0_rt, 0.0_rt, 0.0_rt};
150 meta.density = 0.0_rt;
151 auto& refVel = meta.reference_velocity;
152 auto& diskVel = meta.mean_disk_velocity;
153 auto& density = meta.density;
154 const int np = meta.num_vel_pts / 2;
155 const int num_r = meta.num_vel_pts_r;
156 const int num_t = meta.num_vel_pts_t;
157
158 const base::AreaComputer area(meta.radius(), num_r, num_t);
159
160 for (int i = 0; i < num_r; i++) {
161 const auto weight = area.weight(i);
162 for (int j = 0; j < num_t; ++j) {
163 density += grid.density[j + (i * num_t)] * weight;
164 refVel = refVel + (grid.vel[j + (i * num_t)] * weight);
165 diskVel = diskVel + (grid.vel[j + (i * num_t) + np] * weight);
166 }
167 }
168 }
169};
170
171template <typename ActTrait>
173 ActTrait,
175 std::enable_if_t<std::is_base_of_v<DiskType, ActTrait>>>
176{
177 void operator()(typename ActTrait::DataType& /*data*/) {}
178};
179} // namespace ops
180} // namespace amr_wind::actuator
181
182#endif /* DISK_OPS_H */
Definition actuator_types.H:187
ActTrait::InfoType & info()
Definition actuator_types.H:217
ActTrait::MetaType & meta()
Definition actuator_types.H:229
amrex::Real weight(int iRadius) const
Definition disk_ops.cpp:120
const amrex::Real m_geometry_factor
Definition disk_ops.H:43
AreaComputer(amrex::Real radius, int num_r, int num_theta)
Definition disk_ops.cpp:105
amrex::Real area_section(int iRadius) const
Definition disk_ops.cpp:113
const amrex::Real m_area
Definition disk_ops.H:42
Definition disk_ops.cpp:9
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
Definition disk_ops.cpp:103
void collect_parse_dependencies(const utils::ActParser &pp, const std::string &p1, const std::string &p2, std::ostringstream &ss)
Definition disk_ops.cpp:172
vs::Vector compute_coplanar_vector(const vs::Vector &normal)
Definition disk_ops.cpp:322
void final_checks(const DiskBaseData &meta)
Definition disk_ops.cpp:346
void check_error_stream(const std::ostringstream &error_collector)
Definition disk_ops.cpp:273
amrex::RealBox compute_bounding_box(const DiskBaseData &meta)
Definition disk_ops.cpp:352
void collect_parse_dependencies_one_way(const utils::ActParser &pp, const std::string &independent, const std::string &dependent, std::ostringstream &ss)
Definition disk_ops.cpp:160
void compute_disk_points(const DiskBaseData &meta, VecList &points, const vs::Vector &cylAxis, const int offset, const amrex::Real dOffset)
Definition disk_ops.cpp:373
AMREX_INLINE void set_thrust_coefficient(DiskBaseData &data, const amrex::Real &uInfSqr)
Definition disk_ops.H:129
void optional_parameters(DiskBaseData &meta, const utils::ActParser &pp)
Definition disk_ops.cpp:189
AMREX_INLINE amrex::Real compute_reference_velocity_sqr(DiskBaseData &data)
Definition disk_ops.H:116
void collect_parse_conflicts(const utils::ActParser &pp, const std::string &p1, const std::string &p2, std::ostringstream &ss)
Definition disk_ops.cpp:149
void allocate_basic_grid_quantities(typename T::DataType &data)
Definition disk_ops.H:79
std::ostringstream check_for_parse_conflicts(const utils::ActParser &pp)
Definition disk_ops.cpp:281
void parse_and_gather_params(const utils::ActParser &pp, T &metaData)
Definition disk_ops.H:109
void compute_and_normalize_coplanar_vector(DiskBaseData &meta)
Definition disk_ops.cpp:328
void do_parse_based_computations(ActDataHolder< T > &data)
Definition disk_ops.H:92
void required_parameters(DiskBaseData &meta, const utils::ActParser &pp)
Definition disk_ops.cpp:182
Definition ActSrcLineOp.H:12
::amr_wind::utils::MultiParser ActParser
Definition ActParser.H:8
Definition ActParser.H:6
amrex::Vector< amr_wind::vs::Vector > VecList
Definition actuator_types.H:65
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE std::iterator_traits< C2 >::value_type linear(const C1 xbegin, const C1 xend, const C2 yinp, const typename std::iterator_traits< C1 >::value_type &xout, const int ncomp=1, const int comp=0)
Definition linear_interpolation.H:130
VectorT< amrex::Real > Vector
Definition vector.H:145
Definition actuator_types.H:56
Definition ActuatorDisk.H:13
RealList thrust_coeff
Definition ActuatorDisk.H:31
amrex::Real current_ct
Definition ActuatorDisk.H:29
vs::Vector reference_velocity
Definition ActuatorDisk.H:23
RealList table_velocity
Definition ActuatorDisk.H:32
vs::Vector normal_vec
Definition ActuatorDisk.H:20
Definition actuator_ops.H:43
Definition actuator_ops.H:54