GCC Code Coverage Report


Directory: ./
File: src/eps/impls/power/power.c
Date: 2026-02-22 03:58:10
Exec Total Coverage
Lines: 634 681 93.1%
Functions: 37 40 92.5%
Branches: 1747 3314 52.7%

Line Branch Exec Source
1 /*
2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3 SLEPc - Scalable Library for Eigenvalue Problem Computations
4 Copyright (c) 2002-, Universitat Politecnica de Valencia, Spain
5
6 This file is part of SLEPc.
7 SLEPc is distributed under a 2-clause BSD license (see LICENSE).
8 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
9 */
10 /*
11 SLEPc eigensolver: "power"
12
13 Method: Power Iteration
14
15 Algorithm:
16
17 This solver implements the power iteration for finding dominant
18 eigenpairs. It also includes the following well-known methods:
19 - Inverse Iteration: when used in combination with shift-and-invert
20 spectral transformation.
21 - Rayleigh Quotient Iteration (RQI): also with shift-and-invert plus
22 a variable shift.
23
24 It can also be used for nonlinear inverse iteration on the problem
25 A(x)*x=lambda*B(x)*x, where A and B are not constant but depend on x.
26
27 References:
28
29 [1] "Single Vector Iteration Methods in SLEPc", SLEPc Technical Report
30 STR-2, available at https://slepc.upv.es.
31 */
32
33 #include <slepc/private/epsimpl.h> /*I "slepceps.h" I*/
34 #include <slepcblaslapack.h>
35 /* PETSc headers */
36 #include <petscdm.h>
37 #include <petscsnes.h>
38
39 static PetscErrorCode EPSPowerFormFunction_Update(SNES,Vec,Vec,void*);
40 static PetscErrorCode EPSSolve_Power(EPS);
41 static PetscErrorCode EPSSolve_TS_Power(EPS);
42
43 typedef struct {
44 EPSPowerShiftType shift_type;
45 PetscBool nonlinear;
46 PetscBool update;
47 PetscBool sign_normalization;
48 SNES snes;
49 PetscErrorCode (*formFunctionB)(SNES,Vec,Vec,void*);
50 void *formFunctionBctx;
51 PetscErrorCode (*formFunctionA)(SNES,Vec,Vec,void*);
52 void *formFunctionActx;
53 PetscErrorCode (*formFunctionAB)(SNES,Vec,Vec,Vec,void*);
54 PetscErrorCode (*formNorm)(SNES,Vec,PetscReal*,void*);
55 void *formNormCtx;
56 PetscInt idx; /* index of the first nonzero entry in the iteration vector */
57 PetscMPIInt p; /* process id of the owner of idx */
58 PetscReal norm0; /* norm of initial vector */
59 } EPS_POWER;
60
61 744 static PetscErrorCode SNESMonitor_PowerUpdate(SNES snes,PetscInt its,PetscReal fnorm,void *ctx)
62 {
63 744 EPS eps;
64
65
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
744 PetscFunctionBegin;
66
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
744 PetscCall(PetscObjectQuery((PetscObject)snes,"eps",(PetscObject *)&eps));
67
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
744 PetscCheck(eps,PetscObjectComm((PetscObject)snes),PETSC_ERR_ARG_NULL,"No composed EPS");
68 /* Call EPS monitor on each SNES iteration */
69
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
744 PetscCall(EPSMonitor(eps,its,eps->nconv,eps->eigr,eps->eigi,eps->errest,PetscMin(eps->nconv+1,eps->nev)));
70
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
186 PetscFunctionReturn(PETSC_SUCCESS);
71 }
72
73 406 static PetscErrorCode EPSSetUp_Power(EPS eps)
74 {
75 406 EPS_POWER *power = (EPS_POWER*)eps->data;
76 406 STMatMode mode;
77 406 Mat A,B,P;
78 406 Vec res;
79 406 PetscContainer container;
80 406 PetscErrorCode (*formFunctionA)(SNES,Vec,Vec,void*);
81 406 PetscErrorCode (*formJacobianA)(SNES,Vec,Mat,Mat,void*);
82 406 PetscErrorCode (*formNorm)(SNES,Vec,PetscReal*,void*);
83 406 void *ctx;
84
85
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
406 PetscFunctionBegin;
86
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
406 EPSCheckNotStructured(eps);
87
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
406 if (eps->nev==0) eps->nev = 1;
88
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
406 if (eps->ncv!=PETSC_DETERMINE) {
89
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
40 PetscCheck(eps->ncv>=eps->nev,PetscObjectComm((PetscObject)eps),PETSC_ERR_USER_INPUT,"The value of ncv must be at least nev");
90 366 } else eps->ncv = eps->nev;
91
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
406 if (eps->mpd!=PETSC_DETERMINE) PetscCall(PetscInfo(eps,"Warning: parameter mpd ignored\n"));
92
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
406 if (eps->max_it==PETSC_DETERMINE) {
93 /* SNES will directly return the solution for us, and we need to do only one iteration */
94
4/4
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
246 if (power->nonlinear && power->update) eps->max_it = 1;
95 142 else eps->max_it = PetscMax(1000*eps->nev,100*eps->n);
96 }
97
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
406 if (!eps->which) PetscCall(EPSSetWhichEigenpairs_Default(eps));
98
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
406 PetscCheck(eps->which==EPS_LARGEST_MAGNITUDE || eps->which==EPS_TARGET_MAGNITUDE,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"This solver supports only largest magnitude or target magnitude eigenvalues");
99
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
406 if (power->shift_type != EPS_POWER_SHIFT_CONSTANT) {
100
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
40 PetscCheck(!power->nonlinear,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Variable shifts not allowed in nonlinear problems");
101
6/10
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
40 EPSCheckSinvertCayleyCondition(eps,PETSC_TRUE," (with variable shifts)");
102
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
40 PetscCall(STGetMatMode(eps->st,&mode));
103
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
40 PetscCheck(mode!=ST_MATMODE_INPLACE,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"ST matrix mode inplace does not work with variable shifts");
104 }
105
10/26
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 8 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 6 times.
✓ Branch 10 taken 2 times.
✓ Branch 11 taken 6 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 8 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 8 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
406 EPSCheckUnsupported(eps,EPS_FEATURE_BALANCE | EPS_FEATURE_ARBITRARY | EPS_FEATURE_REGION | EPS_FEATURE_CONVERGENCE | EPS_FEATURE_THRESHOLD);
106
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
406 EPSCheckIgnored(eps,EPS_FEATURE_EXTRACTION);
107
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
406 PetscCall(EPSAllocateSolution(eps,0));
108
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
406 PetscCall(EPS_SetInnerProduct(eps));
109
110
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
406 if (power->nonlinear) {
111
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
264 PetscCheck(eps->nev==1,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Nonlinear inverse iteration cannot compute more than one eigenvalue");
112
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
264 PetscCall(EPSSetWorkVecs(eps,3));
113
3/6
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
264 PetscCheck(!power->update || eps->max_it==1,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"More than one iteration is not allowed for Newton eigensolver (SNES)");
114
115 /* Set up SNES solver */
116 /* If SNES was setup, we need to reset it so that it will be consistent with the current EPS */
117
5/8
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
264 if (power->snes) PetscCall(SNESReset(power->snes));
118 else PetscCall(EPSPowerGetSNES(eps,&power->snes));
119
120 /* For nonlinear solver (Newton), we should scale the initial vector back.
121 The initial vector will be scaled in EPSSetUp. */
122
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
264 if (eps->IS) PetscCall(VecNorm(eps->IS[0],NORM_2,&power->norm0));
123
124
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
264 PetscCall(EPSGetOperators(eps,&A,&B));
125
126 /* form function */
127
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
264 PetscCall(PetscObjectQueryFunction((PetscObject)A,"formFunction",&formFunctionA));
128
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
264 PetscCheck(formFunctionA,PetscObjectComm((PetscObject)eps),PETSC_ERR_USER,"For nonlinear inverse iteration you must compose a callback function 'formFunction' in matrix A");
129
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
264 PetscCall(PetscObjectQuery((PetscObject)A,"formFunctionCtx",(PetscObject*)&container));
130
5/8
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
264 if (container) PetscCall(PetscContainerGetPointer(container,&ctx));
131 else ctx = NULL;
132
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
264 PetscCall(MatCreateVecs(A,&res,NULL));
133 264 power->formFunctionA = formFunctionA;
134 264 power->formFunctionActx = ctx;
135
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
264 if (power->update) {
136
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
120 PetscCall(SNESSetFunction(power->snes,res,EPSPowerFormFunction_Update,ctx));
137
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
120 PetscCall(PetscObjectQueryFunction((PetscObject)A,"formFunctionAB",&power->formFunctionAB));
138
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
120 PetscCall(SNESMonitorSet(power->snes,SNESMonitor_PowerUpdate,NULL,NULL));
139 }
140
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
144 else PetscCall(SNESSetFunction(power->snes,res,formFunctionA,ctx));
141
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
264 PetscCall(VecDestroy(&res));
142
143 /* form Jacobian */
144
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
264 PetscCall(PetscObjectQueryFunction((PetscObject)A,"formJacobian",&formJacobianA));
145
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
264 PetscCheck(formJacobianA,PetscObjectComm((PetscObject)eps),PETSC_ERR_USER,"For nonlinear inverse iteration you must compose a callback function 'formJacobian' in matrix A");
146
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
264 PetscCall(PetscObjectQuery((PetscObject)A,"formJacobianCtx",(PetscObject*)&container));
147
5/8
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
264 if (container) PetscCall(PetscContainerGetPointer(container,&ctx));
148 else ctx = NULL;
149 /* This allows users to compute a different preconditioning matrix than A.
150 * It is useful when A and B are shell matrices.
151 */
152
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
264 PetscCall(STGetPreconditionerMat(eps->st,&P));
153 /* If users do not provide a matrix, we simply use A */
154
7/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
264 PetscCall(SNESSetJacobian(power->snes,A,P? P:A,formJacobianA,ctx));
155
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
264 PetscCall(SNESSetFromOptions(power->snes));
156
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
264 PetscCall(SNESSetUp(power->snes));
157
158 264 ctx = NULL;
159 264 formNorm = NULL;
160
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
264 if (B) {
161
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
264 PetscCall(PetscObjectQueryFunction((PetscObject)B,"formFunction",&power->formFunctionB));
162
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
264 PetscCall(PetscObjectQuery((PetscObject)B,"formFunctionCtx",(PetscObject*)&container));
163
6/10
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 6 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
264 if (power->formFunctionB && container) PetscCall(PetscContainerGetPointer(container,&power->formFunctionBctx));
164 else power->formFunctionBctx = NULL;
165
166 /* form norm */
167
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
264 PetscCall(PetscObjectQueryFunction((PetscObject)B,"formNorm",&formNorm));
168
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
264 if (formNorm) {
169
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
72 PetscCall(PetscObjectQuery((PetscObject)B,"formNormCtx",(PetscObject*)&container));
170
5/8
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
72 if (container) PetscCall(PetscContainerGetPointer(container,&ctx));
171 }
172 }
173 264 power->formNorm = formNorm;
174 264 power->formNormCtx = ctx;
175 } else {
176
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
142 if (eps->twosided) PetscCall(EPSSetWorkVecs(eps,3));
177
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
110 else PetscCall(EPSSetWorkVecs(eps,2));
178
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
142 PetscCall(DSSetType(eps->ds,DSNHEP));
179
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
142 PetscCall(DSAllocate(eps->ds,eps->nev));
180 }
181 /* dispatch solve method */
182
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
406 if (eps->twosided) {
183
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
32 PetscCheck(!power->nonlinear,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Nonlinear inverse iteration does not have two-sided variant");
184
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
32 PetscCheck(power->shift_type!=EPS_POWER_SHIFT_WILKINSON,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Two-sided variant does not support Wilkinson shifts");
185 32 eps->ops->solve = EPSSolve_TS_Power;
186 374 } else eps->ops->solve = EPSSolve_Power;
187
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
102 PetscFunctionReturn(PETSC_SUCCESS);
188 }
189
190 /*
191 Find the index of the first nonzero entry of x, and the process that owns it.
192 */
193 264 static PetscErrorCode FirstNonzeroIdx(Vec x,PetscInt *idx,PetscMPIInt *p)
194 {
195 264 PetscInt i,first,last,N;
196 264 PetscLayout map;
197 264 const PetscScalar *xx;
198
199
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
264 PetscFunctionBegin;
200
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
264 PetscCall(VecGetSize(x,&N));
201
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
264 PetscCall(VecGetOwnershipRange(x,&first,&last));
202
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
264 PetscCall(VecGetArrayRead(x,&xx));
203
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
2904 for (i=first;i<last;i++) {
204
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
2904 if (PetscAbsScalar(xx[i-first])>10*PETSC_MACHINE_EPSILON) break;
205 }
206
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
264 PetscCall(VecRestoreArrayRead(x,&xx));
207
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
264 if (i==last) i=N;
208
28/58
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
264 PetscCallMPI(MPIU_Allreduce(&i,idx,1,MPIU_INT,MPI_MIN,PetscObjectComm((PetscObject)x)));
209
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
264 PetscCheck(*idx!=N,PetscObjectComm((PetscObject)x),PETSC_ERR_PLIB,"Zero vector found");
210
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
264 PetscCall(VecGetLayout(x,&map));
211
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
264 PetscCall(PetscLayoutFindOwner(map,*idx,p));
212
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
66 PetscFunctionReturn(PETSC_SUCCESS);
213 }
214
215 /*
216 Normalize a vector x with respect to a given norm as well as, optionally, the
217 sign of the first nonzero entry (assumed to be idx in process p).
218 */
219 217711 static PetscErrorCode Normalize(Vec x,PetscReal norm,PetscInt idx,PetscMPIInt p,PetscBool sign_normalization,PetscScalar *sign)
220 {
221 217711 PetscScalar alpha=1.0;
222 217711 PetscInt first,last;
223 217711 PetscReal absv;
224 217711 const PetscScalar *xx;
225
226
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
217711 PetscFunctionBegin;
227
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
217711 if (sign_normalization) {
228
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
215735 PetscCall(VecGetOwnershipRange(x,&first,&last));
229
2/4
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
215735 if (idx>=first && idx<last) {
230
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
215735 PetscCall(VecGetArrayRead(x,&xx));
231 215735 absv = PetscAbsScalar(xx[idx-first]);
232
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
215735 if (absv>10*PETSC_MACHINE_EPSILON) alpha = xx[idx-first]/absv;
233
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
215735 PetscCall(VecRestoreArrayRead(x,&xx));
234 }
235
15/30
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 6 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
431470 PetscCallMPI(MPI_Bcast(&alpha,1,MPIU_SCALAR,p,PetscObjectComm((PetscObject)x)));
236 }
237
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
217711 if (sign) *sign = alpha;
238 217711 alpha *= norm;
239
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
217711 PetscCall(VecScale(x,1.0/alpha));
240
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
54501 PetscFunctionReturn(PETSC_SUCCESS);
241 }
242
243 4376 static PetscErrorCode EPSPowerUpdateFunctionB(EPS eps,Vec x,Vec Bx)
244 {
245 4376 EPS_POWER *power = (EPS_POWER*)eps->data;
246 4376 Mat B;
247
248
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
4376 PetscFunctionBegin;
249
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
4376 PetscCall(STResetMatrixState(eps->st));
250
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
4376 PetscCall(EPSGetOperators(eps,NULL,&B));
251
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
4376 if (B) {
252
5/8
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
4376 if (power->formFunctionB) PetscCall((*power->formFunctionB)(power->snes,x,Bx,power->formFunctionBctx));
253 else PetscCall(MatMult(B,x,Bx));
254 } else PetscCall(VecCopy(x,Bx));
255
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
1094 PetscFunctionReturn(PETSC_SUCCESS);
256 }
257
258 2668 static PetscErrorCode EPSPowerUpdateFunctionA(EPS eps,Vec x,Vec Ax)
259 {
260 2668 EPS_POWER *power = (EPS_POWER*)eps->data;
261 2668 Mat A;
262
263
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2668 PetscFunctionBegin;
264
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2668 PetscCall(STResetMatrixState(eps->st));
265
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2668 PetscCall(EPSGetOperators(eps,&A,NULL));
266
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2668 PetscCheck(A,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_NULL,"Matrix A is required for an eigenvalue problem");
267
5/8
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
2668 if (power->formFunctionA) PetscCall((*power->formFunctionA)(power->snes,x,Ax,power->formFunctionActx));
268 else PetscCall(MatMult(A,x,Ax));
269
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
667 PetscFunctionReturn(PETSC_SUCCESS);
270 }
271
272 4504 static PetscErrorCode EPSPowerFormFunction_Update(SNES snes,Vec x,Vec y,void *ctx)
273 {
274 4504 EPS eps;
275 4504 PetscReal bx;
276 4504 Vec Bx;
277 4504 PetscScalar sign;
278 4504 EPS_POWER *power;
279
280
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
4504 PetscFunctionBegin;
281
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
4504 PetscCall(PetscObjectQuery((PetscObject)snes,"eps",(PetscObject *)&eps));
282
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
4504 PetscCheck(eps,PetscObjectComm((PetscObject)snes),PETSC_ERR_ARG_NULL,"No composed EPS");
283
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
4504 PetscCall(STResetMatrixState(eps->st));
284 4504 power = (EPS_POWER*)eps->data;
285 4504 Bx = eps->work[2];
286
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
4504 if (power->formFunctionAB) PetscCall((*power->formFunctionAB)(snes,x,y,Bx,ctx));
287 else {
288
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2668 PetscCall(EPSPowerUpdateFunctionA(eps,x,y));
289
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2668 PetscCall(EPSPowerUpdateFunctionB(eps,x,Bx));
290 }
291
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
4504 if (power->formNorm) PetscCall((*power->formNorm)(snes,Bx,&bx,power->formNormCtx));
292
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3136 else PetscCall(VecNorm(Bx,NORM_2,&bx));
293
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
4504 PetscCall(Normalize(Bx,bx,power->idx,power->p,power->sign_normalization,&sign));
294
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
4504 PetscCall(VecAXPY(y,-1.0,Bx));
295 /* Keep tracking eigenvalue update. It would be useful when we want to monitor solver progress via snes monitor. */
296
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
4504 eps->eigr[(eps->nconv < eps->nev)? eps->nconv:(eps->nconv-1)] = 1.0/((PetscScalar)bx*sign);
297
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
4504 PetscFunctionReturn(PETSC_SUCCESS);
298 }
299
300 /*
301 Use SNES to compute y = A^{-1}*B*x for the nonlinear problem
302 */
303 1564 static PetscErrorCode EPSPowerApply_SNES(EPS eps,Vec x,Vec y)
304 {
305 1564 EPS_POWER *power = (EPS_POWER*)eps->data;
306 1564 Vec Bx;
307
308
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1564 PetscFunctionBegin;
309
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1564 PetscCall(VecCopy(x,y));
310
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
1564 if (power->update) PetscCall(SNESSolve(power->snes,NULL,y));
311 else {
312 1444 Bx = eps->work[2];
313
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1444 PetscCall(SNESSolve(power->snes,Bx,y));
314 }
315
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
391 PetscFunctionReturn(PETSC_SUCCESS);
316 }
317
318 /*
319 Use nonlinear inverse power to compute an initial guess
320 */
321 104 static PetscErrorCode EPSPowerComputeInitialGuess_Update(EPS eps)
322 {
323 104 EPS powereps;
324 104 Mat A,B,P;
325 104 Vec v1,v2;
326 104 SNES snes;
327 104 DM dm,newdm;
328 104 PetscBool sign_normalization;
329
330
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
104 PetscFunctionBegin;
331
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(EPSCreate(PetscObjectComm((PetscObject)eps),&powereps));
332
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(EPSGetOperators(eps,&A,&B));
333
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(EPSSetType(powereps,EPSPOWER));
334
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(EPSSetOperators(powereps,A,B));
335
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(EPSSetTolerances(powereps,1e-6,4));
336
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(EPSSetOptionsPrefix(powereps,((PetscObject)eps)->prefix));
337
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(EPSAppendOptionsPrefix(powereps,"init_"));
338
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(EPSSetProblemType(powereps,EPS_GNHEP));
339
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(EPSSetWhichEigenpairs(powereps,EPS_TARGET_MAGNITUDE));
340
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(EPSPowerSetNonlinear(powereps,PETSC_TRUE));
341
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(STGetPreconditionerMat(eps->st,&P));
342 /* attach dm to initial solve */
343
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(EPSPowerGetSNES(eps,&snes));
344
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(SNESGetDM(snes,&dm));
345 /* use dmshell to temporarily store snes context */
346
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(DMCreate(PetscObjectComm((PetscObject)eps),&newdm));
347
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(DMSetType(newdm,DMSHELL));
348
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(DMSetUp(newdm));
349
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(DMCopyDMSNES(dm,newdm));
350
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(EPSPowerGetSNES(powereps,&snes));
351
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(SNESSetDM(snes,dm));
352
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(EPSPowerGetSignNormalization(eps,&sign_normalization));
353
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(EPSPowerSetSignNormalization(powereps,sign_normalization));
354
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(EPSSetFromOptions(powereps));
355
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
104 if (P) PetscCall(STSetPreconditionerMat(powereps->st,P));
356
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(EPSSolve(powereps));
357
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(BVGetColumn(eps->V,0,&v2));
358
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(BVGetColumn(powereps->V,0,&v1));
359
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(VecCopy(v1,v2));
360
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(BVRestoreColumn(powereps->V,0,&v1));
361
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(BVRestoreColumn(eps->V,0,&v2));
362
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(EPSDestroy(&powereps));
363 /* restore context back to the old nonlinear solver */
364
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(DMCopyDMSNES(newdm,dm));
365
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(DMDestroy(&newdm));
366
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
26 PetscFunctionReturn(PETSC_SUCCESS);
367 }
368
369 374 static PetscErrorCode EPSSolve_Power(EPS eps)
370 {
371 374 EPS_POWER *power = (EPS_POWER*)eps->data;
372 374 PetscInt k,ld;
373 374 Vec v,y,e,Bx;
374 374 Mat A;
375 374 KSP ksp;
376 374 PetscReal relerr,norm,norm1,rt1,rt2,cs1;
377 374 PetscScalar theta,rho,delta,sigma,alpha2,beta1,sn1,*T,sign;
378 374 PetscBool breakdown;
379 374 KSPConvergedReason reason;
380 374 SNESConvergedReason snesreason;
381
382
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
374 PetscFunctionBegin;
383 374 e = eps->work[0];
384 374 y = eps->work[1];
385
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
374 if (power->nonlinear) Bx = eps->work[2];
386 else Bx = NULL;
387
388
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
374 if (power->shift_type != EPS_POWER_SHIFT_CONSTANT) PetscCall(STGetKSP(eps->st,&ksp));
389
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
374 if (power->nonlinear) {
390
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
264 PetscCall(PetscObjectCompose((PetscObject)power->snes,"eps",(PetscObject)eps));
391 /* Compute an initial guess only when users do not provide one */
392
8/10
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 6 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
264 if (power->update && !eps->nini) PetscCall(EPSPowerComputeInitialGuess_Update(eps));
393
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
110 } else PetscCall(DSGetLeadingDimension(eps->ds,&ld));
394
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
374 if (!power->update) PetscCall(EPSGetStartVector(eps,0,NULL));
395
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
374 if (power->nonlinear) {
396
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
264 PetscCall(BVGetColumn(eps->V,0,&v));
397
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
264 if (eps->nini) {
398 /* We scale the initial vector back if the initial vector was provided by users */
399
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
16 PetscCall(VecScale(v,power->norm0));
400 }
401 /* Do a couple things:
402 * 1) Determine the first non-zero index for Bx and the proc that owns it. This will be
403 * used if performing normalization by the sign of the first nonzero element of Bx.
404 * 2) Scale Bx by its norm. For non-update power iterations, Bx (in code terms) is used
405 * as the RHS argument to SNESSolve. And recall that the formula for generalized
406 * inverse power iterations in this case is: (Ax)_n = (Bx)_{n-1}/|(Bx)_{n-1}| (in
407 * math terms)
408 */
409
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
264 PetscCall(EPSPowerUpdateFunctionB(eps,v,Bx));
410
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
264 PetscCall(BVRestoreColumn(eps->V,0,&v));
411
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
264 if (power->formNorm) PetscCall((*power->formNorm)(power->snes,Bx,&norm,power->formNormCtx));
412
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
192 else PetscCall(VecNorm(Bx,NORM_2,&norm));
413
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
264 PetscCall(FirstNonzeroIdx(Bx,&power->idx,&power->p));
414
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
264 PetscCall(Normalize(Bx,norm,power->idx,power->p,power->sign_normalization,NULL));
415 }
416
417
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
374 PetscCall(STGetShift(eps->st,&sigma)); /* original shift */
418 374 rho = sigma;
419
420
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
213437 while (eps->reason == EPS_CONVERGED_ITERATING) {
421 213063 eps->its++;
422 213063 k = eps->nconv;
423
424 /* y = OP v */
425
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213063 PetscCall(BVGetColumn(eps->V,k,&v));
426
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
213063 if (power->nonlinear) PetscCall(EPSPowerApply_SNES(eps,v,y));
427
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
211499 else PetscCall(STApply(eps->st,v,y));
428
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213063 PetscCall(BVRestoreColumn(eps->V,k,&v));
429
430 /* purge previously converged eigenvectors */
431
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
213063 if (PetscUnlikely(power->nonlinear)) {
432 /* We do not need to call this for Newton eigensolver since eigenvalue is
433 * updated in function evaluations.
434 */
435
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
1564 if (!power->update) {
436
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1444 PetscCall(EPSPowerUpdateFunctionB(eps,y,Bx));
437
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
1444 if (power->formNorm) PetscCall((*power->formNorm)(power->snes,Bx,&norm,power->formNormCtx));
438
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
900 else PetscCall(VecNorm(Bx,NORM_2,&norm));
439
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1444 PetscCall(Normalize(Bx,norm,power->idx,power->p,power->sign_normalization,&sign));
440 }
441 } else {
442
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
211499 PetscCall(DSGetArray(eps->ds,DS_MAT_A,&T));
443
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
211499 PetscCall(BVSetActiveColumns(eps->V,0,k));
444
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
211499 PetscCall(BVOrthogonalizeVec(eps->V,y,T+k*ld,&norm,NULL));
445 }
446
447 /* theta = (v,y)_B */
448
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213063 PetscCall(BVSetActiveColumns(eps->V,k,k+1));
449
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213063 PetscCall(BVDotVec(eps->V,y,&theta));
450
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
213063 if (!power->nonlinear) {
451 211499 T[k+k*ld] = theta;
452
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
211499 PetscCall(DSRestoreArray(eps->ds,DS_MAT_A,&T));
453 }
454
455 /* Eigenvalue is already stored in function evaluations.
456 * Assign eigenvalue to theta to make the rest of the code consistent
457 */
458
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
213063 if (power->update) theta = eps->eigr[eps->nconv];
459
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
212943 else if (power->nonlinear) theta = 1.0/((PetscScalar)norm*sign); /* Eigenvalue: 1/|Bx| */
460
461
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
213063 if (power->shift_type == EPS_POWER_SHIFT_CONSTANT) { /* direct & inverse iteration */
462
463 /* approximate eigenvalue is the Rayleigh quotient */
464 212787 eps->eigr[eps->nconv] = theta;
465
466 /**
467 * If the Newton method (update, SNES) is used, we do not compute "relerr"
468 * since SNES determines the convergence.
469 */
470
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
212787 if (PetscUnlikely(power->update)) relerr = 0.;
471 else {
472 /* compute relative error as ||y-theta v||_2/|theta| */
473
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
212667 PetscCall(VecCopy(y,e));
474
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
212667 PetscCall(BVGetColumn(eps->V,k,&v));
475
7/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
212667 PetscCall(VecAXPY(e,power->nonlinear?-1.0:-theta,v));
476
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
212667 PetscCall(BVRestoreColumn(eps->V,k,&v));
477
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
212667 PetscCall(VecNorm(e,NORM_2,&relerr));
478
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
212667 if (PetscUnlikely(power->nonlinear)) relerr *= PetscAbsScalar(theta);
479 211223 else relerr /= PetscAbsScalar(theta);
480 }
481
482 } else { /* RQI */
483
484 /* delta = ||y||_B */
485 276 delta = norm;
486
487 /* compute relative error */
488
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
276 if (rho == 0.0) relerr = PETSC_MAX_REAL;
489 276 else relerr = 1.0 / (norm*PetscAbsScalar(rho));
490
491 /* approximate eigenvalue is the shift */
492 276 eps->eigr[eps->nconv] = rho;
493
494 /* compute new shift */
495
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
276 if (relerr<eps->tol) {
496 64 rho = sigma; /* if converged, restore original shift */
497
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
64 PetscCall(STSetShift(eps->st,rho));
498 } else {
499 212 rho = rho + PetscConj(theta)/(delta*delta); /* Rayleigh quotient R(v) */
500
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
212 if (power->shift_type == EPS_POWER_SHIFT_WILKINSON) {
501 /* beta1 is the norm of the residual associated with R(v) */
502
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(BVGetColumn(eps->V,k,&v));
503
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(VecAXPY(v,-PetscConj(theta)/(delta*delta),y));
504
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(BVRestoreColumn(eps->V,k,&v));
505
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(BVScaleColumn(eps->V,k,1.0/delta));
506
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(BVNormColumn(eps->V,k,NORM_2,&norm1));
507 76 beta1 = norm1;
508
509 /* alpha2 = (e'*A*e)/(beta1*beta1), where e is the residual */
510
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(STGetMatrix(eps->st,0,&A));
511
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(BVGetColumn(eps->V,k,&v));
512
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(MatMult(A,v,e));
513
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(VecDot(v,e,&alpha2));
514
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(BVRestoreColumn(eps->V,k,&v));
515 76 alpha2 = alpha2 / (beta1 * beta1);
516
517 /* choose the eigenvalue of [rho beta1; beta1 alpha2] closest to rho */
518
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
519
10/20
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
76 PetscCallBLAS("LAPACKlaev2",LAPACKlaev2_(&rho,&beta1,&alpha2,&rt1,&rt2,&cs1,&sn1));
520
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(PetscFPTrapPop());
521
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
76 if (PetscAbsScalar(rt1-rho) < PetscAbsScalar(rt2-rho)) rho = rt1;
522 32 else rho = rt2;
523 }
524 /* update operator according to new shift */
525
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
212 PetscCall(KSPSetErrorIfNotConverged(ksp,PETSC_FALSE));
526
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
212 PetscCall(STSetShift(eps->st,rho));
527
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
212 PetscCall(KSPGetConvergedReason(ksp,&reason));
528
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 8 times.
212 if (reason) {
529
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1 PetscCall(PetscInfo(eps,"Factorization failed, repeat with a perturbed shift\n"));
530 1 rho *= 1+10*PETSC_MACHINE_EPSILON;
531
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1 PetscCall(STSetShift(eps->st,rho));
532
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1 PetscCall(KSPGetConvergedReason(ksp,&reason));
533
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1 PetscCheck(!reason,PetscObjectComm((PetscObject)ksp),PETSC_ERR_CONV_FAILED,"Second factorization failed");
534 }
535
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
212 PetscCall(KSPSetErrorIfNotConverged(ksp,PETSC_TRUE));
536 }
537 }
538 213063 eps->errest[eps->nconv] = relerr;
539
540 /* normalize */
541
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
213063 if (!power->nonlinear) PetscCall(Normalize(y,norm,power->idx,power->p,power->sign_normalization,NULL));
542
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213063 PetscCall(BVInsertVec(eps->V,k,y));
543
544
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
213063 if (PetscUnlikely(power->update)) {
545
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
120 PetscCall(SNESGetConvergedReason(power->snes,&snesreason));
546 /* For Newton eigensolver, we are ready to return once SNES converged. */
547
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
120 if (snesreason>0) eps->nconv = 1;
548
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
212943 } else if (PetscUnlikely(relerr<eps->tol)) { /* accept eigenpair */
549 394 eps->nconv = eps->nconv + 1;
550
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
394 if (eps->nconv<eps->nev) {
551
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
244 PetscCall(EPSGetStartVector(eps,eps->nconv,&breakdown));
552
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
244 if (breakdown) {
553 eps->reason = EPS_DIVERGED_BREAKDOWN;
554 PetscCall(PetscInfo(eps,"Unable to generate more start vectors\n"));
555 break;
556 }
557 }
558 }
559 /* For Newton eigensolver, monitor will be called from SNES monitor */
560
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
213063 if (!power->update) PetscCall(EPSMonitor(eps,eps->its,eps->nconv,eps->eigr,eps->eigi,eps->errest,PetscMin(eps->nconv+1,eps->nev)));
561
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213063 PetscCall((*eps->stopping)(eps,eps->its,eps->max_it,eps->nconv,eps->nev,&eps->reason,eps->stoppingctx));
562
563 /**
564 * When a customized stopping test is used, and reason can be set to be converged (EPS_CONVERGED_USER).
565 * In this case, we need to increase eps->nconv to "1" so users can retrieve the solution.
566 */
567
4/4
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
213063 if (PetscUnlikely(power->nonlinear && eps->reason>0)) eps->nconv = 1;
568 }
569
570
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
374 if (power->nonlinear) PetscCall(PetscObjectCompose((PetscObject)power->snes,"eps",NULL));
571 else {
572
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
110 PetscCall(DSSetDimensions(eps->ds,eps->nconv,0,0));
573
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
110 PetscCall(DSSetState(eps->ds,DS_STATE_RAW));
574 }
575
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
94 PetscFunctionReturn(PETSC_SUCCESS);
576 }
577
578 32 static PetscErrorCode EPSSolve_TS_Power(EPS eps)
579 {
580 32 EPS_POWER *power = (EPS_POWER*)eps->data;
581 32 PetscInt k,ld;
582 32 Vec v,w,y,e,z;
583 32 KSP ksp;
584 32 PetscReal relerr=1.0,relerrl,delta;
585 32 PetscScalar theta,rho,alpha,sigma;
586 32 PetscBool breakdown,breakdownl;
587 32 KSPConvergedReason reason;
588
589
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
32 PetscFunctionBegin;
590 32 e = eps->work[0];
591 32 v = eps->work[1];
592 32 w = eps->work[2];
593
594
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
32 if (power->shift_type != EPS_POWER_SHIFT_CONSTANT) PetscCall(STGetKSP(eps->st,&ksp));
595
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
32 PetscCall(DSGetLeadingDimension(eps->ds,&ld));
596
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
32 PetscCall(EPSGetStartVector(eps,0,NULL));
597
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
32 PetscCall(EPSGetLeftStartVector(eps,0,NULL));
598
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
32 PetscCall(BVBiorthonormalizeColumn(eps->V,eps->W,0,NULL));
599
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
32 PetscCall(BVCopyVec(eps->V,0,v));
600
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
32 PetscCall(BVCopyVec(eps->W,0,w));
601
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
32 PetscCall(STGetShift(eps->st,&sigma)); /* original shift */
602 32 rho = sigma;
603
604 32 while (eps->reason == EPS_CONVERGED_ITERATING) {
605 3330 eps->its++;
606 3330 k = eps->nconv;
607
608 /* y = OP v, z = OP' w */
609
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3330 PetscCall(BVGetColumn(eps->V,k,&y));
610
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3330 PetscCall(STApply(eps->st,v,y));
611
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3330 PetscCall(BVRestoreColumn(eps->V,k,&y));
612
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3330 PetscCall(BVGetColumn(eps->W,k,&z));
613
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3330 PetscCall(STApplyHermitianTranspose(eps->st,w,z));
614
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3330 PetscCall(BVRestoreColumn(eps->W,k,&z));
615
616 /* purge previously converged eigenvectors */
617
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3330 PetscCall(BVBiorthogonalizeColumn(eps->V,eps->W,k));
618
619 /* theta = (w,y)_B */
620
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3330 PetscCall(BVSetActiveColumns(eps->V,k,k+1));
621
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3330 PetscCall(BVDotVec(eps->V,w,&theta));
622 3330 theta = PetscConj(theta);
623
624
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
3330 if (power->shift_type == EPS_POWER_SHIFT_CONSTANT) { /* direct & inverse iteration */
625
626 /* approximate eigenvalue is the Rayleigh quotient */
627 3190 eps->eigr[eps->nconv] = theta;
628
629 /* compute relative errors as ||y-theta v||_2/|theta| and ||z-conj(theta) w||_2/|theta|*/
630
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3190 PetscCall(BVCopyVec(eps->V,k,e));
631
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3190 PetscCall(VecAXPY(e,-theta,v));
632
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3190 PetscCall(VecNorm(e,NORM_2,&relerr));
633
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3190 PetscCall(BVCopyVec(eps->W,k,e));
634
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3190 PetscCall(VecAXPY(e,-PetscConj(theta),w));
635
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3190 PetscCall(VecNorm(e,NORM_2,&relerrl));
636
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
6166 relerr = PetscMax(relerr,relerrl)/PetscAbsScalar(theta);
637 }
638
639 /* normalize */
640
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3330 PetscCall(BVSetActiveColumns(eps->V,k,k+1));
641
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3330 PetscCall(BVGetColumn(eps->W,k,&z));
642
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3330 PetscCall(BVDotVec(eps->V,z,&alpha));
643
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3330 PetscCall(BVRestoreColumn(eps->W,k,&z));
644 3330 delta = PetscSqrtReal(PetscAbsScalar(alpha));
645
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
3330 PetscCheck(delta!=0.0,PetscObjectComm((PetscObject)eps),PETSC_ERR_CONV_FAILED,"Breakdown in two-sided Power/RQI");
646
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3330 PetscCall(BVScaleColumn(eps->V,k,1.0/PetscConj(alpha/delta)));
647
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3330 PetscCall(BVScaleColumn(eps->W,k,1.0/delta));
648
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3330 PetscCall(BVCopyVec(eps->V,k,v));
649
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3330 PetscCall(BVCopyVec(eps->W,k,w));
650
651
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
3330 if (power->shift_type == EPS_POWER_SHIFT_RAYLEIGH) { /* RQI */
652
653 /* compute relative error */
654
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
140 if (rho == 0.0) relerr = PETSC_MAX_REAL;
655 140 else relerr = 1.0 / PetscAbsScalar(delta*rho);
656
657 /* approximate eigenvalue is the shift */
658 140 eps->eigr[eps->nconv] = rho;
659
660 /* compute new shift */
661
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
140 if (relerr<eps->tol) {
662 28 rho = sigma; /* if converged, restore original shift */
663
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
28 PetscCall(STSetShift(eps->st,rho));
664 } else {
665 112 rho = rho + PetscConj(theta)/(delta*delta); /* Rayleigh quotient R(v) */
666 /* update operator according to new shift */
667
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
112 PetscCall(KSPSetErrorIfNotConverged(ksp,PETSC_FALSE));
668
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
112 PetscCall(STSetShift(eps->st,rho));
669
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
112 PetscCall(KSPGetConvergedReason(ksp,&reason));
670
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 8 times.
112 if (reason) {
671
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
4 PetscCall(PetscInfo(eps,"Factorization failed, repeat with a perturbed shift\n"));
672 4 rho *= 1+10*PETSC_MACHINE_EPSILON;
673
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
4 PetscCall(STSetShift(eps->st,rho));
674
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
4 PetscCall(KSPGetConvergedReason(ksp,&reason));
675
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
4 PetscCheck(!reason,PetscObjectComm((PetscObject)ksp),PETSC_ERR_CONV_FAILED,"Second factorization failed");
676 }
677
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
112 PetscCall(KSPSetErrorIfNotConverged(ksp,PETSC_TRUE));
678 }
679 }
680 3330 eps->errest[eps->nconv] = relerr;
681
682 /* if relerr<tol, accept eigenpair */
683
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
3330 if (relerr<eps->tol) {
684 76 eps->nconv = eps->nconv + 1;
685
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
76 if (eps->nconv<eps->nev) {
686
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
44 PetscCall(EPSGetStartVector(eps,eps->nconv,&breakdown));
687
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
44 PetscCall(EPSGetLeftStartVector(eps,eps->nconv,&breakdownl));
688
2/4
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
44 if (breakdown || breakdownl) {
689 eps->reason = EPS_DIVERGED_BREAKDOWN;
690 PetscCall(PetscInfo(eps,"Unable to generate more start vectors\n"));
691 break;
692 }
693
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
44 PetscCall(BVBiorthonormalizeColumn(eps->V,eps->W,eps->nconv,NULL));
694 }
695 }
696
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3330 PetscCall(EPSMonitor(eps,eps->its,eps->nconv,eps->eigr,eps->eigi,eps->errest,PetscMin(eps->nconv+1,eps->nev)));
697
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
3362 PetscCall((*eps->stopping)(eps,eps->its,eps->max_it,eps->nconv,eps->nev,&eps->reason,eps->stoppingctx));
698 }
699
700
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
32 PetscCall(DSSetDimensions(eps->ds,eps->nconv,0,0));
701
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
32 PetscCall(DSSetState(eps->ds,DS_STATE_RAW));
702
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
8 PetscFunctionReturn(PETSC_SUCCESS);
703 }
704
705 216393 static PetscErrorCode EPSStopping_Power(EPS eps,PetscInt its,PetscInt max_it,PetscInt nconv,PetscInt nev,EPSConvergedReason *reason,void *ctx)
706 {
707 216393 EPS_POWER *power = (EPS_POWER*)eps->data;
708 216393 SNESConvergedReason snesreason;
709
710
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
216393 PetscFunctionBegin;
711
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
216393 if (PetscUnlikely(power->update)) {
712
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
120 PetscCall(SNESGetConvergedReason(power->snes,&snesreason));
713
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
120 if (snesreason < 0) {
714 *reason = EPS_DIVERGED_BREAKDOWN;
715 PetscFunctionReturn(PETSC_SUCCESS);
716 }
717 }
718
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216393 PetscCall(EPSStoppingBasic(eps,its,max_it,nconv,nev,reason,ctx));
719
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
54154 PetscFunctionReturn(PETSC_SUCCESS);
720 }
721
722 142 static PetscErrorCode EPSBackTransform_Power(EPS eps)
723 {
724 142 EPS_POWER *power = (EPS_POWER*)eps->data;
725
726
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
142 PetscFunctionBegin;
727
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
142 if (power->nonlinear) eps->eigr[0] = 1.0/eps->eigr[0];
728
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
142 else if (power->shift_type == EPS_POWER_SHIFT_CONSTANT) PetscCall(EPSBackTransform_Default(eps));
729
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
36 PetscFunctionReturn(PETSC_SUCCESS);
730 }
731
732 374 static PetscErrorCode EPSSetFromOptions_Power(EPS eps,PetscOptionItems PetscOptionsObject)
733 {
734 374 EPS_POWER *power = (EPS_POWER*)eps->data;
735 374 PetscBool flg,val;
736 374 EPSPowerShiftType shift;
737
738
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
374 PetscFunctionBegin;
739
1/12
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
374 PetscOptionsHeadBegin(PetscOptionsObject,"EPS Power Options");
740
741
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
374 PetscCall(PetscOptionsEnum("-eps_power_shift_type","Shift type","EPSPowerSetShiftType",EPSPowerShiftTypes,(PetscEnum)power->shift_type,(PetscEnum*)&shift,&flg));
742
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
374 if (flg) PetscCall(EPSPowerSetShiftType(eps,shift));
743
744
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
374 PetscCall(PetscOptionsBool("-eps_power_nonlinear","Use nonlinear inverse iteration","EPSPowerSetNonlinear",power->nonlinear,&val,&flg));
745
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
374 if (flg) PetscCall(EPSPowerSetNonlinear(eps,val));
746
747
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
374 PetscCall(PetscOptionsBool("-eps_power_update","Update residual monolithically","EPSPowerSetUpdate",power->update,&val,&flg));
748
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
374 if (flg) PetscCall(EPSPowerSetUpdate(eps,val));
749
750
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
374 PetscCall(PetscOptionsBool("-eps_power_sign_normalization","Normalize Bx with sign of first nonzero entry","EPSPowerSetSignNormalization",power->sign_normalization,&power->sign_normalization,&flg));
751
752
1/14
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
374 PetscOptionsHeadEnd();
753
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
94 PetscFunctionReturn(PETSC_SUCCESS);
754 }
755
756 64 static PetscErrorCode EPSPowerSetShiftType_Power(EPS eps,EPSPowerShiftType shift)
757 {
758 64 EPS_POWER *power = (EPS_POWER*)eps->data;
759
760
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
64 PetscFunctionBegin;
761
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
64 switch (shift) {
762 64 case EPS_POWER_SHIFT_CONSTANT:
763 case EPS_POWER_SHIFT_RAYLEIGH:
764 case EPS_POWER_SHIFT_WILKINSON:
765
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
64 if (power->shift_type != shift) {
766 40 power->shift_type = shift;
767 40 eps->state = EPS_STATE_INITIAL;
768 }
769 16 break;
770 default:
771 SETERRQ(PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"Invalid shift type");
772 }
773
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
16 PetscFunctionReturn(PETSC_SUCCESS);
774 }
775
776 /*@
777 EPSPowerSetShiftType - Sets the type of shifts used during the power
778 iteration. This can be used to emulate the Rayleigh Quotient Iteration
779 (RQI) method.
780
781 Logically Collective
782
783 Input Parameters:
784 + eps - the linear eigensolver context
785 - shift - the type of shift, see `EPSPowerShiftType` for possible values
786
787 Options Database Key:
788 . -eps_power_shift_type \<shift\> - sets the shift type, either `constant`, `rayleigh` or `wilkinson`
789
790 Notes:
791 By default, shifts are constant (`EPS_POWER_SHIFT_CONSTANT`) and the iteration
792 is the simple power method (or inverse iteration if a shift-and-invert
793 transformation is being used).
794
795 A variable shift can be specified (`EPS_POWER_SHIFT_RAYLEIGH` or
796 `EPS_POWER_SHIFT_WILKINSON`). In this case, the iteration behaves rather like
797 a cubic converging method such as RQI.
798
799 Details of the three variants can be found in {cite:p}`Her05`.
800
801 Level: advanced
802
803 .seealso: [](ch:eps), `EPSPOWER`, `EPSPowerGetShiftType()`, `STSetShift()`, `EPSPowerShiftType`
804 @*/
805 64 PetscErrorCode EPSPowerSetShiftType(EPS eps,EPSPowerShiftType shift)
806 {
807
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
64 PetscFunctionBegin;
808
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
64 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
809
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
64 PetscValidLogicalCollectiveEnum(eps,shift,2);
810
8/14
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
64 PetscTryMethod(eps,"EPSPowerSetShiftType_C",(EPS,EPSPowerShiftType),(eps,shift));
811
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
64 PetscFunctionReturn(PETSC_SUCCESS);
812 }
813
814 8 static PetscErrorCode EPSPowerGetShiftType_Power(EPS eps,EPSPowerShiftType *shift)
815 {
816 8 EPS_POWER *power = (EPS_POWER*)eps->data;
817
818
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
8 PetscFunctionBegin;
819 8 *shift = power->shift_type;
820
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
8 PetscFunctionReturn(PETSC_SUCCESS);
821 }
822
823 /*@
824 EPSPowerGetShiftType - Gets the type of shifts used during the power
825 iteration.
826
827 Not Collective
828
829 Input Parameter:
830 . eps - the linear eigensolver context
831
832 Output Parameter:
833 . shift - the type of shift
834
835 Level: advanced
836
837 .seealso: [](ch:eps), `EPSPOWER`, `EPSPowerSetShiftType()`, `EPSPowerShiftType`
838 @*/
839 8 PetscErrorCode EPSPowerGetShiftType(EPS eps,EPSPowerShiftType *shift)
840 {
841
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
8 PetscFunctionBegin;
842
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
8 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
843
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
8 PetscAssertPointer(shift,2);
844
9/16
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
8 PetscUseMethod(eps,"EPSPowerGetShiftType_C",(EPS,EPSPowerShiftType*),(eps,shift));
845
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
8 PetscFunctionReturn(PETSC_SUCCESS);
846 }
847
848 248 static PetscErrorCode EPSPowerSetNonlinear_Power(EPS eps,PetscBool nonlinear)
849 {
850 248 EPS_POWER *power = (EPS_POWER*)eps->data;
851
852
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
248 PetscFunctionBegin;
853
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
248 if (power->nonlinear != nonlinear) {
854 248 power->nonlinear = nonlinear;
855 248 eps->useds = PetscNot(nonlinear);
856
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
248 eps->ops->setupsort = nonlinear? NULL: EPSSetUpSort_Default;
857 248 eps->state = EPS_STATE_INITIAL;
858 }
859
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
248 PetscFunctionReturn(PETSC_SUCCESS);
860 }
861
862 /*@
863 EPSPowerSetNonlinear - Sets a flag to indicate that the problem is nonlinear.
864
865 Logically Collective
866
867 Input Parameters:
868 + eps - the linear eigensolver context
869 - nonlinear - whether the problem is nonlinear or not
870
871 Options Database Key:
872 . -eps_power_nonlinear - sets the nonlinear flag
873
874 Notes:
875 If this flag is set, the solver assumes that the problem is nonlinear,
876 that is, the operators that define the eigenproblem are not constant
877 matrices, but depend on the eigenvector, $A(x)x=\lambda B(x)x$. This is
878 different from the case of nonlinearity with respect to the eigenvalue
879 (use the `NEP` solver class for this kind of problems).
880
881 The way in which nonlinear operators are specified is very similar to
882 the case of PETSc's `SNES` solver. The difference is that the callback
883 functions are provided via composed functions `formFunction` and
884 `formJacobian` in each of the matrix objects passed as arguments of
885 `EPSSetOperators()`. The application context required for these functions
886 can be attached via a composed `PetscContainer`.
887
888 Level: advanced
889
890 .seealso: [](ch:eps), `EPSPOWER`, `EPSPowerGetNonlinear()`, `EPSSetOperators()`
891 @*/
892 248 PetscErrorCode EPSPowerSetNonlinear(EPS eps,PetscBool nonlinear)
893 {
894
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
248 PetscFunctionBegin;
895
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
248 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
896
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
248 PetscValidLogicalCollectiveBool(eps,nonlinear,2);
897
8/14
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
248 PetscTryMethod(eps,"EPSPowerSetNonlinear_C",(EPS,PetscBool),(eps,nonlinear));
898
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
248 PetscFunctionReturn(PETSC_SUCCESS);
899 }
900
901 144 static PetscErrorCode EPSPowerGetNonlinear_Power(EPS eps,PetscBool *nonlinear)
902 {
903 144 EPS_POWER *power = (EPS_POWER*)eps->data;
904
905
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
144 PetscFunctionBegin;
906 144 *nonlinear = power->nonlinear;
907
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
144 PetscFunctionReturn(PETSC_SUCCESS);
908 }
909
910 /*@
911 EPSPowerGetNonlinear - Returns a flag indicating if the problem is nonlinear.
912
913 Not Collective
914
915 Input Parameter:
916 . eps - the linear eigensolver context
917
918 Output Parameter:
919 . nonlinear - the nonlinear flag
920
921 Level: advanced
922
923 .seealso: [](ch:eps), `EPSPOWER`, `EPSPowerSetUpdate()`, `EPSPowerSetNonlinear()`
924 @*/
925 144 PetscErrorCode EPSPowerGetNonlinear(EPS eps,PetscBool *nonlinear)
926 {
927
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
144 PetscFunctionBegin;
928
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
144 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
929
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
144 PetscAssertPointer(nonlinear,2);
930
9/16
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
144 PetscUseMethod(eps,"EPSPowerGetNonlinear_C",(EPS,PetscBool*),(eps,nonlinear));
931
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
144 PetscFunctionReturn(PETSC_SUCCESS);
932 }
933
934 104 static PetscErrorCode EPSPowerSetUpdate_Power(EPS eps,PetscBool update)
935 {
936 104 EPS_POWER *power = (EPS_POWER*)eps->data;
937
938
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
104 PetscFunctionBegin;
939
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
104 PetscCheck(power->nonlinear,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_INCOMP,"This option does not make sense for linear problems");
940 104 power->update = update;
941 104 eps->state = EPS_STATE_INITIAL;
942
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
104 PetscFunctionReturn(PETSC_SUCCESS);
943 }
944
945 /*@
946 EPSPowerSetUpdate - Sets a flag to indicate that the residual is updated monolithically
947 for nonlinear problems. This potentially has a better convergence.
948
949 Logically Collective
950
951 Input Parameters:
952 + eps - the linear eigensolver context
953 - update - whether the residual is updated monolithically or not
954
955 Options Database Key:
956 . -eps_power_update - sets the update flag
957
958 Note:
959 This flag is relevant only in nonlinear problems, see `EPSPowerSetNonlinear()`.
960
961 Level: advanced
962
963 .seealso: [](ch:eps), `EPSPOWER`, `EPSPowerGetUpdate()`, `EPSPowerGetNonlinear()`, `EPSSetOperators()`
964 @*/
965 104 PetscErrorCode EPSPowerSetUpdate(EPS eps,PetscBool update)
966 {
967
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
104 PetscFunctionBegin;
968
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
104 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
969
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
104 PetscValidLogicalCollectiveBool(eps,update,2);
970
8/14
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
104 PetscTryMethod(eps,"EPSPowerSetUpdate_C",(EPS,PetscBool),(eps,update));
971
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
104 PetscFunctionReturn(PETSC_SUCCESS);
972 }
973
974 144 static PetscErrorCode EPSPowerGetUpdate_Power(EPS eps,PetscBool *update)
975 {
976 144 EPS_POWER *power = (EPS_POWER*)eps->data;
977
978
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
144 PetscFunctionBegin;
979 144 *update = power->update;
980
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
144 PetscFunctionReturn(PETSC_SUCCESS);
981 }
982
983 /*@
984 EPSPowerGetUpdate - Returns a flag indicating if the residual is updated monolithically
985 for nonlinear problems.
986
987 Not Collective
988
989 Input Parameter:
990 . eps - the linear eigensolver context
991
992 Output Parameter:
993 . update - the update flag
994
995 Level: advanced
996
997 .seealso: [](ch:eps), `EPSPOWER`, `EPSPowerSetUpdate()`, `EPSPowerSetNonlinear()`
998 @*/
999 144 PetscErrorCode EPSPowerGetUpdate(EPS eps,PetscBool *update)
1000 {
1001
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
144 PetscFunctionBegin;
1002
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
144 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
1003
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
144 PetscAssertPointer(update,2);
1004
9/16
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
144 PetscUseMethod(eps,"EPSPowerGetUpdate_C",(EPS,PetscBool*),(eps,update));
1005
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
144 PetscFunctionReturn(PETSC_SUCCESS);
1006 }
1007
1008 248 static PetscErrorCode EPSPowerSetSignNormalization_Power(EPS eps,PetscBool sign_normalization)
1009 {
1010 248 EPS_POWER *power = (EPS_POWER*)eps->data;
1011
1012
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
248 PetscFunctionBegin;
1013 248 power->sign_normalization = sign_normalization;
1014
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
248 PetscFunctionReturn(PETSC_SUCCESS);
1015 }
1016
1017 /*@
1018 EPSPowerSetSignNormalization - Sets a flag to indicate whether the $Bx$ vector
1019 should be normalized by the sign of the first non-zero element in the vector.
1020 E.g., if this is true, the post-normalization value of the first non-zero element
1021 in the vector is guaranteed to be positive.
1022
1023 Logically Collective
1024
1025 Input Parameters:
1026 + eps - the linear eigensolver context
1027 - sign_normalization - whether $Bx$ should be multiplied by the sign of the first non-zero
1028 element when performing normalization steps
1029
1030 Options Database Key:
1031 . -eps_power_sign_normalization - sets the sign normalization flag
1032
1033 Note:
1034 This flag is relevant only in nonlinear problems, see `EPSPowerSetNonlinear()`.
1035
1036 Level: advanced
1037
1038 .seealso: [](ch:eps), `EPSPOWER`, `EPSPowerSetNonlinear()`, `EPSPowerGetSignNormalization()`
1039 @*/
1040 248 PetscErrorCode EPSPowerSetSignNormalization(EPS eps,PetscBool sign_normalization)
1041 {
1042
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
248 PetscFunctionBegin;
1043
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
248 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
1044
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
248 PetscValidLogicalCollectiveBool(eps,sign_normalization,2);
1045
8/14
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
248 PetscTryMethod(eps,"EPSPowerSetSignNormalization_C",(EPS,PetscBool),(eps,sign_normalization));
1046
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
248 PetscFunctionReturn(PETSC_SUCCESS);
1047 }
1048
1049 104 static PetscErrorCode EPSPowerGetSignNormalization_Power(EPS eps,PetscBool *sign_normalization)
1050 {
1051 104 EPS_POWER *power = (EPS_POWER*)eps->data;
1052
1053
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
104 PetscFunctionBegin;
1054 104 *sign_normalization = power->sign_normalization;
1055
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
104 PetscFunctionReturn(PETSC_SUCCESS);
1056 }
1057
1058 /*@
1059 EPSPowerGetSignNormalization - Returns a flag indicating whether the $Bx$ vector
1060 is normalized by the sign of the first non-zero element in the vector. E.g.,
1061 if this is true, the post-normalization value of the first non-zero element in
1062 the vector is guaranteed to be positive.
1063
1064 Not Collective
1065
1066 Input Parameter:
1067 . eps - the linear eigensolver context
1068
1069 Output Parameter:
1070 . sign_normalization - the sign normalization flag
1071
1072 Level: advanced
1073
1074 .seealso: [](ch:eps), `EPSPOWER`, `EPSPowerSetSignNormalization()`
1075 @*/
1076 104 PetscErrorCode EPSPowerGetSignNormalization(EPS eps,PetscBool *sign_normalization)
1077 {
1078
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
104 PetscFunctionBegin;
1079
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
104 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
1080
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
104 PetscAssertPointer(sign_normalization,2);
1081
9/16
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
104 PetscUseMethod(eps,"EPSPowerGetSignNormalization_C",(EPS,PetscBool*),(eps,sign_normalization));
1082
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
104 PetscFunctionReturn(PETSC_SUCCESS);
1083 }
1084
1085 static PetscErrorCode EPSPowerSetSNES_Power(EPS eps,SNES snes)
1086 {
1087 EPS_POWER *power = (EPS_POWER*)eps->data;
1088
1089 PetscFunctionBegin;
1090 PetscCall(PetscObjectReference((PetscObject)snes));
1091 PetscCall(SNESDestroy(&power->snes));
1092 power->snes = snes;
1093 eps->state = EPS_STATE_INITIAL;
1094 PetscFunctionReturn(PETSC_SUCCESS);
1095 }
1096
1097 /*@
1098 EPSPowerSetSNES - Associate a nonlinear solver object (`SNES`) to the
1099 eigenvalue solver (to be used in nonlinear inverse iteration).
1100
1101 Collective
1102
1103 Input Parameters:
1104 + eps - the linear eigensolver context
1105 - snes - the nonlinear solver object
1106
1107 Note:
1108 This flag is relevant only in nonlinear problems, see `EPSPowerSetNonlinear()`.
1109
1110 Level: advanced
1111
1112 .seealso: [](ch:eps), `EPSPOWER`, `EPSPowerSetNonlinear()`, `EPSPowerGetSNES()`
1113 @*/
1114 PetscErrorCode EPSPowerSetSNES(EPS eps,SNES snes)
1115 {
1116 PetscFunctionBegin;
1117 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
1118 PetscValidHeaderSpecific(snes,SNES_CLASSID,2);
1119 PetscCheckSameComm(eps,1,snes,2);
1120 PetscTryMethod(eps,"EPSPowerSetSNES_C",(EPS,SNES),(eps,snes));
1121 PetscFunctionReturn(PETSC_SUCCESS);
1122 }
1123
1124 352 static PetscErrorCode EPSPowerGetSNES_Power(EPS eps,SNES *snes)
1125 {
1126 352 EPS_POWER *power = (EPS_POWER*)eps->data;
1127
1128
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
352 PetscFunctionBegin;
1129
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
352 if (!power->snes) {
1130
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
248 PetscCall(SNESCreate(PetscObjectComm((PetscObject)eps),&power->snes));
1131
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
248 PetscCall(PetscObjectIncrementTabLevel((PetscObject)power->snes,(PetscObject)eps,1));
1132
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
248 PetscCall(SNESSetOptionsPrefix(power->snes,((PetscObject)eps)->prefix));
1133
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
248 PetscCall(SNESAppendOptionsPrefix(power->snes,"eps_power_"));
1134
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
248 PetscCall(PetscObjectSetOptions((PetscObject)power->snes,((PetscObject)eps)->options));
1135 }
1136 352 *snes = power->snes;
1137
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
352 PetscFunctionReturn(PETSC_SUCCESS);
1138 }
1139
1140 /*@
1141 EPSPowerGetSNES - Retrieve the nonlinear solver object (`SNES`) associated
1142 with the eigenvalue solver.
1143
1144 Not Collective
1145
1146 Input Parameter:
1147 . eps - the linear eigensolver context
1148
1149 Output Parameter:
1150 . snes - the nonlinear solver object
1151
1152 Level: advanced
1153
1154 .seealso: [](ch:eps), `EPSPOWER`, `EPSPowerSetSNES()`
1155 @*/
1156 352 PetscErrorCode EPSPowerGetSNES(EPS eps,SNES *snes)
1157 {
1158
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
352 PetscFunctionBegin;
1159
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
352 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
1160
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
352 PetscAssertPointer(snes,2);
1161
9/16
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
352 PetscUseMethod(eps,"EPSPowerGetSNES_C",(EPS,SNES*),(eps,snes));
1162
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
352 PetscFunctionReturn(PETSC_SUCCESS);
1163 }
1164
1165 382 static PetscErrorCode EPSReset_Power(EPS eps)
1166 {
1167 382 EPS_POWER *power = (EPS_POWER*)eps->data;
1168
1169
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
382 PetscFunctionBegin;
1170
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
382 if (power->snes) PetscCall(SNESReset(power->snes));
1171
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
96 PetscFunctionReturn(PETSC_SUCCESS);
1172 }
1173
1174 374 static PetscErrorCode EPSDestroy_Power(EPS eps)
1175 {
1176 374 EPS_POWER *power = (EPS_POWER*)eps->data;
1177
1178
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
374 PetscFunctionBegin;
1179
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
374 if (power->nonlinear) PetscCall(SNESDestroy(&power->snes));
1180
5/8
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
374 PetscCall(PetscFree(eps->data));
1181
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
374 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSPowerSetShiftType_C",NULL));
1182
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
374 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSPowerGetShiftType_C",NULL));
1183
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
374 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSPowerSetNonlinear_C",NULL));
1184
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
374 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSPowerGetNonlinear_C",NULL));
1185
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
374 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSPowerSetUpdate_C",NULL));
1186
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
374 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSPowerGetUpdate_C",NULL));
1187
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
374 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSPowerSetSignNormalization_C",NULL));
1188
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
374 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSPowerGetSignNormalization_C",NULL));
1189
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
374 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSPowerSetSNES_C",NULL));
1190
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
374 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSPowerGetSNES_C",NULL));
1191
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
94 PetscFunctionReturn(PETSC_SUCCESS);
1192 }
1193
1194 static PetscErrorCode EPSView_Power(EPS eps,PetscViewer viewer)
1195 {
1196 EPS_POWER *power = (EPS_POWER*)eps->data;
1197 PetscBool isascii;
1198
1199 PetscFunctionBegin;
1200 PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii));
1201 if (isascii) {
1202 if (power->nonlinear) {
1203 if (power->sign_normalization) PetscCall(PetscViewerASCIIPrintf(viewer," normalizing Bx by the sign of the first nonzero element\n"));
1204 else PetscCall(PetscViewerASCIIPrintf(viewer," not normalizing Bx by the sign of the first nonzero element\n"));
1205 PetscCall(PetscViewerASCIIPrintf(viewer," using nonlinear inverse iteration\n"));
1206 if (power->update) PetscCall(PetscViewerASCIIPrintf(viewer," updating the residual monolithically\n"));
1207 if (!power->snes) PetscCall(EPSPowerGetSNES(eps,&power->snes));
1208 PetscCall(PetscViewerASCIIPushTab(viewer));
1209 PetscCall(SNESView(power->snes,viewer));
1210 PetscCall(PetscViewerASCIIPopTab(viewer));
1211 } else PetscCall(PetscViewerASCIIPrintf(viewer," %s shifts\n",EPSPowerShiftTypes[power->shift_type]));
1212 }
1213 PetscFunctionReturn(PETSC_SUCCESS);
1214 }
1215
1216 302 static PetscErrorCode EPSComputeVectors_Power(EPS eps)
1217 {
1218 302 EPS_POWER *power = (EPS_POWER*)eps->data;
1219
1220
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
302 PetscFunctionBegin;
1221
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
302 if (eps->twosided) {
1222
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
32 PetscCall(EPSComputeVectors_Twosided(eps));
1223
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
32 PetscCall(BVNormalize(eps->V,NULL));
1224
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
32 PetscCall(BVNormalize(eps->W,NULL));
1225
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
270 } else if (!power->nonlinear) PetscCall(EPSComputeVectors_Schur(eps));
1226
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
76 PetscFunctionReturn(PETSC_SUCCESS);
1227 }
1228
1229 780 static PetscErrorCode EPSSetDefaultST_Power(EPS eps)
1230 {
1231 780 EPS_POWER *power = (EPS_POWER*)eps->data;
1232 780 KSP ksp;
1233 780 PC pc;
1234
1235
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
780 PetscFunctionBegin;
1236
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
780 if (power->nonlinear) {
1237 512 eps->categ=EPS_CATEGORY_PRECOND;
1238
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
512 PetscCall(STGetKSP(eps->st,&ksp));
1239 /* Set ST as STPRECOND so it can carry one preconditioning matrix
1240 * It is useful when A and B are shell matrices
1241 */
1242
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
512 PetscCall(STSetType(eps->st,STPRECOND));
1243
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
512 PetscCall(KSPGetPC(ksp,&pc));
1244
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
512 PetscCall(PCSetType(pc,PCNONE));
1245 }
1246
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
196 PetscFunctionReturn(PETSC_SUCCESS);
1247 }
1248
1249 /*MC
1250 EPSPOWER - EPSPOWER = "power" - The simple power iteration and inverse
1251 iteration.
1252
1253 Notes:
1254 This solver is very basic and is not recommended in general, since it
1255 will not be competitive with respect to other solvers.
1256
1257 The implemented method is the power iteration, or inverse iteration in
1258 case the selected spectral transformation is `STSINVERT`. In this latter
1259 case it is possible to use a dynamic shift, as in the RQI method, see
1260 `EPSPowerSetShiftType()`.
1261
1262 The solver incorporates deflation so that several eigenpairs can be
1263 computed. There is also a two-sided implementation that also computes
1264 left eigenvectors.
1265
1266 This solver can also be used for nonlinear inverse iteration on the problem
1267 $A(x)x=\lambda B(x)x$, where $A$ and $B$ are not constant matrices but
1268 depend on the eigenvector $x$. This mode is enabled with `EPSPowerSetNonlinear()`.
1269 Note that this is a nonlinear eigenvector problem, as opposed to problems
1270 addressed in `NEP` that are nonlinear with respect to the eigenvalue.
1271
1272 Level: beginner
1273
1274 .seealso: [](ch:eps), `EPS`, `EPSType`, `EPSSetType()`, `EPSSetTwoSided()`, `EPSPowerSetShiftType()`, `EPSPowerSetNonlinear()`
1275 M*/
1276 374 SLEPC_EXTERN PetscErrorCode EPSCreate_Power(EPS eps)
1277 {
1278 374 EPS_POWER *ctx;
1279
1280
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
374 PetscFunctionBegin;
1281
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
374 PetscCall(PetscNew(&ctx));
1282 374 eps->data = (void*)ctx;
1283
1284 374 eps->useds = PETSC_TRUE;
1285 374 eps->categ = EPS_CATEGORY_OTHER;
1286
1287 374 eps->ops->setup = EPSSetUp_Power;
1288 374 eps->ops->setupsort = EPSSetUpSort_Default;
1289 374 eps->ops->setfromoptions = EPSSetFromOptions_Power;
1290 374 eps->ops->reset = EPSReset_Power;
1291 374 eps->ops->destroy = EPSDestroy_Power;
1292 374 eps->ops->view = EPSView_Power;
1293 374 eps->ops->backtransform = EPSBackTransform_Power;
1294 374 eps->ops->computevectors = EPSComputeVectors_Power;
1295 374 eps->ops->setdefaultst = EPSSetDefaultST_Power;
1296 374 eps->stopping = EPSStopping_Power;
1297 374 ctx->sign_normalization = PETSC_TRUE;
1298
1299
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
374 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSPowerSetShiftType_C",EPSPowerSetShiftType_Power));
1300
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
374 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSPowerGetShiftType_C",EPSPowerGetShiftType_Power));
1301
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
374 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSPowerSetNonlinear_C",EPSPowerSetNonlinear_Power));
1302
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
374 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSPowerGetNonlinear_C",EPSPowerGetNonlinear_Power));
1303
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
374 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSPowerSetUpdate_C",EPSPowerSetUpdate_Power));
1304
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
374 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSPowerGetUpdate_C",EPSPowerGetUpdate_Power));
1305
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
374 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSPowerSetSignNormalization_C",EPSPowerSetSignNormalization_Power));
1306
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
374 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSPowerGetSignNormalization_C",EPSPowerGetSignNormalization_Power));
1307
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
374 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSPowerSetSNES_C",EPSPowerSetSNES_Power));
1308
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
374 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSPowerGetSNES_C",EPSPowerGetSNES_Power));
1309
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
94 PetscFunctionReturn(PETSC_SUCCESS);
1310 }
1311