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