initial upload
This commit is contained in:
145
archive/grad1d/grad_h.h
Normal file
145
archive/grad1d/grad_h.h
Normal file
@@ -0,0 +1,145 @@
|
||||
#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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user