xref: /petsc/src/snes/interface/saws/snessaws.c (revision fbf9dbe564678ed6eff1806adbc4c4f01b9743f4)
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