From 3a22cd6df30d4bf0ea53b95068c1878b9d21c244 Mon Sep 17 00:00:00 2001
From: Johanna <johanna@zijderveld.de>
Date: Thu, 11 Apr 2024 22:41:36 +0200
Subject: [PATCH] remove old functions and remove kvector ending on new
 functions

---
 codes/mf.py            | 96 ++++--------------------------------------
 codes/model.py         | 37 ++++------------
 codes/solvers.py       | 60 +-------------------------
 codes/test_graphene.py |  6 +--
 4 files changed, 19 insertions(+), 180 deletions(-)

diff --git a/codes/mf.py b/codes/mf.py
index 4b81464..6ae70ed 100644
--- a/codes/mf.py
+++ b/codes/mf.py
@@ -2,36 +2,6 @@ import numpy as np
 from codes.tb.tb import addTb
 
 
-def densityMatrixGenerator(hkfunc, E_F):
-    """
-    Generate a function that returns the density matrix at a given k-point.
-
-    Parameters
-    ----------
-    hkfunc : function
-        Function that return Hamiltonian at a given k-point.
-    E_F : float
-        Fermi level
-
-    Returns
-    -------
-    densityMatrixFunc : function
-        Returns a density matrix at a given k-point (kx, kx, ...)
-    """
-
-    def densityMatrixFunc(k):
-        hk = hkfunc(k)
-        vals, vecs = np.linalg.eigh(hk)
-        unocc_vals = vals > E_F
-        occ_vecs = vecs
-        occ_vecs[:, unocc_vals] = 0
-
-        # Outter products between eigenvectors
-        return occ_vecs @ occ_vecs.T.conj()
-
-    return densityMatrixFunc
-
-
 def densityMatrix(kham, E_F):
     """
     Parameters
@@ -56,24 +26,7 @@ def densityMatrix(kham, E_F):
     return densityMatrixKgrid
 
 
-def fermiOnGridkvector(kham, filling):
-
-    vals = np.linalg.eigvalsh(kham)
-
-    norbs = vals.shape[-1]
-    vals_flat = np.sort(vals.flatten())
-    ne = len(vals_flat)
-    ifermi = int(round(ne * filling / norbs))
-    if ifermi >= ne:
-        return vals_flat[-1]
-    elif ifermi == 0:
-        return vals_flat[0]
-    else:
-        fermi = (vals_flat[ifermi - 1] + vals_flat[ifermi]) / 2
-        return fermi
-
-
-def fermiOnGrid(hkfunc, filling, nK=100, ndim=1):  # need to extend to 2D
+def fermiOnGrid(kham, filling):
     """
     Compute the Fermi energy on a grid of k-points.
 
@@ -88,17 +41,8 @@ def fermiOnGrid(hkfunc, filling, nK=100, ndim=1):  # need to extend to 2D
     E_F : float
         Fermi energy
     """
-    ks = np.linspace(-np.pi, np.pi, nK, endpoint=False)
-    if ndim == 1:
-        hkarray = np.array([hkfunc(k) for k in ks])
-    if ndim == 2:
-        hkarray = np.array([[hkfunc((kx, ky)) for kx in ks] for ky in ks])
-    elif ndim > 2:
-        raise NotImplementedError(
-            "Fermi energy calculation is not implemented for ndim > 2"
-        )
 
-    vals = np.linalg.eigvalsh(hkarray)
+    vals = np.linalg.eigvalsh(kham)
 
     norbs = vals.shape[-1]
     vals_flat = np.sort(vals.flatten())
@@ -113,32 +57,7 @@ def fermiOnGrid(hkfunc, filling, nK=100, ndim=1):  # need to extend to 2D
         return fermi
 
 
-def meanFieldFFTkvector(densityMatrixTb, h_int, n=2):
-
-    localKey = tuple(np.zeros((n,), dtype=int))
-
-    direct = {
-        localKey: np.sum(
-            np.array(
-                [
-                    np.diag(
-                        np.einsum("pp,pn->n", densityMatrixTb[localKey], h_int[vec])
-                    )
-                    for vec in frozenset(h_int)
-                ]
-            ),
-            axis=0,
-        )
-    }
-
-    exchange = {
-        vec: -1 * h_int.get(vec, 0) * densityMatrixTb[vec]  # / (2 * np.pi)#**2
-        for vec in frozenset(h_int)
-    }
-    return addTb(direct, exchange)
-
-
-def meanField(densityMatrix, int_model, n=2, nK=100):
+def meanField(densityMatrixTb, h_int, n=2):
     """
     Compute the mean-field in k-space.
 
@@ -154,6 +73,7 @@ def meanField(densityMatrix, int_model, n=2, nK=100):
     dict
         Mean-field tb model.
     """
+
     localKey = tuple(np.zeros((n,), dtype=int))
 
     direct = {
@@ -161,9 +81,9 @@ def meanField(densityMatrix, int_model, n=2, nK=100):
             np.array(
                 [
                     np.diag(
-                        np.einsum("pp,pn->n", densityMatrix[localKey], int_model[vec])
+                        np.einsum("pp,pn->n", densityMatrixTb[localKey], h_int[vec])
                     )
-                    for vec in frozenset(int_model)
+                    for vec in frozenset(h_int)
                 ]
             ),
             axis=0,
@@ -171,7 +91,7 @@ def meanField(densityMatrix, int_model, n=2, nK=100):
     }
 
     exchange = {
-        vec: -1 * int_model.get(vec, 0) * densityMatrix[vec]  # / (2 * np.pi)#**2
-        for vec in frozenset(int_model)
+        vec: -1 * h_int.get(vec, 0) * densityMatrixTb[vec]  # / (2 * np.pi)#**2
+        for vec in frozenset(h_int)
     }
     return addTb(direct, exchange)
diff --git a/codes/model.py b/codes/model.py
index de0b5c1..cad2a5b 100644
--- a/codes/model.py
+++ b/codes/model.py
@@ -1,13 +1,10 @@
 # %%
 from codes.tb.tb import addTb
-from codes.tb.transforms import tb2kfunc, tb2kham, kdens2tbFFT, kfunc2tb, ifftn2tb
+from codes.tb.transforms import tb2kham, kdens2tbFFT, ifftn2tb
 from codes.mf import (
-    densityMatrixGenerator,
     densityMatrix,
-    fermiOnGridkvector,
-    meanFieldFFTkvector,
-    meanField,
     fermiOnGrid,
+    meanField,
 )
 import numpy as np
 
@@ -34,37 +31,19 @@ class Model:
         _check_hermiticity(h_0)
         _check_hermiticity(h_int)
 
-    def calculateEF(self, nK=200):
-        self.EF = fermiOnGrid(self.hkfunc, self.filling, nK=nK, ndim=self._ndim)
+    def calculateEF(self):
+        self.EF = fermiOnGrid(self.kham, self.filling)
 
     def makeDensityMatrix(self, mf_model, nK=200):
-        self.hkfunc = tb2kfunc(addTb(self.h_0, mf_model))
-        self.calculateEF(nK=nK)
-        return kfunc2tb(
-            densityMatrixGenerator(self.hkfunc, self.EF), nSamples=nK, ndim=self._ndim
-        )
-
-    def mfield(self, mf_model, nK=200):
-        self.densityMatrix = self.makeDensityMatrix(mf_model, nK=nK)
-        return addTb(
-            meanField(self.densityMatrix, self.h_int, n=self._ndim, nK=nK),
-            {self._localKey: -self.EF * np.eye(self._size)},
-        )
-
-    #######################
-    def calculateEFkvector(self):
-        self.EF = fermiOnGridkvector(self.kham, self.filling)
-
-    def makeDensityMatrixkvector(self, mf_model, nK=200):
         self.kham = tb2kham(addTb(self.h_0, mf_model), nK=nK, ndim=self._ndim)
-        self.calculateEFkvector()
+        self.calculateEF()
         return densityMatrix(self.kham, self.EF)
 
-    def mfieldFFTkvector(self, mf_model, nK=200):
-        densityMatrix = self.makeDensityMatrixkvector(mf_model, nK=nK)
+    def mfield(self, mf_model, nK=200):
+        densityMatrix = self.makeDensityMatrix(mf_model, nK=nK)
         densityMatrixTb = ifftn2tb(kdens2tbFFT(densityMatrix, self._ndim))
         return addTb(
-            meanFieldFFTkvector(densityMatrixTb, self.h_int, n=self._ndim),
+            meanField(densityMatrixTb, self.h_int, n=self._ndim),
             {self._localKey: -self.EF * np.eye(self._size)},
         )
 
diff --git a/codes/solvers.py b/codes/solvers.py
index 9de9afb..c0acf56 100644
--- a/codes/solvers.py
+++ b/codes/solvers.py
@@ -27,28 +27,6 @@ def cost(mf_param, Model, nK=100):
     return mf_params_new - mf_param
 
 
-def costkvector(mf_param, Model, nK=100):
-    """
-    Define the cost function for fixed point iteration.
-    The cost function is the difference between the input mean-field real space parametrisation
-    and a new mean-field.
-
-    Parameters
-    ----------
-    mf_param : numpy.array
-        The mean-field real space parametrisation.
-    Model : Model
-        The model object.
-    nK : int, optional
-        The number of k-points to use in the grid. The default is 100.
-    """
-    shape = Model._size
-    mf_tb = rParams2mf(mf_param, list(Model.h_int), shape)
-    mf_tb_new = Model.mfieldFFTkvector(mf_tb, nK=nK)
-    mf_params_new = mf2rParams(mf_tb_new)
-    return mf_params_new - mf_param
-
-
 def solver(
     Model, mf_guess, nK=100, optimizer=scipy.optimize.anderson, optimizer_kwargs={}
 ):
@@ -80,42 +58,6 @@ def solver(
     result = rParams2mf(
         optimizer(f, mf_params, **optimizer_kwargs), list(Model.h_int), shape
     )
-    Model.calculateEF(nK=nK)
-    localKey = tuple(np.zeros((Model._ndim,), dtype=int))
-    return addTb(result, {localKey: -Model.EF * np.eye(shape)})
-
-
-def solverkvector(
-    Model, mf_guess, nK=100, optimizer=scipy.optimize.anderson, optimizer_kwargs={}
-):
-    """
-    Solve the mean-field self-consistent equation.
-
-    Parameters
-    ----------
-    Model : Model
-        The model object.
-    mf_guess : numpy.array
-        The initial guess for the mean-field tight-binding model.
-    nK : int, optional
-        The number of k-points to use in the grid. The default is 100.
-    optimizer : scipy.optimize, optional
-        The optimizer to use to solve for fixed-points. The default is scipy.optimize.anderson.
-    optimizer_kwargs : dict, optional
-        The keyword arguments to pass to the optimizer. The default is {}.
-
-    Returns
-    -------
-    result : numpy.array
-        The mean-field tight-binding model.
-    """
-
-    shape = Model._size
-    mf_params = mf2rParams(mf_guess)
-    f = partial(costkvector, Model=Model, nK=nK)
-    result = rParams2mf(
-        optimizer(f, mf_params, **optimizer_kwargs), list(Model.h_int), shape
-    )
-    Model.calculateEFkvector()
+    Model.calculateEF()
     localKey = tuple(np.zeros((Model._ndim,), dtype=int))
     return addTb(result, {localKey: -Model.EF * np.eye(shape)})
diff --git a/codes/test_graphene.py b/codes/test_graphene.py
index dc6da60..9dbf414 100644
--- a/codes/test_graphene.py
+++ b/codes/test_graphene.py
@@ -1,7 +1,7 @@
 # %%
 import numpy as np
 from codes.model import Model
-from codes.solvers import solverkvector
+from codes.solvers import solver
 from codes import kwant_examples
 from codes.kwant_helper import utils
 from codes.tb.utils import compute_gap
@@ -49,9 +49,7 @@ def gap_prediction(U, V):
     guess = utils.generate_guess(frozenset(h_int), len(list(h_0.values())[0]))
     model = Model(h_0, h_int, filling)
 
-    mf_sol = solverkvector(
-        model, guess, nK=nK, optimizer_kwargs={"verbose": True, "M": 0}
-    )
+    mf_sol = solver(model, guess, nK=nK, optimizer_kwargs={"verbose": True, "M": 0})
     gap = compute_gap(addTb(h_0, mf_sol), n=100)
 
     # Check if the gap is predicted correctly
-- 
GitLab