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