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

207 lines
5.3 KiB
C

#include "datafunc.h"
int cal_2d_z(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** U= new double* [M_ex];
for (int i = 0; i < M_ex; i++)
U[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;
int half_N_ex = N_ex/2;
double du = 1.0/((M_ex-1)*dx);
double dv = 1.0/((N_ex-1)*dy);
int k;
for (int i = 0; i < M_ex; i++)
{
for (int j = 0; j < half_N_ex; j++)
{
k = N_ex - 1 - j;
V[i][j] = V[i][k] = (dv*j)*(dv*j);
}
}
double u;
for (int i = 0; i < N_ex; i++)
{
for (int j = 0; j < half_M_ex; j++)
{
k = M_ex - 1 - j;
U[j][i] = U[k][i] = (du*j)*(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][0]*pow(2*pi*sqrt(U[i][j]+V[i][j]),power);
after_out[i*N_ex+j][1] = out[i*N_ex+j][1]*pow(2*pi*sqrt(U[i][j]+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<<xmin+dx*j<<" "<<ymin+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[] U[i];
delete[] U;
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;
}
}