xref: /petsc/src/snes/interface/saws/snessaws.c (revision 66af8762ec03dbef0e079729eb2a1734a35ed7ff)
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: `SNESSetMonitor()`, `SNES`, `SNESMonitorSAWs()`, `SNESMonitorSAWsDestroy()`
22 @*/
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: `SNESMonitorSAWsCreate()`
46 @*/
47 PetscErrorCode SNESMonitorSAWsDestroy(void **ctx)
48 {
49   PetscFunctionBegin;
50   PetscCall(PetscFree(*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: `PetscViewerSAWsOpen()`, `SNESMonitorSAWsDestroy()`, `SNESMonitorSAWsCreate()`
68 @*/
69 PetscErrorCode SNESMonitorSAWs(SNES snes, PetscInt n, PetscReal rnorm, void *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