dimensional_analyser

Crates.iodimensional_analyser
lib.rsdimensional_analyser
version0.2.0
created_at2025-12-06 20:27:19.091165+00
updated_at2025-12-28 06:13:57.815455+00
descriptionRuntime dimensional analysis and unit-aware quantities for Rust
homepage
repositoryhttps://github.com/Taro9000/dimensional_analyser
max_upload_size
id1970718
size85,903
(Taro9000)

documentation

https://docs.rs/dimensional_analyser

README

dimensional_analyser

A small Rust library for runtime dimensional analysis and unit conversion.

This crate provides:

  • A Dimension type representing derived physical dimensions (exponents and scaling factor).
  • A Quantity type that combines a numeric value with a Dimension and supports arithmetic and conversion.
  • Algorithms to compute exponents required to express a target dimension as a product of base dimensions (uses a Bareiss elimination solver internally).
  • Several predefined unit systems (SI and example unit sets) in src/dimensions/.

The library is designed to be flexible: you can create new base dimensions at runtime, apply metric prefixes, raise dimensions to powers, and convert between compatible quantities (including exponent-aware conversions, e.g. area/length conversions).

Features

  • Create base dimensions dynamically with Dimension::new.
  • Compose and manipulate derived dimensions with multiplication, division and powering.
  • Convert between quantities that are compatible via exponent solving (e.g., derive energy from mass, length and time).
  • Includes unit collections in src/dimensions/ such as an SI-like set. Tests demonstrate conversions with imperial and other example units.

Quick example

Example usage (based on src/main.rs and the library docs):

use dimensional_analyser::{Result, dim, dimension::{DIMENSIONLESS, Dimension, Prefix}, dimensions::le_systeme_international_d_unites::{HOUR, JOULE, LITER, MINUTE, base_units::{KILOGRAM, METER, SECOND}}, quantity::{DimensionalAnalysableQuantity, Quantity}};

fn main() -> Result {
	let height       = Quantity::new(5 , dim!(METER));
	let mass         = Quantity::new(15, dim!(KILOGRAM));
	let acceleration = Quantity::new(9.81,dim!(METER SECOND^-2));
	let speed        = Quantity::new(20, dim!(METER SECOND^-1));

	let energy = dim!(JOULE);
	let potential_energy = [&height, &mass, &acceleration].convert_to(energy)?;
	let kinetic_energy = [&mass, &speed].convert_to(energy)? / 2;
	let total_energy = (&potential_energy + &kinetic_energy)?;

	println!("Potential energy: {}", potential_energy);
	println!("Kinetic energy: {}", kinetic_energy);
	println!("Total energy: {}", total_energy);

	Ok(())
}

Crate layout / API overview

  • src/dimension.rs — core Dimension type, prefixes, exponent algebra, conversion-exponent calculation.
  • src/quantity.rsQuantity type, arithmetic (+, -, *, /), and conversion helpers for multiple quantities.
  • src/bareiss_eliminator.rs — helper matrix code and Bareiss elimination solver used to compute exponents.
  • src/dimensions/ — predefined unit sets (e.g., SI-like units, examples).

Publicly exported items include (non exhaustive):

  • Dimension and helpers like Prefix and convenience methods (square, cube, power, prefix).
  • Quantity with new, convert_to, arithmetic and inspection helpers.
  • dim! macro and constant-backed unit sets in dimensions.

Refer to the crate-level docs in src/lib.rs for a short annotated example.

There are optional features defined in Cargo.toml: debug-print and sci-notation

Contributing

  • Bug reports and pull requests are welcome. Please include small, focused changes and tests when appropriate.
  • Prefer small, well-documented commits.

Notes

  • This project includes an internal Bareiss matrix solver implementation used for solving the exponent linear systems; tests cover many of those cases.
Commit count: 0

cargo fmt