Пример #1
0
def test_GenericTree():
    # With information
    tree2 = domain_decomp.tree('kdtree',
                               pts2,
                               left_edge2,
                               right_edge2,
                               periodic=False,
                               leafsize=leafsize)
    tree3 = domain_decomp.tree('kdtree',
                               pts3,
                               left_edge3,
                               right_edge3,
                               periodic=False,
                               leafsize=leafsize)
    leaves2 = domain_decomp.process_leaves(tree2.leaves, left_edge2,
                                           right_edge2, False)
    leaves3 = domain_decomp.process_leaves(tree3.leaves, left_edge3,
                                           right_edge3, False)
    # Without information
    left_edges = np.array([[0.0, 0.0], [0.0, 0.5], [0.5, 0.0], [0.5, 0.5]],
                          'float')
    right_edges = np.array([[0.5, 0.5], [0.5, 1.0], [1.0, 0.5], [1.0, 1.0]],
                           'float')
    leaves = [
        domain_decomp.GenericLeaf(5, left_edges[i, :], right_edges[i, :])
        for i in range(2)
    ]
    tree = domain_decomp.GenericTree(
        np.arange(5 * left_edges.shape[0]).astype('int'), leaves, left_edge2,
        right_edge2, False)
    del tree, leaves2, leaves3
Пример #2
0
def test_tree():
    tree2 = domain_decomp.tree('kdtree',
                               pts2,
                               left_edge2,
                               right_edge2,
                               periodic=False,
                               leafsize=leafsize)
    tree3 = domain_decomp.tree('kdtree',
                               pts3,
                               left_edge3,
                               right_edge3,
                               periodic=False,
                               leafsize=leafsize)
    assert_raises(ValueError, domain_decomp.tree, 'invalid', pts2, left_edge2,
                  right_edge2, False)
    del tree2, tree3
Пример #3
0
def make_test(npts,
              ndim,
              distrib='uniform',
              periodic=False,
              leafsize=None,
              nleaves=0):
    # Points
    pts, left_edge, right_edge = make_points(npts, ndim, distrib=distrib)
    npts = pts.shape[0]
    # Tree
    if leafsize is None:
        leafsize = npts / 2 + 2
    tree = domain_decomp.tree("kdtree",
                              pts,
                              left_edge,
                              right_edge,
                              periodic=periodic,
                              leafsize=leafsize,
                              nleaves=nleaves)
    return pts, tree
Пример #4
0
def triangulate(pts,
                left_edge=None,
                right_edge=None,
                periodic=False,
                use_double=False,
                nproc=0,
                dd_method='kdtree',
                dd_kwargs={},
                limit_mem=False,
                **kwargs):
    r"""Triangulation of points.

    Args:
        pts (np.ndarray of float64): (n,m) Array of n mD points.
        left_edge (np.ndarray of float64, optional): (m,) lower limits on
            the domain. If None, this is set to np.min(pts, axis=0).
            Defaults to None.
        right_edge (np.ndarray of float64, optional): (m,) upper limits on
            the domain. If None, this is set to np.max(pts, axis=0).
            Defaults to None.
        periodic (bool optional): If True, the domain is assumed to be
            periodic at its left and right edges. Defaults to False.
        use_double (bool, optional): If True, the triangulation is forced to
            use 64bit integers reguardless of if there are too many points for
            32bit. Otherwise 32bit integers are used so long as the number of
            points is <=4294967295. Defaults to False.
        nproc (int, optional): The number of MPI processes that should be
            spawned. If <2, no processes are spawned. Defaults to 0.
        dd_method (str, optional): String specifier for a domain
            decomposition method. See :meth:`cgal4py.domain_decomp.leaves`
            for available values. Defaults to 'kdtree'.
        dd_kwargs (dict, optional): Dictionary of keyword arguments for the
            selected domain decomposition method. Defaults to empty dict.
        limit_mem (bool, optional): If True, memory usage is limited by
            writing things to file at a cost to performance. Defaults to
            False.
        \*\*kwargs: Additiona keyword arguments are passed to the appropriate
            class for constructuing the triangulation.

    Returns:
        T (:class:`cgal4py.delaunay.Delaunay2` or
            :class:`cgal4py.delaunay.Delaunay3`:): 2D or 3D triangulation
            object.

    Raises:
        ValueError: If `pts` is not a 2D array.
        ValueError: If `left_edge` is not a 1D array with `pts.shape[1]`
            elements.
        ValueError: If `right_edge` is not a 1D array with `pts.shape[1]`
            elements.

    """
    # Check input
    if (pts.ndim != 2):
        raise ValueError("pts must be a 2D array of coordinates")
    ndim = pts.shape[1]
    if left_edge is None:
        left_edge = np.min(pts, axis=0)
    else:
        if (left_edge.ndim != 1) or (len(left_edge) != ndim):
            raise ValueError("left_edge must be a 1D array with " +
                             "{} elements.".format(ndim))
    if right_edge is None:
        right_edge = np.max(pts, axis=0)
    else:
        if (right_edge.ndim != 1) or (len(right_edge) != ndim):
            raise ValueError("right_edge must be a 1D array with " +
                             "{} elements.".format(ndim))
    # Parallel
    if nproc > 1 and FLAG_MULTIPROC:
        if (not 'nleaves' in dd_kwargs) and (not 'leafsize' in dd_kwargs):
            if limit_mem:
                dd_kwargs['nleaves'] = 2 * nproc
            else:
                dd_kwargs['nleaves'] = nproc
        tree = domain_decomp.tree(dd_method, pts, left_edge, right_edge,
                                  periodic, **dd_kwargs)
        T = parallel.ParallelDelaunay(pts,
                                      tree,
                                      nproc,
                                      limit_mem=limit_mem,
                                      use_double=use_double,
                                      **kwargs)
    # Serial
    else:
        T = Delaunay(pts,
                     use_double=use_double,
                     periodic=periodic,
                     left_edge=left_edge,
                     right_edge=right_edge,
                     **kwargs)
    return T