Air mass: Difference between revisions
Content added Content deleted
(Added XPL0 example.) |
|||
Line 207: | Line 207: | ||
90 34.32981136 34.36666557 |
90 34.32981136 34.36666557 |
||
</pre> |
</pre> |
||
=={{header|Nim}}== |
|||
{{trans|Wren}} |
|||
<lang Nim>import math, strformat |
|||
const |
|||
Re = 6371000 # Radius of earth in meters. |
|||
Dd= 0.001 # Integrate in this fraction of the distance already covered. |
|||
Fin = 1e7 # Integrate only to a height of 10000km, effectively infinity. |
|||
func rho(a: float): float = |
|||
## The density of air as a function of height above sea level. |
|||
exp(-a / 8500) |
|||
func height(a, z, d: float): float = |
|||
## Height as a function of altitude (a), zenith angle (z) |
|||
## in degrees and distance along line of sight (d). |
|||
let aa = Re + a |
|||
let hh = sqrt(aa * aa + d * d - 2 * d * aa * cos(degToRad(180-z))) |
|||
result = hh - Re |
|||
func columnDensity(a, z: float): float = |
|||
## Integrates density along the line of sight. |
|||
var d = 0.0 |
|||
while d < Fin: |
|||
let delta = max(Dd, Dd * d) # Adaptive step size to avoid it taking forever. |
|||
result += rho(height(a, z, d + 0.5 * delta)) * delta |
|||
d += delta |
|||
func airmass(a, z: float): float = |
|||
columnDensity(a, z) / columnDensity(a, 0) |
|||
echo "Angle 0 m 13700 m" |
|||
echo "------------------------------------" |
|||
var z = 0.0 |
|||
while z <= 90: |
|||
echo &"{z:2} {airmass(0, z):11.8f} {airmass(13700, z):11.8f}" |
|||
z += 5</lang> |
|||
{{out}} |
|||
<pre>Angle 0 m 13700 m |
|||
------------------------------------ |
|||
0 1.00000000 1.00000000 |
|||
5 1.00380963 1.00380965 |
|||
10 1.01538466 1.01538475 |
|||
15 1.03517744 1.03517765 |
|||
20 1.06399053 1.06399093 |
|||
25 1.10305937 1.10306005 |
|||
30 1.15418974 1.15419083 |
|||
35 1.21998076 1.21998246 |
|||
40 1.30418931 1.30419190 |
|||
45 1.41234169 1.41234567 |
|||
50 1.55280404 1.55281025 |
|||
55 1.73875921 1.73876915 |
|||
60 1.99212000 1.99213665 |
|||
65 2.35199740 2.35202722 |
|||
70 2.89531368 2.89537287 |
|||
75 3.79582352 3.79596149 |
|||
80 5.53885809 5.53928113 |
|||
85 10.07896219 10.08115981 |
|||
90 34.32981136 34.36666557</pre> |
|||
=={{header|Perl}}== |
=={{header|Perl}}== |