Skip to content

Commit f7ce00b

Browse files
authored
Inferred division from defined multiplication relations (#1354)
In [#1329](#1329 (comment)) this proposal came up: > Another idea: generate division operators based on multiplication. Right now we define: > ``` > ElectricPotential.Volt = ElectricCurrent.Ampere * ElectricResistance.Ohm (and generate the reverse) > ElectricCurrent.Ampere = ElectricPotential.Volt / ElectricResistance.Ohm > ElectricResistance.Ohm = ElectricPotential.Volt / ElectricCurrent.Ampere > ``` > But those last two could also be generated based on the first. This PR is an experiment implementing this. ### Breaking changes: - `TimeSpan = Volume / VolumeFlow` => `Duration = Volume / VolumeFlow`
1 parent 667eab1 commit f7ce00b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+551
-159
lines changed

CodeGen/Generators/QuantityRelationsParser.cs

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,16 @@ internal static class QuantityRelationsParser
2525
///
2626
/// The format of a relation definition is "Quantity.Unit operator Quantity.Unit = Quantity.Unit" (See examples below).
2727
/// "double" can be used as a unitless operand.
28-
/// "1" can be used as the left operand to define inverse relations.
28+
/// "1" can be used as the result operand to define inverse relations.
29+
///
30+
/// Division relations are inferred from multiplication relations,
31+
/// but this can be skipped if the string ends with "NoInferredDivision".
2932
/// </summary>
3033
/// <example>
3134
/// [
32-
/// "Power.Watt = ElectricPotential.Volt * ElectricCurrent.Ampere",
33-
/// "Speed.MeterPerSecond = Length.Meter / Duration.Second",
34-
/// "ReciprocalLength.InverseMeter = 1 / Length.Meter"
35+
/// "1 = Length.Meter * ReciprocalLength.InverseMeter"
36+
/// "Power.Watt = ElectricPotential.Volt * ElectricCurrent.Ampere",
37+
/// "Mass.Kilogram = MassConcentration.KilogramPerCubicMeter * Volume.CubicMeter -- NoInferredDivision",
3538
/// ]
3639
/// </example>
3740
/// <param name="rootDir">Repository root directory.</param>
@@ -58,10 +61,25 @@ public static void ParseAndApplyRelations(string rootDir, Quantity[] quantities)
5861
RightUnit = r.LeftUnit,
5962
})
6063
.ToList());
64+
65+
// We can infer division relations from multiplication relations.
66+
relations.AddRange(relations
67+
.Where(r => r is { Operator: "*", NoInferredDivision: false })
68+
.Select(r => r with
69+
{
70+
Operator = "/",
71+
LeftQuantity = r.ResultQuantity,
72+
LeftUnit = r.ResultUnit,
73+
ResultQuantity = r.LeftQuantity,
74+
ResultUnit = r.LeftUnit,
75+
})
76+
// Skip division between equal quantities because the ratio is already generated as part of the Arithmetic Operators.
77+
.Where(r => r.LeftQuantity != r.RightQuantity)
78+
.ToList());
6179

6280
// Sort all relations to keep generated operators in a consistent order.
6381
relations.Sort();
64-
82+
6583
var duplicates = relations
6684
.GroupBy(r => r.SortString)
6785
.Where(g => g.Count() > 1)
@@ -73,6 +91,18 @@ public static void ParseAndApplyRelations(string rootDir, Quantity[] quantities)
7391
var list = string.Join("\n ", duplicates);
7492
throw new UnitsNetCodeGenException($"Duplicate inferred relations:\n {list}");
7593
}
94+
95+
var ambiguous = relations
96+
.GroupBy(r => $"{r.LeftQuantity.Name} {r.Operator} {r.RightQuantity.Name}")
97+
.Where(g => g.Count() > 1)
98+
.Select(g => g.Key)
99+
.ToList();
100+
101+
if (ambiguous.Any())
102+
{
103+
var list = string.Join("\n ", ambiguous);
104+
throw new UnitsNetCodeGenException($"Ambiguous inferred relations:\n {list}\n\nHint: you could use NoInferredDivision in the definition file.");
105+
}
76106

77107
foreach (var quantity in quantities)
78108
{
@@ -122,7 +152,7 @@ private static QuantityRelation ParseRelation(string relationString, IReadOnlyDi
122152
{
123153
var segments = relationString.Split(' ');
124154

125-
if (segments is not [_, "=", _, "*" or "/", _])
155+
if (segments is not [_, "=", _, "*", _, ..])
126156
{
127157
throw new Exception($"Invalid relation string: {relationString}");
128158
}
@@ -140,15 +170,14 @@ private static QuantityRelation ParseRelation(string relationString, IReadOnlyDi
140170
var rightUnit = GetUnit(rightQuantity, right.ElementAtOrDefault(1));
141171
var resultUnit = GetUnit(resultQuantity, result.ElementAtOrDefault(1));
142172

143-
if (leftQuantity.Name == "1")
173+
if (resultQuantity.Name == "1")
144174
{
145175
@operator = "inverse";
146-
leftQuantity = resultQuantity;
147-
leftUnit = resultUnit;
148176
}
149177

150178
return new QuantityRelation
151179
{
180+
NoInferredDivision = segments.Contains("NoInferredDivision"),
152181
Operator = @operator,
153182
LeftQuantity = leftQuantity,
154183
LeftUnit = leftUnit,

CodeGen/JsonTypes/QuantityRelation.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ namespace CodeGen.JsonTypes
77
{
88
internal record QuantityRelation : IComparable<QuantityRelation>
99
{
10+
public bool NoInferredDivision = false;
1011
public string Operator = null!;
1112

1213
public Quantity LeftQuantity = null!;

Common/UnitRelations.json

Lines changed: 15 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -1,164 +1,79 @@
11
[
2-
"Acceleration.MeterPerSecondSquared = Force.Newton / Mass.Kilogram",
3-
"Acceleration.MeterPerSecondSquared = SpecificWeight.NewtonPerCubicMeter / Density.KilogramPerCubicMeter",
4-
"Acceleration.MeterPerSecondSquared = Speed.MeterPerSecond / Duration.Second",
2+
"1 = Area.SquareMeter * ReciprocalArea.InverseSquareMeter",
3+
"1 = ElectricResistivity.OhmMeter * ElectricConductivity.SiemensPerMeter",
4+
"1 = Length.Meter * ReciprocalLength.InverseMeter",
5+
"Acceleration.MeterPerSecondSquared = Jerk.MeterPerSecondCubed * Duration.Second",
56
"AmountOfSubstance.Kilomole = MolarFlow.KilomolePerSecond * Duration.Second",
6-
"AmountOfSubstance.Mole = Mass.Kilogram / MolarMass.KilogramPerMole",
7+
"AmountOfSubstance.Mole = Molarity.MolePerCubicMeter * Volume.CubicMeter",
78
"Angle.Radian = RotationalSpeed.RadianPerSecond * Duration.Second",
8-
"Angle.Radian = Torque.NewtonMeter / RotationalStiffness.NewtonMeterPerRadian",
99
"Area.SquareMeter = KinematicViscosity.SquareMeterPerSecond * Duration.Second",
1010
"Area.SquareMeter = Length.Meter * Length.Meter",
11-
"Area.SquareMeter = LinearDensity.KilogramPerMeter / Density.KilogramPerCubicMeter",
12-
"Area.SquareMeter = LuminousIntensity.Candela / Luminance.CandelaPerSquareMeter",
13-
"Area.SquareMeter = Mass.Kilogram / AreaDensity.KilogramPerSquareMeter",
14-
"Area.SquareMeter = MassFlow.KilogramPerSecond / MassFlux.KilogramPerSecondPerSquareMeter",
15-
"Area.SquareMeter = Power.Watt / HeatFlux.WattPerSquareMeter",
16-
"Area.SquareMeter = Volume.CubicMeter / Length.Meter",
17-
"Area.SquareMeter = VolumeFlow.CubicMeterPerSecond / Speed.MeterPerSecond",
18-
"AreaDensity.KilogramPerSquareMeter = Mass.Kilogram / Area.SquareMeter",
19-
"BrakeSpecificFuelConsumption.KilogramPerJoule = double / SpecificEnergy.JoulePerKilogram",
20-
"BrakeSpecificFuelConsumption.KilogramPerJoule = MassFlow.KilogramPerSecond / Power.Watt",
21-
"Density.KilogramPerCubicMeter = double / SpecificVolume.CubicMeterPerKilogram",
22-
"Density.KilogramPerCubicMeter = LinearDensity.KilogramPerMeter / Area.SquareMeter",
23-
"Density.KilogramPerCubicMeter = Mass.Kilogram / Volume.CubicMeter",
24-
"Density.KilogramPerCubicMeter = MassFlow.KilogramPerSecond / VolumeFlow.CubicMeterPerSecond",
25-
"Density.KilogramPerCubicMeter = MassFlux.KilogramPerSecondPerSquareMeter / Speed.MeterPerSecond",
26-
"Density.KilogramPerCubicMeter = SpecificWeight.NewtonPerCubicMeter / Acceleration.MeterPerSecondSquared",
11+
"AreaMomentOfInertia.MeterToTheFourth = Volume.CubicMeter * Length.Meter",
12+
"double = Density.KilogramPerCubicMeter * SpecificVolume.CubicMeterPerKilogram",
2713
"double = SpecificEnergy.JoulePerKilogram * BrakeSpecificFuelConsumption.KilogramPerJoule",
2814
"double = TemperatureDelta.Kelvin * CoefficientOfThermalExpansion.PerKelvin",
29-
"Duration.Hour = ElectricCharge.AmpereHour / ElectricCurrent.Ampere",
30-
"Duration.Second = Energy.Joule / Power.Watt",
31-
"Duration.Second = Force.Newton / ForceChangeRate.NewtonPerSecond",
32-
"Duration.Second = Length.Meter / Speed.MeterPerSecond",
33-
"Duration.Second = Speed.MeterPerSecond / Acceleration.MeterPerSecondSquared",
3415
"DynamicViscosity.NewtonSecondPerMeterSquared = Density.KilogramPerCubicMeter * KinematicViscosity.SquareMeterPerSecond",
3516
"ElectricCharge.AmpereHour = ElectricCurrent.Ampere * Duration.Hour",
36-
"ElectricCharge.Coulomb = Energy.Joule / ElectricPotential.Volt",
37-
"ElectricConductivity.SiemensPerMeter = 1 / ElectricResistivity.OhmMeter",
38-
"ElectricCurrent.Ampere = ElectricCharge.AmpereHour / Duration.Hour",
3917
"ElectricCurrent.Ampere = ElectricCurrentGradient.AmperePerSecond * Duration.Second",
40-
"ElectricCurrent.Ampere = ElectricPotential.Volt / ElectricResistance.Ohm",
41-
"ElectricCurrent.Ampere = Power.Watt / ElectricPotential.Volt",
42-
"ElectricCurrentGradient.AmperePerSecond = ElectricCurrent.Ampere / Duration.Second",
4318
"ElectricPotential.Volt = ElectricCurrent.Ampere * ElectricResistance.Ohm",
44-
"ElectricPotential.Volt = Energy.Joule / ElectricCharge.Coulomb",
45-
"ElectricPotential.Volt = Power.Watt / ElectricCurrent.Ampere",
46-
"ElectricResistance.Ohm = ElectricPotential.Volt / ElectricCurrent.Ampere",
4719
"Energy.Joule = ElectricPotential.Volt * ElectricCharge.Coulomb",
4820
"Energy.Joule = EnergyDensity.JoulePerCubicMeter * Volume.CubicMeter",
4921
"Energy.Joule = Power.Watt * Duration.Second",
5022
"Energy.Joule = SpecificEnergy.JoulePerKilogram * Mass.Kilogram",
5123
"Energy.Joule = TemperatureDelta.Kelvin * Entropy.JoulePerKelvin",
52-
"Entropy.JoulePerKelvin = Energy.Joule / TemperatureDelta.Kelvin",
5324
"Entropy.JoulePerKelvin = SpecificEntropy.JoulePerKilogramKelvin * Mass.Kilogram",
5425
"Force.Newton = ForceChangeRate.NewtonPerSecond * Duration.Second",
5526
"Force.Newton = ForcePerLength.NewtonPerMeter * Length.Meter",
56-
"Force.Newton = ForcePerLength.NewtonPerMeter / ReciprocalLength.InverseMeter",
5727
"Force.Newton = Mass.Kilogram * Acceleration.MeterPerSecondSquared",
58-
"Force.Newton = Power.Watt / Speed.MeterPerSecond",
5928
"Force.Newton = Pressure.Pascal * Area.SquareMeter",
60-
"Force.Newton = Pressure.Pascal / ReciprocalArea.InverseSquareMeter",
61-
"Force.Newton = Torque.NewtonMeter / Length.Meter",
6229
"ForcePerLength.NewtonPerMeter = Force.Newton * ReciprocalLength.InverseMeter",
63-
"ForcePerLength.NewtonPerMeter = Force.Newton / Length.Meter",
64-
"ForcePerLength.NewtonPerMeter = Pressure.Pascal / ReciprocalLength.InverseMeter",
30+
"ForcePerLength.NewtonPerMeter = Pressure.NewtonPerSquareMeter * Length.Meter",
6531
"ForcePerLength.NewtonPerMeter = SpecificWeight.NewtonPerCubicMeter * Area.SquareMeter",
66-
"HeatFlux.WattPerSquareMeter = Power.Watt / Area.SquareMeter",
67-
"Jerk.MeterPerSecondCubed = Acceleration.MeterPerSecondSquared / Duration.Second",
68-
"KinematicViscosity.SquareMeterPerSecond = DynamicViscosity.NewtonSecondPerMeterSquared / Density.KilogramPerCubicMeter",
6932
"KinematicViscosity.SquareMeterPerSecond = Length.Meter * Speed.MeterPerSecond",
70-
"Length.Kilometer = TemperatureDelta.Kelvin / TemperatureGradient.DegreeCelsiusPerKilometer",
71-
"Length.Meter = Area.SquareMeter / Length.Meter",
72-
"Length.Meter = Force.Newton / ForcePerLength.NewtonPerMeter",
73-
"Length.Meter = Mass.Kilogram / LinearDensity.KilogramPerMeter",
74-
"Length.Meter = Pressure.Pascal / SpecificWeight.NewtonPerCubicMeter",
75-
"Length.Meter = ReciprocalLength.InverseMeter / ReciprocalArea.InverseSquareMeter",
76-
"Length.Meter = RotationalStiffness.NewtonMeterPerRadian / RotationalStiffnessPerLength.NewtonMeterPerRadianPerMeter",
7733
"Length.Meter = Speed.MeterPerSecond * Duration.Second",
78-
"Length.Meter = Torque.NewtonMeter / Force.Newton",
79-
"Length.Meter = Volume.CubicMeter / Area.SquareMeter",
8034
"LinearDensity.KilogramPerMeter = Area.SquareMeter * Density.KilogramPerCubicMeter",
81-
"LinearDensity.KilogramPerMeter = Mass.Kilogram / Length.Meter",
82-
"Luminance.CandelaPerSquareMeter = LuminousIntensity.Candela / Area.SquareMeter",
8335
"LuminousIntensity.Candela = Luminance.CandelaPerSquareMeter * Area.SquareMeter",
8436
"Mass.Gram = AmountOfSubstance.Mole * MolarMass.GramPerMole",
8537
"Mass.Kilogram = AreaDensity.KilogramPerSquareMeter * Area.SquareMeter",
8638
"Mass.Kilogram = Density.KilogramPerCubicMeter * Volume.CubicMeter",
87-
"Mass.Kilogram = Energy.Joule / SpecificEnergy.JoulePerKilogram",
88-
"Mass.Kilogram = Force.Newton / Acceleration.MeterPerSecondSquared",
8939
"Mass.Kilogram = LinearDensity.KilogramPerMeter * Length.Meter",
90-
"Mass.Kilogram = Mass.Kilogram / MassFraction.DecimalFraction",
91-
"Mass.Kilogram = MassConcentration.KilogramPerCubicMeter * Volume.CubicMeter",
40+
"Mass.Kilogram = MassConcentration.KilogramPerCubicMeter * Volume.CubicMeter -- NoInferredDivision",
9241
"Mass.Kilogram = MassFlow.KilogramPerSecond * Duration.Second",
9342
"Mass.Kilogram = MassFraction.DecimalFraction * Mass.Kilogram",
94-
"MassConcentration.GramPerCubicMeter = Molarity.MolePerCubicMeter * MolarMass.GramPerMole",
43+
"MassConcentration.KilogramPerCubicMeter = Molarity.MolePerCubicMeter * MolarMass.KilogramPerMole",
9544
"MassConcentration.KilogramPerCubicMeter = VolumeConcentration.DecimalFraction * Density.KilogramPerCubicMeter",
96-
"MassFlow.GramPerSecond = Area.SquareMeter * MassFlux.GramPerSecondPerSquareMeter",
97-
"MassFlow.KilogramPerSecond = Mass.Kilogram / Duration.Second",
45+
"MassFlow.KilogramPerSecond = Area.SquareMeter * MassFlux.KilogramPerSecondPerSquareMeter",
9846
"MassFlow.KilogramPerSecond = MolarFlow.KilomolePerSecond * MolarMass.KilogramPerKilomole",
9947
"MassFlow.KilogramPerSecond = Power.Watt * BrakeSpecificFuelConsumption.KilogramPerJoule",
100-
"MassFlow.KilogramPerSecond = Power.Watt / SpecificEnergy.JoulePerKilogram",
10148
"MassFlow.KilogramPerSecond = VolumeFlow.CubicMeterPerSecond * Density.KilogramPerCubicMeter",
102-
"MassFlux.KilogramPerSecondPerSquareMeter = MassFlow.KilogramPerSecond / Area.SquareMeter",
10349
"MassFlux.KilogramPerSecondPerSquareMeter = Speed.MeterPerSecond * Density.KilogramPerCubicMeter",
104-
"Molarity.MolePerCubicMeter = AmountOfSubstance.Mole / Volume.CubicMeter",
105-
"Molarity.MolePerCubicMeter = MassConcentration.GramPerCubicMeter / MolarMass.GramPerMole",
50+
"MolarFlow.MolePerSecond = VolumeFlow.CubicMeterPerSecond * Molarity.MolePerCubicMeter",
10651
"Molarity.MolePerCubicMeter = Molarity.MolePerCubicMeter * VolumeConcentration.DecimalFraction",
10752
"Power.Watt = ElectricPotential.Volt * ElectricCurrent.Ampere",
10853
"Power.Watt = Energy.Joule * Frequency.PerSecond",
109-
"Power.Watt = Energy.Joule / Duration.Second",
11054
"Power.Watt = Force.Newton * Speed.MeterPerSecond",
11155
"Power.Watt = HeatFlux.WattPerSquareMeter * Area.SquareMeter",
112-
"Power.Watt = MassFlow.KilogramPerSecond / BrakeSpecificFuelConsumption.KilogramPerJoule",
11356
"Power.Watt = SpecificEnergy.JoulePerKilogram * MassFlow.KilogramPerSecond",
57+
"Power.Watt = Torque.NewtonMeter * RotationalSpeed.RadianPerSecond",
11458
"Pressure.NewtonPerSquareMeter = Force.Newton * ReciprocalArea.InverseSquareMeter",
11559
"Pressure.NewtonPerSquareMeter = ForcePerLength.NewtonPerMeter * ReciprocalLength.InverseMeter",
116-
"Pressure.NewtonPerSquareMeter = ForcePerLength.NewtonPerMeter / Length.Meter",
117-
"Pressure.Pascal = Force.Newton / Area.SquareMeter",
11860
"Pressure.Pascal = PressureChangeRate.PascalPerSecond * Duration.Second",
11961
"Pressure.Pascal = SpecificWeight.NewtonPerCubicMeter * Length.Meter",
120-
"PressureChangeRate.PascalPerSecond = Pressure.Pascal / Duration.Second",
12162
"Ratio.DecimalFraction = Area.SquareMeter * ReciprocalArea.InverseSquareMeter",
122-
"ReciprocalArea.InverseSquareMeter = 1 / Area.SquareMeter",
12363
"ReciprocalArea.InverseSquareMeter = ReciprocalLength.InverseMeter * ReciprocalLength.InverseMeter",
124-
"ReciprocalLength.InverseMeter = 1 / Length.Meter",
125-
"ReciprocalLength.InverseMeter = ReciprocalArea.InverseSquareMeter / ReciprocalLength.InverseMeter",
126-
"RotationalSpeed.RadianPerSecond = Angle.Radian / Duration.Second",
127-
"RotationalSpeed.RadianPerSecond = Power.Watt / Torque.NewtonMeter",
64+
"ReciprocalLength.InverseMeter = Length.Meter * ReciprocalArea.InverseSquareMeter",
12865
"RotationalStiffness.NewtonMeterPerRadian = RotationalStiffnessPerLength.NewtonMeterPerRadianPerMeter * Length.Meter",
129-
"RotationalStiffness.NewtonMeterPerRadian = Torque.NewtonMeter / Angle.Radian",
130-
"RotationalStiffnessPerLength.NewtonMeterPerRadianPerMeter = RotationalStiffness.NewtonMeterPerRadian / Length.Meter",
131-
"SpecificEnergy.JoulePerKilogram = double / BrakeSpecificFuelConsumption.KilogramPerJoule",
132-
"SpecificEnergy.JoulePerKilogram = Energy.Joule / Mass.Kilogram",
133-
"SpecificEnergy.JoulePerKilogram = Power.Watt / MassFlow.KilogramPerSecond",
13466
"SpecificEnergy.JoulePerKilogram = SpecificEntropy.JoulePerKilogramKelvin * TemperatureDelta.Kelvin",
13567
"SpecificEnergy.JoulePerKilogram = Speed.MeterPerSecond * Speed.MeterPerSecond",
136-
"SpecificEntropy.JoulePerKilogramKelvin = Entropy.JoulePerKelvin / Mass.Kilogram",
137-
"SpecificEntropy.JoulePerKilogramKelvin = SpecificEnergy.JoulePerKilogram / TemperatureDelta.Kelvin",
13868
"SpecificWeight.NewtonPerCubicMeter = Acceleration.MeterPerSecondSquared * Density.KilogramPerCubicMeter",
139-
"SpecificWeight.NewtonPerCubicMeter = Pressure.Pascal / Length.Meter",
14069
"Speed.MeterPerSecond = Acceleration.MeterPerSecondSquared * Duration.Second",
141-
"Speed.MeterPerSecond = KinematicViscosity.SquareMeterPerSecond / Length.Meter",
142-
"Speed.MeterPerSecond = Length.Meter / Duration.Second",
143-
"Speed.MeterPerSecond = MassFlux.KilogramPerSecondPerSquareMeter / Density.KilogramPerCubicMeter",
144-
"Speed.MeterPerSecond = VolumeFlow.CubicMeterPerSecond / Area.SquareMeter",
14570
"TemperatureDelta.DegreeCelsius = TemperatureChangeRate.DegreeCelsiusPerSecond * Duration.Second",
14671
"TemperatureDelta.DegreeCelsius = TemperatureGradient.DegreeCelsiusPerKilometer * Length.Kilometer",
147-
"TemperatureDelta.Kelvin = Energy.Joule / Entropy.JoulePerKelvin",
148-
"TemperatureGradient.KelvinPerMeter = TemperatureDelta.Kelvin / Length.Meter",
14972
"Torque.NewtonMeter = ForcePerLength.NewtonPerMeter * Area.SquareMeter",
15073
"Torque.NewtonMeter = Length.Meter * Force.Newton",
151-
"Torque.NewtonMeter = Power.Watt / RotationalSpeed.RadianPerSecond",
15274
"Torque.NewtonMeter = RotationalStiffness.NewtonMeterPerRadian * Angle.Radian",
153-
"Volume.CubicMeter = AmountOfSubstance.Mole / Molarity.MolePerCubicMeter",
154-
"Volume.CubicMeter = AreaMomentOfInertia.MeterToTheFourth / Length.Meter",
15575
"Volume.CubicMeter = Length.Meter * Area.SquareMeter",
156-
"Volume.CubicMeter = Mass.Kilogram / Density.KilogramPerCubicMeter",
15776
"Volume.CubicMeter = SpecificVolume.CubicMeterPerKilogram * Mass.Kilogram",
15877
"Volume.CubicMeter = VolumeFlow.CubicMeterPerSecond * Duration.Second",
159-
"VolumeConcentration.DecimalFraction = MassConcentration.KilogramPerCubicMeter / Density.KilogramPerCubicMeter",
160-
"VolumeFlow.CubicMeterPerSecond = Area.SquareMeter * Speed.MeterPerSecond",
161-
"VolumeFlow.CubicMeterPerSecond = MassFlow.KilogramPerSecond / Density.KilogramPerCubicMeter",
162-
"VolumeFlow.CubicMeterPerSecond = MolarFlow.MolePerSecond / Molarity.MolePerCubicMeter",
163-
"VolumeFlow.CubicMeterPerSecond = Volume.CubicMeter / Duration.Second"
78+
"VolumeFlow.CubicMeterPerSecond = Area.SquareMeter * Speed.MeterPerSecond"
16479
]

UnitsNet.Tests/CustomCode/VolumeTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,8 @@ public void VolumeDividedByDurationEqualsVolumeFlow()
151151
[Fact]
152152
public void VolumeDividedByVolumeFlowEqualsTimeSpan()
153153
{
154-
TimeSpan timeSpan = Volume.FromCubicMeters(20) / VolumeFlow.FromCubicMetersPerSecond(2);
155-
Assert.Equal(TimeSpan.FromSeconds(10), timeSpan);
154+
Duration duration = Volume.FromCubicMeters(20) / VolumeFlow.FromCubicMetersPerSecond(2);
155+
Assert.Equal(Duration.FromSeconds(10), duration);
156156
}
157157
}
158158
}

UnitsNet/CustomCode/Quantities/Volume.extra.cs

Lines changed: 0 additions & 16 deletions
This file was deleted.

0 commit comments

Comments
 (0)