This is an automated email from the ASF dual-hosted git repository. amanin pushed a commit to branch feat/acceleration-units in repository https://gitbox.apache.org/repos/asf/sis.git
commit 7817a5ae71a01decc525648676db6d88d52f14ad Author: Alexis Manin <alexis.ma...@geomatys.com> AuthorDate: Mon Mar 28 16:33:34 2022 +0200 feat(Utility): add acceleration units: base and gal --- .../main/java/org/apache/sis/measure/Scalar.java | 14 +++++ .../main/java/org/apache/sis/measure/Units.java | 41 ++++++++++--- .../org/apache/sis/measure/UnitNames.properties | 2 + .../org/apache/sis/measure/UnitNames_fr.properties | 1 + .../org/apache/sis/measure/UnitFormatTest.java | 2 + .../java/org/apache/sis/measure/UnitsTest.java | 71 ++++++++++------------ 6 files changed, 83 insertions(+), 48 deletions(-) diff --git a/core/sis-utility/src/main/java/org/apache/sis/measure/Scalar.java b/core/sis-utility/src/main/java/org/apache/sis/measure/Scalar.java index 5a784c3..c0b360d 100644 --- a/core/sis-utility/src/main/java/org/apache/sis/measure/Scalar.java +++ b/core/sis-utility/src/main/java/org/apache/sis/measure/Scalar.java @@ -16,6 +16,7 @@ */ package org.apache.sis.measure; +import java.io.Serializable; import java.lang.reflect.Proxy; import javax.measure.Unit; import javax.measure.Quantity; @@ -539,4 +540,17 @@ class Scalar<Q extends Quantity<Q>> extends Number implements Quantity<Q>, Compa return new Temperature(value, unit); } } + + static final class Acceleration extends Scalar<javax.measure.quantity.Acceleration> + implements javax.measure.quantity.Acceleration + { + private static final long serialVersionUID = 8041442665100572880L; + + Acceleration(double value, Unit<javax.measure.quantity.Acceleration> unit) {super(value, unit);} + + @Override + Quantity<javax.measure.quantity.Acceleration> create(double value, Unit<javax.measure.quantity.Acceleration> unit) { + return new Acceleration(value, unit); + } + } } diff --git a/core/sis-utility/src/main/java/org/apache/sis/measure/Units.java b/core/sis-utility/src/main/java/org/apache/sis/measure/Units.java index a86e06f..711ef44 100644 --- a/core/sis-utility/src/main/java/org/apache/sis/measure/Units.java +++ b/core/sis-utility/src/main/java/org/apache/sis/measure/Units.java @@ -1112,6 +1112,16 @@ public final class Units extends Static { public static final Unit<Dimensionless> PIXEL; /** + * SI base accelaration unit. + */ + public static final Unit<Acceleration> METRES_PER_SECOND_SQUARED; + + /** + * CGS unit for acceleration. This is <em>not</em> an SI unit. + */ + public static final Unit<Acceleration> GAL; + + /** * Sets to {@code true} by the static initializer after the initialization has been completed. * This is a safety against unexpected changes in the {@link UnitRegistry#HARD_CODED} map. * @@ -1149,19 +1159,22 @@ public final class Units extends Static { final UnitDimension magneticFlux = potential.multiply(time); final UnitDimension pressure = force.divide(area); final UnitDimension dimensionless = UnitDimension.NONE; + final UnitDimension acceleration = length.divide(time.pow(2)); + /* * 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<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); + 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<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); + final SystemUnit<Acceleration> mps2 = add(Acceleration.class, Scalar.Acceleration::new, acceleration, "m∕s²", (byte) (SI | PREFIXABLE), (short) 0); /* * All SI prefix to be used below, with additional converters to be used more than once. */ @@ -1290,6 +1303,13 @@ public final class Units extends Static { 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. + /* + * Acceleration units + */ + METRES_PER_SECOND_SQUARED = mps2; + mps2.related(1); + GAL = add(mps2, centi, "gal", (byte) (OTHER | PREFIXABLE | ACCEPTED), (short) 0); + UnitRegistry.alias(UNITY, Short.valueOf((short) 9203)); UnitRegistry.alias(DEGREE, Short.valueOf(Constants.EPSG_AXIS_DEGREES)); UnitRegistry.alias(ARC_MINUTE, "'"); @@ -1304,6 +1324,7 @@ public final class Units extends Static { UnitRegistry.alias(LITRE, "ℓ"); UnitRegistry.alias(PSU, "PSU"); UnitRegistry.alias(UNITY, SystemUnit.ONE); + UnitRegistry.alias(GAL, "cm∕s²"); initialized = true; } diff --git a/core/sis-utility/src/main/resources/org/apache/sis/measure/UnitNames.properties b/core/sis-utility/src/main/resources/org/apache/sis/measure/UnitNames.properties index a196184..2720d65 100644 --- a/core/sis-utility/src/main/resources/org/apache/sis/measure/UnitNames.properties +++ b/core/sis-utility/src/main/resources/org/apache/sis/measure/UnitNames.properties @@ -66,3 +66,5 @@ wk=week \u2033=arc-second �C=Celsius �F=Fahrenheit +m\u2215s�=metres per second squared +gal=gal diff --git a/core/sis-utility/src/main/resources/org/apache/sis/measure/UnitNames_fr.properties b/core/sis-utility/src/main/resources/org/apache/sis/measure/UnitNames_fr.properties index f691c8a..6455d37 100644 --- a/core/sis-utility/src/main/resources/org/apache/sis/measure/UnitNames_fr.properties +++ b/core/sis-utility/src/main/resources/org/apache/sis/measure/UnitNames_fr.properties @@ -35,3 +35,4 @@ wk=semaine �=degr�e \u2032=arc-minute \u2033=arc-seconde +m\u2215s�=m�tres par seconde au carr� diff --git a/core/sis-utility/src/test/java/org/apache/sis/measure/UnitFormatTest.java b/core/sis-utility/src/test/java/org/apache/sis/measure/UnitFormatTest.java index 3a7590e..53c1cf1 100644 --- a/core/sis-utility/src/test/java/org/apache/sis/measure/UnitFormatTest.java +++ b/core/sis-utility/src/test/java/org/apache/sis/measure/UnitFormatTest.java @@ -127,6 +127,8 @@ public final strictfp class UnitFormatTest extends TestCase { verify(declared, "PSU", "", "psu", "practical salinity unit", Units.PSU); verify(declared, "PIXEL", "", "px", "pixel", Units.PIXEL); verify(declared, "DECIBEL", "", "dB", "decibel", Units.DECIBEL); + verify(declared, "GAL", "L∕T²", "gal", "gal", Units.GAL); + verify(declared, "METRES_PER_SECOND_SQUARED","L∕T²", "m∕s²", "metres per second squared", Units.METRES_PER_SECOND_SQUARED); assertTrue("Missing units in test:" + declared, declared.isEmpty()); } diff --git a/core/sis-utility/src/test/java/org/apache/sis/measure/UnitsTest.java b/core/sis-utility/src/test/java/org/apache/sis/measure/UnitsTest.java index c03fdeb..38be06e 100644 --- a/core/sis-utility/src/test/java/org/apache/sis/measure/UnitsTest.java +++ b/core/sis-utility/src/test/java/org/apache/sis/measure/UnitsTest.java @@ -17,19 +17,9 @@ package org.apache.sis.measure; import javax.measure.Unit; -import javax.measure.quantity.Angle; -import javax.measure.quantity.Area; -import javax.measure.quantity.Dimensionless; -import javax.measure.quantity.Length; -import javax.measure.quantity.LuminousFlux; -import javax.measure.quantity.LuminousIntensity; -import javax.measure.quantity.Mass; -import javax.measure.quantity.SolidAngle; -import javax.measure.quantity.Speed; -import javax.measure.quantity.Temperature; -import javax.measure.quantity.Time; -import javax.measure.quantity.Volume; +import javax.measure.quantity.*; import javax.measure.IncommensurableException; +import javax.measure.quantity.Angle; import org.apache.sis.test.DependsOn; import org.apache.sis.test.TestCase; import org.junit.Test; @@ -183,8 +173,9 @@ public final strictfp class UnitsTest extends TestCase { */ @Test public void testToStandardUnit() { - assertEquals(1000.0, toStandardUnit(KILOMETRE), 1E-15); - assertEquals(0.017453292519943295, toStandardUnit(DEGREE), 1E-15); + assertEquals(1000.0, toStandardUnit(KILOMETRE), 1E-15); + assertEquals(0.017453292519943295, toStandardUnit(DEGREE), 1E-15); + assertEquals(0.01, toStandardUnit(GAL), 1E-15); } /** @@ -235,18 +226,19 @@ public final strictfp class UnitsTest extends TestCase { */ @Test public void testGetForQuantity() { - assertSame("Length", Units.METRE, Units.get(Length.class)); - assertSame("Mass", Units.KILOGRAM, Units.get(Mass.class)); - assertSame("Time", Units.SECOND, Units.get(Time.class)); - assertSame("Temperature", Units.KELVIN, Units.get(Temperature.class)); - assertSame("Area", Units.SQUARE_METRE, Units.get(Area.class)); - assertSame("Volume", Units.CUBIC_METRE, Units.get(Volume.class)); - assertSame("Speed", Units.METRES_PER_SECOND, Units.get(Speed.class)); - assertSame("LuminousIntensity", Units.CANDELA, Units.get(LuminousIntensity.class)); - assertSame("LuminousFlux", Units.LUMEN, Units.get(LuminousFlux.class)); - assertSame("SolidAngle", Units.STERADIAN, Units.get(SolidAngle.class)); - assertSame("Angle", Units.RADIAN, Units.get(Angle.class)); - assertSame("Dimensionless", Units.UNITY, Units.get(Dimensionless.class)); + assertSame("Length", Units.METRE, Units.get(Length.class)); + assertSame("Mass", Units.KILOGRAM, Units.get(Mass.class)); + assertSame("Time", Units.SECOND, Units.get(Time.class)); + assertSame("Temperature", Units.KELVIN, Units.get(Temperature.class)); + assertSame("Area", Units.SQUARE_METRE, Units.get(Area.class)); + assertSame("Volume", Units.CUBIC_METRE, Units.get(Volume.class)); + assertSame("Speed", Units.METRES_PER_SECOND, Units.get(Speed.class)); + assertSame("LuminousIntensity", Units.CANDELA, Units.get(LuminousIntensity.class)); + assertSame("LuminousFlux", Units.LUMEN, Units.get(LuminousFlux.class)); + assertSame("SolidAngle", Units.STERADIAN, Units.get(SolidAngle.class)); + assertSame("Angle", Units.RADIAN, Units.get(Angle.class)); + assertSame("Dimensionless", Units.UNITY, Units.get(Dimensionless.class)); + assertSame("Acceleration", METRES_PER_SECOND_SQUARED, Units.get(Acceleration.class)); } /** @@ -254,18 +246,19 @@ public final strictfp class UnitsTest extends TestCase { */ @Test public void testGetForDimension() { - assertSame("Length", Units.METRE, Units.get(Units.METRE .getDimension())); - assertSame("Mass", Units.KILOGRAM, Units.get(Units.KILOGRAM .getDimension())); - assertSame("Time", Units.SECOND, Units.get(Units.SECOND .getDimension())); - assertSame("Temperature", Units.KELVIN, Units.get(Units.KELVIN .getDimension())); - assertSame("Area", Units.SQUARE_METRE, Units.get(Units.SQUARE_METRE .getDimension())); - assertSame("Volume", Units.CUBIC_METRE, Units.get(Units.CUBIC_METRE .getDimension())); - assertSame("Speed", Units.METRES_PER_SECOND, Units.get(Units.METRES_PER_SECOND.getDimension())); - assertSame("LuminousIntensity", Units.CANDELA, Units.get(Units.CANDELA .getDimension())); - assertSame("LuminousFlux", Units.CANDELA, Units.get(Units.LUMEN .getDimension())); // Because lumen is candela divided by a dimensionless unit. - assertSame("SolidAngle", Units.UNITY, Units.get(Units.STERADIAN .getDimension())); - assertSame("Angle", Units.UNITY, Units.get(Units.RADIAN .getDimension())); - assertSame("Dimensionless", Units.UNITY, Units.get(Units.UNITY .getDimension())); + assertSame("Length", Units.METRE, Units.get(Units.METRE .getDimension())); + assertSame("Mass", Units.KILOGRAM, Units.get(Units.KILOGRAM .getDimension())); + assertSame("Time", Units.SECOND, Units.get(Units.SECOND .getDimension())); + assertSame("Temperature", Units.KELVIN, Units.get(Units.KELVIN .getDimension())); + assertSame("Area", Units.SQUARE_METRE, Units.get(Units.SQUARE_METRE .getDimension())); + assertSame("Volume", Units.CUBIC_METRE, Units.get(Units.CUBIC_METRE .getDimension())); + assertSame("Speed", Units.METRES_PER_SECOND, Units.get(Units.METRES_PER_SECOND .getDimension())); + assertSame("LuminousIntensity", Units.CANDELA, Units.get(Units.CANDELA .getDimension())); + assertSame("LuminousFlux", Units.CANDELA, Units.get(Units.LUMEN .getDimension())); // Because lumen is candela divided by a dimensionless unit. + assertSame("SolidAngle", Units.UNITY, Units.get(Units.STERADIAN .getDimension())); + assertSame("Angle", Units.UNITY, Units.get(Units.RADIAN .getDimension())); + assertSame("Dimensionless", Units.UNITY, Units.get(Units.UNITY .getDimension())); + assertSame("Acceleration", METRES_PER_SECOND_SQUARED, Units.get(METRES_PER_SECOND_SQUARED.getDimension())); } /** @@ -325,6 +318,8 @@ public final strictfp class UnitsTest extends TestCase { assertSame(CELSIUS, valueOf("degree_Celcius")); assertSame(PASCAL, valueOf("Pa")); assertSame(DECIBEL, valueOf("dB")); + assertSame(GAL, valueOf("gal")); + assertSame(GAL, valueOf("cm/s²")); } /**