[petsc-dev] How to pass user data to a registered PC (PCRegister) ?

Smith, Barry F. bsmith at mcs.anl.gov
Thu Dec 28 09:43:16 CST 2017


   The register is for a new type of PC of which can have many instantiations at the same time. For example

    PCRegister("mypctype",mypc_create);

    KSPCreate(&ksp1);
    KSPCreate(&ksp2);

    KSPGetPC(ksp1,&pc1);
    KSPGetPC(ksp2,&pc2);

    You don't want pc1 and pc2 to have the same dof multiplicities, domain intersections etc since they are associated with completely different linear systems and presumably meshes etc.


     Presumably you want each of pc1, pc2, to have their own version of the data so you need to stick it directly in the PC, for example

   PCMypcSetDOFMultiplicities(pc1,stuff);
  PCMypcSetDOFMultiplicities(pc2,otherstuff);

You write as many of these Set() functions as you need for your PCtype. You store the data inside the PC_Mypc data structure you create with mypc_create(). Look at PCCreate_Jacobi() and PCJacobiSetType for the pattern.

   Barry


> On Dec 28, 2017, at 9:34 AM, Franck Houssen <franck.houssen at inria.fr> wrote:
> 
> How to pass user data to a registered PC (PCRegister) ?
> 
> At first, I expected the signature would be "PetscErrorCode PCRegister(const char sname[],PetscErrorCode (*function)(PC, void *))" but it turns out to be "PetscErrorCode PCRegister(const char sname[],PetscErrorCode (*function)(PC))"
> 
> I try to integrate a PC that needs A but also other informations (dof multiplicities, domain intersections that the user must provide). I guess I can get A with PCGetOperators in the setup callback of the PC. But still not sure how to pass the other informations if I get to use PCRegister. I looked a few examples in the bitbucket (jacobi: src/ksp/ksp/examples/tutorials/ex12.c and src/ksp/pc/impls/jacobi/jacobi.c + SOR: src/ksp/pc/impls/sor/sor.c)... But didn't get any real relevant answer and feel a bit lost among the numerous pc !...
> 
> The idea is: for now I use PCSetType(pc, PCSHELL) and PCShellSetContext with a context who knows the extra needed informations which is "not so handy" (that's OK as for now I am both the user and the PC provider). I'd like to package this in a more convenient way (a unique and "simple" call to PCRegister) to decouple the user from the PC machinery.
> 
> Franck



More information about the petsc-dev mailing list