Vulcan
Aerospace Engineering Utilities Built on Janus
Loading...
Searching...
No Matches
Aerodynamics.hpp
Go to the documentation of this file.
1// Vulcan Aerodynamics Module
2// Core aerodynamic utility functions for trajectory optimization
3#pragma once
4
6
7#include <janus/math/Linalg.hpp>
8#include <janus/math/Logic.hpp>
9#include <janus/math/Trig.hpp>
10
11namespace vulcan::aero {
12
13// =============================================================================
14// Fundamental Aerodynamic Quantities
15// =============================================================================
16
27template <typename Scalar>
28Scalar dynamic_pressure(const Scalar &density, const Scalar &velocity) {
29 return Scalar(0.5) * density * velocity * velocity;
30}
31
42template <typename Scalar>
43Scalar mach_number(const Scalar &velocity, const Scalar &speed_of_sound) {
44 return velocity / speed_of_sound;
45}
46
59template <typename Scalar>
60Scalar reynolds_number(const Scalar &density, const Scalar &velocity,
61 const Scalar &length, const Scalar &viscosity) {
62 return density * velocity * length / viscosity;
63}
64
75template <typename Scalar>
76Scalar airspeed(const Vec3<Scalar> &velocity_ground,
77 const Vec3<Scalar> &velocity_wind) {
78 Vec3<Scalar> v_air = velocity_ground - velocity_wind;
79 return janus::norm(v_air);
80}
81
89template <typename Scalar> Scalar airspeed(const Vec3<Scalar> &velocity) {
90 return janus::norm(velocity);
91}
92
93// =============================================================================
94// Aerodynamic Angles
95// =============================================================================
96
112template <typename Scalar>
113Vec2<Scalar> aero_angles(const Vec3<Scalar> &velocity_body) {
114 Scalar vx = velocity_body(0); // Forward component
115 Scalar vy = velocity_body(1); // Right component
116 Scalar vz = velocity_body(2); // Down component
117
118 // Total speed
119 Scalar v_total = janus::norm(velocity_body);
120 Scalar eps = Scalar(1e-10);
121 Scalar is_zero = v_total < eps;
122
123 // Angle of attack: alpha = atan2(vz, vx)
124 // Positive when flow comes from below (nose up relative to velocity)
125 Scalar alpha = janus::atan2(vz, vx);
126 alpha = janus::where(is_zero, Scalar(0), alpha);
127
128 // Sideslip angle: beta = asin(vy / v_total)
129 // Positive when flow comes from right
130 Scalar beta = janus::asin(vy / v_total);
131 beta = janus::where(is_zero, Scalar(0), beta);
132
133 Vec2<Scalar> angles;
134 angles << alpha, beta;
135 return angles;
136}
137
138// =============================================================================
139// Combined Aerodynamic State
140// =============================================================================
141
150template <typename Scalar> struct AeroState {
152 Scalar mach;
153 Scalar reynolds;
154 Scalar airspeed;
155 Scalar alpha;
156 Scalar beta;
157};
158
170template <typename Scalar>
172aero_state(const Scalar &density, const Scalar &speed_of_sound,
173 const Scalar &viscosity, const Vec3<Scalar> &velocity_body,
174 const Scalar &char_length) {
175 Scalar V = airspeed(velocity_body);
176 Vec2<Scalar> angles = aero_angles(velocity_body);
177
178 return AeroState<Scalar>{
179 .dynamic_pressure = dynamic_pressure(density, V),
180 .mach = mach_number(V, speed_of_sound),
181 .reynolds = reynolds_number(density, V, char_length, viscosity),
182 .airspeed = V,
183 .alpha = angles(0),
184 .beta = angles(1)};
185}
186
187} // namespace vulcan::aero
Definition Aerodynamics.hpp:11
Scalar airspeed(const Vec3< Scalar > &velocity_ground, const Vec3< Scalar > &velocity_wind)
Compute airspeed from ground velocity and wind.
Definition Aerodynamics.hpp:76
Scalar mach_number(const Scalar &velocity, const Scalar &speed_of_sound)
Mach number.
Definition Aerodynamics.hpp:43
AeroState< Scalar > aero_state(const Scalar &density, const Scalar &speed_of_sound, const Scalar &viscosity, const Vec3< Scalar > &velocity_body, const Scalar &char_length)
Compute complete aerodynamic state.
Definition Aerodynamics.hpp:172
Vec2< Scalar > aero_angles(const Vec3< Scalar > &velocity_body)
Compute aerodynamic angles from velocity in body frame.
Definition Aerodynamics.hpp:113
Scalar dynamic_pressure(const Scalar &density, const Scalar &velocity)
Dynamic pressure.
Definition Aerodynamics.hpp:28
Scalar reynolds_number(const Scalar &density, const Scalar &velocity, const Scalar &length, const Scalar &viscosity)
Reynolds number.
Definition Aerodynamics.hpp:60
Complete aerodynamic state at a flight condition.
Definition Aerodynamics.hpp:150
Scalar airspeed
Airspeed magnitude [m/s].
Definition Aerodynamics.hpp:154
Scalar beta
Sideslip angle [rad].
Definition Aerodynamics.hpp:156
Scalar reynolds
Reynolds number [-].
Definition Aerodynamics.hpp:153
Scalar dynamic_pressure
Dynamic pressure [Pa].
Definition Aerodynamics.hpp:151
Scalar mach
Mach number [-].
Definition Aerodynamics.hpp:152
Scalar alpha
Angle of attack [rad].
Definition Aerodynamics.hpp:155