Line | Branch | Exec | Source |
---|---|---|---|
1 | /* | ||
2 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
3 | SLEPc - Scalable Library for Eigenvalue Problem Computations | ||
4 | Copyright (c) 2002-, Universitat Politecnica de Valencia, Spain | ||
5 | |||
6 | This file is part of SLEPc. | ||
7 | SLEPc is distributed under a 2-clause BSD license (see LICENSE). | ||
8 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
9 | */ | ||
10 | /* | ||
11 | SLEPc eigensolver: "krylovschur" | ||
12 | |||
13 | Method: Hamiltonian Krylov-Schur | ||
14 | |||
15 | References: | ||
16 | |||
17 | [1] P. Benner et al., "A Hamiltonian Krylov-Schur-type method based on the | ||
18 | symplectic Lanczos process", Linear Algebra Appl. 435(3), 2011. | ||
19 | |||
20 | [2] D. Watkins, "The Matrix Eigenvalue Problem", SIAM, 2007. | ||
21 | |||
22 | */ | ||
23 | #include <slepc/private/epsimpl.h> | ||
24 | #include "krylovschur.h" | ||
25 | #include <slepcblaslapack.h> | ||
26 | |||
27 | /* J-orthogonalize vector [x1;x2] against first j vectors in U and V (full orthogonalization) | ||
28 | Coeffs c are updated, coeffs d are computed from scratch. | ||
29 | */ | ||
30 | 2650 | static PetscErrorCode Orthog_Hamilt(Vec x1,Vec x2,BV U1,BV U2,BV V1,BV V2,PetscInt j,PetscScalar *c,PetscScalar *d,PetscScalar *w,PetscBool *breakdown) | |
31 | { | ||
32 | 2650 | PetscInt i; | |
33 | 2650 | Vec Jx1,Jx2; | |
34 | |||
35 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
2650 | PetscFunctionBegin; |
36 |
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.
|
2650 | PetscCall(BVSetActiveColumns(U1,0,j)); |
37 |
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.
|
2650 | PetscCall(BVSetActiveColumns(U2,0,j)); |
38 |
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.
|
2650 | PetscCall(BVSetActiveColumns(V1,0,j)); |
39 |
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.
|
2650 | PetscCall(BVSetActiveColumns(V2,0,j)); |
40 |
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.
|
2650 | PetscCall(VecDuplicate(x1,&Jx1)); |
41 |
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.
|
2650 | PetscCall(VecDuplicate(x2,&Jx2)); |
42 |
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.
|
2650 | PetscCall(VecCopy(x2,Jx1)); |
43 |
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.
|
2650 | PetscCall(VecCopy(x1,Jx2)); |
44 |
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.
|
2650 | PetscCall(VecScale(Jx2,-1.0)); |
45 |
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.
|
2650 | PetscCall(VecConjugate(Jx1)); |
46 |
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.
|
2650 | PetscCall(VecConjugate(Jx2)); |
47 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
31435 | for (i=0;i<j;i++) w[j+i] = c[i]; /* Copy initial values of c */ |
48 | /* c = -V.'*J*x computed as -conj(c) = V'*conj(J*x) */ | ||
49 |
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.
|
2650 | PetscCall(BVDotVecBegin(V1,Jx1,c)); |
50 |
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.
|
2650 | PetscCall(BVDotVecBegin(V2,Jx2,w)); |
51 |
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.
|
2650 | PetscCall(BVDotVecEnd(V1,Jx1,c)); |
52 |
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.
|
2650 | PetscCall(BVDotVecEnd(V2,Jx2,w)); |
53 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
31435 | for (i=0;i<j;i++) c[i] = -PetscConj(c[i]+w[i]); |
54 | /* e = U.'*J*x computed as conj(c) = U'*conj(J*x) */ | ||
55 |
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.
|
2650 | PetscCall(BVDotVecBegin(U1,Jx1,d)); |
56 |
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.
|
2650 | PetscCall(BVDotVecBegin(U2,Jx2,w)); |
57 |
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.
|
2650 | PetscCall(BVDotVecEnd(U1,Jx1,d)); |
58 |
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.
|
2650 | PetscCall(BVDotVecEnd(U2,Jx2,w)); |
59 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
31435 | for (i=0;i<j;i++) d[i] = PetscConj(d[i]+w[i]); |
60 | /* x = x-U*c-V*d */ | ||
61 |
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.
|
2650 | PetscCall(BVMultVec(U1,-1.0,1.0,x1,c)); |
62 |
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.
|
2650 | PetscCall(BVMultVec(U2,-1.0,1.0,x2,c)); |
63 |
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.
|
2650 | PetscCall(BVMultVec(V1,-1.0,1.0,x1,d)); |
64 |
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.
|
2650 | PetscCall(BVMultVec(V2,-1.0,1.0,x2,d)); |
65 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
31435 | for (i=0;i<j;i++) c[i] += w[j+i]; /* Add initial values of c */ |
66 |
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.
|
2650 | PetscCall(VecDestroy(&Jx1)); |
67 |
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.
|
2650 | PetscCall(VecDestroy(&Jx2)); |
68 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
530 | PetscFunctionReturn(PETSC_SUCCESS); |
69 | } | ||
70 | |||
71 | /* J-orthogonalize vector [x1;x2] against first j vectors in U and V (local+full orthogonalization)*/ | ||
72 | 2650 | static PetscErrorCode OrthogonalizeVector_Hamilt(Vec x1,Vec x2,BV U1,BV U2,BV V1,BV V2,PetscInt j,PetscReal *alpha,PetscReal *beta,PetscInt k,PetscScalar *h,PetscBool *breakdown) | |
73 | { | ||
74 | 2650 | PetscScalar p,p1,p2; | |
75 | 2650 | Vec v1,v2; | |
76 | 2650 | PetscInt i,l; | |
77 | |||
78 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
2650 | PetscFunctionBegin; |
79 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
2650 | PetscCall(PetscArrayzero(h,4*j)); |
80 | |||
81 | /* Local orthogonalization */ | ||
82 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
2650 | l = j==k+1?0:j-2; /* 1st column to orthogonalize against */ |
83 | /* compute p=-V(:,j).'*J*x */ | ||
84 |
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.
|
2650 | PetscCall(BVGetColumn(V1,j-1,&v1)); |
85 |
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.
|
2650 | PetscCall(BVGetColumn(V2,j-1,&v2)); |
86 |
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.
|
2650 | PetscCall(VecTDotBegin(x1,v2,&p1)); |
87 |
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.
|
2650 | PetscCall(VecTDotBegin(x2,v1,&p2)); |
88 |
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.
|
2650 | PetscCall(VecTDotEnd(x1,v2,&p1)); |
89 |
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.
|
2650 | PetscCall(VecTDotEnd(x2,v1,&p2)); |
90 |
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.
|
2650 | PetscCall(BVRestoreColumn(V1,j-1,&v1)); |
91 |
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.
|
2650 | PetscCall(BVRestoreColumn(V2,j-1,&v2)); |
92 | 2650 | p = p1-p2; | |
93 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
7725 | for (i=l; i<j-1; i++) h[i] = beta[i]; |
94 | 2650 | h[j-1] = p; | |
95 | /* x = x - U(:,l:j)*h(l:j) */ | ||
96 |
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.
|
2650 | PetscCall(BVSetActiveColumns(U1,l,j)); |
97 |
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.
|
2650 | PetscCall(BVSetActiveColumns(U2,l,j)); |
98 |
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.
|
2650 | PetscCall(BVMultVec(U1,-1.0,1.0,x1,h+l)); |
99 |
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.
|
2650 | PetscCall(BVMultVec(U2,-1.0,1.0,x2,h+l)); |
100 | |||
101 | /* J-orthogonalize x (full orthogonalization) */ | ||
102 |
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.
|
2650 | PetscCall(Orthog_Hamilt(x1,x2,U1,U2,V1,V2,j,h,h+j,h+2*j,breakdown)); |
103 | 2650 | alpha[j-1] = PetscRealPart(h[j-1]); | |
104 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
2650 | PetscFunctionReturn(PETSC_SUCCESS); |
105 | } | ||
106 | |||
107 | /* Normalize u,v so that u.'*J*v=1 */ | ||
108 | 2685 | static PetscErrorCode NormalizeVector_Hamilt(Vec u1,Vec u2,Vec v1,Vec v2,PetscReal *rr,PetscReal *ss,PetscBool *breakdown) | |
109 | { | ||
110 | 2685 | PetscScalar p,p1,p2; | |
111 | 2685 | PetscReal r,s; | |
112 | |||
113 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
2685 | PetscFunctionBegin; |
114 |
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.
|
2685 | PetscCall(VecTDotBegin(v1,u2,&p1)); |
115 |
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.
|
2685 | PetscCall(VecTDotBegin(v2,u1,&p2)); |
116 |
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.
|
2685 | PetscCall(VecTDotEnd(v1,u2,&p1)); |
117 |
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.
|
2685 | PetscCall(VecTDotEnd(v2,u1,&p2)); |
118 | 2685 | p = p2-p1; | |
119 |
1/2✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
|
2685 | if (breakdown) { |
120 | 2685 | *breakdown = p==0.0? PETSC_TRUE: PETSC_FALSE; | |
121 |
2/14✓ Branch 0 taken 4 times.
✓ 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.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
2685 | if (*breakdown) PetscFunctionReturn(PETSC_SUCCESS); |
122 | } | ||
123 | 2685 | r = PetscSqrtReal(PetscAbsScalar(p)); | |
124 |
3/4✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
|
2685 | s = PetscSign(PetscRealPart(p)); |
125 |
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.
|
2685 | PetscCall(VecScale(u1,1.0/r)); |
126 |
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.
|
2685 | PetscCall(VecScale(u2,1.0/r)); |
127 |
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.
|
2685 | PetscCall(VecScale(v1,s/r)); |
128 |
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.
|
2685 | PetscCall(VecScale(v2,s/r)); |
129 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
2685 | if (rr) *rr = r; |
130 |
1/2✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
|
2685 | if (ss) *ss = s; |
131 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
537 | PetscFunctionReturn(PETSC_SUCCESS); |
132 | } | ||
133 | |||
134 | 385 | static PetscErrorCode EPSHamiltonianKS(EPS eps,BV U,BV V,PetscReal *alpha,PetscReal *beta,PetscReal *omega,PetscInt k,PetscInt *M,PetscBool *symmlost,PetscBool *breakdown) | |
135 | { | ||
136 | 385 | PetscInt i,j,m = *M,ld,l,work_len=4*m; | |
137 | 385 | Vec u,v,u1,u2,v1,v2; | |
138 | 385 | Mat H; | |
139 | 385 | IS is[2]; | |
140 | 385 | BV U1,U2,V1,V2; | |
141 | 385 | PetscScalar *hwork,lhwork[100]; | |
142 | 385 | PetscReal sym=0.0,fro=0.0; | |
143 | 385 | PetscBLASInt j2_,one=1; | |
144 | |||
145 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
385 | PetscFunctionBegin; |
146 |
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.
|
385 | PetscCall(DSGetLeadingDimension(eps->ds,&ld)); |
147 |
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.
|
385 | PetscCall(DSGetDimensions(eps->ds,NULL,&l,NULL,NULL)); |
148 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 5 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.
|
385 | if (work_len > 100) PetscCall(PetscMalloc1(work_len,&hwork)); |
149 | 385 | else hwork = lhwork; | |
150 |
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.
|
385 | PetscCall(STGetMatrix(eps->st,0,&H)); |
151 |
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.
|
385 | PetscCall(MatNestGetISs(H,is,NULL)); |
152 |
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.
|
385 | PetscCall(BVGetSplitRows(U,is[0],is[1],&U1,&U2)); |
153 |
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.
|
385 | PetscCall(BVGetSplitRows(V,is[0],is[1],&V1,&V2)); |
154 | |||
155 | /* normalize initial vector */ | ||
156 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
385 | if (k==0) { |
157 |
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.
|
35 | if (eps->nini==0) PetscCall(BVSetRandomColumn(eps->V,0)); |
158 |
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.
|
35 | PetscCall(BVGetColumn(U,0,&u)); |
159 |
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.
|
35 | PetscCall(BVGetColumn(V,0,&v)); |
160 |
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.
|
35 | PetscCall(STApply(eps->st,u,v)); |
161 |
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.
|
35 | PetscCall(BVRestoreColumn(U,0,&u)); |
162 |
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.
|
35 | PetscCall(BVRestoreColumn(V,0,&v)); |
163 |
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.
|
35 | PetscCall(BVGetColumn(U1,0,&u1)); |
164 |
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.
|
35 | PetscCall(BVGetColumn(U2,0,&u2)); |
165 |
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.
|
35 | PetscCall(BVGetColumn(V1,0,&v1)); |
166 |
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.
|
35 | PetscCall(BVGetColumn(V2,0,&v2)); |
167 |
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.
|
35 | PetscCall(NormalizeVector_Hamilt(u1,u2,v1,v2,NULL,&omega[0],breakdown)); |
168 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
35 | PetscCheck(!*breakdown,PetscObjectComm((PetscObject)eps),PETSC_ERR_PLIB,"Breakdown in Hamiltonian Krylov-Schur"); |
169 |
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.
|
35 | PetscCall(BVRestoreColumn(U1,0,&u1)); |
170 |
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.
|
35 | PetscCall(BVRestoreColumn(U2,0,&u2)); |
171 |
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.
|
35 | PetscCall(BVRestoreColumn(V1,0,&v1)); |
172 |
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.
|
35 | PetscCall(BVRestoreColumn(V2,0,&v2)); |
173 | } | ||
174 | |||
175 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
3035 | for (j=k;j<m;j++) { |
176 |
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.
|
2650 | PetscCall(BVGetColumn(U,j+1,&u)); |
177 |
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.
|
2650 | PetscCall(BVGetColumn(V,j,&v)); |
178 |
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.
|
2650 | PetscCall(STApply(eps->st,v,u)); |
179 |
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.
|
2650 | PetscCall(BVRestoreColumn(V,j,&v)); |
180 |
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.
|
2650 | PetscCall(BVGetColumn(U1,j+1,&u1)); |
181 |
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.
|
2650 | PetscCall(BVGetColumn(U2,j+1,&u2)); |
182 |
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.
|
2650 | PetscCall(OrthogonalizeVector_Hamilt(u1,u2,U1,U2,V1,V2,j+1,alpha,beta,k,hwork,breakdown)); |
183 |
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.
|
2650 | PetscCall(BVGetColumn(V,j+1,&v)); |
184 |
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.
|
2650 | PetscCall(STApply(eps->st,u,v)); |
185 |
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.
|
2650 | PetscCall(BVRestoreColumn(U,j+1,&u)); |
186 |
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.
|
2650 | PetscCall(BVRestoreColumn(V,j+1,&v)); |
187 |
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.
|
2650 | PetscCall(BVGetColumn(V1,j+1,&v1)); |
188 |
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.
|
2650 | PetscCall(BVGetColumn(V2,j+1,&v2)); |
189 |
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.
|
2650 | PetscCall(NormalizeVector_Hamilt(u1,u2,v1,v2,&beta[j],&omega[j+1],breakdown)); |
190 | |||
191 | /* Update norm of asymmetry (sym) */ | ||
192 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
2650 | if (j==k) { |
193 | 385 | PetscReal *f; | |
194 | |||
195 |
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.
|
385 | PetscCall(DSGetArrayReal(eps->ds,DS_MAT_T,&f)); |
196 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
730 | for (i=0;i<l;i++) hwork[i] = 0.0; |
197 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
2500 | for (;i<j-1;i++) hwork[i] -= f[2*ld+i]; |
198 |
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.
|
385 | PetscCall(DSRestoreArrayReal(eps->ds,DS_MAT_T,&f)); |
199 | } | ||
200 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
2650 | if (j>0) { |
201 | 2615 | hwork[j-1] -= beta[j-1]; | |
202 | 2615 | hwork[j] = 0; | |
203 |
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.
|
2615 | PetscCall(PetscBLASIntCast(2*(j+1),&j2_)); |
204 | 2615 | sym = SlepcAbs(BLASnrm2_(&j2_,hwork,&one),sym); | |
205 | } | ||
206 | /* Update norm of tridiagonal elements (fro) */ | ||
207 | 2650 | fro = SlepcAbs(fro,SlepcAbs(alpha[j],beta[j])); | |
208 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
2650 | if (j>0) fro = SlepcAbs(fro,beta[j-1]); |
209 | |||
210 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
2650 | PetscCheck(!*breakdown,PetscObjectComm((PetscObject)eps),PETSC_ERR_PLIB,"Breakdown in Hamiltonian Krylov-Schur"); |
211 |
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.
|
2650 | PetscCall(BVRestoreColumn(U1,j+1,&u1)); |
212 |
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.
|
2650 | PetscCall(BVRestoreColumn(U2,j+1,&u2)); |
213 |
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.
|
2650 | PetscCall(BVRestoreColumn(V1,j+1,&v1)); |
214 |
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.
|
2650 | PetscCall(BVRestoreColumn(V2,j+1,&v2)); |
215 | |||
216 | /* Check if relative asymmetry is too large */ | ||
217 |
2/4✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
|
5300 | if (sym/fro>PetscMax(PETSC_SQRT_MACHINE_EPSILON,100*eps->tol)) { |
218 | ✗ | *symmlost = PETSC_TRUE; | |
219 | ✗ | *M=j; | |
220 | ✗ | break; | |
221 | } | ||
222 | } | ||
223 |
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.
|
385 | PetscCall(BVRestoreSplitRows(U,is[0],is[1],&U1,&U2)); |
224 |
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.
|
385 | PetscCall(BVRestoreSplitRows(V,is[0],is[1],&V1,&V2)); |
225 |
1/10✗ Branch 0 not taken.
✓ Branch 1 taken 5 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.
|
385 | if (work_len > 100) PetscCall(PetscFree(hwork)); |
226 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
77 | PetscFunctionReturn(PETSC_SUCCESS); |
227 | } | ||
228 | |||
229 | 35 | PetscErrorCode EPSSolve_KrylovSchur_Hamilt(EPS eps) | |
230 | { | ||
231 | 35 | EPS_KRYLOVSCHUR *ctx = (EPS_KRYLOVSCHUR*)eps->data; | |
232 | 35 | PetscInt i,k,l,ld,nv,t,nconv=0,nevsave; | |
233 | 35 | Mat Q,W,D; | |
234 | 35 | Vec vomega,vomegaold; | |
235 | 35 | BV U,V; | |
236 | 35 | PetscReal *a,*a2,*b,*omega,beta,u_norm; | |
237 | 35 | PetscBool breakdown=PETSC_FALSE,symmlost=PETSC_FALSE; | |
238 | 35 | PetscComplex eig; | |
239 | |||
240 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
35 | PetscFunctionBegin; |
241 |
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.
|
35 | PetscCall(DSGetLeadingDimension(eps->ds,&ld)); |
242 | |||
243 | /* Get the split bases */ | ||
244 |
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.
|
35 | PetscCall(BVSetActiveColumns(eps->V,eps->ncv/2+1,eps->ncv+2)); |
245 |
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.
|
35 | PetscCall(BVGetSplit(eps->V,&U,&V)); |
246 | |||
247 | 35 | nevsave = eps->nev; | |
248 | 35 | eps->nev = (eps->nev+1)/2; | |
249 | 35 | l = 0; | |
250 | |||
251 | /* Restart loop */ | ||
252 | 35 | while (eps->reason == EPS_CONVERGED_ITERATING) { | |
253 | 385 | eps->its++; | |
254 | |||
255 | /* Compute an nv-step Krylov factorization */ | ||
256 | 385 | nv = PetscMin(eps->nconv+eps->mpd/2,eps->ncv/2); | |
257 |
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.
|
385 | PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,eps->nconv+l)); |
258 |
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.
|
385 | PetscCall(DSGetArrayReal(eps->ds,DS_MAT_T,&a)); |
259 | /* FIXME: low level access to array a internals. This is obscure */ | ||
260 | 385 | a2 = a + ld; | |
261 | 385 | b = a + 2*ld; | |
262 |
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.
|
385 | PetscCall(DSGetArrayReal(eps->ds,DS_MAT_D,&omega)); |
263 |
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.
|
385 | PetscCall(EPSHamiltonianKS(eps,U,V,a,b,omega,eps->nconv+l,&nv,&symmlost,&breakdown)); |
264 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
3035 | for (i=eps->nconv+l; i<nv; i++) |
265 | 2650 | a2[i] = b[i]; | |
266 | 385 | beta = b[nv-1]; | |
267 |
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.
|
385 | PetscCall(DSRestoreArrayReal(eps->ds,DS_MAT_T,&a)); |
268 |
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.
|
385 | PetscCall(DSRestoreArrayReal(eps->ds,DS_MAT_D,&omega)); |
269 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
|
385 | if (symmlost) { |
270 | ✗ | eps->reason = EPS_DIVERGED_SYMMETRY_LOST; | |
271 | ✗ | if (nv==eps->nconv+l) { eps->nconv = nconv; break; } | |
272 | } | ||
273 |
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.
|
385 | PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,eps->nconv+l)); |
274 |
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.
|
385 | PetscCall(DSSetState(eps->ds,l?DS_STATE_RAW:DS_STATE_INTERMEDIATE)); |
275 |
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.
|
385 | PetscCall(BVSetActiveColumns(U,eps->nconv,nv)); |
276 |
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.
|
385 | PetscCall(BVSetActiveColumns(V,eps->nconv,nv)); |
277 | |||
278 | /* Save a copy of the signature */ | ||
279 |
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.
|
385 | PetscCall(DSGetMatAndColumn(eps->ds,DS_MAT_D,0,&D,&vomega)); |
280 |
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.
|
385 | PetscCall(VecDuplicate(vomega,&vomegaold)); |
281 |
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.
|
385 | PetscCall(VecCopy(vomega,vomegaold)); |
282 |
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.
|
385 | PetscCall(DSRestoreMatAndColumn(eps->ds,DS_MAT_D,0,&D,&vomega)); |
283 | |||
284 | /* Solve projected problem */ | ||
285 |
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.
|
385 | PetscCall(DSSolve(eps->ds,eps->eigr,eps->eigi)); |
286 |
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.
|
385 | PetscCall(DSSort(eps->ds,eps->eigr,eps->eigi,NULL,NULL,NULL)); |
287 |
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.
|
385 | PetscCall(DSUpdateExtraRow(eps->ds)); |
288 |
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.
|
385 | PetscCall(DSSynchronize(eps->ds,eps->eigr,eps->eigi)); |
289 | |||
290 | /* Check convergence */ | ||
291 |
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.
|
385 | PetscCall(DSGetDimensions(eps->ds,NULL,NULL,NULL,&t)); |
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.
|
385 | PetscCall(BVNormColumn(U,nv,NORM_2,&u_norm)); |
293 |
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.
|
385 | PetscCall(EPSKrylovConvergence(eps,PETSC_FALSE,eps->nconv,nv-eps->nconv,beta,0.0,u_norm,&k)); |
294 |
1/18✗ Branch 0 not taken.
✓ Branch 1 taken 5 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.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
|
385 | EPSSetCtxThreshold(eps,eps->eigr,eps->eigi,k); |
295 |
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.
|
385 | if (!symmlost) PetscCall((*eps->stopping)(eps,eps->its,eps->max_it,k,eps->nev,&eps->reason,eps->stoppingctx)); |
296 | 385 | nconv = k; | |
297 | |||
298 | /* Update l */ | ||
299 |
4/6✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 5 times.
|
385 | if (eps->reason != EPS_CONVERGED_ITERATING || breakdown || k==nv) l = 0; |
300 | else { | ||
301 | 350 | l = PetscMax(1,(PetscInt)((nv-k)*ctx->keep)); | |
302 | 350 | l = PetscMin(l,t); | |
303 |
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.
|
350 | PetscCall(DSGetTruncateSize(eps->ds,k,t,&l)); |
304 | } | ||
305 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
385 | if (!ctx->lock && l>0) { l += k; k = 0; } /* non-locking variant: reset no. of converged pairs */ |
306 |
6/8✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 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.
|
385 | if (l) PetscCall(PetscInfo(eps,"Preparing to restart keeping l=%" PetscInt_FMT " vectors\n",l)); |
307 | |||
308 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
385 | if (eps->reason == EPS_CONVERGED_ITERATING) { |
309 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
350 | PetscCheck(!breakdown,PetscObjectComm((PetscObject)eps),PETSC_ERR_CONV_FAILED,"Breakdown in Hamiltonian Krylov-Schur (beta=%g)",(double)beta); |
310 | /* Prepare the Rayleigh quotient for restart */ | ||
311 |
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.
|
350 | PetscCall(DSTruncate(eps->ds,k+l,PETSC_FALSE)); |
312 | } | ||
313 | /* Update the corresponding vectors | ||
314 | U(:,idx) = U*Omega*Q(:,idx)*Omega2 | ||
315 | V(:,idx) = V*Q(:,idx) */ | ||
316 |
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.
|
385 | PetscCall(DSGetMat(eps->ds,DS_MAT_Q,&Q)); |
317 |
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.
|
385 | PetscCall(MatDuplicate(Q,MAT_COPY_VALUES,&W)); |
318 |
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.
|
385 | PetscCall(DSGetMatAndColumn(eps->ds,DS_MAT_D,0,&D,&vomega)); |
319 |
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.
|
385 | PetscCall(MatDiagonalScale(W,vomegaold,vomega)); |
320 |
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.
|
385 | PetscCall(DSRestoreMatAndColumn(eps->ds,DS_MAT_D,0,&D,&vomega)); |
321 |
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.
|
385 | PetscCall(VecDestroy(&vomegaold)); |
322 |
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.
|
385 | PetscCall(BVMultInPlace(U,W,eps->nconv,k+l)); |
323 |
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.
|
385 | PetscCall(MatDestroy(&W)); |
324 |
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.
|
385 | PetscCall(BVMultInPlace(V,Q,eps->nconv,k+l)); |
325 |
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.
|
385 | PetscCall(DSRestoreMat(eps->ds,DS_MAT_Q,&Q)); |
326 | |||
327 |
3/4✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
|
385 | if (eps->reason == EPS_CONVERGED_ITERATING && !breakdown) { |
328 |
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.
|
350 | PetscCall(BVCopyColumn(U,nv,k+l)); |
329 |
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.
|
350 | PetscCall(BVCopyColumn(V,nv,k+l)); |
330 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
350 | if (eps->stop==EPS_STOP_THRESHOLD && nv-k<5) { /* reallocate */ |
331 | ✗ | eps->ncv = eps->mpd+k; | |
332 | ✗ | PetscCall(BVRestoreSplit(eps->V,&U,&V)); | |
333 | ✗ | PetscCall(EPSReallocateSolution(eps,eps->ncv+2)); | |
334 | ✗ | PetscCall(BVSetActiveColumns(eps->V,eps->ncv/2+1,eps->ncv+2)); | |
335 | ✗ | PetscCall(BVGetSplit(eps->V,&U,&V)); | |
336 | ✗ | for (i=nv;i<eps->ncv;i++) eps->perm[i] = i; | |
337 | ✗ | PetscCall(DSReallocate(eps->ds,eps->ncv/2+1)); | |
338 | ✗ | PetscCall(DSGetLeadingDimension(eps->ds,&ld)); | |
339 | } | ||
340 | } | ||
341 | 385 | eps->nconv = k; | |
342 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
5845 | for (i=0;i<nv;i++) { |
343 | #if defined(PETSC_USE_COMPLEX) | ||
344 | ✗ | eig = PetscSqrtScalar(eps->eigr[i]); | |
345 | #else | ||
346 | 5460 | eig = PetscSqrtComplex(PetscCMPLX(eps->eigr[i],eps->eigi[i])); | |
347 | #endif | ||
348 | 5460 | eps->eigr[i] = PetscRealPartComplex(eig); | |
349 | 5460 | eps->eigi[i] = PetscImaginaryPartComplex(eig); | |
350 | } | ||
351 |
7/8✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 1 times.
|
420 | PetscCall(EPSMonitor(eps,eps->its,nconv,eps->eigr,eps->eigi,eps->errest,nv)); |
352 | } | ||
353 | |||
354 | 35 | eps->nev = nevsave; | |
355 | |||
356 |
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.
|
35 | PetscCall(DSTruncate(eps->ds,eps->nconv,PETSC_TRUE)); |
357 |
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.
|
35 | PetscCall(BVRestoreSplit(eps->V,&U,&V)); |
358 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
7 | PetscFunctionReturn(PETSC_SUCCESS); |
359 | } | ||
360 | |||
361 | 35 | static PetscErrorCode EPSComputeVectors_Hamilt(EPS eps) | |
362 | { | ||
363 | 35 | Mat X,W,D; | |
364 | 35 | Vec vomega,vomegacopy; | |
365 | 35 | BV U,V; | |
366 | 35 | PetscInt n; | |
367 | |||
368 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
35 | PetscFunctionBegin; |
369 | /* Get the split bases */ | ||
370 |
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.
|
35 | PetscCall(BVSetActiveColumns(eps->V,eps->ncv/2+1,eps->ncv+2)); |
371 |
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.
|
35 | PetscCall(BVGetSplit(eps->V,&U,&V)); |
372 |
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.
|
35 | PetscCall(BVSetActiveColumns(eps->V,0,eps->nconv)); |
373 | |||
374 | /* Update bases again, needed due to 2x2 blocks */ | ||
375 |
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.
|
35 | PetscCall(DSGetDimensions(eps->ds,&n,NULL,NULL,NULL)); |
376 |
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.
|
35 | PetscCall(DSGetMatAndColumn(eps->ds,DS_MAT_D,0,&D,&vomega)); |
377 |
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.
|
35 | PetscCall(VecDuplicate(vomega,&vomegacopy)); |
378 |
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.
|
35 | PetscCall(VecCopy(vomega,vomegacopy)); |
379 |
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.
|
35 | PetscCall(DSRestoreMatAndColumn(eps->ds,DS_MAT_D,0,&D,&vomega)); |
380 |
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.
|
35 | PetscCall(DSVectors(eps->ds,DS_MAT_X,NULL,NULL)); |
381 |
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.
|
35 | PetscCall(DSGetMat(eps->ds,DS_MAT_X,&X)); |
382 |
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.
|
35 | PetscCall(MatDuplicate(X,MAT_COPY_VALUES,&W)); |
383 |
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.
|
35 | PetscCall(MatDiagonalScale(W,vomegacopy,NULL)); |
384 |
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.
|
35 | PetscCall(VecDestroy(&vomegacopy)); |
385 |
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.
|
35 | PetscCall(BVSetActiveColumns(U,0,n)); |
386 |
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.
|
35 | PetscCall(BVMultInPlace(U,W,0,n)); |
387 |
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.
|
35 | PetscCall(MatDestroy(&W)); |
388 |
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.
|
35 | PetscCall(BVSetActiveColumns(V,0,n)); |
389 |
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.
|
35 | PetscCall(BVMultInPlace(V,X,0,n)); |
390 |
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.
|
35 | PetscCall(DSRestoreMat(eps->ds,DS_MAT_X,&X)); |
391 | |||
392 |
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.
|
35 | PetscCall(BVRestoreSplit(eps->V,&U,&V)); |
393 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
7 | PetscFunctionReturn(PETSC_SUCCESS); |
394 | } | ||
395 | |||
396 | 35 | PetscErrorCode EPSSetUp_KrylovSchur_Hamilt(EPS eps) | |
397 | { | ||
398 | 35 | EPS_KRYLOVSCHUR *ctx = (EPS_KRYLOVSCHUR*)eps->data; | |
399 | 35 | PetscBool flg,sinvert; | |
400 | |||
401 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
35 | PetscFunctionBegin; |
402 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
35 | PetscCheck(eps->problem_type==EPS_HAMILT,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONGSTATE,"Problem type should be Hamiltonian"); |
403 |
9/22✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✓ Branch 9 taken 4 times.
✓ Branch 10 taken 1 times.
✓ Branch 11 taken 4 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 5 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
35 | EPSCheckUnsupportedCondition(eps,EPS_FEATURE_ARBITRARY | EPS_FEATURE_REGION | EPS_FEATURE_EXTRACTION | EPS_FEATURE_BALANCE,PETSC_TRUE," with Hamiltonian structure"); |
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.
|
35 | PetscCall(EPSSetDimensions_Default(eps,&eps->nev,&eps->ncv,&eps->mpd)); |
405 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
35 | PetscCheck(eps->ncv<=eps->nev+eps->mpd,PetscObjectComm((PetscObject)eps),PETSC_ERR_USER_INPUT,"The value of ncv must not be larger than nev+mpd"); |
406 |
2/4✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
|
70 | if (eps->max_it==PETSC_DETERMINE) eps->max_it = PetscMax(100,2*eps->n/eps->ncv)*((eps->stop==EPS_STOP_THRESHOLD)?10:1); |
407 | |||
408 |
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.
|
35 | PetscCall(PetscObjectTypeCompareAny((PetscObject)eps->st,&flg,STSINVERT,STSHIFT,"")); |
409 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
35 | PetscCheck(flg,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Hamiltonian Krylov-Schur only supports shift and shift-and-invert ST"); |
410 |
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.
|
35 | PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STSINVERT,&sinvert)); |
411 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
35 | PetscCheck(!sinvert,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Hamiltonian Krylov-Schur does not currently support shift-and-invert"); |
412 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
35 | if (!eps->which) { |
413 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
|
30 | if (sinvert) eps->which = EPS_TARGET_MAGNITUDE; |
414 | 30 | else eps->which = EPS_LARGEST_MAGNITUDE; | |
415 | } | ||
416 | |||
417 |
1/2✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
|
35 | if (!ctx->keep) ctx->keep = 0.5; |
418 |
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.
|
35 | PetscCall(STSetStructured(eps->st,PETSC_FALSE)); |
419 | |||
420 |
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.
|
35 | PetscCall(EPSAllocateSolution(eps,2)); |
421 | 35 | eps->ops->solve = EPSSolve_KrylovSchur_Hamilt; | |
422 | 35 | eps->ops->computevectors = EPSComputeVectors_Hamilt; | |
423 |
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.
|
35 | PetscCall(DSSetType(eps->ds,DSGHIEP)); |
424 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
35 | PetscCall(DSSetCompact(eps->ds,PETSC_TRUE)); |
425 |
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.
|
35 | PetscCall(DSSetExtraRow(eps->ds,PETSC_TRUE)); |
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.
|
35 | PetscCall(DSAllocate(eps->ds,eps->ncv/2+1)); |
427 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
7 | PetscFunctionReturn(PETSC_SUCCESS); |
428 | } | ||
429 |