diff options
author | Stan Seibert <stan@mtrr.org> | 2011-08-17 15:51:56 -0400 |
---|---|---|
committer | Stan Seibert <stan@mtrr.org> | 2011-08-17 15:51:56 -0400 |
commit | b73e04e2e917d568159e146ddd5310881cc812ff (patch) | |
tree | c3aea42fb38fb325555635c7e014c31f617738d2 | |
parent | dcdd67ffbeacc26fdbd8c8dcf41e4dd53c39c512 (diff) | |
download | chroma-b73e04e2e917d568159e146ddd5310881cc812ff.tar.gz chroma-b73e04e2e917d568159e146ddd5310881cc812ff.tar.bz2 chroma-b73e04e2e917d568159e146ddd5310881cc812ff.zip |
Add flag to Simulation() and Geometry.build() to ignore the BVH cache.
-rw-r--r-- | geometry.py | 67 | ||||
-rwxr-xr-x | sim.py | 5 |
2 files changed, 40 insertions, 32 deletions
diff --git a/geometry.py b/geometry.py index 6ea8994..b2cb9c0 100644 --- a/geometry.py +++ b/geometry.py @@ -225,7 +225,7 @@ class Geometry(object): return len(self.solids)-1 @timeit - def build(self, bits=8, shift=3): + def build(self, bits=8, shift=3, use_cache=True): """ Build the bounding volume hierarchy, material/surface code arrays, and color array for this geometry. If the bounding volume hierarchy is @@ -240,6 +240,11 @@ class Geometry(object): The number of bits to shift the zvalue of each node when building the next layer of the bounding volume hierarchy. Defaults to 3. + - use_cache: bool, *optional* + If true, the on-disk cache in ~/.chroma/ will be checked for + a previously built version of this geometry, otherwise the + BVH will be computed and saved to the cache. If false, + the cache is ignored and also not updated. """ nv = np.cumsum([0] + [len(solid.mesh.vertices) for solid in self.solids]) nt = np.cumsum([0] + [len(solid.mesh.triangles) for solid in self.solids]) @@ -286,26 +291,27 @@ class Geometry(object): cache_file = checksum.hexdigest() cache_path = os.path.join(cache_dir, cache_file) - try: - f = gzip.GzipFile(cache_path, 'rb') - except IOError: - pass - else: - print 'loading cache.' - data = pickle.load(f) - - reorder = data.pop('reorder') - self.mesh.triangles = self.mesh.triangles[reorder] - self.material1_index = self.material1_index[reorder] - self.material2_index = self.material2_index[reorder] - self.surface_index = self.surface_index[reorder] - self.colors = self.colors[reorder] - self.solid_id = self.solid_id[reorder] - - for key, value in data.iteritems(): - setattr(self, key, value) - f.close() - return + if use_cache: + try: + f = gzip.GzipFile(cache_path, 'rb') + except IOError: + pass + else: + print 'loading cache.' + data = pickle.load(f) + + reorder = data.pop('reorder') + self.mesh.triangles = self.mesh.triangles[reorder] + self.material1_index = self.material1_index[reorder] + self.material2_index = self.material2_index[reorder] + self.surface_index = self.surface_index[reorder] + self.colors = self.colors[reorder] + self.solid_id = self.solid_id[reorder] + + for key, value in data.iteritems(): + setattr(self, key, value) + f.close() + return zvalues_mesh = morton_order(self.mesh, bits) reorder = np.argsort(zvalues_mesh) @@ -366,14 +372,15 @@ class Geometry(object): if unique_zvalues.size == 1: break - print >>sys.stderr, 'Writing BVH to cache directory...' + if use_cache: + print >>sys.stderr, 'Writing BVH to cache directory...' - if not os.path.exists(cache_dir): - os.makedirs(cache_dir) + if not os.path.exists(cache_dir): + os.makedirs(cache_dir) - with gzip.GzipFile(cache_path, 'wb', compresslevel=1) as f: - data = {} - for key in ['lower_bounds', 'upper_bounds', 'node_map', 'node_map_end', 'layers', 'first_node']: - data[key] = getattr(self, key) - data['reorder'] = reorder - pickle.dump(data, f, -1) + with gzip.GzipFile(cache_path, 'wb', compresslevel=1) as f: + data = {} + for key in ['lower_bounds', 'upper_bounds', 'node_map', 'node_map_end', 'layers', 'first_node']: + data[key] = getattr(self, key) + data['reorder'] = reorder + pickle.dump(data, f, -1) @@ -23,7 +23,8 @@ def pick_seed(): class Simulation(object): def __init__(self, detector, detector_material, - seed=None, cuda_device=None, geant4_processes=4, bvh_bits=11): + seed=None, cuda_device=None, geant4_processes=4, bvh_bits=11, + use_cache=True): self.detector = detector if seed is None: @@ -44,7 +45,7 @@ class Simulation(object): self.photon_generator = None print >>sys.stderr, 'Creating BVH with %d bits...' % (bvh_bits) - detector.build(bits=bvh_bits) + detector.build(bits=bvh_bits, use_cache=use_cache) print >>sys.stderr, 'Initializing GPU...' self.gpu_worker = gpu.GPU(cuda_device) |