| 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 | 7533 | PetscErrorCode EPSBackTransform_Default(EPS eps) | |
| 18 | { | ||
| 19 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
7533 | 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.
|
7533 | 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.
|
1421 | PetscFunctionReturn(PETSC_SUCCESS); |
| 22 | } | ||
| 23 | |||
| 24 | /* | ||
| 25 | EPSComputeVectors_Hermitian - Copies the Lanczos vectors as eigenvectors | ||
| 26 | using purification for generalized eigenproblems. | ||
| 27 | */ | ||
| 28 | 3006 | PetscErrorCode EPSComputeVectors_Hermitian(EPS eps) | |
| 29 | { | ||
| 30 | 3006 | PetscBool iscayley,indef; | |
| 31 | 3006 | Mat B,C; | |
| 32 | |||
| 33 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
3006 | PetscFunctionBegin; |
| 34 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
3006 | 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.
|
2358 | 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.
|
2358 | 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.
|
584 | 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 | 3621 | PetscErrorCode EPSComputeVectors_Schur(EPS eps) | |
| 106 | { | ||
| 107 | 3621 | PetscInt i; | |
| 108 | 3621 | Mat Z; | |
| 109 | 3621 | Vec z; | |
| 110 | |||
| 111 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
3621 | PetscFunctionBegin; |
| 112 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
3621 | 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.
|
562 | 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.
|
562 | 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.
|
562 | 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.
|
3059 | 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.
|
3059 | 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.
|
3059 | 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.
|
3059 | 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.
|
3059 | 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.
|
3059 | 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.
|
3059 | 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.
|
3059 | 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.
|
580 | 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 | 46591 | PetscErrorCode EPSSetWorkVecs(EPS eps,PetscInt nw) | |
| 189 | { | ||
| 190 | 46591 | Vec t; | |
| 191 | |||
| 192 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
46591 | 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.
|
46591 | 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.
|
46591 | PetscValidLogicalCollectiveInt(eps,nw,2); |
| 195 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
46591 | 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.
|
46591 | 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.
|
7907 | PetscCall(VecDestroyVecs(eps->nwork,&eps->work)); |
| 198 | 7907 | 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.
|
7907 | 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.
|
7907 | 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.
|
7907 | 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.
|
9145 | PetscFunctionReturn(PETSC_SUCCESS); |
| 204 | } | ||
| 205 | |||
| 206 | /* | ||
| 207 | EPSSetWhichEigenpairs_Default - Sets the default value for which, | ||
| 208 | depending on the ST. | ||
| 209 | */ | ||
| 210 | 1243 | PetscErrorCode EPSSetWhichEigenpairs_Default(EPS eps) | |
| 211 | { | ||
| 212 | 1243 | PetscBool target; | |
| 213 | |||
| 214 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1243 | 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.
|
1243 | PetscCall(PetscObjectTypeCompareAny((PetscObject)eps->st,&target,STSINVERT,STCAYLEY,"")); |
| 216 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1243 | if (target) eps->which = EPS_TARGET_MAGNITUDE; |
| 217 | 1016 | 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.
|
233 | PetscFunctionReturn(PETSC_SUCCESS); |
| 219 | } | ||
| 220 | |||
| 221 | /* | ||
| 222 | EPSConvergedRelative - Checks convergence relative to the eigenvalue. | ||
| 223 | */ | ||
| 224 | 478337 | PetscErrorCode EPSConvergedRelative(EPS eps,PetscScalar eigr,PetscScalar eigi,PetscReal res,PetscReal *errest,void *ctx) | |
| 225 | { | ||
| 226 | 478337 | PetscReal w; | |
| 227 | |||
| 228 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
478337 | PetscFunctionBegin; |
| 229 | 478337 | w = SlepcAbsEigenvalue(eigr,eigi); | |
| 230 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
478337 | *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.
|
478337 | PetscFunctionReturn(PETSC_SUCCESS); |
| 232 | } | ||
| 233 | |||
| 234 | /* | ||
| 235 | EPSConvergedAbsolute - Checks convergence absolutely. | ||
| 236 | */ | ||
| 237 | 27744 | 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.
|
27744 | PetscFunctionBegin; |
| 240 | 27744 | *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.
|
27744 | PetscFunctionReturn(PETSC_SUCCESS); |
| 242 | } | ||
| 243 | |||
| 244 | /* | ||
| 245 | EPSConvergedNorm - Checks convergence relative to the eigenvalue and | ||
| 246 | the matrix norms. | ||
| 247 | */ | ||
| 248 | 56367 | PetscErrorCode EPSConvergedNorm(EPS eps,PetscScalar eigr,PetscScalar eigi,PetscReal res,PetscReal *errest,void *ctx) | |
| 249 | { | ||
| 250 | 56367 | PetscReal w; | |
| 251 | |||
| 252 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
56367 | PetscFunctionBegin; |
| 253 | 56367 | w = SlepcAbsEigenvalue(eigr,eigi); | |
| 254 | 56367 | *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.
|
56367 | 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 | 437928 | 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.
|
437928 | PetscFunctionBegin; |
| 289 | 437928 | *reason = EPS_CONVERGED_ITERATING; | |
| 290 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
437928 | 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.
|
8598 | PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: %" PetscInt_FMT " eigenpairs converged at iteration %" PetscInt_FMT "\n",nconv,its)); |
| 292 | 8598 | *reason = EPS_CONVERGED_TOL; | |
| 293 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
429330 | } 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.
|
86810 | 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 | ||
| 311 | . nev - number of requested eigenpairs | ||
| 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 | 11290 | PetscErrorCode EPSStoppingThreshold(EPS eps,PetscInt its,PetscInt max_it,PetscInt nconv,PetscInt nev,EPSConvergedReason *reason,void *ctx) | |
| 331 | { | ||
| 332 | 11290 | PetscReal thres,firstev,firstnc,errest; | |
| 333 | 11290 | PetscBool magnit,rel; | |
| 334 | 11290 | PetscInt napprox; | |
| 335 | 11290 | EPSWhich which; | |
| 336 | |||
| 337 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
11290 | PetscFunctionBegin; |
| 338 | 11290 | *reason = EPS_CONVERGED_ITERATING; | |
| 339 | 11290 | firstev = ((EPSStoppingCtx)ctx)->firstev; | |
| 340 | 11290 | firstnc = ((EPSStoppingCtx)ctx)->firstnc; | |
| 341 | 11290 | errest = ((EPSStoppingCtx)ctx)->errest; | |
| 342 | 11290 | thres = ((EPSStoppingCtx)ctx)->thres; | |
| 343 | 11290 | rel = ((EPSStoppingCtx)ctx)->threlative; | |
| 344 | 11290 | napprox = ((EPSStoppingCtx)ctx)->napprox; | |
| 345 | 11290 | which = ((EPSStoppingCtx)ctx)->which; | |
| 346 | |||
| 347 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
11290 | if (!nconv) { /* no converged eigenvalues yet */ |
| 348 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
4572 | if (its >= max_it) { |
| 349 | ✗ | PetscCall(PetscInfo(eps,"Linear eigensolver iteration reached maximum number of iterations (%" PetscInt_FMT ")\n",its)); | |
| 350 | ✗ | *reason = EPS_DIVERGED_ITS; | |
| 351 | } | ||
| 352 |
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.
|
4572 | PetscFunctionReturn(PETSC_SUCCESS); |
| 353 | } | ||
| 354 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
6718 | if (nconv==napprox) { /* all approximations converged, very unusual */ |
| 355 | ✗ | PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: all available eigenvalue approximations have converged\n")); | |
| 356 | ✗ | *reason = EPS_CONVERGED_TOL; | |
| 357 | ✗ | PetscFunctionReturn(PETSC_SUCCESS); | |
| 358 | } | ||
| 359 | 6718 | magnit = (which==EPS_SMALLEST_MAGNITUDE || which==EPS_LARGEST_MAGNITUDE || which==EPS_TARGET_MAGNITUDE)? PETSC_TRUE: PETSC_FALSE; | |
| 360 |
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 9 times.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 5 times.
✓ Branch 7 taken 9 times.
✓ Branch 8 taken 6 times.
✓ Branch 9 taken 5 times.
✓ Branch 10 taken 10 times.
✓ Branch 11 taken 6 times.
✓ Branch 12 taken 10 times.
✓ Branch 13 taken 10 times.
✓ Branch 14 taken 1 times.
✓ Branch 15 taken 1 times.
|
6718 | if (magnit && which==EPS_TARGET_MAGNITUDE && ((rel && ((thres>1.0 && firstnc-errest>thres*firstev) || (thres<1.0 && firstnc+errest<thres*firstev))) || (!rel && firstnc-errest>thres))) { |
| 361 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
74 | if (its==((EPSStoppingCtx)ctx)->its+1) { |
| 362 |
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.
|
37 | if (!rel) PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: the approximation magnitude %g (minus error estimate %g) is above the threshold %g\n",(double)firstnc,(double)errest,(double)thres)); |
| 363 |
6/8✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
|
15 | else if (thres>1.0) PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: the ratio %g/%g is above the threshold %g\n",(double)(firstnc-errest),(double)firstev,(double)thres)); |
| 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 | else PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: the ratio %g/%g is below the threshold %g\n",(double)(firstnc+errest),(double)firstev,(double)thres)); |
| 365 | 37 | *reason = EPS_CONVERGED_TOL; | |
| 366 | 37 | } else ((EPSStoppingCtx)ctx)->its = its; /* wait until next iteration */ | |
| 367 |
15/16✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ 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 1 times.
✓ Branch 15 taken 1 times.
|
6644 | } else if (magnit && ((which==EPS_LARGEST_MAGNITUDE && ((rel && firstnc+errest<thres*firstev) || (!rel && firstnc+errest<thres))) || (which==EPS_SMALLEST_MAGNITUDE && firstnc-errest>thres))) { |
| 368 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
697 | if (its==((EPSStoppingCtx)ctx)->its+1) { |
| 369 |
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.
|
336 | if (which==EPS_SMALLEST_MAGNITUDE) PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: the approximation magnitude %g (minus error estimate %g) is above the threshold %g\n",(double)firstnc,(double)errest,(double)thres)); |
| 370 |
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.
|
246 | else if (!rel) PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: the approximation magnitude %g (plus error estimate %g) is below the threshold %g\n",(double)firstnc,(double)errest,(double)thres)); |
| 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.
|
42 | else PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: the ratio %g/%g is below the threshold %g\n",(double)(firstnc+errest),(double)firstev,(double)thres)); |
| 372 | 336 | *reason = EPS_CONVERGED_TOL; | |
| 373 | 361 | } else ((EPSStoppingCtx)ctx)->its = its; /* wait until next iteration */ | |
| 374 |
1/10✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
568 | } else if (!magnit && ((which==EPS_LARGEST_REAL && firstnc+errest<thres) || (which==EPS_SMALLEST_REAL && firstnc-errest>thres))) { |
| 375 | ✗ | if (its==((EPSStoppingCtx)ctx)->its+1) { | |
| 376 | ✗ | if (which==EPS_LARGEST_REAL) PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: approximation %g (plus error estimate %g) is below the threshold %g\n",(double)firstnc,(double)errest,(double)thres)); | |
| 377 | ✗ | else PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: approximation %g (minus error estimate %g) is above the threshold %g\n",(double)firstnc,(double)errest,(double)thres)); | |
| 378 | ✗ | *reason = EPS_CONVERGED_TOL; | |
| 379 | ✗ | } else ((EPSStoppingCtx)ctx)->its = its; /* wait until next iteration */ | |
| 380 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 10 times.
|
5947 | } else if (nev && nconv >= nev) { |
| 381 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
4 | PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: %" PetscInt_FMT " eigenpairs converged at iteration %" PetscInt_FMT "\n",nconv,its)); |
| 382 | 4 | *reason = EPS_CONVERGED_TOL; | |
| 383 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
5943 | } else if (its >= max_it) { |
| 384 | ✗ | PetscCall(PetscInfo(eps,"Linear eigensolver iteration reached maximum number of iterations (%" PetscInt_FMT ")\n",its)); | |
| 385 | ✗ | *reason = EPS_DIVERGED_ITS; | |
| 386 | } | ||
| 387 |
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.
|
1353 | PetscFunctionReturn(PETSC_SUCCESS); |
| 388 | } | ||
| 389 | |||
| 390 | /* | ||
| 391 | EPSComputeRitzVector - Computes the current Ritz vector. | ||
| 392 | |||
| 393 | Simple case (complex scalars or real scalars with Zi=NULL): | ||
| 394 | x = V*Zr (V is a basis of nv vectors, Zr has length nv) | ||
| 395 | |||
| 396 | Split case: | ||
| 397 | x = V*Zr y = V*Zi (Zr and Zi have length nv) | ||
| 398 | */ | ||
| 399 | 4191 | PetscErrorCode EPSComputeRitzVector(EPS eps,PetscScalar *Zr,PetscScalar *Zi,BV V,Vec x,Vec y) | |
| 400 | { | ||
| 401 | 4191 | PetscInt l,k; | |
| 402 | 4191 | PetscReal norm; | |
| 403 | #if !defined(PETSC_USE_COMPLEX) | ||
| 404 | 2060 | Vec z; | |
| 405 | #endif | ||
| 406 | |||
| 407 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
4191 | PetscFunctionBegin; |
| 408 | /* compute eigenvector */ | ||
| 409 |
4/6✓ Branch 0 taken 2 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)); |
| 410 |
4/6✓ Branch 0 taken 2 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)); |
| 411 |
4/6✓ Branch 0 taken 2 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)); |
| 412 | |||
| 413 | /* purify eigenvector if necessary */ | ||
| 414 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
4191 | if (eps->purify) { |
| 415 |
4/6✓ Branch 0 taken 2 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)); |
| 416 |
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)); |
| 417 |
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)); |
| 418 |
4/6✓ Branch 0 taken 2 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)); |
| 419 |
4/6✓ Branch 0 taken 2 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)); |
| 420 | } | ||
| 421 | /* fix eigenvector if balancing is used */ | ||
| 422 |
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)); |
| 423 | #if !defined(PETSC_USE_COMPLEX) | ||
| 424 | /* compute imaginary part of eigenvector */ | ||
| 425 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
2060 | if (Zi) { |
| 426 |
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)); |
| 427 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
|
125 | if (eps->ispositive) { |
| 428 | ✗ | PetscCall(BVCreateVec(V,&z)); | |
| 429 | ✗ | PetscCall(STApply(eps->st,y,z)); | |
| 430 | ✗ | PetscCall(VecNorm(z,NORM_2,&norm)); | |
| 431 | ✗ | PetscCall(VecScale(z,1.0/norm)); | |
| 432 | ✗ | PetscCall(VecCopy(z,y)); | |
| 433 | ✗ | PetscCall(VecDestroy(&z)); | |
| 434 | } | ||
| 435 |
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)); |
| 436 | } else | ||
| 437 | #endif | ||
| 438 |
4/6✓ Branch 0 taken 2 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)); |
| 439 | |||
| 440 | /* normalize eigenvectors (when using balancing) */ | ||
| 441 |
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) { |
| 442 | #if !defined(PETSC_USE_COMPLEX) | ||
| 443 |
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)); |
| 444 | else | ||
| 445 | #endif | ||
| 446 |
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)); |
| 447 | } | ||
| 448 |
4/6✓ Branch 0 taken 2 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)); |
| 449 |
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); |
| 450 | } | ||
| 451 | |||
| 452 | /* | ||
| 453 | EPSBuildBalance_Krylov - uses a Krylov subspace method to compute the | ||
| 454 | diagonal matrix to be applied for balancing in non-Hermitian problems. | ||
| 455 | */ | ||
| 456 | 130 | PetscErrorCode EPSBuildBalance_Krylov(EPS eps) | |
| 457 | { | ||
| 458 | 130 | Vec z,p,r; | |
| 459 | 130 | PetscInt i,j; | |
| 460 | 130 | PetscReal norma; | |
| 461 | 130 | PetscScalar *pz,*pD; | |
| 462 | 130 | const PetscScalar *pr,*pp; | |
| 463 | 130 | PetscRandom rand; | |
| 464 | |||
| 465 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
130 | PetscFunctionBegin; |
| 466 |
4/6✓ Branch 0 taken 2 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)); |
| 467 |
4/6✓ Branch 0 taken 2 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)); |
| 468 | 130 | r = eps->work[0]; | |
| 469 | 130 | p = eps->work[1]; | |
| 470 | 130 | z = eps->work[2]; | |
| 471 |
4/6✓ Branch 0 taken 2 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)); |
| 472 | |||
| 473 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
780 | for (j=0;j<eps->balance_its;j++) { |
| 474 | |||
| 475 | /* Build a random vector of +-1's */ | ||
| 476 |
4/6✓ Branch 0 taken 2 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)); |
| 477 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
650 | PetscCall(VecGetArray(z,&pz)); |
| 478 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
50950 | for (i=0;i<eps->nloc;i++) { |
| 479 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
50300 | if (PetscRealPart(pz[i])<0.5) pz[i]=-1.0; |
| 480 | 24425 | else pz[i]=1.0; | |
| 481 | } | ||
| 482 |
4/6✓ Branch 0 taken 2 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)); |
| 483 | |||
| 484 | /* Compute p=DA(D\z) */ | ||
| 485 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
650 | PetscCall(VecPointwiseDivide(r,z,eps->D)); |
| 486 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
650 | PetscCall(STApply(eps->st,r,p)); |
| 487 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
650 | PetscCall(VecPointwiseMult(p,p,eps->D)); |
| 488 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
650 | if (eps->balance == EPS_BALANCE_TWOSIDE) { |
| 489 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
400 | if (j==0) { |
| 490 | /* Estimate the matrix inf-norm */ | ||
| 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.
|
80 | PetscCall(VecAbs(p)); |
| 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.
|
80 | PetscCall(VecMax(p,NULL,&norma)); |
| 493 | } | ||
| 494 | /* Compute r=D\(A'Dz) */ | ||
| 495 |
4/6✓ Branch 0 taken 2 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)); |
| 496 |
4/6✓ Branch 0 taken 2 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)); |
| 497 |
4/6✓ Branch 0 taken 2 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)); |
| 498 | } | ||
| 499 | |||
| 500 | /* Adjust values of D */ | ||
| 501 |
4/6✓ Branch 0 taken 2 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)); |
| 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.
|
650 | PetscCall(VecGetArrayRead(p,&pp)); |
| 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.
|
650 | PetscCall(VecGetArray(eps->D,&pD)); |
| 504 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
50950 | for (i=0;i<eps->nloc;i++) { |
| 505 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
50300 | if (eps->balance == EPS_BALANCE_TWOSIDE) { |
| 506 |
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) |
| 507 | 28240 | pD[i] *= PetscSqrtReal(PetscAbsScalar(pr[i]/pp[i])); | |
| 508 | } else { | ||
| 509 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
21300 | if (pp[i]!=0.0) pD[i] /= PetscAbsScalar(pp[i]); |
| 510 | } | ||
| 511 | } | ||
| 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.
|
650 | PetscCall(VecRestoreArrayRead(r,&pr)); |
| 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.
|
650 | PetscCall(VecRestoreArrayRead(p,&pp)); |
| 514 |
4/6✓ Branch 0 taken 2 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)); |
| 515 | } | ||
| 516 |
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); |
| 517 | } | ||
| 518 |