On Jan 15, 2011, at 2:32 PM, Jed Brown wrote:
> On Thu, Jan 13, 2011 at 19:01, Barry Smith <bsmith at mcs.anl.gov> wrote:
> Since Mike McCourt is in dire need of flexible multiphysics infrastructure
> I've started to look at some of the newly implement Mat stuff in PETSc (and
> my head is spinning).
>
> Could the author's of these things take a look at my comments and respond
> (hopefully with changes, but I can change things also).
>
> I am responsible for many of these, but I don't know how much time I'll have
> to make changes in the next two weeks.
>
>
> Stream of consciousness writing because I can't get my head around it all.
>
> ----
>
> MatCreateNest() (and VecCreateNexs()). Does not have the the proper
> construction process that always goes through MatCreate_Nest() (and
> VecCreate_Nest()). This needs to be fixed. Should add something like
> MatNestAddBlocks() or similar name for putting the blocks in after the call
> to MatCreate_Nest().
>
> We used MatCreateNest() instead of lots of setters because in all cases I
> could think of, the user has all the nested Mats available up-front and
> adding them one at a time took more effort for the user. Furthermore, the
> internal data structure would need to be more dynamic and we wanted to make
> something correct and functional as quickly as possible. The construction
> process could be made more dynamic, but it would make the API a bit bigger,
> make the implementation more complex, and I don't think anyone would want to
> use that interface anyway. If you have a use case where it's important to
> construct it dynamically, I'll prioritize changing it.
I didn't mean a setter that allows setting one block at a time. I meant
something like
MatSetType(mat,MATNEST)
MatNestSetBlocks(mat,IS isrows[], IS iscols[], Mat mats[]);
I see my name MatNestAddBlocks() was probably the cause of the confusion,
since one would expect that one would call it multiple times.
I agree there is no reason to make this dynamic, that is able to add blocks
later.
>
>
> MatCreateNest() seems to assume that all Mat's live on all processes in the
> outer Mat communicator. How hard would it be to change the code so that each
> block could live on some subcommunicator?
>
> I think it's similar difficulty to making subproblems in PCFieldSplit live on
> subcommunicators. It would also provide by far the most benefit if
> PCFieldSplit could support that, so both changes should probably be made at a
> similar time.
>
>
> MatCreateSubMatrix() will it eventually have MatSetValues() that directs
> requests down to the appropriate block?
>
> It could, I think it's not too hard to add, but I'm not sure how useful it
> would be since MatGetLocalSubMatrix() offers, in my opinion, a better API for
> this purpose.
>
>
>
> ----
>
> MatCreateSubMatrix(). Again not the proper construction process built on
> MatCreate_SubMatrix() (when the heck was this written 10 years ago before we
> enforced that rule.)
>
> Not nearly that old, this was added to simplify PCFieldSplit and make more
> things work with MFFD and other matrix-free operators. I had looked at your
> MatCreateSchurComplement() just before writing this.
>
> This needs to be fixed. What's with the manual page description "Creates a
> composite matrix that acts as a submatrix" what the heck does 'composite'
> mean here and what does "acts as a submatrix" mean?
>
> A_sub = R^T A R, this just holds A and R.
>
>
> MatSubMatrixUpdate() what does the documentation "full matrix in the
> submatrix" mean? The full matrix is bigger than the submatrix so how can it
> be in the submatrix. Terrible phrase.
>
> "original matrix"? Please suggest better wording.
>
>
> MatSubMatrixUpdate() why have this routine, why not model on
> MatGetSubMatrix() and have a single interface function
> MatCreateSubMatrix(Mat,IS,IS,MatRuse,Mat *)?
>
> MatCreateSubMatrix() terrible name, why not MatGetSubMatrixImplicit()?
>
> I don't think the user should ever call these, that's why it is "developer"
> level. You should call MatGetSubMatrix in essentially all cases. This is
> used as the fall-back if the matrix format doesn't have a better way to
> produce a submatrix. Only in some strange case where the user does NOT want
> to use the "better way" would they call this function.
>
>
> ------
>
> MatCreateLocalRef() again with no proper construction with
> MatCreate_LocalRef() (come on guys get with the program)
>
> Again, users should only need MatGetLocalSubMatrix().
>
>
> MatCreateLocalRef() 'Gets a logical reference to a local submatrix, for use
> in assembly' what does this mean?
>
> It allows for multi-physics matrix-assembly assembly using "per-physics"
> numbering. Look at snes/examples/tutorials/ex28.c. Otherwise the user would
> have to translate to global numbering themselves, which sucks and then
> wouldn't work with MatNest. MatLocalRef is pretty much just translating
> indices.
>
> Assembly in PETSc is reserved for inside MatAssembly,VecAssembly it should
> not be used for the process of setting values into the matrix. Thus this
> sentence is meaningless gibberish. Could possible be something like 'Gets a
> logical reference to a local submatrix, for use in putting values into that
> block with MatSetValues() or MatSetValuesLocal()?
>
> Yes, my use of "assembly" referred to the larger process, not
> MatAssemblyBegin/End. Your wording sounds better. Note that
> MatSetValuesBlocked{,Local} also works if the *submatrix* has block structure
> (regardless of whether the global matrix does).
>
>
> MatCreateLocalRef() How/why is this different than MatCreateSubMatrix()?
> Could they be merged into one construct? Why is this a 'local' ref, is it a
> block only only on this process?
>
> Perhaps they could be merged, but the semantics are pretty different.
> MatCreateLocalRef takes "local index sets" and is not collective (and returns
> a matrix on COMM_SELF) while MatCreateSubMatrix is collective and returns a
> matrix with global semantics (and where MatMult is actually defined).
>
>
> -------
> How is MatCreateBlockMat() which fortunately has the proper constructor
> related to MatCreateNest()? Do they serve the same purpose? Different
> purposes? Can they be merged together?
> --------
>
> MatCreateBlockMat() is serial only and almost unused.
>
>
> In the end we want to be able to run 'multphysics' codes where it is a
> command line switch between 'block matrix' storage of the global Jacobian
> where each block is a submatrix of the entire matrix and stored itself for
> example in AIJ format; or one big honking AIJ matrix. In both cases the user
> calls MatSetValues() or MatSetValuesLocal() to put values in and has no
> switches in the code they write that depends on the matrix format, things
> like MatGetSubMatrix() and MatGetSubMatrices() work transparently on them.
> How do these four Matrix classes take us in that direction?
>
> See snes/examples/tutorials/ex28.c. It's a command line switch (read the
> comments at the top of that file), subphysics modules get called with the
> result of MatGetLocalSubMatrix() so identical sub-physics user-code is used
> for single problems and for the coupled problem, when backed by any matrix
> type (AIJ or Nest, Nest can have (S)BAIJ blocks).