gctl_toolkits/archive/grad1d/grad_v.h
2024-09-10 20:25:18 +08:00

137 lines
3.0 KiB
C

#include "data_func.h"
int cal_1d_v(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);
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][1]*u;
after_out[i][0] = out[i][0]*u;
if (i!=0&&i!=half_Dnum)
{
k = Dnum-i;
after_out[k][1] = out[k][1]*u;
after_out[k][0] = out[k][0]*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;
}
}