Preconditioning technique for large sparse non-hermitian matrix
I am attempting to solve a computational acoustics problem that involves solving an underlying sparse matrix. The size of the problem varies with grid size (3D) and fill-in's obviously make direct solution impractical. Important features of the matrix are as follows:
1. It is non-Hermitian and particularly NOT diagonally dominant.
2. Regardless of the size of the problem, there is always one row that consists of only one element, far away from the diagonal (and a zero on the diagonal). This is part of the problem's closure condition.
I have attempted to solve this problem using iterative techniques with preconditioning to speed up the solution. Iterative solution without preconditioning yields fairly inaccurate results (by comparison with directly computed results for a small grid). 623
ILU preconditioning works for coarse grids (small matrices ~ 42000 x 42000) but fails for anything over 100,000 x 100,000; keeping a low fill-in factor ends in "Factor is exactly singular" and large fill-in factor ends in one of the sub-matrices being singular during pivoting. I also tried enforcing the one zero diagonal element with machine epsilon before attempting ILU but it still fails.
Relevant problem parameters are as follows:
1. There are 8 PDE's: conservation of mass, conservation of energy, three momentum equations for interior points of computation (full staggered grid with velocity on faces and pressure, temperature & density on cell centers), and three problem specific momentum equations on certain boundaries.
2. There are suitable closure conditions applied to the problem to obtain a full ranked system, one of which has been described above (zero diagonal row).
3. I am using a hybrid scheme, with divergences and certain gradients being constructed by using a finite volume approach, and the rest of the operators being constructed using a finite difference approach utilizing polynomial fitting.
If it helps, I am using scipy sparse libraries to carry out my computations. The iterative method I am using is LGMRES, which works without any problems when provided a suitable preconditioner. Please suggest some viable preconditioning techniques for this kind of problem.
Edit: The sparsity pattern of the matrix is as follows: 623