SciML / ModelingToolkit.jl

An acausal modeling framework for automatically parallelized scientific machine learning (SciML) in Julia. A computer algebra system for integrated symbolics for physics-informed machine learning and automated transformations of differential equations
https://mtk.sciml.ai/dev/
Other
1.41k stars 204 forks source link

Error with `ModelingToolkit.get_unit` #2679

Open aelmokadem opened 5 months ago

aelmokadem commented 5 months ago

Hi,

I am getting the error below with ModelingToolkit.get_unit. Seems like a bug to me!

Code to reproduce error

using DifferentialEquations, ModelingToolkit, Unitful

function MOD(; name)
    pars = @parameters begin
        k = 1.0, [unit = u"hr^-1"]
    end

    @variables t [unit = u"hr"]
    Dt = Differential(t)

    vars = @variables begin
        (A(t) = 10.0), [unit = u"nmol"]
    end

    eqs = [Dt(A) ~ -k*A]

    ODESystem(eqs, t, vars, pars; name=name)
end

@mtkbuild mod = MOD()

ModelingToolkit.get_unit(mod.k)

Error:

ERROR: ModelingToolkit.ValidationError("hr⁻¹ doesn't have any unit.")
Stacktrace:
 [1] screen_unit(result::Unitful.FreeUnits{(hr⁻¹,), 𝐓⁻¹, nothing})
   @ ModelingToolkit ~/.julia/packages/ModelingToolkit/kByuD/src/systems/unit_check.jl:
61                                                                                      [2] get_unit(x::SymbolicUtils.BasicSymbolic{Real})
   @ ModelingToolkit ~/.julia/packages/ModelingToolkit/kByuD/src/systems/unit_check.jl:
129                                                                                     [3] get_unit(x::Num)
   @ ModelingToolkit ~/.julia/packages/ModelingToolkit/kByuD/src/systems/unit_check.jl:
74                                                                                      [4] top-level scope
   @ ~/projects/TSP/TSP-Examples/julia-WF/test.jl:22
ChrisRackauckas commented 5 months ago

Is this also a bug with DynamicQuantities units?

aelmokadem commented 5 months ago

seems that this is not an issue with DyanmicQuantities. Had to use SI units!

using DifferentialEquations, ModelingToolkit, Unitful

function MOD(; name)
    pars = @parameters begin
        k = 1.0, [unit = u"s^-1"]
    end

    @variables t [unit = u"s"]
    Dt = Differential(t)

    vars = @variables begin
        (A(t) = 10.0), [unit = u"kg"]
    end

    eqs = [Dt(A) ~ -k*A]

    ODESystem(eqs, t, vars, pars; name=name)
end

@mtkbuild mod = MOD()

ModelingToolkit.get_unit(mod.k)