예제 #1
0
 def __init__(self, brlu, ltris, ladjs, mpinfo, mlpats, \
     mdisp, mdispgd, ksft, lamb0, find_mode):
     self._brlu = brlu
     self._ltris = ltris
     self._nps = numpy.sqrt(len(ltris)) / 2
     self._bandnum = len(mpinfo)
     self._ladjs = ladjs
     self._mpinfo = mpinfo
     self._mlpats = mlpats
     self._mdisp = mdisp
     self._mdispgd = mdispgd
     self._ksft = ksft
     self._lamb0 = lamb0
     self._patchnum = len(self._mpinfo[0])
     #找到每个对应的n4
     #现在每个带都有自己的idx4
     if find_mode == 1:
         data_list = []
         idxit = numpy.nditer(U, flags=['multi_index'])
         step = numpy.minimum(brlu.width, brlu.height) / 10 / self._nps
         while not idxit.finished:
             bd1, bd2, bd3, bd4, idx1, idx2, idx3 = idxit.multi_index
             kv1, kv2, kv3 = mpinfo[bd1, idx1], mpinfo[bd2,
                                                       idx2], mpinfo[bd3,
                                                                     idx3]
             kv4 = ksft(ksft(kv1, kv2),
                        Point(-kv3.coord[0], -kv3.coord[1], 1))
             data_list.append(
                 (kv4, mpinfo[bd4, :], mdisp[bd4], mdispgd[bd4], step))
             #idx4 = find_patch(kv4, mpinfo[bd4, :], mdisp[bd4],\
             #    mdispgd[bd4], numpy.pi / 2 / self._nps)
             #self._mk4tab[idxit.multi_index] = idx4
             idxit.iternext()
         with multiprocessing.Pool(get_procs_num()) as pool:
             self._mk4tab = pool.starmap(find_patch, data_list)
         self._mk4tab = numpy.reshape(self._mk4tab, U.shape)
         return
     data_list = []
     idxit = numpy.nditer(U, flags=['multi_index'])
     while not idxit.finished:
         bd1, bd2, bd3, bd4, idx1, idx2, idx3 = idxit.multi_index
         kv1, kv2, kv3 = mpinfo[bd1, idx1], mpinfo[bd2, idx2], mpinfo[bd3,
                                                                      idx3]
         kv4 = ksft(ksft(kv1, kv2), Point(-kv3.coord[0], -kv3.coord[1], 1))
         data_list.append((kv4, mpinfo[bd4, :]))
         idxit.iternext()
     find_func = {2: find_patch_mode2, 3: find_patch_mode3}[find_mode]
     with multiprocessing.Pool(get_procs_num()) as pool:
         self._mk4tab = pool.starmap(find_func, data_list)
     self._mk4tab = numpy.reshape(self._mk4tab, U.shape)
예제 #2
0
파일: solution.py 프로젝트: maryprimary/frg
def slove_equ(args, brlu, ltris, ladjs, mpinfo, mlpats):
    '''解方程'''
    #初始化U
    uval = numpy.zeros((1, 1, 1, 1, args.patches, args.patches, args.patches))
    uval[0, 0, 0, 0, :, :, :] += band_u(6.0, mpinfo[0])
    uval[0, 0, 0, 0, :, :, :] += band_v(6.0, mpinfo[0])
    #初始化hubbard
    hubbard.uinit(uval, args.patches, 1)
    lamb0 = 2.0
    print('lamb0 = ', lamb0)
    hubbard.config_init(brlu,
                        ltris,
                        ladjs,
                        mpinfo,
                        mlpats, [p_disp], [None],
                        shift_kv,
                        lamb0,
                        find_mode=3)
    #输出文件夹
    if not os.path.isdir('heatmap8'):
        os.mkdir('heatmap8')
    rpath = 'heatmap8/kagome4'
    if not os.path.isdir(rpath):
        os.mkdir(rpath)
    lval = 0.
    lstep = 0.01
    numpy.save('{0}/{1:.2f}U.npy'.format(rpath, lval), hubbard.U)
    #读取配置
    #lval = 6.70
    #hubbard.U = numpy.load('{0}/{1:.2f}U.npy'.format(rpath, lval))
    for _ in range(1000):
        hubbard.precompute_contour(lval)
        hubbard.precompute_qpp(lval)
        hubbard.precompute_qfs(lval)
        hubbard.precompute_nqfs(lval)
        hubbard.precompute_qex(lval)
        hubbard.precompute_nqex(lval)
        #计算每个idx的导数
        data_list = []
        ndit = numpy.nditer(hubbard.U, flags=['multi_index'])
        while not ndit.finished:
            bd1, bd2, bd3, bd4, idx1, idx2, idx3 = ndit.multi_index
            data_list.append((lval, bd1, bd2, bd3, bd4, idx1, idx2, idx3))
            ndit.iternext()
        #进程池
        #KNOWN ISSUE: 在修改全局变量之间建立的Pool,里面不会包含全局变量
        with multiprocessing.Pool(get_procs_num()) as pool:
            result = pool.starmap(hubbard.dl_ec, data_list)
        duval = numpy.reshape(result, hubbard.U.shape)
        #把每个idx的值加上
        #这两个过程不能放在一起,因为计算dl_ec的时候用到了hubbard.U
        hubbard.U += duval * lstep
        lval += lstep
        #
        del data_list, result, duval
        #
        #uval2 = numpy.load('{0}/{1:.2f}U.chk'.format(rpath, 10.76))
        #if lval == 10.76:
        #    assert numpy.allclose(hubbard.U, uval2)
        numpy.save('{0}/{1:.2f}U.npy'.format(rpath, lval), hubbard.U)
예제 #3
0
def slove_equ(args, brlu, ltris, ladjs, pinfo, lpats):
    '''解方程'''
    disp = {'square': dispersion, 'hole': hole_disp}[args.disp]
    dispgd = {
        'square': dispersion_gradient,
        'hole': dispersion_gradient
    }[args.disp]
    #初始化U
    hubbard.uinit(1.0, args.patches)
    #初始化hubbard模型
    hubbard.config_init(brlu, ltris, ladjs, pinfo, lpats, disp, dispgd,
                        shift_kv, 4.0)
    #输出文件夹
    if not os.path.isdir('heatmap5'):
        os.mkdir('heatmap5')
    lval = 0.
    lstep = 0.01
    draw_heatmap(hubbard.U[:, :, 0], save='heatmap5/{:.2f}.jpg'.format(lval))
    for _ in range(320):
        #duval = numpy.zeros_like(hubbard.U)
        hubbard.precompute_contour(lval)
        hubbard.precompute_qpp(lval)
        hubbard.precompute_qfs(lval)
        hubbard.precompute_nqfs(lval)
        hubbard.precompute_qex(lval)
        hubbard.precompute_nqex(lval)
        #计算每个idx的导数
        data_list = []
        for idx1 in range(args.patches):
            for idx2 in range(args.patches):
                for idx3 in range(args.patches):
                    data_list.append((lval, idx1, idx2, idx3))
                    #duval[idx1, idx2, idx3] = hubbard.dl_ec(lval, idx1, idx2, idx3)
        #进程池
        #KNOWN ISSUE: 在修改全局变量之间建立的Pool,里面不会包含全局变量
        with multiprocessing.Pool(get_procs_num()) as pool:
            result = pool.starmap(hubbard.dl_ec, data_list)
        duval = numpy.reshape(result,
                              (args.patches, args.patches, args.patches))
        #把每个idx的值加上
        #这两个过程不能放在一起,因为计算dl_ec的时候用到了hubbard.U
        hubbard.U += duval * lstep
        lval += lstep
        draw_heatmap(hubbard.U[:, :, 0],
                     save='heatmap5/{:.2f}.jpg'.format(lval))
예제 #4
0
def precompute_qfs(lval):
    '''计算q_fs实际上也不需要多余的变量
    bd2, bd3, idx2, idx3
    '''
    global QUICKQFS
    #fs的所有自由度
    data_list = []
    place_holder = numpy.ndarray((  #alpha, beta, bd2, bd3
        CONFIG.bandnum,
        CONFIG.bandnum,
        CONFIG.bandnum,
        CONFIG.bandnum,
        #nidx(alpha), idx2(bd2), idx3(bd3)
        CONFIG.patchnum,
        CONFIG.patchnum,
        CONFIG.patchnum))
    nditer = numpy.nditer(place_holder, flags=['multi_index'])
    #
    area = CONFIG.brlu.width * CONFIG.brlu.height
    ltris = CONFIG.ltris
    tarea = area / len(ltris)
    mpinfo = CONFIG.mpinfo
    ksft = CONFIG.ksft
    lamb = CONFIG.lamb0 * numpy.exp(-lval)
    mdisp = CONFIG.mdisp
    #
    while not nditer.finished:
        alpha, beta, bd2, bd3, nidx, idx2, idx3 = nditer.multi_index
        kv2, kv3 = mpinfo[bd2, idx2], mpinfo[bd3, idx3]
        q_fs = ksft(kv3, Point(-kv2.coord[0], -kv2.coord[1], 1))
        data_list.append(
            (PATTRIS[alpha, nidx], tarea, lamb,\
                mdisp[alpha], mdisp[beta], q_fs, ksft, area)
        )
        nditer.iternext()
    #
    with multiprocessing.Pool(get_procs_num()) as pool:
        result = pool.starmap(pi_ab_plus_tf, data_list)
    QUICKQFS = (lval, numpy.reshape(result, place_holder.shape))
예제 #5
0
def precompute_qpp(lval):
    '''Pi^{-}实际上不需要7个指标,只需要
    bd1, idx1, bd2, idx2
    另外的alpha,beta,nidx在所有情况下都是需要遍历的,所以可以提前计算出来,节约计算时间
    '''
    global QUICKQPP
    data_list = []
    place_holder = numpy.ndarray((  #alpha, beta, bd1, bd2
        CONFIG.bandnum,
        CONFIG.bandnum,
        CONFIG.bandnum,
        CONFIG.bandnum,
        #nidx(alpha), idx1(bd1), idx2(bd2)
        CONFIG.patchnum,
        CONFIG.patchnum,
        CONFIG.patchnum))
    nditer = numpy.nditer(place_holder, flags=['multi_index'])
    #
    area = CONFIG.brlu.width * CONFIG.brlu.height
    ltris = CONFIG.ltris
    tarea = area / len(ltris)
    mpinfo = CONFIG.mpinfo
    ksft = CONFIG.ksft
    lamb = CONFIG.lamb0 * numpy.exp(-lval)
    mdisp = CONFIG.mdisp
    #
    while not nditer.finished:
        alpha, beta, bd1, bd2, nidx, idx1, idx2 = nditer.multi_index
        kv1, kv2 = mpinfo[bd1, idx1], mpinfo[bd2, idx2]
        q_pp = ksft(kv1, kv2)
        #
        data_list.append(
            (PATTRIS[alpha, nidx], tarea, lamb,\
                mdisp[alpha], mdisp[beta], q_pp, ksft, area)
        )
        nditer.iternext()
    with multiprocessing.Pool(get_procs_num()) as pool:
        result = pool.starmap(pi_ab_minus_tf, data_list)
    QUICKQPP = (lval, numpy.reshape(result, place_holder.shape))
예제 #6
0
def slove_equ(args, brlu, ltris, ladjs, mpinfo, mlpats):
    '''解方程'''
    #初始化U
    spats = mpinfo[0, :]
    ppats = mpinfo[1, :]
    hubbard.uinit(get_initu(spats, ppats, 2.0), args.patches, 2)
    #初始化hubbard模型
    lamb0 = get_max_val()
    print('lamb0 = ', lamb0)
    hubbard.config_init(brlu, ltris, ladjs, mpinfo, mlpats,
                        [s_band_disp, p_band_disp], [s_band_gd, p_band_gd],
                        shift_kv, lamb0)
    #
    #输出文件夹
    if not os.path.isdir('heatmap6'):
        os.mkdir('heatmap6')
    rpath = 'heatmap6/s{0:.2f}nu{1:.2f}'.\
        format(args.stripe, args.nu)
    if not os.path.isdir(rpath):
        os.mkdir(rpath)
    #
    lval = 0.
    lstep = 0.01
    numpy.save('{0}/{1:.2f}U.npy'.format(rpath, lval), hubbard.U)
    print(hubbard.U[0, 0, 0, 0, 0, 0, 0])
    print(hubbard.U[1, 1, 1, 1, 0, 0, 0])
    print(hubbard.U[1, 1, 1, 0, 1, 1, 1])
    print(hubbard.U[0, 1, 1, 1, 1, 1, 1])
    print(hubbard.U[1, 1, 0, 0, 2, 2, 2])
    print(hubbard.U[0, 0, 1, 1, 2, 2, 2])
    print(hubbard.U[1, 1, 1, 0, 3, 3, 3])
    print(hubbard.U[0, 1, 1, 1, 3, 3, 3])
    #加载上一次的结果
    #lval = 10.75
    #hubbard.U = numpy.load('{0}/{1:.2f}U.npy'.format(rpath, lval))
    for _ in range(1000):
        hubbard.precompute_contour(lval)
        hubbard.precompute_qpp(lval)
        hubbard.precompute_qfs(lval)
        hubbard.precompute_nqfs(lval)
        hubbard.precompute_qex(lval)
        hubbard.precompute_nqex(lval)
        #计算每个idx的导数
        data_list = []
        ndit = numpy.nditer(hubbard.U, flags=['multi_index'])
        while not ndit.finished:
            bd1, bd2, bd3, bd4, idx1, idx2, idx3 = ndit.multi_index
            data_list.append((lval, bd1, bd2, bd3, bd4, idx1, idx2, idx3))
            ndit.iternext()
        #进程池
        #KNOWN ISSUE: 在修改全局变量之间建立的Pool,里面不会包含全局变量
        with multiprocessing.Pool(get_procs_num()) as pool:
            result = pool.starmap(hubbard.dl_ec, data_list)
        duval = numpy.reshape(result, hubbard.U.shape)
        #把每个idx的值加上
        #这两个过程不能放在一起,因为计算dl_ec的时候用到了hubbard.U
        hubbard.U += duval * lstep
        lval += lstep
        #
        del data_list, result, duval
        #
        #uval2 = numpy.load('{0}/{1:.2f}U.chk'.format(rpath, 10.76))
        #if lval == 10.76:
        #    assert numpy.allclose(hubbard.U, uval2)
        numpy.save('{0}/{1:.2f}U.npy'.format(rpath, lval), hubbard.U)
        print(hubbard.U[0, 0, 0, 0, 0, 0, 0])
        print(hubbard.U[1, 1, 1, 1, 0, 0, 0])
        print(hubbard.U[1, 1, 1, 0, 1, 1, 1])
        print(hubbard.U[0, 1, 1, 1, 1, 1, 1])
        print(hubbard.U[1, 1, 0, 0, 2, 2, 2])
        print(hubbard.U[0, 0, 1, 1, 2, 2, 2])
        print(hubbard.U[1, 1, 1, 0, 3, 3, 3])
        print(hubbard.U[0, 1, 1, 1, 3, 3, 3])