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

Franck Houssen franck.houssen at inria.fr
Mon Jan 22 11:03:20 CST 2018


----- Mail original -----
> De: "Jed Brown" <jed at jedbrown.org>
> À: "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é: Lundi 22 Janvier 2018 16:48:26
> Objet: Re: [petsc-dev] How to pass user data to a registered PC (PCRegister) ?
> 
> 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?
> 


In the dummy test case I added one line to run the app with --help: this is only for coverage purposes (this ends with "Error: check argument KO").

~/geneo4PETSc> head tst/dummy/dummy.sh
#!/bin/bash
@CMAKE_BINARY_DIR@/src/geneo4PETSc --help # Help for coverage.     <===== This is only for coverage
echo "" # Add space for clarity.
for f in "identity" "tridiag"                                      <====== Here begins the test
do
  for p in "-igs_pc_type#bjacobi"                                  \      <====== OK
               "-igs_pc_type#geneo#-geneo_lvl#ASM,0"               \      <====== Fails according to the diff

Now run the dummy test case:

~/geneo4PETSc/BUILD> make all test ARGS="-V -R dummy" > OK.log (log attached)

You see that, among others, this (sub) test has been ran OK (third solve): mpirun  -n 2  /tmp/BUILD/src/geneo4PETSc --inpFileA identity.inp --inpFileB B.inp -igs_pc_type geneo -geneo_lvl ASM,0 --verbose 2 -geneo_chk log -geneo_dbg log,2 --shortRes -igs_ksp_atol 1.e-12 -igs_ksp_rtol 1.e-12 -options_left no --metisDual


Now apply following modifications:

>> git diff
diff --git a/src/geneo.cpp b/src/geneo.cpp
index b4a4ea6..3f9be0f 100644
--- a/src/geneo.cpp
+++ b/src/geneo.cpp
@@ -2318,8 +2318,8 @@ static PetscErrorCode setUpGenEOPCFromOptions(PetscOptionItems * PetscOptionsObj
   PetscErrorCode pcRC = PetscOptionsHead(PetscOptionsObject, "GenEO options");
   CHKERRQ(pcRC);
-  pcRC = PetscOptionsBegin(PETSC_COMM_WORLD, NULL, "GenEO options", "GenEO options");
-  CHKERRQ(pcRC);
+  //pcRC = PetscOptionsBegin(PETSC_COMM_WORLD, NULL, "GenEO options", "GenEO options");
+  //CHKERRQ(pcRC); 
   PetscBool pcHasOpt = PETSC_FALSE;
   PetscInt nbArgs = 2;
@@ -2461,8 +2461,8 @@ static PetscErrorCode setUpGenEOPCFromOptions(PetscOptionItems * PetscOptionsObj
     gCtx->check = true;
   }
-  pcRC = PetscOptionsEnd();
-  CHKERRQ(pcRC);
+  //pcRC = PetscOptionsEnd();
+  //CHKERRQ(pcRC);
   pcRC = PetscOptionsTail();
   CHKERRQ(pcRC);

And rerun the dummy test:

>> make all test ARGS="-V -R dummy" > KO.log
Errors while running CTest
make: *** [test] Error 8
>> tail -n 20 KO.log 
1: 
1: mpirun  -n 2  /tmp/BUILD/src/geneo4PETSc --inpFileA identity.inp --inpFileB B.inp -igs_pc_type bjacobi --verbose 2 -geneo_chk log -geneo_dbg log,2 --shortRes -igs_ksp_atol 1.e-12 -igs_ksp_rtol 1.e-12 -options_left no --metisDual
1: 
1: mpirun  -n 2  /tmp/BUILD/src/geneo4PETSc --inpFileA identity.inp --inpFileB B.inp -igs_pc_type bjacobi --verbose 2 -geneo_chk log -geneo_dbg log,2 --shortRes -igs_ksp_atol 1.e-12 -igs_ksp_rtol 1.e-12 -options_left no --metisNodal
1: 
1: mpirun  -n 2  /tmp/BUILD/src/geneo4PETSc --inpFileA identity.inp --inpFileB B.inp -igs_pc_type geneo -geneo_lvl ASM,0 --verbose 2 -geneo_chk log -geneo_dbg log,2 --shortRes -igs_ksp_atol 1.e-12 -igs_ksp_rtol 1.e-12 -options_left no --metisDual
1: 
1: 44c44
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
1/1 Test #1: dummy ............................***Failed    0.66 sec


In tst/dummy, the same command line "mpirun  -n 2  /tmp/BUILD/src/geneo4PETSc --inpFileA identity.inp --inpFileB B.inp -igs_pc_type geneo -geneo_lvl ASM,0 --verbose 2 -geneo_chk log -geneo_dbg log,2 --shortRes -igs_ksp_atol 1.e-12 -igs_ksp_rtol 1.e-12 -options_left no --metisDual" does not do the same thing with and without the modifications: this is because the options are not read correctly (seems the option database is empty)


The correct behavior (no modif) is:

>> mpirun  -n 2  /tmp/BUILD/src/geneo4PETSc --inpFileA identity.inp --inpFileB B.inp -igs_pc_type geneo -geneo_lvl ASM,0 --verbose 2 -geneo_chk log -geneo_dbg log,2 --shortRes -igs_ksp_atol 1.e-12 -igs_ksp_rtol 1.e-12 -options_left no --metisDual
...
INFO: geneo0ASM pc, L1 mumps no-proj-fine-space  <===== you get geneo0ASM because you asked -geneo_lvl ASM,0

The incorrect behavior (with modif) is:

>> mpirun  -n 2  /tmp/BUILD/src/geneo4PETSc --inpFileA identity.inp --inpFileB B.inp -igs_pc_type geneo -geneo_lvl ASM,0 --verbose 2 -geneo_chk log -geneo_dbg log,2 --shortRes -igs_ksp_atol 1.e-12 -igs_ksp_rtol 1.e-12 -options_left no --metisDual
....
INFO: geneo1ASM pc, L1 mumps no-proj-fine-space, tau 0.10, L2 arpack mumps <======= you asked -geneo_lvl ASM,0 but you get the default parameter-geneo_lvl ASM,1 (=> geneo1ASM)


Anyway, this is not so blocking as I have a bypass


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