Mass dashpot spring

Free oscillations

using StructuralDynamicsODESolvers, Plots, LinearAlgebra

k = 2;
m = 0.5;
c = 0;
u0 = 1;
v0 = 0;

M = m * ones(1, 1)
C = c * ones(1, 1)
K = k * ones(1, 1)
R = zeros(1)

sys = SecondOrderAffineContinuousSystem(M, C, K, R)

U₀ = u0 * ones(1);
V₀ = v0 * ones(1);

ivp_free = InitialValueProblem(sys, (U₀, V₀))

NSTEPS = 1000;
Δt = 0.005;
alg = Bathe(; Δt=Δt)
sol = solve(ivp_free, alg; NSTEPS=NSTEPS);

The following command is the same as plot(times(sol), displacements(sol, 1)).

plot(sol; vars=(0, 1))
Example block output

Forced oscillations

Problem definition

Let us consider now a forcing term $f(t) = A_f \sin(ω_f \cdot t)$

ωN = sqrt(k / m)
ωf = ωN * 2
Af = 10.0
R = [[Af * sin(ωf * Δt * (i - 1))] for i in 1:(NSTEPS + 1)];

Second order problem resolution

X = nothing # state constraints are ignored
B = ones(1, 1)
sys = SecondOrderConstrainedLinearControlContinuousSystem(M, C, K, B, X, R)

ivp_forced_secOrder = InitialValueProblem(sys, (U₀, V₀))

alg = Bathe(; Δt=Δt)
sol_secOrder = solve(ivp_forced_secOrder, alg; NSTEPS=NSTEPS);

First order homogeneization formulation

The problem can be re-formulated as a first order and homogeneous one given by

\[\left\{ \begin{array}{l} \dot{u} = v \\ \dot{v} = -\omega_N^2 u + u_f/m \\ \dot{u_f} = v_f \\ \dot{v_f} = -\omega_f^2 u_f \end{array} \right.\]

The new vector of variables is

\[\textbf{x} = [ u, v, u_f, v_f ]^T\]

K = [0 1 0 0
     -ωN^2 0 1/m 0
     0 0 0 1
     0 0 -ωf^2 0];

C = -Diagonal(ones(4))
M = zeros(4, 4)
R = zeros(4)

sys = SecondOrderAffineContinuousSystem(M, C, K, R)

U₀ = [u0; v0; 0; ωf * Af];

ivp_forced_firOrder = InitialValueProblem(sys, (U₀, U₀))

alg = BackwardEuler(; Δt=Δt)
sol_firOrderA = solve(ivp_forced_firOrder, alg; NSTEPS=NSTEPS);

NSTEPS = NSTEPS * 3;
alg = BackwardEuler(; Δt=Δt / 3.0);
sol_firOrderB = solve(ivp_forced_firOrder, alg; NSTEPS=NSTEPS);

The solution obtained is

plot(sol_secOrder; vars=(0, 1), xlab="time")
plot!(sol_firOrderA; vars=(0, 1))
plot!(sol_firOrderB; vars=(0, 1))
Example block output