./physics.rb

download original
include Math

PIx2 = 2*PI


# angles. base unit: rad
deg=PI/180.0
arcmin=deg/60.0
arcsec=arcmin/60.0

# times. base unit: second
sec=1.0
msec=sec/1000.0
usec=msec/1000.0
nsec=usec/1000.0
min=60.0
hr=60*min
day=24*hr
year=365*day

# distances. base unit: meter
meter=1.0
cm=1e-2
mm=1e-3
um=1e-6
nm=1e-9
km=1000.0
au=149.6e6*km
pc=au/arcsec

r_earth=6371*km

r_sun=1.392e6*km/2

rrad_sun=r_sun/au

# volumes. base unit: m^3
m3=meter**3
litre=(10*cm)**3
barrel=119.240471*litre

# velocities. base unit: meters/sec
m_per_s=meter/sec
kmh=km/hr
c=299792458.0

# distance
ly=c*year


# mass, base unit: kg
kg=1.0
gram=0.001*kg
ton=1000.0*kg



# masses. base unit: kg
kg=1.0
grams=1e-3
tons=1e3
m_earth=5.975e24
m_sun=1.985e30
m_proton=1.672621777e-27
m_electron=9.10938291e-31
m_neutron=1.674927351e-27

# energies, base unit: joule
j=1.0
ws=j
kj=1000.0*j
mj=1000.0*kj
gj=1000.0*mj
tj=1000.0*gj
pj=1000.0*tj
wh=3600.0*ws
kwh=1000.0*wh
mwh=1000.0*kwh
gwh=1000.0*mwh
twh=1000.0*gwh
tons_tnt=4.184*gj
kiloton_tnt=1000.0*tons_tnt
megaton_tnt=1000.0*kiloton_tnt
gigaton_tnt=1000.0*megaton_tnt

# very approximate; http://impact.ese.ic.ac.uk/ImpactEffects/Chicxulub.html
dinosaur_killer_impact_energy=1.3e8*megaton_tnt

# charges, base unit: coulomb
coulomb=1.0
el_charge=1.602176565e-19

# energies
ev=el_charge
kev=1000.0*ev
mev=1000.0*kev
gev=1000.0*mev
tev=1000.0*gev

# misc
ly=c*year
g=9.81
G=6.673e-11



def sterad_circle(rrad)
  2*PI*(1-cos(rrad))
end


# area of right-angled spherical triangle with legs l1,l2
def sterad_triangle_rangled(l1,l2)
  beta=acot(sin(l1)/tan(l2))
  gamma=acot(sin(l2)/tan(l1))
  beta+gamma-PI/2
end

# spherical rectangle
def sterad_rect(s1,s2)
  4*sterad_triangle_rangled(s1/2,s2/2)+4*sterad_triangle_rangled(s2/2,s1/2)
end

# http://en.wikipedia.org/wiki/Angular_resolution
def telescope_resolution(d, lambda=625e-9)
  1.22*lambda/d
end


def telescope_diameter(angular_res, lambda=625e-9)
  1.22*lambda/angular_res
end


def cot(x)
  tan(PI/2-x)
end

def asin(x)
  atan2(x, sqrt(1.0-x*x))
end

def acos(x)
  atan2(sqrt(1.0-x*x), x)
end

def acot(x)
  PI/2-atan(x)
end


# [h,min,sec] => Bogenmass
def hms2rad(hms)
  h,m,s = hms
  PIx2 * (h/24.0 + m/(24.0*60) + s/(24.0*60*60))
end

# umgekehrt
def rad2hms(rad)
  h = rad.abs/PIx2*24.0
  m = (h-h.floor)*60
  s = (m-m.floor)*60
  if rad > 0 then
    [h.floor,m.floor,s]
  else
    [-h.floor,-m.floor,-s]
  end
end


def h2hms(h)
  m = (h.abs-h.abs.floor)*60
  s = (m-m.floor)*60
  if h > 0 then
    [h.abs.floor,m.floor,s]
  else
    [-h.abs.floor,-m.floor,-s]
  end
end

def hms2h(hms)
  h,m,s = hms
  h + m/60.0 + s/(60.0*60.0)
end


# [Grad,min,sec] => Bogenmass
def dms2rad(dms)
  d,m,s = dms
  PIx2 * ( d/360.0 + m/(360.0*60) + s/(360.0*60*60))
end

# umgekehrt
def rad2dms(rad)
  d = rad.abs/PIx2*360.0
  m = (d-d.floor)*60
  s = (m-m.floor)*60
  if rad>0 then
    [d.floor,m.floor,s]
  else
    [-d.floor,-m.floor,-s]
  end
end

def rad2deg(rad)
  rad/PI*180
end



module Enumerable
  def sum
    inject(0) {|x,y|x+y}
  end

  def prod
    inject(1) {|x,y|x*y}
  end
end


# stochastics

def fac(x)
  res=1
  (1..x).each{|i| res*=i}
  res
end


def over(x,y)
  # fac(x)/fac(x-y)/fac(y)
  ((x-y+1)..x).prod / fac(y)
end

  
back to .

(C) 1998-2017 Olaf Klischat <olaf.klischat@gmail.com>