Actual source code: kspsaws.c
petsc-3.15.0 2021-04-05
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 Arguments:
17: . ksp - KSP to monitor
19: Output Arguments:
20: . ctx - context for monitor
22: Level: developer
24: .seealso: KSPMonitorSAWs(), KSPMonitorSAWsDestroy()
25: @*/
26: PetscErrorCode KSPMonitorSAWsCreate(KSP ksp,void **ctx)
27: {
28: PetscErrorCode ierr;
29: KSPMonitor_SAWs *mon;
32: PetscNewLog(ksp,&mon);
33: mon->viewer = PETSC_VIEWER_SAWS_(PetscObjectComm((PetscObject)ksp));
34: if (!mon->viewer) SETERRQ(PetscObjectComm((PetscObject)ksp),PETSC_ERR_PLIB,"Cannot create SAWs default viewer");
35: *ctx = (void*)mon;
36: return(0);
37: }
39: /*@C
40: KSPMonitorSAWsDestroy - destroy a monitor context created with KSPMonitorSAWsCreate()
42: Collective
44: Input Arguments:
45: . ctx - monitor context
47: Level: developer
49: .seealso: KSPMonitorSAWsCreate()
50: @*/
51: PetscErrorCode KSPMonitorSAWsDestroy(void **ctx)
52: {
53: KSPMonitor_SAWs *mon = (KSPMonitor_SAWs*)*ctx;
54: PetscErrorCode ierr;
57: PetscFree2(mon->eigr,mon->eigi);
58: PetscFree(*ctx);
59: return(0);
60: }
62: /*@C
63: KSPMonitorSAWs - monitor solution using SAWs
65: Logically Collective on ksp
67: Input Parameters:
68: + ksp - iterative context
69: . n - iteration number
70: . rnorm - 2-norm (preconditioned) residual value (may be estimated).
71: - ctx - PetscViewer of type SAWs
73: Level: advanced
75: .seealso: KSPMonitorSingularValue(), KSPComputeExtremeSingularValues(), PetscViewerSAWsOpen()
76: @*/
77: PetscErrorCode KSPMonitorSAWs(KSP ksp,PetscInt n,PetscReal rnorm,void *ctx)
78: {
79: PetscErrorCode ierr;
80: KSPMonitor_SAWs *mon = (KSPMonitor_SAWs*)ctx;
81: PetscReal emax,emin;
82: PetscMPIInt rank;
86: KSPComputeExtremeSingularValues(ksp,&emax,&emin);
88: PetscFree2(mon->eigr,mon->eigi);
89: PetscMalloc2(n,&mon->eigr,n,&mon->eigi);
90: if (n) {
91: KSPComputeEigenvalues(ksp,n,mon->eigr,mon->eigi,&mon->neigs);
93: MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
94: if (!rank) {
95: SAWs_Delete("/PETSc/ksp_monitor_saws/eigr");
96: SAWs_Delete("/PETSc/ksp_monitor_saws/eigi");
98: PetscStackCallSAWs(SAWs_Register,("/PETSc/ksp_monitor_saws/rnorm",&ksp->rnorm,1,SAWs_READ,SAWs_DOUBLE));
99: PetscStackCallSAWs(SAWs_Register,("/PETSc/ksp_monitor_saws/neigs",&mon->neigs,1,SAWs_READ,SAWs_INT));
100: if (mon->neigs > 0) {
101: PetscStackCallSAWs(SAWs_Register,("/PETSc/ksp_monitor_saws/eigr",mon->eigr,mon->neigs,SAWs_READ,SAWs_DOUBLE));
102: PetscStackCallSAWs(SAWs_Register,("/PETSc/ksp_monitor_saws/eigi",mon->eigi,mon->neigs,SAWs_READ,SAWs_DOUBLE));
103: }
104: PetscInfo2(ksp,"KSP extreme singular values min=%g max=%g\n",(double)emin,(double)emax);
105: PetscSAWsBlock();
106: }
107: }
108: return(0);
109: }