Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
FIX: bandwidth scaling (cfr. 81bd520)
HISTORY Working on the lattices feature branch we found a severe problem in the code, namely that changing both U and D maintaining U/D fixed, DOES change the results (which of course makes no sense). - Initially I assumed to have introduced the bug myself, while working on the generic-dos extension. But the problems was still present if the Bethe lattice was selected. - So I turned to the +plot module (cfr. a32d24a), haunting for some silly error. No, the results *really* changed varying U and D together. - Then I feared to have forgotten something important in the SOPT solver (the only place where U really enters and suspiciously D is totally absent). But no, it was fine.† - At this point it was clear that the problem has been living unnoticed since the far past: in fact, it can be reproduced in the original notebook by Najera... BOOM! So here I fix the notebook itself. > Maybe I should avoid doing this... isn't it meant to be a *static* resource? But what about future confusion if we diverge in such a core functionality. Also I may want the notebook to be useful to cloners, so yes, let's change it and make it clear somewhere in the markdown files: I could even "complete" it, by coding the exercises. :) --------------------------- THE PROBLEM AND THE FIX Najera had D=1 hardcoded in the <semi_circle_hiltrans()> function, so everything worked for itself. But if you make D actually a variable everything breaks, as in the Matlab code, for it is hardcoded also in another, somewhat hidden, place: a goddamn magic number! g0 = 1 / (w + eta - .25 * gloc) which, for D=1, would stand for g0 = 1 / (w + eta - t**2 * gloc) since for the Bethe lattice we have t = D/2 So we can fix the D ≠ 1 case by just changing it to g0 = 1 / (w + eta - .25 * D**2 * gloc) - The same thing has been done in the dmft_loop() Matlab function. - The solution has been extensively tested in both Matlab's and Najera's code and it solves indeed the problem. - A more general, lattice agnostic, solution has been implemented in the 'lattices' feature branch, where it is relevant. It will be merged here after the 'Bethe-only' version of the code is released, together with all the 'generic-lattices' material. > Cfr. 81bd520 --------------------------- FURTHER NOTES †I want to comment extensively on this, for I feel today I learned something new... or at least improved my comprehension of the matter. I thought that the problem was that the second order diagram was proportional to U^2 instead of (U/D)^2. Afterall, perturbation theory is expected to come as an expansion on a small parameter and the proper small parameter here is indeed U/D or U/t, for sure not just U. Nevertheless I checked again the ref. by Haule and it was written as U^2. Hence I thought a lot about the issue and finally realized that the 1/D^2 factor is already included in the diagram itself, for it comes from two nested convolutions of a spectral function, which values are indeed normalized depending on its support, i.e. D. If you increase D you decrease by D each value and so the result of the convolutions.
- Loading branch information