GCC Code Coverage Report


Directory: ./
File: src/sys/classes/st/interface/stshellmat.c
Date: 2025-10-03 04:28:47
Exec Total Coverage
Lines: 117 125 93.6%
Functions: 7 7 100.0%
Branches: 276 464 59.5%

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 Subroutines that implement various operations of the matrix associated with
12 the shift-and-invert technique for eigenvalue problems
13 */
14
15 #include <slepc/private/stimpl.h>
16
17 typedef struct {
18 PetscScalar alpha;
19 PetscScalar *coeffs;
20 ST st;
21 Vec z;
22 PetscInt nmat;
23 PetscInt *matIdx;
24 } ST_MATSHELL;
25
26 215 PetscErrorCode STMatShellShift(Mat A,PetscScalar alpha)
27 {
28 215 ST_MATSHELL *ctx;
29
30
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
215 PetscFunctionBegin;
31
4/6
✓ Branch 0 taken 2 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 PetscCall(MatShellGetContext(A,&ctx));
32 215 ctx->alpha = alpha;
33
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
215 PetscCall(PetscObjectStateIncrease((PetscObject)A));
34
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.
215 PetscFunctionReturn(PETSC_SUCCESS);
35 }
36
37 /*
38 For i=0:nmat-1 computes y = (sum_i (coeffs[i]*alpha^i*st->A[idx[i]]))x
39 If null coeffs computes with coeffs[i]=1.0
40 */
41 172365 static PetscErrorCode MatMult_Shell(Mat A,Vec x,Vec y)
42 {
43 172365 ST_MATSHELL *ctx;
44 172365 ST st;
45 172365 PetscInt i;
46 172365 PetscScalar t=1.0,c;
47
48
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
172365 PetscFunctionBegin;
49
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
172365 PetscCall(MatShellGetContext(A,&ctx));
50 172365 st = ctx->st;
51
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
172365 PetscCall(MatMult(st->A[ctx->matIdx[0]],x,y));
52
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.
172365 if (ctx->coeffs && ctx->coeffs[0]!=1.0) PetscCall(VecScale(y,ctx->coeffs[0]));
53
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
172365 if (ctx->alpha!=0.0) {
54
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
11955 for (i=1;i<ctx->nmat;i++) {
55
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6339 PetscCall(MatMult(st->A[ctx->matIdx[i]],x,ctx->z));
56 6339 t *= ctx->alpha;
57
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6339 c = (ctx->coeffs)?t*ctx->coeffs[i]:t;
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.
6339 PetscCall(VecAXPY(y,c,ctx->z));
59 }
60
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.
5616 if (ctx->nmat==1) PetscCall(VecAXPY(y,ctx->alpha,x)); /* y = (A + alpha*I) x */
61 }
62
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.
35109 PetscFunctionReturn(PETSC_SUCCESS);
63 }
64
65 2383 static PetscErrorCode MatMultTranspose_Shell(Mat A,Vec x,Vec y)
66 {
67 2383 ST_MATSHELL *ctx;
68 2383 ST st;
69 2383 PetscInt i;
70 2383 PetscScalar t=1.0,c;
71
72
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2383 PetscFunctionBegin;
73
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2383 PetscCall(MatShellGetContext(A,&ctx));
74 2383 st = ctx->st;
75
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2383 PetscCall(MatMultTranspose(st->A[ctx->matIdx[0]],x,y));
76
1/10
✗ 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.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
2383 if (ctx->coeffs && ctx->coeffs[0]!=1.0) PetscCall(VecScale(y,ctx->coeffs[0]));
77
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 times.
2383 if (ctx->alpha!=0.0) {
78
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
2378 for (i=1;i<ctx->nmat;i++) {
79 PetscCall(MatMultTranspose(st->A[ctx->matIdx[i]],x,ctx->z));
80 t *= ctx->alpha;
81 c = (ctx->coeffs)?t*ctx->coeffs[i]:t;
82 PetscCall(VecAXPY(y,c,ctx->z));
83 }
84
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.
2378 if (ctx->nmat==1) PetscCall(VecAXPY(y,ctx->alpha,x)); /* y = (A + alpha*I) x */
85 }
86
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.
473 PetscFunctionReturn(PETSC_SUCCESS);
87 }
88
89 #if defined(PETSC_USE_COMPLEX)
90 25 static PetscErrorCode MatMultHermitianTranspose_Shell(Mat A,Vec x,Vec y)
91 {
92 25 ST_MATSHELL *ctx;
93 25 ST st;
94 25 PetscInt i;
95 25 PetscScalar t=1.0,c;
96
97
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
25 PetscFunctionBegin;
98
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
25 PetscCall(MatShellGetContext(A,&ctx));
99 25 st = ctx->st;
100
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.
25 PetscCall(MatMultHermitianTranspose(st->A[ctx->matIdx[0]],x,y));
101
1/10
✗ Branch 0 not taken.
✓ Branch 1 taken 5 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.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
25 if (ctx->coeffs && ctx->coeffs[0]!=1.0) PetscCall(VecScale(y,PetscConj(ctx->coeffs[0])));
102
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
25 if (ctx->alpha!=0.0) {
103
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
20 for (i=1;i<ctx->nmat;i++) {
104 PetscCall(MatMultHermitianTranspose(st->A[ctx->matIdx[i]],x,ctx->z));
105 t *= ctx->alpha;
106 c = (ctx->coeffs)?t*ctx->coeffs[i]:t;
107 PetscCall(VecAXPY(y,PetscConj(c),ctx->z));
108 }
109
5/8
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ 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.
20 if (ctx->nmat==1) PetscCall(VecAXPY(y,PetscConj(ctx->alpha),x)); /* y = (A + alpha*I) x */
110 }
111
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.
5 PetscFunctionReturn(PETSC_SUCCESS);
112 }
113 #endif
114
115 235 static PetscErrorCode MatGetDiagonal_Shell(Mat A,Vec diag)
116 {
117 235 ST_MATSHELL *ctx;
118 235 ST st;
119 235 Vec diagb;
120 235 PetscInt i;
121 235 PetscScalar t=1.0,c;
122
123
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
235 PetscFunctionBegin;
124
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
235 PetscCall(MatShellGetContext(A,&ctx));
125 235 st = ctx->st;
126
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
235 PetscCall(MatGetDiagonal(st->A[ctx->matIdx[0]],diag));
127
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.
235 if (ctx->coeffs && ctx->coeffs[0]!=1.0) PetscCall(VecScale(diag,ctx->coeffs[0]));
128
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
235 if (ctx->alpha!=0.0) {
129
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.
210 if (ctx->nmat==1) PetscCall(VecShift(diag,ctx->alpha)); /* y = (A + alpha*I) x */
130 else {
131
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
80 PetscCall(VecDuplicate(diag,&diagb));
132
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
220 for (i=1;i<ctx->nmat;i++) {
133
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
140 PetscCall(MatGetDiagonal(st->A[ctx->matIdx[i]],diagb));
134 140 t *= ctx->alpha;
135
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
140 c = (ctx->coeffs)?t*ctx->coeffs[i]:t;
136
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
140 PetscCall(VecAYPX(diag,c,diagb));
137 }
138
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
80 PetscCall(VecDestroy(&diagb));
139 }
140 }
141
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.
47 PetscFunctionReturn(PETSC_SUCCESS);
142 }
143
144 875 static PetscErrorCode MatDestroy_Shell(Mat A)
145 {
146 875 ST_MATSHELL *ctx;
147
148
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
875 PetscFunctionBegin;
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.
875 PetscCall(MatShellGetContext(A,&ctx));
150
4/6
✓ Branch 0 taken 2 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(VecDestroy(&ctx->z));
151
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.
875 PetscCall(PetscFree(ctx->matIdx));
152
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.
875 PetscCall(PetscFree(ctx->coeffs));
153
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.
875 PetscCall(PetscFree(ctx));
154
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.
173 PetscFunctionReturn(PETSC_SUCCESS);
155 }
156
157 875 PetscErrorCode STMatShellCreate(ST st,PetscScalar alpha,PetscInt nmat,PetscInt *matIdx,PetscScalar *coeffs,Mat *mat)
158 {
159 875 PetscInt n,m,N,M,i;
160 875 PetscBool has=PETSC_FALSE,hasA,hasB;
161 875 ST_MATSHELL *ctx;
162
163
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
875 PetscFunctionBegin;
164
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
875 PetscCall(MatGetSize(st->A[0],&M,&N));
165
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
875 PetscCall(MatGetLocalSize(st->A[0],&m,&n));
166
4/6
✓ Branch 0 taken 2 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(PetscNew(&ctx));
167 875 ctx->st = st;
168 875 ctx->alpha = alpha;
169
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
875 ctx->nmat = matIdx?nmat:st->nmat;
170
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
875 PetscCall(PetscMalloc1(ctx->nmat,&ctx->matIdx));
171
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
875 if (matIdx) {
172
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
390 for (i=0;i<ctx->nmat;i++) ctx->matIdx[i] = matIdx[i];
173 } else {
174 775 ctx->matIdx[0] = 0;
175
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
775 if (ctx->nmat>1) ctx->matIdx[1] = 1;
176 }
177
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
875 if (coeffs) {
178
4/6
✓ Branch 0 taken 2 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(ctx->nmat,&ctx->coeffs));
179
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
390 for (i=0;i<ctx->nmat;i++) ctx->coeffs[i] = coeffs[i];
180 }
181
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
875 PetscCall(MatCreateVecs(st->A[0],&ctx->z,NULL));
182
4/6
✓ Branch 0 taken 2 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(MatCreateShell(PetscObjectComm((PetscObject)st),m,n,M,N,(void*)ctx,mat));
183
4/6
✓ Branch 0 taken 2 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(MatShellSetOperation(*mat,MATOP_MULT,(PetscErrorCodeFn*)MatMult_Shell));
184
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
875 PetscCall(MatShellSetOperation(*mat,MATOP_MULT_TRANSPOSE,(PetscErrorCodeFn*)MatMultTranspose_Shell));
185 #if defined(PETSC_USE_COMPLEX)
186
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.
438 PetscCall(MatShellSetOperation(*mat,MATOP_MULT_HERMITIAN_TRANSPOSE,(PetscErrorCodeFn*)MatMultHermitianTranspose_Shell));
187 #else
188
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.
437 PetscCall(MatShellSetOperation(*mat,MATOP_MULT_HERMITIAN_TRANSPOSE,(PetscErrorCodeFn*)MatMultTranspose_Shell));
189 #endif
190
4/6
✓ Branch 0 taken 2 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(MatShellSetOperation(*mat,MATOP_DESTROY,(PetscErrorCodeFn*)MatDestroy_Shell));
191
192
4/6
✓ Branch 0 taken 2 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(MatHasOperation(st->A[ctx->matIdx[0]],MATOP_GET_DIAGONAL,&hasA));
193
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
875 if (st->nmat>1) {
194 332 has = hasA;
195
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
754 for (i=1;i<ctx->nmat;i++) {
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.
422 PetscCall(MatHasOperation(st->A[ctx->matIdx[i]],MATOP_GET_DIAGONAL,&hasB));
197
2/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
422 has = (has && hasB)? PETSC_TRUE: PETSC_FALSE;
198 }
199 }
200
10/12
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
875 if ((hasA && st->nmat==1) || has) PetscCall(MatShellSetOperation(*mat,MATOP_GET_DIAGONAL,(PetscErrorCodeFn*)MatGetDiagonal_Shell));
201
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.
173 PetscFunctionReturn(PETSC_SUCCESS);
202 }
203