| 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 | PEP routines related to problem setup | ||
| 12 | */ | ||
| 13 | |||
| 14 | #include <slepc/private/pepimpl.h> /*I "slepcpep.h" I*/ | ||
| 15 | |||
| 16 | /* | ||
| 17 | Let the solver choose the ST type that should be used by default, | ||
| 18 | otherwise set it to SHIFT. | ||
| 19 | This is called at PEPSetFromOptions (before STSetFromOptions) | ||
| 20 | and also at PEPSetUp (in case PEPSetFromOptions was not called). | ||
| 21 | */ | ||
| 22 | 3808 | PetscErrorCode PEPSetDefaultST(PEP pep) | |
| 23 | { | ||
| 24 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
3808 | PetscFunctionBegin; |
| 25 |
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.
|
3808 | PetscTryTypeMethod(pep,setdefaultst); |
| 26 |
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.
|
3808 | if (!((PetscObject)pep->st)->type_name) PetscCall(STSetType(pep->st,STSHIFT)); |
| 27 |
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.
|
739 | PetscFunctionReturn(PETSC_SUCCESS); |
| 28 | } | ||
| 29 | |||
| 30 | /* | ||
| 31 | This is used in Q-Arnoldi and STOAR to set the transform flag by | ||
| 32 | default, otherwise the user has to explicitly run with -st_transform | ||
| 33 | */ | ||
| 34 | 338 | PetscErrorCode PEPSetDefaultST_Transform(PEP pep) | |
| 35 | { | ||
| 36 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
338 | PetscFunctionBegin; |
| 37 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
338 | PetscCall(STSetTransform(pep->st,PETSC_TRUE)); |
| 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.
|
66 | PetscFunctionReturn(PETSC_SUCCESS); |
| 39 | } | ||
| 40 | |||
| 41 | /*@ | ||
| 42 | PEPSetDSType - Sets the type of the internal `DS` object based on the current | ||
| 43 | settings of the polynomial eigensolver. | ||
| 44 | |||
| 45 | Collective | ||
| 46 | |||
| 47 | Input Parameter: | ||
| 48 | . pep - the polynomial eigensolver context | ||
| 49 | |||
| 50 | Note: | ||
| 51 | This function need not be called explicitly, since it will be called at | ||
| 52 | both `PEPSetFromOptions()` and `PEPSetUp()`. | ||
| 53 | |||
| 54 | Level: developer | ||
| 55 | |||
| 56 | .seealso: [](ch:pep), `PEPSetFromOptions()`, `PEPSetUp()` | ||
| 57 | @*/ | ||
| 58 | 3798 | PetscErrorCode PEPSetDSType(PEP pep) | |
| 59 | { | ||
| 60 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
3798 | PetscFunctionBegin; |
| 61 |
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.
|
3798 | PetscValidHeaderSpecific(pep,PEP_CLASSID,1); |
| 62 |
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.
|
3798 | PetscTryTypeMethod(pep,setdstype); |
| 63 |
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.
|
737 | PetscFunctionReturn(PETSC_SUCCESS); |
| 64 | } | ||
| 65 | |||
| 66 | /*@ | ||
| 67 | PEPSetUp - Sets up all the internal data structures necessary for the | ||
| 68 | execution of the polynomial eigensolver. | ||
| 69 | |||
| 70 | Collective | ||
| 71 | |||
| 72 | Input Parameter: | ||
| 73 | . pep - the polynomial eigensolver context | ||
| 74 | |||
| 75 | Notes: | ||
| 76 | This function need not be called explicitly in most cases, since `PEPSolve()` | ||
| 77 | calls it. It can be useful when one wants to measure the set-up time | ||
| 78 | separately from the solve time. | ||
| 79 | |||
| 80 | Level: developer | ||
| 81 | |||
| 82 | .seealso: [](ch:pep), `PEPCreate()`, `PEPSolve()`, `PEPDestroy()` | ||
| 83 | @*/ | ||
| 84 | 1986 | PetscErrorCode PEPSetUp(PEP pep) | |
| 85 | { | ||
| 86 | 1986 | SlepcSC sc; | |
| 87 | 1986 | PetscBool istrivial,flg; | |
| 88 | 1986 | PetscInt k; | |
| 89 | 1986 | KSP ksp; | |
| 90 | 1986 | PC pc; | |
| 91 | 1986 | PetscMPIInt size; | |
| 92 | 1986 | MatSolverType stype; | |
| 93 | |||
| 94 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1986 | PetscFunctionBegin; |
| 95 |
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.
|
1986 | PetscValidHeaderSpecific(pep,PEP_CLASSID,1); |
| 96 |
8/14✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
|
1986 | if (pep->state) PetscFunctionReturn(PETSC_SUCCESS); |
| 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.
|
1956 | PetscCall(PetscLogEventBegin(PEP_SetUp,pep,0,0,0)); |
| 98 | |||
| 99 | /* reset the convergence flag from the previous solves */ | ||
| 100 | 1956 | pep->reason = PEP_CONVERGED_ITERATING; | |
| 101 | |||
| 102 | /* set default solver type (PEPSetFromOptions was not called) */ | ||
| 103 |
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.
|
1956 | if (!((PetscObject)pep)->type_name) PetscCall(PEPSetType(pep,PEPTOAR)); |
| 104 |
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.
|
1956 | if (!pep->st) PetscCall(PEPGetST(pep,&pep->st)); |
| 105 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1956 | PetscCall(PEPSetDefaultST(pep)); |
| 106 |
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.
|
1956 | if (!pep->ds) PetscCall(PEPGetDS(pep,&pep->ds)); |
| 107 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1956 | PetscCall(PEPSetDSType(pep)); |
| 108 |
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.
|
1956 | if (!pep->rg) PetscCall(PEPGetRG(pep,&pep->rg)); |
| 109 |
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.
|
1956 | if (!((PetscObject)pep->rg)->type_name) PetscCall(RGSetType(pep->rg,RGINTERVAL)); |
| 110 | |||
| 111 | /* check matrices, transfer them to ST */ | ||
| 112 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
1956 | PetscCheck(pep->A,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_WRONGSTATE,"PEPSetOperators must be called first"); |
| 113 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1956 | PetscCall(STSetMatrices(pep->st,pep->nmat,pep->A)); |
| 114 | |||
| 115 | /* set problem dimensions */ | ||
| 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.
|
1956 | PetscCall(MatGetSize(pep->A[0],&pep->n,NULL)); |
| 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.
|
1956 | PetscCall(MatGetLocalSize(pep->A[0],&pep->nloc,NULL)); |
| 118 | |||
| 119 | /* set default problem type */ | ||
| 120 |
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.
|
1956 | if (!pep->problem_type) PetscCall(PEPSetProblemType(pep,PEP_GENERAL)); |
| 121 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1956 | if (pep->nev > (pep->nmat-1)*pep->n) pep->nev = (pep->nmat-1)*pep->n; |
| 122 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1956 | if (pep->ncv > (pep->nmat-1)*pep->n) pep->ncv = (pep->nmat-1)*pep->n; |
| 123 | |||
| 124 | /* check consistency of refinement options */ | ||
| 125 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1956 | if (pep->refine) { |
| 126 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
296 | if (!pep->scheme) { /* set default scheme */ |
| 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.
|
40 | PetscCall(PEPRefineGetKSP(pep,&ksp)); |
| 128 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
40 | PetscCall(KSPGetPC(ksp,&pc)); |
| 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.
|
40 | PetscCall(PetscObjectTypeCompare((PetscObject)ksp,KSPPREONLY,&flg)); |
| 130 |
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.
|
40 | if (flg) PetscCall(PetscObjectTypeCompareAny((PetscObject)pc,&flg,PCLU,PCCHOLESKY,"")); |
| 131 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
80 | pep->scheme = flg? PEP_REFINE_SCHEME_MBE: PEP_REFINE_SCHEME_SCHUR; |
| 132 | } | ||
| 133 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
296 | if (pep->scheme==PEP_REFINE_SCHEME_MBE) { |
| 134 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
80 | PetscCall(PEPRefineGetKSP(pep,&ksp)); |
| 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.
|
80 | PetscCall(KSPGetPC(ksp,&pc)); |
| 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.
|
80 | PetscCall(PetscObjectTypeCompare((PetscObject)ksp,KSPPREONLY,&flg)); |
| 137 |
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.
|
80 | if (flg) PetscCall(PetscObjectTypeCompareAny((PetscObject)pc,&flg,PCLU,PCCHOLESKY,"")); |
| 138 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
80 | PetscCheck(flg,PetscObjectComm((PetscObject)pep),PETSC_ERR_SUP,"The MBE scheme for refinement requires a direct solver in KSP"); |
| 139 |
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.
|
80 | PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)pc),&size)); |
| 140 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
80 | if (size>1) { /* currently selected PC is a factorization */ |
| 141 | ✗ | PetscCall(PCFactorGetMatSolverType(pc,&stype)); | |
| 142 | ✗ | PetscCall(PetscStrcmp(stype,MATSOLVERPETSC,&flg)); | |
| 143 | ✗ | PetscCheck(!flg,PetscObjectComm((PetscObject)pep),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"); | |
| 144 | } | ||
| 145 | } | ||
| 146 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
296 | if (pep->scheme==PEP_REFINE_SCHEME_SCHUR) { |
| 147 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
96 | PetscCheck(pep->npart==1,PetscObjectComm((PetscObject)pep),PETSC_ERR_SUP,"The Schur scheme for refinement does not support subcommunicators"); |
| 148 | } | ||
| 149 | } | ||
| 150 | /* call specific solver setup */ | ||
| 151 |
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.
|
1956 | PetscUseTypeMethod(pep,setup); |
| 152 | |||
| 153 | /* set tolerance if not yet set */ | ||
| 154 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1956 | if (pep->tol==(PetscReal)PETSC_DETERMINE) pep->tol = SLEPC_DEFAULT_TOL; |
| 155 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1956 | if (pep->refine) { |
| 156 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
|
576 | if (pep->rtol==(PetscReal)PETSC_DETERMINE) pep->rtol = PetscMax(pep->tol/1000,PETSC_MACHINE_EPSILON); |
| 157 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
436 | if (pep->rits==PETSC_DETERMINE) pep->rits = (pep->refine==PEP_REFINE_SIMPLE)? 10: 1; |
| 158 | } | ||
| 159 | |||
| 160 | /* set default extraction */ | ||
| 161 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1956 | if (!pep->extract) { |
| 162 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1686 | pep->extract = (pep->basis==PEP_BASIS_MONOMIAL)? PEP_EXTRACT_NORM: PEP_EXTRACT_NONE; |
| 163 | } | ||
| 164 | |||
| 165 | /* fill sorting criterion context */ | ||
| 166 |
5/11✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 10 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 10 times.
✓ Branch 10 taken 10 times.
|
1956 | switch (pep->which) { |
| 167 | 628 | case PEP_LARGEST_MAGNITUDE: | |
| 168 | 628 | pep->sc->comparison = SlepcCompareLargestMagnitude; | |
| 169 | 628 | pep->sc->comparisonctx = NULL; | |
| 170 | 628 | break; | |
| 171 | ✗ | case PEP_SMALLEST_MAGNITUDE: | |
| 172 | ✗ | pep->sc->comparison = SlepcCompareSmallestMagnitude; | |
| 173 | ✗ | pep->sc->comparisonctx = NULL; | |
| 174 | ✗ | break; | |
| 175 | 28 | case PEP_LARGEST_REAL: | |
| 176 | 28 | pep->sc->comparison = SlepcCompareLargestReal; | |
| 177 | 28 | pep->sc->comparisonctx = NULL; | |
| 178 | 28 | break; | |
| 179 | ✗ | case PEP_SMALLEST_REAL: | |
| 180 | ✗ | pep->sc->comparison = SlepcCompareSmallestReal; | |
| 181 | ✗ | pep->sc->comparisonctx = NULL; | |
| 182 | ✗ | break; | |
| 183 | ✗ | case PEP_LARGEST_IMAGINARY: | |
| 184 | ✗ | pep->sc->comparison = SlepcCompareLargestImaginary; | |
| 185 | ✗ | pep->sc->comparisonctx = NULL; | |
| 186 | ✗ | break; | |
| 187 | ✗ | case PEP_SMALLEST_IMAGINARY: | |
| 188 | ✗ | pep->sc->comparison = SlepcCompareSmallestImaginary; | |
| 189 | ✗ | pep->sc->comparisonctx = NULL; | |
| 190 | ✗ | break; | |
| 191 | 1130 | case PEP_TARGET_MAGNITUDE: | |
| 192 | 1130 | pep->sc->comparison = SlepcCompareTargetMagnitude; | |
| 193 | 1130 | pep->sc->comparisonctx = &pep->target; | |
| 194 | 1130 | break; | |
| 195 | ✗ | case PEP_TARGET_REAL: | |
| 196 | ✗ | pep->sc->comparison = SlepcCompareTargetReal; | |
| 197 | ✗ | pep->sc->comparisonctx = &pep->target; | |
| 198 | ✗ | break; | |
| 199 | ✗ | case PEP_TARGET_IMAGINARY: | |
| 200 | ✗ | pep->sc->comparison = SlepcCompareTargetImaginary; | |
| 201 | ✗ | pep->sc->comparisonctx = &pep->target; | |
| 202 | ✗ | break; | |
| 203 | 145 | case PEP_ALL: | |
| 204 | 145 | pep->sc->comparison = SlepcCompareSmallestReal; | |
| 205 | 145 | pep->sc->comparisonctx = NULL; | |
| 206 | 145 | break; | |
| 207 | case PEP_WHICH_USER: | ||
| 208 | break; | ||
| 209 | } | ||
| 210 | 1956 | pep->sc->map = NULL; | |
| 211 | 1956 | pep->sc->mapobj = NULL; | |
| 212 | |||
| 213 | /* fill sorting criterion for DS */ | ||
| 214 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1956 | if (pep->which!=PEP_ALL) { |
| 215 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1811 | PetscCall(DSGetSlepcSC(pep->ds,&sc)); |
| 216 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1811 | PetscCall(RGIsTrivial(pep->rg,&istrivial)); |
| 217 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1811 | sc->rg = istrivial? NULL: pep->rg; |
| 218 | 1811 | sc->comparison = pep->sc->comparison; | |
| 219 | 1811 | sc->comparisonctx = pep->sc->comparisonctx; | |
| 220 | 1811 | sc->map = SlepcMap_ST; | |
| 221 | 1811 | sc->mapobj = (PetscObject)pep->st; | |
| 222 | } | ||
| 223 | /* setup ST */ | ||
| 224 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1956 | PetscCall(STSetUp(pep->st)); |
| 225 | |||
| 226 | /* compute matrix coefficients */ | ||
| 227 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1956 | PetscCall(STGetTransform(pep->st,&flg)); |
| 228 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1956 | if (!flg) { |
| 229 |
8/10✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
|
1637 | if (pep->which!=PEP_ALL && pep->solvematcoeffs) PetscCall(STMatSetUp(pep->st,1.0,pep->solvematcoeffs)); |
| 230 | } else { | ||
| 231 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
319 | PetscCheck(pep->basis==PEP_BASIS_MONOMIAL,PetscObjectComm((PetscObject)pep),PETSC_ERR_SUP,"Cannot use ST-transform with non-monomial basis in PEP"); |
| 232 | } | ||
| 233 | |||
| 234 | /* compute scale factor if no set by user */ | ||
| 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.
|
1956 | PetscCall(PEPComputeScaleFactor(pep)); |
| 236 | |||
| 237 | /* build balancing matrix if required */ | ||
| 238 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1956 | if (pep->scale==PEP_SCALE_DIAGONAL || pep->scale==PEP_SCALE_BOTH) { |
| 239 |
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.
|
184 | if (!pep->Dl) PetscCall(BVCreateVec(pep->V,&pep->Dl)); |
| 240 |
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.
|
184 | if (!pep->Dr) PetscCall(BVCreateVec(pep->V,&pep->Dr)); |
| 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.
|
184 | PetscCall(PEPBuildDiagonalScaling(pep)); |
| 242 | } | ||
| 243 | |||
| 244 | /* process initial vectors */ | ||
| 245 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1956 | if (pep->nini<0) { |
| 246 | 38 | k = -pep->nini; | |
| 247 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
38 | PetscCheck(k<=pep->ncv,PetscObjectComm((PetscObject)pep),PETSC_ERR_USER_INPUT,"The number of initial vectors is larger than ncv"); |
| 248 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
38 | PetscCall(BVInsertVecs(pep->V,0,&k,pep->IS,PETSC_TRUE)); |
| 249 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
38 | PetscCall(SlepcBasisDestroy_Private(&pep->nini,&pep->IS)); |
| 250 | 38 | pep->nini = k; | |
| 251 | } | ||
| 252 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1956 | PetscCall(PetscLogEventEnd(PEP_SetUp,pep,0,0,0)); |
| 253 | 1956 | pep->state = PEP_STATE_SETUP; | |
| 254 |
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.
|
1956 | PetscFunctionReturn(PETSC_SUCCESS); |
| 255 | } | ||
| 256 | |||
| 257 | /*@ | ||
| 258 | PEPSetOperators - Sets the coefficient matrices associated with the polynomial | ||
| 259 | eigenvalue problem. | ||
| 260 | |||
| 261 | Collective | ||
| 262 | |||
| 263 | Input Parameters: | ||
| 264 | + pep - the polynomial eigensolver context | ||
| 265 | . nmat - number of matrices in array `A` | ||
| 266 | - A - the array of matrices associated with the eigenproblem | ||
| 267 | |||
| 268 | Notes: | ||
| 269 | The polynomial eigenproblem is defined as $P(\lambda)x=0$, where $\lambda$ | ||
| 270 | is the eigenvalue, $x$ is the eigenvector, and $P$ is defined as | ||
| 271 | $P(\lambda) = A_0 + \lambda A_1 + \dots + \lambda^d A_d$, with $d$=`nmat`-1 | ||
| 272 | (the degree of $P$). For non-monomial bases, this expression is different. | ||
| 273 | |||
| 274 | Level: beginner | ||
| 275 | |||
| 276 | .seealso: [](ch:pep), `PEPSolve()`, `PEPGetOperators()`, `PEPGetNumMatrices()`, `PEPSetBasis()` | ||
| 277 | @*/ | ||
| 278 | 1966 | PetscErrorCode PEPSetOperators(PEP pep,PetscInt nmat,Mat A[]) | |
| 279 | { | ||
| 280 | 1966 | PetscInt i,n=0,m,m0=0,mloc,nloc,mloc0=0; | |
| 281 | |||
| 282 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1966 | PetscFunctionBegin; |
| 283 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
1966 | PetscValidHeaderSpecific(pep,PEP_CLASSID,1); |
| 284 |
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.
|
1966 | PetscValidLogicalCollectiveInt(pep,nmat,2); |
| 285 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
1966 | PetscCheck(nmat>0,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_OUTOFRANGE,"Non-positive value of nmat: %" PetscInt_FMT,nmat); |
| 286 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
1966 | PetscCheck(nmat>2,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_OUTOFRANGE,"Cannot solve linear eigenproblems with PEP; use EPS instead"); |
| 287 |
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.
|
384 | PetscAssertPointer(A,3); |
| 288 | |||
| 289 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
9342 | for (i=0;i<nmat;i++) { |
| 290 |
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.
|
7376 | PetscValidHeaderSpecific(A[i],MAT_CLASSID,3); |
| 291 |
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.
|
7376 | PetscCheckSameComm(pep,1,A[i],3); |
| 292 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7376 | PetscCall(MatGetSize(A[i],&m,&n)); |
| 293 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7376 | PetscCall(MatGetLocalSize(A[i],&mloc,&nloc)); |
| 294 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
7376 | PetscCheck(m==n,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_WRONG,"A[%" PetscInt_FMT "] is a non-square matrix (%" PetscInt_FMT " rows, %" PetscInt_FMT " cols)",i,m,n); |
| 295 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
7376 | PetscCheck(mloc==nloc,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_WRONG,"A[%" PetscInt_FMT "] does not have equal row and column local sizes (%" PetscInt_FMT ", %" PetscInt_FMT ")",i,mloc,nloc); |
| 296 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
7376 | if (!i) { m0 = m; mloc0 = mloc; } |
| 297 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
7376 | PetscCheck(m==m0,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_INCOMP,"Dimensions of A[%" PetscInt_FMT "] do not match with previous matrices (%" PetscInt_FMT ", %" PetscInt_FMT ")",i,m,m0); |
| 298 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
7376 | PetscCheck(mloc==mloc0,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_INCOMP,"Local dimensions of A[%" PetscInt_FMT "] do not match with previous matrices (%" PetscInt_FMT ", %" PetscInt_FMT ")",i,mloc,mloc0); |
| 299 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7376 | PetscCall(PetscObjectReference((PetscObject)A[i])); |
| 300 | } | ||
| 301 | |||
| 302 |
7/12✓ 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 taken 2 times.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
1966 | if (pep->state && (n!=pep->n || nloc!=pep->nloc)) PetscCall(PEPReset(pep)); |
| 303 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1926 | else if (pep->nmat) { |
| 304 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(MatDestroyMatrices(pep->nmat,&pep->A)); |
| 305 |
4/6✓ Branch 0 taken 2 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(PetscFree2(pep->pbc,pep->nrma)); |
| 306 |
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 | PetscCall(PetscFree(pep->solvematcoeffs)); |
| 307 | } | ||
| 308 | |||
| 309 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1966 | PetscCall(PetscMalloc1(nmat,&pep->A)); |
| 310 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1966 | PetscCall(PetscCalloc2(3*nmat,&pep->pbc,nmat,&pep->nrma)); |
| 311 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
9342 | for (i=0;i<nmat;i++) { |
| 312 | 7376 | pep->A[i] = A[i]; | |
| 313 | 7376 | pep->pbc[i] = 1.0; /* default to monomial basis */ | |
| 314 | } | ||
| 315 | 1966 | pep->nmat = nmat; | |
| 316 | 1966 | pep->state = PEP_STATE_INITIAL; | |
| 317 |
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.
|
1966 | PetscFunctionReturn(PETSC_SUCCESS); |
| 318 | } | ||
| 319 | |||
| 320 | /*@ | ||
| 321 | PEPGetOperators - Gets the matrices associated with the polynomial eigensystem. | ||
| 322 | |||
| 323 | Collective | ||
| 324 | |||
| 325 | Input Parameters: | ||
| 326 | + pep - the polynomial eigensolver context | ||
| 327 | - k - the index of the requested matrix (starting in 0) | ||
| 328 | |||
| 329 | Output Parameter: | ||
| 330 | . A - the requested matrix | ||
| 331 | |||
| 332 | Level: intermediate | ||
| 333 | |||
| 334 | .seealso: [](ch:pep), `PEPSolve()`, `PEPSetOperators()`, `PEPGetNumMatrices()` | ||
| 335 | @*/ | ||
| 336 | 625 | PetscErrorCode PEPGetOperators(PEP pep,PetscInt k,Mat *A) | |
| 337 | { | ||
| 338 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
625 | PetscFunctionBegin; |
| 339 |
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.
|
625 | PetscValidHeaderSpecific(pep,PEP_CLASSID,1); |
| 340 |
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.
|
625 | PetscAssertPointer(A,3); |
| 341 |
2/6✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
625 | PetscCheck(k>=0 && k<pep->nmat,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_OUTOFRANGE,"k must be between 0 and %" PetscInt_FMT,pep->nmat-1); |
| 342 | 625 | *A = pep->A[k]; | |
| 343 |
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.
|
625 | PetscFunctionReturn(PETSC_SUCCESS); |
| 344 | } | ||
| 345 | |||
| 346 | /*@ | ||
| 347 | PEPGetNumMatrices - Returns the number of matrices stored in the `PEP`. | ||
| 348 | |||
| 349 | Not Collective | ||
| 350 | |||
| 351 | Input Parameter: | ||
| 352 | . pep - the polynomial eigensolver context | ||
| 353 | |||
| 354 | Output Parameter: | ||
| 355 | . nmat - the number of matrices passed in `PEPSetOperators()` | ||
| 356 | |||
| 357 | Level: intermediate | ||
| 358 | |||
| 359 | .seealso: [](ch:pep), `PEPSetOperators()` | ||
| 360 | @*/ | ||
| 361 | 16 | PetscErrorCode PEPGetNumMatrices(PEP pep,PetscInt *nmat) | |
| 362 | { | ||
| 363 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
16 | PetscFunctionBegin; |
| 364 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
16 | PetscValidHeaderSpecific(pep,PEP_CLASSID,1); |
| 365 |
2/8✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
16 | PetscAssertPointer(nmat,2); |
| 366 | 16 | *nmat = pep->nmat; | |
| 367 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
16 | PetscFunctionReturn(PETSC_SUCCESS); |
| 368 | } | ||
| 369 | |||
| 370 | /*@ | ||
| 371 | PEPSetInitialSpace - Specify a basis of vectors that constitute the initial | ||
| 372 | space, that is, the subspace from which the solver starts to iterate. | ||
| 373 | |||
| 374 | Collective | ||
| 375 | |||
| 376 | Input Parameters: | ||
| 377 | + pep - the polynomial eigensolver context | ||
| 378 | . n - number of vectors | ||
| 379 | - is - set of basis vectors of the initial space | ||
| 380 | |||
| 381 | Notes: | ||
| 382 | Some solvers start to iterate on a single vector (initial vector). In that case, | ||
| 383 | the other vectors are ignored. | ||
| 384 | |||
| 385 | These vectors do not persist from one `PEPSolve()` call to the other, so the | ||
| 386 | initial space should be set every time. | ||
| 387 | |||
| 388 | The vectors do not need to be mutually orthonormal, since they are explicitly | ||
| 389 | orthonormalized internally. | ||
| 390 | |||
| 391 | Common usage of this function is when the user can provide a rough approximation | ||
| 392 | of the wanted eigenspace. Then, convergence may be faster. | ||
| 393 | |||
| 394 | Level: intermediate | ||
| 395 | |||
| 396 | .seealso: [](ch:pep), `PEPSetUp()` | ||
| 397 | @*/ | ||
| 398 | 66 | PetscErrorCode PEPSetInitialSpace(PEP pep,PetscInt n,Vec is[]) | |
| 399 | { | ||
| 400 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
66 | PetscFunctionBegin; |
| 401 |
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.
|
66 | PetscValidHeaderSpecific(pep,PEP_CLASSID,1); |
| 402 |
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.
|
66 | PetscValidLogicalCollectiveInt(pep,n,2); |
| 403 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
66 | PetscCheck(n>=0,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_OUTOFRANGE,"Argument n cannot be negative"); |
| 404 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
66 | if (n>0) { |
| 405 |
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.
|
66 | PetscAssertPointer(is,3); |
| 406 |
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.
|
66 | PetscValidHeaderSpecific(*is,VEC_CLASSID,3); |
| 407 | } | ||
| 408 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
66 | PetscCall(SlepcBasisReference_Private(n,is,&pep->nini,&pep->IS)); |
| 409 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
66 | if (n>0) pep->state = PEP_STATE_INITIAL; |
| 410 |
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); |
| 411 | } | ||
| 412 | |||
| 413 | /* | ||
| 414 | PEPSetDimensions_Default - Set reasonable values for ncv, mpd if not set | ||
| 415 | by the user. This is called at setup. | ||
| 416 | */ | ||
| 417 | 1468 | PetscErrorCode PEPSetDimensions_Default(PEP pep,PetscInt nev,PetscInt *ncv,PetscInt *mpd) | |
| 418 | { | ||
| 419 | 1468 | PetscBool krylov; | |
| 420 | 1468 | PetscInt dim; | |
| 421 | |||
| 422 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1468 | PetscFunctionBegin; |
| 423 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1468 | PetscCall(PetscObjectTypeCompareAny((PetscObject)pep,&krylov,PEPTOAR,PEPSTOAR,PEPQARNOLDI,"")); |
| 424 | 1468 | dim = (pep->nmat-1)*pep->n; | |
| 425 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1468 | if (*ncv!=PETSC_DETERMINE) { /* ncv set */ |
| 426 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
722 | if (krylov) { |
| 427 |
4/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
617 | PetscCheck(*ncv>nev || (*ncv==nev && *ncv==dim),PetscObjectComm((PetscObject)pep),PETSC_ERR_USER_INPUT,"The value of ncv must be at least nev+1"); |
| 428 | } else { | ||
| 429 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
105 | PetscCheck(*ncv>=nev,PetscObjectComm((PetscObject)pep),PETSC_ERR_USER_INPUT,"The value of ncv must be at least nev"); |
| 430 | } | ||
| 431 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
746 | } else if (*mpd!=PETSC_DETERMINE) { /* mpd set */ |
| 432 | ✗ | *ncv = PetscMin(dim,nev+(*mpd)); | |
| 433 | } else { /* neither set: defaults depend on nev being small or large */ | ||
| 434 |
3/4✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
746 | if (nev<500) *ncv = PetscMin(dim,PetscMax(2*nev,nev+15)); |
| 435 | else { | ||
| 436 | ✗ | *mpd = 500; | |
| 437 | ✗ | *ncv = PetscMin(dim,nev+(*mpd)); | |
| 438 | } | ||
| 439 | } | ||
| 440 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1468 | if (*mpd==PETSC_DETERMINE) *mpd = *ncv; |
| 441 |
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.
|
286 | PetscFunctionReturn(PETSC_SUCCESS); |
| 442 | } | ||
| 443 | |||
| 444 | /*@ | ||
| 445 | PEPAllocateSolution - Allocate memory storage for common variables such | ||
| 446 | as eigenvalues and eigenvectors. | ||
| 447 | |||
| 448 | Collective | ||
| 449 | |||
| 450 | Input Parameters: | ||
| 451 | + pep - the polynomial eigensolver context | ||
| 452 | - extra - number of additional positions, used for methods that require a | ||
| 453 | working basis slightly larger than `ncv` | ||
| 454 | |||
| 455 | Developer Note: | ||
| 456 | This is `SLEPC_EXTERN` because it may be required by user plugin `PEP` | ||
| 457 | implementations. | ||
| 458 | |||
| 459 | Level: developer | ||
| 460 | |||
| 461 | .seealso: [](ch:pep), `PEPSetUp()`, `PEPSetDimensions()` | ||
| 462 | @*/ | ||
| 463 | 2169 | PetscErrorCode PEPAllocateSolution(PEP pep,PetscInt extra) | |
| 464 | { | ||
| 465 | 2169 | PetscInt oldsize,requested,requestedbv; | |
| 466 | 2169 | Vec t; | |
| 467 | |||
| 468 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2169 | PetscFunctionBegin; |
| 469 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2169 | requested = (pep->lineariz? pep->ncv: pep->ncv*(pep->nmat-1)) + extra; |
| 470 | 2169 | requestedbv = pep->ncv + extra; | |
| 471 | |||
| 472 | /* oldsize is zero if this is the first time setup is called */ | ||
| 473 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2169 | PetscCall(BVGetSizes(pep->V,NULL,NULL,&oldsize)); |
| 474 | |||
| 475 | /* allocate space for eigenvalues and friends */ | ||
| 476 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
|
2169 | if (requested != oldsize || !pep->eigr) { |
| 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.
|
2129 | PetscCall(PetscFree4(pep->eigr,pep->eigi,pep->errest,pep->perm)); |
| 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.
|
2129 | PetscCall(PetscMalloc4(requested,&pep->eigr,requested,&pep->eigi,requested,&pep->errest,requested,&pep->perm)); |
| 479 | } | ||
| 480 | |||
| 481 | /* allocate V */ | ||
| 482 |
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.
|
2169 | if (!pep->V) PetscCall(PEPGetBV(pep,&pep->V)); |
| 483 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2169 | if (!oldsize) { |
| 484 |
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.
|
1956 | if (!((PetscObject)pep->V)->type_name) PetscCall(BVSetType(pep->V,BVMAT)); |
| 485 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1956 | PetscCall(STMatCreateVecsEmpty(pep->st,&t,NULL)); |
| 486 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1956 | PetscCall(BVSetSizesFromVec(pep->V,t,requestedbv)); |
| 487 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1956 | PetscCall(VecDestroy(&t)); |
| 488 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
213 | } else PetscCall(BVResize(pep->V,requestedbv,PETSC_FALSE)); |
| 489 |
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.
|
425 | PetscFunctionReturn(PETSC_SUCCESS); |
| 490 | } | ||
| 491 |