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;
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)
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)
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