GCC Code Coverage Report


Directory: ./
File: src/sys/classes/st/interface/stsolve.c
Date: 2026-03-15 03:56:54
Exec Total Coverage
Lines: 358 367 97.5%
Functions: 26 26 100.0%
Branches: 1034 2072 49.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 ST interface routines, callable by users
12 */
13
14 #include <slepc/private/stimpl.h> /*I "slepcst.h" I*/
15
16 1142156 PetscErrorCode STApply_Generic(ST st,Vec x,Vec y)
17 {
18
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1142156 PetscFunctionBegin;
19
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
1142156 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.
259046 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.
259046 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.
883110 } 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.
182191 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.
227480 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()`, `STApplyMat()`
44 @*/
45 592181 PetscErrorCode STApply(ST st,Vec x,Vec y)
46 {
47 592181 Mat Op;
48
49
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
592181 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.
592181 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.
592181 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.
592181 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.
592181 PetscValidType(st,1);
54
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
592181 STCheckMatrices(st,1);
55
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
592181 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.
592181 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.
592181 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.
592181 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.
118786 PetscFunctionReturn(PETSC_SUCCESS);
60 }
61
62 51636 PetscErrorCode STApplyMat_Generic(ST st,Mat B,Mat C)
63 {
64 51636 Mat work;
65
66
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
51636 PetscFunctionBegin;
67
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
51636 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.
31214 } 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.
15710 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.
10122 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 15054 PetscErrorCode STApplyMat(ST st,Mat X,Mat Y)
95 {
96
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
15054 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.
15054 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.
15054 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.
15054 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.
15054 PetscValidType(st,1);
101
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
15054 STCheckMatrices(st,1);
102
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
15054 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.
15054 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.
3007 PetscFunctionReturn(PETSC_SUCCESS);
105 }
106
107 8190 PetscErrorCode STApplyTranspose_Generic(ST st,Vec x,Vec y)
108 {
109
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
8190 PetscFunctionBegin;
110
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
8190 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.
6405 } 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.
2562 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.
1570 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 4623 PetscErrorCode STApplyHermitianTranspose(ST st,Vec x,Vec y)
186 {
187 4623 Mat Op;
188
189
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
4623 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.
4623 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.
4623 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.
4623 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.
4623 PetscValidType(st,1);
194
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
4623 STCheckMatrices(st,1);
195
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
4623 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.
4623 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.
4623 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.
4623 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.
911 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 1265474 static PetscErrorCode MatMult_STOperator(Mat Op,Vec x,Vec y)
245 {
246 1265474 ST st;
247
248
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1265474 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.
1265474 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.
1265474 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.
1265474 PetscCall(PetscLogEventBegin(ST_Apply,st,x,y,0));
252
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1265474 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.
1258429 } 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.
1265474 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.
250816 PetscFunctionReturn(PETSC_SUCCESS);
259 }
260
261 8610 static PetscErrorCode MatMultTranspose_STOperator(Mat Op,Vec x,Vec y)
262 {
263 8610 ST st;
264
265
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
8610 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.
8610 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.
8610 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.
8610 PetscCall(PetscLogEventBegin(ST_ApplyTranspose,st,x,y,0));
269
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
8610 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.
8360 } 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.
8610 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.
1646 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 36582 static PetscErrorCode MatMatMult_STOperator(Mat Op,Mat B,Mat C,void *ctx)
312 {
313 36582 ST st;
314
315
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
36582 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.
36582 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.
36582 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.
36582 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.
36582 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.
36582 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.
7115 PetscFunctionReturn(PETSC_SUCCESS);
322 }
323
324 648148 PetscErrorCode STGetOperator_Private(ST st,Mat *Op)
325 {
326 648148 PetscInt m,n,M,N;
327 648148 Vec v;
328 648148 VecType vtype;
329
330
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
648148 PetscFunctionBegin;
331
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
648148 if (!st->Op) {
332
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
5852 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.
5852 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.
5852 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.
5852 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.
5852 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.
5852 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.
2861 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.
2991 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.
5852 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.
5016 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.
5016 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.
5016 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.
5852 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.
5852 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.
5852 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.
5852 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.
5852 PetscCall(STComputeOperator(st));
356 }
357
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
648148 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.
129748 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 51254 PetscErrorCode STGetOperator(ST st,Mat *Op)
406 {
407
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
51254 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.
51254 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.
51254 PetscValidType(st,1);
410
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
51254 STCheckMatrices(st,1);
411
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
51254 STCheckNotSeized(st,1);
412
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
51254 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.
51254 PetscCall(STGetOperator_Private(st,Op));
414
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
51254 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.
10033 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 50929 PetscErrorCode STRestoreOperator(ST st,Mat *Op)
435 {
436
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
50929 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.
50929 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.
50929 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.
50929 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.
50929 PetscCheck(st->opseized,PetscObjectComm((PetscObject)st),PETSC_ERR_ARG_WRONGSTATE,"Must be called after STGetOperator()");
441 50929 *Op = NULL;
442 50929 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.
50929 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 14800 PetscErrorCode STComputeOperator(ST st)
466 {
467 14800 PC pc;
468
469
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
14800 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.
14800 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.
14800 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.
14800 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.
8760 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.
8760 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.
8760 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.
8760 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.
8760 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.
8760 PetscCall(PetscLogEventEnd(ST_ComputeOperator,st,0,0,0));
479
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
8760 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 14800 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.
14800 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 1332308 PetscErrorCode STSetUp(ST st)
508 {
509 1332308 PetscInt i,n,k;
510
511
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1332308 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.
1332308 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.
1332308 PetscValidType(st,1);
514
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1332308 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.
1332308 switch (st->state) {
516 10694 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.
10694 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.
10694 if (!((PetscObject)st)->type_name) PetscCall(STSetType(st,STSHIFT));
519 break;
520 261721 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.
261721 PetscFunctionReturn(PETSC_SUCCESS);
522 541 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.
541 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.
11235 PetscCall(PetscLogEventBegin(ST_SetUp,st,0,0,0));
527
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
11235 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.
10694 if (!(st->nmat<3 && st->opready)) {
529
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
10429 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.
10429 PetscCall(MatDestroy(&st->P));
533 }
534 }
535
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
11235 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.
11235 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.
2287 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.
11235 PetscTryTypeMethod(st,setup);
546 11235 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.
11235 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.
2174 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 16266 PetscErrorCode STMatMAXPY_Private(ST st,PetscScalar alpha,PetscScalar beta,PetscInt k,PetscScalar *coeffs,PetscBool initial,PetscBool precond,Mat *S)
563 {
564 16266 PetscInt *matIdx=NULL,nmat,i,ini=-1;
565 16266 PetscScalar t=1.0,ta,gamma;
566 16266 PetscBool nz=PETSC_FALSE;
567
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
16266 Mat *A=precond?st->Psplit:st->A;
568
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
16266 MatStructure str=precond?st->strp:st->str;
569
570
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
16266 PetscFunctionBegin;
571 16266 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.
16266 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 1094 case ST_MATMODE_SHELL:
587
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1094 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.
1094 if (initial) {
589
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
879 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.
879 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.
879 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 14932 case ST_MATMODE_COPY:
598
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
14932 if (coeffs) {
599
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
5894 for (i=0;i<nmat && ini==-1;i++) {
600
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3452 if (coeffs[i]!=0.0) ini = i;
601 1010 else t *= alpha;
602 }
603
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
2442 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.
4569 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 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
14932 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.
7270 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.
7270 PetscCall(MatDestroy(S));
609 7270 *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.
7662 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.
5288 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.
5288 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.
2374 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.
2374 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.
2374 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.
7662 if (coeffs && coeffs[ini]!=1.0) PetscCall(MatScale(*S,coeffs[ini]));
620
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
17878 for (i=ini+k+1;i<PetscMax(2,st->nmat);i++) {
621 10216 t *= alpha;
622 10216 ta = t;
623
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
10216 if (coeffs) ta *= coeffs[i-k];
624
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
10216 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.
10206 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.
10216 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.
16266 PetscCall(MatSetOption(*S,MAT_SYMMETRIC,st->asymm));
632
7/8
✓ 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 not taken.
✓ Branch 7 taken 1 times.
17913 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.
3190 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 11660 PetscErrorCode STPostSolve(ST st)
671 {
672
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
11660 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.
11660 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.
11660 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.
11660 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.
2256 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 19706016 PetscErrorCode STBackTransform(ST st,PetscInt n,PetscScalar eigr[],PetscScalar eigi[])
697 {
698
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
19706016 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.
19706016 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.
19706016 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.
19706016 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.
3993990 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 7688 PetscErrorCode STIsInjective(ST st,PetscBool* is)
728 {
729 7688 PetscBool shell;
730
731
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
7688 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.
7688 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.
7688 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.
7688 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.
7688 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.
7688 if (shell) PetscCall(STIsInjective_Shell(st,is));
738 7357 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.
1454 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 1574 PetscErrorCode STMatSetUp(ST st,PetscScalar sigma,PetscScalar coeffs[])
768 {
769
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1574 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.
1574 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.
1574 PetscValidLogicalCollectiveScalar(st,sigma,2);
772
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1574 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.
1574 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.
1574 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.
1574 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.
1574 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.
1574 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.
1574 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.
304 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 4029 PetscErrorCode STSetWorkVecs(ST st,PetscInt nw)
800 {
801 4029 PetscInt i;
802
803
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
4029 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.
4029 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.
4029 PetscValidLogicalCollectiveInt(st,nw,2);
806
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
4029 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.
4029 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.
3809 PetscCall(VecDestroyVecs(st->nwork,&st->work));
809 3809 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.
3809 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.
8060 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.
782 PetscFunctionReturn(PETSC_SUCCESS);
814 }
815