2016-09-12 6 views
1

私はpetsc4pyを使用していますが、現在いくつかの問題に直面しています。 私は小さなpetsc密行列の数MIJている、と私はこのような大きな行列Mにそれらを構築したい:ペットマトリックスを構築するには?

 [ m11 m12 m13 ] 
M = | m21 m22 m23 | , 
    [ m31 m32 m33 ] 

MCVEコードは、下記の表示されており、私はPETScのPythonのラップを使用していますしかし、彼らの文法は似ています。このようなエラーメッセージを報告

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 
+0

フォーマットMATMPIDENSEは、スライスされた行列に対応する:各プロセスはMATSEQDENSEマトリックスとして全体的な行列の行の所定のセットを格納します。 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

答えて

0

Iは、2次元アレイの代わりに、短いサブマトリックスMIJにpetsc行列を使用しなければなりません。 。petsc4py関数で

はPETSc.Mat()getDenseArray()であり、すなわち

temp_m = mij[i*len(mSizes)+j].getDenseArray() 
関連する問題