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²"));
     }
 
     /**

Reply via email to