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
