<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>Ok, so now I'm leaking memory without even creating the extra matrix:</div><div><br></div><div><div>PetscErrorCode HamiltonianJ(TS timeStepContext, PetscReal t, Vec u, Mat *A, Mat *B, MatStructure *flag, void* context)</div><div>{</div><div>&nbsp; &nbsp; PetscErrorCode &nbsp;err;</div><div>&nbsp; &nbsp; Context &nbsp; &nbsp; &nbsp; &nbsp; *cntx = (Context*)context;</div><div>&nbsp; &nbsp; PetscScalar &nbsp; &nbsp; ef = eField(t, cntx-&gt;params);</div><div>&nbsp; &nbsp; //if (cntx-&gt;rank == 0) std::cout &lt;&lt; "ef: " &lt;&lt; ef;</div><div>&nbsp; &nbsp;&nbsp;</div><div>&nbsp; &nbsp; err = MatDuplicate(cntx-&gt;energy_eigenstates,MAT_COPY_VALUES,A);</div><div>&nbsp; &nbsp; err = MatAXPY(*A, ef, cntx-&gt;dipole_matrix, DIFFERENT_NONZERO_PATTERN);</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>err = MatAssemblyBegin(*A, MAT_FINAL_ASSEMBLY);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>err = MatAssemblyEnd(*A, MAT_FINAL_ASSEMBLY);</div><div>&nbsp; &nbsp;&nbsp;</div><div>&nbsp; &nbsp; *flag = DIFFERENT_NONZERO_PATTERN;</div><div><br></div><div>&nbsp; &nbsp; // absorb!</div><div><br></div><div>&nbsp; &nbsp; return err;</div><div>}</div></div><div><br></div><div>I'm honestly stumped now…</div><div><br></div><div>-Andrew</div><div><br></div><br><div><div>On May 16, 2012, at 7:17 AM, Jed Brown wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div class="gmail_quote">On Wed, May 16, 2012 at 7:08 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">
<div style="word-wrap:break-word">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></blockquote><div><br></div><div>Do you really mean to only change A (the operator), but not B (the preconditioning matrix)?</div>
<div><br></div><div>Why do you want to create a new matrix instead of reusing those?</div></div>
</blockquote></div><br></body></html>