Actual source code: kspsaws.c

petsc-master 2019-08-22
Report Typos and Errors
  1:  #include <petsc/private/kspimpl.h>
  2:  #include <petscviewersaws.h>

  4: typedef struct {
  5:   PetscViewer    viewer;
  6:   PetscInt       neigs;
  7:   PetscReal      *eigi;
  8:   PetscReal      *eigr;
  9: } KSPMonitor_SAWs;

 11: /*@C
 12:    KSPMonitorSAWsCreate - create an SAWs monitor context

 14:    Collective

 16:    Input Arguments:
 17: .  ksp - KSP to monitor

 19:    Output Arguments:
 20: .  ctx - context for monitor

 22:    Level: developer

 24: .seealso: KSPMonitorSAWs(), KSPMonitorSAWsDestroy()
 25: @*/
 26: PetscErrorCode KSPMonitorSAWsCreate(KSP ksp,void **ctx)
 27: {
 28:   PetscErrorCode  ierr;
 29:   KSPMonitor_SAWs *mon;

 32:   PetscNewLog(ksp,&mon);
 33:   mon->viewer = PETSC_VIEWER_SAWS_(PetscObjectComm((PetscObject)ksp));
 34:   if (!mon->viewer) SETERRQ(PetscObjectComm((PetscObject)ksp),PETSC_ERR_PLIB,"Cannot create SAWs default viewer");
 35:   *ctx = (void*)mon;
 36:   return(0);
 37: }

 39: /*@C
 40:    KSPMonitorSAWsDestroy - destroy a monitor context created with KSPMonitorSAWsCreate()

 42:    Collective

 44:    Input Arguments:
 45: .  ctx - monitor context

 47:    Level: developer

 49: .seealso: KSPMonitorSAWsCreate()
 50: @*/
 51: PetscErrorCode KSPMonitorSAWsDestroy(void **ctx)
 52: {
 53:   KSPMonitor_SAWs *mon = (KSPMonitor_SAWs*)*ctx;
 54:   PetscErrorCode  ierr;

 57:   PetscFree2(mon->eigr,mon->eigi);
 58:   PetscFree(*ctx);
 59:   return(0);
 60: }

 62: /*@C
 63:    KSPMonitorSAWs - monitor solution using SAWs

 65:    Logically Collective on ksp

 67:    Input Parameters:
 68: +  ksp   - iterative context
 69: .  n     - iteration number
 70: .  rnorm - 2-norm (preconditioned) residual value (may be estimated).
 71: -  ctx -  PetscViewer of type SAWs

 73:    Level: advanced

 75: .seealso: KSPMonitorSingularValue(), KSPComputeExtremeSingularValues(), PetscViewerSAWsOpen()
 76: @*/
 77: PetscErrorCode KSPMonitorSAWs(KSP ksp,PetscInt n,PetscReal rnorm,void *ctx)
 78: {
 79:   PetscErrorCode  ierr;
 80:   KSPMonitor_SAWs *mon   = (KSPMonitor_SAWs*)ctx;
 81:   PetscReal       emax,emin;
 82:   PetscMPIInt     rank;

 86:   KSPComputeExtremeSingularValues(ksp,&emax,&emin);

 88:   PetscFree2(mon->eigr,mon->eigi);
 89:   PetscMalloc2(n,&mon->eigr,n,&mon->eigi);
 90:   if (n) {
 91:     KSPComputeEigenvalues(ksp,n,mon->eigr,mon->eigi,&mon->neigs);

 93:     MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
 94:     if (!rank) {
 95:       SAWs_Delete("/PETSc/ksp_monitor_saws/eigr");
 96:       SAWs_Delete("/PETSc/ksp_monitor_saws/eigi");

 98:       PetscStackCallSAWs(SAWs_Register,("/PETSc/ksp_monitor_saws/rnorm",&ksp->rnorm,1,SAWs_READ,SAWs_DOUBLE));
 99:       PetscStackCallSAWs(SAWs_Register,("/PETSc/ksp_monitor_saws/neigs",&mon->neigs,1,SAWs_READ,SAWs_INT));
100:       if (mon->neigs > 0) {
101:         PetscStackCallSAWs(SAWs_Register,("/PETSc/ksp_monitor_saws/eigr",mon->eigr,mon->neigs,SAWs_READ,SAWs_DOUBLE));
102:         PetscStackCallSAWs(SAWs_Register,("/PETSc/ksp_monitor_saws/eigi",mon->eigi,mon->neigs,SAWs_READ,SAWs_DOUBLE));
103:       }
104:       PetscInfo2(ksp,"KSP extreme singular values min=%g max=%g\n",(double)emin,(double)emax);
105:       PetscSAWsBlock();
106:     }
107:   }
108:   return(0);
109: }