<div class="gmail_quote">On Sun, May 1, 2011 at 05:07, Barry Smith <span dir="ltr"><<a href="mailto:bsmith@mcs.anl.gov">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;">
<br>
   Jed,<br>
<br>
      You pose several issues here.<br>
<br>
1) By default SBAIJ matrices generate an error if you set a value in the lower triangular portion.<br>
<br>
      I think this is the wrong default. I've changed it to ignore lower triangular values unless you explicitly set the option.<br></blockquote><div><br></div><div>Excellent</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<br>
2) MatSetType(A,MATSBAIJ); and friends deletes the matrix and creates a new one if the matrix is MATSEQSBAIJ or MATMPISBAIJ.<br>
<br>
      This is silly. Given our model of setting types however there is no trivial way to fix this. We could try to handle setting a heirarchy of types properly (how to know if something is a subclass? etc?) or do something just for Mat to handle the<br>

      rank = 1 and rank > 1 cases. I'm inclined to add a special Mat register for example MatRegisterBaseName("SBAIJ","SeqSBAIJ","MPISBAIJ"); and have MatSetType() first check if the type is in the BaseName list and if so grab the correct<br>

      classname based on rank, then it will realize the matrix is not having a type change and will not destroy it. Note that this means routines like MatCreateSBAIJ() will disappear.<br></blockquote><div><br></div><div>
I think you mean MatCreate_SBAIJ(). I also think this is better because there is a bit of duplicate code and you can never actually have an instance of MATSBAIJ.</div><div><br></div><div>The lookup in the other direction would take more effort, but there is a lot of PetscTypeCompare that ends up needing to always check for both the SEQ and MPI variants. But I think managing a full type hierarchy is a very deep rabbit hole so I'm not convinced it's worth it.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br>
3) The general wordyness of setting up the matrix fill from the DM.<br>
<br>
     My planned model for the future was to change DMGetMatrix() to DMFillMatrix() and have code something like<br>
<br>
     MatCreate(comm,&Ap);<br>
     MatSetOptionsPrefix(Ap,"Ap_");<br>
     MatSetFromOptions(Ap);<br>
<div class="im">     MatSetOption(Ap,MAT_SYMMETRIC,PETSC_TRUE);<br>
</div>     DMFillMatrix(fsu,Ap);<br>
<br>
     If is actually not any shorter but I think it is a better model.<br></blockquote><div><br></div><div>This is much less wordy because all the code is in one place (no separate part for PetscOptionsList) and there are no if statements. It would also be possible to write a helper like</div>
<div><br></div><div>DMCreateMatWithOptions(fsu,"Ap_",MATSBAIJ,MAT_SPD,MAT_NEW_NONZERO_LOCATION_ERR,...,0,&Ap);</div><div><br></div><div>(or without variadic handling of options).</div><div><br></div></div>