Physics

This library allows you to perform physical calculation while retaining unit consistency. Units can be added to the system at any time. Named units can be used to display quantities in a proper format. The system also allows you to parse units expressed in their string format from storage.


Keywords
physics, physical, calculation, unit, quantity, SI
License
MIT
Install
Install-Package Physics -Version 2.0.0

Documentation

Physics

A library for physical computation.

Features

  • Free creation of unit systems like the SI system
  • Perform calculations with physical quantities while retaining consistent unit results
  • Add new units on the fly by declaration or parsing
  • Display physical quantities in different units and number formats
  • Serialize and deserialize physical quantities

Usage

Create a new unit system

this.System = UnitSystemFactory.CreateSystem("SI");

//Base units
var m = this.System.AddBaseUnit("m", "metre");
var kg = this.System.AddBaseUnit("kg", "kilogram", true); // flag indicates that kilogram has an inherent prefix
var s = this.System.AddBaseUnit("s", "second");
var A = this.System.AddBaseUnit("A", "ampere");
var K = this.System.AddBaseUnit("K", "kelvin");
var mol = this.System.AddBaseUnit("mol", "mole");
var cd = this.System.AddBaseUnit("cd", "candela");

//Derived units
var Hz = this.System.AddDerivedUnit("Hz", "hertz", s ^ -1);
var N = this.System.AddDerivedUnit("N", "newton", kg * m * (s ^ -2));
var Pa = this.System.AddDerivedUnit("Pa", "pascal", N * (m ^ -2));
var J = this.System.AddDerivedUnit("J", "joule", N * m);
var W = this.System.AddDerivedUnit("W", "watt", J / s);
var C = this.System.AddDerivedUnit("C", "coulomb", s * A);
var V = this.System.AddDerivedUnit("V", "volt", W / A);
var F = this.System.AddDerivedUnit("F", "farad", C / V);
var Ω = this.System.AddDerivedUnit("Ω", "joule", V / A);
var S = this.System.AddDerivedUnit("S", "siemens", A / V);
var Wb = this.System.AddDerivedUnit("Wb", "weber", V * s);
var T = this.System.AddDerivedUnit("T", "tesla", Wb * (s ^ -2));
var H = this.System.AddDerivedUnit("H", "inductance", Wb / A);
var lx = this.System.AddDerivedUnit("lx", "immulinance", (m ^ -2) * cd);
var Sv = this.System.AddDerivedUnit("Sv", "sievert", J / kg);
var kat = this.System.AddDerivedUnit("kat", "katal", (s ^ -1) * mol);

//Incoherent units
var h = this.System.AddDerivedUnit("h", "hour", 60 * 60 * s);

Perform calculations

var kWh = UnitPrefix.k * W * h;
var m3 = m ^ 3;

// 100 kWh
var energy = new Quantity(100, kWh);

// 5 m³
var volume = new Quantity(5, m3);

// 20 kWh/m³
var result = energy / volume;
var expected = new Quantity(20, kWh / m3);

Assert.AreEqual(expected, result);

Convert quantities to equivalent units

var kWh = this.System.AddDerivedUnit("kWh", "kilowatt hour", UnitPrefix.k * this.W * this.h);
var quantity = new Quantity(100, J);
var result = quantity.Convert(kWh);

Assert.AreEqual(quantity, result);

Display results

var quantity = new Quantity(10 * 1000 * 1000, J);

var kWh = this.System.AddDerivedUnit("kWh", "kilowatt hour", UnitPrefix.k * W * h);
string display;

display = quantity.ToString();
Assert.AreEqual("10000000 J", display);

display = quantity.ToString(kWh);
Assert.AreEqual("2.77777777777778 kWh", display);

display = quantity.ToString("N3", kWh);
Assert.AreEqual("2.778 kWh", display);

Serialization

var quantity = new Quantity(100, J / (m ^ 3));

var info = quantity.ToInfo();

var serializer = new JavaScriptSerializer();
var json = serializer.Serialize(info); // {"Amount":100,"Dimension":[-1,1,-2]}
var deserializedInfo = serializer.Deserialize<QuantityInfo>(json);

var result = this.System.FromInfo(deserializedInfo);

Assert.AreEqual(quantity, result);