GCC Code Coverage Report


Directory: ./
File: src/sys/classes/st/interface/stsolve.c
Date: 2025-11-19 04:19:03
Exec Total Coverage
Lines: 358 367 97.5%
Functions: 26 26 100.0%
Branches: 1036 2074 50.0%

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 ST interface routines, callable by users
12 */
13
14 #include <slepc/private/stimpl.h> /*I "slepcst.h" I*/
15
16 1136378 PetscErrorCode STApply_Generic(ST st,Vec x,Vec y)
17 {
18
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1136378 PetscFunctionBegin;
19
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
1136378 if (st->M && st->P) {
20
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.
258482 PetscCall(MatMult(st->M,x,st->work[0]));
21
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.
258482 PetscCall(STMatSolve(st,st->work[0],y));
22
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.
877896 } else if (st->M) PetscCall(MatMult(st->M,x,y));
23
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.
182140 else PetscCall(STMatSolve(st,x,y));
24
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.
222843 PetscFunctionReturn(PETSC_SUCCESS);
25 }
26
27 /*@
28 STApply - Applies the spectral transformation operator to a vector, for
29 instance $y=(A - \sigma B)^{-1} Bx$ in the case of the shift-and-invert transformation
30 and generalized eigenproblem.
31
32 Collective
33
34 Input Parameters:
35 + st - the spectral transformation context
36 - x - input vector
37
38 Output Parameter:
39 . y - output vector
40
41 Level: developer
42
43 .seealso: [](ch:st), `STApplyTranspose()`, `STApplyHermitianTranspose()`
44 @*/
45 576849 PetscErrorCode STApply(ST st,Vec x,Vec y)
46 {
47 576849 Mat Op;
48
49
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
576849 PetscFunctionBegin;
50
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.
576849 PetscValidHeaderSpecific(st,ST_CLASSID,1);
51
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.
576849 PetscValidHeaderSpecific(x,VEC_CLASSID,2);
52
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.
576849 PetscValidHeaderSpecific(y,VEC_CLASSID,3);
53
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
576849 PetscValidType(st,1);
54
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
576849 STCheckMatrices(st,1);
55
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
576849 PetscCheck(x!=y,PetscObjectComm((PetscObject)st),PETSC_ERR_ARG_IDN,"x and y must be different vectors");
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.
576849 PetscCall(VecSetErrorIfLocked(y,3));
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.
576849 PetscCall(STGetOperator_Private(st,&Op));
58
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.
576849 PetscCall(MatMult(Op,x,y));
59
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.
115729 PetscFunctionReturn(PETSC_SUCCESS);
60 }
61
62 51721 PetscErrorCode STApplyMat_Generic(ST st,Mat B,Mat C)
63 {
64 51721 Mat work;
65
66
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
51721 PetscFunctionBegin;
67
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
51721 if (st->M && st->P) {
68
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.
20422 PetscCall(MatMatMult(st->M,B,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&work));
69
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.
20422 PetscCall(STMatMatSolve(st,work,C));
70
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.
20422 PetscCall(MatDestroy(&work));
71
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.
31299 } else if (st->M) PetscCall(MatMatMult(st->M,B,MAT_REUSE_MATRIX,PETSC_DEFAULT,&C));
72
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.
15827 else PetscCall(STMatMatSolve(st,B,C));
73
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.
10231 PetscFunctionReturn(PETSC_SUCCESS);
74 }
75
76 /*@
77 STApplyMat - Applies the spectral transformation operator to a matrix, for
78 instance $Y = (A - \sigma B)^{-1} B X$ in the case of the shift-and-invert
79 transformation and generalized eigenproblem.
80
81 Collective
82
83 Input Parameters:
84 + st - the spectral transformation context
85 - X - input matrix
86
87 Output Parameter:
88 . Y - output matrix
89
90 Level: developer
91
92 .seealso: [](ch:st), `STApply()`
93 @*/
94 15172 PetscErrorCode STApplyMat(ST st,Mat X,Mat Y)
95 {
96
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
15172 PetscFunctionBegin;
97
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.
15172 PetscValidHeaderSpecific(st,ST_CLASSID,1);
98
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.
15172 PetscValidHeaderSpecific(X,MAT_CLASSID,2);
99
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.
15172 PetscValidHeaderSpecific(Y,MAT_CLASSID,3);
100
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
15172 PetscValidType(st,1);
101
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
15172 STCheckMatrices(st,1);
102
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
15172 PetscCheck(X!=Y,PetscObjectComm((PetscObject)st),PETSC_ERR_ARG_IDN,"X and Y must be different matrices");
103
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
15172 PetscUseTypeMethod(st,applymat,X,Y);
104
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.
3125 PetscFunctionReturn(PETSC_SUCCESS);
105 }
106
107 8202 PetscErrorCode STApplyTranspose_Generic(ST st,Vec x,Vec y)
108 {
109
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
8202 PetscFunctionBegin;
110
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
8202 if (st->M && st->P) {
111
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.
1785 PetscCall(STMatSolveTranspose(st,x,st->work[0]));
112
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.
1785 PetscCall(MatMultTranspose(st->M,st->work[0],y));
113
6/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 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.
6417 } else if (st->M) PetscCall(MatMultTranspose(st->M,x,y));
114
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.
2574 else PetscCall(STMatSolveTranspose(st,x,y));
115
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.
1582 PetscFunctionReturn(PETSC_SUCCESS);
116 }
117
118 /*@
119 STApplyTranspose - Applies the transpose of the operator to a vector, for
120 instance $y = B^T(A - \sigma B)^{-T} x$ in the case of the shift-and-invert
121 transformation and generalized eigenproblem.
122
123 Collective
124
125 Input Parameters:
126 + st - the spectral transformation context
127 - x - input vector
128
129 Output Parameter:
130 . y - output vector
131
132 Level: developer
133
134 .seealso: [](ch:st), `STApply()`, `STApplyHermitianTranspose()`
135 @*/
136 90 PetscErrorCode STApplyTranspose(ST st,Vec x,Vec y)
137 {
138 90 Mat Op;
139
140
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
90 PetscFunctionBegin;
141
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.
90 PetscValidHeaderSpecific(st,ST_CLASSID,1);
142
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.
90 PetscValidHeaderSpecific(x,VEC_CLASSID,2);
143
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.
90 PetscValidHeaderSpecific(y,VEC_CLASSID,3);
144
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
90 PetscValidType(st,1);
145
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
90 STCheckMatrices(st,1);
146
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
90 PetscCheck(x!=y,PetscObjectComm((PetscObject)st),PETSC_ERR_ARG_IDN,"x and y must be different vectors");
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.
90 PetscCall(VecSetErrorIfLocked(y,3));
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.
90 PetscCall(STGetOperator_Private(st,&Op));
149
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.
90 PetscCall(MatMultTranspose(Op,x,y));
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.
18 PetscFunctionReturn(PETSC_SUCCESS);
151 }
152
153 7068 PetscErrorCode STApplyHermitianTranspose_Generic(ST st,Vec x,Vec y)
154 {
155
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
7068 PetscFunctionBegin;
156
4/4
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
7068 if (st->M && st->P) {
157
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.
870 PetscCall(STMatSolveHermitianTranspose(st,x,st->work[0]));
158
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.
870 PetscCall(MatMultHermitianTranspose(st->M,st->work[0],y));
159
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.
6198 } else if (st->M) PetscCall(MatMultHermitianTranspose(st->M,x,y));
160
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.
2548 else PetscCall(STMatSolveHermitianTranspose(st,x,y));
161
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.
1514 PetscFunctionReturn(PETSC_SUCCESS);
162 }
163
164 /*@
165 STApplyHermitianTranspose - Applies the Hermitian-transpose of the operator
166 to a vector, for instance $y=B^*(A - \sigma B)^{-*}x$ in the case of the shift-and-invert
167 transformation and generalized eigenproblem.
168
169 Collective
170
171 Input Parameters:
172 + st - the spectral transformation context
173 - x - input vector
174
175 Output Parameter:
176 . y - output vector
177
178 Note:
179 Currently implemented via `STApplyTranspose()` with appropriate conjugation.
180
181 Level: developer
182
183 .seealso: [](ch:st), `STApply()`, `STApplyTranspose()`
184 @*/
185 4635 PetscErrorCode STApplyHermitianTranspose(ST st,Vec x,Vec y)
186 {
187 4635 Mat Op;
188
189
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
4635 PetscFunctionBegin;
190
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.
4635 PetscValidHeaderSpecific(st,ST_CLASSID,1);
191
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.
4635 PetscValidHeaderSpecific(x,VEC_CLASSID,2);
192
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.
4635 PetscValidHeaderSpecific(y,VEC_CLASSID,3);
193
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
4635 PetscValidType(st,1);
194
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
4635 STCheckMatrices(st,1);
195
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
4635 PetscCheck(x!=y,PetscObjectComm((PetscObject)st),PETSC_ERR_ARG_IDN,"x and y must be different vectors");
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.
4635 PetscCall(VecSetErrorIfLocked(y,3));
197
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.
4635 PetscCall(STGetOperator_Private(st,&Op));
198
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.
4635 PetscCall(MatMultHermitianTranspose(Op,x,y));
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.
923 PetscFunctionReturn(PETSC_SUCCESS);
200 }
201
202 /*@
203 STGetBilinearForm - Returns the matrix used in the bilinear form with a
204 generalized eigenproblem with semi-definite $B$.
205
206 Logically Collective
207
208 Input Parameter:
209 . st - the spectral transformation context
210
211 Output Parameter:
212 . B - output matrix
213
214 Notes:
215 The output matrix `B` must be destroyed after use. It will be `NULL` in
216 case of standard eigenproblems.
217
218 Level: developer
219
220 .seealso: [](ch:st), `BVSetMatrix()`
221 @*/
222 1513 PetscErrorCode STGetBilinearForm(ST st,Mat *B)
223 {
224
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1513 PetscFunctionBegin;
225
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.
1513 PetscValidHeaderSpecific(st,ST_CLASSID,1);
226
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1513 PetscValidType(st,1);
227
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
1513 PetscAssertPointer(B,2);
228
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1513 STCheckMatrices(st,1);
229
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
1513 PetscUseTypeMethod(st,getbilinearform,B);
230
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.
293 PetscFunctionReturn(PETSC_SUCCESS);
231 }
232
233 1428 PetscErrorCode STGetBilinearForm_Default(ST st,Mat *B)
234 {
235
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1428 PetscFunctionBegin;
236
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
1428 if (st->nmat==1) *B = NULL;
237 else {
238 1428 *B = st->A[1];
239
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.
1428 PetscCall(PetscObjectReference((PetscObject)*B));
240 }
241
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.
276 PetscFunctionReturn(PETSC_SUCCESS);
242 }
243
244 1245232 static PetscErrorCode MatMult_STOperator(Mat Op,Vec x,Vec y)
245 {
246 1245232 ST st;
247
248
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1245232 PetscFunctionBegin;
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.
1245232 PetscCall(MatShellGetContext(Op,&st));
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.
1245232 PetscCall(STSetUp(st));
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.
1245232 PetscCall(PetscLogEventBegin(ST_Apply,st,x,y,0));
252
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1245232 if (st->D) { /* with balancing */
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.
7045 PetscCall(VecPointwiseDivide(st->wb,x,st->D));
254
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
7045 PetscUseTypeMethod(st,apply,st->wb,y);
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.
7045 PetscCall(VecPointwiseMult(y,y,st->D));
256
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
1238187 } else PetscUseTypeMethod(st,apply,x,y);
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.
1245232 PetscCall(PetscLogEventEnd(ST_Apply,st,x,y,0));
258
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.
243955 PetscFunctionReturn(PETSC_SUCCESS);
259 }
260
261 8622 static PetscErrorCode MatMultTranspose_STOperator(Mat Op,Vec x,Vec y)
262 {
263 8622 ST st;
264
265
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
8622 PetscFunctionBegin;
266
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.
8622 PetscCall(MatShellGetContext(Op,&st));
267
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.
8622 PetscCall(STSetUp(st));
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.
8622 PetscCall(PetscLogEventBegin(ST_ApplyTranspose,st,x,y,0));
269
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
8622 if (st->D) { /* with balancing */
270
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.
250 PetscCall(VecPointwiseMult(st->wb,x,st->D));
271
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 4 times.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
250 PetscUseTypeMethod(st,applytrans,st->wb,y);
272
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.
250 PetscCall(VecPointwiseDivide(y,y,st->D));
273
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
8372 } else PetscUseTypeMethod(st,applytrans,x,y);
274
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.
8622 PetscCall(PetscLogEventEnd(ST_ApplyTranspose,st,x,y,0));
275
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.
1658 PetscFunctionReturn(PETSC_SUCCESS);
276 }
277
278 #if defined(PETSC_USE_COMPLEX)
279 7528 static PetscErrorCode MatMultHermitianTranspose_STOperator(Mat Op,Vec x,Vec y)
280 {
281 7528 ST st;
282
283
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
7528 PetscFunctionBegin;
284
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.
7528 PetscCall(MatShellGetContext(Op,&st));
285
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.
7528 PetscCall(STSetUp(st));
286
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.
7528 PetscCall(PetscLogEventBegin(ST_ApplyHermitianTranspose,st,x,y,0));
287
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
7528 if (st->ops->applyhermtrans) {
288
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
7528 if (st->D) { /* with balancing */
289
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.
250 PetscCall(VecConjugate(st->D));
290
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.
250 PetscCall(VecPointwiseMult(st->wb,x,st->D));
291
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 4 times.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
250 PetscUseTypeMethod(st,applyhermtrans,st->wb,y);
292
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.
250 PetscCall(VecPointwiseDivide(y,y,st->D));
293
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.
250 PetscCall(VecConjugate(st->D));
294
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.
7278 } else PetscUseTypeMethod(st,applyhermtrans,x,y);
295 } else {
296 if (!st->wht) PetscCall(MatCreateVecs(st->A[0],&st->wht,NULL));
297 PetscCall(VecCopy(x,st->wht));
298 PetscCall(VecConjugate(st->wht));
299 if (st->D) { /* with balancing */
300 PetscCall(VecPointwiseMult(st->wb,st->wht,st->D));
301 PetscUseTypeMethod(st,applytrans,st->wb,y);
302 PetscCall(VecPointwiseDivide(y,y,st->D));
303 } else PetscUseTypeMethod(st,applytrans,st->wht,y);
304 PetscCall(VecConjugate(y));
305 }
306
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.
7528 PetscCall(PetscLogEventEnd(ST_ApplyHermitianTranspose,st,x,y,0));
307
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.
1590 PetscFunctionReturn(PETSC_SUCCESS);
308 }
309 #endif
310
311 36549 static PetscErrorCode MatMatMult_STOperator(Mat Op,Mat B,Mat C,void *ctx)
312 {
313 36549 ST st;
314
315
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
36549 PetscFunctionBegin;
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.
36549 PetscCall(MatShellGetContext(Op,&st));
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.
36549 PetscCall(STSetUp(st));
318
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.
36549 PetscCall(PetscLogEventBegin(ST_Apply,st,B,C,0));
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.
36549 PetscCall(STApplyMat_Generic(st,B,C));
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.
36549 PetscCall(PetscLogEventEnd(ST_Apply,st,B,C,0));
321
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.
7106 PetscFunctionReturn(PETSC_SUCCESS);
322 }
323
324 632490 PetscErrorCode STGetOperator_Private(ST st,Mat *Op)
325 {
326 632490 PetscInt m,n,M,N;
327 632490 Vec v;
328 632490 VecType vtype;
329
330
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
632490 PetscFunctionBegin;
331
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
632490 if (!st->Op) {
332
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
5647 if (Op) *Op = NULL;
333 /* create the shell matrix */
334
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.
5647 PetscCall(MatGetLocalSize(st->A[0],&m,&n));
335
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.
5647 PetscCall(MatGetSize(st->A[0],&M,&N));
336
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.
5647 PetscCall(MatCreateShell(PetscObjectComm((PetscObject)st),m,n,M,N,st,&st->Op));
337
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.
5647 PetscCall(MatShellSetOperation(st->Op,MATOP_MULT,(PetscErrorCodeFn*)MatMult_STOperator));
338
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.
5647 PetscCall(MatShellSetOperation(st->Op,MATOP_MULT_TRANSPOSE,(PetscErrorCodeFn*)MatMultTranspose_STOperator));
339 #if defined(PETSC_USE_COMPLEX)
340
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.
2738 PetscCall(MatShellSetOperation(st->Op,MATOP_MULT_HERMITIAN_TRANSPOSE,(PetscErrorCodeFn*)MatMultHermitianTranspose_STOperator));
341 #else
342
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.
2909 PetscCall(MatShellSetOperation(st->Op,MATOP_MULT_HERMITIAN_TRANSPOSE,(PetscErrorCodeFn*)MatMultTranspose_STOperator));
343 #endif
344
3/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
5647 if (!st->D && st->ops->apply==STApply_Generic) {
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.
4982 PetscCall(MatShellSetMatProductOperation(st->Op,MATPRODUCT_AB,NULL,MatMatMult_STOperator,NULL,MATDENSE,MATDENSE));
346
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.
4982 PetscCall(MatShellSetMatProductOperation(st->Op,MATPRODUCT_AB,NULL,MatMatMult_STOperator,NULL,MATDENSECUDA,MATDENSECUDA));
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.
4982 PetscCall(MatShellSetMatProductOperation(st->Op,MATPRODUCT_AB,NULL,MatMatMult_STOperator,NULL,MATDENSEHIP,MATDENSEHIP));
348 }
349 /* make sure the shell matrix generates a vector of the same type as the problem matrices */
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.
5647 PetscCall(MatCreateVecs(st->A[0],&v,NULL));
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.
5647 PetscCall(VecGetType(v,&vtype));
352
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.
5647 PetscCall(MatShellSetVecType(st->Op,vtype));
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.
5647 PetscCall(VecDestroy(&v));
354 /* build the operator matrices */
355
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.
5647 PetscCall(STComputeOperator(st));
356 }
357
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
632490 if (Op) *Op = st->Op;
358
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.
126481 PetscFunctionReturn(PETSC_SUCCESS);
359 }
360
361 /*@
362 STGetOperator - Returns a shell matrix that represents the operator of the
363 spectral transformation.
364
365 Collective
366
367 Input Parameter:
368 . st - the spectral transformation context
369
370 Output Parameter:
371 . Op - operator matrix
372
373 Notes:
374 The operator is defined in linear eigenproblems only, not in polynomial ones,
375 so the call will fail if more than 2 matrices were passed in `STSetMatrices()`.
376
377 The returned shell matrix is essentially a wrapper to the `STApply()` and
378 `STApplyTranspose()` operations. The operator can often be expressed as
379
380 $$Op = D K^{-1} M D^{-1}$$
381
382 where $D$ is the balancing matrix, and $M$ and $K$ are two matrices corresponding
383 to the numerator and denominator for spectral transformations that represent
384 a rational matrix function. In the case of `STSHELL`, the inner part $K^{-1}M$
385 is replaced by the user-provided operation from `STShellSetApply()`.
386
387 The preconditioner matrix $K$ typically depends on the value of the shift, and
388 its inverse is handled via an internal `KSP` object. Normal usage does not
389 require explicitly calling `STGetOperator()`, but it can be used to force the
390 creation of $K$ and $M$, and then $K$ is passed to the `KSP`. This is useful for
391 setting options associated with the `PCFactor` (to set MUMPS options, for instance).
392
393 The returned matrix must NOT be destroyed by the user. Instead, when no
394 longer needed it must be returned with `STRestoreOperator()`. In particular,
395 this is required before modifying the `ST` matrices or the shift.
396
397 A `NULL` pointer can be passed in `Op` in case the matrix is not required but we
398 want to force its creation. In this case, `STRestoreOperator()` should not be
399 called.
400
401 Level: advanced
402
403 .seealso: [](ch:st), `STApply()`, `STApplyTranspose()`, `STSetBalanceMatrix()`, `STShellSetApply()`, `STGetKSP()`, `STSetShift()`, `STRestoreOperator()`, `STSetMatrices()`
404 @*/
405 50916 PetscErrorCode STGetOperator(ST st,Mat *Op)
406 {
407
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
50916 PetscFunctionBegin;
408
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.
50916 PetscValidHeaderSpecific(st,ST_CLASSID,1);
409
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
50916 PetscValidType(st,1);
410
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
50916 STCheckMatrices(st,1);
411
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
50916 STCheckNotSeized(st,1);
412
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
50916 PetscCheck(st->nmat<=2,PetscObjectComm((PetscObject)st),PETSC_ERR_ARG_WRONGSTATE,"The operator is not defined in polynomial eigenproblems");
413
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.
50916 PetscCall(STGetOperator_Private(st,Op));
414
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
50916 if (Op) st->opseized = PETSC_TRUE;
415
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.
9811 PetscFunctionReturn(PETSC_SUCCESS);
416 }
417
418 /*@
419 STRestoreOperator - Restore the previously seized operator matrix.
420
421 Logically Collective
422
423 Input Parameters:
424 + st - the spectral transformation context
425 - Op - operator matrix
426
427 Notes:
428 The arguments must match the corresponding call to `STGetOperator()`.
429
430 Level: advanced
431
432 .seealso: [](ch:st), `STGetOperator()`
433 @*/
434 50591 PetscErrorCode STRestoreOperator(ST st,Mat *Op)
435 {
436
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
50591 PetscFunctionBegin;
437
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.
50591 PetscValidHeaderSpecific(st,ST_CLASSID,1);
438
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
50591 PetscAssertPointer(Op,2);
439
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.
50591 PetscValidHeaderSpecific(*Op,MAT_CLASSID,2);
440
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
50591 PetscCheck(st->opseized,PetscObjectComm((PetscObject)st),PETSC_ERR_ARG_WRONGSTATE,"Must be called after STGetOperator()");
441 50591 *Op = NULL;
442 50591 st->opseized = PETSC_FALSE;
443
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.
50591 PetscFunctionReturn(PETSC_SUCCESS);
444 }
445
446 /*
447 STComputeOperator - Computes the matrices that constitute the operator
448
449 Op = D*inv(K)*M*inv(D).
450
451 K and M are computed here (D is user-provided) from the system matrices
452 and the shift sigma (whenever these are changed, this function recomputes
453 K and M). This is used only in linear eigenproblems (nmat<3).
454
455 K is the "preconditioner matrix": it is the denominator in rational operators,
456 e.g. (A-sigma*B) in shift-and-invert. In non-rational transformations such
457 as STFILTER, K=NULL which means identity. After computing K, it is passed to
458 the internal KSP object via KSPSetOperators.
459
460 M is the numerator in rational operators. If unused it is set to NULL (e.g.
461 in STPRECOND).
462
463 STSHELL does not compute anything here, but sets the flag as if it was ready.
464 */
465 14382 PetscErrorCode STComputeOperator(ST st)
466 {
467 14382 PC pc;
468
469
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
14382 PetscFunctionBegin;
470
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.
14382 PetscValidHeaderSpecific(st,ST_CLASSID,1);
471
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
14382 PetscValidType(st,1);
472
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
14382 if (!st->opready && st->ops->computeoperator) {
473
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.
8547 PetscCall(PetscInfo(st,"Building the operator matrices\n"));
474
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
8547 STCheckMatrices(st,1);
475
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.
8547 if (!st->T) PetscCall(PetscCalloc1(PetscMax(2,st->nmat),&st->T));
476
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.
8547 PetscCall(PetscLogEventBegin(ST_ComputeOperator,st,0,0,0));
477
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
8547 PetscUseTypeMethod(st,computeoperator);
478
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.
8547 PetscCall(PetscLogEventEnd(ST_ComputeOperator,st,0,0,0));
479
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
8547 if (st->usesksp) {
480
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.
4379 if (!st->ksp) PetscCall(STGetKSP(st,&st->ksp));
481
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4379 if (st->P) {
482
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.
4037 PetscCall(STSetDefaultKSP(st));
483
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.
4037 PetscCall(ST_KSPSetOperators(st,st->P,st->Pmat?st->Pmat:st->P));
484 } else {
485 /* STPRECOND defaults to PCNONE if st->P is empty */
486
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.
342 PetscCall(KSPGetPC(st->ksp,&pc));
487
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.
342 PetscCall(PCSetType(pc,PCNONE));
488 }
489 }
490 }
491 14382 st->opready = PETSC_TRUE;
492
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.
14382 PetscFunctionReturn(PETSC_SUCCESS);
493 }
494
495 /*@
496 STSetUp - Prepares for the use of a spectral transformation.
497
498 Collective
499
500 Input Parameter:
501 . st - the spectral transformation context
502
503 Level: advanced
504
505 .seealso: [](ch:st), `STCreate()`, `STApply()`, `STDestroy()`
506 @*/
507 1311754 PetscErrorCode STSetUp(ST st)
508 {
509 1311754 PetscInt i,n,k;
510
511
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1311754 PetscFunctionBegin;
512
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.
1311754 PetscValidHeaderSpecific(st,ST_CLASSID,1);
513
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1311754 PetscValidType(st,1);
514
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1311754 STCheckMatrices(st,1);
515
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
1311754 switch (st->state) {
516 10465 case ST_STATE_INITIAL:
517
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.
10465 PetscCall(PetscInfo(st,"Setting up new ST\n"));
518
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.
10465 if (!((PetscObject)st)->type_name) PetscCall(STSetType(st,STSHIFT));
519 break;
520 254847 case ST_STATE_SETUP:
521
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.
254847 PetscFunctionReturn(PETSC_SUCCESS);
522 533 case ST_STATE_UPDATED:
523
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.
533 PetscCall(PetscInfo(st,"Setting up updated ST\n"));
524 break;
525 }
526
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.
10998 PetscCall(PetscLogEventBegin(ST_SetUp,st,0,0,0));
527
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
10998 if (st->state!=ST_STATE_UPDATED) {
528
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
10465 if (!(st->nmat<3 && st->opready)) {
529
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
10200 if (st->T) {
530
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.
2760 for (i=0;i<PetscMax(2,st->nmat);i++) PetscCall(MatDestroy(&st->T[i]));
531 }
532
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.
10200 PetscCall(MatDestroy(&st->P));
533 }
534 }
535
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
10998 if (st->D) {
536
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.
130 PetscCall(MatGetLocalSize(st->A[0],NULL,&n));
537
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.
130 PetscCall(VecGetLocalSize(st->D,&k));
538
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
130 PetscCheck(n==k,PetscObjectComm((PetscObject)st),PETSC_ERR_ARG_SIZ,"Balance matrix has wrong dimension %" PetscInt_FMT " (should be %" PetscInt_FMT ")",k,n);
539
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.
130 if (!st->wb) PetscCall(VecDuplicate(st->D,&st->wb));
540 }
541
8/10
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
10998 if (st->nmat<3 && st->transform) PetscCall(STComputeOperator(st));
542 else {
543
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.
2263 if (!st->T) PetscCall(PetscCalloc1(PetscMax(2,st->nmat),&st->T));
544 }
545
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.
10998 PetscTryTypeMethod(st,setup);
546 10998 st->state = ST_STATE_SETUP;
547
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.
10998 PetscCall(PetscLogEventEnd(ST_SetUp,st,0,0,0));
548
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.
2132 PetscFunctionReturn(PETSC_SUCCESS);
549 }
550
551 /*
552 Computes coefficients for the transformed polynomial,
553 and stores the result in argument S.
554
555 alpha - value of the parameter of the transformed polynomial
556 beta - value of the previous shift (only used in inplace mode)
557 k - index of first matrix included in the computation
558 coeffs - coefficients of the expansion
559 initial - true if this is the first time
560 precond - whether the preconditioner matrix must be computed
561 */
562 16004 PetscErrorCode STMatMAXPY_Private(ST st,PetscScalar alpha,PetscScalar beta,PetscInt k,PetscScalar *coeffs,PetscBool initial,PetscBool precond,Mat *S)
563 {
564 16004 PetscInt *matIdx=NULL,nmat,i,ini=-1;
565 16004 PetscScalar t=1.0,ta,gamma;
566 16004 PetscBool nz=PETSC_FALSE;
567
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
16004 Mat *A=precond?st->Psplit:st->A;
568
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
16004 MatStructure str=precond?st->strp:st->str;
569
570
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
16004 PetscFunctionBegin;
571 16004 nmat = st->nmat-k;
572
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
16004 switch (st->matmode) {
573 240 case ST_MATMODE_INPLACE:
574
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
240 PetscCheck(st->nmat<=2,PetscObjectComm((PetscObject)st),PETSC_ERR_SUP,"ST_MATMODE_INPLACE not supported for polynomial eigenproblems");
575
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
240 PetscCheck(!precond,PetscObjectComm((PetscObject)st),PETSC_ERR_SUP,"ST_MATMODE_INPLACE not supported for split preconditioner");
576
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
240 if (initial) {
577
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.
135 PetscCall(PetscObjectReference((PetscObject)A[0]));
578 135 *S = A[0];
579 135 gamma = alpha;
580 105 } else gamma = alpha-beta;
581
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
240 if (gamma != 0.0) {
582
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.
195 if (st->nmat>1) PetscCall(MatAXPY(*S,gamma,A[1],str));
583
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.
145 else PetscCall(MatShift(*S,gamma));
584 }
585 break;
586 1090 case ST_MATMODE_SHELL:
587
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1090 PetscCheck(!precond,PetscObjectComm((PetscObject)st),PETSC_ERR_SUP,"ST_MATMODE_SHELL not supported for split preconditioner");
588
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1090 if (initial) {
589
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
875 if (st->nmat>2) {
590
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.
100 PetscCall(PetscMalloc1(nmat,&matIdx));
591
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
390 for (i=0;i<nmat;i++) matIdx[i] = k+i;
592 }
593
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.
875 PetscCall(STMatShellCreate(st,alpha,nmat,matIdx,coeffs,S));
594
7/10
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
875 if (st->nmat>2) PetscCall(PetscFree(matIdx));
595
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.
215 } else PetscCall(STMatShellShift(*S,alpha));
596 break;
597 14674 case ST_MATMODE_COPY:
598
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
14674 if (coeffs) {
599
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
5766 for (i=0;i<nmat && ini==-1;i++) {
600
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3372 if (coeffs[i]!=0.0) ini = i;
601 978 else t *= alpha;
602 }
603
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
2394 if (coeffs[ini] != 1.0) nz = PETSC_TRUE;
604
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
4489 for (i=ini+1;i<nmat&&!nz;i++) if (coeffs[i]!=0.0) nz = PETSC_TRUE;
605 } else { nz = PETSC_TRUE; ini = 0; }
606
5/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
14674 if ((alpha == 0.0 || !nz) && t==1.0) {
607
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.
7045 PetscCall(PetscObjectReference((PetscObject)A[k+ini]));
608
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.
7045 PetscCall(MatDestroy(S));
609 7045 *S = A[k+ini];
610 } else {
611
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
7629 if (*S && *S!=A[k+ini]) {
612
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.
5263 PetscCall(MatSetOption(*S,MAT_NEW_NONZERO_ALLOCATION_ERR,PETSC_FALSE));
613
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.
5263 PetscCall(MatCopy(A[k+ini],*S,DIFFERENT_NONZERO_PATTERN));
614 } else {
615
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.
2366 PetscCall(MatDestroy(S));
616
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.
2366 PetscCall(MatDuplicate(A[k+ini],MAT_COPY_VALUES,S));
617
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.
2366 PetscCall(MatSetOption(*S,MAT_NEW_NONZERO_ALLOCATION_ERR,PETSC_FALSE));
618 }
619
3/10
✓ 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 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
7629 if (coeffs && coeffs[ini]!=1.0) PetscCall(MatScale(*S,coeffs[ini]));
620
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
17778 for (i=ini+k+1;i<PetscMax(2,st->nmat);i++) {
621 10149 t *= alpha;
622 10149 ta = t;
623
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
10149 if (coeffs) ta *= coeffs[i-k];
624
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
10149 if (ta!=0.0) {
625
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.
10139 if (st->nmat>1) PetscCall(MatAXPY(*S,ta,A[i],str));
626
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.
10149 else PetscCall(MatShift(*S,ta));
627 }
628 }
629 }
630 }
631
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.
16004 PetscCall(MatSetOption(*S,MAT_SYMMETRIC,st->asymm));
632
9/10
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 3 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
19223 PetscCall(MatSetOption(*S,MAT_HERMITIAN,(PetscImaginaryPart(st->sigma)==0.0)?st->aherm:PETSC_FALSE));
633
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.
3147 PetscFunctionReturn(PETSC_SUCCESS);
634 }
635
636 /*
637 Computes the values of the coefficients required by STMatMAXPY_Private
638 for the case of monomial basis.
639 */
640 419 PetscErrorCode STCoeffs_Monomial(ST st, PetscScalar *coeffs)
641 {
642 419 PetscInt k,i,ini,inip;
643
644
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
419 PetscFunctionBegin;
645 /* Compute binomial coefficients */
646 419 ini = (st->nmat*(st->nmat-1))/2;
647
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1776 for (i=0;i<st->nmat;i++) coeffs[ini+i]=1.0;
648
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1357 for (k=st->nmat-1;k>=1;k--) {
649 938 inip = ini+1;
650 938 ini = (k*(k-1))/2;
651 938 coeffs[ini] = 1.0;
652
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1557 for (i=1;i<k;i++) coeffs[ini+i] = coeffs[ini+i-1]+coeffs[inip+i-1];
653 }
654
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.
419 PetscFunctionReturn(PETSC_SUCCESS);
655 }
656
657 /*@
658 STPostSolve - Optional post-solve phase, intended for any actions that must
659 be performed on the `ST` object after the eigensolver has finished.
660
661 Collective
662
663 Input Parameter:
664 . st - the spectral transformation context
665
666 Level: developer
667
668 .seealso: [](ch:st), `EPSSolve()`
669 @*/
670 11373 PetscErrorCode STPostSolve(ST st)
671 {
672
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
11373 PetscFunctionBegin;
673
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.
11373 PetscValidHeaderSpecific(st,ST_CLASSID,1);
674
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
11373 PetscValidType(st,1);
675
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.
11373 PetscTryTypeMethod(st,postsolve);
676
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.
2198 PetscFunctionReturn(PETSC_SUCCESS);
677 }
678
679 /*@
680 STBackTransform - Back-transformation phase, intended for
681 spectral transformations which require to transform the computed
682 eigenvalues back to the original eigenvalue problem.
683
684 Not Collective
685
686 Input Parameters:
687 + st - the spectral transformation context
688 . n - number of eigenvalues
689 . eigr - real part of a computed eigenvalues
690 - eigi - imaginary part of a computed eigenvalues
691
692 Level: developer
693
694 .seealso: [](ch:st), `STIsInjective()`
695 @*/
696 19509172 PetscErrorCode STBackTransform(ST st,PetscInt n,PetscScalar eigr[],PetscScalar eigi[])
697 {
698
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
19509172 PetscFunctionBegin;
699
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.
19509172 PetscValidHeaderSpecific(st,ST_CLASSID,1);
700
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
19509172 PetscValidType(st,1);
701
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.
19509172 PetscTryTypeMethod(st,backtransform,n,eigr,eigi);
702
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
3903255 PetscFunctionReturn(PETSC_SUCCESS);
703 }
704
705 /*@
706 STIsInjective - Returns whether this spectral transformation is injective or not
707 (that is, if it corresponds to a one-to-one mapping). If not, then it
708 does not make sense to call `STBackTransform()`.
709
710 Not Collective
711
712 Input Parameter:
713 . st - the spectral transformation context
714
715 Output Parameter:
716 . is - the answer
717
718 Note:
719 In case of non-injective transformations such as `STFILTER`, the eigenvalues
720 of the original eigenproblem are computed via the Rayleigh quotient
721 $\rho(A,x) = \frac{x^*Ax}{x^*x}$ for each computed eigenvector $x$.
722
723 Level: developer
724
725 .seealso: [](ch:st), `STBackTransform()`
726 @*/
727 7425 PetscErrorCode STIsInjective(ST st,PetscBool* is)
728 {
729 7425 PetscBool shell;
730
731
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
7425 PetscFunctionBegin;
732
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.
7425 PetscValidHeaderSpecific(st,ST_CLASSID,1);
733
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
7425 PetscValidType(st,1);
734
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
7425 PetscAssertPointer(is,2);
735
736
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.
7425 PetscCall(PetscObjectTypeCompare((PetscObject)st,STSHELL,&shell));
737
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.
7425 if (shell) PetscCall(STIsInjective_Shell(st,is));
738 7094 else *is = st->ops->backtransform? PETSC_TRUE: PETSC_FALSE;
739
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.
1402 PetscFunctionReturn(PETSC_SUCCESS);
740 }
741
742 /*@
743 STMatSetUp - Build the preconditioner matrix used in `STMatSolve()`.
744
745 Collective
746
747 Input Parameters:
748 + st - the spectral transformation context
749 . sigma - the shift
750 - coeffs - the coefficients (may be `NULL`)
751
752 Note:
753 This function is not intended to be called by end users, but by SLEPc
754 solvers that use `ST`. It builds the internal matrix for the preconditioner as
755 $$
756 P=\begin{cases}
757 \sum_{i=0}^{\mathtt{nmat}-1}\mathtt{coeffs[i]}\,\sigma^i A_i, & \text{if coefficients given}\\
758 \sum_{i=0}^{\mathtt{nmat}-1}\sigma^i A_i, & \text{otherwise}
759 \end{cases}
760 $$
761 then calls `KSPSetUp()`.
762
763 Level: developer
764
765 .seealso: [](ch:st), `STMatSolve()`
766 @*/
767 1526 PetscErrorCode STMatSetUp(ST st,PetscScalar sigma,PetscScalar coeffs[])
768 {
769
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1526 PetscFunctionBegin;
770
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.
1526 PetscValidHeaderSpecific(st,ST_CLASSID,1);
771
30/68
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ 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 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✓ Branch 26 taken 2 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✓ Branch 30 taken 2 times.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✓ Branch 33 taken 2 times.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 2 times.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✓ Branch 39 taken 2 times.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✓ Branch 47 taken 2 times.
✓ Branch 48 taken 2 times.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✓ Branch 51 taken 2 times.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 2 times.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✓ Branch 57 taken 2 times.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✓ Branch 60 taken 2 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 2 times.
✗ Branch 63 not taken.
✗ Branch 64 not taken.
✓ Branch 65 taken 2 times.
✗ Branch 66 not taken.
✗ Branch 67 not taken.
1526 PetscValidLogicalCollectiveScalar(st,sigma,2);
772
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1526 STCheckMatrices(st,1);
773
774
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.
1526 PetscCall(PetscLogEventBegin(ST_MatSetUp,st,0,0,0));
775
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.
1526 PetscCall(STMatMAXPY_Private(st,sigma,0.0,0,coeffs,PETSC_TRUE,PETSC_FALSE,&st->P));
776
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.
1526 if (st->Psplit) PetscCall(STMatMAXPY_Private(st,sigma,0.0,0,coeffs,PETSC_TRUE,PETSC_TRUE,&st->Pmat));
777
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.
1526 PetscCall(ST_KSPSetOperators(st,st->P,st->Pmat?st->Pmat:st->P));
778
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.
1526 PetscCall(KSPSetUp(st->ksp));
779
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.
1526 PetscCall(PetscLogEventEnd(ST_MatSetUp,st,0,0,0));
780
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.
298 PetscFunctionReturn(PETSC_SUCCESS);
781 }
782
783 /*@
784 STSetWorkVecs - Sets a number of work vectors into the `ST` object.
785
786 Collective
787
788 Input Parameters:
789 + st - the spectral transformation context
790 - nw - number of work vectors to allocate
791
792 Developer Notes:
793 This is `SLEPC_EXTERN` because it may be required by shell `ST`s.
794
795 Level: developer
796
797 .seealso: [](ch:st), `STMatCreateVecs()`
798 @*/
799 4005 PetscErrorCode STSetWorkVecs(ST st,PetscInt nw)
800 {
801 4005 PetscInt i;
802
803
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
4005 PetscFunctionBegin;
804
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.
4005 PetscValidHeaderSpecific(st,ST_CLASSID,1);
805
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.
4005 PetscValidLogicalCollectiveInt(st,nw,2);
806
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
4005 PetscCheck(nw>0,PetscObjectComm((PetscObject)st),PETSC_ERR_ARG_OUTOFRANGE,"nw must be > 0: nw = %" PetscInt_FMT,nw);
807
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4005 if (st->nwork < nw) {
808
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.
3785 PetscCall(VecDestroyVecs(st->nwork,&st->work));
809 3785 st->nwork = nw;
810
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.
3785 PetscCall(PetscMalloc1(nw,&st->work));
811
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.
8012 for (i=0;i<nw;i++) PetscCall(STMatCreateVecs(st,&st->work[i],NULL));
812 }
813
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.
776 PetscFunctionReturn(PETSC_SUCCESS);
814 }
815