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