1 #include <petsc/private/snesimpl.h> /*I "petscsnes.h" I*/
2 #include <petscviewersaws.h>
3
4 typedef struct {
5 PetscViewer viewer;
6 } SNESMonitor_SAWs;
7
8 /*@C
9 SNESMonitorSAWsCreate - create an SAWs monitor context for `SNES`
10
11 Collective
12
13 Input Parameter:
14 . snes - `SNES` to monitor
15
16 Output Parameter:
17 . ctx - context for monitor
18
19 Level: developer
20
21 .seealso: [](ch_snes), `SNESMonitorSet()`, `SNES`, `SNESMonitorSAWs()`, `SNESMonitorSAWsDestroy()`
22 @*/
SNESMonitorSAWsCreate(SNES snes,void ** ctx)23 PetscErrorCode SNESMonitorSAWsCreate(SNES snes, void **ctx)
24 {
25 SNESMonitor_SAWs *mon;
26
27 PetscFunctionBegin;
28 PetscCall(PetscNew(&mon));
29 mon->viewer = PETSC_VIEWER_SAWS_(PetscObjectComm((PetscObject)snes));
30 PetscCheck(mon->viewer, PetscObjectComm((PetscObject)snes), PETSC_ERR_PLIB, "Cannot create SAWs default viewer");
31 *ctx = (void *)mon;
32 PetscFunctionReturn(PETSC_SUCCESS);
33 }
34
35 /*@C
36 SNESMonitorSAWsDestroy - destroy a monitor context created with `SNESMonitorSAWsCreate()`
37
38 Collective
39
40 Input Parameter:
41 . ctx - monitor context
42
43 Level: developer
44
45 .seealso: [](ch_snes), `SNESMonitorSAWsCreate()`
46 @*/
SNESMonitorSAWsDestroy(PetscCtxRt ctx)47 PetscErrorCode SNESMonitorSAWsDestroy(PetscCtxRt ctx)
48 {
49 PetscFunctionBegin;
50 PetscCall(PetscFree(*(void **)ctx));
51 PetscFunctionReturn(PETSC_SUCCESS);
52 }
53
54 /*@C
55 SNESMonitorSAWs - monitor solution process of `SNES` using SAWs
56
57 Collective
58
59 Input Parameters:
60 + snes - iterative context
61 . n - iteration number
62 . rnorm - 2-norm (preconditioned) residual value (may be estimated).
63 - ctx - `PetscViewer` of type `PETSCVIEWERSAWS`
64
65 Level: advanced
66
67 .seealso: [](ch_snes), `PetscViewerSAWsOpen()`, `SNESMonitorSAWsDestroy()`, `SNESMonitorSAWsCreate()`
68 @*/
SNESMonitorSAWs(SNES snes,PetscInt n,PetscReal rnorm,PetscCtx ctx)69 PetscErrorCode SNESMonitorSAWs(SNES snes, PetscInt n, PetscReal rnorm, PetscCtx ctx)
70 {
71 PetscMPIInt rank;
72
73 PetscFunctionBegin;
74 PetscValidHeaderSpecific(snes, SNES_CLASSID, 1);
75
76 PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
77 if (rank == 0) {
78 PetscCallSAWs(SAWs_Register, ("/PETSc/snes_monitor_saws/its", &snes->iter, 1, SAWs_READ, SAWs_INT));
79 PetscCallSAWs(SAWs_Register, ("/PETSc/snes_monitor_saws/rnorm", &snes->norm, 1, SAWs_READ, SAWs_DOUBLE));
80 PetscCall(PetscSAWsBlock());
81 }
82 PetscFunctionReturn(PETSC_SUCCESS);
83 }
84