Beispiel #1
0
    def composition_from_formula(formula):
        # Parse chemical formula
        formulaData = CHEMICAL_FORMULA_PARSER.parseString(formula)

        zs = []
        atomicfractions = []
        for symbol, atomicfraction in formulaData:
            zs.append(ep.atomic_number(symbol=symbol))
            atomicfractions.append(float(atomicfraction))

        # Calculate total atomic mass
        totalatomicmass = 0.0
        for z, atomicfraction in zip(zs, atomicfractions):
            atomicmass = ep.atomic_mass_kg_mol(z)
            totalatomicmass += atomicfraction * atomicmass

        # Create composition
        composition = defaultdict(float)

        for z, atomicfraction in zip(zs, atomicfractions):
            atomicmass = ep.atomic_mass_kg_mol(z)
            weightfraction = atomicfraction * atomicmass / totalatomicmass
            composition[z] += weightfraction

        return composition
def kanaya_okayama(composition, energy):
    """
    Returns the electron range (in meters).

    :arg composition: composition in weight fraction.
        The composition is specified by a dictionary.
        The keys are the atomic numbers and the values are the weight fractions
        between ]0.0, 1.0].
    :type composition: :class:`dict`

    :arg energy: beam energy in eV
    """
    r = 0.0;

    for z, fraction in composition.items():
        dr = (0.0276 * (ep.atomic_mass_kg_mol(z) * 1000.0) * (energy / 1000.0) ** 1.67) / \
            (z ** 0.89 * (ep.mass_density_kg_m3(z) / 1000.0))
        r += fraction / (dr * 1e-6)

    return 1.0 / r;
Beispiel #3
0
    def calculate_composition_atomic(composition):
        """
        Returns a composition :class:`dict` where the values are atomic fractions.

        :arg composition: composition in weight fraction.
            The composition is specified by a dictionary.
            The key are atomic numbers and the values weight fractions.
            No wildcard are accepted.
        :type composition: :class:`dict`
        """
        composition2 = {}

        for z, weightfraction in composition.items():
            composition2[z] = weightfraction / ep.atomic_mass_kg_mol(z)

        totalfraction = sum(composition2.values())

        for z, fraction in composition2.items():
            composition2[z] = fraction / totalfraction

        return defaultdict(float, composition2)
Beispiel #4
0
 def testatomic_mass(self):
     self.assertAlmostEqual(51.996000, ep.atomic_mass_kg_mol(24) * 1000.0)
Beispiel #5
0
    def testatomic_mass(self):
        self.assertAlmostEqual(51.996000, ep.atomic_mass_kg_mol(24) * 1000.0)

        self.assertRaises(ValueError, self.ep.atomic_mass_kg_mol, 118)
Beispiel #6
0
    def _export_geometry_substrate(self, options, geometry, outputdir, *args):
        material = geometry.body.material
        composition = sorted(material.composition.items(), key=itemgetter(0))
        density_g_cm3 = material.density_kg_m3 / 1000.0

        filepath = os.path.join(outputdir, options.name + '.MAT')
        with open(filepath, 'wb') as fp:
            # Header
            # DELPHI: s:=6;Blockwrite(Matfile,Typ,6,f);Inc(Sum,f);
            # 1st Byte: Type = 2 (homogenous bulk)
            # 2nd Byte: NC = <nr. of elements> (amount of occurring formulae (compounds or elements))
            # 3rd Byte: NZ = <nr. of elements>
            # 4th Byte: NP = 0 (nr. of layers)
            # 5th Byte: CU = 2 (1=at%, 2=wt%)
            # 6th Byte: MU = 1 (not important for bulk; this is the unit for the layer thickness)
            fp.write(struct.pack('b', 2))
            fp.write(struct.pack('b', len(composition)))
            fp.write(struct.pack('b', len(composition)))
            fp.write(struct.pack('b', 0))
            fp.write(struct.pack('b', 2))
            fp.write(struct.pack('b', 1))

            # Write length of element and element
            # DELPHI:
            # for i:=1 to Nc do begin
            #     l:=1+Length(Comp[i]);Inc(s,l);
            #     Blockwrite(Matfile,Comp[i,0],l,f);Inc(Sum,f);
            # end;
            for z, _wf in composition:
                symbol = ep.symbol(z).upper()
                fp.write(
                    struct.pack('b', len(symbol)) + symbol.encode('ascii'))

            # Write molar mass
            # DELPHI: l:=4*Nc;Inc(s,l);Blockwrite(Matfile,AC[1],l,f);Inc(Sum,f);
            for z, _wf in composition:
                mass = ep.atomic_mass_kg_mol(z) * 1000.0
                fp.write(struct.pack('f', mass))

            # Write atomic number
            # DELPHI: Inc(s,NZ);Blockwrite(Matfile,Z[1],NZ,f);Inc(Sum,f);
            for z, _wf in composition:
                fp.write(struct.pack('b', z))

            # Write molar mass
            # DELPHI:
            # l:=4*Nc+4;
            # for i:=0 to NZ do begin
            #     Inc(s,l);BlockWrite(Matfile,GZ[i],l,f);Inc(Sum,f);
            # end;
            fp.write(b'\x00\x00\x00\x00')  # Skip 4 bytes
            for z, _wf in composition:
                mass = ep.atomic_mass_kg_mol(z) * 1000.0
                fp.write(struct.pack('f', mass))

            for i, item in enumerate(composition):
                z = item[0]
                mass = ep.atomic_mass_kg_mol(z) * 1000.0
                fp.write(struct.pack('f', mass))
                fp.write(b'\x00\x00\x00\x00' * i)  # Skip 4 bytes
                fp.write(struct.pack('f', 1.0 / mass))
                fp.write(b'\x00\x00\x00\x00' *
                         (len(composition) - i - 1))  # Skip 4 bytes

            # DELPHI: Inc(s,l);BlockWrite(Matfile,GM,l,f);Inc(Sum,f);
            gs = [
                wf / (ep.atomic_mass_kg_mol(z) * 1000.0)
                for z, wf in composition
            ]
            g0 = 1.0 / sum(gs)
            fp.write(struct.pack('f', g0))
            for g in gs:
                fp.write(struct.pack('f', g))

            # DELPHI:
            # for i:=0 to NP do begin
            #     Inc(s,l);BlockWrite(Matfile,GS[i],l,f);Inc(Sum,f);
            # end;
            fp.write(b'\x00\x00\x00\x00' * (len(composition) + 1))

            # DELPHI:
            # l:=4*NP+4;Inc(s,l);Blockwrite(Matfile,ML[0],l,f);Inc(Sum,f);
            fp.write(b'\x00\x00\x00\x00')

            # DELPHI: Inc(s,l);Blockwrite(Matfile,rho[0],l,f);Inc(Sum,f);
            fp.write(struct.pack('f', density_g_cm3))

            # DELPHI:
            # l:=NC+1;
            # for i:=0 to NP do begin
            #     Inc(s,l);BlockWrite(Matfile,PC[i],l,f);Inc(Sum,f);
            # end;
            fp.write(struct.pack('b', len(composition)))
            fp.write(b'\x00' * len(composition))

            # DELPHI: Inc(s,l);BlockWrite(Matfile,PM,l,f);Inc(Sum,f);
            fp.write(struct.pack('b', len(composition)))
            for i in range(len(composition)):
                fp.write(struct.pack('b', i + 1))

        return filepath
    def _export_geometry_substrate(self, options, geometry, outputdir, *args):
        material = geometry.body.material
        composition = sorted(material.composition.items(), key=itemgetter(0))
        density_g_cm3 = material.density_kg_m3 / 1000.0

        filepath = os.path.join(outputdir, options.name + '.MAT')
        with open(filepath, 'wb') as fp:
            # Header
            # DELPHI: s:=6;Blockwrite(Matfile,Typ,6,f);Inc(Sum,f);
            # 1st Byte: Type = 2 (homogenous bulk)
            # 2nd Byte: NC = <nr. of elements> (amount of occurring formulae (compounds or elements))
            # 3rd Byte: NZ = <nr. of elements>
            # 4th Byte: NP = 0 (nr. of layers)
            # 5th Byte: CU = 2 (1=at%, 2=wt%)
            # 6th Byte: MU = 1 (not important for bulk; this is the unit for the layer thickness)
            fp.write(struct.pack('b', 2))
            fp.write(struct.pack('b', len(composition)))
            fp.write(struct.pack('b', len(composition)))
            fp.write(struct.pack('b', 0))
            fp.write(struct.pack('b', 2))
            fp.write(struct.pack('b', 1))

            # Write length of element and element
            # DELPHI:
            # for i:=1 to Nc do begin
            #     l:=1+Length(Comp[i]);Inc(s,l);
            #     Blockwrite(Matfile,Comp[i,0],l,f);Inc(Sum,f);
            # end;
            for z, _wf in composition:
                symbol = ep.symbol(z).upper()
                fp.write(struct.pack('b', len(symbol)) + symbol.encode('ascii'))

            # Write molar mass
            # DELPHI: l:=4*Nc;Inc(s,l);Blockwrite(Matfile,AC[1],l,f);Inc(Sum,f);
            for z, _wf in composition:
                mass = ep.atomic_mass_kg_mol(z) * 1000.0
                fp.write(struct.pack('f', mass))

            # Write atomic number
            # DELPHI: Inc(s,NZ);Blockwrite(Matfile,Z[1],NZ,f);Inc(Sum,f);
            for z, _wf in composition:
                fp.write(struct.pack('b', z))

            # Write molar mass
            # DELPHI:
            # l:=4*Nc+4;
            # for i:=0 to NZ do begin
            #     Inc(s,l);BlockWrite(Matfile,GZ[i],l,f);Inc(Sum,f);
            # end;
            fp.write(b'\x00\x00\x00\x00') # Skip 4 bytes
            for z, _wf in composition:
                mass = ep.atomic_mass_kg_mol(z) * 1000.0
                fp.write(struct.pack('f', mass))

            for i, item in enumerate(composition):
                z = item[0]
                mass = ep.atomic_mass_kg_mol(z) * 1000.0
                fp.write(struct.pack('f', mass))
                fp.write(b'\x00\x00\x00\x00' * i) # Skip 4 bytes
                fp.write(struct.pack('f', 1.0 / mass))
                fp.write(b'\x00\x00\x00\x00' * (len(composition) - i - 1)) # Skip 4 bytes

            # DELPHI: Inc(s,l);BlockWrite(Matfile,GM,l,f);Inc(Sum,f);
            gs = [wf / (ep.atomic_mass_kg_mol(z) * 1000.0) for z, wf in composition]
            g0 = 1.0 / sum(gs)
            fp.write(struct.pack('f', g0))
            for g in gs:
                fp.write(struct.pack('f', g))

            # DELPHI:
            # for i:=0 to NP do begin
            #     Inc(s,l);BlockWrite(Matfile,GS[i],l,f);Inc(Sum,f);
            # end;
            fp.write(b'\x00\x00\x00\x00' * (len(composition) + 1))

            # DELPHI:
            # l:=4*NP+4;Inc(s,l);Blockwrite(Matfile,ML[0],l,f);Inc(Sum,f);
            fp.write(b'\x00\x00\x00\x00')

            # DELPHI: Inc(s,l);Blockwrite(Matfile,rho[0],l,f);Inc(Sum,f);
            fp.write(struct.pack('f', density_g_cm3))

            # DELPHI:
            # l:=NC+1;
            # for i:=0 to NP do begin
            #     Inc(s,l);BlockWrite(Matfile,PC[i],l,f);Inc(Sum,f);
            # end;
            fp.write(struct.pack('b', len(composition)))
            fp.write(b'\x00' * len(composition))

            # DELPHI: Inc(s,l);BlockWrite(Matfile,PM,l,f);Inc(Sum,f);
            fp.write(struct.pack('b', len(composition)))
            for i in range(len(composition)):
                fp.write(struct.pack('b', i + 1))

        return filepath
 def testatomic_mass(self):
     self.assertAlmostEqual(51.996000, ep.atomic_mass_kg_mol(24) * 1000.0)
    def testatomic_mass(self):
        self.assertAlmostEqual(51.996000, ep.atomic_mass_kg_mol(24) * 1000.0)

        self.assertRaises(ValueError, self.ep.atomic_mass_kg_mol, 118)