static

in endorsed/src/org.apache.sis.util/main/org/apache/sis/measure/Units.java [1202:1397]


    static {
        final UnitDimension length        = new UnitDimension('L');
        final UnitDimension mass          = new UnitDimension('M');
        final UnitDimension time          = new UnitDimension('T');
        final UnitDimension current       = new UnitDimension('I');
        final UnitDimension temperature   = new UnitDimension('Θ');
        final UnitDimension amount        = new UnitDimension('N');
        final UnitDimension luminous      = new UnitDimension('J');
        final UnitDimension frequency     = time.pow(-1);
        final UnitDimension area          = length.pow(2);
        final UnitDimension speed         = length.divide(time);
        final UnitDimension acceleration  = speed.divide(time);
        final UnitDimension force         = mass.multiply(speed).divide(time);
        final UnitDimension energy        = force.multiply(length);
        final UnitDimension power         = energy.divide(time);
        final UnitDimension charge        = current.multiply(time);
        final UnitDimension potential     = power.divide(current);
        final UnitDimension magneticFlux  = potential.multiply(time);
        final UnitDimension pressure      = force.divide(area);
        final UnitDimension dimensionless = UnitDimension.NONE;
        /*
         * Base, derived or alternate units that we need to reuse more than once in this static initializer.
         */
        final SystemUnit<Length>        m    = add(Length.class,        Scalar.Length::new,         length,        "m",    (byte) (SI | PREFIXABLE), Constants.EPSG_METRE);
        final SystemUnit<Area>          m2   = add(Area.class,          Scalar.Area::new,           area,          "m²",   (byte) (SI | PREFIXABLE), (short) 0);
        final SystemUnit<Volume>        m3   = add(Volume.class,        Scalar.Volume::new,         length.pow(3), "m³",   (byte) (SI | PREFIXABLE), (short) 0);
        final SystemUnit<Time>          s    = add(Time.class,          Scalar.Time::new,           time,          "s",    (byte) (SI | PREFIXABLE), (short) 1040);
        final SystemUnit<Temperature>   K    = add(Temperature.class,   Scalar.Temperature.FACTORY, temperature,   "K",    (byte) (SI | PREFIXABLE), (short) 0);
        final SystemUnit<Speed>         mps  = add(Speed.class,         Scalar.Speed::new,          speed,         "m∕s",  (byte) (SI | PREFIXABLE), (short) 1026);
        final SystemUnit<Acceleration>  mps2 = add(Acceleration.class,  Scalar.Acceleration::new,   acceleration,  "m∕s²", (byte) (SI | PREFIXABLE), (short) 0);
        final SystemUnit<Pressure>      Pa   = add(Pressure.class,      Scalar.Pressure::new,       pressure,      "Pa",   (byte) (SI | PREFIXABLE), (short) 0);
        final SystemUnit<Angle>         rad  = add(Angle.class,         Scalar.Angle::new,          dimensionless, "rad",  (byte) (SI | PREFIXABLE), (short) 9101);
        final SystemUnit<Dimensionless> one  = add(Dimensionless.class, Scalar.Dimensionless::new,  dimensionless, "",             SI,               (short) 9201);
        final SystemUnit<Mass>          kg   = add(Mass.class,          Scalar.Mass::new,           mass,          "kg",           SI,               (short) 0);
        /*
         * All SI prefix to be used below, with additional converters to be used more than once.
         */
        final LinearConverter nano  = Prefixes.converter('n');
        final LinearConverter micro = Prefixes.converter('µ');
        final LinearConverter milli = Prefixes.converter('m');
        final LinearConverter centi = Prefixes.converter('c');
        final LinearConverter hecto = Prefixes.converter('h');
        final LinearConverter kilo  = Prefixes.converter('k');
        final LinearConverter ten4  = LinearConverter.scale(10000, 1);
        /*
         * All Unit<Angle>.
         * 20 is the greatest common denominator between 180 and 200. The intent is to have arguments as small
         * as possible in the call to the scale(double, double) method, while keeping the right side integer.
         * Staying closer to zero during conversions helo to reduce rounding errors.
         */
        rad.related(4);
        RADIAN      = rad;
        GRAD        = add(rad, LinearConverter.scale(Math.PI / 20, 200       / 20), "grad", OTHER,    (short) 9105);
        DEGREE      = add(rad, LinearConverter.scale(Math.PI / 20, 180       / 20), "°",    ACCEPTED, Constants.EPSG_PARAM_DEGREES);
        ARC_MINUTE  = add(rad, LinearConverter.scale(Math.PI / 20, 180*60    / 20), "′",    ACCEPTED, (short) 9103);
        ARC_SECOND  = add(rad, LinearConverter.scale(Math.PI / 20, 180*60*60 / 20), "″",    ACCEPTED, (short) 9104);
        MICRORADIAN = add(rad, micro,                                               "µrad", SI,       (short) 9109);
        /*
         * All Unit<Length>.
         */
        m.related(7);
        METRE          = m;
        NANOMETRE      = add(m, nano,                                     "nm",    SI,       (short) 0);
        MILLIMETRE     = add(m, milli,                                    "mm",    SI,       (short) 1025);
        CENTIMETRE     = add(m, centi,                                    "cm",    SI,       (short) 1033);
        KILOMETRE      = add(m, kilo,                                     "km",    SI,       (short) 9036);
        NAUTICAL_MILE  = add(m, LinearConverter.scale(   1852,        1), "M",     OTHER,    (short) 9030);
        STATUTE_MILE   = add(m, LinearConverter.scale(1609344,     1000), "mi",    IMPERIAL, (short) 9093);
        US_SURVEY_FOOT = add(m, LinearConverter.scale(   1200,     3937), "ftUS",  OTHER,    (short) 9003);
        CLARKE_FOOT    = add(m, LinearConverter.scale(3047972654d, 1E10), "ftCla", OTHER,    (short) 9005);
        FOOT           = add(m, LinearConverter.scale(   3048,    10000), "ft",    IMPERIAL, (short) 9002);
        INCH           = add(m, LinearConverter.scale(    254,    10000), "in",    IMPERIAL, (short) 0);
        POINT          = add(m, LinearConverter.scale( 996264, 72000000), "pt",    OTHER,    (short) 0);
        /*
         * All Unit<Time>.
         */
        s.related(5);
        SECOND         = s;
        NANOSECOND     = add(s, nano,                                                  "ns",  SI,       (short) 0);
        MILLISECOND    = add(s, milli,                                                 "ms",  SI,       (short) 0);
        MINUTE         = add(s, LinearConverter.scale(                      60,    1), "min", ACCEPTED, (short) 0);
        HOUR           = add(s, LinearConverter.scale(                   60*60,    1), "h",   ACCEPTED, (short) 0);
        DAY            = add(s, LinearConverter.scale(         SECONDS_PER_DAY,    1), "d",   ACCEPTED, (short) 0);
        WEEK           = add(s, LinearConverter.scale(       7*SECONDS_PER_DAY,    1), "wk",  OTHER,    (short) 0);
        TROPICAL_YEAR  = add(s, LinearConverter.scale(MILLIS_PER_TROPICAL_YEAR, 1000), "a",   OTHER,    (short) 1029);
        /*
         * All Unit<Speed>, Unit<Acceleration>, Unit<AngularVelocity> and Unit<ScaleRateOfChange>.
         * The `unityPerSecond` unit is not added to the registry because it is specific to the EPSG database,
         * has no clear symbol and is easy to confuse with Hertz. We create that unit only for allowing us to
         * create the "ppm/a" units.
         */
        final SystemUnit<ScaleRateOfChange> unityPerSecond;
        unityPerSecond = new SystemUnit<>(ScaleRateOfChange.class, frequency, null, OTHER, (short) 1036, null);
        unityPerSecond.related(1);
        mps .related(2);
        mps2.related(1);
        METRES_PER_SECOND         = mps;
        METRES_PER_SECOND_SQUARED = mps2;
        KILOMETRES_PER_HOUR       = add(mps, LinearConverter.scale(10, 36),     "km∕h",  ACCEPTED, (short) 0);
        KNOT                      = add(mps, LinearConverter.scale(1852, 3600), "kn",    OTHER,    (short) 0);
        RADIANS_PER_SECOND        = add(AngularVelocity.class, null, frequency, "rad∕s", SI,       (short) 1035);
        GAL                       = add(mps2, centi, "Gal", (byte) (CGS | PREFIXABLE | ACCEPTED),  (short) 0);
        add(unityPerSecond, LinearConverter.scale(1, 31556925445E6), "ppm∕a", OTHER, (short) 1030);
        /*
         * All Unit<Pressure>.
         */
        Pa.related(3);
        PASCAL      = Pa;
        HECTOPASCAL = add(Pa,  hecto,                            "hPa",  SI,    (short) 0);
        DECIBAR     = add(Pa,  ten4,                             "dbar", OTHER, (short) 0);
        BAR         = add(Pa,  LinearConverter.scale(100000, 1), "bar",  OTHER, (short) 0);
        ATMOSPHERE  = add(Pa,  LinearConverter.scale(101325, 1), "atm",  OTHER, (short) 0);
        /*
         * All Unit<Temperature>.
         */
        K.related(2);
        KELVIN       = K;
        CELSIUS      = add(K, LinearConverter.offset(  27315, 100), "°C", SI,    (short) 0);
        FAHRENHEIT   = add(K, new LinearConverter(100, 45967, 180), "°F", OTHER, (short) 0);
        /*
         * Unit<Volume> and Unit<Mass>. Those units need to be handled in a special way because:
         * 1) The base unit of mass is "kg", not "g". This is handled by a hard-coded case in SystemUnit.
         * 2) The liter unit is not a SI units, but despite that is commonly used with SI prefixes.
         */
        SQUARE_METRE = m2;
        CUBIC_METRE  = m3;
        KILOGRAM     = kg;
        TONNE        = add(kg, kilo,  "t",         ACCEPTED,               (short) 0);
        HECTARE      = add(m2, ten4,  "ha",        ACCEPTED,               (short) 0);
        LITRE        = add(m3, milli, "L", (byte) (ACCEPTED | PREFIXABLE), (short) 0);
        GRAM         = add(kg, milli, "g", (byte) (ACCEPTED | PREFIXABLE), (short) 0);
        /*
         * Radioactivity must be defined after angular velocities, because it has the same dimensions.
         * The dimensions are also the same as frequency.
         */
        final SystemUnit<Radioactivity> Bq;
        Bq = add(Radioactivity.class, null, frequency, "Bq",  (byte) (SI | PREFIXABLE), (short) 0);
        Bq.related(1);
        BECQUEREL = Bq;
        CURIE     = add(Bq, LinearConverter.scale(3.7E10, 1), "Ci", OTHER, (short) 0);
        /*
         * Force, energy, electricity, magnetism and other units.
         * Frequency must be defined after angular velocities.
         */
        HERTZ      = add(Frequency.class,           Scalar.Frequency::new, frequency,                    "Hz",  (byte) (SI | PREFIXABLE), (short) 0);
        NEWTON     = add(Force.class,               Scalar.Force::new,     force,                        "N",   (byte) (SI | PREFIXABLE), (short) 0);
        JOULE      = add(Energy.class,              Scalar.Energy::new,    energy,                       "J",   (byte) (SI | PREFIXABLE), (short) 0);
        WATT       = add(Power.class,               Scalar.Power::new,     power,                        "W",   (byte) (SI | PREFIXABLE), (short) 0);
        AMPERE     = add(ElectricCurrent.class,     null,                  current,                      "A",   (byte) (SI | PREFIXABLE), (short) 0);
        COULOMB    = add(ElectricCharge.class,      null,                  charge,                       "C",   (byte) (SI | PREFIXABLE), (short) 0);
        VOLT       = add(ElectricPotential.class,   null,                  potential,                    "V",   (byte) (SI | PREFIXABLE), (short) 0);
        FARAD      = add(ElectricCapacitance.class, null,                  charge.divide(potential),     "F",   (byte) (SI | PREFIXABLE), (short) 0);
        SIEMENS    = add(ElectricConductance.class, null,                  current.divide(potential),    "S",   (byte) (SI | PREFIXABLE), (short) 0);
        OHM        = add(ElectricResistance.class,  null,                  potential.divide(current),    "Ω",   (byte) (SI | PREFIXABLE), (short) 0);
        WEBER      = add(MagneticFlux.class,        null,                  magneticFlux,                 "Wb",  (byte) (SI | PREFIXABLE), (short) 0);
        TESLA      = add(MagneticFluxDensity.class, null,                  magneticFlux.divide(area),    "T",   (byte) (SI | PREFIXABLE), (short) 0);
        HENRY      = add(ElectricInductance.class,  null,                  magneticFlux.divide(current), "H",   (byte) (SI | PREFIXABLE), (short) 0);
        LUX        = add(Illuminance.class,         null,                  luminous.divide(area),        "lx",  (byte) (SI | PREFIXABLE), (short) 0);
        LUMEN      = add(LuminousFlux.class,        null,                  luminous,                     "lm",  (byte) (SI | PREFIXABLE), (short) 0);
        CANDELA    = add(LuminousIntensity.class,   null,                  luminous,                     "cd",  (byte) (SI | PREFIXABLE), (short) 0);    // Must be after Lumen.
        MOLE       = add(AmountOfSubstance.class,   null,                  amount,                       "mol", (byte) (SI | PREFIXABLE), (short) 0);
        STERADIAN  = add(SolidAngle.class,          null,                  dimensionless,                "sr",  (byte) (SI | PREFIXABLE), (short) 0);
        /*
         * All Unit<Dimensionless>.
         */
        final SystemUnit<Salinity> sal;
        ConventionalUnit<Dimensionless> bel;
        SIGMA   = add(Dimensionless.class, Scalar.Dimensionless::new, dimensionless, "sigma", OTHER, (short) 0);
        PIXEL   = add(Dimensionless.class, Scalar.Dimensionless::new, dimensionless, "px",    OTHER, (short) 0);
        sal     = add(Salinity.class,      null,                      dimensionless, null,    OTHER, (short) 0);
        PSU     = add(sal, milli,                                                    "psu",   OTHER, (short) 0);
        PERCENT = add(one, centi,                                                    "%",     OTHER, (short) 0);
        PPM     = add(one, micro,                                                    "ppm",   OTHER, (short) 9202);
        bel     = add(one, PowerOf10.belToOne(), "B", (byte) (ACCEPTED | PREFIXABLE), (short) 0);
        DECIBEL = add(bel, Prefixes.converter('d'), "dB", ACCEPTED, (short) 0);
        UNITY   = UnitRegistry.init(one);  // Must be last in order to take precedence over all other units associated to UnitDimension.NONE.

        UnitRegistry.alias(UNITY,       Short.valueOf((short) 9203));
        UnitRegistry.alias(DEGREE,      Short.valueOf(Constants.EPSG_AXIS_DEGREES));
        UnitRegistry.alias(ARC_MINUTE,  "'");
        UnitRegistry.alias(ARC_SECOND, "\"");
        UnitRegistry.alias(KNOT,       "kt");       // Symbol used in aviation.
        UnitRegistry.alias(KELVIN,      "K");       // Ordinary "K" letter (not the dedicated Unicode character).
        UnitRegistry.alias(CELSIUS,     "℃");
        UnitRegistry.alias(CELSIUS,   "Cel");
        UnitRegistry.alias(FAHRENHEIT,  "℉");
        UnitRegistry.alias(GRAD,      "gon");
        UnitRegistry.alias(GAL,     "cm∕s²");
        UnitRegistry.alias(HECTARE,   "hm²");
        UnitRegistry.alias(LITRE,       "l");
        UnitRegistry.alias(LITRE,       "ℓ");
        UnitRegistry.alias(PSU,       "PSU");
        UnitRegistry.alias(UNITY, SystemUnit.ONE);

        initialized = true;
    }