Landau Theory of the Mott transition

Perform a fit of the order parameter, linked to double occupation to match a Landau theory formulation in correspondence to Kotliar, G., Lange, E., & Rozenberg, M. J. (2000). Landau Theory of the Finite Temperature Mott Transition. Phys. Rev. Lett., 84(22), 5180–5183. http://dx.doi.org/10.1103/PhysRevLett.84.5180

Warning

Not reproduced for the moment

from scipy.optimize import curve_fit
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
import dmft.dimer as dimer
import dmft.common as gf
import dmft.ipt_imag as ipt
from dmft.utils import differential_weight as diff


def extract_double_occupation(beta, u_range):
    docc = []
    tau, w_n = gf.tau_wn_setup(dict(BETA=beta, N_MATSUBARA=beta))
    g_iwn = gf.greenF(w_n)
    for u_int in u_range:
        g_iwn, sigma = ipt.dmft_loop(u_int, 0.5, g_iwn, w_n, tau, conv=1e-4)
        docc.append(ipt.epot(g_iwn, sigma, u_int, beta, w_n) * 2 / u_int)
    return np.array(docc)


# calculating multiple regions
fac = np.arctan(.15 * np.sqrt(3) / .10)
udelta = np.tan(np.linspace(-fac, fac, 91)) * .10 / np.sqrt(3)
dudelta = diff(udelta)
data = []
bet_uc = [(18, 2.312),
          (19, 2.339),
          (20, 2.3638),
          (20.5, 2.375),
          (21, 2.386)]

for beta, uc in bet_uc:
    urange = udelta + uc + .07
    data.append(extract_double_occupation(beta, urange) - 0.003)

plt.figure()
bc = [b for b, _ in bet_uc]
d_c = [dc[int(len(udelta) / 2)] for dc in data]
for dd, dc, (beta, uc) in zip(data, d_c, bet_uc):
    plt.plot(uc + udelta, dd, '+-', label=beta)

plt.plot([uc for _, uc in bet_uc], [dc[45] for dc in data], 'o')

for dd, (beta, uc) in zip(data, bet_uc):
    chi = diff(dd) / dudelta
    plt.plot(uc + udelta, chi / np.min(chi) * .035, ':')
../../_images/sphx_glr_plot_transition_001.png

effective scaling

plt.close()
plt.figure()
d_c = [dc[45] for dc in data]
for dd, dc, (beta, uc) in zip(data, d_c, bet_uc):
    plt.plot(udelta, dd - dc, lw=2)


def fit_cube(eta, c):
    return c * eta**3


plt.gca().set_color_cycle(None)
for dd, dc, (beta, uc) in zip(data, d_c, bet_uc):
    rd = dd - dc
    bound = 35
    popt, pcov = curve_fit(fit_cube, rd[bound:-bound], udelta[bound:-bound])
    ft = fit_cube(rd, *popt)
    plt.plot(ft, rd)
    print(popt)

plt.xlim([-.15, .15])
../../_images/sphx_glr_plot_transition_002.png

Out:

[-883505.67162143]
[-433371.7767214]
[-181617.47843594]
[-115684.11364568]
[-75369.81958888]

cubic + linear

def fit_cube_lin(eta, c, p):
    return c * eta**3 + p * eta


for dd, dc, (beta, uc) in zip(data, d_c, bet_uc):
    plt.plot(udelta, dd - dc, lw=2)

plt.gca().set_color_cycle(None)
bb = [23, 27, 33, 33, 36]
for dd, dc, bound, (beta, uc) in zip(data, d_c, bb, bet_uc):
    rd = dd - dc
    popt, pcov = curve_fit(
        fit_cube_lin, rd[bound:-bound], udelta[bound:-bound])
    ft = fit_cube_lin(rd, *popt)
    plt.plot(ft, rd)
    plt.plot(ft[bound:-bound], rd[bound:-bound], "k+")
    print(popt)

plt.xlim([-.15, .15])
../../_images/sphx_glr_plot_transition_003.png

Out:

[ -1.58437153e+04  -5.47851818e+00]
[ -2.33585353e+04  -4.13738189e+00]
[ -3.49190705e+04  -2.56748085e+00]
[ -4.06160512e+04  -1.72641946e+00]
[ -4.72383167e+04  -8.18454025e-01]

cubic + linear over constant + linear

plt.figure()


def fit_cube_lin(eta, c, p, q, s):
    return (c * eta**3 + p * eta + s) / (1 + q * eta)


for dd, dc, (beta, uc) in zip(data, d_c, bet_uc):
    plt.plot(udelta, dd - dc, lw=2)

plt.gca().set_color_cycle(None)
bb = [20, 26, 33, 33, 37]
for dd, dc, bound, (beta, uc) in zip(data, d_c, bb, bet_uc):
    rd = dd - dc
    popt, pcov = curve_fit(
        fit_cube_lin, rd[bound:-bound], udelta[bound:-bound], p0=[4e4, 0, 3, -.3])
    ft = fit_cube_lin(rd, *popt)
    plt.plot(ft, rd)
    plt.plot(ft[bound:-bound], rd[bound:-bound], "k+")
    print(popt)

plt.xlim([-.15, .15])
../../_images/sphx_glr_plot_transition_004.png

Out:

[ -1.76916299e+04  -5.43951224e+00   7.17823742e+00  -2.33400113e-04]
[ -2.54066727e+04  -4.09444802e+00   7.85502769e+00  -2.50641838e-04]
[ -3.73436918e+04  -2.52439784e+00   9.64561095e+00  -2.37444323e-04]
[ -4.29143927e+04  -1.67288401e+00   1.20974775e+01  -5.19144949e-04]
[ -5.15225117e+04  -7.30668859e-01  -3.81150442e+00  -7.46327101e-04]

Beta 21 study

def fitchi(urange, a, uc, x0):
    return a * np.abs(urange - uc)**(-2 / 3) + x0


ulim = 44
popt, pcov = curve_fit(fitchi, urange[:ulim], chi[
                       :ulim], p0=[-0.01, 2.391, -0.01])
ft = fitchi(urange, *popt)
plt.plot(urange, ft)
plt.plot(urange[:ulim], ft[:ulim], lw=2)
print(popt)

ulim += 4
popt, pcov = curve_fit(
    fitchi, urange[ulim:], chi[ulim:], p0=[-0.01, 2.391, 0])
ft = fitchi(urange, *popt)
plt.plot(urange, ft)
plt.plot(urange[ulim:], ft[ulim:], lw=2)
print(popt)
../../_images/sphx_glr_plot_transition_005.png

Out:

[  1.82409742e-03   2.39121666e+00  -1.92832349e-01]
[-0.00724163  2.45785292 -0.00253954]

Total running time of the script: ( 0 minutes 5.079 seconds)

Generated by Sphinx-Gallery