# ModelingToolkit external base excitation

**URL:** <https://discourse.julialang.org/t/modelingtoolkit-external-base-excitation/105983>\
**Category:** General Usage\
**Created:** [November 9, 2023, 9:51am UTC](https://discourse.julialang.org/t/modelingtoolkit-external-base-excitation/105983 "2023-11-09T09:51:31Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Daniel\_Lewis](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/daniel_lewis/32/31250_2.png) [@Daniel\_Lewis](https://discourse.julialang.org/u/Daniel_Lewis)\
**Post date:** [November 9, 2023, 9:51am UTC](https://discourse.julialang.org/t/modelingtoolkit-external-base-excitation/105983/1 "2023-11-09T09:51:31Z")

</div>

hello  
I’m trying to simulate a TMD system using ModelingToolkit.

This is the code i’m runing:

```julia
using ModelingToolkit
using DifferentialEquations
using LinearAlgebra
using Symbolics: scalarize

@variables t
D = Differential(t)

function Mass(; name, m = 1.0, xy = [0.0, 0.0], u = [0.0, 0.0])
    ps = @parameters m=m
    @variables pos(t)[1:2]=xy v(t)[1:2]=u
    eqs = scalarize(D.(pos) .~ v)
    ODESystem(eqs, t, [pos..., v...], ps; name)
end

function Spring(; name, k = 1e4, l = 1.0)
    ps = @parameters k=k l=l
    @variables x(t), dir(t)[1:2]
    ODESystem(Equation[], t, [x, dir...], ps; name)
end

function Damper(; name, c = 2)
    ps = @parameters c=c
    @variables x(t), dir(t)[1:2]
    ODESystem(Equation[], t, [x, dir...], ps; name)
end

function connect_element(element, x, y)
    [element.x ~ norm(scalarize(x .- y))
    scalarize(element.dir .~ scalarize(x .- y))]
end

function damper_force(damper)
    -damper.c .* scalarize(damper.dir) .* D.(damper.x)
end

function spring_force(spring)
    -spring.k .* scalarize(spring.dir) .* (spring.x - spring.l) ./ spring.x
end

# main mass
m1 = 1.0
xy1 = [0.0, 1.0]
k1 = 1e6
l1 = 1.0
c1 = 50.0

@named mass1 = Mass(m = m1, xy = xy1)
@named damper1 = Damper(c = c1)
@named spring1 = Spring(k = k1, l = l1)

# tmd mass
m2 = m1 * 0.05 # 5% of the main mass
xy2 = [0.0, 1.5] 
k2 = (main_mass_fn*2π)^2*m2
l2 = 0.5
c2 = 50.0
@named mass2 = Mass(m = m2, xy = xy2)
@named damper2 = Damper(c = c2)
@named spring2 = Spring(k = k2, l = l2)

base_pos = [0.0, 0.1]
g = [0.0, -9.81]

eqs = [connect_element(damper1, mass1.pos, base_pos)
            connect_element(spring1, mass1.pos, base_pos)
            connect_element(damper2, mass2.pos, mass1.pos)
            connect_element(spring2, mass2.pos, mass1.pos)
            scalarize(D.(mass2.v) .~ damper_force(damper2) / mass2.m .+ spring_force(spring2) / mass2.m .+ g)
            scalarize(D.(mass1.v) .~ damper_force(damper1) / mass1.m .+ spring_force(spring1) / mass1.m .- damper_force(damper2) / mass1.m .- spring_force(spring2) / mass1.m .+ g)]

@named _model = ODESystem(eqs, t, [ damper1.x; damper1.dir; spring1.x; spring1.dir; mass1.pos; 
                                        damper2.x; damper2.dir; spring2.x; spring2.dir; mass2.pos], [])

@named model = compose(_model, mass1, damper1, spring1, mass2, damper2, spring2)
sys = structural_simplify(model)
prob = ODEProblem(sys, [], (0.0, 1.0))
solve(prob, Rosenbrock23())

```

my issue is, how to replace the static base position, `base_pos = [0.0, 0.1]`,

to a function in time, `base_pos(t)=sin(2π*f*t)` for example.

thanks

---

<div class="post-metadata">

**Author:** ![baggepinnen](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/baggepinnen/32/693_2.png) [@baggepinnen](https://discourse.julialang.org/u/baggepinnen)\
**Post date:** [November 9, 2023, 10:05am UTC](https://discourse.julialang.org/t/modelingtoolkit-external-base-excitation/105983/2 "2023-11-09T10:05:25Z")

</div>

> [@Daniel\_Lewis](#):
>
> `base_pos = [0.0, 0.1]`

Have you tried

```julia
base_pos = [0.0, sin(2π*f*t)]

```

?

More generally, you could make use of [ModelingToolkitStandardLibrary.jl: A Standard Library for ModelingToolkit · ModelingToolkitStandardLibrary.jl](https://docs.sciml.ai/ModelingToolkitStandardLibrary/stable/) in order to avoid having to define your own components for a simple system like this. Using the stdlib, you could use a [`Sine`](https://docs.sciml.ai/ModelingToolkitStandardLibrary/stable/API/blocks/#ModelingToolkitStandardLibrary.Blocks.Sine) source as input.

You find a relevant tutorial here

> **[DC Motor with Speed Controller · ModelingToolkitStandardLibrary.jl](https://docs.sciml.ai/ModelingToolkitStandardLibrary/stable/tutorials/dc_motor_pi/)**
>
> Documentation for ModelingToolkitStandardLibrary.jl.

In this tutorial, a `Step` is used as input rather than a `Sine`. For a system closer to a mass-spring-damper, see this tutorial instead

> **[Modeling for control using ModelingToolkit · JuliaSimControl](https://help.juliahub.com/juliasimcontrol/dev/examples/mtk_control/)**
>
> Documentation for JuliaSimControl.

---

<div class="post-metadata">

**Author:** ![Daniel\_Lewis](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/daniel_lewis/32/31250_2.png) [@Daniel\_Lewis](https://discourse.julialang.org/u/Daniel_Lewis)\
**Post date:** [November 9, 2023, 11:48am UTC](https://discourse.julialang.org/t/modelingtoolkit-external-base-excitation/105983/3 "2023-11-09T11:48:57Z")

</div>

thanks a lot, I’ll look into it.
