That's what I thought, so I replaced its content by: VecZeroEntries(f);
and the result is the same... On 29/10/2024 21:31, Barry Smith wrote:
This [0]PETSC ERROR: #1 SNES callback function indicates the crash is in your computeResidual function and thus you need to debug your function BarryOn Oct 29, 2024, at 4:28 PM, Daniel Pino Munoz <daniel.pino_mu...@mines-paristech.fr> wrote: I ran it with -malloc_debug and it does not change anything. The output is the following: he absolute tolerance is 0.001 The relative tolerance is 0.001 The divergence tolerance is 10000 The maximum iterations is 10000 Initial load ! [0]PETSC ERROR: ------------------------------------------------------------------------ [0]PETSC ERROR: Caught signal number 11 SEGV: Segmentation Violation, probably memory access out of range [0]PETSC ERROR: Try option -start_in_debugger or -on_error_attach_debugger[0]PETSC ERROR: or see https://urldefense.us/v3/__https://petsc.org/release/faq/*valgrind__;Iw!!G_uCfscf7eWS!Z0ifVNZaie3VDyNzpdW9w-vk0Aw1cEjqvlrJcp_-d2R06pFj_9PAlB2x6azoU8bjbqzaGXlVlziswk5eBSowDWMil2MSKYzGXNx6bzkEpw$ and https://urldefense.us/v3/__https://petsc.org/release/faq/__;!!G_uCfscf7eWS!Z0ifVNZaie3VDyNzpdW9w-vk0Aw1cEjqvlrJcp_-d2R06pFj_9PAlB2x6azoU8bjbqzaGXlVlziswk5eBSowDWMil2MSKYzGXNxyzMy5Zw$ [0]PETSC ERROR: --------------------- Stack Frames ------------------------------------[0]PETSC ERROR: The line numbers in the error traceback are not always exact. [0]PETSC ERROR: #1 SNES callback function [0]PETSC ERROR: #2 SNESComputeFunction() at /home/daniel-pino/Software/Dependencies/petsc/src/snes/interface/snes.c:2489 [0]PETSC ERROR: #3 SNESSolve_KSPONLY() at /home/daniel-pino/Software/Dependencies/petsc/src/snes/impls/ksponly/ksponly.c:27 [0]PETSC ERROR: #4 SNESSolve() at /home/daniel-pino/Software/Dependencies/petsc/src/snes/interface/snes.c:4841 -------------------------------------------------------------------------- MPI_ABORT was invoked on rank 0 in communicator MPI_COMM_WORLD Proc: [[27669,1],0] Errorcode: 59 NOTE: invoking MPI_ABORT causes Open MPI to kill all MPI processes. You may or may not see output from other processes, depending on exactly when Open MPI kills them. -------------------------------------------------------------------------- On 29/10/2024 20:17, Barry Smith wrote:Hmm, cut and paste the output when it crashes. Also run with -malloc_debug and see what happens BarryOn Oct 29, 2024, at 3:13 PM, Daniel Pino Munoz <daniel.pino_mu...@mines-paristech.fr> wrote: Hi Barry, Thanks for getting back to me! I tried replacing KSPSetOperators(ksp, J, J); by SNESSetJacobian(snes,J,J, MatMFFDComputeJacobian) and I get the same result = It works in Debug mode but not in Release. I also ran valgrind and it did not catch any memory problem. Any ideas? PS : You are right regarding the number of iterations of the non preconditioned problem. In the previous version of the code that only used a KSP, I already had to set -ksp_gmres_restart 100. But thanks for the heads up. Best, Daniel On 29/10/2024 20:01, Barry Smith wrote: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). BarryOn 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