summaryrefslogtreecommitdiff
path: root/geometry.py
diff options
context:
space:
mode:
authorAnthony LaTorre <tlatorre9@gmail.com>2011-08-08 16:29:51 -0400
committerAnthony LaTorre <tlatorre9@gmail.com>2011-08-08 16:29:51 -0400
commite2abda5048bfc3cf359691ea07e380d6e9f9fd19 (patch)
treee04b1815f861bb807a82f89a94c5ca9c3abfab90 /geometry.py
parented642493fccbcf13efef5491f73241c6a9434ad8 (diff)
downloadchroma-e2abda5048bfc3cf359691ea07e380d6e9f9fd19.tar.gz
chroma-e2abda5048bfc3cf359691ea07e380d6e9f9fd19.tar.bz2
chroma-e2abda5048bfc3cf359691ea07e380d6e9f9fd19.zip
speedup Geometry.build()
Diffstat (limited to 'geometry.py')
-rw-r--r--geometry.py30
1 files changed, 12 insertions, 18 deletions
diff --git a/geometry.py b/geometry.py
index 37367e5..a98b5cd 100644
--- a/geometry.py
+++ b/geometry.py
@@ -212,6 +212,7 @@ class Geometry(object):
return len(self.solids)-1
@timeit
+ #@profile
def build(self, bits=8, shift=3):
offsets = [ (0,0) ]
for solid in self.solids:
@@ -269,34 +270,27 @@ class Geometry(object):
enumerate(self.solids)])[reorder]
unique_zvalues = np.unique(zvalues_mesh)
- zvalues = np.empty(unique_zvalues.size, dtype=np.uint64)
self.lower_bounds = np.empty((unique_zvalues.size,3), dtype=np.float32)
self.upper_bounds = np.empty((unique_zvalues.size,3), dtype=np.float32)
- self.node_map = np.empty(unique_zvalues.size, dtype=np.uint32)
- self.node_length = np.empty(unique_zvalues.size, dtype=np.uint32)
- self.layers = np.empty(unique_zvalues.size, dtype=np.uint32)
- layer = 0
+ assembled_mesh = self.mesh.assemble(group=False)
+ zi1_array = np.searchsorted(zvalues_mesh, unique_zvalues)
+ zi2_array = np.searchsorted(zvalues_mesh, unique_zvalues, side='right')
- for i, z in enumerate(unique_zvalues):
- i1 = np.searchsorted(zvalues_mesh, z)
- i2 = np.searchsorted(zvalues_mesh, z, side='right')
-
- self.lower_bounds[i] = self.mesh.assemble(slice(i1,i2), group=False).min(axis=0)
- self.upper_bounds[i] = self.mesh.assemble(slice(i1,i2), group=False).max(axis=0)
-
- self.node_map[i] = i1
- self.node_length[i] = i2-i1
- self.layers[i] = layer
-
- zvalues[i] = z
+ for i, (zi1, zi2) in enumerate(zip(zi1_array,zi2_array)):
+ self.lower_bounds[i] = assembled_mesh[zi1*3:zi2*3].min(0)
+ self.upper_bounds[i] = assembled_mesh[zi1*3:zi2*3].max(0)
+ zvalues = np.array(unique_zvalues, copy=True)
+ self.node_map = np.array(zi1_array, copy=True)
+ self.node_length = zi2_array - zi1_array
+ self.layers = np.zeros(unique_zvalues.size, dtype=np.uint32)
self.first_node = unique_zvalues.size
begin_last_layer = 0
- layer += 1
+ layer = 1
while True:
bit_shifted_zvalues = zvalues >> shift