All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ucar.units.SI Maven / Gradle / Ivy

Go to download

The NetCDF-Java Library is a Java interface to NetCDF files, as well as to many other types of scientific data formats.

There is a newer version: 4.3.22
Show newest version
// $Id: SI.java 64 2006-07-12 22:30:50Z edavis $
/*
 * Copyright 1998-2009 University Corporation for Atmospheric Research/Unidata
 *
 * Portions of this software were developed by the Unidata Program at the
 * University Corporation for Atmospheric Research.
 *
 * Access and use of this software shall impose the following obligations
 * and understandings on the user. The user is granted the right, without
 * any fee or cost, to use, copy, modify, alter, enhance and distribute
 * this software, and any derivative works thereof, and its supporting
 * documentation for any purpose whatsoever, provided that this entire
 * notice appears in all copies of the software, derivative works and
 * supporting documentation.  Further, UCAR requests that the user credit
 * UCAR/Unidata in any publications that result from the use of this
 * software or in any product that includes this software. The names UCAR
 * and/or Unidata, however, may not be used in any advertising or publicity
 * to endorse or promote any products or commercial entity unless specific
 * written permission is obtained from UCAR/Unidata. The user also
 * understands that UCAR/Unidata is not obligated to provide the user with
 * any support, consulting, training or assistance of any kind with regard
 * to the use, operation and performance of this software nor to provide
 * the user with any updates, revisions, new versions or "bug fixes."
 *
 * THIS SOFTWARE IS PROVIDED BY UCAR/UNIDATA "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL UCAR/UNIDATA BE LIABLE FOR ANY SPECIAL,
 * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
 * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
 * WITH THE ACCESS, USE OR PERFORMANCE OF THIS SOFTWARE.
 */
package ucar.units;

/**
 * Provides support for the International System of Units (SI). A good on-line
 * reference for the SI can be found at .
 * 
 * @author Steven R. Emmerson
 * @version $Id: SI.java 64 2006-07-12 22:30:50Z edavis $
 */
public final class SI extends UnitSystemImpl {
	private static final long		serialVersionUID	= 1L;

	/*
	 * The singleton instance.
	 * 
	 * @serial
	 */
	private static/* final */SI		si;

	/*
	 * Units corresponding to base quantities:
	 */

	/**
	 * The unit corresponding to the quantity of amount of substance.
	 */
	public static final Unit		AMOUNT_OF_SUBSTANCE_UNIT;

	/**
	 * The unit corresponding to the quantity of electric current.
	 */
	public static final Unit		ELECTRIC_CURRENT_UNIT;

	/**
	 * The unit corresponding to the quantity of length.
	 */
	public static final Unit		LENGTH_UNIT;

	/**
	 * The unit corresponding to the quantity of luminous intensity.
	 */
	public static final Unit		LUMINOUS_INTENSITY_UNIT;

	/**
	 * The unit corresponding to the quantity of mass.
	 */
	public static final Unit		MASS_UNIT;

	/**
	 * The unit corresponding to the quantity of plane angle.
	 */
	public static final Unit		PLANE_ANGLE_UNIT;

	/**
	 * The unit corresponding to the quantity of solid angle.
	 */
	public static final Unit		SOLID_ANGLE_UNIT;

	/**
	 * The unit corresponding to the quantity of thermodynamic temperature.
	 */
	public static final Unit		THERMODYNAMIC_TEMPERATURE_UNIT;

	/**
	 * The unit corresponding to the quantity of time.
	 */
	public static final Unit		TIME_UNIT;

	/*
	 * Base units:
	 */

	/**
	 * Base unit of electric current. The ampere is that constant current which,
	 * if maintained in two straight parallel conductors of infinite length, of
	 * negligible circular cross section, and placed 1 meter apart in vacuum,
	 * would produce between these conductors a force equal to 2 x 10^-7 newton
	 * per meter of length.
	 */
	public static final BaseUnit	AMPERE;

	/**
	 * Base unit of luminous intensity. The candela is the luminous intensity,
	 * in a given direction, of a source that emits monochromatic radiation of
	 * frequency 540 x 10^12 hertz and that has a radiant intensity in that
	 * direction of (1/683) watt per steradian.
	 */
	public static final BaseUnit	CANDELA;

	/**
	 * Base unit of thermodynamic temperature. The kelvin, unit of thermodynamic
	 * temperature, is the fraction 1/273.16 of the thermodynamic temperature of
	 * the triple point of water.
	 */
	public static final BaseUnit	KELVIN;

	/**
	 * Base unit of mass. The kilogram is the unit of mass; it is equal to the
	 * mass of the international prototype of the kilogram.
	 */
	public static final BaseUnit	KILOGRAM;

	/**
	 * Base unit of length. The meter is the length of the path travelled by
	 * light in vacuum during a time interval of 1/299 792 458 of a second.
	 */
	public static final BaseUnit	METER;							// NIST

	/**
	 * Synonym for METER.
	 */
	public static final BaseUnit	METRE;							// ISO

	/**
	 * Base unit of amount of substance. The mole is the amount of substance of
	 * a system which contains as many elementary entities as there are atoms in
	 * 0.012 kilogram of carbon 12.
	 */
	public static final BaseUnit	MOLE;

	/**
	 * Base unit of time. The second is the duration of 9 192 631 770 periods of
	 * the radiation corresponding to the trasition between the two hyperfine
	 * levels of the ground state of the cesium-133 atom.
	 */
	public static final BaseUnit	SECOND;

	/*
	 * Supplementary units: These units are more accurately referred to as
	 * "dimensionless derived units" -- for the purposes of this Java package,
	 * however, they are BaseUnit-s. Note, however, that their 
	 * isDimensionless() method will return true.
	 */

	/**
	 * Base unit of angular measure. The radian is the plane angle between two
	 * radii of a circle that cut off on the circumference an arc equal in
	 * length to the radius.
	 */
	public static final BaseUnit	RADIAN;

	/**
	 * Base unit of solid angle. The steradian is the solid angle that, having
	 * its vertex in the center of a sphere, cuts off an area on the surface of
	 * the sphere equal to that of a square with sides of length equal to the
	 * radius of the sphere.
	 */
	public static final BaseUnit	STERADIAN;

	/*
	 * Derived units with special names and symbols:
	 */

	/**
	 * Special derived unit for the quantity of frequency.
	 */
	public static final Unit		HERTZ;

	/**
	 * Special derived unit for the quantity of force.
	 */
	public static final Unit		NEWTON;

	/**
	 * Special derived unit for the quantity of pressure or stress.
	 */
	public static final Unit		PASCAL;

	/**
	 * Special derived unit for the quantity of energy, work, or quantity of
	 * heat.
	 */
	public static final Unit		JOULE;

	/**
	 * Special derived unit for the quantity of power or radiant flux.
	 */
	public static final Unit		WATT;

	/**
	 * Special derived unit for the quantity of electric charge or quantity of
	 * electricity.
	 */
	public static final Unit		COULOMB;

	/**
	 * Special derived unit for the quantity of electric potential, potential
	 * difference, or electromotive force.
	 */
	public static final Unit		VOLT;

	/**
	 * Special derived unit for the quantity of electric capacitance.
	 */
	public static final Unit		FARAD;

	/**
	 * Special derived unit for the quantity of electric resistance.
	 */
	public static final Unit		OHM;

	/**
	 * Special derived unit for the quantity of electric conductance.
	 */
	public static final Unit		SIEMENS;

	/**
	 * Special derived unit for the quantity of magnetic flux.
	 */
	public static final Unit		WEBER;

	/**
	 * Special derived unit for the quantity of magnetic flux density.
	 */
	public static final Unit		TESLA;

	/**
	 * Special derived unit for the quantity of inductance.
	 */
	public static final Unit		HENRY;

	/**
	 * Special derived unit for the quantity of Celsius temperature.
	 */
	public static final Unit		DEGREE_CELSIUS;

	/**
	 * Special derived unit for the quantity of luminous flux.
	 */
	public static final Unit		LUMEN;

	/**
	 * Special derived unit for the quantity of illuminance.
	 */
	public static final Unit		LUX;

	/*
	 * Derived units with special names and symbols admitted for reasons of
	 * safegarding human health.
	 */

	/**
	 * Special derived unit for the quantity of activity of a radionuclide.
	 */
	public static final Unit		BECQUEREL;

	/**
	 * Special derived unit for the quantity of absorbed dose, specific energy
	 * (imparted), or kerms.
	 */
	public static final Unit		GRAY;

	/**
	 * Special derived unit for the quantity of dose equivalent, ambient dose
	 * equivalent, directional dose equivalent, personal dose equivalent, or
	 * equivalent dose.
	 */
	public static final Unit		SIEVERT;

	/*
	 * Units outside the SI but accepted for use with the SI according to the
	 * USA National Institute of Standards and Technology (see
	 * ):
	 */

	/**
	 * Special derived unit -- accepted for use with the SI -- for the quantity
	 * of time.
	 */
	public static final Unit		MINUTE;

	/**
	 * Special derived unit -- accepted for use with the SI -- for the quantity
	 * of time.
	 */
	public static final Unit		HOUR;

	/**
	 * Special derived unit -- accepted for use with the SI -- for the quantity
	 * of time.
	 */
	public static final Unit		DAY;

	/**
	 * Special derived unit -- accepted for use with the SI -- for the quantity
	 * of plane angle.
	 */
	public static final Unit		ARC_DEGREE;

	/**
	 * Special derived unit -- accepted for use with the SI -- for the quantity
	 * of plane angle.
	 */
	public static final Unit		ARC_MINUTE;

	/**
	 * Special derived unit -- accepted for use with the SI -- for the quantity
	 * of plane angle.
	 */
	public static final Unit		ARC_SECOND;

	/**
	 * Special derived unit -- accepted for use with the SI -- for the quantity
	 * of volume.
	 */
	public static final Unit		LITER;							// NIST

	/**
	 * Synomym for LITER.
	 */
	public static final Unit		LITRE;							// ISO

	/**
	 * Special derived unit -- accepted for use with the SI -- for the quantity
	 * of mass.
	 */
	public static final Unit		METRIC_TON;					// NIST

	/**
	 * Synomym for METRIC_TON.
	 */
	public static final Unit		TONNE;							// ISO

	/*
	 * Units outside the SI but temporarily accepted for use with the SI
	 * according to the USA National Institute of Standards and Technology (see
	 * ):
	 */

	/**
	 * Special derived unit -- temporarily accepted for use with the SI -- for
	 * the quantity of length.
	 */
	public static final Unit		NAUTICAL_MILE;

	/**
	 * Special derived unit -- temporarily accepted for use with the SI -- for
	 * the quantity of speed.
	 */
	public static final Unit		KNOT;

	/**
	 * Special derived unit -- temporarily accepted for use with the SI -- for
	 * the quantity of length.
	 */
	public static final Unit		ANGSTROM;

	/**
	 * Special derived unit -- temporarily accepted for use with the SI -- for
	 * the quantity of area.
	 */
	public static final Unit		ARE;

	/**
	 * Special derived unit -- temporarily accepted for use with the SI -- for
	 * the quantity of area.
	 */
	public static final Unit		HECTARE;

	/**
	 * Special derived unit -- temporarily accepted for use with the SI -- for
	 * the quantity of area.
	 */
	public static final Unit		BARN;

	/**
	 * Special derived unit -- temporarily accepted for use with the SI -- for
	 * the quantity of pressure.
	 */
	public static final Unit		BAR;

	/**
	 * Special derived unit -- temporarily accepted for use with the SI -- for
	 * the quantity of acceleration.
	 */
	public static final Unit		GAL;

	/*
	 * Units outside the SI but temporarily accepted for use with the SI until
	 * the year 2000 according to the USA National Institute of Standards and
	 * Technology (see ):
	 */

	/**
	 * Special derived unit -- temporarily accepted for use with the SI until
	 * the year 2000 according to the USA National Institute of Standards and
	 * Technology -- for the quantity of activity of a radionuclide.
	 */
	public static final Unit		CURIE;

	/**
	 * Special derived unit -- temporarily accepted for use with the SI until
	 * the year 2000 according to the USA National Institute of Standards and
	 * Technology -- for the quantity of electric charge per mass.
	 */
	public static final Unit		ROENTGEN;

	/**
	 * Special derived unit -- temporarilty accepted for use with the SI until
	 * the year 2000 according to the USA National Institute of Standards and
	 * Technology -- for the quantity of absorbed dose.
	 */
	public static final Unit		RAD;

	/**
	 * Special derived unit -- temporarilty accepted for use with the SI until
	 * the year 2000 according to the USA National Institute of Standards and
	 * Technology -- for the quantity of equivalent absorbed dose.
	 */
	public static final Unit		REM;

	static {
		BaseUnit ampere = null;
		BaseUnit candela = null;
		BaseUnit kelvin = null;
		BaseUnit kilogram = null;
		BaseUnit meter = null;
		BaseUnit mole = null;
		BaseUnit second = null;
		BaseUnit radian = null;
		BaseUnit steradian = null;
		Unit hertz = null;
		Unit newton = null;
		Unit pascal = null;
		Unit joule = null;
		Unit watt = null;
		Unit coulomb = null;
		Unit volt = null;
		Unit farad = null;
		Unit ohm = null;
		Unit siemens = null;
		Unit weber = null;
		Unit tesla = null;
		Unit henry = null;
		Unit degree_celsius = null;
		Unit lumen = null;
		Unit lux = null;
		Unit becquerel = null;
		Unit gray = null;
		Unit sievert = null;
		Unit minute = null;
		Unit hour = null;
		Unit day = null;
		Unit arc_degree = null;
		Unit arc_minute = null;
		Unit arc_second = null;
		Unit liter = null;
		Unit metric_ton = null;
		Unit nautical_mile = null;
		Unit knot = null;
		Unit angstrom = null;
		Unit are = null;
		Unit hectare = null;
		Unit barn = null;
		Unit bar = null;
		Unit gal = null;
		Unit curie = null;
		Unit roentgen = null;
		Unit rad = null;
		Unit rem = null;

		try {
			ampere = bu("ampere", "A", BaseQuantity.ELECTRIC_CURRENT);
			candela = bu("candela", "cd", BaseQuantity.LUMINOUS_INTENSITY);
			kelvin = bu("kelvin", "K", BaseQuantity.THERMODYNAMIC_TEMPERATURE);
			kilogram = bu("kilogram", "kg", BaseQuantity.MASS);
			meter = bu("meter", "m", BaseQuantity.LENGTH);
			mole = bu("mole", "mol", BaseQuantity.AMOUNT_OF_SUBSTANCE);
			second = bu("second", "s", BaseQuantity.TIME);
			radian = bu("radian", "rad", BaseQuantity.PLANE_ANGLE);
			steradian = bu("steradian", "sr", BaseQuantity.SOLID_ANGLE);

			hertz = du("hertz", "Hz", second.raiseTo(-1));
			newton = du("newton", "N", kilogram.multiplyBy(meter).divideBy(
					second.raiseTo(2)));
			pascal = du("pascal", "Pa", newton.divideBy(meter.raiseTo(2)));
			joule = du("joule", "J", newton.multiplyBy(meter));
			watt = du("watt", "W", joule.divideBy(second));
			coulomb = du("coulomb", "C", ampere.multiplyBy(second));
			volt = du("volt", "V", watt.divideBy(ampere));
			farad = du("farad", "F", coulomb.divideBy(volt));
			ohm = du("ohm", "Ohm", volt.divideBy(ampere));
			siemens = du("siemens", "S", ohm.raiseTo(-1));
			weber = du("weber", "Wb", volt.multiplyBy(second));
			tesla = du("tesla", "T", weber.divideBy(meter.raiseTo(2)));
			henry = du("henry", "H", weber.divideBy(ampere));
			degree_celsius = du("degree celsius", "Cel", new OffsetUnit(kelvin,
					273.15));
			lumen = du("lumen", "lm", candela.multiplyBy(steradian));
			lux = du("lux", "lx", lumen.divideBy(meter.raiseTo(2)));

			becquerel = du("becquerel", "Bq", hertz);
			gray = du("gray", "Gy", joule.divideBy(kilogram));
			sievert = du("sievert", "Sv", joule.divideBy(kilogram));

			minute = du("minute", "min", new ScaledUnit(60, second));
			hour = du("hour", "h", new ScaledUnit(60, minute));
			day = du("day", "d", new ScaledUnit(24, hour));
			arc_degree = du("arc degree", "deg", new ScaledUnit(Math.PI / 180,
					radian));
			arc_minute = du("arc minute", "'", new ScaledUnit(1. / 60.,
					arc_degree));
			arc_second = du("arc second", "\"", new ScaledUnit(1. / 60.,
					arc_minute));
			liter = du("liter", "L", new ScaledUnit(1e-3, meter.raiseTo(3)));
			// exact. However, from 1901 to 1964, 1 liter = 1.000028 dm3
			metric_ton = du("metric ton", "t", new ScaledUnit(1e3, kilogram));

			nautical_mile = du("nautical mile", "nmi", new ScaledUnit(1852,
					meter));
			knot = du("knot", "kt", nautical_mile.divideBy(hour));
			angstrom = du("angstrom", null, new ScaledUnit(1e-10, meter));
			are = du("are", "are", new ScaledUnit(10, meter).raiseTo(2));
			hectare = du("hectare", "ha", new ScaledUnit(100, are));
			barn = du("barn", "b", new ScaledUnit(1e-28, meter.raiseTo(2)));
			bar = du("bar", "bar", new ScaledUnit(1e5, pascal));
			gal = du("gal", "Gal", new ScaledUnit(1e-2, meter).divideBy(second
					.raiseTo(2)));

			curie = du("curie", "Ci", new ScaledUnit(3.7e10, becquerel));
			roentgen = du("roentgen", "R", new ScaledUnit(2.58e-4, coulomb
					.divideBy(kilogram)));
			rad = du("rad", "rd", new ScaledUnit(1e-2, gray));
			rem = du("rem", "rem", new ScaledUnit(1e-2, sievert));
		}
		catch (final UnitException e) {
			final String reason = e.getMessage();
			System.err.println("Couldn't initialize class SI" + reason == null
					? ""
					: (": " + reason));
		}

		AMOUNT_OF_SUBSTANCE_UNIT = mole;
		ELECTRIC_CURRENT_UNIT = ampere;
		LENGTH_UNIT = meter;
		LUMINOUS_INTENSITY_UNIT = candela;
		MASS_UNIT = kilogram;
		PLANE_ANGLE_UNIT = radian;
		SOLID_ANGLE_UNIT = steradian;
		THERMODYNAMIC_TEMPERATURE_UNIT = kelvin;
		TIME_UNIT = second;

		AMPERE = ampere;
		CANDELA = candela;
		KELVIN = kelvin;
		KILOGRAM = kilogram;
		METER = meter;
		METRE = METER;
		MOLE = mole;
		SECOND = second;
		RADIAN = radian;
		STERADIAN = steradian;
		HERTZ = hertz;
		NEWTON = newton;
		PASCAL = pascal;
		JOULE = joule;
		WATT = watt;
		COULOMB = coulomb;
		VOLT = volt;
		FARAD = farad;
		OHM = ohm;
		SIEMENS = siemens;
		WEBER = weber;
		TESLA = tesla;
		HENRY = henry;
		DEGREE_CELSIUS = degree_celsius;
		LUMEN = lumen;
		LUX = lux;
		BECQUEREL = becquerel;
		GRAY = gray;
		SIEVERT = sievert;
		MINUTE = minute;
		HOUR = hour;
		DAY = day;
		ARC_DEGREE = arc_degree;
		ARC_MINUTE = arc_minute;
		ARC_SECOND = arc_second;
		LITER = liter;
		LITRE = LITER;
		METRIC_TON = metric_ton;
		TONNE = METRIC_TON;
		NAUTICAL_MILE = nautical_mile;
		KNOT = knot;
		ANGSTROM = angstrom;
		ARE = are;
		HECTARE = hectare;
		BARN = barn;
		BAR = bar;
		GAL = gal;
		CURIE = curie;
		ROENTGEN = roentgen;
		RAD = rad;
		REM = rem;
	}

	/**
	 * Factory method for constructing a base unit.
	 * 
	 * @param name
	 *            The name of the unit.
	 * @param symbol
	 *            The symbol for the unit.
	 * @param quantity
	 *            The base quantity of the unit.
	 * @return The base unit corresponding to the arguments.
	 */
	private static BaseUnit bu(final String name, final String symbol,
			final BaseQuantity quantity) throws NameException,
			UnitExistsException {
		return BaseUnit.getOrCreate(UnitName.newUnitName(name, null, symbol),
				quantity);
	}

	/**
	 * Factory method for constructing a derived unit.
	 * 
	 * @param name
	 *            The name of the unit.
	 * @param symbol
	 *            The symbol for the unit.
	 * @param quantity
	 *            The definition of the unit.
	 * @return The derived unit corresponding to the arguments.
	 */
	private static Unit du(final String name, final String symbol,
			final Unit definition) throws NameException {
		return definition.clone(UnitName.newUnitName(name, null, symbol));
	}

	/**
	 * Constructs an SI system of units from nothing.
	 */
	private SI() throws UnitExistsException, NameException, PrefixDBException,
			NoSuchUnitException {
		super(baseUnitDB(), derivedUnitDB());
	}

	/**
	 * Returns the base unit database of the SI.
	 * 
	 * @return The base unit database of the SI.
	 * @throws NameException
	 *             Bad unit name.
	 * @throws UnitExistsException
	 *             Attempt to redefine an existing unit.
	 * @throws NoSuchUnitException
	 *             Necessary unit not found.
	 */
	private static UnitDBImpl baseUnitDB() throws NameException,
			UnitExistsException, NoSuchUnitException {
		final UnitDBImpl db = new UnitDBImpl(9, 9);
		db.addUnit(AMPERE);
		db.addUnit(CANDELA);
		db.addUnit(KELVIN);
		db.addUnit(KILOGRAM);
		db.addUnit(METER);
		db.addUnit(MOLE);
		db.addUnit(SECOND);
		db.addUnit(RADIAN);
		db.addUnit(STERADIAN);
		db.addAlias("metre", "meter");
		return db;
	}

	/**
	 * Returns the derived unit database of the SI.
	 * 
	 * @return The derived unit database of the SI.
	 * @throws NameException
	 *             Bad unit name.
	 * @throws UnitExistsException
	 *             Attempt to redefine an existing unit.
	 * @throws NoSuchUnitException
	 *             Necessary unit not found.
	 */
	private static UnitDBImpl derivedUnitDB() throws NameException,
			UnitExistsException, NoSuchUnitException {
		final UnitDBImpl db = new UnitDBImpl(42, 43);

		db.addUnit(HERTZ);
		db.addUnit(NEWTON);
		db.addUnit(PASCAL);
		db.addUnit(JOULE);
		db.addUnit(WATT);
		db.addUnit(COULOMB);
		db.addUnit(VOLT);
		db.addUnit(FARAD);
		db.addUnit(OHM);
		db.addUnit(SIEMENS);
		db.addUnit(WEBER);
		db.addUnit(TESLA);
		db.addUnit(HENRY);
		db.addUnit(DEGREE_CELSIUS);
		db.addUnit(LUMEN);
		db.addUnit(LUX);

		db.addUnit(BECQUEREL);
		db.addUnit(GRAY);
		db.addUnit(SIEVERT);

		db.addUnit(MINUTE);
		db.addUnit(HOUR);
		db.addUnit(DAY);
		db.addUnit(ARC_DEGREE);
		db.addUnit(ARC_MINUTE);
		db.addUnit(ARC_SECOND);
		db.addUnit(LITER);
		db.addUnit(METRIC_TON);

		db.addUnit(NAUTICAL_MILE);
		db.addUnit(KNOT);
		db.addUnit(ANGSTROM);
		db.addUnit(ARE);
		db.addUnit(HECTARE);
		db.addUnit(BARN);
		db.addUnit(BAR);
		db.addUnit(GAL);

		db.addUnit(CURIE);
		db.addUnit(ROENTGEN);
		db.addUnit(RAD);
		db.addUnit(REM);

		db.addAlias("litre", "liter", "l");
		db.addAlias("tonne", "metric ton");
		db.addSymbol("tne", "tonne");

		return db;
	}

	/**
	 * Returns an instance of the SI system of units.
	 * 
	 * @return An instance of the SI system of units.
	 * @throws UnitSystemException
	 *             Couldn't create an instance of the SI system of units.
	 */
	public static SI instance() throws UnitSystemException {
		synchronized (SI.class) {
			if (si == null) {
				try {
					si = new SI();
				}
				catch (final UnitException e) {
					throw new UnitSystemException(
							"Couldn't initialize class SI", e);
				}
			}
		}
		return si;
	}

	/**
	 * Tests this class.
	 */
	public static void main(final String[] args) throws Exception {
		SI.instance();
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy