Thanks Barry, I can't share the orginal code i'am working on unfortunately. But the example i wrote -- even if you do not that into account //SOME CODE HERE .. part -- give me , by using PetscMallocDump, some informations about memory that was not freed. Based on the example code i sent, i was expecting that PetscMallocDump give no output. Médane On 24/09/2021 16:13, Barry Smith wrote:
The code you sent looks fine, it should not leak memory.
Perhaps the /// SOME CODE HERE.... is doing something that prevents the matrix from being actually freed. PETSc uses reference counting on its objects so if another object keeps a reference to the matrix then the memory of the matrix will not be freed until the reference count drops back to zero. For example if a KSP has a reference to the matrix and the KSP has not been completely freed the matrix memory will remain.
We would need to see the full code to understand why the matrix is not being freed.
Barry
On Sep 24, 2021, at 10:08 AM, Medane TCHAKOROM <[email protected]> wrote:
Hello,
I have problem with a code i'am working on.
To illustrate my problem, here is an example:
int main(int argc, char *argv[]) {
PetscErrorCode ierr;
ierr = PetscInitialize(&argc, &argv, (char *)0, NULL); if (ierr) return ierr;
int i = 0; for (i = 0; i < 1; i++) { Mat A; ierr = MatCreate(PETSC_COMM_WORLD, &A); CHKERRQ(ierr); ierr = MatSetSizes(A, 16, 16, PETSC_DECIDE,PETSC_DECIDE); CHKERRQ(ierr); ierr = MatSetFromOptions(A); CHKERRQ(ierr); ierr = MatSetUp(A); CHKERRQ(ierr);
ierr = MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr); ierr = MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
/// SOME CODE HERE....
MatDestroy(&A);
}
FILE *fPtr; fPtr = fopen("petsc_dump_file.txt", "a"); PetscMallocDump(fPtr); fclose(fPtr);
ierr = PetscFinalize(); CHKERRQ(ierr);
return 0; }
The problem is , in the loop, the memory consumption keep increasing till the end of the program.
I checked memory leak with PetscMallocDump, and found out that the problem may be due to matrix creation.
I'am new to Petsc and i don't know if i'am doing something wrong. Thanks
Médane