Actual source code: kspams.c

petsc-3.4.0 2013-05-13
  1: #include <petsc-private/kspimpl.h>  /*I "petscksp.h" I*/
  2: #if defined(PETSC_HAVE_AMS)
  3: #include <petscviewerams.h>

  5: typedef struct {
  6:   PetscViewer viewer;
  7:   PetscInt    neigs;
  8:   PetscReal   *eigi;
  9:   PetscReal   *eigr;
 10:   AMS_Memory amem;
 11: } KSPMonitor_AMS;

 15: /*@C
 16:    KSPMonitorAMSCreate - create an AMS monitor context

 18:    Collective

 20:    Input Arguments:
 21: +  ksp - KSP to monitor
 22: -  amscommname - name of AMS communicator to use, if NULL uses default "PETSc" communicator

 24:    Output Arguments:
 25: .  ctx - context for monitor

 27:    Level: developer

 29: .seealso: KSPMonitorAMS(), KSPMonitorAMSDestroy()
 30: @*/
 31: PetscErrorCode KSPMonitorAMSCreate(KSP ksp,const char *amscommname,void **ctx)
 32: {
 34:   KSPMonitor_AMS *mon;

 37:   PetscNewLog(ksp,KSPMonitor_AMS,&mon);
 38:   if (!amscommname) {
 39:     mon->viewer = PETSC_VIEWER_AMS_(PetscObjectComm((PetscObject)ksp));
 40:     if (!mon->viewer) SETERRQ(PetscObjectComm((PetscObject)ksp),PETSC_ERR_PLIB,"Cannot create AMS default communicator");
 41:   } else {
 42:     PetscViewerAMSOpen(PetscObjectComm((PetscObject)ksp),amscommname,&mon->viewer);
 43:   }
 44:   mon->amem = -1;
 45:   *ctx = (void*)mon;
 46:   return(0);
 47: }

 51: /*@C
 52:    KSPMonitorAMSDestroy - destroy a monitor context created with KSPMonitorAMSCreate()

 54:    Collective

 56:    Input Arguments:
 57: .  ctx - monitor context

 59:    Level: developer

 61: .seealso: KSPMonitorAMSCreate()
 62: @*/
 63: PetscErrorCode KSPMonitorAMSDestroy(void **ctx)
 64: {
 65:   KSPMonitor_AMS *mon = (KSPMonitor_AMS*)*ctx;

 69:   if (mon->amem != -1) {
 70:     PetscStackCallAMS(AMS_Memory_destroy,(mon->amem));
 71:     mon->amem = -1;
 72:   }
 73:   PetscViewerDestroy(&mon->viewer);
 74:   PetscFree(mon->eigr);
 75:   mon->eigi = NULL;
 76:   PetscFree(*ctx);
 77:   return(0);
 78: }

 82: /*@C
 83:    KSPMonitorAMS - monitor solution using AMS

 85:    Logically Collective on KSP

 87:    Input Parameters:
 88: +  ksp   - iterative context
 89: .  n     - iteration number
 90: .  rnorm - 2-norm (preconditioned) residual value (may be estimated).
 91: -  ctx -  PetscViewer of type AMS

 93:    Level: advanced

 95: .keywords: KSP, CG, monitor, AMS, singular values

 97: .seealso: KSPMonitorSingularValue(), KSPComputeExtremeSingularValues(), PetscViewerAMSOpen()
 98: @*/
 99: PetscErrorCode KSPMonitorAMS(KSP ksp,PetscInt n,PetscReal rnorm,void *ctx)
100: {
102:   KSPMonitor_AMS *mon   = (KSPMonitor_AMS*)ctx;
103:   PetscViewer    viewer = mon->viewer;
104:   PetscReal      emax,emin;;
105:   AMS_Comm       acomm;

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

112:   /* UnPublish  */
113:   if (mon->amem != -1) PetscStackCallAMS(AMS_Memory_destroy,(mon->amem));
114:   mon->amem = -1;

116:   PetscFree(mon->eigr);
117:   PetscMalloc(2*n*sizeof(PetscReal),&mon->eigr);
118:   mon->eigi = mon->eigr + n;
119:   if (n) {KSPComputeEigenvalues(ksp,n,mon->eigr,mon->eigi,&mon->neigs);}

121:   PetscViewerAMSGetAMSComm(viewer,&acomm);
122:   PetscStackCallAMS(AMS_Memory_create,(acomm,"ksp_monitor_ams",&mon->amem));
123:   PetscStackCallAMS(AMS_Memory_take_access,(mon->amem));

125:   PetscStackCallAMS(AMS_Memory_add_field,(mon->amem,"rnorm",&ksp->rnorm,1,AMS_DOUBLE,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF));
126:   PetscStackCallAMS(AMS_Memory_add_field,(mon->amem,"neigs",&mon->neigs,1,AMS_INT,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF));
127:   if (mon->neigs > 0) {
128:     PetscStackCallAMS(AMS_Memory_add_field,(mon->amem,"eigr",&mon->eigr,mon->neigs,AMS_DOUBLE,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF));
129:     PetscStackCallAMS(AMS_Memory_add_field,(mon->amem,"eigi",&mon->eigr,mon->neigs,AMS_DOUBLE,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF));
130:   }
131:   PetscStackCallAMS(AMS_Memory_publish,(mon->amem));
132:   PetscStackCallAMS(AMS_Memory_grant_access,(mon->amem));

134:   PetscInfo2(ksp,"KSP extreme singular values min=%G max=%G\n",emin,emax);
135:   return(0);
136: }
137: #endif