Unitful - derived unit simplification?

I am fairly new to Unitful and am running into an issue when I multiply a derived unit by one of its component units and want the resulting unit to simplify into the other component unit.

Example:

``````> 1u"M" * 1u"L"
1 L M  # This should equal "1 mol"

> 1u"mol/L" * 1u"L"
1 mol  # The desired behavior works with base units.
``````
``````> typeof(1u"M")
Quantity{Int64, π πβ»Β³, Unitful.FreeUnits{(M,), π πβ»Β³, nothing}}

> typeof(1u"L")
Quantity{Int64, πΒ³, Unitful.FreeUnits{(L,), πΒ³, nothing}}
``````

Is there an easy way to fix this instead of resorting to only using base units?

Edit: I run into the same issue when multiplying liters and cm3, where they should cancel out.

``````> 1u"L" * 1u"1/cm^3"
1 L cmβ»Β³
``````
1 Like

if you know what unit you expect, you can use `uconvert` or call the units as functions:

``````julia> uconvert(u"mol", 1u"M" * 1u"L")
1 mol

julia> uconvert(NoUnits, 1u"L" * 1u"1/cm^3")
1000

julia> 1u"M" * 1u"L" |> u"mol"
1 mol

julia> 1u"L" * 1u"1/cm^3" |> NoUnits
1000
``````

if you donβt know the dimension, you can use `upreferred`, which by default shows SI units (this is configurable with `preferunits`)

``````julia> upreferred(3u"J/kg")
3 m^2 s^-2
``````

see the relevant documentation for more: Conversion/promotion Β· Unitful.jl

5 Likes

Thank you! `upreferred` simplifies the units perfectly.

Now my examples become:

``````julia> 1u"M" * 1u"L" |> upreferred
1 mol

julia> 1u"L" * 1u"1/cm^3" |> upreferred
1000
``````

A related post recently came up with the same issue: Make Unitful simplify expressions like 1ΞΌm/1m to a unitless value by default