xref: /petsc/src/snes/interface/saws/snessaws.c (revision 28b400f66ebc7ae0049166a2294dfcd3df27e64b)
1af0996ceSBarry Smith #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 } SNESMonitor_SAWs;
7c67b8539SHong Zhang 
8c67b8539SHong Zhang /*@C
9c67b8539SHong Zhang    SNESMonitorSAWsCreate - create an SAWs monitor context
10c67b8539SHong Zhang 
11c67b8539SHong Zhang    Collective
12c67b8539SHong Zhang 
134165533cSJose E. Roman    Input Parameter:
14c67b8539SHong Zhang .  snes - SNES to monitor
15c67b8539SHong Zhang 
164165533cSJose E. Roman    Output Parameter:
17c67b8539SHong Zhang .  ctx - context for monitor
18c67b8539SHong Zhang 
19c67b8539SHong Zhang    Level: developer
20c67b8539SHong Zhang 
21c67b8539SHong Zhang .seealso: SNESMonitorSAWs(), SNESMonitorSAWsDestroy()
22c67b8539SHong Zhang @*/
23c67b8539SHong Zhang PetscErrorCode SNESMonitorSAWsCreate(SNES snes,void **ctx)
24c67b8539SHong Zhang {
25c67b8539SHong Zhang   SNESMonitor_SAWs *mon;
26c67b8539SHong Zhang 
27c67b8539SHong Zhang   PetscFunctionBegin;
285f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscNewLog(snes,&mon));
29c67b8539SHong Zhang   mon->viewer = PETSC_VIEWER_SAWS_(PetscObjectComm((PetscObject)snes));
30*28b400f6SJacob Faibussowitsch   PetscCheck(mon->viewer,PetscObjectComm((PetscObject)snes),PETSC_ERR_PLIB,"Cannot create SAWs default viewer");
31c67b8539SHong Zhang   *ctx = (void*)mon;
32c67b8539SHong Zhang   PetscFunctionReturn(0);
33c67b8539SHong Zhang }
34c67b8539SHong Zhang 
35c67b8539SHong Zhang /*@C
36c67b8539SHong Zhang    SNESMonitorSAWsDestroy - destroy a monitor context created with SNESMonitorSAWsCreate()
37c67b8539SHong Zhang 
38c67b8539SHong Zhang    Collective
39c67b8539SHong Zhang 
404165533cSJose E. Roman    Input Parameter:
41c67b8539SHong Zhang .  ctx - monitor context
42c67b8539SHong Zhang 
43c67b8539SHong Zhang    Level: developer
44c67b8539SHong Zhang 
45c67b8539SHong Zhang .seealso: SNESMonitorSAWsCreate()
46c67b8539SHong Zhang @*/
47c67b8539SHong Zhang PetscErrorCode SNESMonitorSAWsDestroy(void **ctx)
48c67b8539SHong Zhang {
49c67b8539SHong Zhang   PetscFunctionBegin;
505f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(*ctx));
51c67b8539SHong Zhang   PetscFunctionReturn(0);
52c67b8539SHong Zhang }
53c67b8539SHong Zhang 
54c67b8539SHong Zhang /*@C
55c67b8539SHong Zhang    SNESMonitorSAWs - monitor solution using SAWs
56c67b8539SHong Zhang 
57c67b8539SHong Zhang    Logically Collective on SNES
58c67b8539SHong Zhang 
59c67b8539SHong Zhang    Input Parameters:
60c67b8539SHong Zhang +  snes   - iterative context
61c67b8539SHong Zhang .  n     - iteration number
62c67b8539SHong Zhang .  rnorm - 2-norm (preconditioned) residual value (may be estimated).
63c67b8539SHong Zhang -  ctx -  PetscViewer of type SAWs
64c67b8539SHong Zhang 
65c67b8539SHong Zhang    Level: advanced
66c67b8539SHong Zhang 
67c67b8539SHong Zhang .seealso: PetscViewerSAWsOpen()
68c67b8539SHong Zhang @*/
69c67b8539SHong Zhang PetscErrorCode SNESMonitorSAWs(SNES snes,PetscInt n,PetscReal rnorm,void *ctx)
70c67b8539SHong Zhang {
71c67b8539SHong Zhang   PetscMPIInt      rank;
72c67b8539SHong Zhang 
73c67b8539SHong Zhang   PetscFunctionBegin;
74c67b8539SHong Zhang   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
75c67b8539SHong Zhang 
765f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_rank(PETSC_COMM_WORLD,&rank));
77dd400576SPatrick Sanan   if (rank == 0) {
78c67b8539SHong Zhang     PetscStackCallSAWs(SAWs_Register,("/PETSc/snes_monitor_saws/its",&snes->iter,1,SAWs_READ,SAWs_INT));
79c67b8539SHong Zhang     PetscStackCallSAWs(SAWs_Register,("/PETSc/snes_monitor_saws/rnorm",&snes->norm,1,SAWs_READ,SAWs_DOUBLE));
805f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSAWsBlock());
81c67b8539SHong Zhang   }
82c67b8539SHong Zhang   PetscFunctionReturn(0);
83c67b8539SHong Zhang }
84