\ 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