GCC Code Coverage Report


Directory: ./
File: src/pep/interface/pepdefault.c
Date: 2025-10-03 04:28:47
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 - polynomial eigensolver context
23 - nw - number of work vectors to allocate
24
25 Developer Notes:
26 This is SLEPC_EXTERN because it may be required by user plugin PEP
27 implementations.
28
29 Level: developer
30
31 .seealso: 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 - eigensolver context obtained from PEPCreate()
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 A positive value of reason indicates that the iteration has finished successfully
134 (converged), and a negative value indicates an error condition (diverged). If
135 the iteration needs to be continued, reason must be set to PEP_CONVERGED_ITERATING
136 (zero).
137
138 PEPStoppingBasic() will stop if all requested eigenvalues are converged, or if
139 the maximum number of iterations has been reached.
140
141 Use PEPSetStoppingTest() to provide your own test instead of using this one.
142
143 Level: advanced
144
145 .seealso: PEPSetStoppingTest(), PEPConvergedReason, PEPGetConvergedReason()
146 @*/
147 16404 PetscErrorCode PEPStoppingBasic(PEP pep,PetscInt its,PetscInt max_it,PetscInt nconv,PetscInt nev,PEPConvergedReason *reason,void *ctx)
148 {
149
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
16404 PetscFunctionBegin;
150 16404 *reason = PEP_CONVERGED_ITERATING;
151
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
16404 if (nconv >= nev) {
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.
1625 PetscCall(PetscInfo(pep,"Polynomial eigensolver finished successfully: %" PetscInt_FMT " eigenpairs converged at iteration %" PetscInt_FMT "\n",nconv,its));
153 1625 *reason = PEP_CONVERGED_TOL;
154
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
14779 } else if (its >= max_it) {
155 10 *reason = PEP_DIVERGED_ITS;
156
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));
157 }
158
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);
159 }
160
161 1183 PetscErrorCode PEPBackTransform_Default(PEP pep)
162 {
163
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1183 PetscFunctionBegin;
164
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));
165
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);
166 }
167
168 1756 PetscErrorCode PEPComputeVectors_Default(PEP pep)
169 {
170 1756 PetscInt i;
171 1756 Vec v;
172
173
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1756 PetscFunctionBegin;
174
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));
175
176 /* Fix eigenvectors if balancing was used */
177
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)) {
178
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
972 for (i=0;i<pep->nconv;i++) {
179
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));
180
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));
181
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));
182 }
183 }
184
185 /* normalization */
186
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));
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.
342 PetscFunctionReturn(PETSC_SUCCESS);
188 }
189
190 /*
191 PEPBuildDiagonalScaling - compute two diagonal matrices to be applied for balancing
192 in polynomial eigenproblems.
193 */
194 184 PetscErrorCode PEPBuildDiagonalScaling(PEP pep)
195 {
196 184 PetscInt it,i,j,k,nmat,nr,e,nz,lst,lend,nc=0,*cols,emax,emin,emaxl,eminl;
197 184 const PetscInt *cidx,*ridx;
198 184 Mat M,*T,A;
199 184 PetscMPIInt n;
200 184 PetscBool cont=PETSC_TRUE,flg=PETSC_FALSE;
201 184 PetscScalar *array,*Dr,*Dl,t;
202 184 PetscReal l2,d,*rsum,*aux,*csum,w=1.0;
203 184 MatStructure str;
204 184 MatInfo info;
205
206
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
184 PetscFunctionBegin;
207 184 l2 = 2*PetscLogReal(2.0);
208 184 nmat = pep->nmat;
209
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));
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(STGetMatStructure(pep->st,&str));
211
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));
212
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]));
213 /* Form local auxiliary matrix M */
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.
184 PetscCall(PetscObjectBaseTypeCompareAny((PetscObject)T[0],&cont,MATMPIAIJ,MATSEQAIJ,""));
215
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");
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.
184 PetscCall(PetscObjectBaseTypeCompare((PetscObject)T[0],MATMPIAIJ,&cont));
217
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
184 if (cont) {
218
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));
219 flg = PETSC_TRUE;
220
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));
221
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));
222 184 nz = (PetscInt)info.nz_used;
223
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));
224
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
8284 for (i=0;i<nz;i++) {
225 8100 t = PetscAbsScalar(array[i]);
226 8100 array[i] = t*t;
227 }
228
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));
229
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
552 for (k=1;k<nmat;k++) {
230
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));
231 else {
232
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));
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.
128 else PetscCall(MatDuplicate(T[k],MAT_COPY_VALUES,&A));
234 }
235
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));
236 368 nz = (PetscInt)info.nz_used;
237
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));
238
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
12444 for (i=0;i<nz;i++) {
239 12076 t = PetscAbsScalar(array[i]);
240 12076 array[i] = t*t;
241 }
242
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));
243 368 w *= pep->slambda*pep->slambda*pep->sfactor;
244
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));
245
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));
246 }
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(MatGetRowIJ(M,0,PETSC_FALSE,PETSC_FALSE,&nr,&ridx,&cidx,&cont));
248
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");
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(MatGetInfo(M,MAT_LOCAL,&info));
250 184 nz = (PetscInt)info.nz_used;
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(VecGetOwnershipRange(pep->Dl,&lst,&lend));
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(PetscMalloc4(nr,&rsum,pep->n,&csum,pep->n,&aux,PetscMin(pep->n-lend+lst,nz),&cols));
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(VecSet(pep->Dr,1.0));
254
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));
255
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));
256
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));
257
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));
258
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));
259
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
8744 for (j=0;j<nz;j++) {
260 /* Search non-zero columns outsize lst-lend */
261
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];
262 /* Local column sums */
263 8560 aux[cidx[j]] += PetscAbsScalar(array[j]);
264 }
265
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++) {
266 368 emaxl = 0; eminl = 0;
267 /* Column sum */
268
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
368 if (it>0) { /* it=0 has been already done*/
269
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));
270
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));
271
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]);
272
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));
273 }
274
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)));
275 /* Update Dr */
276
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6480 for (j=lst;j<lend;j++) {
277 6112 d = PetscLogReal(csum[j])/l2;
278
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6112 e = -(PetscInt)((d < 0)?(d-0.5):(d+0.5));
279 6112 d = PetscPowReal(2.0,e);
280 6112 Dr[j-lst] *= d;
281 6112 aux[j] = d*d;
282 6112 emaxl = PetscMax(emaxl,e);
283 6112 eminl = PetscMin(eminl,e);
284 }
285
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
648 for (j=0;j<nc;j++) {
286 280 d = PetscLogReal(csum[cols[j]])/l2;
287
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
280 e = -(PetscInt)((d < 0)?(d-0.5):(d+0.5));
288 280 d = PetscPowReal(2.0,e);
289 280 aux[cols[j]] = d*d;
290 280 emaxl = PetscMax(emaxl,e);
291 280 eminl = PetscMin(eminl,e);
292 }
293 /* Scale M */
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(MatSeqAIJGetArray(M,&array));
295
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
17488 for (j=0;j<nz;j++) {
296 17120 array[j] *= aux[cidx[j]];
297 }
298
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));
299 /* Row sum */
300
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));
301
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));
302
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6480 for (i=0;i<nr;i++) {
303
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]);
304 /* Update Dl */
305 6112 d = PetscLogReal(rsum[i])/l2;
306
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6112 e = -(PetscInt)((d < 0)?(d-0.5):(d+0.5));
307 6112 d = PetscPowReal(2.0,e);
308 6112 Dl[i] *= d;
309 /* Scale M */
310
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;
311 6112 emaxl = PetscMax(emaxl,e);
312 6112 eminl = PetscMin(eminl,e);
313 }
314
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));
315 /* Compute global max and min */
316
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)));
317
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)));
318
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
368 if (emax<=emin+2) cont = PETSC_FALSE;
319 }
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(VecRestoreArray(pep->Dr,&Dr));
321
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));
322 /* Free memory*/
323
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));
324
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));
325
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));
326
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);
327 }
328
329 /*
330 PEPComputeScaleFactor - compute sfactor as described in [Betcke 2008].
331 */
332 2369 PetscErrorCode PEPComputeScaleFactor(PEP pep)
333 {
334 2369 PetscBool has0,has1,flg;
335 2369 PetscReal norm0,norm1;
336 2369 Mat T[2];
337 2369 PEPBasis basis;
338 2369 PetscInt i;
339
340
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2369 PetscFunctionBegin;
341
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 */
342 2248 pep->sfactor = 1.0;
343 2248 pep->dsfactor = 1.0;
344
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);
345 }
346
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 */
347 105 pep->sfactor = 1.0;
348 105 pep->dsfactor = 1.0;
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.
105 PetscCall(PEPGetBasis(pep,&basis));
350
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
105 if (basis==PEP_BASIS_MONOMIAL) {
351
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));
352
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
105 if (flg) {
353
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]));
354
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]));
355 } else {
356 90 T[0] = pep->A[0];
357 90 T[1] = pep->A[pep->nmat-1];
358 }
359
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
105 if (pep->nmat>2) {
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(MatHasOperation(T[0],MATOP_NORM,&has0));
361
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));
362
2/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
105 if (has0 && has1) {
363
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));
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(MatNorm(T[1],NORM_INFINITY,&norm1));
365 105 pep->sfactor = PetscPowReal(norm0/norm1,1.0/(pep->nmat-1));
366 105 pep->dsfactor = norm1;
367
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
210 for (i=pep->nmat-2;i>0;i--) {
368
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]));
369
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));
370
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
105 if (has1) {
371
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));
372 105 pep->dsfactor = pep->dsfactor*pep->sfactor+norm1;
373 } else break;
374 }
375
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
105 if (has1) {
376 105 pep->dsfactor = pep->dsfactor*pep->sfactor+norm0;
377 105 pep->dsfactor = pep->nmat/pep->dsfactor;
378 } else pep->dsfactor = 1.0;
379 }
380 }
381 }
382
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);
383 }
384
385 /*
386 PEPBasisCoefficients - compute polynomial basis coefficients
387 */
388 1458 PetscErrorCode PEPBasisCoefficients(PEP pep,PetscReal *pbc)
389 {
390 1458 PetscReal *ca,*cb,*cg;
391 1458 PetscInt k,nmat=pep->nmat;
392
393
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1458 PetscFunctionBegin;
394 1458 ca = pbc;
395 1458 cb = pbc+nmat;
396 1458 cg = pbc+2*nmat;
397
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) {
398 case PEP_BASIS_MONOMIAL:
399
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4908 for (k=0;k<nmat;k++) {
400 3716 ca[k] = 1.0; cb[k] = 0.0; cg[k] = 0.0;
401 }
402 break;
403 266 case PEP_BASIS_CHEBYSHEV1:
404 266 ca[0] = 1.0; cb[0] = 0.0; cg[0] = 0.0;
405
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2056 for (k=1;k<nmat;k++) {
406 1790 ca[k] = .5; cb[k] = 0.0; cg[k] = .5;
407 }
408 break;
409 case PEP_BASIS_CHEBYSHEV2:
410 ca[0] = .5; cb[0] = 0.0; cg[0] = 0.0;
411 for (k=1;k<nmat;k++) {
412 ca[k] = .5; cb[k] = 0.0; cg[k] = .5;
413 }
414 break;
415 case PEP_BASIS_LEGENDRE:
416 ca[0] = 1.0; cb[0] = 0.0; cg[0] = 0.0;
417 for (k=1;k<nmat;k++) {
418 ca[k] = k+1; cb[k] = -2*k; cg[k] = k;
419 }
420 break;
421 case PEP_BASIS_LAGUERRE:
422 ca[0] = -1.0; cb[0] = 0.0; cg[0] = 0.0;
423 for (k=1;k<nmat;k++) {
424 ca[k] = -(k+1); cb[k] = 2*k+1; cg[k] = -k;
425 }
426 break;
427 case PEP_BASIS_HERMITE:
428 ca[0] = .5; cb[0] = 0.0; cg[0] = 0.0;
429 for (k=1;k<nmat;k++) {
430 ca[k] = .5; cb[k] = 0.0; cg[k] = -k;
431 }
432 break;
433 }
434
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);
435 }
436