\ cora.fs -- Cora Phyco package of conversion ratios and physical constants
\ Version 1
\ 2005/9/9 David Meyer

\ Cora Phyco provides a Forth environment to facilitate conversion of
\ quantities among a large variety of measurement units and systems.
\ Inspired by Frink by Allan Eliasen.
\ This version creates a word for each measurement unit that both holds the
\ unit's conversion factor and converts the quantity at TOS. Physical constants
\ are represented as Forth constants.

( Loading Cora Phyco version 1 ...)

\ Pending unit conversion flag
VARIABLE <cvt>  FALSE <cvt> !

\ Pending display engineering notation flag
VARIABLE <eng>  FALSE <eng> !

\ Store unit conversion factor r as float. On reference convert r1 quantity to
\ r2 standard units or display r1 quantity converted to target units.
: unit  ( r "name" -- )
  CREATE  F,
DOES>  ( r1 -- r2| )
  <cvt> @
     IF  F@ F/  <eng> @  IF FE.  FALSE <eng> !  ELSE F. THEN  FALSE <cvt> !
     ELSE  F@ F*  THEN ;

\ Set conversion flag
: ->  ( -- )  TRUE <cvt> ! ;

\ Set conversion and engineering notation flags
: ->e  ( -- )  TRUE DUP <cvt> !  <eng> ! ;


\ Physical constants (standard units)

2e0 pi F*       FCONSTANT  circle       \ radians per full circle angle
299792458e0     FCONSTANT  c            \ speed of light in vacuum (m/s)

\ Speed (standard unit: m/s (meters per second)

1e0             unit  m/s       \ meters per second (standard)

331.46e0        unit  mach      \ speed of sound in dry air at STP

\ Acceleration (standard unit: m/s^2 (meters per second per second)

1e0             unit  m/s^2     \ meters per second per second (standard)

980665e-5       unit  gee       \ standard gravitational acceleration

\ Time (standard unit: s (second))

1e0             unit  s         \ second (standard)
60e0 60e0 F*    unit  hr        \ hour
24e0 hr         unit  day       \ day

\ Angular measure (standard unit: radian (dimensionless))

circle 360e0 F/ unit  deg       \ degree
1e0 deg 60e0 F/ unit  amin      \ arc minute
1e0 amin 60e0 F/        unit  asec      \ arc second

\ Linear measure (standard unit: m (meter))

1e0             unit  m         \ meter (standard)
1e3             unit  km        \ kilometer
1e-2            unit  cm        \ centimeter
1e-3            unit  mm        \ millimeter

3048e-4         unit  ft        \ foot
1e0 ft 12e0 F/  unit  in        \ inch
3e0 ft          unit  yd        \ yard
5280e0 ft       unit  mi        \ mile
1852e0          unit  nmi       \ nautical mile

149597870691e0  unit  au        \ astronomical unit
365.25e0 day c F*       unit  ly        \ light year
1e0 au 1e0 asec F/      unit  pc        \ parsec

\ Area (standard unit: m^2 (square meter))

1e0             unit  m^2       \ square meter (standard)
1e0 ft 2e0 F**  unit  ft^2      \ square feet
43560e0 ft^2    unit  acre      \ acre
1e2             unit  are       \ are
1e4             unit  hectare   \ hectare

\ Volume (standard unit: m^3 (cubic meter))

1e0             unit  m^3       \ cubic meter (standard)
1e-6            unit  cc        \ cubic centimeter
1e0 in 3e0 F**  unit  in^3      \ cubic inch
231e0 in^3      unit  gal       \ gallon
1e0 gal 4e0 F/  unit  qt        \ quart
1e0 qt 2e0 F/   unit  pt        \ pint
1e0 pt 16e0 F/  unit  floz      \ fluid ounce
42e0 gal        unit  bbl       \ petroleum barrel
8e0 floz        unit  cup       \ cup
1e0 cup 16e0 F/ unit  tbsp      \ tablespoon
1e0 tbsp 3e0 F/ unit  tsp       \ teaspoon
1e3 cc          unit  l         \ liter
1e0 cc          unit  ml        \ milliliter

\ Mass (standard unit: kg (kilogram))

1e0             unit  kg        \ kilogram (standard)
1e-3            unit  g         \ gram
1e3             unit  mt        \ tonne, metric ton

45359237e-8     unit  lb        \ pound
2e3 lb          unit  t         \ ton
1e0 lb 16e0 F/  unit  oz        \ ounce

\ Temperature (standard system: Kelvin)

1e0             unit  kel       \ Kelvin (standard)

5e0 9e0 f/      FCONSTANT  degfah       \ Fahrenheit degree
255.372e0       FCONSTANT  0fah         \ 0 degrees Fahrenheit

273.15e0        FCONSTANT  0cel         \ 0 degrees Celsius

: fah  ( r1 -- r2| )
  <cvt> @
     IF 0fah F- degfah F/ F.  FALSE <cvt> !
     ELSE degfah F* 0fah F+  THEN ;

: cel  ( r1 -- r2| )
  <cvt> @
     IF 0cel F- F.  FALSE <cvt> !
     ELSE 0cel F+  THEN ;


( done) cr