def test_system_thrads(self): k1 = 100.0 k2 = 200.0 k3 = 150.0 f = 100.0 network = spring.SpringNetwork() network.add_node(0) network.add_node(1) network.add_node(2) network.add_edge(0,1, object = spring.LinearSpring(k1)) network.add_edge(1,2, object = spring.LinearSpring(k2)) network.add_edge(1,2, object = spring.LinearSpring(k3)) network.set_times([0,1]) network.validate_setup() network.displacement_bc(2, lambda t: 0.0) network.force_bc(0, lambda t: t*f) network.solve_all(nthreads=2) kp = k2 + k3 dxp = f / kp dx1 = f / k1 exact = np.array([dx1+dxp,dxp,0]) self.assertTrue(np.allclose(network.displacements,exact))
def test_disconnect(self): network = spring.SpringNetwork() k = 100.0 for i in range(8): network.add_node(i) network.add_edge(0, 1, object = spring.LinearSpring(k)) network.add_edge(0, 2, object = spring.LinearSpring(k)) network.add_edge(1, 3, object = spring.LinearSpring(k)) network.add_edge(1, 3, object = spring.LinearSpring(k)) network.add_edge(2, 4, object = "disconnect") network.add_edge(3, 5, object = spring.LinearSpring(k)) network.add_edge(4, 6, object = spring.LinearSpring(k)) network.add_edge(4,7, object = spring.LinearSpring(k)) network.displacement_bc(0, lambda x: 0) network.displacement_bc(4, lambda x: 0) network.set_times([0,1]) network.validate_setup() subs = network.reduce_graph() self.assertEqual(len(subs), 2) for sub in subs: sub.validate_solve()
def copy_network(base, tube_length, tube_ri, E, alpha, tforce): other = spring.SpringNetwork() for n in base.nodes(): other.add_node(n) for a, b, data in base.edges(data=True): if a[:4] == 'tube' and b[:4] == 'tube': other.add_edge(a, b, object=gen_tube(data['stiffness'], tforce, tube_length, tube_ri, E, alpha)) else: if data['stiffness'] in ['rigid', 'disconnect']: other.add_edge(a, b, object=data['stiffness']) else: other.add_edge(a, b, object=spring.LinearSpring(data['stiffness'])) for n in other.nodes(): if n[:4] == "tube" and n.split('_')[1] == 'bottom': other.displacement_bc(n, lambda x: 0) other.set_times([0, 1]) other.validate_setup() return other
def test_single(self): network = spring.SpringNetwork() network.add_node(0) network.add_node(1) network.add_edge(0, 1, object=spring.LinearSpring(100)) network.set_times([0, 1]) network.validate_setup() network.displacement_bc(0, lambda t: 0.0) network.force_bc(1, lambda t: 100.0 * t) network.solve_all() self.assertTrue(np.allclose(network.displacements, [0, 1]))
def make_network(self, model, smat, ssolver): """ Setup the complete spring network, given the receiver and material objects This function must produce a network where the nodes are numbered topologically where bottom_tube < top_tube < panel < start Parameters: model fully-defined receiver object smat structural material model ssolver structural solver to use """ network = spring.SpringNetwork(atol=self.atol, rtol=self.rtol, miter=self.miter, verbose=self.verbose) cn = 0 network.add_node(cn) cn += 1 for panel in model.panels.values(): network.add_node(cn) cn += 1 network.add_edge(0, cn - 1, object=convert_to_spring(model.stiffness, smat, ssolver)) top = cn - 1 for tube in panel.tubes.values(): network.add_node(cn) cn += 1 network.add_edge( top, cn - 1, object=convert_to_spring(panel.stiffness, smat, ssolver), ) network.add_node(cn) cn += 1 network.add_edge(cn - 2, cn - 1, object=convert_to_spring(tube, smat, ssolver)) network.displacement_bc(cn - 1, lambda t: 0.0) network.validate_setup() return network
def test_remove_rigid(self): network = spring.SpringNetwork() k = 100.0 for i in range(6): network.add_node(i) network.add_edge(0,1, object = "rigid") network.add_edge(1,3, object = spring.LinearSpring(k)) network.add_edge(1,3, object = spring.LinearSpring(k)) network.add_edge(2,4, object = "rigid") network.add_edge(3,5, object = spring.LinearSpring(k)) network.add_edge(4,5, object = spring.LinearSpring(k)) network.displacement_bc(0, lambda x: 0) network.set_times([0,1]) network.validate_setup() network.remove_rigid() network.validate_solve() self.assertEqual(len(network.nodes), 4) self.assertEqual(len(network.edges), 4)