| 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 | Simple default routines for common SVD operations | ||
| 12 | */ | ||
| 13 | |||
| 14 | #include <slepc/private/svdimpl.h> /*I "slepcsvd.h" I*/ | ||
| 15 | |||
| 16 | /* | ||
| 17 | SVDConvergedAbsolute - Checks convergence absolutely. | ||
| 18 | */ | ||
| 19 | 12030 | PetscErrorCode SVDConvergedAbsolute(SVD svd,PetscReal sigma,PetscReal res,PetscReal *errest,void *ctx) | |
| 20 | { | ||
| 21 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
12030 | PetscFunctionBegin; |
| 22 | 12030 | *errest = res; | |
| 23 |
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.
|
12030 | PetscFunctionReturn(PETSC_SUCCESS); |
| 24 | } | ||
| 25 | |||
| 26 | /* | ||
| 27 | SVDConvergedRelative - Checks convergence relative to the singular value. | ||
| 28 | */ | ||
| 29 | 29251 | PetscErrorCode SVDConvergedRelative(SVD svd,PetscReal sigma,PetscReal res,PetscReal *errest,void *ctx) | |
| 30 | { | ||
| 31 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
29251 | PetscFunctionBegin; |
| 32 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
|
29251 | *errest = (sigma!=0.0)? res/sigma: PETSC_MAX_REAL; |
| 33 |
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.
|
29251 | PetscFunctionReturn(PETSC_SUCCESS); |
| 34 | } | ||
| 35 | |||
| 36 | /* | ||
| 37 | SVDConvergedNorm - Checks convergence relative to the matrix norms. | ||
| 38 | */ | ||
| 39 | 200 | PetscErrorCode SVDConvergedNorm(SVD svd,PetscReal sigma,PetscReal res,PetscReal *errest,void *ctx) | |
| 40 | { | ||
| 41 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
200 | PetscFunctionBegin; |
| 42 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
200 | *errest = res/PetscMax(svd->nrma,svd->nrmb); |
| 43 |
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.
|
200 | PetscFunctionReturn(PETSC_SUCCESS); |
| 44 | } | ||
| 45 | |||
| 46 | /* | ||
| 47 | SVDConvergedMaxIt - Always returns Inf to force reaching the maximum number of iterations. | ||
| 48 | */ | ||
| 49 | 18 | PetscErrorCode SVDConvergedMaxIt(SVD svd,PetscReal sigma,PetscReal res,PetscReal *errest,void *ctx) | |
| 50 | { | ||
| 51 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
18 | PetscFunctionBegin; |
| 52 | 18 | *errest = PETSC_MAX_REAL; | |
| 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.
|
18 | PetscFunctionReturn(PETSC_SUCCESS); |
| 54 | } | ||
| 55 | |||
| 56 | /*@C | ||
| 57 | SVDStoppingBasic - Default routine to determine whether the outer singular value | ||
| 58 | solver iteration must be stopped. | ||
| 59 | |||
| 60 | Collective | ||
| 61 | |||
| 62 | Input Parameters: | ||
| 63 | + svd - the singular value solver context | ||
| 64 | . its - current number of iterations | ||
| 65 | . max_it - maximum number of iterations | ||
| 66 | . nconv - number of currently converged singular triplets | ||
| 67 | . nsv - number of requested singular triplets | ||
| 68 | - ctx - context (not used here) | ||
| 69 | |||
| 70 | Output Parameter: | ||
| 71 | . reason - result of the stopping test | ||
| 72 | |||
| 73 | Notes: | ||
| 74 | `SVDStoppingBasic()` will stop if all requested singular values are converged, or if | ||
| 75 | the maximum number of iterations has been reached. | ||
| 76 | |||
| 77 | This is the default stopping test. | ||
| 78 | Use `SVDSetStoppingTest()` to provide your own test instead of using this one. | ||
| 79 | |||
| 80 | Level: advanced | ||
| 81 | |||
| 82 | .seealso: [](ch:svd), `SVDSetStoppingTest()`, `SVDStoppingThreshold()`, `SVDConvergedReason`, `SVDGetConvergedReason()` | ||
| 83 | @*/ | ||
| 84 | 27142 | PetscErrorCode SVDStoppingBasic(SVD svd,PetscInt its,PetscInt max_it,PetscInt nconv,PetscInt nsv,SVDConvergedReason *reason,void *ctx) | |
| 85 | { | ||
| 86 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
27142 | PetscFunctionBegin; |
| 87 | 27142 | *reason = SVD_CONVERGED_ITERATING; | |
| 88 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
27142 | if (nconv >= nsv && svd->conv != SVD_CONV_MAXIT) { |
| 89 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1310 | PetscCall(PetscInfo(svd,"Singular value solver finished successfully: %" PetscInt_FMT " singular triplets converged at iteration %" PetscInt_FMT "\n",nconv,its)); |
| 90 | 1310 | *reason = SVD_CONVERGED_TOL; | |
| 91 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
25832 | } else if (its >= max_it) { |
| 92 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
18 | if (svd->conv == SVD_CONV_MAXIT) *reason = SVD_CONVERGED_MAXIT; |
| 93 | else { | ||
| 94 | ✗ | *reason = SVD_DIVERGED_ITS; | |
| 95 | ✗ | PetscCall(PetscInfo(svd,"Singular value solver iteration reached maximum number of iterations (%" PetscInt_FMT ")\n",its)); | |
| 96 | } | ||
| 97 | } | ||
| 98 |
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.
|
4579 | PetscFunctionReturn(PETSC_SUCCESS); |
| 99 | } | ||
| 100 | |||
| 101 | /*@C | ||
| 102 | SVDStoppingThreshold - Routine to determine whether the outer singular value | ||
| 103 | solver iteration must be stopped, according to some threshold for the computed values. | ||
| 104 | |||
| 105 | Collective | ||
| 106 | |||
| 107 | Input Parameters: | ||
| 108 | + svd - the singular value solver context | ||
| 109 | . its - current number of iterations | ||
| 110 | . max_it - maximum number of iterations | ||
| 111 | . nconv - number of currently converged singular triplets (ignored here) | ||
| 112 | . nsv - number of requested singular triplets (ignored here) | ||
| 113 | - ctx - context containing additional data (`SVDStoppingCtx`) | ||
| 114 | |||
| 115 | Output Parameter: | ||
| 116 | . reason - result of the stopping test | ||
| 117 | |||
| 118 | Notes: | ||
| 119 | `SVDStoppingThreshold()` will stop when one of the computed singular values is not | ||
| 120 | above/below the threshold given at `SVDSetThreshold()`. If a number of wanted singular | ||
| 121 | values has been specified via `SVDSetDimensions()` then it is also taken into account, | ||
| 122 | and the solver will stop when one of the two conditions (threshold or number of | ||
| 123 | converged values) is met. | ||
| 124 | |||
| 125 | Use `SVDSetStoppingTest()` to provide your own test instead of using this one. | ||
| 126 | |||
| 127 | Level: advanced | ||
| 128 | |||
| 129 | .seealso: [](ch:svd), `SVDSetStoppingTest()`, `SVDStoppingBasic()`, `SVDSetThreshold()`, `SVDSetDimensions()`, `SVDConvergedReason`, `SVDGetConvergedReason()` | ||
| 130 | @*/ | ||
| 131 | 1610 | PetscErrorCode SVDStoppingThreshold(SVD svd,PetscInt its,PetscInt max_it,PetscInt nconv,PetscInt nsv,SVDConvergedReason *reason,void *ctx) | |
| 132 | { | ||
| 133 | 1610 | PetscReal thres,firstsv,lastsv; | |
| 134 | 1610 | PetscBool rel; | |
| 135 | 1610 | SVDWhich which; | |
| 136 | |||
| 137 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1610 | PetscFunctionBegin; |
| 138 | 1610 | *reason = SVD_CONVERGED_ITERATING; | |
| 139 | 1610 | firstsv = ((SVDStoppingCtx)ctx)->firstsv; | |
| 140 | 1610 | lastsv = ((SVDStoppingCtx)ctx)->lastsv; | |
| 141 | 1610 | thres = ((SVDStoppingCtx)ctx)->thres; | |
| 142 | 1610 | rel = ((SVDStoppingCtx)ctx)->threlative; | |
| 143 | 1610 | which = ((SVDStoppingCtx)ctx)->which; | |
| 144 |
11/16✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 6 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 6 times.
✓ Branch 9 taken 8 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 6 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
1610 | if (nconv && ((which==SVD_LARGEST && ((rel && lastsv<thres*firstsv) || (!rel && lastsv<thres))) || (which==SVD_SMALLEST && lastsv>thres))) { |
| 145 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 8 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.
|
64 | if (which==SVD_SMALLEST) PetscCall(PetscInfo(svd,"Singular value solver finished successfully: singular value %g is above the threshold %g\n",(double)lastsv,(double)thres)); |
| 146 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 8 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.
|
64 | else if (!rel) PetscCall(PetscInfo(svd,"Singular value solver finished successfully: singular value %g is below the threshold %g\n",(double)lastsv,(double)thres)); |
| 147 |
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.
|
64 | else PetscCall(PetscInfo(svd,"Singular value solver finished successfully: the ratio %g/%g is below the threshold %g\n",(double)lastsv,(double)firstsv,(double)thres)); |
| 148 | 64 | *reason = SVD_CONVERGED_TOL; | |
| 149 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
|
1546 | } else if (nsv && nconv >= nsv) { |
| 150 | ✗ | PetscCall(PetscInfo(svd,"Singular value solver finished successfully: %" PetscInt_FMT " singular triplets converged at iteration %" PetscInt_FMT "\n",nconv,its)); | |
| 151 | ✗ | *reason = SVD_CONVERGED_TOL; | |
| 152 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
|
1546 | } else if (its >= max_it) { |
| 153 | ✗ | if (svd->conv == SVD_CONV_MAXIT) *reason = SVD_CONVERGED_MAXIT; | |
| 154 | else { | ||
| 155 | ✗ | *reason = SVD_DIVERGED_ITS; | |
| 156 | ✗ | PetscCall(PetscInfo(svd,"Singular value solver iteration reached maximum number of iterations (%" PetscInt_FMT ")\n",its)); | |
| 157 | } | ||
| 158 | } | ||
| 159 |
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.
|
332 | PetscFunctionReturn(PETSC_SUCCESS); |
| 160 | } | ||
| 161 | |||
| 162 | /*@ | ||
| 163 | SVDSetWorkVecs - Sets a number of work vectors into an `SVD` object. | ||
| 164 | |||
| 165 | Collective | ||
| 166 | |||
| 167 | Input Parameters: | ||
| 168 | + svd - the singular value solver context | ||
| 169 | . nleft - number of work vectors of dimension equal to left singular vector | ||
| 170 | - nright - number of work vectors of dimension equal to right singular vector | ||
| 171 | |||
| 172 | Developer Note: | ||
| 173 | This is `SLEPC_EXTERN` because it may be required by user plugin `SVD` | ||
| 174 | implementations. | ||
| 175 | |||
| 176 | Level: developer | ||
| 177 | |||
| 178 | .seealso: [](ch:svd), `SVDSetUp()` | ||
| 179 | @*/ | ||
| 180 | 15030 | PetscErrorCode SVDSetWorkVecs(SVD svd,PetscInt nleft,PetscInt nright) | |
| 181 | { | ||
| 182 | 15030 | Vec t; | |
| 183 | |||
| 184 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
15030 | PetscFunctionBegin; |
| 185 |
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.
|
15030 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 186 |
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.
|
15030 | PetscValidLogicalCollectiveInt(svd,nleft,2); |
| 187 |
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.
|
15030 | PetscValidLogicalCollectiveInt(svd,nright,3); |
| 188 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
15030 | PetscCheck(nleft>=0,PetscObjectComm((PetscObject)svd),PETSC_ERR_ARG_OUTOFRANGE,"nleft must be >= 0: nleft = %" PetscInt_FMT,nleft); |
| 189 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
15030 | PetscCheck(nright>=0,PetscObjectComm((PetscObject)svd),PETSC_ERR_ARG_OUTOFRANGE,"nright must be >= 0: nright = %" PetscInt_FMT,nright); |
| 190 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
15030 | PetscCheck(nleft>0 || nright>0,PetscObjectComm((PetscObject)svd),PETSC_ERR_ARG_OUTOFRANGE,"nleft and nright cannot be both zero"); |
| 191 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
15030 | if (svd->nworkl < nleft) { |
| 192 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2449 | PetscCall(VecDestroyVecs(svd->nworkl,&svd->workl)); |
| 193 | 2449 | svd->nworkl = nleft; | |
| 194 |
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.
|
2449 | if (svd->isgeneralized) PetscCall(SVDCreateLeftTemplate(svd,&t)); |
| 195 |
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.
|
1598 | else PetscCall(MatCreateVecsEmpty(svd->OP,NULL,&t)); |
| 196 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2449 | PetscCall(VecDuplicateVecs(t,nleft,&svd->workl)); |
| 197 |
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.
|
2449 | PetscCall(VecDestroy(&t)); |
| 198 | } | ||
| 199 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
15030 | if (svd->nworkr < nright) { |
| 200 |
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.
|
2892 | PetscCall(VecDestroyVecs(svd->nworkr,&svd->workr)); |
| 201 | 2892 | svd->nworkr = nright; | |
| 202 |
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.
|
2892 | PetscCall(MatCreateVecsEmpty(svd->OP,&t,NULL)); |
| 203 |
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.
|
2892 | PetscCall(VecDuplicateVecs(t,nright,&svd->workr)); |
| 204 |
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.
|
2892 | PetscCall(VecDestroy(&t)); |
| 205 | } | ||
| 206 |
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.
|
3184 | PetscFunctionReturn(PETSC_SUCCESS); |
| 207 | } | ||
| 208 |