def network_dr(network, kmax=100, callback=None): """""" vertices = network.get_vertices_attributes(('x', 'y', 'z')) edges = list(network.edges()) fixed = network.vertices_where({'is_fixed': True}) loads = network.get_vertices_attributes(('px', 'py', 'pz'), (0.0, 0.0, 0.0)) qpre = network.get_edges_attribute('qpre', 1.0) fpre = network.get_edges_attribute('fpre', 0.0) lpre = network.get_edges_attribute('lpre', 0.0) linit = network.get_edges_attribute('linit', 0.0) E = network.get_edges_attribute('E', 0.0) radius = network.get_edges_attribute('radius', 0.0) xyz, q, f, l, r = dr(vertices, edges, fixed, loads, qpre, fpre, lpre, linit, E, radius, kmax=kmax, callback=callback) for index, key in enumerate(network.vertices()): network.set_vertex_attributes(key, 'xyz', xyz[index]) network.set_vertex_attributes(key, ('rx', 'ry', 'rz'), r[index]) for index, (u, v, attr) in enumerate(network.edges(True)): attr['f'] = f[index] attr['l'] = l[index]
fixed = list(network.nodes_where({'is_anchor': True})) free = list(network.nodes_where({'is_anchor': False})) fixed[:] = [node_index[node] for node in fixed] free[:] = [node_index[node] for node in free] edges = [(node_index[u], node_index[v]) for u, v in network.edges()] X = network.nodes_attributes('xyz') R = network.nodes_attributes(['rx', 'ry', 'rz']) P = network.nodes_attributes(['px', 'py', 'pz']) Q = network.edges_attribute('q') # compute equilibrium X, Q, F, L, R = dr(X, edges, fixed, P, Q) # update network update_network() # visualize result artist = CablenetArtist(network, layer="ITA20::L5::FormFinding") artist.draw_nodes(color={ node: (255, 0, 0) for node in network.nodes_where({'is_anchor': True}) }) artist.draw_edges() artist.draw_residuals() artist.draw_reactions()
free[:] = [node_index[node] for node in free] edges = [(node_index[u], node_index[v]) for u, v in network.edges()] X = network.nodes_attributes('xyz') R = network.nodes_attributes(['rx', 'ry', 'rz']) P = network.nodes_attributes(['px', 'py', 'pz']) Q = network.edges_attribute('q') # create an artist artist = CablenetArtist(network, layer="ITA20::L5::FormFinding") # compute equilibrium X, Q, F, L, R = dr(X, edges, fixed, P, Q, callback=callback) # update network update_network() # visualize result artist.clear_layer() artist.draw_nodes(color={ node: (255, 0, 0) for node in network.nodes_where({'is_anchor': True}) }) artist.draw_edges() artist.draw_residuals() artist.draw_reactions()
plotter.draw_vertices(facecolor={ key: '#000000' for key in network.vertices_where({'is_fixed': True}) }) plotter.draw_edges() plotter.update(pause=1.0) # run the dynamic relaxation xyz, q, f, l, r = dr(vertices, edges, fixed, loads, qpre, fpre, lpre, linit, E, radius, kmax=100, callback=callback) # update vertices and edges to reflect the end result for key, attr in network.vertices(True): attr['x'] = xyz[key][0] attr['y'] = xyz[key][1] attr['z'] = xyz[key][2] for index, (u, v, attr) in enumerate(network.edges(True)): attr['f'] = f[index]
plotter.update_vertices() plotter.update_edges() imagepath = os.path.join(TEMPDIR, "plot_{}.png".format(k)) plotter.save(imagepath, dpi=150) IMAGES.append(imagepath) # run the DR dr(vertices, edges, fixed, loads, qpre, fpre, lpre, linit, E, radius, kmax=100, dt=1.0, tol1=1e-3, tol2=1e-6, c=0.1, callback=save_image) # save the result to a GIF gif_from_images(IMAGES, FILE_O, fps=5)