Я пытаюсь решить уравнение Пуассона в 3D со всеми граничными условиями Неймана, используя библиотеку FFTW.
Уравнение записано следующим образом: d ^ STR / dx ^ 2 + d ^ STR / dy ^ 2 + d ^ 2STR / dz ^ 2 = -VORTG.
На мой взгляд, шаги для расчета out2 — это правильно. Тем не менее, я не уверен, что шаг для расчета STR.
Не могли бы вы дать мне несколько советов?
Огромное спасибо.
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();
}
Это довольно сложно как физически, так и математически, но все же многие из обычных методов отладки C ++ все еще действительны.
Для начала, есть много простых граничных условий, которые позволяют точное решение (все ноль VORTG
должен производить постоянную STR
). Вы проверили, все ли промежуточные значения имеют ожидаемые значения для таких простых входных данных? Для несколько более сложных граничных условий вы не сможете найти точные значения для различных промежуточных продуктов, но вы все равно сможете проверить правильность знаков. И, наконец, вы можете не знать точное решение для некоторого граничного условия, но вы можете проверить, что физические симметрии соблюдаются. Если вы можете отразить свои граничные условия, результаты также должны быть отражены. Они?