<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head><body style='font-size: 10pt; font-family: Verdana,Geneva,sans-serif'>
<p id="reply-intro">Ah thank you very much! It works perfectly now. I will keep in mind that rule from now on.</p>
<p>Best regards,</p>
<p>Perceval,</p>
<blockquote type="cite" style="padding: 0 0.4em; border-left: #1010ff 2px solid; margin: 0">
<div class="pre" style="margin: 0; padding: 0; font-family: monospace">MatDestroy(&B) should not be called, for the same reason as the PC - it is owned by the PC object, it just gives you a pointer. This is stated in the manpage of PCFactorGetMatrix:<br /><br />   Notes:<br />    Does not increase the reference count for the matrix so DO NOT destroy it<br /><br />As a general rule, objects returned by functions XXXGetYYY() should not be destroyed, while objects returned by functions XXXCreateYYY() should.<br /><br />Jose<br /><br /><br />
<blockquote type="cite" style="padding: 0 0.4em; border-left: #1010ff 2px solid; margin: 0">El 24 mar 2020, a las 18:26, Perceval Desforges <<a href="mailto:perceval.desforges@polytechnique.edu">perceval.desforges@polytechnique.edu</a>> escribió:<br /><br />Thank you but I am still confused, I still get the same error message when calling KSPDestroy(). My code looks something like this:<br /><br /><br /><br />ierr = MatShift(M,-E);<br />ierr = KSPCreate(PETSC_COMM_WORLD,&ksp);<br />ierr = KSPSetOperators(ksp,M,M);<br />ierr = KSPSetType(ksp,KSPPREONLY);<br />ierr = KSPGetPC(ksp,&pc);<br />ierr = PCSetType(pc,PCCHOLESKY);<br />ierr = KSPSetUp(ksp);<br />ierr = PCFactorGetMatrix(pc,&B);<br />ierr = MatGetInertia(B,&nneg,&nzero,&npos);<br />ierr = PetscPrintf(PETSC_COMM_WORLD,"nneg: %D    nzero: %D    npos: %D   \n",nneg,nzero,npos);<br />ierr = MatDestroy(&B);<br />ierr = MatDestroy(&M);<br />ierr = KSPDestroy(&ksp);<br /><br />where I've defined the matrix M beforehand. What am I doing wrong?<br /><br />Thanks again,<br /><br />Best regards,<br /><br />Perceval,<br /><br /><br /><br />
<blockquote type="cite" style="padding: 0 0.4em; border-left: #1010ff 2px solid; margin: 0">If you obtained the PC object with KSPGetPC() then you do not have to destroy it, only the KSP object. KSPGetPC() only gives a pointer to the internal object, which is managed by the KSP.<br />Jose<br /><br /><br />
<blockquote type="cite" style="padding: 0 0.4em; border-left: #1010ff 2px solid; margin: 0">El 24 mar 2020, a las 17:18, Perceval Desforges <<a href="mailto:perceval.desforges@polytechnique.edu">perceval.desforges@polytechnique.edu</a>> escribió:<br /><br />Thank you very much, this seems to work well.<br /><br />I have another question linked to this which is probably a bit basic so I apologize.<br /><br />At the end of my program, I want to destroy all the petsc objects. I start by destroying the matrixes, then the ksp and pc objects similarly to how it's done in the examples. However I get an error when attempting to destroy the KSP and PC objects :<br /><br />[0]PETSC ERROR: Invalid argument<br /><br />[0]PETSC ERROR: Wrong type of object: Parameter # 1<br /><br />I've tried switching the order around, but I still get the same errors. <br /><br />And if I don't destroy these objects I get a memory leak, which I'd like to avoid.<br /><br />My question is I don't really understand when and how I'm supposed to destroy the KSP and PC objects? <br /><br />Thanks again,<br /><br />Best regards,<br /><br />Perceval,<br /><br /><br /><br /><br /><br />
<blockquote type="cite" style="padding: 0 0.4em; border-left: #1010ff 2px solid; margin: 0">You can do this directly in PETSc. Create a KSP object with PREONLY and PCCHOLESKY (or just a PC object). Then call KSPSetUp (or PCSetUp) and extract the factored matrix with PCFactorGetMatrix(). Then call MatGetInertia() on the factored matrix. Repeat this for each value of E.<br /><br />I guess it can be even shorter if you call MatCholeskyFactor() directly.<br /><br />Jose<br /><br /><br />
<blockquote type="cite" style="padding: 0 0.4em; border-left: #1010ff 2px solid; margin: 0">El 24 mar 2020, a las 11:07, Perceval Desforges <<a href="mailto:perceval.desforges@polytechnique.edu">perceval.desforges@polytechnique.edu</a>> escribió:<br /><br />Dear petsc developers,<br /><br />I am interested in calculating the inertias of matrixes. Specifically, for a certain matrix A, and for different real numbers E, I want to calculate the inertias of (A - E * I), in order to get the number of eigenvalues less than E. <br /><br />In order to do this I have been setting up a slepc EPS object with spectrum slicing, and using EPSKrylovSchurGetInertias. I realize this is a bit convoluted, and was wondering if there is a better way to do this?<br /><br />Best regards,<br /><br />Perceval,<br /><br />P.S. my last email seems to not have been sent (I couldn't find it in the archives) so I am trying again...<br /><br /></blockquote>
</blockquote>
<br /><br /></blockquote>
</blockquote>
<br /><br /></blockquote>
</div>
</blockquote>
<p><br /></p>

</body></html>