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

AMR-Wind API: /home/runner/work/amr-wind/amr-wind/amr-wind/wind_energy/actuator/actuator_utils.H Source File
AMR-Wind API v0.1.0
CFD solver for wind plant simulations
Loading...
Searching...
No Matches
actuator_utils.H
Go to the documentation of this file.
1#ifndef ACUTATOR_UTILS_H
2#define ACUTATOR_UTILS_H
3
4#include <set>
5#include <cmath>
8#include "AMReX_AmrCore.H"
9#include "AMReX_REAL.H"
10
11using namespace amrex::literals;
12
13namespace amr_wind::actuator {
14
15struct ActInfo;
16
17namespace utils {
18
29std::set<int> determine_influenced_procs(
30 const amrex::AmrCore& mesh, const amrex::RealBox& rbx);
31
33 ActInfo& /*info*/, amrex::Vector<int>& /*act_proc_count*/);
34
44AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real
45gaussian3d(const vs::Vector& dist, const vs::Vector& eps)
46{
47 const vs::Vector rr{
48 dist.x() / eps.x(), dist.y() / eps.y(), dist.z() / eps.z()};
49 const amrex::Real rr_sqr = vs::mag_sqr(rr);
50
51 if (rr_sqr < 16.0_rt) {
52 constexpr amrex::Real fac = 0.17958712212516656_rt;
53 const amrex::Real eps_fac = eps.x() * eps.y() * eps.z();
54 return (fac / eps_fac) *
55 std::exp(
56 (-rr.x() * rr.x()) - (rr.y() * rr.y()) - (rr.z() * rr.z()));
57 }
58
59 return 0.0_rt;
60}
61
70AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real
71gaussian1d(const amrex::Real& dist, const amrex::Real& eps)
72{
73 const amrex::Real fac = std::numbers::inv_sqrtpi_v<amrex::Real>;
74 if (std::abs(dist / eps) >= 16.0_rt) {
75 return 0.0_rt;
76 }
77 return fac / eps * std::exp(-(dist * dist) / (eps * eps));
78}
79
89AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE vs::Vector delta_pnts_cyl(
90 const vs::Vector& origin,
91 const vs::Vector& normal,
92 const vs::Vector& point1,
93 const vs::Vector& point2)
94{
95 const amrex::Real eps = vs::DTraits<amrex::Real>::eps();
96 const auto d1 = point1 - origin;
97 const auto d2 = point2 - origin;
98
99 // cppcheck-suppress duplicateExpression
100 const amrex::Real norm_dist1 = (d1 & normal) / (normal & normal);
101 // cppcheck-suppress duplicateExpression
102 const amrex::Real norm_dist2 = (d2 & normal) / (normal & normal);
103
104 const auto proj1 = normal * norm_dist1;
105 const auto proj2 = normal * norm_dist2;
106
107 // compute vector on disk via vector rejection
108 const auto v1 = d1 - proj1;
109 const auto v2 = d2 - proj2;
110
111 // can do magnitude since we've removed the normal component
112 const amrex::Real r1 = vs::mag(v1);
113 const amrex::Real r2 = vs::mag(v2);
114
115 const amrex::Real theta =
116 std::acos(amrex::min<amrex::Real>((v1 & v2) / (r1 * r2 + eps), 1.0_rt));
117
118 return {std::abs(r1 - r2), theta, norm_dist1 - norm_dist2};
119}
120
128AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real
129linear_basis_1d(const amrex::Real distance, const amrex::Real dX)
130{
131 return amrex::max<amrex::Real>(0.0_rt, 1.0_rt - (distance / dX)) / dX;
132}
133
134AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE vs::Vector compute_tangential_vector(
135 const vs::Vector& center, const vs::Vector& normal, const vs::Vector& point)
136{
137 const auto blade_axis = (point - center).normalize();
138 return vs::quaternion(normal, 90.0_rt) & blade_axis;
139}
140
141} // namespace utils
142} // namespace amr_wind::actuator
143
144#endif /* ACUTATOR_UTILS_H */
Definition ActParser.H:6
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE vs::Vector delta_pnts_cyl(const vs::Vector &origin, const vs::Vector &normal, const vs::Vector &point1, const vs::Vector &point2)
Definition actuator_utils.H:89
std::set< int > determine_influenced_procs(const amrex::AmrCore &mesh, const amrex::RealBox &rbx)
Definition actuator_utils.cpp:8
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real gaussian1d(const amrex::Real &dist, const amrex::Real &eps)
Definition actuator_utils.H:71
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real gaussian3d(const vs::Vector &dist, const vs::Vector &eps)
Definition actuator_utils.H:45
void determine_root_proc(ActInfo &info, amrex::Vector< int > &act_proc_count)
Definition actuator_utils.cpp:36
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE vs::Vector compute_tangential_vector(const vs::Vector &center, const vs::Vector &normal, const vs::Vector &point)
Definition actuator_utils.H:134
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real linear_basis_1d(const amrex::Real distance, const amrex::Real dX)
Definition actuator_utils.H:129
Definition ActParser.H:6
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Tensor quaternion(const Vector &axis, const amrex::Real angle)
Definition tensorI.H:218
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE T mag(const TensorT< T > &t)
Definition tensorI.H:182
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE T mag_sqr(const TensorT< T > &t)
Definition tensorI.H:175
VectorT< amrex::Real > Vector
Definition vector.H:145
Definition actuator_types.H:147
Definition vstraits.H:10
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE T & y() &
Definition vector.H:98
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE T & z() &
Definition vector.H:99
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE T & x() &
Definition vector.H:97