WSF
WsfOpticalAttenuation.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 2003-2015 The Boeing 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 WSFOPTICALATTENUATION_HPP
13#define WSFOPTICALATTENUATION_HPP
14
15#include "wsf_mil_export.h"
16
17#include <functional>
18#include <iosfwd>
19#include <memory>
20
21#include "UtAtmosphere.hpp"
22#include "WsfEM_Attenuation.hpp"
23
25class WSF_MIL_EXPORT WsfOpticalAttenuation : public WsfEM_Attenuation
26{
27public:
28 class Segment
29 {
30 public:
32 : mRangeLimit(0.0F)
33 , mA(0.0F)
34 , mB(0.0F)
35 {
36 }
37 Segment(float aRangeLimit, float aA, float aB)
38 : mRangeLimit(aRangeLimit)
39 , mA(aA)
40 , mB(aB)
41 {
42 }
43
45 float mA;
46 float mB;
47 };
48
50 {
51 public:
53 : mAltitude(0.0F)
54 , mIndex(0)
55 {
56 }
57 SegmentRef(float aAltitude, unsigned int aIndex)
58 : mAltitude(aAltitude)
59 , mIndex(aIndex)
60 {
61 }
62
63 float mAltitude;
64 unsigned int mIndex;
65 };
66
67 class Table
68 {
69 public:
70 Table(const SegmentRef* aSegmentRefs, const Segment* aSegments)
71 : mSegmentRefs(aSegmentRefs)
72 , mSegments(aSegments)
73 {
74 }
75 virtual ~Table() = default;
76
79 };
80
81 class TableX : public Table
82 {
83 public:
84 TableX(const SegmentRef* aSegmentRefs, const Segment* aSegments)
85 : Table(aSegmentRefs, aSegments)
86 {
87 }
88
89 ~TableX() override
90 {
91 delete[] mSegmentRefs;
92 delete[] mSegments;
93 }
94 };
95
97 {
98 public:
99 TableRef(const char* aTableNamePtr, const Table* aTablePtr)
100 : mTableNamePtr(aTableNamePtr)
101 , mTablePtr(aTablePtr)
102 {
103 }
104
105 const char* mTableNamePtr;
107 };
108
109 WsfOpticalAttenuation(const WsfScenario& aScenario);
110 WsfOpticalAttenuation(const WsfScenario& aScenario,
111 double aAtmosphericAttenuation,
112 UtAtmosphere::AtmosphereType aAtmosphereType);
113 ~WsfOpticalAttenuation() override = default;
114
115 static std::function<WsfEM_Attenuation*(const std::string&)> GetObjectFactory(WsfScenario& aScenario);
116
117 WsfEM_Attenuation* Clone() const override;
118
119 bool Initialize(WsfEM_XmtrRcvr* aXmtrRcvrPtr) override;
120
121 bool ProcessInput(UtInput& aInput) override;
122
123 double ComputeAttenuationFactor(WsfEM_Interaction& aInteraction,
124 WsfEnvironment& aEnvironment,
125 WsfEM_Interaction::Geometry aGeometry) override;
126
127private:
128 double ComputeSimpleAttenuation(double aAltitude1, double aAltitude2, double aGroundRange);
129
130 double ComputeCompactAttenuation(double aAltitude,
131 double aElevationAngle,
132 double aSlantRange,
133 double aEffectiveEarthRadius,
134 const Table* aTablePtr);
135
136 void ComputePathAttenuation(double& aSumAlphaR,
137 double aBegAltitude,
138 double aElevationAngle,
139 double aSlantRange,
140 double aEndAltitude,
141 double aAirSlantRange,
142 double aEffectiveEarthRadius,
143 const Table* aTablePtr);
144
145 const Table* FindInternalTable(const std::string& aTableName) const;
146
147 bool SelectInternalTable(WsfEM_XmtrRcvr* aXmtrRcvrPtr);
148
150
151 void ProcessQueryCommand(UtInput& aInput);
153
154 void LoadExternalTable(UtInput& aInput, const std::string& aTableFileName);
155
156 void OpticalPathConversion(UtInput& aInput);
157
159
160 void SpectralDataConversion(UtInput& aInput);
161
162 void ProcessAltitude(std::ofstream& aCodeOfs,
163 std::ofstream& aTableOfs,
164 std::ofstream& aPlotOfs,
165 double aAltitude,
166 const std::vector<double>& aRangeValues,
167 const std::vector<double>& aTransmittanceValues,
168 bool aMonochromatic,
169 std::vector<SegmentRef>& aSegmentRefs,
170 std::vector<Segment>& aSegments,
171 double aMaximumAbsoluteError,
172 double aMaximumRelativeError,
173 int aMaximumSegmentCount) const;
174
175 void GenerateSegments(const std::vector<double>& aRangeValues,
176 const std::vector<double>& aTransmittanceValues,
177 const std::vector<double>& aAlphaValues,
178 const std::vector<double>& aLnRangeValues,
179 const std::vector<double>& aLnAlphaValues,
180 double aMaximumAbsoluteError,
181 double aMaximumRelativeError,
182 int aMaximumSegmentCount,
183 bool aOnlyUseConstantAlpha,
184 std::vector<Segment>& aSegments) const;
185
186 size_t TestStraightLineFit(const std::vector<double>& aRangeValues,
187 const std::vector<double>& aTransmittanceValues,
188 size_t aBeg,
189 size_t aEnd,
190 double aA,
191 double aB,
192 double aMaximumAbsoluteError,
193 double aMaximumRelativeError) const;
194
195 void StraightLineFit(const std::vector<double>& aX,
196 const std::vector<double>& aY,
197 size_t aStart,
198 size_t aCount,
199 double& aA,
200 double& aB,
201 double& aSigA,
202 double& aSigB,
203 double& aChi2) const;
205 enum
206 {
207 cAT_COMPACT,
208 cAT_SIMPLE,
209 cAT_NONE
210 } mAlgorithm;
211
213
214 int mAtmosphereModel;
215 int mHazeModel;
216 int mCloudModel;
218
220 double mAdjustmentFactor;
221
223 const Table* mTablePtr;
224
226 std::shared_ptr<TableX> mExternalTablePtr;
227
229
230
232 double mSimpleAttenuation;
233 UtAtmosphere mAtmosphere;
235};
236
237#endif
WsfEM_Attenuation()
Definition WsfEM_Attenuation.cpp:25
virtual double ComputeAttenuationFactor(WsfEM_Interaction &aInteraction, WsfEnvironment &aEnvironment, WsfEM_Interaction::Geometry aGeometry)
Definition WsfEM_Attenuation.cpp:94
virtual bool Initialize(WsfEM_XmtrRcvr *aXmtrRcvrPtr)
Definition WsfEM_Attenuation.cpp:48
bool ProcessInput(UtInput &aInput) override
Definition WsfEM_Attenuation.cpp:66
WsfEM_Attenuation * Clone() const override=0
Definition WsfEM_Interaction.hpp:68
Geometry
Definition WsfEM_Interaction.hpp:93
Definition WsfEM_XmtrRcvr.hpp:42
Definition WsfEnvironment.hpp:37
Definition WsfOpticalAttenuation.hpp:50
SegmentRef(float aAltitude, unsigned int aIndex)
Definition WsfOpticalAttenuation.hpp:57
SegmentRef()
Definition WsfOpticalAttenuation.hpp:52
unsigned int mIndex
Definition WsfOpticalAttenuation.hpp:64
float mAltitude
Definition WsfOpticalAttenuation.hpp:63
Definition WsfOpticalAttenuation.hpp:29
float mB
Definition WsfOpticalAttenuation.hpp:46
float mA
Definition WsfOpticalAttenuation.hpp:45
float mRangeLimit
Definition WsfOpticalAttenuation.hpp:44
Segment()
Definition WsfOpticalAttenuation.hpp:31
Segment(float aRangeLimit, float aA, float aB)
Definition WsfOpticalAttenuation.hpp:37
const char * mTableNamePtr
Definition WsfOpticalAttenuation.hpp:105
const Table * mTablePtr
Definition WsfOpticalAttenuation.hpp:106
TableRef(const char *aTableNamePtr, const Table *aTablePtr)
Definition WsfOpticalAttenuation.hpp:99
~TableX() override
Definition WsfOpticalAttenuation.hpp:89
TableX(const SegmentRef *aSegmentRefs, const Segment *aSegments)
Definition WsfOpticalAttenuation.hpp:84
Definition WsfOpticalAttenuation.hpp:68
const SegmentRef * mSegmentRefs
Definition WsfOpticalAttenuation.hpp:77
virtual ~Table()=default
Table(const SegmentRef *aSegmentRefs, const Segment *aSegments)
Definition WsfOpticalAttenuation.hpp:70
const Segment * mSegments
Definition WsfOpticalAttenuation.hpp:78
~WsfOpticalAttenuation() override=default
static std::function< WsfEM_Attenuation *(const std::string &)> GetObjectFactory(WsfScenario &aScenario)
Definition WsfOpticalAttenuation.cpp:149
WsfOpticalAttenuation(const WsfScenario &aScenario)
Definition WsfOpticalAttenuation.cpp:90
Contains the data required to create a simulation, and acts as the entry point for input file process...
Definition WsfScenario.hpp:111
Copyrights Multiple, All Rights Reserved