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

Jed Brown jed at jedbrown.org
Mon Jan 22 09:48:26 CST 2018


Franck Houssen <franck.houssen at inria.fr> writes:

> ----- Mail original -----
>> De: "Jed Brown" <jed at jedbrown.org>
>> À: "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é: Lundi 22 Janvier 2018 16:06:26
>> Objet: Re: [petsc-dev] How to pass user data to a registered PC (PCRegister) ?
>> 
>> I used
>> 
>>   mkdir build; cd build
>>   PKG_CONFIG_PATH=$PETSC_DIR/$PETSC_ARCH/lib/pkgconfig:$SLEPC_DIR/$PETSC_ARCH/lib/pkgconfig
>>   cmake ..
>> 
>> and got a successful build.  Franck, you can have your CMakeLists.txt
>> add these paths to PKG_CONFIG_PATH before using pkgconfig.  It saves
>> time because it's the conventional way to specify PETSc libraries.
>> 
>
> You are right. I'll do that.
>
>>
>> In general, when providing a test case, it's best to be precise and
>> complete.  It isn't a good use of Barry's time to expect him to browse
>> around your github repository and find your wiki.
>> 
>> Anyway, I have it built, but I don't know what the "dummy test case" is.
>> I tried tst/dummy/dummy.sh and got
>> 
>
> make all check

I'm on 'master' and getting usage errors along with

   Error: check argument KO

Am I supposed to ignore all these failures before modifying code in
search of a different error?

> The diff of the firt test of the suite (called dummy) fails this way:
> 1: < INFO: geneo0ASM pc, L1 mumps no-proj-fine-space
> 1: ---
> 1: > INFO: geneo1ASM pc, L1 mumps no-proj-fine-space, tau 0.10, L2 arpack mumps
>
>
>>   Error: check argument KO
>> 
>> Can you give the exact command to run and expected output?
>> 
>> "Smith, Barry F." <bsmith at mcs.anl.gov> writes:
>> 
>> >   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