def export_geometry(self, geometry, outputdir): """ Exports geometry to a *geo* file and all materials to *mat* files. :arg geometry: :geometry object :arg outputdir: full path to a directory where the files will be saved. Note that any conflicting files will be overwritten without warnings. :return: a :class:`tuple` and a list of :class:`tuple`. The class:`tuple` contains 2 items: the :class:`PenelopeGeometry` object used to create the *geo* file and the full path of this *geo* file. Each :class:`tuple` in the list contains 2 items: the :class:`PenelopeMaterial` object and its associated *mat* filepath. The order of the materials is the same as they appear in the geometry file. In other words, the first material has an index of 1 in the geometry file. """ # Save geometry title = geometry.__class__.__name__.lower() pengeom = PenelopeGeometry(title) pengeom.tilt_rad = geometry.tilt_rad pengeom.rotation_rad = geometry.rotation_rad self._export_geometry(geometry, pengeom) lines = pengeom.to_geo() geofilepath = os.path.join(outputdir, title + ".geo") with open(geofilepath, 'w') as f: for line in lines: f.write(line + '\n') # Save materials matinfos = [] for material in pengeom.get_materials(): if material is VACUUM: continue index = material._index filepath = os.path.join(outputdir, 'mat%i.mat' % index) penmaterial.create(material.name, dict(material.composition), material.density_kg_m3, filepath, self._pendbase_dir) matinfos.append((material, filepath)) return (pengeom, geofilepath), matinfos
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 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:])