The DM keeps track of the local vectors created by DMGetLocalVector(). So, if 
your routine gets called a million times with exactly one DMGetLocalVector() 
followed by one call to DMRestoreLocalVector(), then only one vector is created.

Shri

From: Miguel Angel Salazar de Troya 
<[email protected]<mailto:[email protected]>>
Date: Wed, 19 Nov 2014 14:02:10 -0600
To: barry smith <[email protected]<mailto:[email protected]>>
Cc: "[email protected]<mailto:[email protected]>" 
<[email protected]<mailto:[email protected]>>
Subject: Re: [petsc-users] PetscFunctionBegin, -malloc_dump and C++ classes 
with PETSc objects

You were right. I was forgetting a DMRestoreLocalVector(). Thanks. If we are 
creating local vectors every time we call functions such as the RHSFunction of 
a TS implementation, which is called many times in the TS integration, will 
this be a problem in terms of performance? I've noticed that it might be. This 
is the way it is implemented in some TS. I wanted to double check with you guys 
before I figure out a way to create just one local vector that is re used in 
functions such as RHSFunction.

Miguel

On Tue, Nov 18, 2014 at 12:54 PM, Barry Smith 
<[email protected]<mailto:[email protected]>> wrote:

> On Nov 18, 2014, at 11:54 AM, Miguel Angel Salazar de Troya 
> <[email protected]<mailto:[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]<mailto:[email protected]>> wrote:
>
> > On Nov 18, 2014, at 11:19 AM, Miguel Angel Salazar de Troya 
> > <[email protected]<mailto:[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]<mailto:[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]<mailto:[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]<mailto:[email protected]>

Reply via email to