WSF
WsfRigidBodySixDOF_AeroCoreObject.hpp
Go to the documentation of this file.
1// ****************************************************************************
2// CUI
3//
4// The Advanced Framework for Simulation, Integration, and Modeling (AFSIM)
5//
6// Copyright 2020 Infoscitex, a DCS Company. All rights reserved.
7//
8// The use, dissemination or disclosure of data in this file is subject to
9// limitation or restriction. See accompanying README and LICENSE for details.
10// ****************************************************************************
11
12#ifndef WSFRIGIDBODYSIXDOFAEROCOREOBJECT_HPP
13#define WSFRIGIDBODYSIXDOFAEROCOREOBJECT_HPP
14
16
17// The RigidBodyAeroCoreObject provides the main aerodynamics for an object.
18// It includes various aero parameters and stability derivatives. It may
19// include one or more aero modes, which provide configuration-dependent aero.
20// Modes also provide a means to remove any aero effects, such as while a subobject
21// is internally carried. A different mode can then be used when 'free'.
22
23namespace wsf
24{
25namespace six_dof
26{
27class WSF_SIX_DOF_EXPORT RigidBodyAeroCoreObject : public AeroCoreObject
28{
29public:
32
34
36
37 // ProcessInput reads initialization data
38 bool ProcessInput(UtInput& aInput);
39
40 bool Initialize() override;
41
42 // SetModeName is used to change the aero mode
43 void SetModeName(const std::string& aName);
44 std::string GetModeName() const;
45
46 const std::list<UtCloneablePtr<RigidBodyAeroCoreObject>>* GetSubModesList() const;
47 RigidBodyAeroCoreObject* GetSubModeByName(const std::string& aName) const;
48
49 // The CalculateAeroFM function calculates the lift, drag, and
50 // side force magnitudes and the moment vector.
51 void CalculateCoreAeroFM(double aDynPress_lbsqft,
52 double aMach,
53 double aSpeed_fps,
54 double aAlpha_rad,
55 double aBeta_rad,
56 double aAlphaDot_rps,
57 double aBetaDot_rps,
58 const UtVec3dX& aAngularRates_rps,
59 UtVec3dX& aMoment_ftlbs,
60 double& aLift_lbs,
61 double& aDrag_lbs,
62 double& aSideForce_lbs,
63 double aRadiusSizeFactor = 1.0);
64
65 // The CalculateAeroFM function calculates the lift
66 double CalculateLiftAtSpecifiedAlpha_lbs(double aDynPress_lbsqft,
67 double aMach,
68 double aAlpha_deg,
69 double aRadiusSizeFactor = 1.0);
70
71 // This calculates the lift coefficient (CL), drag coefficient (Cd) and
72 // pitching moment coefficient (Cm) including reference area effects but not
73 // including dynamic pressure effects.
74 void CalculateAeroCoefficientVectors(double aMach,
75 double aAlpha_rad,
76 double& aCLArea,
77 double& aCdArea,
78 double& aCmArea,
79 double aRadiusSizeFactor = 1.0);
80
81 UtVec3dX GetAeroCenter_ft() const;
82
83 double GetWingChord_ft() const;
84 double GetWingSpan_ft() const;
85 double GetWingArea_sqft() const;
86
87 // Lift
88 double CLq_AlphaMach(double aMach, double aAlpha_rad);
89 double CL_AlphaDotAlphaMach(double aMach, double aAlpha_rad);
90
91 // Drag
92
93 // Side force
94 double CYr_BetaMach(double aMach, double aBeta_rad);
95 double CY_BetaDotBetaMach(double aMach, double aBeta_rad);
96
97 // Pitching moments
98 double Cm_AlphaBetaMach(double aMach, double aAlpha_rad, double aBeta_rad);
99 double Cmq_Mach(double aMach);
100 double Cmp_Mach(double aMach);
101 double CmAlphaDotMach(double aMach);
102
103 // Yawing moments
104 double Cn_AlphaBetaMach(double aMach, double aAlpha_rad, double aBeta_rad);
105 double CnBetaDotMach(double aMach);
106 double Cnr_Mach(double aMach);
107 double Cnp_Mach(double aMach);
108
109 // Rolling moments
110 double Cl_AlphaBetaMach(double aMach, double aAlpha_rad, double aBeta_rad);
111 double Clp_Mach(double aMach);
112 double Cl_AlphaDotMach(double aMach);
113 double Cl_BetaDotMach(double aMach);
114 double Clr_Mach(double aMach);
115 double Clq_Mach(double aMach);
116
117 // The CalculateAeroCmArea function is called to calculate the pitching moment (Cm)
118 // including reference area effects but not including dynamic pressure effects.
119 double CalculateAeroCmArea(double aMach, double aAlpha_rad);
120
121 // The CalculateAeroCLArea function is called to calculate the lift coefficient (CL)
122 // including reference area effects but not including dynamic pressure effects.
123 double CalculateAeroCLArea(double aMach, double aAlpha_rad);
124
125 // The CalculateAeroCdArea function is called to calculate the drag coefficient (Cd)
126 // including reference area effects but not including dynamic pressure effects.
127 double CalculateAeroCdArea(double aMach, double aAlpha_rad);
128
129 // This returns true if ref area is used instead of wing area, wing span, and wing chord
130 bool UsesRefArea() const { return mUseRefArea; }
131
132protected:
133 static bool ProcessCommonInput(UtInput& aInput, const std::string& aCommand, RigidBodyAeroCoreObject* aObject);
134
136
137 std::list<UtCloneablePtr<RigidBodyAeroCoreObject>> mSubModesList;
138
139 double mWingChord_ft = 0.0;
140 double mWingSpan_ft = 0.0;
141 double mWingArea_sqft = 0.0;
142 double mRefLength_ft = 0.0;
143
144 // When mUseRefArea is true, mRefArea_sqft is used instead of mWingArea_sqft, mWingSpan_ft, and mWingChord_ft
145 bool mUseRefArea = false;
146
148
149 // This "reduced frequency" flag allows the use of reduced frequency rather than angular rates to compute aerodynamic derivatives
151
152 // Lift
153 UtCloneablePtr<UtTable::Table> mCLq_AlphaMachTablePtr{nullptr};
154 UtCloneablePtr<UtTable::Table> mCL_AlphaDotAlphaMachTablePtr{nullptr};
155
156 // Drag
157
158 // Side force
159 UtCloneablePtr<UtTable::Table> mCYr_BetaMachTablePtr{nullptr};
160 UtCloneablePtr<UtTable::Table> mCY_BetaDotBetaMachTablePtr{nullptr};
161
162 // Pitching moments
163 UtCloneablePtr<UtTable::Table> mCm_AlphaBetaMachTablePtr{nullptr};
164 UtCloneablePtr<UtTable::Curve> mCmq_MachCurvePtr{nullptr};
165 UtCloneablePtr<UtTable::Curve> mCmp_MachCurvePtr{nullptr};
166 UtCloneablePtr<UtTable::Curve> mCm_AlphaDotMachCurvePtr{nullptr};
167
168 // Yawing moments
169 UtCloneablePtr<UtTable::Table> mCn_AlphaBetaMachTablePtr{nullptr};
170 UtCloneablePtr<UtTable::Curve> mCn_BetaDotMachCurvePtr{nullptr};
171 UtCloneablePtr<UtTable::Curve> mCnr_MachCurvePtr{nullptr};
172 UtCloneablePtr<UtTable::Curve> mCnp_MachCurvePtr{nullptr};
173
174 // Rolling moments
175 UtCloneablePtr<UtTable::Table> mCl_AlphaBetaMachTablePtr{nullptr};
176 UtCloneablePtr<UtTable::Curve> mClp_MachCurvePtr{nullptr};
177 UtCloneablePtr<UtTable::Curve> mCl_AlphaDotMachCurvePtr{nullptr};
178 UtCloneablePtr<UtTable::Curve> mCl_BetaDotMachCurvePtr{nullptr};
179 UtCloneablePtr<UtTable::Curve> mClr_MachCurvePtr{nullptr};
180 UtCloneablePtr<UtTable::Curve> mClq_MachCurvePtr{nullptr};
181};
182} // namespace six_dof
183} // namespace wsf
184
185#endif
Definition WsfRigidBodySixDOF_AeroCoreObject.hpp:28
RigidBodyAeroCoreObject & operator=(const RigidBodyAeroCoreObject &other)=delete
UtCloneablePtr< UtTable::Curve > mCl_BetaDotMachCurvePtr
Definition WsfRigidBodySixDOF_AeroCoreObject.hpp:178
double Clp_Mach(double aMach)
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:623
std::string GetModeName() const
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:439
double GetWingSpan_ft() const
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:737
double CnBetaDotMach(double aMach)
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:579
double CalculateAeroCmArea(double aMach, double aAlpha_rad)
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:673
double CalculateLiftAtSpecifiedAlpha_lbs(double aDynPress_lbsqft, double aMach, double aAlpha_deg, double aRadiusSizeFactor=1.0)
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:982
double Cl_AlphaBetaMach(double aMach, double aAlpha_rad, double aBeta_rad)
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:609
double GetWingArea_sqft() const
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:742
UtCloneablePtr< UtTable::Table > mCl_AlphaBetaMachTablePtr
Definition WsfRigidBodySixDOF_AeroCoreObject.hpp:175
UtCloneablePtr< UtTable::Curve > mClp_MachCurvePtr
Definition WsfRigidBodySixDOF_AeroCoreObject.hpp:176
double CL_AlphaDotAlphaMach(double aMach, double aAlpha_rad)
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:482
void CalculateCoreAeroFM(double aDynPress_lbsqft, double aMach, double aSpeed_fps, double aAlpha_rad, double aBeta_rad, double aAlphaDot_rps, double aBetaDot_rps, const UtVec3dX &aAngularRates_rps, UtVec3dX &aMoment_ftlbs, double &aLift_lbs, double &aDrag_lbs, double &aSideForce_lbs, double aRadiusSizeFactor=1.0)
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:747
RigidBodyAeroCoreObject * GetSubModeByName(const std::string &aName) const
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:455
UtCloneablePtr< UtTable::Curve > mCn_BetaDotMachCurvePtr
Definition WsfRigidBodySixDOF_AeroCoreObject.hpp:170
double mRefLength_ft
Definition WsfRigidBodySixDOF_AeroCoreObject.hpp:142
double CalculateAeroCLArea(double aMach, double aAlpha_rad)
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:691
double Cl_BetaDotMach(double aMach)
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:643
double CalculateAeroCdArea(double aMach, double aAlpha_rad)
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:709
bool UsesRefArea() const
Definition WsfRigidBodySixDOF_AeroCoreObject.hpp:130
UtCloneablePtr< UtTable::Curve > mCnr_MachCurvePtr
Definition WsfRigidBodySixDOF_AeroCoreObject.hpp:171
double Cmp_Mach(double aMach)
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:545
UtCloneablePtr< UtTable::Curve > mCmp_MachCurvePtr
Definition WsfRigidBodySixDOF_AeroCoreObject.hpp:165
double CmAlphaDotMach(double aMach)
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:555
RigidBodyAeroCoreObject * Clone() const
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:22
double Clr_Mach(double aMach)
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:653
UtCloneablePtr< UtTable::Table > mCm_AlphaBetaMachTablePtr
Definition WsfRigidBodySixDOF_AeroCoreObject.hpp:163
double mWingArea_sqft
Definition WsfRigidBodySixDOF_AeroCoreObject.hpp:141
UtCloneablePtr< UtTable::Curve > mClr_MachCurvePtr
Definition WsfRigidBodySixDOF_AeroCoreObject.hpp:179
UtCloneablePtr< UtTable::Curve > mCnp_MachCurvePtr
Definition WsfRigidBodySixDOF_AeroCoreObject.hpp:172
RigidBodyAeroCoreObject(const RigidBodyAeroCoreObject &aSrc)=default
double Cl_AlphaDotMach(double aMach)
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:633
UtCloneablePtr< UtTable::Curve > mClq_MachCurvePtr
Definition WsfRigidBodySixDOF_AeroCoreObject.hpp:180
double CLq_AlphaMach(double aMach, double aAlpha_rad)
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:469
UtVec3dX mAeroCenter_ft
Definition WsfRigidBodySixDOF_AeroCoreObject.hpp:147
std::list< UtCloneablePtr< RigidBodyAeroCoreObject > > mSubModesList
Definition WsfRigidBodySixDOF_AeroCoreObject.hpp:137
bool Initialize() override
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:434
double Clq_Mach(double aMach)
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:663
UtCloneablePtr< UtTable::Curve > mCmq_MachCurvePtr
Definition WsfRigidBodySixDOF_AeroCoreObject.hpp:164
double CYr_BetaMach(double aMach, double aBeta_rad)
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:495
UtCloneablePtr< UtTable::Table > mCYr_BetaMachTablePtr
Definition WsfRigidBodySixDOF_AeroCoreObject.hpp:159
double mWingChord_ft
Definition WsfRigidBodySixDOF_AeroCoreObject.hpp:139
UtCloneablePtr< UtTable::Table > mCL_AlphaDotAlphaMachTablePtr
Definition WsfRigidBodySixDOF_AeroCoreObject.hpp:154
UtCloneablePtr< UtTable::Table > mCLq_AlphaMachTablePtr
Definition WsfRigidBodySixDOF_AeroCoreObject.hpp:153
bool mUseReducedFrequency
Definition WsfRigidBodySixDOF_AeroCoreObject.hpp:150
double Cm_AlphaBetaMach(double aMach, double aAlpha_rad, double aBeta_rad)
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:521
double Cnr_Mach(double aMach)
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:589
bool ProcessInput(UtInput &aInput)
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:27
double Cmq_Mach(double aMach)
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:535
double Cn_AlphaBetaMach(double aMach, double aAlpha_rad, double aBeta_rad)
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:565
UtVec3dX GetAeroCenter_ft() const
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:727
void CalculateAeroCoefficientVectors(double aMach, double aAlpha_rad, double &aCLArea, double &aCdArea, double &aCmArea, double aRadiusSizeFactor=1.0)
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:953
UtCloneablePtr< UtTable::Table > mCn_AlphaBetaMachTablePtr
Definition WsfRigidBodySixDOF_AeroCoreObject.hpp:169
UtCloneablePtr< UtTable::Curve > mCm_AlphaDotMachCurvePtr
Definition WsfRigidBodySixDOF_AeroCoreObject.hpp:166
double mWingSpan_ft
Definition WsfRigidBodySixDOF_AeroCoreObject.hpp:140
double GetWingChord_ft() const
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:732
const std::list< UtCloneablePtr< RigidBodyAeroCoreObject > > * GetSubModesList() const
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:450
bool mUseRefArea
Definition WsfRigidBodySixDOF_AeroCoreObject.hpp:145
UtCloneablePtr< UtTable::Curve > mCl_AlphaDotMachCurvePtr
Definition WsfRigidBodySixDOF_AeroCoreObject.hpp:177
UtCloneablePtr< UtTable::Table > mCY_BetaDotBetaMachTablePtr
Definition WsfRigidBodySixDOF_AeroCoreObject.hpp:160
double Cnp_Mach(double aMach)
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:599
void SetModeName(const std::string &aName)
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:444
double CY_BetaDotBetaMach(double aMach, double aBeta_rad)
Definition WsfRigidBodySixDOF_AeroCoreObject.cpp:508
Definition WsfSA_Processor.hpp:35
Function definitions for those who need run-time access to the version.
Definition WsfComm.cpp:32
Copyrights Multiple, All Rights Reserved