<html><head><meta http-equiv="Content-Type" content="text/html; charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Jul 22, 2020, at 9:35 AM, Adolfo Rodriguez <<a href="mailto:adantra@gmail.com" class="">adantra@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Hong,<div class=""><br class=""></div><div class="">Thanks for your email. My question now is how to handle situations where the matrix structure changes during the iteration process?</div></div></div></blockquote><div><br class=""></div>   The routine you are calling MatSeqAIJSetPreallocationCSR() is fine. It allows you to put in new CSR data structures with different nonzero patters. </div><div><br class=""></div><div>    See my previous email.</div><div><br class=""></div><div>   Barry</div><div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class="">Adolfo </div></div><br class=""><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Jul 22, 2020 at 8:32 AM Zhang, Hong <<a href="mailto:hongzhang@anl.gov" class="">hongzhang@anl.gov</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br class="">
<br class="">
> On Jul 22, 2020, at 7:03 AM, Adolfo Rodriguez <<a href="mailto:adantra@gmail.com" target="_blank" class="">adantra@gmail.com</a>> wrote:<br class="">
> <br class="">
> 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.<br class="">
> <br class="">
> My FormJacobian function is something like this:<br class="">
> <br class="">
> .. FormJacobian( ..){<br class="">
>      matrixconstruction(); // returns csr matrix in c++ regular vectors<br class="">
>      MatSeqAIJSetPreallocationCSR ...;<br class="">
>      //loop over the entries and <br class="">
>      MatSetValues;<br class="">
>      MatAssemblyBegin();<br class="">
>      MatAssemblyEnd();<br class="">
>      return 0;<br class="">
> }<br class="">
<br class="">
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<br class="">
<br class="">
SNESSetJacobian(SNES snes,Mat Amat,Mat Pmat,PetscErrorCode (*J)(SNES,Vec,Mat,Mat,void*),void *ctx)<br class="">
<br class="">
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.<br class="">
<br class="">
The working matrix should be destroyed after SNESSolve().<br class="">
<br class="">
Hong (Mr.)<br class="">
<br class="">
<br class="">
> 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.<br class="">
> <br class="">
> Any suggestions?<br class="">
> <br class="">
> Regards,<br class="">
> <br class="">
> Adolfo<br class="">
<br class="">
</blockquote></div>
</div></blockquote></div><br class=""></body></html>