WSF
WsfCompositeOpticalSignature.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 2017 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 WSFCOMPOSITEOPTICALSIGNATURE_HPP
13#define WSFCOMPOSITEOPTICALSIGNATURE_HPP
14
15#include "wsf_mil_export.h"
16
17#include <list>
18#include <memory>
19#include <mutex>
20#include <string>
21#include <vector>
22
23#include "UtAtmosphere.hpp"
24#include "UtCalendar.hpp"
25#include "UtCloneablePtr.hpp"
26#include "UtMat3.hpp"
27#include "UtTable.hpp"
28#include "UtVec3.hpp"
30
37{
38public:
43 class MyMat3d
44 {
45 public:
46 MyMat3d() { UtMat3d::Identity(mMat); }
47 MyMat3d(const MyMat3d&) = default;
48 MyMat3d& operator=(const MyMat3d&) = default;
49
50 UtVec3d InverseMultiply(const UtVec3d& aRhs) const
51 {
52 UtVec3d result;
53 UtMat3d::InverseTransform(result.GetData(), mMat, aRhs.GetData());
54 return result;
55 }
56
57 UtVec3d Multiply(const UtVec3d& aRhs) const
58 {
59 UtVec3d result;
60 UtMat3d::Transform(result.GetData(), mMat, aRhs.GetData());
61 return result;
62 }
63
64 void Identity() { UtMat3d::Identity(mMat); }
65
66 double mMat[3][3];
67 };
68
69 using TablePtr = UtCloneablePtr<UtTable::Table>;
70
71 // Allowable independent variable indices for temperature table lookups.
72 enum
73 {
79 cIV_COUNT //<! Number of potential independent variables
80 };
81
89
95 class Surface
96 {
97 public:
99
101 struct RI_Input
102 {
104 UtVec3d mUnit_po; // Platform->Observer
106 };
107
109 struct UG_Input
110 {
112 MyMat3d mWCS_ToECS_Transform; // The WCS->ECS transform for the platform
113 // The current thrust for updating the plume model.
114 // This will be less than zero if the mover is not a guided mover.
116 // Pointer to the previous surface in the list. Used by the plume model for updating plume blockage.
118
119 // The Sun/Earth data is NOT used currently. It is being retained for possible future needs.
120 // UtVec3d mUnit_vel; // Platform velocity
121 // UtVec3d mUnit_ps; // Platform->Sun
122 // UtVec3d mUnit_pe; // Platform->Earth
123 // UtVec3d mUnit_po; // Platform->Observer
124 };
125
134
135 Surface();
136 Surface(const Surface& aSrc) = default;
137 virtual ~Surface() = default;
138 Surface& operator=(const Surface& aSrc) = delete;
139
140 virtual Surface* Clone() const;
141
142 virtual bool InitializeType(UtVec3d& aDefaultLocationECS);
143 virtual bool ProcessInput(UtInput& aInput);
144 virtual double ProjectedArea(const UtVec3d& aUnit_v) const;
145 virtual double RadiantIntensity(const RI_Input& aInput) const;
146 virtual double AdjacentArea(const UtVec3d& aOtherFaceLocECS, const UtVec3d& aOtherFaceNormalECS) const;
147 virtual void CheckAdjacency(const Surface& aOther);
148 virtual void UpdatePlumeRadius(double aPlumeRadius) { mPlumeRadius = aPlumeRadius; }
149 virtual void UpdateGeometry(const UG_Input& aInput);
150 virtual void UpdateTemperature(const UT_Input& aInput);
151
152 bool AreAdjacent(const UtVec3d& aOtherFaceLocECS,
153 const UtVec3d& aOtherFaceNormalECS,
154 const UtVec3d& aMyFaceLocPCS,
155 const UtVec3d& aMyFaceNormalPCS) const;
156 bool UpdateSharedFaceArea(const Surface& aOther,
157 const UtVec3d& aMyFaceLocPCS,
158 const UtVec3d& aMyFaceNormalPCS,
159 double aMaxSharedArea,
160 double& aSharedArea);
161 void UpdateLocation(UtVec3d& aDefaultLocationECS, const UtVec3d& aSizeSCS, const UtVec3d& aOffsetSCS);
162 double UpdatePlumeBlockage(double aArea, double aCosTheta) const;
163
167 double mRecoveryFactor{0.85};
168 double mGamma{1.4};
169 UtVec3d mLocationECS{0.0, 0.0, 0.0};
171
172 // The ECS->SCS(aka PCS) transform.
173 // This is defined in this class as the identity transform. The Orientable class will update
174 // this with the oriented version.
176
177 // This is the temperature evaluated at the current conditions.
178 double mTemperature{0.0};
179
180 // The WCS->SCS(aka PCS) (Surface) transform at the current conditions.
182
183 // The real or effective radius of the aft X face
184 double mAftRadius{0.0};
185
186 // Radius of the attached plume (if the following surface is a 'plume').
187 double mPlumeRadius{0.0};
188
189 int mDebugLevel{0}; // Copied from the top-level signature...
190 };
191
192 static WsfOpticalSignature* ObjectFactory(const std::string& aTypeName);
193
198
199 WsfOpticalSignature* Clone() const override;
200
201 bool Initialize(double aSimTime, WsfPlatform* aPlatformPtr) override;
202
203 bool InitializeType() override;
204
205 std::vector<WsfStringId> GetStateNames() const override;
206
207 bool ProcessInput(UtInput& aInput) override;
208
209 float GetSignature(double aSimTime, WsfStringId aStateId, double aAzimuth, double aElevation) override;
210
211 bool GetProjectedArea(double aSimTime, WsfStringId aStateId, double aAzimuth, double aElevation, double& aProjectedArea) override;
212
213 bool GetRadiantIntensity(double aSimTime,
214 WsfStringId aStateId,
215 const BandList& aBands,
216 double aAzimuth,
217 double aElevation,
218 double& aRadiantIntensity) override;
219
220 static Surface* SurfaceFactory(const std::string& aType, const Surface& aDefaultData);
221
222private:
224 class State
225 {
226 public:
227 explicit State(WsfStringId aStateId)
228 : mStateId(aStateId)
229 , mSurfaces()
230 {
231 }
232 State(const State& aSrc);
233 ~State();
234 State& operator=(const State&) = delete;
235
236 WsfStringId mStateId;
237 std::list<Surface*> mSurfaces;
238 };
239
240 State* SelectState(WsfStringId aId) const;
241 void UpdateGeometry(double aSimTime, State& aState);
242 void UpdateTemperature(double aSimTime, State& aState);
243
244 std::list<State*> mStates;
245 unsigned int mDebugLevel{0};
246
248
249 Surface mDefaultSurface;
250 WsfStringId mCurrentStateId{"default"};
252
257 std::recursive_mutex mGeometryUpdateMutex; // Protect the update during multi-threading.
258 double mGeometryUpdateTime{-1.0};
259
260 // The Sun/Earth data is NOT used currently. It is being retained for possible future needs.
261 // See UpdateGeometry for more information...
262 // UtCalendar mCurrentTime; // The current simulation time, as a calendar object
264 // UtVec3d mLoc_s; // Location of the Sun
265 // UtVec3d mLoc_p; // Location of the platform
266 // UtVec3d mUnit_vel; // Unit vector of the platform velocity
267 // UtVec3d mUnit_ps; // Unit vector from the platform to the Sun
268 // UtVec3d mUnit_pe; // Unit vector from the platform to the Earth
269 // UtVec3d mUnit_es; // Unit vector from the Earth to the Sun
270 // double mDist_ps{0.0}; // Distance from the platform to the Sun
271 // double mDist_pe{0.0}; // Distance from the platform to the Earth
272 // double mDist_es{0.0}; // Distance from the Earth to the Sun
274
278
279 std::recursive_mutex mTempUpdateMutex; // Protect the update during multi-threading.
280 double mTempUpdateTime{-1.0};
281 UtAtmosphere mAtmosphere{UtAtmosphere::CreateNewAtmosphereTable()};
283};
284
285#endif
UtStringId WsfStringId
WsfStringId – the same thing as UtStringId.
Definition WsfStringId.hpp:23
Definition WsfCompositeOpticalSignature.hpp:44
MyMat3d & operator=(const MyMat3d &)=default
double mMat[3][3]
Definition WsfCompositeOpticalSignature.hpp:66
UtVec3d InverseMultiply(const UtVec3d &aRhs) const
Definition WsfCompositeOpticalSignature.hpp:50
MyMat3d()
Definition WsfCompositeOpticalSignature.hpp:46
MyMat3d(const MyMat3d &)=default
void Identity()
Definition WsfCompositeOpticalSignature.hpp:64
UtVec3d Multiply(const UtVec3d &aRhs) const
Definition WsfCompositeOpticalSignature.hpp:57
Definition WsfCompositeOpticalSignature.hpp:96
double mPlumeRadius
Definition WsfCompositeOpticalSignature.hpp:187
Surface & operator=(const Surface &aSrc)=delete
virtual Surface * Clone() const
Definition WsfCompositeOpticalSignature.cpp:608
double mRecoveryFactor
Definition WsfCompositeOpticalSignature.hpp:167
double mTemperatureOffset
Definition WsfCompositeOpticalSignature.hpp:166
virtual bool InitializeType(UtVec3d &aDefaultLocationECS)
Definition WsfCompositeOpticalSignature.cpp:614
virtual void CheckAdjacency(const Surface &aOther)
Definition WsfCompositeOpticalSignature.cpp:721
TemperatureType mTemperatureType
Definition WsfCompositeOpticalSignature.hpp:164
int mDebugLevel
Definition WsfCompositeOpticalSignature.hpp:189
TablePtr mTemperaturePtr
Definition WsfCompositeOpticalSignature.hpp:165
UtVec3d mLocationECS
Definition WsfCompositeOpticalSignature.hpp:169
double mTemperature
Definition WsfCompositeOpticalSignature.hpp:178
bool mUseDefaultLocation
Definition WsfCompositeOpticalSignature.hpp:170
virtual bool ProcessInput(UtInput &aInput)
Definition WsfCompositeOpticalSignature.cpp:626
MyMat3d mECS_ToSCS_Transform
Definition WsfCompositeOpticalSignature.hpp:175
double mAftRadius
Definition WsfCompositeOpticalSignature.hpp:184
Surface()
Definition WsfCompositeOpticalSignature.cpp:589
virtual void UpdatePlumeRadius(double aPlumeRadius)
Definition WsfCompositeOpticalSignature.hpp:148
MyMat3d mWCS_ToSCS_Transform
Definition WsfCompositeOpticalSignature.hpp:181
virtual double RadiantIntensity(const RI_Input &aInput) const
Definition WsfCompositeOpticalSignature.cpp:704
virtual double AdjacentArea(const UtVec3d &aOtherFaceLocECS, const UtVec3d &aOtherFaceNormalECS) const
Definition WsfCompositeOpticalSignature.cpp:724
double mGamma
Definition WsfCompositeOpticalSignature.hpp:168
virtual double ProjectedArea(const UtVec3d &aUnit_v) const
Definition WsfCompositeOpticalSignature.cpp:698
WsfCompositeOpticalSignature::MyMat3d MyMat3d
Definition WsfCompositeOpticalSignature.hpp:98
Surface(const Surface &aSrc)=default
Definition WsfCompositeOpticalSignature.hpp:37
WsfCompositeOpticalSignature & operator=(const WsfCompositeOpticalSignature &)=delete
@ cIV_COUNT
Definition WsfCompositeOpticalSignature.hpp:79
@ cIV_SPEED
Definition WsfCompositeOpticalSignature.hpp:77
@ cIV_THROTTLE
Definition WsfCompositeOpticalSignature.hpp:75
@ cIV_MACH
Definition WsfCompositeOpticalSignature.hpp:78
@ cIV_TIME
Definition WsfCompositeOpticalSignature.hpp:74
@ cIV_ALTITUDE
Definition WsfCompositeOpticalSignature.hpp:76
WsfCompositeOpticalSignature()
Definition WsfCompositeOpticalSignature.cpp:102
UtCloneablePtr< UtTable::Table > TablePtr
Definition WsfCompositeOpticalSignature.hpp:69
TemperatureType
Definition WsfCompositeOpticalSignature.hpp:83
@ cTT_AMBIENT
Definition WsfCompositeOpticalSignature.hpp:86
@ cTT_TABLE
Definition WsfCompositeOpticalSignature.hpp:85
@ cTT_UNDEFINED
Definition WsfCompositeOpticalSignature.hpp:84
@ cTT_ADIABATIC_WALL
Definition WsfCompositeOpticalSignature.hpp:87
static Surface * SurfaceFactory(const std::string &aType, const Surface &aDefaultData)
Definition WsfCompositeOpticalSignature.cpp:2159
An object that represents the optical signature of a platform.
Definition WsfOpticalSignature.hpp:27
WsfOpticalSignature * Clone() const override=0
virtual bool GetRadiantIntensity(double aSimTime, WsfStringId aState, const BandList &aBands, double aAzimuth, double aElevation, double &aRadiantIntensity)
Definition WsfOpticalSignature.cpp:97
virtual float GetSignature(double aSimTime, WsfStringId aStateId, double aAzimuth, double aElevation)=0
std::vector< WsfEM_Types::OpticalBand > BandList
Definition WsfOpticalSignature.hpp:53
virtual bool GetProjectedArea(double aSimTime, WsfStringId aStateId, double aAzimuth, double aElevation, double &aProjectedArea)
Definition WsfOpticalSignature.cpp:87
WsfOpticalSignature()
Definition WsfOpticalSignature.cpp:32
Platforms represent a entity within the simulation.
Definition WsfPlatform.hpp:115
bool ProcessInput(UtInput &aInput) override
Definition WsfSignature.cpp:74
virtual bool Initialize(double aSimTime, WsfPlatform *aPlatformPtr)
Definition WsfSignature.cpp:51
virtual bool InitializeType()
Definition WsfSignature.cpp:40
virtual std::vector< WsfStringId > GetStateNames() const
get the list of all valid states belonging to the signature
Definition WsfSignature.hpp:43
Input data to 'RadiantIntensity'.
Definition WsfCompositeOpticalSignature.hpp:102
WsfPlatform * mPlatformPtr
Definition WsfCompositeOpticalSignature.hpp:103
UtVec3d mUnit_po
Definition WsfCompositeOpticalSignature.hpp:104
BandList mBands
Definition WsfCompositeOpticalSignature.hpp:105
Input data for 'UpdateGeometry'.
Definition WsfCompositeOpticalSignature.hpp:110
MyMat3d mWCS_ToECS_Transform
Definition WsfCompositeOpticalSignature.hpp:112
double mCurrentThrust
Definition WsfCompositeOpticalSignature.hpp:115
Surface * mPrevSurfacePtr
Definition WsfCompositeOpticalSignature.hpp:117
WsfPlatform * mPlatformPtr
Definition WsfCompositeOpticalSignature.hpp:111
Input data for 'UpdateTemperature'.
Definition WsfCompositeOpticalSignature.hpp:128
double mLookupArgs[cIV_COUNT]
Definition WsfCompositeOpticalSignature.hpp:132
double mAmbientTemperature
Definition WsfCompositeOpticalSignature.hpp:130
double mAdiabaticAdjustmentFactor
Definition WsfCompositeOpticalSignature.hpp:131
WsfPlatform * mPlatformPtr
Definition WsfCompositeOpticalSignature.hpp:129
Copyrights Multiple, All Rights Reserved