Actual source code: kspsaws.c

      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 Parameter:
     17: .  ksp - KSP to monitor

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

     22:    Level: developer

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

     30:   PetscNewLog(ksp,&mon);
     31:   mon->viewer = PETSC_VIEWER_SAWS_(PetscObjectComm((PetscObject)ksp));
     33:   *ctx = (void*)mon;
     34:   return 0;
     35: }

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

     40:    Collective

     42:    Input Parameter:
     43: .  ctx - monitor context

     45:    Level: developer

     47: .seealso: KSPMonitorSAWsCreate()
     48: @*/
     49: PetscErrorCode KSPMonitorSAWsDestroy(void **ctx)
     50: {
     51:   KSPMonitor_SAWs *mon = (KSPMonitor_SAWs*)*ctx;

     53:   PetscFree2(mon->eigr,mon->eigi);
     54:   PetscFree(*ctx);
     55:   return 0;
     56: }

     58: /*@C
     59:    KSPMonitorSAWs - monitor solution using SAWs

     61:    Logically Collective on ksp

     63:    Input Parameters:
     64: +  ksp   - iterative context
     65: .  n     - iteration number
     66: .  rnorm - 2-norm (preconditioned) residual value (may be estimated).
     67: -  ctx -  PetscViewer of type SAWs

     69:    Level: advanced

     71: .seealso: KSPMonitorSingularValue(), KSPComputeExtremeSingularValues(), PetscViewerSAWsOpen()
     72: @*/
     73: PetscErrorCode KSPMonitorSAWs(KSP ksp,PetscInt n,PetscReal rnorm,void *ctx)
     74: {
     75:   KSPMonitor_SAWs *mon   = (KSPMonitor_SAWs*)ctx;
     76:   PetscReal       emax,emin;
     77:   PetscMPIInt     rank;

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

     82:   PetscFree2(mon->eigr,mon->eigi);
     83:   PetscMalloc2(n,&mon->eigr,n,&mon->eigi);
     84:   if (n) {
     85:     KSPComputeEigenvalues(ksp,n,mon->eigr,mon->eigi,&mon->neigs);

     87:     MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
     88:     if (rank == 0) {
     89:       SAWs_Delete("/PETSc/ksp_monitor_saws/eigr");
     90:       SAWs_Delete("/PETSc/ksp_monitor_saws/eigi");

     92:       PetscStackCallSAWs(SAWs_Register,("/PETSc/ksp_monitor_saws/rnorm",&ksp->rnorm,1,SAWs_READ,SAWs_DOUBLE));
     93:       PetscStackCallSAWs(SAWs_Register,("/PETSc/ksp_monitor_saws/neigs",&mon->neigs,1,SAWs_READ,SAWs_INT));
     94:       if (mon->neigs > 0) {
     95:         PetscStackCallSAWs(SAWs_Register,("/PETSc/ksp_monitor_saws/eigr",mon->eigr,mon->neigs,SAWs_READ,SAWs_DOUBLE));
     96:         PetscStackCallSAWs(SAWs_Register,("/PETSc/ksp_monitor_saws/eigi",mon->eigi,mon->neigs,SAWs_READ,SAWs_DOUBLE));
     97:       }
     98:       PetscInfo(ksp,"KSP extreme singular values min=%g max=%g\n",(double)emin,(double)emax);
     99:       PetscSAWsBlock();
    100:     }
    101:   }
    102:   return 0;
    103: }