[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