{-# LANGUAGE NoImplicitPrelude #-}
module Number.SI.Unit where
import qualified Algebra.Transcendental as Trans
import qualified Algebra.Field as Field
import qualified Number.Physical.Unit as Unit
import qualified Number.Physical.UnitDatabase as UnitDatabase
import Number.Physical.UnitDatabase(initScale, initUnitSet)
import Data.Maybe(catMaybes)
import NumericPrelude.Base hiding (length)
import NumericPrelude.Numeric hiding (one)
data Dimension =
Length | Time | Mass | Charge |
Angle | Temperature | Information
deriving (Eq, Ord, Enum, Show)
angle, angularSpeed,
length, distance, area, volume, time,
frequency, speed, acceleration, mass,
force, pressure, energy, power,
charge, current, voltage, resistance,
capacitance, temperature,
information, dataRate
:: Unit.T Dimension
length = Unit.fromVector [ 1, 0, 0, 0, 0, 0, 0]
distance = Unit.fromVector [ 1, 0, 0, 0, 0, 0, 0]
area = Unit.fromVector [ 2, 0, 0, 0, 0, 0, 0]
volume = Unit.fromVector [ 3, 0, 0, 0, 0, 0, 0]
time = Unit.fromVector [ 0, 1, 0, 0, 0, 0, 0]
frequency = Unit.fromVector [ 0,-1, 0, 0, 0, 0, 0]
speed = Unit.fromVector [ 1,-1, 0, 0, 0, 0, 0]
acceleration = Unit.fromVector [ 1,-2, 0, 0, 0, 0, 0]
mass = Unit.fromVector [ 0, 0, 1, 0, 0, 0, 0]
force = Unit.fromVector [ 1,-2, 1, 0, 0, 0, 0]
pressure = Unit.fromVector [-1,-2, 1, 0, 0, 0, 0]
energy = Unit.fromVector [ 2,-2, 1, 0, 0, 0, 0]
power = Unit.fromVector [ 2,-3, 1, 0, 0, 0, 0]
charge = Unit.fromVector [ 0, 0, 0, 1, 0, 0, 0]
current = Unit.fromVector [ 0,-1, 0, 1, 0, 0, 0]
voltage = Unit.fromVector [ 2,-2, 1,-1, 0, 0, 0]
resistance = Unit.fromVector [ 2,-1, 1,-2, 0, 0, 0]
capacitance = Unit.fromVector [-2, 2,-1, 2, 0, 0, 0]
angle = Unit.fromVector [ 0, 0, 0, 0, 1, 0, 0]
angularSpeed = Unit.fromVector [ 0,-1, 0, 0, 1, 0, 0]
temperature = Unit.fromVector [ 0, 0, 0, 0, 0, 1, 0]
information = Unit.fromVector [ 0, 0, 0, 0, 0, 0, 1]
dataRate = Unit.fromVector [ 0,-1, 0, 0, 0, 0, 1]
percent, fourth, half, threeFourth :: Field.C a => a
secondsPerMinute, secondsPerHour, secondsPerDay, secondsPerYear,
meterPerInch, meterPerFoot, meterPerYard,
meterPerAstronomicUnit, meterPerParsec,
accelerationOfEarthGravity,
k2, deg180, grad200, bytesize :: Field.C a => a
radPerDeg, radPerGrad :: Trans.C a => a
mach, speedOfLight, electronVolt,
calorien, horsePower :: Field.C a => a
yocto, zepto, atto, femto, pico,
nano, micro, milli, centi, deci,
one, deca, hecto, kilo, mega,
giga, tera, peta, exa, zetta, yotta :: Field.C a => a
percent = 0.01
fourth = 0.25
half = 0.50
threeFourth = 0.75
secondsPerMinute = 60
secondsPerHour = 60*secondsPerMinute
secondsPerDay = 24*secondsPerHour
secondsPerYear = 365.2422*secondsPerDay
meterPerInch = 0.0254
meterPerFoot = 0.3048
meterPerYard = 0.9144
meterPerAstronomicUnit = 149.6e6
meterPerParsec = 30.857e12
k2 = 1024
deg180 = 180
grad200 = 200
radPerDeg = pi/deg180;
radPerGrad = pi/grad200;
bytesize = 8
accelerationOfEarthGravity = 9.80665
mach = 332.0
speedOfLight = 299792458.0
electronVolt = 1.602e-19
calorien = 4.19
horsePower = 736.0
yocto = 1.0e-24
zepto = 1.0e-21
atto = 1.0e-18
femto = 1.0e-15
pico = 1.0e-12
nano = 1.0e-9
micro = 1.0e-6
milli = 1.0e-3
centi = 1.0e-2
deci = 1.0e-1
one = 1.0e0
deca = 1.0e1
hecto = 1.0e2
kilo = 1.0e3
mega = 1.0e6
giga = 1.0e9
tera = 1.0e12
peta = 1.0e15
exa = 1.0e18
zetta = 1.0e21
yotta = 1.0e24
databaseRead, databaseShow :: Trans.C a => UnitDatabase.T Dimension a
databaseRead = map UnitDatabase.createUnitSet database
databaseShow =
map UnitDatabase.createUnitSet $
catMaybes $ map UnitDatabase.showableUnit database
database :: Trans.C a => [UnitDatabase.InitUnitSet Dimension a]
database = [
(initUnitSet Unit.scalar False [
(initScale "pi" pi False False),
(initScale "e" (exp 1) False False),
(initScale "i" (sqrt (-1)) False False),
(initScale "%" percent False False),
(initScale "\188" fourth False False),
(initScale "\189" half False False),
(initScale "\190" threeFourth False False)
]),
(initUnitSet angle False [
(initScale "''" (radPerDeg/secondsPerHour) True False),
(initScale "'" (radPerDeg/secondsPerMinute) True False),
(initScale "grad" radPerGrad False False),
(initScale "\176" radPerDeg True True ),
(initScale "rad" one False False)
]),
(initUnitSet frequency True [
(initScale "bpm" (one/secondsPerMinute) False False),
(initScale "Hz" one True True ),
(initScale "kHz" kilo True False),
(initScale "MHz" mega True False),
(initScale "GHz" giga True False)
]),
(initUnitSet time False [
(initScale "ns" nano True False),
(initScale "\181s" micro True False),
(initScale "ms" milli True False),
(initScale "s" one True True ),
(initScale "min" secondsPerMinute True False),
(initScale "h" secondsPerHour True False),
(initScale "d" secondsPerDay True False),
(initScale "a" secondsPerYear True False)
]),
(initUnitSet length False [
(initScale "nm" nano True False),
(initScale "\181m" micro True False),
(initScale "mm" milli True False),
(initScale "cm" centi True False),
(initScale "dm" deci True False),
(initScale "m" one True True ),
(initScale "km" kilo True False)
]),
(initUnitSet area False [
(initScale "ha" (hecto*hecto) False False)
]),
(initUnitSet volume False [
(initScale "ml" (milli*milli) False False),
(initScale "cl" (milli*centi) False False),
(initScale "l" milli False False)
]),
(initUnitSet speed False [
(initScale "mach" mach False False),
(initScale "c" speedOfLight False False)
]),
(initUnitSet acceleration False [
(initScale "G" accelerationOfEarthGravity False False)
]),
(initUnitSet mass False [
(initScale "\181g" nano True False),
(initScale "mg" micro True False),
(initScale "g" milli True False),
(initScale "kg" one True True ),
(initScale "dt" hecto True False),
(initScale "t" kilo True False),
(initScale "kt" mega True False)
]),
(initUnitSet force False [
(initScale "N" one True True ),
(initScale "kp" accelerationOfEarthGravity False False),
(initScale "kN" kilo True False)
]),
(initUnitSet pressure False [
(initScale "Pa" one True True ),
(initScale "mbar" hecto False False),
(initScale "kPa" kilo True False),
(initScale "bar" (hecto*kilo) False False)
]),
(initUnitSet energy False [
(initScale "eV" electronVolt False False),
(initScale "J" one True True ),
(initScale "cal" calorien False False),
(initScale "kJ" kilo True False),
(initScale "kcal" (kilo*calorien) False False),
(initScale "MJ" mega True False)
]),
(initUnitSet power False [
(initScale "mW" milli True False),
(initScale "W" one True True ),
(initScale "HP" horsePower False False),
(initScale "kW" kilo True False),
(initScale "MW" mega True False)
]),
(initUnitSet charge False [
(initScale "C" one True True )
]),
(initUnitSet current False [
(initScale "\181A" micro True False),
(initScale "mA" milli True False),
(initScale "A" one True True )
]),
(initUnitSet voltage False [
(initScale "mV" milli True False),
(initScale "V" one True True ),
(initScale "kV" kilo True False),
(initScale "MV" mega True False),
(initScale "GV" giga True False)
]),
(initUnitSet resistance False [
(initScale "Ohm" one True True ),
(initScale "kOhm" kilo True False),
(initScale "MOhm" mega True False)
]),
(initUnitSet capacitance False [
(initScale "pF" pico True False),
(initScale "nF" nano True False),
(initScale "\181F" micro True False),
(initScale "mF" milli True False),
(initScale "F" one True True )
]),
(initUnitSet temperature False [
(initScale "K" one True True )
]),
(initUnitSet information False [
(initScale "bit" one True True ),
(initScale "B" bytesize True False),
(initScale "kB" (kilo*bytesize) False False),
(initScale "KB" (k2*bytesize) True False),
(initScale "MB" (k2*k2*bytesize) True False),
(initScale "GB" (k2*k2*k2*bytesize) True False)
]),
(initUnitSet dataRate True [
(initScale "baud" one True True ),
(initScale "kbaud" kilo False False),
(initScale "Kbaud" k2 True False),
(initScale "Mbaud" (k2*k2) True False),
(initScale "Gbaud" (k2*k2*k2) True False)
])
]