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 for `KSP`
14: Collective
16: Input Parameter:
17: . ksp - `KSP` to monitor
19: Output Parameter:
20: . ctx - context for monitor
22: Level: developer
24: .seealso: [](chapter_ksp), `KSP`, `KSPMonitorSet()`, `KSPMonitorSAWs()`, `KSPMonitorSAWsDestroy()`
25: @*/
26: PetscErrorCode KSPMonitorSAWsCreate(KSP ksp, void **ctx)
27: {
28: KSPMonitor_SAWs *mon;
30: PetscNew(&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: [](chapter_ksp), `KSP`, `KSPMonitorSet()`, `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 `KSP` solution using SAWs
61: Logically Collective
63: Input Parameters:
64: + ksp - iterative context
65: . n - iteration number
66: . rnorm - 2-norm (preconditioned) residual value (may be estimated).
67: - ctx - created with `KSPMonitorSAWsCreate()`
69: Level: advanced
71: Note:
72: Create the ctx with `KSPMonitorSAWsCreate()` then call `KSPMonitorSet()` with the context, this function, and `KSPMonitorSAWsDestroy()`
74: .seealso: [](chapter_ksp), `KSP`, `KSPMonitorSet()`, `KSPMonitorSAWsCreate()`, `KSPMonitorSAWsDestroy()`, `KSPMonitorSingularValue()`, `KSPComputeExtremeSingularValues()`, `PetscViewerSAWsOpen()`
75: @*/
76: PetscErrorCode KSPMonitorSAWs(KSP ksp, PetscInt n, PetscReal rnorm, void *ctx)
77: {
78: KSPMonitor_SAWs *mon = (KSPMonitor_SAWs *)ctx;
79: PetscReal emax, emin;
80: PetscMPIInt rank;
83: KSPComputeExtremeSingularValues(ksp, &emax, &emin);
85: PetscFree2(mon->eigr, mon->eigi);
86: PetscMalloc2(n, &mon->eigr, n, &mon->eigi);
87: if (n) {
88: KSPComputeEigenvalues(ksp, n, mon->eigr, mon->eigi, &mon->neigs);
90: MPI_Comm_rank(PETSC_COMM_WORLD, &rank);
91: if (rank == 0) {
92: SAWs_Delete("/PETSc/ksp_monitor_saws/eigr");
93: SAWs_Delete("/PETSc/ksp_monitor_saws/eigi");
95: SAWs_Register, ("/PETSc/ksp_monitor_saws/rnorm", &ksp->rnorm, 1, SAWs_READ, SAWs_DOUBLE);
96: SAWs_Register, ("/PETSc/ksp_monitor_saws/neigs", &mon->neigs, 1, SAWs_READ, SAWs_INT);
97: if (mon->neigs > 0) {
98: SAWs_Register, ("/PETSc/ksp_monitor_saws/eigr", mon->eigr, mon->neigs, SAWs_READ, SAWs_DOUBLE);
99: SAWs_Register, ("/PETSc/ksp_monitor_saws/eigi", mon->eigi, mon->neigs, SAWs_READ, SAWs_DOUBLE);
100: }
101: PetscInfo(ksp, "KSP extreme singular values min=%g max=%g\n", (double)emin, (double)emax);
102: PetscSAWsBlock();
103: }
104: }
105: return 0;
106: }