[petsc-users] R: Two SNES on the same DM not working
Matteo Semplice
matteo.semplice at uninsubria.it
Thu Nov 6 02:19:14 CST 2025
Dear Barry,
sorry for jumping into this.
I am wondering if your reply is related to DMDA or to DM in general. I
have at least one code where I do something similar to what Samuele did
in his sample code: create a DMPlex, create a section on this DMPlex,
create two SNES solving for Vecs defined on that same section and attach
to each of them a different SNESFunction and SNESJacobian (one solves a
predictor and the other is a corrector). Everything seems fine, but I am
wondering if that code is somewhat weak and should be changed by
DMCloning the plex as you suggested to Samuele.
Thanks
Matteo
On 06/11/2025 07:49, Samuele Ferri wrote:
>
>
> sale987 at live.com sembra simile a un utente che in precedenza ti ha
> inviato un messaggio di posta elettronica, ma potrebbe non essere lo
> stesso. Scopri perché potrebbe trattarsi di un rischio
> <https://urldefense.us/v3/__https://aka.ms/LearnAboutSenderIdentification__;!!G_uCfscf7eWS!d2x1h3Pt9OqhfeBcqW8pR0dbGy3bRw6bM-p0DxGAaY0CXWkqH3lpsuXiob9mOqfsy-aRVJXUig3819n2CWpYyFn4FDaTAWRxNDXZsA$ >
>
>
> Dear Barry,
>
> thank you for your reply. Now everything works fine.
>
> Best regards
> Samuele
> ------------------------------------------------------------------------
> *Da:* Barry Smith <bsmith at petsc.dev>
> *Inviato:* mercoledì 5 novembre 2025 15:47
> *A:* Samuele Ferri <sale987 at live.com>
> *Cc:* petsc-users at mcs.anl.gov <petsc-users at mcs.anl.gov>
> *Oggetto:* Re: [petsc-users] Two SNES on the same DM not working
>
> This is not supported. Duplicate your DM.
>
>> On Nov 5, 2025, at 9:17 AM, Samuele Ferri <sale987 at live.com> wrote:
>>
>> Dear petsc users,
>>
>> 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.
>> Can you help me finding the problem, please?
>>
>> Here below there is a minimal working example showing the issue:
>>
>> static char help[] = "Test SNES.\n";
>> #include <petscsys.h>
>> #include <petscdmda.h>
>> #include <petscsnes.h>
>>
>> PetscErrorCode Jac_1(SNES/snes/, Vec/x/, Mat/J/, Mat/B/, void *){
>> PetscFunctionBegin;
>> printf("Jac 1\n");
>> PetscFunctionReturn(PETSC_SUCCESS);
>> }
>>
>> PetscErrorCode Function_1(SNES/snes/, Vec/x/, Vec/f/, void *){
>> PetscFunctionBegin;
>> printf("Function 1\n");
>> PetscFunctionReturn(PETSC_SUCCESS);
>> }
>>
>> PetscErrorCode Jac_2(SNES/snes/, Vec/x/, Mat/J/, Mat/B/, void *){
>> PetscFunctionBegin;
>> printf("Jac 2\n");
>> PetscFunctionReturn(PETSC_SUCCESS);
>> }
>>
>> PetscErrorCode Function_2(SNES/snes/, Vec/x/, Vec/f/, void *){
>> PetscFunctionBegin;
>> printf("Function 2\n");
>> PetscFunctionReturn(PETSC_SUCCESS);
>> }
>>
>> int main(int/argc/, char **/argv/) {
>>
>> PetscFunctionBeginUser;
>> PetscCall(PetscInitialize(&/argc/, &/argv/, NULL, help));
>>
>> DM dm;
>> PetscCall(DMDACreate1d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, 100,
>> 1, 1, NULL, &dm));
>> PetscCall(DMSetFromOptions(dm));
>> PetscCall(DMSetUp(dm));
>>
>> SNES snes1, snes2;
>> Vec r1,r2;
>> Mat J1, J2;
>>
>> PetscCall(DMCreateGlobalVector(dm, &r1));
>> PetscCall(DMCreateGlobalVector(dm, &r2))
>> PetscCall(DMCreateMatrix(dm, &J1));
>> PetscCall(DMCreateMatrix(dm, &J2));
>>
>> PetscCall(SNESCreate(PETSC_COMM_WORLD, &snes1));
>> PetscCall(SNESCreate(PETSC_COMM_WORLD, &snes2));
>> PetscCall(SNESSetType(snes1, SNESNEWTONLS));
>> PetscCall(SNESSetType(snes2, SNESNEWTONLS));
>> PetscCall(SNESSetFromOptions(snes1));
>> PetscCall(SNESSetFromOptions(snes2));
>> PetscCall(SNESSetFunction(snes1, r1, Function_1, NULL));
>> PetscCall(SNESSetFunction(snes2, r2, Function_2, NULL));
>> PetscCall(SNESSetJacobian(snes1, J1, J1, Jac_1, NULL));
>> PetscCall(SNESSetJacobian(snes2, J2, J2, Jac_2, NULL));
>> PetscCall(SNESSetDM(snes1, dm));
>> PetscCall(SNESSetDM(snes2, dm));
>>
>> PetscCall(SNESSolve(snes1, NULL, NULL));
>> PetscCall(SNESSolve(snes2, NULL, NULL));
>>
>> printf("snes1 %p; snes2 %p\n", snes1, snes2);
>>
>> SNESFunctionFn *p;
>> PetscCall(SNESGetFunction(snes1, NULL, &p, NULL));
>> printf("snes1: pointer %p, true function %p\n", *p, Function_1);
>> PetscCall(SNESGetFunction(snes2, NULL, &p, NULL));
>> printf("snes2: pointer %p, true function %p\n", *p, Function_2);
>> PetscCall(PetscFinalize());
>> PetscFunctionReturn(PETSC_SUCCESS);
>> }
>
--
Prof. Matteo Semplice
Università degli Studi dell’Insubria
Dipartimento di Scienza e Alta Tecnologia – DiSAT
Professore Associato
Via Valleggio, 11 – 22100 Como (CO) – Italia
tel.: +39 031 2386316
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20251106/f195e99e/attachment-0001.html>
More information about the petsc-users
mailing list