Skip to content

Commit a5c7c33

Browse files
committed
Combine with HMS UnitsUtil
Merge Vortex::UnitUtil with HMS::UnitsUtil. Rename UnitUtil::getUnits to parse. Resolves: HMS-4074
1 parent 3d3f856 commit a5c7c33

File tree

6 files changed

+81
-13
lines changed

6 files changed

+81
-13
lines changed

vortex-api/src/main/java/mil/army/usace/hec/vortex/convert/DataConverter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public static List<VortexGrid> convert(List<VortexGrid> vortexGrids) {
4040

4141
public static VortexGrid convert(VortexGrid vortexGrid) {
4242
VortexVariable variable = VortexVariable.fromGrid(vortexGrid);
43-
Unit<?> units = UnitUtil.getUnits(vortexGrid.units());
43+
Unit<?> units = UnitUtil.parse(vortexGrid.units());
4444

4545
if (units == null)
4646
return vortexGrid;

vortex-api/src/main/java/mil/army/usace/hec/vortex/io/GridDatasetReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ private static Grid getGridDefinition(GridCoordSystem coordinateSystem) {
303303
.build());
304304

305305
String xAxisUnits = Objects.requireNonNull(xAxis).getUnitsString();
306-
Unit<?> cellUnits = UnitUtil.getUnits(xAxisUnits.toLowerCase());
306+
Unit<?> cellUnits = UnitUtil.parse(xAxisUnits.toLowerCase());
307307
Unit<?> csUnits = ReferenceUtils.getLinearUnits(wkt);
308308

309309
// This will scale the grid if cellUnits and csUnits do not align

vortex-api/src/main/java/mil/army/usace/hec/vortex/io/VariableDsReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ private static Grid getGridDefinition(NetcdfDataset ncd, CoordinateSystem coordi
290290
.build();
291291

292292
String xAxisUnits = Objects.requireNonNull(xAxis).getUnitsString();
293-
Unit<?> cellUnits = UnitUtil.getUnits(xAxisUnits.toLowerCase());
293+
Unit<?> cellUnits = UnitUtil.parse(xAxisUnits.toLowerCase());
294294
Unit<?> csUnits = ReferenceUtils.getLinearUnits(wkt);
295295

296296
if (cellUnits.isCompatible(csUnits) && !cellUnits.equals(csUnits)) {

vortex-api/src/main/java/mil/army/usace/hec/vortex/util/DssUtil.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ public static GridInfo getGridInfo(VortexGrid grid) {
107107

108108
gridInfo.setCellInfo(minX, minY, grid.nx(), grid.ny(), cellSize);
109109

110-
Unit<?> units = UnitUtil.getUnits(grid.units());
110+
Unit<?> units = UnitUtil.parse(grid.units());
111111
String unitsString = getUnitsString(units);
112112
gridInfo.setDataUnits(unitsString);
113113

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,47 @@
11
package mil.army.usace.hec.vortex.util;
22

33
import systems.uom.common.USCustomary;
4+
import tech.units.indriya.format.SimpleUnitFormat;
45

56
import javax.measure.Unit;
7+
import javax.measure.format.MeasurementParseException;
8+
import javax.measure.format.UnitFormat;
69
import java.util.Optional;
710

811
import static javax.measure.MetricPrefix.*;
9-
import static systems.uom.common.USCustomary.FAHRENHEIT;
10-
import static systems.uom.common.USCustomary.INCH;
12+
import static systems.uom.common.USCustomary.*;
1113
import static tech.units.indriya.AbstractUnit.ONE;
14+
import static tech.units.indriya.unit.Units.HOUR;
15+
import static tech.units.indriya.unit.Units.MINUTE;
1216
import static tech.units.indriya.unit.Units.*;
1317

1418
public class UnitUtil {
15-
public static Unit<?> getUnits(String units) {
19+
static {
20+
USCustomary.getInstance();
21+
}
22+
23+
private UnitUtil() {
24+
// Utility Class
25+
}
26+
27+
public static Unit<?> parse(String units) {
28+
if (units == null) {
29+
return ONE;
30+
}
31+
1632
return switch (units.toLowerCase()) {
1733
case "kg.m-2.s-1", "kg m-2 s-1", "kg/m2s", "mm/s", "mm s-1" -> MILLI(METRE).divide(SECOND);
1834
case "mm hr^-1", "mm/hr" -> MILLI(METRE).divide(HOUR);
1935
case "mm/day", "mm/d" -> MILLI(METRE).divide(DAY);
20-
case "kg.m-2", "kg/m^2", "kg m^-2", "kg m-2", "mm", "millimeters h20", "millimeters snow thickness" ->
21-
MILLI(METRE);
36+
case "kg.m-2", "kg/m^2", "kg m^-2", "kg m-2", "mm", "millimeter", "millimeters", "millimeters h20",
37+
"millimeters snow thickness" -> MILLI(METRE);
2238
case "in", "inch", "inches" -> INCH;
23-
case "1/1000 in" -> ONE.divide(INCH.multiply(1000));
39+
case "ft", "foot", "feet" -> FOOT;
40+
case "1/1000 in" -> INCH.divide(1000);
41+
case "in/hr" -> INCH.divide(HOUR);
2442
case "celsius", "degrees c", "deg c", "deg_c", "degc", "c" -> CELSIUS;
2543
case "degc-d" -> CELSIUS.multiply(DAY);
26-
case "degf-d" -> FAHRENHEIT.multiply(DAY);
44+
case "degf-d" -> FAHRENHEIT.multiply(DAY);
2745
case "fahrenheit", "deg f", "deg_f", "degf", "f" -> FAHRENHEIT;
2846
case "kelvin", "k" -> KELVIN;
2947
case "watt/m2", "w m-2" -> WATT.divide(SQUARE_METRE);
@@ -34,11 +52,14 @@ public static Unit<?> getUnits(String units) {
3452
case "hpa" -> HECTO(PASCAL);
3553
case "kpa" -> KILO(PASCAL);
3654
case "pa" -> PASCAL;
37-
case "m", "meter", "metre" -> METRE;
55+
case "m", "meter", "metre", "meters" -> METRE;
3856
case "min" -> MINUTE;
3957
case "km" -> KILO(METRE);
4058
case "degrees", "degrees_east", "degrees_north" -> USCustomary.DEGREE_ANGLE;
41-
default -> ONE;
59+
case "hr" -> HOUR;
60+
case "ac", "acre" -> ACRE;
61+
case "sqft", "ft2" -> SQUARE_FOOT;
62+
default -> parseSimpleUnitFormat(units);
4263
};
4364
}
4465

@@ -47,4 +68,17 @@ public static boolean equals(String units1, String units2) {
4768
.map(u -> u.equalsIgnoreCase(units2))
4869
.orElse(units2 == null);
4970
}
71+
72+
private static Unit<?> parseSimpleUnitFormat(String units) {
73+
if (units == null || units.isBlank()) {
74+
return ONE;
75+
}
76+
77+
try {
78+
UnitFormat format = SimpleUnitFormat.getInstance();
79+
return format.parse(units);
80+
} catch (MeasurementParseException mpe) {
81+
return ONE;
82+
}
83+
}
5084
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package mil.army.usace.hec.vortex.util;
2+
3+
import org.junit.jupiter.api.Test;
4+
import tech.units.indriya.unit.TransformedUnit;
5+
6+
import javax.measure.Unit;
7+
8+
import static org.junit.jupiter.api.Assertions.assertEquals;
9+
import static systems.uom.common.USCustomary.INCH;
10+
import static systems.uom.common.USCustomary.SQUARE_FOOT;
11+
12+
class UnitUtilTest {
13+
14+
@Test
15+
void unit1divide1000inches() {
16+
String str = "1/1000 in";
17+
18+
Unit<?> units = INCH.divide(1000);
19+
Unit<?> parsed = TransformedUnit.parse("in/1000");
20+
21+
Unit<?> retrieved = UnitUtil.parse(str);
22+
assertEquals(units, retrieved);
23+
assertEquals(units, parsed);
24+
}
25+
26+
@Test
27+
void unitSquareFeet() {
28+
String ft2 = "ft2";
29+
assertEquals(SQUARE_FOOT, UnitUtil.parse(ft2));
30+
31+
String sqft = "sqft";
32+
assertEquals(SQUARE_FOOT, UnitUtil.parse(sqft));
33+
}
34+
}

0 commit comments

Comments
 (0)