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

Potential energy

parent 2989a282
No related branches found
No related tags found
No related merge requests found
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
# Fonones en Grafeno # Fonones en Grafeno
En el presente notebook se presenta una implementación de la teoría de fonones mediante matriz dinámica en el grafeno. Se calculan las bandas de dispersión considerando primeros vecinos de una celda primitiva con dos átomos. La base de la teoría aquí presentada se encuentra en el libro de Kaxiras, E. (2019) Quantum Theory of Materials, capítulo 7. En el presente notebook se presenta una implementación de la teoría de fonones mediante matriz dinámica en el grafeno. Se calculan las bandas de dispersión considerando primeros vecinos de una celda primitiva con dos átomos. La base de la teoría aquí presentada se encuentra en el libro de Kaxiras, E. (2019) Quantum Theory of Materials, capítulo 7.
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
## Desarrollo analítico ## Desarrollo analítico
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
El grafeno es un material bidimensional compuesto por átomos de carbono organizados en una estructura hexagonal, formando una sola capa atómica. Esta disposición le otorga propiedades únicas, tanto electrónicas como térmicas, que lo convierten en un tema de interés en el estudio de materiales bidimensionales. El grafeno es un material bidimensional compuesto por átomos de carbono organizados en una estructura hexagonal, formando una sola capa atómica. Esta disposición le otorga propiedades únicas, tanto electrónicas como térmicas, que lo convierten en un tema de interés en el estudio de materiales bidimensionales.
Para caracterizar las vibraciones en la red de grafeno nos planteamos construir su matriz dinámica, que describe los modos de vibración para cada valor del vector de onda $\mathbf{K}$ en el espacio recíproco. En este proyecto, derivaremos la matriz dinámica de grafeno considerando únicamente interacciones de primeros vecinos, siguiendo el enfoque presentado en la Sección 7 del libro Quantum Theory of Materials, E. Kaxiras (2019). Para caracterizar las vibraciones en la red de grafeno nos planteamos construir su matriz dinámica, que describe los modos de vibración para cada valor del vector de onda $\mathbf{K}$ en el espacio recíproco. En este proyecto, derivaremos la matriz dinámica de grafeno considerando únicamente interacciones de primeros vecinos, siguiendo el enfoque presentado en la Sección 7 del libro Quantum Theory of Materials, E. Kaxiras (2019).
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
### Energía Potencial en la Red ### Energía Potencial en la Red
La energía potencial $\Delta U$ del sistema se expresa en términos de la interacción entre átomos de carbono vecinos en la red. Consideramos dos tipos de interacciones en el modelo de primeros vecinos: La energía potencial $\Delta U$ del sistema se expresa en términos de la interacción entre átomos de carbono vecinos en la red. Consideramos dos tipos de interacciones en el modelo de primeros vecinos:
- **Interacciones radiales**: fuerzas que actúan a lo largo de la dirección del enlace entre átomos vecinos, modificando la longitud de separación entre los átomos. - **Interacciones radiales**: fuerzas que actúan a lo largo de la dirección del enlace entre átomos vecinos, modificando la longitud de separación entre los átomos.
- **Interacciones tangenciales**: fuerzas que actúan perpendicularmente al enlace, reflejando las deformaciones angulares de la red. - **Interacciones tangenciales**: fuerzas que actúan perpendicularmente al enlace, reflejando las deformaciones angulares de la red.
Para cada par de átomos de carbono vecinos, la energía potencial de la interacción puede escribirse como: Para cada par de átomos de carbono vecinos, la energía potencial de la interacción puede escribirse como:
$$\Delta U = \frac{1}{2} (c_r-c_t) \sum_{\langle i,j \rangle} [(\mathbf{S}_i-\mathbf{S}_i) \cdot \hat{r}_{ij}]^2 + \frac{1}{2} c_t \sum_{\langle i,j \rangle} |\mathbf{S}_i-\mathbf{S}_j|^2,$$ $$\Delta U = \frac{1}{2} (c_r-c_t) \sum_{\langle i,j \rangle} [(\mathbf{S}_i-\mathbf{S}_i) \cdot \hat{r}_{ij}]^2 + \frac{1}{2} c_t \sum_{\langle i,j \rangle} |\mathbf{S}_i-\mathbf{S}_j|^2,$$
donde: donde:
- $ c_r $ y $ c_t $ son las constantes de resorte para las interacciones radial y tangencial, respectivamente, - $ c_r $ y $ c_t $ son las constantes de resorte para las interacciones radial y tangencial, respectivamente,
- $ \mathbf{S}_i $ es el desplazamiento del átomo $i$ respecto a su posición de equilibrio, - $ \mathbf{S}_i $ es el desplazamiento del átomo $i$ respecto a su posición de equilibrio,
- $ \hat{r}_{ij} $ es el vector unitario que une los átomos $i$ y $j$. - $ \hat{r}_{ij} $ es el vector unitario que une los átomos $i$ y $j$.
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
### Definición de la Matriz Dinámica ### Definición de la Matriz Dinámica
La matriz dinámica en el espacio recíproco, $D(\mathbf{K})$, se define a partir de las segundas derivadas de la energía potencial con respecto a los desplazamientos de los átomos: La matriz dinámica en el espacio recíproco, $D(\mathbf{K})$, se define a partir de las segundas derivadas de la energía potencial con respecto a los desplazamientos de los átomos:
$$ $$
D_{i\alpha,j\beta}(\mathbf{K}) = \frac{1}{\sqrt{m_i m_j}} \sum_{n} \frac{\partial^2 \Delta U}{\partial S_{ni\alpha} \partial S_{0j\beta}} e^{i \mathbf{K} \cdot \mathbf{R}_n}, D_{i\alpha,j\beta}(\mathbf{K}) = \frac{1}{\sqrt{m_i m_j}} \sum_{n} \frac{\partial^2 \Delta U}{\partial S_{ni\alpha} \partial S_{0j\beta}} e^{i \mathbf{K} \cdot \mathbf{R}_n},
$$ $$
donde: donde:
- $ i $ y $ j $ indican los diferentes sitios de la celda primitiva, - $ i $ y $ j $ indican los diferentes sitios de la celda primitiva,
- $ \alpha, \beta $ son las direcciones $x$, $y$, $z$, - $ \alpha, \beta $ son las direcciones $x$, $y$, $z$,
- $ m_i $ es la masa de los átomos, - $ m_i $ es la masa de los átomos,
- $ \mathbf{K} $ es el vector de onda en el espacio recíproco, - $ \mathbf{K} $ es el vector de onda en el espacio recíproco,
- $ \mathbf{R}_n $ es el vector de traslación que identifica la celda $n$. - $ \mathbf{R}_n $ es el vector de traslación que identifica la celda $n$.
Este enfoque nos permite capturar los efectos de las interacciones entre los primeros vecinos en la estructura vibracional de la red de grafeno resolviendo la ecuación de valores propios: Este enfoque nos permite capturar los efectos de las interacciones entre los primeros vecinos en la estructura vibracional de la red de grafeno resolviendo la ecuación de valores propios:
$$ $$
\sum_{j\beta} D_{i\alpha,j\beta}(\mathbf{K}) u_{j\beta}(\mathbf{K}) = \omega^2 u_{i\alpha}(\mathbf{K}), \sum_{j\beta} D_{i\alpha,j\beta}(\mathbf{K}) u_{j\beta}(\mathbf{K}) = \omega^2 u_{i\alpha}(\mathbf{K}),
$$ $$
donde $ u_{i\alpha}(\mathbf{K}) $ es la amplitud de desplazamiento del átomo $i$ en dirección $\alpha$ y $ \omega $ es la frecuencia de vibración. donde $ u_{i\alpha}(\mathbf{K}) $ es la amplitud de desplazamiento del átomo $i$ en dirección $\alpha$ y $ \omega $ es la frecuencia de vibración.
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
<!-- A partir de la energía potencial, es posible derivar una expresión explícita para la matriz dinámica de grafeno. En el código, esto se implementa en la función `D(Kx, Ky, Kz, params)`, donde:
- **Parámetros del modelo**: Los parámetros de interacción $c_1$, $c_2$, $c_3$ y la masa atómica $m$ están predefinidos en el código, junto con los vectores de red $\mathbf{a_1}$ y $\mathbf{a_2}$.
- **Construcción de la matriz dinámica**: La matriz dinámica se descompone en componentes radiales y tangenciales usando los vectores de red $\mathbf{a_1}$ y $\mathbf{a_2}$, y los valores de la función de onda. -->
<!-- ### Expresión de la Matriz Dinámica
La matriz dinámica $D(\mathbf{K})$ se puede expresar en función de las constantes de interacción y los vectores de red. Algunos de los elementos de la matriz dinámica en el código se presentan como:
$$
D_{xx}(\mathbf{K}) = \frac{3(c_1 + c_2)}{2m} - \frac{c_1}{m} \left( 1 + e^{-i \mathbf{K} \cdot \mathbf{a}_1} + e^{-i \mathbf{K} \cdot \mathbf{a}_2} \right)
$$
$$
D_{xy}(\mathbf{K}) = \frac{\sqrt{3}}{4m} (c_1 - c_2) \left( e^{-i \mathbf{K} \cdot \mathbf{a}_1} - e^{-i \mathbf{K} \cdot \mathbf{a}_2} \right)
$$
Los términos fuera de la diagonal reflejan las interacciones tangenciales entre átomos vecinos, mientras que los términos en la diagonal corresponden a las interacciones radiales. -->
%% Cell type:markdown id: tags:
### Descripción de la Red de Grafeno ### Descripción de la Red de Grafeno
Consideramos una celda primitiva de grafeno con dos átomos de carbono, donde los átomos están dispuestos en una red hexagonal. Los vectores de red son: Consideramos una celda primitiva de grafeno con dos átomos de carbono, donde los átomos están dispuestos en una red hexagonal. Los vectores de red son:
$$ $$
\mathbf{a}_1 = \frac{a}{2} (\sqrt{3} \hat{x} - \hat{y}), \quad \mathbf{a}_2 = \frac{a}{2} (\sqrt{3} \hat{x} + \hat{y}), \mathbf{a}_1 = \frac{a}{2} (\sqrt{3} \hat{x} - \hat{y}), \quad \mathbf{a}_2 = \frac{a}{2} (\sqrt{3} \hat{x} + \hat{y}),
$$ $$
donde $a$ es el parámetro de red. La base de la celda primitiva es: donde $a$ es el parámetro de red. La base de la celda primitiva es:
$$ $$
\mathbf{t}_1 = \vec{0} \quad \text{y} \quad \mathbf{t}_2 = \frac{1}{3} (\mathbf{a}_1 + \mathbf{a}_2) = \frac{a}{\sqrt{3}} \hat{x}. \mathbf{t}_1 = \vec{0} \quad \text{y} \quad \mathbf{t}_2 = \frac{1}{3} (\mathbf{a}_1 + \mathbf{a}_2) = \frac{a}{\sqrt{3}} \hat{x}.
$$ $$
Nuestra notación será la siguiente: el desplazamiento $S_{mni\alpha}$ corresponde a la componente $\alpha$ del átomo $i$ cuyo vector de traslación es $\mathbf{R}_{mn} = m \mathbf{a}_1 + n \mathbf{a}_2$. La red de grafeno se puede visualizar en el siguiente diagrama, con las etiquetas $mni$ de cada átomo ($\bar{1} = -1$): Nuestra notación será la siguiente: el desplazamiento $S_{mni\alpha}$ corresponde a la componente $\alpha$ del átomo $i$ cuyo vector de traslación es $\mathbf{R}_{mn} = m \mathbf{a}_1 + n \mathbf{a}_2$. La red de grafeno se puede visualizar en el siguiente diagrama, con las etiquetas $mni$ de cada átomo ($\bar{1} = -1$):
<p align="center"> <p align="center">
<img src="https://gitmilab.redclara.net/mantillan/TrabajosPregrado/-/raw/main/SolidState/GrapheneLattice.jpg" width="50%" /> <img src="https://gitmilab.redclara.net/mantillan/TrabajosPregrado/-/raw/main/SolidState/GrapheneLattice.jpg" width="50%" />
</p> </p>
en donde se han señalado los primeros vecinos de los átomos $0$ y $1$ de la celda $00$ mediante enlaces color naranja. en donde se han señalado los primeros vecinos de los átomos $0$ y $1$ de la celda $00$ mediante enlaces color naranja.
Consecuentemente, los vectores recíprocos, los cuales cumplen la regla $\mathbf{a}_i \cdot \mathbf{b}_j = 2\pi \delta_{ij}$, son: Consecuentemente, los vectores recíprocos, los cuales cumplen la regla $\mathbf{a}_i \cdot \mathbf{b}_j = 2\pi \delta_{ij}$, son:
$$ $$
\mathbf{b}_1 = \frac{2\pi}{\sqrt{3}a} (\hat{x} - \sqrt{3} \hat{y}), \quad \mathbf{b}_2 = \frac{2\pi}{\sqrt{3}a} (\hat{x} + \sqrt{3} \hat{y}), \mathbf{b}_1 = \frac{2\pi}{\sqrt{3}a} (\hat{x} - \sqrt{3} \hat{y}), \quad \mathbf{b}_2 = \frac{2\pi}{\sqrt{3}a} (\hat{x} + \sqrt{3} \hat{y}),
$$ $$
el cual es también una red hexagonal de dos sitios, pero rotado $\pi/2$, de modo que los puntos de alta simetría en la zona de Brillouin son: el cual es también una red hexagonal de dos sitios, pero rotado $\pi/2$, de modo que los puntos de alta simetría en la zona de Brillouin son:
$$ $$
\Gamma = \vec{0}, \quad M = \frac{\mathbf{b}_1+\mathbf{b}_2}{2}, \quad K = \frac{|\mathbf{b}_1+\mathbf{b}_2|}{2} (\hat{x} + \frac{1}{\sqrt{3}} \hat{y}). \Gamma = \vec{0}, \quad M = \frac{\mathbf{b}_1+\mathbf{b}_2}{2}, \quad K = \frac{|\mathbf{b}_1+\mathbf{b}_2|}{2} (\hat{x} + \frac{1}{\sqrt{3}} \hat{y}).
$$ $$
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
### Matriz Dinámica del Grafeno ### Matriz Dinámica del Grafeno
Para poder escribir la energía potencial $\Delta U$ en términos de los desplazamientos de los átomos, es necesario considerar las direcciones de los enlaces entre átomos vecinos $r_{ij}$. Para poder escribir la energía potencial $\Delta U$ en términos de los desplazamientos de los átomos, es necesario considerar las direcciones de los enlaces entre átomos vecinos $r_{ij}$. Por la simetría del sistema, solo necesitamos 3 direcciones de enlace, pues los átomos $010$ y $001$ tienen la misma dirección que los átomos $000$ y $0\bar{1}1$, así como los átomos $001$ y $100$ tienen la misma que los átomos $000$ y $\bar{1}01$. Por lo tanto, las direcciones de los enlaces son:
$$
\hat{r}_{001,010} = \frac{1}{2} (\hat{x} + \sqrt{3} \hat{y}), \quad \hat{r}_{001,100} = \frac{1}{2} (\hat{x} - \sqrt{3} \hat{y}), \quad \hat{r}_{000,001} = \hat{x}.
$$
Con esto en mente podemos calcular la energía potencial $\Delta U$, tomando las proyecciones y normas de los desplazamientos de los átomos vecinos. De esta forma, se obtiene una energía potencial:
\begin{equation*}
\begin{split}
\Delta U =& \frac{1}{2} (c_r-c_t) \; [(S_{000x}-S_{001x})^2 + \frac{1}{4}(S_{000x}+\sqrt{3}S_{000y}-S_{0\bar{1}1x}-\sqrt{3}S_{0\bar{1}1y})^2 \\
+& \frac{1}{4}(S_{000x}- \sqrt{3}S_{000y}-S_{\bar{1}01x}+\sqrt{3}S_{\bar{1}01y})^2 + \frac{1}{4}(S_{001x}+\sqrt{3}S_{001y}-S_{010x}-\sqrt{3}S_{010y})^2\\
+& \frac{1}{4}(S_{001x}-\sqrt{3}S_{001y}-S_{100x}+\sqrt{3}S_{100y})^2]\\
+& \frac{1}{2} c_t \; [(S_{000x}-S_{001x})^2 + (S_{000y}-S_{001y})^2 + (S_{000z}-S_{001z})^2 \\
+& (S_{000x}-S_{\bar{1}01x})^2 + (S_{000y}-S_{\bar{1}01y})^2 + (S_{000z}-S_{\bar{1}01z})^2 \\
+& (S_{000x}-S_{0\bar{1}1x})^2 + (S_{000y}-S_{0\bar{1}1y})^2 + (S_{000z}-S_{0\bar{1}1z})^2 \\
+& (S_{001x}-S_{010x})^2 + (S_{001y}-S_{010y})^2 + (S_{001z}-S_{010z})^2 \\
+& (S_{001x}-S_{100x})^2 + (S_{001y}-S_{100y})^2 + (S_{001z}-S_{100z})^2].
\end{split}
\end{equation*}
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
## Desarrollo numérico ## Desarrollo numérico
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
# Importamos las librerias necesarias # Importamos las librerias necesarias
import numpy as np import numpy as np
import pandas as pd import pandas as pd
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
# Definimos la matriz dinámica # Definimos la matriz dinámica
def D(Kx, Ky, Kz, params): def D(Kx, Ky, Kz, params):
''' '''
Esta función calcula la matriz dinámica de un cristal hexagonal Esta función calcula la matriz dinámica de un cristal hexagonal
para un vector de onda K = (Kx, Ky, Kz). La notación de las componentes para un vector de onda K = (Kx, Ky, Kz). La notación de las componentes
de la matriz dinámica se puede comprender en la forma: de la matriz dinámica se puede comprender en la forma:
D_0x,0x = D_0,0, D_1x,1x = D_3,3, D_0y,1z = D_1,5, etc. D_0x,0x = D_0,0, D_1x,1x = D_3,3, D_0y,1z = D_1,5, etc.
''' '''
# Definimos las constantes del problema # Definimos las constantes del problema
c1, c2, c3, m, a1, a2 = params c1, c2, c3, m, a1, a2 = params
# Vector de onda # Vector de onda
K = np.array([Kx, Ky, Kz]) K = np.array([Kx, Ky, Kz])
# Inicializamos la matriz dinámica con ceros # Inicializamos la matriz dinámica con ceros
dinamic = np.zeros((6,6), dtype=complex) dinamic = np.zeros((6,6), dtype=complex)
# Matriz dinámica modelo 1 (descomposición en x y z) # Matriz dinámica modelo 1 (descomposición en x y z)
# dinamic[0,0] = 3*c1/m # dinamic[0,0] = 3*c1/m
# dinamic[1,1] = 3*c2/m # dinamic[1,1] = 3*c2/m
# dinamic[2,2] = 3*c3/m # dinamic[2,2] = 3*c3/m
# dinamic[3,3] = 3*c1/m # dinamic[3,3] = 3*c1/m
# dinamic[4,4] = 3*c2/m # dinamic[4,4] = 3*c2/m
# dinamic[5,5] = 3*c3/m # dinamic[5,5] = 3*c3/m
# dinamic[0,3] = -c1/m*(1+np.exp(-1j*np.dot(K,a1))+np.exp(-1j*np.dot(K,a2))) # dinamic[0,3] = -c1/m*(1+np.exp(-1j*np.dot(K,a1))+np.exp(-1j*np.dot(K,a2)))
# dinamic[1,4] = -c2/m*(1+np.exp(-1j*np.dot(K,a1))+np.exp(-1j*np.dot(K,a2))) # dinamic[1,4] = -c2/m*(1+np.exp(-1j*np.dot(K,a1))+np.exp(-1j*np.dot(K,a2)))
# dinamic[2,5] = -c3/m*(1+np.exp(-1j*np.dot(K,a1))+np.exp(-1j*np.dot(K,a2))) # dinamic[2,5] = -c3/m*(1+np.exp(-1j*np.dot(K,a1))+np.exp(-1j*np.dot(K,a2)))
# dinamic[3,0] = -c1/m*(1+np.exp(1j*np.dot(K,a1))+np.exp(1j*np.dot(K,a2))) # dinamic[3,0] = -c1/m*(1+np.exp(1j*np.dot(K,a1))+np.exp(1j*np.dot(K,a2)))
# dinamic[4,1] = -c2/m*(1+np.exp(1j*np.dot(K,a1))+np.exp(1j*np.dot(K,a2))) # dinamic[4,1] = -c2/m*(1+np.exp(1j*np.dot(K,a1))+np.exp(1j*np.dot(K,a2)))
# dinamic[5,2] = -c3/m*(1+np.exp(1j*np.dot(K,a1))+np.exp(1j*np.dot(K,a2))) # dinamic[5,2] = -c3/m*(1+np.exp(1j*np.dot(K,a1))+np.exp(1j*np.dot(K,a2)))
# Matriz dinámica modelo 2 (descomposición en radial y tangencial) # Matriz dinámica modelo 2 (descomposición en radial y tangencial)
dinamic[0,0] = 3*(c1+c2)/(2) dinamic[0,0] = 3*(c1+c2)/(2)
dinamic[0,3] = -(c1+1/4*(c1+3*c2)*(np.exp(1j*np.dot(K,a1))+np.exp(1j*np.dot(K,a2)))) dinamic[0,3] = -(c1+1/4*(c1+3*c2)*(np.exp(1j*np.dot(K,a1))+np.exp(1j*np.dot(K,a2))))
dinamic[0,4] = np.sqrt(3)/(4)*(c1-c2)*(np.exp(1j*np.dot(K,a1))-np.exp(1j*np.dot(K,a2))) dinamic[0,4] = np.sqrt(3)/(4)*(c1-c2)*(np.exp(1j*np.dot(K,a1))-np.exp(1j*np.dot(K,a2)))
dinamic[1,1] = 3*(c1+c2)/(2) dinamic[1,1] = 3*(c1+c2)/(2)
dinamic[1,3] = np.sqrt(3)/(4)*(c1-c2)*(np.exp(1j*np.dot(K,a1))-np.exp(1j*np.dot(K,a2))) dinamic[1,3] = np.sqrt(3)/(4)*(c1-c2)*(np.exp(1j*np.dot(K,a1))-np.exp(1j*np.dot(K,a2)))
dinamic[1,4] = -(c2+1/4*(3*c1+c2)*(np.exp(1j*np.dot(K,a1))+np.exp(1j*np.dot(K,a2)))) dinamic[1,4] = -(c2+1/4*(3*c1+c2)*(np.exp(1j*np.dot(K,a1))+np.exp(1j*np.dot(K,a2))))
dinamic[2,2] = 3*c3 dinamic[2,2] = 3*c3
dinamic[2,5] = -c3*(1+np.exp(1j*np.dot(K,a1))+np.exp(1j*np.dot(K,a2))) dinamic[2,5] = -c3*(1+np.exp(1j*np.dot(K,a1))+np.exp(1j*np.dot(K,a2)))
dinamic[3,0] = -(c1+1/4*(c1+3*c2)*(np.exp(-1j*np.dot(K,a1))+np.exp(-1j*np.dot(K,a2)))) dinamic[3,0] = -(c1+1/4*(c1+3*c2)*(np.exp(-1j*np.dot(K,a1))+np.exp(-1j*np.dot(K,a2))))
dinamic[3,1] = np.sqrt(3)/(4)*(c1-c2)*(np.exp(-1j*np.dot(K,a1))-np.exp(-1j*np.dot(K,a2))) dinamic[3,1] = np.sqrt(3)/(4)*(c1-c2)*(np.exp(-1j*np.dot(K,a1))-np.exp(-1j*np.dot(K,a2)))
dinamic[3,3] = 3*(c1+c2)/(2) dinamic[3,3] = 3*(c1+c2)/(2)
dinamic[4,0] = np.sqrt(3)/(4)*(c1-c2)*(np.exp(-1j*np.dot(K,a1))-np.exp(-1j*np.dot(K,a2))) dinamic[4,0] = np.sqrt(3)/(4)*(c1-c2)*(np.exp(-1j*np.dot(K,a1))-np.exp(-1j*np.dot(K,a2)))
dinamic[4,1] = -(c2+1/4*(3*c1+c2)*(np.exp(-1j*np.dot(K,a1))+np.exp(-1j*np.dot(K,a2)))) dinamic[4,1] = -(c2+1/4*(3*c1+c2)*(np.exp(-1j*np.dot(K,a1))+np.exp(-1j*np.dot(K,a2))))
dinamic[4,4] = 3*(c1+c2)/(2) dinamic[4,4] = 3*(c1+c2)/(2)
dinamic[5,2] = -c3*(1+np.exp(-1j*np.dot(K,a1))+np.exp(-1j*np.dot(K,a2))) dinamic[5,2] = -c3*(1+np.exp(-1j*np.dot(K,a1))+np.exp(-1j*np.dot(K,a2)))
dinamic[5,5] = 3*c3 dinamic[5,5] = 3*c3
# Retornamos la matriz dinámica normalizada por la masa # Retornamos la matriz dinámica normalizada por la masa
return dinamic/m return dinamic/m
# Definimos una función para calcular los valores propios de la matriz dinámica # Definimos una función para calcular los valores propios de la matriz dinámica
def eigenvalues(Kx, Ky, Kz, params): def eigenvalues(Kx, Ky, Kz, params):
''' '''
Esta función calcula los valores propios de la matriz dinámica para un Esta función calcula los valores propios de la matriz dinámica para un
vector de onda K = (Kx, Ky, Kz) vector de onda K = (Kx, Ky, Kz)
''' '''
# Calculamos la matriz dinámica # Calculamos la matriz dinámica
dinamic = D(Kx, Ky, Kz, params) dinamic = D(Kx, Ky, Kz, params)
# Calculamos los valores propios de la matriz dinámica # Calculamos los valores propios de la matriz dinámica
squared = np.linalg.eigvalsh(dinamic) squared = np.linalg.eigvalsh(dinamic)
# Retornamos la raíz cuadrada de los valores propios # Retornamos la raíz cuadrada de los valores propios
return np.sqrt(squared) return np.sqrt(squared)
# Definimos la función que calcula la dispersión en el camino Gamma-M-K-Gamma # Definimos la función que calcula la dispersión en el camino Gamma-M-K-Gamma
def dispersion(params, b1, b2): def dispersion(params, b1, b2):
''' '''
Esta función calcula la dispersión en el camino Gamma-M-K-Gamma Esta función calcula la dispersión en el camino Gamma-M-K-Gamma
''' '''
# Definimos los puntos del camino # Definimos los puntos del camino
Gamma = np.array([0,0,0]) Gamma = np.array([0,0,0])
M = (b1+b2)/2 M = (b1+b2)/2
K = np.linalg.norm(b1+b2)/2*np.array([1,1/np.sqrt(3),0]) K = np.linalg.norm(b1+b2)/2*np.array([1,1/np.sqrt(3),0])
# Definimos el número de puntos en cada segmento # Definimos el número de puntos en cada segmento
n = 100 n = 100
# Definimos los vectores de onda en cada segmento # Definimos los vectores de onda en cada segmento
GM = np.array([np.linspace(Gamma[i], M[i], n) for i in range(3)]) GM = np.array([np.linspace(Gamma[i], M[i], n) for i in range(3)])
MK = np.array([np.linspace(M[i], K[i], n) for i in range(3)]) MK = np.array([np.linspace(M[i], K[i], n) for i in range(3)])
KG = np.array([np.linspace(K[i], Gamma[i], n) for i in range(3)]) KG = np.array([np.linspace(K[i], Gamma[i], n) for i in range(3)])
# Calculamos los valores propios en cada segmento # Calculamos los valores propios en cada segmento
GM_eigenvalues = np.array([np.real(eigenvalues(GM[0,i], GM[1,i], GM[2,i], params)) for i in range(n)]).T GM_eigenvalues = np.array([np.real(eigenvalues(GM[0,i], GM[1,i], GM[2,i], params)) for i in range(n)]).T
MK_eigenvalues = np.array([np.real(eigenvalues(MK[0,i], MK[1,i], MK[2,i], params)) for i in range(n)]).T MK_eigenvalues = np.array([np.real(eigenvalues(MK[0,i], MK[1,i], MK[2,i], params)) for i in range(n)]).T
KG_eigenvalues = np.array([np.real(eigenvalues(KG[0,i], KG[1,i], KG[2,i], params)) for i in range(n)]).T KG_eigenvalues = np.array([np.real(eigenvalues(KG[0,i], KG[1,i], KG[2,i], params)) for i in range(n)]).T
# Cambiamos los nan por ceros # Cambiamos los nan por ceros
GM_eigenvalues = np.nan_to_num(GM_eigenvalues) GM_eigenvalues = np.nan_to_num(GM_eigenvalues)
MK_eigenvalues = np.nan_to_num(MK_eigenvalues) MK_eigenvalues = np.nan_to_num(MK_eigenvalues)
KG_eigenvalues = np.nan_to_num(KG_eigenvalues) KG_eigenvalues = np.nan_to_num(KG_eigenvalues)
# Retornamos los valores propios para cada segmento # Retornamos los valores propios para cada segmento
return np.array([GM_eigenvalues, MK_eigenvalues, KG_eigenvalues]) return np.array([GM_eigenvalues, MK_eigenvalues, KG_eigenvalues])
# Definimos una función para graficar la dispersión en el camino Gamma-M-K-Gamma # Definimos una función para graficar la dispersión en el camino Gamma-M-K-Gamma
def plot_dispersion(dispersion): def plot_dispersion(dispersion):
''' '''
Esta función grafica la dispersión en el camino Gamma-M-K-Gamma Esta función grafica la dispersión en el camino Gamma-M-K-Gamma
''' '''
# Separamos los caminos # Separamos los caminos
GM = dispersion[0] GM = dispersion[0]
MK = dispersion[1] MK = dispersion[1]
KG = dispersion[2] KG = dispersion[2]
# Inicializamos la figura # Inicializamos la figura
fig = plt.figure(figsize=(8,6)) fig = plt.figure(figsize=(8,6))
# Graficamos la dispersión para cada uno de los 6 valores propios hallados en cada punto # Graficamos la dispersión para cada uno de los 6 valores propios hallados en cada punto
shifting = 0.1 shifting = 0.1
colors = 6*['m'] colors = 6*['m']
for i in range(6): for i in range(6):
plt.plot(np.linspace(0,1+shifting,100), GM[i]*1e-2, str(colors[i])+'.', markersize=2.5) plt.plot(np.linspace(0,1+shifting,100), GM[i]*1e-2, str(colors[i])+'.', markersize=2.5)
plt.plot(np.linspace(1+shifting,2-shifting,100), MK[i]*1e-2, str(colors[i])+'.', markersize=2.5) plt.plot(np.linspace(1+shifting,2-shifting,100), MK[i]*1e-2, str(colors[i])+'.', markersize=2.5)
plt.plot(np.linspace(2-shifting,3,100), KG[i]*1e-2, str(colors[i])+'.', markersize=2.5) plt.plot(np.linspace(2-shifting,3,100), KG[i]*1e-2, str(colors[i])+'.', markersize=2.5)
# Líneas verticales para separar los caminos # Líneas verticales para separar los caminos
plt.axvline(x=1+shifting, color='k', linestyle='--') plt.axvline(x=1+shifting, color='k', linestyle='--')
plt.axvline(x=2-shifting, color='k', linestyle='--') plt.axvline(x=2-shifting, color='k', linestyle='--')
# Agregamos las etiquetas # Agregamos las etiquetas
plt.xticks([0,1+shifting,2-shifting,3], ['$\Gamma$', 'M', 'K', '$\Gamma$'], fontsize=12) plt.xticks([0,1+shifting,2-shifting,3], ['$\Gamma$', 'M', 'K', '$\Gamma$'], fontsize=12)
plt.xlabel('Camino en el espacio recíproco', fontsize=14) plt.xlabel('Camino en el espacio recíproco', fontsize=14)
plt.yticks(np.arange(0, 1700, 200)) plt.yticks(np.arange(0, 1700, 200))
plt.ylabel('Frecuencia (cm$^{-1}$)', fontsize=14) plt.ylabel('Frecuencia (cm$^{-1}$)', fontsize=14)
plt.title('Dispersión en el camino $\Gamma$-M-K-$\Gamma$', fontsize=16) plt.title('Dispersión en el camino $\Gamma$-M-K-$\Gamma$', fontsize=16)
plt.grid(alpha=0.5) plt.grid(alpha=0.5)
plt.show() plt.show()
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
#Definimos las constantes del cristal hexagonal, los vectores de la red y de la red recíproca #Definimos las constantes del cristal hexagonal, los vectores de la red y de la red recíproca
a = 2e-10 #constante de red, m a = 2e-10 #constante de red, m
c1 = 4.5e-17 #constantes de resorte, N/m c1 = 4.5e-17 #constantes de resorte, N/m
c2 = 12.5e-17 c2 = 12.5e-17
c3 = 2.25e-17 c3 = 2.25e-17
m = 2e-26 #masa atómica del carbono, kg m = 2e-26 #masa atómica del carbono, kg
a1 = np.array(a/2*np.array([np.sqrt(3),-1,0])) a1 = np.array(a/2*np.array([np.sqrt(3),-1,0]))
a2 = np.array(a/2*np.array([np.sqrt(3),1,0])) a2 = np.array(a/2*np.array([np.sqrt(3),1,0]))
b1 = 2*np.pi/(a*np.sqrt(3))*np.array([1,-np.sqrt(3),0]) b1 = 2*np.pi/(a*np.sqrt(3))*np.array([1,-np.sqrt(3),0])
b2 = 2*np.pi/(a*np.sqrt(3))*np.array([1,np.sqrt(3),0]) b2 = 2*np.pi/(a*np.sqrt(3))*np.array([1,np.sqrt(3),0])
params = [c1, c2, c3, m, a1, a2] params = [c1, c2, c3, m, a1, a2]
#Calculamos la disperción #Calculamos la disperción
disp = dispersion(params, b1, b2) disp = dispersion(params, b1, b2)
#Graficamos la disperción #Graficamos la disperción
plot_dispersion(disp) plot_dispersion(disp)
``` ```
%% Output %% Output
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` 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