Dear developers,<br><br>I want to define matrix operation used in SNES as Matrix-Free kernel. Here is what I did:<br><br>        MatCreateSNESMF( snes, &JMat );         <br>        MatCreateShell( PETSC_COMM_SELF, nt, nt, nt, nt, (void*)&FC, &JMat );
<br>        MatShellSetOperation( JMat, MATOP_MULT, (void(*)())&_petsc_matMultFree );
<br><br>Where FC is my context which saves the flow field data. In the matrix-Free kernel:<br><br>void solver::_petsc_matMultFree( Mat J, Vec x, Vec y )<br>{<br>    MatShellGetContext( J, &FC );<br>// perturb the residual ( R -> R(x+eps) )<br>
// do matrix-vector kernel as: y := Mx = Mass/dt + ( R2 - R1 ) / eps<br>}<br><br>But I received the error at first subspace creation in KSP:<br><br>[0]PETSC ERROR: MatMult() line 2177 in src/mat/interface/matrix.c<br>[0]PETSC ERROR: PCApplyBAorAB() line 610 in src/ksp/pc/interface/precon.c<br>
[0]PETSC ERROR: GMREScycle() line 156 in src/ksp/ksp/impls/gmres/gmres.c<br>[0]PETSC ERROR: KSPSolve_GMRES() line 231 in src/ksp/ksp/impls/gmres/gmres.c<br>[0]PETSC ERROR: KSPSolve() line 423 in src/ksp/ksp/interface/itfunc.c<br>
[0]PETSC ERROR: SNES_KSPSolve() line 3396 in src/snes/interface/snes.c<br>[0]PETSC ERROR: SNESSolve_LS() line 190 in src/snes/impls/ls/ls.c<br>[0]PETSC ERROR: SNESSolve() line 2676 in src/snes/interface/snes.c<br>[0]PETSC ERROR: _petsc_NewtonTimeAdvance() line 151 in Newton.cpp<br>
<br>Would you please help me find my mistake ?<br><br>Thanks a lot,<br>BehZad<br>