Union/add two topologies together to form a larger topology.

        If rename is False, the method assumes that node names 
        don't clash (i.e., you've called addNodeLabelPrefix or 
        you've explicitly chosen names to avoid clashes).  
        If rename is True, nodes/links are relabeled such that the
        new "prefix" for each node is the graph name (i.e., for graph
        name A, node h1 is renamed A_h1).
        
        This method returns a new Topology object and does not modify
        either topology used for unioning.

def union(self, other, rename=False):
        '''
        Union/add two topologies together to form a larger topology.

        If rename is False, the method assumes that node names 
        don't clash (i.e., you've called addNodeLabelPrefix or 
        you've explicitly chosen names to avoid clashes).  
        If rename is True, nodes/links are relabeled such that the
        new "prefix" for each node is the graph name (i.e., for graph
        name A, node h1 is renamed A_h1).
        
        This method returns a new Topology object and does not modify
        either topology used for unioning.
        '''
        if rename:
            self.nxgraph = Topology.__relabel_graph(self.__nxgraph, self.name)
            other.nxgraph = Topology.__relabel_graph(other.__nxgraph, other.name)
        nxgraph = nx.union(self.nxgraph, other.nxgraph, name="{}_{}".format(self.name, other.name))
        newtopo = Topology(nxgraph=nxgraph, name="{}_{}".format(self.name, other.name))
        return newtopo