xref: /petsc/src/snes/interface/saws/snessaws.c (revision 030f984af8d8bb4c203755d35bded3c05b3d83ce)
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 .seealso: PetscViewerSAWsOpen()
71 @*/
72 PetscErrorCode SNESMonitorSAWs(SNES snes,PetscInt n,PetscReal rnorm,void *ctx)
73 {
74   PetscErrorCode   ierr;
75   PetscMPIInt      rank;
76 
77   PetscFunctionBegin;
78   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
79 
80   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr);
81   if (!rank) {
82     PetscStackCallSAWs(SAWs_Register,("/PETSc/snes_monitor_saws/its",&snes->iter,1,SAWs_READ,SAWs_INT));
83     PetscStackCallSAWs(SAWs_Register,("/PETSc/snes_monitor_saws/rnorm",&snes->norm,1,SAWs_READ,SAWs_DOUBLE));
84     ierr = PetscSAWsBlock();CHKERRQ(ierr);
85   }
86   PetscFunctionReturn(0);
87 }
88