<div class="gmail_quote">On Thu, Sep 13, 2012 at 8:50 AM, Barry Smith <span dir="ltr"><<a href="mailto:bsmith@mcs.anl.gov" target="_blank">bsmith@mcs.anl.gov</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im"><br>
On Sep 12, 2012, at 9:49 PM, Jed Brown <<a href="mailto:jedbrown@mcs.anl.gov">jedbrown@mcs.anl.gov</a>> wrote:<br>
<br>
> This patch seems to do two very unrelated things. More importantly, it makes libpetscmat depend on libpetscksp, thus breaking single-library=0. The register routine needs to be moved to src/ksp to fix this.<br>
<br>
</div>    Yup. My mistake.<br>
<br>
     I don't like the idea of shoving it directly in KSPRegisterAll(). Instead what about KSPMatRegisterAll() that is called, like KSPRegisterAll() by KSPInitializePackage()<br>
<br>
     Similarly you would have SNESKSPRegisterAll() for your KSPPOLY.<br></blockquote><div><br></div><div>Fine, so SNESInitializePackage() would call SNESKSPRegisterAll() and the user should call one or the other if they don't use SNES but want to use those KSP implementations.</div>
<div><br></div><div>Bear in mind that it'll work automatically with dynamic libraries since the package is initialized when the shared lib is loaded. Now should we also use the constructor trick to let the user skip this on all systems supporting the attribute (most).</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
    Barry<br>
<br>
   Note also the manual page for MatRegisterAll() should have a reference to KSPMatRegisterAll().<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
><br>
> In principle, I'd be fine with putting it in KSPRegisterAll. Instead of thinking of that routine as "register all implementations of KSP" (which it never truly meant), I think of it as "register all implementations of anything provided by the KSP package". The downside of that is that MatCreate calls MatInitializePackage, but does not call KSPInitializePackage, causing MatSetType(S,MATSCHURCOMPLEMENT) to fail when !defined(PETSC_USE_DYNAMIC_LIBRARIES) and KSPInitializePackage() has not been called.<br>

><br>
> Unfortunately, I there isn't a way short of static constructors to initialize only those packages that are linked. With C++, we could have a static constructor that registered itself. With GCC and related compilers, we can use __attribute__((constructor)) to get a routine called before main (it would add the existing XXInitializePackage() to a list that PetscInitialize() would call later). Both of these options run code before main which means we have to be especially careful that it never causes an error because that is very confusing.<br>

><br>
> On systems that don't support constructors, I think the user will have to call KSPInitializePackage themselves if they are going to MatSetType MATSCHURCOMPLEMENT before KSPCreate. I think this particular combination is extremely unlikely, but I have a similar issue with my new KSPPOLY (the implementation needs SNES to solve a constrained minimization problem) and that makes sense to use via -ksp_type poly when the user does not interact with SNES at all.<br>

><br>
> changeset:   ec8eb69c0c42<br>
> user:        Barry Smith <<a href="mailto:bsmith@mcs.anl.gov">bsmith@mcs.anl.gov</a>><br>
> date:        Thu Aug 23 08:03:00 2012 -0500<br>
> files:       conf/test include/petscksp.h src/ksp/ksp/utils/schurm.c src/mat/interface/matregis.c<br>
> description:<br>
> added testexamples_opengl rule<br>
> changed MatCreateSchurComplement to use the MatCreate_SchurComplement() paradigm<br>
><br>
<br>
</div></div></blockquote></div><br>