]> git.mxchange.org Git - flightgear.git/blob - src/FDM/LaRCsim/atmos_62.c
LaRCsim FDM - detabbing of all files.
[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 /**************************************************************************/