2017-06-30 3 views
0

Ich benutze petsc4py und bekomme eine Ausnahme, die ich nicht verstehe. Ich definiere die folgende Funktion:PETSc Matrix-Kopie löst Ausnahme aus: warum?

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() 

dann versuchen Sie Folgendes. (pA wurde bereits als 48x48 PETSc.Mat an anderer Stelle definiert und zusammengebaut. ksdg ist eine Instanz einer Klasse, an der ich arbeite, von der dies schließlich eine Mitgliedsfunktion sein wird, wenn ich sie zur Arbeit bringen kann):

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

Dies wirft die folgende Ausnahme:

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

bei petscerror.h.html Sehen, 63 PETSC_ERR_ARG_OUTOFRANGE 63 /* input argument, out of range */ ist.

Wenn jemand versteht, warum PETSc mir Matrix A nach B nicht kopieren lässt, würde ich eine Erklärung schätzen. Vielen Dank.

Antwort

0

OK, ich habe es irgendwie herausgefunden. Der Fehler 63 Ausnahme wird ausgelöst, wenn man versucht, ein neues Nicht-Null-Element in einer Sparse-Matrix zu erstellen, wenn die Option

PETSc.Mat.Option.NEW_NONZERO_ALLOCATION_ERR 

True ist. Wenn ich also ausführen

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

unmittelbar nach der Erstellung von B, wird keine Ausnahme in tsIJacobian angehoben. Was ich nicht verstehe ist, warum ich nicht die selbe Ausnahme für J bekomme.

Verwandte Themen