@@ -2384,3 +2384,239 @@ function dump_unknowns(sys::AbstractSystem)
23842384 meta
23852385 end
23862386end
2387+
2388+ # ## Functions for accessing algebraic/differential equations in systems ###
2389+
2390+ """
2391+ is_diff_equation(eq)
2392+
2393+ Returns `true` if the input is a differential equation, i.e. is an equatation that contain some
2394+ form of differential.
2395+
2396+ Example:
2397+ ```julia
2398+ using ModelingToolkit
2399+ import ModelingToolkit: t as nounits_t, D as nounits_D
2400+ @parameters p d
2401+ @variables X(t)
2402+ eq1 = D(X) ~ p - d*X
2403+ eq2 = 0 ~ p - d*X
2404+
2405+ is_diff_equation(eq1) # true
2406+ is_diff_equation(eq2) # false
2407+ ```
2408+ """
2409+ function is_diff_equation (eq)
2410+ (eq isa Equation) || (return false )
2411+ isdefined (eq, :lhs ) && occursin (is_derivative, wrap (eq. lhs)) && (return true )
2412+ isdefined (eq, :rhs ) && occursin (is_derivative, wrap (eq. rhs)) && (return true )
2413+ return false
2414+ end
2415+
2416+ """
2417+ is_alg_equation(eq)
2418+
2419+ Returns `true` if the input is an algebraic equation, i.e. is an equatation that does not contain
2420+ any differentials.
2421+
2422+ Example:
2423+ ```julia
2424+ using ModelingToolkit
2425+ import ModelingToolkit: t as nounits_t, D as nounits_D
2426+ @parameters p d
2427+ @variables X(t)
2428+ eq1 = D(X) ~ p - d*X
2429+ eq2 = 0 ~ p - d*X
2430+
2431+ is_alg_equation(eq1) # false
2432+ is_alg_equation(eq2) # true
2433+ ```
2434+ """
2435+ function is_alg_equation (eq)
2436+ return (eq isa Equation) && ! is_diff_equation (eq)
2437+ end
2438+
2439+ """
2440+ alg_equations(sys::AbstractSystem)
2441+
2442+ For a system, returns a vector of all its algebraic equations (i.e. that does not contain any
2443+ differentials).
2444+
2445+ Example:
2446+ ```julia
2447+ using ModelingToolkit
2448+ import ModelingToolkit: t as nounits_t, D as nounits_D
2449+ @parameters p d
2450+ @variables X(t)
2451+ eq1 = D(X) ~ p - d*X
2452+ eq2 = 0 ~ p - d*X
2453+ @named osys = ODESystem([eq1, eq2], t)
2454+
2455+ alg_equations(osys) # returns `0 ~ p - d*X(t)`.
2456+ """
2457+ alg_equations (sys:: AbstractSystem ) = filter (is_alg_equation, equations (sys))
2458+
2459+ """
2460+ diff_equations(sys::AbstractSystem)
2461+
2462+ For a system, returns a vector of all its differential equations (i.e. that does contain a differential).
2463+
2464+ Example:
2465+ ```julia
2466+ using ModelingToolkit
2467+ import ModelingToolkit: t as nounits_t, D as nounits_D
2468+ @parameters p d
2469+ @variables X(t)
2470+ eq1 = D(X) ~ p - d*X
2471+ eq2 = 0 ~ p - d*X
2472+ @named osys = ODESystem([eq1, eq2], t)
2473+
2474+ diff_equations(osys) # returns `Differential(t)(X(t)) ~ p - d*X(t)`.
2475+ """
2476+ diff_equations (sys:: AbstractSystem ) = filter (is_diff_equation, equations (sys))
2477+
2478+ """
2479+ has_alg_equations(sys::AbstractSystem)
2480+
2481+ For a system, returns true if it contain at least one algebraic equation (i.e. that does not contain any
2482+ differentials).
2483+
2484+ Example:
2485+ ```julia
2486+ using ModelingToolkit
2487+ import ModelingToolkit: t as nounits_t, D as nounits_D
2488+ @parameters p d
2489+ @variables X(t)
2490+ eq1 = D(X) ~ p - d*X
2491+ eq2 = 0 ~ p - d*X
2492+ @named osys1 = ODESystem([eq1], t)
2493+ @named osys2 = ODESystem([eq2], t)
2494+
2495+ has_alg_equations(osys1) # returns `false`.
2496+ has_alg_equations(osys2) # returns `true`.
2497+ ```
2498+ """
2499+ has_alg_equations (sys:: AbstractSystem ) = any (is_alg_equation, equations (sys))
2500+
2501+ """
2502+ has_diff_equations(sys::AbstractSystem)
2503+
2504+ For a system, returns true if it contain at least one differential equation (i.e. that contain a differential).
2505+
2506+ Example:
2507+ ```julia
2508+ using ModelingToolkit
2509+ import ModelingToolkit: t as nounits_t, D as nounits_D
2510+ @parameters p d
2511+ @variables X(t)
2512+ eq1 = D(X) ~ p - d*X
2513+ eq2 = 0 ~ p - d*X
2514+ @named osys1 = ODESystem([eq1], t)
2515+ @named osys2 = ODESystem([eq2], t)
2516+
2517+ has_diff_equations(osys1) # returns `true`.
2518+ has_diff_equations(osys2) # returns `false`.
2519+ ```
2520+ """
2521+ has_diff_equations (sys:: AbstractSystem ) = any (is_diff_equation, equations (sys))
2522+
2523+
2524+ """
2525+ get_alg_eqs(sys::AbstractSystem)
2526+
2527+ For a system, returns a vector of all algebraic equations (i.e. that does not contain any
2528+ differentials) in its *top-level system*.
2529+
2530+ Example:
2531+ ```julia
2532+ using ModelingToolkit
2533+ import ModelingToolkit: t as nounits_t, D as nounits_D
2534+ @parameters p d
2535+ @variables X(t)
2536+ eq1 = D(X) ~ p - d*X
2537+ eq2 = 0 ~ p - d*X
2538+ @named osys1 = ODESystem([eq1], t)
2539+ @named osys2 = ODESystem([eq2], t)
2540+ osys12 = compose(osys1, [osys2])
2541+ osys21 = compose(osys2, [osys1])
2542+
2543+ get_alg_eqs(osys12) # returns `Equation[]`.
2544+ get_alg_eqs(osys21) # returns `[0 ~ p - d*X(t)]`.
2545+ ```
2546+ """
2547+ get_alg_eqs (sys:: AbstractSystem ) = filter (is_alg_equation, get_eqs (sys))
2548+
2549+ """
2550+ get_diff_eqs(sys::AbstractSystem)
2551+
2552+ For a system, returns a vector of all differential equations (i.e. that does contain a differential)
2553+ in its *top-level system*.
2554+
2555+ Example:
2556+ ```julia
2557+ using ModelingToolkit
2558+ import ModelingToolkit: t as nounits_t, D as nounits_D
2559+ @parameters p d
2560+ @variables X(t)
2561+ eq1 = D(X) ~ p - d*X
2562+ eq2 = 0 ~ p - d*X
2563+ @named osys1 = ODESystem([eq1], t)
2564+ @named osys2 = ODESystem([eq2], t)
2565+ osys12 = compose(osys1, [osys2])
2566+ osys21 = compose(osys2, [osys1])
2567+
2568+ get_diff_eqs(osys12) # returns `[Differential(t)(X(t)) ~ p - d*X(t)]`.
2569+ get_diff_eqs(osys21) # returns `Equation[]``.
2570+ ```
2571+ """
2572+ get_diff_eqs (sys:: AbstractSystem ) = filter (is_diff_equation, get_eqs (sys))
2573+
2574+ """
2575+ has_alg_eqs(sys::AbstractSystem)
2576+
2577+ For a system, returns true if it contain at least one algebraic equation (i.e. that does not contain any
2578+ differentials) in its *top-level system*.
2579+
2580+ Example:
2581+ ```julia
2582+ using ModelingToolkit
2583+ import ModelingToolkit: t as nounits_t, D as nounits_D
2584+ @parameters p d
2585+ @variables X(t)
2586+ eq1 = D(X) ~ p - d*X
2587+ eq2 = 0 ~ p - d*X
2588+ @named osys1 = ODESystem([eq1], t)
2589+ @named osys2 = ODESystem([eq2], t)
2590+ osys12 = compose(osys1, [osys2])
2591+ osys21 = compose(osys2, [osys1])
2592+
2593+ has_alg_eqs(osys12) # returns `false`.
2594+ has_alg_eqs(osys21) # returns `true`.
2595+ ```
2596+ """
2597+ has_alg_eqs (sys:: AbstractSystem ) = any (is_alg_equation, get_eqs (sys))
2598+
2599+ """
2600+ has_diff_eqs(sys::AbstractSystem)
2601+
2602+ For a system, returns true if it contain at least one differential equation (i.e. that contain a
2603+ differential) in its *top-level system*.
2604+
2605+ Example:
2606+ ```julia
2607+ using ModelingToolkit
2608+ import ModelingToolkit: t as nounits_t, D as nounits_D
2609+ @parameters p d
2610+ @variables X(t)
2611+ eq1 = D(X) ~ p - d*X
2612+ eq2 = 0 ~ p - d*X
2613+ @named osys1 = ODESystem([eq1], t)
2614+ @named osys2 = ODESystem([eq2], t)
2615+ osys12 = compose(osys1, [osys2])
2616+ osys21 = compose(osys2, [osys1])
2617+
2618+ has_diff_eqs(osys12) # returns `true`.
2619+ has_diff_eqs(osys21) # returns `false`.
2620+ ```
2621+ """
2622+ has_diff_eqs (sys:: AbstractSystem ) = any (is_diff_equation, get_eqs (sys))
0 commit comments