<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Not until you pointed it out… :). &nbsp;Though it probably should have been. &nbsp;It was late.<div><br></div><div>Though I'm not sure how to fix that… should I do a MatDestroy(A) at the beginning of that function every time?.</div><div><br></div><div>Is *A a pointer to the last used matrix, should I just do the mat duplicate into A?</div><div><br></div><div>Thanks for the help,</div><div><br></div><div>-Andrew</div><div><br></div><div><br><div><div>On May 16, 2012, at 2:51 AM, Aron Ahmadia wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div dir="ltr">Umnn, I hope this isn't too obvious, but you're duplicating your matrix at every time step without freeing it and expecting that to not be a problem?<div><br></div><div>A<br><div><br><div class="gmail_quote">
On Wed, May 16, 2012 at 9:01 AM, Andrew Spott <span dir="ltr">&lt;<a href="mailto:andrew.spott@gmail.com" target="_blank">andrew.spott@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I'm attempting to run some code with a rather large (&gt;1GB) sparse matrix, and I keep getting kicked out of the que for what I believe is using too much memory. &nbsp;The unfortunate thing is that as the steps go up, the memory usage seems to as well, which would normally indicate a memory leak.<br>

<br>
But I'm not really doing anything that would lead to a memory leak, my jacobian is:<br>
<br>
PetscErrorCode HamiltonianJ(TS timeStepContext, PetscReal t, Vec u, Mat *A, Mat *B, MatStructure *flag, void* context)<br>
{<br>
 &nbsp; &nbsp;Mat h;<br>
 &nbsp; &nbsp;PetscErrorCode &nbsp;err;<br>
 &nbsp; &nbsp;Context &nbsp; &nbsp; &nbsp; &nbsp; *cntx = (Context*)context;<br>
 &nbsp; &nbsp;PetscScalar &nbsp; &nbsp; ef = eField(t, cntx-&gt;params);<br>
 &nbsp; &nbsp;//if (cntx-&gt;rank == 0) std::cout &lt;&lt; "ef: " &lt;&lt; ef;<br>
<br>
<br>
 &nbsp; &nbsp;err = MatDuplicate(cntx-&gt;energy_eigenstates,MAT_COPY_VALUES,&amp;h);<br>
 &nbsp; &nbsp;err = MatAXPY(h, ef, cntx-&gt;dipole_matrix, DIFFERENT_NONZERO_PATTERN);<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;err = MatAssemblyBegin(h, MAT_FINAL_ASSEMBLY);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;err = MatAssemblyEnd(h, MAT_FINAL_ASSEMBLY);<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;*A = h;<br>
 &nbsp; &nbsp;*flag = DIFFERENT_NONZERO_PATTERN;<br>
<br>
 &nbsp; &nbsp;return err;<br>
}<br>
<br>
And my Monitor function is:<br>
<br>
PetscErrorCode Monitor(TS ts, PetscInt step, PetscReal t, Vec u, void *cntx)<br>
{<br>
 &nbsp; &nbsp;Context &nbsp; &nbsp; &nbsp; &nbsp; *context = (Context*) cntx;<br>
 &nbsp; &nbsp;PetscErrorCode &nbsp;ierr = 0;<br>
 &nbsp; &nbsp;PetscScalar &nbsp; &nbsp; ef = eField(t, context-&gt;params);<br>
<br>
 &nbsp; &nbsp;if (context-&gt;rank == 0 &amp;&amp; context-&gt;progress) std::cout &lt;&lt; step &lt;&lt; ": " &lt;&lt; t &lt;&lt; " ef: " &lt;&lt; ef &lt;&lt; std::endl;<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;return ierr;<br>
}<br>
<br>
I looked at it with valgrind, and got a summary of:<br>
<br>
==24941== LEAK SUMMARY:<br>
==24941== &nbsp; &nbsp;definitely lost: 0 bytes in 0 blocks<br>
==24941== &nbsp; &nbsp;indirectly lost: 0 bytes in 0 blocks<br>
==24941== &nbsp; &nbsp; &nbsp;possibly lost: 1,291,626,491 bytes in 4,050 blocks<br>
==24941== &nbsp; &nbsp;still reachable: 1,795,550 bytes in 88 blocks<br>
==24941== &nbsp; &nbsp; &nbsp; &nbsp; suppressed: 0 bytes in 0 blocks<br>
<br>
with a bunch of things like this:<br>
<br>
==24937== 757,113,160 bytes in 10 blocks are possibly lost in loss record 1,834 of 1,834<br>
==24937== &nbsp; &nbsp;at 0x4A05306: memalign (vg_replace_malloc.c:532)<br>
==24937== &nbsp; &nbsp;by 0x43083C: PetscMallocAlign(unsigned long, int, char const*, char const*, char const*<br>
, void**) (mal.c:30)<br>
==24937== &nbsp; &nbsp;by 0x434144: PetscTrMallocDefault(unsigned long, int, char const*, char const*, char co<br>
nst*, void**) (mtr.c:196)<br>
==24937== &nbsp; &nbsp;by 0x8641BF: MatSeqAIJSetPreallocation_SeqAIJ (aij.c:3550)<br>
==24937== &nbsp; &nbsp;by 0x861DBA: MatSeqAIJSetPreallocation(_p_Mat*, int, int const*) (aij.c:3493)<br>
==24937== &nbsp; &nbsp;by 0x9201B5: MatMPIAIJSetPreallocation_MPIAIJ (mpiaij.c:3209)<br>
==24937== &nbsp; &nbsp;by 0x922600: MatMPIAIJSetPreallocation(_p_Mat*, int, int const*, int, int const*) (mpiaij.c:3897)<br>
==24937== &nbsp; &nbsp;by 0x9315BA: MatAXPY_MPIAIJ(_p_Mat*, std::complex&lt;double&gt;, _p_Mat*, MatStructure) (mpiaij.c:2254)<br>
==24937== &nbsp; &nbsp;by 0x5A9828: MatAXPY(_p_Mat*, std::complex&lt;double&gt;, _p_Mat*, MatStructure) (axpy.c:39)<br>
==24937== &nbsp; &nbsp;by 0x405EF7: HamiltonianJ(_p_TS*, double, _p_Vec*, _p_Mat**, _p_Mat**, MatStructure*, void*) (in /home/becker/ansp6066/code/EnergyBasisSchrodingerSolver/bin/propagate)<br>
==24937== &nbsp; &nbsp;by 0x736441: TSComputeRHSJacobian(_p_TS*, double, _p_Vec*, _p_Mat**, _p_Mat**, MatStructure*) (ts.c:186)<br>
==24937== &nbsp; &nbsp;by 0x736D68: TSComputeRHSFunctionLinear(_p_TS*, double, _p_Vec*, _p_Vec*, void*) (ts.c:2541)<br>
<br>
I imagine these are not actual memory errors, but I thought I'm not sure what is leaking, so I thought I would bring it to your attention.<br>
<br>
I can attach the full valgrind output, but at 2mb, it is rather large, so I figured I would wait for someone to ask for it.<br>
<br>
Any idea what the memory leak could be? &nbsp;Am I doing something stupid?<br>
<br>
Thanks for the help, as always.<br>
<span class="HOEnZb"><font color="#888888"><br>
-Andrew</font></span></blockquote></div><br></div></div></div>
</blockquote></div><br></div></body></html>