Hey Lisandro,

null = PETSc.Mat()

works as well.

-Chris

On Sun, Feb 21, 2016 at 8:55 PM, Lisandro Dalcin <[email protected]> wrote:
> 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 <[email protected]> wrote:
>> Hey Lawrence,
>>
>> I will give that a try, thanks!
>>
>> -Chris
>>
>> On Wed, Feb 17, 2016 at 3:53 PM, Lawrence Mitchell
>> <[email protected]> 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
>> [email protected]
>
>
>
> --
> 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



-- 
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
[email protected]

Reply via email to