xref: /petsc/src/snes/interface/saws/snessaws.c (revision a69119a591a03a9d906b29c0a4e9802e4d7c9795)
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
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: `SNESMonitorSAWs()`, `SNESMonitorSAWsDestroy()`
22 @*/
23 PetscErrorCode SNESMonitorSAWsCreate(SNES snes, void **ctx) {
24   SNESMonitor_SAWs *mon;
25 
26   PetscFunctionBegin;
27   PetscCall(PetscNewLog(snes, &mon));
28   mon->viewer = PETSC_VIEWER_SAWS_(PetscObjectComm((PetscObject)snes));
29   PetscCheck(mon->viewer, PetscObjectComm((PetscObject)snes), PETSC_ERR_PLIB, "Cannot create SAWs default viewer");
30   *ctx = (void *)mon;
31   PetscFunctionReturn(0);
32 }
33 
34 /*@C
35    SNESMonitorSAWsDestroy - destroy a monitor context created with SNESMonitorSAWsCreate()
36 
37    Collective
38 
39    Input Parameter:
40 .  ctx - monitor context
41 
42    Level: developer
43 
44 .seealso: `SNESMonitorSAWsCreate()`
45 @*/
46 PetscErrorCode SNESMonitorSAWsDestroy(void **ctx) {
47   PetscFunctionBegin;
48   PetscCall(PetscFree(*ctx));
49   PetscFunctionReturn(0);
50 }
51 
52 /*@C
53    SNESMonitorSAWs - monitor solution using SAWs
54 
55    Logically Collective on SNES
56 
57    Input Parameters:
58 +  snes   - iterative context
59 .  n     - iteration number
60 .  rnorm - 2-norm (preconditioned) residual value (may be estimated).
61 -  ctx -  PetscViewer of type SAWs
62 
63    Level: advanced
64 
65 .seealso: `PetscViewerSAWsOpen()`
66 @*/
67 PetscErrorCode SNESMonitorSAWs(SNES snes, PetscInt n, PetscReal rnorm, void *ctx) {
68   PetscMPIInt rank;
69 
70   PetscFunctionBegin;
71   PetscValidHeaderSpecific(snes, SNES_CLASSID, 1);
72 
73   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
74   if (rank == 0) {
75     PetscCallSAWs(SAWs_Register, ("/PETSc/snes_monitor_saws/its", &snes->iter, 1, SAWs_READ, SAWs_INT));
76     PetscCallSAWs(SAWs_Register, ("/PETSc/snes_monitor_saws/rnorm", &snes->norm, 1, SAWs_READ, SAWs_DOUBLE));
77     PetscCall(PetscSAWsBlock());
78   }
79   PetscFunctionReturn(0);
80 }
81