Stability of the solutions in the coexistence region¶
As the Energy calculations from IPT source is not reliable enough another methods is also tested to find about the first order line in the transition.
# Author: Óscar Nájera
from __future__ import division, absolute_import, print_function
from math import ceil, log
from functools import partial
import numpy as np
import matplotlib.pylab as plt
from dmft.ipt_imag import dmft_loop
from dmft.common import greenF, tau_wn_setup, fit_gf
def hysteresis(beta, u_range):
log_g = []
tau, w_n = tau_wn_setup(
dict(BETA=beta, N_MATSUBARA=max(2**ceil(log(2 * beta) / log(2)), 256)))
g_iwn = greenF(w_n)
for u_int in u_range:
g_iwn = dmft_loop(u_int, 0.5, g_iwn, w_n, tau, conv=1e-4)[0]
log_g.append(g_iwn)
dos = np.array([fit_gf(w_n[:3], gfs[:3].imag)(0.) for gfs in log_g])
return log_g, dos
def point_stability(g_met, g_ins, U, w_n, tau, c):
mixture = (1 - c) * g_ins + c * g_met
g_iwn_end, _ = dmft_loop(U, 0.5, mixture, w_n, tau, conv=1e-4)
return np.dot(g_iwn_end - mixture, mixture)
def stability(beta, metal_g, insulator_g, urange):
shift = []
tau, w_n = tau_wn_setup(
dict(BETA=beta, N_MATSUBARA=max(2**ceil(log(2 * beta) / log(2)), 256)))
for g_met, g_ins, U in zip(metal_g, insulator_g, urange):
stab = partial(point_stability, g_met, g_ins, U, w_n, tau)
shift.append(0.1 * np.sum([stab(c) for c in np.arange(0, 1, .1)]))
return np.array(shift)
urange = np.linspace(2.4, 3.6, 41)
TEMP = np.arange(1 / 512., .06, 1 / 256)
shift_log = []
dos_log = []
for BETA in 1 / TEMP:
metalG, Mdos = hysteresis(BETA, urange)
insulatorG, Idos = hysteresis(BETA, urange[::-1])
shift_log.append(stability(BETA, metalG, insulatorG[::-1], urange))
dos_log.append((Mdos, Idos))
Functional cost for transitioning from insulator to metal¶
Following Moeller, G., Dobrosavljevi’c, V., & Ruckenstein, A. (1999). RKKY interactions and the Mott transition. Physical Review B, 59(10), 6846–6854. I formulate the expense of transitioning from one solution to the other.
Deltas = np.array(shift_log).real
plt.figure()
for t, df in zip(TEMP, Deltas):
plt.plot(urange, df + t, 'k')
crossing = [3.39, 3.33, 3.24, 3.12, 3.01,
2.92, 2.82, 2.73, 2.65, 2.6, 2.54, 2.52]
UC1 = np.array([2.57, 2.57, 2.57, 2.57, 2.55, 2.55,
2.55, 2.52, 2.52, 2.49, 2.49, 2.49]) + .02
UC2 = np.array([3.39, 3.33, 3.24, 3.18, 3.06, 2.97,
2.88, 2.78, 2.7, 2.6, 2.54, 2.52])
plt.plot(crossing, TEMP[:len(crossing)], lw=2)
plt.plot(UC1, TEMP[:len(crossing)], lw=2)
plt.plot(UC2, TEMP[:len(crossing)], lw=2)
plt.xlabel(r'$U/D$')
plt.ylabel(r'$F$ + $T/D$')
plt.title('Functional cost to transition to metal')
x, y = np.meshgrid(urange, TEMP)
plt.axis([x.min(), x.max(), 0, y.max()])
![../../_images/sphx_glr_plot_stability_001.png](../../_images/sphx_glr_plot_stability_001.png)
Colorful phase diagram with density of states at Fermi level¶
metal_dos = np.array(dos_log)[:, 0]
insulator_dos = np.array(dos_log)[:, 1]
plt.figure(1)
plt.pcolormesh(x, y, -metal_dos, cmap=plt.get_cmap(r'viridis'), vmin=0, vmax=2)
plt.colorbar()
z = np.ma.masked_array(-insulator_dos, -insulator_dos > .25)
plt.pcolormesh(x, y, z, alpha=.15, cmap=plt.get_cmap(
r'viridis'), vmin=0, vmax=2)
plt.axis([x.min(), x.max(), 0, y.max()])
plt.xlabel(r'$U/D$')
plt.ylabel(r'$T/D$')
plt.title(
'Phase diagram \n color represents $-\\Im G_{{AA}}(0)$')
plt.plot(crossing, TEMP[:len(crossing)], lw=2)
plt.plot(UC1, TEMP[:len(crossing)], lw=2)
plt.plot(UC2, TEMP[:len(crossing)], lw=2)
![../../_images/sphx_glr_plot_stability_002.png](../../_images/sphx_glr_plot_stability_002.png)
Total running time of the script: ( 1 minutes 3.563 seconds)