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