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