| 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 | Filter spectral transformation, to encapsulate polynomial filters | ||
| 12 | */ | ||
| 13 | |||
| 14 | #include <slepc/private/stimpl.h> /*I "slepcst.h" I*/ | ||
| 15 | #include "filter.h" | ||
| 16 | |||
| 17 | const char *STFilterTypes[] = {"","FILTLAN","CHEBYSHEV","STFilterType","ST_FILTER_",NULL}; | ||
| 18 | const char *STFilterDampings[] = {"NONE","JACKSON","LANCZOS","FEJER","STFilterDamping","ST_FILTER_DAMPING_",NULL}; | ||
| 19 | |||
| 20 | 146 | static PetscErrorCode STFilterSetType_Private(ST st,STFilterType type) | |
| 21 | { | ||
| 22 | 146 | ST_FILTER *ctx = (ST_FILTER*)st->data; | |
| 23 | |||
| 24 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
146 | PetscFunctionBegin; |
| 25 | 146 | ctx->type = type; | |
| 26 |
2/3✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
146 | switch(type) { |
| 27 | 68 | case ST_FILTER_FILTLAN: | |
| 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.
|
68 | PetscCall(STCreate_Filter_FILTLAN(st)); |
| 29 | break; | ||
| 30 | 78 | case ST_FILTER_CHEBYSHEV: | |
| 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.
|
78 | PetscCall(STCreate_Filter_Chebyshev(st)); |
| 32 | break; | ||
| 33 | ✗ | default: | |
| 34 | ✗ | SETERRQ(PetscObjectComm((PetscObject)st),PETSC_ERR_ARG_OUTOFRANGE,"Invalid type"); | |
| 35 | } | ||
| 36 |
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); |
| 37 | } | ||
| 38 | |||
| 39 | /* | ||
| 40 | Operator (filter): | ||
| 41 | Op P M | ||
| 42 | if nmat=1: p(A) NULL p(A) | ||
| 43 | */ | ||
| 44 | 186 | static PetscErrorCode STComputeOperator_Filter(ST st) | |
| 45 | { | ||
| 46 | 186 | ST_FILTER *ctx = (ST_FILTER*)st->data; | |
| 47 | |||
| 48 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
186 | PetscFunctionBegin; |
| 49 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
186 | PetscCheck(st->nmat==1,PetscObjectComm((PetscObject)st),PETSC_ERR_SUP,"Only implemented for standard eigenvalue problem"); |
| 50 |
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.
|
186 | PetscCheck(ctx->intb<PETSC_MAX_REAL || ctx->inta>PETSC_MIN_REAL,PetscObjectComm((PetscObject)st),PETSC_ERR_ORDER,"Must pass an interval with STFilterSetInterval()"); |
| 51 |
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.
|
186 | PetscCheck(ctx->right!=0.0 || ctx->left!=0.0,PetscObjectComm((PetscObject)st),PETSC_ERR_ORDER,"Must pass an approximate numerical range with STFilterSetRange()"); |
| 52 |
2/6✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
186 | PetscCheck(ctx->left<=ctx->inta && ctx->right>=ctx->intb,PetscObjectComm((PetscObject)st),PETSC_ERR_USER_INPUT,"The requested interval [%g,%g] must be contained in the numerical range [%g,%g]",(double)ctx->inta,(double)ctx->intb,(double)ctx->left,(double)ctx->right); |
| 53 | |||
| 54 |
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.
|
186 | if (!ctx->type) PetscCall(STFilterSetType_Private(st,ST_FILTER_FILTLAN)); /* default type */ |
| 55 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
186 | if (!ctx->polyDegree) ctx->polyDegree = 100; |
| 56 |
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.
|
186 | PetscCall(ctx->computeoperator(st,&st->T[0])); |
| 57 | 186 | st->M = st->T[0]; | |
| 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.
|
186 | PetscCall(MatDestroy(&st->P)); |
| 59 |
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.
|
34 | PetscFunctionReturn(PETSC_SUCCESS); |
| 60 | } | ||
| 61 | |||
| 62 | 264 | static PetscErrorCode STSetFromOptions_Filter(ST st,PetscOptionItems PetscOptionsObject) | |
| 63 | { | ||
| 64 | 264 | ST_FILTER *ctx = (ST_FILTER*)st->data; | |
| 65 | 264 | PetscReal array[2]={0,0}; | |
| 66 | 264 | PetscInt k; | |
| 67 | 264 | PetscBool flg; | |
| 68 | 264 | STFilterType type; | |
| 69 | 264 | STFilterDamping damping; | |
| 70 | |||
| 71 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
264 | PetscFunctionBegin; |
| 72 |
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.
|
264 | PetscOptionsHeadBegin(PetscOptionsObject,"ST Filter Options"); |
| 73 | |||
| 74 |
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.
|
264 | PetscCall(PetscOptionsEnum("-st_filter_type","How to construct the filter","STFilterSetType",STFilterTypes,(PetscEnum)ctx->type,(PetscEnum*)&type,&flg)); |
| 75 |
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.
|
264 | if (flg) PetscCall(STFilterSetType(st,type)); |
| 76 | |||
| 77 | 264 | k = 2; | |
| 78 |
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.
|
264 | PetscCall(PetscOptionsRealArray("-st_filter_interval","Interval containing the desired eigenvalues (two real values separated with a comma without spaces)","STFilterSetInterval",array,&k,&flg)); |
| 79 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
264 | if (flg) { |
| 80 | ✗ | PetscCheck(k>1,PetscObjectComm((PetscObject)st),PETSC_ERR_ARG_SIZ,"Must pass two values in -st_filter_interval (comma-separated without spaces)"); | |
| 81 | ✗ | PetscCall(STFilterSetInterval(st,array[0],array[1])); | |
| 82 | } | ||
| 83 | 264 | k = 2; | |
| 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.
|
264 | PetscCall(PetscOptionsRealArray("-st_filter_range","Interval containing all eigenvalues (two real values separated with a comma without spaces)","STFilterSetRange",array,&k,&flg)); |
| 85 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
264 | if (flg) { |
| 86 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
60 | PetscCheck(k>1,PetscObjectComm((PetscObject)st),PETSC_ERR_ARG_SIZ,"Must pass two values in -st_filter_range (comma-separated without spaces)"); |
| 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.
|
60 | PetscCall(STFilterSetRange(st,array[0],array[1])); |
| 88 | } | ||
| 89 |
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.
|
264 | PetscCall(PetscOptionsInt("-st_filter_degree","Degree of filter polynomial","STFilterSetDegree",100,&k,&flg)); |
| 90 |
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.
|
264 | if (flg) PetscCall(STFilterSetDegree(st,k)); |
| 91 | |||
| 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.
|
264 | PetscCall(PetscOptionsEnum("-st_filter_damping","Type of damping","STFilterSetDamping",STFilterDampings,(PetscEnum)ctx->damping,(PetscEnum*)&damping,&flg)); |
| 93 |
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.
|
264 | if (flg) PetscCall(STFilterSetDamping(st,damping)); |
| 94 | |||
| 95 |
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.
|
264 | PetscOptionsHeadEnd(); |
| 96 |
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.
|
48 | PetscFunctionReturn(PETSC_SUCCESS); |
| 97 | } | ||
| 98 | |||
| 99 | 408 | static PetscErrorCode STReset_Filter(ST st) | |
| 100 | { | ||
| 101 | 408 | ST_FILTER *ctx = (ST_FILTER*)st->data; | |
| 102 | |||
| 103 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
408 | PetscFunctionBegin; |
| 104 | 408 | ctx->left = 0.0; | |
| 105 | 408 | ctx->right = 0.0; | |
| 106 |
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.
|
408 | PetscCall(MatDestroy(&ctx->T)); |
| 107 |
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.
|
408 | PetscCall(MatDestroyMatrices(ctx->nW,&ctx->W)); |
| 108 | 408 | ctx->nW = 0; | |
| 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.
|
408 | PetscFunctionReturn(PETSC_SUCCESS); |
| 110 | } | ||
| 111 | |||
| 112 | 204 | static PetscErrorCode STFilterSetType_Filter(ST st,STFilterType type) | |
| 113 | { | ||
| 114 | 204 | ST_FILTER *ctx = (ST_FILTER*)st->data; | |
| 115 | |||
| 116 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
204 | PetscFunctionBegin; |
| 117 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
204 | if (ctx->type != type) { |
| 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.
|
116 | PetscCall(STReset_Filter(st)); |
| 119 |
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.
|
116 | PetscCall(STFilterSetType_Private(st,type)); |
| 120 | 116 | st->state = ST_STATE_INITIAL; | |
| 121 | 116 | st->opready = PETSC_FALSE; | |
| 122 | 116 | ctx->filtch = PETSC_TRUE; | |
| 123 | } | ||
| 124 |
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.
|
36 | PetscFunctionReturn(PETSC_SUCCESS); |
| 125 | } | ||
| 126 | |||
| 127 | /*@ | ||
| 128 | STFilterSetType - Sets the method to be used to build the polynomial filter. | ||
| 129 | |||
| 130 | Logically Collective | ||
| 131 | |||
| 132 | Input Parameters: | ||
| 133 | + st - the spectral transformation context | ||
| 134 | - type - the type of filter | ||
| 135 | |||
| 136 | Options Database Key: | ||
| 137 | . -st_filter_type \<type\> - set the type of filter | ||
| 138 | |||
| 139 | Level: intermediate | ||
| 140 | |||
| 141 | .seealso: [](ch:st), `STFILTER`, `STFilterGetType()` | ||
| 142 | @*/ | ||
| 143 | 204 | PetscErrorCode STFilterSetType(ST st,STFilterType type) | |
| 144 | { | ||
| 145 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
204 | PetscFunctionBegin; |
| 146 |
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.
|
204 | PetscValidHeaderSpecific(st,ST_CLASSID,1); |
| 147 |
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.
|
204 | PetscValidLogicalCollectiveEnum(st,type,2); |
| 148 |
8/14✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✓ 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.
|
204 | PetscTryMethod(st,"STFilterSetType_C",(ST,STFilterType),(st,type)); |
| 149 |
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.
|
204 | PetscFunctionReturn(PETSC_SUCCESS); |
| 150 | } | ||
| 151 | |||
| 152 | ✗ | static PetscErrorCode STFilterGetType_Filter(ST st,STFilterType *type) | |
| 153 | { | ||
| 154 | ✗ | ST_FILTER *ctx = (ST_FILTER*)st->data; | |
| 155 | |||
| 156 | ✗ | PetscFunctionBegin; | |
| 157 | ✗ | *type = ctx->type ; | |
| 158 | ✗ | PetscFunctionReturn(PETSC_SUCCESS); | |
| 159 | } | ||
| 160 | |||
| 161 | /*@ | ||
| 162 | STFilterGetType - Gets the method to be used to build the polynomial filter. | ||
| 163 | |||
| 164 | Not Collective | ||
| 165 | |||
| 166 | Input Parameter: | ||
| 167 | . st - the spectral transformation context | ||
| 168 | |||
| 169 | Output Parameter: | ||
| 170 | . type - the type of filter | ||
| 171 | |||
| 172 | Level: intermediate | ||
| 173 | |||
| 174 | .seealso: [](ch:st), `STFILTER`, `STFilterSetType()` | ||
| 175 | @*/ | ||
| 176 | ✗ | PetscErrorCode STFilterGetType(ST st,STFilterType *type) | |
| 177 | { | ||
| 178 | ✗ | PetscFunctionBegin; | |
| 179 | ✗ | PetscValidHeaderSpecific(st,ST_CLASSID,1); | |
| 180 | ✗ | PetscAssertPointer(type,2); | |
| 181 | ✗ | PetscUseMethod(st,"STFilterGetType_C",(ST,STFilterType*),(st,type)); | |
| 182 | ✗ | PetscFunctionReturn(PETSC_SUCCESS); | |
| 183 | } | ||
| 184 | |||
| 185 | 206 | static PetscErrorCode STFilterSetInterval_Filter(ST st,PetscReal inta,PetscReal intb) | |
| 186 | { | ||
| 187 | 206 | ST_FILTER *ctx = (ST_FILTER*)st->data; | |
| 188 | |||
| 189 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
206 | PetscFunctionBegin; |
| 190 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
206 | PetscCheck(inta<intb,PetscObjectComm((PetscObject)st),PETSC_ERR_ARG_WRONG,"Badly defined interval, must be inta<intb"); |
| 191 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
|
206 | if (ctx->inta != inta || ctx->intb != intb) { |
| 192 | 146 | ctx->inta = inta; | |
| 193 | 146 | ctx->intb = intb; | |
| 194 | 146 | st->state = ST_STATE_INITIAL; | |
| 195 | 146 | st->opready = PETSC_FALSE; | |
| 196 | 146 | ctx->filtch = PETSC_TRUE; | |
| 197 | } | ||
| 198 |
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.
|
38 | PetscFunctionReturn(PETSC_SUCCESS); |
| 199 | } | ||
| 200 | |||
| 201 | /*@ | ||
| 202 | STFilterSetInterval - Defines the interval containing the desired eigenvalues. | ||
| 203 | |||
| 204 | Logically Collective | ||
| 205 | |||
| 206 | Input Parameters: | ||
| 207 | + st - the spectral transformation context | ||
| 208 | . inta - left end of the interval | ||
| 209 | - intb - right end of the interval | ||
| 210 | |||
| 211 | Options Database Key: | ||
| 212 | . -st_filter_interval <a,b> - set $[a,b]$ as the interval of interest | ||
| 213 | |||
| 214 | Notes: | ||
| 215 | The filter will be configured to emphasize eigenvalues contained in the given | ||
| 216 | interval, and damp out eigenvalues outside it. If the interval is open, then | ||
| 217 | the filter is low- or high-pass, otherwise it is mid-pass. | ||
| 218 | |||
| 219 | Common usage is to set the interval in `EPS` with `EPSSetInterval()`. | ||
| 220 | |||
| 221 | The interval must be contained within the numerical range of the matrix, see | ||
| 222 | `STFilterSetRange()`. | ||
| 223 | |||
| 224 | Level: intermediate | ||
| 225 | |||
| 226 | .seealso: [](ch:st), `STFILTER`, `STFilterGetInterval()`, `STFilterSetRange()`, `EPSSetInterval()` | ||
| 227 | @*/ | ||
| 228 | 206 | PetscErrorCode STFilterSetInterval(ST st,PetscReal inta,PetscReal intb) | |
| 229 | { | ||
| 230 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
206 | PetscFunctionBegin; |
| 231 |
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.
|
206 | PetscValidHeaderSpecific(st,ST_CLASSID,1); |
| 232 |
29/66✗ 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 not taken.
✓ Branch 63 taken 2 times.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
|
206 | PetscValidLogicalCollectiveReal(st,inta,2); |
| 233 |
29/66✗ 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 not taken.
✓ Branch 63 taken 2 times.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
|
206 | PetscValidLogicalCollectiveReal(st,intb,3); |
| 234 |
8/14✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✓ 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.
|
206 | PetscTryMethod(st,"STFilterSetInterval_C",(ST,PetscReal,PetscReal),(st,inta,intb)); |
| 235 |
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.
|
206 | PetscFunctionReturn(PETSC_SUCCESS); |
| 236 | } | ||
| 237 | |||
| 238 | 70 | static PetscErrorCode STFilterGetInterval_Filter(ST st,PetscReal *inta,PetscReal *intb) | |
| 239 | { | ||
| 240 | 70 | ST_FILTER *ctx = (ST_FILTER*)st->data; | |
| 241 | |||
| 242 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
70 | PetscFunctionBegin; |
| 243 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
70 | if (inta) *inta = ctx->inta; |
| 244 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
70 | if (intb) *intb = ctx->intb; |
| 245 |
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.
|
70 | PetscFunctionReturn(PETSC_SUCCESS); |
| 246 | } | ||
| 247 | |||
| 248 | /*@ | ||
| 249 | STFilterGetInterval - Gets the interval containing the desired eigenvalues. | ||
| 250 | |||
| 251 | Not Collective | ||
| 252 | |||
| 253 | Input Parameter: | ||
| 254 | . st - the spectral transformation context | ||
| 255 | |||
| 256 | Output Parameters: | ||
| 257 | + inta - left end of the interval | ||
| 258 | - intb - right end of the interval | ||
| 259 | |||
| 260 | Level: intermediate | ||
| 261 | |||
| 262 | .seealso: [](ch:st), `STFILTER`, `STFilterSetInterval()` | ||
| 263 | @*/ | ||
| 264 | 70 | PetscErrorCode STFilterGetInterval(ST st,PetscReal *inta,PetscReal *intb) | |
| 265 | { | ||
| 266 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
70 | PetscFunctionBegin; |
| 267 |
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.
|
70 | PetscValidHeaderSpecific(st,ST_CLASSID,1); |
| 268 |
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.
|
70 | PetscUseMethod(st,"STFilterGetInterval_C",(ST,PetscReal*,PetscReal*),(st,inta,intb)); |
| 269 |
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.
|
70 | PetscFunctionReturn(PETSC_SUCCESS); |
| 270 | } | ||
| 271 | |||
| 272 | 206 | static PetscErrorCode STFilterSetRange_Filter(ST st,PetscReal left,PetscReal right) | |
| 273 | { | ||
| 274 | 206 | ST_FILTER *ctx = (ST_FILTER*)st->data; | |
| 275 | |||
| 276 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
206 | PetscFunctionBegin; |
| 277 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
206 | PetscCheck(left<right,PetscObjectComm((PetscObject)st),PETSC_ERR_ARG_WRONG,"Badly defined interval, must be left<right"); |
| 278 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
|
206 | if (ctx->left != left || ctx->right != right) { |
| 279 | 156 | ctx->left = left; | |
| 280 | 156 | ctx->right = right; | |
| 281 | 156 | st->state = ST_STATE_INITIAL; | |
| 282 | 156 | st->opready = PETSC_FALSE; | |
| 283 | 156 | ctx->filtch = PETSC_TRUE; | |
| 284 | } | ||
| 285 |
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.
|
38 | PetscFunctionReturn(PETSC_SUCCESS); |
| 286 | } | ||
| 287 | |||
| 288 | /*@ | ||
| 289 | STFilterSetRange - Defines the numerical range (or field of values) of the matrix, that is, | ||
| 290 | the interval containing all eigenvalues. | ||
| 291 | |||
| 292 | Logically Collective | ||
| 293 | |||
| 294 | Input Parameters: | ||
| 295 | + st - the spectral transformation context | ||
| 296 | . left - left end of the spectral range | ||
| 297 | - right - right end of the spectral range | ||
| 298 | |||
| 299 | Options Database Key: | ||
| 300 | . -st_filter_range <lmin,lmax> - set $[\lambda_\mathrm{min},\lambda_\mathrm{max}]$ as the numerical range | ||
| 301 | |||
| 302 | Notes: | ||
| 303 | The filter will be most effective if the numerical range is tight, that is, | ||
| 304 | `left` and `right` are good approximations to the leftmost and rightmost | ||
| 305 | eigenvalues, respectively. | ||
| 306 | |||
| 307 | Level: intermediate | ||
| 308 | |||
| 309 | .seealso: [](ch:st), `STFILTER`, `STFilterGetRange()`, `STFilterSetInterval()` | ||
| 310 | @*/ | ||
| 311 | 206 | PetscErrorCode STFilterSetRange(ST st,PetscReal left,PetscReal right) | |
| 312 | { | ||
| 313 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
206 | PetscFunctionBegin; |
| 314 |
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.
|
206 | PetscValidHeaderSpecific(st,ST_CLASSID,1); |
| 315 |
29/66✗ 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 not taken.
✓ Branch 63 taken 2 times.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
|
206 | PetscValidLogicalCollectiveReal(st,left,2); |
| 316 |
29/66✗ 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 not taken.
✓ Branch 63 taken 2 times.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
|
206 | PetscValidLogicalCollectiveReal(st,right,3); |
| 317 |
8/14✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✓ 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.
|
206 | PetscTryMethod(st,"STFilterSetRange_C",(ST,PetscReal,PetscReal),(st,left,right)); |
| 318 |
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.
|
206 | PetscFunctionReturn(PETSC_SUCCESS); |
| 319 | } | ||
| 320 | |||
| 321 | 246 | static PetscErrorCode STFilterGetRange_Filter(ST st,PetscReal *left,PetscReal *right) | |
| 322 | { | ||
| 323 | 246 | ST_FILTER *ctx = (ST_FILTER*)st->data; | |
| 324 | |||
| 325 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
246 | PetscFunctionBegin; |
| 326 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
246 | if (left) *left = ctx->left; |
| 327 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
246 | if (right) *right = ctx->right; |
| 328 |
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.
|
246 | PetscFunctionReturn(PETSC_SUCCESS); |
| 329 | } | ||
| 330 | |||
| 331 | /*@ | ||
| 332 | STFilterGetRange - Gets the interval containing all eigenvalues. | ||
| 333 | |||
| 334 | Not Collective | ||
| 335 | |||
| 336 | Input Parameter: | ||
| 337 | . st - the spectral transformation context | ||
| 338 | |||
| 339 | Output Parameters: | ||
| 340 | + left - left end of the spectral range | ||
| 341 | - right - right end of the spectral range | ||
| 342 | |||
| 343 | Level: intermediate | ||
| 344 | |||
| 345 | .seealso: [](ch:st), `STFILTER`, `STFilterSetRange()` | ||
| 346 | @*/ | ||
| 347 | 246 | PetscErrorCode STFilterGetRange(ST st,PetscReal *left,PetscReal *right) | |
| 348 | { | ||
| 349 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
246 | PetscFunctionBegin; |
| 350 |
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.
|
246 | PetscValidHeaderSpecific(st,ST_CLASSID,1); |
| 351 |
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.
|
246 | PetscUseMethod(st,"STFilterGetRange_C",(ST,PetscReal*,PetscReal*),(st,left,right)); |
| 352 |
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.
|
246 | PetscFunctionReturn(PETSC_SUCCESS); |
| 353 | } | ||
| 354 | |||
| 355 | 124 | static PetscErrorCode STFilterSetDegree_Filter(ST st,PetscInt deg) | |
| 356 | { | ||
| 357 | 124 | ST_FILTER *ctx = (ST_FILTER*)st->data; | |
| 358 | |||
| 359 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
124 | PetscFunctionBegin; |
| 360 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
124 | if (deg == PETSC_DEFAULT || deg == PETSC_DECIDE) { |
| 361 | ✗ | ctx->polyDegree = 0; | |
| 362 | ✗ | st->state = ST_STATE_INITIAL; | |
| 363 | ✗ | st->opready = PETSC_FALSE; | |
| 364 | ✗ | ctx->filtch = PETSC_TRUE; | |
| 365 | } else { | ||
| 366 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
124 | PetscCheck(deg>0,PetscObjectComm((PetscObject)st),PETSC_ERR_ARG_OUTOFRANGE,"Illegal value of degree. Must be > 0"); |
| 367 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
124 | if (ctx->polyDegree != deg) { |
| 368 | 76 | ctx->polyDegree = deg; | |
| 369 | 76 | st->state = ST_STATE_INITIAL; | |
| 370 | 76 | st->opready = PETSC_FALSE; | |
| 371 | 76 | ctx->filtch = PETSC_TRUE; | |
| 372 | } | ||
| 373 | } | ||
| 374 |
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); |
| 375 | } | ||
| 376 | |||
| 377 | /*@ | ||
| 378 | STFilterSetDegree - Sets the degree of the filter polynomial. | ||
| 379 | |||
| 380 | Logically Collective | ||
| 381 | |||
| 382 | Input Parameters: | ||
| 383 | + st - the spectral transformation context | ||
| 384 | - deg - polynomial degree | ||
| 385 | |||
| 386 | Options Database Key: | ||
| 387 | . -st_filter_degree \<deg\> - sets the degree of the filter polynomial | ||
| 388 | |||
| 389 | Level: intermediate | ||
| 390 | |||
| 391 | .seealso: [](ch:st), `STFILTER`, `STFilterGetDegree()` | ||
| 392 | @*/ | ||
| 393 | 124 | PetscErrorCode STFilterSetDegree(ST st,PetscInt deg) | |
| 394 | { | ||
| 395 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
124 | PetscFunctionBegin; |
| 396 |
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.
|
124 | PetscValidHeaderSpecific(st,ST_CLASSID,1); |
| 397 |
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.
|
124 | PetscValidLogicalCollectiveInt(st,deg,2); |
| 398 |
8/14✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✓ 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.
|
124 | PetscTryMethod(st,"STFilterSetDegree_C",(ST,PetscInt),(st,deg)); |
| 399 |
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.
|
124 | PetscFunctionReturn(PETSC_SUCCESS); |
| 400 | } | ||
| 401 | |||
| 402 | 70 | static PetscErrorCode STFilterGetDegree_Filter(ST st,PetscInt *deg) | |
| 403 | { | ||
| 404 | 70 | ST_FILTER *ctx = (ST_FILTER*)st->data; | |
| 405 | |||
| 406 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
70 | PetscFunctionBegin; |
| 407 | 70 | *deg = ctx->polyDegree; | |
| 408 |
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.
|
70 | PetscFunctionReturn(PETSC_SUCCESS); |
| 409 | } | ||
| 410 | |||
| 411 | /*@ | ||
| 412 | STFilterGetDegree - Gets the degree of the filter polynomial. | ||
| 413 | |||
| 414 | Not Collective | ||
| 415 | |||
| 416 | Input Parameter: | ||
| 417 | . st - the spectral transformation context | ||
| 418 | |||
| 419 | Output Parameter: | ||
| 420 | . deg - polynomial degree | ||
| 421 | |||
| 422 | Level: intermediate | ||
| 423 | |||
| 424 | .seealso: [](ch:st), `STFILTER`, `STFilterSetDegree()` | ||
| 425 | @*/ | ||
| 426 | 70 | PetscErrorCode STFilterGetDegree(ST st,PetscInt *deg) | |
| 427 | { | ||
| 428 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
70 | PetscFunctionBegin; |
| 429 |
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.
|
70 | PetscValidHeaderSpecific(st,ST_CLASSID,1); |
| 430 |
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.
|
70 | PetscAssertPointer(deg,2); |
| 431 |
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.
|
70 | PetscUseMethod(st,"STFilterGetDegree_C",(ST,PetscInt*),(st,deg)); |
| 432 |
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.
|
70 | PetscFunctionReturn(PETSC_SUCCESS); |
| 433 | } | ||
| 434 | |||
| 435 | 621 | static PetscErrorCode STFilterGetThreshold_Filter(ST st,PetscReal *gamma) | |
| 436 | { | ||
| 437 | 621 | ST_FILTER *ctx = (ST_FILTER*)st->data; | |
| 438 | |||
| 439 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
621 | PetscFunctionBegin; |
| 440 |
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.
|
621 | if (ctx->getthreshold) PetscCall(ctx->getthreshold(st,gamma)); |
| 441 | ✗ | else *gamma = 0.5; | |
| 442 |
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.
|
97 | PetscFunctionReturn(PETSC_SUCCESS); |
| 443 | } | ||
| 444 | |||
| 445 | /*@ | ||
| 446 | STFilterGetThreshold - Gets the threshold value $\gamma$ used to decide | ||
| 447 | whether eigenvalue approximations are inside or outside the wanted interval. | ||
| 448 | |||
| 449 | Not Collective | ||
| 450 | |||
| 451 | Input Parameter: | ||
| 452 | . st - the spectral transformation context | ||
| 453 | |||
| 454 | Output Parameter: | ||
| 455 | . gamma - the threshold value | ||
| 456 | |||
| 457 | Note: | ||
| 458 | An eigenvalue $\lambda$ is considered to be inside the wanted interval | ||
| 459 | if $|p(\lambda)|\geq\gamma$, and outside otherwise. | ||
| 460 | |||
| 461 | Level: developer | ||
| 462 | |||
| 463 | .seealso: [](ch:st), `STFILTER`, `STFilterGetRange()` | ||
| 464 | @*/ | ||
| 465 | 621 | PetscErrorCode STFilterGetThreshold(ST st,PetscReal *gamma) | |
| 466 | { | ||
| 467 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
621 | PetscFunctionBegin; |
| 468 |
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.
|
621 | PetscValidHeaderSpecific(st,ST_CLASSID,1); |
| 469 |
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.
|
621 | PetscAssertPointer(gamma,2); |
| 470 |
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.
|
621 | PetscUseMethod(st,"STFilterGetThreshold_C",(ST,PetscReal*),(st,gamma)); |
| 471 |
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.
|
621 | PetscFunctionReturn(PETSC_SUCCESS); |
| 472 | } | ||
| 473 | |||
| 474 | 80 | static PetscErrorCode STFilterSetDamping_Filter(ST st,STFilterDamping damping) | |
| 475 | { | ||
| 476 | 80 | ST_FILTER *ctx = (ST_FILTER*)st->data; | |
| 477 | |||
| 478 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
80 | PetscFunctionBegin; |
| 479 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
80 | if (ctx->damping != damping) { |
| 480 | 30 | ctx->damping = damping; | |
| 481 | 30 | st->state = ST_STATE_INITIAL; | |
| 482 | 30 | st->opready = PETSC_FALSE; | |
| 483 | 30 | ctx->filtch = PETSC_TRUE; | |
| 484 | } | ||
| 485 |
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.
|
80 | PetscFunctionReturn(PETSC_SUCCESS); |
| 486 | } | ||
| 487 | |||
| 488 | /*@ | ||
| 489 | STFilterSetDamping - Sets the type of damping to be used in the polynomial filter. | ||
| 490 | |||
| 491 | Logically Collective | ||
| 492 | |||
| 493 | Input Parameters: | ||
| 494 | + st - the spectral transformation context | ||
| 495 | - damping - the type of damping | ||
| 496 | |||
| 497 | Options Database Key: | ||
| 498 | . -st_filter_damping \<damping\> - sets the type of damping | ||
| 499 | |||
| 500 | Note: | ||
| 501 | Only used in `ST_FILTER_CHEBYSHEV` filters. | ||
| 502 | |||
| 503 | Level: advanced | ||
| 504 | |||
| 505 | .seealso: [](ch:st), `STFILTER`, `STFilterGetDamping()` | ||
| 506 | @*/ | ||
| 507 | 80 | PetscErrorCode STFilterSetDamping(ST st,STFilterDamping damping) | |
| 508 | { | ||
| 509 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
80 | PetscFunctionBegin; |
| 510 |
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.
|
80 | PetscValidHeaderSpecific(st,ST_CLASSID,1); |
| 511 |
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.
|
80 | PetscValidLogicalCollectiveEnum(st,damping,2); |
| 512 |
8/14✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✓ 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.
|
80 | PetscTryMethod(st,"STFilterSetDamping_C",(ST,STFilterDamping),(st,damping)); |
| 513 |
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.
|
80 | PetscFunctionReturn(PETSC_SUCCESS); |
| 514 | } | ||
| 515 | |||
| 516 | ✗ | static PetscErrorCode STFilterGetDamping_Filter(ST st,STFilterDamping *damping) | |
| 517 | { | ||
| 518 | ✗ | ST_FILTER *ctx = (ST_FILTER*)st->data; | |
| 519 | |||
| 520 | ✗ | PetscFunctionBegin; | |
| 521 | ✗ | *damping = ctx->damping; | |
| 522 | ✗ | PetscFunctionReturn(PETSC_SUCCESS); | |
| 523 | } | ||
| 524 | |||
| 525 | /*@ | ||
| 526 | STFilterGetDamping - Gets the type of damping used in the polynomial filter. | ||
| 527 | |||
| 528 | Not Collective | ||
| 529 | |||
| 530 | Input Parameter: | ||
| 531 | . st - the spectral transformation context | ||
| 532 | |||
| 533 | Output Parameter: | ||
| 534 | . damping - the type of damping | ||
| 535 | |||
| 536 | Level: advanced | ||
| 537 | |||
| 538 | .seealso: [](ch:st), `STFILTER`, `STFilterSetDamping()` | ||
| 539 | @*/ | ||
| 540 | ✗ | PetscErrorCode STFilterGetDamping(ST st,STFilterDamping *damping) | |
| 541 | { | ||
| 542 | ✗ | PetscFunctionBegin; | |
| 543 | ✗ | PetscValidHeaderSpecific(st,ST_CLASSID,1); | |
| 544 | ✗ | PetscAssertPointer(damping,2); | |
| 545 | ✗ | PetscUseMethod(st,"STFilterGetDamping_C",(ST,STFilterDamping*),(st,damping)); | |
| 546 | ✗ | PetscFunctionReturn(PETSC_SUCCESS); | |
| 547 | } | ||
| 548 | |||
| 549 | ✗ | static PetscErrorCode STView_Filter(ST st,PetscViewer viewer) | |
| 550 | { | ||
| 551 | ✗ | ST_FILTER *ctx = (ST_FILTER*)st->data; | |
| 552 | ✗ | PetscReal gamma; | |
| 553 | ✗ | PetscBool isascii; | |
| 554 | |||
| 555 | ✗ | PetscFunctionBegin; | |
| 556 | ✗ | PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii)); | |
| 557 | ✗ | if (isascii) { | |
| 558 | ✗ | PetscCall(PetscViewerASCIIPrintf(viewer," filter type: %s\n",STFilterTypes[ctx->type])); | |
| 559 | ✗ | PetscCall(PetscViewerASCIIPrintf(viewer," interval of desired eigenvalues: [%g,%g]\n",(double)ctx->inta,(double)ctx->intb)); | |
| 560 | ✗ | PetscCall(PetscViewerASCIIPrintf(viewer," numerical range: [%g,%g]\n",(double)ctx->left,(double)ctx->right)); | |
| 561 | ✗ | PetscCall(PetscViewerASCIIPrintf(viewer," degree of filter polynomial: %" PetscInt_FMT "\n",ctx->polyDegree)); | |
| 562 | ✗ | if (ctx->damping && ctx->type==ST_FILTER_CHEBYSHEV) PetscCall(PetscViewerASCIIPrintf(viewer," type of damping = %s\n",STFilterDampings[ctx->damping])); | |
| 563 | ✗ | if (st->state>=ST_STATE_SETUP && ctx->getthreshold) { | |
| 564 | ✗ | PetscCall(STFilterGetThreshold(st,&gamma)); | |
| 565 | ✗ | PetscCall(PetscViewerASCIIPrintf(viewer," limit to accept eigenvalues: gamma=%g\n",(double)gamma)); | |
| 566 | } | ||
| 567 | } | ||
| 568 | ✗ | PetscFunctionReturn(PETSC_SUCCESS); | |
| 569 | } | ||
| 570 | |||
| 571 | 146 | static PetscErrorCode STDestroy_Filter(ST st) | |
| 572 | { | ||
| 573 | 146 | ST_FILTER *ctx = (ST_FILTER*)st->data; | |
| 574 | |||
| 575 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
146 | PetscFunctionBegin; |
| 576 |
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.
|
146 | if (ctx->destroy) PetscCall(ctx->destroy(st)); |
| 577 |
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.
|
146 | PetscCall(PetscFree(st->data)); |
| 578 |
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.
|
146 | PetscCall(PetscObjectComposeFunction((PetscObject)st,"STFilterSetType_C",NULL)); |
| 579 |
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.
|
146 | PetscCall(PetscObjectComposeFunction((PetscObject)st,"STFilterGetType_C",NULL)); |
| 580 |
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.
|
146 | PetscCall(PetscObjectComposeFunction((PetscObject)st,"STFilterSetInterval_C",NULL)); |
| 581 |
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.
|
146 | PetscCall(PetscObjectComposeFunction((PetscObject)st,"STFilterGetInterval_C",NULL)); |
| 582 |
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.
|
146 | PetscCall(PetscObjectComposeFunction((PetscObject)st,"STFilterSetRange_C",NULL)); |
| 583 |
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.
|
146 | PetscCall(PetscObjectComposeFunction((PetscObject)st,"STFilterGetRange_C",NULL)); |
| 584 |
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.
|
146 | PetscCall(PetscObjectComposeFunction((PetscObject)st,"STFilterSetDegree_C",NULL)); |
| 585 |
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.
|
146 | PetscCall(PetscObjectComposeFunction((PetscObject)st,"STFilterGetDegree_C",NULL)); |
| 586 |
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.
|
146 | PetscCall(PetscObjectComposeFunction((PetscObject)st,"STFilterGetThreshold_C",NULL)); |
| 587 |
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.
|
146 | PetscCall(PetscObjectComposeFunction((PetscObject)st,"STFilterSetDamping_C",NULL)); |
| 588 |
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.
|
146 | PetscCall(PetscObjectComposeFunction((PetscObject)st,"STFilterGetDamping_C",NULL)); |
| 589 |
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); |
| 590 | } | ||
| 591 | |||
| 592 | /*MC | ||
| 593 | STFILTER - STFILTER = "filter" - A special type of `ST` that represents | ||
| 594 | a polynomial filter. | ||
| 595 | |||
| 596 | Level: beginner | ||
| 597 | |||
| 598 | Notes: | ||
| 599 | In standard eigenvalue problems, when the eigenvalues of interest are interior | ||
| 600 | to the spectrum and we want to avoid the high cost associated with the matrix | ||
| 601 | factorization of the shift-and-invert spectral transformation, an alternative | ||
| 602 | is to build a high-order polynomial such that $p(A)$ enhances the wanted | ||
| 603 | eigenvalues and filters out the unwanted ones. | ||
| 604 | |||
| 605 | The definition of the filter is done with functions such as `STFilterSetDegree()`, | ||
| 606 | `STFilterSetInterval()` or `STFilterSetType()`. | ||
| 607 | |||
| 608 | .seealso: [](ch:st), `ST`, `STType`, `STSetType()`, `STSetMatrices()`, `STFilterSetDegree()`, `STFilterSetInterval()`, `STFilterSetType()` | ||
| 609 | M*/ | ||
| 610 | |||
| 611 | 146 | SLEPC_EXTERN PetscErrorCode STCreate_Filter(ST st) | |
| 612 | { | ||
| 613 | 146 | ST_FILTER *ctx; | |
| 614 | |||
| 615 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
146 | PetscFunctionBegin; |
| 616 |
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.
|
146 | PetscCall(PetscNew(&ctx)); |
| 617 | 146 | st->data = (void*)ctx; | |
| 618 | |||
| 619 | 146 | st->usesksp = PETSC_FALSE; | |
| 620 | |||
| 621 | 146 | ctx->type = (STFilterType)0; | |
| 622 | 146 | ctx->inta = PETSC_MIN_REAL; | |
| 623 | 146 | ctx->intb = PETSC_MAX_REAL; | |
| 624 | 146 | ctx->left = 0.0; | |
| 625 | 146 | ctx->right = 0.0; | |
| 626 | 146 | ctx->polyDegree = 0; | |
| 627 | |||
| 628 | 146 | st->ops->apply = STApply_Generic; | |
| 629 | 146 | st->ops->computeoperator = STComputeOperator_Filter; | |
| 630 | 146 | st->ops->setfromoptions = STSetFromOptions_Filter; | |
| 631 | 146 | st->ops->destroy = STDestroy_Filter; | |
| 632 | 146 | st->ops->reset = STReset_Filter; | |
| 633 | 146 | st->ops->view = STView_Filter; | |
| 634 | |||
| 635 |
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.
|
146 | PetscCall(PetscObjectComposeFunction((PetscObject)st,"STFilterSetType_C",STFilterSetType_Filter)); |
| 636 |
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.
|
146 | PetscCall(PetscObjectComposeFunction((PetscObject)st,"STFilterGetType_C",STFilterGetType_Filter)); |
| 637 |
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.
|
146 | PetscCall(PetscObjectComposeFunction((PetscObject)st,"STFilterSetInterval_C",STFilterSetInterval_Filter)); |
| 638 |
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.
|
146 | PetscCall(PetscObjectComposeFunction((PetscObject)st,"STFilterGetInterval_C",STFilterGetInterval_Filter)); |
| 639 |
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.
|
146 | PetscCall(PetscObjectComposeFunction((PetscObject)st,"STFilterSetRange_C",STFilterSetRange_Filter)); |
| 640 |
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.
|
146 | PetscCall(PetscObjectComposeFunction((PetscObject)st,"STFilterGetRange_C",STFilterGetRange_Filter)); |
| 641 |
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.
|
146 | PetscCall(PetscObjectComposeFunction((PetscObject)st,"STFilterSetDegree_C",STFilterSetDegree_Filter)); |
| 642 |
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.
|
146 | PetscCall(PetscObjectComposeFunction((PetscObject)st,"STFilterGetDegree_C",STFilterGetDegree_Filter)); |
| 643 |
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.
|
146 | PetscCall(PetscObjectComposeFunction((PetscObject)st,"STFilterGetThreshold_C",STFilterGetThreshold_Filter)); |
| 644 |
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.
|
146 | PetscCall(PetscObjectComposeFunction((PetscObject)st,"STFilterSetDamping_C",STFilterSetDamping_Filter)); |
| 645 |
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.
|
146 | PetscCall(PetscObjectComposeFunction((PetscObject)st,"STFilterGetDamping_C",STFilterGetDamping_Filter)); |
| 646 |
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); |
| 647 | } | ||
| 648 |