<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On 27 April 2016 at 22:49, Jed Brown <span dir="ltr"><<a href="mailto:jed@jedbrown.org" target="_blank">jed@jedbrown.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="">Dave May <<a href="mailto:dave.mayhem23@gmail.com">dave.mayhem23@gmail.com</a>> writes:<br>
> This always bugged me.<br>
> I prefer to access the pointer as at least it's clear what I am doing and<br>
> when reading the code later, I am not required to ask myself whether the DM<br>
> is actually a shell or not.<br>
><br>
> Why doesn't there exist a generic setter for each object which allows one<br>
> to set a method for a particular operation?<br>
<br>
</span>You're just objecting to the function being named DMShellSetCreateMatrix<br>
instead of DMSetCreateMatrix?<br></blockquote><div><br></div><div>Absolutely!<br></div><div><br>Its inconsistent with nearly all other PETSc methods.<br></div><div>With all other methods, this function would only take affect if the DM was of type shell, e.g through using either PetscTryMethod(), or by using PetscObjectTpeCompare(). This is way it is done in PCShell.<br><br></div><div>It is also inconsistent with some of the other DMShellSetXXX() as some type check the type (e.g. DMShellSetCreateMatrix), whilst some do, e.g. DMShellSetCoarsen().<br></div><div><br> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<span class=""><br>
> The implementation for Mat defines typedef enum { } MatOperation.<br>
> Using this, we could have<br>
>   PetscErrorCode MatSetOperation(Mat mat,MatOperation op,zzzzz)<br>
><br>
> If there was a similar typedef enum for all other objects, an<br>
> XXXSetOperation() would be viable.<br>
<br>
</span>The MatOperation enums are a bit of a maintenance burden and don't offer<br>
any type checking.  We have them for Mat and Vec (sort of) because there<br>
are so many methods.  We could add them for other objects, but would<br>
give up type checking relative to the existing specialized functions.<br>
</blockquote></div><br></div><div class="gmail_extra">Agreed, we shouldn't give up on type checking. But type checking is ignored with MatShellSetOperation()... This function seems to do approximately what I proposed. I'm I could autogenerate the functions from the op structure so it wouldn't be a huge burden (just a lot of code).<br></div><div class="gmail_extra"><br></div><div class="gmail_extra">Could we at least make the (i) XXXShell objects APIs consistent with each other in terms of how methods/operations are set, (ii) change all the shell setter to only take affect if the type was "shell" and (iii) add type checked setters for Mat, PC and DM (which appear to be the only methods with shell implementations).<br><br></div><div class="gmail_extra">I'd be happy to do this is everyone approves.<br><br></div><div class="gmail_extra">Cheers<br></div><div class="gmail_extra">  Dave<br></div><div class="gmail_extra"><br></div></div>