[yt-svn] commit/yt: 3 new changesets

commits-noreply at bitbucket.org commits-noreply at bitbucket.org
Thu Feb 28 12:31:28 PST 2013


3 new commits in yt:

https://bitbucket.org/yt_analysis/yt/commits/179818618ece/
changeset:   179818618ece
branch:      yt
user:        samskillman
date:        2013-02-26 04:58:12
summary:     Making it possible to add 1 grid at a time to the AMRKDTree.  Now during
a build, levels of grids are added until the number of grids added exceeds the
number of processors.  After that point, the tree is built grid by grid.  This
leads to a significant build performance improvement, though alternative
methods should be investigated.  Also setting the default of
AMRKDTree.sum_cells() to only give the total of the leaf node cells.  This has
been used by me to make sure that the total number of cells in a parallel build
is what is expected.
affected #:  2 files

diff -r a381ca6cefefc3d987fe725b4ce1a0884687a4f4 -r 179818618ecef3f1c476c899666eecc41c25017f yt/utilities/amr_kdtree/amr_kdtools.py
--- a/yt/utilities/amr_kdtree/amr_kdtools.py
+++ b/yt/utilities/amr_kdtree/amr_kdtools.py
@@ -57,6 +57,49 @@
     else:
         return False
 
+
+def add_grid(node, gle, gre, gid, rank, size):
+    if not should_i_build(node, rank, size):
+        return
+
+    if kd_is_leaf(node):
+        insert_grid(node, gle, gre, gid, rank, size)
+    else:
+        less_id = gle[node.split.dim] < node.split.pos
+        if less_id:
+            add_grid(node.left, gle, gre,
+                     gid, rank, size)
+
+        greater_id = gre[node.split.dim] > node.split.pos
+        if greater_id:
+            add_grid(node.right, gle, gre,
+                     gid, rank, size)
+
+
+def insert_grid(node, gle, gre, grid_id, rank, size):
+    if not should_i_build(node, rank, size):
+        return
+
+    # If we should continue to split based on parallelism, do so!
+    if should_i_split(node, rank, size):
+        geo_split(node, gle, gre, grid_id, rank, size)
+        return
+
+    if np.all(gle <= node.left_edge) and \
+            np.all(gre >= node.right_edge):
+        node.grid = grid_id
+        assert(node.grid is not None)
+        return
+
+    # Split the grid
+    check = split_grid(node, gle, gre, grid_id, rank, size)
+    # If check is -1, then we have found a place where there are no choices.
+    # Exit out and set the node to None.
+    if check == -1:
+        node.grid = None
+    return
+
+
 def add_grids(node, gles, gres, gids, rank, size):
     if not should_i_build(node, rank, size):
         return
@@ -74,9 +117,36 @@
             add_grids(node.right, gles[greater_ids], gres[greater_ids],
                       gids[greater_ids], rank, size)
 
+
 def should_i_split(node, rank, size):
     return node.id < size
 
+
+def geo_split_grid(node, gle, gre, grid_id, rank, size):
+    big_dim = np.argmax(gre-gle)
+    new_pos = (gre[big_dim] + gle[big_dim])/2.
+    old_gre = gre.copy()
+    new_gle = gle.copy()
+    new_gle[big_dim] = new_pos
+    gre[big_dim] = new_pos
+
+    split = Split(big_dim, new_pos)
+
+    # Create a Split
+    divide(node, split)
+
+    # Populate Left Node
+    #print 'Inserting left node', node.left_edge, node.right_edge
+    insert_grid(node.left, gle, gre,
+                grid_id, rank, size)
+
+    # Populate Right Node
+    #print 'Inserting right node', node.left_edge, node.right_edge
+    insert_grid(node.right, new_gle, old_gre,
+                grid_id, rank, size)
+    return
+
+
 def geo_split(node, gles, gres, grid_ids, rank, size):
     big_dim = np.argmax(gres[0]-gles[0])
     new_pos = (gres[0][big_dim] + gles[0][big_dim])/2.
@@ -128,6 +198,39 @@
         node.grid = None
     return
 
+def split_grid(node, gle, gre, grid_id, rank, size):
+    # Find a Split
+    data = np.array([(gle[:], gre[:])],  copy=False)
+    best_dim, split_pos, less_id, greater_id = \
+        kdtree_get_choices(data, node.left_edge, node.right_edge)
+
+    # If best_dim is -1, then we have found a place where there are no choices.
+    # Exit out and set the node to None.
+    if best_dim == -1:
+        return -1
+
+    split = Split(best_dim, split_pos)
+
+    del data, best_dim, split_pos
+
+    # Create a Split
+    divide(node, split)
+
+    # Populate Left Node
+    #print 'Inserting left node', node.left_edge, node.right_edge
+    if less_id:
+        insert_grid(node.left, gle, gre,
+                     grid_id, rank, size)
+
+    # Populate Right Node
+    #print 'Inserting right node', node.left_edge, node.right_edge
+    if greater_id:
+        insert_grid(node.right, gle, gre,
+                     grid_id, rank, size)
+
+    return
+
+
 def split_grids(node, gles, gres, grid_ids, rank, size):
     # Find a Split
     data = np.array([(gles[i,:], gres[i,:]) for i in

diff -r a381ca6cefefc3d987fe725b4ce1a0884687a4f4 -r 179818618ecef3f1c476c899666eecc41c25017f yt/utilities/amr_kdtree/amr_kdtree.py
--- a/yt/utilities/amr_kdtree/amr_kdtree.py
+++ b/yt/utilities/amr_kdtree/amr_kdtree.py
@@ -29,7 +29,7 @@
 from amr_kdtools import Node, Split, kd_is_leaf, kd_sum_volume, kd_node_check, \
         depth_traverse, viewpoint_traverse, add_grids, \
         receive_and_reduce, send_to_parent, scatter_image, find_node, \
-        depth_first_touch
+        depth_first_touch, add_grid
 from yt.utilities.parallel_tools.parallel_analysis_interface \
     import ParallelAnalysisInterface 
 from yt.utilities.lib.grid_traversal import PartitionedGrid
@@ -78,18 +78,27 @@
         lvl_range = range(self.min_level, self.max_level+1)
         if grids is None:
             level_iter = self.pf.hierarchy.get_levels()
+            grids_added = 0
             while True:
                 try:
                     grids = level_iter.next()
                 except:
                     break
-                if grids[0].Level not in lvl_range: continue
-                gmask = np.array([g in self.grids for g in grids])
-                gles =  np.array([g.LeftEdge for g in grids])[gmask]
-                gres =  np.array([g.RightEdge for g in grids])[gmask]
-                gids = np.array([g.id for g in grids])[gmask]
-                add_grids(self.trunk, gles, gres, gids, self.comm_rank, self.comm_size)
-                del gles, gres, gids, grids
+                if grids[0].Level not in lvl_range:
+                    continue
+                if grids_added < self.comm_size:
+                    gmask = np.array([g in self.grids for g in grids])
+                    gles = np.array([g.LeftEdge for g in grids])[gmask]
+                    gres = np.array([g.RightEdge for g in grids])[gmask]
+                    gids = np.array([g.id for g in grids])[gmask]
+                    add_grids(self.trunk, gles, gres, gids, self.comm_rank,
+                              self.comm_size)
+                    grids_added += grids.size
+                    del gles, gres, gids, grids
+                else:
+                    grids_added += grids.size
+                    [add_grid(self.trunk, g.LeftEdge, g.RightEdge, g.id,
+                              self.comm_rank, self.comm_size) for g in grids]
         else:
             gles = np.array([g.LeftEdge for g in grids])
             gres = np.array([g.RightEdge for g in grids])
@@ -123,15 +132,16 @@
         mylog.debug('AMRKDTree volume = %e' % vol)
         kd_node_check(self.trunk)
 
-    def sum_cells(self):
+    def sum_cells(self, all_cells=False):
         cells = 0
         for node in depth_traverse(self):
             if node.grid is None:
                 continue
+            if not all_cells and not kd_is_leaf(node):
+                continue
             grid = self.pf.h.grids[node.grid - self._id_offset]
             dds = grid.dds
             gle = grid.LeftEdge
-            gre = grid.RightEdge
             li = np.rint((node.left_edge-gle)/dds).astype('int32')
             ri = np.rint((node.right_edge-gle)/dds).astype('int32')
             dims = (ri - li).astype('int32')


https://bitbucket.org/yt_analysis/yt/commits/bbfaf46ae484/
changeset:   bbfaf46ae484
branch:      yt
user:        samskillman
date:        2013-02-26 17:36:06
summary:     Fixing up the tests for the AMRKDTree.  Now asserts that the total number of
highest resolution cells (at a given location) is equal in both pf.h.all_data
and the AMRKDTree.  Asserts the volume is equal to np.prod(dre-dle), and that
all the nodes are covered by the grid that is assigned to them.
affected #:  1 file

diff -r 179818618ecef3f1c476c899666eecc41c25017f -r bbfaf46ae4841d3019736bbc2d024275bfe34791 yt/utilities/tests/test_amr_kdtree.py
--- a/yt/utilities/tests/test_amr_kdtree.py
+++ b/yt/utilities/tests/test_amr_kdtree.py
@@ -24,48 +24,46 @@
 """
 
 from yt.utilities.amr_kdtree.api import AMRKDTree
-from yt.utilities.amr_kdtree.amr_kdtools import kd_node_check, depth_traverse
+from yt.utilities.amr_kdtree.amr_kdtools import depth_traverse
 import yt.utilities.initial_conditions as ic
 import yt.utilities.flagging_methods as fm
 from yt.frontends.stream.api import load_uniform_grid, refine_amr
+from yt.testing import assert_equal
 import numpy as np
 
-def test_amr_kdtree():
+
+def test_amr_kdtree_coverage():
     domain_dims = (32, 32, 32)
     data = np.zeros(domain_dims) + 0.25
-    fo = [ic.CoredSphere(0.05, 0.3, [0.7,0.4,0.75], {"Density": (0.25, 100.0)})]
+    fo = [ic.CoredSphere(0.05, 0.3, [0.7, 0.4, 0.75],
+                         {"Density": (0.25, 100.0)})]
     rc = [fm.flagging_method_registry["overdensity"](8.0)]
     ug = load_uniform_grid({'Density': data}, domain_dims, 1.0)
     pf = refine_amr(ug, rc, fo, 5)
- 
+
     kd = AMRKDTree(pf)
 
-    assert(1.0 == kd.count_volume()) 
-    
-def test_amr_kdtree_coverage():
-    domain_dims = (32, 32, 32)
-    data = np.zeros(domain_dims) + 0.25
-    fo = [ic.CoredSphere(0.05, 0.3, [0.7,0.4,0.75], {"Density": (0.25, 100.0)})]
-    rc = [fm.flagging_method_registry["overdensity"](8.0)]
-    ug = load_uniform_grid({'Density': data}, domain_dims, 1.0)
-    pf = refine_amr(ug, rc, fo, 5)
- 
-    kd = AMRKDTree(pf)
+    volume = kd.count_volume()
+    yield assert_equal, volume, \
+        np.prod(pf.domain_right_edge - pf.domain_left_edge)
 
+    cells = kd.count_cells()
+    true_cells = pf.h.all_data().quantities['TotalQuantity']('Ones')[0]
+    yield assert_equal, cells, true_cells
 
     # This largely reproduces the AMRKDTree.tree.check_tree() functionality
+    tree_ok = True
     for node in depth_traverse(kd.tree):
         if node.grid is None:
             continue
         grid = pf.h.grids[node.grid - kd._id_offset]
         dds = grid.dds
         gle = grid.LeftEdge
-        gre = grid.RightEdge
         li = np.rint((node.left_edge-gle)/dds).astype('int32')
         ri = np.rint((node.right_edge-gle)/dds).astype('int32')
         dims = (ri - li).astype('int32')
-        assert(np.all(grid.LeftEdge <= node.left_edge))
-        assert(np.all(grid.RightEdge >= node.right_edge))
-        assert(np.all(dims > 0))
+        tree_ok *= np.all(grid.LeftEdge <= node.left_edge)
+        tree_ok *= np.all(grid.RightEdge >= node.right_edge)
+        tree_ok *= np.all(dims > 0)
 
-
+    yield assert_equal, True, tree_ok


https://bitbucket.org/yt_analysis/yt/commits/f8e5308c580c/
changeset:   f8e5308c580c
branch:      yt
user:        MatthewTurk
date:        2013-02-28 21:31:23
summary:     Merged in samskillman/yt (pull request #447)

AMRKDTree performance boost
affected #:  3 files

diff -r 972598e86077a32186d861107b2a7dbdca439a99 -r f8e5308c580cfa961b2ce3df2c41996753b8c0ff yt/utilities/amr_kdtree/amr_kdtools.py
--- a/yt/utilities/amr_kdtree/amr_kdtools.py
+++ b/yt/utilities/amr_kdtree/amr_kdtools.py
@@ -57,6 +57,49 @@
     else:
         return False
 
+
+def add_grid(node, gle, gre, gid, rank, size):
+    if not should_i_build(node, rank, size):
+        return
+
+    if kd_is_leaf(node):
+        insert_grid(node, gle, gre, gid, rank, size)
+    else:
+        less_id = gle[node.split.dim] < node.split.pos
+        if less_id:
+            add_grid(node.left, gle, gre,
+                     gid, rank, size)
+
+        greater_id = gre[node.split.dim] > node.split.pos
+        if greater_id:
+            add_grid(node.right, gle, gre,
+                     gid, rank, size)
+
+
+def insert_grid(node, gle, gre, grid_id, rank, size):
+    if not should_i_build(node, rank, size):
+        return
+
+    # If we should continue to split based on parallelism, do so!
+    if should_i_split(node, rank, size):
+        geo_split(node, gle, gre, grid_id, rank, size)
+        return
+
+    if np.all(gle <= node.left_edge) and \
+            np.all(gre >= node.right_edge):
+        node.grid = grid_id
+        assert(node.grid is not None)
+        return
+
+    # Split the grid
+    check = split_grid(node, gle, gre, grid_id, rank, size)
+    # If check is -1, then we have found a place where there are no choices.
+    # Exit out and set the node to None.
+    if check == -1:
+        node.grid = None
+    return
+
+
 def add_grids(node, gles, gres, gids, rank, size):
     if not should_i_build(node, rank, size):
         return
@@ -74,9 +117,36 @@
             add_grids(node.right, gles[greater_ids], gres[greater_ids],
                       gids[greater_ids], rank, size)
 
+
 def should_i_split(node, rank, size):
     return node.id < size
 
+
+def geo_split_grid(node, gle, gre, grid_id, rank, size):
+    big_dim = np.argmax(gre-gle)
+    new_pos = (gre[big_dim] + gle[big_dim])/2.
+    old_gre = gre.copy()
+    new_gle = gle.copy()
+    new_gle[big_dim] = new_pos
+    gre[big_dim] = new_pos
+
+    split = Split(big_dim, new_pos)
+
+    # Create a Split
+    divide(node, split)
+
+    # Populate Left Node
+    #print 'Inserting left node', node.left_edge, node.right_edge
+    insert_grid(node.left, gle, gre,
+                grid_id, rank, size)
+
+    # Populate Right Node
+    #print 'Inserting right node', node.left_edge, node.right_edge
+    insert_grid(node.right, new_gle, old_gre,
+                grid_id, rank, size)
+    return
+
+
 def geo_split(node, gles, gres, grid_ids, rank, size):
     big_dim = np.argmax(gres[0]-gles[0])
     new_pos = (gres[0][big_dim] + gles[0][big_dim])/2.
@@ -128,6 +198,39 @@
         node.grid = None
     return
 
+def split_grid(node, gle, gre, grid_id, rank, size):
+    # Find a Split
+    data = np.array([(gle[:], gre[:])],  copy=False)
+    best_dim, split_pos, less_id, greater_id = \
+        kdtree_get_choices(data, node.left_edge, node.right_edge)
+
+    # If best_dim is -1, then we have found a place where there are no choices.
+    # Exit out and set the node to None.
+    if best_dim == -1:
+        return -1
+
+    split = Split(best_dim, split_pos)
+
+    del data, best_dim, split_pos
+
+    # Create a Split
+    divide(node, split)
+
+    # Populate Left Node
+    #print 'Inserting left node', node.left_edge, node.right_edge
+    if less_id:
+        insert_grid(node.left, gle, gre,
+                     grid_id, rank, size)
+
+    # Populate Right Node
+    #print 'Inserting right node', node.left_edge, node.right_edge
+    if greater_id:
+        insert_grid(node.right, gle, gre,
+                     grid_id, rank, size)
+
+    return
+
+
 def split_grids(node, gles, gres, grid_ids, rank, size):
     # Find a Split
     data = np.array([(gles[i,:], gres[i,:]) for i in

diff -r 972598e86077a32186d861107b2a7dbdca439a99 -r f8e5308c580cfa961b2ce3df2c41996753b8c0ff yt/utilities/amr_kdtree/amr_kdtree.py
--- a/yt/utilities/amr_kdtree/amr_kdtree.py
+++ b/yt/utilities/amr_kdtree/amr_kdtree.py
@@ -29,7 +29,7 @@
 from amr_kdtools import Node, Split, kd_is_leaf, kd_sum_volume, kd_node_check, \
         depth_traverse, viewpoint_traverse, add_grids, \
         receive_and_reduce, send_to_parent, scatter_image, find_node, \
-        depth_first_touch
+        depth_first_touch, add_grid
 from yt.utilities.parallel_tools.parallel_analysis_interface \
     import ParallelAnalysisInterface 
 from yt.utilities.lib.grid_traversal import PartitionedGrid
@@ -78,18 +78,27 @@
         lvl_range = range(self.min_level, self.max_level+1)
         if grids is None:
             level_iter = self.pf.hierarchy.get_levels()
+            grids_added = 0
             while True:
                 try:
                     grids = level_iter.next()
                 except:
                     break
-                if grids[0].Level not in lvl_range: continue
-                gmask = np.array([g in self.grids for g in grids])
-                gles =  np.array([g.LeftEdge for g in grids])[gmask]
-                gres =  np.array([g.RightEdge for g in grids])[gmask]
-                gids = np.array([g.id for g in grids])[gmask]
-                add_grids(self.trunk, gles, gres, gids, self.comm_rank, self.comm_size)
-                del gles, gres, gids, grids
+                if grids[0].Level not in lvl_range:
+                    continue
+                if grids_added < self.comm_size:
+                    gmask = np.array([g in self.grids for g in grids])
+                    gles = np.array([g.LeftEdge for g in grids])[gmask]
+                    gres = np.array([g.RightEdge for g in grids])[gmask]
+                    gids = np.array([g.id for g in grids])[gmask]
+                    add_grids(self.trunk, gles, gres, gids, self.comm_rank,
+                              self.comm_size)
+                    grids_added += grids.size
+                    del gles, gres, gids, grids
+                else:
+                    grids_added += grids.size
+                    [add_grid(self.trunk, g.LeftEdge, g.RightEdge, g.id,
+                              self.comm_rank, self.comm_size) for g in grids]
         else:
             gles = np.array([g.LeftEdge for g in grids])
             gres = np.array([g.RightEdge for g in grids])
@@ -123,15 +132,16 @@
         mylog.debug('AMRKDTree volume = %e' % vol)
         kd_node_check(self.trunk)
 
-    def sum_cells(self):
+    def sum_cells(self, all_cells=False):
         cells = 0
         for node in depth_traverse(self):
             if node.grid is None:
                 continue
+            if not all_cells and not kd_is_leaf(node):
+                continue
             grid = self.pf.h.grids[node.grid - self._id_offset]
             dds = grid.dds
             gle = grid.LeftEdge
-            gre = grid.RightEdge
             li = np.rint((node.left_edge-gle)/dds).astype('int32')
             ri = np.rint((node.right_edge-gle)/dds).astype('int32')
             dims = (ri - li).astype('int32')

diff -r 972598e86077a32186d861107b2a7dbdca439a99 -r f8e5308c580cfa961b2ce3df2c41996753b8c0ff yt/utilities/tests/test_amr_kdtree.py
--- a/yt/utilities/tests/test_amr_kdtree.py
+++ b/yt/utilities/tests/test_amr_kdtree.py
@@ -24,48 +24,46 @@
 """
 
 from yt.utilities.amr_kdtree.api import AMRKDTree
-from yt.utilities.amr_kdtree.amr_kdtools import kd_node_check, depth_traverse
+from yt.utilities.amr_kdtree.amr_kdtools import depth_traverse
 import yt.utilities.initial_conditions as ic
 import yt.utilities.flagging_methods as fm
 from yt.frontends.stream.api import load_uniform_grid, refine_amr
+from yt.testing import assert_equal
 import numpy as np
 
-def test_amr_kdtree():
+
+def test_amr_kdtree_coverage():
     domain_dims = (32, 32, 32)
     data = np.zeros(domain_dims) + 0.25
-    fo = [ic.CoredSphere(0.05, 0.3, [0.7,0.4,0.75], {"Density": (0.25, 100.0)})]
+    fo = [ic.CoredSphere(0.05, 0.3, [0.7, 0.4, 0.75],
+                         {"Density": (0.25, 100.0)})]
     rc = [fm.flagging_method_registry["overdensity"](8.0)]
     ug = load_uniform_grid({'Density': data}, domain_dims, 1.0)
     pf = refine_amr(ug, rc, fo, 5)
- 
+
     kd = AMRKDTree(pf)
 
-    assert(1.0 == kd.count_volume()) 
-    
-def test_amr_kdtree_coverage():
-    domain_dims = (32, 32, 32)
-    data = np.zeros(domain_dims) + 0.25
-    fo = [ic.CoredSphere(0.05, 0.3, [0.7,0.4,0.75], {"Density": (0.25, 100.0)})]
-    rc = [fm.flagging_method_registry["overdensity"](8.0)]
-    ug = load_uniform_grid({'Density': data}, domain_dims, 1.0)
-    pf = refine_amr(ug, rc, fo, 5)
- 
-    kd = AMRKDTree(pf)
+    volume = kd.count_volume()
+    yield assert_equal, volume, \
+        np.prod(pf.domain_right_edge - pf.domain_left_edge)
 
+    cells = kd.count_cells()
+    true_cells = pf.h.all_data().quantities['TotalQuantity']('Ones')[0]
+    yield assert_equal, cells, true_cells
 
     # This largely reproduces the AMRKDTree.tree.check_tree() functionality
+    tree_ok = True
     for node in depth_traverse(kd.tree):
         if node.grid is None:
             continue
         grid = pf.h.grids[node.grid - kd._id_offset]
         dds = grid.dds
         gle = grid.LeftEdge
-        gre = grid.RightEdge
         li = np.rint((node.left_edge-gle)/dds).astype('int32')
         ri = np.rint((node.right_edge-gle)/dds).astype('int32')
         dims = (ri - li).astype('int32')
-        assert(np.all(grid.LeftEdge <= node.left_edge))
-        assert(np.all(grid.RightEdge >= node.right_edge))
-        assert(np.all(dims > 0))
+        tree_ok *= np.all(grid.LeftEdge <= node.left_edge)
+        tree_ok *= np.all(grid.RightEdge >= node.right_edge)
+        tree_ok *= np.all(dims > 0)
 
-
+    yield assert_equal, True, tree_ok

Repository URL: https://bitbucket.org/yt_analysis/yt/

--

This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.



More information about the yt-svn mailing list