Exemplo n.º 1
0
    def union(self, o):
        eps = 1e-12
        p1 = self._points
        p2 = o._points
        p = list(p1)
        p.extend(p2)
        p.sort()
        points = [p[0]]
        for point in p[1:]:
            if abs(points[-1] - point) < eps:
                continue
            points.append(point)
        # points now contains the sorted list of union points
        orders = []
        for n, p in enumerate(points[1:]):
            p1 = points[n]
            p2 = p
            mid = (p1+p2)/2.
            o1 = self._orders[self.element_at_point(mid)]
            o2 = o._orders[o.element_at_point(mid)]
            orders.append(max(o1, o2))

        return Mesh1D(points, orders)
Exemplo n.º 2
0
    def restrict_to_interval(self, A, B):
        assert B > A
        n1 = self.element_at_point(A)
        n2 = self.element_at_point(B)
        points = []
        orders = []

        # first element:
        a, b, order = self.get_element_by_id(n1)
        eps = 1e-12
        if abs(b-A) < eps:
            pass
        else:
            if abs(a-A) < eps:
                pass
            elif a < A:
                a = A
            else:
                raise NotImplementedError()
            points.append(a)
            orders.append(order)

        #middle elements
        for n in range(n1+1, n2):
            a, b, order = self.get_element_by_id(n)
            points.append(a)
            orders.append(order)

        # last element:
        a, b, order = self.get_element_by_id(n2)
        eps = 1e-12
        if abs(a-A) < eps:
            pass
        elif a < A:
            a = A
        if abs(b-B) < eps:
            pass
        elif B < b:
            b = B
        else:
            raise NotImplementedError()
        if len(points) == 0 or not (abs(points[-1] - a) < eps):
            points.append(a)
            orders.append(order)
        points.append(b)

        return Mesh1D(points, orders)