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: thick-restarted Lanczos for Bethe-Salpeter pseudo-Hermitan matrices | ||
14 | |||
15 | References: | ||
16 | |||
17 | [1] M. Shao et al, "A structure preserving Lanczos algorithm for computing | ||
18 | the optical absorption spectrum", SIAM J. Matrix Anal. App. 39(2), 2018. | ||
19 | |||
20 | [2] F. Alvarruiz, B. Mellado-Pinto, J. E. Roman, "Variants of thick-restart | ||
21 | Lanczos for the Bethe-Salpeter eigenvalue problem", arXiv:2503.20920, | ||
22 | 2025. | ||
23 | |||
24 | */ | ||
25 | #include <slepc/private/epsimpl.h> | ||
26 | #include "krylovschur.h" | ||
27 | |||
28 | static PetscBool cited = PETSC_FALSE; | ||
29 | static const char citation[] = | ||
30 | "@Misc{slepc-bse,\n" | ||
31 | " author = \"F. Alvarruiz and B. Mellado-Pinto and J. E. Roman\",\n" | ||
32 | " title = \"Variants of thick-restart {Lanczos} for the {Bethe--Salpeter} eigenvalue problem\",\n" | ||
33 | " eprint = \"2503.20920\",\n" | ||
34 | " archivePrefix = \"arXiv\",\n" | ||
35 | " primaryClass = \"mathematics.numerical analysis\",\n" | ||
36 | " year = \"2025,\"\n" | ||
37 | " doi = \"https://doi.org/10.48550/arXiv.2503.20920\"\n" | ||
38 | "}\n"; | ||
39 | |||
40 | 13981 | static PetscErrorCode Orthog_Shao(Vec x,BV U,BV V,PetscInt j,PetscScalar *h,PetscScalar *c,PetscBool *breakdown) | |
41 | { | ||
42 | 13981 | PetscInt i; | |
43 | |||
44 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
13981 | PetscFunctionBegin; |
45 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(BVSetActiveColumns(U,0,j)); |
46 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(BVSetActiveColumns(V,0,j)); |
47 | /* c = real(V^* x) ; c2 = imag(U^* x)*1i */ | ||
48 | #if defined(PETSC_USE_COMPLEX) | ||
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.
|
8421 | PetscCall(BVDotVecBegin(V,x,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.
|
8421 | PetscCall(BVDotVecBegin(U,x,c+j)); |
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.
|
8421 | PetscCall(BVDotVecEnd(V,x,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.
|
8421 | PetscCall(BVDotVecEnd(U,x,c+j)); |
53 | #else | ||
54 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
5560 | PetscCall(BVDotVec(V,x,c)); |
55 | #endif | ||
56 | #if defined(PETSC_USE_COMPLEX) | ||
57 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
113896 | for (i=0; i<j; i++) { |
58 | 105475 | c[i] = PetscRealPart(c[i]); | |
59 | 105475 | c[j+i] = PetscCMPLX(0.0,PetscImaginaryPart(c[j+i])); | |
60 | } | ||
61 | #endif | ||
62 | /* x = x-U*c-V*c2 */ | ||
63 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(BVMultVec(U,-1.0,1.0,x,c)); |
64 | #if defined(PETSC_USE_COMPLEX) | ||
65 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
8421 | PetscCall(BVMultVec(V,-1.0,1.0,x,c+j)); |
66 | #endif | ||
67 | /* accumulate orthog coeffs into h */ | ||
68 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
355191 | for (i=0; i<2*j; i++) h[i] += c[i]; |
69 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
2590 | PetscFunctionReturn(PETSC_SUCCESS); |
70 | } | ||
71 | |||
72 | /* Orthogonalize vector x against first j vectors in U and V | ||
73 | v is column j-1 of V */ | ||
74 | 13981 | static PetscErrorCode OrthogonalizeVector_Shao(Vec x,BV U,BV V,PetscInt j,Vec v,PetscReal *beta,PetscInt k,PetscScalar *h,PetscBool *breakdown) | |
75 | { | ||
76 | 13981 | PetscReal alpha; | |
77 | 13981 | PetscInt i,l; | |
78 | |||
79 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
13981 | PetscFunctionBegin; |
80 |
4/6✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(PetscArrayzero(h,2*j)); |
81 | |||
82 | /* Local orthogonalization */ | ||
83 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
13981 | l = j==k+1?0:j-2; /* 1st column to orthogonalize against */ |
84 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(VecDotRealPart(x,v,&alpha)); |
85 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
45933 | for (i=l; i<j-1; i++) h[i] = beta[i]; |
86 | 13981 | h[j-1] = alpha; | |
87 | /* x = x-U(:,l:j-1)*h(l:j-1) */ | ||
88 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(BVSetActiveColumns(U,l,j)); |
89 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(BVMultVec(U,-1.0,1.0,x,h+l)); |
90 | |||
91 | /* Full orthogonalization */ | ||
92 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(Orthog_Shao(x,U,V,j,h,h+2*j,breakdown)); |
93 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
2590 | PetscFunctionReturn(PETSC_SUCCESS); |
94 | } | ||
95 | |||
96 | 2376 | static PetscErrorCode EPSBSELanczos_Shao(EPS eps,BV U,BV V,PetscReal *alpha,PetscReal *beta,PetscInt k,PetscInt *M,PetscBool *breakdown) | |
97 | { | ||
98 | 2376 | PetscInt j,m = *M; | |
99 | 2376 | Vec v,x,y,w,f,g,vecs[2]; | |
100 | 2376 | Mat H; | |
101 | 2376 | IS is[2]; | |
102 | 2376 | PetscReal nrm; | |
103 | 2376 | PetscScalar *hwork,lhwork[100],gamma; | |
104 | 2376 | PetscContainer container; | |
105 | 2376 | SlepcMatStruct mctx; | |
106 | |||
107 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2376 | PetscFunctionBegin; |
108 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
2376 | if (4*m > 100) PetscCall(PetscMalloc1(4*m,&hwork)); |
109 | 2376 | else hwork = lhwork; | |
110 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(STGetMatrix(eps->st,0,&H)); |
111 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(MatNestGetISs(H,is,NULL)); |
112 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(PetscObjectQuery((PetscObject)H,"SlepcMatStruct",(PetscObject*)&container)); |
113 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(PetscContainerGetPointer(container,(void**)&mctx)); |
114 | |||
115 | /* create work vectors */ | ||
116 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(BVGetColumn(V,0,&v)); |
117 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(VecDuplicate(v,&w)); |
118 | 2376 | vecs[0] = v; | |
119 | 2376 | vecs[1] = w; | |
120 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(VecCreateNest(PetscObjectComm((PetscObject)eps),2,is,vecs,&f)); |
121 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(VecCreateNest(PetscObjectComm((PetscObject)eps),2,is,vecs,&g)); |
122 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(BVRestoreColumn(V,0,&v)); |
123 | |||
124 | /* Normalize initial vector */ | ||
125 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2376 | if (k==0) { |
126 |
5/8✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
118 | if (eps->nini==0) PetscCall(BVSetRandomColumn(eps->V,0)); |
127 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(BVGetColumn(U,0,&x)); |
128 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(BVGetColumn(V,0,&y)); |
129 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(VecNestSetSubVec(f,0,x)); |
130 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(VecNestSetSubVec(g,0,y)); |
131 | 118 | mctx->s = 1.0; | |
132 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(STApply(eps->st,f,g)); |
133 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(VecDot(y,x,&gamma)); |
134 | 118 | nrm = PetscSqrtReal(PetscRealPart(gamma)); | |
135 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(VecScale(x,1.0/nrm)); |
136 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(VecScale(y,1.0/nrm)); |
137 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(BVRestoreColumn(U,0,&x)); |
138 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(BVRestoreColumn(V,0,&y)); |
139 | } | ||
140 | |||
141 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
16357 | for (j=k;j<m;j++) { |
142 | /* j+1 columns (indexes 0 to j) have been computed */ | ||
143 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(BVGetColumn(V,j,&v)); |
144 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(BVGetColumn(U,j+1,&x)); |
145 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(BVGetColumn(V,j+1,&y)); |
146 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(VecNestSetSubVec(f,0,v)); |
147 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(VecNestSetSubVec(g,0,x)); |
148 | 13981 | mctx->s = -1.0; | |
149 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(STApply(eps->st,f,g)); |
150 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(OrthogonalizeVector_Shao(x,U,V,j+1,v,beta,k,hwork,breakdown)); |
151 | 13981 | alpha[j] = PetscRealPart(hwork[j]); | |
152 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(VecNestSetSubVec(f,0,x)); |
153 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(VecNestSetSubVec(g,0,y)); |
154 | 13981 | mctx->s = 1.0; | |
155 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(STApply(eps->st,f,g)); |
156 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(VecDot(x,y,&gamma)); |
157 | 13981 | beta[j] = PetscSqrtReal(PetscRealPart(gamma)); | |
158 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(VecScale(x,1.0/beta[j])); |
159 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(VecScale(y,1.0/beta[j])); |
160 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(BVRestoreColumn(V,j,&v)); |
161 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(BVRestoreColumn(U,j+1,&x)); |
162 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13981 | PetscCall(BVRestoreColumn(V,j+1,&y)); |
163 | } | ||
164 |
1/10✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
2376 | if (4*m > 100) PetscCall(PetscFree(hwork)); |
165 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(VecDestroy(&w)); |
166 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(VecDestroy(&f)); |
167 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(VecDestroy(&g)); |
168 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
456 | PetscFunctionReturn(PETSC_SUCCESS); |
169 | } | ||
170 | |||
171 | 118 | static PetscErrorCode EPSComputeVectors_BSE_Shao(EPS eps) | |
172 | { | ||
173 | 118 | Mat H; | |
174 | 118 | Vec u1,v1; | |
175 | 118 | BV U,V; | |
176 | 118 | IS is[2]; | |
177 | 118 | PetscInt k; | |
178 | 118 | PetscScalar lambda; | |
179 | |||
180 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
118 | PetscFunctionBegin; |
181 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(STGetMatrix(eps->st,0,&H)); |
182 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(MatNestGetISs(H,is,NULL)); |
183 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&U,&V)); |
184 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
975 | for (k=0; k<eps->nconv; k++) { |
185 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
857 | PetscCall(BVGetColumn(U,k,&u1)); |
186 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
857 | PetscCall(BVGetColumn(V,k,&v1)); |
187 | /* approx eigenvector is [ (eigr[k]*u1+v1)] | ||
188 | [conj(eigr[k]*u1-v1)] */ | ||
189 | 857 | lambda = eps->eigr[k]; | |
190 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
857 | PetscCall(STBackTransform(eps->st,1,&lambda,&eps->eigi[k])); |
191 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
857 | PetscCall(VecAYPX(u1,lambda,v1)); |
192 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
857 | PetscCall(VecAYPX(v1,-2.0,u1)); |
193 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
857 | PetscCall(VecConjugate(v1)); |
194 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
857 | PetscCall(BVRestoreColumn(U,k,&u1)); |
195 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
857 | PetscCall(BVRestoreColumn(V,k,&v1)); |
196 | } | ||
197 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&U,&V)); |
198 | /* Normalize eigenvectors */ | ||
199 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(BVSetActiveColumns(eps->V,0,eps->nconv)); |
200 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(BVNormalize(eps->V,NULL)); |
201 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
18 | PetscFunctionReturn(PETSC_SUCCESS); |
202 | } | ||
203 | |||
204 | 13541 | static PetscErrorCode Orthog_Gruning(Vec x,BV U,BV V,BV HU,BV HV,PetscInt j,PetscScalar *h,PetscScalar *c,PetscBool *breakdown) | |
205 | { | ||
206 | 13541 | PetscInt i; | |
207 | |||
208 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
13541 | PetscFunctionBegin; |
209 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVSetActiveColumns(U,0,j)); |
210 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVSetActiveColumns(HU,0,j)); |
211 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVSetActiveColumns(V,0,j)); |
212 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVSetActiveColumns(HV,0,j)); |
213 | #if defined(PETSC_USE_COMPLEX) | ||
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.
|
8262 | PetscCall(BVDotVecBegin(HU,x,c)); |
215 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
8262 | PetscCall(BVDotVecBegin(HV,x,c+j)); |
216 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
8262 | PetscCall(BVDotVecEnd(HU,x,c)); |
217 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
8262 | PetscCall(BVDotVecEnd(HV,x,c+j)); |
218 | #else | ||
219 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
5279 | PetscCall(BVDotVec(HU,x,c)); |
220 | #endif | ||
221 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
178056 | for (i=0; i<j; i++) { |
222 | /* c1 = 2*real(HU^* x) ; c2 = 2*imag(HV^* x)*1i */ | ||
223 | #if defined(PETSC_USE_COMPLEX) | ||
224 | 103033 | c[i] = PetscRealPart(c[i]); | |
225 | 103033 | c[j+i] = PetscCMPLX(0.0,PetscImaginaryPart(c[j+i])); | |
226 | #else | ||
227 | 61482 | c[j+i] = 0.0; | |
228 | #endif | ||
229 | } | ||
230 | /* x = x-U*c1-V*c2 */ | ||
231 | #if defined(PETSC_USE_COMPLEX) | ||
232 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
8262 | PetscCall(BVMultVec(U,-2.0,1.0,x,c)); |
233 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
8262 | PetscCall(BVMultVec(V,-2.0,1.0,x,c+j)); |
234 | #else | ||
235 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
5279 | PetscCall(BVMultVec(U,-2.0,1.0,x,c)); |
236 | #endif | ||
237 | /* accumulate orthog coeffs into h */ | ||
238 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
342571 | for (i=0; i<2*j; i++) h[i] += 2*c[i]; |
239 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
2575 | PetscFunctionReturn(PETSC_SUCCESS); |
240 | } | ||
241 | |||
242 | /* Orthogonalize vector x against first j vectors in U and V */ | ||
243 | 27082 | static PetscErrorCode OrthogonalizeVector_Gruning(Vec x,BV U,BV V,BV HU,BV HV,PetscInt j,PetscReal *beta,PetscInt k,PetscScalar *h,PetscBool s,PetscBool *breakdown) | |
244 | { | ||
245 | 27082 | PetscInt l,i; | |
246 | 27082 | Vec u; | |
247 | |||
248 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
27082 | PetscFunctionBegin; |
249 |
4/6✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
27082 | PetscCall(PetscArrayzero(h,4*j)); |
250 | |||
251 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
27082 | if (s) { |
252 | /* Local orthogonalization */ | ||
253 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVGetColumn(U,j-1,&u)); |
254 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(VecAXPY(x,-*beta,u)); |
255 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVRestoreColumn(U,j-1,&u)); |
256 | 13541 | h[j-1] = *beta; | |
257 | /* Full orthogonalization */ | ||
258 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(Orthog_Gruning(x,U,V,HU,HV,j,h,h+2*j,breakdown)); |
259 | } else { | ||
260 | /* Local orthogonalization */ | ||
261 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
13541 | l = j==k+1?0:j-2; /* 1st column to orthogonalize against */ |
262 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
44717 | for (i=l; i<j-1; i++) h[j+i] = beta[i]; |
263 | /* x = x-V(:,l:j-2)*h(l:j-2) */ | ||
264 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVSetActiveColumns(V,l,j-1)); |
265 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVMultVec(V,-1.0,1.0,x,h+j+l)); |
266 | } | ||
267 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
5150 | PetscFunctionReturn(PETSC_SUCCESS); |
268 | } | ||
269 | |||
270 | 2332 | static PetscErrorCode EPSBSELanczos_Gruning(EPS eps,BV U,BV V,BV HU,BV HV,PetscReal *beta1,PetscReal *beta2,PetscInt k,PetscInt *M,PetscBool *breakdown) | |
271 | { | ||
272 | 2332 | PetscInt j,m = *M; | |
273 | 2332 | Vec v,x,y,w,f,g,vecs[2]; | |
274 | 2332 | Mat H; | |
275 | 2332 | IS is[2]; | |
276 | 2332 | PetscReal nrm; | |
277 | 2332 | PetscScalar *hwork,lhwork[100],dot; | |
278 | 2332 | PetscContainer container; | |
279 | 2332 | SlepcMatStruct mctx; | |
280 | |||
281 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2332 | PetscFunctionBegin; |
282 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
2332 | if (4*m > 100) PetscCall(PetscMalloc1(4*m,&hwork)); |
283 | 2332 | else hwork = lhwork; | |
284 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(STGetMatrix(eps->st,0,&H)); |
285 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(MatNestGetISs(H,is,NULL)); |
286 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(PetscObjectQuery((PetscObject)H,"SlepcMatStruct",(PetscObject*)&container)); |
287 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(PetscContainerGetPointer(container,(void**)&mctx)); |
288 | |||
289 | /* create work vectors */ | ||
290 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(BVGetColumn(V,0,&v)); |
291 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(VecDuplicate(v,&w)); |
292 | 2332 | vecs[0] = v; | |
293 | 2332 | vecs[1] = w; | |
294 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(VecCreateNest(PetscObjectComm((PetscObject)eps),2,is,vecs,&f)); |
295 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(VecCreateNest(PetscObjectComm((PetscObject)eps),2,is,vecs,&g)); |
296 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(BVRestoreColumn(V,0,&v)); |
297 | |||
298 | /* Normalize initial vector */ | ||
299 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2332 | if (k==0) { |
300 |
5/8✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
113 | if (eps->nini==0) PetscCall(BVSetRandomColumn(eps->V,0)); |
301 | /* y = Hmult(v1,1) */ | ||
302 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(BVGetColumn(U,k,&x)); |
303 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(BVGetColumn(HU,k,&y)); |
304 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(VecNestSetSubVec(f,0,x)); |
305 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(VecNestSetSubVec(g,0,y)); |
306 | 113 | mctx->s = 1.0; | |
307 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(STApply(eps->st,f,g)); |
308 | /* nrm = sqrt(2*real(u1'*y)); */ | ||
309 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(VecDot(x,y,&dot)); |
310 | 113 | nrm = PetscSqrtReal(PetscRealPart(2*dot)); | |
311 | /* U(:,j) = u1/nrm; */ | ||
312 | /* HU(:,j) = y/nrm; */ | ||
313 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(VecScale(x,1.0/nrm)); |
314 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(VecScale(y,1.0/nrm)); |
315 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(BVRestoreColumn(U,k,&x)); |
316 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(BVRestoreColumn(HU,k,&y)); |
317 | } | ||
318 | |||
319 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
15873 | for (j=k;j<m;j++) { |
320 | /* j+1 columns (indexes 0 to j) have been computed */ | ||
321 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVGetColumn(HU,j,&x)); |
322 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVGetColumn(V,j,&v)); |
323 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVGetColumn(HV,j,&y)); |
324 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(VecCopy(x,v)); |
325 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVRestoreColumn(HU,j,&x)); |
326 | /* v = Orthogonalize HU(:,j) */ | ||
327 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(OrthogonalizeVector_Gruning(v,U,V,HU,HV,j+1,beta2,k,hwork,PETSC_FALSE,breakdown)); |
328 | /* y = Hmult(v,-1) */ | ||
329 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(VecNestSetSubVec(f,0,v)); |
330 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(VecNestSetSubVec(g,0,y)); |
331 | 13541 | mctx->s = -1.0; | |
332 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(STApply(eps->st,f,g)); |
333 | /* beta = sqrt(2*real(v'*y)); */ | ||
334 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(VecDot(v,y,&dot)); |
335 | 13541 | beta1[j] = PetscSqrtReal(PetscRealPart(2*dot)); //FIXME Check beta != 0? | |
336 | /* V(:,j) = v/beta1; */ | ||
337 | /* HV(:,j) = y/beta1; */ | ||
338 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(VecScale(v,1.0/beta1[j])); |
339 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(VecScale(y,1.0/beta1[j])); |
340 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVRestoreColumn(V,j,&v)); |
341 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVRestoreColumn(HV,j,&y)); |
342 | |||
343 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVGetColumn(HV,j,&x)); |
344 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVGetColumn(U,j+1,&v)); |
345 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVGetColumn(HU,j+1,&y)); |
346 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(VecCopy(x,v)); |
347 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVRestoreColumn(HV,j,&x)); |
348 | /* v = Orthogonalize HV(:,j) */ | ||
349 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(OrthogonalizeVector_Gruning(v,U,V,HU,HV,j+1,&beta1[j],k,hwork,PETSC_TRUE,breakdown)); |
350 | /* y = Hmult(v,1) */ | ||
351 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(VecNestSetSubVec(f,0,v)); |
352 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(VecNestSetSubVec(g,0,y)); |
353 | 13541 | mctx->s = 1.0; | |
354 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(STApply(eps->st,f,g)); |
355 | /* beta = sqrt(2*real(v'*y)); */ | ||
356 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(VecDot(v,y,&dot)); |
357 | 13541 | beta2[j] = PetscSqrtReal(PetscRealPart(2*dot)); //FIXME Check beta != 0? | |
358 | /* U(:,j) = v/beta2; */ | ||
359 | /* HU(:,j) = y/beta2; */ | ||
360 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(VecScale(v,1.0/beta2[j])); |
361 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(VecScale(y,1.0/beta2[j])); |
362 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVRestoreColumn(U,j+1,&v)); |
363 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13541 | PetscCall(BVRestoreColumn(HU,j+1,&y)); |
364 | } | ||
365 |
1/10✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
2332 | if (4*m > 100) PetscCall(PetscFree(hwork)); |
366 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(VecDestroy(&w)); |
367 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(VecDestroy(&f)); |
368 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(VecDestroy(&g)); |
369 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
465 | PetscFunctionReturn(PETSC_SUCCESS); |
370 | } | ||
371 | |||
372 | 113 | static PetscErrorCode EPSComputeVectors_BSE_Gruning(EPS eps) | |
373 | { | ||
374 | 113 | Mat H; | |
375 | 113 | Vec u1,v1; | |
376 | 113 | BV U,V; | |
377 | 113 | IS is[2]; | |
378 | 113 | PetscInt k; | |
379 | |||
380 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
113 | PetscFunctionBegin; |
381 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(STGetMatrix(eps->st,0,&H)); |
382 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(MatNestGetISs(H,is,NULL)); |
383 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&U,&V)); |
384 | /* approx eigenvector [x1] is [ u1+v1 ] | ||
385 | [x2] [conj(u1)-conj(v1)] */ | ||
386 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
901 | for (k=0; k<eps->nconv; k++) { |
387 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
788 | PetscCall(BVGetColumn(U,k,&u1)); |
388 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
788 | PetscCall(BVGetColumn(V,k,&v1)); |
389 | /* x1 = u1 + v1 */ | ||
390 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
788 | PetscCall(VecAXPY(u1,1.0,v1)); |
391 | /* x2 = conj(u1) - conj(v1) = conj(u1 - v1) = conj((u1 + v1) - 2*v1) */ | ||
392 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
788 | PetscCall(VecAYPX(v1,-2.0,u1)); |
393 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
788 | PetscCall(VecConjugate(v1)); |
394 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
788 | PetscCall(BVRestoreColumn(U,k,&u1)); |
395 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
788 | PetscCall(BVRestoreColumn(V,k,&v1)); |
396 | } | ||
397 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&U,&V)); |
398 | /* Normalize eigenvectors */ | ||
399 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(BVSetActiveColumns(eps->V,0,eps->nconv)); |
400 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(BVNormalize(eps->V,NULL)); |
401 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
17 | PetscFunctionReturn(PETSC_SUCCESS); |
402 | } | ||
403 | |||
404 | /* Full orthogonalization of vector [hx, conj(hx)] against first j vectors in X and Y */ | ||
405 | 13491 | static PetscErrorCode Orthog_ProjectedBSE(Vec hx,BV X,BV Y,PetscInt j,PetscScalar *h,PetscScalar *c,PetscBool *breakdown) | |
406 | { | ||
407 | 13491 | PetscInt i; | |
408 | |||
409 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
13491 | PetscFunctionBegin; |
410 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(BVSetActiveColumns(X,0,j)); |
411 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(BVSetActiveColumns(Y,0,j)); |
412 | /* c1 = X^* hx */ | ||
413 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(BVDotVec(X,hx,c)); |
414 | /* c2 = Y^* conj(hx) */ | ||
415 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecConjugate(hx)); |
416 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(BVDotVec(Y,hx,c+j)); |
417 | /* c = c1 - c2 */ | ||
418 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
179616 | for (i=0;i<j;i++) c[i] -= c[i+j]; |
419 | /* hx = hx - conj(Y*c) */ | ||
420 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(BVMultVec(Y,-1.0,1.0,hx,c)); |
421 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecConjugate(hx)); |
422 | /* hx = hx - X*c */ | ||
423 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(BVMultVec(X,-1.0,1.0,hx,c)); |
424 | /* accumulate orthog coeffs into h */ | ||
425 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
179616 | for (i=0;i<j;i++) h[i] += c[i]; |
426 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
2528 | PetscFunctionReturn(PETSC_SUCCESS); |
427 | } | ||
428 | |||
429 | /* Orthogonalize vector [hx; hy] against first j vectors in X and Y | ||
430 | The result is a vector [u; conj(u)]. Vector hx is overwritten with u. */ | ||
431 | 13491 | static PetscErrorCode OrthogonalizeVector_ProjectedBSE(Vec hx,Vec hy,BV X,BV Y,PetscInt j,PetscReal *beta,PetscInt k,PetscScalar *h,PetscBool *breakdown) | |
432 | { | ||
433 | 13491 | PetscInt l,i; | |
434 | 13491 | PetscScalar alpha,alpha1,alpha2; | |
435 | 13491 | Vec x,y; | |
436 | |||
437 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
13491 | PetscFunctionBegin; |
438 |
4/6✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(PetscArrayzero(h,2*j)); |
439 | |||
440 | /* Local orthogonalization */ | ||
441 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
13491 | l = j==k+1?0:j-2; /* 1st column to orthogonalize against */ |
442 | /* alpha = X(:,j-1)'*hx-Y(:,j-1)'*hy */ | ||
443 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(BVGetColumn(X,j-1,&x)); |
444 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(BVGetColumn(Y,j-1,&y)); |
445 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecDotBegin(hx,x,&alpha1)); |
446 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecDotBegin(hy,y,&alpha2)); |
447 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecDotEnd(hx,x,&alpha1)); |
448 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecDotEnd(hy,y,&alpha2)); |
449 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(BVRestoreColumn(X,j-1,&x)); |
450 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(BVRestoreColumn(Y,j-1,&y)); |
451 | 13491 | alpha = alpha1-alpha2; | |
452 | /* Store coeffs into h */ | ||
453 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
44911 | for (i=l; i<j-1; i++) h[i] = h[j+i] = beta[i]/2.0; |
454 | 13491 | h[j-1] = alpha; | |
455 | |||
456 | /* Orthogonalize: hx = hx - X(:,l:j-1)*h1 - conj(Y(:,l:j-1))*h2 */ | ||
457 | /* hx = hx - X(:,l:j-1)*h1 */ | ||
458 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(BVSetActiveColumns(X,l,j)); |
459 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(BVSetActiveColumns(Y,l,j)); |
460 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(BVMultVec(X,-1.0,1.0,hx,h+l)); |
461 | /* hx = conj(hx) */ | ||
462 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecConjugate(hx)); |
463 | /* hx = hx - Y(:,l:j-1)*conj(h2) */ | ||
464 | 13491 | h[2*j-1] = PetscConj(alpha-1.0); | |
465 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(BVMultVec(Y,-1.0,1.0,hx,h+j+l)); |
466 | 13491 | h[2*j-1] = alpha-1.0; | |
467 | /* hx = conj(hx) */ | ||
468 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecConjugate(hx)); |
469 | |||
470 | /* Full orthogonalization */ | ||
471 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(Orthog_ProjectedBSE(hx,X,Y,j,h,h+2*j,breakdown)); |
472 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
2528 | PetscFunctionReturn(PETSC_SUCCESS); |
473 | } | ||
474 | |||
475 | 2332 | static PetscErrorCode EPSBSELanczos_ProjectedBSE(EPS eps,BV X,BV Y,Vec v,PetscReal *alpha,PetscReal *beta,PetscInt k,PetscInt *M,PetscBool *breakdown) | |
476 | { | ||
477 | 2332 | PetscInt j,m = *M; | |
478 | 2332 | Vec u,x,y,w,f,g,vecs[2]; | |
479 | 2332 | Mat H; | |
480 | 2332 | IS is[2]; | |
481 | 2332 | PetscReal nrm; | |
482 | 2332 | PetscScalar *hwork,lhwork[100],gamma; | |
483 | 2332 | PetscContainer container; | |
484 | 2332 | SlepcMatStruct mctx; | |
485 | |||
486 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2332 | PetscFunctionBegin; |
487 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
2332 | if (4*m > 100) PetscCall(PetscMalloc1(4*m,&hwork)); |
488 | 2332 | else hwork = lhwork; | |
489 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(STGetMatrix(eps->st,0,&H)); |
490 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(MatNestGetISs(H,is,NULL)); |
491 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(PetscObjectQuery((PetscObject)H,"SlepcMatStruct",(PetscObject*)&container)); |
492 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(PetscContainerGetPointer(container,(void**)&mctx)); |
493 | |||
494 | /* create work vectors */ | ||
495 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(BVGetColumn(Y,0,&u)); |
496 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(VecDuplicate(u,&w)); |
497 | 2332 | vecs[0] = u; | |
498 | 2332 | vecs[1] = w; | |
499 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(VecCreateNest(PetscObjectComm((PetscObject)eps),2,is,vecs,&f)); |
500 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(VecCreateNest(PetscObjectComm((PetscObject)eps),2,is,vecs,&g)); |
501 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(BVRestoreColumn(Y,0,&u)); |
502 | |||
503 | /* Normalize initial vector */ | ||
504 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2332 | if (k==0) { |
505 |
5/8✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
103 | if (eps->nini==0) PetscCall(BVSetRandomColumn(eps->V,0)); |
506 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(BVGetColumn(X,0,&x)); |
507 | /* v = Hmult(u,1) */ | ||
508 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(BVGetColumn(Y,0,&y)); |
509 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(VecNestSetSubVec(f,0,x)); |
510 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(VecNestSetSubVec(g,0,y)); |
511 | 103 | mctx->s = 1.0; | |
512 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(STApply(eps->st,f,g)); |
513 | /* nrm = sqrt(real(u'*v)) */ | ||
514 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(VecDot(y,x,&gamma)); |
515 | 103 | nrm = PetscSqrtReal(PetscRealPart(gamma)); | |
516 | /* u = u /(nrm*2) */ | ||
517 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(VecScale(x,1.0/(2.0*nrm))); |
518 | /* v = v /(nrm*2) */ | ||
519 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(VecScale(y,1.0/(2.0*nrm))); |
520 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(VecCopy(y,v)); |
521 | /* X(:,1) = (u+v) */ | ||
522 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(VecAXPY(x,1,y)); |
523 | /* Y(:,1) = conj(u-v) */ | ||
524 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(VecAYPX(y,-2,x)); |
525 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(VecConjugate(y)); |
526 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(BVRestoreColumn(X,0,&x)); |
527 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(BVRestoreColumn(Y,0,&y)); |
528 | } | ||
529 | |||
530 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
15823 | for (j=k;j<m;j++) { |
531 | /* j+1 columns (indexes 0 to j) have been computed */ | ||
532 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(BVGetColumn(X,j+1,&x)); |
533 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(BVGetColumn(Y,j+1,&y)); |
534 | /* u = Hmult(v,-1)*/ | ||
535 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecNestSetSubVec(f,0,v)); |
536 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecNestSetSubVec(g,0,x)); |
537 | 13491 | mctx->s = -1.0; | |
538 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(STApply(eps->st,f,g)); |
539 | /* hx = (u+v) */ | ||
540 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecCopy(x,y)); |
541 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecAXPY(x,1,v)); |
542 | /* hy = conj(u-v) */ | ||
543 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecAXPY(y,-1,v)); |
544 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecConjugate(y)); |
545 | /* [u,cd] = orthog(hx,hy,X(:,1:j),Y(:,1:j),opt)*/ | ||
546 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(OrthogonalizeVector_ProjectedBSE(x,y,X,Y,j+1,beta,k,hwork,breakdown)); |
547 | /* alpha(j) = 2*(real(cd(j))-1/2) */ | ||
548 | 13491 | alpha[j] = 2*(PetscRealPart(hwork[j]) - 0.5); | |
549 | /* v = Hmult(u,1) */ | ||
550 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecNestSetSubVec(f,0,x)); |
551 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecNestSetSubVec(g,0,y)); |
552 | 13491 | mctx->s = 1.0; | |
553 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(STApply(eps->st,f,g)); |
554 | /* nrm = sqrt(real(u'*v)) */ | ||
555 | /* beta(j) = 2*nrm */ | ||
556 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecDot(x,y,&gamma)); |
557 | 13491 | beta[j] = 2.0*PetscSqrtReal(PetscRealPart(gamma)); | |
558 | /* u = u/(nrm*2) */ | ||
559 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecScale(x,1.0/beta[j])); |
560 | /* v = v/(nrm*2) */ | ||
561 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecScale(y,1.0/beta[j])); |
562 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecCopy(y,v)); |
563 | /* X(:,j+1) = (u+v) */ | ||
564 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecAXPY(x,1,y)); |
565 | /* Y(:,j+1) = conj(u-v) */ | ||
566 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecAYPX(y,-2,x)); |
567 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(VecConjugate(y)); |
568 | /* Restore */ | ||
569 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(BVRestoreColumn(X,j+1,&x)); |
570 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13491 | PetscCall(BVRestoreColumn(Y,j+1,&y)); |
571 | } | ||
572 |
1/10✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
2332 | if (4*m > 100) PetscCall(PetscFree(hwork)); |
573 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(VecDestroy(&w)); |
574 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(VecDestroy(&f)); |
575 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(VecDestroy(&g)); |
576 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
452 | PetscFunctionReturn(PETSC_SUCCESS); |
577 | } | ||
578 | |||
579 | 103 | static PetscErrorCode EPSComputeVectors_BSE_ProjectedBSE(EPS eps) | |
580 | { | ||
581 | 103 | Mat H; | |
582 | 103 | Vec x1,y1,cx1,cy1; | |
583 | 103 | BV X,Y; | |
584 | 103 | IS is[2]; | |
585 | 103 | PetscInt k; | |
586 | 103 | PetscScalar delta1,delta2,lambda; | |
587 | |||
588 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
103 | PetscFunctionBegin; |
589 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(STGetMatrix(eps->st,0,&H)); |
590 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(MatNestGetISs(H,is,NULL)); |
591 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&X,&Y)); |
592 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(BVCreateVec(X,&cx1)); |
593 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(BVCreateVec(Y,&cy1)); |
594 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
835 | for (k=0; k<eps->nconv; k++) { |
595 | /* approx eigenvector is [ delta1*x1 + delta2*conj(y1) ] | ||
596 | [ delta1*y1 + delta2*conj(x1) ] */ | ||
597 | 732 | lambda = eps->eigr[k]; | |
598 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
732 | PetscCall(STBackTransform(eps->st,1,&lambda,&eps->eigi[k])); |
599 | 732 | delta1 = lambda+1.0; | |
600 | 732 | delta2 = lambda-1.0; | |
601 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
732 | PetscCall(BVGetColumn(X,k,&x1)); |
602 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
732 | PetscCall(BVGetColumn(Y,k,&y1)); |
603 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
732 | PetscCall(VecCopy(x1,cx1)); |
604 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
732 | PetscCall(VecCopy(y1,cy1)); |
605 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
732 | PetscCall(VecConjugate(cx1)); |
606 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
732 | PetscCall(VecConjugate(cy1)); |
607 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
732 | PetscCall(VecScale(x1,delta1)); |
608 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
732 | PetscCall(VecScale(y1,delta1)); |
609 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
732 | PetscCall(VecAXPY(x1,delta2,cy1)); |
610 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
732 | PetscCall(VecAXPY(y1,delta2,cx1)); |
611 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
732 | PetscCall(BVRestoreColumn(X,k,&x1)); |
612 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
732 | PetscCall(BVRestoreColumn(Y,k,&y1)); |
613 | } | ||
614 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&X,&Y)); |
615 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(BVSetActiveColumns(eps->V,0,eps->nconv)); |
616 | /* Normalize eigenvector */ | ||
617 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(BVNormalize(eps->V,NULL)); |
618 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(VecDestroy(&cx1)); |
619 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(VecDestroy(&cy1)); |
620 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
15 | PetscFunctionReturn(PETSC_SUCCESS); |
621 | } | ||
622 | |||
623 | 334 | PetscErrorCode EPSSetUp_KrylovSchur_BSE(EPS eps) | |
624 | { | ||
625 | 334 | EPS_KRYLOVSCHUR *ctx = (EPS_KRYLOVSCHUR*)eps->data; | |
626 | 334 | PetscBool flg,sinvert; | |
627 | |||
628 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
334 | PetscFunctionBegin; |
629 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
334 | PetscCheck((eps->problem_type==EPS_BSE),PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONGSTATE,"Problem type should be BSE"); |
630 |
9/22✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 8 times.
✓ Branch 10 taken 2 times.
✓ Branch 11 taken 8 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 10 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
334 | EPSCheckUnsupportedCondition(eps,EPS_FEATURE_ARBITRARY | EPS_FEATURE_REGION | EPS_FEATURE_EXTRACTION | EPS_FEATURE_BALANCE,PETSC_TRUE," with BSE structure"); |
631 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
334 | PetscCall(PetscCitationsRegister(citation,&cited)); |
632 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
334 | PetscCall(EPSSetDimensions_Default(eps,&eps->nev,&eps->ncv,&eps->mpd)); |
633 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
334 | 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"); |
634 |
3/4✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
608 | if (eps->max_it==PETSC_DETERMINE) eps->max_it = PetscMax(100,2*eps->n/eps->ncv)*((eps->stop==EPS_STOP_THRESHOLD)?10:1); |
635 | |||
636 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
334 | PetscCall(PetscObjectTypeCompareAny((PetscObject)eps->st,&flg,STSINVERT,STSHIFT,"")); |
637 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
334 | PetscCheck(flg,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Krylov-Schur BSE only supports shift and shift-and-invert ST"); |
638 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
334 | PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STSINVERT,&sinvert)); |
639 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
334 | if (!eps->which) { |
640 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
314 | if (sinvert) eps->which = EPS_TARGET_MAGNITUDE; |
641 | 236 | else eps->which = EPS_SMALLEST_MAGNITUDE; | |
642 | } | ||
643 | |||
644 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
334 | if (!ctx->keep) ctx->keep = 0.5; |
645 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
334 | PetscCall(STSetStructured(eps->st,PETSC_TRUE)); |
646 | |||
647 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
334 | PetscCall(EPSAllocateSolution(eps,1)); |
648 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
|
334 | switch (ctx->bse) { |
649 | 118 | case EPS_KRYLOVSCHUR_BSE_SHAO: | |
650 | 118 | eps->ops->solve = EPSSolve_KrylovSchur_BSE_Shao; | |
651 | 118 | eps->ops->computevectors = EPSComputeVectors_BSE_Shao; | |
652 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(DSSetType(eps->ds,DSHEP)); |
653 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(DSSetCompact(eps->ds,PETSC_TRUE)); |
654 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(DSSetExtraRow(eps->ds,PETSC_TRUE)); |
655 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(DSAllocate(eps->ds,eps->ncv+1)); |
656 | break; | ||
657 | 113 | case EPS_KRYLOVSCHUR_BSE_GRUNING: | |
658 | 113 | eps->ops->solve = EPSSolve_KrylovSchur_BSE_Gruning; | |
659 | 113 | eps->ops->computevectors = EPSComputeVectors_BSE_Gruning; | |
660 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(DSSetType(eps->ds,DSSVD)); |
661 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(DSSetCompact(eps->ds,PETSC_TRUE)); |
662 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(DSSetExtraRow(eps->ds,PETSC_TRUE)); |
663 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(DSAllocate(eps->ds,eps->ncv+1)); |
664 | break; | ||
665 | 103 | case EPS_KRYLOVSCHUR_BSE_PROJECTEDBSE: | |
666 | 103 | eps->ops->solve = EPSSolve_KrylovSchur_BSE_ProjectedBSE; | |
667 | 103 | eps->ops->computevectors = EPSComputeVectors_BSE_ProjectedBSE; | |
668 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(DSSetType(eps->ds,DSHEP)); |
669 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(DSSetCompact(eps->ds,PETSC_TRUE)); |
670 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(DSSetExtraRow(eps->ds,PETSC_TRUE)); |
671 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(DSAllocate(eps->ds,eps->ncv+1)); |
672 | break; | ||
673 | ✗ | default: SETERRQ(PetscObjectComm((PetscObject)eps),PETSC_ERR_PLIB,"Unexpected error"); | |
674 | } | ||
675 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
50 | PetscFunctionReturn(PETSC_SUCCESS); |
676 | } | ||
677 | |||
678 | 118 | PetscErrorCode EPSSolve_KrylovSchur_BSE_Shao(EPS eps) | |
679 | { | ||
680 | 118 | EPS_KRYLOVSCHUR *ctx = (EPS_KRYLOVSCHUR*)eps->data; | |
681 | 118 | PetscInt i,k,l,ld,nv,nconv=0,nevsave; | |
682 | 118 | Mat H,Q; | |
683 | 118 | BV U,V; | |
684 | 118 | IS is[2]; | |
685 | 118 | PetscReal *a,*b,beta; | |
686 | 118 | PetscBool breakdown=PETSC_FALSE; | |
687 | |||
688 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
118 | PetscFunctionBegin; |
689 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(DSGetLeadingDimension(eps->ds,&ld)); |
690 | |||
691 | /* Extract matrix blocks */ | ||
692 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(STGetMatrix(eps->st,0,&H)); |
693 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(MatNestGetISs(H,is,NULL)); |
694 | |||
695 | /* Get the split bases */ | ||
696 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&U,&V)); |
697 | |||
698 | 118 | nevsave = eps->nev; | |
699 | 118 | eps->nev = (eps->nev+1)/2; | |
700 | 118 | l = 0; | |
701 | |||
702 | /* Restart loop */ | ||
703 | 118 | while (eps->reason == EPS_CONVERGED_ITERATING) { | |
704 | 2376 | eps->its++; | |
705 | |||
706 | /* Compute an nv-step Lanczos factorization */ | ||
707 | 2376 | nv = PetscMin(eps->nconv+eps->mpd,eps->ncv); | |
708 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,eps->nconv+l)); |
709 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(DSGetArrayReal(eps->ds,DS_MAT_T,&a)); |
710 | 2376 | b = a + ld; | |
711 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(EPSBSELanczos_Shao(eps,U,V,a,b,eps->nconv+l,&nv,&breakdown)); |
712 | 2376 | beta = b[nv-1]; | |
713 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(DSRestoreArrayReal(eps->ds,DS_MAT_T,&a)); |
714 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,eps->nconv+l)); |
715 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(DSSetState(eps->ds,l?DS_STATE_RAW:DS_STATE_INTERMEDIATE)); |
716 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(BVSetActiveColumns(eps->V,eps->nconv,nv)); |
717 | |||
718 | /* Solve projected problem */ | ||
719 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(DSSolve(eps->ds,eps->eigr,eps->eigi)); |
720 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(DSSort(eps->ds,eps->eigr,eps->eigi,NULL,NULL,NULL)); |
721 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(DSUpdateExtraRow(eps->ds)); |
722 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(DSSynchronize(eps->ds,eps->eigr,eps->eigi)); |
723 | |||
724 | /* Check convergence */ | ||
725 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
36704 | for (i=0;i<nv;i++) eps->eigr[i] = PetscSqrtReal(PetscRealPart(eps->eigr[i])); |
726 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(EPSKrylovConvergence(eps,PETSC_FALSE,eps->nconv,nv-eps->nconv,beta,0.0,1.0,&k)); |
727 |
14/18✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 8 times.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
|
2376 | EPSSetCtxThreshold(eps,eps->eigr,eps->eigi,k); |
728 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall((*eps->stopping)(eps,eps->its,eps->max_it,k,eps->nev,&eps->reason,eps->stoppingctx)); |
729 | 2376 | nconv = k; | |
730 | |||
731 | /* Update l */ | ||
732 |
4/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
2376 | if (eps->reason != EPS_CONVERGED_ITERATING || breakdown || k==nv) l = 0; |
733 | 2258 | else l = PetscMax(1,(PetscInt)((nv-k)*ctx->keep)); | |
734 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
2376 | if (!ctx->lock && l>0) { l += k; k = 0; } /* non-locking variant: reset no. of converged pairs */ |
735 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
2376 | if (l) PetscCall(PetscInfo(eps,"Preparing to restart keeping l=%" PetscInt_FMT " vectors\n",l)); |
736 | |||
737 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2376 | if (eps->reason == EPS_CONVERGED_ITERATING) { |
738 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
2258 | PetscCheck(!breakdown,PetscObjectComm((PetscObject)eps),PETSC_ERR_CONV_FAILED,"Breakdown in BSE Krylov-Schur (beta=%g)",(double)beta); |
739 | /* Prepare the Rayleigh quotient for restart */ | ||
740 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2258 | PetscCall(DSTruncate(eps->ds,k+l,PETSC_FALSE)); |
741 | } | ||
742 | /* Update the corresponding vectors | ||
743 | U(:,idx) = U*Q(:,idx), V(:,idx) = V*Q(:,idx) */ | ||
744 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(DSGetMat(eps->ds,DS_MAT_Q,&Q)); |
745 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(BVMultInPlace(U,Q,eps->nconv,k+l)); |
746 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(BVMultInPlace(V,Q,eps->nconv,k+l)); |
747 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2376 | PetscCall(DSRestoreMat(eps->ds,DS_MAT_Q,&Q)); |
748 | |||
749 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
|
2376 | if (eps->reason == EPS_CONVERGED_ITERATING && !breakdown) { |
750 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2258 | PetscCall(BVCopyColumn(eps->V,nv,k+l)); |
751 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
2258 | if (eps->stop==EPS_STOP_THRESHOLD && nv-k<5) { /* reallocate */ |
752 | 15 | eps->ncv = eps->mpd+k; | |
753 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&U,&V)); |
754 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(EPSReallocateSolution(eps,eps->ncv+1)); |
755 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&U,&V)); |
756 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
105 | for (i=nv;i<eps->ncv;i++) eps->perm[i] = i; |
757 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(DSReallocate(eps->ds,eps->ncv+1)); |
758 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(DSGetLeadingDimension(eps->ds,&ld)); |
759 | } | ||
760 | } | ||
761 | 2376 | eps->nconv = k; | |
762 |
7/8✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
|
2494 | PetscCall(EPSMonitor(eps,eps->its,nconv,eps->eigr,eps->eigi,eps->errest,nv)); |
763 | } | ||
764 | |||
765 | 118 | eps->nev = nevsave; | |
766 | |||
767 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(DSTruncate(eps->ds,eps->nconv,PETSC_TRUE)); |
768 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
118 | PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&U,&V)); |
769 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
18 | PetscFunctionReturn(PETSC_SUCCESS); |
770 | } | ||
771 | |||
772 | /* | ||
773 | EPSConvergence_Gruning - convergence check based on SVDKrylovConvergence(). | ||
774 | */ | ||
775 | 2332 | static PetscErrorCode EPSConvergence_Gruning(EPS eps,PetscBool getall,PetscInt kini,PetscInt nits,PetscInt *kout) | |
776 | { | ||
777 | 2332 | PetscInt k,marker,ld; | |
778 | 2332 | PetscReal *alpha,*beta,resnorm; | |
779 | 2332 | PetscBool extra; | |
780 | |||
781 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2332 | PetscFunctionBegin; |
782 | 2332 | *kout = 0; | |
783 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSGetLeadingDimension(eps->ds,&ld)); |
784 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSGetExtraRow(eps->ds,&extra)); |
785 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
2332 | PetscCheck(extra,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Only implemented for DS with extra row"); |
786 | 2332 | marker = -1; | |
787 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
2332 | if (eps->trackall) getall = PETSC_TRUE; |
788 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSGetArrayReal(eps->ds,DS_MAT_T,&alpha)); |
789 | 2332 | beta = alpha + ld; | |
790 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
3120 | for (k=kini;k<kini+nits;k++) { |
791 | 3120 | resnorm = PetscAbsReal(beta[k]); | |
792 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3120 | PetscCall((*eps->converged)(eps,eps->eigr[k],eps->eigi[k],resnorm,&eps->errest[k],eps->convergedctx)); |
793 |
3/4✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
3120 | if (marker==-1 && eps->errest[k] >= eps->tol) marker = k; |
794 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
3120 | if (marker!=-1 && !getall) break; |
795 | } | ||
796 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSRestoreArrayReal(eps->ds,DS_MAT_T,&alpha)); |
797 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
2332 | if (marker!=-1) k = marker; |
798 | 2332 | *kout = k; | |
799 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
2332 | PetscFunctionReturn(PETSC_SUCCESS); |
800 | } | ||
801 | |||
802 | 113 | PetscErrorCode EPSSolve_KrylovSchur_BSE_Gruning(EPS eps) | |
803 | { | ||
804 | 113 | EPS_KRYLOVSCHUR *ctx = (EPS_KRYLOVSCHUR*)eps->data; | |
805 | 113 | PetscInt i,k,l,ld,nv,nconv=0,nevsave; | |
806 | 113 | Mat H,Q,Z; | |
807 | 113 | BV U,V,HU,HV; | |
808 | 113 | IS is[2]; | |
809 | 113 | PetscReal *d1,*d2,beta; | |
810 | 113 | PetscBool breakdown=PETSC_FALSE; | |
811 | |||
812 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
113 | PetscFunctionBegin; |
813 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(DSGetLeadingDimension(eps->ds,&ld)); |
814 | |||
815 | /* Extract matrix blocks */ | ||
816 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(STGetMatrix(eps->st,0,&H)); |
817 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(MatNestGetISs(H,is,NULL)); |
818 | |||
819 | /* Get the split bases */ | ||
820 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&U,&V)); |
821 | |||
822 | /* Create HU and HV */ | ||
823 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(BVDuplicate(U,&HU)); |
824 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(BVDuplicate(V,&HV)); |
825 | |||
826 | 113 | nevsave = eps->nev; | |
827 | 113 | eps->nev = (eps->nev+1)/2; | |
828 | 113 | l = 0; | |
829 | |||
830 | /* Restart loop */ | ||
831 | 113 | while (eps->reason == EPS_CONVERGED_ITERATING) { | |
832 | 2332 | eps->its++; | |
833 | |||
834 | /* Compute an nv-step Lanczos factorization */ | ||
835 | 2332 | nv = PetscMin(eps->nconv+eps->mpd,eps->ncv); | |
836 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,eps->nconv+l)); |
837 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSGetArrayReal(eps->ds,DS_MAT_T,&d1)); |
838 | 2332 | d2 = d1 + ld; | |
839 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(EPSBSELanczos_Gruning(eps,U,V,HU,HV,d1,d2,eps->nconv+l,&nv,&breakdown)); |
840 | 2332 | beta = d1[nv-1]; | |
841 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSRestoreArrayReal(eps->ds,DS_MAT_T,&d1)); |
842 | |||
843 | /* Compute SVD */ | ||
844 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,eps->nconv+l)); |
845 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSSVDSetDimensions(eps->ds,nv)); |
846 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSSetState(eps->ds,l?DS_STATE_RAW:DS_STATE_INTERMEDIATE)); |
847 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(BVSetActiveColumns(eps->V,eps->nconv,nv)); |
848 | |||
849 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSSolve(eps->ds,eps->eigr,eps->eigi)); |
850 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSSort(eps->ds,eps->eigr,eps->eigi,NULL,NULL,NULL)); |
851 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSUpdateExtraRow(eps->ds)); |
852 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSSynchronize(eps->ds,eps->eigr,eps->eigi)); |
853 | |||
854 | /* Check convergence */ | ||
855 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(EPSConvergence_Gruning(eps,PETSC_FALSE,eps->nconv,nv-eps->nconv,&k)); |
856 |
14/18✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 8 times.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
|
2332 | EPSSetCtxThreshold(eps,eps->eigr,eps->eigi,k); |
857 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall((*eps->stopping)(eps,eps->its,eps->max_it,k,eps->nev,&eps->reason,eps->stoppingctx)); |
858 | 2332 | nconv = k; | |
859 | |||
860 | /* Update l */ | ||
861 |
4/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
2332 | if (eps->reason != EPS_CONVERGED_ITERATING || breakdown || k==nv) l = 0; |
862 | 2219 | else l = PetscMax(1,(PetscInt)((nv-k)*ctx->keep)); | |
863 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
2332 | if (!ctx->lock && l>0) { l += k; k = 0; } /* non-locking variant: reset no. of converged pairs */ |
864 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
2332 | if (l) PetscCall(PetscInfo(eps,"Preparing to restart keeping l=%" PetscInt_FMT " vectors\n",l)); |
865 | |||
866 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2332 | if (eps->reason == EPS_CONVERGED_ITERATING) { |
867 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
2219 | PetscCheck(!breakdown,PetscObjectComm((PetscObject)eps),PETSC_ERR_CONV_FAILED,"Breakdown in BSE Krylov-Schur (beta=%g)",(double)beta); |
868 | /* Prepare the Rayleigh quotient for restart */ | ||
869 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2219 | PetscCall(DSTruncate(eps->ds,k+l,PETSC_FALSE)); |
870 | } | ||
871 | /* Update the corresponding vectors | ||
872 | U(:,idx) = U*Q(:,idx), V(:,idx) = V*Z(:,idx) */ | ||
873 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSGetMat(eps->ds,DS_MAT_U,&Q)); |
874 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSGetMat(eps->ds,DS_MAT_V,&Z)); |
875 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(BVMultInPlace(U,Z,eps->nconv,k+l)); |
876 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(BVMultInPlace(V,Q,eps->nconv,k+l)); |
877 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(BVMultInPlace(HU,Z,eps->nconv,k+l)); |
878 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(BVMultInPlace(HV,Q,eps->nconv,k+l)); |
879 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSRestoreMat(eps->ds,DS_MAT_U,&Q)); |
880 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSRestoreMat(eps->ds,DS_MAT_V,&Z)); |
881 | |||
882 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
|
2332 | if (eps->reason == EPS_CONVERGED_ITERATING && !breakdown) { |
883 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2219 | PetscCall(BVCopyColumn(U,nv,k+l)); |
884 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2219 | PetscCall(BVCopyColumn(HU,nv,k+l)); |
885 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
2219 | if (eps->stop==EPS_STOP_THRESHOLD && nv-k<5) { /* reallocate */ |
886 | 15 | eps->ncv = eps->mpd+k; | |
887 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&U,&V)); |
888 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(EPSReallocateSolution(eps,eps->ncv+1)); |
889 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&U,&V)); |
890 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(BVResize(HU,eps->ncv+1,PETSC_TRUE)); |
891 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(BVResize(HV,eps->ncv+1,PETSC_TRUE)); |
892 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
105 | for (i=nv;i<eps->ncv;i++) { eps->perm[i] = i; eps->eigi[i] = 0.0; } |
893 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(DSReallocate(eps->ds,eps->ncv+1)); |
894 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(DSGetLeadingDimension(eps->ds,&ld)); |
895 | } | ||
896 | } | ||
897 | 2332 | eps->nconv = k; | |
898 |
7/8✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
|
2445 | PetscCall(EPSMonitor(eps,eps->its,nconv,eps->eigr,eps->eigi,eps->errest,nv)); |
899 | } | ||
900 | |||
901 | 113 | eps->nev = nevsave; | |
902 | |||
903 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(DSTruncate(eps->ds,eps->nconv,PETSC_TRUE)); |
904 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&U,&V)); |
905 | |||
906 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(BVDestroy(&HU)); |
907 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113 | PetscCall(BVDestroy(&HV)); |
908 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
17 | PetscFunctionReturn(PETSC_SUCCESS); |
909 | } | ||
910 | |||
911 | 103 | PetscErrorCode EPSSolve_KrylovSchur_BSE_ProjectedBSE(EPS eps) | |
912 | { | ||
913 | 103 | EPS_KRYLOVSCHUR *ctx = (EPS_KRYLOVSCHUR*)eps->data; | |
914 | 103 | PetscInt i,k,l,ld,nv,nconv=0,nevsave; | |
915 | 103 | Mat H,Q; | |
916 | 103 | Vec v; | |
917 | 103 | BV U,V; | |
918 | 103 | IS is[2]; | |
919 | 103 | PetscReal *a,*b,beta; | |
920 | 103 | PetscBool breakdown=PETSC_FALSE; | |
921 | |||
922 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
103 | PetscFunctionBegin; |
923 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(DSGetLeadingDimension(eps->ds,&ld)); |
924 | |||
925 | /* Extract matrix blocks */ | ||
926 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(STGetMatrix(eps->st,0,&H)); |
927 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(MatNestGetISs(H,is,NULL)); |
928 | |||
929 | /* Get the split bases */ | ||
930 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&U,&V)); |
931 | |||
932 | /* Vector v */ | ||
933 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(BVCreateVec(V,&v)); |
934 | |||
935 | 103 | nevsave = eps->nev; | |
936 | 103 | eps->nev = (eps->nev+1)/2; | |
937 | 103 | l = 0; | |
938 | |||
939 | /* Restart loop */ | ||
940 | 103 | while (eps->reason == EPS_CONVERGED_ITERATING) { | |
941 | 2332 | eps->its++; | |
942 | |||
943 | /* Compute an nv-step Lanczos factorization */ | ||
944 | 2332 | nv = PetscMin(eps->nconv+eps->mpd,eps->ncv); | |
945 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,eps->nconv+l)); |
946 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSGetArrayReal(eps->ds,DS_MAT_T,&a)); |
947 | 2332 | b = a + ld; | |
948 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(EPSBSELanczos_ProjectedBSE(eps,U,V,v,a,b,eps->nconv+l,&nv,&breakdown)); |
949 | 2332 | beta = b[nv-1]; | |
950 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSRestoreArrayReal(eps->ds,DS_MAT_T,&a)); |
951 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,eps->nconv+l)); |
952 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSSetState(eps->ds,l?DS_STATE_RAW:DS_STATE_INTERMEDIATE)); |
953 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(BVSetActiveColumns(eps->V,eps->nconv,nv)); |
954 | |||
955 | /* Solve projected problem */ | ||
956 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSSolve(eps->ds,eps->eigr,eps->eigi)); |
957 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSSort(eps->ds,eps->eigr,eps->eigi,NULL,NULL,NULL)); |
958 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSUpdateExtraRow(eps->ds)); |
959 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSSynchronize(eps->ds,eps->eigr,eps->eigi)); |
960 | |||
961 | /* Check convergence */ | ||
962 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
36084 | for (i=0;i<nv;i++) eps->eigr[i] = PetscSqrtReal(PetscRealPart(eps->eigr[i])); |
963 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(EPSKrylovConvergence(eps,PETSC_FALSE,eps->nconv,nv-eps->nconv,beta,0.0,1.0,&k)); |
964 |
14/18✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 8 times.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
|
2332 | EPSSetCtxThreshold(eps,eps->eigr,eps->eigi,k); |
965 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall((*eps->stopping)(eps,eps->its,eps->max_it,k,eps->nev,&eps->reason,eps->stoppingctx)); |
966 | 2332 | nconv = k; | |
967 | |||
968 | /* Update l */ | ||
969 |
4/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
2332 | if (eps->reason != EPS_CONVERGED_ITERATING || breakdown || k==nv) l = 0; |
970 | 2229 | else l = PetscMax(1,(PetscInt)((nv-k)*ctx->keep)); | |
971 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
2332 | if (!ctx->lock && l>0) { l += k; k = 0; } /* non-locking variant: reset no. of converged pairs */ |
972 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
2332 | if (l) PetscCall(PetscInfo(eps,"Preparing to restart keeping l=%" PetscInt_FMT " vectors\n",l)); |
973 | |||
974 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2332 | if (eps->reason == EPS_CONVERGED_ITERATING) { |
975 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
2229 | PetscCheck(!breakdown,PetscObjectComm((PetscObject)eps),PETSC_ERR_CONV_FAILED,"Breakdown in BSE Krylov-Schur (beta=%g)",(double)beta); |
976 | /* Prepare the Rayleigh quotient for restart */ | ||
977 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2229 | PetscCall(DSTruncate(eps->ds,k+l,PETSC_FALSE)); |
978 | } | ||
979 | /* Update the corresponding vectors | ||
980 | U(:,idx) = U*Q(:,idx), V(:,idx) = V*Q(:,idx) */ | ||
981 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSGetMat(eps->ds,DS_MAT_Q,&Q)); |
982 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(BVMultInPlace(U,Q,eps->nconv,k+l)); |
983 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(BVMultInPlace(V,Q,eps->nconv,k+l)); |
984 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2332 | PetscCall(DSRestoreMat(eps->ds,DS_MAT_Q,&Q)); |
985 | |||
986 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
|
2332 | if (eps->reason == EPS_CONVERGED_ITERATING && !breakdown) { |
987 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2229 | PetscCall(BVCopyColumn(eps->V,nv,k+l)); |
988 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
2229 | if (eps->stop==EPS_STOP_THRESHOLD && nv-k<5) { /* reallocate */ |
989 | 15 | eps->ncv = eps->mpd+k; | |
990 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&U,&V)); |
991 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(EPSReallocateSolution(eps,eps->ncv+1)); |
992 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&U,&V)); |
993 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
105 | for (i=nv;i<eps->ncv;i++) eps->perm[i] = i; |
994 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(DSReallocate(eps->ds,eps->ncv+1)); |
995 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15 | PetscCall(DSGetLeadingDimension(eps->ds,&ld)); |
996 | } | ||
997 | } | ||
998 | 2332 | eps->nconv = k; | |
999 |
7/8✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
|
2435 | PetscCall(EPSMonitor(eps,eps->its,nconv,eps->eigr,eps->eigi,eps->errest,nv)); |
1000 | } | ||
1001 | |||
1002 | 103 | eps->nev = nevsave; | |
1003 | |||
1004 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(DSTruncate(eps->ds,eps->nconv,PETSC_TRUE)); |
1005 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&U,&V)); |
1006 | |||
1007 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
103 | PetscCall(VecDestroy(&v)); |
1008 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
15 | PetscFunctionReturn(PETSC_SUCCESS); |
1009 | } | ||
1010 |