Actual source code: snessaws.c

      1: #include <petsc/private/snesimpl.h>
      2: #include <petscviewersaws.h>

      4: typedef struct {
      5:   PetscViewer    viewer;
      6: } SNESMonitor_SAWs;

      8: /*@C
      9:    SNESMonitorSAWsCreate - create an SAWs monitor context

     11:    Collective

     13:    Input Arguments:
     14: .  snes - SNES to monitor

     16:    Output Arguments:
     17: .  ctx - context for monitor

     19:    Level: developer

     21: .seealso: SNESMonitorSAWs(), SNESMonitorSAWsDestroy()
     22: @*/
     23: PetscErrorCode SNESMonitorSAWsCreate(SNES snes,void **ctx)
     24: {
     25:   PetscErrorCode  ierr;
     26:   SNESMonitor_SAWs *mon;

     29:   PetscNewLog(snes,&mon);
     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:   return(0);
     34: }

     36: /*@C
     37:    SNESMonitorSAWsDestroy - destroy a monitor context created with SNESMonitorSAWsCreate()

     39:    Collective

     41:    Input Arguments:
     42: .  ctx - monitor context

     44:    Level: developer

     46: .seealso: SNESMonitorSAWsCreate()
     47: @*/
     48: PetscErrorCode SNESMonitorSAWsDestroy(void **ctx)
     49: {
     50:   PetscErrorCode  ierr;

     53:   PetscFree(*ctx);
     54:   return(0);
     55: }

     57: /*@C
     58:    SNESMonitorSAWs - monitor solution using SAWs

     60:    Logically Collective on SNES

     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

     68:    Level: advanced

     70: .seealso: PetscViewerSAWsOpen()
     71: @*/
     72: PetscErrorCode SNESMonitorSAWs(SNES snes,PetscInt n,PetscReal rnorm,void *ctx)
     73: {
     74:   PetscErrorCode   ierr;
     75:   PetscMPIInt      rank;

     80:   MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
     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:     PetscSAWsBlock();
     85:   }
     86:   return(0);
     87: }