How to obtain a more accurate charge-pumping in tenpy

How do I use this algorithm? What does that parameter do?
Post Reply
kevln
Posts: 18
Joined: 12 May 2022, 07:02

How to obtain a more accurate charge-pumping in tenpy

Post by kevln »

Hi, Johannes,

I am working on a complex model where the theoretical slope of the charge pumping should be 2. I have written what I believe to be the correct code, but I am encountering some issues. The parameters I am using to calculate the charge-pump are as follows: I am taking 21 and 31 points within a 2*pi period.

Code: Select all

    dmrg_params = {
        'mixer': True,  # setting this to True helps to escape local minima
        'mixer_params': {
            'amplitude': 1.e-5,
            'decay': 1.2,
            'disable_after': 4
        },
        'trunc_params': {
            'svd_min': 1.e-10
            #'chi_max': 7000
        },
        'chi_list': {
            0: 80,
            4: 100,
            8: 200,
            12: 400,
            16: 800,
            20: 1000,
            24: 2000,
        },
        'max_E_err': 1.e-9,
        'max_S_err': 1.e-6,
        'norm_tol': 1.e-6,
        'max_sweeps': 80,
        #'max_sweeps': 46,
        'N_sweeps_check': 2,
        'update_env':20,
    }
Through scanning and calculation, I have found that the slope is a straight line, but the slope is around 1.6 instead of 2. Upon observing the output of the scan, I noticed the following problem:

When I take 21 points and 31 points, when I calculate the slope only for the first two points, the slope is around 1.73 for a 21-point period and around 1.82-1.88 for a 31-point period. This is obviously much better than the 1.6 slope obtained after one full period. However, as soon as the third and fourth points come out, the slope immediately drops significantly to around 1.6. By observing the contents of the output, it can be seen that although I specified a maximum scan of 80 times, the corresponding scan counts for each point in the charge-pump are 70, 60, 60, 50, 50, 40, etc. Does this mean that in the process of computing the charge-pump, except for the first point due to the use of mixer+chi_list, the subsequent points are likely to fall into a local minimum?

I have previously tried another charge_pump model where the theoretical slope should also be 1/3. Initially, the slope was -0.28, but by adjusting the bond size of chi_list to a larger value (600-1000) and increasing the update_env(2-10-20), I eventually obtained a better slope of -0.304.

Regarding my specific questions above, is it possible to adjust certain parameters to obtain a more accurate charge-pump that matches the expected value?
User avatar
Johannes
Site Admin
Posts: 428
Joined: 21 Jul 2018, 12:52
Location: TU Munich

Re: How to obtain a more accurate charge-pumping in tenpy

Post by Johannes »

The chi_list forces DMRG to project to small bond dimension initially and the increase chi as specified with increasing number of sweeps. The idea is to gradually get close to the true ground state.

When doing the charge pump, you want to adiabatically follow the ground state with as little change as possible, so you assume you already are close to the ground state from the previous step, and just twist it a little to follow the parameter changes in H - so you don't want to project down to small chi, which can get you far away from the ground state.
So you can use a chi_list for the initial DMRG run getting the first ground state - but then don't use a chi_list anymore for the charge pump sweep!
Post Reply