Adding PetscMap getters

Barry Smith bsmith at mcs.anl.gov
Fri Aug 22 21:45:39 CDT 2008


   Dave,

     There is a MatGetOwnershipRangeColumn() that might suit your needs.
I have also just pushed the missing MatGetOwnershipRangesColumn()

    Barry

On Aug 22, 2008, at 9:04 PM, Dave May wrote:

> Hi Barry,
>    Thanks for your detailed response. It's refreshing to hear that
> code in PETSc is introduced for the right reasons. I think the reasons
> why I like PETSc so much is the result of the two strict rules you
> adhere to. In my experience, many developers don't have such a strong
> set of guide lines (or any guide lines at all) in mind when they write
> code, and hence often introduce things for all the wrong reasons.
>
> The actual task I wished to perform was this;
> Given a rectangular matrix and an (i,j) location, determine whether
> (i,j) was in the matrix's diagonal block or off diagonal block.
>
> For square matrices this is easy as I can call MatGetOwnershipRanges()
> and use the array for the row and column layout. But for rectangular
> matrices I needed the column map. I could call MatGetVecs(), generate
> a consistent left and right vector but then I still need to figure out
> the ownership ranges for the vectors. (Plus I don't think generating
> vectors just to determine the parallel layout of the matrix is very
> smart.)
>
> One could say that I should just specify the parallel layout when I
> built the matrix and vectors in the first place, then this problem
> goes away.  But this defeats the purpose of letting PETSc decide it
> for me. I should still be able to query the parallel layout of the
> matrix independent of whether I asked PETSc to determine the layout or
> I prescribed it myself.
>
> I thought access to the maps would be the simplest approach, ie.
> generate the least amount of  work for you, as only a very small
> getter would need to be written. Given the guide lines you follow
> (which I wasn't aware of) I see why this isn't the right thing to do.
>
> So what about this.
> Forget about accessing the PetscMap object directly (meeting the first
> rule of PETSc programming) and instead add routines to fully determine
> the parallel layout of the vectors and matrices.
>
> For vectors this would mean introducing
>    VecGetOwnershipRanges()
>
> For matrices this would mean introducing
>    MatGetRowOwnershipRange()      ( which is identical to
> MatGetOwnershipRange() )
>    MatGetRowOwnershipRanges()    ( which is identical to
> MatGetOwnershipRanges() )
>
>    MatGetColOwnershipRange()
>    MatGetColOwnershipRanges()
>
> Unless I'm mistaken (please correct me if I'm wrong), there is
> currently no simple and direct way to determine the parallel layout of
> a matrix in terms of both of row and column ranges. Hence adding these
> interfaces for the matrices would not violate of the second rule of
> PETSc programming.
>
> Cheers,
>    Dave
>
>
>
> On Sat, Aug 23, 2008 at 1:14 AM, Barry Smith <bsmith at mcs.anl.gov>  
> wrote:
>>
>>  Dave,
>>
>>    This has been a controversial issue over the years. We didn't  
>> have a map
>> concept, it was introduced, it was then
>> "hidden".  The fact that there exist public PetscMap functions at  
>> all is my
>> compromise for a persistent user.
>>
>>    Two key "rules" I use in making decisions in PETSc code are:
>>
>> 1) try really really hard to minimize the number of abstract  
>> objects in the
>> PETSc interface (this is because I believe
>>    the difficulty of using a "class" library grows exponentially  
>> with the
>> number of abstract objects in the interface)
>>   (obviously not everyone believes this, it seems most class  
>> libraries add
>> new classes at the drop of a hat)
>> 2) there should be ONE way to do each operation in the package  
>> (this is
>> because I believe having multiple ways to
>>  do the same thing is confusing to most users). For example, to set  
>> the
>> size of a vector you can only use VecSetSizes(),
>>  to solve a nonlinear system you call SNESSolve()*.
>>
>> If we bring PetscMap up as "first class user object" this violates  
>> both 1
>> and 2. It is a new basic object and manipulating/accessing
>> Vec/Mat size information would have TWO ways of doing everything:
>> VecGetSizes(), VecGetPetscMap() -> PetscMapGetSizes() etc.
>> I actually dream about the opposite; shrinking PetscMap down so it  
>> is so
>> small it can be strangled in a bathtub. I tried once
>> to remove the VecGetSizes() etc and have access only through  
>> PetscMap (to
>> satisfy rule 2) but ended up removing the public
>> PetscMap because I didn't see having PetscMap as the basic "layout  
>> definer"
>> as a good PETSc interface.
>>
>>  So my answer is, I really do not want to add these getters.  you  
>> really
>> have to convince me that the PetscMap object
>> is so fundamentally powerful it is worth violating 1 and 2.
>>
>> Barry
>>
>>
>> Note that the PetscMap() methods are prototyped in vecimpl.h,  
>> indicating
>> they are not public methods for PETSc.
>>
>>
>>
>>
>>
>> *sadly there is also DMMGSolve(), this I view as an interface bug  
>> and dream
>> about someday merging this functionality
>> back to the SNES.
>>
>>
>> On Aug 21, 2008, at 5:52 PM, Dave May wrote:
>>
>>> Hello,
>>>  Would it be possible to have the following small getters added to
>>> petsc-dev?
>>>       VecGetOwnershipRanges()
>>> Since we are just manipulating the maps why not include the  
>>> following as
>>> well
>>>      VecGetMap()
>>>      MatGetRowMap()
>>>      MatGetColumnMap()
>>>
>>> It seems reasonable to add these (to me at least) given there a few
>>> interfaces for
>>> PetscMap already made public.
>>>
>>> Cheers,
>>>  Dave.
>>>
>>
>>
>




More information about the petsc-dev mailing list