On Thu, Mar 14, 2013 at 2:52 PM, Thibault Faney <tibo at berkeley.edu> wrote: > Hong: > > thank you for your answer. > I can replace DIFFERENT_NONZERO_PATTERN by SAME_NONZERO_PATTERN, however > this will give me the wrong answer as the zero pattern changes from a time > step to another (e.g. the matrix A at time step 1 has more zeros than at > time step 2) . What I can precompute is the maximal non-zero pattern. Do you > mean I should compute the facorization for the maximal zero pattern before > time iterations and then use SAME_NONZERO_PATTERN during the iterations ?
Yes. Hong > > > On Thu, Mar 14, 2013 at 3:29 PM, Hong Zhang <hzhang at mcs.anl.gov> wrote: >> >> Tibo: >> >> Replace >> call KSPSetOperators(KSP_A, A, A, DIFFERENT_NONZERO_PATTERN, ierr) >> with >> call KSPSetOperators(KSP_A, A, A, SAME_NONZERO_PATTERN, ierr) >> >> Run your code with option '-log_summary' to see the number of calling >> MatLUSymbolic() and MatLUNumeric(). >> >> Hong >> >> > >> > I am using the cray-petsc implementation on the NERSC system. >> > Specifically, >> > I have implemented a runge kutta solver, and I need to solve a linear >> > system >> > Ax = b several times per time step. I am using PETSC to interface with >> > the >> > MUMPS solver for direct factorization. >> > >> > The matrix A is constant over a whole time step, but changes at each >> > time >> > step. What I do now is that at the beginning of each time step, I >> > compute >> > the matrix A, use the MUMPS solver to compute a LU factorization of A, >> > and >> > then use KSPSolve to solve each linear system during the same time step. >> > Here is an example of the succession of calls (inspired from example >> > ex52.c): >> > >> > Once per time step: >> > call KSPSetOperators(KSP_A, A, A, DIFFERENT_NONZERO_PATTERN, ierr) >> > call KSPSetType(KSP_A, KSPPREONLY, ierr); >> > call KSPGetPC(KSP_A, PC_A, ierr) >> > call KSPSetTolerances(KSP_A, 1.d-20, PETSC_DEFAULT_DOUBLE_PRECISION, >> > PETSC_DEFAULT_DOUBLE_PRECISION, PETSC_DEFAULT_INTEGER, ierr) >> > call PCSetType(PC_A, PCLU, ierr) >> > call PCFactorSetMatSolverPackage(PC_A, MATSOLVERMUMPS, ierr) >> > call PCFactorSetUpMatSolverPackage(PC_A, ierr) >> > call PCFactorGetMatrix(PC_A, PC_A, ierr) >> > call MatMumpsSetIcntl(PC_A, 7, 5, ierr) >> > call PCSetup(PC_A, ierr) >> > call KSPSetUp(KSP_A, ierr) >> > >> > Then several times per time step: >> > call KSPSolve( KSP_A, b, x, ierr) >> > >> > This works fine. >> > However, I am able to precompute the maximal sparsity pattern of A >> > before >> > the time iterations. Therefore, I would like to use this information by >> > precomputing the symbolic factorization before the time iterations >> > start, >> > and only compute the numerical factorization at each time step. Is there >> > a >> > way to use MUMPS in PETSC to do this ? I would appreciate any >> > help/reference >> > on this topic. >> > >> > Thank you, >> > >> > Tibo > >
