예제 #1
0
    def setUp(self):
        TestCase.setUp(self)

        self.geo = PenelopeGeometry('Test Geometry')

        surface1 = zplane(1e-10)
        surface2 = zplane(-1e-3)
        surface3 = cylinder(1e-2)
        surface4 = xplane(0.0)

        mat1 = PenelopeMaterial.pure(29)
        self.module1 = Module(self.geo, mat1)
        self.module1.add_surface(surface1, SIDEPOINTER_NEGATIVE)
        self.module1.add_surface(surface2, SIDEPOINTER_POSITIVE)
        self.module1.add_surface(surface3, SIDEPOINTER_NEGATIVE)
        self.module1.add_surface(surface4, SIDEPOINTER_POSITIVE)
        self.geo.modules.add(self.module1)

        mat2 = PenelopeMaterial.pure(30)
        self.module2 = Module(self.geo, mat2)
        self.module2.add_surface(surface1, SIDEPOINTER_NEGATIVE)
        self.module2.add_surface(surface2, SIDEPOINTER_POSITIVE)
        self.module2.add_surface(surface3, SIDEPOINTER_NEGATIVE)
        self.module2.add_module(self.module1)
        self.geo.modules.add(self.module2)

        self.geo.tilt_rad = radians(45)
예제 #2
0
    def setUp(self):
        TestCase.setUp(self)

        intforce = InteractionForcing(ELECTRON, HARD_BREMSSTRAHLUNG_EMISSION,
                                      -4)
        mat1 = PenelopeMaterial.pure(29,
                                     interaction_forcings=[intforce],
                                     maximum_step_length_m=1e4)
        mat1._index = 1

        mat2 = VACUUM
        mat2._index = 0

        surface1 = SurfaceImplicit()
        surface1._index = 0

        surface2 = SurfaceImplicit()
        surface2._index = 1

        self.module2 = Module(None, mat2)
        self.module2._index = 1

        self.module1 = Module(None, mat1, 'Test')
        self.module1.add_surface(surface1, -1)
        self.module1.add_surface(surface2, 1)
        self.module1.add_module(self.module2)
        self.module1.rotation.phi_rad = radians(180)
        self.module1.shift.z_m = -1e3
        self.module1._index = 0

        self.materials_lookup = {0: mat2, 1: mat1}
        self.surfaces_lookup = {0: surface1, 1: surface2}
        self.modules_lookup = {0: self.module1, 1: self.module2}
예제 #3
0
    def _export_geometry_vertical_layers(self, geometry, pengeom):
        layers = np.array(geometry.layers, ndmin=1)

        # Surfaces
        surface_top = zplane(0.0)  # z = 0
        surface_bottom = zplane(-0.1)  # z = -10 cm

        surface_layers = []
        for layer in layers:
            surface_layers.append(xplane(layer.xmin_m))
        surface_layers.append(xplane(layer.xmax_m))

        diameter_m = sum(map(attrgetter('thickness_m'), layers))
        surface_cylinder = cylinder(0.1 + 3.0 * diameter_m)  # 10 cm radius

        # Modules
        ## Left substrate
        module = Module(pengeom, geometry.left_substrate.material,
                        'Left substrate')
        module.add_surface(surface_cylinder, -1)
        module.add_surface(surface_top, -1)
        module.add_surface(surface_bottom, 1)
        module.add_surface(surface_layers[0], -1)

        pengeom.modules.add(module)

        ## Layers
        for i, surfaces in enumerate(_pairwise(surface_layers)):
            surface_left, surface_right = surfaces

            module = Module(pengeom, layers[i].material,
                            'Layer %i' % (i + 1, ))
            module.add_surface(surface_cylinder, -1)
            module.add_surface(surface_top, -1)
            module.add_surface(surface_bottom, 1)
            module.add_surface(surface_left, 1)
            module.add_surface(surface_right, -1)

            pengeom.modules.add(module)

        ## Right substrate
        module = Module(pengeom, geometry.right_substrate.material,
                        'Right substrate')
        module.add_surface(surface_cylinder, -1)
        module.add_surface(surface_top, -1)
        module.add_surface(surface_bottom, 1)
        module.add_surface(surface_layers[-1], 1)

        pengeom.modules.add(module)
예제 #4
0
    def _export_geometry_cuboids2d(self, geometry, pengeom):
        # Surfaces
        surface_top = zplane(0.0)  # z = 0
        surface_bottom = zplane(-0.1)  # z = -10 cm

        ## Vertical planes
        nx = geometry.nx
        ny = geometry.ny

        xsurfaces = {}
        for x in range(-(nx / 2), nx / 2 + 1):
            xsurfaces[x] = xplane(geometry.body[x, 0].xmin_m)
        xsurfaces[x + 1] = xplane(geometry.body[x, 0].xmax_m)

        ysurfaces = {}
        for y in range(-(ny / 2), ny / 2 + 1):
            ysurfaces[y] = yplane(geometry.body[0, y].ymin_m)
        ysurfaces[y + 1] = yplane(geometry.body[0, y].ymax_m)

        # Modules
        for position, body in geometry.get_bodies.items():
            x, y = position

            module = Module(pengeom,
                            body.material,
                            description='Position (%i, %i)' % position)

            module.add_surface(surface_bottom, 1)  # zmin
            module.add_surface(surface_top, -1)  # zmax
            module.add_surface(xsurfaces[x], 1)  # xmin
            module.add_surface(xsurfaces[x + 1], -1)  # xmax
            module.add_surface(ysurfaces[y], 1)  # ymin
            module.add_surface(ysurfaces[y + 1], -1)  # ymax

            pengeom.modules.add(module)
예제 #5
0
    def _export_geometry_sphere(self, geometry, pengeom):
        radius_m = geometry.body.diameter_m / 2.0
        surface_sphere = sphere(radius_m)

        module = Module(pengeom, geometry.body.material, 'Sphere')
        module.add_surface(surface_sphere, -1)
        module.shift.z_m = -radius_m
        pengeom.modules.add(module)
예제 #6
0
    def _export_geometry_inclusion(self, geometry, pengeom):
        surface_cylinder = cylinder(0.1)  # 10 cm radius
        surface_top = zplane(0.0)  # z = 0
        surface_bottom = zplane(-0.1)  # z = -10 cm
        surface_sphere = sphere(geometry.inclusion.diameter_m / 2.0)

        module_inclusion = Module(pengeom, geometry.inclusion.material,
                                  'Inclusion')
        module_inclusion.add_surface(surface_top, -1)
        module_inclusion.add_surface(surface_sphere, -1)

        module_substrate = Module(pengeom, geometry.substrate.material,
                                  'Substrate')
        module_substrate.add_surface(surface_cylinder, -1)
        module_substrate.add_surface(surface_top, -1)
        module_substrate.add_surface(surface_bottom, 1)
        module_substrate.add_module(module_inclusion)

        pengeom.modules.add(module_substrate)
        pengeom.modules.add(module_inclusion)
예제 #7
0
    def _export_geometry_substrate(self, geometry, pengeom):
        surface_cylinder = cylinder(0.1)  # 10 cm radius
        surface_top = zplane(0.0)  # z = 0
        surface_bottom = zplane(-0.1)  # z = -10 cm

        module = Module(pengeom, geometry.body.material, 'Substrate')
        module.add_surface(surface_cylinder, -1)
        module.add_surface(surface_top, -1)
        module.add_surface(surface_bottom, 1)

        pengeom.modules.add(module)
예제 #8
0
    def _export_geometry_horizontal_layers(self, geometry, pengeom):
        layers = np.array(geometry.layers, ndmin=1)

        # Surfaces
        surface_cylinder = cylinder(0.1)  # 10 cm radius

        surface_layers = [zplane(0.0)]
        for layer in layers:
            surface_layers.append(zplane(layer.zmin_m))

        # Modules
        tmpgrouping = []
        for i, surfaces in enumerate(_pairwise(surface_layers)):
            surface_top, surface_bottom = surfaces

            module = Module(pengeom, layers[i].material,
                            'Layer %i' % (i + 1, ))
            module.add_surface(surface_cylinder, -1)
            module.add_surface(surface_top, -1)
            module.add_surface(surface_bottom, 1)

            pengeom.modules.add(module)
            tmpgrouping.append((module, surface_bottom))

        if geometry.has_substrate():
            surface_top = surface_layers[-1]
            surface_bottom = zplane(surface_top.shift.z_m -
                                    0.1)  # 10 cm below last layer

            module = Module(pengeom, geometry.substrate.material, 'Substrate')
            module.add_surface(surface_cylinder, -1)
            module.add_surface(surface_top, -1)
            module.add_surface(surface_bottom, 1)

            pengeom.modules.add(module)
            tmpgrouping.append((module, surface_bottom))

        # Grouping
        # G0: s0, s2, m0, m1
        # G1: s0, s3, m2, g0
        # G2: s0, s4, m3, g1
        # etc.

        if len(tmpgrouping) <= 2:  # no grouping required if only 2 modules
            return

        module, surface_bottom = tmpgrouping[1]

        group = Module(pengeom, VACUUM, 'grouping')
        group.add_surface(surface_cylinder, -1)
        group.add_surface(surface_layers[0], -1)  # top z = 0.0
        group.add_surface(surface_bottom, 1)
        group.add_module(tmpgrouping[0][0])  # m0
        group.add_module(module)  #m1

        pengeom.modules.add(group)

        for module, surface_bottom in tmpgrouping[2:]:
            oldgroup = group

            group = Module(pengeom, VACUUM, 'grouping')
            group.add_surface(surface_cylinder, -1)
            group.add_surface(surface_layers[0], -1)  # top z = 0.0
            group.add_surface(surface_bottom, 1)
            group.add_module(module)
            group.add_module(oldgroup)

            pengeom.modules.add(group)