FFTW 라이브러리를 사용하여 모든 뉴먼 경계 조건을 가진 3D 포아송 방정식을 풀려고합니다. 방정식은 다음과 같이 작성됩니다. d^STR/dx^2 + d^STR/dy^2 + d^2STR/dz^2 = -VORTG. 제 생각에는 out2를 계산하는 단계가 정확합니다. 그러나, 나는 STR을 계산하는 단계를 확신하지 못합니다. 조언 좀 해 주시겠습니까? 정말 고마워요.모든 뉴먼 경계 조건을 가진 3D 포아송 방정식에 대한 FFTW
void poisson3d(vector<vector<vector<double> > > &STR, vector<vector<vector<double> > > &VORTG)
{
double pi = 3.141592653589793;
double XMIN=-2.0;
double XMAX=2.0;
double YMIN=-2.0;
double YMAX=2.0;
double ZMIN=-2.0;
double ZMAX=2.0;
double dd=(XMAX-XMIN)*(YMAX-YMIN)*(ZMAX-ZMIN)/pi/pi/pi;
std::vector<double> in1(N*N*N,0.0);
std::vector<double> in2(N*N*N,0.0);
std::vector<double> out1(N*N*N,0.0);
std::vector<double> out2(N*N*N,0.0);
fftw_plan p, q;
int i,j,k;
p = fftw_plan_r2r_3d(N, N, N, in1.data(), out1.data(), FFTW_REDFT00 ,FFTW_REDFT00, FFTW_REDFT00, FFTW_ESTIMATE);
q = fftw_plan_r2r_3d(N, N, N, in2.data(), out2.data(), FFTW_REDFT00 ,FFTW_REDFT00, FFTW_REDFT00, FFTW_ESTIMATE);
int l=-1;double max=0;
for (i = 0;i <N;i++)
for (j = 0;j<N;j++)
for (k=0;k<N;k++){
l=l+1;
in1[l]= VORTG[i][j][k];
}
fftw_execute(p);
l=-1;
for (i = 0; i < N; i++){ // f = g/(kx² + ky²)
for(j = 0; j < N; j++){
for (k=0; k<N; k++){
l=l+1;
double fact=0;
in2[l]=0;
if(2*i<N){
fact=((double)i*i);
}else{
fact=((double)(N-i)*(N-i));
}
if(2*j<N){
fact+=((double)j*j);
}else{
fact+=((double)(N-j)*(N-j));
}
if(2*k<N){
fact+=((double)k*k);
}else{
fact+=((double)(N-k)*(N-k));
}
if(fact!=0){
in2[l] = out1[l]/fact;
}else{
in2[l] = 0.0;
}
}
}
}
fftw_execute(q);
for (i = 0; i < N; i++) {
for(j = 0; j < N; j++){
for (k=0;k<N;k++){
STR[i][j][k]= dd*out2[l]/((double)2.0*(N-1))/((double)2.0*(N-1))/((double)2.0*(N-1));
}
}
}
fftw_destroy_plan(p); fftw_destroy_plan(q); fftw_cleanup();
}
@ Paul R : 제게 조언 해 주시겠습니까? –
@francis : 제게 조언 해 주시겠습니까? –