Don't call

   KSPSetOperators(ksp, J, J);


    instead call

    SNESSetJacobian(snes,J,J, MatMFFDComputeJacobian)

    but I am not sure that would explain the crash.

    BTW: since you are applying no preconditioner if the matrix is 
ill-conditioned it may take many iterations or not converge. You can try 
something like -ksp_gmres_restart 100 or similar value to try to improve 
convergence (default is 30).

    Barry




> On Oct 29, 2024, at 12:37 PM, Daniel Pino Munoz 
> <daniel.pino_mu...@mines-paristech.fr> wrote:
> 
> 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
> 

Reply via email to