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 - eigensolver context | ||
178 | - nw - number of work vectors to allocate | ||
179 | |||
180 | Developer Notes: | ||
181 | This is SLEPC_EXTERN because it may be required by user plugin EPS | ||
182 | implementations. | ||
183 | |||
184 | Level: developer | ||
185 | |||
186 | .seealso: 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 | 469538 | PetscErrorCode EPSConvergedRelative(EPS eps,PetscScalar eigr,PetscScalar eigi,PetscReal res,PetscReal *errest,void *ctx) | |
225 | { | ||
226 | 469538 | PetscReal w; | |
227 | |||
228 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
469538 | PetscFunctionBegin; |
229 | 469538 | w = SlepcAbsEigenvalue(eigr,eigi); | |
230 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
469538 | *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.
|
469538 | 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 - eigensolver context obtained from EPSCreate() | ||
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 | A positive value of reason indicates that the iteration has finished successfully | ||
277 | (converged), and a negative value indicates an error condition (diverged). If | ||
278 | the iteration needs to be continued, reason must be set to EPS_CONVERGED_ITERATING | ||
279 | (zero). | ||
280 | |||
281 | EPSStoppingBasic() will stop if all requested eigenvalues are converged, or if | ||
282 | the maximum number of iterations has been reached. | ||
283 | |||
284 | Use EPSSetStoppingTest() to provide your own test instead of using this one. | ||
285 | |||
286 | Level: advanced | ||
287 | |||
288 | .seealso: EPSSetStoppingTest(), EPSStoppingThreshold(), EPSConvergedReason, EPSGetConvergedReason() | ||
289 | @*/ | ||
290 | 437083 | PetscErrorCode EPSStoppingBasic(EPS eps,PetscInt its,PetscInt max_it,PetscInt nconv,PetscInt nev,EPSConvergedReason *reason,void *ctx) | |
291 | { | ||
292 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
437083 | PetscFunctionBegin; |
293 | 437083 | *reason = EPS_CONVERGED_ITERATING; | |
294 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
437083 | if (nconv >= nev) { |
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.
|
8253 | PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: %" PetscInt_FMT " eigenpairs converged at iteration %" PetscInt_FMT "\n",nconv,its)); |
296 | 8253 | *reason = EPS_CONVERGED_TOL; | |
297 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
428830 | } else if (its >= max_it) { |
298 | 130 | *reason = EPS_DIVERGED_ITS; | |
299 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
130 | PetscCall(PetscInfo(eps,"Linear eigensolver iteration reached maximum number of iterations (%" PetscInt_FMT ")\n",its)); |
300 | } | ||
301 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
86599 | PetscFunctionReturn(PETSC_SUCCESS); |
302 | } | ||
303 | |||
304 | /*@C | ||
305 | EPSStoppingThreshold - Routine to determine whether the outer eigenvalue solver | ||
306 | iteration must be stopped, according to some threshold for the computed values. | ||
307 | |||
308 | Collective | ||
309 | |||
310 | Input Parameters: | ||
311 | + eps - eigenvalue solver context obtained from EPSCreate() | ||
312 | . its - current number of iterations | ||
313 | . max_it - maximum number of iterations | ||
314 | . nconv - number of currently converged eigenpairs (ignored here) | ||
315 | . nev - number of requested eigenpairs (ignored here) | ||
316 | - ctx - context containing additional data (EPSStoppingCtx) | ||
317 | |||
318 | Output Parameter: | ||
319 | . reason - result of the stopping test | ||
320 | |||
321 | Notes: | ||
322 | A positive value of reason indicates that the iteration has finished successfully | ||
323 | (converged), and a negative value indicates an error condition (diverged). If | ||
324 | the iteration needs to be continued, reason must be set to EPS_CONVERGED_ITERATING | ||
325 | (zero). | ||
326 | |||
327 | EPSStoppingThreshold() will stop when one of the computed eigenvalues is not | ||
328 | above/below the threshold given at EPSSetThreshold(). If a number of wanted | ||
329 | eigenvalues has been specified via EPSSetDimensions() then it is also taken into | ||
330 | account, and the solver will stop when one of the two conditions (threshold or | ||
331 | number of converged values) is met. | ||
332 | |||
333 | Use EPSSetStoppingTest() to provide your own test instead of using this one. | ||
334 | |||
335 | Level: advanced | ||
336 | |||
337 | .seealso: EPSSetStoppingTest(), EPSStoppingBasic(), EPSSetThreshold(), EPSSetDimensions(), EPSConvergedReason, EPSGetConvergedReason() | ||
338 | @*/ | ||
339 | 9005 | PetscErrorCode EPSStoppingThreshold(EPS eps,PetscInt its,PetscInt max_it,PetscInt nconv,PetscInt nev,EPSConvergedReason *reason,void *ctx) | |
340 | { | ||
341 | 9005 | PetscReal thres,firstev,lastev; | |
342 | 9005 | PetscBool magnit,rel; | |
343 | 9005 | EPSWhich which; | |
344 | |||
345 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
9005 | PetscFunctionBegin; |
346 | 9005 | *reason = EPS_CONVERGED_ITERATING; | |
347 | 9005 | firstev = ((EPSStoppingCtx)ctx)->firstev; | |
348 | 9005 | lastev = ((EPSStoppingCtx)ctx)->lastev; | |
349 | 9005 | thres = ((EPSStoppingCtx)ctx)->thres; | |
350 | 9005 | rel = ((EPSStoppingCtx)ctx)->threlative; | |
351 | 9005 | which = ((EPSStoppingCtx)ctx)->which; | |
352 | 9005 | magnit = (which==EPS_SMALLEST_MAGNITUDE || which==EPS_LARGEST_MAGNITUDE || which==EPS_TARGET_MAGNITUDE)? PETSC_TRUE: PETSC_FALSE; | |
353 |
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))) { |
354 |
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)); |
355 |
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)); |
356 |
4/6✓ Branch 0 taken 2 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)); |
357 | 30 | *reason = EPS_CONVERGED_TOL; | |
358 |
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))) { |
359 |
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)); |
360 |
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)); |
361 |
4/6✓ Branch 0 taken 2 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)); |
362 | 112 | *reason = EPS_CONVERGED_TOL; | |
363 |
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))) { |
364 | ✗ | if (which==EPS_LARGEST_REAL) PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: eigenvalue %g is below the threshold %g\n",(double)lastev,(double)thres)); | |
365 | ✗ | else PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: eigenvalue %g is above the threshold %g\n",(double)lastev,(double)thres)); | |
366 | ✗ | *reason = EPS_CONVERGED_TOL; | |
367 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 10 times.
|
8863 | } else if (nev && nconv >= nev) { |
368 |
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)); |
369 | 4 | *reason = EPS_CONVERGED_TOL; | |
370 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
8859 | } else if (its >= max_it) { |
371 | ✗ | *reason = EPS_DIVERGED_ITS; | |
372 | ✗ | PetscCall(PetscInfo(eps,"Linear eigensolver iteration reached maximum number of iterations (%" PetscInt_FMT ")\n",its)); | |
373 | } | ||
374 |
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); |
375 | } | ||
376 | |||
377 | /* | ||
378 | EPSComputeRitzVector - Computes the current Ritz vector. | ||
379 | |||
380 | Simple case (complex scalars or real scalars with Zi=NULL): | ||
381 | x = V*Zr (V is a basis of nv vectors, Zr has length nv) | ||
382 | |||
383 | Split case: | ||
384 | x = V*Zr y = V*Zi (Zr and Zi have length nv) | ||
385 | */ | ||
386 | 4191 | PetscErrorCode EPSComputeRitzVector(EPS eps,PetscScalar *Zr,PetscScalar *Zi,BV V,Vec x,Vec y) | |
387 | { | ||
388 | 4191 | PetscInt l,k; | |
389 | 4191 | PetscReal norm; | |
390 | #if !defined(PETSC_USE_COMPLEX) | ||
391 | 2060 | Vec z; | |
392 | #endif | ||
393 | |||
394 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
4191 | PetscFunctionBegin; |
395 | /* compute eigenvector */ | ||
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.
|
4191 | PetscCall(BVGetActiveColumns(V,&l,&k)); |
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.
|
4191 | PetscCall(BVSetActiveColumns(V,0,k)); |
398 |
4/6✓ Branch 0 taken 2 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)); |
399 | |||
400 | /* purify eigenvector if necessary */ | ||
401 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
4191 | if (eps->purify) { |
402 |
4/6✓ Branch 0 taken 2 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)); |
403 |
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)); |
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.
|
145 | else PetscCall(VecNorm(y,NORM_2,&norm)); |
405 |
4/6✓ Branch 0 taken 2 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)); |
406 |
4/6✓ Branch 0 taken 2 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)); |
407 | } | ||
408 | /* fix eigenvector if balancing is used */ | ||
409 |
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)); |
410 | #if !defined(PETSC_USE_COMPLEX) | ||
411 | /* compute imaginary part of eigenvector */ | ||
412 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
2060 | if (Zi) { |
413 |
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)); |
414 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
|
125 | if (eps->ispositive) { |
415 | ✗ | PetscCall(BVCreateVec(V,&z)); | |
416 | ✗ | PetscCall(STApply(eps->st,y,z)); | |
417 | ✗ | PetscCall(VecNorm(z,NORM_2,&norm)); | |
418 | ✗ | PetscCall(VecScale(z,1.0/norm)); | |
419 | ✗ | PetscCall(VecCopy(z,y)); | |
420 | ✗ | PetscCall(VecDestroy(&z)); | |
421 | } | ||
422 |
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)); |
423 | } else | ||
424 | #endif | ||
425 |
4/6✓ Branch 0 taken 2 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)); |
426 | |||
427 | /* normalize eigenvectors (when using balancing) */ | ||
428 |
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) { |
429 | #if !defined(PETSC_USE_COMPLEX) | ||
430 |
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)); |
431 | else | ||
432 | #endif | ||
433 |
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)); |
434 | } | ||
435 |
4/6✓ Branch 0 taken 2 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)); |
436 |
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); |
437 | } | ||
438 | |||
439 | /* | ||
440 | EPSBuildBalance_Krylov - uses a Krylov subspace method to compute the | ||
441 | diagonal matrix to be applied for balancing in non-Hermitian problems. | ||
442 | */ | ||
443 | 130 | PetscErrorCode EPSBuildBalance_Krylov(EPS eps) | |
444 | { | ||
445 | 130 | Vec z,p,r; | |
446 | 130 | PetscInt i,j; | |
447 | 130 | PetscReal norma; | |
448 | 130 | PetscScalar *pz,*pD; | |
449 | 130 | const PetscScalar *pr,*pp; | |
450 | 130 | PetscRandom rand; | |
451 | |||
452 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
130 | PetscFunctionBegin; |
453 |
4/6✓ Branch 0 taken 2 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)); |
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.
|
130 | PetscCall(BVGetRandomContext(eps->V,&rand)); |
455 | 130 | r = eps->work[0]; | |
456 | 130 | p = eps->work[1]; | |
457 | 130 | z = eps->work[2]; | |
458 |
4/6✓ Branch 0 taken 2 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)); |
459 | |||
460 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
780 | for (j=0;j<eps->balance_its;j++) { |
461 | |||
462 | /* Build a random vector of +-1's */ | ||
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(VecSetRandom(z,rand)); |
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(VecGetArray(z,&pz)); |
465 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
50950 | for (i=0;i<eps->nloc;i++) { |
466 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
50300 | if (PetscRealPart(pz[i])<0.5) pz[i]=-1.0; |
467 | 24425 | else pz[i]=1.0; | |
468 | } | ||
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.
|
650 | PetscCall(VecRestoreArray(z,&pz)); |
470 | |||
471 | /* Compute p=DA(D\z) */ | ||
472 |
4/6✓ Branch 0 taken 2 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)); |
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.
|
650 | PetscCall(STApply(eps->st,r,p)); |
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.
|
650 | PetscCall(VecPointwiseMult(p,p,eps->D)); |
475 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
650 | if (eps->balance == EPS_BALANCE_TWOSIDE) { |
476 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
400 | if (j==0) { |
477 | /* Estimate the matrix inf-norm */ | ||
478 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
80 | PetscCall(VecAbs(p)); |
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.
|
80 | PetscCall(VecMax(p,NULL,&norma)); |
480 | } | ||
481 | /* Compute r=D\(A'Dz) */ | ||
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.
|
400 | PetscCall(VecPointwiseMult(z,z,eps->D)); |
483 |
4/6✓ Branch 0 taken 2 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)); |
484 |
4/6✓ Branch 0 taken 2 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)); |
485 | } | ||
486 | |||
487 | /* Adjust values of D */ | ||
488 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
650 | PetscCall(VecGetArrayRead(r,&pr)); |
489 |
4/6✓ Branch 0 taken 2 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)); |
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(VecGetArray(eps->D,&pD)); |
491 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
50950 | for (i=0;i<eps->nloc;i++) { |
492 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
50300 | if (eps->balance == EPS_BALANCE_TWOSIDE) { |
493 |
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) |
494 | 28240 | pD[i] *= PetscSqrtReal(PetscAbsScalar(pr[i]/pp[i])); | |
495 | } else { | ||
496 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
21300 | if (pp[i]!=0.0) pD[i] /= PetscAbsScalar(pp[i]); |
497 | } | ||
498 | } | ||
499 |
4/6✓ Branch 0 taken 2 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)); |
500 |
4/6✓ Branch 0 taken 2 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)); |
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(VecRestoreArray(eps->D,&pD)); |
502 | } | ||
503 |
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); |
504 | } | ||
505 |