def play(self): global _rank global _size # Get the nodes & shuffle them activeNodes = self.targets(self.context) activeNodes = filter(self.ownNode, activeNodes) random.shuffle(activeNodes) self.createWorkOrder(activeNodes) mpitools.Barrier() for work in self.mywork: if work is not None: # work = (callback function, arguments) work[0](work[1]) mpitools.Barrier() skeletonIPC.collect_pieces(self.skeleton) self.skeleton.timestamp.increment()
def _refinement(self, skeleton, newSkeleton, context): global _rank if _rank == 0: pBar = progressbar.getProgress() markedEdges = refine.EdgeMarkings() self.newEdgeNodes = {} # allows sharing of new edge nodes # Primary marking self.targets(skeleton, context, self.degree.divisions, markedEdges, self.criterion) # Additional marking -- only for (conservative) bisection at this point. self.degree.markExtras(skeleton, markedEdges) # Now, share the marking information on the boundary shareMarkings(markedEdges, skeleton) # Refine elements and segments segmentdict = {} # which segments have been handled already. elements = skeleton.elements # At this point, to properly update progress bar, every process has # loop over the same range(maxn). # TODO: Is progress bar not supposed to work within IPC call? n = len(elements) alln = mpitools.Allgather_Int(n) maxn = max(alln) nelem = 0 ntotal = reduce(lambda x, y: x + y, alln) for ii in range(maxn): try: oldElement = elements[ii] count = 1 oldnnodes = oldElement.nnodes() # Get list of number of subdivisions on each edge ("marks") marks = markedEdges.getMarks(oldElement) # Find the canonical order for the marks. (The order is # ambiguous due to the arbitrary choice of the starting # edge. Finding the canonical order allows the refinement # rule to be found in the rule table.) rotation is the # offset into the elements node list required to match the # refinement rule to the element's marked edges. # signature is the canonical ordering of the marks. rotation, signature = refine.findSignature(marks) # Create new nodes along the subdivided element edges edgenodes = [ self.getNewEdgeNodes(oldElement.nodes[i], oldElement.nodes[(i + 1) % oldnnodes], marks[i], newSkeleton, skeleton) for i in range(oldnnodes) ] # Create new elements newElements = self.rules[signature].apply(oldElement, rotation, edgenodes, newSkeleton, self.alpha) # If the old element's homogeneity is "1", it's safe to say that # new elements' homogeneities are "1". if oldElement.homogeneity(skeleton.MS) == 1.: for el in newElements: el.copyHomogeneity(oldElement) # The calls to Skeleton.newElement() made by the # refinement rules have created new SkeletonSegments in # newSkeleton, but have not set the parentage of those # segments. We have to fix that here. for newElement in newElements: for segment in newElement.getSegments(newSkeleton): # Only look at each segment once. if not segmentdict.has_key(segment): segmentdict[segment] = 1 pseg = refine.findParentSegment( skeleton, newElement, segment, edgenodes) if pseg: pseg.add_child(segment) segment.add_parent(pseg) except IndexError: count = 0 # No. of elements done. nelem_step = mpitools.Allgather_Int(count) nelem += reduce(lambda x, y: x + y, nelem_step) if _rank == 0: if pBar.query_stop(): pBar.set_failure() pBar.set_message("Failed") mpitools.Isend_Bool(False, range(1, _size)) return None else: pBar.set_progress(1.0 * (nelem) / ntotal) pBar.set_message("refining skeleton: %d/%d" % (nelem, ntotal)) mpitools.Isend_Bool(True, range(1, _size)) else: if not mpitools.Recv_Bool(0): return # New nodes that are created from the segments that are shared, # have to be informed bertween sharers. shareCommonNodes(self, markedEdges, skeleton, newSkeleton) # Collecting Skeletons skeletonIPC.collect_pieces(newSkeleton) newSkeleton.cleanUp() ## report_skeleton(newSkeleton) ## if _rank == 0: ## debug.fmsg(newSkeleton.all_skeletons) return newSkeleton
def _refinement(self, skeleton, newSkeleton, context): global _rank if _rank == 0: pBar = progressbar.getProgress() markedEdges = refine.EdgeMarkings() self.newEdgeNodes = {} # allows sharing of new edge nodes # Primary marking self.targets(skeleton, context, self.degree.divisions, markedEdges, self.criterion) # Additional marking -- only for (conservative) bisection at this point. self.degree.markExtras(skeleton, markedEdges) # Now, share the marking information on the boundary shareMarkings(markedEdges, skeleton) # Refine elements and segments segmentdict = {} # which segments have been handled already. elements = skeleton.elements # At this point, to properly update progress bar, every process has # loop over the same range(maxn). # TODO: Is progress bar not supposed to work within IPC call? n = len(elements) alln = mpitools.Allgather_Int(n) maxn = max(alln) nelem = 0 ntotal = reduce(lambda x,y: x+y, alln) for ii in range(maxn): try: oldElement = elements[ii] count = 1 oldnnodes = oldElement.nnodes() # Get list of number of subdivisions on each edge ("marks") marks = markedEdges.getMarks(oldElement) # Find the canonical order for the marks. (The order is # ambiguous due to the arbitrary choice of the starting # edge. Finding the canonical order allows the refinement # rule to be found in the rule table.) rotation is the # offset into the elements node list required to match the # refinement rule to the element's marked edges. # signature is the canonical ordering of the marks. rotation, signature = refine.findSignature(marks) # Create new nodes along the subdivided element edges edgenodes = [self.getNewEdgeNodes(oldElement.nodes[i], oldElement.nodes[(i+1)%oldnnodes], marks[i], newSkeleton, skeleton) for i in range(oldnnodes)] # Create new elements newElements = self.rules[signature].apply(oldElement, rotation, edgenodes, newSkeleton, self.alpha) # If the old element's homogeneity is "1", it's safe to say that # new elements' homogeneities are "1". if oldElement.homogeneity(skeleton.MS) == 1.: for el in newElements: el.copyHomogeneity(oldElement) # The calls to Skeleton.newElement() made by the # refinement rules have created new SkeletonSegments in # newSkeleton, but have not set the parentage of those # segments. We have to fix that here. for newElement in newElements: for segment in newElement.getSegments(newSkeleton): # Only look at each segment once. if not segmentdict.has_key(segment): segmentdict[segment] = 1 pseg = refine.findParentSegment(skeleton, newElement, segment, edgenodes) if pseg: pseg.add_child(segment) segment.add_parent(pseg) except IndexError: count = 0 # No. of elements done. nelem_step = mpitools.Allgather_Int(count) nelem += reduce(lambda x,y: x+y, nelem_step) if _rank == 0: if pBar.query_stop(): pBar.set_failure() pBar.set_message("Failed") mpitools.Isend_Bool(False, range(1,_size)) return None else: pBar.set_progress(1.0*(nelem)/ntotal) pBar.set_message("refining skeleton: %d/%d" % (nelem, ntotal)) mpitools.Isend_Bool(True, range(1,_size)) else: if not mpitools.Recv_Bool(0): return # New nodes that are created from the segments that are shared, # have to be informed bertween sharers. shareCommonNodes(self, markedEdges, skeleton, newSkeleton) # Collecting Skeletons skeletonIPC.collect_pieces(newSkeleton) newSkeleton.cleanUp() ## report_skeleton(newSkeleton) ## if _rank == 0: ## debug.fmsg(newSkeleton.all_skeletons) return newSkeleton