Thermoelectric effects in a CNT with isotope doping¶
Although the mass of the nucleus has almost no influence on the electronic properties of an atom (at least in the Born-Oppenheimer approximation), different isotopes will have different thermal properties. The consequences of isotope doping are very important for the case of 1D nanostructures and nanotubes in particular [CZZ05], [ZL05], [CFA+06]. It is therefore interesting to study how the thermal proporties of a CNT change when the isotope distribution in one part of the tube is changed [JWL11].
In this tutorial, you will study the effect of doping a carbon nanotube with a ring of 14C atoms. Specifically, you will calculate the phonon and electron transmission spectra, the thermal conductance, and the ZT product. You will use the ATK-ForceField engine for phonon calculations, while electronic transmission is calculated using ATK-SE.
This is an advanced tutorial. If you have no prior experience with the QuantumATK or ATK, please consult the Getting started tutorials.
This tutorial assumes that you have already finished the tutorial
Simple carbon nanotube device, where the CNT device configuration used in this
tutorial is created. If not, please go through that tutorial first,
or simply download the configuration here:
- Calculator: Select the ATK-ForceField calculator and the “Tersoff_C_2010” potential.
- DynamicalMatrix: Set “Repetition” to “Custom” and leave the repetitions along A, B, and C at the default value 1.
- PhononTransmissionSpectrum: Set the energy range to 0-0.3 eV and the number of points to 501. Leave the q-point sampling at defaults.
For QuantumATK-versions older than 2017, the ATK-ForceField calculator can be found under the name ATK-Classical.
Adding 14C impurity atoms¶
Once the calculation for the undoped CNT has finished, it is time to introduce the 14C dopants. The predefined elements in QuantumATK are isotope averages, so the mass of carbon in QuantumATK is 12.0107 amu. In order to create 14C, all you need to do is a bit of simple Python scripting: Implement a new element by writing a derived Python class with a different mass, and add it to the list of available elements. Do it like this:
Find the place where the
device_configurationis defined (lines 447-450). Insert the following lines of code immediately after:
# Define a new class where the C atom has mass 14.00 class C14(Carbon): @staticmethod def atomicMass(): return 14.00*Units.atomic_mass_unit PeriodicTable.ALL_ELEMENTS.append(C14) # Replace all atoms tagged "C14" with carbon-14 for index in device_configuration.indicesFromTags("C14"): device_configuration.elements()[index] = C14
Change the output filename to
cntc14_phonons.hdf5everywhere in the script (3 places).
Save the script as
cntc14_phonons.pyand execute it using the Job Manager.
The QuantumATK LabFloor should now contain the calculated results for the doped and undoped CNT:
Highlight the transmission spectra and use the Transmission Analyzer plugin to display the results. If you select both of them at the same time (holding down “Ctrl”), you can plot both in the same figure by using the Compare Data plugin.
The two phonon transmission spectra in the above figure (blue: undoped CNT, green: isotope doped CNT) are significantly different. The difference is caused by phonon scattering by the ring of 14C impurities. You can see that at low energy (long wavelength) the spectrum is unchanged, while the main difference is at higher energies (shorter wavelength).
You can also calculate the thermal conductance of phonons, \(\kappa\)ph, using the Thermoelectric Coefficients plugin, situated in the right-hand side of the LabFloor. Select again the PhononTransmissionSpectrum elements and click “calculate” on the Thermoelectric Coefficients plugin. As expected, \(\kappa\)ph of the isotopically doped CNT is lower than for the CNT with a natural isotope distribution. The difference is small at 300 K, but it increases with temperature. The same effect was reported in [JWL11], where the CNT was also doped by 14C, but in a cluster arrangement.
It is interesting to construct a plot similar to Figure 11(b) in
[JWL11]. You can do this by applying a bit
of Python scripting. Save the Python code below as
plot_thermal_conductance.py or simply download the script:
If you wish to understand how the script works, try to have a look at
the entry about the PhononTransmissionSpectrum object in the
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
# Read the phonon transmission spectrum from file cnt_phonons.hdf5 phonon_transmission_spectrum = nlread("cnt_phonons.hdf5",PhononTransmissionSpectrum) # Define a temperature range temp = numpy.linspace(10,2000,21) # Calculate the phonon thermal conductance at each temperature conductances =  for t in temp: conductance = phonon_transmission_spectrum.thermalConductance( phonon_temperature=[t]*Kelvin) conductance = conductance*10**9 conductances.append(conductance) # Now read the phonon transmission spectrum from file cntc14_phonons.hdf5 ... phonon_transmission_spectrum_c14 = nlread("cntc14_phonons.hdf5",PhononTransmissionSpectrum) # ... and calculate the relative phonon thermal conductance conductances_c14 =  for t in temp: conductance_c14 = phonon_transmission_spectrum_c14.thermalConductance( phonon_temperature=[t]*Kelvin) conductance_c14 = conductance_c14*10**9 conductances_c14.append(conductance_c14) # Plot the phonon thermal conductances as function of temperature import pylab pylab.figure() pylab.plot(temp,conductances,label='CNT',linewidth=2.0) pylab.plot(temp,conductances_c14,label='14C-CNT',linewidth=2.0) pylab.xlabel("Temperature (K)") pylab.ylabel("Phonon Thermal Conductance (nW/K)") pylab.legend(loc="lower right") pylab.show()
Run the script in the directory where your
.hdf5 files are stored:
$ atkpython plot_thermal_conductance.py
The thermoelectric figure of merit, ZT, has both phononic and electronic contributions. Therefore, even though isotopic doping does not affect the electron transport properties, it is still relevant to calculate the electronic transmission spectrum for the CNT.
Change the output file to
cnt_electrons.hdf5 and edit the
- Calculator: Select the ATK-SE: Slater-Koster calculator and choose the “Hancock.C ppPi” basis set.
- TransmissionSpectrum: Set the energy range to -10 to 10 eV and the number of points to 501.
In the LabFloor you will now find the TransmissionSpectrum object, which you can plot using the 2D Plot plugin.
The electronic transmission is clearly non-zero in the vicinity of the Fermi level. However, if you zoom in, you will see that the transmission is zero exactly at the Fermi level. This is also clear if you study the transmission data using the Text Representation plugin.
Thermoelectric transport properties¶
Now you have all the ingredients for calculating thermoelectric transport properties such as conductance, Peltier coefficient, Seebeck coefficient, and heat transport coefficients of electrons and phonons, all of which are ingredients in the thermoelectric figure of merit, ZT.
Select from the LabFloor both the PhononTransmissionSpectrum AND the TransmissionSpectrum objects (by holding down “Ctrl” while clicking them). Open the Transmission Coefficient plugin and set the Fermi level shift to 0.04 eV, corresponding to the band edge. Finally, click Calculate to compute all the transport coefficients, and in particular the value of ZT at room temperature.
By clicking Plot, you can also get an interactive window with plots of the different transport quantities as a function og energy.
Compare ZT for doped and undoped CNTs¶
If you compare the two values of ZT for the two devices with and without 14C doping, you will find that the effect of isotopic doping is to slightly increase ZT. The effect is indeed very small.
One way to illustrate this result is by plotting ZT as a function of
the energy for both CNTs in one figure. Once again, a bit of Python
scripting will do the job. Use the following piece of Python code,
or simply download the script:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
from AddOns.TransportCoefficients.Utilities import evaluateMoments from NL.CommonConcepts import PhysicalQuantity as Units # Set input parameters e_min = 0.0 e_max = 2.0 n_steps = 400 temperature = 300.00*Kelvin energies = numpy.linspace(e_min, e_max, n_steps) * eV # Read phonon transmission spectrum from file cnt_phonons.nc # and get the phonon conductance at the specified temperature phonon_transmission_spectrum = nlread('cnt_phonons.nc', PhononTransmissionSpectrum) conductance_phonons = phonon_transmission_spectrum.thermalConductance(phonon_temperature=temperature) # Read phonon transmission spectrum from file cntc14_phonons.nc # and get the phonon conductance at the specified temperature phonon_transmission_spectrum_c14 = nlread('cntc14_phonons.nc', PhononTransmissionSpectrum) conductance_phonons_c14 = phonon_transmission_spectrum_c14.thermalConductance(phonon_temperature=temperature) # Read electron transmission spectrum from file cnt_electrons.nc electron_transmission_spectrum = nlread("cnt_electrons.nc",TransmissionSpectrum) # define lists for ZT data zzt =  zzt_c14 =  # Calculate the ZTs at each energy for energy in energies: # Calculate moments of the electron transmission spectrum k0, k1, k2 = evaluateMoments(electron_transmission_spectrum, temperature, energy) # Calculate transport properties. conductance = k0*Units.e**2 peltier = k1/(k0*Units.e) seebeck = k1/(k0*Units.e*temperature) thermal_electrons = (k2*k0-k1*k1)/(temperature*k0) total_thermal = thermal_electrons + conductance_phonons total_thermal_c14 = thermal_electrons + conductance_phonons_c14 zt = conductance*seebeck**2*temperature/total_thermal zt_c14 = conductance*seebeck**2*temperature/total_thermal_c14 zzt.append(zt) zzt_c14.append(zt_c14) # Plot the ZT as function of energy zzt = numpy.asarray(zzt)*1e3 zzt_c14 = numpy.asarray(zzt_c14)*1e3 import pylab pylab.plot(energies,zzt,'-',label='CNT',linewidth=1.0,color='b') pylab.plot(energies,zzt_c14,'--',label='14C-CNT',linewidth=1.0,color='r') pylab.xlabel('Energy (eV)') pylab.ylabel('ZT x 1000') pylab.legend(loc='upper center') pylab.show()
The script produces the figure shown above. It is clear that isotopic doping increases the value of ZT, though only marginably.
|[CFA+06]||C. W. Chang, A. M. Fennimore, A. Afanasiev, D. Okawa, T. Ikuno, H. Garcia, Deyu Li, A. Majumdar, and A. Zettl. Isotope effect on the thermal conductivity of boron nitride nanotubes. Phys. Rev. Lett., 97:085901, Aug 2006. doi:10.1103/PhysRevLett.97.085901.|
|[CZZ05]||Yong-qiang Cheng, Shu-yun Zhou, and Bang-fen Zhu. Isotope effect on phonon spectra in single-walled carbon nanotubes. Phys. Rev. B, 72:035410, Jul 2005. doi:10.1103/PhysRevB.72.035410.|
|[JWL11]||(1, 2, 3) Jin-Wu Jiang, Jian-Sheng Wang, and Baowen Li. A nonequilibrium green’s function study of thermoelectric properties in single-walled carbon nanotubes. Journal of Applied Physics, 2011. doi:10.1063/1.3531573.|
|[ZL05]||Gang Zhang and Baowen Li. Thermal conductivity of nanotubes revisited: Effects of chirality, isotope impurity, tube length, and temperature. The Journal of Chemical Physics, 2005. doi:10.1063/1.2036967.|