def read_vtk(self, file_name):
        """
        Import a graph from a vtk file
        """
        import numpy as np
        try:
            from mesh import Mesh
        except ImportError:
            raise ImportError("read_vtk requires pymesh")

        # initialize the vtk reader
        reader = Mesh()

        # read the vtk
        reader.ReadFromFileVtk(file_name)

        # add nodes to the graph
        for index, node in enumerate(reader.node_coord):
            self.graph.add_node(index, pos=reader.node_coord[index])
        '''
        chuncker
        Principe basé sur le stockage CSR ou CRS (Compressed Row Storage)
        dont voici une illustration :
        Soient six nœuds numérotes de 0 à 5 et quatre  ́el ́ements form ́es par
        les nœuds (0, 2, 3) pour l' el ement 0, (1, 2, 4) pour l'element,
        (0, 1, 3, 4) pour l’ ́el ́e- ment 2 et (1, 5) pour l’ ́el ́ement 3.
        Deux tableaux sont utilis ́es, l’un pour stocker de fa ̧con contigu ̈e
        les listes de nœuds qui composent les  ́el ́ements (table 1), l’autre
        pour indiquer la position, dans ce tableau, ou` commence chacune de
        ces listes (table 2).
        Ainsi, le chiffre 6 en position 2 dans le tableau p elem2node indique
        que le premier nœud de l’ ́el ́ement 2 se trouve en position 6 du
        tableau elem2node. La derni`ere valeur dans p elem2node correspond au
        nombre de cellules (la taille) du tableau elem2node.

        elem2node
        0 | 2 | 3 | 1 | 2 | 4 | 0 | 1 | 3 | 4 | 1 | 5
        1   2   3   4   5   6   7   8   9   10  11  12
        ^       ^           ^               ^       ^

        p_elem2node
        0 | 3 | 6 | 10 | 12
        1   2   3    4    4
        '''
        def chuncker(array, p_array):
            return [
                array[p_array[i]:p_array[i + 1]]
                for i in range(len(p_array) - 1)
            ]

        # given a cell returns the edges implicitely defined in it
        def pairwise(seq):
            return [seq[i:i + 2] for i in range(len(seq) - 2)] + \
                   [[seq[0], seq[len(seq) - 1]]]

        datas = np.asarray(
            [data['pos'] for _, data in self.graph.nodes(data=True)])

        def distance3D(u, v, datas):
            xi = datas[u][0]
            yi = datas[u][1]
            zi = datas[u][2]
            xj = datas[v][0]
            yj = datas[v][1]
            zj = datas[v][2]
            return math.sqrt((xi - xj) * (xi - xj) + (yi - yj) * (yi - yj) +
                             (zi - zj) * (zi - zj))

        # add edges to the graph
        for cell in chuncker(reader.elem2node, reader.p_elem2node):
            for u, v in pairwise(cell):
                if u not in self.graph[v]:
                    self.graph.add_edge(u, v, weight=distance3D(u, v, datas))