Packages

An Elixir unit conversion calculator inspired by the Unix `units` utility. Parses and evaluates unit expressions with locale-aware output powered by Localize.

Current section

Files

Jump to
unity lib unity conversion astronomy.ex
Raw

lib/unity/conversion/astronomy.ex

defmodule Unity.Conversion.Astronomy do
@moduledoc """
Nonlinear conversions for astronomical magnitude and surface
brightness scales.
"""
# ── Visual magnitude ────────────────────────────────────────────
# vmag(m) = 2.54e-6 lux * 10^(-0.4 * m) → lux (cd·sr/m² in SI)
@vmag_ref 2.54e-6
@doc "Visual magnitude to illuminance in lux."
def vmag_forward(mag), do: @vmag_ref * :math.pow(10, -0.4 * mag)
def vmag_inverse(lux), do: -2.5 * :math.log10(lux / @vmag_ref)
# ── Surface brightness per solid angle ──────────────────────────
# SB_degree(m) = vmag(m) / squaredegree → cd/m² (luminance)
# SB_minute(m) = vmag(m) / squareminute → cd/m²
# SB_second(m) = vmag(m) / squaresecond → cd/m²
# SB_sr(m) = vmag(m) / steradian → cd/m²
@squaredegree 3.0461741978670857e-4
@squareminute 8.461594994075239e-8
@squaresecond 2.3504430539097885e-11
@steradian 1.0
@doc "Surface brightness (mag/deg²) to luminance in cd/m²."
def sb_degree_forward(mag), do: vmag_forward(mag) / @squaredegree
def sb_degree_inverse(l), do: vmag_inverse(l * @squaredegree)
@doc "Surface brightness (mag/arcmin²) to luminance in cd/m²."
def sb_minute_forward(mag), do: vmag_forward(mag) / @squareminute
def sb_minute_inverse(l), do: vmag_inverse(l * @squareminute)
@doc "Surface brightness (mag/arcsec²) to luminance in cd/m²."
def sb_second_forward(mag), do: vmag_forward(mag) / @squaresecond
def sb_second_inverse(l), do: vmag_inverse(l * @squaresecond)
@doc "Surface brightness (mag/sr) to luminance in cd/m²."
def sb_sr_forward(mag), do: vmag_forward(mag) / @steradian
def sb_sr_inverse(l), do: vmag_inverse(l * @steradian)
end