[petsc-users] PC shell destroy

Mark Adams mfadams at lbl.gov
Thu Sep 30 16:32:57 CDT 2021


You can use PETSc functions to allocate and free memory and then run with
-malloc_debug and you will get a printout of memory used and any unfreed
memory.
Mark

On Thu, Sep 30, 2021 at 4:14 PM Alfredo J Duarte Gomez <aduarteg at utexas.edu>
wrote:

> Good afternoon PETSC team,
>
> I am currently developing an application for PETSC in which I use my own
> preconditioner with a PCSHELL.
>
> I have successfully set all the functions and the performance of the
> preconditioner is good. I am using this PCSHELL within a TS object, and it
> is imperative that the objects in the PCSHELL context are freed every time
> since the memory requirements of those are large.
>
> I have set up the Preconditioner before the TS starts with the following
> block of code:
>
> ----------------------------------------------------------------------------------------------------
>
> ierr = PCSetType(pc,PCSHELL);CHKERRQ(ierr);
>   ierr = ShellPCCreate(&shell);CHKERRQ(ierr);
>   ierr = PCShellSetApply(pc,MatrixFreePreconditioner);CHKERRQ(ierr);
>   ierr = PCShellSetContext(pc,shell);CHKERRQ(ierr);
>   ierr = PCShellSetDestroy(pc,ShellPCDestroy);CHKERRQ(ierr);
>   ierr = PCShellSetName(pc,"MyPreconditioner");CHKERRQ(ierr);
>   ierr = ShellPCSetUp(pc,da,0.0,dt,u,user);CHKERRQ(ierr);
>   ierr = TSSetPreStep(ts,PreStep);CHKERRQ(ierr);
>
>
> ------------------------------------------------------------------------------------------------
>
> The shell context is then updated by using the following code within the
> TSPreStep function:
>
> ---------------------------------------------------------------------------
>
>  ierr = TSGetSNES(ts,&snes);CHKERRQ(ierr);
>   ierr = SNESGetKSP(snes,&ksp);CHKERRQ(ierr);
>   ierr = KSPGetPC(ksp,&pc);CHKERRQ(ierr);
>
>   // Get necessary objects from TS context
>   TSGetTime(ts,&time);
>   TSGetApplicationContext(ts,&user);
>   TSGetSolution(ts,&X);
>   TSGetTimeStep(ts,&dt);
>   TSGetStepNumber(ts, &stepi);
>   TSGetDM(ts,&da);
>
>   tdt = time+dt;
>   // Update preconditioner context with current values
>   ierr = ShellPCSetUp(pc,da,tdt,dt,X,user);CHKERRQ(ierr);
> ---------------------------------------------------------------------------
>
> I have set up the necessary code in the function ShellPCDestroy to free
> the objects within this context, however I am unsure when/if this function
> is called automatically. Do I have to free the context myself after every
> step? How would I call the function myself?
>
> I am running out of memory after a few steps, and I think this shell
> context is the culprit.
>
> In addition to that, is it possible to get what is called the "ashift" dF/dU
> + a*dF/dU_t in this function from the TS object?
>
> https://petsc.org/release/docs/manualpages/TS/TSSetIJacobian.html
>
> I need it as an input for my preconditioner (currrently hardcoded for
> TSBEULER where ashift is always 1/dt).
>
> Thank you,
>
> -Alfredo
>
> --
> Alfredo Duarte
> Graduate Research Assistant
> The University of Texas at Austin
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20210930/dd775ab4/attachment.html>


More information about the petsc-users mailing list