[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