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
.
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 and add the following blocks:
Note that a 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.
Run the calculation by sending it to the Job Manager .
When prompted, save the script as cnt_phonons.py
,
select the default “Local” machine, and start the script by clicking
.
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 , 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:
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).
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
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 send again your CNT device configuration to the Script Generator and add two blocks:
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 .
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:
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()
The script produces the figure shown above. It is clear that isotopic doping increases the value of ZT, though only marginably.
References¶