xref: /petsc/src/snes/interface/saws/snessaws.c (revision 4dfa11a44d5adf2389f1d3acbc8f3c1116dc6c3a)
1af0996ceSBarry Smith #include <petsc/private/snesimpl.h> /*I "petscsnes.h" I*/
2c67b8539SHong Zhang #include <petscviewersaws.h>
3c67b8539SHong Zhang 
4c67b8539SHong Zhang typedef struct {
5c67b8539SHong Zhang   PetscViewer viewer;
6c67b8539SHong Zhang } SNESMonitor_SAWs;
7c67b8539SHong Zhang 
8c67b8539SHong Zhang /*@C
9f6dfbefdSBarry Smith    SNESMonitorSAWsCreate - create an SAWs monitor context for `SNES`
10c67b8539SHong Zhang 
11f6dfbefdSBarry Smith    Collective on snes
12c67b8539SHong Zhang 
134165533cSJose E. Roman    Input Parameter:
14f6dfbefdSBarry Smith .  snes - `SNES` to monitor
15c67b8539SHong Zhang 
164165533cSJose E. Roman    Output Parameter:
17c67b8539SHong Zhang .  ctx - context for monitor
18c67b8539SHong Zhang 
19c67b8539SHong Zhang    Level: developer
20c67b8539SHong Zhang 
21f6dfbefdSBarry Smith .seealso: `SNESSetMonitor()`, `SNES`, `SNESMonitorSAWs()`, `SNESMonitorSAWsDestroy()`
22c67b8539SHong Zhang @*/
239371c9d4SSatish Balay PetscErrorCode SNESMonitorSAWsCreate(SNES snes, void **ctx) {
24c67b8539SHong Zhang   SNESMonitor_SAWs *mon;
25c67b8539SHong Zhang 
26c67b8539SHong Zhang   PetscFunctionBegin;
27*4dfa11a4SJacob Faibussowitsch   PetscCall(PetscNew(&mon));
28c67b8539SHong Zhang   mon->viewer = PETSC_VIEWER_SAWS_(PetscObjectComm((PetscObject)snes));
2928b400f6SJacob Faibussowitsch   PetscCheck(mon->viewer, PetscObjectComm((PetscObject)snes), PETSC_ERR_PLIB, "Cannot create SAWs default viewer");
30c67b8539SHong Zhang   *ctx = (void *)mon;
31c67b8539SHong Zhang   PetscFunctionReturn(0);
32c67b8539SHong Zhang }
33c67b8539SHong Zhang 
34c67b8539SHong Zhang /*@C
35f6dfbefdSBarry Smith    SNESMonitorSAWsDestroy - destroy a monitor context created with `SNESMonitorSAWsCreate()`
36c67b8539SHong Zhang 
37c67b8539SHong Zhang    Collective
38c67b8539SHong Zhang 
394165533cSJose E. Roman    Input Parameter:
40c67b8539SHong Zhang .  ctx - monitor context
41c67b8539SHong Zhang 
42c67b8539SHong Zhang    Level: developer
43c67b8539SHong Zhang 
44db781477SPatrick Sanan .seealso: `SNESMonitorSAWsCreate()`
45c67b8539SHong Zhang @*/
469371c9d4SSatish Balay PetscErrorCode SNESMonitorSAWsDestroy(void **ctx) {
47c67b8539SHong Zhang   PetscFunctionBegin;
489566063dSJacob Faibussowitsch   PetscCall(PetscFree(*ctx));
49c67b8539SHong Zhang   PetscFunctionReturn(0);
50c67b8539SHong Zhang }
51c67b8539SHong Zhang 
52c67b8539SHong Zhang /*@C
53f6dfbefdSBarry Smith    SNESMonitorSAWs - monitor solution process of `SNES` using SAWs
54c67b8539SHong Zhang 
55f6dfbefdSBarry Smith    Collective on snes
56c67b8539SHong Zhang 
57c67b8539SHong Zhang    Input Parameters:
58c67b8539SHong Zhang +  snes   - iterative context
59c67b8539SHong Zhang .  n     - iteration number
60c67b8539SHong Zhang .  rnorm - 2-norm (preconditioned) residual value (may be estimated).
61f6dfbefdSBarry Smith -  ctx -  `PetscViewer` of type `PETSCVIEWERSAWS`
62c67b8539SHong Zhang 
63c67b8539SHong Zhang    Level: advanced
64c67b8539SHong Zhang 
65f6dfbefdSBarry Smith .seealso: `PetscViewerSAWsOpen()`, `SNESMonitorSAWsDestroy()`, `SNESMonitorSAWsCreate()`
66c67b8539SHong Zhang @*/
679371c9d4SSatish Balay PetscErrorCode SNESMonitorSAWs(SNES snes, PetscInt n, PetscReal rnorm, void *ctx) {
68c67b8539SHong Zhang   PetscMPIInt rank;
69c67b8539SHong Zhang 
70c67b8539SHong Zhang   PetscFunctionBegin;
71c67b8539SHong Zhang   PetscValidHeaderSpecific(snes, SNES_CLASSID, 1);
72c67b8539SHong Zhang 
739566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
74dd400576SPatrick Sanan   if (rank == 0) {
75792fecdfSBarry Smith     PetscCallSAWs(SAWs_Register, ("/PETSc/snes_monitor_saws/its", &snes->iter, 1, SAWs_READ, SAWs_INT));
76792fecdfSBarry Smith     PetscCallSAWs(SAWs_Register, ("/PETSc/snes_monitor_saws/rnorm", &snes->norm, 1, SAWs_READ, SAWs_DOUBLE));
779566063dSJacob Faibussowitsch     PetscCall(PetscSAWsBlock());
78c67b8539SHong Zhang   }
79c67b8539SHong Zhang   PetscFunctionReturn(0);
80c67b8539SHong Zhang }
81