Hyperstatic Truss - Compatibility

import ema as em
import matplotlib.pyplot as plt
import numpy as np
%config InlineBackend.figure_format = 'svg'
mdl = em.Model(2,2)
n = mdl.dnodes
e = mdl.delems

mdl.node('1', 0.0, 0.0)
mdl.node('2', 8.0, 0.0)
mdl.node('3', 4.0, 3.0)
mdl.node('4', 4.0, 6.0)

mdl.truss('a', n['1'], n['3'])
mdl.truss('b', n['2'], n['3'])
mdl.truss('c', n['1'], n['4'])
mdl.truss('d', n['3'], n['4'])
mdl.truss('e', n['2'], n['4'])

mdl.fix(n['1'], ['x', 'y'])
mdl.fix(n['2'], ['x', 'y'])

mdl.numDOF()
[[5, 6], [7, 8], [1, 2], [3, 4]]
fig1, ax1 = plt.subplots(1,1)
em.plot_structure(mdl, ax1)
svg

Part 1

Static-Kinematic Matrix Equivalence

\[V = A_f U_f\]

A = em.A_matrix(mdl)
B = em.B_matrix(mdl)

\[P_f = B_f Q\]

B.f
$a_1$ $b_1$ $c_1$ $d_1$ $e_1$
$1$ 0.8 -0.8 0.00000 -0.0 0.00000
$2$ 0.6 0.6 0.00000 -1.0 0.00000
$3$ 0.0 0.0 0.55470 0.0 -0.55470
$4$ 0.0 0.0 0.83205 1.0 0.83205
B.f.T - A.f
0 1 2 3
0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0
3 0.0 0.0 0.0 0.0
4 0.0 0.0 0.0 0.0

Part 2

Member d length

The kinematic matrix, \(A_f\), is given below:

A.f
$1$ $2$ $3$ $4$
$a_1$ 0.8 0.6 0.0000 0.00000
$b_1$ -0.8 0.6 0.0000 0.00000
$c_1$ 0.0 0.0 0.5547 0.83205
$d_1$ -0.0 -1.0 0.0000 1.00000
$e_1$ 0.0 0.0 -0.5547 0.83205

And the corresponding deformation vector is:

V = em.V_vector(A)
V.set_item('b_1', 0.1)
V.set_item('c_1', 0.2)
V
$V_{{}}$
$a_1$ 0.0
$b_1$ 0.1
$c_1$ 0.2
$d_1$ 0.0
$e_1$ 0.0

The free dof displacement vector, \(U_f\), is then computed as follows: \[ U_f = A_f^{-1}V_\epsilon \]

Ve = V[[0,1,2,4]]
Ae = A.f[[0,1,2,4],:]
U = Ae.inv@Ve
U.disp

\[\left[\begin{matrix}-0.0625\\0.0833333333333333\\0.180277563773199\\0.120185042515466\end{matrix}\right]\]

Finally the fully deformation vector is computed from \(V=A_fU_f\), which gives the necessary deformation of element d. 

Veh = A.f@U
Veh.disp

\[\left[\begin{matrix}9.25185853854297 \cdot 10^{-19}\\0.1\\0.2\\0.036851709182133\\1.66986849470959 \cdot 10^{-17}\end{matrix}\right]\]

Element d must therefore elongated by 0.037.

Satisfy Compatibility

The matrix \(\bar{B}_x\) is computed as follows:

mdl.redundant(e['d'], '1')
B.barx
$d_1$
$a_1$ 0.833333
$b_1$ 0.833333
$c_1$ -0.600925
$d_1$ 1.000000
$e_1$ -0.600925

This is multiplied by the deformation vector as follows:

residual = B.barx.T@Veh
print(residual)
if residual < 10e-9:
    print("Compatibility is satisfied")
B.f.ker/-0.56694671
B.ker/-0.56694671