On Wed, Jul 22, 2020 at 9:32 AM Zhang, Hong via petsc-users < petsc-users@mcs.anl.gov> wrote:
> > > > On Jul 22, 2020, at 7:03 AM, Adolfo Rodriguez <adan...@gmail.com> wrote: > > > > I am trying to replace the non-linear solver in a flow simulation > problem where the matrix sparsity can change during the iterations. I tried > successfully to create the matrix within the FormJacobian function but I > have a memory leak which I don't know how to fix. > > > > My FormJacobian function is something like this: > > > > .. FormJacobian( ..){ > > matrixconstruction(); // returns csr matrix in c++ regular vectors > > MatSeqAIJSetPreallocationCSR ...; > > //loop over the entries and > > MatSetValues; > > MatAssemblyBegin(); > > MatAssemblyEnd(); > > return 0; > > } > > Yes, the leak is caused by the new matrix created every time FormJacobian > is called. The working matrix for SNES needs to be allocated only once and > passed to SNES by using > > SNESSetJacobian(SNES snes,Mat Amat,Mat Pmat,PetscErrorCode > (*J)(SNES,Vec,Mat,Mat,void*),void *ctx) > > In your FormJacobian(SNES snes,Vec x,Mat A,Mat B,void *ctx), you just need > to copy the csr matrix to the matrix A, which has already been allocated. > > The working matrix should be destroyed after SNESSolve(). > Hong, what is the best way to wipe out the existing structure, preallocate, and set new values? Thanks, Matt > Hong (Mr.) > > > > This approach works for small problems but, when dealing with large ones > I observe a memory leak. I am pretty sure that It is related to the fact > that I am creating new matrices every time FormJacobian is called but I > don't know how to destroy it between iterations. > > > > Any suggestions? > > > > Regards, > > > > Adolfo > > -- What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead. -- Norbert Wiener https://www.cse.buffalo.edu/~knepley/ <http://www.cse.buffalo.edu/~knepley/>