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 |