Skip to content

Commit b565110

Browse files
authored
Merge pull request #216 from ritchie46/triangularLoadsInsertNodeFix
Correctly split triangular q-loads in insert_node()
2 parents 510efd1 + 5097705 commit b565110

File tree

3 files changed

+21
-10
lines changed

3 files changed

+21
-10
lines changed

anastruct/fem/examples/ex_20_insert_node.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
ss.add_element([10, 0])
66
ss.add_support_hinged(1)
77
ss.add_support_hinged(2)
8-
ss.q_load(-1, 1)
8+
ss.q_load([-1, -3], 1)
99
ss.insert_node(1, factor=0.3)
1010
ss.point_load(3, Fy=-10)
1111
ss.insert_node(3, [5, 5])

anastruct/fem/system.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -664,6 +664,9 @@ def insert_node(
664664
elif factor is None and location is not None:
665665
assert location is not None
666666
location_vertex = Vertex(location)
667+
length1 = (location_vertex - element_to_split.vertex_1).modulus()
668+
length2 = (element_to_split.vertex_2 - location_vertex).modulus()
669+
factor = length1 / (length1 + length2)
667670
else:
668671
raise FEMException(
669672
"Invalid parameters",
@@ -713,18 +716,26 @@ def insert_node(
713716

714717
# Copy the q-loads from the old element to the new elements
715718
if element_id_to_split in self.loads_q:
719+
q_load_start = element_to_split.q_load[0]
720+
q_load_end = element_to_split.q_load[1]
721+
q_perp_load_start = element_to_split.q_perp_load[0]
722+
q_perp_load_end = element_to_split.q_perp_load[1]
723+
location_q_load = factor * (q_load_end - q_load_start) + q_load_start
724+
location_q_perp_load = (
725+
factor * (q_perp_load_end - q_perp_load_start) + q_perp_load_start
726+
)
716727
assert element_to_split.q_angle is not None
717728
self.q_load(
718-
q=element_to_split.q_load,
729+
q=[-q_load_start, -location_q_load],
719730
element_id=element_id1,
720-
rotation=np.degrees(np.pi + element_to_split.q_angle),
721-
q_perp=element_to_split.q_perp_load,
731+
rotation=np.degrees(element_to_split.q_angle),
732+
q_perp=[q_perp_load_start, location_q_perp_load],
722733
)
723734
self.q_load(
724-
q=element_to_split.q_load,
735+
q=[-location_q_load, -q_load_end],
725736
element_id=element_id2,
726-
rotation=np.degrees(np.pi + element_to_split.q_angle),
727-
q_perp=element_to_split.q_perp_load,
737+
rotation=np.degrees(element_to_split.q_angle),
738+
q_perp=[location_q_perp_load, q_perp_load_end],
728739
)
729740

730741
# Remove the old element from everywhere it's referenced

tests/test_e2e.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -302,9 +302,9 @@ def it_retains_supports_and_loads(SS_20):
302302
assert SS_20.supports_hinged == [SS_20.node_map[1], SS_20.node_map[2]]
303303
assert SS_20.loads_point == {3: (0, 10)}
304304
assert list(SS_20.loads_q.keys()) == [2, 4, 5]
305-
assert SS_20.element_map[2].q_load == (-1, -1)
306-
assert SS_20.element_map[4].q_load == (1, 1)
307-
assert SS_20.element_map[5].q_load == (1, 1)
305+
assert SS_20.element_map[2].q_load == approx((1, 1.6))
306+
assert SS_20.element_map[4].q_load == approx((1.6, 2.205258))
307+
assert SS_20.element_map[5].q_load == approx((2.205258, 3))
308308

309309
def context_find_node_id():
310310
@pspec_context("find_node_id() function using Example 8")

0 commit comments

Comments
 (0)