190 lines
5.0 KiB
C
190 lines
5.0 KiB
C
#include "datafunc.h"
|
|
|
|
int cal_2d_hx(char* inname,char* outname,char* colname,double* range,double* interval,int power)
|
|
{
|
|
ifstream infile(inname);
|
|
if (!infile)
|
|
{
|
|
cout<<BOLDRED<<"==> "<<RESET<<"file not found: "<<inname<<endl;
|
|
return -1;
|
|
}
|
|
else
|
|
{
|
|
string temp_str;
|
|
stringstream temp_ss;
|
|
double temp_x,temp_y,temp_z;
|
|
|
|
//添加数据列选项
|
|
int cols[3];
|
|
if (3 != sscanf(colname,"%d,%d,%d",&cols[0],&cols[1],&cols[2]))
|
|
{
|
|
cout<<BOLDRED<<"==> "<<RESET<<"wrong column parameters: "<<colname<<endl;
|
|
return -1;
|
|
}
|
|
double temp_d;
|
|
_1dArray tempRow;
|
|
|
|
|
|
double xmin = *range; double xmax = *(range+1); double ymin = *(range+2); double ymax = *(range+3);
|
|
double dx = *interval; double dy = *(interval+1);
|
|
int M = floor((ymax-ymin)/dy) + 1;
|
|
int N = floor((xmax-xmin)/dx) + 1;
|
|
double** tabledata = new double* [M];
|
|
for (int i = 0; i < M; i++)
|
|
tabledata[i] = new double [N];
|
|
|
|
int M_ex = pow(2,ceil(log(M)/log(2))+1);
|
|
int N_ex = pow(2,ceil(log(N)/log(2))+1);
|
|
int M_ex_up = floor((M_ex - M)/2.0);
|
|
int M_ex_down = ceil((M_ex - M)/2.0);
|
|
int N_ex_left = floor((N_ex - N)/2.0);
|
|
int N_ex_right = ceil((N_ex - N)/2.0);
|
|
|
|
double** tabledata_ex = new double* [M_ex];
|
|
for (int i = 0; i < M_ex; i++)
|
|
tabledata_ex[i] = new double [N_ex];
|
|
|
|
double** V= new double* [M_ex];
|
|
for (int i = 0; i < M_ex; i++)
|
|
V[i] = new double [N_ex];
|
|
|
|
double* endmean = new double [N];
|
|
double* endmean2 = new double [M_ex];
|
|
|
|
while(getline(infile,temp_str))
|
|
{
|
|
if (*(temp_str.begin()) == '#') continue;
|
|
else
|
|
{
|
|
temp_ss.str("");
|
|
temp_ss.clear();
|
|
temp_ss << temp_str;
|
|
|
|
if(!tempRow.empty()) tempRow.clear();
|
|
while (temp_ss >> temp_d)
|
|
{
|
|
tempRow.push_back(temp_d);
|
|
}
|
|
|
|
temp_x = tempRow.at(cols[0]);
|
|
temp_y = tempRow.at(cols[1]);
|
|
temp_z = tempRow.at(cols[2]);
|
|
if (temp_x>=xmin&&temp_x<=xmax&&temp_y>=ymin&&temp_y<=ymax)
|
|
{
|
|
tabledata[int ((temp_y-ymin)/dy)][int ((temp_x-xmin)/dx)] = temp_z;
|
|
}
|
|
}
|
|
}
|
|
infile.close();
|
|
|
|
for (int i = 0; i < N; i++) endmean[i] = (tabledata[0][i]+tabledata[M-1][i])/2.0;
|
|
for (int i = 0; i < N; i++)
|
|
{
|
|
for (int k = 0; k < M_ex_down; k++)
|
|
{
|
|
tabledata_ex[k][N_ex_left+i] = endmean[i] + (tabledata[0][i]-endmean[i])*cos(-0.5*pi*(k-M_ex_down)/M_ex_down);
|
|
}
|
|
for (int k = 0; k < M; k++)
|
|
{
|
|
tabledata_ex[M_ex_down+k][N_ex_left+i] = tabledata[k][i];
|
|
}
|
|
for (int k = 0; k < M_ex_up; k++)
|
|
{
|
|
tabledata_ex[M_ex_down+M+k][N_ex_left+i] = endmean[i] + (tabledata[M-1][i]-endmean[i])*cos(0.5*pi*(k+1)/M_ex_up);
|
|
}
|
|
}
|
|
for (int i = 0; i < M_ex; i++) endmean2[i] = (tabledata_ex[i][N_ex_left]+tabledata_ex[i][N_ex_left+N-1])/2.0;
|
|
for (int i = 0; i < M_ex; i++)
|
|
{
|
|
for (int k = 0; k < N_ex_left; k++)
|
|
{
|
|
tabledata_ex[i][k] = endmean2[i] + (tabledata_ex[i][N_ex_left]-endmean2[i])*cos(-0.5*pi*(k-N_ex_left)/N_ex_left);
|
|
}
|
|
for (int k = 0; k < N_ex_right; k++)
|
|
{
|
|
tabledata_ex[i][N_ex_left+N+k] = endmean2[i] + (tabledata_ex[i][N_ex_left+N-1]-endmean2[i])*cos(0.5*pi*(k+1)/N_ex_right);
|
|
}
|
|
}
|
|
|
|
fftw_complex *in, *out, *after_out, *reout;
|
|
fftw_plan p;
|
|
in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * M_ex * N_ex);
|
|
out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * M_ex * N_ex);
|
|
after_out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * M_ex * N_ex);
|
|
reout = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * M_ex * N_ex);
|
|
|
|
for (int i = 0; i < M_ex; i++)
|
|
{
|
|
for (int j = 0; j < N_ex; j++)
|
|
{
|
|
in[i*N_ex+j][0] = tabledata_ex[i][j];
|
|
in[i*N_ex+j][1] = 0;
|
|
}
|
|
}
|
|
|
|
p=fftw_plan_dft_2d(M_ex, N_ex,in , out, FFTW_FORWARD, FFTW_ESTIMATE);
|
|
fftw_execute(p);
|
|
|
|
int half_M_ex = M_ex/2;
|
|
double du = 1.0/((M_ex-1)*dx);
|
|
|
|
int k;
|
|
for (int i = 0; i < N_ex; i++)
|
|
{
|
|
for (int j = 0; j < half_M_ex; j++)
|
|
{
|
|
k = M_ex - 1 - j;
|
|
V[j][i] = du*j;
|
|
V[k][i] = -1*du*j;
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < M_ex; i++)
|
|
{
|
|
for (int j = 0; j < N_ex; j++)
|
|
{
|
|
after_out[i*N_ex+j][0] = out[i*N_ex+j][1]*pow(2*pi*V[i][j],power);
|
|
after_out[i*N_ex+j][1] = out[i*N_ex+j][0]*pow(2*pi*V[i][j],power);
|
|
}
|
|
}
|
|
|
|
p=fftw_plan_dft_2d(M_ex, N_ex, after_out, reout, FFTW_BACKWARD, FFTW_ESTIMATE);
|
|
fftw_execute(p);
|
|
|
|
for (int i = 0; i < M_ex; i++)
|
|
{
|
|
for (int j = 0; j < N_ex; j++)
|
|
{
|
|
tabledata_ex[i][j] = 0.1*reout[i*N_ex+j][0]/(M_ex*N_ex);
|
|
}
|
|
}
|
|
|
|
ofstream outfile(outname);
|
|
for (int i = 0; i < M; i++)
|
|
{
|
|
for (int j = 0; j < N; j++)
|
|
{
|
|
outfile<<xmax-dx*j<<" "<<ymax-dy*i<<" "<<setprecision(16)<<tabledata_ex[M_ex_down+i][N_ex_left+j]<<endl;
|
|
}
|
|
}
|
|
outfile.close();
|
|
|
|
fftw_destroy_plan(p);
|
|
fftw_free(in);
|
|
fftw_free(out);
|
|
fftw_free(after_out);
|
|
fftw_free(reout);
|
|
for (int i = 0; i < M_ex; i++)
|
|
delete[] tabledata_ex[i];
|
|
delete[] tabledata_ex;
|
|
for (int i = 0; i < M_ex; i++)
|
|
delete[] V[i];
|
|
delete[] V;
|
|
for (int i = 0; i < M; i++)
|
|
delete[] tabledata[i];
|
|
delete[] tabledata;
|
|
delete[] endmean;
|
|
delete[] endmean2;
|
|
return 0;
|
|
}
|
|
} |