On 4/12/07, jordi poblet <jordi.poblet at gmail.com> wrote: > > > Dear all, > > I think that the GMRES ILU(p) preconditioner in my program is consuming too > much memory. I just would like to check if it is correct or not and compare > this experience with other PETSc users. > For a quite small sparse matrix (dimension = 3500 and 2.5 Mb) the memory > consumed while the preconditioner is created is more or less:
This memory usage does not really sound outrageous to me. The full matrix would cost 3500*4 + 3500*3500*(8+4) = 147M. Using so many levels has to be getting close to a full matrix. In general, high levels of fill (I would say > 2) are counterproductive with ILU. For such as small problem, consider using a sparse direct solver like MUMPS. YOu can get this automatically by configureing with --download-mumps. Until your problems are at least 100K, I would say that this is one of the best options. Matt > ILU level approximate > increase of memory waste (Mb) > > 4 9 > 8 26 > 12 43 > 16 53 > 20 68 > > > Moreover a fast convergence is reached suddenly (i.e. for ILU level 25 > convergence is not reached after 3000 iterations but for ILU level 30 the > convergence is reached in 7 iterations). > I suppose that some of the problems are caused by the large condition > number of the matrix but in any case I guess that the memory used by the > preconditioner is too large. > I have tried to improve the performance using: PCFactorSetFill, > PCFactorSetAllowDiagonalFill and PCFactorSetUseDropTolerance but I have not > succeed. > > > > I would also like to know how to estimate a priori the memory required for a > PETSc sparse matrix if the non null entries are known. Is the following > rule: 1 double/complex<double> and 2 integers per non null coefficient, a > good approximation (taking into account PETSc implementation)? Is the same > rule valid for the case of the preconditioner? > > I will give some details on the particular situation being solved: > ------------------------------------------------------------------------------------------------------------ > > Type of matrix: FEM resolution of an structural dynamic problem > > (K + w*w*M) | L^T > > ------------------------- = System matrix > > L | 0 > > > > > K == stiffness matrix (square banded) > M == consistent mass matrix (square banded, and same nonzero pattern than > K) > w == pulsation of the problem (scalar) > L == Lagrange multipliers matrix (rectangular sparse) > > > The matrix is in general ill conditioned and non positive definite. > > ------------------------------------------------------------------------------------------------------------ > > > > And my use of PETSc functions is as follows: > > ierr = KSPCreate(PETSC_COMM_WORLD,&MyKsp);CHKERRQ(ierr); > > ierr = KSPSetType(MyKsp, KSPGMRES);CHKERRQ(ierr); > > ierr = > KSPSetOperators(MyKsp,MyMat,MyMat,DIFFERENT_NONZERO_PATTERN); > CHKERRQ(ierr); > > > > > ierr = KSPGetPC(MyKsp,&(MyPc));CHKERRQ(ierr); > > > > > > ierr = PCSetType(MyPc,PCILU);CHKERRQ(ierr); > > ierr = PCFactorSetLevels(MyPc, LevelNumber);CHKERRQ(ierr); > > > > > PetscReal realshift = 1.0; > > ierr = PCFactorSetShiftNonzero(MyPc, realshift); CHKERRQ(ierr); //With and > without this line > > > > > ierr = > KSPSetTolerances(MyKsp,tol,PETSC_DEFAULT,PETSC_DEFAULT,itmax);CHKERRQ(ierr); > > ierr = > KSPSetInitialGuessNonzero(MyKsp,PETSC_TRUE);CHKERRQ(ierr); > > > > > ierr = KSPGMRESSetRestart(MyKsp, max_steps_restart); CHKERRQ(ierr); //With > and without this line > > > > > ierr = KSPSetFromOptions(MyKsp);CHKERRQ(ierr); > > > > ierr = KSPSolve(MyKsp,MyVector,x);CHKERRQ(ierr); > ----------------------------------------------------------------------------------------------------------- > > Thank you very much in advance, > > > Jordi Poblet Puig > > > > > > -- The government saving money is like me spilling beer. It happens, but never on purpose.
