バンド計算プログラム
#include <stdio.h>
#include <math.h>
#include "matrix.h" // T.Nagano 2011 version
main()
{
int i,j,steps,ks;
MATRIX a,p,r;
double x, pi=3.14159265359,e=1e-10;
double g,sift,k;
double U1;
double Lat;
FILE *fp1;
SIZE=5; //行列のサイズ
steps=10; //ヤコビ法のステップ
printf("A :\n");
matprint(a); //行列の表示
printf("\n");
fp1=fopen("e-k.dat","w"); //計算結果を格納するファイル
Lat=2.5; //格子定数
g=2.0*pi/Lat; //逆格子
U1=1.0; //ポテンシャルのフーリエ成分
sift=(SIZE/2+1)-SIZE;
//==========================================================================================
// k点の繰り返し
//=========================
for(k=-pi/Lat;k < pi/Lat; k=k+0.05){
printf("k= %lf\n",k);
a=zeromat(a);
for(i=0; i < SIZE; i++){
a.ent[i][i]=(k+g*(i+sift))* (k+g*(i+sift)) ; //対角要素
}
for(i=0; i < SIZE; i++){
// for(j=i+1;j< SIZE;j++){
// a.ent[i][j]= U1;
// a.ent[j][i]=a.ent[i][j];
// }
//非対角要素
a.ent[i][i+1]= U1;
a.ent[i+1][i]=a.ent[i][i+1];
}
matprint(a);
printf("\n");
//-------------------------------------------------------------------
// ヤコビ法
//----------------------
p=unitmat();
for(ks=1;ks <= steps;ks++){
for(i=0; i < SIZE; i++){
for(j=i+1; j < SIZE; j++){
// 回転角度設定
if(fabs(a.ent[i][i]-a.ent[j][j])< e ){
x=pi/4.0;
}
else{
x=atan(2*a.ent[i][j]/(a.ent[i][i]-a.ent[j][j]))/2.0;
}
// 回転の行列
r=rotmat(i,j,x);
// 直交行列の更新
p=matmul(p,r);
// A の更新
a=matmul(transmat(r),matmul(a,r));
}
}
}
//-------------------------------------------------------------------
//-------------------------------------------------------------------
// 結果出力
//-------------------------------------------------
printf("%12.7f ",k);
fprintf(fp1,"%12.7f ",k);
for(i=0;i<SIZE;i++){
printf("%12.7f ",a.ent[i][i]);
fprintf(fp1,"%12.7f ",a.ent[i][i]);
}
printf("\n");
fprintf(fp1,"\n");
close(fp1);
//-------------------------------------------------------------------
}
//==========================================================================================
}