1 /***************************************************************************
5 ----------------------------------------------------------------------------
7 FUNCTION: 1962 atmosphere table interpolation routine
9 ----------------------------------------------------------------------------
11 MODULE STATUS: developmental
13 ----------------------------------------------------------------------------
15 GENEALOGY: Created 920827 by Bruce Jackson as part of the C-castle
18 ----------------------------------------------------------------------------
20 DESIGNED BY: B. Jackson
24 MAINTAINED BY: B. Jackson
26 ----------------------------------------------------------------------------
31 931220 Added ambient pressure and temperature as outputs. EBJ
32 940111 Changed includes from "ls_eom.h" to "ls_types.h" and
33 "ls_constants.h"; changed DATA to SCALAR types. EBJ
35 ----------------------------------------------------------------------------
39 [ 1] Hornbeck, Robert W.: "Numerical Methods", Prentice-Hall,
40 1975. ISBN 0-13-626614-2
42 ----------------------------------------------------------------------------
46 ----------------------------------------------------------------------------
50 ----------------------------------------------------------------------------
54 ----------------------------------------------------------------------------
58 --------------------------------------------------------------------------*/
61 #include "ls_constants.h"
67 #define alt_0 d_a_table[index ][0]
68 #define alt_1 d_a_table[index+1][0]
69 #define den_0 d_a_table[index ][1]
70 #define den_1 d_a_table[index+1][1]
71 #define sps_0 d_a_table[index ][2]
72 #define sps_1 d_a_table[index+1][2]
73 #define gden_0 d_a_table[index ][3]
74 #define gden_1 d_a_table[index+1][3]
75 #define gsps_0 d_a_table[index ][4]
76 #define gsps_1 d_a_table[index+1][4]
78 #define MAX_ALT_INDEX 121
79 #define DELT_ALT 2000.
83 #define MAX_ALTITUDE 240000.
85 void ls_atmos( SCALAR altitude, SCALAR * sigma, SCALAR * v_sound,
86 SCALAR * t_amb, SCALAR * p_amb )
90 SCALAR daltp, daltn, daltp3, daltn3, density;
91 SCALAR t_amb_r, p_amb_r;
94 static SCALAR d_a_table[MAX_ALT_INDEX][5] =
96 { 0., 2.37701E-03, 1.11642E+03, 0.00000E+00, 0.00000E+00 },
97 { 2000., 2.24098E-03, 1.10872E+03, 1.92857E-12, -1.75815E-08 },
98 { 4000., 2.11099E-03, 1.10097E+03, 1.34570E-12, -1.21740E-08 },
99 { 6000., 1.98684E-03, 1.09315E+03, 1.44862E-12, -1.47225E-08 },
100 { 8000., 1.86836E-03, 1.08529E+03, 1.36481E-12, -1.44359E-08 },
101 { 10000., 1.75537E-03, 1.07736E+03, 1.32716E-12, -1.45340E-08 },
102 { 12000., 1.64768E-03, 1.06938E+03, 1.27657E-12, -1.44280E-08 },
103 { 14000., 1.54511E-03, 1.06133E+03, 1.24656E-12, -1.62540E-08 },
104 { 16000., 1.44751E-03, 1.05323E+03, 1.19220E-12, -1.50560E-08 },
105 { 18000., 1.35469E-03, 1.04506E+03, 1.15463E-12, -1.65220E-08 },
106 { 20000., 1.26649E-03, 1.03683E+03, 1.11926E-12, -1.63562E-08 },
107 { 22000., 1.18276E-03, 1.02853E+03, 1.07333E-12, -1.70533E-08 },
108 { 24000., 1.10333E-03, 1.02016E+03, 1.03743E-12, -1.59305E-08 },
109 { 26000., 1.02805E-03, 1.01173E+03, 1.00195E-12, -2.27248E-08 },
110 { 28000., 9.56760E-04, 1.00322E+03, 9.39764E-13, 3.29851E-10 },
111 { 30000., 8.89320E-04, 9.94641E+02, 1.01399E-12, -8.80946E-08 },
112 { 32000., 8.25570E-04, 9.85988E+02, 5.39268E-13, 2.41048E-07 },
113 { 34000., 7.65380E-04, 9.77258E+02, 2.16894E-12, -9.91599E-07 },
114 { 36000., 7.08600E-04, 9.68448E+02, -4.10001E-12, 3.60535E-06 },
115 { 38000., 6.44190E-04, 9.68053E+02, 2.78612E-12, -8.07290E-07 },
116 { 40000., 5.85146E-04, 9.68053E+02, 1.00455E-12, 2.16313E-07 },
117 { 42000., 5.31517E-04, 9.68053E+02, 1.31819E-12, -5.79609E-08 },
118 { 44000., 4.82801E-04, 9.68053E+02, 1.09217E-12, 1.55309E-08 },
119 { 46000., 4.38554E-04, 9.68053E+02, 1.01661E-12, -4.16262E-09 },
120 { 48000., 3.98359E-04, 9.68053E+02, 9.19375E-13, 1.11961E-09 },
121 { 50000., 3.61850E-04, 9.68053E+02, 8.34886E-13, -3.15801E-10 },
122 { 52000., 3.28686E-04, 9.68053E+02, 7.58579E-13, 1.43600E-10 },
123 { 54000., 2.98561E-04, 9.68053E+02, 6.89297E-13, -2.58597E-10 },
124 { 56000., 2.71197E-04, 9.68053E+02, 6.25735E-13, 8.90788E-10 },
125 { 58000., 2.46341E-04, 9.68053E+02, 5.69765E-13, -3.30456E-09 },
126 { 60000., 2.23765E-04, 9.68053E+02, 5.15206E-13, 1.23274E-08 },
127 { 62000., 2.03256E-04, 9.68053E+02, 4.69912E-13, -4.60052E-08 },
128 { 64000., 1.84627E-04, 9.68053E+02, 4.25146E-13, 1.71693E-07 },
129 { 66000., 1.67616E-04, 9.68314E+02, 2.56502E-13, -2.49268E-07 },
130 { 68000., 1.51855E-04, 9.68676E+02, 4.23844E-13, 9.76878E-07 },
131 { 70000., 1.37615E-04, 9.71034E+02, 3.29621E-13, -6.64245E-07 },
132 { 72000., 1.24744E-04, 9.72390E+02, 3.11170E-13, 1.77102E-07 },
133 { 74000., 1.13107E-04, 9.73745E+02, 2.76697E-13, -4.56627E-08 },
134 { 76000., 1.02584E-04, 9.75099E+02, 2.53043E-13, 4.04902E-09 },
135 { 78000., 9.30660E-05, 9.76450E+02, 2.18633E-13, 2.49667E-08 },
136 { 80000., 8.44530E-05, 9.77799E+02, 2.29927E-13, -1.06916E-07 },
137 { 82000., 7.67140E-05, 9.78950E+02, 1.72660E-13, 1.05696E-07 },
138 { 84000., 6.97010E-05, 9.80290E+02, 1.68432E-13, -3.23682E-08 },
139 { 86000., 6.33490E-05, 9.81620E+02, 1.45113E-13, 8.77690E-09 },
140 { 88000., 5.75880E-05, 9.82950E+02, 1.37617E-13, -2.73938E-09 },
141 { 90000., 5.23700E-05, 9.84280E+02, 1.18918E-13, 2.18061E-09 },
142 { 92000., 4.76350E-05, 9.85610E+02, 1.11210E-13, -5.98306E-09 },
143 { 94000., 4.33410E-05, 9.86930E+02, 9.77408E-14, 6.75162E-09 },
144 { 96000., 3.94430E-05, 9.88260E+02, 9.18264E-14, -6.02343E-09 },
145 { 98000., 3.59080E-05, 9.89580E+02, 7.94534E-14, 2.34210E-09 },
146 { 100000., 3.26960E-05, 9.90900E+02, 7.48600E-14, -3.34498E-09 },
147 { 102000., 2.97810E-05, 9.92210E+02, 6.66067E-14, -3.96219E-09 },
148 { 104000., 2.71320E-05, 9.93530E+02, 5.77131E-14, 3.41937E-08 },
149 { 106000., 2.46980E-05, 9.95410E+02, 2.50410E-14, 7.07187E-07 },
150 { 108000., 2.24140E-05, 9.99070E+02, 6.71229E-14, -1.92943E-07 },
151 { 110000., 2.03570E-05, 1.00272E+03, 4.69675E-14, 4.95832E-08 },
152 { 112000., 1.85010E-05, 1.00636E+03, 4.65069E-14, -2.03903E-08 },
153 { 114000., 1.68270E-05, 1.00998E+03, 4.00047E-14, 1.97789E-09 },
154 { 116000., 1.53150E-05, 1.01359E+03, 3.64744E-14, -2.52130E-09 },
155 { 118000., 1.39480E-05, 1.01719E+03, 3.15976E-14, -6.89271E-09 },
156 { 120000., 1.27100E-05, 1.02077E+03, 3.06351E-14, 9.21465E-11 },
157 { 122000., 1.15920E-05, 1.02434E+03, 2.58618E-14, -8.47587E-09 },
158 { 124000., 1.05790E-05, 1.02789E+03, 2.34176E-14, 3.81135E-09 },
159 { 126000., 9.66010E-06, 1.03144E+03, 2.16178E-14, -6.76951E-09 },
160 { 128000., 8.82710E-06, 1.03497E+03, 1.89611E-14, -6.73330E-09 },
161 { 130000., 8.07070E-06, 1.03848E+03, 1.74377E-14, 3.70270E-09 },
162 { 132000., 7.38380E-06, 1.04199E+03, 1.55382E-14, -8.07752E-09 },
163 { 134000., 6.75940E-06, 1.04548E+03, 1.41595E-14, -1.39263E-09 },
164 { 136000., 6.19160E-06, 1.04896E+03, 1.27239E-14, -1.35196E-09 },
165 { 138000., 5.67490E-06, 1.05243E+03, 1.15951E-14, -8.19953E-09 },
166 { 140000., 5.20450E-06, 1.05588E+03, 1.03459E-14, 4.15010E-09 },
167 { 142000., 4.77570E-06, 1.05933E+03, 9.42149E-15, -8.40086E-09 },
168 { 144000., 4.38470E-06, 1.06276E+03, 8.66820E-15, -5.46671E-10 },
169 { 146000., 4.02820E-06, 1.06618E+03, 7.65573E-15, -4.41246E-09 },
170 { 148000., 3.70260E-06, 1.06959E+03, 7.05890E-15, 3.19650E-09 },
171 { 150000., 3.40520E-06, 1.07299E+03, 6.40867E-15, -2.33736E-08 },
172 { 152000., 3.13330E-06, 1.07637E+03, 5.55641E-15, 6.02977E-08 },
173 { 154000., 2.88480E-06, 1.07975E+03, 6.46568E-15, -2.17817E-07 },
174 { 156000., 2.66270E-06, 1.08202E+03, 8.18087E-15, -8.54029E-07 },
175 { 158000., 2.46830E-06, 1.08202E+03, 2.36086E-15, 2.28931E-07 },
176 { 160000., 2.28810E-06, 1.08202E+03, 3.67571E-15, -6.16972E-08 },
177 { 162000., 2.12120E-06, 1.08202E+03, 2.88632E-15, 1.78573E-08 },
178 { 164000., 1.96640E-06, 1.08202E+03, 2.92903E-15, -9.73206E-09 },
179 { 166000., 1.82300E-06, 1.08202E+03, 2.49757E-15, 2.10709E-08 },
180 { 168000., 1.69000E-06, 1.08202E+03, 2.68069E-15, -7.45517E-08 },
181 { 170000., 1.56680E-06, 1.08202E+03, 1.47966E-15, 2.77136E-07 },
182 { 172000., 1.45250E-06, 1.08202E+03, 4.75068E-15, -1.03399E-06 },
183 { 174000., 1.35240E-06, 1.07963E+03, 8.17622E-16, 2.73830E-07 },
184 { 176000., 1.25880E-06, 1.07723E+03, 1.72883E-15, -7.63301E-08 },
185 { 178000., 1.17130E-06, 1.07482E+03, 1.41704E-15, 1.64901E-08 },
186 { 180000., 1.08960E-06, 1.07240E+03, 1.30299E-15, -4.63038E-09 },
187 { 182000., 1.01320E-06, 1.06998E+03, 1.32100E-15, 2.03140E-09 },
188 { 184000., 9.41950E-07, 1.06756E+03, 1.13799E-15, -3.49522E-09 },
189 { 186000., 8.75370E-07, 1.06513E+03, 1.13202E-15, -3.05052E-09 },
190 { 188000., 8.13260E-07, 1.06269E+03, 1.03892E-15, 6.97283E-10 },
191 { 190000., 7.55320E-07, 1.06025E+03, 9.67290E-16, 2.61383E-10 },
192 { 192000., 7.01260E-07, 1.05781E+03, 9.11920E-16, -1.74281E-09 },
193 { 194000., 6.50850E-07, 1.05536E+03, 8.60032E-16, -8.29013E-09 },
194 { 196000., 6.03870E-07, 1.05290E+03, 7.92951E-16, 1.99033E-08 },
195 { 198000., 5.60110E-07, 1.05044E+03, 7.98164E-16, -7.13232E-08 },
196 { 200000., 5.19320E-07, 1.04798E+03, 4.69394E-16, 2.65389E-07 },
197 { 202000., 4.81340E-07, 1.04550E+03, 1.53926E-15, -1.02023E-06 },
198 { 204000., 4.47960E-07, 1.04063E+03, 2.73571E-16, 2.30547E-07 },
199 { 206000., 4.16690E-07, 1.03565E+03, 5.31456E-16, -6.69551E-08 },
200 { 208000., 3.87320E-07, 1.03065E+03, 4.50605E-16, 7.27308E-09 },
201 { 210000., 3.59790E-07, 1.02562E+03, 4.26126E-16, -7.13720E-09 },
202 { 212000., 3.33970E-07, 1.02057E+03, 4.09893E-16, -8.72426E-09 },
203 { 214000., 3.09780E-07, 1.01549E+03, 3.79301E-16, -2.96576E-09 },
204 { 216000., 2.87120E-07, 1.01039E+03, 3.67902E-16, -9.41272E-09 },
205 { 218000., 2.65920E-07, 1.00526E+03, 3.39092E-16, -4.38337E-09 },
206 { 220000., 2.46090E-07, 1.00011E+03, 3.30732E-16, -3.05378E-09 },
207 { 222000., 2.27570E-07, 9.94940E+02, 3.02981E-16, -1.34015E-08 },
208 { 224000., 2.10270E-07, 9.89730E+02, 2.87343E-16, -3.34027E-09 },
209 { 226000., 1.94120E-07, 9.84500E+02, 2.72646E-16, -3.23743E-09 },
210 { 228000., 1.79060E-07, 9.79250E+02, 2.57074E-16, -1.37100E-08 },
211 { 230000., 1.65030E-07, 9.73960E+02, 2.44060E-16, -1.92258E-09 },
212 { 232000., 1.51970E-07, 9.68650E+02, 2.21687E-16, -8.59969E-09 },
213 { 234000., 1.39810E-07, 9.63310E+02, 2.19191E-16, -8.67865E-09 },
214 { 236000., 1.28510E-07, 9.57940E+02, 1.91549E-16, -1.68569E-09 },
215 { 238000., 1.18020E-07, 9.52550E+02, 2.29613E-16, -1.45786E-08 },
216 { 240000., 1.08270E-07, 9.47120E+02, 0.00000E+00, 0.00000E+00 }
219 /* for purposes of doing the table lookup, force the incoming
220 altitude to be >= 0 */
222 // printf("altitude = %.2f\n", altitude);
224 if ( altitude < 0.0 ) {
228 // printf("altitude = %.2f\n", altitude);
230 index = (int)( altitude / 2000 );
231 if (index > (MAX_ALT_INDEX-2))
233 index = MAX_ALT_INDEX-2; /* limit maximum altitude */
234 altitude = MAX_ALTITUDE;
236 if (index < 0) index = 0;
237 daltp = alt_1 - altitude;
238 daltp3 = daltp*daltp*daltp;
239 daltn = altitude - alt_0;
240 daltn3 = daltn*daltn*daltn;
242 density = (gden_0/6)*((daltp3/2000) - 2000*daltp)
243 + (gden_1/6)*((daltn3/2000) - 2000*daltn)
244 + den_0*daltp/2000 + den_1*daltn/2000;
246 *v_sound = (gsps_0/6)*((daltp3/2000) - 2000*daltp)
247 + (gsps_1/6)*((daltn3/2000) - 2000*daltn)
248 + sps_0*daltp/2000 + sps_1*daltn/2000;
250 *sigma = density/SEA_LEVEL_DENSITY;
252 if (altitude < HLEV) /* BUG - these curve fits are only good to about 75000 ft */
254 t_amb_r = 1. - 6.875e-6*altitude;
255 // printf("index = %d t_amb_r = %.2f\n", index, t_amb_r);
256 // p_amb_r = pow( t_amb_r, 5.256 );
257 tmp = 5.256; // avoid a segfault (?)
258 p_amb_r = pow( t_amb_r, tmp );
259 // printf("p_amb_r = %.2f\n", p_amb_r);
264 p_amb_r = 0.2234*exp( -4.806e-5 * (altitude - HLEV));
267 *p_amb = p_amb_r * PAMB0;
268 *t_amb = t_amb_r * TAMB0;
270 /* end of atmos_62 */
272 /**************************************************************************/