From 42dab0ae7a875593f97d17a7c2d52a1b1c5a5c75 Mon Sep 17 00:00:00 2001 From: Pauli Virtanen <pauli.t.virtanen@jyu.fi> Date: Wed, 21 Sep 2022 14:59:36 +0300 Subject: [PATCH] examples: add initial cpr_sns --- examples/cpr_sns.py | 96 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 examples/cpr_sns.py diff --git a/examples/cpr_sns.py b/examples/cpr_sns.py new file mode 100644 index 0000000..371a2ce --- /dev/null +++ b/examples/cpr_sns.py @@ -0,0 +1,96 @@ +# -*- coding:utf-8; eval: (blacken-mode) -*- +""" +Calculate anomalous current in bulk case +""" +import joblib +import numpy as np +from numpy import pi +import matplotlib.pyplot as plt +from scipy.linalg import expm +import logging +import contextlib + +import usadelndsoc +from usadelndsoc.matsubara import get_matsubara_sum +from usadelndsoc.solver import * +from usadelndsoc.util import vectorize_parallel + +mem = joblib.Memory("cache") + + +def get_solver(soc_alpha, eta, phi, L=10, h=0.5, D=1.0, n=5): + sol = Solver(nx=n, ny=n) + sol.mask[...] = MASK_NONE + sol.Lx = L + sol.Ly = L + + sol.Omega[...] = 0 + sol.Delta[0, :] = np.eye(2) * np.exp(1j * phi / 2) + sol.Delta[-1, :] = np.eye(2) * np.exp(-1j * phi / 2) + + sol.mask[0, :] = MASK_TERMINAL + sol.mask[-1, :] = MASK_TERMINAL + + sol.D = D + sol.eta = eta + + nx, ny = sol.shape + dx = sol.Lx / nx + dy = sol.Ly / ny + + Ax = 2 * soc_alpha * np.kron(S_0, S_y) + Ay = -2 * soc_alpha * np.kron(S_0, S_x) + + sol.Ux[...] = expm(1j * dx * Ax) + sol.Uy[...] = expm(1j * dy * Ay) + + sol.Omega[...] += h * np.kron(S_z, S_y) + + return sol + + +# @usadelndsoc.with_log_level(logging.WARNING) +@vectorize_parallel(returns_object=True, noarray=True) +def j(T, h, phi, n=15, eta=0.1, alpha_soc=0.1, L=10, perturbative=False): + sol = get_solver(soc_alpha=alpha_soc, eta=eta, L=L, n=n, phi=phi, h=h) + + E_typical = 10 + 10 * T + w, a = get_matsubara_sum(T, E_typical) + + t3 = np.kron(S_z, S_0) + res = sol.solve_many(omega=w) + + t3 = np.diag([1, 1, -1, -1]) + J = tr(res.J @ t3) * (-1 / 16) + J = -1j * pi * (J * a[:, None, None, None]).sum(axis=0) + + Jx = (J[:, :, 0] + J[:, :, 2]).real / 2 + Jy = (J[:, :, 1] + J[:, :, 3]).real / 2 + + return sol.x, sol.y, J, Jx, Jy + + +def main(): + T = 0.02 + alpha_soc = 0.05 + Da2 = alpha_soc**2 + h = np.linspace(0, 1.75, 29) + + res = j_anom(T, h, alpha_soc=alpha_soc, perturbative=False, mem=mem) + j = np.asarray([x[0] for x in res]) + j_an = np.asarray([x[1] for x in res]) + + t3 = np.diag([1, 1, -1, -1]) + j = tr(j @ t3)[:, 2, 2, UP] + + plt.plot(h, -j.real, "-", label=r"numerics") + plt.plot(h, -j_an.real, "--", label=r"analytic") + plt.title(rf"$T = {T} \Delta$, $D\alpha^2 = {Da2:.4} \Delta$") + plt.xlabel(r"$h/\Delta$") + plt.ylabel(r"$j_{\mathrm{an}}$") + plt.legend() + plt.savefig("bulk_j_an.pdf") + + +if __name__ == "__main__": + main() -- GitLab