Skip to content

Commit acceea2

Browse files
committed
Fix temperature difference edge case
1 parent 24d3ecf commit acceea2

File tree

7 files changed

+104
-8
lines changed

7 files changed

+104
-8
lines changed

qudtlib-data-gen/src/main/resources/add-to-quantitykinds.ttl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,6 @@ quantitykind:SecondAxialMomentOfArea qudt:applicableUnit unit:CentiM4 .
2929

3030
quantitykind:Viscosity qudt:applicableUnit unit:DecaPOISE .
3131

32-
quantitykind:DynamicViscosity qudt:applicableUnit unit:DecaPOISE .
32+
quantitykind:DynamicViscosity qudt:applicableUnit unit:DecaPOISE .
33+
34+
quantitykind:SpecificHeatCapacity qudt:applicableUnit unit:KiloJ-PER-KiloGM-K .

qudtlib-data-gen/src/main/resources/add-to-units.ttl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ unit:DecaPOISE a qudt:Unit;
6767
rdfs:isDefinedBy <http://qudt.org/2.1/vocab/unit>;
6868
qudt:applicableSystem sou:CGS-GAUSS, sou:CGS;
6969
qudt:hasQuantityKind quantitykind:Viscosity, quantitykind:DynamicViscosity;
70-
qudt:conversionMultiplier 10.0;
70+
qudt:conversionMultiplier 1.0;
7171
qudt:hasDimensionVector <http://qudt.org/vocab/dimensionvector/A0E0L-1I0M1H0T-1D0>;
7272
qudt:symbol "daP";
7373
qudt:ucumCode "daP"^^qudt:UCUMcs;

qudtlib-data-gen/src/main/resources/si-base-units.ttl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,8 @@ unit:R
189189
] .
190190

191191
unit:L qudt:factorUnit [
192-
qudt:unit unit:DeciM;
193-
qudt:exponent 3
192+
qudt:unit unit:DeciM3;
193+
qudt:exponent 1
194194
] .
195195

196196
unit:PSI

qudtlib-main/src/main/java/io/github/qudtlib/Qudt.java

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -920,7 +920,22 @@ public static QuantityValue quantityValue(BigDecimal value, Unit unit) {
920920
*/
921921
public static QuantityValue convert(QuantityValue from, Unit toUnit)
922922
throws InconvertibleQuantitiesException {
923-
return from.convert(toUnit);
923+
return convert(from, toUnit, null);
924+
}
925+
926+
/**
927+
* Convert the specified {@link QuantityValue} <code>from</code> into the specified target
928+
* {@link Unit} <code>toUnit</code>.
929+
*
930+
* @param from the quantity value to convert
931+
* @param toUnit the target unit
932+
* @param quantityKind optional quantity kind for handling edge cases (temperature difference)
933+
* @return a new {@link QuantityValue} object holding the result.
934+
* @throws InconvertibleQuantitiesException if the conversion is not possible
935+
*/
936+
public static QuantityValue convert(QuantityValue from, Unit toUnit, QuantityKind quantityKind)
937+
throws InconvertibleQuantitiesException {
938+
return from.convert(toUnit, quantityKind);
924939
}
925940

926941
/**
@@ -969,6 +984,23 @@ public static BigDecimal convert(BigDecimal fromValue, String fromUnitIri, Strin
969984
*/
970985
public static BigDecimal convert(BigDecimal fromValue, Unit fromUnit, Unit toUnit)
971986
throws InconvertibleQuantitiesException {
987+
return convert(fromValue, fromUnit, toUnit, null);
988+
}
989+
990+
/**
991+
* Convert the specified <code>fromValue</code>, interpreted to be in the {@link Unit} <code>
992+
* fromUnit</code> into the unit <code>toUnit</code>.
993+
*
994+
* @param fromValue the value to convert
995+
* @param fromUnit the unit of the <code>value</code>
996+
* @param toUnit the target unit
997+
* @param quantityKind optional quantity kind for handling edge cases (temperature difference)
998+
* @return the resulting value
999+
* @throws InconvertibleQuantitiesException if the conversion is not possible
1000+
*/
1001+
public static BigDecimal convert(
1002+
BigDecimal fromValue, Unit fromUnit, Unit toUnit, QuantityKind quantityKind)
1003+
throws InconvertibleQuantitiesException {
9721004
return fromUnit.convert(fromValue, toUnit);
9731005
}
9741006

qudtlib-model/src/main/java/io/github/qudtlib/model/QuantityValue.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,18 @@ public boolean equals(Object o) {
3737
}
3838

3939
public QuantityValue convert(Unit toUnit) throws InconvertibleQuantitiesException {
40-
return new QuantityValue(this.unit.convert(this.value, toUnit), toUnit);
40+
return convert(toUnit, null);
41+
}
42+
43+
/**
44+
* @param toUnit
45+
* @param quantityKind optional quantity kind for handling edge cases
46+
* @return
47+
* @throws InconvertibleQuantitiesException
48+
*/
49+
public QuantityValue convert(Unit toUnit, QuantityKind quantityKind)
50+
throws InconvertibleQuantitiesException {
51+
return new QuantityValue(this.unit.convert(this.value, toUnit, quantityKind), toUnit);
4152
}
4253

4354
@Override

qudtlib-model/src/main/java/io/github/qudtlib/model/Unit.java

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
* @version 1.0
1919
*/
2020
public class Unit extends SelfSmuggler {
21+
private static final String TEMPERATURE_DIFFERENCE = "TemperatureDifference";
2122

2223
public static Definition definition(String iri) {
2324
return new Definition(iri);
@@ -329,8 +330,30 @@ public QuantityValue convertToQuantityValue(BigDecimal value, Unit toUnit) {
329330

330331
public BigDecimal convert(BigDecimal value, Unit toUnit)
331332
throws InconvertibleQuantitiesException {
333+
return convert(value, toUnit, null);
334+
}
335+
336+
/**
337+
* Convert method allowing for special handling depending on the specified quantity kind.
338+
* Introduced to ignore the offset when converting a temperature difference.
339+
*
340+
* @param value
341+
* @param toUnit
342+
* @param quantityKind optional quantity kind for handling edge cases. Pass null for normal
343+
* conversion.
344+
* @return
345+
* @throws InconvertibleQuantitiesException
346+
*/
347+
public BigDecimal convert(BigDecimal value, Unit toUnit, QuantityKind quantityKind)
348+
throws InconvertibleQuantitiesException {
332349
Objects.requireNonNull(value);
333350
Objects.requireNonNull(toUnit);
351+
boolean ignoreOffset = false;
352+
if (quantityKind != null) {
353+
if (quantityKind.getIriLocalname().equals(TEMPERATURE_DIFFERENCE)) {
354+
ignoreOffset = true;
355+
}
356+
}
334357
if (this.equals(toUnit)) {
335358
return value;
336359
}
@@ -343,9 +366,13 @@ public BigDecimal convert(BigDecimal value, Unit toUnit)
343366
"Cannot convert from %s to %s: dimension vectors differ",
344367
this.getIri(), toUnit.getIri()));
345368
}
346-
BigDecimal fromOffset = this.getConversionOffset().orElse(BigDecimal.ZERO);
369+
BigDecimal fromOffset =
370+
ignoreOffset ? BigDecimal.ZERO : this.getConversionOffset().orElse(BigDecimal.ZERO);
347371
BigDecimal fromMultiplier = this.getConversionMultiplier().orElse(BigDecimal.ONE);
348-
BigDecimal toOffset = toUnit.getConversionOffset().orElse(BigDecimal.ZERO);
372+
BigDecimal toOffset =
373+
ignoreOffset
374+
? BigDecimal.ZERO
375+
: toUnit.getConversionOffset().orElse(BigDecimal.ZERO);
349376
BigDecimal toMultiplier = toUnit.getConversionMultiplier().orElse(BigDecimal.ONE);
350377
return value.add(fromOffset)
351378
.multiply(fromMultiplier, MathContext.DECIMAL128)

qudtlib-test/src/test/java/io/github/qudtlib/QudtTests.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.github.qudtlib;
22

3+
import static io.github.qudtlib.model.QuantityKinds.TemperatureDifference;
34
import static io.github.qudtlib.model.Units.*;
45
import static org.junit.jupiter.api.Assertions.*;
56

@@ -499,6 +500,29 @@ public void testConvert_Celsius_to_Fahrenheit() {
499500
Assertions.assertEquals(Qudt.unitIriFromLocalname("DEG_F"), fahrenheit.getUnit().getIri());
500501
}
501502

503+
@Test
504+
public void testConvert_Celsius_to_Fahrenheit_tempdiff() {
505+
QuantityValue celsius100 =
506+
new QuantityValue(new BigDecimal("100"), Qudt.unitFromLocalnameRequired("DEG_C"));
507+
QuantityValue fahrenheit = Qudt.convert(celsius100, DEG_F, TemperatureDifference);
508+
Assertions.assertNotNull(fahrenheit);
509+
MatcherAssert.assertThat(
510+
fahrenheit.getValue(),
511+
Matchers.comparesEqualTo(new BigDecimal("179.9999999999999856000000000000012")));
512+
Assertions.assertEquals(Qudt.unitIriFromLocalname("DEG_F"), fahrenheit.getUnit().getIri());
513+
}
514+
515+
@Test
516+
public void testConvert_Celsius_to_Kelvin_tempdiff() {
517+
QuantityValue celsius100 =
518+
new QuantityValue(new BigDecimal("100"), Qudt.unitFromLocalnameRequired("DEG_C"));
519+
QuantityValue kelvin = Qudt.convert(celsius100, K, TemperatureDifference);
520+
Assertions.assertNotNull(kelvin);
521+
MatcherAssert.assertThat(
522+
kelvin.getValue(), Matchers.comparesEqualTo(new BigDecimal("100")));
523+
Assertions.assertEquals(Qudt.unitIriFromLocalname("K"), kelvin.getUnit().getIri());
524+
}
525+
502526
@Test
503527
public void testConvert_Celsius_to_Fahrenheit_2() {
504528
MatcherAssert.assertThat(

0 commit comments

Comments
 (0)