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