[petsc-dev] MatNest in petsc4py with empty submatrices

Lisandro Dalcin dalcinl at gmail.com
Sun Feb 21 13:55:26 CST 2016


Could you try the following?

null = PETSc.Mat()
nest_list = [[null,null],[null,null]]

Anyway, I like Lawrence's patch. I'll push a fix to maint


On 18 February 2016 at 21:27, Chris Eldred <chris.eldred at gmail.com> wrote:
> Hey Lawrence,
>
> I will give that a try, thanks!
>
> -Chris
>
> On Wed, Feb 17, 2016 at 3:53 PM, Lawrence Mitchell
> <lawrence.mitchell at imperial.ac.uk> wrote:
>> On 17/02/16 14:47, Chris Eldred wrote:
>>> Hey All,
>>>
>>> I was wondering if anyone had used MatNest with petsc4py. I am having
>>> issues trying to create a MatNest where some of the submatrices are
>>> empty. In PETSc, I can just pass NULL in the array that I give to
>>> MatCreateNest and it works fine. However, the following code
>>
>> We use it, but haven't used it with empty slots.
>>
>>> nest_list = [[None,None],[None,None]]
>>> nest_list[0][0] = some matrix
>>> nest_list[0][1] = some matrix
>>> nest_list[1][0] = some matrix
>>> A = PETSc.Mat().createNest(nest_list,comm=PETSc.COMM_WORLD)
>>>
>>> fails with:
>>>   File "Mat.pyx", line 445, in petsc4py.PETSc.Mat.createNest
>>> (src/petsc4py.PETSc.c:103202)
>>> TypeError: Cannot convert NoneType to petsc4py.PETSc.Mat
>>>
>>> Is there an equivalent to NULL in petsc4py (there doesn't appear to be one)?
>>>
>>> If all of the entries in nest_list are filled, everything works fine.
>>>
>>> Any help would be appreciated!
>>
>> Maybe a patch like this to petsc4py?
>>
>> diff --git a/src/PETSc/Mat.pyx b/src/PETSc/Mat.pyx
>> index f281ba0..490c58e 100644
>> --- a/src/PETSc/Mat.pyx
>> +++ b/src/PETSc/Mat.pyx
>> @@ -460,7 +460,10 @@ cdef class Mat(Object):
>>          tmp1 = oarray_p(empty_p(nr*nc), NULL, <void**>&cmats)
>>          for i from 0 <= i < mr:
>>              for j from 0 <= j < mc:
>> -                cmats[i*mc+j] = (<Mat?>mats[i][j]).mat
>> +                if mats[i][j] is None:
>> +                    cmats[i*mc+j] = NULL
>> +                else:
>> +                    cmats[i*mc+j] = (<Mat?>mats[i][j]).mat
>>          if isrows is not None:
>>              tmp2 = oarray_p(empty_p(nr), NULL, <void**>&cisrows)
>>              for i from 0 <= i < mr: cisrows[i] = (<IS?>isrows[i]).iset
>>
>>
>> Untested.
>>
>> If you want to pass null isrows and iscols as well you'll need to do a
>> similar thing there.
>>
>> Cheers,
>>
>> Lawrence
>>
>
>
>
> --
> Chris Eldred
> Postdoctoral Fellow, LAGA, University of Paris 13
> PhD, Atmospheric Science, Colorado State University, 2015
> DOE Computational Science Graduate Fellow (Alumni)
> B.S. Applied Computational Physics, Carnegie Mellon University, 2009
> chris.eldred at gmail.com



-- 
Lisandro Dalcin
============
Research Scientist
Computer, Electrical and Mathematical Sciences & Engineering (CEMSE)
Extreme Computing Research Center (ECRC)
King Abdullah University of Science and Technology (KAUST)
http://ecrc.kaust.edu.sa/

4700 King Abdullah University of Science and Technology
al-Khawarizmi Bldg (Bldg 1), Office # 4332
Thuwal 23955-6900, Kingdom of Saudi Arabia
http://www.kaust.edu.sa

Office Phone: +966 12 808-0459



More information about the petsc-dev mailing list