2017-06-30 7 views
0

私はpetsc4pyを使用していますが、私は理解できません。私は次の関数を定義します:PETScマトリックス・コピーで例外が発生する理由は何ですか?

def tsIJacobian(self, ts, t, u, udot, shift, A, B): 
    self.setup_problem() 
    psol = fe.as_backend_type(self.sol.vector()).vec() 
    pA = fe.as_backend_type(self.A).mat() 
    u.copy(psol) 
    JU = fe.assemble(fe.derivative(ksdg.U_terms, ksdg.U)) 
    Jrho = fe.assemble(fe.derivative(ksdg.rho_terms, ksdg.rho)) 
    pJU = fe.as_backend_type(JU).mat() 
    pJrho = fe.as_backend_type(Jrho).mat() 
    pA.copy(A) 
    A.scale(shift) 
    A.axpy(1.0, pJU) 
    A.axpy(1.0, pJrho) 
    A.assemble() 
    if not (A is B): 
     A.copy(B) 
     B.assemble() 

次に試してみましょう。 (pAはすでに他の場所にある48x48のPETSc.Matとして定義されており、組み立てられています。ksdgは私が作業しているクラスのインスタンスですが、これが最終的にメンバ関数になります)。

J = pA.duplicate() 
B = pA.duplicate() 
tsIJacobian(ksdg, ts, 0, psol, pdsol, 0.1, J, B) 

これは、次の例外がスローされます。

petscerror.h.htmlを見て
--------------------------------------------------------------------------- 
Error          Traceback (most recent call last) 
<ipython-input-24-2a71f7ccf0af> in <module>() 
----> 1 tsIJacobian(ksdg, ts, 0, psol, pdsol, 0.1, J, B) 

<ipython-input-22-14579c08d6ae> in tsIJacobian(self, ts, t, u, udot, shift, A, B) 
    15  A.assemble() 
    16  if not (A is B): 
---> 17   A.copy(B) 
    18   B.assemble() 

PETSc/Mat.pyx in petsc4py.PETSc.Mat.copy (src/petsc4py.PETSc.c:118071)() 

Error: error code 63 

、63はPETSC_ERR_ARG_OUTOFRANGE 63 /* input argument, out of range */です。

PETScが行列AをBにコピーできない理由を誰かが理解していれば、私は説明を感謝します。ありがとう。

答えて

0

OK、私はそれを考え出しました。一つのオプション

PETSc.Mat.Option.NEW_NONZERO_ALLOCATION_ERR 

Trueある場合、スパース行列に新しい非ゼロ要素を作成しようとすると、エラー63例外が発生します。したがって、私はすぐにBの作成後

B.setOption(PETSc.Mat.Option.NEW_NONZERO_ALLOCATION_ERR, False) 

を実行した場合、例外はtsIJacobianに発生しません。私が理解していないのは、 Jと同じ例外が発生しない理由です。

関連する問題