Skip to content
Snippets Groups Projects
model.py 1.40 KiB
import numpy as np

from pymf.mf import (
    density_matrix,
    meanfield,
)
from pymf.tb.tb import add_tb


class Model:
    def __init__(self, h_0, h_int, filling):
        self.h_0 = h_0
        self.h_int = h_int
        self.filling = filling

        _first_key = list(h_0)[0]
        self._ndim = len(_first_key)
        self._size = h_0[_first_key].shape[0]
        self._local_key = tuple(np.zeros((self._ndim,), dtype=int))

        def _check_hermiticity(h):
            for vector in h.keys():
                op_vector = tuple(-1 * np.array(vector))
                op_vector = tuple(-1 * np.array(vector))
                if not np.allclose(h[vector], h[op_vector].conj().T):
                    raise ValueError("Hamiltonian is not Hermitian.")

        _check_hermiticity(h_0)
        _check_hermiticity(h_int)

    def mfield(self, mf_tb, nk=200):  # method or standalone?
        """Compute single mean field iteration.

        Parameters
        ----------
        mf_tb : dict
            Mean-field tight-binding model.
        nk : int
            Number of k-points in the grid.

        Returns
        -------
        dict
            New mean-field tight-binding model.
        """
        rho, fermi_energy = density_matrix(add_tb(self.h_0, mf_tb), self.filling, nk)
        return add_tb(
            meanfield(rho, self.h_int),
            {self._local_key: -fermi_energy * np.eye(self._size)},
        )