Skip to content
This repository was archived by the owner on Nov 14, 2025. It is now read-only.

Commit 968d7cb

Browse files
Add tests for momentum, angular momentum, and moment of inertia calculations and conversions
1 parent 49b759f commit 968d7cb

9 files changed

Lines changed: 269 additions & 3 deletions

File tree

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
namespace ktsu.PhysicalQuantity.AngularMomentum;
2+
3+
using System.Numerics;
4+
using ktsu.PhysicalQuantity.AngularVelocity;
5+
using ktsu.PhysicalQuantity.Force;
6+
using ktsu.PhysicalQuantity.Generic;
7+
using ktsu.PhysicalQuantity.MomentOfInertia;
8+
9+
[SIUnit("kg·m²/s", "kilogram square meter per second", "kilogram square meters per second")]
10+
public sealed record AngularMomentum
11+
: PhysicalQuantity<AngularMomentum>
12+
, IIntegralOperators<AngularMomentum, AngularVelocity, Force>
13+
, IDerivativeOperators<AngularMomentum, AngularVelocity, MomentOfInertia>
14+
{
15+
public static Force operator *(AngularMomentum left, AngularVelocity right) =>
16+
IIntegralOperators<AngularMomentum, AngularVelocity, Force>.Integrate(left, right);
17+
18+
public static MomentOfInertia operator /(AngularMomentum left, AngularVelocity right) =>
19+
IDerivativeOperators<AngularMomentum, AngularVelocity, MomentOfInertia>.Derive(left, right);
20+
}
21+
22+
public static class AngularMomentumConversions
23+
{
24+
public static AngularMomentum KilogramSquareMetersPerSecond<TNumber>(this TNumber value)
25+
where TNumber : INumber<TNumber>
26+
=> value.ConvertToQuantity<TNumber, AngularMomentum>();
27+
28+
public static TNumber KilogramSquareMetersPerSecond<TNumber>(this AngularMomentum value)
29+
where TNumber : INumber<TNumber>
30+
=> value.ConvertToNumber().To<TNumber>();
31+
32+
public static AngularMomentum GramSquareMetersPerSecond<TNumber>(this TNumber value)
33+
where TNumber : INumber<TNumber>
34+
=> value.ConvertToQuantity<TNumber, AngularMomentum>(Constants.Milli);
35+
36+
public static TNumber GramSquareMetersPerSecond<TNumber>(this AngularMomentum value)
37+
where TNumber : INumber<TNumber>
38+
=> value.ConvertToNumber(Constants.Milli).To<TNumber>();
39+
40+
public static AngularMomentum MilligramSquareMetersPerSecond<TNumber>(this TNumber value)
41+
where TNumber : INumber<TNumber>
42+
=> value.ConvertToQuantity<TNumber, AngularMomentum>(Constants.Micro);
43+
44+
public static TNumber MilligramSquareMetersPerSecond<TNumber>(this AngularMomentum value)
45+
where TNumber : INumber<TNumber>
46+
=> value.ConvertToNumber(Constants.Micro).To<TNumber>();
47+
}

PhysicalQuantity/Quantities/Mass.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ namespace ktsu.PhysicalQuantity.Mass;
77
using ktsu.PhysicalQuantity.Force;
88
using ktsu.PhysicalQuantity.Generic;
99
using ktsu.PhysicalQuantity.MolarMass;
10+
using ktsu.PhysicalQuantity.Momentum;
11+
using ktsu.PhysicalQuantity.Velocity;
1012
using ktsu.PhysicalQuantity.Volume;
1113

1214
/// <summary>
@@ -19,11 +21,13 @@ public sealed record Mass
1921
, IDerivativeOperators<Mass, Density, Volume>
2022
, IDerivativeOperators<Mass, MolarMass, AmountOfSubstance>
2123
, IDerivativeOperators<Mass, AmountOfSubstance, MolarMass>
24+
, IIntegralOperators<Mass, Velocity, Momentum>
2225
, IIntegralOperators<Mass, Acceleration, Force>
2326
{
2427
public static Force operator *(Mass left, Acceleration right) =>
2528
IIntegralOperators<Mass, Acceleration, Force>.Integrate(left, right);
26-
29+
public static Momentum operator *(Mass left, Velocity right) =>
30+
IIntegralOperators<Mass, Velocity, Momentum>.Integrate(left, right);
2731
public static Density operator /(Mass left, Volume right) =>
2832
IDerivativeOperators<Mass, Volume, Density>.Derive(left, right);
2933

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
namespace ktsu.PhysicalQuantity.MomentOfInertia;
2+
3+
using System.Numerics;
4+
using ktsu.PhysicalQuantity.AngularMomentum;
5+
using ktsu.PhysicalQuantity.AngularVelocity;
6+
using ktsu.PhysicalQuantity.Generic;
7+
using ktsu.PhysicalQuantity.Length;
8+
using ktsu.PhysicalQuantity.Mass;
9+
10+
[SIUnit("kg·m²", "kilogram square meter", "kilogram square meters")]
11+
public sealed record MomentOfInertia
12+
: PhysicalQuantity<MomentOfInertia>
13+
, IIntegralOperators<MomentOfInertia, AngularVelocity, AngularMomentum>
14+
{
15+
public static AngularMomentum operator *(MomentOfInertia left, AngularVelocity right) =>
16+
IIntegralOperators<MomentOfInertia, AngularVelocity, AngularMomentum>.Integrate(left, right);
17+
18+
public static MomentOfInertia FromMassAndRadius(Mass mass, Length radius) =>
19+
Create(mass.Quantity * radius.Quantity.Squared());
20+
}
21+
22+
public static class MomentOfInertiaConversions
23+
{
24+
public static MomentOfInertia KilogramSquareMeters<TNumber>(this TNumber value)
25+
where TNumber : INumber<TNumber>
26+
=> value.ConvertToQuantity<TNumber, MomentOfInertia>();
27+
28+
public static TNumber KilogramSquareMeters<TNumber>(this MomentOfInertia value)
29+
where TNumber : INumber<TNumber>
30+
=> value.ConvertToNumber().To<TNumber>();
31+
32+
public static MomentOfInertia GramSquareMeters<TNumber>(this TNumber value)
33+
where TNumber : INumber<TNumber>
34+
=> value.ConvertToQuantity<TNumber, MomentOfInertia>(Constants.Milli);
35+
36+
public static TNumber GramSquareMeters<TNumber>(this MomentOfInertia value)
37+
where TNumber : INumber<TNumber>
38+
=> value.ConvertToNumber(Constants.Milli).To<TNumber>();
39+
40+
public static MomentOfInertia MilligramSquareMeters<TNumber>(this TNumber value)
41+
where TNumber : INumber<TNumber>
42+
=> value.ConvertToQuantity<TNumber, MomentOfInertia>(Constants.Micro);
43+
44+
public static TNumber MilligramSquareMeters<TNumber>(this MomentOfInertia value)
45+
where TNumber : INumber<TNumber>
46+
=> value.ConvertToNumber(Constants.Micro).To<TNumber>();
47+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
namespace ktsu.PhysicalQuantity.Momentum;
2+
3+
using System.Numerics;
4+
using ktsu.PhysicalQuantity.Force;
5+
using ktsu.PhysicalQuantity.Generic;
6+
using ktsu.PhysicalQuantity.Mass;
7+
using ktsu.PhysicalQuantity.Velocity;
8+
9+
[SIUnit("kg·m/s", "kilogram meter per second", "kilogram meters per second")]
10+
public sealed record Momentum
11+
: PhysicalQuantity<Momentum>
12+
, IIntegralOperators<Momentum, Velocity, Force>
13+
, IDerivativeOperators<Momentum, Velocity, Mass>
14+
{
15+
public static Force operator *(Momentum left, Velocity right) =>
16+
IIntegralOperators<Momentum, Velocity, Force>.Integrate(left, right);
17+
18+
public static Mass operator /(Momentum left, Velocity right) =>
19+
IDerivativeOperators<Momentum, Velocity, Mass>.Derive(left, right);
20+
}
21+
22+
public static class MomentumConversions
23+
{
24+
public static Momentum KilogramMetersPerSecond<TNumber>(this TNumber value)
25+
where TNumber : INumber<TNumber>
26+
=> value.ConvertToQuantity<TNumber, Momentum>();
27+
28+
public static TNumber KilogramMetersPerSecond<TNumber>(this Momentum value)
29+
where TNumber : INumber<TNumber>
30+
=> value.ConvertToNumber().To<TNumber>();
31+
32+
public static Momentum GramMetersPerSecond<TNumber>(this TNumber value)
33+
where TNumber : INumber<TNumber>
34+
=> value.ConvertToQuantity<TNumber, Momentum>(Constants.Milli);
35+
36+
public static TNumber GramMetersPerSecond<TNumber>(this Momentum value)
37+
where TNumber : INumber<TNumber>
38+
=> value.ConvertToNumber(Constants.Milli).To<TNumber>();
39+
40+
public static Momentum MilligramMetersPerSecond<TNumber>(this TNumber value)
41+
where TNumber : INumber<TNumber>
42+
=> value.ConvertToQuantity<TNumber, Momentum>(Constants.Micro);
43+
44+
public static TNumber MilligramMetersPerSecond<TNumber>(this Momentum value)
45+
where TNumber : INumber<TNumber>
46+
=> value.ConvertToNumber(Constants.Micro).To<TNumber>();
47+
}

PhysicalQuantity/Quantities/PhysicalQuantity.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,28 @@ public sealed override string ToString()
4747

4848
public static bool operator >=(PhysicalQuantity<TSelf> left, TSelf right) =>
4949
left is null ? right is null : left.CompareTo(right) >= 0;
50+
51+
public TSelf Pow<TPower>(TPower power)
52+
where TPower : INumber<TPower>
53+
{
54+
ArgumentNullException.ThrowIfNull(power);
55+
56+
return Create(Quantity.Pow(power.ToSignificantNumber()));
57+
}
58+
59+
public TSelf Abs() => Create(Quantity.Abs());
60+
61+
public TSelf Clamp<T1, T2>(T1 min, T2 max)
62+
where T1 : INumber<T1>
63+
where T2 : INumber<T2>
64+
=> Create(Quantity.Clamp(min.ToSignificantNumber(), max.ToSignificantNumber()));
65+
66+
protected TSelf ConversionAdd(SignificantNumber other)
67+
{
68+
ArgumentNullException.ThrowIfNull(other);
69+
70+
return Create(Quantity + other);
71+
}
5072
}
5173

5274
/// <summary>

PhysicalQuantity/Quantities/Velocity.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ namespace ktsu.PhysicalQuantity.Velocity;
44
using ktsu.PhysicalQuantity.Acceleration;
55
using ktsu.PhysicalQuantity.Generic;
66
using ktsu.PhysicalQuantity.Length;
7+
using ktsu.PhysicalQuantity.Mass;
8+
using ktsu.PhysicalQuantity.Momentum;
79
using ktsu.PhysicalQuantity.Time;
810
using ktsu.SignificantNumber;
911

@@ -16,13 +18,14 @@ public sealed record Velocity
1618
: PhysicalQuantity<Velocity>
1719
, IDerivativeOperators<Velocity, Time, Acceleration>
1820
, IIntegralOperators<Velocity, Time, Length>
21+
, IIntegralOperators<Velocity, Mass, Momentum>
1922
{
2023
public static Acceleration operator /(Velocity left, Time right) =>
2124
IDerivativeOperators<Velocity, Time, Acceleration>.Derive(left, right);
22-
2325
public static Length operator *(Velocity left, Time right) =>
2426
IIntegralOperators<Velocity, Time, Length>.Integrate(left, right);
25-
27+
public static Momentum operator *(Velocity left, Mass right) =>
28+
IIntegralOperators<Velocity, Mass, Momentum>.Integrate(left, right);
2629
}
2730

2831
/// <summary>

Test/AngularMomentumTests.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
namespace ktsu.PhysicalQuantity.Test;
2+
3+
using ktsu.PhysicalQuantity.AngularMomentum;
4+
using ktsu.PhysicalQuantity.AngularVelocity;
5+
using ktsu.PhysicalQuantity.MomentOfInertia;
6+
using ktsu.SignificantNumber;
7+
using Microsoft.VisualStudio.TestTools.UnitTesting;
8+
9+
[TestClass]
10+
public class AngularMomentumTests
11+
{
12+
[TestMethod]
13+
public void TestAngularMomentumCalculation()
14+
{
15+
var momentOfInertia = 5.KilogramSquareMeters();
16+
var angularVelocity = 3.RadiansPerSecond();
17+
var angularMomentum = momentOfInertia * angularVelocity;
18+
19+
Assert.AreEqual(15.ToSignificantNumber(), angularMomentum.KilogramSquareMetersPerSecond<SignificantNumber>());
20+
}
21+
22+
[TestMethod]
23+
public void TestAngularMomentumConversions()
24+
{
25+
var angularMomentum = 20.KilogramSquareMetersPerSecond();
26+
Assert.AreEqual(20.ToSignificantNumber(), angularMomentum.KilogramSquareMetersPerSecond<SignificantNumber>());
27+
}
28+
}

Test/MomentOfInertiaTests.cs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
namespace ktsu.PhysicalQuantity.Test;
2+
3+
using ktsu.PhysicalQuantity.AngularMomentum;
4+
using ktsu.PhysicalQuantity.AngularVelocity;
5+
using ktsu.PhysicalQuantity.Length;
6+
using ktsu.PhysicalQuantity.Mass;
7+
using ktsu.PhysicalQuantity.MomentOfInertia;
8+
using ktsu.SignificantNumber;
9+
using Microsoft.VisualStudio.TestTools.UnitTesting;
10+
11+
[TestClass]
12+
public class MomentOfInertiaTests
13+
{
14+
[TestMethod]
15+
public void TestMomentOfInertiaCalculation()
16+
{
17+
var mass = 10.Kilograms();
18+
var radius = 2.Meters();
19+
var momentOfInertia = MomentOfInertia.FromMassAndRadius(mass, radius);
20+
21+
Assert.AreEqual(40.ToSignificantNumber(), momentOfInertia.KilogramSquareMeters<SignificantNumber>());
22+
}
23+
24+
[TestMethod]
25+
public void TestMomentOfInertiaConversions()
26+
{
27+
var momentOfInertia = 50.KilogramSquareMeters();
28+
Assert.AreEqual(50.ToSignificantNumber(), momentOfInertia.KilogramSquareMeters<SignificantNumber>());
29+
}
30+
31+
[TestMethod]
32+
public void TestMomentOfInertiaAndAngularMomentum()
33+
{
34+
var momentOfInertia = 10.KilogramSquareMeters();
35+
var angularVelocity = 2.RadiansPerSecond();
36+
var angularMomentum = momentOfInertia * angularVelocity;
37+
38+
Assert.AreEqual(20.ToSignificantNumber(), angularMomentum.KilogramSquareMetersPerSecond<SignificantNumber>());
39+
}
40+
}

Test/MomentumTests.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
namespace ktsu.PhysicalQuantity.Test;
2+
3+
using ktsu.PhysicalQuantity.Mass;
4+
using ktsu.PhysicalQuantity.Momentum;
5+
using ktsu.PhysicalQuantity.Velocity;
6+
using ktsu.SignificantNumber;
7+
using Microsoft.VisualStudio.TestTools.UnitTesting;
8+
9+
[TestClass]
10+
public class MomentumTests
11+
{
12+
[TestMethod]
13+
public void TestMomentumCalculation()
14+
{
15+
var mass = 5.Kilograms();
16+
var velocity = 10.MetersPerSecond();
17+
var momentum = mass * velocity;
18+
19+
Assert.AreEqual(50.ToSignificantNumber(), momentum.KilogramMetersPerSecond<SignificantNumber>());
20+
}
21+
22+
[TestMethod]
23+
public void TestMomentumConversions()
24+
{
25+
var momentum = 100.KilogramMetersPerSecond();
26+
Assert.AreEqual(100.ToSignificantNumber(), momentum.KilogramMetersPerSecond<SignificantNumber>());
27+
}
28+
}

0 commit comments

Comments
 (0)