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: }