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>

Reply via email to