File size: 3,269 Bytes
ac2f8e9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
from sympy.core.symbol import Symbol, symbols
from sympy.physics.continuum_mechanics.truss import Truss
from sympy import sqrt


def test_truss():
    A = Symbol('A')
    B = Symbol('B')
    C = Symbol('C')
    AB, BC, AC = symbols('AB, BC, AC')
    P = Symbol('P')

    t = Truss()
    assert t.nodes == []
    assert t.node_labels == []
    assert t.node_positions == []
    assert t.members == {}
    assert t.loads == {}
    assert t.supports == {}
    assert t.reaction_loads == {}
    assert t.internal_forces == {}

    # testing the add_node method
    t.add_node((A, 0, 0), (B, 2, 2), (C, 3, 0))
    assert t.nodes == [(A, 0, 0), (B, 2, 2), (C, 3, 0)]
    assert t.node_labels == [A, B, C]
    assert t.node_positions == [(0, 0), (2, 2), (3, 0)]
    assert t.loads == {}
    assert t.supports == {}
    assert t.reaction_loads == {}

    # testing the remove_node method
    t.remove_node(C)
    assert t.nodes == [(A, 0, 0), (B, 2, 2)]
    assert t.node_labels == [A, B]
    assert t.node_positions == [(0, 0), (2, 2)]
    assert t.loads == {}
    assert t.supports == {}

    t.add_node((C, 3, 0))

    # testing the add_member method
    t.add_member((AB, A, B), (BC, B, C), (AC, A, C))
    assert t.members == {AB: [A, B], BC: [B, C], AC: [A, C]}
    assert t.internal_forces == {AB: 0, BC: 0, AC: 0}

    # testing the remove_member method
    t.remove_member(BC)
    assert t.members == {AB: [A, B], AC: [A, C]}
    assert t.internal_forces == {AB: 0, AC: 0}

    t.add_member((BC, B, C))

    D, CD = symbols('D, CD')

    # testing the change_label methods
    t.change_node_label((B, D))
    assert t.nodes == [(A, 0, 0), (D, 2, 2), (C, 3, 0)]
    assert t.node_labels == [A, D, C]
    assert t.loads == {}
    assert t.supports == {}
    assert t.members == {AB: [A, D], BC: [D, C], AC: [A, C]}

    t.change_member_label((BC, CD))
    assert t.members == {AB: [A, D], CD: [D, C], AC: [A, C]}
    assert t.internal_forces == {AB: 0, CD: 0, AC: 0}


    # testing the apply_load method
    t.apply_load((A, P, 90), (A, P/4, 90), (A, 2*P,45), (D, P/2, 90))
    assert t.loads == {A: [[P, 90], [P/4, 90], [2*P, 45]], D: [[P/2, 90]]}
    assert t.loads[A] == [[P, 90], [P/4, 90], [2*P, 45]]

    # testing the remove_load method
    t.remove_load((A, P/4, 90))
    assert t.loads == {A: [[P, 90], [2*P, 45]], D: [[P/2, 90]]}
    assert t.loads[A] == [[P, 90], [2*P, 45]]

    # testing the apply_support method
    t.apply_support((A, "pinned"), (D, "roller"))
    assert t.supports == {A: 'pinned', D: 'roller'}
    assert t.reaction_loads == {}
    assert t.loads == {A: [[P, 90], [2*P, 45], [Symbol('R_A_x'), 0], [Symbol('R_A_y'), 90]],  D: [[P/2, 90], [Symbol('R_D_y'), 90]]}

    # testing the remove_support method
    t.remove_support(A)
    assert t.supports == {D: 'roller'}
    assert t.reaction_loads == {}
    assert t.loads == {A: [[P, 90], [2*P, 45]], D: [[P/2, 90], [Symbol('R_D_y'), 90]]}

    t.apply_support((A, "pinned"))

    # testing the solve method
    t.solve()
    assert t.reaction_loads['R_A_x'] == -sqrt(2)*P
    assert t.reaction_loads['R_A_y'] == -sqrt(2)*P - P
    assert t.reaction_loads['R_D_y'] == -P/2
    assert t.internal_forces[AB]/P == 0
    assert t.internal_forces[CD] == 0
    assert t.internal_forces[AC] == 0