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

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


----- 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

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