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: "lanczos" | ||
12 | |||
13 | Method: Explicitly Restarted Symmetric/Hermitian Lanczos | ||
14 | |||
15 | Algorithm: | ||
16 | |||
17 | Lanczos method for symmetric (Hermitian) problems, with explicit | ||
18 | restart and deflation. Several reorthogonalization strategies can | ||
19 | be selected. | ||
20 | |||
21 | References: | ||
22 | |||
23 | [1] "Lanczos Methods in SLEPc", SLEPc Technical Report STR-5, | ||
24 | available at https://slepc.upv.es. | ||
25 | */ | ||
26 | |||
27 | #include <slepc/private/epsimpl.h> /*I "slepceps.h" I*/ | ||
28 | #include <slepcblaslapack.h> | ||
29 | |||
30 | typedef struct { | ||
31 | EPSLanczosReorthogType reorthog; /* user-provided reorthogonalization parameter */ | ||
32 | PetscInt allocsize; /* number of columns of work BV's allocated at setup */ | ||
33 | BV AV; /* work BV used in selective reorthogonalization */ | ||
34 | } EPS_LANCZOS; | ||
35 | |||
36 | 364 | static PetscErrorCode EPSSetUp_Lanczos(EPS eps) | |
37 | { | ||
38 | 364 | EPS_LANCZOS *lanczos = (EPS_LANCZOS*)eps->data; | |
39 | 364 | BVOrthogRefineType refine; | |
40 | 364 | BVOrthogBlockType btype; | |
41 | 364 | PetscReal eta; | |
42 | |||
43 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
364 | PetscFunctionBegin; |
44 |
4/10✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
364 | EPSCheckHermitianDefinite(eps); |
45 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
364 | EPSCheckNotStructured(eps); |
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.
|
364 | PetscCall(EPSSetDimensions_Default(eps,&eps->nev,&eps->ncv,&eps->mpd)); |
47 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
364 | 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"); |
48 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
364 | if (eps->max_it==PETSC_DETERMINE) eps->max_it = PetscMax(100,2*eps->n/eps->ncv); |
49 |
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.
|
364 | if (!eps->which) PetscCall(EPSSetWhichEigenpairs_Default(eps)); |
50 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
364 | PetscCheck(eps->which!=EPS_ALL,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"This solver does not support computing all eigenvalues"); |
51 |
9/22✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 10 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ 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.
|
364 | EPSCheckUnsupported(eps,EPS_FEATURE_ARBITRARY | EPS_FEATURE_REGION | EPS_FEATURE_EXTRACTION | EPS_FEATURE_THRESHOLD); |
52 |
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.
|
364 | EPSCheckIgnored(eps,EPS_FEATURE_BALANCE); |
53 | |||
54 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
364 | PetscCheck(lanczos->reorthog!=(EPSLanczosReorthogType)-1,PetscObjectComm((PetscObject)eps),PETSC_ERR_USER_INPUT,"You should explicitly provide the reorthogonalization type, e.g., -eps_lanczos_reorthog local. Note that the EPSLANCZOS solver is *NOT RECOMMENDED* for general use, because it uses explicit restart which typically has slow convergence. The recommended solver is EPSKRYLOVSCHUR (the default), which implements Lanczos with thick restart in the case of symmetric/Hermitian problems"); |
55 | |||
56 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
364 | PetscCall(EPSAllocateSolution(eps,1)); |
57 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
364 | PetscCall(EPS_SetInnerProduct(eps)); |
58 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
364 | if (lanczos->reorthog != EPS_LANCZOS_REORTHOG_FULL) { |
59 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
290 | PetscCall(BVGetOrthogonalization(eps->V,NULL,&refine,&eta,&btype)); |
60 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
290 | PetscCall(BVSetOrthogonalization(eps->V,BV_ORTHOG_MGS,refine,eta,btype)); |
61 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
290 | PetscCall(PetscInfo(eps,"Switching to MGS orthogonalization\n")); |
62 | } | ||
63 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
364 | if (lanczos->reorthog == EPS_LANCZOS_REORTHOG_SELECTIVE) { |
64 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
30 | if (!lanczos->allocsize) { |
65 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(BVDuplicate(eps->V,&lanczos->AV)); |
66 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(BVGetSizes(lanczos->AV,NULL,NULL,&lanczos->allocsize)); |
67 | } else { /* make sure V and AV have the same size */ | ||
68 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
20 | PetscCall(BVGetSizes(eps->V,NULL,NULL,&lanczos->allocsize)); |
69 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
20 | PetscCall(BVResize(lanczos->AV,lanczos->allocsize,PETSC_FALSE)); |
70 | } | ||
71 | } | ||
72 | |||
73 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
364 | PetscCall(DSSetType(eps->ds,DSHEP)); |
74 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
364 | PetscCall(DSSetCompact(eps->ds,PETSC_TRUE)); |
75 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
364 | PetscCall(DSAllocate(eps->ds,eps->ncv+1)); |
76 |
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.
|
364 | if (lanczos->reorthog == EPS_LANCZOS_REORTHOG_LOCAL) PetscCall(EPSSetWorkVecs(eps,1)); |
77 |
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.
|
72 | PetscFunctionReturn(PETSC_SUCCESS); |
78 | } | ||
79 | |||
80 | /* | ||
81 | EPSLocalLanczos - Local reorthogonalization. | ||
82 | |||
83 | This is the simplest variant. At each Lanczos step, the corresponding Lanczos vector | ||
84 | is orthogonalized with respect to the two previous Lanczos vectors, according to | ||
85 | the three term Lanczos recurrence. WARNING: This variant does not track the loss of | ||
86 | orthogonality that occurs in finite-precision arithmetic and, therefore, the | ||
87 | generated vectors are not guaranteed to be (semi-)orthogonal. | ||
88 | */ | ||
89 | 5204 | static PetscErrorCode EPSLocalLanczos(EPS eps,PetscReal *alpha,PetscReal *beta,PetscInt k,PetscInt *M,PetscBool *breakdown) | |
90 | { | ||
91 | 5204 | PetscInt i,j,m = *M; | |
92 | 5204 | Mat Op; | |
93 | 5204 | PetscBool *which,lwhich[100]; | |
94 | 5204 | PetscScalar *hwork,lhwork[100]; | |
95 | |||
96 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
5204 | PetscFunctionBegin; |
97 |
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.
|
5204 | if (m > 100) PetscCall(PetscMalloc2(m,&which,m,&hwork)); |
98 | else { | ||
99 | 5204 | which = lwhich; | |
100 | 5204 | hwork = lhwork; | |
101 | } | ||
102 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
18198 | for (i=0;i<k;i++) which[i] = PETSC_TRUE; |
103 | |||
104 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5204 | PetscCall(BVSetActiveColumns(eps->V,0,m)); |
105 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5204 | PetscCall(STGetOperator(eps->st,&Op)); |
106 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
75639 | for (j=k;j<m;j++) { |
107 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
70435 | PetscCall(BVMatMultColumn(eps->V,Op,j)); |
108 | 70435 | which[j] = PETSC_TRUE; | |
109 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
70435 | if (j-2>=k) which[j-2] = PETSC_FALSE; |
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.
|
70435 | PetscCall(BVOrthogonalizeSomeColumn(eps->V,j+1,which,hwork,beta+j,breakdown)); |
111 | 70435 | alpha[j] = PetscRealPart(hwork[j]); | |
112 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
70435 | if (PetscUnlikely(*breakdown)) { |
113 | ✗ | *M = j+1; | |
114 | ✗ | break; | |
115 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
70435 | } else PetscCall(BVScaleColumn(eps->V,j+1,1/beta[j])); |
116 | } | ||
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.
|
5204 | PetscCall(STRestoreOperator(eps->st,&Op)); |
118 |
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.
|
5204 | if (m > 100) PetscCall(PetscFree2(which,hwork)); |
119 |
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.
|
1046 | PetscFunctionReturn(PETSC_SUCCESS); |
120 | } | ||
121 | |||
122 | /* | ||
123 | DenseTridiagonal - Solves a real tridiagonal Hermitian Eigenvalue Problem. | ||
124 | |||
125 | Input Parameters: | ||
126 | + n - dimension of the eigenproblem | ||
127 | . D - pointer to the array containing the diagonal elements | ||
128 | - E - pointer to the array containing the off-diagonal elements | ||
129 | |||
130 | Output Parameters: | ||
131 | + w - pointer to the array to store the computed eigenvalues | ||
132 | - V - pointer to the array to store the eigenvectors | ||
133 | |||
134 | Notes: | ||
135 | If V is NULL then the eigenvectors are not computed. | ||
136 | |||
137 | This routine use LAPACK routines xSTEVR. | ||
138 | */ | ||
139 | 6745 | static PetscErrorCode DenseTridiagonal(PetscInt n_,PetscReal *D,PetscReal *E,PetscReal *w,PetscScalar *V) | |
140 | { | ||
141 | 6745 | PetscReal abstol = 0.0,vl,vu,*work; | |
142 | 6745 | PetscBLASInt il,iu,m,*isuppz,n,lwork,*iwork,liwork,info; | |
143 | 6745 | const char *jobz; | |
144 | #if defined(PETSC_USE_COMPLEX) | ||
145 | 3380 | PetscInt i,j; | |
146 | 3380 | PetscReal *VV=NULL; | |
147 | #endif | ||
148 | |||
149 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
6745 | PetscFunctionBegin; |
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.
|
6745 | PetscCall(PetscBLASIntCast(n_,&n)); |
151 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6745 | PetscCall(PetscBLASIntCast(20*n_,&lwork)); |
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.
|
6745 | PetscCall(PetscBLASIntCast(10*n_,&liwork)); |
153 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
6745 | if (V) { |
154 | 3380 | jobz = "V"; | |
155 | #if defined(PETSC_USE_COMPLEX) | ||
156 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
3380 | PetscCall(PetscMalloc1(n*n,&VV)); |
157 | #endif | ||
158 | ✗ | } else jobz = "N"; | |
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.
|
6745 | PetscCall(PetscMalloc3(2*n,&isuppz,lwork,&work,liwork,&iwork)); |
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.
|
6745 | PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); |
161 | #if defined(PETSC_USE_COMPLEX) | ||
162 |
10/20✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
3380 | PetscCallBLAS("LAPACKstevr",LAPACKstevr_(jobz,"A",&n,D,E,&vl,&vu,&il,&iu,&abstol,&m,w,VV,&n,isuppz,work,&lwork,iwork,&liwork,&info)); |
163 | #else | ||
164 |
10/20✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
3365 | PetscCallBLAS("LAPACKstevr",LAPACKstevr_(jobz,"A",&n,D,E,&vl,&vu,&il,&iu,&abstol,&m,w,V,&n,isuppz,work,&lwork,iwork,&liwork,&info)); |
165 | #endif | ||
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.
|
6745 | PetscCall(PetscFPTrapPop()); |
167 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
6745 | SlepcCheckLapackInfo("stevr",info); |
168 | #if defined(PETSC_USE_COMPLEX) | ||
169 |
1/2✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
|
3380 | if (V) { |
170 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
35265 | for (i=0;i<n;i++) |
171 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
423810 | for (j=0;j<n;j++) |
172 | 391925 | V[i*n+j] = VV[i*n+j]; | |
173 |
5/8✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
|
3380 | PetscCall(PetscFree(VV)); |
174 | } | ||
175 | #endif | ||
176 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6745 | PetscCall(PetscFree3(isuppz,work,iwork)); |
177 |
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.
|
1349 | PetscFunctionReturn(PETSC_SUCCESS); |
178 | } | ||
179 | |||
180 | /* | ||
181 | EPSSelectiveLanczos - Selective reorthogonalization. | ||
182 | */ | ||
183 | 380 | static PetscErrorCode EPSSelectiveLanczos(EPS eps,PetscReal *alpha,PetscReal *beta,PetscInt k,PetscInt *M,PetscBool *breakdown,PetscReal anorm) | |
184 | { | ||
185 | 380 | EPS_LANCZOS *lanczos = (EPS_LANCZOS*)eps->data; | |
186 | 380 | PetscInt i,j,m = *M,n,nritz=0,nritzo; | |
187 | 380 | Vec vj1,av; | |
188 | 380 | Mat Op; | |
189 | 380 | PetscReal *d,*e,*ritz,norm; | |
190 | 380 | PetscScalar *Y,*hwork; | |
191 | 380 | PetscBool *which; | |
192 | |||
193 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
380 | PetscFunctionBegin; |
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.
|
380 | PetscCall(PetscCalloc6(m+1,&d,m,&e,m,&ritz,m*m,&Y,m,&which,m,&hwork)); |
195 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
855 | for (i=0;i<k;i++) which[i] = PETSC_TRUE; |
196 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
380 | PetscCall(STGetOperator(eps->st,&Op)); |
197 | |||
198 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
7125 | for (j=k;j<m;j++) { |
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.
|
6745 | PetscCall(BVSetActiveColumns(eps->V,0,m)); |
200 | |||
201 | /* Lanczos step */ | ||
202 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6745 | PetscCall(BVMatMultColumn(eps->V,Op,j)); |
203 | 6745 | which[j] = PETSC_TRUE; | |
204 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
6745 | if (j-2>=k) which[j-2] = PETSC_FALSE; |
205 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6745 | PetscCall(BVOrthogonalizeSomeColumn(eps->V,j+1,which,hwork,&norm,breakdown)); |
206 | 6745 | alpha[j] = PetscRealPart(hwork[j]); | |
207 | 6745 | beta[j] = norm; | |
208 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
6745 | if (PetscUnlikely(*breakdown)) { |
209 | ✗ | *M = j+1; | |
210 | ✗ | break; | |
211 | } | ||
212 | |||
213 | /* Compute eigenvalues and eigenvectors Y of the tridiagonal block */ | ||
214 | 6745 | n = j-k+1; | |
215 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
70235 | for (i=0;i<n;i++) { |
216 | 63490 | d[i] = alpha[i+k]; | |
217 | 63490 | e[i] = beta[i+k]; | |
218 | } | ||
219 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6745 | PetscCall(DenseTridiagonal(n,d,e,ritz,Y)); |
220 | |||
221 | /* Estimate ||A|| */ | ||
222 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
70235 | for (i=0;i<n;i++) |
223 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
63490 | if (PetscAbsReal(ritz[i]) > anorm) anorm = PetscAbsReal(ritz[i]); |
224 | |||
225 | /* Compute nearly converged Ritz vectors */ | ||
226 | nritzo = 0; | ||
227 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
70235 | for (i=0;i<n;i++) { |
228 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
63490 | if (norm*PetscAbsScalar(Y[i*n+n-1]) < PETSC_SQRT_MACHINE_EPSILON*anorm) nritzo++; |
229 | } | ||
230 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
6745 | if (nritzo>nritz) { |
231 | nritz = 0; | ||
232 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1780 | for (i=0;i<n;i++) { |
233 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1555 | if (norm*PetscAbsScalar(Y[i*n+n-1]) < PETSC_SQRT_MACHINE_EPSILON*anorm) { |
234 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
345 | PetscCall(BVSetActiveColumns(eps->V,k,k+n)); |
235 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
345 | PetscCall(BVGetColumn(lanczos->AV,nritz,&av)); |
236 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
345 | PetscCall(BVMultVec(eps->V,1.0,0.0,av,Y+i*n)); |
237 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
345 | PetscCall(BVRestoreColumn(lanczos->AV,nritz,&av)); |
238 | 345 | nritz++; | |
239 | } | ||
240 | } | ||
241 | } | ||
242 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
6745 | if (nritz > 0) { |
243 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2510 | PetscCall(BVGetColumn(eps->V,j+1,&vj1)); |
244 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2510 | PetscCall(BVSetActiveColumns(lanczos->AV,0,nritz)); |
245 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2510 | PetscCall(BVOrthogonalizeVec(lanczos->AV,vj1,hwork,&norm,breakdown)); |
246 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2510 | PetscCall(BVRestoreColumn(eps->V,j+1,&vj1)); |
247 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
2510 | if (PetscUnlikely(*breakdown)) { |
248 | ✗ | *M = j+1; | |
249 | ✗ | break; | |
250 | } | ||
251 | } | ||
252 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6745 | PetscCall(BVScaleColumn(eps->V,j+1,1.0/norm)); |
253 | } | ||
254 | |||
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.
|
380 | PetscCall(STRestoreOperator(eps->st,&Op)); |
256 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
380 | PetscCall(PetscFree6(d,e,ritz,Y,which,hwork)); |
257 |
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.
|
76 | PetscFunctionReturn(PETSC_SUCCESS); |
258 | } | ||
259 | |||
260 | 8050 | static void update_omega(PetscReal *omega,PetscReal *omega_old,PetscInt j,PetscReal *alpha,PetscReal *beta,PetscReal eps1,PetscReal anorm) | |
261 | { | ||
262 | 8050 | PetscInt k; | |
263 | 8050 | PetscReal T,binv; | |
264 | |||
265 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
8050 | PetscFunctionBegin; |
266 | /* Estimate of contribution to roundoff errors from A*v | ||
267 | fl(A*v) = A*v + f, | ||
268 | where ||f|| \approx eps1*||A||. | ||
269 | For a full matrix A, a rule-of-thumb estimate is eps1 = sqrt(n)*eps */ | ||
270 | 8050 | T = eps1*anorm; | |
271 | 8050 | binv = 1.0/beta[j+1]; | |
272 | |||
273 | /* Update omega(1) using omega(0)==0 */ | ||
274 | 8050 | omega_old[0]= beta[1]*omega[1] + (alpha[0]-alpha[j])*omega[0] - beta[j]*omega_old[0]; | |
275 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
8050 | if (omega_old[0] > 0) omega_old[0] = binv*(omega_old[0] + T); |
276 | 4835 | else omega_old[0] = binv*(omega_old[0] - T); | |
277 | |||
278 | /* Update remaining components */ | ||
279 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
73230 | for (k=1;k<j-1;k++) { |
280 | 65180 | omega_old[k] = beta[k+1]*omega[k+1] + (alpha[k]-alpha[j])*omega[k] + beta[k]*omega[k-1] - beta[j]*omega_old[k]; | |
281 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
65180 | if (omega_old[k] > 0) omega_old[k] = binv*(omega_old[k] + T); |
282 | 33928 | else omega_old[k] = binv*(omega_old[k] - T); | |
283 | } | ||
284 | 8050 | omega_old[j-1] = binv*T; | |
285 | |||
286 | /* Swap omega and omega_old */ | ||
287 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
89150 | for (k=0;k<j;k++) { |
288 | 81100 | omega[k] = omega_old[k]; | |
289 | 81100 | omega_old[k] = omega[k]; | |
290 | } | ||
291 | 8050 | omega[j] = eps1; | |
292 |
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.
|
8050 | PetscFunctionReturnVoid(); |
293 | } | ||
294 | |||
295 | 505 | static void compute_int(PetscBool *which,PetscReal *mu,PetscInt j,PetscReal delta,PetscReal eta) | |
296 | { | ||
297 | 505 | PetscInt i,k,maxpos; | |
298 | 505 | PetscReal max; | |
299 | 505 | PetscBool found; | |
300 | |||
301 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
505 | PetscFunctionBegin; |
302 | /* initialize which */ | ||
303 | 505 | found = PETSC_FALSE; | |
304 | 505 | maxpos = 0; | |
305 | 505 | max = 0.0; | |
306 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
7990 | for (i=0;i<j;i++) { |
307 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
7485 | if (PetscAbsReal(mu[i]) >= delta) { |
308 | 1820 | which[i] = PETSC_TRUE; | |
309 | 1820 | found = PETSC_TRUE; | |
310 | 5665 | } else which[i] = PETSC_FALSE; | |
311 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
7485 | if (PetscAbsReal(mu[i]) > max) { |
312 | 830 | maxpos = i; | |
313 | 830 | max = PetscAbsReal(mu[i]); | |
314 | } | ||
315 | } | ||
316 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
505 | if (!found) which[maxpos] = PETSC_TRUE; |
317 | |||
318 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
7990 | for (i=0;i<j;i++) { |
319 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
7485 | if (which[i]) { |
320 | /* find left interval */ | ||
321 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
6560 | for (k=i;k>=0;k--) { |
322 |
2/4✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
|
6560 | if (PetscAbsReal(mu[k])<eta || which[k]) break; |
323 | ✗ | else which[k] = PETSC_TRUE; | |
324 | } | ||
325 | /* find right interval */ | ||
326 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
11300 | for (k=i+1;k<j;k++) { |
327 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
10980 | if (PetscAbsReal(mu[k])<eta || which[k]) break; |
328 | 4740 | else which[k] = PETSC_TRUE; | |
329 | } | ||
330 | } | ||
331 | } | ||
332 |
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.
|
505 | PetscFunctionReturnVoid(); |
333 | } | ||
334 | |||
335 | /* | ||
336 | EPSPartialLanczos - Partial reorthogonalization. | ||
337 | */ | ||
338 | 760 | static PetscErrorCode EPSPartialLanczos(EPS eps,PetscReal *alpha,PetscReal *beta,PetscInt k,PetscInt *M,PetscBool *breakdown,PetscReal anorm) | |
339 | { | ||
340 | 760 | EPS_LANCZOS *lanczos = (EPS_LANCZOS*)eps->data; | |
341 | 760 | PetscInt i,j,m = *M; | |
342 | 760 | Mat Op; | |
343 | 760 | PetscReal norm,*omega,lomega[100],*omega_old,lomega_old[100],eps1,delta,eta; | |
344 | 760 | PetscBool *which,lwhich[100],*which2,lwhich2[100]; | |
345 | 760 | PetscBool reorth = PETSC_FALSE,force_reorth = PETSC_FALSE; | |
346 | 760 | PetscBool fro = PETSC_FALSE,estimate_anorm = PETSC_FALSE; | |
347 | 760 | PetscScalar *hwork,lhwork[100]; | |
348 | |||
349 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
760 | PetscFunctionBegin; |
350 |
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.
|
760 | if (m>100) PetscCall(PetscMalloc5(m,&omega,m,&omega_old,m,&which,m,&which2,m,&hwork)); |
351 | else { | ||
352 | 760 | omega = lomega; | |
353 | 760 | omega_old = lomega_old; | |
354 | 760 | which = lwhich; | |
355 | 760 | which2 = lwhich2; | |
356 | 760 | hwork = lhwork; | |
357 | } | ||
358 | |||
359 | 760 | eps1 = PetscSqrtReal((PetscReal)eps->n)*PETSC_MACHINE_EPSILON/2; | |
360 | 760 | delta = PETSC_SQRT_MACHINE_EPSILON/PetscSqrtReal((PetscReal)eps->ncv); | |
361 | 760 | eta = PetscPowReal(PETSC_MACHINE_EPSILON,3.0/4.0)/PetscSqrtReal((PetscReal)eps->ncv); | |
362 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
760 | if (anorm < 0.0) { |
363 | 60 | anorm = 1.0; | |
364 | 60 | estimate_anorm = PETSC_TRUE; | |
365 | } | ||
366 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
76760 | for (i=0;i<PetscMax(100,m);i++) omega[i] = omega_old[i] = 0.0; |
367 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1710 | for (i=0;i<k;i++) which[i] = PETSC_TRUE; |
368 | |||
369 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
760 | PetscCall(BVSetActiveColumns(eps->V,0,m)); |
370 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
760 | PetscCall(STGetOperator(eps->st,&Op)); |
371 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
14250 | for (j=k;j<m;j++) { |
372 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13490 | PetscCall(BVMatMultColumn(eps->V,Op,j)); |
373 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
13490 | if (fro) { |
374 | /* Lanczos step with full reorthogonalization */ | ||
375 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
4680 | PetscCall(BVOrthogonalizeColumn(eps->V,j+1,hwork,&norm,breakdown)); |
376 | 4680 | alpha[j] = PetscRealPart(hwork[j]); | |
377 | } else { | ||
378 | /* Lanczos step */ | ||
379 | 8810 | which[j] = PETSC_TRUE; | |
380 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
8810 | if (j-2>=k) which[j-2] = PETSC_FALSE; |
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.
|
8810 | PetscCall(BVOrthogonalizeSomeColumn(eps->V,j+1,which,hwork,&norm,breakdown)); |
382 | 8810 | alpha[j] = PetscRealPart(hwork[j]); | |
383 | 8810 | beta[j] = norm; | |
384 | |||
385 | /* Estimate ||A|| if needed */ | ||
386 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
8810 | if (estimate_anorm) { |
387 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
1140 | if (j>k) anorm = PetscMax(anorm,PetscAbsReal(alpha[j])+norm+beta[j-1]); |
388 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
60 | else anorm = PetscMax(anorm,PetscAbsReal(alpha[j])+norm); |
389 | } | ||
390 | |||
391 | /* Check if reorthogonalization is needed */ | ||
392 | 8810 | reorth = PETSC_FALSE; | |
393 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
8810 | if (j>k) { |
394 | 8050 | update_omega(omega,omega_old,j,alpha,beta-1,eps1,anorm); | |
395 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
87950 | for (i=0;i<j-k;i++) { |
396 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
71850 | if (PetscAbsReal(omega[i]) > delta) reorth = PETSC_TRUE; |
397 | } | ||
398 | } | ||
399 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
8810 | if (reorth || force_reorth) { |
400 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2940 | for (i=0;i<k;i++) which2[i] = PETSC_FALSE; |
401 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
27790 | for (i=k;i<=j;i++) which2[i] = PETSC_TRUE; |
402 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1660 | if (lanczos->reorthog == EPS_LANCZOS_REORTHOG_PERIODIC) { |
403 | /* Periodic reorthogonalization */ | ||
404 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
820 | if (force_reorth) force_reorth = PETSC_FALSE; |
405 | 485 | else force_reorth = PETSC_TRUE; | |
406 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
12880 | for (i=0;i<j-k;i++) omega[i] = eps1; |
407 | } else { | ||
408 | /* Partial reorthogonalization */ | ||
409 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
840 | if (force_reorth) force_reorth = PETSC_FALSE; |
410 | else { | ||
411 | 505 | force_reorth = PETSC_TRUE; | |
412 | 505 | compute_int(which2+k,omega,j-k,delta,eta); | |
413 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
8495 | for (i=0;i<j-k;i++) { |
414 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
7485 | if (which2[i+k]) omega[i] = eps1; |
415 | } | ||
416 | } | ||
417 | } | ||
418 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1660 | PetscCall(BVOrthogonalizeSomeColumn(eps->V,j+1,which2,hwork,&norm,breakdown)); |
419 | } | ||
420 | } | ||
421 | |||
422 |
2/4✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
|
13490 | if (PetscUnlikely(*breakdown || norm < eps->n*anorm*PETSC_MACHINE_EPSILON)) { |
423 | ✗ | *M = j+1; | |
424 | ✗ | break; | |
425 | } | ||
426 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
13490 | if (!fro && norm*delta < anorm*eps1) { |
427 | 280 | fro = PETSC_TRUE; | |
428 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
280 | PetscCall(PetscInfo(eps,"Switching to full reorthogonalization at iteration %" PetscInt_FMT "\n",eps->its)); |
429 | } | ||
430 | 13490 | beta[j] = norm; | |
431 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
13490 | PetscCall(BVScaleColumn(eps->V,j+1,1.0/norm)); |
432 | } | ||
433 | |||
434 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
760 | PetscCall(STRestoreOperator(eps->st,&Op)); |
435 |
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.
|
760 | if (m>100) PetscCall(PetscFree5(omega,omega_old,which,which2,hwork)); |
436 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
152 | PetscFunctionReturn(PETSC_SUCCESS); |
437 | } | ||
438 | |||
439 | /* | ||
440 | EPSBasicLanczos - Computes an m-step Lanczos factorization. The first k | ||
441 | columns are assumed to be locked and therefore they are not modified. On | ||
442 | exit, the following relation is satisfied: | ||
443 | |||
444 | OP * V - V * T = f * e_m^T | ||
445 | |||
446 | where the columns of V are the Lanczos vectors, T is a tridiagonal matrix, | ||
447 | f is the residual vector and e_m is the m-th vector of the canonical basis. | ||
448 | The Lanczos vectors (together with vector f) are B-orthogonal (to working | ||
449 | accuracy) if full reorthogonalization is being used, otherwise they are | ||
450 | (B-)semi-orthogonal. On exit, beta contains the B-norm of f and the next | ||
451 | Lanczos vector can be computed as v_{m+1} = f / beta. | ||
452 | |||
453 | This function simply calls another function which depends on the selected | ||
454 | reorthogonalization strategy. | ||
455 | */ | ||
456 | 9504 | static PetscErrorCode EPSBasicLanczos(EPS eps,PetscInt k,PetscInt *m,PetscReal *betam,PetscBool *breakdown,PetscReal anorm) | |
457 | { | ||
458 | 9504 | EPS_LANCZOS *lanczos = (EPS_LANCZOS*)eps->data; | |
459 | 9504 | PetscScalar *T; | |
460 | 9504 | PetscInt i,n=*m,ld; | |
461 | 9504 | PetscReal *alpha,*beta; | |
462 | 9504 | BVOrthogRefineType orthog_ref; | |
463 | 9504 | Mat Op,M; | |
464 | |||
465 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
9504 | PetscFunctionBegin; |
466 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
9504 | PetscCall(DSGetLeadingDimension(eps->ds,&ld)); |
467 |
5/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
|
9504 | switch (lanczos->reorthog) { |
468 | 5204 | case EPS_LANCZOS_REORTHOG_LOCAL: | |
469 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5204 | PetscCall(DSGetArrayReal(eps->ds,DS_MAT_T,&alpha)); |
470 | 5204 | beta = alpha + ld; | |
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.
|
5204 | PetscCall(EPSLocalLanczos(eps,alpha,beta,k,m,breakdown)); |
472 | 5204 | *betam = beta[*m-1]; | |
473 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5204 | PetscCall(DSRestoreArrayReal(eps->ds,DS_MAT_T,&alpha)); |
474 | break; | ||
475 | 2910 | case EPS_LANCZOS_REORTHOG_FULL: | |
476 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2910 | PetscCall(STGetOperator(eps->st,&Op)); |
477 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2910 | PetscCall(DSGetMat(eps->ds,DS_MAT_T,&M)); |
478 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2910 | PetscCall(BVMatLanczos(eps->V,Op,M,k,m,betam,breakdown)); |
479 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2910 | PetscCall(DSRestoreMat(eps->ds,DS_MAT_T,&M)); |
480 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2910 | PetscCall(STRestoreOperator(eps->st,&Op)); |
481 | break; | ||
482 | 380 | case EPS_LANCZOS_REORTHOG_SELECTIVE: | |
483 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
380 | PetscCall(DSGetArrayReal(eps->ds,DS_MAT_T,&alpha)); |
484 | 380 | beta = alpha + ld; | |
485 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
380 | PetscCall(EPSSelectiveLanczos(eps,alpha,beta,k,m,breakdown,anorm)); |
486 | 380 | *betam = beta[*m-1]; | |
487 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
380 | PetscCall(DSRestoreArrayReal(eps->ds,DS_MAT_T,&alpha)); |
488 | break; | ||
489 | 760 | case EPS_LANCZOS_REORTHOG_PERIODIC: | |
490 | case EPS_LANCZOS_REORTHOG_PARTIAL: | ||
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.
|
760 | PetscCall(DSGetArrayReal(eps->ds,DS_MAT_T,&alpha)); |
492 | 760 | beta = alpha + ld; | |
493 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
760 | PetscCall(EPSPartialLanczos(eps,alpha,beta,k,m,breakdown,anorm)); |
494 | 760 | *betam = beta[*m-1]; | |
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.
|
760 | PetscCall(DSRestoreArrayReal(eps->ds,DS_MAT_T,&alpha)); |
496 | break; | ||
497 | 250 | case EPS_LANCZOS_REORTHOG_DELAYED: | |
498 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
250 | PetscCall(PetscMalloc1(n*n,&T)); |
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.
|
250 | PetscCall(BVGetOrthogonalization(eps->V,NULL,&orthog_ref,NULL,NULL)); |
500 |
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.
|
250 | if (orthog_ref == BV_ORTHOG_REFINE_NEVER) PetscCall(EPSDelayedArnoldi1(eps,T,n,k,m,betam,breakdown)); |
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.
|
250 | else PetscCall(EPSDelayedArnoldi(eps,T,n,k,m,betam,breakdown)); |
502 | 250 | n = *m; | |
503 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
250 | PetscCall(DSGetArrayReal(eps->ds,DS_MAT_T,&alpha)); |
504 | 250 | beta = alpha + ld; | |
505 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
4375 | for (i=k;i<n-1;i++) { |
506 | 4125 | alpha[i] = PetscRealPart(T[n*i+i]); | |
507 | 4125 | beta[i] = PetscRealPart(T[n*i+i+1]); | |
508 | } | ||
509 | 250 | alpha[n-1] = PetscRealPart(T[n*(n-1)+n-1]); | |
510 | 250 | beta[n-1] = *betam; | |
511 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
250 | PetscCall(DSRestoreArrayReal(eps->ds,DS_MAT_T,&alpha)); |
512 |
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.
|
250 | PetscCall(PetscFree(T)); |
513 | break; | ||
514 | } | ||
515 |
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.
|
1877 | PetscFunctionReturn(PETSC_SUCCESS); |
516 | } | ||
517 | |||
518 | 364 | static PetscErrorCode EPSSolve_Lanczos(EPS eps) | |
519 | { | ||
520 | 364 | EPS_LANCZOS *lanczos = (EPS_LANCZOS*)eps->data; | |
521 | 364 | PetscInt nconv,i,j,k,l,x,n,*perm,restart,ncv=eps->ncv,r,ld; | |
522 | 364 | Vec vi,vj,w; | |
523 | 364 | Mat U; | |
524 | 364 | PetscScalar *Y,*ritz,stmp; | |
525 | 364 | PetscReal *bnd,anorm,beta,norm,rtmp,resnorm; | |
526 | 364 | PetscBool breakdown; | |
527 | 364 | char *conv,ctmp; | |
528 | |||
529 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
364 | PetscFunctionBegin; |
530 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
364 | PetscCall(DSGetLeadingDimension(eps->ds,&ld)); |
531 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
364 | PetscCall(PetscMalloc4(ncv,&ritz,ncv,&bnd,ncv,&perm,ncv,&conv)); |
532 | |||
533 | /* The first Lanczos vector is the normalized initial vector */ | ||
534 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
364 | PetscCall(EPSGetStartVector(eps,0,NULL)); |
535 | |||
536 | anorm = -1.0; | ||
537 | nconv = 0; | ||
538 | |||
539 | /* Restart loop */ | ||
540 | 9868 | while (eps->reason == EPS_CONVERGED_ITERATING) { | |
541 | 9504 | eps->its++; | |
542 | |||
543 | /* Compute an ncv-step Lanczos factorization */ | ||
544 | 9504 | n = PetscMin(nconv+eps->mpd,ncv); | |
545 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
9504 | PetscCall(DSSetDimensions(eps->ds,n,nconv,PETSC_DETERMINE)); |
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.
|
9504 | PetscCall(EPSBasicLanczos(eps,nconv,&n,&beta,&breakdown,anorm)); |
547 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
9504 | PetscCall(DSSetDimensions(eps->ds,n,nconv,0)); |
548 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
9504 | PetscCall(DSSetState(eps->ds,DS_STATE_INTERMEDIATE)); |
549 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
9504 | PetscCall(BVSetActiveColumns(eps->V,nconv,n)); |
550 | |||
551 | /* Solve projected problem */ | ||
552 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
9504 | PetscCall(DSSolve(eps->ds,ritz,NULL)); |
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.
|
9504 | PetscCall(DSSort(eps->ds,ritz,NULL,NULL,NULL,NULL)); |
554 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
9504 | PetscCall(DSSynchronize(eps->ds,ritz,NULL)); |
555 | |||
556 | /* Estimate ||A|| */ | ||
557 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
135454 | for (i=nconv;i<n;i++) |
558 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
130215 | anorm = PetscMax(anorm,PetscAbsReal(PetscRealPart(ritz[i]))); |
559 | |||
560 | /* Compute residual norm estimates as beta*abs(Y(m,:)) + eps*||A|| */ | ||
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.
|
9504 | PetscCall(DSGetArray(eps->ds,DS_MAT_Q,&Y)); |
562 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
135454 | for (i=nconv;i<n;i++) { |
563 | 125950 | resnorm = beta*PetscAbsScalar(Y[n-1+i*ld]) + PETSC_MACHINE_EPSILON*anorm; | |
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.
|
125950 | PetscCall((*eps->converged)(eps,ritz[i],eps->eigi[i],resnorm,&bnd[i],eps->convergedctx)); |
565 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
125950 | if (bnd[i]<eps->tol) conv[i] = 'C'; |
566 | 124255 | else conv[i] = 'N'; | |
567 | } | ||
568 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
9504 | PetscCall(DSRestoreArray(eps->ds,DS_MAT_Q,&Y)); |
569 | |||
570 | /* purge repeated ritz values */ | ||
571 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
9504 | if (lanczos->reorthog == EPS_LANCZOS_REORTHOG_LOCAL) { |
572 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
70435 | for (i=nconv+1;i<n;i++) { |
573 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
65231 | if (conv[i] == 'C' && PetscAbsScalar((ritz[i]-ritz[i-1])/ritz[i]) < eps->tol) conv[i] = 'R'; |
574 | } | ||
575 | } | ||
576 | |||
577 | /* Compute restart vector */ | ||
578 |
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.
|
9504 | if (breakdown) PetscCall(PetscInfo(eps,"Breakdown in Lanczos method (it=%" PetscInt_FMT " norm=%g)\n",eps->its,(double)beta)); |
579 | else { | ||
580 | restart = nconv; | ||
581 |
3/4✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
10975 | while (restart<n && conv[restart] != 'N') restart++; |
582 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
9494 | if (restart >= n) { |
583 | ✗ | breakdown = PETSC_TRUE; | |
584 | } else { | ||
585 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
124289 | for (i=restart+1;i<n;i++) { |
586 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
114795 | if (conv[i] == 'N') { |
587 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
114761 | PetscCall(SlepcSCCompare(eps->sc,ritz[restart],0.0,ritz[i],0.0,&r)); |
588 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
114761 | if (r>0) restart = i; |
589 | } | ||
590 | } | ||
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.
|
9494 | PetscCall(DSGetArray(eps->ds,DS_MAT_Q,&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.
|
9494 | PetscCall(BVMultColumn(eps->V,1.0,0.0,n,Y+restart*ld+nconv)); |
593 |
5/6✓ Branch 0 taken 9 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 1 times.
|
9494 | PetscCall(DSRestoreArray(eps->ds,DS_MAT_Q,&Y)); |
594 | } | ||
595 | } | ||
596 | |||
597 | /* Count and put converged eigenvalues first */ | ||
598 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
135454 | for (i=nconv;i<n;i++) perm[i] = i; |
599 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
11175 | for (k=nconv;k<n;k++) { |
600 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
11165 | if (conv[perm[k]] != 'C') { |
601 | 9521 | j = k + 1; | |
602 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
124340 | while (j<n && conv[perm[j]] != 'C') j++; |
603 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
9521 | if (j>=n) break; |
604 | 27 | l = perm[k]; perm[k] = perm[j]; perm[j] = l; | |
605 | } | ||
606 | } | ||
607 | |||
608 | /* Sort eigenvectors according to permutation */ | ||
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.
|
9504 | PetscCall(DSGetArray(eps->ds,DS_MAT_Q,&Y)); |
610 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
11175 | for (i=nconv;i<k;i++) { |
611 | 1671 | x = perm[i]; | |
612 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1671 | if (x != i) { |
613 | 27 | j = i + 1; | |
614 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
61 | while (perm[j] != i) j++; |
615 | /* swap eigenvalues i and j */ | ||
616 | 27 | stmp = ritz[x]; ritz[x] = ritz[i]; ritz[i] = stmp; | |
617 | 27 | rtmp = bnd[x]; bnd[x] = bnd[i]; bnd[i] = rtmp; | |
618 | 27 | ctmp = conv[x]; conv[x] = conv[i]; conv[i] = ctmp; | |
619 | 27 | perm[j] = x; perm[i] = i; | |
620 | /* swap eigenvectors i and j */ | ||
621 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
540 | for (l=0;l<n;l++) { |
622 | 513 | stmp = Y[l+x*ld]; Y[l+x*ld] = Y[l+i*ld]; Y[l+i*ld] = stmp; | |
623 | } | ||
624 | } | ||
625 | } | ||
626 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
9504 | PetscCall(DSRestoreArray(eps->ds,DS_MAT_Q,&Y)); |
627 | |||
628 | /* compute converged eigenvectors */ | ||
629 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
9504 | PetscCall(DSGetMat(eps->ds,DS_MAT_Q,&U)); |
630 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
9504 | PetscCall(BVMultInPlace(eps->V,U,nconv,k)); |
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.
|
9504 | PetscCall(DSRestoreMat(eps->ds,DS_MAT_Q,&U)); |
632 | |||
633 | /* purge spurious ritz values */ | ||
634 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
9504 | if (lanczos->reorthog == EPS_LANCZOS_REORTHOG_LOCAL) { |
635 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
5949 | for (i=nconv;i<k;i++) { |
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.
|
745 | PetscCall(BVGetColumn(eps->V,i,&vi)); |
637 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
745 | PetscCall(VecNorm(vi,NORM_2,&norm)); |
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.
|
745 | PetscCall(VecScale(vi,1.0/norm)); |
639 | 745 | w = eps->work[0]; | |
640 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
745 | PetscCall(STApply(eps->st,vi,w)); |
641 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
745 | PetscCall(VecAXPY(w,-ritz[i],vi)); |
642 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
745 | PetscCall(BVRestoreColumn(eps->V,i,&vi)); |
643 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
745 | PetscCall(VecNorm(w,NORM_2,&norm)); |
644 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
745 | PetscCall((*eps->converged)(eps,ritz[i],eps->eigi[i],norm,&bnd[i],eps->convergedctx)); |
645 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
|
745 | if (bnd[i]>=eps->tol) conv[i] = 'S'; |
646 | } | ||
647 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
5944 | for (i=nconv;i<k;i++) { |
648 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
|
745 | if (conv[i] != 'C') { |
649 | 5 | j = i + 1; | |
650 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
5 | while (j<k && conv[j] != 'C') j++; |
651 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
|
5 | if (j>=k) break; |
652 | /* swap eigenvalues i and j */ | ||
653 | ✗ | stmp = ritz[j]; ritz[j] = ritz[i]; ritz[i] = stmp; | |
654 | ✗ | rtmp = bnd[j]; bnd[j] = bnd[i]; bnd[i] = rtmp; | |
655 | ✗ | ctmp = conv[j]; conv[j] = conv[i]; conv[i] = ctmp; | |
656 | /* swap eigenvectors i and j */ | ||
657 | ✗ | PetscCall(BVGetColumn(eps->V,i,&vi)); | |
658 | ✗ | PetscCall(BVGetColumn(eps->V,j,&vj)); | |
659 | ✗ | PetscCall(VecSwap(vi,vj)); | |
660 | ✗ | PetscCall(BVRestoreColumn(eps->V,i,&vi)); | |
661 |
0/6✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
740 | PetscCall(BVRestoreColumn(eps->V,j,&vj)); |
662 | } | ||
663 | } | ||
664 | k = i; | ||
665 | } | ||
666 | |||
667 | /* store ritz values and estimated errors */ | ||
668 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
135454 | for (i=nconv;i<n;i++) { |
669 | 125950 | eps->eigr[i] = ritz[i]; | |
670 | 125950 | eps->errest[i] = bnd[i]; | |
671 | } | ||
672 | 9504 | nconv = k; | |
673 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
9504 | PetscCall(EPSMonitor(eps,eps->its,nconv,eps->eigr,eps->eigi,eps->errest,n)); |
674 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
9504 | PetscCall((*eps->stopping)(eps,eps->its,eps->max_it,nconv,eps->nev,&eps->reason,eps->stoppingctx)); |
675 | |||
676 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
9504 | if (eps->reason == EPS_CONVERGED_ITERATING) { /* copy restart vector */ |
677 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
9140 | PetscCall(BVCopyColumn(eps->V,n,nconv)); |
678 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
|
9140 | if (lanczos->reorthog == EPS_LANCZOS_REORTHOG_LOCAL && !breakdown) { |
679 | /* Reorthonormalize restart vector */ | ||
680 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5024 | PetscCall(BVOrthonormalizeColumn(eps->V,nconv,PETSC_FALSE,NULL,&breakdown)); |
681 | } | ||
682 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
9140 | if (breakdown) { |
683 | /* Use random vector for restarting */ | ||
684 | ✗ | PetscCall(PetscInfo(eps,"Using random vector for restart\n")); | |
685 | ✗ | PetscCall(EPSGetStartVector(eps,nconv,&breakdown)); | |
686 | } | ||
687 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
9140 | if (PetscUnlikely(breakdown)) { /* give up */ |
688 | ✗ | eps->reason = EPS_DIVERGED_BREAKDOWN; | |
689 |
4/8✗ Branch 0 not taken.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
|
9868 | PetscCall(PetscInfo(eps,"Unable to generate more start vectors\n")); |
690 | } | ||
691 | } | ||
692 | } | ||
693 | 364 | eps->nconv = nconv; | |
694 | |||
695 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
364 | PetscCall(PetscFree4(ritz,bnd,perm,conv)); |
696 |
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.
|
72 | PetscFunctionReturn(PETSC_SUCCESS); |
697 | } | ||
698 | |||
699 | 184 | static PetscErrorCode EPSSetFromOptions_Lanczos(EPS eps,PetscOptionItems PetscOptionsObject) | |
700 | { | ||
701 | 184 | EPS_LANCZOS *lanczos = (EPS_LANCZOS*)eps->data; | |
702 | 184 | PetscBool flg; | |
703 | 184 | EPSLanczosReorthogType reorthog=EPS_LANCZOS_REORTHOG_LOCAL,curval; | |
704 | |||
705 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
184 | PetscFunctionBegin; |
706 |
1/12✗ 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.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
184 | PetscOptionsHeadBegin(PetscOptionsObject,"EPS Lanczos Options"); |
707 | |||
708 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
184 | curval = (lanczos->reorthog==(EPSLanczosReorthogType)-1)? EPS_LANCZOS_REORTHOG_LOCAL: lanczos->reorthog; |
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.
|
184 | PetscCall(PetscOptionsEnum("-eps_lanczos_reorthog","Lanczos reorthogonalization","EPSLanczosSetReorthog",EPSLanczosReorthogTypes,(PetscEnum)curval,(PetscEnum*)&reorthog,&flg)); |
710 |
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.
|
184 | if (flg) PetscCall(EPSLanczosSetReorthog(eps,reorthog)); |
711 | |||
712 |
1/14✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
184 | PetscOptionsHeadEnd(); |
713 |
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.
|
36 | PetscFunctionReturn(PETSC_SUCCESS); |
714 | } | ||
715 | |||
716 | 194 | static PetscErrorCode EPSLanczosSetReorthog_Lanczos(EPS eps,EPSLanczosReorthogType reorthog) | |
717 | { | ||
718 | 194 | EPS_LANCZOS *lanczos = (EPS_LANCZOS*)eps->data; | |
719 | |||
720 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
194 | PetscFunctionBegin; |
721 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
194 | switch (reorthog) { |
722 | 194 | case EPS_LANCZOS_REORTHOG_LOCAL: | |
723 | case EPS_LANCZOS_REORTHOG_FULL: | ||
724 | case EPS_LANCZOS_REORTHOG_DELAYED: | ||
725 | case EPS_LANCZOS_REORTHOG_SELECTIVE: | ||
726 | case EPS_LANCZOS_REORTHOG_PERIODIC: | ||
727 | case EPS_LANCZOS_REORTHOG_PARTIAL: | ||
728 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
194 | if (lanczos->reorthog != reorthog) { |
729 | 194 | lanczos->reorthog = reorthog; | |
730 | 194 | eps->state = EPS_STATE_INITIAL; | |
731 | } | ||
732 | 38 | break; | |
733 | ✗ | default: | |
734 | ✗ | SETERRQ(PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"Invalid reorthogonalization type"); | |
735 | } | ||
736 |
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.
|
38 | PetscFunctionReturn(PETSC_SUCCESS); |
737 | } | ||
738 | |||
739 | /*@ | ||
740 | EPSLanczosSetReorthog - Sets the type of reorthogonalization used during the Lanczos | ||
741 | iteration. | ||
742 | |||
743 | Logically Collective | ||
744 | |||
745 | Input Parameters: | ||
746 | + eps - the eigenproblem solver context | ||
747 | - reorthog - the type of reorthogonalization | ||
748 | |||
749 | Options Database Key: | ||
750 | . -eps_lanczos_reorthog - Sets the reorthogonalization type (either 'local', 'selective', | ||
751 | 'periodic', 'partial', 'full' or 'delayed') | ||
752 | |||
753 | Level: advanced | ||
754 | |||
755 | .seealso: EPSLanczosGetReorthog(), EPSLanczosReorthogType | ||
756 | @*/ | ||
757 | 194 | PetscErrorCode EPSLanczosSetReorthog(EPS eps,EPSLanczosReorthogType reorthog) | |
758 | { | ||
759 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
194 | PetscFunctionBegin; |
760 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
194 | PetscValidHeaderSpecific(eps,EPS_CLASSID,1); |
761 |
27/62✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
|
194 | PetscValidLogicalCollectiveEnum(eps,reorthog,2); |
762 |
8/14✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
|
194 | PetscTryMethod(eps,"EPSLanczosSetReorthog_C",(EPS,EPSLanczosReorthogType),(eps,reorthog)); |
763 |
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.
|
194 | PetscFunctionReturn(PETSC_SUCCESS); |
764 | } | ||
765 | |||
766 | 50 | static PetscErrorCode EPSLanczosGetReorthog_Lanczos(EPS eps,EPSLanczosReorthogType *reorthog) | |
767 | { | ||
768 | 50 | EPS_LANCZOS *lanczos = (EPS_LANCZOS*)eps->data; | |
769 | |||
770 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
50 | PetscFunctionBegin; |
771 | 50 | *reorthog = lanczos->reorthog; | |
772 |
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); |
773 | } | ||
774 | |||
775 | /*@ | ||
776 | EPSLanczosGetReorthog - Gets the type of reorthogonalization used during | ||
777 | the Lanczos iteration. | ||
778 | |||
779 | Not Collective | ||
780 | |||
781 | Input Parameter: | ||
782 | . eps - the eigenproblem solver context | ||
783 | |||
784 | Output Parameter: | ||
785 | . reorthog - the type of reorthogonalization | ||
786 | |||
787 | Level: advanced | ||
788 | |||
789 | .seealso: EPSLanczosSetReorthog(), EPSLanczosReorthogType | ||
790 | @*/ | ||
791 | 50 | PetscErrorCode EPSLanczosGetReorthog(EPS eps,EPSLanczosReorthogType *reorthog) | |
792 | { | ||
793 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
50 | PetscFunctionBegin; |
794 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
50 | PetscValidHeaderSpecific(eps,EPS_CLASSID,1); |
795 |
2/8✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
50 | PetscAssertPointer(reorthog,2); |
796 |
9/16✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
|
50 | PetscUseMethod(eps,"EPSLanczosGetReorthog_C",(EPS,EPSLanczosReorthogType*),(eps,reorthog)); |
797 |
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); |
798 | } | ||
799 | |||
800 | 224 | static PetscErrorCode EPSReset_Lanczos(EPS eps) | |
801 | { | ||
802 | 224 | EPS_LANCZOS *lanczos = (EPS_LANCZOS*)eps->data; | |
803 | |||
804 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
224 | PetscFunctionBegin; |
805 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
224 | PetscCall(BVDestroy(&lanczos->AV)); |
806 | 224 | lanczos->allocsize = 0; | |
807 |
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.
|
224 | PetscFunctionReturn(PETSC_SUCCESS); |
808 | } | ||
809 | |||
810 | 194 | static PetscErrorCode EPSDestroy_Lanczos(EPS eps) | |
811 | { | ||
812 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
194 | PetscFunctionBegin; |
813 |
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.
|
194 | PetscCall(PetscFree(eps->data)); |
814 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
194 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSLanczosSetReorthog_C",NULL)); |
815 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
194 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSLanczosGetReorthog_C",NULL)); |
816 |
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.
|
38 | PetscFunctionReturn(PETSC_SUCCESS); |
817 | } | ||
818 | |||
819 | ✗ | static PetscErrorCode EPSView_Lanczos(EPS eps,PetscViewer viewer) | |
820 | { | ||
821 | ✗ | EPS_LANCZOS *lanczos = (EPS_LANCZOS*)eps->data; | |
822 | ✗ | PetscBool isascii; | |
823 | |||
824 | ✗ | PetscFunctionBegin; | |
825 | ✗ | PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii)); | |
826 | ✗ | if (isascii) { | |
827 | ✗ | if (lanczos->reorthog != (EPSLanczosReorthogType)-1) PetscCall(PetscViewerASCIIPrintf(viewer," %s reorthogonalization\n",EPSLanczosReorthogTypes[lanczos->reorthog])); | |
828 | } | ||
829 | ✗ | PetscFunctionReturn(PETSC_SUCCESS); | |
830 | } | ||
831 | |||
832 | 194 | SLEPC_EXTERN PetscErrorCode EPSCreate_Lanczos(EPS eps) | |
833 | { | ||
834 | 194 | EPS_LANCZOS *ctx; | |
835 | |||
836 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
194 | PetscFunctionBegin; |
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.
|
194 | PetscCall(PetscNew(&ctx)); |
838 | 194 | eps->data = (void*)ctx; | |
839 | 194 | ctx->reorthog = (EPSLanczosReorthogType)-1; | |
840 | |||
841 | 194 | eps->useds = PETSC_TRUE; | |
842 | |||
843 | 194 | eps->ops->solve = EPSSolve_Lanczos; | |
844 | 194 | eps->ops->setup = EPSSetUp_Lanczos; | |
845 | 194 | eps->ops->setupsort = EPSSetUpSort_Default; | |
846 | 194 | eps->ops->setfromoptions = EPSSetFromOptions_Lanczos; | |
847 | 194 | eps->ops->destroy = EPSDestroy_Lanczos; | |
848 | 194 | eps->ops->reset = EPSReset_Lanczos; | |
849 | 194 | eps->ops->view = EPSView_Lanczos; | |
850 | 194 | eps->ops->backtransform = EPSBackTransform_Default; | |
851 | 194 | eps->ops->computevectors = EPSComputeVectors_Hermitian; | |
852 | |||
853 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
194 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSLanczosSetReorthog_C",EPSLanczosSetReorthog_Lanczos)); |
854 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
194 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSLanczosGetReorthog_C",EPSLanczosGetReorthog_Lanczos)); |
855 |
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.
|
38 | PetscFunctionReturn(PETSC_SUCCESS); |
856 | } | ||
857 |