/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(-rr.x() * rr.x() - rr.y() * rr.y() - rr.z() * rr.z());
56 }
57
58 return 0.0_rt;
59}
60
69AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real
70gaussian1d(const amrex::Real& dist, const amrex::Real& eps)
71{
72 const amrex::Real fac = 0.5641895835477563_rt;
73 if (std::abs(dist / eps) >= 16.0_rt) {
74 return 0.0_rt;
75 }
76 return fac / eps * std::exp(-(dist * dist) / (eps * eps));
77}
78
88AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE vs::Vector delta_pnts_cyl(
89 const vs::Vector& origin,
90 const vs::Vector& normal,
91 const vs::Vector& point1,
92 const vs::Vector& point2)
93{
94 const amrex::Real eps = vs::DTraits<amrex::Real>::eps();
95 const auto d1 = point1 - origin;
96 const auto d2 = point2 - origin;
97
98 // cppcheck-suppress duplicateExpression
99 const amrex::Real norm_dist1 = (d1 & normal) / (normal & normal);
100 // cppcheck-suppress duplicateExpression
101 const amrex::Real norm_dist2 = (d2 & normal) / (normal & normal);
102
103 const auto proj1 = normal * norm_dist1;
104 const auto proj2 = normal * norm_dist2;
105
106 // compute vector on disk via vector rejection
107 const auto v1 = d1 - proj1;
108 const auto v2 = d2 - proj2;
109
110 // can do magnitude since we've removed the normal component
111 const amrex::Real r1 = vs::mag(v1);
112 const amrex::Real r2 = vs::mag(v2);
113
114 const amrex::Real theta =
115 std::acos(amrex::min<amrex::Real>((v1 & v2) / (r1 * r2 + eps), 1.0_rt));
116
117 return {std::abs(r1 - r2), theta, norm_dist1 - norm_dist2};
118}
119
127AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real
128linear_basis_1d(const amrex::Real distance, const amrex::Real dX)
129{
130 return amrex::max<amrex::Real>(0.0_rt, 1.0_rt - distance / dX) / dX;
131}
132
133AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE vs::Vector compute_tangential_vector(
134 const vs::Vector& center, const vs::Vector& normal, const vs::Vector& point)
135{
136 const auto blade_axis = (point - center).normalize();
137 return vs::quaternion(normal, 90.0_rt) & blade_axis;
138}
139
140} // namespace utils
141} // namespace amr_wind::actuator
142
143#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:88
std::set< int > determine_influenced_procs(const amrex::AmrCore &mesh, const amrex::RealBox &rbx)
Definition actuator_utils.cpp:6
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real gaussian1d(const amrex::Real &dist, const amrex::Real &eps)
Definition actuator_utils.H:70
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:34
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:133
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real linear_basis_1d(const amrex::Real distance, const amrex::Real dX)
Definition actuator_utils.H:128
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:148
Definition actuator_types.H:147
Definition vstraits.H:10
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE T & z() &noexcept
Definition vector.H:99
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE T & x() &noexcept
Definition vector.H:97
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE T & y() &noexcept
Definition vector.H:98