Skip to content
Snippets Groups Projects
Commit 10a6deea authored by Nicolas Mantilla Molina's avatar Nicolas Mantilla Molina
Browse files

first try tight binding

parent 2b2e91a5
No related branches found
No related tags found
No related merge requests found
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
# Disperción de Electrones en Perovskita $ABO_3$ # Disperción de Electrones en Perovskita $ABO_3$
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
En el presente notebook se presenta un análisis de la dispersión de electrones en una red de perovskita $ABO_3$. Para esto, se implementan 3 modelos: Empty Lattice, Kronig-Penney y Tight Binding. La celda primitiva es una celda cúbica con átomos A en las esquinas, átomos O en las caras y un átomo B en el centro, como se muestra en la siguiente figura: En el presente notebook se presenta un análisis de la dispersión de electrones en una red de perovskita $ABO_3$. Para esto, se implementan 3 modelos: Empty Lattice, Kronig-Penney y Tight Binding. La celda primitiva es una celda cúbica con átomos A en las esquinas, átomos O en las caras y un átomo B en el centro, como se muestra en la siguiente figura:
<img src="PerovskiteCrystal.png" width="300"> <p align="center">
<img src="https://gitmilab.redclara.net/mantillan/TrabajosPregrado/-/raw/main/SolidState/PerovskiteCrystal.png" width="30%" />
</p>
De esta forma, los vectores de la red son los de un Simple Cubic:
\begin{equation*}
\mathbf{a}_1 = a \hat{x}, \quad \mathbf{a}_2 = a \hat{y}, \quad \mathbf{a}_3 = a \hat{z},
\end{equation*}
donde $a$ es la longitud de la celda cúbica. De modo que la red recíproca es también una red cúbica con vectores:
\begin{equation*}
\mathbf{b}_1 = \frac{2\pi}{a} \hat{x}, \quad \mathbf{b}_2 = \frac{2\pi}{a} \hat{y}, \quad \mathbf{b}_3 = \frac{2\pi}{a} \hat{z}.
\end{equation*}
La base de la celda primitiva es entonces:
\begin{equation*}
\mathbf{t}_A = \mathbf{0}, \quad \mathbf{t}_B = \frac{a}{2} (\hat{x} + \hat{y} + \hat{z}), \mathbf{t}_{Oi} = \left\{ \frac{a}{2} (\hat{x} + \hat{z}), \frac{a}{2} (\hat{y} + \hat{z}), \frac{a}{2} (\hat{x} + \hat{z}) \right\}.
\end{equation*}
Se usarán estos vectores para calcular la dispersión de electrones en la red con los distintos modelos. Además, se graficará siempre sobre el camino $\Gamma - X - M - \Gamma - R$ en el espacio recíproco. Procedemos a realizar estas definiciones.
%% Cell type:code id: tags:
``` python
# Importamos librerías útiles
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (8,6)
plt.rcParams['axes.labelsize'] = 14
plt.rcParams['xtick.labelsize'] = 10
plt.rcParams['ytick.labelsize'] = 10
plt.rcParams['font.size'] = 15
# Definimos los vectores de la red cúbica simple
a = 5e-10 # parámetro de red en metros (Å)
a_i = a*np.array([[1,0,0],[0,1,0],[0,0,1]]) # vectores de la red
b_i = 2*np.pi/a*np.array([[1,0,0],[0,1,0],[0,0,1]]) # vectores de la red recíproca
# Definimos los vectores de la base de átomos
tA = np.array([0,0,0]) # posición del átomo A
tB = a*np.array([1/2,1/2,1/2]) # posición del átomo B
tO1 = a*np.array([1/2,1/2,0]) # posición del átomo O1
tO2 = a*np.array([1/2,0,1/2]) # posición del átomo O2
tO3 = a*np.array([0,1/2,1/2]) # posición del átomo O3
# Definimos los puntos del camino en el espacio recíproco
GAMMA = np.array([0,0,0]) # punto \Gamma
X = np.pi/a*np.array([1,0,0]) # punto X
M = np.pi/a*np.array([1,1,0]) # punto M
R = np.pi/a*np.array([1,1,1]) # punto R
# Obtenemos el espacio de puntos para el camino en el espacio recíproco G-X-M-G-R
N = 100 # número de puntos por segmento
k_GX = np.array([np.linspace(GAMMA[i],X[i],N) for i in range(3)]).T
k_XM = np.array([np.linspace(X[i],M[i],N) for i in range(3)]).T
k_MG = np.array([np.linspace(M[i],GAMMA[i],N) for i in range(3)]).T
k_GR = np.array([np.linspace(GAMMA[i],R[i],N) for i in range(3)]).T
k_path = np.concatenate((k_GX,k_XM,k_MG,k_GR))
```
%% Cell type:markdown id: tags:
---
%% Cell type:markdown id: tags:
## 1. Modelo Empty Lattice
En este modelo, se asume que la red es un cristal vacío, es decir, no hay interacción entre los electrones. Por lo tanto, la dispersión de electrones es simplemente la energía cinética de los electrones, trasladada por un vector de la red recíproca:
\begin{equation*}
E(\mathbf{k}) = \frac{\hbar^2 (\mathbf{k}+\mathbf{G})^2}{2m},
\end{equation*}
donde $\mathbf{G} = h \mathbf{b}_1 + k \mathbf{b}_2 + l \mathbf{b}_3$ es un vector de la red recíproca y $m$ es la masa del electrón. Así, solo queda recorrer diferentes valores de $h$, $k$ y $l$ para obtener las bandas de energía de los electrones en la red.
%% Cell type:code id: tags:
``` python
# Definimos las constantes físicas
m = 9.11e-31 # masa del electrón en kg
hbar = 1.05e-34 # constante de Planck reducida en J s
e = 1.6e-19 # carga del electrón en C
# Definimos la función energía
def E(k_e):
# Iteramos sobre h, k y l (-1,0,1) para obtener las bandas de energía
bands=[]
init = -1
Gs = [(h,k,l) for h in range(init,2) for k in range(init,2) for l in range(init,2)]
for G_ in Gs:
if np.dot(G_,G_)==3.0:
continue
G = np.dot(G_,b_i)
bands.append(hbar**2*np.dot(k_e+G,k_e+G)/(2*m*e)) # Energía en eV
return bands
# Obtenemos las bandas de energía
bands_empty = np.array([E(k) for k in k_path]).T
# Quitamos algunas bandas para mejorar la visualización
bands_empty = np.delete(bands_empty, [18,17,13], axis=0) # eliminamos las bandas 19, 18 y 14
# Graficamos las bandas de energía
n_graf = len(bands_empty) # número de bandas a graficar
for i in range(n_graf):
plt.plot(np.arange(len(k_path)), bands_empty[i])
plt.xticks([0,N,2*N,3*N,4*N],['$\\Gamma$','X','M','$\\Gamma$','R'])
plt.xlabel('Camino en el espacio recíproco')
plt.ylabel('Energía (eV)')
# plt.ylim(0,400)
plt.title('Bandas de energía mediante Empty Lattice')
plt.grid()
plt.show()
```
%% Output
%% Cell type:markdown id: tags:
## 3. Tight Binding
%% Cell type:code id: tags:
``` python
# Definimos las constantes de hopping
tAA = 0 # eV
tBB = 15.8 # eV
tOO = 10.0 # eV
tAO = 19.7 # eV
tBO = 17.5 # eV
# Definimos la base cartesiana
x = np.array([1,0,0])
y = np.array([0,1,0])
z = np.array([0,0,1])
# Definimos las componentes de la matriz hamiltoniana como función de k
def Hamiltoniano(k):
# El orden de los índices 5x5 es: A, B, Oxz, Oxy, Oyz
H = np.zeros((5,5),dtype=complex)
H[0,0] = -2*tAA
H[1,1] = -2*tBB
H[2,2] = -2*tOO
H[3,3] = -2*tOO
H[4,4] = -2*tOO
H[0,2] = -tAO*(1+np.exp(-1j*a*np.dot(k, x))+np.exp(-1j*a*np.dot(k, z)) + np.exp(-1j*a*np.dot(k, x+z)))
H[0,3] = -tAO*(1+np.exp(-1j*a*np.dot(k, x))+np.exp(-1j*a*np.dot(k, y)) + np.exp(-1j*a*np.dot(k, x+y)))
H[0,4] = -tAO*(1+np.exp(-1j*a*np.dot(k, z))+np.exp(-1j*a*np.dot(k, y)) + np.exp(-1j*a*np.dot(k, z+y)))
H[1,2] = -tBO*(1+np.exp(-1j*a*np.dot(k, y)))
H[1,3] = -tBO*(1+np.exp(-1j*a*np.dot(k, z)))
H[1,4] = -tBO*(1+np.exp(-1j*a*np.dot(k, x)))
H[2,0] = -tAO*(1+np.exp(1j*a*np.dot(k, x))+np.exp(1j*a*np.dot(k, z)) + np.exp(1j*a*np.dot(k, x+z)))
H[3,0] = -tAO*(1+np.exp(1j*a*np.dot(k, x))+np.exp(1j*a*np.dot(k, y)) + np.exp(1j*a*np.dot(k, x+y)))
H[4,0] = -tAO*(1+np.exp(1j*a*np.dot(k, z))+np.exp(1j*a*np.dot(k, y)) + np.exp(1j*a*np.dot(k, z+y)))
H[2,1] = -tBO*(1+np.exp(1j*a*np.dot(k, y)))
H[3,1] = -tBO*(1+np.exp(1j*a*np.dot(k, z)))
H[4,1] = -tBO*(1+np.exp(1j*a*np.dot(k, x)))
return H
# Obtenemos las bandas de energía
bands_TB = np.array([np.linalg.eigvalsh(Hamiltoniano(k)) for k in k_path]).T
# Quitamos algunas bandas para mejorar la visualización
# bands_full = np.delete(bands_full, [18,17,13], axis=0) # eliminamos las bandas 19, 18 y 14
# Graficamos las bandas de energía
color = 'darkorchid'
n_graf = len(bands_TB) # número de bandas a graficar
for i in range(n_graf):
plt.plot(np.arange(400), bands_TB[i], '.', markersize=3, color = color)
plt.xticks([0,100,200,300,400],['$\\Gamma$','X','M','$\\Gamma$','R'])
plt.xlabel('Camino en el espacio recíproco')
plt.ylabel('Energía (eV)')
# plt.ylim(0,400)
plt.title('Bandas de energía mediante Tight Binding')
plt.grid()
plt.show()
```
%% Output
%% Cell type:code id: tags:
``` python
bands_TB.T[0]
```
%% Output
array([-179.06647307, -33.01113561, -20. , -20. ,
120.27760868])
%% Cell type:code id: tags:
``` python
```
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment