<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
Dear petsc users,</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
<br>
</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
in petsc version 3.24, I'm trying to create two snes over the same DM, but with different functions and jacobians. Despite making different calls to SNESSetFunction it happens the second snes uses the same function of the first.</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
Can you help me finding the problem, please?</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
<br>
</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
Here below there is a minimal working example showing the issue:</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
<br>
</div>
<div class="elementToProof">
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
static char help[] = "Test SNES.\n";</div>
</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
#include <petscsys.h></div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
#include <petscdmda.h></div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
#include <petscsnes.h><br>
<br>
</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
PetscErrorCode Jac_1(SNES <i>snes</i>, Vec <i>x</i>, Mat <i>J</i>, Mat <i>B</i>, void *){</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscFunctionBegin;</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    printf("Jac 1\n");</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscFunctionReturn(PETSC_SUCCESS);</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
}</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
<br>
</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
PetscErrorCode Function_1(SNES <i>snes</i>, Vec <i>x</i>, Vec <i>f</i>, void *){</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscFunctionBegin;</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    printf("Function 1\n");</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscFunctionReturn(PETSC_SUCCESS);</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
}</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
<br>
</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
PetscErrorCode Jac_2(SNES <i>snes</i>, Vec <i>x</i>, Mat <i>J</i>, Mat <i>B</i>, void *){</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscFunctionBegin;</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    printf("Jac 2\n");</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscFunctionReturn(PETSC_SUCCESS);</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
}</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
<br>
</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
PetscErrorCode Function_2(SNES <i>snes</i>, Vec <i>x</i>, Vec <i>f</i>, void *){</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscFunctionBegin;</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    printf("Function 2\n");</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscFunctionReturn(PETSC_SUCCESS);</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
}<br>
<br>
</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
int main(int <i>argc</i>, char **<i>argv</i>) {</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
<br>
</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscFunctionBeginUser;</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscCall(PetscInitialize(&<i>argc</i>, &<i>argv</i>, NULL, help));</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
<br>
</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    DM dm;</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscCall(DMDACreate1d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, 100, 1, 1, NULL, &dm));</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscCall(DMSetFromOptions(dm));</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscCall(DMSetUp(dm));</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
<br>
</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    SNES snes1, snes2;</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    Vec r1,r2;</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    Mat J1, J2;</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
<br>
</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscCall(DMCreateGlobalVector(dm, &r1));</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscCall(DMCreateGlobalVector(dm, &r2))</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscCall(DMCreateMatrix(dm, &J1));</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscCall(DMCreateMatrix(dm, &J2));</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
<br>
</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscCall(SNESCreate(PETSC_COMM_WORLD, &snes1));</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscCall(SNESCreate(PETSC_COMM_WORLD, &snes2));</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscCall(SNESSetType(snes1, SNESNEWTONLS));</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscCall(SNESSetType(snes2, SNESNEWTONLS));</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscCall(SNESSetFromOptions(snes1));</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscCall(SNESSetFromOptions(snes2));</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscCall(SNESSetFunction(snes1, r1, Function_1, NULL));</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscCall(SNESSetFunction(snes2, r2, Function_2, NULL));</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscCall(SNESSetJacobian(snes1, J1, J1, Jac_1, NULL));</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscCall(SNESSetJacobian(snes2, J2, J2, Jac_2, NULL));</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscCall(SNESSetDM(snes1, dm));</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscCall(SNESSetDM(snes2, dm));</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
<br>
</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscCall(SNESSolve(snes1, NULL, NULL));</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscCall(SNESSolve(snes2, NULL, NULL));</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
<br>
</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    printf("snes1 %p; snes2 %p\n", snes1, snes2);</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
<br>
</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    SNESFunctionFn *p;</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscCall(SNESGetFunction(snes1, NULL, &p, NULL));</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    printf("snes1: pointer %p, true function %p\n", *p, Function_1);</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscCall(SNESGetFunction(snes2, NULL, &p, NULL));</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    printf("snes2: pointer %p, true function %p\n", *p, Function_2);</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
   </div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscCall(PetscFinalize());</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
    PetscFunctionReturn(PETSC_SUCCESS);</div>
<div style="line-height: 22px; font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
}</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
<br>
</div>
</body>
</html>