| 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 ST class for preconditioned eigenvalue methods | ||
| 12 | */ | ||
| 13 | |||
| 14 | #include <slepc/private/stimpl.h> /*I "slepcst.h" I*/ | ||
| 15 | |||
| 16 | typedef struct { | ||
| 17 | PetscBool ksphasmat; /* the KSP must have the same matrix as PC */ | ||
| 18 | } ST_PRECOND; | ||
| 19 | |||
| 20 | 2851 | static PetscErrorCode STSetDefaultKSP_Precond(ST st) | |
| 21 | { | ||
| 22 | 2851 | PC pc; | |
| 23 | 2851 | PCType pctype; | |
| 24 | 2851 | PetscBool t0,t1; | |
| 25 | |||
| 26 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2851 | PetscFunctionBegin; |
| 27 |
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.
|
2851 | PetscCall(KSPGetPC(st->ksp,&pc)); |
| 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.
|
2851 | PetscCall(PCGetType(pc,&pctype)); |
| 29 |
5/6✓ 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 not taken.
|
2851 | if (!pctype && st->A && st->A[0]) { |
| 30 |
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.
|
990 | if (st->matmode == ST_MATMODE_SHELL) PetscCall(PCSetType(pc,PCJACOBI)); |
| 31 | else { | ||
| 32 |
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.
|
970 | PetscCall(MatHasOperation(st->A[0],MATOP_DUPLICATE,&t0)); |
| 33 |
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.
|
970 | if (st->nmat>1) PetscCall(MatHasOperation(st->A[0],MATOP_AXPY,&t1)); |
| 34 | 724 | else t1 = PETSC_TRUE; | |
| 35 |
7/10✓ 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 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
|
970 | PetscCall(PCSetType(pc,(t0 && t1)?PCBJACOBI:PCNONE)); |
| 36 | } | ||
| 37 | } | ||
| 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.
|
2851 | PetscCall(KSPSetErrorIfNotConverged(st->ksp,PETSC_FALSE)); |
| 39 |
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.
|
591 | PetscFunctionReturn(PETSC_SUCCESS); |
| 40 | } | ||
| 41 | |||
| 42 | 1990 | static PetscErrorCode STPostSolve_Precond(ST st) | |
| 43 | { | ||
| 44 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1990 | PetscFunctionBegin; |
| 45 |
4/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
1990 | if (st->matmode == ST_MATMODE_INPLACE && !(st->Pmat || (PetscAbsScalar(st->sigma)>=PETSC_MAX_REAL && st->nmat>1))) { |
| 46 |
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.
|
10 | if (st->nmat>1) PetscCall(MatAXPY(st->A[0],st->sigma,st->A[1],st->str)); |
| 47 |
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.
|
10 | else PetscCall(MatShift(st->A[0],st->sigma)); |
| 48 | 10 | st->Astate[0] = ((PetscObject)st->A[0])->state; | |
| 49 | 10 | st->state = ST_STATE_INITIAL; | |
| 50 | 10 | st->opready = PETSC_FALSE; | |
| 51 | } | ||
| 52 |
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.
|
408 | PetscFunctionReturn(PETSC_SUCCESS); |
| 53 | } | ||
| 54 | |||
| 55 | /* | ||
| 56 | Operator (precond): | ||
| 57 | Op P M | ||
| 58 | if nmat=1: --- A-sI NULL | ||
| 59 | if nmat=2: --- A-sB NULL | ||
| 60 | */ | ||
| 61 | 1727 | static PetscErrorCode STComputeOperator_Precond(ST st) | |
| 62 | { | ||
| 63 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1727 | PetscFunctionBegin; |
| 64 | /* if the user did not set the shift, use the target value */ | ||
| 65 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1727 | if (!st->sigma_set) st->sigma = st->defsigma; |
| 66 | 1727 | st->M = NULL; | |
| 67 | |||
| 68 | /* build custom preconditioner from the split matrices */ | ||
| 69 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1727 | if (st->Psplit) { |
| 70 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
30 | if (!(PetscAbsScalar(st->sigma) < PETSC_MAX_REAL) && st->nmat>1) { |
| 71 | ✗ | PetscCall(PetscObjectReference((PetscObject)st->Psplit[0])); | |
| 72 | ✗ | PetscCall(MatDestroy(&st->Pmat)); | |
| 73 | ✗ | st->Pmat = st->Psplit[0]; | |
| 74 |
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.
|
30 | } else if (PetscAbsScalar(st->sigma)<PETSC_MAX_REAL) PetscCall(STMatMAXPY_Private(st,-st->sigma,0.0,0,NULL,PETSC_TRUE,PETSC_TRUE,&st->Pmat)); |
| 75 | } | ||
| 76 | |||
| 77 | /* P = A-sigma*B */ | ||
| 78 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1727 | if (st->Pmat) { |
| 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.
|
210 | PetscCall(PetscObjectReference((PetscObject)st->Pmat)); |
| 80 |
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.
|
210 | PetscCall(MatDestroy(&st->P)); |
| 81 | 210 | st->P = st->Pmat; | |
| 82 | } else { | ||
| 83 |
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.
|
1517 | PetscCall(PetscObjectReference((PetscObject)st->A[1])); |
| 84 |
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.
|
1517 | PetscCall(MatDestroy(&st->T[0])); |
| 85 | 1517 | st->T[0] = st->A[1]; | |
| 86 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
1517 | if (!(PetscAbsScalar(st->sigma) < PETSC_MAX_REAL) && st->nmat>1) { |
| 87 |
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.
|
92 | PetscCall(PetscObjectReference((PetscObject)st->T[0])); |
| 88 |
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.
|
92 | PetscCall(MatDestroy(&st->P)); |
| 89 | 92 | st->P = st->T[0]; | |
| 90 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1425 | } else if (PetscAbsScalar(st->sigma)<PETSC_MAX_REAL) { |
| 91 |
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.
|
1083 | PetscCall(STMatMAXPY_Private(st,-st->sigma,0.0,0,NULL,PetscNot(st->state==ST_STATE_UPDATED),PETSC_FALSE,&st->T[1])); |
| 92 |
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.
|
1083 | PetscCall(PetscObjectReference((PetscObject)st->T[1])); |
| 93 |
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.
|
1083 | PetscCall(MatDestroy(&st->P)); |
| 94 | 1083 | st->P = st->T[1]; | |
| 95 | } | ||
| 96 | } | ||
| 97 |
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.
|
357 | PetscFunctionReturn(PETSC_SUCCESS); |
| 98 | } | ||
| 99 | |||
| 100 | 1842 | static PetscErrorCode STSetUp_Precond(ST st) | |
| 101 | { | ||
| 102 | 1842 | ST_PRECOND *ctx = (ST_PRECOND*)st->data; | |
| 103 | |||
| 104 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1842 | PetscFunctionBegin; |
| 105 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1842 | if (st->P) { |
| 106 |
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.
|
2148 | PetscCall(ST_KSPSetOperators(st,ctx->ksphasmat?st->P:NULL,st->P)); |
| 107 | /* NOTE: we do not call KSPSetUp() here because some eigensolvers such as JD require a lazy setup */ | ||
| 108 | } | ||
| 109 |
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.
|
380 | PetscFunctionReturn(PETSC_SUCCESS); |
| 110 | } | ||
| 111 | |||
| 112 | 30 | static PetscErrorCode STSetShift_Precond(ST st,PetscScalar newshift) | |
| 113 | { | ||
| 114 | 30 | ST_PRECOND *ctx = (ST_PRECOND*)st->data; | |
| 115 | |||
| 116 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
30 | PetscFunctionBegin; |
| 117 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
30 | if (st->Psplit) { /* update custom preconditioner from the split matrices */ |
| 118 | ✗ | if (PetscAbsScalar(st->sigma)<PETSC_MAX_REAL || st->nmat==1) PetscCall(STMatMAXPY_Private(st,-st->sigma,0.0,0,NULL,PETSC_FALSE,PETSC_TRUE,&st->Pmat)); | |
| 119 | } | ||
| 120 |
2/4✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
|
30 | if (st->transform && !st->Pmat) { |
| 121 |
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.
|
30 | PetscCall(STMatMAXPY_Private(st,-newshift,-st->sigma,0,NULL,PETSC_FALSE,PETSC_FALSE,&st->T[1])); |
| 122 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
30 | if (st->P!=st->T[1]) { |
| 123 |
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.
|
10 | PetscCall(PetscObjectReference((PetscObject)st->T[1])); |
| 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.
|
10 | PetscCall(MatDestroy(&st->P)); |
| 125 | 10 | st->P = st->T[1]; | |
| 126 | } | ||
| 127 | } | ||
| 128 |
6/10✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ 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.
|
60 | if (st->P) PetscCall(ST_KSPSetOperators(st,ctx->ksphasmat?st->P:NULL,st->P)); |
| 129 |
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.
|
6 | PetscFunctionReturn(PETSC_SUCCESS); |
| 130 | } | ||
| 131 | |||
| 132 | 1276 | static PetscErrorCode STPrecondSetKSPHasMat_Precond(ST st,PetscBool ksphasmat) | |
| 133 | { | ||
| 134 | 1276 | ST_PRECOND *ctx = (ST_PRECOND*)st->data; | |
| 135 | |||
| 136 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1276 | PetscFunctionBegin; |
| 137 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1276 | if (ctx->ksphasmat != ksphasmat) { |
| 138 | 777 | ctx->ksphasmat = ksphasmat; | |
| 139 | 777 | st->state = ST_STATE_INITIAL; | |
| 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.
|
1276 | PetscFunctionReturn(PETSC_SUCCESS); |
| 142 | } | ||
| 143 | |||
| 144 | /*@ | ||
| 145 | STPrecondSetKSPHasMat - Sets a flag indicating that during `STSetUp` the coefficient | ||
| 146 | matrix of the `KSP` linear solver (`Amat`) must be set to be the same matrix as the | ||
| 147 | preconditioner (`Pmat`). | ||
| 148 | |||
| 149 | Collective | ||
| 150 | |||
| 151 | Input Parameters: | ||
| 152 | + st - the spectral transformation context | ||
| 153 | - ksphasmat - the flag | ||
| 154 | |||
| 155 | Notes: | ||
| 156 | Often, the preconditioner matrix is used only in the `PC` object, but | ||
| 157 | in some solvers this matrix must be provided also as the `Amat` matrix in | ||
| 158 | the `KSP` object. | ||
| 159 | |||
| 160 | Level: developer | ||
| 161 | |||
| 162 | .seealso: [](ch:st), `STPRECOND`, `STPrecondGetKSPHasMat()`, `STSetShift()` | ||
| 163 | @*/ | ||
| 164 | 1296 | PetscErrorCode STPrecondSetKSPHasMat(ST st,PetscBool ksphasmat) | |
| 165 | { | ||
| 166 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1296 | PetscFunctionBegin; |
| 167 |
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.
|
1296 | PetscValidHeaderSpecific(st,ST_CLASSID,1); |
| 168 |
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.
|
1296 | PetscValidLogicalCollectiveBool(st,ksphasmat,2); |
| 169 |
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.
|
1296 | PetscTryMethod(st,"STPrecondSetKSPHasMat_C",(ST,PetscBool),(st,ksphasmat)); |
| 170 |
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.
|
1296 | PetscFunctionReturn(PETSC_SUCCESS); |
| 171 | } | ||
| 172 | |||
| 173 | 20 | static PetscErrorCode STPrecondGetKSPHasMat_Precond(ST st,PetscBool *ksphasmat) | |
| 174 | { | ||
| 175 | 20 | ST_PRECOND *ctx = (ST_PRECOND*)st->data; | |
| 176 | |||
| 177 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
20 | PetscFunctionBegin; |
| 178 | 20 | *ksphasmat = ctx->ksphasmat; | |
| 179 |
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.
|
20 | PetscFunctionReturn(PETSC_SUCCESS); |
| 180 | } | ||
| 181 | |||
| 182 | /*@ | ||
| 183 | STPrecondGetKSPHasMat - Returns the flag indicating if the coefficient | ||
| 184 | matrix of the `KSP` linear system (`Amat`) is set to be the same matrix as the | ||
| 185 | preconditioner (`Pmat`). | ||
| 186 | |||
| 187 | Not Collective | ||
| 188 | |||
| 189 | Input Parameter: | ||
| 190 | . st - the spectral transformation context | ||
| 191 | |||
| 192 | Output Parameter: | ||
| 193 | . ksphasmat - the flag | ||
| 194 | |||
| 195 | Level: developer | ||
| 196 | |||
| 197 | .seealso: [](ch:st), `STPRECOND`, `STPrecondSetKSPHasMat()`, `STSetShift()` | ||
| 198 | @*/ | ||
| 199 | 20 | PetscErrorCode STPrecondGetKSPHasMat(ST st,PetscBool *ksphasmat) | |
| 200 | { | ||
| 201 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
20 | PetscFunctionBegin; |
| 202 |
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.
|
20 | PetscValidHeaderSpecific(st,ST_CLASSID,1); |
| 203 |
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.
|
20 | PetscAssertPointer(ksphasmat,2); |
| 204 |
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.
|
20 | PetscUseMethod(st,"STPrecondGetKSPHasMat_C",(ST,PetscBool*),(st,ksphasmat)); |
| 205 |
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.
|
20 | PetscFunctionReturn(PETSC_SUCCESS); |
| 206 | } | ||
| 207 | |||
| 208 | 1522 | static PetscErrorCode STDestroy_Precond(ST st) | |
| 209 | { | ||
| 210 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1522 | PetscFunctionBegin; |
| 211 |
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.
|
1522 | PetscCall(PetscFree(st->data)); |
| 212 |
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.
|
1522 | PetscCall(PetscObjectComposeFunction((PetscObject)st,"STPrecondGetKSPHasMat_C",NULL)); |
| 213 |
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.
|
1522 | PetscCall(PetscObjectComposeFunction((PetscObject)st,"STPrecondSetKSPHasMat_C",NULL)); |
| 214 |
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.
|
316 | PetscFunctionReturn(PETSC_SUCCESS); |
| 215 | } | ||
| 216 | |||
| 217 | /*MC | ||
| 218 | STPRECOND - STPRECOND = "precond" - A special type of `ST` intended | ||
| 219 | for use with preconditioned eigensolvers. | ||
| 220 | |||
| 221 | Level: beginner | ||
| 222 | |||
| 223 | Note: | ||
| 224 | This is not a true spectral transformation. It behaves as an "inexact" | ||
| 225 | version of the `STSINVERT` operator, in the sense that the associated | ||
| 226 | `KSP` and `PC` objects can be used to implement a preconditioner | ||
| 227 | $K^{-1}\approx(A-\sigma B)^{-1}$ in the context of preconditioned | ||
| 228 | eigensolvers such as Jacobi-Davidson. | ||
| 229 | |||
| 230 | .seealso: [](ch:st), `ST`, `STType`, `STSetType()`, `STSetMatrices()`, `STSetShift()` | ||
| 231 | M*/ | ||
| 232 | |||
| 233 | 1522 | SLEPC_EXTERN PetscErrorCode STCreate_Precond(ST st) | |
| 234 | { | ||
| 235 | 1522 | ST_PRECOND *ctx; | |
| 236 | |||
| 237 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1522 | PetscFunctionBegin; |
| 238 |
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.
|
1522 | PetscCall(PetscNew(&ctx)); |
| 239 | 1522 | st->data = (void*)ctx; | |
| 240 | |||
| 241 | 1522 | st->usesksp = PETSC_TRUE; | |
| 242 | |||
| 243 | 1522 | st->ops->apply = STApply_Generic; | |
| 244 | 1522 | st->ops->applymat = STApplyMat_Generic; | |
| 245 | 1522 | st->ops->applytrans = STApplyTranspose_Generic; | |
| 246 | 1522 | st->ops->applyhermtrans = STApplyHermitianTranspose_Generic; | |
| 247 | 1522 | st->ops->setshift = STSetShift_Precond; | |
| 248 | 1522 | st->ops->getbilinearform = STGetBilinearForm_Default; | |
| 249 | 1522 | st->ops->setup = STSetUp_Precond; | |
| 250 | 1522 | st->ops->computeoperator = STComputeOperator_Precond; | |
| 251 | 1522 | st->ops->postsolve = STPostSolve_Precond; | |
| 252 | 1522 | st->ops->destroy = STDestroy_Precond; | |
| 253 | 1522 | st->ops->setdefaultksp = STSetDefaultKSP_Precond; | |
| 254 | |||
| 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.
|
1522 | PetscCall(PetscObjectComposeFunction((PetscObject)st,"STPrecondGetKSPHasMat_C",STPrecondGetKSPHasMat_Precond)); |
| 256 |
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.
|
1522 | PetscCall(PetscObjectComposeFunction((PetscObject)st,"STPrecondSetKSPHasMat_C",STPrecondSetKSPHasMat_Precond)); |
| 257 |
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.
|
316 | PetscFunctionReturn(PETSC_SUCCESS); |
| 258 | } | ||
| 259 |