summaryrefslogtreecommitdiff
path: root/geometry.py
diff options
context:
space:
mode:
Diffstat (limited to 'geometry.py')
-rw-r--r--geometry.py75
1 files changed, 25 insertions, 50 deletions
diff --git a/geometry.py b/geometry.py
index a98b5cd..0657a77 100644
--- a/geometry.py
+++ b/geometry.py
@@ -1,8 +1,5 @@
import sys
import numpy as np
-import pycuda.driver as cuda
-from pycuda import gpuarray
-from itertools import *
from itertoolset import *
from tools import timeit
@@ -159,7 +156,7 @@ def interleave(arr, bits):
if len(arr.shape) != 2 or arr.shape[1] != 3:
raise Exception('shape mismatch')
- z = np.zeros(arr.shape[0], dtype=np.uint32)
+ z = np.zeros(arr.shape[0], dtype=np.uint64)
for i in range(bits):
z |= (arr[:,2] & 1 << i) << (2*i) | \
(arr[:,1] & 1 << i) << (2*i+1) | \
@@ -174,13 +171,13 @@ def morton_order(mesh, bits):
"""
lower_bound, upper_bound = mesh.get_bounds()
- if bits <= 0 or bits > 10:
- raise Exception('number of bits must be in the range (0,10].')
+ if bits <= 0 or bits > 21:
+ raise Exception('number of bits must be in the range (0,21].')
max_value = 2**bits - 1
def quantize(x):
- return np.uint32((x-lower_bound)*max_value/(upper_bound-lower_bound))
+ return np.uint64((x-lower_bound)*max_value/(upper_bound-lower_bound))
mean_positions = quantize(np.mean(mesh.assemble(), axis=1))
@@ -212,7 +209,6 @@ 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:
@@ -275,61 +271,40 @@ class Geometry(object):
self.upper_bounds = np.empty((unique_zvalues.size,3), dtype=np.float32)
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')
+ self.node_map = np.searchsorted(zvalues_mesh, unique_zvalues)
+ self.node_map_end = np.searchsorted(zvalues_mesh, unique_zvalues, side='right')
- 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)
+ for i, (zi1, zi2) in enumerate(izip(self.node_map, self.node_map_end)):
+ self.lower_bounds[i] = assembled_mesh[zi1*3:zi2*3].min(axis=0)
+ self.upper_bounds[i] = assembled_mesh[zi1*3:zi2*3].max(axis=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
+ for layer in count(1):
+ bit_shifted_zvalues = unique_zvalues >> shift
+ unique_zvalues = np.unique(bit_shifted_zvalues)
- while True:
- bit_shifted_zvalues = zvalues >> shift
- unique_bit_shifted_zvalues = np.unique(bit_shifted_zvalues)
- zvalues = np.empty(unique_bit_shifted_zvalues.size, dtype=np.uint64)
+ i0 = begin_last_layer + bit_shifted_zvalues.size
- self.lower_bounds.resize(\
- (self.lower_bounds.shape[0]+unique_bit_shifted_zvalues.size,3))
- self.upper_bounds.resize(\
- (self.upper_bounds.shape[0]+unique_bit_shifted_zvalues.size,3))
+ self.node_map.resize(self.node_map.size+unique_zvalues.size)
+ self.node_map[i0:] = np.searchsorted(bit_shifted_zvalues, unique_zvalues) + begin_last_layer
+ self.node_map_end.resize(self.node_map_end.size+unique_zvalues.size)
+ self.node_map_end[i0:] = np.searchsorted(bit_shifted_zvalues, unique_zvalues, side='right') + begin_last_layer
- self.node_map.resize(\
- self.node_map.size+unique_bit_shifted_zvalues.size)
- self.node_length.resize(\
- self.node_length.size+unique_bit_shifted_zvalues.size)
+ self.layers.resize(self.layers.size+unique_zvalues.size)
+ self.layers[i0:] = layer
- self.layers.resize(self.layers.size+unique_bit_shifted_zvalues.size)
+ self.lower_bounds.resize((self.lower_bounds.shape[0]+unique_zvalues.size,3))
+ self.upper_bounds.resize((self.upper_bounds.shape[0]+unique_zvalues.size,3))
- for i, z in enumerate(unique_bit_shifted_zvalues):
- i1 = np.searchsorted(bit_shifted_zvalues, z) + \
- begin_last_layer
- i2 = np.searchsorted(bit_shifted_zvalues, z, side='right') + \
- begin_last_layer
-
- zvalues[i] = z
-
- i += begin_last_layer + bit_shifted_zvalues.size
-
- self.lower_bounds[i] = self.lower_bounds[i1:i2].min(axis=0)
- self.upper_bounds[i] = self.upper_bounds[i1:i2].max(axis=0)
-
- self.node_map[i] = i1
- self.node_length[i] = i2-i1
- self.layers[i] = layer
+ for i, zi1, zi2 in izip(count(i0), self.node_map[i0:], self.node_map_end[i0:]):
+ self.lower_bounds[i] = self.lower_bounds[zi1:zi2].min(axis=0)
+ self.upper_bounds[i] = self.upper_bounds[zi1:zi2].max(axis=0)
begin_last_layer += bit_shifted_zvalues.size
- layer += 1
-
- if unique_bit_shifted_zvalues.size == 1:
+ if unique_zvalues.size == 1:
break
-