dim
is a single-file, header-only library of static dimensional analysis of
scalar and vector quantities. It is targeted mainly for physics simulation
using reduced units; so, no specific units of measurement like CGS or SI are
assumed, and no unit conversion is done.
dim
has no dependency. Just copy dim.hpp to your include directory
and you are done! Change file name and/or namespace identifier if necessary.
#include <dim.hpp>
namespace units
{
using mass = dim::scalar<double, dim::mech::mass>;
using time = dim::scalar<double, dim::mech::time>;
using velocity = dim::vector<double, dim::mech::velocity, 3>;
using acceleration = dim::vector<double, dim::mech::acceleration, 3>;
using force = dim::vector<double, dim::mech::force, 3>;
}
int main()
{
units::mass mass{1.23};
units::force force{1.2, 3.4, 5.6};
units::acceleration accel = force / mass;
units::velocity velocity = accel // Compile error
units::velocity velocity = accel * units::time{1.0}; // OK!
}
Use dim::scalar<T, D>
template to define scalar quantities:
using length = dim::scalar<double, dim::mech::length>;
using time = dim::scalar<double, dim::mech::time>;
using speed = dim::scalar<double, dim::mech::speed>;
length r{1.0};
time t{0.1};
speed v = r / t;
The first parameter T
is the underlying numeric type and the second parameter
D
is a tag type identifying physical dimension. These predefined tags are
available:
dim::mech::number
dim::mech::length
dim::mech::mass
dim::mech::time
dim::mech::speed
dim::mech::acceleration
dim::mech::momentum
dim::mech::force
dim::mech::energy
Use dim::mechanilcal_dimension
to define a tag with arbitrary dimension:
using my_tag = dim::mechanical_dimension<L, M, T>; // Length, Mass, Time
Use dim::vector<T, D, N>
template to define vector quantities:
using force = dim::vector<double, dim::mech::force, 3>;
using acceleration = dim::vector<double, dim::mech::acceleration, 3>;
using mass = dim::scalar<double, dim::mech::mass>;
mass m{1.0};
force f{1.0, 2.0, 3.0};
acceleration a = f / m;
The first parameter T
is the underlying numeric type, the second parameter
D
is a tag type identifying physical dimension, and the last parameter N
is the spatial dimension.
dim
also provides dim::point<T, D, N>
for representing geometrical points:
using position = dim::point<double, dim::mech::legnth, 3>;
using displacement = dim::vector<double, dim::mech::length, 3>;
position p1{1.0, 2.0, 3.0};
position p2{4.0, 5.0, 6.0};
displacement r = p1 - p2;
Note how different types are used to represent a position and a displacement. It may look pedantic, but it prevents subtle bugs in complex calculations such as molecular dynamics simulations.
Move to the repository root and type following commands to run tests:
git submodule update --init
mkdir tests/build
cd tests/build
cmake ..
cmake --build .
./run
Boost Software License, Version 1.0.
License text is included in the header file. So, you don't need to copy the license file (LICENSE.txt) into your project.
These are also header-only dimensional analysis libraries:
These projects focus on scalar quantities and provide implicit unit conversion.