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