| 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 | SVD routines for setting solver options | ||
| 12 | */ | ||
| 13 | |||
| 14 | #include <slepc/private/svdimpl.h> /*I "slepcsvd.h" I*/ | ||
| 15 | #include <petscdraw.h> | ||
| 16 | |||
| 17 | /*@ | ||
| 18 | SVDSetImplicitTranspose - Indicates how to handle the transpose of the matrix | ||
| 19 | associated with the singular value problem. | ||
| 20 | |||
| 21 | Logically Collective | ||
| 22 | |||
| 23 | Input Parameters: | ||
| 24 | + svd - the singular value solver context | ||
| 25 | - impl - how to handle the transpose (implicitly or not) | ||
| 26 | |||
| 27 | Options Database Key: | ||
| 28 | . -svd_implicittranspose (true|false) - enable the implicit transpose mode | ||
| 29 | |||
| 30 | Notes: | ||
| 31 | By default, the transpose of the matrix is explicitly built (if the matrix | ||
| 32 | has defined the `MatTranspose()` operation, `MATOP_TRANSPOSE`). | ||
| 33 | |||
| 34 | If this flag is set to `PETSC_TRUE`, the solver does not build the transpose, but | ||
| 35 | handles it implicitly via `MatMultTranspose()` (or `MatMultHermitianTranspose()` | ||
| 36 | in the complex case) operations. This is likely to be more inefficient | ||
| 37 | than the default behavior, both sequentially and in parallel, but | ||
| 38 | requires less storage. | ||
| 39 | |||
| 40 | Level: advanced | ||
| 41 | |||
| 42 | .seealso: [](ch:svd), `SVDGetImplicitTranspose()`, `SVDSolve()`, `SVDSetOperators()` | ||
| 43 | @*/ | ||
| 44 | 156 | PetscErrorCode SVDSetImplicitTranspose(SVD svd,PetscBool impl) | |
| 45 | { | ||
| 46 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
156 | PetscFunctionBegin; |
| 47 |
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.
|
156 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 48 |
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.
|
156 | PetscValidLogicalCollectiveBool(svd,impl,2); |
| 49 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 3 times.
|
156 | if (svd->impltrans!=impl) { |
| 50 | 138 | svd->impltrans = impl; | |
| 51 | 138 | svd->state = SVD_STATE_INITIAL; | |
| 52 | } | ||
| 53 |
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.
|
156 | PetscFunctionReturn(PETSC_SUCCESS); |
| 54 | } | ||
| 55 | |||
| 56 | /*@ | ||
| 57 | SVDGetImplicitTranspose - Gets the mode used to handle the transpose | ||
| 58 | of the matrix associated with the singular value problem. | ||
| 59 | |||
| 60 | Not Collective | ||
| 61 | |||
| 62 | Input Parameter: | ||
| 63 | . svd - the singular value solver context | ||
| 64 | |||
| 65 | Output Parameter: | ||
| 66 | . impl - how to handle the transpose (implicitly or not) | ||
| 67 | |||
| 68 | Level: advanced | ||
| 69 | |||
| 70 | .seealso: [](ch:svd), `SVDSetImplicitTranspose()`, `SVDSolve()`, `SVDSetOperators()` | ||
| 71 | @*/ | ||
| 72 | 161 | PetscErrorCode SVDGetImplicitTranspose(SVD svd,PetscBool *impl) | |
| 73 | { | ||
| 74 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
161 | PetscFunctionBegin; |
| 75 |
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.
|
161 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 76 |
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.
|
161 | PetscAssertPointer(impl,2); |
| 77 | 161 | *impl = svd->impltrans; | |
| 78 |
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.
|
161 | PetscFunctionReturn(PETSC_SUCCESS); |
| 79 | } | ||
| 80 | |||
| 81 | /*@ | ||
| 82 | SVDSetTolerances - Sets the tolerance and maximum iteration count used | ||
| 83 | by the `SVD` convergence tests. | ||
| 84 | |||
| 85 | Logically Collective | ||
| 86 | |||
| 87 | Input Parameters: | ||
| 88 | + svd - the singular value solver context | ||
| 89 | . tol - the convergence tolerance | ||
| 90 | - maxits - maximum number of iterations to use | ||
| 91 | |||
| 92 | Options Database Keys: | ||
| 93 | + -svd_tol tol - sets the convergence tolerance | ||
| 94 | - -svd_max_it maxits - sets the maximum number of iterations allowed | ||
| 95 | |||
| 96 | Note: | ||
| 97 | Use `PETSC_CURRENT` to retain the current value of any of the parameters. | ||
| 98 | Use `PETSC_DETERMINE` for either argument to assign a default value computed | ||
| 99 | internally (may be different in each solver). | ||
| 100 | For `maxits` use `PETSC_UNLIMITED` to indicate there is no upper bound on this value. | ||
| 101 | |||
| 102 | Level: intermediate | ||
| 103 | |||
| 104 | .seealso: [](ch:svd), `SVDGetTolerances()` | ||
| 105 | @*/ | ||
| 106 | 559 | PetscErrorCode SVDSetTolerances(SVD svd,PetscReal tol,PetscInt maxits) | |
| 107 | { | ||
| 108 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
559 | PetscFunctionBegin; |
| 109 |
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.
|
559 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 110 |
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.
|
559 | PetscValidLogicalCollectiveReal(svd,tol,2); |
| 111 |
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.
|
559 | PetscValidLogicalCollectiveInt(svd,maxits,3); |
| 112 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
559 | if (tol == (PetscReal)PETSC_DETERMINE) { |
| 113 | 38 | svd->tol = PETSC_DETERMINE; | |
| 114 | 38 | svd->state = SVD_STATE_INITIAL; | |
| 115 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
521 | } else if (tol != (PetscReal)PETSC_CURRENT) { |
| 116 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
371 | PetscCheck(tol>0.0,PetscObjectComm((PetscObject)svd),PETSC_ERR_ARG_OUTOFRANGE,"Illegal value of tol. Must be > 0"); |
| 117 | 371 | svd->tol = tol; | |
| 118 | } | ||
| 119 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
559 | if (maxits == PETSC_DETERMINE) { |
| 120 | 117 | svd->max_it = PETSC_DETERMINE; | |
| 121 | 117 | svd->state = SVD_STATE_INITIAL; | |
| 122 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
442 | } else if (maxits == PETSC_UNLIMITED) { |
| 123 | ✗ | svd->max_it = PETSC_INT_MAX; | |
| 124 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 6 times.
|
442 | } else if (maxits != PETSC_CURRENT) { |
| 125 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
394 | PetscCheck(maxits>0,PetscObjectComm((PetscObject)svd),PETSC_ERR_ARG_OUTOFRANGE,"Illegal value of maxits. Must be > 0"); |
| 126 | 394 | svd->max_it = maxits; | |
| 127 | } | ||
| 128 |
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.
|
121 | PetscFunctionReturn(PETSC_SUCCESS); |
| 129 | } | ||
| 130 | |||
| 131 | /*@ | ||
| 132 | SVDGetTolerances - Gets the tolerance and maximum | ||
| 133 | iteration count used by the default SVD convergence tests. | ||
| 134 | |||
| 135 | Not Collective | ||
| 136 | |||
| 137 | Input Parameter: | ||
| 138 | . svd - the singular value solver context | ||
| 139 | |||
| 140 | Output Parameters: | ||
| 141 | + tol - the convergence tolerance | ||
| 142 | - maxits - maximum number of iterations | ||
| 143 | |||
| 144 | Notes: | ||
| 145 | The user can specify `NULL` for any parameter that is not needed. | ||
| 146 | |||
| 147 | Level: intermediate | ||
| 148 | |||
| 149 | .seealso: [](ch:svd), `SVDSetTolerances()` | ||
| 150 | @*/ | ||
| 151 | 809 | PetscErrorCode SVDGetTolerances(SVD svd,PetscReal *tol,PetscInt *maxits) | |
| 152 | { | ||
| 153 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
809 | PetscFunctionBegin; |
| 154 |
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.
|
809 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 155 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
809 | if (tol) *tol = svd->tol; |
| 156 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
809 | if (maxits) *maxits = svd->max_it; |
| 157 |
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.
|
809 | PetscFunctionReturn(PETSC_SUCCESS); |
| 158 | } | ||
| 159 | |||
| 160 | /*@ | ||
| 161 | SVDSetThreshold - Sets the threshold used in the threshold stopping test. | ||
| 162 | |||
| 163 | Logically Collective | ||
| 164 | |||
| 165 | Input Parameters: | ||
| 166 | + svd - the singular value solver context | ||
| 167 | . thres - the threshold value | ||
| 168 | - rel - whether the threshold is relative or not | ||
| 169 | |||
| 170 | Options Database Keys: | ||
| 171 | + -svd_threshold_absolute thres - sets an absolute threshold | ||
| 172 | - -svd_threshold_relative thres - sets a relative threshold | ||
| 173 | |||
| 174 | Notes: | ||
| 175 | This function internally calls `SVDSetStoppingTest()` to set a special stopping | ||
| 176 | test based on the threshold, where singular values are computed in sequence | ||
| 177 | until the next singular value approximation is below the threshold `thres`. | ||
| 178 | |||
| 179 | If the solver is configured to compute smallest singular values, then the | ||
| 180 | threshold must be interpreted in the opposite direction, i.e., the computation | ||
| 181 | will stop when the next singular value approximation is above the threshold. | ||
| 182 | |||
| 183 | In the case of largest singular values, the threshold can be made relative | ||
| 184 | with respect to the largest singular value (i.e., the matrix norm). Otherwise, | ||
| 185 | the argument `rel` should be `PETSC_FALSE`. | ||
| 186 | |||
| 187 | When the next singular value approximation does not satisfy the threshold criterion, | ||
| 188 | the solver will carry out an additional iteration/restart. This provides more | ||
| 189 | guarantees that singular value multiplicity is resolved correctly. As a result, | ||
| 190 | sometimes the solver will return more converged singular values than strictly | ||
| 191 | satisfying the criterion. | ||
| 192 | |||
| 193 | Since the number of computed singular values is not known a priori, the solver | ||
| 194 | will need to reallocate the basis of vectors internally, to have enough room | ||
| 195 | to accommodate all the singular vectors. Hence, this option must be used with | ||
| 196 | caution to avoid out-of-memory problems. The recommendation is to set the value | ||
| 197 | of `ncv` to be larger than the estimated number of singular values, to minimize | ||
| 198 | the number of reallocations. | ||
| 199 | |||
| 200 | This functionality is most useful when computing largest singular values. A | ||
| 201 | typical use case is to compute a low rank approximation of a matrix. Suppose | ||
| 202 | we know that singular values decay abruptly around a certain index $k$, which | ||
| 203 | is unknown. Then using a small relative threshold such as 0.2 will guarantee that | ||
| 204 | the computed singular vectors capture the numerical rank $k$. However, if the matrix | ||
| 205 | does not have low rank, i.e., singular values decay progressively, then a | ||
| 206 | value of 0.2 will imply a very high cost, both computationally and in memory. | ||
| 207 | |||
| 208 | If a number of wanted singular values has been set with `SVDSetDimensions()` | ||
| 209 | it is also taken into account and the solver will stop when one of the two | ||
| 210 | conditions (threshold or number of converged values) is met. | ||
| 211 | |||
| 212 | Use `SVDSetStoppingTest()` to return to the usual computation of a fixed number | ||
| 213 | of singular values. | ||
| 214 | |||
| 215 | Level: advanced | ||
| 216 | |||
| 217 | .seealso: [](ch:svd), `SVDGetThreshold()`, `SVDSetStoppingTest()`, `SVDSetDimensions()`, `SVDSetWhichSingularTriplets()` | ||
| 218 | @*/ | ||
| 219 | 85 | PetscErrorCode SVDSetThreshold(SVD svd,PetscReal thres,PetscBool rel) | |
| 220 | { | ||
| 221 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
85 | PetscFunctionBegin; |
| 222 |
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.
|
85 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 223 |
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.
|
85 | PetscValidLogicalCollectiveReal(svd,thres,2); |
| 224 |
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.
|
85 | PetscValidLogicalCollectiveBool(svd,rel,3); |
| 225 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
85 | PetscCheck(thres>0.0,PetscObjectComm((PetscObject)svd),PETSC_ERR_ARG_OUTOFRANGE,"Illegal value of the threshold. Must be > 0"); |
| 226 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
85 | if (svd->thres != thres || svd->threlative != rel) { |
| 227 | 85 | svd->thres = thres; | |
| 228 | 85 | svd->threlative = rel; | |
| 229 | 85 | svd->state = SVD_STATE_INITIAL; | |
| 230 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
85 | PetscCall(SVDSetStoppingTest(svd,SVD_STOP_THRESHOLD)); |
| 231 | } | ||
| 232 |
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.
|
21 | PetscFunctionReturn(PETSC_SUCCESS); |
| 233 | } | ||
| 234 | |||
| 235 | /*@ | ||
| 236 | SVDGetThreshold - Gets the threshold used by the threshold stopping test. | ||
| 237 | |||
| 238 | Not Collective | ||
| 239 | |||
| 240 | Input Parameter: | ||
| 241 | . svd - the singular value solver context | ||
| 242 | |||
| 243 | Output Parameters: | ||
| 244 | + thres - the threshold | ||
| 245 | - rel - whether the threshold is relative or not | ||
| 246 | |||
| 247 | Level: advanced | ||
| 248 | |||
| 249 | .seealso: [](ch:svd), `SVDSetThreshold()` | ||
| 250 | @*/ | ||
| 251 | 37 | PetscErrorCode SVDGetThreshold(SVD svd,PetscReal *thres,PetscBool *rel) | |
| 252 | { | ||
| 253 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
37 | PetscFunctionBegin; |
| 254 |
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.
|
37 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 255 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
37 | if (thres) *thres = svd->thres; |
| 256 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
|
37 | if (rel) *rel = svd->threlative; |
| 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.
|
37 | PetscFunctionReturn(PETSC_SUCCESS); |
| 258 | } | ||
| 259 | |||
| 260 | /*@ | ||
| 261 | SVDSetDimensions - Sets the number of singular values to compute | ||
| 262 | and the dimension of the subspace. | ||
| 263 | |||
| 264 | Logically Collective | ||
| 265 | |||
| 266 | Input Parameters: | ||
| 267 | + svd - the singular value solver context | ||
| 268 | . nsv - number of singular values to compute | ||
| 269 | . ncv - the maximum dimension of the subspace to be used by the solver | ||
| 270 | - mpd - the maximum dimension allowed for the projected problem | ||
| 271 | |||
| 272 | Options Database Keys: | ||
| 273 | + -svd_nsv nsv - sets the number of singular values | ||
| 274 | . -svd_ncv ncv - sets the dimension of the subspace | ||
| 275 | - -svd_mpd mpd - sets the maximum projected dimension | ||
| 276 | |||
| 277 | Notes: | ||
| 278 | Use `PETSC_DETERMINE` for `ncv` and `mpd` to assign a reasonably good value, which is | ||
| 279 | dependent on the solution method and the number of singular values required. For | ||
| 280 | any of the arguments, use `PETSC_CURRENT` to preserve the current value. | ||
| 281 | |||
| 282 | The parameters `ncv` and `mpd` are intimately related, so that the user is advised | ||
| 283 | to set one of them at most. Normal usage is\: | ||
| 284 | |||
| 285 | 1. In cases where `nsv` is small, the user sets `ncv` (a reasonable default is `2*nsv`). | ||
| 286 | 1. In cases where `nsv` is large, the user sets `mpd`. | ||
| 287 | |||
| 288 | The value of `ncv` should always be between `nsv` and `(nsv+mpd)`, typically | ||
| 289 | `ncv=nsv+mpd`. If `nsv` is not too large, `mpd=nsv` is a reasonable choice, otherwise | ||
| 290 | a smaller value should be used. | ||
| 291 | |||
| 292 | Level: intermediate | ||
| 293 | |||
| 294 | .seealso: [](ch:svd), `SVDGetDimensions()` | ||
| 295 | @*/ | ||
| 296 | 2015 | PetscErrorCode SVDSetDimensions(SVD svd,PetscInt nsv,PetscInt ncv,PetscInt mpd) | |
| 297 | { | ||
| 298 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2015 | PetscFunctionBegin; |
| 299 |
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.
|
2015 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 300 |
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.
|
2015 | PetscValidLogicalCollectiveInt(svd,nsv,2); |
| 301 |
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.
|
2015 | PetscValidLogicalCollectiveInt(svd,ncv,3); |
| 302 |
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.
|
2015 | PetscValidLogicalCollectiveInt(svd,mpd,4); |
| 303 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2015 | if (nsv != PETSC_CURRENT) { |
| 304 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
1922 | PetscCheck(nsv>0,PetscObjectComm((PetscObject)svd),PETSC_ERR_ARG_OUTOFRANGE,"Illegal value of nsv. Must be > 0"); |
| 305 | 1922 | svd->nsv = nsv; | |
| 306 | } | ||
| 307 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2015 | if (ncv == PETSC_DETERMINE) { |
| 308 | 1334 | svd->ncv = PETSC_DETERMINE; | |
| 309 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
681 | } else if (ncv != PETSC_CURRENT) { |
| 310 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
681 | PetscCheck(ncv>0,PetscObjectComm((PetscObject)svd),PETSC_ERR_ARG_OUTOFRANGE,"Illegal value of ncv. Must be > 0"); |
| 311 | 681 | svd->ncv = ncv; | |
| 312 | } | ||
| 313 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 6 times.
|
2015 | if (mpd == PETSC_DETERMINE) { |
| 314 | 2003 | svd->mpd = PETSC_DETERMINE; | |
| 315 |
1/2✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
|
12 | } else if (mpd != PETSC_CURRENT) { |
| 316 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
12 | PetscCheck(mpd>0,PetscObjectComm((PetscObject)svd),PETSC_ERR_ARG_OUTOFRANGE,"Illegal value of mpd. Must be > 0"); |
| 317 | 12 | svd->mpd = mpd; | |
| 318 | } | ||
| 319 | 2015 | svd->state = SVD_STATE_INITIAL; | |
| 320 |
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.
|
2015 | PetscFunctionReturn(PETSC_SUCCESS); |
| 321 | } | ||
| 322 | |||
| 323 | /*@ | ||
| 324 | SVDGetDimensions - Gets the number of singular values to compute | ||
| 325 | and the dimension of the subspace. | ||
| 326 | |||
| 327 | Not Collective | ||
| 328 | |||
| 329 | Input Parameter: | ||
| 330 | . svd - the singular value solver context | ||
| 331 | |||
| 332 | Output Parameters: | ||
| 333 | + nsv - number of singular values to compute | ||
| 334 | . ncv - the maximum dimension of the subspace to be used by the solver | ||
| 335 | - mpd - the maximum dimension allowed for the projected problem | ||
| 336 | |||
| 337 | Notes: | ||
| 338 | The user can specify `NULL` for any parameter that is not needed. | ||
| 339 | |||
| 340 | Level: intermediate | ||
| 341 | |||
| 342 | .seealso: [](ch:svd), `SVDSetDimensions()` | ||
| 343 | @*/ | ||
| 344 | 832 | PetscErrorCode SVDGetDimensions(SVD svd,PetscInt *nsv,PetscInt *ncv,PetscInt *mpd) | |
| 345 | { | ||
| 346 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
832 | PetscFunctionBegin; |
| 347 |
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.
|
832 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 348 |
3/4✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
|
1648 | if (nsv) *nsv = svd->nsv? svd->nsv: 1; |
| 349 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
832 | if (ncv) *ncv = svd->ncv; |
| 350 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 10 times.
|
832 | if (mpd) *mpd = svd->mpd; |
| 351 |
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.
|
832 | PetscFunctionReturn(PETSC_SUCCESS); |
| 352 | } | ||
| 353 | |||
| 354 | /*@ | ||
| 355 | SVDSetWhichSingularTriplets - Specifies which singular triplets are | ||
| 356 | to be sought. | ||
| 357 | |||
| 358 | Logically Collective | ||
| 359 | |||
| 360 | Input Parameter: | ||
| 361 | . svd - the singular value solver context | ||
| 362 | |||
| 363 | Output Parameter: | ||
| 364 | . which - which singular triplets are to be sought, see `SVDWhich` for possible values | ||
| 365 | |||
| 366 | Options Database Keys: | ||
| 367 | + -svd_largest - sets largest singular values | ||
| 368 | - -svd_smallest - sets smallest singular values | ||
| 369 | |||
| 370 | Level: intermediate | ||
| 371 | |||
| 372 | .seealso: [](ch:svd), `SVDGetWhichSingularTriplets()`, `SVDWhich` | ||
| 373 | @*/ | ||
| 374 | 476 | PetscErrorCode SVDSetWhichSingularTriplets(SVD svd,SVDWhich which) | |
| 375 | { | ||
| 376 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
476 | PetscFunctionBegin; |
| 377 |
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.
|
476 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 378 |
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.
|
476 | PetscValidLogicalCollectiveEnum(svd,which,2); |
| 379 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
476 | switch (which) { |
| 380 | 476 | case SVD_LARGEST: | |
| 381 | case SVD_SMALLEST: | ||
| 382 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
476 | if (svd->which != which) { |
| 383 | 320 | svd->state = SVD_STATE_INITIAL; | |
| 384 | 320 | svd->which = which; | |
| 385 | } | ||
| 386 | 98 | break; | |
| 387 | ✗ | default: | |
| 388 | − | SETERRQ(PetscObjectComm((PetscObject)svd),PETSC_ERR_ARG_OUTOFRANGE,"Invalid 'which' parameter"); | |
| 389 | } | ||
| 390 |
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.
|
98 | PetscFunctionReturn(PETSC_SUCCESS); |
| 391 | } | ||
| 392 | |||
| 393 | /*@ | ||
| 394 | SVDGetWhichSingularTriplets - Returns which singular triplets are | ||
| 395 | to be sought. | ||
| 396 | |||
| 397 | Not Collective | ||
| 398 | |||
| 399 | Input Parameter: | ||
| 400 | . svd - the singular value solver context | ||
| 401 | |||
| 402 | Output Parameter: | ||
| 403 | . which - which singular triplets are to be sought | ||
| 404 | |||
| 405 | Level: intermediate | ||
| 406 | |||
| 407 | .seealso: [](ch:svd), `SVDSetWhichSingularTriplets()`, `SVDWhich` | ||
| 408 | @*/ | ||
| 409 | 161 | PetscErrorCode SVDGetWhichSingularTriplets(SVD svd,SVDWhich *which) | |
| 410 | { | ||
| 411 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
161 | PetscFunctionBegin; |
| 412 |
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.
|
161 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 413 |
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.
|
161 | PetscAssertPointer(which,2); |
| 414 | 161 | *which = svd->which; | |
| 415 |
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.
|
161 | PetscFunctionReturn(PETSC_SUCCESS); |
| 416 | } | ||
| 417 | |||
| 418 | /*@C | ||
| 419 | SVDSetConvergenceTestFunction - Sets a function to compute the error estimate | ||
| 420 | used in the convergence test. | ||
| 421 | |||
| 422 | Logically Collective | ||
| 423 | |||
| 424 | Input Parameters: | ||
| 425 | + svd - the singular value solver context | ||
| 426 | . conv - the convergence test function, see `SVDConvergenceTestFn` for the calling sequence | ||
| 427 | . ctx - context for private data for the convergence routine (may be `NULL`) | ||
| 428 | - destroy - a routine for destroying the context (may be `NULL`), see `PetscCtxDestroyFn` | ||
| 429 | for the calling sequence | ||
| 430 | |||
| 431 | Notes: | ||
| 432 | When this is called with a user-defined function, then the convergence | ||
| 433 | criterion is set to `SVD_CONV_USER`, see `SVDSetConvergenceTest()`. | ||
| 434 | |||
| 435 | If the error estimate returned by the convergence test function is less than | ||
| 436 | the tolerance, then the singular value is accepted as converged. | ||
| 437 | |||
| 438 | Level: advanced | ||
| 439 | |||
| 440 | .seealso: [](ch:svd), `SVDSetConvergenceTest()`, `SVDSetTolerances()` | ||
| 441 | @*/ | ||
| 442 | 10 | PetscErrorCode SVDSetConvergenceTestFunction(SVD svd,SVDConvergenceTestFn *conv,PetscCtx ctx,PetscCtxDestroyFn *destroy) | |
| 443 | { | ||
| 444 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
10 | PetscFunctionBegin; |
| 445 |
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.
|
10 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 446 |
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 (svd->convergeddestroy) PetscCall((*svd->convergeddestroy)(&svd->convergedctx)); |
| 447 | 10 | svd->convergeduser = conv; | |
| 448 | 10 | svd->convergeddestroy = destroy; | |
| 449 | 10 | svd->convergedctx = ctx; | |
| 450 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
10 | if (conv == SVDConvergedAbsolute) svd->conv = SVD_CONV_ABS; |
| 451 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
10 | else if (conv == SVDConvergedRelative) svd->conv = SVD_CONV_REL; |
| 452 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
10 | else if (conv == SVDConvergedNorm) svd->conv = SVD_CONV_NORM; |
| 453 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
10 | else if (conv == SVDConvergedMaxIt) svd->conv = SVD_CONV_MAXIT; |
| 454 | else { | ||
| 455 | 10 | svd->conv = SVD_CONV_USER; | |
| 456 | 10 | svd->converged = svd->convergeduser; | |
| 457 | } | ||
| 458 |
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.
|
2 | PetscFunctionReturn(PETSC_SUCCESS); |
| 459 | } | ||
| 460 | |||
| 461 | /*@ | ||
| 462 | SVDSetConvergenceTest - Specifies how to compute the error estimate | ||
| 463 | used in the convergence test. | ||
| 464 | |||
| 465 | Logically Collective | ||
| 466 | |||
| 467 | Input Parameters: | ||
| 468 | + svd - the singular value solver context | ||
| 469 | - conv - the type of convergence test, see `SVDConv` for possible values | ||
| 470 | |||
| 471 | Options Database Keys: | ||
| 472 | + -svd_conv_abs - sets the absolute convergence test | ||
| 473 | . -svd_conv_rel - sets the convergence test relative to the singular value | ||
| 474 | . -svd_conv_norm - sets the convergence test relative to the matrix norms | ||
| 475 | . -svd_conv_maxit - forces the maximum number of iterations as set by `-svd_max_it` | ||
| 476 | - -svd_conv_user - selects the user-defined convergence test | ||
| 477 | |||
| 478 | Note: | ||
| 479 | The default in standard SVD is `SVD_CONV_REL`, while in GSVD the default is `SVD_CONV_NORM`. | ||
| 480 | |||
| 481 | Level: intermediate | ||
| 482 | |||
| 483 | .seealso: [](ch:svd), `SVDGetConvergenceTest()`, `SVDSetConvergenceTestFunction()`, `SVDSetStoppingTest()`, `SVDConv` | ||
| 484 | @*/ | ||
| 485 | 2276 | PetscErrorCode SVDSetConvergenceTest(SVD svd,SVDConv conv) | |
| 486 | { | ||
| 487 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2276 | PetscFunctionBegin; |
| 488 |
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.
|
2276 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 489 |
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.
|
2276 | PetscValidLogicalCollectiveEnum(svd,conv,2); |
| 490 |
4/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
2276 | switch (conv) { |
| 491 | 161 | case SVD_CONV_ABS: svd->converged = SVDConvergedAbsolute; break; | |
| 492 | 1236 | case SVD_CONV_REL: svd->converged = SVDConvergedRelative; break; | |
| 493 | 861 | case SVD_CONV_NORM: svd->converged = SVDConvergedNorm; break; | |
| 494 | 18 | case SVD_CONV_MAXIT: svd->converged = SVDConvergedMaxIt; break; | |
| 495 | ✗ | case SVD_CONV_USER: | |
| 496 | ✗ | PetscCheck(svd->convergeduser,PetscObjectComm((PetscObject)svd),PETSC_ERR_ORDER,"Must call SVDSetConvergenceTestFunction() first"); | |
| 497 | ✗ | svd->converged = svd->convergeduser; | |
| 498 | ✗ | break; | |
| 499 | ✗ | default: | |
| 500 | − | SETERRQ(PetscObjectComm((PetscObject)svd),PETSC_ERR_ARG_OUTOFRANGE,"Invalid 'conv' value"); | |
| 501 | } | ||
| 502 | 2276 | svd->conv = conv; | |
| 503 |
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.
|
2276 | PetscFunctionReturn(PETSC_SUCCESS); |
| 504 | } | ||
| 505 | |||
| 506 | /*@ | ||
| 507 | SVDGetConvergenceTest - Gets the method used to compute the error estimate | ||
| 508 | used in the convergence test. | ||
| 509 | |||
| 510 | Not Collective | ||
| 511 | |||
| 512 | Input Parameter: | ||
| 513 | . svd - the singular value solver context | ||
| 514 | |||
| 515 | Output Parameter: | ||
| 516 | . conv - the type of convergence test | ||
| 517 | |||
| 518 | Level: intermediate | ||
| 519 | |||
| 520 | .seealso: [](ch:svd), `SVDSetConvergenceTest()`, `SVDConv` | ||
| 521 | @*/ | ||
| 522 | 161 | PetscErrorCode SVDGetConvergenceTest(SVD svd,SVDConv *conv) | |
| 523 | { | ||
| 524 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
161 | PetscFunctionBegin; |
| 525 |
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.
|
161 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 526 |
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.
|
161 | PetscAssertPointer(conv,2); |
| 527 | 161 | *conv = svd->conv; | |
| 528 |
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.
|
161 | PetscFunctionReturn(PETSC_SUCCESS); |
| 529 | } | ||
| 530 | |||
| 531 | /*@C | ||
| 532 | SVDSetStoppingTestFunction - Sets a function to decide when to stop the outer | ||
| 533 | iteration of the singular value solver. | ||
| 534 | |||
| 535 | Logically Collective | ||
| 536 | |||
| 537 | Input Parameters: | ||
| 538 | + svd - the singular value solver context | ||
| 539 | . stop - the stopping test function, see `SVDStoppingTestFn` for the calling sequence | ||
| 540 | . ctx - context for private data for the stopping routine (may be `NULL`) | ||
| 541 | - destroy - a routine for destroying the context (may be `NULL`), see `PetscCtxDestroyFn` | ||
| 542 | for the calling sequence | ||
| 543 | |||
| 544 | Note: | ||
| 545 | When implementing a function for this, normal usage is to first call the | ||
| 546 | default routine `SVDStoppingBasic()` and then set `reason` to `SVD_CONVERGED_USER` | ||
| 547 | if some user-defined conditions have been met. To let the singular value solver | ||
| 548 | continue iterating, the result must be left as `SVD_CONVERGED_ITERATING`. | ||
| 549 | |||
| 550 | Level: advanced | ||
| 551 | |||
| 552 | .seealso: [](ch:svd), `SVDSetStoppingTest()`, `SVDStoppingBasic()` | ||
| 553 | @*/ | ||
| 554 | 95 | PetscErrorCode SVDSetStoppingTestFunction(SVD svd,SVDStoppingTestFn *stop,PetscCtx ctx,PetscCtxDestroyFn *destroy) | |
| 555 | { | ||
| 556 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
95 | PetscFunctionBegin; |
| 557 |
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.
|
95 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 558 |
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 | if (svd->stoppingdestroy) PetscCall((*svd->stoppingdestroy)(&svd->stoppingctx)); |
| 559 | 95 | svd->stoppinguser = stop; | |
| 560 | 95 | svd->stoppingdestroy = destroy; | |
| 561 | 95 | svd->stoppingctx = ctx; | |
| 562 |
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 | if (stop == SVDStoppingBasic) PetscCall(SVDSetStoppingTest(svd,SVD_STOP_BASIC)); |
| 563 |
6/8✓ Branch 0 taken 8 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
95 | else if (stop == SVDStoppingThreshold) PetscCall(SVDSetStoppingTest(svd,SVD_STOP_THRESHOLD)); |
| 564 | else { | ||
| 565 | 10 | svd->stop = SVD_STOP_USER; | |
| 566 | 10 | svd->stopping = svd->stoppinguser; | |
| 567 | } | ||
| 568 |
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.
|
23 | PetscFunctionReturn(PETSC_SUCCESS); |
| 569 | } | ||
| 570 | |||
| 571 | /*@ | ||
| 572 | SVDSetStoppingTest - Specifies how to decide the termination of the outer | ||
| 573 | loop of the singular value solver. | ||
| 574 | |||
| 575 | Logically Collective | ||
| 576 | |||
| 577 | Input Parameters: | ||
| 578 | + svd - the singular value solver context | ||
| 579 | - stop - the type of stopping test, see `SVDStop` | ||
| 580 | |||
| 581 | Options Database Keys: | ||
| 582 | + -svd_stop_basic - sets the default stopping test | ||
| 583 | . -svd_stop_threshold - sets the threshold stopping test | ||
| 584 | - -svd_stop_user - selects the user-defined stopping test | ||
| 585 | |||
| 586 | Level: advanced | ||
| 587 | |||
| 588 | .seealso: [](ch:svd), `SVDGetStoppingTest()`, `SVDSetStoppingTestFunction()`, `SVDSetConvergenceTest()`, `SVDStop` | ||
| 589 | @*/ | ||
| 590 | 331 | PetscErrorCode SVDSetStoppingTest(SVD svd,SVDStop stop) | |
| 591 | { | ||
| 592 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
331 | PetscFunctionBegin; |
| 593 |
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.
|
331 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 594 |
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.
|
331 | PetscValidLogicalCollectiveEnum(svd,stop,2); |
| 595 |
2/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
331 | switch (stop) { |
| 596 | 161 | case SVD_STOP_BASIC: svd->stopping = SVDStoppingBasic; break; | |
| 597 | 170 | case SVD_STOP_THRESHOLD: svd->stopping = SVDStoppingThreshold; break; | |
| 598 | ✗ | case SVD_STOP_USER: | |
| 599 | ✗ | PetscCheck(svd->stoppinguser,PetscObjectComm((PetscObject)svd),PETSC_ERR_ORDER,"Must call SVDSetStoppingTestFunction() first"); | |
| 600 | ✗ | svd->stopping = svd->stoppinguser; | |
| 601 | ✗ | break; | |
| 602 | ✗ | default: | |
| 603 | − | SETERRQ(PetscObjectComm((PetscObject)svd),PETSC_ERR_ARG_OUTOFRANGE,"Invalid 'stop' value"); | |
| 604 | } | ||
| 605 | 331 | svd->stop = stop; | |
| 606 |
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.
|
331 | PetscFunctionReturn(PETSC_SUCCESS); |
| 607 | } | ||
| 608 | |||
| 609 | /*@ | ||
| 610 | SVDGetStoppingTest - Gets the method used to decide the termination of the outer | ||
| 611 | loop of the singular value solver. | ||
| 612 | |||
| 613 | Not Collective | ||
| 614 | |||
| 615 | Input Parameter: | ||
| 616 | . svd - the singular value solver context | ||
| 617 | |||
| 618 | Output Parameter: | ||
| 619 | . stop - the type of stopping test | ||
| 620 | |||
| 621 | Level: advanced | ||
| 622 | |||
| 623 | .seealso: [](ch:svd), `SVDSetStoppingTest()`, `SVDStop` | ||
| 624 | @*/ | ||
| 625 | 278 | PetscErrorCode SVDGetStoppingTest(SVD svd,SVDStop *stop) | |
| 626 | { | ||
| 627 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
278 | PetscFunctionBegin; |
| 628 |
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.
|
278 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 629 |
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.
|
278 | PetscAssertPointer(stop,2); |
| 630 | 278 | *stop = svd->stop; | |
| 631 |
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.
|
278 | PetscFunctionReturn(PETSC_SUCCESS); |
| 632 | } | ||
| 633 | |||
| 634 | /*@C | ||
| 635 | SVDMonitorSetFromOptions - Sets a monitor function and viewer appropriate for the type | ||
| 636 | indicated by the user. | ||
| 637 | |||
| 638 | Collective | ||
| 639 | |||
| 640 | Input Parameters: | ||
| 641 | + svd - the singular value solver context | ||
| 642 | . opt - the command line option for this monitor | ||
| 643 | . name - the monitor type one is seeking | ||
| 644 | . ctx - an optional user context for the monitor, or `NULL` | ||
| 645 | - trackall - whether this monitor tracks all singular values or not | ||
| 646 | |||
| 647 | Level: developer | ||
| 648 | |||
| 649 | .seealso: [](ch:svd), `SVDMonitorSet()`, `SVDSetTrackAll()` | ||
| 650 | @*/ | ||
| 651 | 8856 | PetscErrorCode SVDMonitorSetFromOptions(SVD svd,const char opt[],const char name[],PetscCtx ctx,PetscBool trackall) | |
| 652 | { | ||
| 653 | 8856 | PetscErrorCode (*mfunc)(SVD,PetscInt,PetscInt,PetscReal*,PetscReal*,PetscInt,void*); | |
| 654 | 8856 | PetscErrorCode (*cfunc)(PetscViewer,PetscViewerFormat,void*,PetscViewerAndFormat**); | |
| 655 | 8856 | PetscErrorCode (*dfunc)(PetscViewerAndFormat**); | |
| 656 | 8856 | PetscViewerAndFormat *vf; | |
| 657 | 8856 | PetscViewer viewer; | |
| 658 | 8856 | PetscViewerFormat format; | |
| 659 | 8856 | PetscViewerType vtype; | |
| 660 | 8856 | char key[PETSC_MAX_PATH_LEN]; | |
| 661 | 8856 | PetscBool flg; | |
| 662 | |||
| 663 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
8856 | PetscFunctionBegin; |
| 664 |
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.
|
8856 | PetscCall(PetscOptionsCreateViewer(PetscObjectComm((PetscObject)svd),((PetscObject)svd)->options,((PetscObject)svd)->prefix,opt,&viewer,&format,&flg)); |
| 665 |
8/14✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 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.
|
8856 | if (!flg) PetscFunctionReturn(PETSC_SUCCESS); |
| 666 | |||
| 667 |
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(PetscViewerGetType(viewer,&vtype)); |
| 668 |
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(SlepcMonitorMakeKey_Internal(name,vtype,format,key)); |
| 669 |
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(PetscFunctionListFind(SVDMonitorList,key,&mfunc)); |
| 670 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
90 | PetscCheck(mfunc,PetscObjectComm((PetscObject)svd),PETSC_ERR_SUP,"Specified viewer and format not supported"); |
| 671 |
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(PetscFunctionListFind(SVDMonitorCreateList,key,&cfunc)); |
| 672 |
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(PetscFunctionListFind(SVDMonitorDestroyList,key,&dfunc)); |
| 673 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
90 | if (!cfunc) cfunc = PetscViewerAndFormatCreate_Internal; |
| 674 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
90 | if (!dfunc) dfunc = PetscViewerAndFormatDestroy; |
| 675 | |||
| 676 |
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((*cfunc)(viewer,format,ctx,&vf)); |
| 677 |
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(PetscViewerDestroy(&viewer)); |
| 678 |
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(SVDMonitorSet(svd,mfunc,vf,(PetscCtxDestroyFn*)dfunc)); |
| 679 |
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.
|
90 | if (trackall) PetscCall(SVDSetTrackAll(svd,PETSC_TRUE)); |
| 680 |
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.
|
18 | PetscFunctionReturn(PETSC_SUCCESS); |
| 681 | } | ||
| 682 | |||
| 683 | /*@ | ||
| 684 | SVDSetFromOptions - Sets `SVD` options from the options database. | ||
| 685 | This routine must be called before `SVDSetUp()` if the user is to be | ||
| 686 | allowed to configure the solver. | ||
| 687 | |||
| 688 | Collective | ||
| 689 | |||
| 690 | Input Parameter: | ||
| 691 | . svd - the singular value solver context | ||
| 692 | |||
| 693 | Note: | ||
| 694 | To see all options, run your program with the `-help` option. | ||
| 695 | |||
| 696 | Level: beginner | ||
| 697 | |||
| 698 | .seealso: [](ch:svd), `SVDSetOptionsPrefix()` | ||
| 699 | @*/ | ||
| 700 | 2214 | PetscErrorCode SVDSetFromOptions(SVD svd) | |
| 701 | { | ||
| 702 | 2214 | char type[256]; | |
| 703 | 2214 | PetscBool set,flg,val,flg1,flg2,flg3; | |
| 704 | 2214 | PetscInt i,j,k; | |
| 705 | 2214 | PetscReal r; | |
| 706 | |||
| 707 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2214 | PetscFunctionBegin; |
| 708 |
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.
|
2214 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 709 |
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.
|
2214 | PetscCall(SVDRegisterAll()); |
| 710 |
8/10✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 2 times.
|
6642 | PetscObjectOptionsBegin((PetscObject)svd); |
| 711 |
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.
|
2474 | PetscCall(PetscOptionsFList("-svd_type","SVD solver method","SVDSetType",SVDList,(char*)(((PetscObject)svd)->type_name?((PetscObject)svd)->type_name:SVDCROSS),type,sizeof(type),&flg)); |
| 712 |
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.
|
2214 | if (flg) PetscCall(SVDSetType(svd,type)); |
| 713 |
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.
|
305 | else if (!((PetscObject)svd)->type_name) PetscCall(SVDSetType(svd,SVDCROSS)); |
| 714 | |||
| 715 |
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.
|
2214 | PetscCall(PetscOptionsBoolGroupBegin("-svd_standard","Singular value decomposition (SVD)","SVDSetProblemType",&flg)); |
| 716 |
6/8✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
|
2214 | if (flg) PetscCall(SVDSetProblemType(svd,SVD_STANDARD)); |
| 717 |
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.
|
2214 | PetscCall(PetscOptionsBoolGroup("-svd_generalized","Generalized singular value decomposition (GSVD)","SVDSetProblemType",&flg)); |
| 718 |
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.
|
2214 | if (flg) PetscCall(SVDSetProblemType(svd,SVD_GENERALIZED)); |
| 719 |
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.
|
2214 | PetscCall(PetscOptionsBoolGroupEnd("-svd_hyperbolic","Hyperbolic singular value decomposition (HSVD)","SVDSetProblemType",&flg)); |
| 720 |
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.
|
2214 | if (flg) PetscCall(SVDSetProblemType(svd,SVD_HYPERBOLIC)); |
| 721 | |||
| 722 |
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.
|
2214 | PetscCall(PetscOptionsBool("-svd_implicittranspose","Handle matrix transpose implicitly","SVDSetImplicitTranspose",svd->impltrans,&val,&flg)); |
| 723 |
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.
|
2214 | if (flg) PetscCall(SVDSetImplicitTranspose(svd,val)); |
| 724 | |||
| 725 | 2214 | i = svd->max_it; | |
| 726 |
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.
|
2214 | PetscCall(PetscOptionsInt("-svd_max_it","Maximum number of iterations","SVDSetTolerances",svd->max_it,&i,&flg1)); |
| 727 | 2214 | r = svd->tol; | |
| 728 |
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.
|
4250 | PetscCall(PetscOptionsReal("-svd_tol","Tolerance","SVDSetTolerances",SlepcDefaultTol(svd->tol),&r,&flg2)); |
| 729 |
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.
|
2214 | if (flg1 || flg2) PetscCall(SVDSetTolerances(svd,r,i)); |
| 730 | |||
| 731 | 2214 | r = svd->thres; | |
| 732 |
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.
|
2214 | PetscCall(PetscOptionsReal("-svd_threshold_absolute","Absolute threshold","SVDSetThreshold",r,&r,&flg)); |
| 733 |
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.
|
2214 | if (flg) PetscCall(SVDSetThreshold(svd,r,PETSC_FALSE)); |
| 734 |
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.
|
2214 | PetscCall(PetscOptionsReal("-svd_threshold_relative","Relative threshold","SVDSetThreshold",r,&r,&flg)); |
| 735 |
6/8✓ Branch 0 taken 8 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
2214 | if (flg) PetscCall(SVDSetThreshold(svd,r,PETSC_TRUE)); |
| 736 | |||
| 737 |
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.
|
2214 | PetscCall(PetscOptionsBoolGroupBegin("-svd_conv_abs","Absolute error convergence test","SVDSetConvergenceTest",&flg)); |
| 738 |
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.
|
2214 | if (flg) PetscCall(SVDSetConvergenceTest(svd,SVD_CONV_ABS)); |
| 739 |
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.
|
2214 | PetscCall(PetscOptionsBoolGroup("-svd_conv_rel","Relative error convergence test","SVDSetConvergenceTest",&flg)); |
| 740 |
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.
|
2214 | if (flg) PetscCall(SVDSetConvergenceTest(svd,SVD_CONV_REL)); |
| 741 |
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.
|
2214 | PetscCall(PetscOptionsBoolGroup("-svd_conv_norm","Convergence test relative to the matrix norms","SVDSetConvergenceTest",&flg)); |
| 742 |
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.
|
2214 | if (flg) PetscCall(SVDSetConvergenceTest(svd,SVD_CONV_NORM)); |
| 743 |
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.
|
2214 | PetscCall(PetscOptionsBoolGroup("-svd_conv_maxit","Maximum iterations convergence test","SVDSetConvergenceTest",&flg)); |
| 744 |
6/8✓ Branch 0 taken 8 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
2214 | if (flg) PetscCall(SVDSetConvergenceTest(svd,SVD_CONV_MAXIT)); |
| 745 |
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.
|
2214 | PetscCall(PetscOptionsBoolGroupEnd("-svd_conv_user","User-defined convergence test","SVDSetConvergenceTest",&flg)); |
| 746 |
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.
|
2214 | if (flg) PetscCall(SVDSetConvergenceTest(svd,SVD_CONV_USER)); |
| 747 | |||
| 748 |
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.
|
2214 | PetscCall(PetscOptionsBoolGroupBegin("-svd_stop_basic","Stop iteration if all singular values converged or max_it reached","SVDSetStoppingTest",&flg)); |
| 749 |
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.
|
2214 | if (flg) PetscCall(SVDSetStoppingTest(svd,SVD_STOP_BASIC)); |
| 750 |
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.
|
2214 | PetscCall(PetscOptionsBoolGroup("-svd_stop_threshold","Stop iteration if a converged singular value is below/above the threshold","SVDSetStoppingTest",&flg)); |
| 751 |
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.
|
2214 | if (flg) PetscCall(SVDSetStoppingTest(svd,SVD_STOP_THRESHOLD)); |
| 752 |
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.
|
2214 | PetscCall(PetscOptionsBoolGroupEnd("-svd_stop_user","User-defined stopping test","SVDSetStoppingTest",&flg)); |
| 753 |
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.
|
2214 | if (flg) PetscCall(SVDSetStoppingTest(svd,SVD_STOP_USER)); |
| 754 | |||
| 755 | 2214 | i = svd->nsv; | |
| 756 |
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.
|
2214 | PetscCall(PetscOptionsInt("-svd_nsv","Number of singular values to compute","SVDSetDimensions",svd->nsv,&i,&flg1)); |
| 757 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2214 | if (!flg1) i = PETSC_CURRENT; |
| 758 | 2214 | j = svd->ncv; | |
| 759 |
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.
|
2214 | PetscCall(PetscOptionsInt("-svd_ncv","Number of basis vectors","SVDSetDimensions",svd->ncv,&j,&flg2)); |
| 760 | 2214 | k = svd->mpd; | |
| 761 |
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.
|
2214 | PetscCall(PetscOptionsInt("-svd_mpd","Maximum dimension of projected problem","SVDSetDimensions",svd->mpd,&k,&flg3)); |
| 762 |
9/12✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
2214 | if (flg1 || flg2 || flg3) PetscCall(SVDSetDimensions(svd,i,j,k)); |
| 763 | |||
| 764 |
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.
|
2214 | PetscCall(PetscOptionsBoolGroupBegin("-svd_largest","Compute largest singular values","SVDSetWhichSingularTriplets",&flg)); |
| 765 |
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.
|
2214 | if (flg) PetscCall(SVDSetWhichSingularTriplets(svd,SVD_LARGEST)); |
| 766 |
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.
|
2214 | PetscCall(PetscOptionsBoolGroupEnd("-svd_smallest","Compute smallest singular values","SVDSetWhichSingularTriplets",&flg)); |
| 767 |
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.
|
2214 | if (flg) PetscCall(SVDSetWhichSingularTriplets(svd,SVD_SMALLEST)); |
| 768 | |||
| 769 | /* -----------------------------------------------------------------------*/ | ||
| 770 | /* | ||
| 771 | Cancels all monitors hardwired into code before call to SVDSetFromOptions() | ||
| 772 | */ | ||
| 773 |
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.
|
2214 | PetscCall(PetscOptionsBool("-svd_monitor_cancel","Remove any hardwired monitor routines","SVDMonitorCancel",PETSC_FALSE,&flg,&set)); |
| 774 |
7/10✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ 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.
|
2214 | if (set && flg) PetscCall(SVDMonitorCancel(svd)); |
| 775 |
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.
|
2214 | PetscCall(SVDMonitorSetFromOptions(svd,"-svd_monitor","first_approximation",NULL,PETSC_FALSE)); |
| 776 |
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.
|
2214 | PetscCall(SVDMonitorSetFromOptions(svd,"-svd_monitor_all","all_approximations",NULL,PETSC_TRUE)); |
| 777 |
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.
|
2214 | PetscCall(SVDMonitorSetFromOptions(svd,"-svd_monitor_conv","convergence_history",NULL,PETSC_FALSE)); |
| 778 |
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.
|
2214 | PetscCall(SVDMonitorSetFromOptions(svd,"-svd_monitor_conditioning","conditioning",NULL,PETSC_FALSE)); |
| 779 | |||
| 780 | /* -----------------------------------------------------------------------*/ | ||
| 781 |
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.
|
2214 | PetscCall(PetscOptionsName("-svd_view","Print detailed information on solver used","SVDView",&set)); |
| 782 |
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.
|
2214 | PetscCall(PetscOptionsName("-svd_view_vectors","View computed singular vectors","SVDVectorsView",&set)); |
| 783 |
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.
|
2214 | PetscCall(PetscOptionsName("-svd_view_values","View computed singular values","SVDValuesView",&set)); |
| 784 |
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.
|
2214 | PetscCall(PetscOptionsName("-svd_converged_reason","Print reason for convergence, and number of iterations","SVDConvergedReasonView",&set)); |
| 785 |
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.
|
2214 | PetscCall(PetscOptionsName("-svd_error_absolute","Print absolute errors of each singular triplet","SVDErrorView",&set)); |
| 786 |
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.
|
2214 | PetscCall(PetscOptionsName("-svd_error_relative","Print relative errors of each singular triplet","SVDErrorView",&set)); |
| 787 |
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.
|
2214 | PetscCall(PetscOptionsName("-svd_error_norm","Print errors relative to the matrix norms of each singular triplet","SVDErrorView",&set)); |
| 788 | |||
| 789 |
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.
|
2214 | PetscTryTypeMethod(svd,setfromoptions,PetscOptionsObject); |
| 790 |
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.
|
2214 | PetscCall(PetscObjectProcessOptionsHandlers((PetscObject)svd,PetscOptionsObject)); |
| 791 |
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.
|
2214 | PetscOptionsEnd(); |
| 792 | |||
| 793 |
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.
|
2214 | if (!svd->V) PetscCall(SVDGetBV(svd,&svd->V,NULL)); |
| 794 |
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.
|
2214 | PetscCall(BVSetFromOptions(svd->V)); |
| 795 |
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.
|
2214 | if (!svd->U) PetscCall(SVDGetBV(svd,NULL,&svd->U)); |
| 796 |
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.
|
2214 | PetscCall(BVSetFromOptions(svd->U)); |
| 797 |
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.
|
2214 | if (!svd->ds) PetscCall(SVDGetDS(svd,&svd->ds)); |
| 798 |
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.
|
2214 | PetscCall(SVDSetDSType(svd)); |
| 799 |
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.
|
2214 | PetscCall(DSSetFromOptions(svd->ds)); |
| 800 |
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.
|
436 | PetscFunctionReturn(PETSC_SUCCESS); |
| 801 | } | ||
| 802 | |||
| 803 | /*@ | ||
| 804 | SVDSetProblemType - Specifies the type of the singular value problem. | ||
| 805 | |||
| 806 | Logically Collective | ||
| 807 | |||
| 808 | Input Parameters: | ||
| 809 | + svd - the singular value solver context | ||
| 810 | - type - a known type of singular value problem | ||
| 811 | |||
| 812 | Options Database Keys: | ||
| 813 | + -svd_standard - standard singular value decomposition (SVD) | ||
| 814 | . -svd_generalized - generalized singular value problem (GSVD) | ||
| 815 | - -svd_hyperbolic - hyperbolic singular value problem (HSVD) | ||
| 816 | |||
| 817 | Note: | ||
| 818 | The GSVD requires that two matrices have been passed via `SVDSetOperators()`. | ||
| 819 | The HSVD requires that a signature matrix has been passed via `SVDSetSignature()`. | ||
| 820 | |||
| 821 | Level: intermediate | ||
| 822 | |||
| 823 | .seealso: [](ch:svd), `SVDSetOperators()`, `SVDSetSignature()`, `SVDSetType()`, `SVDGetProblemType()`, `SVDProblemType` | ||
| 824 | @*/ | ||
| 825 | 2276 | PetscErrorCode SVDSetProblemType(SVD svd,SVDProblemType type) | |
| 826 | { | ||
| 827 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2276 | PetscFunctionBegin; |
| 828 |
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.
|
2276 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 829 |
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.
|
2276 | PetscValidLogicalCollectiveEnum(svd,type,2); |
| 830 |
2/14✓ Branch 0 taken 8 times.
✓ 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.
|
2276 | if (type == svd->problem_type) PetscFunctionReturn(PETSC_SUCCESS); |
| 831 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
|
2276 | switch (type) { |
| 832 | 1163 | case SVD_STANDARD: | |
| 833 | 1163 | svd->isgeneralized = PETSC_FALSE; | |
| 834 | 1163 | svd->ishyperbolic = PETSC_FALSE; | |
| 835 | 1163 | break; | |
| 836 | 851 | case SVD_GENERALIZED: | |
| 837 | 851 | svd->isgeneralized = PETSC_TRUE; | |
| 838 | 851 | svd->ishyperbolic = PETSC_FALSE; | |
| 839 | 851 | break; | |
| 840 | 262 | case SVD_HYPERBOLIC: | |
| 841 | 262 | svd->isgeneralized = PETSC_FALSE; | |
| 842 | 262 | svd->ishyperbolic = PETSC_TRUE; | |
| 843 | 262 | break; | |
| 844 | ✗ | default: | |
| 845 | − | SETERRQ(PetscObjectComm((PetscObject)svd),PETSC_ERR_ARG_WRONG,"Unknown singular value problem type"); | |
| 846 | } | ||
| 847 | 2276 | svd->problem_type = type; | |
| 848 | 2276 | svd->state = SVD_STATE_INITIAL; | |
| 849 |
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.
|
2276 | PetscFunctionReturn(PETSC_SUCCESS); |
| 850 | } | ||
| 851 | |||
| 852 | /*@ | ||
| 853 | SVDGetProblemType - Gets the problem type from the SVD object. | ||
| 854 | |||
| 855 | Not Collective | ||
| 856 | |||
| 857 | Input Parameter: | ||
| 858 | . svd - the singular value solver context | ||
| 859 | |||
| 860 | Output Parameter: | ||
| 861 | . type - the problem type | ||
| 862 | |||
| 863 | Level: intermediate | ||
| 864 | |||
| 865 | .seealso: [](ch:svd), `SVDSetProblemType()`, `SVDProblemType` | ||
| 866 | @*/ | ||
| 867 | 161 | PetscErrorCode SVDGetProblemType(SVD svd,SVDProblemType *type) | |
| 868 | { | ||
| 869 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
161 | PetscFunctionBegin; |
| 870 |
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.
|
161 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 871 |
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.
|
161 | PetscAssertPointer(type,2); |
| 872 | 161 | *type = svd->problem_type; | |
| 873 |
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.
|
161 | PetscFunctionReturn(PETSC_SUCCESS); |
| 874 | } | ||
| 875 | |||
| 876 | /*@ | ||
| 877 | SVDIsGeneralized - Ask if the SVD object corresponds to a generalized | ||
| 878 | singular value problem. | ||
| 879 | |||
| 880 | Not Collective | ||
| 881 | |||
| 882 | Input Parameter: | ||
| 883 | . svd - the singular value solver context | ||
| 884 | |||
| 885 | Output Parameter: | ||
| 886 | . is - the answer | ||
| 887 | |||
| 888 | Level: intermediate | ||
| 889 | |||
| 890 | .seealso: [](ch:svd), `SVDIsHyperbolic()` | ||
| 891 | @*/ | ||
| 892 | 161 | PetscErrorCode SVDIsGeneralized(SVD svd,PetscBool* is) | |
| 893 | { | ||
| 894 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
161 | PetscFunctionBegin; |
| 895 |
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.
|
161 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 896 |
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.
|
161 | PetscAssertPointer(is,2); |
| 897 | 161 | *is = svd->isgeneralized; | |
| 898 |
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.
|
161 | PetscFunctionReturn(PETSC_SUCCESS); |
| 899 | } | ||
| 900 | |||
| 901 | /*@ | ||
| 902 | SVDIsHyperbolic - Ask if the SVD object corresponds to a hyperbolic | ||
| 903 | singular value problem. | ||
| 904 | |||
| 905 | Not Collective | ||
| 906 | |||
| 907 | Input Parameter: | ||
| 908 | . svd - the singular value solver context | ||
| 909 | |||
| 910 | Output Parameter: | ||
| 911 | . is - the answer | ||
| 912 | |||
| 913 | Level: intermediate | ||
| 914 | |||
| 915 | .seealso: [](ch:svd), `SVDIsGeneralized()` | ||
| 916 | @*/ | ||
| 917 | 132 | PetscErrorCode SVDIsHyperbolic(SVD svd,PetscBool* is) | |
| 918 | { | ||
| 919 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
132 | PetscFunctionBegin; |
| 920 |
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.
|
132 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 921 |
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.
|
132 | PetscAssertPointer(is,2); |
| 922 | 132 | *is = svd->ishyperbolic; | |
| 923 |
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.
|
132 | PetscFunctionReturn(PETSC_SUCCESS); |
| 924 | } | ||
| 925 | |||
| 926 | /*@ | ||
| 927 | SVDSetTrackAll - Specifies if the solver must compute the residual norm of all | ||
| 928 | approximate singular value or not. | ||
| 929 | |||
| 930 | Logically Collective | ||
| 931 | |||
| 932 | Input Parameters: | ||
| 933 | + svd - the singular value solver context | ||
| 934 | - trackall - whether to compute all residuals or not | ||
| 935 | |||
| 936 | Notes: | ||
| 937 | If the user sets `trackall`=`PETSC_TRUE` then the solver computes (or estimates) | ||
| 938 | the residual norm for each singular value approximation. Computing the residual is | ||
| 939 | usually an expensive operation and solvers commonly compute only the residual | ||
| 940 | associated to the first unconverged singular value. | ||
| 941 | |||
| 942 | The option `-svd_monitor_all` automatically activates this option. | ||
| 943 | |||
| 944 | Level: developer | ||
| 945 | |||
| 946 | .seealso: [](ch:svd), `SVDGetTrackAll()` | ||
| 947 | @*/ | ||
| 948 | 30 | PetscErrorCode SVDSetTrackAll(SVD svd,PetscBool trackall) | |
| 949 | { | ||
| 950 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
30 | PetscFunctionBegin; |
| 951 |
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.
|
30 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 952 |
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.
|
30 | PetscValidLogicalCollectiveBool(svd,trackall,2); |
| 953 | 30 | svd->trackall = trackall; | |
| 954 |
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.
|
30 | PetscFunctionReturn(PETSC_SUCCESS); |
| 955 | } | ||
| 956 | |||
| 957 | /*@ | ||
| 958 | SVDGetTrackAll - Returns the flag indicating whether all residual norms must | ||
| 959 | be computed or not. | ||
| 960 | |||
| 961 | Not Collective | ||
| 962 | |||
| 963 | Input Parameter: | ||
| 964 | . svd - the singular value solver context | ||
| 965 | |||
| 966 | Output Parameter: | ||
| 967 | . trackall - the returned flag | ||
| 968 | |||
| 969 | Level: developer | ||
| 970 | |||
| 971 | .seealso: [](ch:svd), `SVDSetTrackAll()` | ||
| 972 | @*/ | ||
| 973 | 1044 | PetscErrorCode SVDGetTrackAll(SVD svd,PetscBool *trackall) | |
| 974 | { | ||
| 975 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1044 | PetscFunctionBegin; |
| 976 |
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.
|
1044 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 977 |
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.
|
1044 | PetscAssertPointer(trackall,2); |
| 978 | 1044 | *trackall = svd->trackall; | |
| 979 |
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.
|
1044 | PetscFunctionReturn(PETSC_SUCCESS); |
| 980 | } | ||
| 981 | |||
| 982 | /*@ | ||
| 983 | SVDSetOptionsPrefix - Sets the prefix used for searching for all | ||
| 984 | `SVD` options in the database. | ||
| 985 | |||
| 986 | Logically Collective | ||
| 987 | |||
| 988 | Input Parameters: | ||
| 989 | + svd - the singular value solver context | ||
| 990 | - prefix - the prefix string to prepend to all `SVD` option requests | ||
| 991 | |||
| 992 | Notes: | ||
| 993 | A hyphen (-) must NOT be given at the beginning of the prefix name. | ||
| 994 | The first character of all runtime options is AUTOMATICALLY the | ||
| 995 | hyphen. | ||
| 996 | |||
| 997 | For example, to distinguish between the runtime options for two | ||
| 998 | different `SVD` contexts, one could call | ||
| 999 | .vb | ||
| 1000 | SVDSetOptionsPrefix(svd1,"svd1_") | ||
| 1001 | SVDSetOptionsPrefix(svd2,"svd2_") | ||
| 1002 | .ve | ||
| 1003 | |||
| 1004 | Level: advanced | ||
| 1005 | |||
| 1006 | .seealso: [](ch:svd), `SVDAppendOptionsPrefix()`, `SVDGetOptionsPrefix()` | ||
| 1007 | @*/ | ||
| 1008 | 44 | PetscErrorCode SVDSetOptionsPrefix(SVD svd,const char prefix[]) | |
| 1009 | { | ||
| 1010 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
44 | PetscFunctionBegin; |
| 1011 |
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.
|
44 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 1012 |
3/8✓ Branch 0 taken 2 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
44 | if (!svd->V) PetscCall(SVDGetBV(svd,&svd->V,&svd->U)); |
| 1013 |
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.
|
44 | PetscCall(BVSetOptionsPrefix(svd->V,prefix)); |
| 1014 |
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.
|
44 | PetscCall(BVSetOptionsPrefix(svd->U,prefix)); |
| 1015 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 2 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.
|
44 | if (!svd->ds) PetscCall(SVDGetDS(svd,&svd->ds)); |
| 1016 |
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.
|
44 | PetscCall(DSSetOptionsPrefix(svd->ds,prefix)); |
| 1017 |
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.
|
44 | PetscCall(PetscObjectSetOptionsPrefix((PetscObject)svd,prefix)); |
| 1018 |
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); |
| 1019 | } | ||
| 1020 | |||
| 1021 | /*@ | ||
| 1022 | SVDAppendOptionsPrefix - Appends to the prefix used for searching for all | ||
| 1023 | `SVD` options in the database. | ||
| 1024 | |||
| 1025 | Logically Collective | ||
| 1026 | |||
| 1027 | Input Parameters: | ||
| 1028 | + svd - the singular value solver context | ||
| 1029 | - prefix - the prefix string to prepend to all `SVD` option requests | ||
| 1030 | |||
| 1031 | Notes: | ||
| 1032 | A hyphen (-) must NOT be given at the beginning of the prefix name. | ||
| 1033 | The first character of all runtime options is AUTOMATICALLY the hyphen. | ||
| 1034 | |||
| 1035 | Level: advanced | ||
| 1036 | |||
| 1037 | .seealso: [](ch:svd), `SVDSetOptionsPrefix()`, `SVDGetOptionsPrefix()` | ||
| 1038 | @*/ | ||
| 1039 | 30 | PetscErrorCode SVDAppendOptionsPrefix(SVD svd,const char prefix[]) | |
| 1040 | { | ||
| 1041 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
30 | PetscFunctionBegin; |
| 1042 |
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.
|
30 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 1043 |
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.
|
30 | if (!svd->V) PetscCall(SVDGetBV(svd,&svd->V,&svd->U)); |
| 1044 |
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(BVAppendOptionsPrefix(svd->V,prefix)); |
| 1045 |
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(BVAppendOptionsPrefix(svd->U,prefix)); |
| 1046 |
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.
|
30 | if (!svd->ds) PetscCall(SVDGetDS(svd,&svd->ds)); |
| 1047 |
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(DSAppendOptionsPrefix(svd->ds,prefix)); |
| 1048 |
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(PetscObjectAppendOptionsPrefix((PetscObject)svd,prefix)); |
| 1049 |
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); |
| 1050 | } | ||
| 1051 | |||
| 1052 | /*@ | ||
| 1053 | SVDGetOptionsPrefix - Gets the prefix used for searching for all | ||
| 1054 | `SVD` options in the database. | ||
| 1055 | |||
| 1056 | Not Collective | ||
| 1057 | |||
| 1058 | Input Parameter: | ||
| 1059 | . svd - the singular value solver context | ||
| 1060 | |||
| 1061 | Output Parameter: | ||
| 1062 | . prefix - pointer to the prefix string used is returned | ||
| 1063 | |||
| 1064 | Level: advanced | ||
| 1065 | |||
| 1066 | .seealso: [](ch:svd), `SVDSetOptionsPrefix()`, `SVDAppendOptionsPrefix()` | ||
| 1067 | @*/ | ||
| 1068 | 51 | PetscErrorCode SVDGetOptionsPrefix(SVD svd,const char *prefix[]) | |
| 1069 | { | ||
| 1070 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
51 | PetscFunctionBegin; |
| 1071 |
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.
|
51 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 1072 |
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.
|
51 | PetscAssertPointer(prefix,2); |
| 1073 |
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.
|
51 | PetscCall(PetscObjectGetOptionsPrefix((PetscObject)svd,prefix)); |
| 1074 |
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); |
| 1075 | } | ||
| 1076 |