| 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 | SLEPc nonlinear eigensolver: "slp" | ||
| 12 | |||
| 13 | Method: Successive linear problems | ||
| 14 | |||
| 15 | Algorithm: | ||
| 16 | |||
| 17 | Newton-type iteration based on first order Taylor approximation. | ||
| 18 | |||
| 19 | References: | ||
| 20 | |||
| 21 | [1] A. Ruhe, "Algorithms for the nonlinear eigenvalue problem", SIAM J. | ||
| 22 | Numer. Anal. 10(4):674-689, 1973. | ||
| 23 | */ | ||
| 24 | |||
| 25 | #include <slepc/private/nepimpl.h> /*I "slepcnep.h" I*/ | ||
| 26 | #include <../src/nep/impls/nepdefl.h> | ||
| 27 | #include "slp.h" | ||
| 28 | |||
| 29 | typedef struct { | ||
| 30 | NEP_EXT_OP extop; | ||
| 31 | Vec w; | ||
| 32 | } NEP_SLP_MATSHELL; | ||
| 33 | |||
| 34 | 308 | static PetscErrorCode NEPSetUp_SLP(NEP nep) | |
| 35 | { | ||
| 36 | 308 | NEP_SLP *ctx = (NEP_SLP*)nep->data; | |
| 37 | 308 | PetscBool flg; | |
| 38 | 308 | ST st; | |
| 39 | |||
| 40 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
308 | PetscFunctionBegin; |
| 41 |
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.
|
308 | if (nep->ncv!=PETSC_DETERMINE) PetscCall(PetscInfo(nep,"Setting ncv = nev, ignoring user-provided value\n")); |
| 42 | 308 | nep->ncv = nep->nev; | |
| 43 |
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.
|
308 | if (nep->mpd!=PETSC_DETERMINE) PetscCall(PetscInfo(nep,"Setting mpd = nev, ignoring user-provided value\n")); |
| 44 | 308 | nep->mpd = nep->nev; | |
| 45 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
308 | PetscCheck(nep->ncv<=nep->nev+nep->mpd,PetscObjectComm((PetscObject)nep),PETSC_ERR_USER_INPUT,"The value of ncv must not be larger than nev+mpd"); |
| 46 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
308 | if (nep->max_it==PETSC_DETERMINE) nep->max_it = PetscMax(5000,2*nep->n/nep->ncv); |
| 47 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
308 | if (!nep->which) nep->which = NEP_TARGET_MAGNITUDE; |
| 48 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
308 | PetscCheck(nep->which==NEP_TARGET_MAGNITUDE,PetscObjectComm((PetscObject)nep),PETSC_ERR_SUP,"This solver supports only target magnitude eigenvalues"); |
| 49 |
6/10✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
308 | NEPCheckUnsupported(nep,NEP_FEATURE_REGION); |
| 50 | |||
| 51 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
308 | if (!ctx->eps) PetscCall(NEPSLPGetEPS(nep,&ctx->eps)); |
| 52 |
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.
|
308 | PetscCall(EPSGetST(ctx->eps,&st)); |
| 53 |
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.
|
308 | PetscCall(PetscObjectTypeCompareAny((PetscObject)st,&flg,STSINVERT,STCAYLEY,"")); |
| 54 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
308 | PetscCheck(!flg,PetscObjectComm((PetscObject)nep),PETSC_ERR_SUP,"SLP does not support spectral transformation"); |
| 55 |
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.
|
308 | PetscCall(EPSSetDimensions(ctx->eps,1,PETSC_DECIDE,PETSC_DECIDE)); |
| 56 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
308 | PetscCall(EPSSetWhichEigenpairs(ctx->eps,EPS_LARGEST_MAGNITUDE)); |
| 57 |
7/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
466 | PetscCall(EPSSetTolerances(ctx->eps,SlepcDefaultTol(nep->tol)/10.0,nep->max_it)); |
| 58 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
308 | if (nep->tol==(PetscReal)PETSC_DETERMINE) nep->tol = SLEPC_DEFAULT_TOL; |
| 59 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
308 | if (ctx->deftol==(PetscReal)PETSC_DETERMINE) ctx->deftol = nep->tol; |
| 60 | |||
| 61 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
308 | if (nep->twosided) { |
| 62 | 50 | nep->ops->solve = NEPSolve_SLP_Twosided; | |
| 63 | 50 | nep->ops->computevectors = NULL; | |
| 64 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
50 | if (!ctx->epsts) PetscCall(NEPSLPGetEPSLeft(nep,&ctx->epsts)); |
| 65 |
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.
|
50 | PetscCall(EPSGetST(ctx->epsts,&st)); |
| 66 |
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.
|
50 | PetscCall(PetscObjectTypeCompareAny((PetscObject)st,&flg,STSINVERT,STCAYLEY,"")); |
| 67 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
50 | PetscCheck(!flg,PetscObjectComm((PetscObject)nep),PETSC_ERR_SUP,"SLP does not support spectral transformation"); |
| 68 |
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.
|
50 | PetscCall(EPSSetDimensions(ctx->epsts,1,PETSC_DECIDE,PETSC_DECIDE)); |
| 69 |
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.
|
50 | PetscCall(EPSSetWhichEigenpairs(ctx->epsts,EPS_LARGEST_MAGNITUDE)); |
| 70 |
6/8✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
50 | PetscCall(EPSSetTolerances(ctx->epsts,SlepcDefaultTol(nep->tol)/10.0,nep->max_it)); |
| 71 | } else { | ||
| 72 | 258 | nep->ops->solve = NEPSolve_SLP; | |
| 73 | 258 | nep->ops->computevectors = NEPComputeVectors_Schur; | |
| 74 | } | ||
| 75 |
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.
|
308 | PetscCall(NEPAllocateSolution(nep,0)); |
| 76 |
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.
|
59 | PetscFunctionReturn(PETSC_SUCCESS); |
| 77 | } | ||
| 78 | |||
| 79 | 14714 | static PetscErrorCode MatMult_SLP(Mat M,Vec x,Vec y) | |
| 80 | { | ||
| 81 | 14714 | NEP_SLP_MATSHELL *ctx; | |
| 82 | |||
| 83 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
14714 | PetscFunctionBegin; |
| 84 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
14714 | PetscCall(MatShellGetContext(M,&ctx)); |
| 85 |
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.
|
14714 | PetscCall(MatMult(ctx->extop->MJ,x,ctx->w)); |
| 86 |
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.
|
14714 | PetscCall(NEPDeflationFunctionSolve(ctx->extop,ctx->w,y)); |
| 87 |
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.
|
2811 | PetscFunctionReturn(PETSC_SUCCESS); |
| 88 | } | ||
| 89 | |||
| 90 | 258 | static PetscErrorCode MatDestroy_SLP(Mat M) | |
| 91 | { | ||
| 92 | 258 | NEP_SLP_MATSHELL *ctx; | |
| 93 | |||
| 94 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
258 | PetscFunctionBegin; |
| 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.
|
258 | PetscCall(MatShellGetContext(M,&ctx)); |
| 96 |
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.
|
258 | PetscCall(VecDestroy(&ctx->w)); |
| 97 |
5/8✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
258 | PetscCall(PetscFree(ctx)); |
| 98 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
49 | PetscFunctionReturn(PETSC_SUCCESS); |
| 99 | } | ||
| 100 | |||
| 101 | #if defined(PETSC_HAVE_CUDA) || defined(PETSC_HAVE_HIP) | ||
| 102 | 216 | static PetscErrorCode MatCreateVecs_SLP(Mat M,Vec *left,Vec *right) | |
| 103 | { | ||
| 104 | 216 | NEP_SLP_MATSHELL *ctx; | |
| 105 | |||
| 106 | 216 | PetscFunctionBegin; | |
| 107 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
|
216 | PetscCall(MatShellGetContext(M,&ctx)); |
| 108 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
216 | if (right) PetscCall(VecDuplicate(ctx->w,right)); |
| 109 |
2/4✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
|
216 | if (left) PetscCall(VecDuplicate(ctx->w,left)); |
| 110 | PetscFunctionReturn(PETSC_SUCCESS); | ||
| 111 | } | ||
| 112 | #endif | ||
| 113 | |||
| 114 | 914 | static PetscErrorCode NEPSLPSetUpLinearEP(NEP nep,NEP_EXT_OP extop,PetscScalar lambda,Vec u,PetscBool ini) | |
| 115 | { | ||
| 116 | 914 | NEP_SLP *slpctx = (NEP_SLP*)nep->data; | |
| 117 | 914 | Mat Mshell; | |
| 118 | 914 | PetscInt nloc,mloc; | |
| 119 | 914 | NEP_SLP_MATSHELL *shellctx; | |
| 120 | |||
| 121 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
914 | PetscFunctionBegin; |
| 122 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
914 | if (ini) { |
| 123 | /* Create mat shell */ | ||
| 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.
|
258 | PetscCall(PetscNew(&shellctx)); |
| 125 | 258 | shellctx->extop = extop; | |
| 126 |
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.
|
258 | PetscCall(NEPDeflationCreateVec(extop,&shellctx->w)); |
| 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.
|
258 | PetscCall(MatGetLocalSize(nep->function,&mloc,&nloc)); |
| 128 | 258 | nloc += extop->szd; mloc += extop->szd; | |
| 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.
|
258 | PetscCall(MatCreateShell(PetscObjectComm((PetscObject)nep),nloc,mloc,PETSC_DETERMINE,PETSC_DETERMINE,shellctx,&Mshell)); |
| 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.
|
258 | PetscCall(MatShellSetOperation(Mshell,MATOP_MULT,(PetscErrorCodeFn*)MatMult_SLP)); |
| 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.
|
258 | PetscCall(MatShellSetOperation(Mshell,MATOP_DESTROY,(PetscErrorCodeFn*)MatDestroy_SLP)); |
| 132 | #if defined(PETSC_HAVE_CUDA) || defined(PETSC_HAVE_HIP) | ||
| 133 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
|
106 | PetscCall(MatShellSetOperation(Mshell,MATOP_CREATE_VECS,(PetscErrorCodeFn*)MatCreateVecs_SLP)); |
| 134 | #endif | ||
| 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.
|
258 | PetscCall(EPSSetOperators(slpctx->eps,Mshell,NULL)); |
| 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.
|
258 | PetscCall(MatDestroy(&Mshell)); |
| 137 | } | ||
| 138 |
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.
|
914 | PetscCall(NEPDeflationSolveSetUp(extop,lambda)); |
| 139 |
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.
|
914 | PetscCall(NEPDeflationComputeJacobian(extop,lambda,NULL)); |
| 140 |
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.
|
914 | PetscCall(EPSSetInitialSpace(slpctx->eps,1,&u)); |
| 141 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
171 | PetscFunctionReturn(PETSC_SUCCESS); |
| 142 | } | ||
| 143 | |||
| 144 | 258 | PetscErrorCode NEPSolve_SLP(NEP nep) | |
| 145 | { | ||
| 146 | 258 | NEP_SLP *ctx = (NEP_SLP*)nep->data; | |
| 147 | 258 | Mat F,H,A; | |
| 148 | 258 | Vec uu,u,r; | |
| 149 | 258 | PetscScalar sigma,lambda,mu,im; | |
| 150 | 258 | PetscReal resnorm; | |
| 151 | 258 | PetscInt nconv; | |
| 152 | 258 | PetscBool skip=PETSC_FALSE,lock=PETSC_FALSE; | |
| 153 | 258 | NEP_EXT_OP extop=NULL; /* Extended operator for deflation */ | |
| 154 | |||
| 155 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
258 | PetscFunctionBegin; |
| 156 | /* get initial approximation of eigenvalue and eigenvector */ | ||
| 157 |
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.
|
258 | PetscCall(NEPGetDefaultShift(nep,&sigma)); |
| 158 |
5/8✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
258 | if (!nep->nini) PetscCall(BVSetRandomColumn(nep->V,0)); |
| 159 | 258 | lambda = sigma; | |
| 160 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
258 | if (!ctx->ksp) PetscCall(NEPSLPGetKSP(nep,&ctx->ksp)); |
| 161 |
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.
|
258 | PetscCall(NEPDeflationInitialize(nep,nep->V,ctx->ksp,PETSC_TRUE,nep->nev,&extop)); |
| 162 |
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.
|
258 | PetscCall(NEPDeflationCreateVec(extop,&u)); |
| 163 |
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.
|
258 | PetscCall(VecDuplicate(u,&r)); |
| 164 |
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.
|
258 | PetscCall(BVGetColumn(nep->V,0,&uu)); |
| 165 |
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.
|
258 | PetscCall(NEPDeflationCopyToExtendedVec(extop,uu,NULL,u,PETSC_FALSE)); |
| 166 |
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.
|
258 | PetscCall(BVRestoreColumn(nep->V,0,&uu)); |
| 167 | |||
| 168 | /* Restart loop */ | ||
| 169 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1626 | while (nep->reason == NEP_CONVERGED_ITERATING) { |
| 170 | 1368 | nep->its++; | |
| 171 | |||
| 172 | /* form residual, r = T(lambda)*u (used in convergence test only) */ | ||
| 173 |
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.
|
1368 | PetscCall(NEPDeflationComputeFunction(extop,lambda,&F)); |
| 174 |
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.
|
1368 | PetscCall(MatMult(F,u,r)); |
| 175 | |||
| 176 | /* convergence test */ | ||
| 177 |
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.
|
1368 | PetscCall(VecNorm(r,NORM_2,&resnorm)); |
| 178 |
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.
|
1368 | PetscCall((*nep->converged)(nep,lambda,0,resnorm,&nep->errest[nep->nconv],nep->convergedctx)); |
| 179 | 1368 | nep->eigr[nep->nconv] = lambda; | |
| 180 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
|
1368 | if (nep->errest[nep->nconv]<=nep->tol || nep->errest[nep->nconv]<=ctx->deftol) { |
| 181 |
4/6✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
|
454 | if (nep->errest[nep->nconv]<=ctx->deftol && !extop->ref && nep->nconv) { |
| 182 |
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.
|
196 | PetscCall(NEPDeflationExtractEigenpair(extop,nep->nconv,u,lambda,nep->ds)); |
| 183 |
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.
|
196 | PetscCall(NEPDeflationSetRefine(extop,PETSC_TRUE)); |
| 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.
|
196 | PetscCall(MatMult(F,u,r)); |
| 185 |
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.
|
196 | PetscCall(VecNorm(r,NORM_2,&resnorm)); |
| 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.
|
196 | PetscCall((*nep->converged)(nep,lambda,0,resnorm,&nep->errest[nep->nconv],nep->convergedctx)); |
| 187 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
196 | if (nep->errest[nep->nconv]<=nep->tol) lock = PETSC_TRUE; |
| 188 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
258 | } else if (nep->errest[nep->nconv]<=nep->tol) lock = PETSC_TRUE; |
| 189 | } | ||
| 190 | |||
| 191 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
914 | if (lock) { |
| 192 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
454 | PetscCall(NEPDeflationSetRefine(extop,PETSC_FALSE)); |
| 193 | 454 | nep->nconv = nep->nconv + 1; | |
| 194 | 454 | skip = PETSC_TRUE; | |
| 195 | 454 | lock = PETSC_FALSE; | |
| 196 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
454 | PetscCall(NEPDeflationLocking(extop,u,lambda)); |
| 197 | } | ||
| 198 |
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.
|
1368 | PetscCall((*nep->stopping)(nep,nep->its,nep->max_it,nep->nconv,nep->nev,&nep->reason,nep->stoppingctx)); |
| 199 |
11/12✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
1368 | if (!skip || nep->reason>0) PetscCall(NEPMonitor(nep,nep->its,nep->nconv,nep->eigr,nep->eigi,nep->errest,(nep->reason>0)?nep->nconv:nep->nconv+1)); |
| 200 | |||
| 201 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1368 | if (nep->reason == NEP_CONVERGED_ITERATING) { |
| 202 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1110 | if (!skip) { |
| 203 | /* evaluate T(lambda) and T'(lambda) */ | ||
| 204 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
914 | PetscCall(NEPSLPSetUpLinearEP(nep,extop,lambda,u,nep->its==1?PETSC_TRUE:PETSC_FALSE)); |
| 205 | /* compute new eigenvalue correction mu and eigenvector approximation u */ | ||
| 206 |
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.
|
914 | PetscCall(EPSSolve(ctx->eps)); |
| 207 |
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.
|
914 | PetscCall(EPSGetConverged(ctx->eps,&nconv)); |
| 208 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
914 | if (!nconv) { |
| 209 | ✗ | PetscCall(PetscInfo(nep,"iter=%" PetscInt_FMT ", inner iteration failed, stopping solve\n",nep->its)); | |
| 210 | ✗ | nep->reason = NEP_DIVERGED_LINEAR_SOLVE; | |
| 211 | ✗ | break; | |
| 212 | } | ||
| 213 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
914 | PetscCall(EPSGetEigenpair(ctx->eps,0,&mu,&im,u,NULL)); |
| 214 | 914 | mu = 1.0/mu; | |
| 215 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
914 | PetscCheck(PetscAbsScalar(im)<PETSC_MACHINE_EPSILON,PetscObjectComm((PetscObject)nep),PETSC_ERR_SUP,"Complex eigenvalue approximation - not implemented in real scalars"); |
| 216 | } else { | ||
| 217 | 196 | nep->its--; /* do not count this as a full iteration */ | |
| 218 | /* use second eigenpair computed in previous iteration */ | ||
| 219 |
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.
|
196 | PetscCall(EPSGetConverged(ctx->eps,&nconv)); |
| 220 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
196 | if (nconv>=2) { |
| 221 |
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.
|
196 | PetscCall(EPSGetEigenpair(ctx->eps,1,&mu,&im,u,NULL)); |
| 222 | 196 | mu = 1.0/mu; | |
| 223 | } else { | ||
| 224 | ✗ | PetscCall(NEPDeflationSetRandomVec(extop,u)); | |
| 225 | ✗ | mu = lambda-sigma; | |
| 226 | } | ||
| 227 | skip = PETSC_FALSE; | ||
| 228 | } | ||
| 229 | /* correct eigenvalue */ | ||
| 230 | 1110 | lambda = lambda - mu; | |
| 231 | } | ||
| 232 | } | ||
| 233 |
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.
|
258 | PetscCall(NEPDeflationGetInvariantPair(extop,NULL,&H)); |
| 234 |
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.
|
258 | PetscCall(DSSetType(nep->ds,DSNHEP)); |
| 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.
|
258 | PetscCall(DSAllocate(nep->ds,PetscMax(nep->nconv,1))); |
| 236 |
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.
|
258 | PetscCall(DSSetDimensions(nep->ds,nep->nconv,0,nep->nconv)); |
| 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.
|
258 | PetscCall(DSGetMat(nep->ds,DS_MAT_A,&A)); |
| 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.
|
258 | PetscCall(MatCopy(H,A,SAME_NONZERO_PATTERN)); |
| 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.
|
258 | PetscCall(DSRestoreMat(nep->ds,DS_MAT_A,&A)); |
| 240 |
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.
|
258 | PetscCall(MatDestroy(&H)); |
| 241 |
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.
|
258 | PetscCall(DSSolve(nep->ds,nep->eigr,nep->eigi)); |
| 242 |
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.
|
258 | PetscCall(NEPDeflationReset(extop)); |
| 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.
|
258 | PetscCall(VecDestroy(&u)); |
| 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.
|
258 | PetscCall(VecDestroy(&r)); |
| 245 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
49 | PetscFunctionReturn(PETSC_SUCCESS); |
| 246 | } | ||
| 247 | |||
| 248 | 268 | static PetscErrorCode NEPSetFromOptions_SLP(NEP nep,PetscOptionItems PetscOptionsObject) | |
| 249 | { | ||
| 250 | 268 | NEP_SLP *ctx = (NEP_SLP*)nep->data; | |
| 251 | 268 | PetscBool flg; | |
| 252 | 268 | PetscReal r; | |
| 253 | |||
| 254 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
268 | PetscFunctionBegin; |
| 255 |
1/12✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
268 | PetscOptionsHeadBegin(PetscOptionsObject,"NEP SLP Options"); |
| 256 | |||
| 257 | 268 | r = 0.0; | |
| 258 |
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.
|
268 | PetscCall(PetscOptionsReal("-nep_slp_deflation_threshold","Tolerance used as a threshold for including deflated eigenpairs","NEPSLPSetDeflationThreshold",ctx->deftol,&r,&flg)); |
| 259 |
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.
|
268 | if (flg) PetscCall(NEPSLPSetDeflationThreshold(nep,r)); |
| 260 | |||
| 261 |
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.
|
268 | PetscOptionsHeadEnd(); |
| 262 | |||
| 263 |
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.
|
268 | if (!ctx->eps) PetscCall(NEPSLPGetEPS(nep,&ctx->eps)); |
| 264 |
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.
|
268 | PetscCall(EPSSetFromOptions(ctx->eps)); |
| 265 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
268 | if (nep->twosided) { |
| 266 |
5/8✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
50 | if (!ctx->epsts) PetscCall(NEPSLPGetEPSLeft(nep,&ctx->epsts)); |
| 267 |
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.
|
50 | PetscCall(EPSSetFromOptions(ctx->epsts)); |
| 268 | } | ||
| 269 |
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.
|
268 | if (!ctx->ksp) PetscCall(NEPSLPGetKSP(nep,&ctx->ksp)); |
| 270 |
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.
|
268 | PetscCall(KSPSetFromOptions(ctx->ksp)); |
| 271 |
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.
|
51 | PetscFunctionReturn(PETSC_SUCCESS); |
| 272 | } | ||
| 273 | |||
| 274 | 30 | static PetscErrorCode NEPSLPSetDeflationThreshold_SLP(NEP nep,PetscReal deftol) | |
| 275 | { | ||
| 276 | 30 | NEP_SLP *ctx = (NEP_SLP*)nep->data; | |
| 277 | |||
| 278 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
30 | PetscFunctionBegin; |
| 279 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
30 | if (deftol == (PetscReal)PETSC_DEFAULT || deftol == (PetscReal)PETSC_DECIDE) { |
| 280 | ✗ | ctx->deftol = PETSC_DETERMINE; | |
| 281 | ✗ | nep->state = NEP_STATE_INITIAL; | |
| 282 | } else { | ||
| 283 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
30 | PetscCheck(deftol>0.0,PetscObjectComm((PetscObject)nep),PETSC_ERR_ARG_OUTOFRANGE,"Illegal value of deftol. Must be > 0"); |
| 284 | 30 | ctx->deftol = deftol; | |
| 285 | } | ||
| 286 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
6 | PetscFunctionReturn(PETSC_SUCCESS); |
| 287 | } | ||
| 288 | |||
| 289 | /*@ | ||
| 290 | NEPSLPSetDeflationThreshold - Sets the threshold value used to switch between | ||
| 291 | deflated and non-deflated iteration. | ||
| 292 | |||
| 293 | Logically Collective | ||
| 294 | |||
| 295 | Input Parameters: | ||
| 296 | + nep - the nonlinear eigensolver context | ||
| 297 | - deftol - the threshold value | ||
| 298 | |||
| 299 | Options Database Key: | ||
| 300 | . -nep_slp_deflation_threshold \<deftol\> - set the threshold | ||
| 301 | |||
| 302 | Notes: | ||
| 303 | Normally, the solver iterates on the extended problem in order to deflate | ||
| 304 | previously converged eigenpairs. If this threshold is set to a nonzero value, | ||
| 305 | then once the residual error is below this threshold the solver will | ||
| 306 | continue the iteration without deflation. The intention is to be able to | ||
| 307 | improve the current eigenpair further, despite having previous eigenpairs | ||
| 308 | with somewhat bad precision. | ||
| 309 | |||
| 310 | Level: advanced | ||
| 311 | |||
| 312 | .seealso: [](ch:nep), `NEPSLP`, `NEPSLPGetDeflationThreshold()` | ||
| 313 | @*/ | ||
| 314 | 30 | PetscErrorCode NEPSLPSetDeflationThreshold(NEP nep,PetscReal deftol) | |
| 315 | { | ||
| 316 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
30 | PetscFunctionBegin; |
| 317 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
30 | PetscValidHeaderSpecific(nep,NEP_CLASSID,1); |
| 318 |
29/66✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✓ Branch 26 taken 2 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✓ Branch 30 taken 2 times.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✓ Branch 33 taken 2 times.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 2 times.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✓ Branch 39 taken 2 times.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✓ Branch 47 taken 2 times.
✓ Branch 48 taken 2 times.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✓ Branch 51 taken 2 times.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 2 times.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✓ Branch 57 taken 2 times.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✓ Branch 60 taken 2 times.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✓ Branch 63 taken 2 times.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
|
30 | PetscValidLogicalCollectiveReal(nep,deftol,2); |
| 319 |
8/14✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
|
30 | PetscTryMethod(nep,"NEPSLPSetDeflationThreshold_C",(NEP,PetscReal),(nep,deftol)); |
| 320 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
30 | PetscFunctionReturn(PETSC_SUCCESS); |
| 321 | } | ||
| 322 | |||
| 323 | 10 | static PetscErrorCode NEPSLPGetDeflationThreshold_SLP(NEP nep,PetscReal *deftol) | |
| 324 | { | ||
| 325 | 10 | NEP_SLP *ctx = (NEP_SLP*)nep->data; | |
| 326 | |||
| 327 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
10 | PetscFunctionBegin; |
| 328 | 10 | *deftol = ctx->deftol; | |
| 329 |
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.
|
10 | PetscFunctionReturn(PETSC_SUCCESS); |
| 330 | } | ||
| 331 | |||
| 332 | /*@ | ||
| 333 | NEPSLPGetDeflationThreshold - Returns the threshold value that controls deflation. | ||
| 334 | |||
| 335 | Not Collective | ||
| 336 | |||
| 337 | Input Parameter: | ||
| 338 | . nep - the nonlinear eigensolver context | ||
| 339 | |||
| 340 | Output Parameter: | ||
| 341 | . deftol - the threshold | ||
| 342 | |||
| 343 | Level: advanced | ||
| 344 | |||
| 345 | .seealso: [](ch:nep), `NEPSLP`, `NEPSLPSetDeflationThreshold()` | ||
| 346 | @*/ | ||
| 347 | 10 | PetscErrorCode NEPSLPGetDeflationThreshold(NEP nep,PetscReal *deftol) | |
| 348 | { | ||
| 349 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
10 | PetscFunctionBegin; |
| 350 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
10 | PetscValidHeaderSpecific(nep,NEP_CLASSID,1); |
| 351 |
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.
|
10 | PetscAssertPointer(deftol,2); |
| 352 |
9/16✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
|
10 | PetscUseMethod(nep,"NEPSLPGetDeflationThreshold_C",(NEP,PetscReal*),(nep,deftol)); |
| 353 |
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.
|
10 | PetscFunctionReturn(PETSC_SUCCESS); |
| 354 | } | ||
| 355 | |||
| 356 | 20 | static PetscErrorCode NEPSLPSetEPS_SLP(NEP nep,EPS eps) | |
| 357 | { | ||
| 358 | 20 | NEP_SLP *ctx = (NEP_SLP*)nep->data; | |
| 359 | |||
| 360 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
20 | PetscFunctionBegin; |
| 361 |
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.
|
20 | PetscCall(PetscObjectReference((PetscObject)eps)); |
| 362 |
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.
|
20 | PetscCall(EPSDestroy(&ctx->eps)); |
| 363 | 20 | ctx->eps = eps; | |
| 364 | 20 | nep->state = NEP_STATE_INITIAL; | |
| 365 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
20 | PetscFunctionReturn(PETSC_SUCCESS); |
| 366 | } | ||
| 367 | |||
| 368 | /*@ | ||
| 369 | NEPSLPSetEPS - Associate a linear eigensolver object (`EPS`) to the | ||
| 370 | nonlinear eigenvalue solver. | ||
| 371 | |||
| 372 | Collective | ||
| 373 | |||
| 374 | Input Parameters: | ||
| 375 | + nep - the nonlinear eigensolver context | ||
| 376 | - eps - the linear eigensolver context | ||
| 377 | |||
| 378 | Level: advanced | ||
| 379 | |||
| 380 | .seealso: [](ch:nep), `NEPSLP`, `NEPSLPGetEPS()` | ||
| 381 | @*/ | ||
| 382 | 20 | PetscErrorCode NEPSLPSetEPS(NEP nep,EPS eps) | |
| 383 | { | ||
| 384 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
20 | PetscFunctionBegin; |
| 385 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
20 | PetscValidHeaderSpecific(nep,NEP_CLASSID,1); |
| 386 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
20 | PetscValidHeaderSpecific(eps,EPS_CLASSID,2); |
| 387 |
13/32✓ 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 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.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
|
20 | PetscCheckSameComm(nep,1,eps,2); |
| 388 |
8/14✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
|
20 | PetscTryMethod(nep,"NEPSLPSetEPS_C",(NEP,EPS),(nep,eps)); |
| 389 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
20 | PetscFunctionReturn(PETSC_SUCCESS); |
| 390 | } | ||
| 391 | |||
| 392 | 248 | static PetscErrorCode NEPSLPGetEPS_SLP(NEP nep,EPS *eps) | |
| 393 | { | ||
| 394 | 248 | NEP_SLP *ctx = (NEP_SLP*)nep->data; | |
| 395 | |||
| 396 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
248 | PetscFunctionBegin; |
| 397 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
248 | if (!ctx->eps) { |
| 398 |
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.
|
248 | PetscCall(EPSCreate(PetscObjectComm((PetscObject)nep),&ctx->eps)); |
| 399 |
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.
|
248 | PetscCall(PetscObjectIncrementTabLevel((PetscObject)ctx->eps,(PetscObject)nep,1)); |
| 400 |
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.
|
248 | PetscCall(EPSSetOptionsPrefix(ctx->eps,((PetscObject)nep)->prefix)); |
| 401 |
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.
|
248 | PetscCall(EPSAppendOptionsPrefix(ctx->eps,"nep_slp_")); |
| 402 |
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.
|
248 | PetscCall(PetscObjectSetOptions((PetscObject)ctx->eps,((PetscObject)nep)->options)); |
| 403 | } | ||
| 404 | 248 | *eps = ctx->eps; | |
| 405 |
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.
|
248 | PetscFunctionReturn(PETSC_SUCCESS); |
| 406 | } | ||
| 407 | |||
| 408 | /*@ | ||
| 409 | NEPSLPGetEPS - Retrieve the linear eigensolver object (`EPS`) associated | ||
| 410 | to the nonlinear eigenvalue solver. | ||
| 411 | |||
| 412 | Collective | ||
| 413 | |||
| 414 | Input Parameter: | ||
| 415 | . nep - the nonlinear eigensolver context | ||
| 416 | |||
| 417 | Output Parameter: | ||
| 418 | . eps - the linear eigensolver context | ||
| 419 | |||
| 420 | Level: advanced | ||
| 421 | |||
| 422 | .seealso: [](ch:nep), `NEPSLP`, `NEPSLPSetEPS()` | ||
| 423 | @*/ | ||
| 424 | 248 | PetscErrorCode NEPSLPGetEPS(NEP nep,EPS *eps) | |
| 425 | { | ||
| 426 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
248 | PetscFunctionBegin; |
| 427 |
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.
|
248 | PetscValidHeaderSpecific(nep,NEP_CLASSID,1); |
| 428 |
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.
|
248 | PetscAssertPointer(eps,2); |
| 429 |
9/16✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
|
248 | PetscUseMethod(nep,"NEPSLPGetEPS_C",(NEP,EPS*),(nep,eps)); |
| 430 |
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.
|
248 | PetscFunctionReturn(PETSC_SUCCESS); |
| 431 | } | ||
| 432 | |||
| 433 | ✗ | static PetscErrorCode NEPSLPSetEPSLeft_SLP(NEP nep,EPS eps) | |
| 434 | { | ||
| 435 | ✗ | NEP_SLP *ctx = (NEP_SLP*)nep->data; | |
| 436 | |||
| 437 | ✗ | PetscFunctionBegin; | |
| 438 | ✗ | PetscCall(PetscObjectReference((PetscObject)eps)); | |
| 439 | ✗ | PetscCall(EPSDestroy(&ctx->epsts)); | |
| 440 | ✗ | ctx->epsts = eps; | |
| 441 | ✗ | nep->state = NEP_STATE_INITIAL; | |
| 442 | ✗ | PetscFunctionReturn(PETSC_SUCCESS); | |
| 443 | } | ||
| 444 | |||
| 445 | /*@ | ||
| 446 | NEPSLPSetEPSLeft - Associate a linear eigensolver object (`EPS`) to the | ||
| 447 | nonlinear eigenvalue solver, used to compute left eigenvectors in the | ||
| 448 | two-sided variant of SLP. | ||
| 449 | |||
| 450 | Collective | ||
| 451 | |||
| 452 | Input Parameters: | ||
| 453 | + nep - the nonlinear eigensolver context | ||
| 454 | - eps - the linear eigensolver context | ||
| 455 | |||
| 456 | Level: advanced | ||
| 457 | |||
| 458 | .seealso: [](ch:nep), `NEPSLP`, `NEPSLPGetEPSLeft()`, `NEPSetTwoSided()` | ||
| 459 | @*/ | ||
| 460 | ✗ | PetscErrorCode NEPSLPSetEPSLeft(NEP nep,EPS eps) | |
| 461 | { | ||
| 462 | ✗ | PetscFunctionBegin; | |
| 463 | ✗ | PetscValidHeaderSpecific(nep,NEP_CLASSID,1); | |
| 464 | ✗ | PetscValidHeaderSpecific(eps,EPS_CLASSID,2); | |
| 465 | ✗ | PetscCheckSameComm(nep,1,eps,2); | |
| 466 | ✗ | PetscTryMethod(nep,"NEPSLPSetEPSLeft_C",(NEP,EPS),(nep,eps)); | |
| 467 | ✗ | PetscFunctionReturn(PETSC_SUCCESS); | |
| 468 | } | ||
| 469 | |||
| 470 | 50 | static PetscErrorCode NEPSLPGetEPSLeft_SLP(NEP nep,EPS *eps) | |
| 471 | { | ||
| 472 | 50 | NEP_SLP *ctx = (NEP_SLP*)nep->data; | |
| 473 | |||
| 474 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
50 | PetscFunctionBegin; |
| 475 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
50 | if (!ctx->epsts) { |
| 476 |
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.
|
50 | PetscCall(EPSCreate(PetscObjectComm((PetscObject)nep),&ctx->epsts)); |
| 477 |
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.
|
50 | PetscCall(PetscObjectIncrementTabLevel((PetscObject)ctx->epsts,(PetscObject)nep,1)); |
| 478 |
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.
|
50 | PetscCall(EPSSetOptionsPrefix(ctx->epsts,((PetscObject)nep)->prefix)); |
| 479 |
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.
|
50 | PetscCall(EPSAppendOptionsPrefix(ctx->epsts,"nep_slp_left_")); |
| 480 |
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.
|
50 | PetscCall(PetscObjectSetOptions((PetscObject)ctx->epsts,((PetscObject)nep)->options)); |
| 481 | } | ||
| 482 | 50 | *eps = ctx->epsts; | |
| 483 |
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.
|
50 | PetscFunctionReturn(PETSC_SUCCESS); |
| 484 | } | ||
| 485 | |||
| 486 | /*@ | ||
| 487 | NEPSLPGetEPSLeft - Retrieve the linear eigensolver object (`EPS`) associated | ||
| 488 | to the nonlinear eigenvalue solver, used to compute left eigenvectors in the | ||
| 489 | two-sided variant of SLP. | ||
| 490 | |||
| 491 | Collective | ||
| 492 | |||
| 493 | Input Parameter: | ||
| 494 | . nep - the nonlinear eigensolver context | ||
| 495 | |||
| 496 | Output Parameter: | ||
| 497 | . eps - the linear eigensolver context | ||
| 498 | |||
| 499 | Level: advanced | ||
| 500 | |||
| 501 | .seealso: [](ch:nep), `NEPSLP`, `NEPSLPSetEPSLeft()`, `NEPSetTwoSided()` | ||
| 502 | @*/ | ||
| 503 | 50 | PetscErrorCode NEPSLPGetEPSLeft(NEP nep,EPS *eps) | |
| 504 | { | ||
| 505 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
50 | PetscFunctionBegin; |
| 506 |
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.
|
50 | PetscValidHeaderSpecific(nep,NEP_CLASSID,1); |
| 507 |
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.
|
50 | PetscAssertPointer(eps,2); |
| 508 |
9/16✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
|
50 | PetscUseMethod(nep,"NEPSLPGetEPSLeft_C",(NEP,EPS*),(nep,eps)); |
| 509 |
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.
|
50 | PetscFunctionReturn(PETSC_SUCCESS); |
| 510 | } | ||
| 511 | |||
| 512 | 20 | static PetscErrorCode NEPSLPSetKSP_SLP(NEP nep,KSP ksp) | |
| 513 | { | ||
| 514 | 20 | NEP_SLP *ctx = (NEP_SLP*)nep->data; | |
| 515 | |||
| 516 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
20 | PetscFunctionBegin; |
| 517 |
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.
|
20 | PetscCall(PetscObjectReference((PetscObject)ksp)); |
| 518 |
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.
|
20 | PetscCall(KSPDestroy(&ctx->ksp)); |
| 519 | 20 | ctx->ksp = ksp; | |
| 520 | 20 | nep->state = NEP_STATE_INITIAL; | |
| 521 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
20 | PetscFunctionReturn(PETSC_SUCCESS); |
| 522 | } | ||
| 523 | |||
| 524 | /*@ | ||
| 525 | NEPSLPSetKSP - Associate a linear solver object (`KSP`) to the nonlinear | ||
| 526 | eigenvalue solver. | ||
| 527 | |||
| 528 | Collective | ||
| 529 | |||
| 530 | Input Parameters: | ||
| 531 | + nep - the nonlinear eigensolver context | ||
| 532 | - ksp - the linear solver object | ||
| 533 | |||
| 534 | Note: | ||
| 535 | This `KSP` object is used only for deflation, when computing more that | ||
| 536 | one eigenpair. | ||
| 537 | |||
| 538 | Level: advanced | ||
| 539 | |||
| 540 | .seealso: [](ch:nep), `NEPSLP`, `NEPSLPGetKSP()` | ||
| 541 | @*/ | ||
| 542 | 20 | PetscErrorCode NEPSLPSetKSP(NEP nep,KSP ksp) | |
| 543 | { | ||
| 544 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
20 | PetscFunctionBegin; |
| 545 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
20 | PetscValidHeaderSpecific(nep,NEP_CLASSID,1); |
| 546 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
20 | PetscValidHeaderSpecific(ksp,KSP_CLASSID,2); |
| 547 |
13/32✓ 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 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.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
|
20 | PetscCheckSameComm(nep,1,ksp,2); |
| 548 |
8/14✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
|
20 | PetscTryMethod(nep,"NEPSLPSetKSP_C",(NEP,KSP),(nep,ksp)); |
| 549 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
20 | PetscFunctionReturn(PETSC_SUCCESS); |
| 550 | } | ||
| 551 | |||
| 552 | 248 | static PetscErrorCode NEPSLPGetKSP_SLP(NEP nep,KSP *ksp) | |
| 553 | { | ||
| 554 | 248 | NEP_SLP *ctx = (NEP_SLP*)nep->data; | |
| 555 | |||
| 556 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
248 | PetscFunctionBegin; |
| 557 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
248 | if (!ctx->ksp) { |
| 558 |
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.
|
248 | PetscCall(KSPCreate(PetscObjectComm((PetscObject)nep),&ctx->ksp)); |
| 559 |
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.
|
248 | PetscCall(PetscObjectIncrementTabLevel((PetscObject)ctx->ksp,(PetscObject)nep,1)); |
| 560 |
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.
|
248 | PetscCall(KSPSetOptionsPrefix(ctx->ksp,((PetscObject)nep)->prefix)); |
| 561 |
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.
|
248 | PetscCall(KSPAppendOptionsPrefix(ctx->ksp,"nep_slp_")); |
| 562 |
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.
|
248 | PetscCall(PetscObjectSetOptions((PetscObject)ctx->ksp,((PetscObject)nep)->options)); |
| 563 |
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.
|
248 | PetscCall(KSPSetErrorIfNotConverged(ctx->ksp,PETSC_TRUE)); |
| 564 |
7/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
386 | PetscCall(KSPSetTolerances(ctx->ksp,SlepcDefaultTol(nep->tol),PETSC_CURRENT,PETSC_CURRENT,PETSC_CURRENT)); |
| 565 | } | ||
| 566 | 248 | *ksp = ctx->ksp; | |
| 567 |
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.
|
248 | PetscFunctionReturn(PETSC_SUCCESS); |
| 568 | } | ||
| 569 | |||
| 570 | /*@ | ||
| 571 | NEPSLPGetKSP - Retrieve the linear solver object (`KSP`) associated with | ||
| 572 | the nonlinear eigenvalue solver. | ||
| 573 | |||
| 574 | Collective | ||
| 575 | |||
| 576 | Input Parameter: | ||
| 577 | . nep - the nonlinear eigensolver context | ||
| 578 | |||
| 579 | Output Parameter: | ||
| 580 | . ksp - the linear solver object | ||
| 581 | |||
| 582 | Note: | ||
| 583 | This `KSP` object is used only for deflation, when computing more that | ||
| 584 | one eigenpair. | ||
| 585 | |||
| 586 | Level: advanced | ||
| 587 | |||
| 588 | .seealso: [](ch:nep), `NEPSLP`, `NEPSLPSetKSP()` | ||
| 589 | @*/ | ||
| 590 | 248 | PetscErrorCode NEPSLPGetKSP(NEP nep,KSP *ksp) | |
| 591 | { | ||
| 592 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
248 | PetscFunctionBegin; |
| 593 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
248 | PetscValidHeaderSpecific(nep,NEP_CLASSID,1); |
| 594 |
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.
|
248 | PetscAssertPointer(ksp,2); |
| 595 |
9/16✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
|
248 | PetscUseMethod(nep,"NEPSLPGetKSP_C",(NEP,KSP*),(nep,ksp)); |
| 596 |
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.
|
248 | PetscFunctionReturn(PETSC_SUCCESS); |
| 597 | } | ||
| 598 | |||
| 599 | 10 | static PetscErrorCode NEPView_SLP(NEP nep,PetscViewer viewer) | |
| 600 | { | ||
| 601 | 10 | NEP_SLP *ctx = (NEP_SLP*)nep->data; | |
| 602 | 10 | PetscBool isascii; | |
| 603 | |||
| 604 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
10 | PetscFunctionBegin; |
| 605 |
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(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii)); |
| 606 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10 | if (isascii) { |
| 607 |
5/8✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
10 | if (ctx->deftol) PetscCall(PetscViewerASCIIPrintf(viewer," deflation threshold: %g\n",(double)ctx->deftol)); |
| 608 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
10 | if (!ctx->eps) PetscCall(NEPSLPGetEPS(nep,&ctx->eps)); |
| 609 |
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(PetscViewerASCIIPushTab(viewer)); |
| 610 |
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(EPSView(ctx->eps,viewer)); |
| 611 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
10 | if (nep->twosided) { |
| 612 | ✗ | if (!ctx->epsts) PetscCall(NEPSLPGetEPSLeft(nep,&ctx->epsts)); | |
| 613 | ✗ | PetscCall(EPSView(ctx->epsts,viewer)); | |
| 614 | } | ||
| 615 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
10 | if (!ctx->ksp) PetscCall(NEPSLPGetKSP(nep,&ctx->ksp)); |
| 616 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(KSPView(ctx->ksp,viewer)); |
| 617 |
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(PetscViewerASCIIPopTab(viewer)); |
| 618 | } | ||
| 619 |
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); |
| 620 | } | ||
| 621 | |||
| 622 | 308 | static PetscErrorCode NEPReset_SLP(NEP nep) | |
| 623 | { | ||
| 624 | 308 | NEP_SLP *ctx = (NEP_SLP*)nep->data; | |
| 625 | |||
| 626 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
308 | PetscFunctionBegin; |
| 627 |
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.
|
308 | PetscCall(EPSReset(ctx->eps)); |
| 628 |
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.
|
308 | if (nep->twosided) PetscCall(EPSReset(ctx->epsts)); |
| 629 |
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.
|
308 | PetscCall(KSPReset(ctx->ksp)); |
| 630 |
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.
|
59 | PetscFunctionReturn(PETSC_SUCCESS); |
| 631 | } | ||
| 632 | |||
| 633 | 268 | static PetscErrorCode NEPDestroy_SLP(NEP nep) | |
| 634 | { | ||
| 635 | 268 | NEP_SLP *ctx = (NEP_SLP*)nep->data; | |
| 636 | |||
| 637 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
268 | PetscFunctionBegin; |
| 638 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
268 | PetscCall(KSPDestroy(&ctx->ksp)); |
| 639 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
268 | PetscCall(EPSDestroy(&ctx->eps)); |
| 640 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
268 | PetscCall(EPSDestroy(&ctx->epsts)); |
| 641 |
5/8✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
268 | PetscCall(PetscFree(nep->data)); |
| 642 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
268 | PetscCall(PetscObjectComposeFunction((PetscObject)nep,"NEPSLPSetDeflationThreshold_C",NULL)); |
| 643 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
268 | PetscCall(PetscObjectComposeFunction((PetscObject)nep,"NEPSLPGetDeflationThreshold_C",NULL)); |
| 644 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
268 | PetscCall(PetscObjectComposeFunction((PetscObject)nep,"NEPSLPSetEPS_C",NULL)); |
| 645 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
268 | PetscCall(PetscObjectComposeFunction((PetscObject)nep,"NEPSLPGetEPS_C",NULL)); |
| 646 |
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.
|
268 | PetscCall(PetscObjectComposeFunction((PetscObject)nep,"NEPSLPSetEPSLeft_C",NULL)); |
| 647 |
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.
|
268 | PetscCall(PetscObjectComposeFunction((PetscObject)nep,"NEPSLPGetEPSLeft_C",NULL)); |
| 648 |
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.
|
268 | PetscCall(PetscObjectComposeFunction((PetscObject)nep,"NEPSLPSetKSP_C",NULL)); |
| 649 |
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.
|
268 | PetscCall(PetscObjectComposeFunction((PetscObject)nep,"NEPSLPGetKSP_C",NULL)); |
| 650 |
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.
|
51 | PetscFunctionReturn(PETSC_SUCCESS); |
| 651 | } | ||
| 652 | |||
| 653 | /*MC | ||
| 654 | NEPSLP - NEPSLP = "slp" - Successive Linear Problems method. | ||
| 655 | |||
| 656 | Notes: | ||
| 657 | This solver is based on the classical Successive Linear Problems | ||
| 658 | (SLP) method proposed by {cite:t}`Ruh73`. At each step, this | ||
| 659 | method has to solve a linear eigenvalue problem. Call | ||
| 660 | `NEPSLPGetEPS()` to configure the `EPS` object used for this. | ||
| 661 | |||
| 662 | `NEPSLP` supports computing left eigenvectors when `NEPSetTwoSided()` | ||
| 663 | has been set. In that case, a different `EPS` is used for the left | ||
| 664 | recurrence, see `NEPSLPGetEPSLeft()`. | ||
| 665 | |||
| 666 | The solver incorporates deflation, so that several eigenpairs con be | ||
| 667 | computed. Details of the implementation in SLEPc can be found in | ||
| 668 | {cite:p}`Cam21`. | ||
| 669 | |||
| 670 | Level: beginner | ||
| 671 | |||
| 672 | .seealso: [](ch:nep), `NEP`, `NEPType`, `NEPSetType()`, `NEPSLPGetEPS()`, `NEPSetTwoSided()`, `NEPSLPGetEPSLeft()` | ||
| 673 | M*/ | ||
| 674 | 268 | SLEPC_EXTERN PetscErrorCode NEPCreate_SLP(NEP nep) | |
| 675 | { | ||
| 676 | 268 | NEP_SLP *ctx; | |
| 677 | |||
| 678 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
268 | PetscFunctionBegin; |
| 679 |
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.
|
268 | PetscCall(PetscNew(&ctx)); |
| 680 | 268 | nep->data = (void*)ctx; | |
| 681 | |||
| 682 | 268 | nep->useds = PETSC_TRUE; | |
| 683 | 268 | ctx->deftol = PETSC_DETERMINE; | |
| 684 | |||
| 685 | 268 | nep->ops->solve = NEPSolve_SLP; | |
| 686 | 268 | nep->ops->setup = NEPSetUp_SLP; | |
| 687 | 268 | nep->ops->setfromoptions = NEPSetFromOptions_SLP; | |
| 688 | 268 | nep->ops->reset = NEPReset_SLP; | |
| 689 | 268 | nep->ops->destroy = NEPDestroy_SLP; | |
| 690 | 268 | nep->ops->view = NEPView_SLP; | |
| 691 | 268 | nep->ops->computevectors = NEPComputeVectors_Schur; | |
| 692 | |||
| 693 |
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.
|
268 | PetscCall(PetscObjectComposeFunction((PetscObject)nep,"NEPSLPSetDeflationThreshold_C",NEPSLPSetDeflationThreshold_SLP)); |
| 694 |
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.
|
268 | PetscCall(PetscObjectComposeFunction((PetscObject)nep,"NEPSLPGetDeflationThreshold_C",NEPSLPGetDeflationThreshold_SLP)); |
| 695 |
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.
|
268 | PetscCall(PetscObjectComposeFunction((PetscObject)nep,"NEPSLPSetEPS_C",NEPSLPSetEPS_SLP)); |
| 696 |
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.
|
268 | PetscCall(PetscObjectComposeFunction((PetscObject)nep,"NEPSLPGetEPS_C",NEPSLPGetEPS_SLP)); |
| 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.
|
268 | PetscCall(PetscObjectComposeFunction((PetscObject)nep,"NEPSLPSetEPSLeft_C",NEPSLPSetEPSLeft_SLP)); |
| 698 |
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.
|
268 | PetscCall(PetscObjectComposeFunction((PetscObject)nep,"NEPSLPGetEPSLeft_C",NEPSLPGetEPSLeft_SLP)); |
| 699 |
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.
|
268 | PetscCall(PetscObjectComposeFunction((PetscObject)nep,"NEPSLPSetKSP_C",NEPSLPSetKSP_SLP)); |
| 700 |
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.
|
268 | PetscCall(PetscObjectComposeFunction((PetscObject)nep,"NEPSLPGetKSP_C",NEPSLPGetKSP_SLP)); |
| 701 |
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.
|
51 | PetscFunctionReturn(PETSC_SUCCESS); |
| 702 | } | ||
| 703 |