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)
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)
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))
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))
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))
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])