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 [1], [2], [3]. It is therefore interesting to study how the thermal properties of a CNT change when the isotope distribution in one part of the tube is changed [4].

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.

Note

This is an advanced tutorial. If you have no prior experience with the QuantumATK or ATK, please consult the Getting started with QuantumATK tutorials.

Attention

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: cnt_device.py.

CNT device with tags for 14C doping

Drag and drop the undoped CNT device configuration (cnt_device.py) onto the Builder builder_icon. Then, assign a tag to the 12C atoms that you will convert to 14C:

  • Select a ring of C atoms in the middle of the structure as shown below.

  • Open the Selection Tools ‣ Tags plugin, and assign the tag “C14” to these atoms.

pic1

Phonon transmission

First set up and run the calculation of the phonon transmission spectrum for the undoped CNT. Transfer the configuration to the Script Generator script_generator_icon and add the following blocks:

  • calculator_icon New Calculator

  • analysis_icon Analysis ‣ PhononTransmissionSpectrum

Note that a analysis_icon DynamicalMatrix object was automatically added as well. Change the output file to cnt_phonons.hdf5 and edit the settings in all three blocks:

  • 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.

Note

For QuantumATK-versions older than 2017, the ATK-ForceField calculator can be found under the name ATK-Classical.

../../_images/pic22.png

../../_images/pic32.png

Run the calculation by sending it to the Job Manager job_manager_icon. When prompted, save the script as cnt_phonons.py, select the default “Local” machine, and start the script by clicking jm_play_enabled_icon.

../../_images/pic42.png

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:

  • Open your Python script (cnt_phonons.py) in the Editor editor_icon, e.g. using drag and drop.

  • Find the place where the device_configuration is 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.hdf5 everywhere in the script (3 places).

  • Save the script as cntc14_phonons.py and execute it using the Job Manager.

Transmission spectra

The QuantumATK LabFloor should now contain the calculated results for the doped and undoped CNT:

  • labfloor_dynamicalmatrix_icon DynamicalMatrix

  • labfloor_phonontransmissionspectrum_icon PhononTransmissionSpectrum

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.

pic5

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

Thermal conductance

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 [4], 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 [4]. 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: plot_thermal_conductance.py. If you wish to understand how the script works, try to have a look at the entry about the PhononTransmissionSpectrum object in the PhononTransmissionSpectrum.

 1# Read the phonon transmission spectrum from file cnt_phonons.hdf5
 2phonon_transmission_spectrum = nlread("cnt_phonons.hdf5",PhononTransmissionSpectrum)[0]
 3# Define a temperature range
 4temp = numpy.linspace(10,2000,21)
 5# Calculate the phonon thermal conductance at each temperature 
 6conductances = []
 7for t in temp:
 8    conductance = phonon_transmission_spectrum.thermalConductance(
 9        phonon_temperature=[t]*Kelvin)
10    conductance = conductance*10**9
11    conductances.append(conductance)
12
13# Now read the phonon transmission spectrum from file cntc14_phonons.hdf5 ...
14phonon_transmission_spectrum_c14 = nlread("cntc14_phonons.hdf5",PhononTransmissionSpectrum)[0]
15# ... and calculate the relative phonon thermal conductance
16conductances_c14 = []
17for t in temp:
18    conductance_c14 = phonon_transmission_spectrum_c14.thermalConductance(
19        phonon_temperature=[t]*Kelvin)
20    conductance_c14 = conductance_c14*10**9
21    conductances_c14.append(conductance_c14)
22
23# Plot the phonon thermal conductances as function of temperature
24import pylab
25pylab.figure()
26pylab.plot(temp,conductances,label='CNT',linewidth=2.0)
27pylab.plot(temp,conductances_c14,label='14C-CNT',linewidth=2.0)
28pylab.xlabel("Temperature (K)")
29pylab.ylabel("Phonon Thermal Conductance (nW/K)")
30pylab.legend(loc="lower right")
31pylab.show()

Run the script in the directory where your .hdf5 files are stored:

$ atkpython plot_thermal_conductance.py
../../_images/plot_thermal_conductance.png

Fig. 68 Phonon thermal conductance of a pure CNT and of an 14C isotope doped CNT. The thermal conductance levels out with increasing temperature. The 14C doping clearly inhibits the CNT thermal conductance.

Electron transmission

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.

From the Builder builder_icon send again your CNT device configuration to the Script Generator script_generator_icon and add two blocks:

  • calculator_icon New Calculator

  • analysis_icon Analysis ‣ TransmissionSpectrum

Change the output file to cnt_electrons.hdf5 and edit the calculation parameters:

  • 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.

Run the script using the Job Manager job_manager_icon.

In the LabFloor you will now find the TransmissionSpectrum object, which you can plot using the 2D Plot plugin.

  • labfloor_transmissionspectrum_icon TransmissionSpectrum

../../_images/transmissionspectrum1.png

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.

../../_images/pic61.png

By clicking Plot, you can also get an interactive window with plots of the different transport quantities as a function og energy.

../../_images/pic71.png

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: plot_zt.py.

 1from AddOns.TransportCoefficients.Utilities import evaluateMoments
 2from NL.CommonConcepts import PhysicalQuantity as Units
 3
 4# Set input parameters
 5e_min = 0.0
 6e_max = 2.0
 7n_steps = 400
 8temperature = 300.00*Kelvin
 9energies = numpy.linspace(e_min, e_max, n_steps) * eV
10
11# Read phonon transmission spectrum from file cnt_phonons.nc
12# and get the phonon conductance at the specified temperature
13phonon_transmission_spectrum = nlread('cnt_phonons.nc', PhononTransmissionSpectrum)[0]
14conductance_phonons = phonon_transmission_spectrum.thermalConductance(phonon_temperature=temperature)
15
16# Read phonon transmission spectrum from file cntc14_phonons.nc
17# and get the phonon conductance at the specified temperature
18phonon_transmission_spectrum_c14 = nlread('cntc14_phonons.nc', PhononTransmissionSpectrum)[0]
19conductance_phonons_c14 = phonon_transmission_spectrum_c14.thermalConductance(phonon_temperature=temperature)
20
21# Read electron transmission spectrum from file cnt_electrons.nc
22electron_transmission_spectrum = nlread("cnt_electrons.nc",TransmissionSpectrum)[0]
23
24# define lists for ZT data
25zzt = []
26zzt_c14 = []
27
28# Calculate the ZTs at each energy
29for energy in energies:
30    # Calculate moments of the electron transmission spectrum
31    k0, k1, k2 = evaluateMoments(electron_transmission_spectrum, temperature, energy)
32    # Calculate transport properties.
33    conductance       = k0*Units.e**2
34    peltier           = k1/(k0*Units.e)
35    seebeck           = k1/(k0*Units.e*temperature)
36    thermal_electrons = (k2*k0-k1*k1)/(temperature*k0)
37    total_thermal     = thermal_electrons + conductance_phonons
38    total_thermal_c14 = thermal_electrons + conductance_phonons_c14
39    zt                = conductance*seebeck**2*temperature/total_thermal
40    zt_c14            = conductance*seebeck**2*temperature/total_thermal_c14
41    zzt.append(zt)
42    zzt_c14.append(zt_c14)
43
44# Plot the ZT as function of energy
45zzt = numpy.asarray(zzt)*1e3
46zzt_c14 = numpy.asarray(zzt_c14)*1e3
47import pylab
48pylab.plot(energies,zzt,'-',label='CNT',linewidth=1.0,color='b')
49pylab.plot(energies,zzt_c14,'--',label='14C-CNT',linewidth=1.0,color='r')
50pylab.xlabel('Energy (eV)')
51pylab.ylabel('ZT x 1000')
52pylab.legend(loc='upper center')
53pylab.show()
../../_images/plot_zt.png

Fig. 69 ZT at 300 K for a CNT with a natural isotopic distribution (blue line) and for a CNT with a full ring of 14C impurities (red broken line).

The script produces the figure shown above. It is clear that isotopic doping increases the value of ZT, though only marginably.

References