| 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 |