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

Smith, Barry F. bsmith at mcs.anl.gov
Sun Jan 21 16:08:27 CST 2018


  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.

$ 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
Call Stack (most recent call first):
  /usr/local/Cellar/cmake/3.9.5/share/cmake/Modules/FindBoost.cmake:892 (_Boost_COMPONENT_DEPENDENCIES)
  /usr/local/Cellar/cmake/3.9.5/share/cmake/Modules/FindBoost.cmake:1523 (_Boost_MISSING_DEPENDENCIES)
  CMakeLists.txt:38 (find_package)


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
Call Stack (most recent call first):
  /usr/local/Cellar/cmake/3.9.5/share/cmake/Modules/FindBoost.cmake:892 (_Boost_COMPONENT_DEPENDENCIES)
  /usr/local/Cellar/cmake/3.9.5/share/cmake/Modules/FindBoost.cmake:1523 (_Boost_MISSING_DEPENDENCIES)
  CMakeLists.txt:38 (find_package)


-- Boost version: 1.66.0
-- Found the following Boost libraries:
--   mpi
--   serialization
-- Checking for module 'SLEPc>=3.8.1'
--   No package 'SLEPc' found
CMake Error at /usr/local/Cellar/cmake/3.9.5/share/cmake/Modules/FindPkgConfig.cmake:412 (message):
  A required package was not found
Call Stack (most recent call first):
  /usr/local/Cellar/cmake/3.9.5/share/cmake/Modules/FindPkgConfig.cmake:588 (_pkg_check_modules_internal)
  CMakeLists.txt:42 (pkg_check_modules)


-- Configuring incomplete, errors occurred!
See also "/Users/barrysmith/Src/geneo4PETSc/BUILD/CMakeFiles/CMakeOutput.log".
~/Src/geneo4PETSc/BUILD (master=) arch-franck
$ 


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.

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