Ejemplo n.º 1
0
  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))
Ejemplo n.º 2
0
  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()
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
    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]))
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
  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)