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

Smith, Barry F. bsmith at mcs.anl.gov
Thu Dec 28 11:21:48 CST 2017



> On Dec 28, 2017, at 10:34 AM, Franck Houssen <franck.houssen at inria.fr> wrote:
> 
> ----- Mail original -----
>> De: "Barry F. Smith" <bsmith at mcs.anl.gov>
>> À: "Franck Houssen" <franck.houssen at inria.fr>
>> Cc: "For users of the development version of PETSc" <petsc-dev at mcs.anl.gov>
>> Envoyé: Jeudi 28 Décembre 2017 16:43:16
>> Objet: Re: [petsc-dev] How to pass user data to a registered PC (PCRegister) ?
>> 
>> 
>>   The register is for a new type of PC of which can have many instantiations
>>   at the same time.
> 
> OK, I didn't get that that way ! I was looking for a way to plug "my" pc at the command line this way: -pc_type my_pc.
> I already call PCSetType(pc, PCSHELL) and PCShellSetName(pc, "my_pc"): maybe this already enables "-pc_type shell" or "-pc_type my_pc"... And I didn't know it ! :D I'll try that.
> 
> I was looking for a way to integrate "my" (external) pc as any other regular/existing petsc pc (bjacobi, ...) like a kind of plugin but still integrated to the cmd line: I believed PCRegister was meant for that.

   Indeed it is exactly what it is meant for.  Please try to follow my recipe and let us know when you get stuck.


> Not sure if this is actually possible/enabled by the API.
> 
>> 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