| 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 |