GCC Code Coverage Report


Directory: ./
File: src/pep/impls/peputils.c
Date: 2026-01-12 03:57:26
Exec Total Coverage
Lines: 55 55 100.0%
Functions: 3 3 100.0%
Branches: 94 140 67.1%

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 Common subroutines for several PEP solvers
12 */
13
14 #include <slepc/private/pepimpl.h> /*I "slepcpep.h" I*/
15 #include <slepcblaslapack.h>
16
17 /*
18 Computes T_j=phy_idx(T) for a matrix T.
19 Tp (if j>0) and Tpp (if j>1) are the evaluation
20 of phy_(j-1) and phy(j-2)respectively.
21 */
22 563 PetscErrorCode PEPEvaluateBasisMat(PEP pep,PetscInt k,PetscScalar *T,PetscInt ldt,PetscInt idx,PetscScalar *Tpp,PetscInt ldtpp,PetscScalar *Tp,PetscInt ldtp,PetscScalar *Tj,PetscInt ldtj)
23 {
24 563 PetscInt i;
25 563 PetscReal *ca,*cb,*cg;
26 563 PetscScalar g,a;
27 563 PetscBLASInt k_,ldt_,ldtj_,ldtp_;
28
29
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
563 PetscFunctionBegin;
30
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
563 if (idx==0) {
31
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
522 for (i=0;i<k;i++) {
32
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.
341 PetscCall(PetscArrayzero(Tj+i*ldtj,k));
33 341 Tj[i+i*ldtj] = 1.0;
34 }
35 } else {
36
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.
382 PetscCall(PetscBLASIntCast(ldt,&ldt_));
37
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.
382 PetscCall(PetscBLASIntCast(ldtj,&ldtj_));
38
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.
382 PetscCall(PetscBLASIntCast(ldtp,&ldtp_));
39
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.
382 PetscCall(PetscBLASIntCast(k,&k_));
40 382 ca = pep->pbc; cb = pep->pbc+pep->nmat; cg = pep->pbc+2*pep->nmat;
41
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1084 for (i=0;i<k;i++) T[i*ldt+i] -= cb[idx-1];
42
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
382 if (idx>1) {
43
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.
562 for (i=0;i<k;i++) PetscCall(PetscArraycpy(Tj+i*ldtj,Tpp+i*ldtpp,k));
44 }
45 382 a = 1/ca[idx-1];
46
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
382 g = (idx==1)?0.0:-cg[idx-1]/ca[idx-1];
47
10/20
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 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.
382 PetscCallBLAS("BLASgemm",BLASgemm_("N","N",&k_,&k_,&k_,&a,T,&ldt_,Tp,&ldtp_,&g,Tj,&ldtj_));
48
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1084 for (i=0;i<k;i++) T[i*ldt+i] += cb[idx-1];
49 }
50
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.
112 PetscFunctionReturn(PETSC_SUCCESS);
51 }
52
53 /*
54 PEPEvaluateBasis - evaluate the polynomial basis on a given parameter sigma
55 */
56 50707 PetscErrorCode PEPEvaluateBasis(PEP pep,PetscScalar sigma,PetscScalar isigma,PetscScalar *vals,PetscScalar *ivals)
57 {
58 50707 PetscInt nmat=pep->nmat,k;
59 50707 PetscReal *a=pep->pbc,*b=pep->pbc+nmat,*g=pep->pbc+2*nmat;
60
61
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
50707 PetscFunctionBegin;
62
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
207666 if (ivals) for (k=0;k<nmat;k++) ivals[k] = 0.0;
63 50707 vals[0] = 1.0;
64 50707 vals[1] = (sigma-b[0])/a[0];
65 #if !defined(PETSC_USE_COMPLEX)
66
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
21756 if (ivals) ivals[1] = isigma/a[0];
67 #endif
68
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
126945 for (k=2;k<nmat;k++) {
69 76238 vals[k] = ((sigma-b[k-1])*vals[k-1]-g[k-1]*vals[k-2])/a[k-1];
70
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
76238 if (ivals) vals[k] -= isigma*ivals[k-1]/a[k-1];
71 #if !defined(PETSC_USE_COMPLEX)
72 27728 if (ivals) ivals[k] = ((sigma-b[k-1])*ivals[k-1]+isigma*vals[k-1]-g[k-1]*ivals[k-2])/a[k-1];
73 #endif
74 }
75
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.
50707 PetscFunctionReturn(PETSC_SUCCESS);
76 }
77
78 /*
79 PEPEvaluateBasisDerivative - evaluate the derivative of the polynomial basis on a given parameter sigma
80 */
81 5314 PetscErrorCode PEPEvaluateBasisDerivative(PEP pep,PetscScalar sigma,PetscScalar isigma,PetscScalar *vals,PetscScalar *ivals)
82 {
83 5314 PetscInt nmat=pep->nmat,k;
84 5314 PetscReal *a=pep->pbc,*b=pep->pbc+nmat,*g=pep->pbc+2*nmat;
85
86
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
5314 PetscFunctionBegin;
87
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.
5314 PetscCall(PEPEvaluateBasis(pep,sigma,isigma,vals,ivals));
88
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
20029 for (k=nmat-1;k>0;k--) {
89 14715 vals[k] = vals[k-1];
90
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 times.
14715 if (ivals) ivals[k] = ivals[k-1];
91 }
92 5314 vals[0] = 0.0;
93 5314 vals[1] = vals[1]/a[0];
94 #if !defined(PETSC_USE_COMPLEX)
95
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
1406 if (ivals) ivals[1] = ivals[1]/a[0];
96 #endif
97
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
14715 for (k=2;k<nmat;k++) {
98 9401 vals[k] += (sigma-b[k-1])*vals[k-1]-g[k-1]*vals[k-2];
99
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 times.
9401 if (ivals) vals[k] -= isigma*ivals[k-1];
100 9401 vals[k] /= a[k-1];
101 #if !defined(PETSC_USE_COMPLEX)
102
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
1543 if (ivals) {
103 1543 ivals[k] += (sigma-b[k-1])*ivals[k-1]+isigma*vals[k-1]-g[k-1]*ivals[k-2];
104 1543 ivals[k] /= a[k-1];
105 }
106 #endif
107 }
108
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.
1062 PetscFunctionReturn(PETSC_SUCCESS);
109 }
110