[petsc-users] MatSetSizes with blocked matrix

Matthew Knepley knepley at gmail.com
Tue Mar 15 10:58:05 CDT 2016


On Tue, Mar 15, 2016 at 10:54 AM, Steena Monteiro <steena.hpc at gmail.com>
wrote:

> Thank you, Dave.
>
> Matt: I understand the inconsistency but MatMult with non divisible block
> sizes (here, 2) does not throw any errors and fail, when MatSetSize is
> commented out. Implying that 1139905 global size does work with block size
> 2.
>

If you comment out MatSetSize(), how does it know what size the Mat is?

   Matt


> On 15 March 2016 at 00:12, Dave May <dave.mayhem23 at gmail.com> wrote:
>
>>
>> On 15 March 2016 at 04:46, Matthew Knepley <knepley at gmail.com> wrote:
>>
>>> On Mon, Mar 14, 2016 at 10:05 PM, Steena Monteiro <steena.hpc at gmail.com>
>>> wrote:
>>>
>>>> Hello,
>>>>
>>>> I am having difficulty getting MatSetSize to work prior to using
>>>> MatMult.
>>>>
>>>> For matrix A with rows=cols=1,139,905 and block size = 2,
>>>>
>>>
>>> It is inconsistent to have a row/col size that is not divisible by the
>>> block size.
>>>
>>
>>
>> To be honest, I don't think the error message being thrown clearly
>> indicates what the actual problem is (hence the email from Steena). What
>> about
>>
>> "Cannot change/reset row sizes to 400000 local 1139906 global after
>> previously setting them to 400000 local 1139905 global. Local and global
>> sizes must be divisible by the block size"
>>
>>
>>>
>>>   Matt
>>>
>>>
>>>> rank 0 gets 400000 rows and rank 1 739905 rows,  like so:
>>>>
>>>> /*Matrix setup*/
>>>>
>>>> ierr=PetscViewerBinaryOpen(PETSC_COMM_WORLD,file,FILE_MODE_READ,&fd);
>>>> ierr = MatCreate(PETSC_COMM_WORLD,&A);
>>>> ierr = MatSetFromOptions(A);
>>>> ierr = MatSetType(A,MATBAIJ);
>>>> ierr = MatSetBlockSize(A,2);
>>>>
>>>> /*Unequal row assignment*/
>>>>
>>>>  if (!rank) {
>>>>     ierr = MatSetSizes(A, 400000, PETSC_DECIDE,
>>>> 1139905,1139905);CHKERRQ(ierr);
>>>>    }
>>>> else {
>>>>     ierr = MatSetSizes(A, 739905, PETSC_DECIDE,
>>>> 1139905,1139905);CHKERRQ(ierr);
>>>> }
>>>>
>>>> MatMult (A,x,y);
>>>>
>>>> /************************************/
>>>>
>>>> Error message:
>>>>
>>>> 1]PETSC ERROR: [0]PETSC ERROR: No support for this operation for this
>>>> object type
>>>> Cannot change/reset row sizes to 400000 local 1139906 global after
>>>> previously setting them to 400000 local 1139905 global
>>>>
>>>> [1]PETSC ERROR: [0]PETSC ERROR: Cannot change/reset row sizes to 739905
>>>> local 1139906 global after previously setting them to 739905 local 1139905
>>>> global
>>>>
>>>> -Without messing with row assignment,  MatMult works fine on this
>>>> matrix for block size = 2, presumably because an extra padded row is
>>>> automatically added to facilitate blocking.
>>>>
>>>> -The above code snippet works well for block size = 1.
>>>>
>>>> Is it possible to do unequal row distribution *while using blocking*?
>>>>
>>>> Thank you for any advice.
>>>>
>>>> -Steena
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>> --
>>> What most experimenters take for granted before they begin their
>>> experiments is infinitely more interesting than any results to which their
>>> experiments lead.
>>> -- Norbert Wiener
>>>
>>
>>
>


-- 
What most experimenters take for granted before they begin their
experiments is infinitely more interesting than any results to which their
experiments lead.
-- Norbert Wiener
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20160315/e44540e8/attachment-0001.html>


More information about the petsc-users mailing list