| 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 | NEP routines related to the solution process | ||
| 12 | |||
| 13 | References: | ||
| 14 | |||
| 15 | [1] C. Campos and J.E. Roman, "NEP: a module for the parallel solution | ||
| 16 | of nonlinear eigenvalue problems in SLEPc", ACM Trans. Math. Soft. | ||
| 17 | 47(3), 23:1--23:29, 2021. | ||
| 18 | */ | ||
| 19 | |||
| 20 | #include <slepc/private/nepimpl.h> /*I "slepcnep.h" I*/ | ||
| 21 | #include <slepc/private/bvimpl.h> | ||
| 22 | #include <petscdraw.h> | ||
| 23 | |||
| 24 | static PetscBool cited = PETSC_FALSE; | ||
| 25 | static const char citation[] = | ||
| 26 | "@Article{slepc-nep,\n" | ||
| 27 | " author = \"C. Campos and J. E. Roman\",\n" | ||
| 28 | " title = \"{NEP}: a module for the parallel solution of nonlinear eigenvalue problems in {SLEPc}\",\n" | ||
| 29 | " journal = \"{ACM} Trans. Math. Software\",\n" | ||
| 30 | " volume = \"47\",\n" | ||
| 31 | " number = \"3\",\n" | ||
| 32 | " pages = \"23:1--23:29\",\n" | ||
| 33 | " year = \"2021\",\n" | ||
| 34 | " doi = \"10.1145/3447544\"\n" | ||
| 35 | "}\n"; | ||
| 36 | |||
| 37 | 6886 | PetscErrorCode NEPComputeVectors(NEP nep) | |
| 38 | { | ||
| 39 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
6886 | PetscFunctionBegin; |
| 40 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
6886 | NEPCheckSolved(nep,1); |
| 41 |
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.
|
6886 | if (nep->state==NEP_STATE_SOLVED) PetscTryTypeMethod(nep,computevectors); |
| 42 | 6886 | nep->state = NEP_STATE_EIGENVECTORS; | |
| 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.
|
6886 | PetscFunctionReturn(PETSC_SUCCESS); |
| 44 | } | ||
| 45 | |||
| 46 | /*@ | ||
| 47 | NEPSolve - Solves the nonlinear eigenproblem. | ||
| 48 | |||
| 49 | Collective | ||
| 50 | |||
| 51 | Input Parameter: | ||
| 52 | . nep - the nonlinear eigensolver context | ||
| 53 | |||
| 54 | Options Database Keys: | ||
| 55 | + -nep_view - print information about the solver once the solve is complete | ||
| 56 | . -nep_view_pre - print information about the solver before the solve starts | ||
| 57 | . -nep_view_matk - view the split form matrix $A_k$ (replace `k` by an integer from 0 to `nt`-1) | ||
| 58 | . -nep_view_fnk - view the split form function $f_k$ (replace `k` by an integer from 0 to `nt`-1) | ||
| 59 | . -nep_view_vectors - view the computed eigenvectors | ||
| 60 | . -nep_view_values - view the computed eigenvalues | ||
| 61 | . -nep_converged_reason - print reason for convergence/divergence, and number of iterations | ||
| 62 | . -nep_error_absolute - print absolute errors of each eigenpair | ||
| 63 | . -nep_error_relative - print relative errors of each eigenpair | ||
| 64 | - -nep_error_backward - print backward errors of each eigenpair | ||
| 65 | |||
| 66 | Notes: | ||
| 67 | `NEPSolve()` will return without generating an error regardless of whether | ||
| 68 | all requested solutions were computed or not. Call `NEPGetConverged()` to get the | ||
| 69 | actual number of computed solutions, and `NEPGetConvergedReason()` to determine if | ||
| 70 | the solver converged or failed and why. | ||
| 71 | |||
| 72 | All the command-line options listed above admit an optional argument specifying | ||
| 73 | the viewer type and options. For instance, use `-nep_view_vectors binary:myvecs.bin` | ||
| 74 | to save the eigenvectors to a binary file, `-nep_view_values draw` to draw the computed | ||
| 75 | eigenvalues graphically, or `-nep_error_relative :myerr.m:ascii_matlab` to save | ||
| 76 | the errors in a file that can be executed in Matlab. | ||
| 77 | See `PetscObjectViewFromOptions()` for more details. | ||
| 78 | |||
| 79 | Level: beginner | ||
| 80 | |||
| 81 | .seealso: [](ch:nep), `NEPCreate()`, `NEPSetUp()`, `NEPDestroy()`, `NEPSetTolerances()`, `NEPGetConverged()`, `NEPGetConvergedReason()` | ||
| 82 | @*/ | ||
| 83 | 1501 | PetscErrorCode NEPSolve(NEP nep) | |
| 84 | { | ||
| 85 | 1501 | PetscInt i; | |
| 86 | 1501 | char str[16]; | |
| 87 | |||
| 88 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1501 | PetscFunctionBegin; |
| 89 |
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.
|
1501 | PetscValidHeaderSpecific(nep,NEP_CLASSID,1); |
| 90 |
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.
|
1501 | if (nep->state>=NEP_STATE_SOLVED) PetscFunctionReturn(PETSC_SUCCESS); |
| 91 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1501 | PetscCall(PetscCitationsRegister(citation,&cited)); |
| 92 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1501 | PetscCall(PetscLogEventBegin(NEP_Solve,nep,0,0,0)); |
| 93 | |||
| 94 | /* call setup */ | ||
| 95 |
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.
|
1501 | PetscCall(NEPSetUp(nep)); |
| 96 | 1501 | nep->nconv = 0; | |
| 97 | 1501 | nep->its = 0; | |
| 98 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
65657 | for (i=0;i<nep->ncv;i++) { |
| 99 | 64156 | nep->eigr[i] = 0.0; | |
| 100 | 64156 | nep->eigi[i] = 0.0; | |
| 101 | 64156 | nep->errest[i] = 0.0; | |
| 102 | 64156 | nep->perm[i] = i; | |
| 103 | } | ||
| 104 |
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.
|
1501 | PetscCall(NEPViewFromOptions(nep,NULL,"-nep_view_pre")); |
| 105 |
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.
|
1501 | PetscCall(RGViewFromOptions(nep->rg,NULL,"-rg_view")); |
| 106 | |||
| 107 | /* call solver */ | ||
| 108 |
5/10✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ 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.
|
1501 | PetscUseTypeMethod(nep,solve); |
| 109 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
1501 | PetscCheck(nep->reason,PetscObjectComm((PetscObject)nep),PETSC_ERR_PLIB,"Internal error, solver returned without setting converged reason"); |
| 110 | 1501 | nep->state = NEP_STATE_SOLVED; | |
| 111 | |||
| 112 | /* Only the first nconv columns contain useful information */ | ||
| 113 |
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.
|
1501 | PetscCall(BVSetActiveColumns(nep->V,0,nep->nconv)); |
| 114 |
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.
|
1501 | if (nep->twosided) PetscCall(BVSetActiveColumns(nep->W,0,nep->nconv)); |
| 115 | |||
| 116 |
4/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
|
1501 | if (nep->refine==NEP_REFINE_SIMPLE && nep->rits>0 && nep->nconv>0) { |
| 117 |
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.
|
136 | PetscCall(NEPComputeVectors(nep)); |
| 118 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
136 | PetscCall(NEPNewtonRefinementSimple(nep,&nep->rits,nep->rtol,nep->nconv)); |
| 119 | 136 | nep->state = NEP_STATE_EIGENVECTORS; | |
| 120 | } | ||
| 121 | |||
| 122 | /* sort eigenvalues according to nep->which parameter */ | ||
| 123 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1501 | PetscCall(SlepcSortEigenvalues(nep->sc,nep->nconv,nep->eigr,nep->eigi,nep->perm)); |
| 124 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1501 | PetscCall(PetscLogEventEnd(NEP_Solve,nep,0,0,0)); |
| 125 | |||
| 126 | /* various viewers */ | ||
| 127 |
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.
|
1501 | PetscCall(NEPViewFromOptions(nep,NULL,"-nep_view")); |
| 128 |
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.
|
1501 | PetscCall(NEPConvergedReasonViewFromOptions(nep)); |
| 129 |
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.
|
1501 | PetscCall(NEPErrorViewFromOptions(nep)); |
| 130 |
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.
|
1501 | PetscCall(NEPValuesViewFromOptions(nep)); |
| 131 |
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.
|
1501 | PetscCall(NEPVectorsViewFromOptions(nep)); |
| 132 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1501 | if (nep->fui==NEP_USER_INTERFACE_SPLIT) { |
| 133 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
4070 | for (i=0;i<nep->nt;i++) { |
| 134 |
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.
|
3022 | PetscCall(PetscSNPrintf(str,sizeof(str),"-nep_view_mat%" PetscInt_FMT,i)); |
| 135 |
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.
|
3022 | PetscCall(MatViewFromOptions(nep->A[i],(PetscObject)nep,str)); |
| 136 |
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.
|
3022 | PetscCall(PetscSNPrintf(str,sizeof(str),"-nep_view_fn%" PetscInt_FMT,i)); |
| 137 |
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.
|
3022 | PetscCall(FNViewFromOptions(nep->f[i],(PetscObject)nep,str)); |
| 138 | } | ||
| 139 | } | ||
| 140 | |||
| 141 | /* Remove the initial subspace */ | ||
| 142 | 1501 | nep->nini = 0; | |
| 143 | |||
| 144 | /* Reset resolvent information */ | ||
| 145 |
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.
|
1501 | PetscCall(MatDestroy(&nep->resolvent)); |
| 146 |
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.
|
288 | PetscFunctionReturn(PETSC_SUCCESS); |
| 147 | } | ||
| 148 | |||
| 149 | /*@ | ||
| 150 | NEPProjectOperator - Computes the projection of the nonlinear operator. | ||
| 151 | |||
| 152 | Collective | ||
| 153 | |||
| 154 | Input Parameters: | ||
| 155 | + nep - the nonlinear eigensolver context | ||
| 156 | . j0 - initial index | ||
| 157 | - j1 - final index | ||
| 158 | |||
| 159 | Notes: | ||
| 160 | This is available for split operator only. | ||
| 161 | |||
| 162 | The nonlinear operator $T(\lambda)$ is projected onto $\operatorname{span}(V)$, where $V$ is | ||
| 163 | an orthonormal basis built internally by the solver. The projected | ||
| 164 | operator is equal to $\sum_i V^* A_i V f_i(\lambda)$, so this function | ||
| 165 | computes all matrices $E_i = V^* A_i V$, and stores them in the extra | ||
| 166 | matrices inside `DS`, see `DSMatType`. Only rows/columns in the range [`j0`,`j1`-1] are computed, | ||
| 167 | the previous ones are assumed to be available already. | ||
| 168 | |||
| 169 | Level: developer | ||
| 170 | |||
| 171 | .seealso: [](ch:nep), `NEPSetSplitOperator()` | ||
| 172 | @*/ | ||
| 173 | 10 | PetscErrorCode NEPProjectOperator(NEP nep,PetscInt j0,PetscInt j1) | |
| 174 | { | ||
| 175 | 10 | PetscInt k; | |
| 176 | 10 | Mat G; | |
| 177 | |||
| 178 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
10 | PetscFunctionBegin; |
| 179 |
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(nep,NEP_CLASSID,1); |
| 180 |
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.
|
10 | PetscValidLogicalCollectiveInt(nep,j0,2); |
| 181 |
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.
|
10 | PetscValidLogicalCollectiveInt(nep,j1,3); |
| 182 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
10 | NEPCheckProblem(nep,1); |
| 183 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
10 | NEPCheckSplit(nep,1); |
| 184 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(BVSetActiveColumns(nep->V,j0,j1)); |
| 185 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
40 | for (k=0;k<nep->nt;k++) { |
| 186 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
30 | PetscCall(DSGetMat(nep->ds,DSMatExtra[k],&G)); |
| 187 |
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(BVMatProject(nep->V,nep->A[k],nep->V,G)); |
| 188 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
30 | PetscCall(DSRestoreMat(nep->ds,DSMatExtra[k],&G)); |
| 189 | } | ||
| 190 |
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); |
| 191 | } | ||
| 192 | |||
| 193 | /*@ | ||
| 194 | NEPApplyFunction - Applies the nonlinear function $T(\lambda)$ to a given vector. | ||
| 195 | |||
| 196 | Collective | ||
| 197 | |||
| 198 | Input Parameters: | ||
| 199 | + nep - the nonlinear eigensolver context | ||
| 200 | . lambda - scalar argument | ||
| 201 | . x - vector to be multiplied against | ||
| 202 | - v - workspace vector (used only in the case of split form) | ||
| 203 | |||
| 204 | Output Parameters: | ||
| 205 | + y - result vector | ||
| 206 | . A - (optional) Function matrix, for callback interface only | ||
| 207 | - B - (unused) preconditioning matrix | ||
| 208 | |||
| 209 | Note: | ||
| 210 | If the nonlinear operator is represented in split form, the result | ||
| 211 | $y = T(\lambda)x$ is computed without building $T(\lambda)$ explicitly. In | ||
| 212 | that case, parameters `A` and `B` are not used. Otherwise, the matrix | ||
| 213 | $T(\lambda)$ is built and the effect is the same as a call to | ||
| 214 | `NEPComputeFunction()` followed by a `MatMult()`. | ||
| 215 | |||
| 216 | Level: developer | ||
| 217 | |||
| 218 | .seealso: [](ch:nep), `NEPSetSplitOperator()`, `NEPComputeFunction()`, `NEPApplyAdjoint()` | ||
| 219 | @*/ | ||
| 220 | 6968 | PetscErrorCode NEPApplyFunction(NEP nep,PetscScalar lambda,Vec x,Vec v,Vec y,Mat A,Mat B) | |
| 221 | { | ||
| 222 | 6968 | PetscInt i; | |
| 223 | 6968 | PetscScalar alpha; | |
| 224 | |||
| 225 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
6968 | PetscFunctionBegin; |
| 226 |
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.
|
6968 | PetscValidHeaderSpecific(nep,NEP_CLASSID,1); |
| 227 |
30/68✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✓ Branch 26 taken 2 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✓ Branch 30 taken 2 times.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✓ Branch 33 taken 2 times.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 2 times.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✓ Branch 39 taken 2 times.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✓ Branch 47 taken 2 times.
✓ Branch 48 taken 2 times.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✓ Branch 51 taken 2 times.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 2 times.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✓ Branch 57 taken 2 times.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✓ Branch 60 taken 2 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 2 times.
✗ Branch 63 not taken.
✗ Branch 64 not taken.
✓ Branch 65 taken 2 times.
✗ Branch 66 not taken.
✗ Branch 67 not taken.
|
6968 | PetscValidLogicalCollectiveScalar(nep,lambda,2); |
| 228 |
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.
|
6968 | PetscValidHeaderSpecific(x,VEC_CLASSID,3); |
| 229 |
4/14✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
6968 | if (v) PetscValidHeaderSpecific(v,VEC_CLASSID,4); |
| 230 |
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.
|
6968 | PetscValidHeaderSpecific(y,VEC_CLASSID,5); |
| 231 |
1/14✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
6968 | if (A) PetscValidHeaderSpecific(A,MAT_CLASSID,6); |
| 232 |
1/14✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
6968 | if (B) PetscValidHeaderSpecific(B,MAT_CLASSID,7); |
| 233 | |||
| 234 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
6968 | if (nep->fui==NEP_USER_INTERFACE_SPLIT) { |
| 235 |
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.
|
5786 | PetscCall(VecSet(y,0.0)); |
| 236 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
22745 | for (i=0;i<nep->nt;i++) { |
| 237 |
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.
|
16959 | PetscCall(FNEvaluateFunction(nep->f[i],lambda,&alpha)); |
| 238 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
16959 | PetscCall(MatMult(nep->A[i],x,v)); |
| 239 |
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.
|
16959 | PetscCall(VecAXPY(y,alpha,v)); |
| 240 | } | ||
| 241 | } else { | ||
| 242 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
1182 | if (!A) A = nep->function; |
| 243 |
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.
|
1182 | PetscCall(NEPComputeFunction(nep,lambda,A,A)); |
| 244 |
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.
|
1182 | PetscCall(MatMult(A,x,y)); |
| 245 | } | ||
| 246 |
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.
|
1375 | PetscFunctionReturn(PETSC_SUCCESS); |
| 247 | } | ||
| 248 | |||
| 249 | /*@ | ||
| 250 | NEPApplyAdjoint - Applies the adjoint nonlinear function $T^*(\lambda)$ to a given vector. | ||
| 251 | |||
| 252 | Collective | ||
| 253 | |||
| 254 | Input Parameters: | ||
| 255 | + nep - the nonlinear eigensolver context | ||
| 256 | . lambda - scalar argument | ||
| 257 | . x - vector to be multiplied against | ||
| 258 | - v - workspace vector (used only in the case of split form) | ||
| 259 | |||
| 260 | Output Parameters: | ||
| 261 | + y - result vector | ||
| 262 | . A - (optional) Function matrix, for callback interface only | ||
| 263 | - B - (unused) preconditioning matrix | ||
| 264 | |||
| 265 | Note: | ||
| 266 | If the nonlinear operator is represented in split form, the result | ||
| 267 | $y = T^*(\lambda)x$ is computed without building $T(\lambda)$ explicitly. In | ||
| 268 | that case, parameters `A` and `B` are not used. Otherwise, the matrix | ||
| 269 | $T(\lambda)$ is built and the effect is the same as a call to | ||
| 270 | `NEPComputeFunction()` followed by a `MatMultHermitianTranspose()`. | ||
| 271 | |||
| 272 | Level: developer | ||
| 273 | |||
| 274 | .seealso: [](ch:nep), `NEPSetSplitOperator()`, `NEPComputeFunction()`, `NEPApplyFunction()` | ||
| 275 | @*/ | ||
| 276 | 210 | PetscErrorCode NEPApplyAdjoint(NEP nep,PetscScalar lambda,Vec x,Vec v,Vec y,Mat A,Mat B) | |
| 277 | { | ||
| 278 | 210 | PetscInt i; | |
| 279 | 210 | PetscScalar alpha; | |
| 280 | 210 | Vec w; | |
| 281 | |||
| 282 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
210 | PetscFunctionBegin; |
| 283 |
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.
|
210 | PetscValidHeaderSpecific(nep,NEP_CLASSID,1); |
| 284 |
30/68✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✓ Branch 26 taken 2 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✓ Branch 30 taken 2 times.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✓ Branch 33 taken 2 times.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 2 times.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✓ Branch 39 taken 2 times.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✓ Branch 47 taken 2 times.
✓ Branch 48 taken 2 times.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✓ Branch 51 taken 2 times.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 2 times.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✓ Branch 57 taken 2 times.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✓ Branch 60 taken 2 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 2 times.
✗ Branch 63 not taken.
✗ Branch 64 not taken.
✓ Branch 65 taken 2 times.
✗ Branch 66 not taken.
✗ Branch 67 not taken.
|
210 | PetscValidLogicalCollectiveScalar(nep,lambda,2); |
| 285 |
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.
|
210 | PetscValidHeaderSpecific(x,VEC_CLASSID,3); |
| 286 |
4/14✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
210 | if (v) PetscValidHeaderSpecific(v,VEC_CLASSID,4); |
| 287 |
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.
|
210 | PetscValidHeaderSpecific(y,VEC_CLASSID,5); |
| 288 |
1/14✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
210 | if (A) PetscValidHeaderSpecific(A,MAT_CLASSID,6); |
| 289 |
1/14✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
210 | if (B) PetscValidHeaderSpecific(B,MAT_CLASSID,7); |
| 290 | |||
| 291 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
210 | PetscCall(VecDuplicate(x,&w)); |
| 292 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
210 | PetscCall(VecCopy(x,w)); |
| 293 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
210 | PetscCall(VecConjugate(w)); |
| 294 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
210 | if (nep->fui==NEP_USER_INTERFACE_SPLIT) { |
| 295 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
130 | PetscCall(VecSet(y,0.0)); |
| 296 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
520 | for (i=0;i<nep->nt;i++) { |
| 297 |
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.
|
390 | PetscCall(FNEvaluateFunction(nep->f[i],lambda,&alpha)); |
| 298 |
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.
|
390 | PetscCall(MatMultHermitianTranspose(nep->A[i],w,v)); |
| 299 |
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.
|
390 | PetscCall(VecAXPY(y,alpha,v)); |
| 300 | } | ||
| 301 | } else { | ||
| 302 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
80 | if (!A) A = nep->function; |
| 303 |
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.
|
80 | PetscCall(NEPComputeFunction(nep,lambda,A,A)); |
| 304 |
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.
|
80 | PetscCall(MatMultHermitianTranspose(A,w,y)); |
| 305 | } | ||
| 306 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
210 | PetscCall(VecDestroy(&w)); |
| 307 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
210 | PetscCall(VecConjugate(y)); |
| 308 |
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.
|
42 | PetscFunctionReturn(PETSC_SUCCESS); |
| 309 | } | ||
| 310 | |||
| 311 | /*@ | ||
| 312 | NEPApplyJacobian - Applies the nonlinear Jacobian $T'(\lambda)$ to a given vector. | ||
| 313 | |||
| 314 | Collective | ||
| 315 | |||
| 316 | Input Parameters: | ||
| 317 | + nep - the nonlinear eigensolver context | ||
| 318 | . lambda - scalar argument | ||
| 319 | . x - vector to be multiplied against | ||
| 320 | - v - workspace vector (used only in the case of split form) | ||
| 321 | |||
| 322 | Output Parameters: | ||
| 323 | + y - result vector | ||
| 324 | - A - (optional) Jacobian matrix, for callback interface only | ||
| 325 | |||
| 326 | Note: | ||
| 327 | If the nonlinear operator is represented in split form, the result | ||
| 328 | $y = T'(\lambda)x$ is computed without building $T'(\lambda)$ explicitly. In | ||
| 329 | that case, parameter `A` is not used. Otherwise, the matrix | ||
| 330 | $T'(\lambda)$ is built and the effect is the same as a call to | ||
| 331 | `NEPComputeJacobian()` followed by a `MatMult()`. | ||
| 332 | |||
| 333 | Level: developer | ||
| 334 | |||
| 335 | .seealso: [](ch:nep), `NEPSetSplitOperator()`, `NEPComputeJacobian()` | ||
| 336 | @*/ | ||
| 337 | 320 | PetscErrorCode NEPApplyJacobian(NEP nep,PetscScalar lambda,Vec x,Vec v,Vec y,Mat A) | |
| 338 | { | ||
| 339 | 320 | PetscInt i; | |
| 340 | 320 | PetscScalar alpha; | |
| 341 | |||
| 342 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
320 | PetscFunctionBegin; |
| 343 |
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.
|
320 | PetscValidHeaderSpecific(nep,NEP_CLASSID,1); |
| 344 |
30/68✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✓ Branch 26 taken 2 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✓ Branch 30 taken 2 times.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✓ Branch 33 taken 2 times.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 2 times.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✓ Branch 39 taken 2 times.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✓ Branch 47 taken 2 times.
✓ Branch 48 taken 2 times.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✓ Branch 51 taken 2 times.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 2 times.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✓ Branch 57 taken 2 times.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✓ Branch 60 taken 2 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 2 times.
✗ Branch 63 not taken.
✗ Branch 64 not taken.
✓ Branch 65 taken 2 times.
✗ Branch 66 not taken.
✗ Branch 67 not taken.
|
320 | PetscValidLogicalCollectiveScalar(nep,lambda,2); |
| 345 |
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.
|
320 | PetscValidHeaderSpecific(x,VEC_CLASSID,3); |
| 346 |
3/14✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
320 | if (v) PetscValidHeaderSpecific(v,VEC_CLASSID,4); |
| 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.
|
320 | PetscValidHeaderSpecific(y,VEC_CLASSID,5); |
| 348 |
1/14✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
320 | if (A) PetscValidHeaderSpecific(A,MAT_CLASSID,6); |
| 349 | |||
| 350 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
320 | if (nep->fui==NEP_USER_INTERFACE_SPLIT) { |
| 351 |
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.
|
320 | PetscCall(VecSet(y,0.0)); |
| 352 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1280 | for (i=0;i<nep->nt;i++) { |
| 353 |
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.
|
960 | PetscCall(FNEvaluateDerivative(nep->f[i],lambda,&alpha)); |
| 354 |
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.
|
960 | PetscCall(MatMult(nep->A[i],x,v)); |
| 355 |
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.
|
960 | PetscCall(VecAXPY(y,alpha,v)); |
| 356 | } | ||
| 357 | } else { | ||
| 358 | ✗ | if (!A) A = nep->jacobian; | |
| 359 | ✗ | PetscCall(NEPComputeJacobian(nep,lambda,A)); | |
| 360 | ✗ | PetscCall(MatMult(A,x,y)); | |
| 361 | } | ||
| 362 |
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.
|
64 | PetscFunctionReturn(PETSC_SUCCESS); |
| 363 | } | ||
| 364 | |||
| 365 | /*@ | ||
| 366 | NEPGetIterationNumber - Gets the current iteration number. If the | ||
| 367 | call to `NEPSolve()` is complete, then it returns the number of iterations | ||
| 368 | carried out by the solution method. | ||
| 369 | |||
| 370 | Not Collective | ||
| 371 | |||
| 372 | Input Parameter: | ||
| 373 | . nep - the nonlinear eigensolver context | ||
| 374 | |||
| 375 | Output Parameter: | ||
| 376 | . its - number of iterations | ||
| 377 | |||
| 378 | Note: | ||
| 379 | During the $i$-th iteration this call returns $i-1$. If `NEPSolve()` is | ||
| 380 | complete, then parameter `its` contains either the iteration number at | ||
| 381 | which convergence was successfully reached, or failure was detected. | ||
| 382 | Call `NEPGetConvergedReason()` to determine if the solver converged or | ||
| 383 | failed and why. | ||
| 384 | |||
| 385 | Level: intermediate | ||
| 386 | |||
| 387 | .seealso: [](ch:nep), `NEPGetConvergedReason()`, `NEPSetTolerances()` | ||
| 388 | @*/ | ||
| 389 | 101 | PetscErrorCode NEPGetIterationNumber(NEP nep,PetscInt *its) | |
| 390 | { | ||
| 391 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
101 | PetscFunctionBegin; |
| 392 |
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.
|
101 | PetscValidHeaderSpecific(nep,NEP_CLASSID,1); |
| 393 |
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.
|
101 | PetscAssertPointer(its,2); |
| 394 | 101 | *its = nep->its; | |
| 395 |
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.
|
101 | PetscFunctionReturn(PETSC_SUCCESS); |
| 396 | } | ||
| 397 | |||
| 398 | /*@ | ||
| 399 | NEPGetConverged - Gets the number of converged eigenpairs. | ||
| 400 | |||
| 401 | Not Collective | ||
| 402 | |||
| 403 | Input Parameter: | ||
| 404 | . nep - the nonlinear eigensolver context | ||
| 405 | |||
| 406 | Output Parameter: | ||
| 407 | . nconv - number of converged eigenpairs | ||
| 408 | |||
| 409 | Note: | ||
| 410 | This function should be called after `NEPSolve()` has finished. | ||
| 411 | |||
| 412 | The value `nconv` may be different from the number of requested solutions | ||
| 413 | `nev`, but not larger than `ncv`, see `NEPSetDimensions()`. | ||
| 414 | |||
| 415 | Level: beginner | ||
| 416 | |||
| 417 | .seealso: [](ch:nep), `NEPSetDimensions()`, `NEPSolve()`, `NEPGetEigenpair()` | ||
| 418 | @*/ | ||
| 419 | 123 | PetscErrorCode NEPGetConverged(NEP nep,PetscInt *nconv) | |
| 420 | { | ||
| 421 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
123 | PetscFunctionBegin; |
| 422 |
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.
|
123 | PetscValidHeaderSpecific(nep,NEP_CLASSID,1); |
| 423 |
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.
|
123 | PetscAssertPointer(nconv,2); |
| 424 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
123 | NEPCheckSolved(nep,1); |
| 425 | 123 | *nconv = nep->nconv; | |
| 426 |
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.
|
123 | PetscFunctionReturn(PETSC_SUCCESS); |
| 427 | } | ||
| 428 | |||
| 429 | /*@ | ||
| 430 | NEPGetConvergedReason - Gets the reason why the `NEPSolve()` iteration was | ||
| 431 | stopped. | ||
| 432 | |||
| 433 | Not Collective | ||
| 434 | |||
| 435 | Input Parameter: | ||
| 436 | . nep - the nonlinear eigensolver context | ||
| 437 | |||
| 438 | Output Parameter: | ||
| 439 | . reason - negative value indicates diverged, positive value converged, see | ||
| 440 | `NEPConvergedReason` for the possible values | ||
| 441 | |||
| 442 | Options Database Key: | ||
| 443 | . -nep_converged_reason - print reason for convergence/divergence, and number of iterations | ||
| 444 | |||
| 445 | Note: | ||
| 446 | If this routine is called before or doing the `NEPSolve()` the value of | ||
| 447 | `NEP_CONVERGED_ITERATING` is returned. | ||
| 448 | |||
| 449 | Level: intermediate | ||
| 450 | |||
| 451 | .seealso: [](ch:nep), `NEPSetTolerances()`, `NEPSolve()`, `NEPConvergedReason` | ||
| 452 | @*/ | ||
| 453 | 16 | PetscErrorCode NEPGetConvergedReason(NEP nep,NEPConvergedReason *reason) | |
| 454 | { | ||
| 455 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
16 | PetscFunctionBegin; |
| 456 |
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.
|
16 | PetscValidHeaderSpecific(nep,NEP_CLASSID,1); |
| 457 |
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.
|
16 | PetscAssertPointer(reason,2); |
| 458 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
16 | NEPCheckSolved(nep,1); |
| 459 | 16 | *reason = nep->reason; | |
| 460 |
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.
|
16 | PetscFunctionReturn(PETSC_SUCCESS); |
| 461 | } | ||
| 462 | |||
| 463 | /*@ | ||
| 464 | NEPGetEigenpair - Gets the `i`-th solution of the eigenproblem as computed by | ||
| 465 | `NEPSolve()`. The solution consists in both the eigenvalue and the eigenvector. | ||
| 466 | |||
| 467 | Collective | ||
| 468 | |||
| 469 | Input Parameters: | ||
| 470 | + nep - the nonlinear eigensolver context | ||
| 471 | - i - index of the solution | ||
| 472 | |||
| 473 | Output Parameters: | ||
| 474 | + eigr - real part of eigenvalue | ||
| 475 | . eigi - imaginary part of eigenvalue | ||
| 476 | . Vr - real part of eigenvector | ||
| 477 | - Vi - imaginary part of eigenvector | ||
| 478 | |||
| 479 | Notes: | ||
| 480 | It is allowed to pass `NULL` for `Vr` and `Vi`, if the eigenvector is not | ||
| 481 | required. Otherwise, the caller must provide valid `Vec` objects, i.e., | ||
| 482 | they must be created by the calling program with e.g. `MatCreateVecs()`. | ||
| 483 | |||
| 484 | If the eigenvalue is real, then `eigi` and `Vi` are set to zero. If PETSc is | ||
| 485 | configured with complex scalars the eigenvalue is stored | ||
| 486 | directly in `eigr` (`eigi` is set to zero) and the eigenvector in `Vr` (`Vi` | ||
| 487 | is set to zero). In any case, the user can pass `NULL` in any argument that | ||
| 488 | is not required. | ||
| 489 | |||
| 490 | The index `i` should be a value between 0 and `nconv`-1 (see `NEPGetConverged()`). | ||
| 491 | Eigenpairs are indexed according to the ordering criterion established | ||
| 492 | with `NEPSetWhichEigenpairs()`. | ||
| 493 | |||
| 494 | The eigenvector is normalized to have unit norm. | ||
| 495 | |||
| 496 | Level: beginner | ||
| 497 | |||
| 498 | .seealso: [](ch:nep), `NEPSolve()`, `NEPGetConverged()`, `NEPSetWhichEigenpairs()`, `NEPGetLeftEigenvector()` | ||
| 499 | @*/ | ||
| 500 | 6470 | PetscErrorCode NEPGetEigenpair(NEP nep,PetscInt i,PetscScalar *eigr,PetscScalar *eigi,Vec Vr,Vec Vi) | |
| 501 | { | ||
| 502 | 6470 | PetscInt k; | |
| 503 | |||
| 504 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
6470 | PetscFunctionBegin; |
| 505 |
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.
|
6470 | PetscValidHeaderSpecific(nep,NEP_CLASSID,1); |
| 506 |
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.
|
6470 | PetscValidLogicalCollectiveInt(nep,i,2); |
| 507 |
17/46✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✓ 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 taken 2 times.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✓ Branch 35 taken 2 times.
✗ Branch 36 not taken.
✗ 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.
|
6470 | if (Vr) { PetscValidHeaderSpecific(Vr,VEC_CLASSID,5); PetscCheckSameComm(nep,1,Vr,5); } |
| 508 |
17/46✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✓ 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 taken 2 times.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✓ Branch 35 taken 2 times.
✗ Branch 36 not taken.
✗ 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.
|
6470 | if (Vi) { PetscValidHeaderSpecific(Vi,VEC_CLASSID,6); PetscCheckSameComm(nep,1,Vi,6); } |
| 509 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
6470 | NEPCheckSolved(nep,1); |
| 510 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
6470 | PetscCheck(i>=0,PetscObjectComm((PetscObject)nep),PETSC_ERR_ARG_OUTOFRANGE,"The index cannot be negative"); |
| 511 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
6470 | PetscCheck(i<nep->nconv,PetscObjectComm((PetscObject)nep),PETSC_ERR_ARG_OUTOFRANGE,"The index can be nconv-1 at most, see NEPGetConverged()"); |
| 512 | |||
| 513 |
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.
|
6470 | PetscCall(NEPComputeVectors(nep)); |
| 514 | 6470 | k = nep->perm[i]; | |
| 515 | |||
| 516 | /* eigenvalue */ | ||
| 517 | #if defined(PETSC_USE_COMPLEX) | ||
| 518 |
1/2✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
|
3693 | if (eigr) *eigr = nep->eigr[k]; |
| 519 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
3693 | if (eigi) *eigi = 0; |
| 520 | #else | ||
| 521 |
1/2✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
|
2777 | if (eigr) *eigr = nep->eigr[k]; |
| 522 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
2777 | if (eigi) *eigi = nep->eigi[k]; |
| 523 | #endif | ||
| 524 | |||
| 525 | /* eigenvector */ | ||
| 526 |
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.
|
6470 | PetscCall(BV_GetEigenvector(nep->V,k,nep->eigi[k],Vr,Vi)); |
| 527 |
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.
|
1272 | PetscFunctionReturn(PETSC_SUCCESS); |
| 528 | } | ||
| 529 | |||
| 530 | /*@ | ||
| 531 | NEPGetLeftEigenvector - Gets the `i`-th left eigenvector as computed by `NEPSolve()`. | ||
| 532 | |||
| 533 | Collective | ||
| 534 | |||
| 535 | Input Parameters: | ||
| 536 | + nep - the nonlinear eigensolver context | ||
| 537 | - i - index of the solution | ||
| 538 | |||
| 539 | Output Parameters: | ||
| 540 | + Wr - real part of left eigenvector | ||
| 541 | - Wi - imaginary part of left eigenvector | ||
| 542 | |||
| 543 | Notes: | ||
| 544 | The caller must provide valid `Vec` objects, i.e., they must be created | ||
| 545 | by the calling program with e.g. `MatCreateVecs()`. | ||
| 546 | |||
| 547 | If the corresponding eigenvalue is real, then `Wi` is set to zero. If PETSc is | ||
| 548 | configured with complex scalars the eigenvector is stored directly in `Wr` | ||
| 549 | (`Wi` is set to zero). In any case, the user can pass `NULL` in `Wr` or `Wi` if | ||
| 550 | one of them is not required. | ||
| 551 | |||
| 552 | The index `i` should be a value between 0 and `nconv`-1 (see `NEPGetConverged()`). | ||
| 553 | Eigensolutions are indexed according to the ordering criterion established | ||
| 554 | with `NEPSetWhichEigenpairs()`. | ||
| 555 | |||
| 556 | Left eigenvectors are available only if the twosided flag was set, see | ||
| 557 | `NEPSetTwoSided()`. | ||
| 558 | |||
| 559 | Level: intermediate | ||
| 560 | |||
| 561 | .seealso: [](ch:nep), `NEPGetEigenpair()`, `NEPGetConverged()`, `NEPSetWhichEigenpairs()`, `NEPSetTwoSided()` | ||
| 562 | @*/ | ||
| 563 | 210 | PetscErrorCode NEPGetLeftEigenvector(NEP nep,PetscInt i,Vec Wr,Vec Wi) | |
| 564 | { | ||
| 565 | 210 | PetscInt k; | |
| 566 | |||
| 567 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
210 | PetscFunctionBegin; |
| 568 |
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.
|
210 | PetscValidHeaderSpecific(nep,NEP_CLASSID,1); |
| 569 |
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.
|
210 | PetscValidLogicalCollectiveInt(nep,i,2); |
| 570 |
16/46✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✓ 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 taken 2 times.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✓ Branch 35 taken 2 times.
✗ Branch 36 not taken.
✗ 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.
|
210 | if (Wr) { PetscValidHeaderSpecific(Wr,VEC_CLASSID,3); PetscCheckSameComm(nep,1,Wr,3); } |
| 571 |
17/46✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
✓ Branch 26 taken 1 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 1 times.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✓ Branch 35 taken 1 times.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✓ Branch 39 taken 1 times.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
|
210 | if (Wi) { PetscValidHeaderSpecific(Wi,VEC_CLASSID,4); PetscCheckSameComm(nep,1,Wi,4); } |
| 572 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
210 | NEPCheckSolved(nep,1); |
| 573 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
210 | PetscCheck(nep->twosided,PetscObjectComm((PetscObject)nep),PETSC_ERR_ARG_WRONGSTATE,"Must request left vectors with NEPSetTwoSided"); |
| 574 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
210 | PetscCheck(i>=0,PetscObjectComm((PetscObject)nep),PETSC_ERR_ARG_OUTOFRANGE,"The index cannot be negative"); |
| 575 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
210 | PetscCheck(i<nep->nconv,PetscObjectComm((PetscObject)nep),PETSC_ERR_ARG_OUTOFRANGE,"The index can be nconv-1 at most, see NEPGetConverged()"); |
| 576 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
210 | PetscCall(NEPComputeVectors(nep)); |
| 577 | 210 | k = nep->perm[i]; | |
| 578 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
210 | PetscCall(BV_GetEigenvector(nep->W,k,nep->eigi[k],Wr,Wi)); |
| 579 |
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.
|
42 | PetscFunctionReturn(PETSC_SUCCESS); |
| 580 | } | ||
| 581 | |||
| 582 | /*@ | ||
| 583 | NEPGetErrorEstimate - Returns the error estimate associated to the `i`-th | ||
| 584 | computed eigenpair. | ||
| 585 | |||
| 586 | Not Collective | ||
| 587 | |||
| 588 | Input Parameters: | ||
| 589 | + nep - the nonlinear eigensolver context | ||
| 590 | - i - index of eigenpair | ||
| 591 | |||
| 592 | Output Parameter: | ||
| 593 | . errest - the error estimate | ||
| 594 | |||
| 595 | Note: | ||
| 596 | This is the error estimate used internally by the eigensolver. The actual | ||
| 597 | error bound can be computed with `NEPComputeError()`. | ||
| 598 | |||
| 599 | Level: advanced | ||
| 600 | |||
| 601 | .seealso: [](ch:nep), `NEPComputeError()` | ||
| 602 | @*/ | ||
| 603 | 40 | PetscErrorCode NEPGetErrorEstimate(NEP nep,PetscInt i,PetscReal *errest) | |
| 604 | { | ||
| 605 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
40 | PetscFunctionBegin; |
| 606 |
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.
|
40 | PetscValidHeaderSpecific(nep,NEP_CLASSID,1); |
| 607 |
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.
|
40 | PetscAssertPointer(errest,3); |
| 608 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
40 | NEPCheckSolved(nep,1); |
| 609 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
40 | PetscCheck(i>=0,PetscObjectComm((PetscObject)nep),PETSC_ERR_ARG_OUTOFRANGE,"The index cannot be negative"); |
| 610 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
40 | PetscCheck(i<nep->nconv,PetscObjectComm((PetscObject)nep),PETSC_ERR_ARG_OUTOFRANGE,"The index can be nconv-1 at most, see NEPGetConverged()"); |
| 611 | 40 | *errest = nep->errest[nep->perm[i]]; | |
| 612 |
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.
|
40 | PetscFunctionReturn(PETSC_SUCCESS); |
| 613 | } | ||
| 614 | |||
| 615 | /* | ||
| 616 | NEPComputeResidualNorm_Private - Computes the norm of the residual vector | ||
| 617 | associated with an eigenpair. | ||
| 618 | |||
| 619 | Input Parameters: | ||
| 620 | adj - whether the adjoint T^* must be used instead of T | ||
| 621 | lambda - eigenvalue | ||
| 622 | x - eigenvector | ||
| 623 | w - array of work vectors (two vectors in split form, one vector otherwise) | ||
| 624 | */ | ||
| 625 | 7098 | PetscErrorCode NEPComputeResidualNorm_Private(NEP nep,PetscBool adj,PetscScalar lambda,Vec x,Vec *w,PetscReal *norm) | |
| 626 | { | ||
| 627 | 7098 | Vec y,z=NULL; | |
| 628 | |||
| 629 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
7098 | PetscFunctionBegin; |
| 630 | 7098 | y = w[0]; | |
| 631 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
7098 | if (nep->fui==NEP_USER_INTERFACE_SPLIT) z = w[1]; |
| 632 |
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.
|
7098 | if (adj) PetscCall(NEPApplyAdjoint(nep,lambda,x,z,y,NULL,NULL)); |
| 633 |
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.
|
6968 | else PetscCall(NEPApplyFunction(nep,lambda,x,z,y,NULL,NULL)); |
| 634 |
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.
|
7098 | PetscCall(VecNorm(y,NORM_2,norm)); |
| 635 |
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.
|
1401 | PetscFunctionReturn(PETSC_SUCCESS); |
| 636 | } | ||
| 637 | |||
| 638 | /*@ | ||
| 639 | NEPComputeError - Computes the error (based on the residual norm) associated | ||
| 640 | with the `i`-th computed eigenpair. | ||
| 641 | |||
| 642 | Collective | ||
| 643 | |||
| 644 | Input Parameters: | ||
| 645 | + nep - the nonlinear eigensolver context | ||
| 646 | . i - the solution index | ||
| 647 | - type - the type of error to compute, see `NEPErrorType` | ||
| 648 | |||
| 649 | Output Parameter: | ||
| 650 | . error - the error | ||
| 651 | |||
| 652 | Notes: | ||
| 653 | The error can be computed in various ways, all of them based on the residual | ||
| 654 | norm computed as $\|T(\lambda)x\|_2$ where $(\lambda,x)$ is the approximate eigenpair. | ||
| 655 | |||
| 656 | If the computation of left eigenvectors was enabled with `NEPSetTwoSided()`, | ||
| 657 | then the error will be computed using the maximum of the value above and | ||
| 658 | the left residual norm $\|y^*T(\lambda)\|_2$, where $y$ is the approximate left | ||
| 659 | eigenvector. | ||
| 660 | |||
| 661 | Level: beginner | ||
| 662 | |||
| 663 | .seealso: [](ch:nep), `NEPErrorType`, `NEPSolve()`, `NEPGetErrorEstimate()`, `NEPSetTwoSided()` | ||
| 664 | @*/ | ||
| 665 | 6131 | PetscErrorCode NEPComputeError(NEP nep,PetscInt i,NEPErrorType type,PetscReal *error) | |
| 666 | { | ||
| 667 | 6131 | Vec xr,xi=NULL; | |
| 668 | 6131 | PetscInt j,nwork,issplit=0; | |
| 669 | 6131 | PetscScalar kr,ki,s; | |
| 670 | 6131 | PetscReal er,z=0.0,errorl,nrm; | |
| 671 | 6131 | PetscBool flg; | |
| 672 | |||
| 673 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
6131 | PetscFunctionBegin; |
| 674 |
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.
|
6131 | PetscValidHeaderSpecific(nep,NEP_CLASSID,1); |
| 675 |
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.
|
6131 | PetscValidLogicalCollectiveInt(nep,i,2); |
| 676 |
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.
|
6131 | PetscValidLogicalCollectiveEnum(nep,type,3); |
| 677 |
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.
|
6131 | PetscAssertPointer(error,4); |
| 678 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
6131 | NEPCheckSolved(nep,1); |
| 679 | |||
| 680 | /* allocate work vectors */ | ||
| 681 | #if defined(PETSC_USE_COMPLEX) | ||
| 682 | 3518 | nwork = 2; | |
| 683 | #else | ||
| 684 | 2613 | nwork = 3; | |
| 685 | #endif | ||
| 686 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
6131 | if (nep->fui==NEP_USER_INTERFACE_SPLIT) { |
| 687 | 5189 | issplit = 1; | |
| 688 | 5189 | nwork++; /* need an extra work vector for NEPComputeResidualNorm_Private */ | |
| 689 | } | ||
| 690 |
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.
|
6131 | PetscCall(NEPSetWorkVecs(nep,nwork)); |
| 691 | 6131 | xr = nep->work[issplit+1]; | |
| 692 | #if !defined(PETSC_USE_COMPLEX) | ||
| 693 | 2613 | xi = nep->work[issplit+2]; | |
| 694 | #endif | ||
| 695 | |||
| 696 | /* compute residual norms */ | ||
| 697 |
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.
|
6131 | PetscCall(NEPGetEigenpair(nep,i,&kr,&ki,xr,xi)); |
| 698 | #if !defined(PETSC_USE_COMPLEX) | ||
| 699 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
2613 | PetscCheck(ki==0.0,PetscObjectComm((PetscObject)nep),PETSC_ERR_SUP,"Not implemented for complex eigenvalues with real scalars"); |
| 700 | #endif | ||
| 701 |
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.
|
6131 | PetscCall(NEPComputeResidualNorm_Private(nep,PETSC_FALSE,kr,xr,nep->work,error)); |
| 702 |
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.
|
6131 | PetscCall(VecNorm(xr,NORM_2,&er)); |
| 703 | |||
| 704 | /* if two-sided, compute left residual norm and take the maximum */ | ||
| 705 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
6131 | if (nep->twosided) { |
| 706 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
130 | PetscCall(NEPGetLeftEigenvector(nep,i,xr,xi)); |
| 707 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
130 | PetscCall(NEPComputeResidualNorm_Private(nep,PETSC_TRUE,kr,xr,nep->work,&errorl)); |
| 708 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
214 | *error = PetscMax(*error,errorl); |
| 709 | } | ||
| 710 | |||
| 711 | /* compute error */ | ||
| 712 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
|
6131 | switch (type) { |
| 713 | case NEP_ERROR_ABSOLUTE: | ||
| 714 | break; | ||
| 715 | 5437 | case NEP_ERROR_RELATIVE: | |
| 716 | 5437 | *error /= PetscAbsScalar(kr)*er; | |
| 717 | 5437 | break; | |
| 718 | 684 | case NEP_ERROR_BACKWARD: | |
| 719 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
684 | if (nep->fui!=NEP_USER_INTERFACE_SPLIT) { |
| 720 |
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.
|
270 | PetscCall(NEPComputeFunction(nep,kr,nep->function,nep->function)); |
| 721 |
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.
|
270 | PetscCall(MatHasOperation(nep->function,MATOP_NORM,&flg)); |
| 722 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
270 | PetscCheck(flg,PetscObjectComm((PetscObject)nep),PETSC_ERR_ARG_WRONG,"The computation of backward errors requires a matrix norm operation"); |
| 723 |
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.
|
270 | PetscCall(MatNorm(nep->function,NORM_INFINITY,&nrm)); |
| 724 | 270 | *error /= nrm*er; | |
| 725 | 270 | break; | |
| 726 | } | ||
| 727 | /* initialization of matrix norms */ | ||
| 728 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
414 | if (!nep->nrma[0]) { |
| 729 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
388 | for (j=0;j<nep->nt;j++) { |
| 730 |
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.
|
272 | PetscCall(MatHasOperation(nep->A[j],MATOP_NORM,&flg)); |
| 731 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
272 | PetscCheck(flg,PetscObjectComm((PetscObject)nep),PETSC_ERR_ARG_WRONG,"The computation of backward errors requires a matrix norm operation"); |
| 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.
|
272 | PetscCall(MatNorm(nep->A[j],NORM_INFINITY,&nep->nrma[j])); |
| 733 | } | ||
| 734 | } | ||
| 735 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1352 | for (j=0;j<nep->nt;j++) { |
| 736 |
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.
|
938 | PetscCall(FNEvaluateFunction(nep->f[j],kr,&s)); |
| 737 | 938 | z = z + nep->nrma[j]*PetscAbsScalar(s); | |
| 738 | } | ||
| 739 | 414 | *error /= z*er; | |
| 740 | 414 | break; | |
| 741 | ✗ | default: | |
| 742 | − | SETERRQ(PetscObjectComm((PetscObject)nep),PETSC_ERR_ARG_OUTOFRANGE,"Invalid error type"); | |
| 743 | } | ||
| 744 |
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.
|
1208 | PetscFunctionReturn(PETSC_SUCCESS); |
| 745 | } | ||
| 746 | |||
| 747 | /*@ | ||
| 748 | NEPComputeFunction - Computes the function matrix $T(\lambda)$ that has been | ||
| 749 | set with `NEPSetFunction()`. | ||
| 750 | |||
| 751 | Collective | ||
| 752 | |||
| 753 | Input Parameters: | ||
| 754 | + nep - the nonlinear eigensolver context | ||
| 755 | - lambda - the scalar argument | ||
| 756 | |||
| 757 | Output Parameters: | ||
| 758 | + A - Function matrix | ||
| 759 | - B - optional preconditioning matrix | ||
| 760 | |||
| 761 | Note: | ||
| 762 | `NEPComputeFunction()` is typically used within nonlinear eigensolvers | ||
| 763 | implementations, so most users would not generally call this routine | ||
| 764 | themselves. | ||
| 765 | |||
| 766 | Level: developer | ||
| 767 | |||
| 768 | .seealso: [](ch:nep), `NEPSetFunction()`, `NEPGetFunction()`, `NEPComputeJacobian()` | ||
| 769 | @*/ | ||
| 770 | 29923 | PetscErrorCode NEPComputeFunction(NEP nep,PetscScalar lambda,Mat A,Mat B) | |
| 771 | { | ||
| 772 | 29923 | PetscInt i; | |
| 773 | 29923 | PetscScalar alpha; | |
| 774 | |||
| 775 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
29923 | PetscFunctionBegin; |
| 776 |
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.
|
29923 | PetscValidHeaderSpecific(nep,NEP_CLASSID,1); |
| 777 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
29923 | NEPCheckProblem(nep,1); |
| 778 |
2/3✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
29923 | switch (nep->fui) { |
| 779 | 17994 | case NEP_USER_INTERFACE_CALLBACK: | |
| 780 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
17994 | PetscCheck(nep->computefunction,PetscObjectComm((PetscObject)nep),PETSC_ERR_USER,"Must call NEPSetFunction() first"); |
| 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.
|
17994 | PetscCall(PetscLogEventBegin(NEP_FunctionEval,nep,A,B,0)); |
| 782 |
14/26✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 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.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
|
17994 | PetscCallBack("NEP user Function function",(*nep->computefunction)(nep,lambda,A,B,nep->functionctx)); |
| 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.
|
17994 | PetscCall(PetscLogEventEnd(NEP_FunctionEval,nep,A,B,0)); |
| 784 | break; | ||
| 785 | 11929 | case NEP_USER_INTERFACE_SPLIT: | |
| 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.
|
11929 | PetscCall(MatZeroEntries(A)); |
| 787 |
5/8✓ 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 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
|
11929 | if (A != B) PetscCall(MatZeroEntries(B)); |
| 788 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
47436 | for (i=0;i<nep->nt;i++) { |
| 789 |
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.
|
35507 | PetscCall(FNEvaluateFunction(nep->f[i],lambda,&alpha)); |
| 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.
|
35507 | PetscCall(MatAXPY(A,alpha,nep->A[i],nep->mstr)); |
| 791 |
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.
|
35507 | if (A != B) PetscCall(MatAXPY(B,alpha,nep->P[i],nep->mstrp)); |
| 792 | } | ||
| 793 | break; | ||
| 794 | } | ||
| 795 |
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.
|
5706 | PetscFunctionReturn(PETSC_SUCCESS); |
| 796 | } | ||
| 797 | |||
| 798 | /*@ | ||
| 799 | NEPComputeJacobian - Computes the Jacobian matrix $T'(\lambda)$ that has been | ||
| 800 | set with `NEPSetJacobian()`. | ||
| 801 | |||
| 802 | Collective | ||
| 803 | |||
| 804 | Input Parameters: | ||
| 805 | + nep - the nonlinear eigensolver context | ||
| 806 | - lambda - the scalar argument | ||
| 807 | |||
| 808 | Output Parameter: | ||
| 809 | . A - Jacobian matrix | ||
| 810 | |||
| 811 | Notes: | ||
| 812 | Most users should not need to explicitly call this routine, as it | ||
| 813 | is used internally within the nonlinear eigensolvers. | ||
| 814 | |||
| 815 | Level: developer | ||
| 816 | |||
| 817 | .seealso: [](ch:nep), `NEPSetJacobian()`, `NEPGetJacobian()`, `NEPComputeFunction()` | ||
| 818 | @*/ | ||
| 819 | 13907 | PetscErrorCode NEPComputeJacobian(NEP nep,PetscScalar lambda,Mat A) | |
| 820 | { | ||
| 821 | 13907 | PetscInt i; | |
| 822 | 13907 | PetscScalar alpha; | |
| 823 | |||
| 824 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
13907 | PetscFunctionBegin; |
| 825 |
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.
|
13907 | PetscValidHeaderSpecific(nep,NEP_CLASSID,1); |
| 826 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
13907 | NEPCheckProblem(nep,1); |
| 827 |
2/3✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
13907 | switch (nep->fui) { |
| 828 | 5119 | case NEP_USER_INTERFACE_CALLBACK: | |
| 829 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
5119 | PetscCheck(nep->computejacobian,PetscObjectComm((PetscObject)nep),PETSC_ERR_USER,"Must call NEPSetJacobian() first"); |
| 830 |
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.
|
5119 | PetscCall(PetscLogEventBegin(NEP_JacobianEval,nep,A,0,0)); |
| 831 |
14/26✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 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.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
|
5119 | PetscCallBack("NEP user Jacobian function",(*nep->computejacobian)(nep,lambda,A,nep->jacobianctx)); |
| 832 |
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.
|
5119 | PetscCall(PetscLogEventEnd(NEP_JacobianEval,nep,A,0,0)); |
| 833 | break; | ||
| 834 | 8788 | case NEP_USER_INTERFACE_SPLIT: | |
| 835 |
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.
|
8788 | PetscCall(MatZeroEntries(A)); |
| 836 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
34944 | for (i=0;i<nep->nt;i++) { |
| 837 |
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.
|
26156 | PetscCall(FNEvaluateDerivative(nep->f[i],lambda,&alpha)); |
| 838 |
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.
|
26156 | PetscCall(MatAXPY(A,alpha,nep->A[i],nep->mstr)); |
| 839 | } | ||
| 840 | break; | ||
| 841 | } | ||
| 842 |
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.
|
2702 | PetscFunctionReturn(PETSC_SUCCESS); |
| 843 | } | ||
| 844 |