GCC Code Coverage Report


Directory: ./
File: src/sys/classes/st/impls/shift/shift.c
Date: 2025-10-04 04:19:13
Exec Total Coverage
Lines: 145 145 100.0%
Functions: 8 8 100.0%
Branches: 368 550 66.9%

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 Shift spectral transformation, applies (A + sigma I) as operator, or
12 inv(B)(A + sigma B) for generalized problems
13 */
14
15 #include <slepc/private/stimpl.h>
16 #include <petsc/private/matimpl.h> /* Mat_MPIDense */
17
18 /*
19 Special STApply() for the BSE structured matrix
20
21 H = [ R C; -C^H -R^T ].
22
23 Assumes that H is a MATNEST and x,y are VECNEST.
24
25 Only the upper part of the product y=H*x is computed.
26
27 y1 = R*x1+C*x2
28
29 The bottom part of the input vector x2 is computed as
30 either conj(x1) or -conj(x1), where the sign is given by
31 s in the context SlepcMatStruct.
32 The bottom part of the output vector y2 is not referenced.
33 */
34 75628 static PetscErrorCode STApply_Shift_BSE(ST st,Vec x,Vec y)
35 {
36 75628 Mat H,R,C;
37 75628 Vec x1,x2,y1;
38 75628 PetscContainer container;
39 75628 SlepcMatStruct mctx;
40
41
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
75628 PetscFunctionBegin;
42 75628 H = st->T[0];
43
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.
75628 PetscCall(PetscObjectQuery((PetscObject)H,"SlepcMatStruct",(PetscObject*)&container));
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.
75628 PetscCall(PetscContainerGetPointer(container,(void**)&mctx));
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.
75628 PetscCall(MatNestGetSubMat(H,0,0,&R));
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.
75628 PetscCall(MatNestGetSubMat(H,0,1,&C));
47
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.
75628 PetscCall(VecNestGetSubVec(x,0,&x1));
48
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.
75628 PetscCall(VecNestGetSubVec(x,1,&x2));
49
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.
75628 PetscCall(VecNestGetSubVec(y,0,&y1));
50
51 /* x2 = +/-conj(x1) */
52
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.
75628 PetscCall(VecCopy(x1,x2));
53
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.
75628 PetscCall(VecConjugate(x2));
54
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.
75628 if (mctx->s==-1.0) PetscCall(VecScale(x2,-1.0));
55
56
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.
75628 PetscCall(MatMult(C,x2,y1));
57
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.
75628 PetscCall(MatMultAdd(R,x1,y1,y1));
58
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.
14560 PetscFunctionReturn(PETSC_SUCCESS);
59 }
60
61 /*
62 Specialized version that avoids communication for multiplication by R.
63 It needs to access internal data structures of MATMPIDENSE.
64 */
65 2910 static PetscErrorCode STApply_Shift_BSE_Dense(ST st,Vec x,Vec y)
66 {
67 2910 Mat H,R,C;
68 2910 Vec x1,x2,y1;
69 2910 Mat_MPIDense *mdnR,*mdnC;
70 2910 PetscContainer container;
71 2910 SlepcMatStruct mctx;
72
73
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2910 PetscFunctionBegin;
74 2910 H = st->T[0];
75
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2910 PetscCall(PetscObjectQuery((PetscObject)H,"SlepcMatStruct",(PetscObject*)&container));
76
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2910 PetscCall(PetscContainerGetPointer(container,(void**)&mctx));
77
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2910 PetscCall(MatNestGetSubMat(H,0,0,&R));
78
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2910 PetscCall(MatNestGetSubMat(H,0,1,&C));
79 2910 mdnR = (Mat_MPIDense*)R->data;
80 2910 mdnC = (Mat_MPIDense*)C->data;
81
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2910 PetscCall(VecNestGetSubVec(x,0,&x1));
82
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2910 PetscCall(VecNestGetSubVec(x,1,&x2));
83
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2910 PetscCall(VecNestGetSubVec(y,0,&y1));
84
85 /* x2 = +/-conj(x1) */
86
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2910 PetscCall(VecCopy(x1,x2));
87
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2910 PetscCall(VecConjugate(x2));
88
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
2910 if (mctx->s==-1.0) PetscCall(VecScale(x2,-1.0));
89
90
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2910 PetscCall(MatMult(C,x2,y1));
91 /* PetscCall(MatMultAdd(R,x1,y1,y1)); */
92
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2910 PetscCall(VecConjugate(mdnC->lvec));
93
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
2910 if (mctx->s==-1.0) PetscCall(VecScale(mdnC->lvec,-1.0));
94
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2910 PetscCall(PetscLogEventBegin(MAT_MultAdd,R,mdnC->lvec,y1,y1));
95
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2910 PetscCall(VecLockReadPush(mdnC->lvec));
96
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2910 PetscCall((*mdnR->A->ops->multadd)(mdnR->A,mdnC->lvec,y1,y1));
97
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2910 PetscCall(VecLockReadPop(mdnC->lvec));
98
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2910 PetscCall(PetscLogEventEnd(MAT_MultAdd,R,mdnC->lvec,y1,y1));
99
2/4
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2910 PetscCall(PetscObjectStateIncrease((PetscObject)y1));
100
6/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
2910 PetscFunctionReturn(PETSC_SUCCESS);
101 }
102
103 11269527 static PetscErrorCode STBackTransform_Shift(ST st,PetscInt n,PetscScalar *eigr,PetscScalar *eigi)
104 {
105 11269527 PetscInt j;
106
107
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
11269527 PetscFunctionBegin;
108
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
33365390 for (j=0;j<n;j++) {
109 22095863 eigr[j] += st->sigma;
110 }
111
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.
11269527 PetscFunctionReturn(PETSC_SUCCESS);
112 }
113
114 6584 static PetscErrorCode STPostSolve_Shift(ST st)
115 {
116
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
6584 PetscFunctionBegin;
117
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6584 if (st->matmode == ST_MATMODE_INPLACE) {
118
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.
35 if (st->nmat>1) PetscCall(MatAXPY(st->A[0],st->sigma,st->A[1],st->str));
119
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.
25 else PetscCall(MatShift(st->A[0],st->sigma));
120 35 st->Astate[0] = ((PetscObject)st->A[0])->state;
121 35 st->state = ST_STATE_INITIAL;
122 35 st->opready = PETSC_FALSE;
123 }
124
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.
1245 PetscFunctionReturn(PETSC_SUCCESS);
125 }
126
127 /*
128 Operator (shift):
129 Op P M
130 if nmat=1: A-sI NULL A-sI
131 if nmat=2: B^-1 (A-sB) B A-sB
132 */
133 4888 static PetscErrorCode STComputeOperator_Shift(ST st)
134 {
135
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
4888 PetscFunctionBegin;
136 4888 st->usesksp = (st->nmat>1)? PETSC_TRUE: PETSC_FALSE;
137
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.
4888 PetscCall(PetscObjectReference((PetscObject)st->A[1]));
138
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.
4888 PetscCall(MatDestroy(&st->T[1]));
139 4888 st->T[1] = st->A[1];
140
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.
4888 PetscCall(STMatMAXPY_Private(st,-st->sigma,0.0,0,NULL,PetscNot(st->state==ST_STATE_UPDATED),PETSC_FALSE,&st->T[0]));
141
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.
4888 if (st->nmat>1) PetscCall(PetscObjectReference((PetscObject)st->T[1]));
142
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.
4888 PetscCall(MatDestroy(&st->P));
143
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4888 st->P = (st->nmat>1)? st->T[1]: NULL;
144 4888 st->M = st->T[0];
145
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
4888 if (st->nmat>1 && st->Psplit) { /* build custom preconditioner from the split matrices */
146
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(MatDestroy(&st->Pmat));
147
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(PetscObjectReference((PetscObject)st->Psplit[1]));
148 10 st->Pmat = st->Psplit[1];
149 }
150
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.
925 PetscFunctionReturn(PETSC_SUCCESS);
151 }
152
153 5715 static PetscErrorCode STSetUp_Shift(ST st)
154 {
155 5715 PetscInt k,nc,nmat=st->nmat;
156 5715 PetscScalar *coeffs=NULL;
157 5715 PetscBool denseR,denseC;
158 5715 Mat H,R,C;
159
160
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
5715 PetscFunctionBegin;
161
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.
5715 if (nmat>1) PetscCall(STSetWorkVecs(st,1));
162
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2472 if (nmat>2) { /* set-up matrices for polynomial eigenproblems */
163
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
827 if (st->transform) {
164 154 nc = (nmat*(nmat+1))/2;
165
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.
154 PetscCall(PetscMalloc1(nc,&coeffs));
166 /* Compute coeffs */
167
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.
154 PetscCall(STCoeffs_Monomial(st,coeffs));
168 /* T[n] = A_n */
169 154 k = nmat-1;
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.
154 PetscCall(PetscObjectReference((PetscObject)st->A[k]));
171
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.
154 PetscCall(MatDestroy(&st->T[k]));
172 154 st->T[k] = st->A[k];
173
8/10
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 2 times.
492 for (k=0;k<nmat-1;k++) PetscCall(STMatMAXPY_Private(st,nmat>2?st->sigma:-st->sigma,0.0,k,coeffs?coeffs+((nmat-k)*(nmat-k-1))/2:NULL,PetscNot(st->state==ST_STATE_UPDATED),PETSC_FALSE,&st->T[k]));
174
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.
154 PetscCall(PetscFree(coeffs));
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.
154 PetscCall(PetscObjectReference((PetscObject)st->T[nmat-1]));
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.
154 PetscCall(MatDestroy(&st->P));
177 154 st->P = st->T[nmat-1];
178
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
154 if (st->Psplit) { /* build custom preconditioner from the split matrices */
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.
10 PetscCall(STMatMAXPY_Private(st,st->sigma,0.0,nmat-1,coeffs?coeffs:NULL,PETSC_TRUE,PETSC_TRUE,&st->Pmat));
180 }
181
7/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
154 PetscCall(ST_KSPSetOperators(st,st->P,st->Pmat?st->Pmat:st->P));
182 } else {
183
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2852 for (k=0;k<nmat;k++) {
184
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.
2179 PetscCall(PetscObjectReference((PetscObject)st->A[k]));
185
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.
2179 PetscCall(MatDestroy(&st->T[k]));
186 2179 st->T[k] = st->A[k];
187 }
188 }
189 }
190
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.
5715 if (st->P) PetscCall(KSPSetUp(st->ksp));
191
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
5715 if (st->structured) {
192 256 H = st->T[0];
193
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.
256 PetscCall(MatNestGetSubMat(H,0,0,&R));
194
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.
256 PetscCall(MatNestGetSubMat(H,0,1,&C));
195
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.
256 PetscCall(PetscObjectTypeCompareAny((PetscObject)R,&denseR,MATMPIDENSE,MATMPIDENSECUDA,MATMPIDENSEHIP,""));
196
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.
256 PetscCall(PetscObjectTypeCompareAny((PetscObject)C,&denseC,MATMPIDENSE,MATMPIDENSECUDA,MATMPIDENSEHIP,""));
197
3/4
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
482 st->ops->apply = (denseR && denseC)? STApply_Shift_BSE_Dense: STApply_Shift_BSE;
198 }
199
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.
1084 PetscFunctionReturn(PETSC_SUCCESS);
200 }
201
202 165 static PetscErrorCode STSetShift_Shift(ST st,PetscScalar newshift)
203 {
204 165 PetscInt k,nc,nmat=PetscMax(st->nmat,2);
205 165 PetscScalar *coeffs=NULL;
206
207
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
165 PetscFunctionBegin;
208
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
165 if (st->transform) {
209
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
145 if (st->matmode == ST_MATMODE_COPY && nmat>2) {
210 20 nc = (nmat*(nmat+1))/2;
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.
20 PetscCall(PetscMalloc1(nc,&coeffs));
212 /* Compute coeffs */
213
3/6
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
20 PetscCall(STCoeffs_Monomial(st,coeffs));
214 }
215
13/14
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 10 times.
✓ Branch 8 taken 10 times.
✓ Branch 9 taken 10 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✓ Branch 13 taken 2 times.
350 for (k=0;k<nmat-1;k++) PetscCall(STMatMAXPY_Private(st,nmat>2?newshift:-newshift,nmat>2?st->sigma:-st->sigma,k,coeffs?coeffs+((nmat-k)*(nmat-k-1))/2:NULL,PETSC_FALSE,PETSC_FALSE,&st->T[k]));
216
9/12
✓ 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 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.
145 if (st->matmode == ST_MATMODE_COPY && nmat>2) PetscCall(PetscFree(coeffs));
217
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
145 if (st->nmat<=2) st->M = st->T[0];
218 }
219
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.
33 PetscFunctionReturn(PETSC_SUCCESS);
220 }
221
222 6526 SLEPC_EXTERN PetscErrorCode STCreate_Shift(ST st)
223 {
224
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
6526 PetscFunctionBegin;
225 6526 st->usesksp = PETSC_TRUE;
226
227 6526 st->ops->apply = STApply_Generic;
228 6526 st->ops->applytrans = STApplyTranspose_Generic;
229 6526 st->ops->applyhermtrans = STApplyHermitianTranspose_Generic;
230 6526 st->ops->backtransform = STBackTransform_Shift;
231 6526 st->ops->setshift = STSetShift_Shift;
232 6526 st->ops->getbilinearform = STGetBilinearForm_Default;
233 6526 st->ops->setup = STSetUp_Shift;
234 6526 st->ops->computeoperator = STComputeOperator_Shift;
235 6526 st->ops->postsolve = STPostSolve_Shift;
236 6526 st->ops->setdefaultksp = STSetDefaultKSP_Default;
237
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.
6526 PetscFunctionReturn(PETSC_SUCCESS);
238 }
239