145 lines
3.1 KiB
C
145 lines
3.1 KiB
C
#include "data_func.h"
|
|
|
|
int cal_1d_h(const char* inname,const char* outname)
|
|
{
|
|
ifstream infile(inname);
|
|
if (!infile)
|
|
{
|
|
cout<<inname<<" not found, program stopped..."<<endl;
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
stringstream temp_xz;
|
|
string templine;
|
|
valuelist list_x;
|
|
valuelist list_z;
|
|
double temp_x,temp_z;
|
|
int dnum,Dnum,Lnum,Rnum,half_Dnum;
|
|
double endmean;
|
|
double du;
|
|
double dx;
|
|
|
|
while(getline(infile,templine))
|
|
{
|
|
if (templine!="")
|
|
{
|
|
temp_xz.clear();
|
|
temp_xz.str(templine);
|
|
temp_xz>>temp_x>>temp_z;
|
|
list_x.push_back(temp_x);
|
|
list_z.push_back(temp_z);
|
|
}
|
|
}
|
|
infile.close();
|
|
|
|
dnum = list_x.size();
|
|
double* array_x = new double [dnum];
|
|
double* array_z = new double [dnum];
|
|
|
|
double tempvalue;
|
|
int count = 0;
|
|
for (iv=list_x.begin();iv!=list_x.end(); ++iv)
|
|
{
|
|
tempvalue = *iv;
|
|
array_x[count]=tempvalue;
|
|
count++;
|
|
}
|
|
count = 0;
|
|
for (iv=list_z.begin();iv!=list_z.end(); ++iv)
|
|
{
|
|
tempvalue = *iv;
|
|
array_z[count]=tempvalue;
|
|
count++;
|
|
}
|
|
dx = abs(array_x[1]-array_x[0]);
|
|
|
|
//testing
|
|
/*
|
|
for (int i = 0; i < dnum; i++)
|
|
{
|
|
cout<<array_x[i]<<" "<<array_z[i]<<endl;
|
|
}
|
|
*/
|
|
|
|
Dnum = pow(2,ceil(log(dnum)/log(2))+1);//对数据进行扩边
|
|
Lnum = floor((Dnum-dnum)/2.0);
|
|
Rnum = ceil((Dnum-dnum)/2.0);
|
|
double* Array_z = new double [Dnum];
|
|
|
|
endmean = (array_z[0]+array_z[dnum-1])/2.0;//求取扩边的端点值
|
|
for (int i = 0; i < Lnum; i++)
|
|
{
|
|
Array_z[i] = endmean + (array_z[0]-endmean)*cos(-0.5*pi*(i-Lnum)/Lnum);
|
|
}
|
|
for (int i = 0; i < dnum; i++)
|
|
{
|
|
Array_z[Lnum+i] = array_z[i];
|
|
}
|
|
for (int i = 0; i < Rnum; i++)
|
|
{
|
|
Array_z[Lnum+dnum+i] = endmean + (array_z[dnum-1]-endmean)*cos(0.5*pi*(i+1)/Rnum);
|
|
}
|
|
half_Dnum = Dnum/2;
|
|
du = pi*2/(Dnum*dx);
|
|
|
|
//testing
|
|
/*
|
|
for (int i = 0; i < Dnum; i++)
|
|
{
|
|
cout<<Array_z[i]<<endl;
|
|
}
|
|
*/
|
|
|
|
fftw_complex *in, *out, *after_out, *reout;
|
|
fftw_plan p;
|
|
in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * Dnum);
|
|
out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * Dnum);
|
|
after_out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * Dnum);
|
|
reout = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * Dnum);
|
|
|
|
for (int i = 0; i < Dnum; i++)
|
|
{
|
|
in[i][0] = Array_z[i];
|
|
in[i][1] = 0.0;
|
|
}
|
|
|
|
p=fftw_plan_dft_1d(Dnum,in,out, FFTW_FORWARD, FFTW_ESTIMATE);
|
|
fftw_execute(p); /* repeat as needed*/
|
|
|
|
double u;
|
|
int k;
|
|
for (int i = 0; i < half_Dnum; i++)
|
|
{
|
|
u = du*i;
|
|
after_out[i][1] = out[i][0]*u;
|
|
after_out[i][0] = -1*out[i][1]*u;
|
|
if (i!=0&&i!=half_Dnum)
|
|
{
|
|
k = Dnum-i;
|
|
after_out[k][1] = -1*out[k][0]*u;
|
|
after_out[k][0] = out[k][1]*u;
|
|
}
|
|
}
|
|
|
|
p=fftw_plan_dft_1d(Dnum,after_out,reout, FFTW_BACKWARD, FFTW_ESTIMATE);
|
|
fftw_execute(p);
|
|
|
|
ofstream outfile(outname);
|
|
for (int i = 0; i < dnum; i++)
|
|
{
|
|
outfile<<array_x[i]<<" "<<1e+4*reout[i+Lnum][0]/Dnum<<endl;
|
|
}
|
|
outfile.close();
|
|
|
|
fftw_destroy_plan(p);
|
|
fftw_free(in);
|
|
fftw_free(out);
|
|
fftw_free(after_out);
|
|
fftw_free(reout);
|
|
delete[] Array_z;
|
|
delete[] array_x;
|
|
delete[] array_z;
|
|
return 0;
|
|
}
|
|
} |