首先,咱們須要在布里淵區均勻採樣,生成一系列均勻的點,因爲均勻的封閉性,給定k和q後,k+q就能夠由已經存在的點表示出來。須要注意的是,咱們須要對超出範圍的k+q的點作平移(用編號取模就行)python
以後,就能夠完成極化率的計算。至關於這裏所有用了離散座標。ios
對於二維體系時間複雜度是O(N^4), C++ 1秒能夠算10^7次,200*200得格點,C++大概須要160秒的時間,實際用時303.249sapp
square lattice matlib代碼ide
nx = 100; ny = 100; kx = linspace(0,2*pi,nx); ky = linspace(0,2*pi,ny); [KX,KY] = meshgrid(kx,ky); E = -(cos(KX) + cos(KY)); %mesh(KX,KY,E); mu = 0; T = 0.001; delta = 0.01*0; % 小虛部 chi = zeros(nx,ny); Ef=0; %[C,h] = contour(KX,KY,E,[Ef,0,0]); for i = 1:nx for j = 1:ny for k=1:nx for l=1:ny index_kq_x = mod(i+k,nx)+1; index_kq_y = mod(j+l,ny)+1; Ek = E(k,l); Ekq = E(index_kq_x,index_kq_y); chi(i,j) = chi(i,j) + (Fermi_funtion(Ek,mu,T)-Fermi_funtion(Ekq,mu,T))/(Ek-Ekq+1i*delta); end end end end mesh(KX,KY,-real(chi))
算得很是慢
spa
C++ 代碼 3d
#include <iostream> #include <cmath> #include <vector> #include <fstream> #include <iomanip> #include <complex> #include <ctime> using namespace std; #define PI 3.1415926 vector<double> linspace(double min, double max, int n){ vector<double> result; // vector iterator int iterator = 0; for (int i = 0; i <= n-2; i++){ double temp = min + i*(max-min)/(floor((double)n) - 1); result.insert(result.begin() + iterator, temp); iterator += 1; } //iterator += 1; result.insert(result.begin() + iterator, max); return result; } double fermi_function(double E,double mu,double T){ return 1/(exp((E-mu)/T)+1); } int main() { int nx = 200, ny = 200; double mu = 0; double T = 0.026; double delta = 0.01; vector<double> kx = linspace(0,2*PI,nx); vector<double> ky = linspace(0,2*PI,ny); vector<vector<double>> E(nx,vector<double>(ny,0)); vector<vector<complex<double>>> chi(nx,vector<complex<double>>(ny)); vector<vector<double>> real_chi(nx,vector<double>(ny,0)); clock_t startTime,endTime; startTime = clock(); //計時開始 cout<<"start run"<<endl; for(int i=0;i<nx;i++){ for(int j=0;j<ny;j++){ E[i][j] = -(cos(kx[i])+cos(ky[i])); } } for(int i=0;i<nx;i++){ for(int j=0;j<ny;j++){ for(int k=0;k<nx;k++){ for(int l=0;l<nx;l++){ int index_kq_x = (i+k)%nx; int index_kq_y = (j+l)%ny; double Ek = E[k][l]; double Ekq = E[index_kq_x][index_kq_y]; double f1 = fermi_function(Ek,0,T); double f2 = fermi_function(Ekq,0,T); if(k!=index_kq_x&&l!=index_kq_y){ chi[i][j] += (f1-f2)/(Ek-Ekq+1i*delta); } } } } } ofstream out("Datachi.txt"); for(int i=0;i<nx;i++){ for(int j=0;j<ny;j++){ out<<fixed<<setprecision(4)<<chi[i][j].real()<<" "; } out<<endl; } endTime = clock();//計時結束 cout << "The run time is: " <<(double)(endTime - startTime) / CLOCKS_PER_SEC << "s" << endl; }
Python畫圖腳本code
import numpy as np import matplotlib.pyplot as plt from math import pi file = open("Datachi.txt", "r") row = file.readlines() list_text = [] for line in row: line = list(line.strip().split(' ')) s = [] for i in line: s.append(float(i)) list_text.append(s) #print(list_text) nx = 10 ny = 10 chi = np.array(list_text) kx = np.linspace(0,2*pi,nx) ky = np.linspace(0,2*pi,ny) KX, KY = np.meshgrid(kx, ky) #plt.contourf(KX,KY,chi) #plt.show() fig = plt.figure(figsize=plt.figaspect(0.5)) ax = fig.add_subplot(1, 2, 1, projection='3d') surf = ax.plot_surface(KX, KY, chi, rstride=1, cstride=1, cmap=cm.coolwarm, linewidth=0, antialiased=False) ax.set_zlim(-1.01, 1.01) fig.colorbar(surf, shrink=0.5, aspect=10) plt.show()