260 lines
8.1 KiB
C++
260 lines
8.1 KiB
C++
#include "datafunc.h"
|
|
|
|
class FD
|
|
{
|
|
public:
|
|
FD();
|
|
~FD();
|
|
int init_res(double*,double*);
|
|
int out_res(char*);
|
|
void forward_sphere(sphere,int);
|
|
void forward_cube(cube,int);
|
|
private:
|
|
double xmin,xmax,ymin,ymax,dx,dy;
|
|
int M,N;
|
|
double height;
|
|
|
|
double** res;
|
|
};
|
|
|
|
FD::FD()
|
|
{
|
|
res = NULL;
|
|
}
|
|
|
|
FD::~FD()
|
|
{
|
|
if(res!=NULL)
|
|
{
|
|
for (int i = 0; i < M; i++)
|
|
delete[] res[i];
|
|
delete[] res;
|
|
}
|
|
}
|
|
|
|
int FD::init_res(double* range,double* interval)
|
|
{
|
|
xmin = *range; xmax = *(range+1); ymin = *(range+2); ymax = *(range+3); height = *(range+4);
|
|
height *= -1.0;
|
|
dx = *interval; dy = *(interval+1);
|
|
|
|
M = int (xmax - xmin)/dx + 1;
|
|
N = int (ymax - ymin)/dy + 1;
|
|
|
|
xmax = xmin + (M-1)*dx;
|
|
ymax = ymin + (N-1)*dy;
|
|
|
|
res = new double* [M];
|
|
for (int i=0;i<M;i++)
|
|
res[i] = new double [N];
|
|
|
|
for (int i=0;i<M;i++)
|
|
for (int j=0;j<N;j++)
|
|
res[i][j] = 0.0;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int FD::out_res(char* outname)
|
|
{
|
|
ofstream outfile(outname);
|
|
if(!outfile)
|
|
{
|
|
cout<<"can not create file: "<<outname<<endl;
|
|
return -1;
|
|
}
|
|
else
|
|
{
|
|
for (int i = 0; i < M; i++)
|
|
{
|
|
for (int j = 0; j < N; j++)
|
|
{
|
|
outfile<<xmin+dx*i<<" "<<ymin+dy*j<<" "<<-1.0*height<<" "<<setprecision(16)<<res[i][j]<<endl;
|
|
}
|
|
}
|
|
outfile.close();
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
void FD::forward_sphere(sphere s1,int caltype)
|
|
{
|
|
switch(caltype)
|
|
{
|
|
case 1: //g
|
|
{
|
|
for (int i = 0; i < M; i++)
|
|
{
|
|
for (int j = 0; j < N; j++)
|
|
{
|
|
res[i][j] += G0*(4.0*s1.density*pow(s1.r,3)*pi/3.0)*(s1.z-height)/pow(pow(xmin+dx*i-s1.x,2)+pow(ymin+dy*j-s1.y,2)+pow(s1.z-height,2),1.5);
|
|
}
|
|
}
|
|
}break;
|
|
case 2: //gx
|
|
{
|
|
for (int i = 0; i < M; i++)
|
|
{
|
|
for (int j = 0; j < N; j++)
|
|
{
|
|
res[i][j] += -3e+4*G0*(4.0*s1.density*pow(s1.r,3)*pi/3.0)*(s1.z-height)*(xmin+dx*i-s1.x)/pow(pow(xmin+dx*i-s1.x,2)+pow(ymin+dy*j-s1.y,2)+pow(s1.z-height,2),2.5);
|
|
}
|
|
}
|
|
}break;
|
|
case 3: //gy
|
|
{
|
|
for (int i = 0; i < M; i++)
|
|
{
|
|
for (int j = 0; j < N; j++)
|
|
{
|
|
res[i][j] += -3e+4*G0*(4.0*s1.density*pow(s1.r,3)*pi/3.0)*(s1.z-height)*(ymin+dy*j-s1.y)/pow(pow(xmin+dx*i-s1.x,2)+pow(ymin+dy*j-s1.y,2)+pow(s1.z-height,2),2.5);
|
|
}
|
|
}
|
|
}break;
|
|
case 4: //gz
|
|
{
|
|
for (int i = 0; i < M; i++)
|
|
{
|
|
for (int j = 0; j < N; j++)
|
|
{
|
|
res[i][j] += 1e+4*G0*(4.0*s1.density*pow(s1.r,3)*pi/3.0)*(2.0*pow(s1.z-height,2)+pow(xmin+dx*i-s1.x,2)+pow(ymin+dy*j-s1.y,2))/pow(pow(xmin+dx*i-s1.x,2)+pow(ymin+dy*j-s1.y,2)+pow(s1.z-height,2),2.5);
|
|
}
|
|
}
|
|
}break;
|
|
}
|
|
}
|
|
|
|
void FD::forward_cube(cube c1,int caltype)
|
|
{
|
|
double R222,R122,R212,R112,R221,R121,R211,R111;
|
|
double G222,G122,G212,G112,G221,G121,G211,G111;
|
|
double x,y;
|
|
double z = height;
|
|
switch(caltype)
|
|
{
|
|
case 1: //g
|
|
{
|
|
for (int i = 0; i < M; i++)
|
|
{
|
|
for (int j = 0; j < N; j++)
|
|
{
|
|
x = xmin + i*dx;
|
|
y = ymin + j*dy;
|
|
|
|
R222=sqrt((c1.x2-x)*(c1.x2-x)+(c1.y2-y)*(c1.y2-y)+(c1.z2-z)*(c1.z2-z));
|
|
R122=sqrt((c1.x1-x)*(c1.x1-x)+(c1.y2-y)*(c1.y2-y)+(c1.z2-z)*(c1.z2-z));
|
|
R212=sqrt((c1.x2-x)*(c1.x2-x)+(c1.y1-y)*(c1.y1-y)+(c1.z2-z)*(c1.z2-z));
|
|
R112=sqrt((c1.x1-x)*(c1.x1-x)+(c1.y1-y)*(c1.y1-y)+(c1.z2-z)*(c1.z2-z));
|
|
R221=sqrt((c1.x2-x)*(c1.x2-x)+(c1.y2-y)*(c1.y2-y)+(c1.z1-z)*(c1.z1-z));
|
|
R121=sqrt((c1.x1-x)*(c1.x1-x)+(c1.y2-y)*(c1.y2-y)+(c1.z1-z)*(c1.z1-z));
|
|
R211=sqrt((c1.x2-x)*(c1.x2-x)+(c1.y1-y)*(c1.y1-y)+(c1.z1-z)*(c1.z1-z));
|
|
R111=sqrt((c1.x1-x)*(c1.x1-x)+(c1.y1-y)*(c1.y1-y)+(c1.z1-z)*(c1.z1-z));
|
|
|
|
G222=(c1.x2-x)*log((c1.y2-y)+R222)+(c1.y2-y)*log((c1.x2-x)+R222)+(c1.z2-z)*arctg((c1.z2-z)*R222/(c1.x2-x)/(c1.y2-y));
|
|
G122=(c1.x1-x)*log((c1.y2-y)+R122)+(c1.y2-y)*log((c1.x1-x)+R122)+(c1.z2-z)*arctg((c1.z2-z)*R122/(c1.x1-x)/(c1.y2-y));
|
|
G212=(c1.x2-x)*log((c1.y1-y)+R212)+(c1.y1-y)*log((c1.x2-x)+R212)+(c1.z2-z)*arctg((c1.z2-z)*R212/(c1.x2-x)/(c1.y1-y));
|
|
G112=(c1.x1-x)*log((c1.y1-y)+R112)+(c1.y1-y)*log((c1.x1-x)+R112)+(c1.z2-z)*arctg((c1.z2-z)*R112/(c1.x1-x)/(c1.y1-y));
|
|
G221=(c1.x2-x)*log((c1.y2-y)+R221)+(c1.y2-y)*log((c1.x2-x)+R221)+(c1.z1-z)*arctg((c1.z1-z)*R221/(c1.x2-x)/(c1.y2-y));
|
|
G121=(c1.x1-x)*log((c1.y2-y)+R121)+(c1.y2-y)*log((c1.x1-x)+R121)+(c1.z1-z)*arctg((c1.z1-z)*R121/(c1.x1-x)/(c1.y2-y));
|
|
G211=(c1.x2-x)*log((c1.y1-y)+R211)+(c1.y1-y)*log((c1.x2-x)+R211)+(c1.z1-z)*arctg((c1.z1-z)*R211/(c1.x2-x)/(c1.y1-y));
|
|
G111=(c1.x1-x)*log((c1.y1-y)+R111)+(c1.y1-y)*log((c1.x1-x)+R111)+(c1.z1-z)*arctg((c1.z1-z)*R111/(c1.x1-x)/(c1.y1-y));
|
|
|
|
res[i][j] +=-1.0*G0*(G222-G122-G212+G112-G221+G121+G211-G111)*c1.density;
|
|
}
|
|
}
|
|
}break;
|
|
case 2: //gx
|
|
{
|
|
for (int i = 0; i < M; i++)
|
|
{
|
|
for (int j = 0; j < N; j++)
|
|
{
|
|
x = xmin + i*dx;
|
|
y = ymin + j*dy;
|
|
|
|
R222=sqrt((c1.x2-x)*(c1.x2-x)+(c1.y2-y)*(c1.y2-y)+(c1.z2-z)*(c1.z2-z));
|
|
R122=sqrt((c1.x1-x)*(c1.x1-x)+(c1.y2-y)*(c1.y2-y)+(c1.z2-z)*(c1.z2-z));
|
|
R212=sqrt((c1.x2-x)*(c1.x2-x)+(c1.y1-y)*(c1.y1-y)+(c1.z2-z)*(c1.z2-z));
|
|
R112=sqrt((c1.x1-x)*(c1.x1-x)+(c1.y1-y)*(c1.y1-y)+(c1.z2-z)*(c1.z2-z));
|
|
R221=sqrt((c1.x2-x)*(c1.x2-x)+(c1.y2-y)*(c1.y2-y)+(c1.z1-z)*(c1.z1-z));
|
|
R121=sqrt((c1.x1-x)*(c1.x1-x)+(c1.y2-y)*(c1.y2-y)+(c1.z1-z)*(c1.z1-z));
|
|
R211=sqrt((c1.x2-x)*(c1.x2-x)+(c1.y1-y)*(c1.y1-y)+(c1.z1-z)*(c1.z1-z));
|
|
R111=sqrt((c1.x1-x)*(c1.x1-x)+(c1.y1-y)*(c1.y1-y)+(c1.z1-z)*(c1.z1-z));
|
|
|
|
G222=log((c1.y2-y)+R222);
|
|
G122=log((c1.y2-y)+R122);
|
|
G212=log((c1.y1-y)+R212);
|
|
G112=log((c1.y1-y)+R112);
|
|
G221=log((c1.y2-y)+R221);
|
|
G121=log((c1.y2-y)+R121);
|
|
G211=log((c1.y1-y)+R211);
|
|
G111=log((c1.y1-y)+R111);
|
|
|
|
res[i][j] +=G0*(G222-G122-G212+G112-G221+G121+G211-G111)*c1.density*1e+4;
|
|
}
|
|
}
|
|
}break;
|
|
case 3: //gy
|
|
{
|
|
for (int i = 0; i < M; i++)
|
|
{
|
|
for (int j = 0; j < N; j++)
|
|
{
|
|
x = xmin + i*dx;
|
|
y = ymin + j*dy;
|
|
|
|
R222=sqrt((c1.x2-x)*(c1.x2-x)+(c1.y2-y)*(c1.y2-y)+(c1.z2-z)*(c1.z2-z));
|
|
R122=sqrt((c1.x1-x)*(c1.x1-x)+(c1.y2-y)*(c1.y2-y)+(c1.z2-z)*(c1.z2-z));
|
|
R212=sqrt((c1.x2-x)*(c1.x2-x)+(c1.y1-y)*(c1.y1-y)+(c1.z2-z)*(c1.z2-z));
|
|
R112=sqrt((c1.x1-x)*(c1.x1-x)+(c1.y1-y)*(c1.y1-y)+(c1.z2-z)*(c1.z2-z));
|
|
R221=sqrt((c1.x2-x)*(c1.x2-x)+(c1.y2-y)*(c1.y2-y)+(c1.z1-z)*(c1.z1-z));
|
|
R121=sqrt((c1.x1-x)*(c1.x1-x)+(c1.y2-y)*(c1.y2-y)+(c1.z1-z)*(c1.z1-z));
|
|
R211=sqrt((c1.x2-x)*(c1.x2-x)+(c1.y1-y)*(c1.y1-y)+(c1.z1-z)*(c1.z1-z));
|
|
R111=sqrt((c1.x1-x)*(c1.x1-x)+(c1.y1-y)*(c1.y1-y)+(c1.z1-z)*(c1.z1-z));
|
|
|
|
G222=log((c1.x2-x)+R222);
|
|
G122=log((c1.x1-x)+R122);
|
|
G212=log((c1.x2-x)+R212);
|
|
G112=log((c1.x1-x)+R112);
|
|
G221=log((c1.x2-x)+R221);
|
|
G121=log((c1.x1-x)+R121);
|
|
G211=log((c1.x2-x)+R211);
|
|
G111=log((c1.x1-x)+R111);
|
|
|
|
res[i][j] +=G0*(G222-G122-G212+G112-G221+G121+G211-G111)*c1.density*1e+4;
|
|
}
|
|
}
|
|
}break;
|
|
case 4: //gz
|
|
{
|
|
for (int i = 0; i < M; i++)
|
|
{
|
|
for (int j = 0; j < N; j++)
|
|
{
|
|
x = xmin + i*dx;
|
|
y = ymin + j*dy;
|
|
|
|
R222=sqrt((c1.x2-x)*(c1.x2-x)+(c1.y2-y)*(c1.y2-y)+(c1.z2-z)*(c1.z2-z));
|
|
R122=sqrt((c1.x1-x)*(c1.x1-x)+(c1.y2-y)*(c1.y2-y)+(c1.z2-z)*(c1.z2-z));
|
|
R212=sqrt((c1.x2-x)*(c1.x2-x)+(c1.y1-y)*(c1.y1-y)+(c1.z2-z)*(c1.z2-z));
|
|
R112=sqrt((c1.x1-x)*(c1.x1-x)+(c1.y1-y)*(c1.y1-y)+(c1.z2-z)*(c1.z2-z));
|
|
R221=sqrt((c1.x2-x)*(c1.x2-x)+(c1.y2-y)*(c1.y2-y)+(c1.z1-z)*(c1.z1-z));
|
|
R121=sqrt((c1.x1-x)*(c1.x1-x)+(c1.y2-y)*(c1.y2-y)+(c1.z1-z)*(c1.z1-z));
|
|
R211=sqrt((c1.x2-x)*(c1.x2-x)+(c1.y1-y)*(c1.y1-y)+(c1.z1-z)*(c1.z1-z));
|
|
R111=sqrt((c1.x1-x)*(c1.x1-x)+(c1.y1-y)*(c1.y1-y)+(c1.z1-z)*(c1.z1-z));
|
|
|
|
G222=atan((c1.x2-x)*(c1.y2-y)/(R222*(c1.z2-z)));
|
|
G122=atan((c1.x1-x)*(c1.y2-y)/(R122*(c1.z2-z)));
|
|
G212=atan((c1.x2-x)*(c1.y1-y)/(R212*(c1.z2-z)));
|
|
G112=atan((c1.x1-x)*(c1.y1-y)/(R112*(c1.z2-z)));
|
|
G221=atan((c1.x2-x)*(c1.y2-y)/(R221*(c1.z1-z)));
|
|
G121=atan((c1.x1-x)*(c1.y2-y)/(R121*(c1.z1-z)));
|
|
G211=atan((c1.x2-x)*(c1.y1-y)/(R211*(c1.z1-z)));
|
|
G111=atan((c1.x1-x)*(c1.y1-y)/(R111*(c1.z1-z)));
|
|
|
|
res[i][j] +=-1.0*G0*(G222-G122-G212+G112-G221+G121+G211-G111)*c1.density*1e+4;
|
|
}
|
|
}
|
|
}break;
|
|
}
|
|
} |