| 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 problem setup | ||
| 12 | */ | ||
| 13 | |||
| 14 | #include <slepc/private/nepimpl.h> /*I "slepcnep.h" I*/ | ||
| 15 | |||
| 16 | /*@ | ||
| 17 | NEPSetDSType - Sets the type of the internal `DS` object based on the current | ||
| 18 | settings of the nonlinear eigensolver. | ||
| 19 | |||
| 20 | Collective | ||
| 21 | |||
| 22 | Input Parameter: | ||
| 23 | . nep - the nonlinear eigensolver context | ||
| 24 | |||
| 25 | Note: | ||
| 26 | This function need not be called explicitly, since it will be called at | ||
| 27 | both `NEPSetFromOptions()` and `NEPSetUp()`. | ||
| 28 | |||
| 29 | Level: developer | ||
| 30 | |||
| 31 | .seealso: [](ch:nep), `NEPSetFromOptions()`, `NEPSetUp()` | ||
| 32 | @*/ | ||
| 33 | 2274 | PetscErrorCode NEPSetDSType(NEP nep) | |
| 34 | { | ||
| 35 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2274 | PetscFunctionBegin; |
| 36 |
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.
|
2274 | PetscValidHeaderSpecific(nep,NEP_CLASSID,1); |
| 37 |
6/8✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
|
2274 | PetscTryTypeMethod(nep,setdstype); |
| 38 |
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.
|
428 | PetscFunctionReturn(PETSC_SUCCESS); |
| 39 | } | ||
| 40 | |||
| 41 | /*@ | ||
| 42 | NEPSetUp - Sets up all the internal data structures necessary for the | ||
| 43 | execution of the nonlinear eigensolver. | ||
| 44 | |||
| 45 | Collective | ||
| 46 | |||
| 47 | Input Parameter: | ||
| 48 | . nep - the nonlinear eigensolver context | ||
| 49 | |||
| 50 | Notes: | ||
| 51 | This function need not be called explicitly in most cases, since `NEPSolve()` | ||
| 52 | calls it. It can be useful when one wants to measure the set-up time | ||
| 53 | separately from the solve time. | ||
| 54 | |||
| 55 | Level: developer | ||
| 56 | |||
| 57 | .seealso: [](ch:nep), `NEPCreate()`, `NEPSolve()`, `NEPDestroy()` | ||
| 58 | @*/ | ||
| 59 | 1495 | PetscErrorCode NEPSetUp(NEP nep) | |
| 60 | { | ||
| 61 | 1495 | PetscInt k; | |
| 62 | 1495 | SlepcSC sc; | |
| 63 | 1495 | Mat T; | |
| 64 | 1495 | PetscBool flg; | |
| 65 | 1495 | KSP ksp; | |
| 66 | 1495 | PC pc; | |
| 67 | 1495 | PetscMPIInt size; | |
| 68 | 1495 | MatSolverType stype; | |
| 69 | |||
| 70 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1495 | PetscFunctionBegin; |
| 71 |
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.
|
1495 | PetscValidHeaderSpecific(nep,NEP_CLASSID,1); |
| 72 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
1495 | NEPCheckProblem(nep,1); |
| 73 |
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.
|
1495 | if (nep->state) PetscFunctionReturn(PETSC_SUCCESS); |
| 74 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1495 | PetscCall(PetscLogEventBegin(NEP_SetUp,nep,0,0,0)); |
| 75 | |||
| 76 | /* reset the convergence flag from the previous solves */ | ||
| 77 | 1495 | nep->reason = NEP_CONVERGED_ITERATING; | |
| 78 | |||
| 79 | /* set default solver type (NEPSetFromOptions was not called) */ | ||
| 80 |
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.
|
1495 | if (!((PetscObject)nep)->type_name) PetscCall(NEPSetType(nep,NEPRII)); |
| 81 |
3/10✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
1495 | if (nep->useds && !nep->ds) PetscCall(NEPGetDS(nep,&nep->ds)); |
| 82 |
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.
|
1495 | if (nep->useds) PetscCall(NEPSetDSType(nep)); |
| 83 |
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.
|
1495 | if (!nep->rg) PetscCall(NEPGetRG(nep,&nep->rg)); |
| 84 |
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.
|
1495 | if (!((PetscObject)nep->rg)->type_name) PetscCall(RGSetType(nep->rg,RGINTERVAL)); |
| 85 | |||
| 86 | /* set problem dimensions */ | ||
| 87 |
2/3✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
1495 | switch (nep->fui) { |
| 88 | 453 | case NEP_USER_INTERFACE_CALLBACK: | |
| 89 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
453 | PetscCall(NEPGetFunction(nep,&T,NULL,NULL,NULL)); |
| 90 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
453 | PetscCall(MatGetSize(T,&nep->n,NULL)); |
| 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.
|
453 | PetscCall(MatGetLocalSize(T,&nep->nloc,NULL)); |
| 92 | break; | ||
| 93 | 1042 | case NEP_USER_INTERFACE_SPLIT: | |
| 94 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1042 | PetscCall(MatDuplicate(nep->A[0],MAT_DO_NOT_COPY_VALUES,&nep->function)); |
| 95 |
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.
|
1042 | if (nep->P) PetscCall(MatDuplicate(nep->P[0],MAT_DO_NOT_COPY_VALUES,&nep->function_pre)); |
| 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.
|
1042 | PetscCall(MatDuplicate(nep->A[0],MAT_DO_NOT_COPY_VALUES,&nep->jacobian)); |
| 97 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1042 | PetscCall(MatGetSize(nep->A[0],&nep->n,NULL)); |
| 98 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1042 | PetscCall(MatGetLocalSize(nep->A[0],&nep->nloc,NULL)); |
| 99 | break; | ||
| 100 | } | ||
| 101 | |||
| 102 | /* set default problem type */ | ||
| 103 |
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.
|
1495 | if (!nep->problem_type) PetscCall(NEPSetProblemType(nep,NEP_GENERAL)); |
| 104 | |||
| 105 | /* check consistency of refinement options */ | ||
| 106 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1495 | if (nep->refine) { |
| 107 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
136 | PetscCheck(nep->fui==NEP_USER_INTERFACE_SPLIT,PetscObjectComm((PetscObject)nep),PETSC_ERR_SUP,"Iterative refinement only implemented in split form"); |
| 108 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
136 | if (!nep->scheme) { /* set default scheme */ |
| 109 |
4/6✓ Branch 0 taken 2 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(NEPRefineGetKSP(nep,&ksp)); |
| 110 |
4/6✓ Branch 0 taken 2 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(KSPGetPC(ksp,&pc)); |
| 111 |
4/6✓ Branch 0 taken 2 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)ksp,KSPPREONLY,&flg)); |
| 112 |
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 (flg) PetscCall(PetscObjectTypeCompareAny((PetscObject)pc,&flg,PCLU,PCCHOLESKY,"")); |
| 113 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
20 | nep->scheme = flg? NEP_REFINE_SCHEME_MBE: NEP_REFINE_SCHEME_SCHUR; |
| 114 | } | ||
| 115 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
136 | if (nep->scheme==NEP_REFINE_SCHEME_MBE) { |
| 116 |
4/6✓ Branch 0 taken 2 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(NEPRefineGetKSP(nep,&ksp)); |
| 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.
|
30 | PetscCall(KSPGetPC(ksp,&pc)); |
| 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.
|
30 | PetscCall(PetscObjectTypeCompare((PetscObject)ksp,KSPPREONLY,&flg)); |
| 119 |
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.
|
30 | if (flg) PetscCall(PetscObjectTypeCompareAny((PetscObject)pc,&flg,PCLU,PCCHOLESKY,"")); |
| 120 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
30 | PetscCheck(flg,PetscObjectComm((PetscObject)nep),PETSC_ERR_SUP,"The MBE scheme for refinement requires a direct solver in KSP"); |
| 121 |
14/28✓ 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.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
|
30 | PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)pc),&size)); |
| 122 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
30 | if (size>1) { /* currently selected PC is a factorization */ |
| 123 | ✗ | PetscCall(PCFactorGetMatSolverType(pc,&stype)); | |
| 124 | ✗ | PetscCall(PetscStrcmp(stype,MATSOLVERPETSC,&flg)); | |
| 125 | ✗ | PetscCheck(!flg,PetscObjectComm((PetscObject)nep),PETSC_ERR_SUP,"For Newton refinement, you chose to solve linear systems with a factorization, but in parallel runs you need to select an external package"); | |
| 126 | } | ||
| 127 | } | ||
| 128 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
136 | if (nep->scheme==NEP_REFINE_SCHEME_SCHUR) { |
| 129 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
20 | PetscCheck(nep->npart==1,PetscObjectComm((PetscObject)nep),PETSC_ERR_SUP,"The Schur scheme for refinement does not support subcommunicators"); |
| 130 | } | ||
| 131 | } | ||
| 132 | /* call specific solver setup */ | ||
| 133 |
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.
|
1495 | PetscUseTypeMethod(nep,setup); |
| 134 | |||
| 135 | /* set tolerance if not yet set */ | ||
| 136 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1495 | if (nep->tol==(PetscReal)PETSC_DETERMINE) nep->tol = SLEPC_DEFAULT_TOL; |
| 137 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1495 | if (nep->refine) { |
| 138 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
|
256 | if (nep->rtol==(PetscReal)PETSC_DETERMINE) nep->rtol = PetscMax(nep->tol/1000,PETSC_MACHINE_EPSILON); |
| 139 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
|
136 | if (nep->rits==(PetscReal)PETSC_DETERMINE) nep->rits = (nep->refine==NEP_REFINE_SIMPLE)? 10: 1; |
| 140 | } | ||
| 141 | |||
| 142 | /* fill sorting criterion context */ | ||
| 143 |
4/11✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 10 times.
✓ Branch 7 taken 5 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 5 times.
✓ Branch 10 taken 5 times.
|
1495 | switch (nep->which) { |
| 144 | ✗ | case NEP_LARGEST_MAGNITUDE: | |
| 145 | ✗ | nep->sc->comparison = SlepcCompareLargestMagnitude; | |
| 146 | ✗ | nep->sc->comparisonctx = NULL; | |
| 147 | ✗ | break; | |
| 148 | ✗ | case NEP_SMALLEST_MAGNITUDE: | |
| 149 | ✗ | nep->sc->comparison = SlepcCompareSmallestMagnitude; | |
| 150 | ✗ | nep->sc->comparisonctx = NULL; | |
| 151 | ✗ | break; | |
| 152 | ✗ | case NEP_LARGEST_REAL: | |
| 153 | ✗ | nep->sc->comparison = SlepcCompareLargestReal; | |
| 154 | ✗ | nep->sc->comparisonctx = NULL; | |
| 155 | ✗ | break; | |
| 156 | ✗ | case NEP_SMALLEST_REAL: | |
| 157 | ✗ | nep->sc->comparison = SlepcCompareSmallestReal; | |
| 158 | ✗ | nep->sc->comparisonctx = NULL; | |
| 159 | ✗ | break; | |
| 160 | ✗ | case NEP_LARGEST_IMAGINARY: | |
| 161 | ✗ | nep->sc->comparison = SlepcCompareLargestImaginary; | |
| 162 | ✗ | nep->sc->comparisonctx = NULL; | |
| 163 | ✗ | break; | |
| 164 | ✗ | case NEP_SMALLEST_IMAGINARY: | |
| 165 | ✗ | nep->sc->comparison = SlepcCompareSmallestImaginary; | |
| 166 | ✗ | nep->sc->comparisonctx = NULL; | |
| 167 | ✗ | break; | |
| 168 | 1288 | case NEP_TARGET_MAGNITUDE: | |
| 169 | 1288 | nep->sc->comparison = SlepcCompareTargetMagnitude; | |
| 170 | 1288 | nep->sc->comparisonctx = &nep->target; | |
| 171 | 1288 | break; | |
| 172 | 5 | case NEP_TARGET_REAL: | |
| 173 | 5 | nep->sc->comparison = SlepcCompareTargetReal; | |
| 174 | 5 | nep->sc->comparisonctx = &nep->target; | |
| 175 | 5 | break; | |
| 176 | ✗ | case NEP_TARGET_IMAGINARY: | |
| 177 | ✗ | nep->sc->comparison = SlepcCompareTargetImaginary; | |
| 178 | ✗ | nep->sc->comparisonctx = &nep->target; | |
| 179 | ✗ | break; | |
| 180 | 197 | case NEP_ALL: | |
| 181 | 197 | nep->sc->comparison = SlepcCompareSmallestReal; | |
| 182 | 197 | nep->sc->comparisonctx = NULL; | |
| 183 | 197 | break; | |
| 184 | case NEP_WHICH_USER: | ||
| 185 | break; | ||
| 186 | } | ||
| 187 | |||
| 188 | 1495 | nep->sc->map = NULL; | |
| 189 | 1495 | nep->sc->mapobj = NULL; | |
| 190 | |||
| 191 | /* fill sorting criterion for DS */ | ||
| 192 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1495 | if (nep->useds) { |
| 193 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1215 | PetscCall(DSGetSlepcSC(nep->ds,&sc)); |
| 194 | 1215 | sc->comparison = nep->sc->comparison; | |
| 195 | 1215 | sc->comparisonctx = nep->sc->comparisonctx; | |
| 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.
|
1215 | PetscCall(PetscObjectTypeCompare((PetscObject)nep,NEPNLEIGS,&flg)); |
| 197 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1215 | if (!flg) { |
| 198 | 951 | sc->map = NULL; | |
| 199 | 951 | sc->mapobj = NULL; | |
| 200 | } | ||
| 201 | } | ||
| 202 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
1495 | PetscCheck(nep->nev<=nep->ncv,PetscObjectComm((PetscObject)nep),PETSC_ERR_ARG_OUTOFRANGE,"nev bigger than ncv"); |
| 203 | |||
| 204 | /* process initial vectors */ | ||
| 205 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1495 | if (nep->nini<0) { |
| 206 | 48 | k = -nep->nini; | |
| 207 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
48 | PetscCheck(k<=nep->ncv,PetscObjectComm((PetscObject)nep),PETSC_ERR_USER_INPUT,"The number of initial vectors is larger than ncv"); |
| 208 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
48 | PetscCall(BVInsertVecs(nep->V,0,&k,nep->IS,PETSC_TRUE)); |
| 209 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
48 | PetscCall(SlepcBasisDestroy_Private(&nep->nini,&nep->IS)); |
| 210 | 48 | nep->nini = k; | |
| 211 | } | ||
| 212 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1495 | PetscCall(PetscLogEventEnd(NEP_SetUp,nep,0,0,0)); |
| 213 | 1495 | nep->state = NEP_STATE_SETUP; | |
| 214 |
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.
|
1495 | PetscFunctionReturn(PETSC_SUCCESS); |
| 215 | } | ||
| 216 | |||
| 217 | /*@ | ||
| 218 | NEPSetInitialSpace - Specify a basis of vectors that constitute the initial | ||
| 219 | space, that is, the subspace from which the solver starts to iterate. | ||
| 220 | |||
| 221 | Collective | ||
| 222 | |||
| 223 | Input Parameters: | ||
| 224 | + nep - the nonlinear eigensolver context | ||
| 225 | . n - number of vectors | ||
| 226 | - is - set of basis vectors of the initial space | ||
| 227 | |||
| 228 | Notes: | ||
| 229 | Some solvers start to iterate on a single vector (initial vector). In that case, | ||
| 230 | the other vectors are ignored. | ||
| 231 | |||
| 232 | These vectors do not persist from one `NEPSolve()` call to the other, so the | ||
| 233 | initial space should be set every time. | ||
| 234 | |||
| 235 | The vectors do not need to be mutually orthonormal, since they are explicitly | ||
| 236 | orthonormalized internally. | ||
| 237 | |||
| 238 | Common usage of this function is when the user can provide a rough approximation | ||
| 239 | of the wanted eigenspace. Then, convergence may be faster. | ||
| 240 | |||
| 241 | Level: intermediate | ||
| 242 | |||
| 243 | .seealso: [](ch:nep), `NEPSetUp()` | ||
| 244 | @*/ | ||
| 245 | 68 | PetscErrorCode NEPSetInitialSpace(NEP nep,PetscInt n,Vec is[]) | |
| 246 | { | ||
| 247 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
68 | PetscFunctionBegin; |
| 248 |
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.
|
68 | PetscValidHeaderSpecific(nep,NEP_CLASSID,1); |
| 249 |
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.
|
68 | PetscValidLogicalCollectiveInt(nep,n,2); |
| 250 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
68 | PetscCheck(n>=0,PetscObjectComm((PetscObject)nep),PETSC_ERR_ARG_OUTOFRANGE,"Argument n cannot be negative"); |
| 251 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
68 | if (n>0) { |
| 252 |
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.
|
68 | PetscAssertPointer(is,3); |
| 253 |
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.
|
68 | PetscValidHeaderSpecific(*is,VEC_CLASSID,3); |
| 254 | } | ||
| 255 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
68 | PetscCall(SlepcBasisReference_Private(n,is,&nep->nini,&nep->IS)); |
| 256 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
68 | if (n>0) nep->state = NEP_STATE_INITIAL; |
| 257 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
12 | PetscFunctionReturn(PETSC_SUCCESS); |
| 258 | } | ||
| 259 | |||
| 260 | /* | ||
| 261 | NEPSetDimensions_Default - Set reasonable values for ncv, mpd if not set | ||
| 262 | by the user. This is called at setup. | ||
| 263 | */ | ||
| 264 | 724 | PetscErrorCode NEPSetDimensions_Default(NEP nep,PetscInt nev,PetscInt *ncv,PetscInt *mpd) | |
| 265 | { | ||
| 266 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
724 | PetscFunctionBegin; |
| 267 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
724 | if (*ncv!=PETSC_DETERMINE) { /* ncv set */ |
| 268 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
165 | PetscCheck(*ncv>=nev,PetscObjectComm((PetscObject)nep),PETSC_ERR_USER_INPUT,"The value of ncv must be at least nev"); |
| 269 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
559 | } else if (*mpd!=PETSC_DETERMINE) { /* mpd set */ |
| 270 | ✗ | *ncv = PetscMin(nep->n,nev+(*mpd)); | |
| 271 | } else { /* neither set: defaults depend on nev being small or large */ | ||
| 272 |
3/4✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 3 times.
|
559 | if (nev<500) *ncv = PetscMin(nep->n,PetscMax(2*nev,nev+15)); |
| 273 | else { | ||
| 274 | ✗ | *mpd = 500; | |
| 275 | ✗ | *ncv = PetscMin(nep->n,nev+(*mpd)); | |
| 276 | } | ||
| 277 | } | ||
| 278 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
724 | if (*mpd==PETSC_DETERMINE) *mpd = *ncv; |
| 279 |
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.
|
138 | PetscFunctionReturn(PETSC_SUCCESS); |
| 280 | } | ||
| 281 | |||
| 282 | /*@ | ||
| 283 | NEPAllocateSolution - Allocate memory storage for common variables such | ||
| 284 | as eigenvalues and eigenvectors. | ||
| 285 | |||
| 286 | Collective | ||
| 287 | |||
| 288 | Input Parameters: | ||
| 289 | + nep - the nonlinear eigensolver context | ||
| 290 | - extra - number of additional positions, used for methods that require a | ||
| 291 | working basis slightly larger than `ncv` | ||
| 292 | |||
| 293 | Developer Note: | ||
| 294 | This is `SLEPC_EXTERN` because it may be required by user plugin `NEP` | ||
| 295 | implementations. | ||
| 296 | |||
| 297 | Level: developer | ||
| 298 | |||
| 299 | .seealso: [](ch:nep), `PEPSetUp()`, `PEPSetDimensions()` | ||
| 300 | @*/ | ||
| 301 | 1525 | PetscErrorCode NEPAllocateSolution(NEP nep,PetscInt extra) | |
| 302 | { | ||
| 303 | 1525 | PetscInt oldsize,requested; | |
| 304 | 1525 | PetscRandom rand; | |
| 305 | 1525 | Mat T; | |
| 306 | 1525 | Vec t; | |
| 307 | |||
| 308 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1525 | PetscFunctionBegin; |
| 309 | 1525 | requested = nep->ncv + extra; | |
| 310 | |||
| 311 | /* oldsize is zero if this is the first time setup is called */ | ||
| 312 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1525 | PetscCall(BVGetSizes(nep->V,NULL,NULL,&oldsize)); |
| 313 | |||
| 314 | /* allocate space for eigenvalues and friends */ | ||
| 315 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
1525 | if (requested != oldsize || !nep->eigr) { |
| 316 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1525 | PetscCall(PetscFree4(nep->eigr,nep->eigi,nep->errest,nep->perm)); |
| 317 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1525 | PetscCall(PetscMalloc4(requested,&nep->eigr,requested,&nep->eigi,requested,&nep->errest,requested,&nep->perm)); |
| 318 | } | ||
| 319 | |||
| 320 | /* allocate V */ | ||
| 321 |
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.
|
1525 | if (!nep->V) PetscCall(NEPGetBV(nep,&nep->V)); |
| 322 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1525 | if (!oldsize) { |
| 323 |
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.
|
1495 | if (!((PetscObject)nep->V)->type_name) PetscCall(BVSetType(nep->V,BVMAT)); |
| 324 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1495 | if (nep->fui==NEP_USER_INTERFACE_SPLIT) T = nep->A[0]; |
| 325 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
453 | else PetscCall(NEPGetFunction(nep,&T,NULL,NULL,NULL)); |
| 326 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1495 | PetscCall(MatCreateVecsEmpty(T,&t,NULL)); |
| 327 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1495 | PetscCall(BVSetSizesFromVec(nep->V,t,requested)); |
| 328 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1495 | PetscCall(VecDestroy(&t)); |
| 329 |
4/6✓ Branch 0 taken 2 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 | } else PetscCall(BVResize(nep->V,requested,PETSC_FALSE)); |
| 330 | |||
| 331 | /* allocate W */ | ||
| 332 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1525 | if (nep->twosided) { |
| 333 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
90 | PetscCall(BVGetRandomContext(nep->V,&rand)); /* make sure the random context is available when duplicating */ |
| 334 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
90 | PetscCall(BVDestroy(&nep->W)); |
| 335 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
90 | PetscCall(BVDuplicate(nep->V,&nep->W)); |
| 336 | } | ||
| 337 |
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.
|
291 | PetscFunctionReturn(PETSC_SUCCESS); |
| 338 | } | ||
| 339 |