]> git.mxchange.org Git - flightgear.git/blob - src/FDM/LaRCsim/atmos_62.c
Updates to the scenery loading infrastructure to make it more flexible,
[flightgear.git] / src / FDM / LaRCsim / atmos_62.c
1 /***************************************************************************
2
3     TITLE:              atmos_62
4
5 ----------------------------------------------------------------------------
6
7     FUNCTION:           1962 atmosphere table interpolation routine
8
9 ----------------------------------------------------------------------------
10
11     MODULE STATUS:      developmental
12
13 ----------------------------------------------------------------------------
14
15     GENEALOGY:  Created 920827 by Bruce Jackson as part of the C-castle
16                 development effort.
17
18 ----------------------------------------------------------------------------
19
20     DESIGNED BY:        B. Jackson
21
22     CODED BY:           B. Jackson
23
24     MAINTAINED BY:      B. Jackson
25
26 ----------------------------------------------------------------------------
27
28     MODIFICATION HISTORY:
29
30         DATE    PURPOSE                                                 BY
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
34
35 ----------------------------------------------------------------------------
36
37     REFERENCES:
38
39     [ 1]        Hornbeck, Robert W.: "Numerical Methods", Prentice-Hall,
40                 1975.  ISBN  0-13-626614-2
41
42 ----------------------------------------------------------------------------
43
44     CALLED BY:
45
46 ----------------------------------------------------------------------------
47
48     CALLS TO:
49
50 ----------------------------------------------------------------------------
51
52     INPUTS:
53
54 ----------------------------------------------------------------------------
55
56     OUTPUTS:
57
58 --------------------------------------------------------------------------*/
59
60 #include "ls_types.h"
61 #include "ls_constants.h"
62
63 #include "atmos_62.h"
64
65 #include <math.h>
66
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]
77
78 #define MAX_ALT_INDEX 121
79 #define DELT_ALT 2000.
80 #define HLEV 36089.
81 #define TAMB0 518.7
82 #define PAMB0 2113.8
83 #define MAX_ALTITUDE 240000.
84
85 void ls_atmos( SCALAR altitude, SCALAR * sigma, SCALAR * v_sound, 
86                 SCALAR * t_amb, SCALAR * p_amb )
87 {
88
89     int         index;
90     SCALAR      daltp, daltn, daltp3, daltn3, density;
91     SCALAR      t_amb_r, p_amb_r;
92     SCALAR      tmp;
93
94     static SCALAR       d_a_table[MAX_ALT_INDEX][5] =
95     {
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    }
217     };
218
219     /* for purposes of doing the table lookup, force the incoming
220        altitude to be >= 0 */
221
222     // printf("altitude = %.2f\n", altitude);
223
224     if ( altitude < 0.0 ) {
225         altitude = 0.0;
226     }
227
228     // printf("altitude = %.2f\n", altitude);
229
230     index = (int)( altitude / 2000 );
231     if (index > (MAX_ALT_INDEX-2))
232     {
233      index = MAX_ALT_INDEX-2; /* limit maximum altitude */
234      altitude = MAX_ALTITUDE;
235     }
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;
241     
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;
245                             
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;
249
250     *sigma = density/SEA_LEVEL_DENSITY;
251
252     if (altitude < HLEV)    /* BUG - these curve fits are only good to about 75000 ft */
253       {
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);
260       }
261     else
262       {
263         t_amb_r = 0.751895;
264         p_amb_r = 0.2234*exp( -4.806e-5 * (altitude - HLEV));
265       }
266
267     *p_amb = p_amb_r * PAMB0;
268     *t_amb = t_amb_r * TAMB0;
269
270 /* end of atmos_62 */
271 }
272 /**************************************************************************/