-
Kostas Vilkelis authoredKostas Vilkelis authored
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)},
)