PetscObjectGetReference() but when a destroy routine is called, the pointer value is nulled so you cannot do
MatDestroy(A); PetscObjectGetReference(A); You could something like B = A MatDestroy(A); PetscObjectGetReference(B); Note if the object is actually destroyed (memory freed because the reference count got to zero) then calling PetscObjectGetReference(); will crash on it. The KSP has all kinds of stuff in it that depend a great deal on the KSPType and PCType selected, these can use a large amount of memory. You could also try KSPReset() instead of the KSPDestroy()/KSPCreate() pair. The reset attempts to clear out most of the data in the KSP so this might be as good as the Destroy/Create pair. Sounds like your best choice is either KSPReset() or KSPDestroy()/KSPCreate() > On Jul 31, 2022, at 5:22 AM, Edoardo alinovi <[email protected]> > wrote: > > Hello Barry, > > I tested what we discussed yesterday and I would say the KSPDestroy works > good, while the trick of setting the matrix to NULL in KSPSetOperators does > not. > > I attach here the memory traces of my code: > - baseline (each equation keep the matrix and does not destroy KSP) > - With KSPSetOperators(ksp, PETSC_NULL_MAT,PETSC_NULL_MAT) > - With KSPDestroy() before MatDestroy() > > Clearly, the last one is a winner, while the first two look pretty similar! > Any possible explanation? I can happily destroy KSP, but the other one is > cleaner to implement :) > > Is there any way to get the reference count of an object just to double check > it is not referenced anymore? > > Thank you > > Il Sab 30 Lug 2022, 21:59 Barry Smith <[email protected] > <mailto:[email protected]>> ha scritto: > > Yes, as you describe below. > >> On Jul 30, 2022, at 4:31 PM, Edoardo alinovi <[email protected] >> <mailto:[email protected]>> wrote: >> >> Hello Barry, >> >> I assume you are calling KSPSetOperators() before each new KSPSolve() so >> that it knows to solve a new system? >> >> Yes, I do. >> >> This looks like a good trick: >> KSPSetOperators(ksp,PETSC_NULL_MAT,PETSC_NULL_MAT) >> >> So you would do: >> >> 1) KSPSetOperators(ksp,A,A) >> >> 2) KSPSolve(myksp, myrhs, mysol) >> >> 3) KSPSetOperators(ksp,PETSC_NULL_MAT,PETSC_NULL_MAT) >> >> 4) MatDestroy(A) >> >> Am I right? >> >> I'll have a try and I'll try to destroy the ksp of each equation as well. >> The second is more tedious because I'll have to reconstruct it every time. >> I'll do some tests to see if that helps. >> >> Thanks a lot! >> >> >> > > <baseline.PNG><KSPDestroy.PNG><setOperatorsNULL.PNG>
