/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 const amrex::Real time);
27} // namespace disk
28
29namespace ops {
30namespace base {
31
33{
34public:
36 const amrex::Real radius, const int num_r, const int num_theta);
37
38 amrex::Real area_section(const int iRadius) const;
39
40 amrex::Real weight(const int iRadius) const;
41
42private:
43 const amrex::Real m_area;
44 const amrex::Real m_geometry_factor;
45};
46
48
50 const utils::ActParser& pp,
51 const std::string& p1,
52 const std::string& p2,
53 std::ostringstream& ss);
55 const utils::ActParser& pp,
56 const std::string& independent,
57 const std::string& dependent,
58 std::ostringstream& ss);
60 const utils::ActParser& pp,
61 const std::string& p1,
62 const std::string& p2,
63 std::ostringstream& ss);
64
65void check_error_stream(const std::ostringstream& error_collector);
66
68
70
71std::ostringstream check_for_parse_conflicts(const utils::ActParser& pp);
72
74
75void final_checks(const DiskBaseData& meta);
76
77amrex::RealBox compute_bounding_box(const DiskBaseData& meta);
78
79template <typename T>
80void allocate_basic_grid_quantities(typename T::DataType& data)
81{
82 auto& grid = data.grid();
83 auto& meta = data.meta();
84 // only resize the members we are going to use
85 grid.pos.resize(meta.num_force_pts);
86 grid.force.resize(meta.num_force_pts);
87 grid.vel.resize(meta.num_vel_pts);
88 grid.vel_pos.resize(meta.num_vel_pts);
89 grid.density.resize(meta.num_vel_pts);
90}
91
92template <typename T>
94{
95 auto& meta = data.meta();
96 auto& info = data.info();
97
99 info.bound_box = compute_bounding_box(meta);
100}
101
103 const DiskBaseData& meta,
104 VecList& points,
105 const vs::Vector& cylAxis,
106 const int offset,
107 const amrex::Real dOffset);
108
109template <typename T>
110void parse_and_gather_params(const utils::ActParser& pp, T& metaData)
111{
113 required_parameters(metaData, pp);
114 optional_parameters(metaData, pp);
115}
116
118{
119 const auto& normal = data.normal_vec;
120 // only use velocity components normal to disk
121 // make sure uInfSqr is always positive by squaring the projection of
122 // reference_velocity onto the normal
123 return (data.reference_velocity & normal) *
124 (data.reference_velocity & normal);
125}
126
127// we use a setter function since we want to cache this variable for netcdf
128// output
129inline void
130set_thrust_coefficient(DiskBaseData& data, const amrex::Real& uInfSqr)
131{
132 const amrex::Real uInfMag = std::sqrt(uInfSqr);
134 data.table_velocity, data.thrust_coeff, uInfMag);
135}
136
137} // namespace base
138
139template <typename ActTrait>
141 ActTrait,
143 std::enable_if_t<std::is_base_of_v<DiskType, ActTrait>>>
144{
145 void operator()(typename ActTrait::DataType& data)
146 {
147 auto& meta = data.meta();
148 const auto& grid = data.grid();
149 meta.reference_velocity = {0.0_rt, 0.0_rt, 0.0_rt};
150 meta.mean_disk_velocity = {0.0_rt, 0.0_rt, 0.0_rt};
151 meta.density = 0.0_rt;
152 auto& refVel = meta.reference_velocity;
153 auto& diskVel = meta.mean_disk_velocity;
154 auto& density = meta.density;
155 const int np = meta.num_vel_pts / 2;
156 const int num_r = meta.num_vel_pts_r;
157 const int num_t = meta.num_vel_pts_t;
158
159 const base::AreaComputer area(meta.radius(), num_r, num_t);
160
161 for (int i = 0; i < num_r; i++) {
162 const auto weight = area.weight(i);
163 for (int j = 0; j < num_t; ++j) {
164 density += grid.density[j + i * num_t] * weight;
165 refVel = refVel + grid.vel[j + i * num_t] * weight;
166 diskVel = diskVel + grid.vel[j + i * num_t + np] * weight;
167 }
168 }
169 }
170};
171
172template <typename ActTrait>
174 ActTrait,
176 std::enable_if_t<std::is_base_of_v<DiskType, ActTrait>>>
177{
178 void operator()(typename ActTrait::DataType& /*data*/) {}
179};
180} // namespace ops
181} // namespace amr_wind::actuator
182
183#endif /* DISK_OPS_H_ */
Definition actuator_types.H:187
ActTrait::InfoType & info()
Definition actuator_types.H:217
ActTrait::MetaType & meta()
Definition actuator_types.H:223
const amrex::Real m_geometry_factor
Definition disk_ops.H:44
amrex::Real weight(const int iRadius) const
Definition disk_ops.cpp:120
amrex::Real area_section(const int iRadius) const
Definition disk_ops.cpp:113
AreaComputer(const amrex::Real radius, const int num_r, const int num_theta)
Definition disk_ops.cpp:105
const amrex::Real m_area
Definition disk_ops.H:43
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 set_thrust_coefficient(DiskBaseData &data, const amrex::Real &uInfSqr)
Definition disk_ops.H:130
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
void optional_parameters(DiskBaseData &meta, const utils::ActParser &pp)
Definition disk_ops.cpp:189
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:80
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:110
void compute_and_normalize_coplanar_vector(DiskBaseData &meta)
Definition disk_ops.cpp:328
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
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:129
VectorT< amrex::Real > Vector
Definition vector.H:148
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