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.