Amit Itagi <[email protected]> writes: > I tried the equivalent version with petsc in C++: > > Mat subA[4]; > Mat A; > ... > MatCreateNest(comm,2,NULL,2,NULL,subA,&A); > > I did not face any issues. I am trying to map it to petsc4py.
You should take Matt's suggestion.
Sometimes it is best to look at the source. Lisandro his limited time
to work on petsc4py, and he spends it ensuring that everything works
correctly rather than carefully documenting the interface quirks.
Unfortunately, this means it can be tricky to guess how an interface
should be used. It will probably stay this way until either
cross-language documentation becomes more automated or someone finds
enough time to spend on petsc4py documentation.
def createNest(self, mats, isrows=None, iscols=None, comm=None):
mats = [list(mat) for mat in mats]
if isrows:
isrows = list(isrows)
assert len(isrows) == len(mats)
else:
isrows = None
if iscols:
iscols = list(iscols)
assert len(iscols) == len(mats[0])
else:
iscols = None
cdef MPI_Comm ccomm = def_Comm(comm, PETSC_COMM_DEFAULT)
cdef Py_ssize_t i, mr = len(mats)
cdef Py_ssize_t j, mc = len(mats[0])
cdef PetscInt nr = <PetscInt>mr
cdef PetscInt nc = <PetscInt>mc
cdef PetscMat *cmats = NULL
cdef PetscIS *cisrows = NULL
cdef PetscIS *ciscols = NULL
cdef object tmp1, tmp2, tmp3
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 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
if iscols is not None:
tmp3 = oarray_p(empty_p(nc), NULL, <void**>&ciscols)
for j from 0 <= j < mc: ciscols[j] = (<IS?>iscols[j]).iset
cdef PetscMat newmat = NULL
CHKERR( MatCreateNest(ccomm, nr, cisrows, nc, ciscols, cmats, &newmat) )
PetscCLEAR(self.obj); self.mat = newmat
return self
pgpGIH4Ni1N9m.pgp
Description: PGP signature
