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)
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)