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