diff options
author | Anthony LaTorre <tlatorre9@gmail.com> | 2011-08-11 16:43:09 -0400 |
---|---|---|
committer | Anthony LaTorre <tlatorre9@gmail.com> | 2011-08-11 16:43:09 -0400 |
commit | 00aa07a12f8f00e29a3a04f2850ccd4fc91cc951 (patch) | |
tree | 50c76a5661693f2335278db2d6cc924d3cc60e20 | |
parent | 9d68f8ea2b6a64e83195f16aa066caac5eeb8fae (diff) | |
parent | 1b9aef380e629c136e045412621483ebb4a4164f (diff) | |
download | chroma-00aa07a12f8f00e29a3a04f2850ccd4fc91cc951.tar.gz chroma-00aa07a12f8f00e29a3a04f2850ccd4fc91cc951.tar.bz2 chroma-00aa07a12f8f00e29a3a04f2850ccd4fc91cc951.zip |
merge heads
-rw-r--r-- | .rootlogon.C | 2 | ||||
-rw-r--r-- | detectors/lbne.py | 6 | ||||
-rw-r--r-- | fileio/__init__.py (renamed from io/__init__.py) | 0 | ||||
-rw-r--r-- | fileio/root.C (renamed from io/root.C) | 0 | ||||
-rw-r--r-- | fileio/root.py (renamed from io/root.py) | 0 | ||||
-rw-r--r-- | g4gen.py | 7 | ||||
-rw-r--r-- | geometry.py | 18 | ||||
-rw-r--r-- | gpu.py | 30 | ||||
-rw-r--r-- | optics.py | 88 | ||||
-rwxr-xr-x | sim.py | 32 | ||||
-rw-r--r-- | src/kernel.cu | 2 | ||||
-rw-r--r-- | src/mesh.h | 12 |
12 files changed, 143 insertions, 54 deletions
diff --git a/.rootlogon.C b/.rootlogon.C index f1b4cf6..17915c5 100644 --- a/.rootlogon.C +++ b/.rootlogon.C @@ -1,3 +1,3 @@ { - gROOT->ProcessLine(".L io/root.C+g"); + gROOT->ProcessLine(".L fileio/root.C+g"); } diff --git a/detectors/lbne.py b/detectors/lbne.py index 3e8ae7b..3e27907 100644 --- a/detectors/lbne.py +++ b/detectors/lbne.py @@ -14,16 +14,16 @@ from make import cylinder def build_lbne(radius, height, nstrings, pmts_per_string, endcap_spacing, physical_model=True): if physical_model: - pmt = build_12inch_pmt_with_lc() + pmt = build_12inch_pmt_with_lc(outer_material=water_wcsim) else: - pmt = build_12inch_pmt_shell() + pmt = build_12inch_pmt_shell(outer_material=water_wcsim) lbne = Geometry() # outer cylinder cylinder_mesh = cylinder(radius, radius, height+height/(pmts_per_string-1), theta=(2*np.pi/nstrings)/4) cylinder_mesh.vertices = rotate(cylinder_mesh.vertices, np.pi/2, (-1,0,0)) - lbne.add_solid(Solid(cylinder_mesh, water, vacuum, black_surface, 0xff0000ff)) + lbne.add_solid(Solid(cylinder_mesh, water_wcsim, vacuum, black_surface, 0xff0000ff)) lbne.pmtids = [] diff --git a/io/__init__.py b/fileio/__init__.py index e69de29..e69de29 100644 --- a/io/__init__.py +++ b/fileio/__init__.py diff --git a/io/root.C b/fileio/root.C index 096811a..096811a 100644 --- a/io/root.C +++ b/fileio/root.C diff --git a/io/root.py b/fileio/root.py index e43f5d4..e43f5d4 100644 --- a/io/root.py +++ b/fileio/root.py @@ -18,7 +18,7 @@ except: import G4chroma class G4Generator(object): - def __init__(self, material): + def __init__(self, material, seed=None): '''Create generator to produce photons inside the specified material. material: chroma.geometry.Material object with density, @@ -26,7 +26,12 @@ class G4Generator(object): composition dictionary should be { element_symbol : fraction_by_weight, ... }. + seed: Random number generator seed for HepRandom. If None, + generator is not seeded. ''' + if seed is not None: + HepRandom.setTheSeed(seed) + g4py.NISTmaterials.Construct() g4py.ezgeom.Construct() self.physics_list = G4chroma.ChromaPhysicsList() diff --git a/geometry.py b/geometry.py index 81bc82d..9ef49bc 100644 --- a/geometry.py +++ b/geometry.py @@ -5,6 +5,7 @@ from itertoolset import * from tools import timeit from hashlib import md5 import cPickle as pickle +import gzip # all material/surface properties are interpolated at these # wavelengths when they are sent to the gpu @@ -266,7 +267,7 @@ class Geometry(object): cache_path = os.path.join(cache_dir, cache_file) try: - f = open(cache_path, 'rb') + f = gzip.GzipFile(cache_path, 'rb') except IOError: pass else: @@ -345,13 +346,14 @@ class Geometry(object): if unique_zvalues.size == 1: break + print >>sys.stderr, 'Writing BVH to cache directory...' + if not os.path.exists(cache_dir): os.makedirs(cache_dir) - f = open(cache_path, 'wb') - 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) - f.close() + 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) @@ -72,7 +72,7 @@ class GPU(object): device = cuda.Device(device_id) self.context = device.make_context() print 'device %s' % self.context.get_device().name() - cuda_options = ['-I' + src.dir, '--use_fast_math'] + cuda_options = ['-I' + src.dir, '--use_fast_math', '--ptxas-options=-v'] self.module = SourceModule(src.kernel, options=cuda_options, no_extern_c=True) self.geo_funcs = CUDAFuncs(self.module, ['set_wavelength_range', 'set_material', 'set_surface', 'set_global_mesh_variables', 'color_solids']) @@ -143,37 +143,31 @@ class GPU(object): triangles['w'] = ((geometry.material1_index & 0xff) << 24) | ((geometry.material2_index & 0xff) << 16) | ((geometry.surface_index & 0xff) << 8) self.triangles_gpu = gpuarray.to_gpu(triangles) - lower_bounds_float4 = np.empty(geometry.lower_bounds.shape[0], dtype=gpuarray.vec.float4) - lower_bounds_float4['x'] = geometry.lower_bounds[:,0] - lower_bounds_float4['y'] = geometry.lower_bounds[:,1] - lower_bounds_float4['z'] = geometry.lower_bounds[:,2] - self.lower_bounds_gpu = gpuarray.to_gpu(lower_bounds_float4) + lower_bounds_float3 = np.empty(geometry.lower_bounds.shape[0], dtype=gpuarray.vec.float3) + lower_bounds_float3['x'] = geometry.lower_bounds[:,0] + lower_bounds_float3['y'] = geometry.lower_bounds[:,1] + lower_bounds_float3['z'] = geometry.lower_bounds[:,2] + self.lower_bounds_gpu = gpuarray.to_gpu(lower_bounds_float3) - upper_bounds_float4 = np.empty(geometry.upper_bounds.shape[0], dtype=gpuarray.vec.float4) - upper_bounds_float4['x'] = geometry.upper_bounds[:,0] - upper_bounds_float4['y'] = geometry.upper_bounds[:,1] - upper_bounds_float4['z'] = geometry.upper_bounds[:,2] - self.upper_bounds_gpu = gpuarray.to_gpu(upper_bounds_float4) + upper_bounds_float3 = np.empty(geometry.upper_bounds.shape[0], dtype=gpuarray.vec.float3) + upper_bounds_float3['x'] = geometry.upper_bounds[:,0] + upper_bounds_float3['y'] = geometry.upper_bounds[:,1] + upper_bounds_float3['z'] = geometry.upper_bounds[:,2] + self.upper_bounds_gpu = gpuarray.to_gpu(upper_bounds_float3) self.colors_gpu = gpuarray.to_gpu(geometry.colors.astype(np.uint32)) self.node_map_gpu = gpuarray.to_gpu(geometry.node_map.astype(np.uint32)) self.node_map_end_gpu = gpuarray.to_gpu(geometry.node_map_end.astype(np.uint32)) self.solid_id_map_gpu = gpuarray.to_gpu(geometry.solid_id.astype(np.uint32)) - self.geo_funcs.set_global_mesh_variables(self.triangles_gpu, self.vertices_gpu, self.colors_gpu, np.uint32(geometry.node_map.size-1), np.uint32(geometry.first_node), block=(1,1,1), grid=(1,1)) + self.geo_funcs.set_global_mesh_variables(self.triangles_gpu, self.vertices_gpu, self.colors_gpu, np.uint32(geometry.node_map.size-1), np.uint32(geometry.first_node), self.lower_bounds_gpu, self.upper_bounds_gpu, block=(1,1,1), grid=(1,1)) - self.lower_bounds_tex = self.module.get_texref('lower_bounds') - self.upper_bounds_tex = self.module.get_texref('upper_bounds') self.node_map_tex = self.module.get_texref('node_map') self.node_map_end_tex = self.module.get_texref('node_map_end') - self.lower_bounds_tex.set_address(self.lower_bounds_gpu.gpudata, self.lower_bounds_gpu.nbytes) - self.upper_bounds_tex.set_address(self.upper_bounds_gpu.gpudata, self.upper_bounds_gpu.nbytes) self.node_map_tex.set_address(self.node_map_gpu.gpudata, self.node_map_gpu.nbytes) self.node_map_end_tex.set_address(self.node_map_end_gpu.gpudata, self.node_map_end_gpu.nbytes) - self.lower_bounds_tex.set_format(cuda.array_format.FLOAT, 4) - self.upper_bounds_tex.set_format(cuda.array_format.FLOAT, 4) self.node_map_tex.set_format(cuda.array_format.UNSIGNED_INT32, 1) self.node_map_end_tex.set_format(cuda.array_format.UNSIGNED_INT32, 1) @@ -47,6 +47,8 @@ r7081hqe_photocathode.absorb = r7081hqe_photocathode.detect # remaining photons are diffusely reflected r7081hqe_photocathode.set('reflect_diffuse', 1.0 - r7081hqe_photocathode.detect[:,1] - r7081hqe_photocathode.absorb[:,1], wavelengths=r7081hqe_photocathode.detect[:,0]) +######################## SNO+ materials ############################## + # water data comes from 'lightwater_sno' material in the SNO+ optics database water = Material('water') water.density = 1.0 # g/cm^3 @@ -157,14 +159,86 @@ glass.set('scattering_length', 1e6) # From SNO+ database acrylic_sno = Material('acrylic_sno') -acrylic_sno.set('refractive_index', [ 200.0, 220.0, 240.0, 260.0, 280.0, 300.0, 320.0, 340.0, 360.0, 380.0, 400.0, 420.0, 440.0, 460.0, 480.0, 500.0, 520.0, 540.0, 560.0, 580.0, 600.0, 620.0, 640.0, 660.0, 680.0, 700.0, 720.0, 740.0, 760.0, 780.0, 800.0 ], [ 1.59816, 1.57399, 1.55692, 1.54436, 1.5348, 1.52732, 1.52133, 1.51644, 1.51238, 1.50897, 1.50607, 1.50357, 1.50139, 1.49949, 1.49781, 1.49632, 1.49498, 1.49378, 1.49269, 1.49171, 1.49081, 1.48999, 1.48924, 1.48854, 1.4879, 1.4873, 1.48675, 1.48624, 1.48576, 1.48531, 1.48488 ]) -acrylic_sno.set('absorption_length', [ 200.0, 220.0, 240.0, 260.0, 280.0, 300.0, 320.0, 340.0, 360.0, 380.0, 400.0, 420.0, 440.0, 460.0, 480.0, 500.0, 520.0, 540.0, 560.0, 580.0, 600.0, 620.0, 640.0, 660.0, 680.0, 700.0, 720.0, 740.0, 760.0, 780.0, 800.0 ], [ 0.0456452, 0.0512064, 0.0583106, 0.0677037, 0.080704, 0.0998834, 0.131021, 0.190364, 0.347969, 0.661751, 0.979776, 1.31804, 1.34242, 1.36771, 1.39397, 1.42126, 1.42019, 1.41911, 1.41804, 1.41697, 1.4159, 1.41483, 1.41376, 1.4127, 1.41163, 1.41057, 1.40951, 1.40845, 1.40739, 1.40634, 1.40528 ]) -acrylic_sno.set('scattering_length', [ 200.0, 220.0, 240.0, 260.0, 280.0, 300.0, 320.0, 340.0, 360.0, 380.0, 400.0, 420.0, 440.0, 460.0, 480.0, 500.0, 520.0, 540.0, 560.0, 580.0, 600.0, 620.0, 640.0, 660.0, 680.0, 700.0, 720.0, 740.0, 760.0, 780.0, 800.0 ], [ 4.60015, 6.73532, 9.53941, 13.1394, 17.6734, 23.2903, 30.1503, 38.4246, 48.2953, 59.9557, 73.61, 89.4735, 107.773, 128.745, 152.638, 179.713, 210.238, 244.497, 282.781, 325.395, 372.652, 424.879, 482.413, 545.601, 614.801, 690.385, 772.733, 862.236, 959.298, 1064.33, 1177.77 ]) +acrylic_sno.set('refractive_index', wavelengths=[ 200.0, 220.0, 240.0, 260.0, 280.0, 300.0, 320.0, 340.0, 360.0, 380.0, 400.0, 420.0, 440.0, 460.0, 480.0, 500.0, 520.0, 540.0, 560.0, 580.0, 600.0, 620.0, 640.0, 660.0, 680.0, 700.0, 720.0, 740.0, 760.0, 780.0, 800.0 ], value=[ 1.59816, 1.57399, 1.55692, 1.54436, 1.5348, 1.52732, 1.52133, 1.51644, 1.51238, 1.50897, 1.50607, 1.50357, 1.50139, 1.49949, 1.49781, 1.49632, 1.49498, 1.49378, 1.49269, 1.49171, 1.49081, 1.48999, 1.48924, 1.48854, 1.4879, 1.4873, 1.48675, 1.48624, 1.48576, 1.48531, 1.48488 ]) +acrylic_sno.set('absorption_length', wavelengths=[ 200.0, 220.0, 240.0, 260.0, 280.0, 300.0, 320.0, 340.0, 360.0, 380.0, 400.0, 420.0, 440.0, 460.0, 480.0, 500.0, 520.0, 540.0, 560.0, 580.0, 600.0, 620.0, 640.0, 660.0, 680.0, 700.0, 720.0, 740.0, 760.0, 780.0, 800.0 ], value=[ 0.0456452, 0.0512064, 0.0583106, 0.0677037, 0.080704, 0.0998834, 0.131021, 0.190364, 0.347969, 0.661751, 0.979776, 1.31804, 1.34242, 1.36771, 1.39397, 1.42126, 1.42019, 1.41911, 1.41804, 1.41697, 1.4159, 1.41483, 1.41376, 1.4127, 1.41163, 1.41057, 1.40951, 1.40845, 1.40739, 1.40634, 1.40528 ]) +acrylic_sno.set('scattering_length', wavelengths=[ 200.0, 220.0, 240.0, 260.0, 280.0, 300.0, 320.0, 340.0, 360.0, 380.0, 400.0, 420.0, 440.0, 460.0, 480.0, 500.0, 520.0, 540.0, 560.0, 580.0, 600.0, 620.0, 640.0, 660.0, 680.0, 700.0, 720.0, 740.0, 760.0, 780.0, 800.0 ], value=[ 4.60015, 6.73532, 9.53941, 13.1394, 17.6734, 23.2903, 30.1503, 38.4246, 48.2953, 59.9557, 73.61, 89.4735, 107.773, 128.745, 152.638, 179.713, 210.238, 244.497, 282.781, 325.395, 372.652, 424.879, 482.413, 545.601, 614.801, 690.385, 772.733, 862.236, 959.298, 1064.33, 1177.77 ]) # From SNO+ database labppo_scintillator = Material('labppo_scintillator') -labppo_scintillator.set('refractive_index', [ 200.0, 213.0, 215.0, 217.0, 219.0, 221.0, 223.0, 225.0, 227.0, 229.0, 231.0, 233.0, 235.0, 237.0, 239.0, 241.0, 243.0, 245.0, 247.0, 249.0, 251.0, 253.0, 255.0, 257.0, 259.0, 261.0, 263.0, 265.0, 267.0, 269.0, 271.0, 273.0, 275.0, 277.0, 279.0, 281.0, 283.0, 285.0, 287.0, 289.0, 291.0, 293.0, 295.0, 297.0, 299.0, 301.0, 303.0, 305.0, 307.0, 309.0, 311.0, 313.0, 315.0, 317.0, 319.0, 321.0, 323.0, 325.0, 327.0, 329.0, 331.0, 333.0, 335.0, 337.0, 339.0, 341.0, 343.0, 345.0, 347.0, 349.0, 351.0, 353.0, 355.0, 357.0, 359.0, 361.0, 363.0, 365.0, 367.0, 369.0, 371.0, 373.0, 375.0, 377.0, 379.0, 381.0, 383.0, 385.0, 387.0, 389.0, 391.0, 393.0, 395.0, 397.0, 399.0, 401.0, 403.0, 405.0, 407.0, 409.0, 411.0, 413.0, 415.0, 417.0, 419.0, 421.0, 423.0, 425.0, 427.0, 429.0, 431.0, 433.0, 435.0, 437.0, 439.0, 441.0, 443.0, 445.0, 447.0, 449.0, 451.0, 453.0, 455.0, 457.0, 459.0, 461.0, 463.0, 465.0, 467.0, 469.0, 471.0, 473.0, 475.0, 477.0, 479.0, 481.0, 483.0, 485.0, 487.0, 489.0, 491.0, 493.0, 495.0, 497.0, 499.0, 501.0, 503.0, 505.0, 507.0, 509.0, 511.0, 513.0, 515.0, 517.0, 519.0, 521.0, 523.0, 525.0, 527.0, 529.0, 531.0, 533.0, 535.0, 537.0, 539.0, 541.0, 543.0, 545.0, 547.0, 549.0, 551.0, 553.0, 555.0, 557.0, 559.0, 561.0, 563.0, 565.0, 567.0, 569.0, 571.0, 573.0, 575.0, 577.0, 579.0, 581.0, 583.0, 585.0, 587.0, 589.0, 591.0, 593.0, 595.0, 597.0, 599.0, 601.0, 603.0, 605.0, 607.0, 609.0, 611.0, 613.0, 615.0, 617.0, 619.0, 621.0, 623.0, 625.0, 627.0, 629.0, 631.0, 633.0, 635.0, 637.0, 639.0, 641.0, 643.0, 645.0, 647.0, 649.0, 651.0, 653.0, 655.0, 657.0, 659.0, 661.0, 663.0, 665.0, 667.0, 669.0, 671.0, 673.0, 675.0, 677.0, 679.0, 681.0, 683.0, 685.0, 687.0, 689.0, 691.0, 693.0, 695.0, 697.0, 699.0, 701.0, 703.0, 705.0, 707.0, 709.0, 711.0, 713.0, 715.0, 717.0, 719.0, 721.0, 723.0, 725.0, 727.0, 729.0, 731.0, 733.0, 735.0, 737.0, 739.0, 741.0, 743.0, 745.0, 747.0, 749.0, 751.0, 753.0, 755.0, 757.0, 759.0, 761.0, 763.0, 765.0, 767.0, 769.0, 771.0, 773.0, 775.0, 777.0, 779.0, 781.0, 783.0, 785.0, 787.0, 789.0, 791.0, 793.0, 795.0, 797.0, 799.0, 800.0 ], [ 1.75541, 1.75541, 1.75541, 1.7526, 1.74552, 1.73503, 1.72202, 1.70736, 1.69194, 1.67662, 1.66228, 1.65227, 1.64307, 1.63526, 1.62846, 1.62243, 1.61699, 1.61204, 1.60748, 1.60326, 1.59933, 1.59565, 1.59218, 1.58892, 1.58582, 1.58288, 1.58009, 1.57742, 1.57488, 1.57244, 1.57011, 1.56787, 1.56571, 1.56365, 1.56165, 1.55973, 1.55788, 1.55609, 1.55437, 1.5527, 1.55108, 1.54952, 1.548, 1.54654, 1.54511, 1.54373, 1.54239, 1.54109, 1.53982, 1.53859, 1.5374, 1.53623, 1.5351, 1.534, 1.53293, 1.53188, 1.53086, 1.52987, 1.5289, 1.52795, 1.52703, 1.52613, 1.52525, 1.52439, 1.52355, 1.52273, 1.52193, 1.52115, 1.52039, 1.51964, 1.51891, 1.51819, 1.51749, 1.5168, 1.51613, 1.51547, 1.51483, 1.5142, 1.51358, 1.51297, 1.51238, 1.5118, 1.51122, 1.51066, 1.51012, 1.50958, 1.50905, 1.50853, 1.50802, 1.50752, 1.50703, 1.50655, 1.50608, 1.50561, 1.50516, 1.50471, 1.50427, 1.50383, 1.50341, 1.50299, 1.50258, 1.50218, 1.50178, 1.50139, 1.501, 1.50063, 1.50025, 1.49989, 1.49953, 1.49918, 1.49883, 1.49848, 1.49815, 1.49781, 1.49749, 1.49717, 1.49685, 1.49654, 1.49623, 1.49593, 1.49563, 1.49533, 1.49504, 1.49476, 1.49448, 1.4942, 1.49392, 1.49366, 1.49339, 1.49313, 1.49287, 1.49261, 1.49236, 1.49212, 1.49187, 1.49163, 1.49139, 1.49116, 1.49093, 1.4907, 1.49047, 1.49025, 1.49003, 1.48982, 1.4896, 1.48939, 1.48918, 1.48898, 1.48877, 1.48857, 1.48838, 1.48818, 1.48799, 1.4878, 1.48761, 1.48742, 1.48724, 1.48706, 1.48688, 1.4867, 1.48653, 1.48635, 1.48618, 1.48601, 1.48585, 1.48568, 1.48552, 1.48536, 1.4852, 1.48504, 1.48488, 1.48473, 1.48458, 1.48443, 1.48428, 1.48413, 1.48398, 1.48384, 1.4837, 1.48356, 1.48342, 1.48328, 1.48314, 1.48301, 1.48287, 1.48274, 1.48261, 1.48248, 1.48235, 1.48223, 1.4821, 1.48198, 1.48185, 1.48173, 1.48161, 1.48149, 1.48137, 1.48126, 1.48114, 1.48103, 1.48091, 1.4808, 1.48069, 1.48058, 1.48047, 1.48036, 1.48025, 1.48015, 1.48004, 1.47994, 1.47984, 1.47973, 1.47963, 1.47953, 1.47943, 1.47933, 1.47924, 1.47914, 1.47904, 1.47895, 1.47885, 1.47876, 1.47867, 1.47858, 1.47849, 1.4784, 1.47831, 1.47822, 1.47813, 1.47804, 1.47796, 1.47787, 1.47779, 1.4777, 1.47762, 1.47754, 1.47745, 1.47737, 1.47729, 1.47721, 1.47713, 1.47705, 1.47698, 1.4769, 1.47682, 1.47675, 1.47667, 1.4766, 1.47652, 1.47645, 1.47637, 1.4763, 1.47623, 1.47616, 1.47609, 1.47602, 1.47595, 1.47588, 1.47581, 1.47574, 1.47567, 1.4756, 1.47554, 1.47547, 1.4754, 1.47534, 1.47527, 1.47521, 1.47515, 1.47508, 1.47502, 1.47496, 1.47489, 1.47483, 1.47477, 1.47471, 1.47465, 1.47459, 1.47453, 1.47447, 1.47441, 1.47435, 1.47429, 1.47424, 1.47418, 1.47412, 1.47407, 1.47401, 1.47395, 1.4739, 1.47384, 1.47379, 1.47373, 1.47368, 1.47363, 1.4736 ]) -labppo_scintillator.set('absorption_length', [ 200.0, 215.0, 225.0, 235.0, 245.0, 255.0, 265.0, 275.0, 285.0, 295.0, 305.0, 315.0, 325.0, 335.0, 345.0, 355.0, 365.0, 375.0, 385.0, 395.0, 405.0, 415.0, 425.0, 435.0, 445.0, 455.0, 465.0, 475.0, 485.0, 495.0, 505.0, 515.0, 525.0, 535.0, 545.0, 555.0, 565.0, 575.0, 585.0, 595.0, 800.0 ], [ 1.54944e-07, 2.99637e-07, 1.72048e-05, 3.41222e-05, 1.53692e-05, 7.92675e-06, 1.00564e-05, 0.000270688, 0.000949206, 0.00134987, 0.00322232, 0.011032, 0.0379538, 0.708042, 2.68045, 4.20713, 5.71163, 7.92686, 9.90035, 17.239, 28.2318, 41.8939, 67.3786, 120.517, 347.953, 412.636, 147.016, 80.7207, 54.7561, 45.1483, 39.4147, 39.1438, 42.199, 41.6337, 35.783, 47.614, 58.3934, 43.0845, 32.0874, 35.6067, 35.6067 ]) -labppo_scintillator.set('absorption_wls_length', [ 200.0, 215.0, 225.0, 235.0, 245.0, 255.0, 265.0, 275.0, 285.0, 295.0, 305.0, 315.0, 325.0, 335.0, 345.0, 355.0, 365.0, 375.0, 385.0, 395.0, 405.0, 415.0, 425.0, 435.0, 445.0, 455.0, 465.0, 475.0, 485.0, 495.0, 505.0, 515.0, 525.0, 535.0, 545.0, 555.0, 565.0, 575.0, 585.0, 595.0, 800.0 ], [ 0.00109808, 0.000693615, 0.000437277, 0.000276096, 0.000173933, 0.000103044, 6.03065e-05, 3.56199e-05, 2.25651e-05, 1.60844e-05, 1.62228e-05, 2.21832e-05, 3.03067e-05, 5.24247e-05, 0.000484492, 0.0127541, 0.294651, 4.15892, 15.6626, 25.4821, 36.1763, 50.723, 63.9962, 77.7386, 89.8611, 103.551, 115.859, 125.442, 146.664, 163.748, 194.986, 194.652, 202.262, 234.033, 262.861, 279.883, 323.991, 299.632, 287.367, 303.42, 303.42 ]) -labppo_scintillator.set('scattering_length', [ 200.0, 215.0, 225.0, 235.0, 245.0, 255.0, 265.0, 275.0, 285.0, 295.0, 305.0, 315.0, 325.0, 335.0, 345.0, 355.0, 365.0, 375.0, 385.0, 395.0, 405.0, 415.0, 425.0, 435.0, 445.0, 455.0, 465.0, 475.0, 485.0, 495.0, 505.0, 515.0, 525.0, 535.0, 545.0, 555.0, 565.0, 575.0, 585.0, 595.0, 800.0 ], [ 0.290404, 0.387993, 0.465472, 0.553999, 0.654579, 0.768259, 0.89613, 1.03933, 1.19903, 1.37645, 1.57287, 1.78958, 2.02794, 2.28936, 2.57527, 2.88715, 3.22652, 3.59497, 3.9941, 4.42558, 4.89108, 5.3924, 5.93129, 6.50958, 7.12918, 7.79198, 8.49995, 9.2551, 10.0595, 10.9152, 11.8243, 12.7892, 13.8118, 14.8947, 16.04, 17.25, 18.5273, 19.8742, 21.2933, 22.7871, 22.7871 ]) +labppo_scintillator.set('refractive_index', wavelengths=[ 200.0, 213.0, 215.0, 217.0, 219.0, 221.0, 223.0, 225.0, 227.0, 229.0, 231.0, 233.0, 235.0, 237.0, 239.0, 241.0, 243.0, 245.0, 247.0, 249.0, 251.0, 253.0, 255.0, 257.0, 259.0, 261.0, 263.0, 265.0, 267.0, 269.0, 271.0, 273.0, 275.0, 277.0, 279.0, 281.0, 283.0, 285.0, 287.0, 289.0, 291.0, 293.0, 295.0, 297.0, 299.0, 301.0, 303.0, 305.0, 307.0, 309.0, 311.0, 313.0, 315.0, 317.0, 319.0, 321.0, 323.0, 325.0, 327.0, 329.0, 331.0, 333.0, 335.0, 337.0, 339.0, 341.0, 343.0, 345.0, 347.0, 349.0, 351.0, 353.0, 355.0, 357.0, 359.0, 361.0, 363.0, 365.0, 367.0, 369.0, 371.0, 373.0, 375.0, 377.0, 379.0, 381.0, 383.0, 385.0, 387.0, 389.0, 391.0, 393.0, 395.0, 397.0, 399.0, 401.0, 403.0, 405.0, 407.0, 409.0, 411.0, 413.0, 415.0, 417.0, 419.0, 421.0, 423.0, 425.0, 427.0, 429.0, 431.0, 433.0, 435.0, 437.0, 439.0, 441.0, 443.0, 445.0, 447.0, 449.0, 451.0, 453.0, 455.0, 457.0, 459.0, 461.0, 463.0, 465.0, 467.0, 469.0, 471.0, 473.0, 475.0, 477.0, 479.0, 481.0, 483.0, 485.0, 487.0, 489.0, 491.0, 493.0, 495.0, 497.0, 499.0, 501.0, 503.0, 505.0, 507.0, 509.0, 511.0, 513.0, 515.0, 517.0, 519.0, 521.0, 523.0, 525.0, 527.0, 529.0, 531.0, 533.0, 535.0, 537.0, 539.0, 541.0, 543.0, 545.0, 547.0, 549.0, 551.0, 553.0, 555.0, 557.0, 559.0, 561.0, 563.0, 565.0, 567.0, 569.0, 571.0, 573.0, 575.0, 577.0, 579.0, 581.0, 583.0, 585.0, 587.0, 589.0, 591.0, 593.0, 595.0, 597.0, 599.0, 601.0, 603.0, 605.0, 607.0, 609.0, 611.0, 613.0, 615.0, 617.0, 619.0, 621.0, 623.0, 625.0, 627.0, 629.0, 631.0, 633.0, 635.0, 637.0, 639.0, 641.0, 643.0, 645.0, 647.0, 649.0, 651.0, 653.0, 655.0, 657.0, 659.0, 661.0, 663.0, 665.0, 667.0, 669.0, 671.0, 673.0, 675.0, 677.0, 679.0, 681.0, 683.0, 685.0, 687.0, 689.0, 691.0, 693.0, 695.0, 697.0, 699.0, 701.0, 703.0, 705.0, 707.0, 709.0, 711.0, 713.0, 715.0, 717.0, 719.0, 721.0, 723.0, 725.0, 727.0, 729.0, 731.0, 733.0, 735.0, 737.0, 739.0, 741.0, 743.0, 745.0, 747.0, 749.0, 751.0, 753.0, 755.0, 757.0, 759.0, 761.0, 763.0, 765.0, 767.0, 769.0, 771.0, 773.0, 775.0, 777.0, 779.0, 781.0, 783.0, 785.0, 787.0, 789.0, 791.0, 793.0, 795.0, 797.0, 799.0, 800.0 ], value=[ 1.75541, 1.75541, 1.75541, 1.7526, 1.74552, 1.73503, 1.72202, 1.70736, 1.69194, 1.67662, 1.66228, 1.65227, 1.64307, 1.63526, 1.62846, 1.62243, 1.61699, 1.61204, 1.60748, 1.60326, 1.59933, 1.59565, 1.59218, 1.58892, 1.58582, 1.58288, 1.58009, 1.57742, 1.57488, 1.57244, 1.57011, 1.56787, 1.56571, 1.56365, 1.56165, 1.55973, 1.55788, 1.55609, 1.55437, 1.5527, 1.55108, 1.54952, 1.548, 1.54654, 1.54511, 1.54373, 1.54239, 1.54109, 1.53982, 1.53859, 1.5374, 1.53623, 1.5351, 1.534, 1.53293, 1.53188, 1.53086, 1.52987, 1.5289, 1.52795, 1.52703, 1.52613, 1.52525, 1.52439, 1.52355, 1.52273, 1.52193, 1.52115, 1.52039, 1.51964, 1.51891, 1.51819, 1.51749, 1.5168, 1.51613, 1.51547, 1.51483, 1.5142, 1.51358, 1.51297, 1.51238, 1.5118, 1.51122, 1.51066, 1.51012, 1.50958, 1.50905, 1.50853, 1.50802, 1.50752, 1.50703, 1.50655, 1.50608, 1.50561, 1.50516, 1.50471, 1.50427, 1.50383, 1.50341, 1.50299, 1.50258, 1.50218, 1.50178, 1.50139, 1.501, 1.50063, 1.50025, 1.49989, 1.49953, 1.49918, 1.49883, 1.49848, 1.49815, 1.49781, 1.49749, 1.49717, 1.49685, 1.49654, 1.49623, 1.49593, 1.49563, 1.49533, 1.49504, 1.49476, 1.49448, 1.4942, 1.49392, 1.49366, 1.49339, 1.49313, 1.49287, 1.49261, 1.49236, 1.49212, 1.49187, 1.49163, 1.49139, 1.49116, 1.49093, 1.4907, 1.49047, 1.49025, 1.49003, 1.48982, 1.4896, 1.48939, 1.48918, 1.48898, 1.48877, 1.48857, 1.48838, 1.48818, 1.48799, 1.4878, 1.48761, 1.48742, 1.48724, 1.48706, 1.48688, 1.4867, 1.48653, 1.48635, 1.48618, 1.48601, 1.48585, 1.48568, 1.48552, 1.48536, 1.4852, 1.48504, 1.48488, 1.48473, 1.48458, 1.48443, 1.48428, 1.48413, 1.48398, 1.48384, 1.4837, 1.48356, 1.48342, 1.48328, 1.48314, 1.48301, 1.48287, 1.48274, 1.48261, 1.48248, 1.48235, 1.48223, 1.4821, 1.48198, 1.48185, 1.48173, 1.48161, 1.48149, 1.48137, 1.48126, 1.48114, 1.48103, 1.48091, 1.4808, 1.48069, 1.48058, 1.48047, 1.48036, 1.48025, 1.48015, 1.48004, 1.47994, 1.47984, 1.47973, 1.47963, 1.47953, 1.47943, 1.47933, 1.47924, 1.47914, 1.47904, 1.47895, 1.47885, 1.47876, 1.47867, 1.47858, 1.47849, 1.4784, 1.47831, 1.47822, 1.47813, 1.47804, 1.47796, 1.47787, 1.47779, 1.4777, 1.47762, 1.47754, 1.47745, 1.47737, 1.47729, 1.47721, 1.47713, 1.47705, 1.47698, 1.4769, 1.47682, 1.47675, 1.47667, 1.4766, 1.47652, 1.47645, 1.47637, 1.4763, 1.47623, 1.47616, 1.47609, 1.47602, 1.47595, 1.47588, 1.47581, 1.47574, 1.47567, 1.4756, 1.47554, 1.47547, 1.4754, 1.47534, 1.47527, 1.47521, 1.47515, 1.47508, 1.47502, 1.47496, 1.47489, 1.47483, 1.47477, 1.47471, 1.47465, 1.47459, 1.47453, 1.47447, 1.47441, 1.47435, 1.47429, 1.47424, 1.47418, 1.47412, 1.47407, 1.47401, 1.47395, 1.4739, 1.47384, 1.47379, 1.47373, 1.47368, 1.47363, 1.4736 ]) +labppo_scintillator.set('absorption_length', wavelengths=[ 200.0, 215.0, 225.0, 235.0, 245.0, 255.0, 265.0, 275.0, 285.0, 295.0, 305.0, 315.0, 325.0, 335.0, 345.0, 355.0, 365.0, 375.0, 385.0, 395.0, 405.0, 415.0, 425.0, 435.0, 445.0, 455.0, 465.0, 475.0, 485.0, 495.0, 505.0, 515.0, 525.0, 535.0, 545.0, 555.0, 565.0, 575.0, 585.0, 595.0, 800.0 ], value=[ 1.54944e-07, 2.99637e-07, 1.72048e-05, 3.41222e-05, 1.53692e-05, 7.92675e-06, 1.00564e-05, 0.000270688, 0.000949206, 0.00134987, 0.00322232, 0.011032, 0.0379538, 0.708042, 2.68045, 4.20713, 5.71163, 7.92686, 9.90035, 17.239, 28.2318, 41.8939, 67.3786, 120.517, 347.953, 412.636, 147.016, 80.7207, 54.7561, 45.1483, 39.4147, 39.1438, 42.199, 41.6337, 35.783, 47.614, 58.3934, 43.0845, 32.0874, 35.6067, 35.6067 ]) +labppo_scintillator.set('absorption_wls_length', wavelengths=[ 200.0, 215.0, 225.0, 235.0, 245.0, 255.0, 265.0, 275.0, 285.0, 295.0, 305.0, 315.0, 325.0, 335.0, 345.0, 355.0, 365.0, 375.0, 385.0, 395.0, 405.0, 415.0, 425.0, 435.0, 445.0, 455.0, 465.0, 475.0, 485.0, 495.0, 505.0, 515.0, 525.0, 535.0, 545.0, 555.0, 565.0, 575.0, 585.0, 595.0, 800.0 ], value=[ 0.00109808, 0.000693615, 0.000437277, 0.000276096, 0.000173933, 0.000103044, 6.03065e-05, 3.56199e-05, 2.25651e-05, 1.60844e-05, 1.62228e-05, 2.21832e-05, 3.03067e-05, 5.24247e-05, 0.000484492, 0.0127541, 0.294651, 4.15892, 15.6626, 25.4821, 36.1763, 50.723, 63.9962, 77.7386, 89.8611, 103.551, 115.859, 125.442, 146.664, 163.748, 194.986, 194.652, 202.262, 234.033, 262.861, 279.883, 323.991, 299.632, 287.367, 303.42, 303.42 ]) +labppo_scintillator.set('scattering_length', wavelengths=[ 200.0, 215.0, 225.0, 235.0, 245.0, 255.0, 265.0, 275.0, 285.0, 295.0, 305.0, 315.0, 325.0, 335.0, 345.0, 355.0, 365.0, 375.0, 385.0, 395.0, 405.0, 415.0, 425.0, 435.0, 445.0, 455.0, 465.0, 475.0, 485.0, 495.0, 505.0, 515.0, 525.0, 535.0, 545.0, 555.0, 565.0, 575.0, 585.0, 595.0, 800.0 ], value=[ 0.290404, 0.387993, 0.465472, 0.553999, 0.654579, 0.768259, 0.89613, 1.03933, 1.19903, 1.37645, 1.57287, 1.78958, 2.02794, 2.28936, 2.57527, 2.88715, 3.22652, 3.59497, 3.9941, 4.42558, 4.89108, 5.3924, 5.93129, 6.50958, 7.12918, 7.79198, 8.49995, 9.2551, 10.0595, 10.9152, 11.8243, 12.7892, 13.8118, 14.8947, 16.04, 17.25, 18.5273, 19.8742, 21.2933, 22.7871, 22.7871 ]) + +################### WCSim materials ##################### + +water_wcsim = Material('water') +water_wcsim.density = 1.0 # g/cm^3 +water_wcsim.composition = { 'H' : 0.1119, 'O' : 0.8881 } # fraction by mass +hc_over_GeV = 1.2398424468024265e-06 # h_Planck * c_light / GeV / nanometer +wcsim_wavelengths = hc_over_GeV / np.array([ 1.56962e-09, 1.58974e-09, 1.61039e-09, 1.63157e-09, + 1.65333e-09, 1.67567e-09, 1.69863e-09, 1.72222e-09, + 1.74647e-09, 1.77142e-09,1.7971e-09, 1.82352e-09, + 1.85074e-09, 1.87878e-09, 1.90769e-09, 1.93749e-09, + 1.96825e-09, 1.99999e-09, 2.03278e-09, 2.06666e-09, + 2.10169e-09, 2.13793e-09, 2.17543e-09, 2.21428e-09, + 2.25454e-09, 2.29629e-09, 2.33962e-09, 2.38461e-09, + 2.43137e-09, 2.47999e-09, 2.53061e-09, 2.58333e-09, + 2.63829e-09, 2.69565e-09, 2.75555e-09, 2.81817e-09, + 2.88371e-09, 2.95237e-09, 3.02438e-09, 3.09999e-09, + 3.17948e-09, 3.26315e-09, 3.35134e-09, 3.44444e-09, + 3.54285e-09, 3.64705e-09, 3.75757e-09, 3.87499e-09, + 3.99999e-09, 4.13332e-09, 4.27585e-09, 4.42856e-09, + 4.59258e-09, 4.76922e-09, 4.95999e-09, 5.16665e-09, + 5.39129e-09, 5.63635e-09, 5.90475e-09, 6.19998e-09 ])[::-1] #reversed +water_wcsim.set('refractive_index', + wavelengths=wcsim_wavelengths, + value=np.array([1.32885, 1.32906, 1.32927, 1.32948, 1.3297, 1.32992, 1.33014, + 1.33037, 1.3306, 1.33084, 1.33109, 1.33134, 1.3316, 1.33186, 1.33213, + 1.33241, 1.3327, 1.33299, 1.33329, 1.33361, 1.33393, 1.33427, 1.33462, + 1.33498, 1.33536, 1.33576, 1.33617, 1.3366, 1.33705, 1.33753, 1.33803, + 1.33855, 1.33911, 1.3397, 1.34033, 1.341, 1.34172, 1.34248, 1.34331, + 1.34419, 1.34515, 1.3462, 1.34733, 1.34858, 1.34994, 1.35145, 1.35312, + 1.35498, 1.35707, 1.35943, 1.36211, 1.36518, 1.36872, 1.37287, 1.37776, + 1.38362, 1.39074, 1.39956, 1.41075, 1.42535])[::-1] #reversed +) +water_wcsim.set('absorption_length', + wavelengths=wcsim_wavelengths, + value=np.array([22.8154, 28.6144, 35.9923, 45.4086, 57.4650, + 72.9526, 75, 81.2317, 120.901, 160.243, + 193.797, 215.045, 227.786, 243.893, 294.113, + 321.735, 342.931, 362.967, 378.212, 449.602, + 740.143, 1116.06, 1438.78, 1615.48, 1769.86, + 2109.67, 2304.13, 2444.97, 3076.83, 4901.5, + 6666.57, 7873.95, 9433.81, 10214.5, 10845.8, + 15746.9, 20201.8, 22025.8, 21142.2, 15083.9, + 11751, 8795.34, 8741.23, 7102.37, 6060.68, + 4498.56, 3039.56, 2232.2, 1938, 1811.58, + 1610.32, 1338.7, 1095.3, 977.525, 965.258, + 1082.86, 876.434, 633.723, 389.87, 142.011])[::-1] / 100.0 # reversed, cm->m + ) + +water_wcsim.set('scattering_length', + wavelengths=wcsim_wavelengths, + value=np.array([167024.4, 158726.7, 150742, + 143062.5, 135680.2, 128587.4, + 121776.3, 115239.5, 108969.5, + 102958.8, 97200.35, 91686.86, + 86411.33, 81366.79, 76546.42, + 71943.46, 67551.29, 63363.36, + 59373.25, 55574.61, 51961.24, + 48527.00, 45265.87, 42171.94, + 39239.39, 36462.50, 33835.68, + 31353.41, 29010.30, 26801.03, + 24720.42, 22763.36, 20924.88, + 19200.07, 17584.16, 16072.45, + 14660.38, 13343.46, 12117.33, + 10977.70, 9920.416, 8941.407, + 8036.711, 7202.470, 6434.927, + 5730.429, 5085.425, 4496.467, + 3960.210, 3473.413, 3032.937, + 2635.746, 2278.907, 1959.588, + 1675.064, 1422.710, 1200.004, + 1004.528, 833.9666, 686.1063])[::-1] / 100.0 * 0.625 # reversed, cm -> m, * magic tuning constant + ) @@ -2,17 +2,23 @@ import sys import optparse import time +import os import multiprocessing import detectors import optics import gpu import g4gen -from io import root +from fileio import root import numpy as np import math import ROOT +def pick_seed(): + '''Returns a seed for a random number generator selected using + a mixture of the current time and the current process ID.''' + return int(time.time()) ^ (os.getpid() << 16) + def info(type, value, tb): if hasattr(sys, 'ps1') or not sys.stderr.isatty(): # we are in interactive mode or we don't have a tty-like @@ -26,10 +32,8 @@ def info(type, value, tb): # ...then start the debugger in post-mortem mode. pdb.pm() -sys.excepthook = info - class GeneratorProcess(multiprocessing.Process): - def __init__(self, particle, energy, position, direction, nevents, material): + def __init__(self, particle, energy, position, direction, nevents, material, seed=None): multiprocessing.Process.__init__(self) self.particle = particle @@ -38,11 +42,12 @@ class GeneratorProcess(multiprocessing.Process): self.direction = direction self.nevents = nevents self.material = material + self.seed = seed self.queue = multiprocessing.Queue() def run(self): print >>sys.stderr, 'Starting generator thread...' - generator = g4gen.G4Generator(self.material) + generator = g4gen.G4Generator(self.material, seed=self.seed) for i in xrange(self.nevents): photons = generator.generate_photons(particle_name=self.particle, @@ -87,7 +92,8 @@ def main(): parser.add_option('-b', type='int', dest='nbits', default=10) parser.add_option('-j', type='int', dest='device', default=None) parser.add_option('-n', type='int', dest='nblocks', default=64) - + parser.add_option('-s', type='int', dest='seed', default=None, + help='Set random number generator seed') parser.add_option('--detector', type='string', dest='detector', default='microlbne') parser.add_option('--nevents', type='int', dest='nevents', default=100) parser.add_option('--particle', type='string', dest='particle', default='e-') @@ -115,19 +121,24 @@ def main(): position = np.array(eval(options.pos), dtype=float) direction = np.array(eval(options.dir), dtype=float) detector = detectors.find(options.detector) + if options.seed is None: + options.seed = pick_seed() + + print >>sys.stderr, 'RNG seed:', options.seed print >>sys.stderr, 'Creating BVH for detector "%s" with %d bits...' % (options.detector, options.nbits) detector.build(bits=options.nbits) print >>sys.stderr, 'Creating generator...' - detector_material = optics.water + detector_material = optics.water_wcsim generator_thread = GeneratorProcess(particle=options.particle, energy=options.energy, position=position, direction=direction, nevents=options.nevents, - material=detector_material) - print >>sys.stderr, 'WARNING: ASSUMING DETECTOR IS WATER!!' + material=detector_material, + seed=options.seed) + print >>sys.stderr, 'WARNING: ASSUMING DETECTOR IS WCSIM WATER!!' # Do this now so we can get ahead of the photon propagation print >>sys.stderr, 'Starting GEANT4 generator...' @@ -140,7 +151,7 @@ def main(): gpu_worker.load_geometry(detector) print >>sys.stderr, 'Initializing random numbers generators...' - gpu_worker.setup_propagate() + gpu_worker.setup_propagate(seed=options.seed) gpu_worker.setup_daq(max(detector.pmtids)) # Create output file @@ -191,4 +202,5 @@ def main(): print >>sys.stderr, 'Done. %1.1f events/sec, %1.0f photons/sec.' % (options.nevents/(end_sim - start_sim), nphotons/(end_sim - start_sim)) if __name__ == '__main__': + sys.excepthook = info main() diff --git a/src/kernel.cu b/src/kernel.cu index 17b829c..fe518f6 100644 --- a/src/kernel.cu +++ b/src/kernel.cu @@ -17,7 +17,7 @@ __device__ void fAtomicAdd(float *addr, float data) } } -__device__ __noinline__ void to_diffuse(Photon &p, State &s, curandState &rng, const int &max_steps) +__device__ void to_diffuse(Photon &p, State &s, curandState &rng, const int &max_steps) { int steps = 0; while (steps < max_steps) @@ -13,8 +13,8 @@ __device__ unsigned int g_start_node; __device__ unsigned int g_first_node; /* lower/upper bounds for the bounding box associated with each node/leaf */ -texture<float4, 1, cudaReadModeElementType> upper_bounds; -texture<float4, 1, cudaReadModeElementType> lower_bounds; +__device__ float3 *g_lower_bounds; +__device__ float3 *g_upper_bounds; /* map to child node/triangle indices */ texture<unsigned int, 1, cudaReadModeElementType> node_map; @@ -38,8 +38,8 @@ __device__ int convert(int c) intersects the bounding box return true, else return false. */ __device__ bool intersect_node(const float3 &origin, const float3 &direction, const int &i) { - float3 lower_bound = make_float3(tex1Dfetch(lower_bounds, i)); - float3 upper_bound = make_float3(tex1Dfetch(upper_bounds, i)); + float3 lower_bound = g_lower_bounds[i]; + float3 upper_bound = g_upper_bounds[i]; return intersect_box(origin, direction, lower_bound, upper_bound); } @@ -134,13 +134,15 @@ __device__ int intersect_mesh(const float3 &origin, const float3& direction, flo extern "C" { -__global__ void set_global_mesh_variables(uint4 *triangles, float3 *vertices, unsigned int *colors, unsigned int start_node, unsigned int first_node) + __global__ void set_global_mesh_variables(uint4 *triangles, float3 *vertices, unsigned int *colors, unsigned int start_node, unsigned int first_node, float3 *lower_bounds, float3 *upper_bounds) { g_triangles = triangles; g_vertices = vertices; g_colors = colors; g_start_node = start_node; g_first_node = first_node; + g_lower_bounds = lower_bounds; + g_upper_bounds = upper_bounds; } __global__ void set_colors(unsigned int *colors) |