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

Study above the critical point

  • ../_images/sphx_glr_plot_docc_transition_001.png
  • ../_images/sphx_glr_plot_docc_transition_002.png

Out:

[67 61 62 61 59 57 55 53 51 49 47 45 44 42 41 39 38 37 37 37 38 38 38 39 39
 39 39 39 39 40 40 40 40 40 40 40 40 41 41 41 41 41 41 41 41 41 41 42 42 42
 42 42 42 42 42 42 42 42 43 43 43 43 43 43 43 43 43 43 44 44 44 44 44 44 44
 44 44 44 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 44
 44 44 43 43 42 42 41 40 39 38 37 36 35 33 32 30 28 27 25 23 21]
[68 64 66 67 66 65 64 62 60 58 56 54 52 50 49 47 46 44 43 42 42 43 43 44 44
 45 45 46 46 47 47 48 48 49 49 49 50 50 51 51 51 52 52 53 53 53 54 54 54 55
 55 55 56 56 56 57 57 57 58 58 58 59 59 59 59 60 60 60 60 61 61 61 61 61 62
 62 62 62 62 62 62 62 62 62 61 61 61 61 60 60 59 59 58 57 57 56 55 54 53 52
 51 49 48 47 45 44 42 41 39 38 36 34 33 31 29 28 26 24 22 21 19]
[67 64 68 70 71 71 71 70 68 67 65 63 61 59 58 56 54 53 51 50 48 47 47 49 49
 50 51 52 53 54 55 56 57 58 60 61 62 63 64 65 66 67 68 70 71 72 73 75 76 77
 78 80 81 82 83 85 86 87 88 89 90 91 92 93 94 95 95 95 96 96 95 95 94 94 93
 92 91 89 88 86 84 83 81 79 77 75 73 71 69 67 65 63 61 59 57 55 53 51 50 48
 46 45 43 41 40 38 37 35 34 32 31 30 28 27 25 24 23 21 20 18 17]
[ 67  64  68  71  72  73  73  73  72  71  69  68  66  64  63  61  59  58
  56  54  53  51  50  49  51  52  53  54  56  57  58  60  61  62  64  66
  67  69  70  72  74  76  78  80  82  84  86  89  91  94  97  99 102 105
 108 111 113 116 119 122 124 126 127 128 129 129 129 127 126 124 121 118
 115 111 108 104 100  97  93  89  86  83  80  77  74  71  69  66  64  61
  59  57  55  53  51  50  48  46  45  43  42  40  39  37  36  35  33  32
  31  30  28  27  26  25  24  22  21  20  19  17  16]
[ 65  63  67  70  73  74  75  76  75  75  74  72  71  70  68  67  65  63
  62  60  59  57  56  54  53  52  53  54  55  57  58  60  61  63  65  67
  69  71  73  75  78  80  83  86  89  92  96 100 104 109 114 120 126 132
 139 147 155 164 172 180 187 193 195 195 192 185 177 168 158 148 139 130
 122 114 108 102  96  91  87  83  79  75  72  69  66  63  61  59  57  55
  53  51  49  47  46  44  43  41  40  39  37  36  35  34  33  32  31  29
  28  27  26  25  24  23  22  21  20  19  18  17  15]
[ 63  61  65  69  72  74  76  77  77  77  77  76  75  74  73  72  71  69
  68  66  65  64  62  61  60  58  57  56  55  55  56  57  59  61  63  65
  66  69  71  73  76  79  82  85  88  92  97 102 107 113 120 129 139 150
 164 182 204 233 270 316 364 387 363 313 262 222 191 168 149 135 123 113
 105  98  92  86  81  77  73  70  67  64  62  59  57  55  53  51  49  48
  46  45  43  42  41  39  38  37  36  35  34  33  32  31  30  29  28  27
  26  25  24  24  23  22  21  20  19  18  17  16  15]
[ 63  60  65  69  72  74  76  77  78  78  78  78  77  76  75  74  73  71
  70  69  67  66  65  63  62  61  60  58  57  56  55  57  58  60  61  63
  65  67  69  72  74  77  80  83  87  91  95 100 106 112 120 129 140 153
 170 191 222 266 336 454 604 554 393 290 229 191 164 144 129 118 108 100
  93  87  82  78  74  70  67  64  62  59  57  55  53  51  49  48  46  45
  44  42  41  40  39  38  36  35  34  33  33  32  31  30  29  28  27  26
  25  25  24  23  22  21  20  19  19  18  17  16  15]
[ -3.86528847e+04  -2.47024433e+01   1.76230198e+01  -6.76142889e-04]
[ -5.66140107e+04  -1.90645920e+01   6.03415912e+00  -1.03353073e-04]
[ -9.29427951e+04  -1.32890339e+01   1.65847125e+00  -2.43110956e-04]
[ -1.25002557e+05  -1.01922703e+01  -3.05401520e-01  -1.92401678e-04]
[ -1.58468430e+05  -7.01333087e+00   1.42348154e+00  -3.21099956e-04]
[ -1.93447631e+05  -3.76601834e+00   9.68173850e+00  -5.89656130e-04]
[ -2.14218382e+05  -2.43545432e+00   4.22759934e+01  -4.49653695e-04]

from scipy.optimize import curve_fit
import numpy as np
import matplotlib.pyplot as plt
import dmft.dimer as dimer
import dmft.common as gf
import dmft.ipt_imag as ipt


def loop_u_tp(u_range, tprange, beta, seed='mott gap'):
    tau, w_n = gf.tau_wn_setup(dict(BETA=beta, N_MATSUBARA=256))
    giw_d, giw_o = dimer.gf_met(w_n, 0., 0., 0.5, 0.)
    if seed == 'ins':
        giw_d, giw_o = 1 / (1j * w_n + 4j / w_n), np.zeros_like(w_n) + 0j

    giw_s = []
    sigma_iw = []
    ekin, epot = [], []
    iterations = []
    for u_int, tp in zip(u_range, tprange):
        giw_d, giw_o, loops = dimer.ipt_dmft_loop(
            beta, u_int, tp, giw_d, giw_o, tau, w_n)
        giw_s.append((giw_d, giw_o))
        iterations.append(loops)
        g0iw_d, g0iw_o = dimer.self_consistency(
            1j * w_n, 1j * giw_d.imag, giw_o.real, 0., tp, 0.25)
        siw_d, siw_o = ipt.dimer_sigma(u_int, tp, g0iw_d, g0iw_o, tau, w_n)
        sigma_iw.append((siw_d.copy(), siw_o.copy()))

        ekin.append(dimer.ekin(giw_d, giw_o, w_n, tp, beta))

        epot.append(dimer.epot(giw_d, w_n, beta, u_int **
                               2 / 4 + tp**2, ekin[-1], u_int))
    print(np.array(iterations))
    # last division in energies because I want per spin epot
    return np.array(giw_s), np.array(sigma_iw), np.array(ekin) / 4, np.array(epot) / 4, w_n


# calculating multiple regions
fac = np.arctan(.55 * np.sqrt(3) / .15)
udelta = np.tan(np.linspace(-fac, fac, 121)) * .15 / np.sqrt(3)
dudelta = np.diff(udelta)
bet_uc = [(18, 3.312),
          (19, 3.258),
          (20, 3.214),
          (20.5, 3.193),
          (21, 3.17),
          (21.5, 3.1467),
          (21.7, 3.138)]

data = []
for beta, uc in bet_uc:
    urange = udelta + uc + .07
    giw_s, sigma_iw, ekin, epot, w_n = loop_u_tp(
        urange, .3 * np.ones_like(urange), beta, 'met')
    data.append(2 * epot / 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=r'$\beta={}$'.format(beta))

plt.plot([uc for _, uc in bet_uc], d_c, 'o')

plt.gca().set_color_cycle(None)
for dd, (beta, uc) in zip(data, bet_uc):
    chi = np.diff(dd) / dudelta
    plt.plot(uc + udelta[:-1], chi / np.min(chi) * .035, ':')

plt.title(r'Double occupation')
plt.ylabel(r'$\langle n_\uparrow n_\downarrow \rangle$')
plt.xlabel(r'$U/D$')
plt.legend()
plt.savefig("dimer_tp0.3_docc.pdf",
            transparent=False, bbox_inches='tight', pad_inches=0.05)

# effective scaling
# cubic + linear over constant + linear


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


plt.figure()
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 = [10, 30, 35, 42, 45, 48, 50]
fits = []
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, -3, 3, 1])
    fits.append((popt, pcov))
    ft = fit_cube_lin(rd, *popt)
    plt.plot(ft, rd, label=r'$\beta={}$'.format(beta))
    plt.plot(ft[bound:-bound], rd[bound:-bound], "k+")
    print(popt)

plt.xlim([-.08, .08])
plt.ylim([-.007, .01])

plt.title(r'Reduced Double occupation fitted to theory')
plt.ylabel(r'$\eta$')
plt.xlabel(r'$U-U_c$')
plt.legend()
plt.savefig("dimer_tp0.3_eta_landau.pdf",
            transparent=False, bbox_inches='tight', pad_inches=0.05)

Total running time of the script: ( 1 minutes 17.737 seconds)

Generated by Sphinx-Gallery