2次元FTプログラム
#include <stdio.h>
#include <math.h>
#define PI 3.14159265
void main (void){
double kx,ky,dkx,dky,xj[100000],yj[10000],I,I1,I2, Imax;
double kx0,ky0;
int step,n,ds,interval,totalstep,d,atoms,slide;
FILE *fp1, *fp2;
if((fp1=fopen("./xy.xls","r"))==NULL){
printf("xy.xls not open.\n");
return;
}
if((fp2=fopen("./checkxy.xls","w"))==NULL){
printf("checkxy.xls not open.\n");
return;
}
FILE *fp3; //MicroAVSData
if((fp3=fopen("./FTdata.xls","w"))==NULL){
printf("FTdata.xls not open.\n");
return;
}
printf("X軸原点座標\n");
scanf("%lf",&kx0);
printf("凅="); //kxの幅
scanf("%lf",&dkx);
printf("Y軸原点座標\n");
scanf("%lf",&ky0);
printf("凉="); //kyの幅
scanf("%lf",&dky);
printf("division=");
scanf("%d",&d);
Imax=9000.;
totalstep=10;
atoms=100;
interval=1000;
slide=0;
for(step=0;step <= totalstep;step++){
fscanf(fp1,"%d\n",&ds);///計算ステップ
for(n=0;n < atoms;n++){///計算ステップデータ読み込み
fscanf(fp1,"%lf\t%lf\n",&xj[n],&yj[n]);
}
if((ds%interval)==0||ds==999){
/***フーリエ変換***/
printf("ステップ%dフーリエ変換中\n",step);
/* for(n=0;n &l atoms;n++){///計算ステップデータ読み込み確認
fprintf(fp2, "%f\t%f\n",xj[n], yj[n]);
} */
slide++;
fprintf(fp3,"%d\n",slide);
for(int i=0;i < d;i++){
ky=ky0+i*dky;
for(int j=0;j < d;j++){
kx=kx0+j*dkx;
I=0.;I1=0.;I2=0.;
for(n=0;n < atoms;n++){
I1 += cos(2.*PI*(kx*xj[n]+ky*yj[n])); //Σcos(kx*yj+ky+yj)
I2 += sin(2.*PI*(kx*xj[n]+ky*yj[n])); //Σsin(kx*yj+ky+yj)
}
I = I1*I1+I2*I2; //{Σcos(kx*yj+ky*yj)}^2+{Σsin(kx*yj+ky*yj)}^2
//if(I > Imax) I=Imax;
fprintf(fp3,"%f\t",I);
}
fprintf(fp3,"\n");
}
/***フーリエ変換***/
}
}
/***計算モジュール***/
fclose(fp1);
fclose(fp2);
fclose(fp3);
}