[petsc-users] Example of SNES using matrix free jacobian

Daniel Pino Munoz daniel.pino_munoz at mines-paristech.fr
Tue Oct 29 11:37:51 CDT 2024


Dear all,

I have a linear problem that I am currently solving with a KSP matrix-free.

I would like to move on to a non linear problem, so figure I could start 
by solving the same linear problem using SNES. So I am setting the 
problem as follows:

SNESCreate(PETSC_COMM_WORLD, &snes);
MatCreateShell(PETSC_COMM_WORLD, n_dofs, n_dofs, PETSC_DETERMINE, 
PETSC_DETERMINE, &ctx, &J);
MatCreateShell(PETSC_COMM_WORLD, n_dofs, n_dofs, PETSC_DETERMINE, 
PETSC_DETERMINE, &ctx, &B);
MatShellSetOperation(J, MATOP_MULT, (void (*)(void))(Multiplication));
MatCreateVecs(J, &x_sol, &b);
VecDuplicate(x_sol, &r);
SNESSetFromOptions(snes);
SNESSetFunction(snes, r, &(computeResidual), &ctx);
SNESSetUseMatrixFree(snes, PETSC_FALSE, PETSC_TRUE);
SNESGetLineSearch(snes, &linesearch);
SNESGetKSP(snes, &ksp);
KSPSetOperators(ksp, J, J);
KSPSetInitialGuessNonzero(ksp, PETSC_TRUE);

I tested it with a small problem (compiled in debug) and it works.

When I compiled it in Release, it crashes with a segfault. I tried 
running the Debug version through valgrind, but even for a small 
problem, it is too slow. So I was wondering if you guys could see any 
rocky mistake on the lines I used above?

Otherwise, is there any example that uses a SNES combined with a matrix 
free KSP operator?

Thank you,

   Daniel



More information about the petsc-users mailing list