示例#1
0
文件: misc.py 项目: tenpy/tenpy
def build_initial_state(size, states, filling, mode='random', seed=None):
    warnings.warn(
        "Deprecated `build_initial_state`: Use `tenpy.networks.mps.InitialStateBuilder` instead.",
        category=FutureWarning,
        stacklevel=2)
    from tenpy.networks import mps
    return mps.build_initial_state(size, states, filling, mode, seed)
示例#2
0
def random_list(length,upfilling,dnfilling):
    """this function generates random occupations for an initial state
    of the requested length 
       with densities of upfilling, dnfilling for the up and down spins,
       respectively
       A corresponding product state MPS is returned."""
    uplist = build_initial_state(size=length,states=(0,1),filling=(1-upfilling,upfilling))
    dnlist = build_initial_state(size=length,states=(0,1),filling=(1-dnfilling,dnfilling))
    prod=[]
    for i in range(length):
        if (uplist[i]==0 and dnlist[i]==0):
            prod.append("empty")
        elif (uplist[i]==1 and dnlist[i]==0):
            prod.append("up")
        elif (uplist[i]==0 and dnlist[i]==1):
            prod.append("down")
        elif (uplist[i]==1 and dnlist[i]==1):
            prod.append("full")
    return prod
示例#3
0
def dmrg_wrapper(model_par,
                 sim_par,
                 run_par,
                 args,
                 psi=None,
                 sim_filename=None,
                 reload_sim=False):
    """Run DMRG ("Walk this way...").

    Args:
        model_par (dict): Model parameters
        args (Namespace): All command line options
        psi (MPS, optional): Initial state. If None, random state is iinitialized based on model_par and args.

    Returns:
        psi (MPS): Ground state
        out (dict): DMRG output
        num_ini (array): Density profile for the initial state
        M (model): model

    """
    print("chi's in use:", sim_par['CHI_LIST'])
    print("minimum no. of sweeps:", sim_par['MIN_STEPS'])
    print('dmrg_wrapper has bc={}'.format(model_par['bc_MPS']))

    # Check if there is already a data file from a finished run
    try:
        with open('fh_dmrg_' + sim_par['identifier'] + '.dat', 'rb') as f:
            a = pickle.load(f)
        if data['out']['shelve_flag']:
            print("Simulation was shelved. Restarting soon.")
        else:
            print("Finished data file found. Skipping.")
            print('Check for {skip:True}')
            return None, {
                'skip': True
            }, None, None, None  # Not very clean but haven't found anything better
    except IOError:
        print("No data file found. Starting new sim.")
        pass

    if reload_sim:
        with open(sim_filename + '.sim', 'rb') as f:
            save_sim = pickle.load(f)
        sim_par[
            'STARTING_ENV_FROM_PSI'] = 0  # Make sure to use old environments.
        sim_par['CHI_LIST'] = {
            0: max(sim_par['CHI_LIST'].values())
        }  # Assume saved sim had reached max chi.
        sim_par['MIN_STEPS'] = 20
        sim_par['LP'] = save_sim['LP']
        sim_par['RP'] = save_sim['RP']
        psi = save_sim['psi']
        M = save_sim['M']
        num_ini = save_sim['num_ini']
        initial_state = save_sim['initial_state']
    else:
        M = mod.HofstadterFermions(model_par)
        initial_state = build_initial_state(
            M.lat.N_sites, (0, 1),
            (1 - run_par['filling'], run_par['filling']),
            mode='random',
            seed=args.seed)
        if psi == None:
            print("Generating new psi.")
            #L = model_par['Lx'] * model_par['Ly']
            # upfilling, dnfilling = get_filling(run_par, L)
            # prod = random_list(L, upfilling, dnfilling)
            psi = MPS.from_product_state(M.lat.mps_sites(),
                                         initial_state,
                                         bc=model_par['bc_MPS'])
        else:
            print("Using user-specified psi.")
        num_ini = psi.expectation_value('N')
        print('Initial density profile:', num_ini)
    t0 = time.time()
    print("Starting DMRG...")
    out = dmrg.run(psi, M, sim_par)
    print("DMRG took {} seconds.".format(time.time() - t0))
    out['time'] = time.time() - t0

    # sim = simulation.simulation(psi, M)

    # sim.dmrg_par = sim_par
    # sim.ground_state()
    # out = sim.sim_stats[-1]

    # if out['shelve_flag']:  # DMRG did not end before time ran out; save sim to disk
    #     save_sim = {
    #         'LP': out['LP'],
    #         'RP': out['RP'],
    #         'psi': psi,
    #         'M': M,
    #         'num_ini': num_ini,
    #         'initial_state': initial_state,
    #         'model_par': model_par,
    #         'sim_par': sim_par,
    #     }
    #     with open('fh_dmrg_' + identifier + '.sim', 'wb') as f:
    #         pickle.dump(save_sim, f)

    out['skip'] = False

    return psi, out, num_ini, M, initial_state