def METHOD_NAME(cls, vertices, faces):
    """Instantiate grid from vertex coordinates and connectivity data.
    Parameters
    ----------
    vertices
        A (num_vertices, 2)-shaped |array| containing the coordinates
        of all vertices in the grid. The row numbers in the array will
        be the global indices of the given vertices (codim 2 entities).
    faces
        A (num_faces, 3)-shaped |array| containing the global indices
        of the vertices which define a given triangle in the grid.
        The row numbers in the array will be the global indices of the
        given triangles (codim 0 entities).
    """
    assert faces.shape[1] == 3
    assert np.min(faces) == 0
    assert np.max(faces) == len(vertices) - 1
    vertices = vertices.astype(np.float64, copy=False)
    faces = faces.astype(np.int32, copy=False)
    edges, num_edges = compute_edges(faces)
    COORDS = vertices[faces]
    SHIFTS = COORDS[:, 0, :]
    TRANS = COORDS[:, 1:, :] - SHIFTS[:, np.newaxis, :]
    TRANS = TRANS.swapaxes(1, 2)
    sizes = (len(faces), num_edges, len(vertices))
    subentity_data = (np.arange(len(faces), dtype=np.int32).reshape(-1, 1), edges, faces)
    embedding_data = (TRANS, SHIFTS)
    return cls(sizes, subentity_data, embedding_data)