Air mass: Difference between revisions
Content added Content deleted
(Added Go) |
(Add Seed7) |
||
Line 692: | Line 692: | ||
90 │ 34.32981136 34.36666557 |
90 │ 34.32981136 34.36666557 |
||
─────┴───────────────────────────────────────────────────────────── |
─────┴───────────────────────────────────────────────────────────── |
||
</pre> |
|||
=={{header|Seed7}}== |
|||
{{trans|FreeBASIC}} |
|||
<lang seed7>$ include "seed7_05.s7i"; |
|||
include "float.s7i"; |
|||
include "math.s7i"; |
|||
const float: DEG is 0.017453292519943295769236907684886127134; #degrees to radians |
|||
const float: RE is 6371000.0; #Earth radius in meters |
|||
const float: dd is 0.001; #integrate in this fraction of the distance already covered |
|||
const float: FIN is 10000000.0; #integrate only to a height of 10000km, effectively infinity |
|||
const func float: rho (in float: a) is |
|||
#the density of air as a function of height above sea level |
|||
return exp(-a / 8500.0); |
|||
const func float: height (in float: a, in float: z, in float: d) is func |
|||
#a is altitude of observer |
|||
#z is zenith angle (in degrees) |
|||
#d is distance along line of sight |
|||
result |
|||
var float: r is 0.0; |
|||
local |
|||
var float: AA is 0.0; |
|||
var float: HH is 0.0; |
|||
begin |
|||
AA := RE + a; |
|||
HH := sqrt( AA ** 2.0 + d ** 2.0 - 2.0 * d * AA * cos((180.0 - z) * DEG) ); |
|||
r := HH - RE; |
|||
end func; |
|||
const func float: columnDensity (in float: a, in float: z) is func |
|||
#integrates density along line of sight |
|||
result |
|||
var float: sum is 0.0; |
|||
local |
|||
var float: d is 0.0; |
|||
var float: delta is 0.0; |
|||
begin |
|||
while d < FIN do |
|||
delta := max(dd, dd * d); #adaptive step size to avoid taking it forever |
|||
sum +:= rho(height(a, z, d + 0.5 * delta)) * delta; |
|||
d +:= delta; |
|||
end while; |
|||
end func; |
|||
const func float: airmass (in float: a, in float: z) is |
|||
return columnDensity(a, z) / columnDensity(a, 0.0); |
|||
const proc: main is func |
|||
local |
|||
var integer: zz is 0; |
|||
var float: z is 0.0; |
|||
begin |
|||
writeln("Angle 0 m 13700 m"); |
|||
writeln("------------------------------------"); |
|||
for zz range 0 to 90 step 5 do |
|||
z := flt(zz); |
|||
write(z lpad 4); |
|||
write(airmass(0.0, z) digits 8 lpad 15); |
|||
writeln(airmass(13700.0, z) digits 8 lpad 17); |
|||
end for; |
|||
end func;</lang> |
|||
{{out}} |
|||
<pre> |
|||
Angle 0 m 13700 m |
|||
------------------------------------ |
|||
0.0 1.00000000 1.00000000 |
|||
5.0 1.00380963 1.00380965 |
|||
10.0 1.01538466 1.01538475 |
|||
15.0 1.03517744 1.03517765 |
|||
20.0 1.06399053 1.06399093 |
|||
25.0 1.10305937 1.10306005 |
|||
30.0 1.15418974 1.15419083 |
|||
35.0 1.21998076 1.21998246 |
|||
40.0 1.30418931 1.30419190 |
|||
45.0 1.41234169 1.41234567 |
|||
50.0 1.55280404 1.55281025 |
|||
55.0 1.73875921 1.73876915 |
|||
60.0 1.99212000 1.99213665 |
|||
65.0 2.35199740 2.35202722 |
|||
70.0 2.89531368 2.89537287 |
|||
75.0 3.79582352 3.79596149 |
|||
80.0 5.53885809 5.53928113 |
|||
85.0 10.07896219 10.08115981 |
|||
90.0 34.32981136 34.36666557 |
|||
</pre> |
</pre> |
||