| 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 polynomial eigensolver: "stoar" | ||
| 12 | |||
| 13 | Method: S-TOAR with spectrum slicing for symmetric quadratic eigenproblems | ||
| 14 | |||
| 15 | Algorithm: | ||
| 16 | |||
| 17 | Symmetric Two-Level Orthogonal Arnoldi. | ||
| 18 | |||
| 19 | References: | ||
| 20 | |||
| 21 | [1] C. Campos and J.E. Roman, "Inertia-based spectrum slicing | ||
| 22 | for symmetric quadratic eigenvalue problems", Numer. Linear | ||
| 23 | Algebra Appl. 27(4):e2293, 2020. | ||
| 24 | */ | ||
| 25 | |||
| 26 | #include <slepc/private/pepimpl.h> /*I "slepcpep.h" I*/ | ||
| 27 | #include "../src/pep/impls/krylov/pepkrylov.h" | ||
| 28 | #include <slepcblaslapack.h> | ||
| 29 | |||
| 30 | static PetscBool cited = PETSC_FALSE; | ||
| 31 | static const char citation[] = | ||
| 32 | "@Article{slepc-slice-qep,\n" | ||
| 33 | " author = \"C. Campos and J. E. Roman\",\n" | ||
| 34 | " title = \"Inertia-based spectrum slicing for symmetric quadratic eigenvalue problems\",\n" | ||
| 35 | " journal = \"Numer. Linear Algebra Appl.\",\n" | ||
| 36 | " volume = \"27\",\n" | ||
| 37 | " number = \"4\",\n" | ||
| 38 | " pages = \"e2293\",\n" | ||
| 39 | " year = \"2020,\"\n" | ||
| 40 | " doi = \"https://doi.org/10.1002/nla.2293\"\n" | ||
| 41 | "}\n"; | ||
| 42 | |||
| 43 | #define SLICE_PTOL PETSC_SQRT_MACHINE_EPSILON | ||
| 44 | |||
| 45 | 132 | static PetscErrorCode PEPQSliceResetSR(PEP pep) | |
| 46 | { | ||
| 47 | 132 | PEP_STOAR *ctx=(PEP_STOAR*)pep->data; | |
| 48 | 132 | PEP_SR sr=ctx->sr; | |
| 49 | 132 | PEP_shift s; | |
| 50 | 132 | PetscInt i; | |
| 51 | |||
| 52 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
132 | PetscFunctionBegin; |
| 53 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
132 | if (sr) { |
| 54 | /* Reviewing list of shifts to free memory */ | ||
| 55 | 66 | s = sr->s0; | |
| 56 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
66 | if (s) { |
| 57 | 174 | while (s->neighb[1]) { | |
| 58 | 116 | s = s->neighb[1]; | |
| 59 |
8/10✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 8 times.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 2 times.
|
174 | PetscCall(PetscFree(s->neighb[0])); |
| 60 | } | ||
| 61 |
6/8✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
58 | PetscCall(PetscFree(s)); |
| 62 | } | ||
| 63 |
5/8✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
66 | PetscCall(PetscFree(sr->S)); |
| 64 |
8/10✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 8 times.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 2 times.
|
1470 | for (i=0;i<pep->nconv;i++) PetscCall(PetscFree(sr->qinfo[i].q)); |
| 65 |
5/8✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
66 | PetscCall(PetscFree(sr->qinfo)); |
| 66 |
7/8✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
|
264 | for (i=0;i<3;i++) PetscCall(VecDestroy(&sr->v[i])); |
| 67 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
66 | PetscCall(EPSDestroy(&sr->eps)); |
| 68 |
6/8✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
66 | PetscCall(PetscFree(sr)); |
| 69 | } | ||
| 70 | 132 | ctx->sr = NULL; | |
| 71 |
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.
|
132 | PetscFunctionReturn(PETSC_SUCCESS); |
| 72 | } | ||
| 73 | |||
| 74 | 66 | PetscErrorCode PEPReset_STOAR_QSlice(PEP pep) | |
| 75 | { | ||
| 76 | 66 | PEP_STOAR *ctx=(PEP_STOAR*)pep->data; | |
| 77 | |||
| 78 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
66 | PetscFunctionBegin; |
| 79 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
66 | PetscCall(PEPQSliceResetSR(pep)); |
| 80 |
5/8✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
66 | PetscCall(PetscFree(ctx->inertias)); |
| 81 |
5/8✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
66 | PetscCall(PetscFree(ctx->shifts)); |
| 82 |
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); |
| 83 | } | ||
| 84 | |||
| 85 | /* | ||
| 86 | PEPQSliceAllocateSolution - Allocate memory storage for common variables such | ||
| 87 | as eigenvalues and eigenvectors. | ||
| 88 | */ | ||
| 89 | 58 | static PetscErrorCode PEPQSliceAllocateSolution(PEP pep) | |
| 90 | { | ||
| 91 | 58 | PEP_STOAR *ctx=(PEP_STOAR*)pep->data; | |
| 92 | 58 | PetscInt k; | |
| 93 | 58 | BVType type; | |
| 94 | 58 | Vec t; | |
| 95 | 58 | PEP_SR sr = ctx->sr; | |
| 96 | |||
| 97 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
58 | PetscFunctionBegin; |
| 98 | /* allocate space for eigenvalues and friends */ | ||
| 99 | 58 | k = PetscMax(1,sr->numEigs); | |
| 100 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(PetscFree4(sr->eigr,sr->eigi,sr->errest,sr->perm)); |
| 101 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(PetscCalloc4(k,&sr->eigr,k,&sr->eigi,k,&sr->errest,k,&sr->perm)); |
| 102 |
5/8✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
58 | PetscCall(PetscFree(sr->qinfo)); |
| 103 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(PetscCalloc1(k,&sr->qinfo)); |
| 104 | |||
| 105 | /* allocate sr->V and transfer options from pep->V */ | ||
| 106 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(BVDestroy(&sr->V)); |
| 107 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(BVCreate(PetscObjectComm((PetscObject)pep),&sr->V)); |
| 108 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
58 | if (!pep->V) PetscCall(PEPGetBV(pep,&pep->V)); |
| 109 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
58 | if (!((PetscObject)pep->V)->type_name) PetscCall(BVSetType(sr->V,BVMAT)); |
| 110 | else { | ||
| 111 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(BVGetType(pep->V,&type)); |
| 112 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(BVSetType(sr->V,type)); |
| 113 | } | ||
| 114 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(STMatCreateVecsEmpty(pep->st,&t,NULL)); |
| 115 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(BVSetSizesFromVec(sr->V,t,k+1)); |
| 116 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(VecDestroy(&t)); |
| 117 | 58 | sr->ld = k; | |
| 118 |
5/8✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
58 | PetscCall(PetscFree(sr->S)); |
| 119 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(PetscMalloc1((k+1)*sr->ld*(pep->nmat-1),&sr->S)); |
| 120 |
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.
|
14 | PetscFunctionReturn(PETSC_SUCCESS); |
| 121 | } | ||
| 122 | |||
| 123 | /* Convergence test to compute positive Ritz values */ | ||
| 124 | 264 | static PetscErrorCode ConvergedPositive(EPS eps,PetscScalar eigr,PetscScalar eigi,PetscReal res,PetscReal *errest,void *ctx) | |
| 125 | { | ||
| 126 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
264 | PetscFunctionBegin; |
| 127 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
264 | *errest = (PetscRealPart(eigr)>0.0)?0.0:res; |
| 128 |
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.
|
264 | PetscFunctionReturn(PETSC_SUCCESS); |
| 129 | } | ||
| 130 | |||
| 131 | 272 | static PetscErrorCode PEPQSliceMatGetInertia(PEP pep,PetscReal shift,PetscInt *inertia,PetscInt *zeros) | |
| 132 | { | ||
| 133 | 272 | KSP ksp,kspr; | |
| 134 | 272 | PC pc; | |
| 135 | 272 | Mat F; | |
| 136 | 272 | PetscBool flg; | |
| 137 | |||
| 138 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
272 | PetscFunctionBegin; |
| 139 |
6/8✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
272 | if (!pep->solvematcoeffs) PetscCall(PetscMalloc1(pep->nmat,&pep->solvematcoeffs)); |
| 140 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
|
272 | if (shift==PETSC_MAX_REAL) { /* Inertia of matrix A[2] */ |
| 141 | ✗ | pep->solvematcoeffs[0] = 0.0; pep->solvematcoeffs[1] = 0.0; pep->solvematcoeffs[2] = 1.0; | |
| 142 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
272 | } else PetscCall(PEPEvaluateBasis(pep,shift,0,pep->solvematcoeffs,NULL)); |
| 143 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
272 | PetscCall(STMatSetUp(pep->st,pep->sfactor,pep->solvematcoeffs)); |
| 144 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
272 | PetscCall(STGetKSP(pep->st,&ksp)); |
| 145 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
272 | PetscCall(KSPGetPC(ksp,&pc)); |
| 146 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
272 | PetscCall(PetscObjectTypeCompare((PetscObject)pc,PCREDUNDANT,&flg)); |
| 147 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
|
272 | if (flg) { |
| 148 | ✗ | PetscCall(PCRedundantGetKSP(pc,&kspr)); | |
| 149 | ✗ | PetscCall(KSPGetPC(kspr,&pc)); | |
| 150 | } | ||
| 151 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
272 | PetscCall(PetscObjectTypeCompare((PetscObject)pc,PCTELESCOPE,&flg)); |
| 152 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 8 times.
|
272 | if (flg) { |
| 153 |
1/6✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
14 | PetscCall(PCTelescopeGetKSP(pc,&kspr)); |
| 154 |
1/6✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
14 | PetscCall(KSPGetPC(kspr,&pc)); |
| 155 | } | ||
| 156 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
272 | PetscCall(PCFactorGetMatrix(pc,&F)); |
| 157 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
272 | PetscCall(PCSetUp(pc)); |
| 158 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
272 | PetscCall(MatGetInertia(F,inertia,zeros,NULL)); |
| 159 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
65 | PetscFunctionReturn(PETSC_SUCCESS); |
| 160 | } | ||
| 161 | |||
| 162 | 256 | static PetscErrorCode PEPQSliceGetInertia(PEP pep,PetscReal shift,PetscInt *inertia,PetscInt *zeros,PetscInt correction) | |
| 163 | { | ||
| 164 | 256 | KSP ksp; | |
| 165 | 256 | Mat P; | |
| 166 | 256 | PetscReal nzshift=0.0,dot; | |
| 167 | 256 | PetscRandom rand; | |
| 168 | 256 | PetscInt nconv; | |
| 169 | 256 | PEP_STOAR *ctx=(PEP_STOAR*)pep->data; | |
| 170 | 256 | PEP_SR sr=ctx->sr; | |
| 171 | |||
| 172 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
256 | PetscFunctionBegin; |
| 173 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
|
256 | if (shift >= PETSC_MAX_REAL) { /* Right-open interval */ |
| 174 | ✗ | *inertia = 0; | |
| 175 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
|
256 | } else if (shift <= PETSC_MIN_REAL) { |
| 176 | ✗ | *inertia = 0; | |
| 177 | ✗ | if (zeros) *zeros = 0; | |
| 178 | } else { | ||
| 179 | /* If the shift is zero, perturb it to a very small positive value. | ||
| 180 | The goal is that the nonzero pattern is the same in all cases and reuse | ||
| 181 | the symbolic factorizations */ | ||
| 182 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
256 | nzshift = (shift==0.0)? 10.0/PETSC_MAX_REAL: shift; |
| 183 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
256 | PetscCall(PEPQSliceMatGetInertia(pep,nzshift,inertia,zeros)); |
| 184 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
256 | PetscCall(STSetShift(pep->st,nzshift)); |
| 185 | } | ||
| 186 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
256 | if (!correction) { |
| 187 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
|
150 | if (shift >= PETSC_MAX_REAL) *inertia = 2*pep->n; |
| 188 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
150 | else if (shift>PETSC_MIN_REAL) { |
| 189 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
150 | PetscCall(STGetKSP(pep->st,&ksp)); |
| 190 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
150 | PetscCall(KSPGetOperators(ksp,&P,NULL)); |
| 191 |
4/4✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
|
150 | if (*inertia!=pep->n && !sr->v[0]) { |
| 192 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
50 | PetscCall(MatCreateVecs(P,&sr->v[0],NULL)); |
| 193 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
50 | PetscCall(VecDuplicate(sr->v[0],&sr->v[1])); |
| 194 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
50 | PetscCall(VecDuplicate(sr->v[0],&sr->v[2])); |
| 195 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
50 | PetscCall(BVGetRandomContext(pep->V,&rand)); |
| 196 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
50 | PetscCall(VecSetRandom(sr->v[0],rand)); |
| 197 | } | ||
| 198 |
4/4✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
|
150 | if (*inertia<pep->n && *inertia>0) { |
| 199 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
78 | if (!sr->eps) { |
| 200 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
42 | PetscCall(EPSCreate(PetscObjectComm((PetscObject)pep),&sr->eps)); |
| 201 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
42 | PetscCall(EPSSetProblemType(sr->eps,EPS_HEP)); |
| 202 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
42 | PetscCall(EPSSetWhichEigenpairs(sr->eps,EPS_LARGEST_REAL)); |
| 203 | } | ||
| 204 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
78 | PetscCall(EPSSetConvergenceTestFunction(sr->eps,ConvergedPositive,NULL,NULL)); |
| 205 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
78 | PetscCall(EPSSetOperators(sr->eps,P,NULL)); |
| 206 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
78 | PetscCall(EPSSolve(sr->eps)); |
| 207 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
78 | PetscCall(EPSGetConverged(sr->eps,&nconv)); |
| 208 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
78 | PetscCheck(nconv,((PetscObject)pep)->comm,PETSC_ERR_CONV_FAILED,"Inertia computation fails in %g",(double)nzshift); |
| 209 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
78 | PetscCall(EPSGetEigenpair(sr->eps,0,NULL,NULL,sr->v[0],sr->v[1])); |
| 210 | } | ||
| 211 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
150 | if (*inertia!=pep->n) { |
| 212 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
102 | PetscCall(MatMult(pep->A[1],sr->v[0],sr->v[1])); |
| 213 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
102 | PetscCall(MatMult(pep->A[2],sr->v[0],sr->v[2])); |
| 214 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
102 | PetscCall(VecAXPY(sr->v[1],2*nzshift,sr->v[2])); |
| 215 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
102 | PetscCall(VecDotRealPart(sr->v[1],sr->v[0],&dot)); |
| 216 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
102 | if (dot>0.0) *inertia = 2*pep->n-*inertia; |
| 217 | } | ||
| 218 | } | ||
| 219 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
106 | } else if (correction<0) *inertia = 2*pep->n-*inertia; |
| 220 |
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.
|
61 | PetscFunctionReturn(PETSC_SUCCESS); |
| 221 | } | ||
| 222 | |||
| 223 | /* | ||
| 224 | Check eigenvalue type - used only in non-hyperbolic problems. | ||
| 225 | All computed eigenvalues must have the same definite type (positive or negative). | ||
| 226 | If ini=TRUE the type is available in omega, otherwise we compute an eigenvalue | ||
| 227 | closest to shift and determine its type. | ||
| 228 | */ | ||
| 229 | 2300 | static PetscErrorCode PEPQSliceCheckEigenvalueType(PEP pep,PetscReal shift,PetscReal omega,PetscBool ini) | |
| 230 | { | ||
| 231 | 2300 | PEP pep2; | |
| 232 | 2300 | ST st; | |
| 233 | 2300 | PetscInt nconv; | |
| 234 | 2300 | PetscScalar lambda; | |
| 235 | 2300 | PetscReal dot; | |
| 236 | 2300 | PEP_STOAR *ctx=(PEP_STOAR*)pep->data; | |
| 237 | 2300 | PEP_SR sr=ctx->sr; | |
| 238 | |||
| 239 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2300 | PetscFunctionBegin; |
| 240 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
2300 | if (!ini) { |
| 241 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
2268 | PetscCheck(-(omega/(shift*ctx->alpha+ctx->beta))*sr->type>=0,((PetscObject)pep)->comm,PETSC_ERR_CONV_FAILED,"Different positive/negative type detected in eigenvalue %g",(double)shift); |
| 242 | } else { | ||
| 243 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
32 | PetscCall(PEPCreate(PetscObjectComm((PetscObject)pep),&pep2)); |
| 244 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
32 | PetscCall(PEPSetOptionsPrefix(pep2,((PetscObject)pep)->prefix)); |
| 245 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
32 | PetscCall(PEPAppendOptionsPrefix(pep2,"pep_eigenvalue_type_")); |
| 246 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
32 | PetscCall(PEPSetTolerances(pep2,PETSC_CURRENT,pep->max_it/4)); |
| 247 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
32 | PetscCall(PEPSetType(pep2,PEPTOAR)); |
| 248 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
32 | PetscCall(PEPSetOperators(pep2,pep->nmat,pep->A)); |
| 249 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
32 | PetscCall(PEPSetWhichEigenpairs(pep2,PEP_TARGET_MAGNITUDE)); |
| 250 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
32 | PetscCall(PEPGetRG(pep2,&pep2->rg)); |
| 251 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
32 | PetscCall(RGSetType(pep2->rg,RGINTERVAL)); |
| 252 | #if defined(PETSC_USE_COMPLEX) | ||
| 253 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
16 | PetscCall(RGIntervalSetEndpoints(pep2->rg,pep->inta,pep->intb,-PETSC_SQRT_MACHINE_EPSILON,PETSC_SQRT_MACHINE_EPSILON)); |
| 254 | #else | ||
| 255 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
16 | PetscCall(RGIntervalSetEndpoints(pep2->rg,pep->inta,pep->intb,0.0,0.0)); |
| 256 | #endif | ||
| 257 | 32 | pep2->target = shift; | |
| 258 | 32 | st = pep2->st; | |
| 259 | 32 | pep2->st = pep->st; | |
| 260 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
32 | PetscCall(PEPSolve(pep2)); |
| 261 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
32 | PetscCall(PEPGetConverged(pep2,&nconv)); |
| 262 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
32 | if (nconv) { |
| 263 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
32 | PetscCall(PEPGetEigenpair(pep2,0,&lambda,NULL,pep2->work[0],NULL)); |
| 264 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
32 | PetscCall(MatMult(pep->A[1],pep2->work[0],pep2->work[1])); |
| 265 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
32 | PetscCall(MatMult(pep->A[2],pep2->work[0],pep2->work[2])); |
| 266 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
32 | PetscCall(VecAXPY(pep2->work[1],2.0*lambda*pep->sfactor,pep2->work[2])); |
| 267 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
32 | PetscCall(VecDotRealPart(pep2->work[1],pep2->work[0],&dot)); |
| 268 |
5/8✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
64 | PetscCall(PetscInfo(pep,"lambda=%g, %s type\n",(double)PetscRealPart(lambda),(dot>0.0)?"positive":"negative")); |
| 269 |
3/4✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
|
48 | if (!sr->type) sr->type = (dot>0.0)?1:-1; |
| 270 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
16 | else PetscCheck(sr->type*dot>=0.0,((PetscObject)pep)->comm,PETSC_ERR_CONV_FAILED,"Different positive/negative type detected in eigenvalue %g",(double)PetscRealPart(lambda)); |
| 271 | } | ||
| 272 | 32 | pep2->st = st; | |
| 273 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
32 | PetscCall(PEPDestroy(&pep2)); |
| 274 | } | ||
| 275 |
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.
|
555 | PetscFunctionReturn(PETSC_SUCCESS); |
| 276 | } | ||
| 277 | |||
| 278 | 24 | static inline PetscErrorCode PEPQSliceDiscriminant(PEP pep,Vec u,Vec w,PetscReal *d,PetscReal *smas,PetscReal *smenos) | |
| 279 | { | ||
| 280 | 24 | PetscReal ap,bp,cp,dis; | |
| 281 | |||
| 282 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
24 | PetscFunctionBegin; |
| 283 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
24 | PetscCall(MatMult(pep->A[0],u,w)); |
| 284 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
24 | PetscCall(VecDotRealPart(w,u,&cp)); |
| 285 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
24 | PetscCall(MatMult(pep->A[1],u,w)); |
| 286 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
24 | PetscCall(VecDotRealPart(w,u,&bp)); |
| 287 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
24 | PetscCall(MatMult(pep->A[2],u,w)); |
| 288 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
24 | PetscCall(VecDotRealPart(w,u,&ap)); |
| 289 | 24 | dis = bp*bp-4*ap*cp; | |
| 290 |
2/4✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
|
24 | if (dis>=0.0 && smas) { |
| 291 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
|
24 | if (ap>0) *smas = (-bp+PetscSqrtReal(dis))/(2*ap); |
| 292 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
24 | else if (ap<0) *smas = (-bp-PetscSqrtReal(dis))/(2*ap); |
| 293 | else { | ||
| 294 | ✗ | if (bp >0) *smas = -cp/bp; | |
| 295 | ✗ | else *smas = PETSC_MAX_REAL; | |
| 296 | } | ||
| 297 | } | ||
| 298 |
4/4✓ Branch 0 taken 8 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 3 times.
|
24 | if (dis>=0.0 && smenos) { |
| 299 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
|
16 | if (ap>0) *smenos = (-bp-PetscSqrtReal(dis))/(2*ap); |
| 300 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
16 | else if (ap<0) *smenos = (-bp+PetscSqrtReal(dis))/(2*ap); |
| 301 | else { | ||
| 302 | ✗ | if (bp<0) *smenos = -cp/bp; | |
| 303 | ✗ | else *smenos = PETSC_MAX_REAL; | |
| 304 | } | ||
| 305 | } | ||
| 306 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
24 | if (d) *d = dis; |
| 307 |
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); |
| 308 | } | ||
| 309 | |||
| 310 | 16 | static inline PetscErrorCode PEPQSliceEvaluateQEP(PEP pep,PetscScalar x,Mat M,MatStructure str) | |
| 311 | { | ||
| 312 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
16 | PetscFunctionBegin; |
| 313 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
16 | PetscCall(MatCopy(pep->A[0],M,SAME_NONZERO_PATTERN)); |
| 314 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
16 | PetscCall(MatAXPY(M,x,pep->A[1],str)); |
| 315 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
16 | PetscCall(MatAXPY(M,x*x,pep->A[2],str)); |
| 316 |
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.
|
4 | PetscFunctionReturn(PETSC_SUCCESS); |
| 317 | } | ||
| 318 | |||
| 319 | /*@ | ||
| 320 | PEPCheckDefiniteQEP - Determines if a symmetric/Hermitian quadratic eigenvalue problem | ||
| 321 | is definite or not. | ||
| 322 | |||
| 323 | Collective | ||
| 324 | |||
| 325 | Input Parameter: | ||
| 326 | . pep - the polynomial eigensolver context | ||
| 327 | |||
| 328 | Output Parameters: | ||
| 329 | + xi - first computed parameter | ||
| 330 | . mu - second computed parameter | ||
| 331 | . definite - flag indicating that the problem is definite | ||
| 332 | - hyperbolic - flag indicating that the problem is hyperbolic | ||
| 333 | |||
| 334 | Notes: | ||
| 335 | This function is intended for quadratic eigenvalue problems, $Q(\lambda)=K+\lambda C+\lambda^2M$, | ||
| 336 | with symmetric (or Hermitian) coefficient matrices $K$, $C$, $M$. | ||
| 337 | |||
| 338 | On output, the flag `definite` may have the values -1 (meaning that the QEP is not | ||
| 339 | definite), 1 (if the problem is definite), or 0 if the algorithm was not able to | ||
| 340 | determine whether the problem is definite or not. | ||
| 341 | |||
| 342 | If `definite`=1, the output flag `hyperbolic` informs in a similar way about whether the | ||
| 343 | problem is hyperbolic or not. | ||
| 344 | |||
| 345 | If `definite`=1, the computed values `xi` and `mu` satisfy $Q(\xi)<0$ and $Q(\mu)>0$, | ||
| 346 | as obtained via the method proposed by {cite:t}`Nie10`. Furthermore, if | ||
| 347 | `hyperbolic`=1 then only `xi` is computed. | ||
| 348 | |||
| 349 | Level: advanced | ||
| 350 | |||
| 351 | .seealso: [](ch:pep), `PEPSetProblemType()` | ||
| 352 | @*/ | ||
| 353 | 8 | PetscErrorCode PEPCheckDefiniteQEP(PEP pep,PetscReal *xi,PetscReal *mu,PetscInt *definite,PetscInt *hyperbolic) | |
| 354 | { | ||
| 355 | 8 | PetscRandom rand; | |
| 356 | 8 | Vec u,w; | |
| 357 | 8 | PetscReal d=0.0,s=0.0,sp,mut=0.0,omg=0.0,omgp; | |
| 358 | 8 | PetscInt k,its=10,hyp=0,check=0,nconv,inertia,n; | |
| 359 | 8 | Mat M=NULL; | |
| 360 | 8 | MatStructure str; | |
| 361 | 8 | EPS eps; | |
| 362 | 8 | PetscBool transform,ptypehyp; | |
| 363 | |||
| 364 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
8 | PetscFunctionBegin; |
| 365 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
8 | PetscCheck(pep->problem_type==PEP_HERMITIAN || pep->problem_type==PEP_HYPERBOLIC,PetscObjectComm((PetscObject)pep),PETSC_ERR_SUP,"Only available for Hermitian (or hyperbolic) problems"); |
| 366 | 8 | ptypehyp = (pep->problem_type==PEP_HYPERBOLIC)? PETSC_TRUE: PETSC_FALSE; | |
| 367 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
8 | if (!pep->st) PetscCall(PEPGetST(pep,&pep->st)); |
| 368 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(PEPSetDefaultST(pep)); |
| 369 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(STSetMatrices(pep->st,pep->nmat,pep->A)); |
| 370 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(MatGetSize(pep->A[0],&n,NULL)); |
| 371 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(STGetTransform(pep->st,&transform)); |
| 372 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(STSetTransform(pep->st,PETSC_FALSE)); |
| 373 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(STSetUp(pep->st)); |
| 374 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(MatCreateVecs(pep->A[0],&u,&w)); |
| 375 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(PEPGetBV(pep,&pep->V)); |
| 376 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(BVGetRandomContext(pep->V,&rand)); |
| 377 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(VecSetRandom(u,rand)); |
| 378 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(VecNormalize(u,NULL)); |
| 379 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(PEPQSliceDiscriminant(pep,u,w,&d,&s,NULL)); |
| 380 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
8 | if (d<0.0) check = -1; |
| 381 | 8 | if (!check) { | |
| 382 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(EPSCreate(PetscObjectComm((PetscObject)pep),&eps)); |
| 383 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(EPSSetProblemType(eps,EPS_HEP)); |
| 384 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(EPSSetWhichEigenpairs(eps,EPS_LARGEST_REAL)); |
| 385 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(EPSSetTolerances(eps,PetscSqrtReal(PETSC_SQRT_MACHINE_EPSILON),PETSC_DECIDE)); |
| 386 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(MatDuplicate(pep->A[0],MAT_DO_NOT_COPY_VALUES,&M)); |
| 387 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(STGetMatStructure(pep->st,&str)); |
| 388 | } | ||
| 389 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
8 | for (k=0;k<its&&!check;k++) { |
| 390 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(PEPQSliceEvaluateQEP(pep,s,M,str)); |
| 391 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(EPSSetOperators(eps,M,NULL)); |
| 392 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(EPSSolve(eps)); |
| 393 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(EPSGetConverged(eps,&nconv)); |
| 394 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
8 | if (!nconv) break; |
| 395 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(EPSGetEigenpair(eps,0,NULL,NULL,u,w)); |
| 396 | 8 | sp = s; | |
| 397 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(PEPQSliceDiscriminant(pep,u,w,&d,&s,&omg)); |
| 398 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
16 | if (d<0.0) {check = -1; break;} |
| 399 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
8 | if (PetscAbsReal((s-sp)/s)<100*PETSC_MACHINE_EPSILON) break; |
| 400 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
8 | if (s>sp) hyp = -1; |
| 401 | 8 | mut = 2*s-sp; | |
| 402 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(PEPQSliceMatGetInertia(pep,mut,&inertia,NULL)); |
| 403 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
|
8 | if (inertia == n) {check = 1; break;} |
| 404 | } | ||
| 405 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
|
8 | for (;k<its&&!check;k++) { |
| 406 | ✗ | mut = (s-omg)/2; | |
| 407 | ✗ | PetscCall(PEPQSliceMatGetInertia(pep,mut,&inertia,NULL)); | |
| 408 | ✗ | if (inertia == n) {check = 1; break;} | |
| 409 | ✗ | if (PetscAbsReal((s-omg)/omg)<100*PETSC_MACHINE_EPSILON) break; | |
| 410 | ✗ | PetscCall(PEPQSliceEvaluateQEP(pep,omg,M,str)); | |
| 411 | ✗ | PetscCall(EPSSetOperators(eps,M,NULL)); | |
| 412 | ✗ | PetscCall(EPSSolve(eps)); | |
| 413 | ✗ | PetscCall(EPSGetConverged(eps,&nconv)); | |
| 414 | ✗ | if (!nconv) break; | |
| 415 | ✗ | PetscCall(EPSGetEigenpair(eps,0,NULL,NULL,u,w)); | |
| 416 | ✗ | omgp = omg; | |
| 417 | ✗ | PetscCall(PEPQSliceDiscriminant(pep,u,w,&d,NULL,&omg)); | |
| 418 | ✗ | if (d<0.0) {check = -1; break;} | |
| 419 | ✗ | if (omg<omgp) hyp = -1; | |
| 420 | } | ||
| 421 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
8 | if (check==1) *xi = mut; |
| 422 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
8 | PetscCheck(hyp!=-1 || !ptypehyp,PetscObjectComm((PetscObject)pep),PETSC_ERR_PLIB,"Problem does not satisfy hyperbolic test; consider removing the hyperbolicity flag"); |
| 423 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
|
8 | if (check==1 && hyp==0) { |
| 424 | ✗ | PetscCall(PEPQSliceMatGetInertia(pep,PETSC_MAX_REAL,&inertia,NULL)); | |
| 425 | ✗ | if (inertia == 0) hyp = 1; | |
| 426 | ✗ | else hyp = -1; | |
| 427 | } | ||
| 428 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
8 | if (check==1 && hyp!=1) { |
| 429 | 8 | check = 0; | |
| 430 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(EPSSetWhichEigenpairs(eps,EPS_SMALLEST_REAL)); |
| 431 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
8 | for (;k<its&&!check;k++) { |
| 432 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(PEPQSliceEvaluateQEP(pep,s,M,str)); |
| 433 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(EPSSetOperators(eps,M,NULL)); |
| 434 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(EPSSolve(eps)); |
| 435 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(EPSGetConverged(eps,&nconv)); |
| 436 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
8 | if (!nconv) break; |
| 437 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(EPSGetEigenpair(eps,0,NULL,NULL,u,w)); |
| 438 | 8 | sp = s; | |
| 439 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(PEPQSliceDiscriminant(pep,u,w,&d,&s,&omg)); |
| 440 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
16 | if (d<0.0) {check = -1; break;} |
| 441 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
8 | if (PetscAbsReal((s-sp)/s)<100*PETSC_MACHINE_EPSILON) break; |
| 442 | 8 | mut = 2*s-sp; | |
| 443 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(PEPQSliceMatGetInertia(pep,mut,&inertia,NULL)); |
| 444 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
|
8 | if (inertia == 0) {check = 1; break;} |
| 445 | } | ||
| 446 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
|
8 | for (;k<its&&!check;k++) { |
| 447 | ✗ | mut = (s-omg)/2; | |
| 448 | ✗ | PetscCall(PEPQSliceMatGetInertia(pep,mut,&inertia,NULL)); | |
| 449 | ✗ | if (inertia == 0) {check = 1; break;} | |
| 450 | ✗ | if (PetscAbsReal((s-omg)/omg)<100*PETSC_MACHINE_EPSILON) break; | |
| 451 | ✗ | PetscCall(PEPQSliceEvaluateQEP(pep,omg,M,str)); | |
| 452 | ✗ | PetscCall(EPSSetOperators(eps,M,NULL)); | |
| 453 | ✗ | PetscCall(EPSSolve(eps)); | |
| 454 | ✗ | PetscCall(EPSGetConverged(eps,&nconv)); | |
| 455 | ✗ | if (!nconv) break; | |
| 456 | ✗ | PetscCall(EPSGetEigenpair(eps,0,NULL,NULL,u,w)); | |
| 457 | ✗ | PetscCall(PEPQSliceDiscriminant(pep,u,w,&d,NULL,&omg)); | |
| 458 | ✗ | if (d<0.0) {check = -1; break;} | |
| 459 | } | ||
| 460 | } | ||
| 461 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
8 | if (check==1) *mu = mut; |
| 462 | 8 | *definite = check; | |
| 463 | 8 | *hyperbolic = hyp; | |
| 464 |
5/8✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
8 | if (M) PetscCall(MatDestroy(&M)); |
| 465 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(VecDestroy(&u)); |
| 466 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(VecDestroy(&w)); |
| 467 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(EPSDestroy(&eps)); |
| 468 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(STSetTransform(pep->st,transform)); |
| 469 |
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); |
| 470 | } | ||
| 471 | |||
| 472 | /* | ||
| 473 | Dummy backtransform operation | ||
| 474 | */ | ||
| 475 | ✗ | static PetscErrorCode PEPBackTransform_Skip(PEP pep) | |
| 476 | { | ||
| 477 | ✗ | PetscFunctionBegin; | |
| 478 | ✗ | PetscFunctionReturn(PETSC_SUCCESS); | |
| 479 | } | ||
| 480 | |||
| 481 | 66 | PetscErrorCode PEPSetUp_STOAR_QSlice(PEP pep) | |
| 482 | { | ||
| 483 | 66 | PEP_STOAR *ctx=(PEP_STOAR*)pep->data; | |
| 484 | 66 | PEP_SR sr; | |
| 485 | 66 | PetscInt ld,i,zeros=0; | |
| 486 | 66 | SlepcSC sc; | |
| 487 | 66 | PetscReal r; | |
| 488 | |||
| 489 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
66 | PetscFunctionBegin; |
| 490 |
6/10✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 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.
|
66 | PEPCheckSinvertCayley(pep); |
| 491 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
66 | PetscCheck(pep->inta<pep->intb,PetscObjectComm((PetscObject)pep),PETSC_ERR_SUP,"This solver does not support computing all eigenvalues unless you provide a computational interval with PEPSetInterval()"); |
| 492 |
1/6✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
66 | PetscCheck(pep->intb<PETSC_MAX_REAL || pep->inta>PETSC_MIN_REAL,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_WRONG,"The defined computational interval should have at least one of their sides bounded"); |
| 493 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
66 | PEPCheckUnsupportedCondition(pep,PEP_FEATURE_STOPPING,PETSC_TRUE," (with spectrum slicing)"); |
| 494 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
66 | if (pep->tol==(PetscReal)PETSC_DETERMINE) { |
| 495 | #if defined(PETSC_USE_REAL_SINGLE) | ||
| 496 | pep->tol = SLEPC_DEFAULT_TOL; | ||
| 497 | #else | ||
| 498 | /* use tighter tolerance */ | ||
| 499 | 66 | pep->tol = SLEPC_DEFAULT_TOL*1e-2; | |
| 500 | #endif | ||
| 501 | } | ||
| 502 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
66 | if (ctx->nev==1) ctx->nev = PetscMin(20,pep->n); /* nev not set, use default value */ |
| 503 |
2/6✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
66 | PetscCheck(pep->n<=10 || ctx->nev>=10,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_WRONG,"nev cannot be less than 10 in spectrum slicing runs"); |
| 504 | 66 | pep->ops->backtransform = PEPBackTransform_Skip; | |
| 505 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
66 | if (pep->max_it==PETSC_DETERMINE) pep->max_it = 100; |
| 506 | |||
| 507 | /* create spectrum slicing context and initialize it */ | ||
| 508 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
66 | PetscCall(PEPQSliceResetSR(pep)); |
| 509 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
66 | PetscCall(PetscNew(&sr)); |
| 510 | 66 | ctx->sr = sr; | |
| 511 | 66 | sr->itsKs = 0; | |
| 512 | 66 | sr->nleap = 0; | |
| 513 | 66 | sr->sPres = NULL; | |
| 514 | |||
| 515 |
1/10✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
66 | if (pep->solvematcoeffs) PetscCall(PetscFree(pep->solvematcoeffs)); |
| 516 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
66 | PetscCall(PetscMalloc1(pep->nmat,&pep->solvematcoeffs)); |
| 517 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
66 | if (!pep->st) PetscCall(PEPGetST(pep,&pep->st)); |
| 518 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
66 | PetscCall(STSetTransform(pep->st,PETSC_FALSE)); |
| 519 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
66 | PetscCall(STSetUp(pep->st)); |
| 520 | |||
| 521 | 66 | ctx->hyperbolic = (pep->problem_type==PEP_HYPERBOLIC)? PETSC_TRUE: PETSC_FALSE; | |
| 522 | |||
| 523 | /* check presence of ends and finding direction */ | ||
| 524 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
66 | if (pep->inta > PETSC_MIN_REAL || pep->intb >= PETSC_MAX_REAL) { |
| 525 | 66 | sr->int0 = pep->inta; | |
| 526 | 66 | sr->int1 = pep->intb; | |
| 527 | 66 | sr->dir = 1; | |
| 528 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
|
66 | if (pep->intb >= PETSC_MAX_REAL) { /* Right-open interval */ |
| 529 | ✗ | sr->hasEnd = PETSC_FALSE; | |
| 530 | 66 | } else sr->hasEnd = PETSC_TRUE; | |
| 531 | } else { | ||
| 532 | ✗ | sr->int0 = pep->intb; | |
| 533 | ✗ | sr->int1 = pep->inta; | |
| 534 | ✗ | sr->dir = -1; | |
| 535 | ✗ | sr->hasEnd = PetscNot(pep->inta <= PETSC_MIN_REAL); | |
| 536 | } | ||
| 537 | |||
| 538 | /* compute inertia0 */ | ||
| 539 |
7/8✓ Branch 0 taken 8 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
122 | PetscCall(PEPQSliceGetInertia(pep,sr->int0,&sr->inertia0,ctx->detect?&zeros:NULL,ctx->hyperbolic?0:1)); |
| 540 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
66 | PetscCheck(!zeros || (sr->int0!=pep->inta && sr->int0!=pep->intb),((PetscObject)pep)->comm,PETSC_ERR_USER,"Found singular matrix for the transformed problem in the interval endpoint"); |
| 541 |
7/10✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 6 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
|
66 | if (!ctx->hyperbolic && ctx->checket) PetscCall(PEPQSliceCheckEigenvalueType(pep,sr->int0,0.0,PETSC_TRUE)); |
| 542 | |||
| 543 | /* compute inertia1 */ | ||
| 544 |
7/8✓ Branch 0 taken 8 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
122 | PetscCall(PEPQSliceGetInertia(pep,sr->int1,&sr->inertia1,ctx->detect?&zeros:NULL,ctx->hyperbolic?0:1)); |
| 545 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
66 | PetscCheck(!zeros,((PetscObject)pep)->comm,PETSC_ERR_USER,"Found singular matrix for the transformed problem in an interval endpoint defined by user"); |
| 546 |
4/6✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
66 | if (!ctx->hyperbolic && ctx->checket && sr->hasEnd) { |
| 547 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
16 | PetscCall(PEPQSliceCheckEigenvalueType(pep,sr->int1,0.0,PETSC_TRUE)); |
| 548 |
1/6✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
16 | PetscCheck(sr->type || sr->inertia1==sr->inertia0,((PetscObject)pep)->comm,PETSC_ERR_CONV_FAILED,"No information of eigenvalue type in interval"); |
| 549 |
2/6✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
16 | PetscCheck(!sr->type || sr->inertia1!=sr->inertia0,((PetscObject)pep)->comm,PETSC_ERR_CONV_FAILED,"Different positive/negative type detected"); |
| 550 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
|
16 | if (sr->dir*(sr->inertia1-sr->inertia0)<0) { |
| 551 | ✗ | sr->intcorr = -1; | |
| 552 | ✗ | sr->inertia0 = 2*pep->n-sr->inertia0; | |
| 553 | ✗ | sr->inertia1 = 2*pep->n-sr->inertia1; | |
| 554 | 16 | } else sr->intcorr = 1; | |
| 555 | } else { | ||
| 556 |
4/4✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
|
50 | if (sr->inertia0<=pep->n && sr->inertia1<=pep->n) sr->intcorr = 1; |
| 557 |
3/4✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
|
34 | else if (sr->inertia0>=pep->n && sr->inertia1>=pep->n) sr->intcorr = -1; |
| 558 | } | ||
| 559 | |||
| 560 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
66 | if (sr->hasEnd) { |
| 561 | 66 | sr->dir = -sr->dir; r = sr->int0; sr->int0 = sr->int1; sr->int1 = r; | |
| 562 | 66 | i = sr->inertia0; sr->inertia0 = sr->inertia1; sr->inertia1 = i; | |
| 563 | } | ||
| 564 | |||
| 565 | /* number of eigenvalues in interval */ | ||
| 566 | 66 | sr->numEigs = (sr->dir)*(sr->inertia1 - sr->inertia0); | |
| 567 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
66 | PetscCall(PetscInfo(pep,"QSlice setup: allocating for %" PetscInt_FMT " eigenvalues in [%g,%g]\n",sr->numEigs,(double)pep->inta,(double)pep->intb)); |
| 568 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
66 | if (sr->numEigs) { |
| 569 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(PEPQSliceAllocateSolution(pep)); |
| 570 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(PEPSetDimensions_Default(pep,ctx->nev,&ctx->ncv,&ctx->mpd)); |
| 571 | 58 | pep->nev = ctx->nev; pep->ncv = ctx->ncv; pep->mpd = ctx->mpd; | |
| 572 | 58 | ld = ctx->ncv+2; | |
| 573 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(DSSetType(pep->ds,DSGHIEP)); |
| 574 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(DSSetCompact(pep->ds,PETSC_TRUE)); |
| 575 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(DSSetExtraRow(pep->ds,PETSC_TRUE)); |
| 576 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(DSAllocate(pep->ds,ld)); |
| 577 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(DSGetSlepcSC(pep->ds,&sc)); |
| 578 | 58 | sc->rg = NULL; | |
| 579 | 58 | sc->comparison = SlepcCompareLargestMagnitude; | |
| 580 | 58 | sc->comparisonctx = NULL; | |
| 581 | 58 | sc->map = NULL; | |
| 582 | 58 | sc->mapobj = NULL; | |
| 583 | 8 | } else {pep->ncv = 0; pep->nev = 0; pep->mpd = 0;} | |
| 584 |
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); |
| 585 | } | ||
| 586 | |||
| 587 | /* | ||
| 588 | Fills the fields of a shift structure | ||
| 589 | */ | ||
| 590 | 190 | static PetscErrorCode PEPCreateShift(PEP pep,PetscReal val,PEP_shift neighb0,PEP_shift neighb1) | |
| 591 | { | ||
| 592 | 190 | PEP_shift s,*pending2; | |
| 593 | 190 | PetscInt i; | |
| 594 | 190 | PEP_SR sr; | |
| 595 | 190 | PEP_STOAR *ctx=(PEP_STOAR*)pep->data; | |
| 596 | |||
| 597 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
190 | PetscFunctionBegin; |
| 598 | 190 | sr = ctx->sr; | |
| 599 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
190 | PetscCall(PetscNew(&s)); |
| 600 | 190 | s->value = val; | |
| 601 | 190 | s->neighb[0] = neighb0; | |
| 602 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
190 | if (neighb0) neighb0->neighb[1] = s; |
| 603 | 190 | s->neighb[1] = neighb1; | |
| 604 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
190 | if (neighb1) neighb1->neighb[0] = s; |
| 605 | 190 | s->comp[0] = PETSC_FALSE; | |
| 606 | 190 | s->comp[1] = PETSC_FALSE; | |
| 607 | 190 | s->index = -1; | |
| 608 | 190 | s->neigs = 0; | |
| 609 | 190 | s->nconv[0] = s->nconv[1] = 0; | |
| 610 | 190 | s->nsch[0] = s->nsch[1]=0; | |
| 611 | /* Inserts in the stack of pending shifts */ | ||
| 612 | /* If needed, the array is resized */ | ||
| 613 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
|
190 | if (sr->nPend >= sr->maxPend) { |
| 614 | ✗ | sr->maxPend *= 2; | |
| 615 | ✗ | PetscCall(PetscMalloc1(sr->maxPend,&pending2)); | |
| 616 | ✗ | for (i=0;i<sr->nPend;i++) pending2[i] = sr->pending[i]; | |
| 617 | ✗ | PetscCall(PetscFree(sr->pending)); | |
| 618 | ✗ | sr->pending = pending2; | |
| 619 | } | ||
| 620 | 190 | sr->pending[sr->nPend++]=s; | |
| 621 |
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.
|
190 | PetscFunctionReturn(PETSC_SUCCESS); |
| 622 | } | ||
| 623 | |||
| 624 | /* Provides next shift to be computed */ | ||
| 625 | 182 | static PetscErrorCode PEPExtractShift(PEP pep) | |
| 626 | { | ||
| 627 | 182 | PetscInt iner,zeros=0; | |
| 628 | 182 | PEP_STOAR *ctx=(PEP_STOAR*)pep->data; | |
| 629 | 182 | PEP_SR sr; | |
| 630 | 182 | PetscReal newShift,aux; | |
| 631 | 182 | PEP_shift sPres; | |
| 632 | |||
| 633 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
182 | PetscFunctionBegin; |
| 634 | 182 | sr = ctx->sr; | |
| 635 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
182 | if (sr->nPend > 0) { |
| 636 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
124 | if (sr->dirch) { |
| 637 | 8 | aux = sr->int1; sr->int1 = sr->int0; sr->int0 = aux; | |
| 638 | 8 | iner = sr->inertia1; sr->inertia1 = sr->inertia0; sr->inertia0 = iner; | |
| 639 | 8 | sr->dir *= -1; | |
| 640 |
5/8✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
8 | PetscCall(PetscFree(sr->s0->neighb[1])); |
| 641 |
5/8✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
8 | PetscCall(PetscFree(sr->s0)); |
| 642 | 8 | sr->nPend--; | |
| 643 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(PEPCreateShift(pep,sr->int0,NULL,NULL)); |
| 644 | 8 | sr->sPrev = NULL; | |
| 645 | 8 | sr->sPres = sr->pending[--sr->nPend]; | |
| 646 | 8 | pep->target = sr->sPres->value; | |
| 647 | 8 | sr->s0 = sr->sPres; | |
| 648 | 8 | pep->reason = PEP_CONVERGED_ITERATING; | |
| 649 | } else { | ||
| 650 | 116 | sr->sPrev = sr->sPres; | |
| 651 | 116 | sr->sPres = sr->pending[--sr->nPend]; | |
| 652 | } | ||
| 653 | 124 | sPres = sr->sPres; | |
| 654 |
5/8✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
248 | PetscCall(PEPQSliceGetInertia(pep,sPres->value,&iner,ctx->detect?&zeros:NULL,sr->intcorr)); |
| 655 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
|
124 | if (zeros) { |
| 656 | ✗ | newShift = sPres->value*(1.0+SLICE_PTOL); | |
| 657 | ✗ | if (sr->dir*(sPres->neighb[0] && newShift-sPres->neighb[0]->value) < 0) newShift = (sPres->value+sPres->neighb[0]->value)/2; | |
| 658 | ✗ | else if (sPres->neighb[1] && sr->dir*(sPres->neighb[1]->value-newShift) < 0) newShift = (sPres->value+sPres->neighb[1]->value)/2; | |
| 659 | ✗ | PetscCall(PEPQSliceGetInertia(pep,newShift,&iner,&zeros,sr->intcorr)); | |
| 660 | ✗ | PetscCheck(!zeros,((PetscObject)pep)->comm,PETSC_ERR_CONV_FAILED,"Inertia computation fails in %g",(double)newShift); | |
| 661 | ✗ | sPres->value = newShift; | |
| 662 | } | ||
| 663 | 124 | sr->sPres->inertia = iner; | |
| 664 | 124 | pep->target = sr->sPres->value; | |
| 665 | 124 | pep->reason = PEP_CONVERGED_ITERATING; | |
| 666 | 124 | pep->its = 0; | |
| 667 | 58 | } else sr->sPres = NULL; | |
| 668 |
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.
|
43 | PetscFunctionReturn(PETSC_SUCCESS); |
| 669 | } | ||
| 670 | |||
| 671 | /* | ||
| 672 | Obtains value of subsequent shift | ||
| 673 | */ | ||
| 674 | 124 | static PetscErrorCode PEPGetNewShiftValue(PEP pep,PetscInt side,PetscReal *newS) | |
| 675 | { | ||
| 676 | 124 | PetscReal lambda,d_prev; | |
| 677 | 124 | PetscInt i,idxP; | |
| 678 | 124 | PEP_SR sr; | |
| 679 | 124 | PEP_shift sPres,s; | |
| 680 | 124 | PEP_STOAR *ctx=(PEP_STOAR*)pep->data; | |
| 681 | |||
| 682 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
124 | PetscFunctionBegin; |
| 683 | 124 | sr = ctx->sr; | |
| 684 | 124 | sPres = sr->sPres; | |
| 685 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
124 | if (sPres->neighb[side]) { |
| 686 | /* Completing a previous interval */ | ||
| 687 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
24 | if (!sPres->neighb[side]->neighb[side] && sPres->neighb[side]->nconv[side]==0) { /* One of the ends might be too far from eigenvalues */ |
| 688 | ✗ | if (side) *newS = (sPres->value + PetscRealPart(sr->eigr[sr->perm[sr->indexEig-1]]))/2; | |
| 689 | ✗ | else *newS = (sPres->value + PetscRealPart(sr->eigr[sr->perm[0]]))/2; | |
| 690 | 24 | } else *newS=(sPres->value + sPres->neighb[side]->value)/2; | |
| 691 | } else { /* (Only for side=1). Creating a new interval. */ | ||
| 692 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
100 | if (sPres->neigs==0) {/* No value has been accepted*/ |
| 693 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
48 | if (sPres->neighb[0]) { |
| 694 | /* Multiplying by 10 the previous distance */ | ||
| 695 | 40 | *newS = sPres->value + 10*sr->dir*PetscAbsReal(sPres->value - sPres->neighb[0]->value); | |
| 696 | 40 | sr->nleap++; | |
| 697 | /* Stops when the interval is open and no values are found in the last 5 shifts (there might be infinite eigenvalues) */ | ||
| 698 |
1/6✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
40 | PetscCheck(sr->hasEnd || sr->nleap<=5,PetscObjectComm((PetscObject)pep),PETSC_ERR_CONV_FAILED,"Unable to compute the wanted eigenvalues with open interval"); |
| 699 | } else { /* First shift */ | ||
| 700 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
|
8 | if (pep->nconv != 0) { |
| 701 | /* Unaccepted values give information for next shift */ | ||
| 702 | idxP=0;/* Number of values left from shift */ | ||
| 703 | ✗ | for (i=0;i<pep->nconv;i++) { | |
| 704 | ✗ | lambda = PetscRealPart(pep->eigr[i]); | |
| 705 | ✗ | if (sr->dir*(lambda - sPres->value) <0) idxP++; | |
| 706 | else break; | ||
| 707 | } | ||
| 708 | /* Avoiding subtraction of eigenvalues (might be the same).*/ | ||
| 709 | ✗ | if (idxP>0) { | |
| 710 | ✗ | d_prev = PetscAbsReal(sPres->value - PetscRealPart(pep->eigr[0]))/(idxP+0.3); | |
| 711 | } else { | ||
| 712 | ✗ | d_prev = PetscAbsReal(sPres->value - PetscRealPart(pep->eigr[pep->nconv-1]))/(pep->nconv+0.3); | |
| 713 | } | ||
| 714 | ✗ | *newS = sPres->value + (sr->dir*d_prev*pep->nev)/2; | |
| 715 | ✗ | sr->dirch = PETSC_FALSE; | |
| 716 | } else { /* No values found, no information for next shift */ | ||
| 717 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
8 | PetscCheck(!sr->dirch,PetscObjectComm((PetscObject)pep),PETSC_ERR_PLIB,"First shift renders no information"); |
| 718 | 8 | sr->dirch = PETSC_TRUE; | |
| 719 | 8 | *newS = sr->int1; | |
| 720 | } | ||
| 721 | } | ||
| 722 | } else { /* Accepted values found */ | ||
| 723 | 52 | sr->dirch = PETSC_FALSE; | |
| 724 | 52 | sr->nleap = 0; | |
| 725 | /* Average distance of values in previous subinterval */ | ||
| 726 | 52 | s = sPres->neighb[0]; | |
| 727 |
3/4✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
|
52 | while (s && PetscAbs(s->inertia - sPres->inertia)==0) { |
| 728 | ✗ | s = s->neighb[0];/* Looking for previous shifts with eigenvalues within */ | |
| 729 | } | ||
| 730 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
52 | if (s) { |
| 731 | 24 | d_prev = PetscAbsReal((sPres->value - s->value)/(sPres->inertia - s->inertia)); | |
| 732 | } else { /* First shift. Average distance obtained with values in this shift */ | ||
| 733 | /* first shift might be too far from first wanted eigenvalue (no values found outside the interval)*/ | ||
| 734 |
3/4✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 2 times.
|
28 | if (sr->dir*(PetscRealPart(sr->eigr[0])-sPres->value)>0 && PetscAbsReal((PetscRealPart(sr->eigr[sr->indexEig-1]) - PetscRealPart(sr->eigr[0]))/PetscRealPart(sr->eigr[0])) > PetscSqrtReal(pep->tol)) { |
| 735 | 26 | d_prev = PetscAbsReal((PetscRealPart(sr->eigr[sr->indexEig-1]) - PetscRealPart(sr->eigr[0])))/(sPres->neigs+0.3); | |
| 736 | } else { | ||
| 737 | 2 | d_prev = PetscAbsReal(PetscRealPart(sr->eigr[sr->indexEig-1]) - sPres->value)/(sPres->neigs+0.3); | |
| 738 | } | ||
| 739 | } | ||
| 740 | /* Average distance is used for next shift by adding it to value on the right or to shift */ | ||
| 741 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
52 | if (sr->dir*(PetscRealPart(sr->eigr[sPres->index + sPres->neigs -1]) - sPres->value)>0) { |
| 742 | 52 | *newS = PetscRealPart(sr->eigr[sPres->index + sPres->neigs -1])+ (sr->dir*d_prev*pep->nev)/2; | |
| 743 | } else { /* Last accepted value is on the left of shift. Adding to shift */ | ||
| 744 | ✗ | *newS = sPres->value + (sr->dir*d_prev*pep->nev)/2; | |
| 745 | } | ||
| 746 | } | ||
| 747 | /* End of interval can not be surpassed */ | ||
| 748 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
100 | if (sr->dir*(sr->int1 - *newS) < 0) *newS = sr->int1; |
| 749 | }/* of neighb[side]==null */ | ||
| 750 |
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.
|
29 | PetscFunctionReturn(PETSC_SUCCESS); |
| 751 | } | ||
| 752 | |||
| 753 | /* | ||
| 754 | Function for sorting an array of real values | ||
| 755 | */ | ||
| 756 | 354 | static PetscErrorCode sortRealEigenvalues(PetscScalar *r,PetscInt *perm,PetscInt nr,PetscBool prev,PetscInt dir) | |
| 757 | { | ||
| 758 | 354 | PetscReal re; | |
| 759 | 354 | PetscInt i,j,tmp; | |
| 760 | |||
| 761 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
354 | PetscFunctionBegin; |
| 762 |
3/4✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
|
8716 | if (!prev) for (i=0;i<nr;i++) perm[i] = i; |
| 763 | /* Insertion sort */ | ||
| 764 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
8100 | for (i=1;i<nr;i++) { |
| 765 | 7746 | re = PetscRealPart(r[perm[i]]); | |
| 766 | 7746 | j = i-1; | |
| 767 |
4/4✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
|
30162 | while (j>=0 && dir*(re - PetscRealPart(r[perm[j]])) <= 0) { |
| 768 | 22416 | tmp = perm[j]; perm[j] = perm[j+1]; perm[j+1] = tmp; j--; | |
| 769 | } | ||
| 770 | } | ||
| 771 |
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.
|
354 | PetscFunctionReturn(PETSC_SUCCESS); |
| 772 | } | ||
| 773 | |||
| 774 | /* Stores the pairs obtained since the last shift in the global arrays */ | ||
| 775 | 182 | static PetscErrorCode PEPStoreEigenpairs(PEP pep) | |
| 776 | { | ||
| 777 | 182 | PEP_STOAR *ctx=(PEP_STOAR*)pep->data; | |
| 778 | 182 | PetscReal lambda,err,*errest; | |
| 779 | 182 | PetscInt i,*aux,count=0,ndef,ld,nconv=pep->nconv,d=pep->nmat-1,idx; | |
| 780 | 182 | PetscBool iscayley,divide=PETSC_FALSE; | |
| 781 | 182 | PEP_SR sr = ctx->sr; | |
| 782 | 182 | PEP_shift sPres; | |
| 783 | 182 | Vec w,vomega; | |
| 784 | 182 | Mat MS; | |
| 785 | 182 | BV tV; | |
| 786 | 182 | PetscScalar *S,*eigr,*tS,*omega; | |
| 787 | |||
| 788 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
182 | PetscFunctionBegin; |
| 789 | 182 | sPres = sr->sPres; | |
| 790 | 182 | sPres->index = sr->indexEig; | |
| 791 | |||
| 792 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
182 | if (nconv>sr->ndef0+sr->ndef1) { |
| 793 | /* Back-transform */ | ||
| 794 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
172 | PetscCall(STBackTransform(pep->st,nconv,pep->eigr,pep->eigi)); |
| 795 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
3800 | for (i=0;i<nconv;i++) { |
| 796 | #if defined(PETSC_USE_COMPLEX) | ||
| 797 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
|
1708 | if (PetscImaginaryPart(pep->eigr[i])) pep->eigr[i] = sr->int0-sr->dir; |
| 798 | #else | ||
| 799 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
|
1920 | if (pep->eigi[i]) pep->eigr[i] = sr->int0-sr->dir; |
| 800 | #endif | ||
| 801 | } | ||
| 802 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
172 | PetscCall(PetscObjectTypeCompare((PetscObject)pep->st,STCAYLEY,&iscayley)); |
| 803 | /* Sort eigenvalues */ | ||
| 804 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
172 | PetscCall(sortRealEigenvalues(pep->eigr,pep->perm,nconv,PETSC_FALSE,sr->dir)); |
| 805 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
172 | PetscCall(VecCreateSeq(PETSC_COMM_SELF,nconv,&vomega)); |
| 806 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
172 | PetscCall(BVGetSignature(ctx->V,vomega)); |
| 807 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
172 | PetscCall(VecGetArray(vomega,&omega)); |
| 808 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
172 | PetscCall(BVGetSizes(pep->V,NULL,NULL,&ld)); |
| 809 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
172 | PetscCall(BVTensorGetFactors(ctx->V,NULL,&MS)); |
| 810 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
172 | PetscCall(MatDenseGetArray(MS,&S)); |
| 811 | /* Values stored in global array */ | ||
| 812 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
172 | PetscCall(PetscCalloc4(nconv,&eigr,nconv,&errest,nconv*nconv*d,&tS,nconv,&aux)); |
| 813 | 172 | ndef = sr->ndef0+sr->ndef1; | |
| 814 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
3800 | for (i=0;i<nconv;i++) { |
| 815 | 3628 | lambda = PetscRealPart(pep->eigr[pep->perm[i]]); | |
| 816 | 3628 | err = pep->errest[pep->perm[i]]; | |
| 817 |
4/4✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
|
3628 | if (sr->dir*(lambda - sPres->ext[0]) > 0 && (sr->dir)*(sPres->ext[1] - lambda) > 0) {/* Valid value */ |
| 818 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
2268 | PetscCheck(sr->indexEig+count-ndef<sr->numEigs,PetscObjectComm((PetscObject)pep),PETSC_ERR_PLIB,"Unexpected error in Spectrum Slicing"); |
| 819 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2268 | PetscCall(PEPQSliceCheckEigenvalueType(pep,lambda,PetscRealPart(omega[pep->perm[i]]),PETSC_FALSE)); |
| 820 | 2268 | eigr[count] = lambda; | |
| 821 | 2268 | errest[count] = err; | |
| 822 |
3/4✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
|
2268 | if ((sr->dir*(sPres->value - lambda) > 0) && (sr->dir*(lambda - sPres->ext[0]) > 0)) sPres->nconv[0]++; |
| 823 |
3/4✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
|
2268 | if ((sr->dir*(lambda - sPres->value) > 0) && (sr->dir*(sPres->ext[1] - lambda) > 0)) sPres->nconv[1]++; |
| 824 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2268 | PetscCall(PetscArraycpy(tS+count*(d*nconv),S+pep->perm[i]*(d*ld),nconv)); |
| 825 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2268 | PetscCall(PetscArraycpy(tS+count*(d*nconv)+nconv,S+pep->perm[i]*(d*ld)+ld,nconv)); |
| 826 | 2268 | count++; | |
| 827 | } | ||
| 828 | } | ||
| 829 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
172 | PetscCall(VecRestoreArray(vomega,&omega)); |
| 830 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
172 | PetscCall(VecDestroy(&vomega)); |
| 831 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
2440 | for (i=0;i<count;i++) { |
| 832 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2268 | PetscCall(PetscArraycpy(S+i*(d*ld),tS+i*nconv*d,nconv)); |
| 833 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2268 | PetscCall(PetscArraycpy(S+i*(d*ld)+ld,tS+i*nconv*d+nconv,nconv)); |
| 834 | } | ||
| 835 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
172 | PetscCall(MatDenseRestoreArray(MS,&S)); |
| 836 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
172 | PetscCall(BVTensorRestoreFactors(ctx->V,NULL,&MS)); |
| 837 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
172 | PetscCall(BVSetActiveColumns(ctx->V,0,count)); |
| 838 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
172 | PetscCall(BVTensorCompress(ctx->V,count)); |
| 839 |
4/4✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
|
172 | if (sr->sPres->nconv[0] && sr->sPres->nconv[1]) { |
| 840 | 48 | divide = PETSC_TRUE; | |
| 841 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
48 | PetscCall(BVTensorGetFactors(ctx->V,NULL,&MS)); |
| 842 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
48 | PetscCall(MatDenseGetArray(MS,&S)); |
| 843 |
4/6✓ Branch 0 taken 5 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
48 | PetscCall(PetscArrayzero(tS,nconv*nconv*d)); |
| 844 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
1088 | for (i=0;i<count;i++) { |
| 845 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1040 | PetscCall(PetscArraycpy(tS+i*nconv*d,S+i*(d*ld),count)); |
| 846 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1040 | PetscCall(PetscArraycpy(tS+i*nconv*d+nconv,S+i*(d*ld)+ld,count)); |
| 847 | } | ||
| 848 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
48 | PetscCall(MatDenseRestoreArray(MS,&S)); |
| 849 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
48 | PetscCall(BVTensorRestoreFactors(ctx->V,NULL,&MS)); |
| 850 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
48 | PetscCall(BVSetActiveColumns(pep->V,0,count)); |
| 851 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
48 | PetscCall(BVDuplicateResize(pep->V,count,&tV)); |
| 852 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
48 | PetscCall(BVCopy(pep->V,tV)); |
| 853 | } | ||
| 854 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
172 | if (sr->sPres->nconv[0]) { |
| 855 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
86 | if (divide) { |
| 856 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
48 | PetscCall(BVSetActiveColumns(ctx->V,0,sr->sPres->nconv[0])); |
| 857 |
3/6✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
48 | PetscCall(BVTensorCompress(ctx->V,sr->sPres->nconv[0])); |
| 858 | } | ||
| 859 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
762 | for (i=0;i<sr->ndef0;i++) aux[i] = sr->idxDef0[i]; |
| 860 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
490 | for (i=sr->ndef0;i<sr->sPres->nconv[0];i++) aux[i] = sr->indexEig+i-sr->ndef0; |
| 861 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
86 | PetscCall(BVTensorGetFactors(ctx->V,NULL,&MS)); |
| 862 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
86 | PetscCall(MatDenseGetArray(MS,&S)); |
| 863 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
1166 | for (i=0;i<sr->sPres->nconv[0];i++) { |
| 864 | 1080 | sr->eigr[aux[i]] = eigr[i]; | |
| 865 | 1080 | sr->errest[aux[i]] = errest[i]; | |
| 866 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1080 | PetscCall(BVGetColumn(pep->V,i,&w)); |
| 867 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1080 | PetscCall(BVInsertVec(sr->V,aux[i],w)); |
| 868 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1080 | PetscCall(BVRestoreColumn(pep->V,i,&w)); |
| 869 | 1080 | idx = sr->ld*d*aux[i]; | |
| 870 |
4/6✓ Branch 0 taken 5 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1080 | PetscCall(PetscArrayzero(sr->S+idx,sr->ld*d)); |
| 871 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1080 | PetscCall(PetscArraycpy(sr->S+idx,S+i*(ld*d),sr->sPres->nconv[0])); |
| 872 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1080 | PetscCall(PetscArraycpy(sr->S+idx+sr->ld,S+i*(ld*d)+ld,sr->sPres->nconv[0])); |
| 873 |
5/8✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
1080 | PetscCall(PetscFree(sr->qinfo[aux[i]].q)); |
| 874 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1080 | PetscCall(PetscMalloc1(sr->sPres->nconv[0],&sr->qinfo[aux[i]].q)); |
| 875 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1080 | PetscCall(PetscArraycpy(sr->qinfo[aux[i]].q,aux,sr->sPres->nconv[0])); |
| 876 | 1080 | sr->qinfo[aux[i]].nq = sr->sPres->nconv[0]; | |
| 877 | } | ||
| 878 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
86 | PetscCall(MatDenseRestoreArray(MS,&S)); |
| 879 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
86 | PetscCall(BVTensorRestoreFactors(ctx->V,NULL,&MS)); |
| 880 | } | ||
| 881 | |||
| 882 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
172 | if (sr->sPres->nconv[1]) { |
| 883 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
106 | if (divide) { |
| 884 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
48 | PetscCall(BVTensorGetFactors(ctx->V,NULL,&MS)); |
| 885 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
48 | PetscCall(MatDenseGetArray(MS,&S)); |
| 886 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
580 | for (i=0;i<sr->sPres->nconv[1];i++) { |
| 887 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
532 | PetscCall(PetscArraycpy(S+i*(d*ld),tS+(sr->sPres->nconv[0]+i)*nconv*d,count)); |
| 888 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
532 | PetscCall(PetscArraycpy(S+i*(d*ld)+ld,tS+(sr->sPres->nconv[0]+i)*nconv*d+nconv,count)); |
| 889 | } | ||
| 890 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
48 | PetscCall(MatDenseRestoreArray(MS,&S)); |
| 891 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
48 | PetscCall(BVTensorRestoreFactors(ctx->V,NULL,&MS)); |
| 892 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
48 | PetscCall(BVSetActiveColumns(pep->V,0,count)); |
| 893 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
48 | PetscCall(BVCopy(tV,pep->V)); |
| 894 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
48 | PetscCall(BVSetActiveColumns(ctx->V,0,sr->sPres->nconv[1])); |
| 895 |
3/6✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
48 | PetscCall(BVTensorCompress(ctx->V,sr->sPres->nconv[1])); |
| 896 | } | ||
| 897 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
294 | for (i=0;i<sr->ndef1;i++) aux[i] = sr->idxDef1[i]; |
| 898 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
1106 | for (i=sr->ndef1;i<sr->sPres->nconv[1];i++) aux[i] = sr->indexEig+sr->sPres->nconv[0]-sr->ndef0+i-sr->ndef1; |
| 899 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
106 | PetscCall(BVTensorGetFactors(ctx->V,NULL,&MS)); |
| 900 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
106 | PetscCall(MatDenseGetArray(MS,&S)); |
| 901 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
1294 | for (i=0;i<sr->sPres->nconv[1];i++) { |
| 902 | 1188 | sr->eigr[aux[i]] = eigr[sr->sPres->nconv[0]+i]; | |
| 903 | 1188 | sr->errest[aux[i]] = errest[sr->sPres->nconv[0]+i]; | |
| 904 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1188 | PetscCall(BVGetColumn(pep->V,i,&w)); |
| 905 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1188 | PetscCall(BVInsertVec(sr->V,aux[i],w)); |
| 906 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1188 | PetscCall(BVRestoreColumn(pep->V,i,&w)); |
| 907 | 1188 | idx = sr->ld*d*aux[i]; | |
| 908 |
4/6✓ Branch 0 taken 5 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1188 | PetscCall(PetscArrayzero(sr->S+idx,sr->ld*d)); |
| 909 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1188 | PetscCall(PetscArraycpy(sr->S+idx,S+i*(ld*d),sr->sPres->nconv[1])); |
| 910 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1188 | PetscCall(PetscArraycpy(sr->S+idx+sr->ld,S+i*(ld*d)+ld,sr->sPres->nconv[1])); |
| 911 |
5/8✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
1188 | PetscCall(PetscFree(sr->qinfo[aux[i]].q)); |
| 912 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1188 | PetscCall(PetscMalloc1(sr->sPres->nconv[1],&sr->qinfo[aux[i]].q)); |
| 913 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1188 | PetscCall(PetscArraycpy(sr->qinfo[aux[i]].q,aux,sr->sPres->nconv[1])); |
| 914 | 1188 | sr->qinfo[aux[i]].nq = sr->sPres->nconv[1]; | |
| 915 | } | ||
| 916 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
106 | PetscCall(MatDenseRestoreArray(MS,&S)); |
| 917 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
106 | PetscCall(BVTensorRestoreFactors(ctx->V,NULL,&MS)); |
| 918 | } | ||
| 919 | 172 | sPres->neigs = count-sr->ndef0-sr->ndef1; | |
| 920 | 172 | sr->indexEig += sPres->neigs; | |
| 921 | 172 | sPres->nconv[0]-= sr->ndef0; | |
| 922 | 172 | sPres->nconv[1]-= sr->ndef1; | |
| 923 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
172 | PetscCall(PetscFree4(eigr,errest,tS,aux)); |
| 924 | } else { | ||
| 925 | 10 | sPres->neigs = 0; | |
| 926 | 10 | sPres->nconv[0]= 0; | |
| 927 | 10 | sPres->nconv[1]= 0; | |
| 928 | } | ||
| 929 | /* Global ordering array updating */ | ||
| 930 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
182 | PetscCall(sortRealEigenvalues(sr->eigr,sr->perm,sr->indexEig,PETSC_FALSE,sr->dir)); |
| 931 | /* Check for completion */ | ||
| 932 | 182 | sPres->comp[0] = PetscNot(sPres->nconv[0] < sPres->nsch[0]); | |
| 933 | 182 | sPres->comp[1] = PetscNot(sPres->nconv[1] < sPres->nsch[1]); | |
| 934 |
2/6✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
182 | PetscCheck(sPres->nconv[0]<=sPres->nsch[0] && sPres->nconv[1]<=sPres->nsch[1],PetscObjectComm((PetscObject)pep),PETSC_ERR_PLIB,"Mismatch between number of values found and information from inertia"); |
| 935 |
6/8✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
182 | if (divide) PetscCall(BVDestroy(&tV)); |
| 936 |
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.
|
43 | PetscFunctionReturn(PETSC_SUCCESS); |
| 937 | } | ||
| 938 | |||
| 939 | 182 | static PetscErrorCode PEPLookForDeflation(PEP pep) | |
| 940 | { | ||
| 941 | 182 | PetscReal val; | |
| 942 | 182 | PetscInt i,count0=0,count1=0; | |
| 943 | 182 | PEP_shift sPres; | |
| 944 | 182 | PetscInt ini,fin; | |
| 945 | 182 | PEP_SR sr; | |
| 946 | 182 | PEP_STOAR *ctx=(PEP_STOAR*)pep->data; | |
| 947 | |||
| 948 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
182 | PetscFunctionBegin; |
| 949 | 182 | sr = ctx->sr; | |
| 950 | 182 | sPres = sr->sPres; | |
| 951 | |||
| 952 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
182 | if (sPres->neighb[0]) ini = (sr->dir)*(sPres->neighb[0]->inertia - sr->inertia0); |
| 953 | else ini = 0; | ||
| 954 | 182 | fin = sr->indexEig; | |
| 955 | /* Selection of ends for searching new values */ | ||
| 956 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
182 | if (!sPres->neighb[0]) sPres->ext[0] = sr->int0;/* First shift */ |
| 957 | 116 | else sPres->ext[0] = sPres->neighb[0]->value; | |
| 958 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
182 | if (!sPres->neighb[1]) { |
| 959 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
158 | if (sr->hasEnd) sPres->ext[1] = sr->int1; |
| 960 | ✗ | else sPres->ext[1] = (sr->dir > 0)?PETSC_MAX_REAL:PETSC_MIN_REAL; | |
| 961 | 24 | } else sPres->ext[1] = sPres->neighb[1]->value; | |
| 962 | /* Selection of values between right and left ends */ | ||
| 963 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
1046 | for (i=ini;i<fin;i++) { |
| 964 | 880 | val=PetscRealPart(sr->eigr[sr->perm[i]]); | |
| 965 | /* Values to the right of left shift */ | ||
| 966 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
880 | if (sr->dir*(val - sPres->ext[1]) < 0) { |
| 967 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
864 | if (sr->dir*(val - sPres->value) < 0) count0++; |
| 968 | 188 | else count1++; | |
| 969 | } else break; | ||
| 970 | } | ||
| 971 | /* The number of values on each side are found */ | ||
| 972 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
182 | if (sPres->neighb[0]) { |
| 973 | 116 | sPres->nsch[0] = (sr->dir)*(sPres->inertia - sPres->neighb[0]->inertia)-count0; | |
| 974 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
116 | PetscCheck(sPres->nsch[0]>=0,PetscObjectComm((PetscObject)pep),PETSC_ERR_PLIB,"Mismatch between number of values found and information from inertia"); |
| 975 | 66 | } else sPres->nsch[0] = 0; | |
| 976 | |||
| 977 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
182 | if (sPres->neighb[1]) { |
| 978 | 24 | sPres->nsch[1] = (sr->dir)*(sPres->neighb[1]->inertia - sPres->inertia) - count1; | |
| 979 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
24 | PetscCheck(sPres->nsch[1]>=0,PetscObjectComm((PetscObject)pep),PETSC_ERR_PLIB,"Mismatch between number of values found and information from inertia"); |
| 980 | 158 | } else sPres->nsch[1] = (sr->dir)*(sr->inertia1 - sPres->inertia); | |
| 981 | |||
| 982 | /* Completing vector of indexes for deflation */ | ||
| 983 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
858 | for (i=0;i<count0;i++) sr->idxDef0[i] = sr->perm[ini+i]; |
| 984 | 182 | sr->ndef0 = count0; | |
| 985 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
370 | for (i=0;i<count1;i++) sr->idxDef1[i] = sr->perm[ini+count0+i]; |
| 986 | 182 | sr->ndef1 = count1; | |
| 987 |
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.
|
182 | PetscFunctionReturn(PETSC_SUCCESS); |
| 988 | } | ||
| 989 | |||
| 990 | /* | ||
| 991 | Compute a run of Lanczos iterations | ||
| 992 | */ | ||
| 993 | 1623 | static PetscErrorCode PEPSTOARrun_QSlice(PEP pep,PetscReal *a,PetscReal *b,PetscReal *omega,PetscInt k,PetscInt *M,PetscBool *breakdown,PetscBool *symmlost,Vec *t_) | |
| 994 | { | ||
| 995 | 1623 | PEP_STOAR *ctx = (PEP_STOAR*)pep->data; | |
| 996 | 1623 | PetscInt i,j,m=*M,l,lock; | |
| 997 | 1623 | PetscInt lds,d,ld,offq,nqt,ldds; | |
| 998 | 1623 | Vec v=t_[0],t=t_[1],q=t_[2]; | |
| 999 | 1623 | PetscReal norm,sym=0.0,fro=0.0,*f; | |
| 1000 | 1623 | PetscScalar *y,*S,sigma; | |
| 1001 | 1623 | PetscBLASInt j_,one=1; | |
| 1002 | 1623 | PetscBool lindep; | |
| 1003 | 1623 | Mat MS; | |
| 1004 | |||
| 1005 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1623 | PetscFunctionBegin; |
| 1006 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1623 | PetscCall(PetscMalloc1(*M,&y)); |
| 1007 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1623 | PetscCall(BVGetSizes(pep->V,NULL,NULL,&ld)); |
| 1008 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1623 | PetscCall(BVTensorGetDegree(ctx->V,&d)); |
| 1009 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1623 | PetscCall(BVGetActiveColumns(pep->V,&lock,&nqt)); |
| 1010 | 1623 | lds = d*ld; | |
| 1011 | 1623 | offq = ld; | |
| 1012 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1623 | PetscCall(DSGetLeadingDimension(pep->ds,&ldds)); |
| 1013 | |||
| 1014 | 1623 | *breakdown = PETSC_FALSE; /* ----- */ | |
| 1015 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1623 | PetscCall(STGetShift(pep->st,&sigma)); |
| 1016 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1623 | PetscCall(DSGetDimensions(pep->ds,NULL,&l,NULL,NULL)); |
| 1017 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1623 | PetscCall(BVSetActiveColumns(ctx->V,0,m)); |
| 1018 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1623 | PetscCall(BVSetActiveColumns(pep->V,0,nqt)); |
| 1019 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
28540 | for (j=k;j<m;j++) { |
| 1020 | /* apply operator */ | ||
| 1021 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
26922 | PetscCall(BVTensorGetFactors(ctx->V,NULL,&MS)); |
| 1022 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
26922 | PetscCall(MatDenseGetArray(MS,&S)); |
| 1023 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
26922 | PetscCall(BVGetColumn(pep->V,nqt,&t)); |
| 1024 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
26922 | PetscCall(BVMultVec(pep->V,1.0,0.0,v,S+j*lds)); |
| 1025 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
26922 | PetscCall(MatMult(pep->A[1],v,q)); |
| 1026 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
26922 | PetscCall(MatMult(pep->A[2],v,t)); |
| 1027 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
26922 | PetscCall(VecAXPY(q,sigma*pep->sfactor,t)); |
| 1028 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
26922 | PetscCall(VecScale(q,pep->sfactor)); |
| 1029 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
26922 | PetscCall(BVMultVec(pep->V,1.0,0.0,v,S+offq+j*lds)); |
| 1030 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
26922 | PetscCall(MatMult(pep->A[2],v,t)); |
| 1031 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
26922 | PetscCall(VecAXPY(q,pep->sfactor*pep->sfactor,t)); |
| 1032 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
26922 | PetscCall(STMatSolve(pep->st,q,t)); |
| 1033 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
26922 | PetscCall(VecScale(t,-1.0)); |
| 1034 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
26922 | PetscCall(BVRestoreColumn(pep->V,nqt,&t)); |
| 1035 | |||
| 1036 | /* orthogonalize */ | ||
| 1037 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
26922 | PetscCall(BVOrthogonalizeColumn(pep->V,nqt,S+(j+1)*lds,&norm,&lindep)); |
| 1038 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
26922 | if (!lindep) { |
| 1039 | 26922 | *(S+(j+1)*lds+nqt) = norm; | |
| 1040 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
26922 | PetscCall(BVScaleColumn(pep->V,nqt,1.0/norm)); |
| 1041 | 26922 | nqt++; | |
| 1042 | } | ||
| 1043 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
762699 | for (i=0;i<nqt;i++) *(S+(j+1)*lds+offq+i) = *(S+j*lds+i)+sigma*(*(S+(j+1)*lds+i)); |
| 1044 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
26922 | PetscCall(BVSetActiveColumns(pep->V,0,nqt)); |
| 1045 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
26922 | PetscCall(MatDenseRestoreArray(MS,&S)); |
| 1046 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
26922 | PetscCall(BVTensorRestoreFactors(ctx->V,NULL,&MS)); |
| 1047 | |||
| 1048 | /* level-2 orthogonalization */ | ||
| 1049 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
26922 | PetscCall(BVOrthogonalizeColumn(ctx->V,j+1,y,&norm,&lindep)); |
| 1050 | 26922 | a[j] = PetscRealPart(y[j]); | |
| 1051 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
26922 | omega[j+1] = (norm > 0)?1.0:-1.0; |
| 1052 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
26922 | PetscCall(BVScaleColumn(ctx->V,j+1,1.0/norm)); |
| 1053 | 26922 | b[j] = PetscAbsReal(norm); | |
| 1054 | |||
| 1055 | /* check symmetry */ | ||
| 1056 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
26922 | PetscCall(DSGetArrayReal(pep->ds,DS_MAT_T,&f)); |
| 1057 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
26922 | if (j==k) { |
| 1058 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
26735 | for (i=l;i<j-1;i++) y[i] = PetscAbsScalar(y[i])-PetscAbsReal(f[2*ldds+i]); |
| 1059 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
|
1623 | for (i=0;i<l;i++) y[i] = 0.0; |
| 1060 | } | ||
| 1061 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
26922 | PetscCall(DSRestoreArrayReal(pep->ds,DS_MAT_T,&f)); |
| 1062 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
26922 | if (j>0) y[j-1] = PetscAbsScalar(y[j-1])-PetscAbsReal(b[j-1]); |
| 1063 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
26922 | PetscCall(PetscBLASIntCast(j,&j_)); |
| 1064 | 26922 | sym = SlepcAbs(BLASnrm2_(&j_,y,&one),sym); | |
| 1065 | 26922 | fro = SlepcAbs(fro,SlepcAbs(a[j],b[j])); | |
| 1066 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
26922 | if (j>0) fro = SlepcAbs(fro,b[j-1]); |
| 1067 |
3/4✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 8 times.
|
26922 | if (sym/fro>PetscMax(PETSC_SQRT_MACHINE_EPSILON,10*pep->tol)) { |
| 1068 | 5 | *symmlost = PETSC_TRUE; | |
| 1069 | 5 | *M=j; | |
| 1070 | 5 | break; | |
| 1071 | } | ||
| 1072 | } | ||
| 1073 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1623 | PetscCall(BVSetActiveColumns(pep->V,lock,nqt)); |
| 1074 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1623 | PetscCall(BVSetActiveColumns(ctx->V,0,*M)); |
| 1075 |
5/8✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
1623 | PetscCall(PetscFree(y)); |
| 1076 |
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.
|
388 | PetscFunctionReturn(PETSC_SUCCESS); |
| 1077 | } | ||
| 1078 | |||
| 1079 | 182 | static PetscErrorCode PEPSTOAR_QSlice(PEP pep,Mat B) | |
| 1080 | { | ||
| 1081 | 182 | PEP_STOAR *ctx = (PEP_STOAR*)pep->data; | |
| 1082 | 182 | PetscInt j,k,l,nv=0,ld,ldds,t,nq=0,idx; | |
| 1083 | 182 | PetscInt nconv=0,deg=pep->nmat-1,count0=0,count1=0; | |
| 1084 | 182 | PetscScalar *om,sigma,*back,*S,*pQ; | |
| 1085 | 182 | PetscReal beta,norm=1.0,*omega,*a,*b,eta,lambda; | |
| 1086 | 182 | PetscBool breakdown,symmlost=PETSC_FALSE,sinv,falselock=PETSC_TRUE; | |
| 1087 | 182 | Mat MS,MQ,D; | |
| 1088 | 182 | Vec v,vomega; | |
| 1089 | 182 | PEP_SR sr; | |
| 1090 | 182 | BVOrthogType otype; | |
| 1091 | 182 | BVOrthogBlockType obtype; | |
| 1092 | |||
| 1093 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
182 | PetscFunctionBegin; |
| 1094 | /* Resize if needed for deflating vectors */ | ||
| 1095 | 182 | sr = ctx->sr; | |
| 1096 | 182 | sigma = sr->sPres->value; | |
| 1097 | 182 | k = sr->ndef0+sr->ndef1; | |
| 1098 | 182 | pep->ncv = ctx->ncv+k; | |
| 1099 | 182 | pep->nev = ctx->nev+k; | |
| 1100 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
182 | PetscCall(PEPAllocateSolution(pep,3)); |
| 1101 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
182 | PetscCall(BVDestroy(&ctx->V)); |
| 1102 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
182 | PetscCall(BVCreateTensor(pep->V,pep->nmat-1,&ctx->V)); |
| 1103 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
182 | PetscCall(BVGetOrthogonalization(pep->V,&otype,NULL,&eta,&obtype)); |
| 1104 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
182 | PetscCall(BVSetOrthogonalization(ctx->V,otype,BV_ORTHOG_REFINE_ALWAYS,eta,obtype)); |
| 1105 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
182 | PetscCall(DSAllocate(pep->ds,pep->ncv+2)); |
| 1106 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
182 | PetscCall(PetscMalloc1(pep->ncv,&back)); |
| 1107 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
182 | PetscCall(DSGetLeadingDimension(pep->ds,&ldds)); |
| 1108 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
182 | PetscCall(BVSetMatrix(ctx->V,B,PETSC_TRUE)); |
| 1109 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
182 | PetscCheck(ctx->lock,PetscObjectComm((PetscObject)pep),PETSC_ERR_SUP,"A locking variant is needed for spectrum slicing"); |
| 1110 | /* undocumented option to use a cheaper locking instead of the true locking */ | ||
| 1111 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
182 | PetscCall(PetscOptionsGetBool(NULL,NULL,"-pep_stoar_falselocking",&falselock,NULL)); |
| 1112 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
182 | PetscCall(PetscObjectTypeCompare((PetscObject)pep->st,STSINVERT,&sinv)); |
| 1113 |
5/8✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
182 | PetscCall(RGPushScale(pep->rg,sinv?pep->sfactor:1.0/pep->sfactor)); |
| 1114 |
5/8✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
182 | PetscCall(STScaleShift(pep->st,sinv?pep->sfactor:1.0/pep->sfactor)); |
| 1115 | |||
| 1116 | /* Get the starting Arnoldi vector */ | ||
| 1117 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
182 | PetscCall(BVSetActiveColumns(pep->V,0,1)); |
| 1118 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
182 | PetscCall(BVTensorBuildFirstColumn(ctx->V,pep->nini)); |
| 1119 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
182 | PetscCall(BVSetActiveColumns(ctx->V,0,1)); |
| 1120 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
182 | if (k) { |
| 1121 | /* Insert deflated vectors */ | ||
| 1122 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
76 | PetscCall(BVSetActiveColumns(pep->V,0,0)); |
| 1123 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
76 | idx = sr->ndef0?sr->idxDef0[0]:sr->idxDef1[0]; |
| 1124 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
940 | for (j=0;j<k;j++) { |
| 1125 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
864 | PetscCall(BVGetColumn(pep->V,j,&v)); |
| 1126 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
864 | PetscCall(BVCopyVec(sr->V,sr->qinfo[idx].q[j],v)); |
| 1127 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
864 | PetscCall(BVRestoreColumn(pep->V,j,&v)); |
| 1128 | } | ||
| 1129 | /* Update innerproduct matrix */ | ||
| 1130 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
76 | PetscCall(BVSetActiveColumns(ctx->V,0,0)); |
| 1131 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
76 | PetscCall(BVTensorGetFactors(ctx->V,NULL,&MS)); |
| 1132 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
76 | PetscCall(BVSetActiveColumns(pep->V,0,k)); |
| 1133 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
76 | PetscCall(BVTensorRestoreFactors(ctx->V,NULL,&MS)); |
| 1134 | |||
| 1135 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
76 | PetscCall(BVGetSizes(pep->V,NULL,NULL,&ld)); |
| 1136 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
76 | PetscCall(BVTensorGetFactors(ctx->V,NULL,&MS)); |
| 1137 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
76 | PetscCall(MatDenseGetArray(MS,&S)); |
| 1138 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
752 | for (j=0;j<sr->ndef0;j++) { |
| 1139 |
4/6✓ Branch 0 taken 5 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
676 | PetscCall(PetscArrayzero(S+j*ld*deg,ld*deg)); |
| 1140 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
676 | PetscCall(PetscArraycpy(S+j*ld*deg,sr->S+sr->idxDef0[j]*sr->ld*deg,k)); |
| 1141 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
676 | PetscCall(PetscArraycpy(S+j*ld*deg+ld,sr->S+sr->idxDef0[j]*sr->ld*deg+sr->ld,k)); |
| 1142 | 676 | pep->eigr[j] = sr->eigr[sr->idxDef0[j]]; | |
| 1143 | 676 | pep->errest[j] = sr->errest[sr->idxDef0[j]]; | |
| 1144 | } | ||
| 1145 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
264 | for (j=0;j<sr->ndef1;j++) { |
| 1146 |
4/6✓ Branch 0 taken 5 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
188 | PetscCall(PetscArrayzero(S+(j+sr->ndef0)*ld*deg,ld*deg)); |
| 1147 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
188 | PetscCall(PetscArraycpy(S+(j+sr->ndef0)*ld*deg,sr->S+sr->idxDef1[j]*sr->ld*deg,k)); |
| 1148 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
188 | PetscCall(PetscArraycpy(S+(j+sr->ndef0)*ld*deg+ld,sr->S+sr->idxDef1[j]*sr->ld*deg+sr->ld,k)); |
| 1149 | 188 | pep->eigr[j+sr->ndef0] = sr->eigr[sr->idxDef1[j]]; | |
| 1150 | 188 | pep->errest[j+sr->ndef0] = sr->errest[sr->idxDef1[j]]; | |
| 1151 | } | ||
| 1152 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
76 | PetscCall(MatDenseRestoreArray(MS,&S)); |
| 1153 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
76 | PetscCall(BVTensorRestoreFactors(ctx->V,NULL,&MS)); |
| 1154 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
76 | PetscCall(BVSetActiveColumns(ctx->V,0,k+1)); |
| 1155 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
76 | PetscCall(VecCreateSeq(PETSC_COMM_SELF,k+1,&vomega)); |
| 1156 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
76 | PetscCall(VecGetArray(vomega,&om)); |
| 1157 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
940 | for (j=0;j<k;j++) { |
| 1158 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
864 | PetscCall(BVOrthogonalizeColumn(ctx->V,j,NULL,&norm,NULL)); |
| 1159 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
864 | PetscCall(BVScaleColumn(ctx->V,j,1/norm)); |
| 1160 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
1004 | om[j] = (norm>=0.0)?1.0:-1.0; |
| 1161 | } | ||
| 1162 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
76 | PetscCall(BVTensorGetFactors(ctx->V,NULL,&MS)); |
| 1163 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
76 | PetscCall(MatDenseGetArray(MS,&S)); |
| 1164 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
228 | for (j=0;j<deg;j++) { |
| 1165 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
152 | PetscCall(BVSetRandomColumn(pep->V,k+j)); |
| 1166 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
152 | PetscCall(BVOrthogonalizeColumn(pep->V,k+j,S+k*ld*deg+j*ld,&norm,NULL)); |
| 1167 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
152 | PetscCall(BVScaleColumn(pep->V,k+j,1.0/norm)); |
| 1168 | 152 | S[k*ld*deg+j*ld+k+j] = norm; | |
| 1169 | } | ||
| 1170 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
76 | PetscCall(MatDenseRestoreArray(MS,&S)); |
| 1171 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
76 | PetscCall(BVSetActiveColumns(pep->V,0,k+deg)); |
| 1172 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
76 | PetscCall(BVTensorRestoreFactors(ctx->V,NULL,&MS)); |
| 1173 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
76 | PetscCall(BVOrthogonalizeColumn(ctx->V,k,NULL,&norm,NULL)); |
| 1174 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
76 | PetscCall(BVScaleColumn(ctx->V,k,1.0/norm)); |
| 1175 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
|
76 | om[k] = (norm>=0.0)?1.0:-1.0; |
| 1176 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
76 | PetscCall(VecRestoreArray(vomega,&om)); |
| 1177 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
76 | PetscCall(BVSetSignature(ctx->V,vomega)); |
| 1178 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
76 | PetscCall(DSGetArrayReal(pep->ds,DS_MAT_T,&a)); |
| 1179 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
76 | PetscCall(VecGetArray(vomega,&om)); |
| 1180 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
940 | for (j=0;j<k;j++) a[j] = PetscRealPart(om[j]/(pep->eigr[j]-sigma)); |
| 1181 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
76 | PetscCall(VecRestoreArray(vomega,&om)); |
| 1182 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
76 | PetscCall(VecDestroy(&vomega)); |
| 1183 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
76 | PetscCall(DSRestoreArrayReal(pep->ds,DS_MAT_T,&a)); |
| 1184 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
76 | PetscCall(DSGetArray(pep->ds,DS_MAT_Q,&pQ)); |
| 1185 |
4/6✓ Branch 0 taken 5 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
76 | PetscCall(PetscArrayzero(pQ,ldds*k)); |
| 1186 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
940 | for (j=0;j<k;j++) pQ[j+j*ldds] = 1.0; |
| 1187 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
76 | PetscCall(DSRestoreArray(pep->ds,DS_MAT_Q,&pQ)); |
| 1188 | } | ||
| 1189 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
182 | PetscCall(BVSetActiveColumns(ctx->V,0,k+1)); |
| 1190 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
182 | PetscCall(DSSetDimensions(pep->ds,k+1,PETSC_DETERMINE,PETSC_DETERMINE)); |
| 1191 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
182 | PetscCall(DSGetMatAndColumn(pep->ds,DS_MAT_D,0,&D,&vomega)); |
| 1192 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
182 | PetscCall(BVGetSignature(ctx->V,vomega)); |
| 1193 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
182 | PetscCall(DSRestoreMatAndColumn(pep->ds,DS_MAT_D,0,&D,&vomega)); |
| 1194 | |||
| 1195 |
9/10✓ Branch 0 taken 8 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
|
182 | PetscCall(PetscInfo(pep,"Start STOAR: sigma=%g in [%g,%g], for deflation: left=%" PetscInt_FMT " right=%" PetscInt_FMT ", searching: left=%" PetscInt_FMT " right=%" PetscInt_FMT "\n",(double)sr->sPres->value,(double)(sr->sPres->neighb[0]?sr->sPres->neighb[0]->value:sr->int0),(double)(sr->sPres->neighb[1]?sr->sPres->neighb[1]->value:sr->int1),sr->ndef0,sr->ndef1,sr->sPres->nsch[0],sr->sPres->nsch[1])); |
| 1196 | |||
| 1197 | /* Restart loop */ | ||
| 1198 | 182 | l = 0; | |
| 1199 | 182 | pep->nconv = k; | |
| 1200 | 182 | while (pep->reason == PEP_CONVERGED_ITERATING) { | |
| 1201 | 1623 | pep->its++; | |
| 1202 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1623 | PetscCall(DSGetArrayReal(pep->ds,DS_MAT_T,&a)); |
| 1203 | 1623 | b = a+ldds; | |
| 1204 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1623 | PetscCall(DSGetArrayReal(pep->ds,DS_MAT_D,&omega)); |
| 1205 | |||
| 1206 | /* Compute an nv-step Lanczos factorization */ | ||
| 1207 | 1623 | nv = PetscMin(pep->nconv+pep->mpd,pep->ncv); | |
| 1208 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1623 | PetscCall(PEPSTOARrun_QSlice(pep,a,b,omega,pep->nconv+l,&nv,&breakdown,&symmlost,pep->work)); |
| 1209 | 1623 | beta = b[nv-1]; | |
| 1210 |
4/4✓ Branch 0 taken 3 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 1 times.
|
1623 | if (symmlost && nv==pep->nconv+l) { |
| 1211 | 4 | pep->reason = PEP_DIVERGED_SYMMETRY_LOST; | |
| 1212 | 4 | pep->nconv = nconv; | |
| 1213 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
4 | PetscCall(PetscInfo(pep,"Symmetry lost in STOAR sigma=%g nconv=%" PetscInt_FMT "\n",(double)sr->sPres->value,nconv)); |
| 1214 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
4 | if (falselock || !ctx->lock) { |
| 1215 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
4 | PetscCall(BVSetActiveColumns(ctx->V,0,pep->nconv)); |
| 1216 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
4 | PetscCall(BVTensorCompress(ctx->V,0)); |
| 1217 | } | ||
| 1218 | break; | ||
| 1219 | } | ||
| 1220 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1619 | PetscCall(DSRestoreArrayReal(pep->ds,DS_MAT_T,&a)); |
| 1221 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1619 | PetscCall(DSRestoreArrayReal(pep->ds,DS_MAT_D,&omega)); |
| 1222 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1619 | PetscCall(DSSetDimensions(pep->ds,nv,pep->nconv,pep->nconv+l)); |
| 1223 |
6/8✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
1619 | if (l==0) PetscCall(DSSetState(pep->ds,DS_STATE_INTERMEDIATE)); |
| 1224 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1437 | else PetscCall(DSSetState(pep->ds,DS_STATE_RAW)); |
| 1225 | |||
| 1226 | /* Solve projected problem */ | ||
| 1227 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1619 | PetscCall(DSSolve(pep->ds,pep->eigr,pep->eigi)); |
| 1228 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1619 | PetscCall(DSSort(pep->ds,pep->eigr,pep->eigi,NULL,NULL,NULL)); |
| 1229 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1619 | PetscCall(DSUpdateExtraRow(pep->ds)); |
| 1230 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1619 | PetscCall(DSSynchronize(pep->ds,pep->eigr,pep->eigi)); |
| 1231 | |||
| 1232 | /* Check convergence */ | ||
| 1233 | /* PetscCall(PEPSTOARpreKConvergence(pep,nv,&norm,pep->work));*/ | ||
| 1234 | 1619 | norm = 1.0; | |
| 1235 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1619 | PetscCall(DSGetDimensions(pep->ds,NULL,NULL,NULL,&t)); |
| 1236 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1619 | PetscCall(PEPKrylovConvergence(pep,PETSC_FALSE,pep->nconv,t-pep->nconv,PetscAbsReal(beta)*norm,&k)); |
| 1237 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1619 | PetscCall((*pep->stopping)(pep,pep->its,pep->max_it,k,pep->nev,&pep->reason,pep->stoppingctx)); |
| 1238 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
10657 | for (j=0;j<k;j++) back[j] = pep->eigr[j]; |
| 1239 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1619 | PetscCall(STBackTransform(pep->st,k,back,pep->eigi)); |
| 1240 | count0=count1=0; | ||
| 1241 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
10657 | for (j=0;j<k;j++) { |
| 1242 | 9038 | lambda = PetscRealPart(back[j]); | |
| 1243 |
4/4✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
|
9038 | if ((sr->dir*(sr->sPres->value - lambda) > 0) && (sr->dir*(lambda - sr->sPres->ext[0]) > 0)) count0++; |
| 1244 |
4/4✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
|
9038 | if ((sr->dir*(lambda - sr->sPres->value) > 0) && (sr->dir*(sr->sPres->ext[1] - lambda) > 0)) count1++; |
| 1245 | } | ||
| 1246 |
4/4✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
|
1619 | if ((count0-sr->ndef0 >= sr->sPres->nsch[0]) && (count1-sr->ndef1 >= sr->sPres->nsch[1])) pep->reason = PEP_CONVERGED_TOL; |
| 1247 | /* Update l */ | ||
| 1248 |
3/4✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
|
1619 | if (pep->reason != PEP_CONVERGED_ITERATING || breakdown) l = 0; |
| 1249 | else { | ||
| 1250 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
1441 | l = PetscMax(1,(PetscInt)((nv-k)/2)); |
| 1251 | 1441 | l = PetscMin(l,t); | |
| 1252 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1441 | PetscCall(DSGetTruncateSize(pep->ds,k,t,&l)); |
| 1253 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1441 | if (!breakdown) { |
| 1254 | /* Prepare the Rayleigh quotient for restart */ | ||
| 1255 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1441 | PetscCall(DSTruncate(pep->ds,k+l,PETSC_FALSE)); |
| 1256 | } | ||
| 1257 | } | ||
| 1258 | 1619 | nconv = k; | |
| 1259 |
1/6✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
1619 | if (!ctx->lock && pep->reason == PEP_CONVERGED_ITERATING && !breakdown) { l += k; k = 0; } /* non-locking variant: reset no. of converged pairs */ |
| 1260 |
6/8✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
1619 | if (l) PetscCall(PetscInfo(pep,"Preparing to restart keeping l=%" PetscInt_FMT " vectors\n",l)); |
| 1261 | |||
| 1262 | /* Update S */ | ||
| 1263 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1619 | PetscCall(DSGetMat(pep->ds,DS_MAT_Q,&MQ)); |
| 1264 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1619 | PetscCall(BVMultInPlace(ctx->V,MQ,pep->nconv,k+l)); |
| 1265 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1619 | PetscCall(DSRestoreMat(pep->ds,DS_MAT_Q,&MQ)); |
| 1266 | |||
| 1267 | /* Copy last column of S */ | ||
| 1268 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1619 | PetscCall(BVCopyColumn(ctx->V,nv,k+l)); |
| 1269 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1619 | PetscCall(BVSetActiveColumns(ctx->V,0,k+l)); |
| 1270 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
1619 | if (k+l) { |
| 1271 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1611 | PetscCall(DSSetDimensions(pep->ds,k+l,PETSC_DETERMINE,PETSC_DETERMINE)); |
| 1272 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1611 | PetscCall(DSGetMatAndColumn(pep->ds,DS_MAT_D,0,&D,&vomega)); |
| 1273 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1611 | PetscCall(BVSetSignature(ctx->V,vomega)); |
| 1274 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1611 | PetscCall(DSRestoreMatAndColumn(pep->ds,DS_MAT_D,0,&D,&vomega)); |
| 1275 | } | ||
| 1276 | |||
| 1277 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
1619 | if (breakdown && pep->reason == PEP_CONVERGED_ITERATING) { |
| 1278 | /* stop if breakdown */ | ||
| 1279 | ✗ | PetscCall(PetscInfo(pep,"Breakdown TOAR method (it=%" PetscInt_FMT " norm=%g)\n",pep->its,(double)beta)); | |
| 1280 | ✗ | pep->reason = PEP_DIVERGED_BREAKDOWN; | |
| 1281 | } | ||
| 1282 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
1619 | if (pep->reason != PEP_CONVERGED_ITERATING) l--; |
| 1283 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1619 | PetscCall(BVGetActiveColumns(pep->V,NULL,&nq)); |
| 1284 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
1619 | if (k+l+deg<=nq) { |
| 1285 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1619 | PetscCall(BVSetActiveColumns(ctx->V,pep->nconv,k+l+1)); |
| 1286 |
1/10✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
1619 | if (!falselock && ctx->lock) PetscCall(BVTensorCompress(ctx->V,k-pep->nconv)); |
| 1287 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1619 | else PetscCall(BVTensorCompress(ctx->V,0)); |
| 1288 | } | ||
| 1289 | 1619 | pep->nconv = k; | |
| 1290 |
7/8✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
|
1801 | PetscCall(PEPMonitor(pep,pep->its,nconv,pep->eigr,pep->eigi,pep->errest,nv)); |
| 1291 | } | ||
| 1292 | 182 | sr->itsKs += pep->its; | |
| 1293 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
182 | if (pep->nconv>0) { |
| 1294 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
172 | PetscCall(BVSetActiveColumns(ctx->V,0,pep->nconv)); |
| 1295 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
172 | PetscCall(BVGetActiveColumns(pep->V,NULL,&nq)); |
| 1296 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
172 | PetscCall(BVSetActiveColumns(pep->V,0,nq)); |
| 1297 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
172 | if (nq>pep->nconv) { |
| 1298 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
172 | PetscCall(BVTensorCompress(ctx->V,pep->nconv)); |
| 1299 |
4/6✓ Branch 0 taken 7 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
172 | PetscCall(BVSetActiveColumns(pep->V,0,pep->nconv)); |
| 1300 | } | ||
| 1301 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
3800 | for (j=0;j<pep->nconv;j++) { |
| 1302 | 3628 | pep->eigr[j] *= pep->sfactor; | |
| 1303 | 3628 | pep->eigi[j] *= pep->sfactor; | |
| 1304 | } | ||
| 1305 | } | ||
| 1306 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
182 | PetscCall(PetscInfo(pep,"Finished STOAR: nconv=%" PetscInt_FMT " (deflated=%" PetscInt_FMT ", left=%" PetscInt_FMT ", right=%" PetscInt_FMT ")\n",pep->nconv,sr->ndef0+sr->ndef1,count0-sr->ndef0,count1-sr->ndef1)); |
| 1307 |
5/8✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
182 | PetscCall(STScaleShift(pep->st,sinv?1.0/pep->sfactor:pep->sfactor)); |
| 1308 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
182 | PetscCall(RGPopScale(pep->rg)); |
| 1309 | |||
| 1310 |
3/6✓ Branch 0 taken 3 times.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
182 | PetscCheck(pep->reason!=PEP_DIVERGED_SYMMETRY_LOST || nconv>=sr->ndef0+sr->ndef1,PetscObjectComm((PetscObject)pep),PETSC_ERR_PLIB,"Symmetry lost at sigma=%g",(double)sr->sPres->value); |
| 1311 |
4/4✓ Branch 0 taken 3 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
|
182 | if (pep->reason == PEP_DIVERGED_SYMMETRY_LOST && nconv==sr->ndef0+sr->ndef1) { |
| 1312 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
2 | PetscCheck(++sr->symmlost<=10,PetscObjectComm((PetscObject)pep),PETSC_ERR_PLIB,"Symmetry lost at sigma=%g",(double)sr->sPres->value); |
| 1313 | 180 | } else sr->symmlost = 0; | |
| 1314 | |||
| 1315 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
182 | PetscCall(DSTruncate(pep->ds,pep->nconv,PETSC_TRUE)); |
| 1316 |
5/8✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
182 | PetscCall(PetscFree(back)); |
| 1317 |
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.
|
43 | PetscFunctionReturn(PETSC_SUCCESS); |
| 1318 | } | ||
| 1319 | |||
| 1320 | 58 | static PetscErrorCode PEPQSliceGetInertias(PEP pep,PetscInt *n,PetscReal **shifts,PetscInt **inertias) | |
| 1321 | { | ||
| 1322 | 58 | PEP_STOAR *ctx=(PEP_STOAR*)pep->data; | |
| 1323 | 58 | PEP_SR sr=ctx->sr; | |
| 1324 | 58 | PetscInt i=0,j,tmpi; | |
| 1325 | 58 | PetscReal v,tmpr; | |
| 1326 | 58 | PEP_shift s; | |
| 1327 | |||
| 1328 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
58 | PetscFunctionBegin; |
| 1329 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
58 | PetscCheck(pep->state,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_WRONGSTATE,"Must call PEPSetUp() first"); |
| 1330 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
58 | PetscCheck(sr,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_WRONGSTATE,"Only available in interval computations, see PEPSetInterval()"); |
| 1331 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
|
58 | if (!sr->s0) { /* PEPSolve not called yet */ |
| 1332 | ✗ | *n = 2; | |
| 1333 | } else { | ||
| 1334 | 58 | *n = 1; | |
| 1335 | 58 | s = sr->s0; | |
| 1336 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
232 | while (s) { |
| 1337 | 174 | (*n)++; | |
| 1338 | 174 | s = s->neighb[1]; | |
| 1339 | } | ||
| 1340 | } | ||
| 1341 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(PetscMalloc1(*n,shifts)); |
| 1342 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(PetscMalloc1(*n,inertias)); |
| 1343 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
|
58 | if (!sr->s0) { /* PEPSolve not called yet */ |
| 1344 | ✗ | (*shifts)[0] = sr->int0; | |
| 1345 | ✗ | (*shifts)[1] = sr->int1; | |
| 1346 | ✗ | (*inertias)[0] = sr->inertia0; | |
| 1347 | ✗ | (*inertias)[1] = sr->inertia1; | |
| 1348 | } else { | ||
| 1349 | s = sr->s0; | ||
| 1350 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
232 | while (s) { |
| 1351 | 174 | (*shifts)[i] = s->value; | |
| 1352 | 174 | (*inertias)[i++] = s->inertia; | |
| 1353 | 174 | s = s->neighb[1]; | |
| 1354 | } | ||
| 1355 | 58 | (*shifts)[i] = sr->int1; | |
| 1356 | 58 | (*inertias)[i] = sr->inertia1; | |
| 1357 | } | ||
| 1358 | /* remove possible duplicate in last position */ | ||
| 1359 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
58 | if ((*shifts)[(*n)-1]==(*shifts)[(*n)-2]) (*n)--; |
| 1360 | /* sort result */ | ||
| 1361 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
270 | for (i=0;i<*n;i++) { |
| 1362 | 212 | v = (*shifts)[i]; | |
| 1363 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
690 | for (j=i+1;j<*n;j++) { |
| 1364 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
478 | if (v > (*shifts)[j]) { |
| 1365 | 190 | SlepcSwap((*shifts)[i],(*shifts)[j],tmpr); | |
| 1366 | 190 | SlepcSwap((*inertias)[i],(*inertias)[j],tmpi); | |
| 1367 | 190 | v = (*shifts)[i]; | |
| 1368 | } | ||
| 1369 | } | ||
| 1370 | } | ||
| 1371 |
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.
|
14 | PetscFunctionReturn(PETSC_SUCCESS); |
| 1372 | } | ||
| 1373 | |||
| 1374 | 66 | PetscErrorCode PEPSolve_STOAR_QSlice(PEP pep) | |
| 1375 | { | ||
| 1376 | 66 | PetscInt i,j,ti,deg=pep->nmat-1; | |
| 1377 | 66 | PetscReal newS; | |
| 1378 | 66 | PEP_STOAR *ctx=(PEP_STOAR*)pep->data; | |
| 1379 | 66 | PEP_SR sr=ctx->sr; | |
| 1380 | 66 | Mat S,B; | |
| 1381 | 66 | PetscScalar *pS; | |
| 1382 | |||
| 1383 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
66 | PetscFunctionBegin; |
| 1384 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
66 | PetscCall(PetscCitationsRegister(citation,&cited)); |
| 1385 | |||
| 1386 | /* Only with eigenvalues present in the interval ...*/ | ||
| 1387 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
66 | if (sr->numEigs==0) { |
| 1388 | 8 | pep->reason = PEP_CONVERGED_TOL; | |
| 1389 |
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.
|
8 | PetscFunctionReturn(PETSC_SUCCESS); |
| 1390 | } | ||
| 1391 | |||
| 1392 | /* Inner product matrix */ | ||
| 1393 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(PEPSTOARSetUpInnerMatrix(pep,&B)); |
| 1394 | |||
| 1395 | /* Array of pending shifts */ | ||
| 1396 | 58 | sr->maxPend = 100; /* Initial size */ | |
| 1397 | 58 | sr->nPend = 0; | |
| 1398 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(PetscMalloc1(sr->maxPend,&sr->pending)); |
| 1399 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(PEPCreateShift(pep,sr->int0,NULL,NULL)); |
| 1400 | /* extract first shift */ | ||
| 1401 | 58 | sr->sPrev = NULL; | |
| 1402 | 58 | sr->sPres = sr->pending[--sr->nPend]; | |
| 1403 | 58 | sr->sPres->inertia = sr->inertia0; | |
| 1404 | 58 | pep->target = sr->sPres->value; | |
| 1405 | 58 | sr->s0 = sr->sPres; | |
| 1406 | 58 | sr->indexEig = 0; | |
| 1407 | |||
| 1408 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
1462 | for (i=0;i<sr->numEigs;i++) { |
| 1409 | 1404 | sr->eigr[i] = 0.0; | |
| 1410 | 1404 | sr->eigi[i] = 0.0; | |
| 1411 | 1404 | sr->errest[i] = 0.0; | |
| 1412 | 1404 | sr->perm[i] = i; | |
| 1413 | } | ||
| 1414 | /* Vectors for deflation */ | ||
| 1415 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(PetscMalloc2(sr->numEigs,&sr->idxDef0,sr->numEigs,&sr->idxDef1)); |
| 1416 | 58 | sr->indexEig = 0; | |
| 1417 | 58 | while (sr->sPres) { | |
| 1418 | /* Search for deflation */ | ||
| 1419 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
182 | PetscCall(PEPLookForDeflation(pep)); |
| 1420 | /* KrylovSchur */ | ||
| 1421 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
182 | PetscCall(PEPSTOAR_QSlice(pep,B)); |
| 1422 | |||
| 1423 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
182 | PetscCall(PEPStoreEigenpairs(pep)); |
| 1424 | /* Select new shift */ | ||
| 1425 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
182 | if (!sr->sPres->comp[1]) { |
| 1426 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
100 | PetscCall(PEPGetNewShiftValue(pep,1,&newS)); |
| 1427 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
100 | PetscCall(PEPCreateShift(pep,newS,sr->sPres,sr->sPres->neighb[1])); |
| 1428 | } | ||
| 1429 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
182 | if (!sr->sPres->comp[0]) { |
| 1430 | /* Completing earlier interval */ | ||
| 1431 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
24 | PetscCall(PEPGetNewShiftValue(pep,0,&newS)); |
| 1432 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
24 | PetscCall(PEPCreateShift(pep,newS,sr->sPres->neighb[0],sr->sPres)); |
| 1433 | } | ||
| 1434 | /* Preparing for a new search of values */ | ||
| 1435 |
7/8✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
|
240 | PetscCall(PEPExtractShift(pep)); |
| 1436 | } | ||
| 1437 | |||
| 1438 | /* Updating pep values prior to exit */ | ||
| 1439 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(PetscFree2(sr->idxDef0,sr->idxDef1)); |
| 1440 |
5/8✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
58 | PetscCall(PetscFree(sr->pending)); |
| 1441 | 58 | pep->nconv = sr->indexEig; | |
| 1442 | 58 | pep->reason = PEP_CONVERGED_TOL; | |
| 1443 | 58 | pep->its = sr->itsKs; | |
| 1444 | 58 | pep->nev = sr->indexEig; | |
| 1445 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(MatCreateSeqDense(PETSC_COMM_SELF,pep->nconv,pep->nconv,NULL,&S)); |
| 1446 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(MatDenseGetArray(S,&pS)); |
| 1447 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
1462 | for (i=0;i<pep->nconv;i++) { |
| 1448 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
20492 | for (j=0;j<sr->qinfo[i].nq;j++) pS[i*pep->nconv+sr->qinfo[i].q[j]] = *(sr->S+i*sr->ld*deg+j); |
| 1449 | } | ||
| 1450 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(MatDenseRestoreArray(S,&pS)); |
| 1451 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(BVSetActiveColumns(sr->V,0,pep->nconv)); |
| 1452 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(BVMultInPlace(sr->V,S,0,pep->nconv)); |
| 1453 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(MatDestroy(&S)); |
| 1454 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(BVDestroy(&pep->V)); |
| 1455 | 58 | pep->V = sr->V; | |
| 1456 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(PetscFree4(pep->eigr,pep->eigi,pep->errest,pep->perm)); |
| 1457 | 58 | pep->eigr = sr->eigr; | |
| 1458 | 58 | pep->eigi = sr->eigi; | |
| 1459 | 58 | pep->perm = sr->perm; | |
| 1460 | 58 | pep->errest = sr->errest; | |
| 1461 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
58 | if (sr->dir<0) { |
| 1462 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
412 | for (i=0;i<pep->nconv/2;i++) { |
| 1463 | 362 | ti = sr->perm[i]; sr->perm[i] = sr->perm[pep->nconv-1-i]; sr->perm[pep->nconv-1-i] = ti; | |
| 1464 | } | ||
| 1465 | } | ||
| 1466 |
5/8✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
58 | PetscCall(PetscFree(ctx->inertias)); |
| 1467 |
5/8✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
58 | PetscCall(PetscFree(ctx->shifts)); |
| 1468 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(MatDestroy(&B)); |
| 1469 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
58 | PetscCall(PEPQSliceGetInertias(pep,&ctx->nshifts,&ctx->shifts,&ctx->inertias)); |
| 1470 |
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.
|
14 | PetscFunctionReturn(PETSC_SUCCESS); |
| 1471 | } | ||
| 1472 |