Skip to content

Dimensional analysis of a formula: MathS.Dimensions.Of and DimensionlessGroups #2292

Open

Description

@Rafael-SOWNet

What it is. Given the dimension of each variable (a map Variable → Dimension over the seven SI base dimensions, with rational exponents), say whether a formula is physically meaningful, what dimension it has, and where it stops making sense; and give the Buckingham π groups of a set of variables.

var (L, T) = (Dimension.Length, Dimension.Time);
var dims = new Dictionary<Entity.Variable, Dimension> { ["g"] = L / T.Pow(2), ["h"] = L, ["t"] = T };
MathS.Dimensions.Of("sqrt(2 g h)", dims);   // Consistent: L T^-1
MathS.Dimensions.Of("h + g t", dims);       // Inconsistent at h + g * t: h has dimension L and g * t has dimension L T^-1, ...
// pipe: rho M L^-3, v L T^-1, d L, mu M L^-1 T^-1
MathS.Dimensions.DimensionlessGroups(new Entity.Variable[] { "rho", "v", "d", "mu" }, pipe);   // [ mu / (rho * v * d) ]

Why here. Units libraries (UnitsNet) check values; nothing in .NET checks a formula. The walk needs every node type, which the kernel has.

Design points to agree on.

  • The dimension map is passed, not attached to variables, so nothing about printing, parsing or simplification changes, and the type layer of Typed variables #1237 / Pending breakages: changes agreed or arguable that cannot ship before a major version #1019 is not pre-empted.
  • Three-valued: Consistent, Inconsistent (with the subexpression and a reason), Undetermined (undeclared variable, unread node, dimensional base to a symbolic power). Never a guess.
  • Nothing is simplified first: sin(x) - sin(x) with x a length is inconsistent.
  • A literal 0 or oo fits any dimension where added or compared (v = 0).
  • Exponents of a dimensional base must be rational; L^pi is inconsistent.

Packaging (Packaging.md §4). No clause fires: no dependency, no floor raise, no data, composes the kernel; not on any default path, so (B) does not apply. → kernel. A UnitsNet bridge would be (D) and separate; not part of this.

Implementation, for judging the design against working code. Branch feat/dimensional-analysis, one commit on master 87a0eff: Functions/Dimensions/*, Convenience/MathS.Dimensions.cs, Tests/UnitTests/Convenience/DimensionsTest.cs (38 cases), +54 lines of PublicApi.txt. UnitTests 18335 passed / 13 skipped, FSharpWrapperUnitTests 134 passed. No existing answer moves, so no BREAKING-CHANGES entry. The pull request will follow Accepted.

Worked use, together with the shader-source feature (#2293). A water wave from ω² = g k tanh(k h): the check gives ω the dimension T⁻¹ and rejects the shallow-water typo ω = √(g k h) inside the phase; the π groups are k A, k h and g k t².

Milestone: 2.7.0 (additive).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions