コード例 #1
0
ファイル: grid.cpp プロジェクト: CinimodStudio/Cinder
void Grid::
apply_preconditioner(const Array2d &x, Array2d &y, Array2d &m)
{
   int i, j;
   float d;
   m.zero();
   // solve L*m=x
   for(j=1; j<x.ny-1; ++j) for(i=1; i<x.nx-1; ++i)
      if(marker(i,j)==FLUIDCELL){
         d=x(i,j) - poisson(i-1,j,1)*preconditioner(i-1,j)*m(i-1,j)
                  - poisson(i,j-1,2)*preconditioner(i,j-1)*m(i,j-1);
         m(i,j)=preconditioner(i,j)*d;
      }
   // solve L'*y=m
   y.zero();
   for(j=x.ny-2; j>0; --j) for(i=x.nx-2; i>0; --i)
      if(marker(i,j)==FLUIDCELL){
         d=m(i,j) - poisson(i,j,1)*preconditioner(i,j)*y(i+1,j)
                  - poisson(i,j,2)*preconditioner(i,j)*y(i,j+1);
         y(i,j)=preconditioner(i,j)*d;
      }
}
コード例 #2
0
ファイル: grid.cpp プロジェクト: CinimodStudio/Cinder
void Grid::
apply_poisson(const Array2d &x, Array2d &y)
{
   y.zero();
   for(int j=1; j<poisson.ny-1; ++j) for(int i=1; i<poisson.nx-1; ++i){
      if(marker(i,j)==FLUIDCELL){
         y(i,j)=poisson(i,j,0)*x(i,j) + poisson(i-1,j,1)*x(i-1,j)
                                      + poisson(i,j,1)*x(i+1,j)
                                      + poisson(i,j-1,2)*x(i,j-1)
                                      + poisson(i,j,2)*x(i,j+1);
      }
   }
}