| 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 | Implements the Cayley spectral transform | ||
| 12 | */ | ||
| 13 | |||
| 14 | #include <slepc/private/stimpl.h> /*I "slepcst.h" I*/ | ||
| 15 | |||
| 16 | typedef struct { | ||
| 17 | PetscScalar nu; | ||
| 18 | PetscBool nu_set; | ||
| 19 | } ST_CAYLEY; | ||
| 20 | |||
| 21 | 130 | static PetscErrorCode MatMult_Cayley(Mat B,Vec x,Vec y) | |
| 22 | { | ||
| 23 | 130 | ST st; | |
| 24 | 130 | ST_CAYLEY *ctx; | |
| 25 | 130 | PetscScalar nu; | |
| 26 | |||
| 27 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
130 | PetscFunctionBegin; |
| 28 |
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(MatShellGetContext(B,&st)); |
| 29 | 130 | ctx = (ST_CAYLEY*)st->data; | |
| 30 | 130 | nu = ctx->nu; | |
| 31 | |||
| 32 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
130 | if (st->matmode == ST_MATMODE_INPLACE) nu = nu + st->sigma; |
| 33 | |||
| 34 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
130 | if (st->nmat>1) { |
| 35 | /* generalized eigenproblem: y = (A + tB)x */ | ||
| 36 |
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.
|
40 | PetscCall(MatMult(st->A[0],x,y)); |
| 37 |
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.
|
40 | PetscCall(MatMult(st->A[1],x,st->work[1])); |
| 38 |
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.
|
40 | PetscCall(VecAXPY(y,nu,st->work[1])); |
| 39 | } else { | ||
| 40 | /* standard eigenproblem: y = (A + tI)x */ | ||
| 41 |
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(MatMult(st->A[0],x,y)); |
| 42 |
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(VecAXPY(y,nu,x)); |
| 43 | } | ||
| 44 |
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.
|
26 | PetscFunctionReturn(PETSC_SUCCESS); |
| 45 | } | ||
| 46 | |||
| 47 | 40 | static PetscErrorCode MatMultTranspose_Cayley(Mat B,Vec x,Vec y) | |
| 48 | { | ||
| 49 | 40 | ST st; | |
| 50 | 40 | ST_CAYLEY *ctx; | |
| 51 | 40 | PetscScalar nu; | |
| 52 | |||
| 53 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
40 | PetscFunctionBegin; |
| 54 |
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.
|
40 | PetscCall(MatShellGetContext(B,&st)); |
| 55 | 40 | ctx = (ST_CAYLEY*)st->data; | |
| 56 | 40 | nu = ctx->nu; | |
| 57 | |||
| 58 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
40 | if (st->matmode == ST_MATMODE_INPLACE) nu = nu + st->sigma; |
| 59 | 40 | nu = PetscConj(nu); | |
| 60 | |||
| 61 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
40 | if (st->nmat>1) { |
| 62 | /* generalized eigenproblem: y = (A + tB)x */ | ||
| 63 | ✗ | PetscCall(MatMultTranspose(st->A[0],x,y)); | |
| 64 | ✗ | PetscCall(MatMultTranspose(st->A[1],x,st->work[1])); | |
| 65 | ✗ | PetscCall(VecAXPY(y,nu,st->work[1])); | |
| 66 | } else { | ||
| 67 | /* standard eigenproblem: y = (A + tI)x */ | ||
| 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.
|
40 | PetscCall(MatMultTranspose(st->A[0],x,y)); |
| 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.
|
40 | PetscCall(VecAXPY(y,nu,x)); |
| 70 | } | ||
| 71 |
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.
|
8 | PetscFunctionReturn(PETSC_SUCCESS); |
| 72 | } | ||
| 73 | |||
| 74 | 85 | static PetscErrorCode STGetBilinearForm_Cayley(ST st,Mat *B) | |
| 75 | { | ||
| 76 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
85 | PetscFunctionBegin; |
| 77 |
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.
|
85 | PetscCall(STSetUp(st)); |
| 78 | 85 | *B = st->T[0]; | |
| 79 |
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.
|
85 | PetscCall(PetscObjectReference((PetscObject)*B)); |
| 80 |
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.
|
17 | PetscFunctionReturn(PETSC_SUCCESS); |
| 81 | } | ||
| 82 | |||
| 83 | 7128 | static PetscErrorCode STBackTransform_Cayley(ST st,PetscInt n,PetscScalar *eigr,PetscScalar *eigi) | |
| 84 | { | ||
| 85 | 7128 | ST_CAYLEY *ctx = (ST_CAYLEY*)st->data; | |
| 86 | 7128 | PetscInt j; | |
| 87 | #if !defined(PETSC_USE_COMPLEX) | ||
| 88 | 3403 | PetscScalar t,i,r; | |
| 89 | #endif | ||
| 90 | |||
| 91 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
7128 | PetscFunctionBegin; |
| 92 | #if !defined(PETSC_USE_COMPLEX) | ||
| 93 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
10199 | for (j=0;j<n;j++) { |
| 94 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
6796 | if (eigi[j] == 0.0) eigr[j] = (ctx->nu + eigr[j] * st->sigma) / (eigr[j] - 1.0); |
| 95 | else { | ||
| 96 | 297 | r = eigr[j]; | |
| 97 | 297 | i = eigi[j]; | |
| 98 | 297 | r = st->sigma * (r * r + i * i - r) + ctx->nu * (r - 1); | |
| 99 | 297 | i = - st->sigma * i - ctx->nu * i; | |
| 100 | 297 | t = i * i + r * (r - 2.0) + 1.0; | |
| 101 | 297 | eigr[j] = r / t; | |
| 102 | 297 | eigi[j] = i / t; | |
| 103 | } | ||
| 104 | } | ||
| 105 | #else | ||
| 106 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
11165 | for (j=0;j<n;j++) { |
| 107 | 7440 | eigr[j] = (ctx->nu + eigr[j] * st->sigma) / (eigr[j] - 1.0); | |
| 108 | } | ||
| 109 | #endif | ||
| 110 |
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.
|
7128 | PetscFunctionReturn(PETSC_SUCCESS); |
| 111 | } | ||
| 112 | |||
| 113 | 65 | static PetscErrorCode STPostSolve_Cayley(ST st) | |
| 114 | { | ||
| 115 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
65 | PetscFunctionBegin; |
| 116 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
65 | if (st->matmode == ST_MATMODE_INPLACE) { |
| 117 |
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.
|
15 | if (st->nmat>1) PetscCall(MatAXPY(st->A[0],st->sigma,st->A[1],st->str)); |
| 118 |
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.
|
15 | else PetscCall(MatShift(st->A[0],st->sigma)); |
| 119 | 15 | st->Astate[0] = ((PetscObject)st->A[0])->state; | |
| 120 | 15 | st->state = ST_STATE_INITIAL; | |
| 121 | 15 | st->opready = PETSC_FALSE; | |
| 122 | } | ||
| 123 |
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.
|
13 | PetscFunctionReturn(PETSC_SUCCESS); |
| 124 | } | ||
| 125 | |||
| 126 | /* | ||
| 127 | Operator (cayley): | ||
| 128 | Op P M | ||
| 129 | if nmat=1: (A-sI)^-1 (A+tI) A-sI A+tI | ||
| 130 | if nmat=2: (A-sB)^-1 (A+tB) A-sB A+tI | ||
| 131 | */ | ||
| 132 | 160 | static PetscErrorCode STComputeOperator_Cayley(ST st) | |
| 133 | { | ||
| 134 | 160 | PetscInt n,m; | |
| 135 | 160 | ST_CAYLEY *ctx = (ST_CAYLEY*)st->data; | |
| 136 | |||
| 137 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
160 | PetscFunctionBegin; |
| 138 | /* if the user did not set the shift, use the target value */ | ||
| 139 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
160 | if (!st->sigma_set) st->sigma = st->defsigma; |
| 140 | |||
| 141 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
160 | if (!ctx->nu_set) ctx->nu = st->sigma; |
| 142 |
1/6✗ 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.
|
160 | PetscCheck(ctx->nu!=0.0 || st->sigma!=0.0,PetscObjectComm((PetscObject)st),PETSC_ERR_USER_INPUT,"Values of shift and antishift cannot be zero simultaneously"); |
| 143 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
160 | PetscCheck(ctx->nu!=-st->sigma,PetscObjectComm((PetscObject)st),PETSC_ERR_USER_INPUT,"It is not allowed to set the antishift equal to minus the shift (the target)"); |
| 144 | |||
| 145 | /* T[0] = A+nu*B */ | ||
| 146 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
160 | if (st->matmode==ST_MATMODE_INPLACE) { |
| 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.
|
40 | PetscCall(MatGetLocalSize(st->A[0],&n,&m)); |
| 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.
|
40 | PetscCall(MatCreateShell(PetscObjectComm((PetscObject)st),n,m,PETSC_DETERMINE,PETSC_DETERMINE,st,&st->T[0])); |
| 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.
|
40 | PetscCall(MatShellSetOperation(st->T[0],MATOP_MULT,(PetscErrorCodeFn*)MatMult_Cayley)); |
| 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.
|
40 | PetscCall(MatShellSetOperation(st->T[0],MATOP_MULT_TRANSPOSE,(PetscErrorCodeFn*)MatMultTranspose_Cayley)); |
| 151 |
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.
|
120 | } else PetscCall(STMatMAXPY_Private(st,ctx->nu,0.0,0,NULL,PetscNot(st->state==ST_STATE_UPDATED),PETSC_FALSE,&st->T[0])); |
| 152 | 160 | st->M = st->T[0]; | |
| 153 | |||
| 154 | /* T[1] = A-sigma*B */ | ||
| 155 |
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.
|
160 | PetscCall(STMatMAXPY_Private(st,-st->sigma,0.0,0,NULL,PetscNot(st->state==ST_STATE_UPDATED),PETSC_FALSE,&st->T[1])); |
| 156 |
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.
|
160 | PetscCall(PetscObjectReference((PetscObject)st->T[1])); |
| 157 |
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.
|
160 | PetscCall(MatDestroy(&st->P)); |
| 158 | 160 | st->P = st->T[1]; | |
| 159 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
160 | if (st->Psplit) { /* build custom preconditioner from the split matrices */ |
| 160 |
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.
|
20 | PetscCall(STMatMAXPY_Private(st,-st->sigma,0.0,0,NULL,PETSC_TRUE,PETSC_TRUE,&st->Pmat)); |
| 161 | } | ||
| 162 |
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.
|
32 | PetscFunctionReturn(PETSC_SUCCESS); |
| 163 | } | ||
| 164 | |||
| 165 | 160 | static PetscErrorCode STSetUp_Cayley(ST st) | |
| 166 | { | ||
| 167 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
160 | PetscFunctionBegin; |
| 168 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
160 | PetscCheck(st->nmat<=2,PetscObjectComm((PetscObject)st),PETSC_ERR_SUP,"Cayley transform cannot be used in polynomial eigenproblems"); |
| 169 |
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.
|
160 | PetscCall(STSetWorkVecs(st,2)); |
| 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.
|
160 | PetscCall(KSPSetUp(st->ksp)); |
| 171 |
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.
|
32 | PetscFunctionReturn(PETSC_SUCCESS); |
| 172 | } | ||
| 173 | |||
| 174 | 95 | static PetscErrorCode STSetShift_Cayley(ST st,PetscScalar newshift) | |
| 175 | { | ||
| 176 | 95 | ST_CAYLEY *ctx = (ST_CAYLEY*)st->data; | |
| 177 | |||
| 178 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
95 | PetscFunctionBegin; |
| 179 |
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.
|
95 | PetscCheck(newshift!=0.0 || (ctx->nu_set && ctx->nu!=0.0),PetscObjectComm((PetscObject)st),PETSC_ERR_USER_INPUT,"Values of shift and antishift cannot be zero simultaneously"); |
| 180 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
95 | PetscCheck(ctx->nu!=-newshift,PetscObjectComm((PetscObject)st),PETSC_ERR_USER_INPUT,"It is not allowed to set the shift equal to minus the antishift"); |
| 181 | |||
| 182 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
95 | if (!ctx->nu_set) { |
| 183 |
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.
|
75 | if (st->matmode!=ST_MATMODE_INPLACE) PetscCall(STMatMAXPY_Private(st,newshift,ctx->nu,0,NULL,PETSC_FALSE,PETSC_FALSE,&st->T[0])); |
| 184 | 75 | ctx->nu = newshift; | |
| 185 | } | ||
| 186 |
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.
|
95 | PetscCall(STMatMAXPY_Private(st,-newshift,-st->sigma,0,NULL,PETSC_FALSE,PETSC_FALSE,&st->T[1])); |
| 187 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
95 | if (st->P!=st->T[1]) { |
| 188 |
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.
|
20 | PetscCall(PetscObjectReference((PetscObject)st->T[1])); |
| 189 |
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.
|
20 | PetscCall(MatDestroy(&st->P)); |
| 190 | 20 | st->P = st->T[1]; | |
| 191 | } | ||
| 192 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
95 | if (st->Psplit) { /* build custom preconditioner from the split matrices */ |
| 193 |
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.
|
20 | PetscCall(STMatMAXPY_Private(st,-newshift,-st->sigma,0,NULL,PETSC_FALSE,PETSC_TRUE,&st->Pmat)); |
| 194 | } | ||
| 195 |
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.
|
95 | PetscCall(ST_KSPSetOperators(st,st->P,st->Pmat?st->Pmat:st->P)); |
| 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.
|
95 | PetscCall(KSPSetUp(st->ksp)); |
| 197 |
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.
|
19 | PetscFunctionReturn(PETSC_SUCCESS); |
| 198 | } | ||
| 199 | |||
| 200 | 85 | static PetscErrorCode STSetFromOptions_Cayley(ST st,PetscOptionItems PetscOptionsObject) | |
| 201 | { | ||
| 202 | 85 | PetscScalar nu; | |
| 203 | 85 | PetscBool flg; | |
| 204 | 85 | ST_CAYLEY *ctx = (ST_CAYLEY*)st->data; | |
| 205 | |||
| 206 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
85 | PetscFunctionBegin; |
| 207 |
1/12✗ 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.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
85 | PetscOptionsHeadBegin(PetscOptionsObject,"ST Cayley Options"); |
| 208 | |||
| 209 |
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.
|
85 | PetscCall(PetscOptionsScalar("-st_cayley_antishift","Value of the antishift","STCayleySetAntishift",ctx->nu,&nu,&flg)); |
| 210 |
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.
|
85 | if (flg) PetscCall(STCayleySetAntishift(st,nu)); |
| 211 | |||
| 212 |
1/14✗ Branch 0 not taken.
✓ Branch 1 taken 2 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.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
85 | PetscOptionsHeadEnd(); |
| 213 |
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.
|
17 | PetscFunctionReturn(PETSC_SUCCESS); |
| 214 | } | ||
| 215 | |||
| 216 | 150 | static PetscErrorCode STCayleySetAntishift_Cayley(ST st,PetscScalar newshift) | |
| 217 | { | ||
| 218 | 150 | ST_CAYLEY *ctx = (ST_CAYLEY*)st->data; | |
| 219 | |||
| 220 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
150 | PetscFunctionBegin; |
| 221 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
150 | if (ctx->nu != newshift) { |
| 222 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
150 | STCheckNotSeized(st,1); |
| 223 |
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.
|
150 | if (st->state && st->matmode!=ST_MATMODE_INPLACE) PetscCall(STMatMAXPY_Private(st,newshift,ctx->nu,0,NULL,PETSC_FALSE,PETSC_FALSE,&st->T[0])); |
| 224 | 150 | ctx->nu = newshift; | |
| 225 | } | ||
| 226 | 150 | ctx->nu_set = PETSC_TRUE; | |
| 227 |
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.
|
150 | PetscFunctionReturn(PETSC_SUCCESS); |
| 228 | } | ||
| 229 | |||
| 230 | /*@ | ||
| 231 | STCayleySetAntishift - Sets the value of the anti-shift for the Cayley | ||
| 232 | spectral transformation. | ||
| 233 | |||
| 234 | Logically Collective | ||
| 235 | |||
| 236 | Input Parameters: | ||
| 237 | + st - the spectral transformation context | ||
| 238 | - nu - the anti-shift | ||
| 239 | |||
| 240 | Options Database Key: | ||
| 241 | . -st_cayley_antishift \<nu\> - sets the value of the anti-shift | ||
| 242 | |||
| 243 | Level: intermediate | ||
| 244 | |||
| 245 | Note: | ||
| 246 | In the generalized Cayley transform, the operator can be expressed as | ||
| 247 | $(A - \sigma B)^{-1}(A + \nu B)$. This function sets the value of $\nu$. | ||
| 248 | Use `STSetShift()` for setting $\sigma$. The value $\nu=-\sigma$ is not allowed. | ||
| 249 | |||
| 250 | .seealso: [](ch:st), `STCAYLEY`. `STSetShift()`, `STCayleyGetAntishift()` | ||
| 251 | @*/ | ||
| 252 | 190 | PetscErrorCode STCayleySetAntishift(ST st,PetscScalar nu) | |
| 253 | { | ||
| 254 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
190 | PetscFunctionBegin; |
| 255 |
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.
|
190 | PetscValidHeaderSpecific(st,ST_CLASSID,1); |
| 256 |
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.
|
190 | PetscValidLogicalCollectiveScalar(st,nu,2); |
| 257 |
10/14✓ 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 10 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
✓ 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.
|
190 | PetscTryMethod(st,"STCayleySetAntishift_C",(ST,PetscScalar),(st,nu)); |
| 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.
|
190 | PetscFunctionReturn(PETSC_SUCCESS); |
| 259 | } | ||
| 260 | |||
| 261 | 225 | static PetscErrorCode STCayleyGetAntishift_Cayley(ST st,PetscScalar *nu) | |
| 262 | { | ||
| 263 | 225 | ST_CAYLEY *ctx = (ST_CAYLEY*)st->data; | |
| 264 | |||
| 265 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
225 | PetscFunctionBegin; |
| 266 | 225 | *nu = ctx->nu; | |
| 267 |
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.
|
225 | PetscFunctionReturn(PETSC_SUCCESS); |
| 268 | } | ||
| 269 | |||
| 270 | /*@ | ||
| 271 | STCayleyGetAntishift - Gets the value of the anti-shift used in the Cayley | ||
| 272 | spectral transformation. | ||
| 273 | |||
| 274 | Not Collective | ||
| 275 | |||
| 276 | Input Parameter: | ||
| 277 | . st - the spectral transformation context | ||
| 278 | |||
| 279 | Output Parameter: | ||
| 280 | . nu - the anti-shift | ||
| 281 | |||
| 282 | Level: intermediate | ||
| 283 | |||
| 284 | .seealso: [](ch:st), `STCAYLEY`, `STGetShift()`, `STCayleySetAntishift()` | ||
| 285 | @*/ | ||
| 286 | 225 | PetscErrorCode STCayleyGetAntishift(ST st,PetscScalar *nu) | |
| 287 | { | ||
| 288 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
225 | PetscFunctionBegin; |
| 289 |
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.
|
225 | PetscValidHeaderSpecific(st,ST_CLASSID,1); |
| 290 |
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.
|
225 | PetscAssertPointer(nu,2); |
| 291 |
9/16✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
✗ 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.
|
225 | PetscUseMethod(st,"STCayleyGetAntishift_C",(ST,PetscScalar*),(st,nu)); |
| 292 |
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.
|
225 | PetscFunctionReturn(PETSC_SUCCESS); |
| 293 | } | ||
| 294 | |||
| 295 | ✗ | static PetscErrorCode STView_Cayley(ST st,PetscViewer viewer) | |
| 296 | { | ||
| 297 | ✗ | char str[50]; | |
| 298 | ✗ | ST_CAYLEY *ctx = (ST_CAYLEY*)st->data; | |
| 299 | ✗ | PetscBool isascii; | |
| 300 | |||
| 301 | ✗ | PetscFunctionBegin; | |
| 302 | ✗ | PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii)); | |
| 303 | ✗ | if (isascii) { | |
| 304 | ✗ | PetscCall(SlepcSNPrintfScalar(str,sizeof(str),ctx->nu,PETSC_FALSE)); | |
| 305 | ✗ | PetscCall(PetscViewerASCIIPrintf(viewer," antishift: %s\n",str)); | |
| 306 | } | ||
| 307 | ✗ | PetscFunctionReturn(PETSC_SUCCESS); | |
| 308 | } | ||
| 309 | |||
| 310 | 160 | static PetscErrorCode STDestroy_Cayley(ST st) | |
| 311 | { | ||
| 312 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
160 | PetscFunctionBegin; |
| 313 |
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.
|
160 | PetscCall(PetscFree(st->data)); |
| 314 |
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.
|
160 | PetscCall(PetscObjectComposeFunction((PetscObject)st,"STCayleySetAntishift_C",NULL)); |
| 315 |
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.
|
160 | PetscCall(PetscObjectComposeFunction((PetscObject)st,"STCayleyGetAntishift_C",NULL)); |
| 316 |
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.
|
32 | PetscFunctionReturn(PETSC_SUCCESS); |
| 317 | } | ||
| 318 | |||
| 319 | /*MC | ||
| 320 | STCAYLEY - STCAYLEY = "cayley" - The generalized Cayley transform. | ||
| 321 | |||
| 322 | Level: beginner | ||
| 323 | |||
| 324 | Notes: | ||
| 325 | The operator in this `ST` is $(A-\sigma B)^{-1}(A+\nu B)$, where $A$ and $B$ | ||
| 326 | are the matrices set with `STSetMatrices()`, the shift $\sigma$ is given in | ||
| 327 | `STSetShift()`, and $\nu$ is given in `STCayleySetAntishift()`. | ||
| 328 | |||
| 329 | This transformation is mathematically equivalent to `STSINVERT`. | ||
| 330 | |||
| 331 | .seealso: [](ch:st), `ST`, `STType`, `STSetType()`, `STSetMatrices()`, `STSetShift()`, `STCayleySetAntishift()` | ||
| 332 | M*/ | ||
| 333 | |||
| 334 | 160 | SLEPC_EXTERN PetscErrorCode STCreate_Cayley(ST st) | |
| 335 | { | ||
| 336 | 160 | ST_CAYLEY *ctx; | |
| 337 | |||
| 338 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
160 | PetscFunctionBegin; |
| 339 |
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.
|
160 | PetscCall(PetscNew(&ctx)); |
| 340 | 160 | st->data = (void*)ctx; | |
| 341 | |||
| 342 | 160 | st->usesksp = PETSC_TRUE; | |
| 343 | |||
| 344 | 160 | st->ops->apply = STApply_Generic; | |
| 345 | 160 | st->ops->applytrans = STApplyTranspose_Generic; | |
| 346 | 160 | st->ops->applyhermtrans = STApplyHermitianTranspose_Generic; | |
| 347 | 160 | st->ops->backtransform = STBackTransform_Cayley; | |
| 348 | 160 | st->ops->setshift = STSetShift_Cayley; | |
| 349 | 160 | st->ops->getbilinearform = STGetBilinearForm_Cayley; | |
| 350 | 160 | st->ops->setup = STSetUp_Cayley; | |
| 351 | 160 | st->ops->computeoperator = STComputeOperator_Cayley; | |
| 352 | 160 | st->ops->setfromoptions = STSetFromOptions_Cayley; | |
| 353 | 160 | st->ops->postsolve = STPostSolve_Cayley; | |
| 354 | 160 | st->ops->destroy = STDestroy_Cayley; | |
| 355 | 160 | st->ops->view = STView_Cayley; | |
| 356 | 160 | st->ops->checknullspace = STCheckNullSpace_Default; | |
| 357 | 160 | st->ops->setdefaultksp = STSetDefaultKSP_Default; | |
| 358 | |||
| 359 |
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.
|
160 | PetscCall(PetscObjectComposeFunction((PetscObject)st,"STCayleySetAntishift_C",STCayleySetAntishift_Cayley)); |
| 360 |
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.
|
160 | PetscCall(PetscObjectComposeFunction((PetscObject)st,"STCayleyGetAntishift_C",STCayleyGetAntishift_Cayley)); |
| 361 |
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.
|
32 | PetscFunctionReturn(PETSC_SUCCESS); |
| 362 | } | ||
| 363 |