1
저는 petsc4py를 사용하고 있으며 몇 가지 문제가 있습니다. 나는 작은 petsc 밀도 행렬의 mij의 번호를 가지고 있고,이 같은 큰 행렬 M로 구성 할 :petsc 행렬을 만드는 방법은 무엇입니까?
[ m11 m12 m13 ]
M = | m21 m22 m23 | ,
[ m31 m32 m33 ]
가 mcve 코드는 아래에 표시되어, 나는 PETSc의 파이썬 랩을 사용하고 있습니다 그러나 문법은 비슷합니다. 이러한 에러 메시지를보고
import numpy as np
from petsc4py import PETSc
mSizes = (5, 8, 6)
mij = []
# create sub-matrices mij
for i in range(len(mSizes)):
for j in range(len(mSizes)):
temp_m = PETSc.Mat().create(comm=PETSc.COMM_WORLD)
temp_m.setSizes(((None, mSizes[i]), (None, mSizes[j])))
temp_m.setType('mpidense')
temp_m.setFromOptions()
temp_m.setUp()
temp_m[:, :] = np.random.random_sample((mSizes[i], mSizes[j]))
temp_m.assemble()
mij.append(temp_m)
# Now we have four sub-matrices.
# I would like to construct them into a big matrix M.
M = PETSc.Mat().create(comm=PETSc.COMM_WORLD)
M.setSizes(((None, np.sum(mSizes)), (None, np.sum(mSizes))))
M.setType('mpidense')
M.setFromOptions()
M.setUp()
mLocations = np.insert(np.cumsum(mSizes), 0, 0) # mLocations = [0, mSizes]
for i in range(len(mSizes)):
for j in range(len(mSizes)):
M[mLocations[i]:mLocations[i+1], mLocations[j]:mLocations[j+1]] = \
mij[i*len(mSizes)+j][:, :]
M.assemble()
는 :
Traceback (most recent call last):
File "tryMatConstuct.py", line 29, in <module>
mij[i*len(mSizes)+j][:, :]
File "PETSc/Mat.pyx", line 227, in petsc4py.PETSc.Mat.__getitem__ (src/petsc4py.PETSc.c:110477)
File "PETSc/petscmat.pxi", line 997, in petsc4py.PETSc.mat_getitem (src/petsc4py.PETSc.c:30481)
File "PETSc/petscmat.pxi", line 917, in petsc4py.PETSc.matgetvalues (src/petsc4py.PETSc.c:29242)
petsc4py.PETSc.Error: error code 56
[1] MatGetValues() line 1818 in /home/zhangji/PycharmProjects/petsc-petsc-31a1859eaff6/src/mat/interface/matrix.c
[1] MatGetValues_MPIDense() line 154 in /home/zhangji/PycharmProjects/petsc-petsc-31a1859eaff6/src/mat/impls/dense/mpi/mpidense.c
[1] No support for this operation for this object type
[1] Only local values currently supported
즉 PETSc.Mat() getDenseArray()이며 . 'MatGetValues ()'함수는 로컬 데이터에 대해서만 접근을 허용합니다. 이것이 에러 메시지가 출력되는 이유입니다. 마찬가지로'MatDenseGetArray_MPIDense()'는 로컬 데이터에 대한 접근을 가능하게합니다. [mpidense.c] (http://www.mcs.anl.gov/petsc/petsc-current/src/mat/impls/dense/mpi/mpidense.c.html)를 참조하십시오. 데이터를 전송하는 데 필요한 MPI 통신은 사용자에게 맡깁니다! 우리는 당신에게 대답을 제공하기 위해 [mcve] (http://stackoverflow.com/help/mcve)가 필요합니다! – francis