summaryrefslogtreecommitdiffstats
path: root/tcllib/modules/units/units.man
diff options
context:
space:
mode:
Diffstat (limited to 'tcllib/modules/units/units.man')
-rwxr-xr-xtcllib/modules/units/units.man392
1 files changed, 392 insertions, 0 deletions
diff --git a/tcllib/modules/units/units.man b/tcllib/modules/units/units.man
new file mode 100755
index 0000000..f736505
--- /dev/null
+++ b/tcllib/modules/units/units.man
@@ -0,0 +1,392 @@
+[comment {-*- tcl -*- doctools manpage}]
+[manpage_begin units n 1.2]
+[keywords angle]
+[keywords constants]
+[keywords conversion]
+[keywords distance]
+[keywords radians]
+[keywords unit]
+[copyright {2000-2005 Mayo Foundation}]
+[moddesc {Convert and manipulate quantities with units}]
+[titledesc {unit conversion}]
+[require Tcl 8.1]
+[require units [opt 2.1]]
+[description]
+[para]
+
+This library provides a conversion facility from a variety of
+scientific and engineering shorthand notations into floating point
+numbers. This allows application developers to easily convert
+values with different units into uniformly scaled numbers.
+
+[para]
+
+The units conversion facility is also able to convert between
+compatible units. If, for example, a application is expecting a value
+in [emph ohms] (Resistance), and the user specifies units of
+[emph milliwebers/femtocoulomb], the conversion routine will
+handle it appropriately. An error will be generated if an incorrect
+conversion is attempted.
+
+[para]
+
+Values are scaled from one set of units to another by dimensional
+analysis. Both the value units and the target units are reduced into
+primitive units and a scale factor. Units are checked for
+compatibility, and the scale factors are applied by multiplication and
+division. This technique is extremely flexible and quite robust.
+
+[para]
+
+New units and new unit abbreviations can be defined in terms of
+existing units and abbreviations. It is also possible to define a new
+primitive unit, although that will probably be unnecessary. New units
+will most commonly be defined to accommodate non-SI measurement
+systems, such as defining the unit [emph inch] as [emph "2.54 cm"].
+
+[section "COMMANDS"]
+
+[list_begin definitions]
+
+[call [cmd ::units::convert] [arg value] [arg targetUnits]]
+
+Converts the [arg value] string into a floating point number, scaled to the
+specified [arg targetUnits]. The [arg value] string may contain a
+number and units. If units are specified, then they must be
+compatible with the [arg targetUnits]. If units are not specified
+for the [arg value], then it will be scaled to the target units. For
+example,
+[example_begin]
+% ::units::convert "2.3 miles" km
+3.7014912
+% ::units::convert 300m/s miles/hour
+671.080887616
+% ::units::convert "1.0 m kg/s^2" newton
+1.0
+% ::units::convert 1.0 millimeter
+1000.0
+[example_end]
+
+[call [cmd ::units::reduce] [arg unitString]]
+
+Returns a unit string consisting of a scale factor followed by a space
+separated list of sorted and reduced primitive units. The reduced
+unit string may include a forward-slash (separated from the
+surrounding primitive subunits by spaces) indicating that the
+remaining subunits are in the denominator. Generates an error if the
+[arg unitString] is invalid.
+
+[example_begin]
+% ::units::reduce pascal
+1000.0 gram / meter second second
+[example_end]
+
+[call [cmd ::units::new] [arg name] [arg baseUnits]]
+
+Creates a new unit conversion with the specified name. The new unit
+[arg name] must be only alphabetic (upper or lower case) letters.
+The [arg baseUnits] string can consist of any valid units conversion
+string, including constant factors, numerator and denominator parts,
+units with prefixes, and exponents. The baseUnits may contain any
+number of subunits, but it must reduce to primitive units. BaseUnits
+could also be the string [emph "-primitive"] to represent a new
+kind of quantity which cannot be derived from other units. But you
+probably would not do that unless you have discovered some kind of new
+universal property.
+
+[example_begin]
+% ::units::new furlong "220 yards"
+% ::units::new fortnight "14 days"
+% ::units::convert 100m/s furlongs/fortnight
+601288.475303
+[example_end]
+
+[list_end]
+
+[section "UNIT STRING FORMAT"]
+
+Value and unit string format is quite flexible. It is possible to
+define virtually any combination of units, prefixes, and powers.
+Valid unit strings must conform to these rules.
+
+[list_begin itemized]
+
+[item]
+A unit string consists of an optional scale factor followed by zero or
+more subunits. The scale factor must be a valid floating point
+number, and may or may not be separated from the subunits. The scale
+factor could be negative.
+
+[item]
+Subunits are separated form each other by one or more separator
+characters, which are space (" "), hyphen ("-"), asterisk ("*"), and
+forward-slash ("/"). Sure, go ahead and complain about using a minus
+sign ("-") to represent multiplication. It just isn't sound
+mathematics, and, by rights, we should require everyone to use the
+asterisk ("*") to separate all units. But the bottom line is that
+complex unit strings like [emph "m-kg/s^2"] are pleasantly
+readable.
+
+[item]
+The forward-slash seperator ("/") indicates that following subunits are
+in the denominator. There can be at most one forward-slash separator.
+
+[item]
+Subunits can be floating point scale factors, but with the exception
+of the leading scale factor, they must be surrounded by valid
+separators. Subunit scale factors cannot be negative. (Remember that
+the hyphen is a unit separator.)
+
+[item]
+Subunits can be valid units or abbreviations. They may include a
+prefix. They may include a plural suffix "s" or "es". They may also
+include a power string denoted by a circumflex ("^"), followed by a
+integer, after the unit name (or plural suffix, if there is one).
+Negative exponents are not allowed. (Remember that the hyphen is a
+unit separator.)
+
+[list_end]
+
+[subsection "Example Valid Unit Strings"]
+
+[example_begin]
+Unit String Reduced Unit String
+------------------------------------------------------------
+meter 1.0 meter
+kilometer 1000.0 meter
+km 1000.0 meter
+km/s 1000.0 meter / second
+/microsecond 1000000.0 / second
+/us 1000000.0 / second
+kg-m/s^2 1000.0 gram meter / second second
+30second 30.0 second
+30 second 30.0 second
+30 seconds 30.0 second
+200*meter/20.5*second 9.75609756098 meter / second
+[example_end]
+
+[section "SI UNITS"]
+
+[para]
+
+The standard SI units are predefined according to [emph "NIST Special
+Publication 330"]. Standard units for both SI Base Units (Table
+1) and SI Derived Units with Special Names (Tables 3a and 3b) are
+included here for reference. Each standard unit name and abbreviation
+are included in this package.
+
+[subsection "SI Base Units"]
+
+[example_begin]
+Quantity Unit Name Abbr.
+---------------------------------------------
+Length meter m
+Mass kilogram kg
+Time second s
+Current ampere A
+Temperature kelvin K
+Amount mole mol
+Luminous Intensity candela cd
+[example_end]
+
+[subsection "SI Derived Units with Special Names"]
+
+[example_begin]
+Quantity Unit Name Abbr. Units Base Units
+--------------------------------------------------------------------
+plane angle radian rad m/m m/m
+solid angle steradian sr m^2/m^2 m^2/m^2
+frequency hertz Hz /s
+force newton N m-kg/s^2
+pressure pascal Pa N/m^2 kg/m-s^2
+energy, work joule J N-m m^2-kg/s^2
+power, radiant flux watt W J/s m^2-kg/s^3
+electric charge coulomb C s-A
+electric potential volt V W/A m^2-kg/s^3-A
+capacitance farad F C/V s^4-A^2/m^2-kg
+electric resistance ohm V/A m^2-kg/s^3-A^2
+electric conductance siemens S A/V s^3-A^2/m^2-kg
+magnetic flux weber Wb V-s m^2-kg/s^2-A
+magnetic flux density tesla T Wb/m^2 kg/s^2-A
+inductance henry H Wb/A m^2-kg/s^2-A^2
+luminous flux lumen lm cd-sr
+illuminance lux lx lm/m^2 cd-sr/m^2
+activity (of a
+radionuclide) becquerel Bq /s
+absorbed dose gray Gy J/kg m^2/s^2
+dose equivalent sievert Sv J/kg m^2/s^2
+[example_end]
+
+[para]
+
+Note that the SI unit kilograms is actually implemented as grams
+because 1e-6 kilogram = 1 milligram, not 1 microkilogram. The
+abbreviation for Electric Resistance (ohms), which is the omega
+character, is not supported.
+
+[para]
+
+Also note that there is no support for Celsius or Farenheit
+temperature. The units conversion routines can only scale values
+with multiplication and division, so it is not possible to convert
+from thermodynamic temperature (kelvins) to absolute degrees Celsius
+or Farenheit. Conversion of thermodynamic quantities, such as
+thermal expansion (per unit temperature), however, are easy to add
+to the units library.
+
+[para]
+
+SI Units can have a multiple or sub-multiple prefix. The prefix or its
+abbreviation should appear before the unit, without spaces. Compound
+prefixes are not allowed, and a prefix should never be used alone.
+These prefixes are defined in Table 5 of [emph "Special Publication
+330"].
+
+[subsection "SI Prefixes"]
+
+[example_begin]
+Prefix Name Abbr. Factor
+---------------------------------------
+yotta Y 1e24
+zetta Z 1e21
+exa E 1e18
+peta P 1e15
+tera T 1e12
+giga G 1e9
+mega M 1e6
+kilo k 1e3
+hecto h 1e2
+deka da 1e1
+deca 1e1
+
+deci d 1e-1
+centi c 1e-2
+milli m 1e-3
+micro u 1e-6
+nano n 1e-9
+pico p 1e-12
+femto f 1e-15
+atto a 1e-18
+zepto z 1e-21
+yocto y 1e-24
+[example_end]
+
+[para]
+
+Note that we define the same prefix with both the USA ("deka") and
+non-USA ("deca") spellings. Also note that we take the liberty of
+allowing "micro" to be typed as a "u" instead of the Greek character
+mu.
+
+[para]
+
+Many non-SI units are commonly used in applications. Appendix B.8 of
+[emph "NIST Special Publication 811"] lists many non-SI conversion
+factors. It is not possible to include all possible unit definitions
+in this package. In some cases, many different conversion factors
+exist for a given unit, depending on the context. (The appendix lists
+over 40 conversions for British thermal units!) Application specific
+conversions can always be added using the [cmd new]
+command, but some well known and often used conversions are included
+in this package.
+
+[subsection "Non-SI Units"]
+
+[example_begin]
+Unit Name Abbr. Base Units
+--------------------------------------------------
+angstrom 1.0E-10 m
+astronomicalUnit AU 1.495979E11 m
+atmosphere 1.01325E5 Pa
+bar 1.0E5 Pa
+calorie 4.1868 J
+curie 3.7E10 Bq
+day 8.64E4 s
+degree 1.745329E-2 rad
+erg 1.0E-7 J
+faraday 9.648531 C
+fermi 1.0E-15 m
+foot ft 3.048E-1 m
+gauss 1.0E-4 T
+gilbert 7.957747E-1 A
+grain gr 6.479891E-5 kg
+hectare ha 1.0E4 m^2
+hour h 3.6E3 s
+inch in 2.54E-2 m
+lightYear 9.46073E15 m
+liter L 1.0E-3 m^3
+maxwell Mx 1.0E-8 Wb
+mho 1.0 S
+micron 1.0E-6 m
+mil 2.54E-5 m
+mile mi 1.609344E3 m
+minute min 6.0E1 s
+parsec pc 3.085E16 m
+pica 4.233333E-3 m
+pound lb 4.535924E-1 kg
+revolution 6.283185 rad
+revolutionPerMinute rpm 1.047198E-1 rad/s
+yard yd 9.144E-1 m
+year 3.1536E7 s
+[example_end]
+
+[subsection "Quantities and Derived Units with Special Names"]
+
+This units conversion package is limited specifically to unit
+reduction, comparison, and scaling. This package does not consider
+any of the quantity names for either base or derived units. A similar
+implementation or an extension in a typed or object-oriented language
+might introduce user defined types for the quantities. Quantity type
+checking could be used, for example, to ensure that all
+[emph "length"] values properly reduced to [emph "meters"], or
+that all [emph "velocity"] values properly reduced to
+[emph "meters/second"].
+
+[para]
+
+A C implementation of this package has been created to work in
+conjunction with the Simplified Wrapper Interface Generator
+([uri http://www.swig.org/]). That package (units.i) exploits SWIG's typemap
+system to automatically convert script quantity strings into floating
+point quantities. Function arguments are specified as quantity types
+(e.g., [emph "typedef float Length"]), and target units (expected
+by the C application code) are specified in an associative array.
+Default units are also defined for each quantity type, and are applied
+to any unit-less quantity strings.
+
+[para]
+
+A units system enhanced with quantity type checking might benefit from
+inclusion of other derived types which are expressed in terms of
+special units, as illustrated in Table 2 of [emph "NIST Publication
+330"]. The quantity [emph "area"], for example, could be
+defined as units properly reducing to [emph "meter^2"], although
+the utility of defining a unit named [emph "square meter"] is
+arguable.
+
+[section "REFERENCES"]
+
+The unit names, abbreviations, and conversion values are derived from
+those published by the United States Department of Commerce Technology
+Administration, National Institute of Standards and Technology (NIST)
+in [emph "NIST Special Publication 330: The International System of
+Units (SI)"] and [emph "NIST Special Publication 811: Guide for
+the Use of the International System of Units (SI)"]. Both of
+these publications are available (as of December 2000) from
+[uri http://physics.nist.gov/cuu/Reference/contents.html]
+
+[para]
+
+The ideas behind implementation of this package is based in part on
+code written in 1993 by Adrian Mariano which performed dimensional
+analysis of unit strings using fixed size tables of C structs. After
+going missing in the late 1990's, Adrian's code has reappeared in the
+GNU Units program at [uri http://www.gnu.org/software/units/]
+
+[section "AUTHORS"]
+
+Robert W. Techentin
+
+[vset CATEGORY units]
+[include ../doctools2base/include/feedback.inc]
+[manpage_end]