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 | Common subroutines for all Krylov-type solvers | ||
12 | */ | ||
13 | |||
14 | #include <slepc/private/epsimpl.h> | ||
15 | #include <slepc/private/slepcimpl.h> | ||
16 | #include <slepcblaslapack.h> | ||
17 | |||
18 | /* | ||
19 | EPSDelayedArnoldi - This function is equivalent to BVMatArnoldi but | ||
20 | performs the computation in a different way. The main idea is that | ||
21 | reorthogonalization is delayed to the next Arnoldi step. This version is | ||
22 | more scalable but in some cases convergence may stagnate. | ||
23 | */ | ||
24 | 430 | PetscErrorCode EPSDelayedArnoldi(EPS eps,PetscScalar *H,PetscInt ldh,PetscInt k,PetscInt *M,PetscReal *beta,PetscBool *breakdown) | |
25 | { | ||
26 | 430 | PetscInt i,j,m=*M; | |
27 | 430 | Vec u,t; | |
28 | 430 | PetscScalar shh[100],*lhh,dot,dot2; | |
29 | 430 | PetscReal norm1=0.0,norm2=1.0; | |
30 | 430 | Vec vj,vj1,vj2=NULL; | |
31 | |||
32 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
430 | PetscFunctionBegin; |
33 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
430 | if (m<=100) lhh = shh; |
34 | ✗ | else PetscCall(PetscMalloc1(m,&lhh)); | |
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.
|
430 | PetscCall(BVCreateVec(eps->V,&u)); |
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.
|
430 | PetscCall(BVCreateVec(eps->V,&t)); |
37 | |||
38 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
430 | PetscCall(BVSetActiveColumns(eps->V,0,m)); |
39 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
7885 | for (j=k;j<m;j++) { |
40 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7455 | PetscCall(BVGetColumn(eps->V,j,&vj)); |
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.
|
7455 | PetscCall(BVGetColumn(eps->V,j+1,&vj1)); |
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.
|
7455 | PetscCall(STApply(eps->st,vj,vj1)); |
43 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7455 | PetscCall(BVRestoreColumn(eps->V,j,&vj)); |
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.
|
7455 | PetscCall(BVRestoreColumn(eps->V,j+1,&vj1)); |
45 | |||
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.
|
7455 | PetscCall(BVDotColumnBegin(eps->V,j+1,H+ldh*j)); |
47 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
7455 | if (j>k) { |
48 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7025 | PetscCall(BVDotColumnBegin(eps->V,j,lhh)); |
49 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7025 | PetscCall(BVGetColumn(eps->V,j,&vj)); |
50 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7025 | PetscCall(VecDotBegin(vj,vj,&dot)); |
51 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
7025 | if (j>k+1) { |
52 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6595 | PetscCall(BVNormVecBegin(eps->V,u,NORM_2,&norm2)); |
53 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6595 | PetscCall(BVGetColumn(eps->V,j-2,&vj2)); |
54 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6595 | PetscCall(VecDotBegin(u,vj2,&dot2)); |
55 | } | ||
56 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7025 | PetscCall(BVDotColumnEnd(eps->V,j+1,H+ldh*j)); |
57 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7025 | PetscCall(BVDotColumnEnd(eps->V,j,lhh)); |
58 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7025 | PetscCall(VecDotEnd(vj,vj,&dot)); |
59 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7025 | PetscCall(BVRestoreColumn(eps->V,j,&vj)); |
60 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
7025 | if (j>k+1) { |
61 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6595 | PetscCall(BVNormVecEnd(eps->V,u,NORM_2,&norm2)); |
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.
|
6595 | PetscCall(VecDotEnd(u,vj2,&dot2)); |
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.
|
6595 | PetscCall(BVRestoreColumn(eps->V,j-2,&vj2)); |
64 | } | ||
65 | 7025 | norm1 = PetscSqrtReal(PetscRealPart(dot)); | |
66 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
76470 | for (i=0;i<j;i++) H[ldh*j+i] = H[ldh*j+i]/norm1; |
67 | 7025 | H[ldh*j+j] = H[ldh*j+j]/dot; | |
68 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7025 | PetscCall(BVCopyVec(eps->V,j,t)); |
69 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7025 | PetscCall(BVScaleColumn(eps->V,j,1.0/norm1)); |
70 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7025 | PetscCall(BVScaleColumn(eps->V,j+1,1.0/norm1)); |
71 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
430 | } else PetscCall(BVDotColumnEnd(eps->V,j+1,H+ldh*j)); /* j==k */ |
72 | |||
73 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7455 | PetscCall(BVMultColumn(eps->V,-1.0,1.0,j+1,H+ldh*j)); |
74 | |||
75 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
7455 | if (j>k) { |
76 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7025 | PetscCall(BVSetActiveColumns(eps->V,0,j)); |
77 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7025 | PetscCall(BVMultVec(eps->V,-1.0,1.0,t,lhh)); |
78 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7025 | PetscCall(BVSetActiveColumns(eps->V,0,m)); |
79 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
76470 | for (i=0;i<j;i++) H[ldh*(j-1)+i] += lhh[i]; |
80 | } | ||
81 | |||
82 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
7455 | if (j>k+1) { |
83 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6595 | PetscCall(BVGetColumn(eps->V,j-1,&vj1)); |
84 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6595 | PetscCall(VecCopy(u,vj1)); |
85 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6595 | PetscCall(BVRestoreColumn(eps->V,j-1,&vj1)); |
86 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6595 | PetscCall(BVScaleColumn(eps->V,j-1,1.0/norm2)); |
87 | 6595 | H[ldh*(j-2)+j-1] = norm2; | |
88 | } | ||
89 | |||
90 |
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.
|
7455 | if (j<m-1) PetscCall(VecCopy(t,u)); |
91 | } | ||
92 | |||
93 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
430 | PetscCall(BVNormVec(eps->V,t,NORM_2,&norm2)); |
94 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
430 | PetscCall(VecScale(t,1.0/norm2)); |
95 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
430 | PetscCall(BVGetColumn(eps->V,m-1,&vj1)); |
96 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
430 | PetscCall(VecCopy(t,vj1)); |
97 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
430 | PetscCall(BVRestoreColumn(eps->V,m-1,&vj1)); |
98 | 430 | H[ldh*(m-2)+m-1] = norm2; | |
99 | |||
100 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
430 | PetscCall(BVDotColumn(eps->V,m,lhh)); |
101 | |||
102 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
430 | PetscCall(BVMultColumn(eps->V,-1.0,1.0,m,lhh)); |
103 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
8420 | for (i=0;i<m;i++) |
104 | 7990 | H[ldh*(m-1)+i] += lhh[i]; | |
105 | |||
106 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
430 | PetscCall(BVNormColumn(eps->V,m,NORM_2,beta)); |
107 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
430 | PetscCall(BVScaleColumn(eps->V,m,1.0 / *beta)); |
108 | 430 | *breakdown = PETSC_FALSE; | |
109 | |||
110 |
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.
|
430 | if (m>100) PetscCall(PetscFree(lhh)); |
111 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
430 | PetscCall(VecDestroy(&u)); |
112 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
430 | PetscCall(VecDestroy(&t)); |
113 |
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.
|
86 | PetscFunctionReturn(PETSC_SUCCESS); |
114 | } | ||
115 | |||
116 | /* | ||
117 | EPSDelayedArnoldi1 - This function is similar to EPSDelayedArnoldi, | ||
118 | but without reorthogonalization (only delayed normalization). | ||
119 | */ | ||
120 | 180 | PetscErrorCode EPSDelayedArnoldi1(EPS eps,PetscScalar *H,PetscInt ldh,PetscInt k,PetscInt *M,PetscReal *beta,PetscBool *breakdown) | |
121 | { | ||
122 | 180 | PetscInt i,j,m=*M; | |
123 | 180 | PetscScalar dot; | |
124 | 180 | PetscReal norm=0.0; | |
125 | 180 | Vec vj,vj1; | |
126 | |||
127 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
180 | PetscFunctionBegin; |
128 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(BVSetActiveColumns(eps->V,0,m)); |
129 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
3260 | for (j=k;j<m;j++) { |
130 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3080 | PetscCall(BVGetColumn(eps->V,j,&vj)); |
131 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3080 | PetscCall(BVGetColumn(eps->V,j+1,&vj1)); |
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.
|
3080 | PetscCall(STApply(eps->st,vj,vj1)); |
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.
|
3080 | PetscCall(BVRestoreColumn(eps->V,j+1,&vj1)); |
134 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
3080 | if (j>k) { |
135 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2900 | PetscCall(BVDotColumnBegin(eps->V,j+1,H+ldh*j)); |
136 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2900 | PetscCall(VecDotBegin(vj,vj,&dot)); |
137 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2900 | PetscCall(BVDotColumnEnd(eps->V,j+1,H+ldh*j)); |
138 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2900 | PetscCall(VecDotEnd(vj,vj,&dot)); |
139 | 2900 | norm = PetscSqrtReal(PetscRealPart(dot)); | |
140 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2900 | PetscCall(BVScaleColumn(eps->V,j,1.0/norm)); |
141 | 2900 | H[ldh*(j-1)+j] = norm; | |
142 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
30220 | for (i=0;i<j;i++) H[ldh*j+i] = H[ldh*j+i]/norm; |
143 | 2900 | H[ldh*j+j] = H[ldh*j+j]/dot; | |
144 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2900 | PetscCall(BVScaleColumn(eps->V,j+1,1.0/norm)); |
145 | 2900 | *beta = norm; | |
146 | } else { /* j==k */ | ||
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.
|
180 | PetscCall(BVDotColumn(eps->V,j+1,H+ldh*j)); |
148 | } | ||
149 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3080 | PetscCall(BVRestoreColumn(eps->V,j,&vj)); |
150 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3080 | PetscCall(BVMultColumn(eps->V,-1.0,1.0,j+1,H+ldh*j)); |
151 | } | ||
152 | |||
153 | 180 | *breakdown = PETSC_FALSE; | |
154 |
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.
|
180 | PetscFunctionReturn(PETSC_SUCCESS); |
155 | } | ||
156 | |||
157 | /* | ||
158 | EPSKrylovConvergence_Filter - Specialized version for STFILTER. | ||
159 | */ | ||
160 | 332 | static PetscErrorCode EPSKrylovConvergence_Filter(EPS eps,PetscBool getall,PetscInt kini,PetscInt nits,PetscReal beta,PetscReal gamma,PetscInt *kout) | |
161 | { | ||
162 | 332 | PetscInt k,ninside,nconv; | |
163 | 332 | PetscScalar re,im; | |
164 | 332 | PetscReal resnorm; | |
165 | |||
166 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
332 | PetscFunctionBegin; |
167 | 332 | ninside = 0; /* count how many eigenvalues are located in the interval */ | |
168 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
2812 | for (k=kini;k<kini+nits;k++) { |
169 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2812 | if (PetscRealPart(eps->eigr[k]) < gamma) break; |
170 | 2480 | ninside++; | |
171 | } | ||
172 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
332 | if (eps->trackall) getall = PETSC_TRUE; |
173 | 332 | eps->nev = ninside+kini; /* adjust eigenvalue count */ | |
174 | 332 | nconv = 0; /* count how many eigenvalues satisfy the convergence criterion */ | |
175 |
3/4✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
3484 | for (k=kini;k<kini+(getall?nits:ninside);k++) { |
176 | /* eigenvalue */ | ||
177 | 1564 | re = eps->eigr[k]; | |
178 | 1564 | im = eps->eigi[k]; | |
179 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1564 | PetscCall(DSVectors(eps->ds,DS_MAT_X,&k,&resnorm)); |
180 | 1564 | resnorm *= beta; | |
181 | /* error estimate */ | ||
182 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1564 | PetscCall((*eps->converged)(eps,re,im,resnorm,&eps->errest[k],eps->convergedctx)); |
183 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1564 | if (eps->errest[k] < eps->tol) nconv++; |
184 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
154 | else if (!getall) break; |
185 | } | ||
186 | 332 | *kout = kini+nconv; | |
187 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
332 | PetscCall(PetscInfo(eps,"Found %" PetscInt_FMT " eigenvalue approximations inside the interval (gamma=%g), k=%" PetscInt_FMT " nconv=%" PetscInt_FMT "\n",ninside,(double)gamma,k,nconv)); |
188 |
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.
|
56 | PetscFunctionReturn(PETSC_SUCCESS); |
189 | } | ||
190 | |||
191 | /* | ||
192 | EPSKrylovConvergence - Implements the loop that checks for convergence | ||
193 | in Krylov methods. | ||
194 | |||
195 | Input Parameters: | ||
196 | eps - the eigensolver; some error estimates are updated in eps->errest | ||
197 | getall - whether all residuals must be computed | ||
198 | kini - initial value of k (the loop variable) | ||
199 | nits - number of iterations of the loop | ||
200 | V - set of basis vectors (used only if trueresidual is activated) | ||
201 | nv - number of vectors to process (dimension of Q, columns of V) | ||
202 | beta - norm of f (the residual vector of the Arnoldi/Lanczos factorization) | ||
203 | corrf - correction factor for residual estimates (only in harmonic KS) | ||
204 | |||
205 | Output Parameters: | ||
206 | kout - the first index where the convergence test failed | ||
207 | */ | ||
208 | 54325 | PetscErrorCode EPSKrylovConvergence(EPS eps,PetscBool getall,PetscInt kini,PetscInt nits,PetscReal beta,PetscReal betat,PetscReal corrf,PetscInt *kout) | |
209 | { | ||
210 | 54325 | PetscInt k,newk,newk2,marker,ld,inside; | |
211 | 54325 | PetscScalar re,im,*Zr,*Zi,*X; | |
212 | 54325 | PetscReal resnorm,gamma,lerrest; | |
213 | 54325 | PetscBool isshift,isfilter,refined,istrivial; | |
214 | 54325 | Vec x=NULL,y=NULL,w[3]; | |
215 | |||
216 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
54325 | PetscFunctionBegin; |
217 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
54325 | if (PetscUnlikely(eps->which == EPS_ALL)) { |
218 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1119 | PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STFILTER,&isfilter)); |
219 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1119 | if (isfilter) { |
220 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
332 | PetscCall(STFilterGetThreshold(eps->st,&gamma)); |
221 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
332 | PetscCall(EPSKrylovConvergence_Filter(eps,getall,kini,nits,beta,gamma,kout)); |
222 |
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.
|
56 | PetscFunctionReturn(PETSC_SUCCESS); |
223 | } | ||
224 | } | ||
225 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
53993 | PetscCall(RGIsTrivial(eps->rg,&istrivial)); |
226 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
53993 | if (PetscUnlikely(eps->trueres)) { |
227 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
420 | PetscCall(BVCreateVec(eps->V,&x)); |
228 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
420 | PetscCall(BVCreateVec(eps->V,&y)); |
229 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
420 | PetscCall(BVCreateVec(eps->V,&w[0])); |
230 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
420 | PetscCall(BVCreateVec(eps->V,&w[2])); |
231 | #if !defined(PETSC_USE_COMPLEX) | ||
232 |
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.
|
240 | PetscCall(BVCreateVec(eps->V,&w[1])); |
233 | #else | ||
234 | 180 | w[1] = NULL; | |
235 | #endif | ||
236 | } | ||
237 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
53993 | PetscCall(DSGetLeadingDimension(eps->ds,&ld)); |
238 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
53993 | PetscCall(DSGetRefined(eps->ds,&refined)); |
239 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
53993 | PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STSHIFT,&isshift)); |
240 | 53993 | marker = -1; | |
241 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
53993 | if (eps->trackall) getall = PETSC_TRUE; |
242 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
145812 | for (k=kini;k<kini+nits;k++) { |
243 | /* eigenvalue */ | ||
244 | 144242 | re = eps->eigr[k]; | |
245 | 144242 | im = eps->eigi[k]; | |
246 |
12/14✓ 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 2 times.
✓ Branch 9 taken 8 times.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
|
144242 | if (!istrivial || eps->trueres || isshift || eps->conv==EPS_CONV_NORM) PetscCall(STBackTransform(eps->st,1,&re,&im)); |
247 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
144242 | if (PetscUnlikely(!istrivial)) { |
248 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1150 | PetscCall(RGCheckInside(eps->rg,1,&re,&im,&inside)); |
249 |
3/4✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
1150 | if (marker==-1 && inside<0) marker = k; |
250 |
4/6✓ 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 not taken.
|
1150 | if (!(eps->trueres || isshift || eps->conv==EPS_CONV_NORM)) { /* make sure eps->converged below uses the right value */ |
251 | 425 | re = eps->eigr[k]; | |
252 | 425 | im = eps->eigi[k]; | |
253 | } | ||
254 | } | ||
255 | 144242 | newk = k; | |
256 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
144242 | PetscCall(DSVectors(eps->ds,DS_MAT_X,&newk,&resnorm)); |
257 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
144242 | if (PetscUnlikely(eps->trueres)) { |
258 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
655 | PetscCall(DSGetArray(eps->ds,DS_MAT_X,&X)); |
259 | 655 | Zr = X+k*ld; | |
260 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
|
655 | if (newk==k+1) Zi = X+newk*ld; |
261 | else Zi = NULL; | ||
262 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
655 | PetscCall(EPSComputeRitzVector(eps,Zr,Zi,eps->V,x,y)); |
263 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
655 | PetscCall(DSRestoreArray(eps->ds,DS_MAT_X,&X)); |
264 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
655 | PetscCall(EPSComputeResidualNorm_Private(eps,PETSC_FALSE,re,im,x,y,w,&resnorm)); |
265 | } | ||
266 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
143587 | else if (!refined) resnorm *= beta*corrf; |
267 | /* error estimate */ | ||
268 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
144242 | PetscCall((*eps->converged)(eps,re,im,resnorm,&eps->errest[k],eps->convergedctx)); |
269 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
144242 | if (marker==-1 && eps->errest[k] >= eps->tol) marker = k; |
270 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
144242 | if (PetscUnlikely(eps->twosided)) { |
271 | 1942 | newk2 = k; | |
272 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1942 | PetscCall(DSVectors(eps->ds,DS_MAT_Y,&newk2,&resnorm)); |
273 | 1942 | resnorm *= betat; | |
274 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1942 | PetscCall((*eps->converged)(eps,re,im,resnorm,&lerrest,eps->convergedctx)); |
275 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1942 | eps->errest[k] = PetscMax(eps->errest[k],lerrest); |
276 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
1942 | if (marker==-1 && lerrest >= eps->tol) marker = k; |
277 | } | ||
278 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
144242 | if (PetscUnlikely(newk==k+1)) { |
279 | 2991 | eps->errest[k+1] = eps->errest[k]; | |
280 | 2991 | k++; | |
281 | } | ||
282 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
144242 | if (marker!=-1 && !getall) break; |
283 | } | ||
284 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
53993 | if (marker!=-1) k = marker; |
285 | 53993 | *kout = k; | |
286 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
53993 | if (PetscUnlikely(eps->trueres)) { |
287 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
420 | PetscCall(VecDestroy(&x)); |
288 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
420 | PetscCall(VecDestroy(&y)); |
289 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
420 | PetscCall(VecDestroy(&w[0])); |
290 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
420 | PetscCall(VecDestroy(&w[2])); |
291 | #if !defined(PETSC_USE_COMPLEX) | ||
292 |
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.
|
240 | PetscCall(VecDestroy(&w[1])); |
293 | #endif | ||
294 | } | ||
295 |
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.
|
10425 | PetscFunctionReturn(PETSC_SUCCESS); |
296 | } | ||
297 | |||
298 | 6999 | PetscErrorCode EPSPseudoLanczos(EPS eps,PetscReal *alpha,PetscReal *beta,PetscReal *omega,PetscInt k,PetscInt *M,PetscBool *breakdown,PetscBool *symmlost,PetscReal *cos,Vec w) | |
299 | { | ||
300 | 6999 | PetscInt j,m = *M,i,ld,l; | |
301 | 6999 | Vec vj,vj1; | |
302 | 6999 | PetscScalar *hwork,lhwork[100]; | |
303 | 6999 | PetscReal norm,norm1,norm2,t,sym=0.0,fro=0.0; | |
304 | 6999 | PetscBLASInt j_,one=1; | |
305 | |||
306 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
6999 | PetscFunctionBegin; |
307 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6999 | PetscCall(DSGetLeadingDimension(eps->ds,&ld)); |
308 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6999 | PetscCall(DSGetDimensions(eps->ds,NULL,&l,NULL,NULL)); |
309 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
6999 | if (cos) *cos = 1.0; |
310 |
6/8✓ Branch 0 taken 6 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
6999 | if (m > 100) PetscCall(PetscMalloc1(m,&hwork)); |
311 | 6956 | else hwork = lhwork; | |
312 | |||
313 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6999 | PetscCall(BVSetActiveColumns(eps->V,0,m)); |
314 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
86834 | for (j=k;j<m;j++) { |
315 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
79835 | PetscCall(BVGetColumn(eps->V,j,&vj)); |
316 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
79835 | PetscCall(BVGetColumn(eps->V,j+1,&vj1)); |
317 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
79835 | PetscCall(STApply(eps->st,vj,vj1)); |
318 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
79835 | PetscCall(BVRestoreColumn(eps->V,j,&vj)); |
319 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
79835 | PetscCall(BVRestoreColumn(eps->V,j+1,&vj1)); |
320 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
79835 | PetscCall(BVOrthogonalizeColumn(eps->V,j+1,hwork,&norm,breakdown)); |
321 | 79835 | alpha[j] = PetscRealPart(hwork[j]); | |
322 | 79835 | beta[j] = PetscAbsReal(norm); | |
323 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
79835 | if (j==k) { |
324 | 6999 | PetscReal *f; | |
325 | |||
326 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6999 | PetscCall(DSGetArrayReal(eps->ds,DS_MAT_T,&f)); |
327 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
10901 | for (i=0;i<l;i++) hwork[i] = 0.0; |
328 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
174191 | for (;i<j-1;i++) hwork[i] -= f[2*ld+i]; |
329 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6999 | PetscCall(DSRestoreArrayReal(eps->ds,DS_MAT_T,&f)); |
330 | } | ||
331 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
79835 | if (j>0) { |
332 | 79714 | hwork[j-1] -= beta[j-1]; | |
333 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
79714 | PetscCall(PetscBLASIntCast(j,&j_)); |
334 | 79714 | sym = SlepcAbs(BLASnrm2_(&j_,hwork,&one),sym); | |
335 | } | ||
336 | 79835 | fro = SlepcAbs(fro,SlepcAbs(alpha[j],beta[j])); | |
337 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
79835 | if (j>0) fro = SlepcAbs(fro,beta[j-1]); |
338 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
|
80729 | if (sym/fro>PetscMax(PETSC_SQRT_MACHINE_EPSILON,10*eps->tol)) { *symmlost = PETSC_TRUE; *M=j; break; } |
339 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
79835 | omega[j+1] = (norm<0.0)? -1.0: 1.0; |
340 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
79835 | PetscCall(BVScaleColumn(eps->V,j+1,1.0/norm)); |
341 | /* */ | ||
342 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
79835 | if (cos) { |
343 | ✗ | PetscCall(BVGetColumn(eps->V,j+1,&vj1)); | |
344 | ✗ | PetscCall(VecNorm(vj1,NORM_2,&norm1)); | |
345 | ✗ | PetscCall(BVApplyMatrix(eps->V,vj1,w)); | |
346 | ✗ | PetscCall(BVRestoreColumn(eps->V,j+1,&vj1)); | |
347 | ✗ | PetscCall(VecNorm(w,NORM_2,&norm2)); | |
348 | ✗ | t = 1.0/(norm1*norm2); | |
349 | ✗ | if (*cos>t) *cos = t; | |
350 | } | ||
351 | } | ||
352 |
7/10✓ Branch 0 taken 6 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 4 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
|
6999 | if (m > 100) PetscCall(PetscFree(hwork)); |
353 |
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.
|
1388 | PetscFunctionReturn(PETSC_SUCCESS); |
354 | } | ||
355 |