| 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 | This file contains some simple default routines for common operations | ||
| 12 | */ | ||
| 13 | |||
| 14 | #include <slepc/private/epsimpl.h> /*I "slepceps.h" I*/ | ||
| 15 | #include <slepcvec.h> | ||
| 16 | |||
| 17 | 6957 | PetscErrorCode EPSBackTransform_Default(EPS eps) | |
| 18 | { | ||
| 19 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
6957 | PetscFunctionBegin; |
| 20 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6957 | PetscCall(STBackTransform(eps->st,eps->nconv,eps->eigr,eps->eigi)); |
| 21 |
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.
|
1316 | PetscFunctionReturn(PETSC_SUCCESS); |
| 22 | } | ||
| 23 | |||
| 24 | /* | ||
| 25 | EPSComputeVectors_Hermitian - Copies the Lanczos vectors as eigenvectors | ||
| 26 | using purification for generalized eigenproblems. | ||
| 27 | */ | ||
| 28 | 2985 | PetscErrorCode EPSComputeVectors_Hermitian(EPS eps) | |
| 29 | { | ||
| 30 | 2985 | PetscBool iscayley,indef; | |
| 31 | 2985 | Mat B,C; | |
| 32 | |||
| 33 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2985 | PetscFunctionBegin; |
| 34 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2985 | if (eps->purify) { |
| 35 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
648 | PetscCall(EPS_Purify(eps,eps->nconv)); |
| 36 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
648 | PetscCall(BVNormalize(eps->V,NULL)); |
| 37 | } else { | ||
| 38 | /* In the case of Cayley transform, eigenvectors need to be B-normalized */ | ||
| 39 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2337 | PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STCAYLEY,&iscayley)); |
| 40 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
|
2337 | if (iscayley && eps->isgeneralized) { |
| 41 |
4/6✓ Branch 0 taken 2 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(STGetMatrix(eps->st,1,&B)); |
| 42 |
4/6✓ Branch 0 taken 2 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(BVGetMatrix(eps->V,&C,&indef)); |
| 43 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
10 | PetscCheck(!indef,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONGSTATE,"The inner product should not be indefinite"); |
| 44 |
4/6✓ Branch 0 taken 2 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(BVSetMatrix(eps->V,B,PETSC_FALSE)); |
| 45 |
4/6✓ Branch 0 taken 2 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(BVNormalize(eps->V,NULL)); |
| 46 |
4/6✓ Branch 0 taken 2 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(BVSetMatrix(eps->V,C,PETSC_FALSE)); /* restore original matrix */ |
| 47 | } | ||
| 48 | } | ||
| 49 |
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.
|
581 | PetscFunctionReturn(PETSC_SUCCESS); |
| 50 | } | ||
| 51 | |||
| 52 | /* | ||
| 53 | EPSComputeVectors_Indefinite - similar to the Schur version but | ||
| 54 | for indefinite problems | ||
| 55 | */ | ||
| 56 | 121 | PetscErrorCode EPSComputeVectors_Indefinite(EPS eps) | |
| 57 | { | ||
| 58 | 121 | PetscInt n; | |
| 59 | 121 | Mat X; | |
| 60 | |||
| 61 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
121 | PetscFunctionBegin; |
| 62 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
121 | PetscCall(DSGetDimensions(eps->ds,&n,NULL,NULL,NULL)); |
| 63 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
121 | PetscCall(DSVectors(eps->ds,DS_MAT_X,NULL,NULL)); |
| 64 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
121 | PetscCall(DSGetMat(eps->ds,DS_MAT_X,&X)); |
| 65 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
121 | PetscCall(BVMultInPlace(eps->V,X,0,n)); |
| 66 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
121 | PetscCall(DSRestoreMat(eps->ds,DS_MAT_X,&X)); |
| 67 | |||
| 68 | /* purification */ | ||
| 69 |
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.
|
121 | if (eps->purify) PetscCall(EPS_Purify(eps,eps->nconv)); |
| 70 | |||
| 71 | /* normalization */ | ||
| 72 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
121 | PetscCall(BVNormalize(eps->V,eps->eigi)); |
| 73 |
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); |
| 74 | } | ||
| 75 | |||
| 76 | /* | ||
| 77 | EPSComputeVectors_Twosided - Adjust left eigenvectors in generalized problems: y = B^-* y. | ||
| 78 | */ | ||
| 79 | 199 | PetscErrorCode EPSComputeVectors_Twosided(EPS eps) | |
| 80 | { | ||
| 81 | 199 | PetscInt i; | |
| 82 | 199 | Vec w,y; | |
| 83 | |||
| 84 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
199 | PetscFunctionBegin; |
| 85 |
9/16✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
|
199 | if (!eps->twosided || !eps->isgeneralized) PetscFunctionReturn(PETSC_SUCCESS); |
| 86 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
41 | PetscCall(EPSSetWorkVecs(eps,1)); |
| 87 | 41 | w = eps->work[0]; | |
| 88 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
246 | for (i=0;i<eps->nconv;i++) { |
| 89 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
205 | PetscCall(BVCopyVec(eps->W,i,w)); |
| 90 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
205 | PetscCall(BVGetColumn(eps->W,i,&y)); |
| 91 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
205 | PetscCall(STMatSolveHermitianTranspose(eps->st,w,y)); |
| 92 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
205 | PetscCall(BVRestoreColumn(eps->W,i,&y)); |
| 93 | } | ||
| 94 |
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.
|
9 | PetscFunctionReturn(PETSC_SUCCESS); |
| 95 | } | ||
| 96 | |||
| 97 | /* | ||
| 98 | EPSComputeVectors_Schur - Compute eigenvectors from the vectors | ||
| 99 | provided by the eigensolver. This version is intended for solvers | ||
| 100 | that provide Schur vectors. Given the partial Schur decomposition | ||
| 101 | OP*V=V*T, the following steps are performed: | ||
| 102 | 1) compute eigenvectors of T: T*Z=Z*D | ||
| 103 | 2) compute eigenvectors of OP: X=V*Z | ||
| 104 | */ | ||
| 105 | 3535 | PetscErrorCode EPSComputeVectors_Schur(EPS eps) | |
| 106 | { | ||
| 107 | 3535 | PetscInt i; | |
| 108 | 3535 | Mat Z; | |
| 109 | 3535 | Vec z; | |
| 110 | |||
| 111 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
3535 | PetscFunctionBegin; |
| 112 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
3535 | if (eps->ishermitian) { |
| 113 |
3/10✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
552 | if (eps->isgeneralized && !eps->ispositive) PetscCall(EPSComputeVectors_Indefinite(eps)); |
| 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.
|
552 | else PetscCall(EPSComputeVectors_Hermitian(eps)); |
| 115 |
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.
|
552 | PetscFunctionReturn(PETSC_SUCCESS); |
| 116 | } | ||
| 117 | |||
| 118 | /* right eigenvectors */ | ||
| 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.
|
2983 | PetscCall(DSVectors(eps->ds,DS_MAT_X,NULL,NULL)); |
| 120 | |||
| 121 | /* V = V * Z */ | ||
| 122 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2983 | PetscCall(DSGetMat(eps->ds,DS_MAT_X,&Z)); |
| 123 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2983 | PetscCall(BVMultInPlace(eps->V,Z,0,eps->nconv)); |
| 124 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2983 | PetscCall(DSRestoreMat(eps->ds,DS_MAT_X,&Z)); |
| 125 | |||
| 126 | /* Purify eigenvectors */ | ||
| 127 |
6/8✓ Branch 0 taken 8 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
2983 | if (eps->purify) PetscCall(EPS_Purify(eps,eps->nconv)); |
| 128 | |||
| 129 | /* Fix eigenvectors if balancing was used */ | ||
| 130 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
|
2983 | if (eps->balance!=EPS_BALANCE_NONE && eps->D) { |
| 131 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
740 | for (i=0;i<eps->nconv;i++) { |
| 132 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
620 | PetscCall(BVGetColumn(eps->V,i,&z)); |
| 133 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
620 | PetscCall(VecPointwiseDivide(z,z,eps->D)); |
| 134 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
620 | PetscCall(BVRestoreColumn(eps->V,i,&z)); |
| 135 | } | ||
| 136 | } | ||
| 137 | |||
| 138 | /* normalize eigenvectors (when using purification or balancing) */ | ||
| 139 |
9/12✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
2983 | if (eps->purify || (eps->balance!=EPS_BALANCE_NONE && eps->D)) PetscCall(BVNormalize(eps->V,eps->eigi)); |
| 140 | |||
| 141 | /* left eigenvectors */ | ||
| 142 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2983 | if (eps->twosided) { |
| 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.
|
159 | PetscCall(DSVectors(eps->ds,DS_MAT_Y,NULL,NULL)); |
| 144 | /* W = W * Z */ | ||
| 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.
|
159 | PetscCall(DSGetMat(eps->ds,DS_MAT_Y,&Z)); |
| 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.
|
159 | PetscCall(BVMultInPlace(eps->W,Z,0,eps->nconv)); |
| 147 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
159 | PetscCall(DSRestoreMat(eps->ds,DS_MAT_Y,&Z)); |
| 148 | /* Fix left eigenvectors if balancing was used */ | ||
| 149 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
|
159 | if (eps->balance!=EPS_BALANCE_NONE && eps->D) { |
| 150 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
100 | for (i=0;i<eps->nconv;i++) { |
| 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.
|
80 | PetscCall(BVGetColumn(eps->W,i,&z)); |
| 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.
|
80 | PetscCall(VecPointwiseMult(z,z,eps->D)); |
| 153 |
4/6✓ Branch 0 taken 2 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(BVRestoreColumn(eps->W,i,&z)); |
| 154 | } | ||
| 155 | } | ||
| 156 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
159 | PetscCall(EPSComputeVectors_Twosided(eps)); |
| 157 | /* normalize */ | ||
| 158 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
159 | PetscCall(BVNormalize(eps->W,eps->eigi)); |
| 159 | #if !defined(PETSC_USE_COMPLEX) | ||
| 160 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
450 | for (i=0;i<eps->nconv-1;i++) { |
| 161 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
361 | if (eps->eigi[i] != 0.0) { |
| 162 |
5/8✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
|
24 | if (eps->eigi[i] > 0.0) PetscCall(BVScaleColumn(eps->W,i+1,-1.0)); |
| 163 | 24 | i++; | |
| 164 | } | ||
| 165 | } | ||
| 166 | #endif | ||
| 167 | } | ||
| 168 |
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.
|
557 | PetscFunctionReturn(PETSC_SUCCESS); |
| 169 | } | ||
| 170 | |||
| 171 | /*@ | ||
| 172 | EPSSetWorkVecs - Sets a number of work vectors into an `EPS` object. | ||
| 173 | |||
| 174 | Collective | ||
| 175 | |||
| 176 | Input Parameters: | ||
| 177 | + eps - the linear eigensolver context | ||
| 178 | - nw - number of work vectors to allocate | ||
| 179 | |||
| 180 | Developer Note: | ||
| 181 | This is `SLEPC_EXTERN` because it may be required by user plugin `EPS` | ||
| 182 | implementations. | ||
| 183 | |||
| 184 | Level: developer | ||
| 185 | |||
| 186 | .seealso: [](ch:eps), `EPSSetUp()` | ||
| 187 | @*/ | ||
| 188 | 44652 | PetscErrorCode EPSSetWorkVecs(EPS eps,PetscInt nw) | |
| 189 | { | ||
| 190 | 44652 | Vec t; | |
| 191 | |||
| 192 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
44652 | PetscFunctionBegin; |
| 193 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
44652 | PetscValidHeaderSpecific(eps,EPS_CLASSID,1); |
| 194 |
27/62✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
|
44652 | PetscValidLogicalCollectiveInt(eps,nw,2); |
| 195 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
44652 | PetscCheck(nw>0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"nw must be > 0: nw = %" PetscInt_FMT,nw); |
| 196 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
44652 | if (eps->nwork < nw) { |
| 197 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7406 | PetscCall(VecDestroyVecs(eps->nwork,&eps->work)); |
| 198 | 7406 | eps->nwork = nw; | |
| 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.
|
7406 | PetscCall(BVGetColumn(eps->V,0,&t)); |
| 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.
|
7406 | PetscCall(VecDuplicateVecs(t,nw,&eps->work)); |
| 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.
|
7406 | PetscCall(BVRestoreColumn(eps->V,0,&t)); |
| 202 | } | ||
| 203 |
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.
|
8821 | PetscFunctionReturn(PETSC_SUCCESS); |
| 204 | } | ||
| 205 | |||
| 206 | /* | ||
| 207 | EPSSetWhichEigenpairs_Default - Sets the default value for which, | ||
| 208 | depending on the ST. | ||
| 209 | */ | ||
| 210 | 1238 | PetscErrorCode EPSSetWhichEigenpairs_Default(EPS eps) | |
| 211 | { | ||
| 212 | 1238 | PetscBool target; | |
| 213 | |||
| 214 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1238 | PetscFunctionBegin; |
| 215 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1238 | PetscCall(PetscObjectTypeCompareAny((PetscObject)eps->st,&target,STSINVERT,STCAYLEY,"")); |
| 216 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1238 | if (target) eps->which = EPS_TARGET_MAGNITUDE; |
| 217 | 1006 | else eps->which = EPS_LARGEST_MAGNITUDE; | |
| 218 |
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.
|
232 | PetscFunctionReturn(PETSC_SUCCESS); |
| 219 | } | ||
| 220 | |||
| 221 | /* | ||
| 222 | EPSConvergedRelative - Checks convergence relative to the eigenvalue. | ||
| 223 | */ | ||
| 224 | 469544 | PetscErrorCode EPSConvergedRelative(EPS eps,PetscScalar eigr,PetscScalar eigi,PetscReal res,PetscReal *errest,void *ctx) | |
| 225 | { | ||
| 226 | 469544 | PetscReal w; | |
| 227 | |||
| 228 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
469544 | PetscFunctionBegin; |
| 229 | 469544 | w = SlepcAbsEigenvalue(eigr,eigi); | |
| 230 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
469544 | *errest = (w!=0.0)? res/w: PETSC_MAX_REAL; |
| 231 |
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.
|
469544 | PetscFunctionReturn(PETSC_SUCCESS); |
| 232 | } | ||
| 233 | |||
| 234 | /* | ||
| 235 | EPSConvergedAbsolute - Checks convergence absolutely. | ||
| 236 | */ | ||
| 237 | 27554 | PetscErrorCode EPSConvergedAbsolute(EPS eps,PetscScalar eigr,PetscScalar eigi,PetscReal res,PetscReal *errest,void *ctx) | |
| 238 | { | ||
| 239 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
27554 | PetscFunctionBegin; |
| 240 | 27554 | *errest = res; | |
| 241 |
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.
|
27554 | PetscFunctionReturn(PETSC_SUCCESS); |
| 242 | } | ||
| 243 | |||
| 244 | /* | ||
| 245 | EPSConvergedNorm - Checks convergence relative to the eigenvalue and | ||
| 246 | the matrix norms. | ||
| 247 | */ | ||
| 248 | 56321 | PetscErrorCode EPSConvergedNorm(EPS eps,PetscScalar eigr,PetscScalar eigi,PetscReal res,PetscReal *errest,void *ctx) | |
| 249 | { | ||
| 250 | 56321 | PetscReal w; | |
| 251 | |||
| 252 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
56321 | PetscFunctionBegin; |
| 253 | 56321 | w = SlepcAbsEigenvalue(eigr,eigi); | |
| 254 | 56321 | *errest = res / (eps->nrma + w*eps->nrmb); | |
| 255 |
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.
|
56321 | PetscFunctionReturn(PETSC_SUCCESS); |
| 256 | } | ||
| 257 | |||
| 258 | /*@C | ||
| 259 | EPSStoppingBasic - Default routine to determine whether the outer eigensolver | ||
| 260 | iteration must be stopped. | ||
| 261 | |||
| 262 | Collective | ||
| 263 | |||
| 264 | Input Parameters: | ||
| 265 | + eps - the linear eigensolver context | ||
| 266 | . its - current number of iterations | ||
| 267 | . max_it - maximum number of iterations | ||
| 268 | . nconv - number of currently converged eigenpairs | ||
| 269 | . nev - number of requested eigenpairs | ||
| 270 | - ctx - context (not used here) | ||
| 271 | |||
| 272 | Output Parameter: | ||
| 273 | . reason - result of the stopping test | ||
| 274 | |||
| 275 | Notes: | ||
| 276 | `EPSStoppingBasic()` will stop if all requested eigenvalues are converged, or if | ||
| 277 | the maximum number of iterations has been reached. | ||
| 278 | |||
| 279 | This is the default stopping test. | ||
| 280 | Use `EPSSetStoppingTest()` to provide your own test instead of using this one. | ||
| 281 | |||
| 282 | Level: advanced | ||
| 283 | |||
| 284 | .seealso: [](ch:eps), `EPSSetStoppingTest()`, `EPSStoppingThreshold()`, `EPSConvergedReason`, `EPSGetConvergedReason()` | ||
| 285 | @*/ | ||
| 286 | 437090 | PetscErrorCode EPSStoppingBasic(EPS eps,PetscInt its,PetscInt max_it,PetscInt nconv,PetscInt nev,EPSConvergedReason *reason,void *ctx) | |
| 287 | { | ||
| 288 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
437090 | PetscFunctionBegin; |
| 289 | 437090 | *reason = EPS_CONVERGED_ITERATING; | |
| 290 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
437090 | if (nconv >= nev) { |
| 291 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8253 | PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: %" PetscInt_FMT " eigenpairs converged at iteration %" PetscInt_FMT "\n",nconv,its)); |
| 292 | 8253 | *reason = EPS_CONVERGED_TOL; | |
| 293 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
428837 | } else if (its >= max_it) { |
| 294 | 130 | *reason = EPS_DIVERGED_ITS; | |
| 295 |
4/6✓ Branch 0 taken 2 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(PetscInfo(eps,"Linear eigensolver iteration reached maximum number of iterations (%" PetscInt_FMT ")\n",its)); |
| 296 | } | ||
| 297 |
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.
|
86600 | PetscFunctionReturn(PETSC_SUCCESS); |
| 298 | } | ||
| 299 | |||
| 300 | /*@C | ||
| 301 | EPSStoppingThreshold - Routine to determine whether the outer eigenvalue solver | ||
| 302 | iteration must be stopped, according to some threshold for the computed values. | ||
| 303 | |||
| 304 | Collective | ||
| 305 | |||
| 306 | Input Parameters: | ||
| 307 | + eps - the linear eigensolver context | ||
| 308 | . its - current number of iterations | ||
| 309 | . max_it - maximum number of iterations | ||
| 310 | . nconv - number of currently converged eigenpairs (ignored here) | ||
| 311 | . nev - number of requested eigenpairs (ignored here) | ||
| 312 | - ctx - context containing additional data (`EPSStoppingCtx`) | ||
| 313 | |||
| 314 | Output Parameter: | ||
| 315 | . reason - result of the stopping test | ||
| 316 | |||
| 317 | Notes: | ||
| 318 | `EPSStoppingThreshold()` will stop when one of the computed eigenvalues is not | ||
| 319 | above/below the threshold given at `EPSSetThreshold()`. If a number of wanted | ||
| 320 | eigenvalues has been specified via `EPSSetDimensions()` then it is also taken into | ||
| 321 | account, and the solver will stop when one of the two conditions (threshold or | ||
| 322 | number of converged values) is met. | ||
| 323 | |||
| 324 | Use `EPSSetStoppingTest()` to provide your own test instead of using this one. | ||
| 325 | |||
| 326 | Level: advanced | ||
| 327 | |||
| 328 | .seealso: [](ch:eps), `EPSSetStoppingTest()`, `EPSStoppingBasic()`, `EPSSetThreshold()`, `EPSSetDimensions()`, `EPSConvergedReason`, `EPSGetConvergedReason()` | ||
| 329 | @*/ | ||
| 330 | 9005 | PetscErrorCode EPSStoppingThreshold(EPS eps,PetscInt its,PetscInt max_it,PetscInt nconv,PetscInt nev,EPSConvergedReason *reason,void *ctx) | |
| 331 | { | ||
| 332 | 9005 | PetscReal thres,firstev,lastev; | |
| 333 | 9005 | PetscBool magnit,rel; | |
| 334 | 9005 | EPSWhich which; | |
| 335 | |||
| 336 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
9005 | PetscFunctionBegin; |
| 337 | 9005 | *reason = EPS_CONVERGED_ITERATING; | |
| 338 | 9005 | firstev = ((EPSStoppingCtx)ctx)->firstev; | |
| 339 | 9005 | lastev = ((EPSStoppingCtx)ctx)->lastev; | |
| 340 | 9005 | thres = ((EPSStoppingCtx)ctx)->thres; | |
| 341 | 9005 | rel = ((EPSStoppingCtx)ctx)->threlative; | |
| 342 | 9005 | which = ((EPSStoppingCtx)ctx)->which; | |
| 343 | 9005 | magnit = (which==EPS_SMALLEST_MAGNITUDE || which==EPS_LARGEST_MAGNITUDE || which==EPS_TARGET_MAGNITUDE)? PETSC_TRUE: PETSC_FALSE; | |
| 344 |
18/18✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 10 times.
✓ Branch 7 taken 10 times.
✓ Branch 8 taken 10 times.
✓ Branch 9 taken 10 times.
✓ Branch 10 taken 10 times.
✓ Branch 11 taken 10 times.
✓ Branch 12 taken 10 times.
✓ Branch 13 taken 10 times.
✓ Branch 14 taken 10 times.
✓ Branch 15 taken 10 times.
✓ Branch 16 taken 2 times.
✓ Branch 17 taken 2 times.
|
9005 | if (nconv && magnit && which==EPS_TARGET_MAGNITUDE && ((rel && ((thres>1.0 && lastev>thres*firstev) || (thres<1.0 && lastev<thres*firstev))) || (!rel && lastev>thres))) { |
| 345 |
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.
|
30 | if (!rel) PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: the eigenvalue magnitude %g is above the threshold %g\n",(double)lastev,(double)thres)); |
| 346 |
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.
|
20 | else if (thres>1.0) PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: the ratio %g/%g is above the threshold %g\n",(double)lastev,(double)firstev,(double)thres)); |
| 347 |
4/6✓ Branch 0 taken 2 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 | else PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: the ratio %g/%g is below the threshold %g\n",(double)lastev,(double)firstev,(double)thres)); |
| 348 | 30 | *reason = EPS_CONVERGED_TOL; | |
| 349 |
16/16✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 8 times.
✓ Branch 9 taken 10 times.
✓ Branch 10 taken 8 times.
✓ Branch 11 taken 8 times.
✓ Branch 12 taken 10 times.
✓ Branch 13 taken 10 times.
✓ Branch 14 taken 2 times.
✓ Branch 15 taken 2 times.
|
8975 | } else if (nconv && magnit && ((which==EPS_LARGEST_MAGNITUDE && ((rel && lastev<thres*firstev) || (!rel && lastev<thres))) || (which==EPS_SMALLEST_MAGNITUDE && lastev>thres))) { |
| 350 |
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.
|
112 | if (which==EPS_SMALLEST_MAGNITUDE) PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: the eigenvalue magnitude %g is above the threshold %g\n",(double)lastev,(double)thres)); |
| 351 |
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.
|
42 | else if (!rel) PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: the eigenvalue magnitude %g is below the threshold %g\n",(double)lastev,(double)thres)); |
| 352 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
42 | else PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: the ratio %g/%g is below the threshold %g\n",(double)lastev,(double)firstev,(double)thres)); |
| 353 | 112 | *reason = EPS_CONVERGED_TOL; | |
| 354 |
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.
|
8863 | } else if (nconv && !magnit && ((which==EPS_LARGEST_REAL && lastev<thres) || (which==EPS_SMALLEST_REAL && lastev>thres))) { |
| 355 | ✗ | if (which==EPS_LARGEST_REAL) PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: eigenvalue %g is below the threshold %g\n",(double)lastev,(double)thres)); | |
| 356 | ✗ | else PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: eigenvalue %g is above the threshold %g\n",(double)lastev,(double)thres)); | |
| 357 | ✗ | *reason = EPS_CONVERGED_TOL; | |
| 358 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 10 times.
|
8863 | } else if (nev && nconv >= nev) { |
| 359 |
3/6✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
4 | PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: %" PetscInt_FMT " eigenpairs converged at iteration %" PetscInt_FMT "\n",nconv,its)); |
| 360 | 4 | *reason = EPS_CONVERGED_TOL; | |
| 361 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
8859 | } else if (its >= max_it) { |
| 362 | ✗ | *reason = EPS_DIVERGED_ITS; | |
| 363 | ✗ | PetscCall(PetscInfo(eps,"Linear eigensolver iteration reached maximum number of iterations (%" PetscInt_FMT ")\n",its)); | |
| 364 | } | ||
| 365 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
1841 | PetscFunctionReturn(PETSC_SUCCESS); |
| 366 | } | ||
| 367 | |||
| 368 | /* | ||
| 369 | EPSComputeRitzVector - Computes the current Ritz vector. | ||
| 370 | |||
| 371 | Simple case (complex scalars or real scalars with Zi=NULL): | ||
| 372 | x = V*Zr (V is a basis of nv vectors, Zr has length nv) | ||
| 373 | |||
| 374 | Split case: | ||
| 375 | x = V*Zr y = V*Zi (Zr and Zi have length nv) | ||
| 376 | */ | ||
| 377 | 4191 | PetscErrorCode EPSComputeRitzVector(EPS eps,PetscScalar *Zr,PetscScalar *Zi,BV V,Vec x,Vec y) | |
| 378 | { | ||
| 379 | 4191 | PetscInt l,k; | |
| 380 | 4191 | PetscReal norm; | |
| 381 | #if !defined(PETSC_USE_COMPLEX) | ||
| 382 | 2060 | Vec z; | |
| 383 | #endif | ||
| 384 | |||
| 385 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
4191 | PetscFunctionBegin; |
| 386 | /* compute eigenvector */ | ||
| 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.
|
4191 | PetscCall(BVGetActiveColumns(V,&l,&k)); |
| 388 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
4191 | PetscCall(BVSetActiveColumns(V,0,k)); |
| 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.
|
4191 | PetscCall(BVMultVec(V,1.0,0.0,x,Zr)); |
| 390 | |||
| 391 | /* purify eigenvector if necessary */ | ||
| 392 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
4191 | if (eps->purify) { |
| 393 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
265 | PetscCall(STApply(eps->st,x,y)); |
| 394 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 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.
|
265 | if (eps->ishermitian) PetscCall(BVNormVec(eps->V,y,NORM_2,&norm)); |
| 395 |
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.
|
145 | else PetscCall(VecNorm(y,NORM_2,&norm)); |
| 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.
|
265 | PetscCall(VecScale(y,1.0/norm)); |
| 397 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
265 | PetscCall(VecCopy(y,x)); |
| 398 | } | ||
| 399 | /* fix eigenvector if balancing is used */ | ||
| 400 |
9/12✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
4191 | if (!eps->ishermitian && eps->balance!=EPS_BALANCE_NONE && eps->D) PetscCall(VecPointwiseDivide(x,x,eps->D)); |
| 401 | #if !defined(PETSC_USE_COMPLEX) | ||
| 402 | /* compute imaginary part of eigenvector */ | ||
| 403 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
2060 | if (Zi) { |
| 404 |
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.
|
125 | PetscCall(BVMultVec(V,1.0,0.0,y,Zi)); |
| 405 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
|
125 | if (eps->ispositive) { |
| 406 | ✗ | PetscCall(BVCreateVec(V,&z)); | |
| 407 | ✗ | PetscCall(STApply(eps->st,y,z)); | |
| 408 | ✗ | PetscCall(VecNorm(z,NORM_2,&norm)); | |
| 409 | ✗ | PetscCall(VecScale(z,1.0/norm)); | |
| 410 | ✗ | PetscCall(VecCopy(z,y)); | |
| 411 | ✗ | PetscCall(VecDestroy(&z)); | |
| 412 | } | ||
| 413 |
7/10✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 4 times.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
|
125 | if (eps->balance!=EPS_BALANCE_NONE && eps->D) PetscCall(VecPointwiseDivide(y,y,eps->D)); |
| 414 | } else | ||
| 415 | #endif | ||
| 416 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
4066 | PetscCall(VecSet(y,0.0)); |
| 417 | |||
| 418 | /* normalize eigenvectors (when using balancing) */ | ||
| 419 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
|
4191 | if (eps->balance!=EPS_BALANCE_NONE && eps->D) { |
| 420 | #if !defined(PETSC_USE_COMPLEX) | ||
| 421 |
5/8✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
|
60 | if (Zi) PetscCall(VecNormalizeComplex(x,y,PETSC_TRUE,NULL)); |
| 422 | else | ||
| 423 | #endif | ||
| 424 |
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.
|
80 | PetscCall(VecNormalize(x,NULL)); |
| 425 | } | ||
| 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.
|
4191 | PetscCall(BVSetActiveColumns(V,l,k)); |
| 427 |
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.
|
803 | PetscFunctionReturn(PETSC_SUCCESS); |
| 428 | } | ||
| 429 | |||
| 430 | /* | ||
| 431 | EPSBuildBalance_Krylov - uses a Krylov subspace method to compute the | ||
| 432 | diagonal matrix to be applied for balancing in non-Hermitian problems. | ||
| 433 | */ | ||
| 434 | 130 | PetscErrorCode EPSBuildBalance_Krylov(EPS eps) | |
| 435 | { | ||
| 436 | 130 | Vec z,p,r; | |
| 437 | 130 | PetscInt i,j; | |
| 438 | 130 | PetscReal norma; | |
| 439 | 130 | PetscScalar *pz,*pD; | |
| 440 | 130 | const PetscScalar *pr,*pp; | |
| 441 | 130 | PetscRandom rand; | |
| 442 | |||
| 443 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
130 | PetscFunctionBegin; |
| 444 |
4/6✓ Branch 0 taken 2 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(EPSSetWorkVecs(eps,3)); |
| 445 |
4/6✓ Branch 0 taken 2 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(BVGetRandomContext(eps->V,&rand)); |
| 446 | 130 | r = eps->work[0]; | |
| 447 | 130 | p = eps->work[1]; | |
| 448 | 130 | z = eps->work[2]; | |
| 449 |
4/6✓ Branch 0 taken 2 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(VecSet(eps->D,1.0)); |
| 450 | |||
| 451 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
780 | for (j=0;j<eps->balance_its;j++) { |
| 452 | |||
| 453 | /* Build a random vector of +-1's */ | ||
| 454 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
650 | PetscCall(VecSetRandom(z,rand)); |
| 455 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
650 | PetscCall(VecGetArray(z,&pz)); |
| 456 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
50950 | for (i=0;i<eps->nloc;i++) { |
| 457 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
50300 | if (PetscRealPart(pz[i])<0.5) pz[i]=-1.0; |
| 458 | 24425 | else pz[i]=1.0; | |
| 459 | } | ||
| 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.
|
650 | PetscCall(VecRestoreArray(z,&pz)); |
| 461 | |||
| 462 | /* Compute p=DA(D\z) */ | ||
| 463 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
650 | PetscCall(VecPointwiseDivide(r,z,eps->D)); |
| 464 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
650 | PetscCall(STApply(eps->st,r,p)); |
| 465 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
650 | PetscCall(VecPointwiseMult(p,p,eps->D)); |
| 466 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
650 | if (eps->balance == EPS_BALANCE_TWOSIDE) { |
| 467 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
400 | if (j==0) { |
| 468 | /* Estimate the matrix inf-norm */ | ||
| 469 |
4/6✓ Branch 0 taken 2 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(VecAbs(p)); |
| 470 |
4/6✓ Branch 0 taken 2 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(VecMax(p,NULL,&norma)); |
| 471 | } | ||
| 472 | /* Compute r=D\(A'Dz) */ | ||
| 473 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
400 | PetscCall(VecPointwiseMult(z,z,eps->D)); |
| 474 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
400 | PetscCall(STApplyHermitianTranspose(eps->st,z,r)); |
| 475 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
400 | PetscCall(VecPointwiseDivide(r,r,eps->D)); |
| 476 | } | ||
| 477 | |||
| 478 | /* Adjust values of D */ | ||
| 479 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
650 | PetscCall(VecGetArrayRead(r,&pr)); |
| 480 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
650 | PetscCall(VecGetArrayRead(p,&pp)); |
| 481 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
650 | PetscCall(VecGetArray(eps->D,&pD)); |
| 482 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
50950 | for (i=0;i<eps->nloc;i++) { |
| 483 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
50300 | if (eps->balance == EPS_BALANCE_TWOSIDE) { |
| 484 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
29000 | if (PetscAbsScalar(pp[i])>eps->balance_cutoff*norma && pr[i]!=0.0) |
| 485 | 28240 | pD[i] *= PetscSqrtReal(PetscAbsScalar(pr[i]/pp[i])); | |
| 486 | } else { | ||
| 487 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
21300 | if (pp[i]!=0.0) pD[i] /= PetscAbsScalar(pp[i]); |
| 488 | } | ||
| 489 | } | ||
| 490 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
650 | PetscCall(VecRestoreArrayRead(r,&pr)); |
| 491 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
650 | PetscCall(VecRestoreArrayRead(p,&pp)); |
| 492 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
650 | PetscCall(VecRestoreArray(eps->D,&pD)); |
| 493 | } | ||
| 494 |
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.
|
26 | PetscFunctionReturn(PETSC_SUCCESS); |
| 495 | } | ||
| 496 |