2015-02-03 5 views
0

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(); 

} 
+0

@ Paul R : 제게 조언 해 주시겠습니까? –

+0

@francis : 제게 조언 해 주시겠습니까? –

답변

0

이것은 물리적으로나 수학적으로나 복잡하지만, 여전히 일반적인 C++ 디버그 기술 중 여전히 많은 부분이 여전히 유효합니다.

처음에는 정확한 솔루션을 허용하는 많은 간단한 경계 조건이 있습니다 (모두 0이 VORTG 인 경우 STR을 생성해야 함). 모든 중간 값이 그러한 간단한 입력에 대해 기대되는 값을 가지는지 확인 했습니까? 다소 복잡한 경계 조건의 경우 다양한 중간체에 대한 정확한 값을 제시 할 수 없지만 표지가 맞는지 계속 확인할 수는 있습니다. 마지막으로 일부 경계 조건에 대한 정확한 해결책을 알지 못할 수도 있지만 물리적 대칭이 준수되는지 확인할 수 있습니다. 경계 조건을 미러링 할 수 있으면 결과도 미러링해야합니다. 그들은?

+0

정확한 해결책으로 다른 문제를 확인했지만 제어 할 수는 있지만 제어 할 수는 없습니다 .VORTG는 계산 도메인의 중심에 0이 아닌 값이 있고 anothe 값은 0과 같습니다. Neuran 경계 조건이있는 6 개의 표면이있는 입방체와 같은 계산 영역. 따라서 FFTW_REDFT00을 사용합니다. 2D에서 같은 문제를 이미 시도했지만 올바르게 작동했지만 3D에서는 잘못 처리되었습니다. 내 결과는 거울이 아니지만 경계는 만족 스럽습니다. 더 이상 당신의 충고는 나의 기쁨과 영예입니다. 정말 고맙습니다. –

+0

MSalters에 따르면, VORTG가 모두 0이면 STR에 모든 상수 값이 주어집니다. 그러나 VORTG는 계산 영역의 중간에 어떤 값 (0과 같지 않음)을 가지고 있으며, STR은 모든 상수 값까지입니다. 왜 그렇게됩니까? 이 방정식을 푸는 데 유한 한 다른 방법을 사용했습니다. STR 값이 일정하지 않습니다. 네가 이상적이라면 조언 해줘. 고마워. –

+0

@Luc : 귀하의 의견을 이해할 수 없습니다. 실제로 VORTG가 0 인 함수를 호출 해 보았습니까? 실제 결과는 무엇입니까? 내 직감이 수학적으로 정확합니까? STR에 단일 상수 값이 있어야합니까? – MSalters