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]
