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)
    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}
Esempio n. 3
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)
Esempio n. 4
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}
Esempio n. 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)
Esempio n. 6
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)
class TestPenelopeGeometry(TestCase):
    GEOFILE = ['XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
               '       Test Geometry',
               '0000000000000000000000000000000000000000000000000000000000000000',
               'SURFACE (   1) Plane Z=0.00 m',
               'INDICES=( 0, 0, 0, 1, 0)',
               'X-SCALE=(+1.000000000000000E+00,   0)              (DEFAULT=1.0)',
               'Y-SCALE=(+1.000000000000000E+00,   0)              (DEFAULT=1.0)',
               'Z-SCALE=(+1.000000000000000E+00,   0)              (DEFAULT=1.0)',
               '  OMEGA=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
               '  THETA=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
               '    PHI=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
               'X-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
               'Y-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
               'Z-SHIFT=(+1.000000000000000E-08,   0)              (DEFAULT=0.0)',
               '0000000000000000000000000000000000000000000000000000000000000000',
               'SURFACE (   2) Cylinder of radius 0.01 m along z-axis',
               'INDICES=( 1, 1, 0, 0,-1)',
               'X-SCALE=(+1.000000000000000E-02,   0)              (DEFAULT=1.0)',
               'Y-SCALE=(+1.000000000000000E-02,   0)              (DEFAULT=1.0)',
               'Z-SCALE=(+1.000000000000000E+00,   0)              (DEFAULT=1.0)',
               '  OMEGA=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
               '  THETA=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
               '    PHI=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
               'X-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
               'Y-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
               'Z-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
               '0000000000000000000000000000000000000000000000000000000000000000',
               'SURFACE (   3) Plane Z=-0.00 m',
               'INDICES=( 0, 0, 0, 1, 0)',
               'X-SCALE=(+1.000000000000000E+00,   0)              (DEFAULT=1.0)',
               'Y-SCALE=(+1.000000000000000E+00,   0)              (DEFAULT=1.0)',
               'Z-SCALE=(+1.000000000000000E+00,   0)              (DEFAULT=1.0)',
               '  OMEGA=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
               '  THETA=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
               '    PHI=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
               'X-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
               'Y-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
               'Z-SHIFT=(-1.000000000000000E-01,   0)              (DEFAULT=0.0)',
               '0000000000000000000000000000000000000000000000000000000000000000',
               'SURFACE (   4) Plane X=0.00 m',
               'INDICES=( 0, 0, 0, 1, 0)',
               'X-SCALE=(+1.000000000000000E+00,   0)              (DEFAULT=1.0)',
               'Y-SCALE=(+1.000000000000000E+00,   0)              (DEFAULT=1.0)',
               'Z-SCALE=(+1.000000000000000E+00,   0)              (DEFAULT=1.0)',
               '  OMEGA=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
               '  THETA=(+9.000000000000000E+01,   0) DEG          (DEFAULT=0.0)',
               '    PHI=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
               'X-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
               'Y-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
               'Z-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
               '0000000000000000000000000000000000000000000000000000000000000000',
               'MODULE  (   1) ',
               'MATERIAL(   1)',
               'SURFACE (   1), SIDE POINTER=(-1)',
               'SURFACE (   2), SIDE POINTER=(-1)',
               'SURFACE (   3), SIDE POINTER=( 1)',
               'SURFACE (   4), SIDE POINTER=( 1)',
               '1111111111111111111111111111111111111111111111111111111111111111',
               '  OMEGA=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
               '  THETA=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
               '    PHI=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
               'X-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
               'Y-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
               'Z-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
               '0000000000000000000000000000000000000000000000000000000000000000',
               'MODULE  (   2) ',
               'MATERIAL(   2)',
               'SURFACE (   1), SIDE POINTER=(-1)',
               'SURFACE (   2), SIDE POINTER=(-1)',
               'SURFACE (   3), SIDE POINTER=( 1)',
               'MODULE  (   1)',
               '1111111111111111111111111111111111111111111111111111111111111111',
               '  OMEGA=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
               '  THETA=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
               '    PHI=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
               'X-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
               'Y-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
               'Z-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
               '0000000000000000000000000000000000000000000000000000000000000000',
               'MODULE  (   3) Extra module for rotation and tilt',
               'MATERIAL(   0)',
               'MODULE  (   2)',
               '1111111111111111111111111111111111111111111111111111111111111111',
               '  OMEGA=(+2.700000000000000E+02,   0) DEG          (DEFAULT=0.0)',
               '  THETA=(+4.500000000000000E+01,   0) DEG          (DEFAULT=0.0)',
               '    PHI=(+9.000000000000000E+01,   0) DEG          (DEFAULT=0.0)',
               'X-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
               'Y-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
               'Z-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
               '0000000000000000000000000000000000000000000000000000000000000000',
               'END      0000000000000000000000000000000000000000000000000000000']

    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)

    def tearDown(self):
        TestCase.tearDown(self)

    def testskeleton(self):
        self.assertEqual('Test Geometry', self.geo.title)
        self.assertAlmostEqual(radians(45), self.geo.tilt_rad, 4)
        self.assertAlmostEqual(0.0, self.geo.rotation_rad, 4)
        self.assertEqual(2, len(self.geo.get_bodies()))
        self.assertEqual(2, len(self.geo.modules))
        self.assertEqual(4, len(self.geo.get_surfaces()))
        self.assertEqual(2, len(self.geo.get_materials()))

    def testto_geo(self):
        lines = self.geo.to_geo()
        self.assertEqual(self.GEOFILE[:3], lines[:3])
        self.assertEqual(self.GEOFILE[14], lines[14])
        self.assertEqual(self.GEOFILE[26], lines[26])
        self.assertEqual(self.GEOFILE[38], lines[38])
        self.assertEqual(self.GEOFILE[50], lines[50])
        self.assertEqual(self.GEOFILE[51], lines[51])
        self.assertEqual(self.GEOFILE[57:65], lines[57:65])
        self.assertEqual(self.GEOFILE[65], lines[65])
        self.assertEqual(self.GEOFILE[71:], lines[71:])
class TestModule(TestCase):
    GEO1 = ['MODULE  (   1) Test',
            'MATERIAL(   1)',
            'SURFACE (   1), SIDE POINTER=(-1)',
            'SURFACE (   2), SIDE POINTER=( 1)',
            'MODULE  (   2)',
            '1111111111111111111111111111111111111111111111111111111111111111',
            '  OMEGA=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
            '  THETA=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
            '    PHI=(+1.800000000000000E+02,   0) DEG          (DEFAULT=0.0)',
            'X-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
            'Y-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
            'Z-SHIFT=(-1.000000000000000E+05,   0)              (DEFAULT=0.0)']
    GEO2 = ['MODULE  (   2) ',
            'MATERIAL(   0)',
            '1111111111111111111111111111111111111111111111111111111111111111',
            '  OMEGA=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
            '  THETA=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
            '    PHI=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
            'X-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
            'Y-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
            'Z-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.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}

    def tearDown(self):
        TestCase.tearDown(self)

    def testskeleton(self):
        # Module 1
        self.assertEqual('Copper', str(self.module1.material))
        self.assertAlmostEqual(1e4, self.module1.material.maximum_step_length_m, 4)
        self.assertEqual(1, len(self.module1.material.interaction_forcings))
        self.assertEqual('Test', self.module1.description)
        self.assertAlmostEqual(radians(180), self.module1.rotation.phi_rad, 4)
        self.assertAlmostEqual(-1e3, self.module1.shift.z_m, 4)
        self.assertEqual(2, len(self.module1.get_surfaces()))
        self.assertEqual(1, len(self.module1.get_modules()))

        # Module 2
        self.assertEqual(str(VACUUM), str(self.module2.material))
        self.assertEqual(0, len(self.module2.get_surfaces()))
        self.assertEqual(0, len(self.module2.get_modules()))

    def testto_geo(self):
        # Module 1
        lines = self.module1.to_geo()
        self.assertEqual(12, len(lines))
        self.assertEqual(self.GEO1, lines)

        # Module 2
        lines = self.module2.to_geo()
        self.assertEqual(9, len(lines))
        self.assertEqual(self.GEO2, lines)
Esempio n. 9
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)
Esempio n. 10
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)
Esempio n. 11
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)
Esempio n. 12
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)
Esempio n. 13
0
class TestPenelopeGeometry(TestCase):
    GEOFILE = [
        'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
        '       Test Geometry',
        '0000000000000000000000000000000000000000000000000000000000000000',
        'SURFACE (   1) Plane Z=0.00 m', 'INDICES=( 0, 0, 0, 1, 0)',
        'X-SCALE=(+1.000000000000000E+00,   0)              (DEFAULT=1.0)',
        'Y-SCALE=(+1.000000000000000E+00,   0)              (DEFAULT=1.0)',
        'Z-SCALE=(+1.000000000000000E+00,   0)              (DEFAULT=1.0)',
        '  OMEGA=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
        '  THETA=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
        '    PHI=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
        'X-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
        'Y-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
        'Z-SHIFT=(+1.000000000000000E-08,   0)              (DEFAULT=0.0)',
        '0000000000000000000000000000000000000000000000000000000000000000',
        'SURFACE (   2) Cylinder of radius 0.01 m along z-axis',
        'INDICES=( 1, 1, 0, 0,-1)',
        'X-SCALE=(+1.000000000000000E-02,   0)              (DEFAULT=1.0)',
        'Y-SCALE=(+1.000000000000000E-02,   0)              (DEFAULT=1.0)',
        'Z-SCALE=(+1.000000000000000E+00,   0)              (DEFAULT=1.0)',
        '  OMEGA=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
        '  THETA=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
        '    PHI=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
        'X-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
        'Y-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
        'Z-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
        '0000000000000000000000000000000000000000000000000000000000000000',
        'SURFACE (   3) Plane Z=-0.00 m', 'INDICES=( 0, 0, 0, 1, 0)',
        'X-SCALE=(+1.000000000000000E+00,   0)              (DEFAULT=1.0)',
        'Y-SCALE=(+1.000000000000000E+00,   0)              (DEFAULT=1.0)',
        'Z-SCALE=(+1.000000000000000E+00,   0)              (DEFAULT=1.0)',
        '  OMEGA=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
        '  THETA=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
        '    PHI=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
        'X-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
        'Y-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
        'Z-SHIFT=(-1.000000000000000E-01,   0)              (DEFAULT=0.0)',
        '0000000000000000000000000000000000000000000000000000000000000000',
        'SURFACE (   4) Plane X=0.00 m', 'INDICES=( 0, 0, 0, 1, 0)',
        'X-SCALE=(+1.000000000000000E+00,   0)              (DEFAULT=1.0)',
        'Y-SCALE=(+1.000000000000000E+00,   0)              (DEFAULT=1.0)',
        'Z-SCALE=(+1.000000000000000E+00,   0)              (DEFAULT=1.0)',
        '  OMEGA=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
        '  THETA=(+9.000000000000000E+01,   0) DEG          (DEFAULT=0.0)',
        '    PHI=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
        'X-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
        'Y-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
        'Z-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
        '0000000000000000000000000000000000000000000000000000000000000000',
        'MODULE  (   1) ', 'MATERIAL(   1)',
        'SURFACE (   1), SIDE POINTER=(-1)',
        'SURFACE (   2), SIDE POINTER=(-1)',
        'SURFACE (   3), SIDE POINTER=( 1)',
        'SURFACE (   4), SIDE POINTER=( 1)',
        '1111111111111111111111111111111111111111111111111111111111111111',
        '  OMEGA=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
        '  THETA=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
        '    PHI=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
        'X-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
        'Y-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
        'Z-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
        '0000000000000000000000000000000000000000000000000000000000000000',
        'MODULE  (   2) ', 'MATERIAL(   2)',
        'SURFACE (   1), SIDE POINTER=(-1)',
        'SURFACE (   2), SIDE POINTER=(-1)',
        'SURFACE (   3), SIDE POINTER=( 1)', 'MODULE  (   1)',
        '1111111111111111111111111111111111111111111111111111111111111111',
        '  OMEGA=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
        '  THETA=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
        '    PHI=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
        'X-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
        'Y-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
        'Z-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
        '0000000000000000000000000000000000000000000000000000000000000000',
        'MODULE  (   3) Extra module for rotation and tilt', 'MATERIAL(   0)',
        'MODULE  (   2)',
        '1111111111111111111111111111111111111111111111111111111111111111',
        '  OMEGA=(+2.700000000000000E+02,   0) DEG          (DEFAULT=0.0)',
        '  THETA=(+4.500000000000000E+01,   0) DEG          (DEFAULT=0.0)',
        '    PHI=(+9.000000000000000E+01,   0) DEG          (DEFAULT=0.0)',
        'X-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
        'Y-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
        'Z-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
        '0000000000000000000000000000000000000000000000000000000000000000',
        'END      0000000000000000000000000000000000000000000000000000000'
    ]

    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)

    def tearDown(self):
        TestCase.tearDown(self)

    def testskeleton(self):
        self.assertEqual('Test Geometry', self.geo.title)
        self.assertAlmostEqual(radians(45), self.geo.tilt_rad, 4)
        self.assertAlmostEqual(0.0, self.geo.rotation_rad, 4)
        self.assertEqual(2, len(self.geo.get_bodies()))
        self.assertEqual(2, len(self.geo.modules))
        self.assertEqual(4, len(self.geo.get_surfaces()))
        self.assertEqual(2, len(self.geo.get_materials()))

    def testto_geo(self):
        lines = self.geo.to_geo()
        self.assertEqual(self.GEOFILE[:3], lines[:3])
        self.assertEqual(self.GEOFILE[14], lines[14])
        self.assertEqual(self.GEOFILE[26], lines[26])
        self.assertEqual(self.GEOFILE[38], lines[38])
        self.assertEqual(self.GEOFILE[50], lines[50])
        self.assertEqual(self.GEOFILE[51], lines[51])
        self.assertEqual(self.GEOFILE[57:65], lines[57:65])
        self.assertEqual(self.GEOFILE[65], lines[65])
        self.assertEqual(self.GEOFILE[71:], lines[71:])
Esempio n. 14
0
class TestModule(TestCase):
    GEO1 = [
        'MODULE  (   1) Test', 'MATERIAL(   1)',
        'SURFACE (   1), SIDE POINTER=(-1)',
        'SURFACE (   2), SIDE POINTER=( 1)', 'MODULE  (   2)',
        '1111111111111111111111111111111111111111111111111111111111111111',
        '  OMEGA=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
        '  THETA=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
        '    PHI=(+1.800000000000000E+02,   0) DEG          (DEFAULT=0.0)',
        'X-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
        'Y-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
        'Z-SHIFT=(-1.000000000000000E+05,   0)              (DEFAULT=0.0)'
    ]
    GEO2 = [
        'MODULE  (   2) ', 'MATERIAL(   0)',
        '1111111111111111111111111111111111111111111111111111111111111111',
        '  OMEGA=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
        '  THETA=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
        '    PHI=(+0.000000000000000E+00,   0) DEG          (DEFAULT=0.0)',
        'X-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
        'Y-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.0)',
        'Z-SHIFT=(+0.000000000000000E+00,   0)              (DEFAULT=0.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}

    def tearDown(self):
        TestCase.tearDown(self)

    def testskeleton(self):
        # Module 1
        self.assertEqual('Copper', str(self.module1.material))
        self.assertAlmostEqual(1e4,
                               self.module1.material.maximum_step_length_m, 4)
        self.assertEqual(1, len(self.module1.material.interaction_forcings))
        self.assertEqual('Test', self.module1.description)
        self.assertAlmostEqual(radians(180), self.module1.rotation.phi_rad, 4)
        self.assertAlmostEqual(-1e3, self.module1.shift.z_m, 4)
        self.assertEqual(2, len(self.module1.get_surfaces()))
        self.assertEqual(1, len(self.module1.get_modules()))

        # Module 2
        self.assertEqual(str(VACUUM), str(self.module2.material))
        self.assertEqual(0, len(self.module2.get_surfaces()))
        self.assertEqual(0, len(self.module2.get_modules()))

    def testto_geo(self):
        # Module 1
        lines = self.module1.to_geo()
        self.assertEqual(12, len(lines))
        self.assertEqual(self.GEO1, lines)

        # Module 2
        lines = self.module2.to_geo()
        self.assertEqual(9, len(lines))
        self.assertEqual(self.GEO2, lines)