Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Inactive tension_only member still takes load #210

Open
lddllddl opened this issue Aug 22, 2024 · 7 comments
Open

Inactive tension_only member still takes load #210

lddllddl opened this issue Aug 22, 2024 · 7 comments

Comments

@lddllddl
Copy link

lddllddl commented Aug 22, 2024

Describe the bug

Inactive tension_only member still takes load

To Reproduce

See this self-contained example.
Cantilever stayed with cable
All members are two-force

In the amended case, an additional cable stay is added to the opposite side, which is supposed to have no effect.


# Create a new finite element model
braced_frame = FEModel3D()
braced_frame.add_node('N1', 0, 0, 0)
braced_frame.add_node('N2', 100, 0, 0)
braced_frame.add_node('N3', 0, 10, 0)

E = 29000 # ksi
G = 11400 # ksi
nu = 0.3  # Poisson's ratio
rho = 0.490/12**2  # Density (kci)
braced_frame.add_material('Steel', E, G, nu, rho)

Iy = 3 # in^4
Iz = 3 # in^4
J = 0.0438 # in^4
A = 1.94 # in^2

braced_frame.add_member('push', 'N1', 'N2', 'Steel', Iy, Iz, J, A)
braced_frame.add_member('pullup', 'N3', 'N2', 'Steel', Iy, Iz, J, A, tension_only=True)
braced_frame.def_releases('pullup', Ryi=True, Rzi=True, Ryj=True, Rzj=True)
braced_frame.def_releases('push', Ryi=True, Rzi=True, Ryj=True, Rzj=True)


braced_frame.def_support('N2', *[False]*2, *[True]*4)
braced_frame.def_support('N1', *[True]*6)
braced_frame.def_support('N3', *[True]*6)
braced_frame.add_node_load('N2', 'FY', -10)

braced_frame.analyze()
print('pullup', braced_frame.Members['pullup'].max_axial())
print('push',braced_frame.Members['push'].max_axial())
print('==========================')


braced_frame.add_node('N4', 0, -10, 0)
braced_frame.add_member('pulldown', 'N4', 'N2', 'Steel', Iy, Iz, J, A, tension_only=True)
braced_frame.def_releases('pulldown', Ryi=True, Rzi=True, Ryj=True, Rzj=True)
braced_frame.def_support('N4', *[True]*6)

braced_frame.analyze()
print('pullup',braced_frame.Members['pullup'].max_axial())
print('push',braced_frame.Members['push'].max_axial())

print('pulldown',braced_frame.Members['pulldown'].max_axial())
print('pulldown',braced_frame.Members['pulldown'].active)

Output (both latest main as well latest pypi release)

pullup -100.49875621120889
push 99.99999999999997
==========================
pullup -50.24937810560445
push 99.99999999999997
pulldown 50.24937810560445
pulldown {'Combo 1': False}

Obviously the lower "pulldown" cable is (incorrectly) sharing the load as a compressive member, even though it is (correctly) marked as inactive, halving the load the "pullup" cable takes.

Expected behavior
The force in "pullup" cable in the amended should remain the same.

@lddllddl
Copy link
Author

The example was copy-edited from the braced frame example, so the name of the whole model was kept "braced_frame". Very dissimilar to the braced frame example though

@JWock82
Copy link
Owner

JWock82 commented Sep 11, 2024

Have a look at issue #182. I think that discussion will be helpful. The results are correct, except for the inactive member. I thought I had this issue resolved. I'll look into it againl

@lddllddl
Copy link
Author

Thanks for the reply - the problem is not really the inactive member though, because it is trivial to check if it is active first (though some doc may help).

Note that the other cable (N3-N2) (always active) gets its load halved, as if the slack cable (N4-N2) takes away half the load by acting as a compression member. It is the load on the active cable that is a problem.

@JWock82
Copy link
Owner

JWock82 commented Sep 11, 2024

I will have a closer look and get back to you.

@JWock82
Copy link
Owner

JWock82 commented Sep 12, 2024

I've reviewed the code and this is definitely a bug. This shouldn't be too hard to isolate and resolve. I'll make this my top priority for Pynite.

@JWock82
Copy link
Owner

JWock82 commented Sep 18, 2024

I'm closing in on this issue. It appears the global nodal displacements are correct, and the stiffness matrix is correct, but the member internal forces are still storing results from the prior iteration before the T/C member deactivates. I should have this resolved soon.

@lddllddl
Copy link
Author

Thanks. Yes I think the displacements are correct (being identical in both cases) as well - I should have checked that earlier!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants