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

Franck Houssen franck.houssen at inria.fr
Mon Jan 22 03:12:37 CST 2018


----- Mail original -----
> De: "Barry F. Smith" <bsmith at mcs.anl.gov>
> À: "Franck Houssen" <franck.houssen at inria.fr>
> Cc: "Barry F. Smith" <bsmith at mcs.anl.gov>, "For users of the development version of PETSc" <petsc-dev at mcs.anl.gov>
> Envoyé: Dimanche 21 Janvier 2018 23:08:27
> Objet: Re: [petsc-dev] How to pass user data to a registered PC (PCRegister) ?
> 
> 
>   I absolutely hate package configures that say they can't find something but
>   give NO indication how to indicate the location of the missing thing.
> 

I agree 100%... But I try to do things with what's available here (cmake/travis) keeping in mind that nothing is never perfect ! :D Cmake rely on the environment that must be set up correctly. Travis is a pain as you must trigger PR and can not test live what's wrong... Anyway.

Did you set PKG_CONFIG_PATH (the one variable that nobody never knows or remind of !) and CMAKE_PREFIX_PATH as described in the wiki/FAQ (https://github.com/fghoussen/geneo4PETSc/wiki/Install:-FAQ.

Did you try to follow steps in the .travis.yml (working on debian, ubuntu-trusty, still fighting to get that to work on osx - osx branch is running - as I don't know mac enough)

> $ SLEPC_DIR=$SLEPC_DIR cmake ..
> -DBOOST_ROOT=/Users/barrysmith/Src/boost_1_66_0 -DSLEPC_DIR=$SLEPC_DIR
> CMake Warning at
> /usr/local/Cellar/cmake/3.9.5/share/cmake/Modules/FindBoost.cmake:786
> (message):
>   New Boost version may have incorrect or missing dependencies and imported
>   targets

Did you install the corresponding *-dev packages (depending on your os).

> 
> 
> Note at first it could not find BOOST but told me to set the directory with
> exact syntax. That's the way it should always do it.
> 

This kind of variable should have been set at install time by a sys admin that should have created a module load file who should have also tried to use the module he provides to its users !.... :D This is never done this way.

So the user is always compelled to "look for/search" package by himself... Always the same cubersome/stupid story...

> SLEPC_ROOT also did not work, nor did SLEPc_ROOT ;(
> 
> So please tell me how to work through this dependency hell.
> 
>    Barry
> 
> > On Jan 21, 2018, at 11:06 AM, Franck Houssen <franck.houssen at inria.fr>
> > wrote:
> > 
> > The last problem I had here was that, for now, I must use a bypass: calling
> > PetscOptionsBegin/End after/before PetscOptionsHead/Tail in the setup
> > callback defined on PCRegister.
> > 
> > git-clone https://github.com/fghoussen/geneo4PETSc, the dummy test case
> > should run. Then comment lines 2321 and 2464 in geneo.cpp
> > (PetscOptionsBegin/End): the dummy test case should fail because as the
> > option database "seems" to be empty, the default parameter are used and
> > the name/version of the pc is not the expected one.
> > 
> > I believe (?) I use the correct PCRegister pattern (PCSetFromOptions
> > between PCRegister and initGenEOPC). Either I'm wrong, or there is
> > something behind...
> > 
> > Franck
> > 
> > PS: still trying to get osx to work... (don't know mac/clang enough, and,
> > travis osx boxes are so slow to start and run - difficult to test). But if
> > you used to it, you'll probably get this to work.
> > 
> > ----- Mail original -----
> >> De: "Franck Houssen" <franck.houssen at inria.fr>
> >> À: "Barry F. Smith" <bsmith at mcs.anl.gov>
> >> Cc: "For users of the development version of PETSc"
> >> <petsc-dev at mcs.anl.gov>
> >> Envoyé: Mardi 2 Janvier 2018 15:15:25
> >> Objet: Re: [petsc-dev] How to pass user data to a registered PC
> >> (PCRegister) ?
> >> 
> >> ----- 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é: Mardi 2 Janvier 2018 14:50:02
> >>> Objet: Re: [petsc-dev] How to pass user data to a registered PC
> >>> (PCRegister) ?
> >>> 
> >>> 
> >>> 
> >>> 
> >>>> On Jan 2, 2018, at 7:47 AM, Franck Houssen <franck.houssen at inria.fr>
> >>>> wrote:
> >>>> 
> >>>> I'll try to fetch/pull the git clone: maybe there is a reg on the code
> >>>> level I am on.
> >>> 
> >>>  Unlikely.
> >>> 
> >>>   I'm afraid you need to use the debugger and slog through the call.
> >> 
> >> OK, I'll do that ! For now, calling Begin/End is this only by-pass I have.
> >> 
> >>> It    seems you are doing things ok so why this happens I cannot explain.
> >>> We
> >>>   use this paradigm everywhere with options in PETSc and it always works
> >>>   so
> >>>   I am totally lost as to why it fails for you.
> >>> 
> >>>   Barry
> >>> 
> >>>> 
> >>>> ----- 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é: Mardi 2 Janvier 2018 13:22:16
> >>>>> Objet: Re: [petsc-dev] How to pass user data to a registered PC
> >>>>> (PCRegister) ?
> >>>>> 
> >>>>> 
> >>>>> static PetscErrorCode PCSetFromOptions_Jacobi(PetscOptionItems
> >>>>> *PetscOptionsObject,PC pc)
> >>>>> {
> >>>>> PC_Jacobi      *jac = (PC_Jacobi*)pc->data;
> >>>>> PetscErrorCode ierr;
> >>>>> PetscBool      flg;
> >>>>> PCJacobiType   deflt,type;
> >>>>> 
> >>>>> PetscFunctionBegin;
> >>>>> ierr = PCJacobiGetType(pc,&deflt);CHKERRQ(ierr);
> >>>>> ierr = PetscOptionsHead(PetscOptionsObject,"Jacobi
> >>>>> options");CHKERRQ(ierr);
> >>>>> ierr = PetscOptionsEnum("-pc_jacobi_type","How to construct diagonal
> >>>>> matrix","PCJacobiSetType",PCJacobiTypes,(PetscEnum)deflt,(PetscEnum*)&type,&flg);CHKERRQ(ierr);
> >>>>> if (flg) {
> >>>>>   ierr = PCJacobiSetType(pc,type);CHKERRQ(ierr);
> >>>>> }
> >>>>> ierr = PetscOptionsBool("-pc_jacobi_abs","Use absolute values of
> >>>>> diagaonal
> >>>>> entries","PCJacobiSetUseAbs",jac->useabs,&jac->useabs,NULL);CHKERRQ(ierr);
> >>>>> ierr = PetscOptionsTail();CHKERRQ(ierr);
> >>>>> PetscFunctionReturn(0);
> >>>>> }
> >>>>> 
> >>>>> Note how PetscOptionsHead() is called with the argument
> >>>>> PetscOptionsObject
> >>>> 
> >>>> I do call PetscOptionsHead(PetscOptionsObject, ...);
> >>>> 
> >>>>> which is passed in from above. My guess is that you don't
> >>>>> call it with this argument? You would get behavior you describe if you
> >>>>> don't.
> >>>>> Please send your REAL setupfromoptions_mypc() not just pseudo code.
> >>>>> 
> >>>> 
> >>>> #define SETERRABT(msg)
> >>>> SETERRABORT(PETSC_COMM_WORLD,PETSC_ERR_ARG_NULL,msg)
> >>>> 
> >>>> static PetscErrorCode setUpGenEOPCFromOptions(PetscOptionItems *
> >>>> PetscOptionsObject, PC pcPC) {
> >>>> // Get the context.
> >>>> 
> >>>> if (!pcPC) SETERRABT("GenEO preconditioner is invalid");
> >>>> geneoContext * gCtx = (geneoContext *) pcPC->data;
> >>>> if (!gCtx) SETERRABT("GenEO preconditioner without context");
> >>>> 
> >>>> // Check arguments.
> >>>> 
> >>>> PetscErrorCode pcRC = PetscOptionsHead(PetscOptionsObject, "GenEO
> >>>> options");
> >>>> CHKERRQ(pcRC);
> >>>> pcRC = PetscOptionsBegin(PETSC_COMM_WORLD, NULL, "GenEO options", "GenEO
> >>>> options");
> >>>> CHKERRQ(pcRC);
> >>>> 
> >>>> PetscBool pcHasOpt = PETSC_FALSE;
> >>>> PetscInt nbArgs = 2;
> >>>> char *args[2];
> >>>> pcRC = PetscOptionsStringArray("-geneo_lvl", "GenEO levels", "GenEO
> >>>> levels", args, &nbArgs, &pcHasOpt);
> >>>> CHKERRQ(pcRC);
> >>>> if (pcHasOpt) {
> >>>>   ...
> >>>> 
> >>>> 
> >>>>> Barry
> >>>>> 
> >>>>> 
> >>>>> 
> >>>>> 
> >>>>>> On Jan 2, 2018, at 5:04 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é: Dimanche 31 Décembre 2017 23:41:42
> >>>>>>> Objet: Re: [petsc-dev] How to pass user data to a registered PC
> >>>>>>> (PCRegister) ?
> >>>>>>> 
> >>>>>>> 
> >>>>>>> 
> >>>>>>>> On Dec 31, 2017, at 8:40 AM, Franck Houssen
> >>>>>>>> <franck.houssen at inria.fr>
> >>>>>>>> wrote:
> >>>>>>>> 
> >>>>>>>> Seems finally, I got it to work.
> >>>>>>>> To get the options to work I had to call PetscOptionsBegin/End
> >>>>>>>> after/before
> >>>>>>>> PetscOptionsHead/Tail which is not what is done in the jacobi
> >>>>>>>> example:
> >>>>>>>> is
> >>>>>>>> this the right way to go ?
> >>>>>>> 
> >>>>>>> Something is wrong.
> >>>>>> 
> >>>>>> I felt there was something wrong !...
> >>>>>> 
> >>>>>>> PetscOptionsBegin/end are called in PCSetFromOptions()
> >>>>>>> that is suppose to wrap YOUR PCSetFromOptions_mypc().
> >>>>>> 
> >>>>>> OK, sounds logical, that's how I expected things to be done. That's
> >>>>>> why
> >>>>>> I
> >>>>>> was suspicious: what worked should not !...
> >>>>>> 
> >>>>>> I believed maybe the problem was connected to the fact that I do NOT
> >>>>>> use
> >>>>>> compose function, but, according to Matt's explanation, I would say
> >>>>>> no:
> >>>>>> the use of PetscComposeFunction seems independent from the
> >>>>>> PCSetFromOptions_mypc problem.
> >>>>>> 
> >>>>>> Note: in my case, I believe I do not really need PetscCompose, I just
> >>>>>> need
> >>>>>> one (regular) function to initialize specific stuffs needed in my_pc
> >>>>>> (at
> >>>>>> least for a start). I can go to PetscCompose later if it turns out to
> >>>>>> be
> >>>>>> relevant (that's how I understand this).
> >>>>>> 
> >>>>>>> Perhaps you are
> >>>>>>> calling PCSetFromOptions_mypc directly which you should never do.
> >>>>>> 
> >>>>>> No, I don't call PCSetFromOptions_mypc directly.
> >>>>>> 
> >>>>>>> Your PCCreate_mypc() should stick the function pointer for
> >>>>>>> PCSetFromOptions_mypc into the ops table like it does PCApply_mypc
> >>>>>>> etc.
> >>>>>>> Then you just directly use PCSetFromOptions.
> >>>>>> 
> >>>>>> create_mpc(PC pc) { // CB for PCRegister
> >>>>>> ...
> >>>>>> pcPC->ops->setfromoptions = setupfromoptions_mypc;
> >>>>>> ...
> >>>>>> }
> >>>>>> 
> >>>>>> static PetscErrorCode setupfromoptions_mypc(PetscOptionItems *
> >>>>>> PetscOptionsObject, PC pcPC) {
> >>>>>> ...
> >>>>>> PetscOptionsHead()
> >>>>>> PetscOptionsBegin()
> >>>>>> PetscOptionsStringArray("-mypc_opt", ..., flag)
> >>>>>> cout << "debug " << flag << endl;
> >>>>>> PetscOptionsEnd()
> >>>>>> PetscOptionsTail()
> >>>>>> }
> >>>>>> 
> >>>>>> I got called on setupfromoptions_mypc when I call
> >>>>>> PCSetUpFromOptions().
> >>>>>> 
> >>>>>> If I let PetscOptionsBegin/End, it looks like I read in the "correct"
> >>>>>> option data base, I get (cout) : "debug 1" (-my_opt is read)
> >>>>>> 
> >>>>>> If I comment PetscOptionsBegin/End, seems I read an incorrect (empty
> >>>>>> ?)
> >>>>>> option data base, I get (cout) : "debug 0"
> >>>>>> 
> >>>>>> Looks weird even if it's not blocking for now (I know there is problem
> >>>>>> but
> >>>>>> I can by pass it)
> >>>>>> 
> >>>>>>> 
> >>>>>>> Barry
> >>>>>>> 
> >>>>>>>> 
> >>>>>>>> Franck
> >>>>>>>> 
> >>>>>>>> PetscErrorCode PCSetFromOptions_mypc(PetscOptionItems *
> >>>>>>>> PetscOptionsObject,
> >>>>>>>> PC pcPC) {
> >>>>>>>> PetscOptionsHead
> >>>>>>>> PetscOptionsBegin
> >>>>>>>> ... // PetscOptionsStringArray
> >>>>>>>> PetscOptionsEnd
> >>>>>>>> PetscOptionsTail
> >>>>>>>> 
> >>>>>>>> 
> >>>>>>>> ----- Mail original -----
> >>>>>>>>> De: "Franck Houssen" <franck.houssen at inria.fr>
> >>>>>>>>> À: "Barry F. Smith" <bsmith at mcs.anl.gov>
> >>>>>>>>> Cc: "For users of the development version of PETSc"
> >>>>>>>>> <petsc-dev at mcs.anl.gov>
> >>>>>>>>> Envoyé: Dimanche 31 Décembre 2017 15:01:43
> >>>>>>>>> Objet: Re: [petsc-dev] How to pass user data to a registered PC
> >>>>>>>>> (PCRegister) ?
> >>>>>>>>> 
> >>>>>>>>> Using PCSHELL means calling:
> >>>>>>>>> - PCShellSetSetUp, PCShellSetApply, PCShellSetDestroy to set
> >>>>>>>>> callbacks.
> >>>>>>>>> - PCShellSetContext/PCShellGetContext to get/set context in
> >>>>>>>>> callbacks.
> >>>>>>>>> 
> >>>>>>>>> To go from PCSHELL to PCRegister, one need to:
> >>>>>>>>> - #include <petsc/private/pcimpl.h> // Access to PC data/struct.
> >>>>>>>>> - Set callbacks with pc->ops->...
> >>>>>>>>> - NO more use ANY shell methods (context, name), but, use pc->data
> >>>>>>>>> instead.
> >>>>>>>>> - call PCRegister.
> >>>>>>>>> 
> >>>>>>>>> Correct ? Did I miss something ?
> >>>>>>>>> 
> >>>>>>>>> Seems I get things to work (without compose function).
> >>>>>>>>> 
> >>>>>>>>> The last problem I have is in the options: options are passed to
> >>>>>>>>> PetscInitialize but not found in the database (I mimic'ed the
> >>>>>>>>> jacobi
> >>>>>>>>> example). Is there specific related to this ?
> >>>>>>>>> 
> >>>>>>>>> 
> >>>>>>>>> ----- Mail original -----
> >>>>>>>>>> De: "Franck Houssen" <franck.houssen at inria.fr>
> >>>>>>>>>> À: "Barry F. Smith" <bsmith at mcs.anl.gov>
> >>>>>>>>>> Cc: "For users of the development version of PETSc"
> >>>>>>>>>> <petsc-dev at mcs.anl.gov>
> >>>>>>>>>> Envoyé: Samedi 30 Décembre 2017 17:12:09
> >>>>>>>>>> Objet: Re: [petsc-dev] How to pass user data to a registered PC
> >>>>>>>>>> (PCRegister) ?
> >>>>>>>>>> 
> >>>>>>>>>> Don't get the link. I'll try first with independent function (no
> >>>>>>>>>> compose)
> >>>>>>>>>> and
> >>>>>>>>>> see if this can work at least for a start.
> >>>>>>>>>> 
> >>>>>>>>>> Franck
> >>>>>>>>>> 
> >>>>>>>>>> ----- 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é: Vendredi 29 Décembre 2017 17:55:30
> >>>>>>>>>>> Objet: Re: [petsc-dev] How to pass user data to a registered PC
> >>>>>>>>>>> (PCRegister) ?
> >>>>>>>>>>> 
> >>>>>>>>>>> 
> >>>>>>>>>>> 
> >>>>>>>>>>>> On Dec 29, 2017, at 9:03 AM, Franck Houssen
> >>>>>>>>>>>> <franck.houssen at inria.fr>
> >>>>>>>>>>>> wrote:
> >>>>>>>>>>>> 
> >>>>>>>>>>>> OK, on the highway now (bad ssh !), I'll try to check this out.
> >>>>>>>>>>>> 
> >>>>>>>>>>>> ----- 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 18:21:48
> >>>>>>>>>>>>> Objet: Re: [petsc-dev] How to pass user data to a registered PC
> >>>>>>>>>>>>> (PCRegister) ?
> >>>>>>>>>>>>> 
> >>>>>>>>>>>>> 
> >>>>>>>>>>>>> 
> >>>>>>>>>>>>>> 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);
> >>>>>>>>>>>>>>> 
> >>>>>>>>>>>> 
> >>>>>>>>>>>> OK, I must provide/implement PCMypcSetDOFMultiplicities (add
> >>>>>>>>>>>> data
> >>>>>>>>>>>> to
> >>>>>>>>>>>> pc
> >>>>>>>>>>>> context) besides mypc_create: sounds logical.
> >>>>>>>>>>>> Is this OK if PCMypcSetDOFMultiplicities is independent from
> >>>>>>>>>>>> mypc_create
> >>>>>>>>>>>> ?
> >>>>>>>>>>>> I guess yes.
> >>>>>>>>>>>> 
> >>>>>>>>>>>> From what I remember/understand, I got lost here: from the
> >>>>>>>>>>>> jacobi
> >>>>>>>>>>>> example,
> >>>>>>>>>>>> mypc_create looks to be supposed (?) to call some kind of
> >>>>>>>>>>>> Petsc*ComposeFunction to associate PCMypcSetDOFMultiplicities to
> >>>>>>>>>>>> the
> >>>>>>>>>>>> pc
> >>>>>>>>>>>> (correct ?)... But, in the jacobi example,
> >>>>>>>>>>>> PCJacobiGetUseAbs_Jacobi
> >>>>>>>>>>>> is
> >>>>>>>>>>>> associated to PCJacobiGetUseAbs_C...
> >>>>>>>>>>> 
> >>>>>>>>>>> the _C name is a string name that is used by PETSc to "find" the
> >>>>>>>>>>> correct
> >>>>>>>>>>> function pointer which is PCJacobiGetUseAbs_Jacobi. There is no
> >>>>>>>>>>> _C function.
> >>>>>>>>>> 
> >>>>>>>>>> ?!
> >>>>>>>>>> 
> >>>>>>>>>>> 
> >>>>>>>>>>>> Which turns out not to be implemented according to git grep ?!
> >>>>>>>>>>>> Got
> >>>>>>>>>>>> lost
> >>>>>>>>>>>> here (and looked for a way to pass user data directly to
> >>>>>>>>>>>> PCRegister):
> >>>>>>>>>>>> is
> >>>>>>>>>>>> PCMypcSetDOFMultiplicities supposed to be "attached/composed" or
> >>>>>>>>>>>> independent from the pc ?
> >>>>>>>>>>> 
> >>>>>>>>>>> composed.
> >>>>>>>>>>> 
> >>>>>>>>>>>> 
> >>>>>>>>>>>>>> git grep PCJacobiGetUseAbs_C
> >>>>>>>>>>>> src/ksp/pc/impls/jacobi/jacobi.c:  ierr =
> >>>>>>>>>>>> PetscObjectComposeFunction((PetscObject)pc,"PCJacobiGetUseAbs_C",PCJacobiGetUseAbs_Jacobi);CHKERRQ(ierr);
> >>>>>>>>>>>> src/ksp/pc/impls/jacobi/jacobi.c:  ierr =
> >>>>>>>>>>>> PetscUseMethod(pc,"PCJacobiGetUseAbs_C",(PC,PetscBool*),(pc,flg));CHKERRQ(ierr);
> >>>>>>>>>>>> 
> >>>>>>>>>>>> Sorry, for the short answer. Hope I succeeded to be clear
> >>>>>>>>>>>> enough.
> >>>>>>>>>>> 
> >>>>>>>>>>> Just copy jacobi.c and start converting it over to your names and
> >>>>>>>>>>> needs
> >>>>>>>>>>> and you'll see it is actually really straightforward and not as
> >>>>>>>>>>> complicated as you think it is.
> >>>>>>>>>>> 
> >>>>>>>>>>> Barry
> >>>>>>>>>>> 
> >>>>>>>>>>>> 
> >>>>>>>>>>>>>>> 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