Hong,

Thanks for your email. My question now is how to handle situations where
the matrix structure changes during the iteration process?

Adolfo

On Wed, Jul 22, 2020 at 8:32 AM Zhang, Hong <hongzh...@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 (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
>
>

Reply via email to