//
// StandardQuantityDB.java
//
/*
* Copyright 1998, University Corporation for Atmospheric Research
* See file LICENSE for copying and redistribution conditions.
*
* $Id: StandardQuantityDB.java,v 1.17 2006-01-27 21:11:01 donm Exp $
*/
package visad.data.netcdf;
import visad.data.units.ParseException;
import visad.RealType;
import visad.SI;
import visad.TypeException;
import visad.VisADError;
import visad.VisADException;
/**
* The following class implements a database of standard quantities. It is
* implemented as a singleton. Instances of the class are modifiable.
*
* @author Steven R. Emmerson
*/
public final class
StandardQuantityDB
extends QuantityDBImpl
{
/**
* The singleton instance of this class.
*/
private static /*final*/ StandardQuantityDB db;
static
{
try
{
db = new StandardQuantityDB();
}
catch (Exception e)
{
if (e instanceof RuntimeException)
throw (RuntimeException)e;
throw new VisADError(
"visad.data.netcdf.StandardQuantityDB.<clinit>: " +
"Couldn't initialize class: " + e);
}
}
/**
* Returns an instance of this class.
*
* @throws VisADException Couldn't instantiate.
*/
public static StandardQuantityDB
instance()
{
return db;
}
/**
* Constucts from nothing. Private to ensure use of the instance()
* method.
*
* @param otherDB The quantity database for the get...()
* methods to search after this one if no
* entry found. May be <code>null</code>.
* @throws VisADException Couldn't create necessary VisAD object.
*/
private
StandardQuantityDB()
throws VisADException
{
super(null);
String name;
Quantity quantity;
try {
/*
* From the VisAD RealType class:
*/
add(RealType.Generic);
add(RealType.Radius);
add(RealType.XAxis);
add(RealType.YAxis);
add(RealType.ZAxis);
add(RealType.Latitude);
add(RealType.Longitude);
add(RealType.Altitude);
add(RealType.Time);
/*
* From the SI class:
*/
super.add(SI.ampere.quantityName(), "A");
super.add(SI.candela.quantityName(), "cd");
super.add(SI.kelvin.quantityName(), "K");
super.add(SI.kilogram.quantityName(), "kg");
super.add(SI.meter.quantityName(), "m");
// super.add(SI.second.quantityName(), "s");RealType.Time already
super.add(SI.mole.quantityName(), "mol");
super.add(SI.radian.quantityName(), "rad");
/*
* Quasi-fundamental dimensions:
*/
super.add("SolidAngle", "sr");
/*
* Derived dimensions. The categories are somewhat arbitrary.
*/
/*
* Simple stuff:
*/
super.add("Volume", "m3");
super.add("VolumeFraction", "m3/m3");
super.add("VolumeFlow", "m3/s");
super.add("Acceleration", "m/s2");
super.add("Area", "m2");
super.add("Frequency", "Hz");
super.add("WaveNumber", "m-1");
super.add("Speed", "m/s");
super.add("Velocity", "m/s");
super.add("AngularVelocity", "rad/s");
super.add("AngularAcceleration", "rad/s2");
/*
* Mass:
*/
quantity = new Quantity("SurfaceMassDensity", "kg/m2");
super.add("SurfaceMassDensity", quantity);
super.add("AreicMass", quantity);
super.add("MassPerArea", quantity);
quantity = new Quantity("LinearMassDensity", "kg/m2");
super.add("LinearMassDensity", quantity);
super.add("LineicMass", quantity);
super.add("MassPerLength", "kg/m");
super.add("MassFraction", "kg/kg");
quantity = new Quantity("MassFlow", "kg/s");
super.add("MassFlux", quantity);
super.add("MassFlow", quantity);
quantity = new Quantity("Density", "kg/m3");
super.add("MassDensity", quantity);
super.add("Density", quantity);
super.add("VolumicMass", quantity);
quantity = new Quantity("SpecificVolume", "m3/kg");
super.add("SpecificVolume", quantity);
super.add("MassicVolume", quantity);
/*
* Force:
*/
super.add("Force", "N");
super.add("MomentOfForce", "N.m");
super.add("SurfaceTension", "N/m");
quantity = new Quantity("LinearForceDensity", "N/m");
super.add("LinearForceDensity", quantity);
super.add("LineicForce", quantity);
super.add("ForcePerLength", quantity);
super.add("Torque", "N.m");
quantity = new Quantity("LinearTorqueDensity", "N");
super.add("LinearTorqueDensity", quantity);
super.add("LineicTorque", quantity);
super.add("TorquePerlength", quantity);
super.add("Pressure", "Pa");
super.add("Stress", "Pa");
/*
* Viscosity:
*/
super.add("DynamicViscosity", "Pa.s");
super.add("KinematicViscosity", "m2/s");
/*
* Energy:
*/
super.add("Energy", "J");
super.add("Work", "J");
super.add("QuantityOfHeat", "J");
super.add("Power", "W");
quantity = new Quantity("SurfacePowerDensity", "J/(m2.s)");
super.add("SurfacePowerDensity", quantity);
super.add("AreicPower", quantity);
super.add("EnergyPerAreaTime", quantity);
super.add("SpecificAvailableEnergy", "J/kg");
super.add("SpecificEnergy", "J/kg");
quantity = new Quantity("AvailableEnergyDensity", "J/m3");
super.add("AvailableEnergyDensity", quantity);
super.add("VolumicAvailableEnergy", quantity);
quantity = new Quantity("EnergyDensity", "J/m3");
super.add("EnergyDensity", quantity);
super.add("VolumicEnergy", quantity);
/*
* Heat and temperature:
*/
super.add("ThermalConductivity", "W/(m.K)");
super.add("ThermalDiffusivity", "m2/s");
super.add("ThermalInsulance", "(m3.K)/W");
super.add("ThermalResistance", "K/W");
super.add("ThermalResistivity", "(m.K)/W");
super.add("CoefficientOfHeatTransfer", "W/(m2.K)");
quantity = new Quantity("SurfaceHeatDensity", "J/m2");
super.add("SurfaceHeatDensity", quantity);
super.add("AreicHeat", quantity);
super.add("DensityOfHeat", quantity);
quantity = new Quantity("SurfaceHeatFlowDensity", "W/m2");
super.add("SurfaceHeatFlowDensity", quantity);
super.add("SurfaceHeatFluxDensity", quantity);
super.add("AreicHeatFlow", quantity);
super.add("AreicHeatFlux", quantity);
super.add("DensityOfHeatFlowRate", quantity);
super.add("HeatCapacity", "J/K");
super.add("Entropy", "J/K");
super.add("HeatFlowRate", "W");
super.add("SpecificHeatCapcity", "J/(kg.K)");
super.add("SpecificHeat", "J/(kg.K)");
super.add("SpecificEntropy", "J/(kg.K)");
/**
* Electricity and magnetism:
*/
super.add("Capacitance", "F");
quantity = new Quantity("Permittivity", "F/m");
super.add("Permittivity", quantity);
super.add("MagneticPermittivity", quantity);
super.add("MagneticPermeability", "H/m");
super.add("ElectricCharge", "C");
quantity = new Quantity("ElectricChargeDensity", "C/m3");
super.add("ElectricChargeDensity", quantity);
super.add("VolumicElectricCharge", quantity);
quantity = new Quantity("ElectricFluxDensity", "C/m2");
super.add("ElectricFluxDensity", quantity);
super.add("SurfaceElectricChargeDensity", quantity);
super.add("AreicElectricCharge", quantity);
super.add("ElectricResistance", "Ohm");
super.add("ElectricConductance", "S");
quantity = new Quantity("EMF", "V");
super.add("ElectricPotentialDifference", quantity);
super.add("ElectromotiveForce", quantity);
super.add("EMF", quantity);
quantity = new Quantity("CurrentDensity", "A/m2");
super.add("CurrentDensity", quantity);
super.add("SurfaceCurrentDensity", quantity);
super.add("AreicCurrent", quantity);
super.add("Inductance", "H");
super.add("MagneticFlux", "Wb");
super.add("MagneticFluxDensity", "T");
super.add("MagneticFieldStrength", "A/m");
super.add("ElectricFieldStrength", "V/m");
/*
* Photometry and Radiometry:
*/
super.add("Illuminance", "lx");
super.add("Irradiance", "W/m2");
super.add("RadiantEmittance", "W/m2");
super.add("Radiance", "W/(m2.sr)");
super.add("Luminance", "cd/m2");
super.add("LuminousFlux", "lm");
super.add("RadiantFlux", "W");
super.add("RadiantIntensity", "W/sr");
/*
* Amount of substance:
*/
super.add("AmountOfSubstanceFraction", "mol/mol");
super.add("MolarVolume", "m3/mol");
super.add("MolarMass", "kg/mol");
super.add("AmountOfSubstanceConcentration", "mol/m3");
super.add("Molality", "mol/kg");
super.add("MolarEnergy", "J/mol");
super.add("MolarEntropy", "J/(mol K)");
super.add("MolarHeatCapacity", "J/(mol K)");
/*
* Flow permeability:
*/
super.add("EquivalentPermeability", "m2");
quantity = new Quantity(
"SurfaceFlowPermeabilityDensity", "kg/(Pa.s.m2)");
super.add("SurfaceFlowPermeabilityDensity", quantity);
super.add("AreicFlowPermeability", quantity);
quantity = new Quantity(
"LinearFlowPermeabilityDensity", "kg/(Pa.s.m)");
super.add("LinearFlowPermeabilityDensity", quantity);
super.add("LineicFlowPermeability", quantity);
/*
* Radioactivity & radiation:
*/
super.add("AbsorbedDose", "Gy");
super.add("AbsorbedDoseRate", "Gy/s");
super.add("DoseEquivalent", "Sv");
super.add("Activity", "Bq");
super.add("Exposure", "C/kg"); // x & gamma rays
/*
* Fuel consumption:
*/
super.add("VolumePerWorkFuelConsumption", "m3/J");
quantity = new Quantity("DistancePerVolumeFuelConsumption", "m/m3");
super.add("DistancePerVolumeFuelConsumption", quantity);
super.add("DistanceDensityFuelConsumption", quantity);
super.add("VolumicDistanceFuelConsumption", quantity);
super.add("MassPerWorkFuelConsumption", "kg/J");
/*
* Geophysical sciences:
*/
super.add("Direction", "deg");
quantity = get("Latitude"); // from RealType.Latitude
super.add("GeodeticLatitude", quantity);
super.add("lat", quantity);
quantity = get("Longitude");
super.add(
"GeodeticLongitude", quantity); // from RealType.Longitude
super.add("Longitude", quantity);
super.add("lon", quantity);
quantity = get("Altitude"); // from RealType.Altitude
super.add("Elevation", quantity);
super.add("Altitude", quantity);
super.add("alt", quantity);
super.add("Depth", "m");
} catch (ParseException e) { // shouldn't happen
throw new VisADException(e.getMessage());
}
}
/**
* Adds the given quantities and aliases to the database.
*
* @param definitions New quantities and their definitions.
* <code>definitions[2*i]</code> contains the
* name (e.g. "speed") of the quantity whose
* preferred unit specification (e.g. "m/s") is
* in <code>definitions[2*i+1]</code>.
* @param aliases Aliases for quantities. <code>aliases[2*i]
* </code> contains the alias for the quantity
* named in <code>aliases[2*i+1]</code>.
* @return The database resulting from the addition. Will
* not be the original object.
* @throws ParseException A unit specification couldn't be parsed.
* @throws TypeException An incompatible version of the quantity already
* exists.
* @throws VisADException Couldn't create necessary VisAD object.
*/
public QuantityDB
add(String[] definitions, String[] aliases)
throws ParseException, TypeException, VisADException
{
return new QuantityDBImpl(this).add(definitions, aliases);
}
/**
* Adds a quantity to the database given a name and a display unit
* specification.
*
* @param name The name of the quantity (e.g. "length").
* @param unitSpec The preferred display unit for the
* quantity (e.g. "feet").
* @exception UnsupportedOperationException
* Always thrown because a standard database
* must be unmodifiable.
*/
public void
add(String name, String unitSpec)
{
throw new UnsupportedOperationException(
"Standard Quantity database is unmodifiable");
}
/**
* Adds a quantity to the database given a VisAD RealType.
*
* @param realType The VisAD RealType to be added.
* @throws VisADException Couldn't create necessary VisAD object.
*/
private void
add(RealType realType)
throws VisADException
{
super.add(realType.getName(), new Quantity(realType));
}
/**
* Tests this class. If the only argument is "list", then this method
* will print the list of standard quantities -- one per line --
* in the following format:
* name "(" CannonicalName ")" " in " PreferredUnit
* e.g.
* VolumicElectricCharge (ElectricChargeDensity) in C/m3
*/
public static void
main(String[] args)
throws Exception
{
StandardQuantityDB db = StandardQuantityDB.instance();
if (args.length != 1 || !args[0].equals("list"))
{
System.out.println("LaTiTuDe=<" + db.get("LaTiTuDe") + ">");
}
else
{
for (java.util.Iterator iter = db.nameIterator(); iter.hasNext(); )
{
String name = (String)iter.next();
Quantity quantity = db.get(name);
System.out.println(
name + " (" + quantity.getName() + ") in " +
quantity.getDefaultUnitString());
}
}
}
}