GCC Code Coverage Report


Directory: ./
File: src/pep/interface/pepdefault.c
Date: 2025-12-10 04:20:18
Exec Total Coverage
Lines: 233 250 93.2%
Functions: 11 11 100.0%
Branches: 569 975 58.4%

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 Simple default routines for common PEP operations
12 */
13
14 #include <slepc/private/pepimpl.h> /*I "slepcpep.h" I*/
15
16 /*@
17 PEPSetWorkVecs - Sets a number of work vectors into a `PEP` object.
18
19 Collective
20
21 Input Parameters:
22 + pep - the polynomial eigensolver context
23 - nw - number of work vectors to allocate
24
25 Developer Note:
26 This is `SLEPC_EXTERN` because it may be required by user plugin `PEP`
27 implementations.
28
29 Level: developer
30
31 .seealso: [](ch:pep), `PEPSetUp()`
32 @*/
33 12135 PetscErrorCode PEPSetWorkVecs(PEP pep,PetscInt nw)
34 {
35 12135 Vec t;
36
37
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
12135 PetscFunctionBegin;
38
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.
12135 PetscValidHeaderSpecific(pep,PEP_CLASSID,1);
39
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.
12135 PetscValidLogicalCollectiveInt(pep,nw,2);
40
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
12135 PetscCheck(nw>0,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_OUTOFRANGE,"nw must be > 0: nw = %" PetscInt_FMT,nw);
41
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
12135 if (pep->nwork < nw) {
42
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2597 PetscCall(VecDestroyVecs(pep->nwork,&pep->work));
43 2597 pep->nwork = nw;
44
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2597 PetscCall(BVGetColumn(pep->V,0,&t));
45
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2597 PetscCall(VecDuplicateVecs(t,nw,&pep->work));
46
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2597 PetscCall(BVRestoreColumn(pep->V,0,&t));
47 }
48
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.
2378 PetscFunctionReturn(PETSC_SUCCESS);
49 }
50
51 /*
52 PEPConvergedRelative - Checks convergence relative to the eigenvalue.
53 */
54 26849 PetscErrorCode PEPConvergedRelative(PEP pep,PetscScalar eigr,PetscScalar eigi,PetscReal res,PetscReal *errest,void *ctx)
55 {
56 26849 PetscReal w;
57
58
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
26849 PetscFunctionBegin;
59 26849 w = SlepcAbsEigenvalue(eigr,eigi);
60
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
26849 *errest = (w!=0.0)? res/w: PETSC_MAX_REAL;
61
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.
26849 PetscFunctionReturn(PETSC_SUCCESS);
62 }
63
64 /*
65 PEPConvergedNorm - Checks convergence relative to the matrix norms.
66 */
67 145 PetscErrorCode PEPConvergedNorm(PEP pep,PetscScalar eigr,PetscScalar eigi,PetscReal res,PetscReal *errest,void *ctx)
68 {
69 145 PetscReal w=0.0,t;
70 145 PetscInt j;
71 145 PetscBool flg;
72
73
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
145 PetscFunctionBegin;
74 /* initialization of matrix norms */
75
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
145 if (!pep->nrma[pep->nmat-1]) {
76
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
60 for (j=0;j<pep->nmat;j++) {
77
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
45 PetscCall(MatHasOperation(pep->A[j],MATOP_NORM,&flg));
78
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
45 PetscCheck(flg,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_WRONG,"The convergence test related to the matrix norms requires a matrix norm operation");
79
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
45 PetscCall(MatNorm(pep->A[j],NORM_INFINITY,&pep->nrma[j]));
80 }
81 }
82 145 t = SlepcAbsEigenvalue(eigr,eigi);
83
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
580 for (j=pep->nmat-1;j>=0;j--) {
84 435 w = w*t+pep->nrma[j];
85 }
86 145 *errest = res/w;
87
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.
145 PetscFunctionReturn(PETSC_SUCCESS);
88 }
89
90 /*
91 PEPSetWhichEigenpairs_Default - Sets the default value for which,
92 depending on the ST.
93 */
94 768 PetscErrorCode PEPSetWhichEigenpairs_Default(PEP pep)
95 {
96 768 PetscBool target;
97
98
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
768 PetscFunctionBegin;
99
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
768 PetscCall(PetscObjectTypeCompare((PetscObject)pep->st,STSINVERT,&target));
100
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
768 if (target) pep->which = PEP_TARGET_MAGNITUDE;
101 588 else pep->which = PEP_LARGEST_MAGNITUDE;
102
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.
149 PetscFunctionReturn(PETSC_SUCCESS);
103 }
104
105 /*
106 PEPConvergedAbsolute - Checks convergence absolutely.
107 */
108 351 PetscErrorCode PEPConvergedAbsolute(PEP pep,PetscScalar eigr,PetscScalar eigi,PetscReal res,PetscReal *errest,void *ctx)
109 {
110
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
351 PetscFunctionBegin;
111 351 *errest = res;
112
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.
351 PetscFunctionReturn(PETSC_SUCCESS);
113 }
114
115 /*@C
116 PEPStoppingBasic - Default routine to determine whether the outer eigensolver
117 iteration must be stopped.
118
119 Collective
120
121 Input Parameters:
122 + pep - the polynomial eigensolver context
123 . its - current number of iterations
124 . max_it - maximum number of iterations
125 . nconv - number of currently converged eigenpairs
126 . nev - number of requested eigenpairs
127 - ctx - context (not used here)
128
129 Output Parameter:
130 . reason - result of the stopping test
131
132 Notes:
133 `PEPStoppingBasic()` will stop if all requested eigenvalues are converged, or if
134 the maximum number of iterations has been reached.
135
136 This is the default stopping test.
137 Use `PEPSetStoppingTest()` to provide your own test instead of using this one.
138
139 Level: advanced
140
141 .seealso: [](ch:pep), `PEPSetStoppingTest()`, `PEPConvergedReason`, `PEPGetConvergedReason()`
142 @*/
143 16404 PetscErrorCode PEPStoppingBasic(PEP pep,PetscInt its,PetscInt max_it,PetscInt nconv,PetscInt nev,PEPConvergedReason *reason,void *ctx)
144 {
145
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
16404 PetscFunctionBegin;
146 16404 *reason = PEP_CONVERGED_ITERATING;
147
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
16404 if (nconv >= nev) {
148
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1625 PetscCall(PetscInfo(pep,"Polynomial eigensolver finished successfully: %" PetscInt_FMT " eigenpairs converged at iteration %" PetscInt_FMT "\n",nconv,its));
149 1625 *reason = PEP_CONVERGED_TOL;
150
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
14779 } else if (its >= max_it) {
151 10 *reason = PEP_DIVERGED_ITS;
152
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(PetscInfo(pep,"Polynomial eigensolver iteration reached maximum number of iterations (%" PetscInt_FMT ")\n",its));
153 }
154
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.
3228 PetscFunctionReturn(PETSC_SUCCESS);
155 }
156
157 1183 PetscErrorCode PEPBackTransform_Default(PEP pep)
158 {
159
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1183 PetscFunctionBegin;
160
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1183 PetscCall(STBackTransform(pep->st,pep->nconv,pep->eigr,pep->eigi));
161
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.
229 PetscFunctionReturn(PETSC_SUCCESS);
162 }
163
164 1756 PetscErrorCode PEPComputeVectors_Default(PEP pep)
165 {
166 1756 PetscInt i;
167 1756 Vec v;
168
169
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1756 PetscFunctionBegin;
170
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1756 PetscCall(PEPExtractVectors(pep));
171
172 /* Fix eigenvectors if balancing was used */
173
5/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
1756 if ((pep->scale==PEP_SCALE_DIAGONAL || pep->scale==PEP_SCALE_BOTH) && pep->Dr && (pep->refine!=PEP_REFINE_MULTIPLE)) {
174
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
972 for (i=0;i<pep->nconv;i++) {
175
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
828 PetscCall(BVGetColumn(pep->V,i,&v));
176
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
828 PetscCall(VecPointwiseMult(v,v,pep->Dr));
177
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
828 PetscCall(BVRestoreColumn(pep->V,i,&v));
178 }
179 }
180
181 /* normalization */
182
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1756 PetscCall(BVNormalize(pep->V,pep->eigi));
183
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.
342 PetscFunctionReturn(PETSC_SUCCESS);
184 }
185
186 /*
187 PEPBuildDiagonalScaling - compute two diagonal matrices to be applied for balancing
188 in polynomial eigenproblems.
189 */
190 184 PetscErrorCode PEPBuildDiagonalScaling(PEP pep)
191 {
192 184 PetscInt it,i,j,k,nmat,nr,e,nz,lst,lend,nc=0,*cols,emax,emin,emaxl,eminl;
193 184 const PetscInt *cidx,*ridx;
194 184 Mat M,*T,A;
195 184 PetscMPIInt n;
196 184 PetscBool cont=PETSC_TRUE,flg=PETSC_FALSE;
197 184 PetscScalar *array,*Dr,*Dl,t;
198 184 PetscReal l2,d,*rsum,*aux,*csum,w=1.0;
199 184 MatStructure str;
200 184 MatInfo info;
201
202
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
184 PetscFunctionBegin;
203 184 l2 = 2*PetscLogReal(2.0);
204 184 nmat = pep->nmat;
205
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(PetscMPIIntCast(pep->n,&n));
206
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(STGetMatStructure(pep->st,&str));
207
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(PetscMalloc1(nmat,&T));
208
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
736 for (k=0;k<nmat;k++) PetscCall(STGetMatrixTransformed(pep->st,k,&T[k]));
209 /* Form local auxiliary matrix M */
210
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(PetscObjectBaseTypeCompareAny((PetscObject)T[0],&cont,MATMPIAIJ,MATSEQAIJ,""));
211
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
184 PetscCheck(cont,PetscObjectComm((PetscObject)T[0]),PETSC_ERR_SUP,"Only for MPIAIJ or SEQAIJ matrix types");
212
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(PetscObjectBaseTypeCompare((PetscObject)T[0],MATMPIAIJ,&cont));
213
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
184 if (cont) {
214
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
120 PetscCall(MatMPIAIJGetLocalMat(T[0],MAT_INITIAL_MATRIX,&M));
215 flg = PETSC_TRUE;
216
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
64 } else PetscCall(MatDuplicate(T[0],MAT_COPY_VALUES,&M));
217
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(MatGetInfo(M,MAT_LOCAL,&info));
218 184 nz = (PetscInt)info.nz_used;
219
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(MatSeqAIJGetArray(M,&array));
220
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
8284 for (i=0;i<nz;i++) {
221 8100 t = PetscAbsScalar(array[i]);
222 8100 array[i] = t*t;
223 }
224
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(MatSeqAIJRestoreArray(M,&array));
225
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
552 for (k=1;k<nmat;k++) {
226
6/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
368 if (flg) PetscCall(MatMPIAIJGetLocalMat(T[k],MAT_INITIAL_MATRIX,&A));
227 else {
228
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 10 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.
128 if (str==SAME_NONZERO_PATTERN) PetscCall(MatCopy(T[k],A,SAME_NONZERO_PATTERN));
229
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
128 else PetscCall(MatDuplicate(T[k],MAT_COPY_VALUES,&A));
230 }
231
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
368 PetscCall(MatGetInfo(A,MAT_LOCAL,&info));
232 368 nz = (PetscInt)info.nz_used;
233
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
368 PetscCall(MatSeqAIJGetArray(A,&array));
234
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
12444 for (i=0;i<nz;i++) {
235 12076 t = PetscAbsScalar(array[i]);
236 12076 array[i] = t*t;
237 }
238
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
368 PetscCall(MatSeqAIJRestoreArray(A,&array));
239 368 w *= pep->slambda*pep->slambda*pep->sfactor;
240
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
368 PetscCall(MatAXPY(M,w,A,str));
241
7/12
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
368 if (flg || str!=SAME_NONZERO_PATTERN || k==nmat-2) PetscCall(MatDestroy(&A));
242 }
243
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(MatGetRowIJ(M,0,PETSC_FALSE,PETSC_FALSE,&nr,&ridx,&cidx,&cont));
244
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
184 PetscCheck(cont,PetscObjectComm((PetscObject)T[0]),PETSC_ERR_SUP,"It is not possible to compute scaling diagonals for these PEP matrices");
245
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(MatGetInfo(M,MAT_LOCAL,&info));
246 184 nz = (PetscInt)info.nz_used;
247
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(VecGetOwnershipRange(pep->Dl,&lst,&lend));
248
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(PetscMalloc4(nr,&rsum,pep->n,&csum,pep->n,&aux,PetscMin(pep->n-lend+lst,nz),&cols));
249
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(VecSet(pep->Dr,1.0));
250
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(VecSet(pep->Dl,1.0));
251
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(VecGetArray(pep->Dl,&Dl));
252
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(VecGetArray(pep->Dr,&Dr));
253
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(MatSeqAIJGetArray(M,&array));
254
4/6
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(PetscArrayzero(aux,pep->n));
255
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
8744 for (j=0;j<nz;j++) {
256 /* Search non-zero columns outsize lst-lend */
257
6/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
8560 if (aux[cidx[j]]==0 && (cidx[j]<lst || lend<=cidx[j])) cols[nc++] = cidx[j];
258 /* Local column sums */
259 8560 aux[cidx[j]] += PetscAbsScalar(array[j]);
260 }
261
3/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
552 for (it=0;it<pep->sits && cont;it++) {
262 368 emaxl = 0; eminl = 0;
263 /* Column sum */
264
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
368 if (it>0) { /* it=0 has been already done*/
265
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(MatSeqAIJGetArray(M,&array));
266
4/6
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(PetscArrayzero(aux,pep->n));
267
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
8744 for (j=0;j<nz;j++) aux[cidx[j]] += PetscAbsScalar(array[j]);
268
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(MatSeqAIJRestoreArray(M,&array));
269 }
270
28/58
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 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.
368 PetscCallMPI(MPIU_Allreduce(aux,csum,n,MPIU_REAL,MPIU_SUM,PetscObjectComm((PetscObject)pep->Dr)));
271 /* Update Dr */
272
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6480 for (j=lst;j<lend;j++) {
273 6112 d = PetscLogReal(csum[j])/l2;
274
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6112 e = -(PetscInt)((d < 0)?(d-0.5):(d+0.5));
275 6112 d = PetscPowReal(2.0,e);
276 6112 Dr[j-lst] *= d;
277 6112 aux[j] = d*d;
278 6112 emaxl = PetscMax(emaxl,e);
279 6112 eminl = PetscMin(eminl,e);
280 }
281
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
648 for (j=0;j<nc;j++) {
282 280 d = PetscLogReal(csum[cols[j]])/l2;
283
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
280 e = -(PetscInt)((d < 0)?(d-0.5):(d+0.5));
284 280 d = PetscPowReal(2.0,e);
285 280 aux[cols[j]] = d*d;
286 280 emaxl = PetscMax(emaxl,e);
287 280 eminl = PetscMin(eminl,e);
288 }
289 /* Scale M */
290
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
368 PetscCall(MatSeqAIJGetArray(M,&array));
291
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
17488 for (j=0;j<nz;j++) {
292 17120 array[j] *= aux[cidx[j]];
293 }
294
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
368 PetscCall(MatSeqAIJRestoreArray(M,&array));
295 /* Row sum */
296
4/6
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
368 PetscCall(PetscArrayzero(rsum,nr));
297
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
368 PetscCall(MatSeqAIJGetArray(M,&array));
298
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6480 for (i=0;i<nr;i++) {
299
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
23232 for (j=ridx[i];j<ridx[i+1];j++) rsum[i] += PetscAbsScalar(array[j]);
300 /* Update Dl */
301 6112 d = PetscLogReal(rsum[i])/l2;
302
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6112 e = -(PetscInt)((d < 0)?(d-0.5):(d+0.5));
303 6112 d = PetscPowReal(2.0,e);
304 6112 Dl[i] *= d;
305 /* Scale M */
306
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
23232 for (j=ridx[i];j<ridx[i+1];j++) array[j] *= d*d;
307 6112 emaxl = PetscMax(emaxl,e);
308 6112 eminl = PetscMin(eminl,e);
309 }
310
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
368 PetscCall(MatSeqAIJRestoreArray(M,&array));
311 /* Compute global max and min */
312
28/58
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 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.
368 PetscCallMPI(MPIU_Allreduce(&emaxl,&emax,1,MPIU_INT,MPI_MAX,PetscObjectComm((PetscObject)pep->Dl)));
313
28/58
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 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.
368 PetscCallMPI(MPIU_Allreduce(&eminl,&emin,1,MPIU_INT,MPI_MIN,PetscObjectComm((PetscObject)pep->Dl)));
314
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
368 if (emax<=emin+2) cont = PETSC_FALSE;
315 }
316
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(VecRestoreArray(pep->Dr,&Dr));
317
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(VecRestoreArray(pep->Dl,&Dl));
318 /* Free memory*/
319
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(MatDestroy(&M));
320
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(PetscFree4(rsum,csum,aux,cols));
321
5/8
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
184 PetscCall(PetscFree(T));
322
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);
323 }
324
325 /*
326 PEPComputeScaleFactor - compute sfactor as described in [Betcke 2008].
327 */
328 2369 PetscErrorCode PEPComputeScaleFactor(PEP pep)
329 {
330 2369 PetscBool has0,has1,flg;
331 2369 PetscReal norm0,norm1;
332 2369 Mat T[2];
333 2369 PEPBasis basis;
334 2369 PetscInt i;
335
336
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2369 PetscFunctionBegin;
337
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2369 if (pep->scale==PEP_SCALE_NONE || pep->scale==PEP_SCALE_DIAGONAL) { /* no scalar scaling */
338 2248 pep->sfactor = 1.0;
339 2248 pep->dsfactor = 1.0;
340
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.
2248 PetscFunctionReturn(PETSC_SUCCESS);
341 }
342
8/14
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 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.
121 if (pep->sfactor_set) PetscFunctionReturn(PETSC_SUCCESS); /* user provided value */
343 105 pep->sfactor = 1.0;
344 105 pep->dsfactor = 1.0;
345
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
105 PetscCall(PEPGetBasis(pep,&basis));
346
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
105 if (basis==PEP_BASIS_MONOMIAL) {
347
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
105 PetscCall(STGetTransform(pep->st,&flg));
348
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
105 if (flg) {
349
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
15 PetscCall(STGetMatrixTransformed(pep->st,0,&T[0]));
350
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
15 PetscCall(STGetMatrixTransformed(pep->st,pep->nmat-1,&T[1]));
351 } else {
352 90 T[0] = pep->A[0];
353 90 T[1] = pep->A[pep->nmat-1];
354 }
355
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
105 if (pep->nmat>2) {
356
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
105 PetscCall(MatHasOperation(T[0],MATOP_NORM,&has0));
357
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
105 PetscCall(MatHasOperation(T[1],MATOP_NORM,&has1));
358
2/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
105 if (has0 && has1) {
359
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
105 PetscCall(MatNorm(T[0],NORM_INFINITY,&norm0));
360
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
105 PetscCall(MatNorm(T[1],NORM_INFINITY,&norm1));
361 105 pep->sfactor = PetscPowReal(norm0/norm1,1.0/(pep->nmat-1));
362 105 pep->dsfactor = norm1;
363
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
210 for (i=pep->nmat-2;i>0;i--) {
364
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
105 PetscCall(STGetMatrixTransformed(pep->st,i,&T[1]));
365
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
105 PetscCall(MatHasOperation(T[1],MATOP_NORM,&has1));
366
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
105 if (has1) {
367
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
105 PetscCall(MatNorm(T[1],NORM_INFINITY,&norm1));
368 105 pep->dsfactor = pep->dsfactor*pep->sfactor+norm1;
369 } else break;
370 }
371
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
105 if (has1) {
372 105 pep->dsfactor = pep->dsfactor*pep->sfactor+norm0;
373 105 pep->dsfactor = pep->nmat/pep->dsfactor;
374 } else pep->dsfactor = 1.0;
375 }
376 }
377 }
378
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.
21 PetscFunctionReturn(PETSC_SUCCESS);
379 }
380
381 /*
382 PEPBasisCoefficients - compute polynomial basis coefficients
383 */
384 1458 PetscErrorCode PEPBasisCoefficients(PEP pep,PetscReal *pbc)
385 {
386 1458 PetscReal *ca,*cb,*cg;
387 1458 PetscInt k,nmat=pep->nmat;
388
389
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1458 PetscFunctionBegin;
390 1458 ca = pbc;
391 1458 cb = pbc+nmat;
392 1458 cg = pbc+2*nmat;
393
2/7
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
1458 switch (pep->basis) {
394 case PEP_BASIS_MONOMIAL:
395
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4908 for (k=0;k<nmat;k++) {
396 3716 ca[k] = 1.0; cb[k] = 0.0; cg[k] = 0.0;
397 }
398 break;
399 266 case PEP_BASIS_CHEBYSHEV1:
400 266 ca[0] = 1.0; cb[0] = 0.0; cg[0] = 0.0;
401
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2056 for (k=1;k<nmat;k++) {
402 1790 ca[k] = .5; cb[k] = 0.0; cg[k] = .5;
403 }
404 break;
405 case PEP_BASIS_CHEBYSHEV2:
406 ca[0] = .5; cb[0] = 0.0; cg[0] = 0.0;
407 for (k=1;k<nmat;k++) {
408 ca[k] = .5; cb[k] = 0.0; cg[k] = .5;
409 }
410 break;
411 case PEP_BASIS_LEGENDRE:
412 ca[0] = 1.0; cb[0] = 0.0; cg[0] = 0.0;
413 for (k=1;k<nmat;k++) {
414 ca[k] = k+1; cb[k] = -2*k; cg[k] = k;
415 }
416 break;
417 case PEP_BASIS_LAGUERRE:
418 ca[0] = -1.0; cb[0] = 0.0; cg[0] = 0.0;
419 for (k=1;k<nmat;k++) {
420 ca[k] = -(k+1); cb[k] = 2*k+1; cg[k] = -k;
421 }
422 break;
423 case PEP_BASIS_HERMITE:
424 ca[0] = .5; cb[0] = 0.0; cg[0] = 0.0;
425 for (k=1;k<nmat;k++) {
426 ca[k] = .5; cb[k] = 0.0; cg[k] = -k;
427 }
428 break;
429 }
430
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.
1458 PetscFunctionReturn(PETSC_SUCCESS);
431 }
432