diff --git a/codes/mf.py b/codes/mf.py index d293463eb001a6e5934882b480a82fc6afe20d3e..4b81464d3b84fee2a048b9fc42a411159c9559dc 100644 --- a/codes/mf.py +++ b/codes/mf.py @@ -1,6 +1,7 @@ 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. @@ -111,21 +112,32 @@ def fermiOnGrid(hkfunc, filling, nK=100, ndim=1): # need to extend to 2D fermi = (vals_flat[ifermi - 1] + vals_flat[ifermi]) / 2 return fermi + def meanFieldFFTkvector(densityMatrixTb, h_int, n=2): localKey = tuple(np.zeros((n,), dtype=int)) direct = { - localKey: np.diag( - np.einsum("pp,pn->n", densityMatrixTb[*localKey, :], h_int[localKey]) + 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, :] + 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): """ Compute the mean-field in k-space. @@ -162,4 +174,4 @@ def meanField(densityMatrix, int_model, n=2, nK=100): vec: -1 * int_model.get(vec, 0) * densityMatrix[vec] # / (2 * np.pi)#**2 for vec in frozenset(int_model) } - return addTb(direct, exchange) \ No newline at end of file + return addTb(direct, exchange) diff --git a/codes/model.py b/codes/model.py index 48b92b55bdecf3be746dc2601670ea2512743f9a..de0b5c170b59ea48d0aa1a85578cc9bcd3956e54 100644 --- a/codes/model.py +++ b/codes/model.py @@ -1,5 +1,6 @@ +# %% from codes.tb.tb import addTb -from codes.tb.transforms import tb2kfunc, tb2kham, kdens2tbFFT, kfunc2tb +from codes.tb.transforms import tb2kfunc, tb2kham, kdens2tbFFT, kfunc2tb, ifftn2tb from codes.mf import ( densityMatrixGenerator, densityMatrix, @@ -43,13 +44,6 @@ class Model: densityMatrixGenerator(self.hkfunc, self.EF), nSamples=nK, ndim=self._ndim ) - # def mfield(self, mf_model): - # self.densityMatrix = self.makeDensityMatrix(mf_model) - # return addTb( - # meanFieldQuad(self.densityMatrix, self.int_model), - # {self._localKey: -self.EF * np.eye(self._size)}, - # ) - def mfield(self, mf_model, nK=200): self.densityMatrix = self.makeDensityMatrix(mf_model, nK=nK) return addTb( @@ -68,8 +62,11 @@ class Model: def mfieldFFTkvector(self, mf_model, nK=200): densityMatrix = self.makeDensityMatrixkvector(mf_model, nK=nK) - densityMatrixTb = kdens2tbFFT(densityMatrix, self._ndim) + densityMatrixTb = ifftn2tb(kdens2tbFFT(densityMatrix, self._ndim)) return addTb( meanFieldFFTkvector(densityMatrixTb, self.h_int, n=self._ndim), {self._localKey: -self.EF * np.eye(self._size)}, ) + + +# %% diff --git a/codes/tb/transforms.py b/codes/tb/transforms.py index 9f9f93e30a09d3b7516a682b6f07ebd84dce8436..45c1abc16ed4db323668a934993645f4e9fdfd64 100644 --- a/codes/tb/transforms.py +++ b/codes/tb/transforms.py @@ -135,5 +135,6 @@ def kfunc2tb(kfunc, nSamples, ndim=1): ifftnArray = ifftn(kfuncOnGrid, axes=np.arange(ndim)) return ifftn2tb(ifftnArray) + def kdens2tbFFT(kdens, ndim=1): - return ifftn(kdens, axes=np.arange(ndim)) \ No newline at end of file + return ifftn(kdens, axes=np.arange(ndim))