> On Nov 18, 2014, at 11:54 AM, Miguel Angel Salazar de Troya 
> <[email protected]> wrote:
> 
> PetscFinalize() is inside of the class destructor (the last line of the 
> destructor), so when the object goes out of scope, the class destructor is 
> called and PetscFinalize() as well. Is it better to have PetscFinalize() 
> outside of the destructor and call the destructor explicitly before?

   It shouldn't really matter.  

    My guess is you must be missing calling a destroy or restore on one of the 
PETSc objects.

  Barry

> 
> Miguel
> 
> On Tue, Nov 18, 2014 at 11:32 AM, Barry Smith <[email protected]> wrote:
> 
> > On Nov 18, 2014, at 11:19 AM, Miguel Angel Salazar de Troya 
> > <[email protected]> wrote:
> >
> > Hi
> >
> > I'm implementing a problem using the TS. Most of my functions are methods 
> > inside of a class, except for the callbacks (to form the RHS and the TS 
> > monitor), which are outside of the class, although in the same .C file 
> > where the class methods are implemented. For these callbacks I followed the 
> > network example:
> >
> > https://bitbucket.org/petsc/petsc/src/a614f7369d93d476173b8fc6bf2463276dcbdb3a/src/snes/examples/tutorials/network/pflow/pf.c?at=master
> >
> > Therefore, the callbacks have the PetscFunctionBegin at the beginning and 
> > PetscFunctionReturn(0) at the end. My problems come when I run the program 
> > with -malloc_dump and I get a lot of unfreed memory. Inspecting the output 
> > I see that the line of my code where the memory is allocated corresponds 
> > with the line when PetscFunctionBegin is called.
> 
>   This is normal. We cannot register the exact line the memory allocated, 
> only the location of the PETScFunctionBegin;
> 
> 
> > Later in the file, I see that the function DMGetLocalVector() is called 
> > within a petsc internal routine (at the file dmget.c). I also call this 
> > routine in my callback methods few lines after PetscFunctionBegin. The 
> > procedure that I follow to use the local vectors is as the one in the 
> > network example. For vectors that I want to modify this is:
> >
> >  ierr = DMGetLocalVector(networkdm,&localX);CHKERRQ(ierr);
> >  ierr = 
> > DMGlobalToLocalBegin(networkdm,X,INSERT_VALUES,localX);CHKERRQ(ierr);
> >  ierr = DMGlobalToLocalEnd(networkdm,X,INSERT_VALUES,localX);CHKERRQ(ierr);
> >  ierr = VecGetArray(localX,&xarr);CHKERRQ(ierr);
> >
> > Modify values in xarr
> >
> >  ierr = VecRestoreArray(localX,&xarr);CHKERRQ(ierr);
> >  ierr = 
> > DMLocalToGlobalBegin(networkdm,localX,INSERT_VALUES,X);CHKERRQ(ierr);
> >  ierr = DMLocalToGlobalEnd(networkdm,localX,INSERT_VALUES,X);CHKERRQ(ierr);
> >  ierr = DMRestoreLocalVector(networkdm,&localX);CHKERRQ(ierr);
> >
> > One last thing that I think it might be a issue here is how I destroy the 
> > petsc objects. I create the petsc objects within a class. For instance, the 
> > class has a petsc vector that later passes to the TS object to get the 
> > solution. To destroy the petsc objects, I use the class destructor, where 
> > at the end I call PetscFinalize() Inside the class I pass the callbacks to 
> > the TS routines that need them (e.g. TSSetRHSFunction() ) I can compile the 
> > code and run it, but many memory allocations are not freed. What can be the 
> > issue here? Do you know of an example using C++ classes to implement PETSc 
> > methods? Thanks in advance.
> 
>    Do you call the class destructor yourself explicitly before the 
> PetscFinalize()? You need to, otherwise the class may not be destroyed until 
> after PetscFinalize() and hence the PETSc objects won't be freed when you 
> call PetscFinalize().
> 
>    You also need to make sure that you destroy ALL PETSc objects, if you miss 
> even one PETSc object, since the objects have references to each other it may 
> be that many PETSc objects do not get freed and hence -malloc_dump shows many 
> objects still alive.
> 
>   Barry
> 
> >
> > Miguel
> >
> > --
> > Miguel Angel Salazar de Troya
> > Graduate Research Assistant
> > Department of Mechanical Science and Engineering
> > University of Illinois at Urbana-Champaign
> > (217) 550-2360
> > [email protected]
> >
> 
> 
> 
> 
> -- 
> Miguel Angel Salazar de Troya
> Graduate Research Assistant
> Department of Mechanical Science and Engineering
> University of Illinois at Urbana-Champaign
> (217) 550-2360
> [email protected]
> 

Reply via email to