def force_update_from_form(force, form): """Update the force diagram after modifying the (force densities of) the form diagram. Parameters ---------- force : :class:`ForceDiagram` The force diagram on which the update is based. form : :class:`FormDiagram` The form diagram to update. Returns ------- force: :class:`ForceDiagram` The updated force diagram. """ # -------------------------------------------------------------------------- # form diagram # -------------------------------------------------------------------------- vertex_index = form.vertex_index() xy = array(form.xy(), dtype=float64) edges = [[vertex_index[u], vertex_index[v]] for u, v in form.edges_where({'_is_edge': True})] C = connectivity_matrix(edges, 'csr') Q = diags([form.q()], [0]) uv = C.dot(xy) # -------------------------------------------------------------------------- # force diagram # -------------------------------------------------------------------------- _vertex_index = force.vertex_index() _known = [_vertex_index[force.anchor()]] _xy = array(force.xy(), dtype=float64) _edges = force.ordered_edges(form) _edges[:] = [(_vertex_index[u], _vertex_index[v]) for u, v in _edges] _C = connectivity_matrix(_edges, 'csr') _Ct = _C.transpose() # -------------------------------------------------------------------------- # compute reciprocal for given q # -------------------------------------------------------------------------- _xy = spsolve_with_known(_Ct.dot(_C), _Ct.dot(Q).dot(uv), _xy, _known) # -------------------------------------------------------------------------- # update force diagram # -------------------------------------------------------------------------- for vertex, attr in force.vertices(True): index = _vertex_index[vertex] attr['x'] = _xy[index, 0] attr['y'] = _xy[index, 1] return force
def force_update_from_form(force, form): """Update the force diagram after modifying the (force densities of) the form diagram. Parameters ---------- force : ForceDiagram The force diagram on which the update is based. form : FormDiagram The form diagram to update. Returns ------- None The form and force diagram are updated in-place. """ # -------------------------------------------------------------------------- # form diagram # -------------------------------------------------------------------------- k_i = form.key_index() xy = array(form.xy(), dtype=float64) edges = [[k_i[u], k_i[v]] for u, v in form.edges()] C = connectivity_matrix(edges, 'csr') Q = diags([form.q()], [0]) uv = C.dot(xy) # -------------------------------------------------------------------------- # force diagram # -------------------------------------------------------------------------- _k_i = force.key_index() _known = [_k_i[force.anchor()]] _xy = array(force.xy(), dtype=float64) _edges = force.ordered_edges(form) _C = connectivity_matrix(_edges, 'csr') _Ct = _C.transpose() # -------------------------------------------------------------------------- # compute reciprocal for given q # -------------------------------------------------------------------------- _xy = spsolve_with_known(_Ct.dot(_C), _Ct.dot(Q).dot(uv), _xy, _known) # -------------------------------------------------------------------------- # update force diagram # -------------------------------------------------------------------------- for key, attr in force.vertices(True): i = _k_i[key] attr['x'] = _xy[i, 0] attr['y'] = _xy[i, 1]